Version in base suite: 21.0.10+7-1~deb13u1 Base version: openjdk-21_21.0.10+7-1~deb13u1 Target version: openjdk-21_21.0.11+10-1~deb13u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/o/openjdk-21/openjdk-21_21.0.10+7-1~deb13u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/o/openjdk-21/openjdk-21_21.0.11+10-1~deb13u1.dsc .jcheck/conf | 2 debian/changelog | 94 debian/control | 4 debian/copyright | 1201 + debian/copyright-generator/copyright-gen.py | 50 debian/copyright-generator/strip-common-licenses.sh | 18 debian/dbg.py | 448 debian/patches/icc_loading_with_symlink.diff | 2 debian/patches/jdk-8359735.patch | 4 debian/patches/jdk-8381555.diff | 29 debian/patches/ldap-timeout-test-use-ip.patch | 4 debian/patches/machine-flag.diff | 4 debian/patches/series | 1 debian/rules | 78 debian/tests/control | 4 debian/tests/dependencies.sh | 2 debian/tests/jtreg-autopkgtest.in | 13 debian/tests/jtreg-autopkgtest.sh | 13 debian/tests/problems.csv | 74 make/autoconf/lib-bundled.m4 | 4 make/autoconf/lib-tests.m4 | 4 make/autoconf/platform.m4 | 8 make/common/Utils.gmk | 2 make/conf/github-actions.conf | 4 make/conf/jib-profiles.js | 4 make/conf/version-numbers.conf | 4 make/hotspot/lib/JvmMapfile.gmk | 4 make/modules/java.base/Copy.gmk | 6 make/modules/java.desktop/lib/Awt2dLibraries.gmk | 3 src/hotspot/cpu/aarch64/aarch64.ad | 3 src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp | 11 src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp | 4 src/hotspot/cpu/arm/arm.ad | 8 src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp | 4 src/hotspot/cpu/ppc/ppc.ad | 59 src/hotspot/cpu/riscv/icache_riscv.cpp | 3 src/hotspot/cpu/x86/macroAssembler_x86.cpp | 12 src/hotspot/cpu/x86/macroAssembler_x86.hpp | 3 src/hotspot/cpu/x86/x86_32.ad | 12 src/hotspot/cpu/x86/x86_64.ad | 12 src/hotspot/os/linux/cgroupSubsystem_linux.cpp | 5 src/hotspot/os/linux/cgroupSubsystem_linux.hpp | 11 src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp | 29 src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp | 1 src/hotspot/os/linux/gc/x/xSyscall_linux.hpp | 4 src/hotspot/os/linux/gc/z/zSyscall_linux.hpp | 4 src/hotspot/os/linux/os_linux.cpp | 20 src/hotspot/os/posix/gc/x/xVirtualMemory_posix.cpp | 7 src/hotspot/os/posix/gc/z/zVirtualMemory_posix.cpp | 7 src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.cpp | 2 src/hotspot/share/cds/archiveBuilder.cpp | 2 src/hotspot/share/classfile/classLoader.cpp | 1 src/hotspot/share/classfile/resolutionErrors.cpp | 11 src/hotspot/share/classfile/resolutionErrors.hpp | 7 src/hotspot/share/classfile/systemDictionary.cpp | 23 src/hotspot/share/classfile/systemDictionary.hpp | 2 src/hotspot/share/code/codeBlob.cpp | 1 src/hotspot/share/code/nmethod.cpp | 40 src/hotspot/share/code/nmethod.hpp | 1 src/hotspot/share/gc/g1/g1Arguments.cpp | 3 src/hotspot/share/gc/g1/g1CollectedHeap.cpp | 23 src/hotspot/share/gc/g1/g1CollectedHeap.hpp | 21 src/hotspot/share/gc/g1/heapRegion.cpp | 4 src/hotspot/share/gc/g1/heapRegion.hpp | 1 src/hotspot/share/gc/shared/stringdedup/stringDedupStat.cpp | 22 src/hotspot/share/oops/instanceKlass.cpp | 10 src/hotspot/share/opto/addnode.cpp | 4 src/hotspot/share/opto/bytecodeInfo.cpp | 33 src/hotspot/share/opto/callnode.cpp | 23 src/hotspot/share/opto/callnode.hpp | 50 src/hotspot/share/opto/compile.cpp | 29 src/hotspot/share/opto/compile.hpp | 3 src/hotspot/share/opto/parse1.cpp | 7 src/hotspot/share/prims/jvmtiEventController.cpp | 7 src/hotspot/share/runtime/os.cpp | 89 src/hotspot/share/runtime/os.hpp | 8 src/hotspot/share/utilities/globalDefinitions.hpp | 2 src/hotspot/share/utilities/ostream.hpp | 1 src/hotspot/share/utilities/vmError.cpp | 4 src/java.base/share/classes/com/sun/crypto/provider/PBES1Core.java | 50 src/java.base/share/classes/com/sun/crypto/provider/PKCS12PBECipherCore.java | 4 src/java.base/share/classes/com/sun/crypto/provider/RSACipherAdaptor.java | 146 src/java.base/share/classes/com/sun/crypto/provider/SunJCE.java | 9 src/java.base/share/classes/java/io/Console.java | 23 src/java.base/share/classes/java/lang/AbstractStringBuilder.java | 13 src/java.base/share/classes/java/lang/System.java | 3 src/java.base/share/classes/java/security/KeyStore.java | 34 src/java.base/share/classes/java/security/MessageDigest.java | 26 src/java.base/share/classes/java/security/Signature.java | 203 src/java.base/share/classes/java/time/ZoneOffset.java | 16 src/java.base/share/classes/java/time/format/DateTimeTextProvider.java | 12 src/java.base/share/classes/java/time/format/DecimalStyle.java | 12 src/java.base/share/classes/javax/crypto/Cipher.java | 85 src/java.base/share/classes/jdk/internal/access/JavaIOAccess.java | 3 src/java.base/share/classes/jdk/internal/io/JdkConsoleImpl.java | 62 src/java.base/share/classes/jdk/internal/reflect/DirectMethodHandleAccessor.java | 2 src/java.base/share/classes/jdk/internal/reflect/MethodHandleAccessorFactory.java | 69 src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java | 19 src/java.base/share/classes/sun/nio/ch/NativeDispatcher.java | 32 src/java.base/share/classes/sun/nio/ch/NioSocketImpl.java | 17 src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java | 12 src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java | 18 src/java.base/share/classes/sun/security/provider/MD4.java | 9 src/java.base/share/classes/sun/security/provider/X509Factory.java | 11 src/java.base/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java | 6 src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java | 8 src/java.base/share/classes/sun/security/ssl/Finished.java | 4 src/java.base/share/classes/sun/security/ssl/HelloCookieManager.java | 4 src/java.base/share/classes/sun/security/ssl/NewSessionTicket.java | 173 src/java.base/share/classes/sun/security/ssl/PreSharedKeyExtension.java | 4 src/java.base/share/classes/sun/security/ssl/SSLConfiguration.java | 34 src/java.base/share/classes/sun/security/ssl/SSLEngineImpl.java | 11 src/java.base/share/classes/sun/security/ssl/SSLSessionContextImpl.java | 32 src/java.base/share/classes/sun/security/ssl/SSLSessionImpl.java | 27 src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java | 15 src/java.base/share/classes/sun/security/ssl/SSLSocketOutputRecord.java | 8 src/java.base/share/classes/sun/security/util/AbstractAlgorithmConstraints.java | 34 src/java.base/share/classes/sun/security/util/Cache.java | 241 src/java.base/share/classes/sun/security/util/CryptoAlgorithmConstraints.java | 154 src/java.base/share/classes/sun/security/util/KnownOIDs.java | 2 src/java.base/share/classes/sun/security/util/Password.java | 140 src/java.base/share/classes/sun/security/util/Resources.java | 4 src/java.base/share/classes/sun/security/validator/CADistrustPolicy.java | 18 src/java.base/share/classes/sun/security/validator/ChunghwaTLSPolicy.java | 103 src/java.base/share/conf/security/java.security | 54 src/java.base/share/data/tzdata/VERSION | 2 src/java.base/share/data/tzdata/africa | 9 src/java.base/share/data/tzdata/antarctica | 12 src/java.base/share/data/tzdata/asia | 6 src/java.base/share/data/tzdata/australasia | 10 src/java.base/share/data/tzdata/etcetera | 3 src/java.base/share/data/tzdata/europe | 126 src/java.base/share/data/tzdata/iso3166.tab | 18 src/java.base/share/data/tzdata/leapseconds | 19 src/java.base/share/data/tzdata/northamerica | 53 src/java.base/share/data/tzdata/southamerica | 6 src/java.base/share/legal/gcc.md | 2084 ++ src/java.base/share/legal/zlib.md | 4 src/java.base/share/native/libzip/zip_util.c | 149 src/java.base/share/native/libzip/zip_util.h | 18 src/java.base/unix/classes/sun/nio/ch/DatagramDispatcher.java | 25 src/java.base/unix/classes/sun/nio/ch/NativeThread.java | 13 src/java.base/unix/classes/sun/nio/ch/SinkChannelImpl.java | 14 src/java.base/unix/classes/sun/nio/ch/SocketDispatcher.java | 18 src/java.base/unix/classes/sun/nio/ch/SourceChannelImpl.java | 14 src/java.base/unix/classes/sun/nio/ch/UnixDispatcher.java | 24 src/java.base/unix/classes/sun/nio/fs/UnixFileSystem.java | 9 src/java.base/unix/native/libjava/Console_md.c | 19 src/java.base/unix/native/libnio/ch/NativeThread.c | 11 src/java.base/windows/classes/sun/nio/ch/DatagramDispatcher.java | 7 src/java.base/windows/classes/sun/nio/ch/SocketDispatcher.java | 11 src/java.base/windows/native/libjava/Console_md.c | 27 src/java.base/windows/native/libjava/TimeZone_md.c | 4 src/java.desktop/macosx/native/libawt_lwawt/font/CGGlyphImages.m | 4 src/java.desktop/share/classes/sun/awt/geom/AreaOp.java | 50 src/java.desktop/share/classes/sun/awt/geom/Curve.java | 7 src/java.desktop/share/classes/sun/awt/image/XbmImageDecoder.java | 239 src/java.desktop/share/classes/sun/font/CompositeFont.java | 8 src/java.desktop/share/legal/freetype.md | 40 src/java.desktop/share/legal/giflib.md | 26 src/java.desktop/share/legal/harfbuzz.md | 2 src/java.desktop/share/legal/libpng.md | 15 src/java.desktop/share/native/libfreetype/include/freetype/config/ftconfig.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/config/ftheader.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/config/ftoption.h | 57 src/java.desktop/share/native/libfreetype/include/freetype/config/ftstdlib.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/config/integer-types.h | 31 src/java.desktop/share/native/libfreetype/include/freetype/config/mac-support.h | 4 src/java.desktop/share/native/libfreetype/include/freetype/config/public-macros.h | 6 src/java.desktop/share/native/libfreetype/include/freetype/freetype.h | 121 src/java.desktop/share/native/libfreetype/include/freetype/ftadvanc.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftbbox.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftbdf.h | 14 src/java.desktop/share/native/libfreetype/include/freetype/ftbitmap.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftcid.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftcolor.h | 17 src/java.desktop/share/native/libfreetype/include/freetype/ftdriver.h | 6 src/java.desktop/share/native/libfreetype/include/freetype/fterrdef.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/fterrors.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftfntfmt.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftgasp.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftglyph.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftgzip.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftimage.h | 10 src/java.desktop/share/native/libfreetype/include/freetype/ftincrem.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftlcdfil.h | 12 src/java.desktop/share/native/libfreetype/include/freetype/ftlist.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftlogging.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftmac.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftmm.h | 256 src/java.desktop/share/native/libfreetype/include/freetype/ftmodapi.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftmoderr.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftoutln.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftparams.h | 9 src/java.desktop/share/native/libfreetype/include/freetype/ftrender.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftsizes.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftsnames.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftstroke.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftsynth.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/ftsystem.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/fttrigon.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/fttypes.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/autohint.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/cffotypes.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/cfftypes.h | 6 src/java.desktop/share/native/libfreetype/include/freetype/internal/compiler-macros.h | 6 src/java.desktop/share/native/libfreetype/include/freetype/internal/ftcalc.h | 296 src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdebug.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdrv.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/ftgloadr.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/fthash.h | 23 src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmemory.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmmtypes.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/ftobjs.h | 60 src/java.desktop/share/native/libfreetype/include/freetype/internal/ftpsprop.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/ftrfork.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/ftserv.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/ftstream.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/fttrace.h | 5 src/java.desktop/share/native/libfreetype/include/freetype/internal/ftvalid.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/psaux.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/pshints.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svbdf.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcfftl.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcid.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svfntfmt.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgldict.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgxval.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svkern.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmetric.h | 4 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmm.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svotval.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpfr.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpostnm.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svprop.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpscmap.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpsinfo.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svsfnt.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttcmap.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svtteng.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttglyf.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svwinfnt.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/sfnt.h | 8 src/java.desktop/share/native/libfreetype/include/freetype/internal/svginterface.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/t1types.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/internal/tttypes.h | 41 src/java.desktop/share/native/libfreetype/include/freetype/internal/wofftypes.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/otsvg.h | 2 src/java.desktop/share/native/libfreetype/include/freetype/t1tables.h | 6 src/java.desktop/share/native/libfreetype/include/freetype/ttnameid.h | 258 src/java.desktop/share/native/libfreetype/include/freetype/tttables.h | 13 src/java.desktop/share/native/libfreetype/include/freetype/tttags.h | 2 src/java.desktop/share/native/libfreetype/include/ft2build.h | 2 src/java.desktop/share/native/libfreetype/src/autofit/afadjust.c | 1621 + src/java.desktop/share/native/libfreetype/src/autofit/afadjust.h | 130 src/java.desktop/share/native/libfreetype/src/autofit/afblue.c | 194 src/java.desktop/share/native/libfreetype/src/autofit/afblue.cin | 2 src/java.desktop/share/native/libfreetype/src/autofit/afblue.dat | 194 src/java.desktop/share/native/libfreetype/src/autofit/afblue.h | 11 src/java.desktop/share/native/libfreetype/src/autofit/afblue.hin | 11 src/java.desktop/share/native/libfreetype/src/autofit/afcjk.c | 49 src/java.desktop/share/native/libfreetype/src/autofit/afcjk.h | 2 src/java.desktop/share/native/libfreetype/src/autofit/afcover.h | 2 src/java.desktop/share/native/libfreetype/src/autofit/afdummy.c | 2 src/java.desktop/share/native/libfreetype/src/autofit/afdummy.h | 2 src/java.desktop/share/native/libfreetype/src/autofit/aferrors.h | 2 src/java.desktop/share/native/libfreetype/src/autofit/afglobal.c | 40 src/java.desktop/share/native/libfreetype/src/autofit/afglobal.h | 17 src/java.desktop/share/native/libfreetype/src/autofit/afhints.c | 23 src/java.desktop/share/native/libfreetype/src/autofit/afhints.h | 19 src/java.desktop/share/native/libfreetype/src/autofit/afindic.c | 2 src/java.desktop/share/native/libfreetype/src/autofit/afindic.h | 2 src/java.desktop/share/native/libfreetype/src/autofit/aflatin.c | 1561 + src/java.desktop/share/native/libfreetype/src/autofit/aflatin.h | 25 src/java.desktop/share/native/libfreetype/src/autofit/afloader.c | 16 src/java.desktop/share/native/libfreetype/src/autofit/afloader.h | 2 src/java.desktop/share/native/libfreetype/src/autofit/afmodule.c | 14 src/java.desktop/share/native/libfreetype/src/autofit/afmodule.h | 8 src/java.desktop/share/native/libfreetype/src/autofit/afranges.c | 63 src/java.desktop/share/native/libfreetype/src/autofit/afranges.h | 2 src/java.desktop/share/native/libfreetype/src/autofit/afscript.h | 2 src/java.desktop/share/native/libfreetype/src/autofit/afshaper.c | 340 src/java.desktop/share/native/libfreetype/src/autofit/afshaper.h | 19 src/java.desktop/share/native/libfreetype/src/autofit/afstyles.h | 58 src/java.desktop/share/native/libfreetype/src/autofit/aftypes.h | 6 src/java.desktop/share/native/libfreetype/src/autofit/afws-decl.h | 2 src/java.desktop/share/native/libfreetype/src/autofit/afws-iter.h | 2 src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.c | 197 src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.h | 82 src/java.desktop/share/native/libfreetype/src/base/ftadvanc.c | 68 src/java.desktop/share/native/libfreetype/src/base/ftbase.h | 4 src/java.desktop/share/native/libfreetype/src/base/ftbbox.c | 2 src/java.desktop/share/native/libfreetype/src/base/ftbitmap.c | 26 src/java.desktop/share/native/libfreetype/src/base/ftcalc.c | 146 src/java.desktop/share/native/libfreetype/src/base/ftcid.c | 2 src/java.desktop/share/native/libfreetype/src/base/ftcolor.c | 21 src/java.desktop/share/native/libfreetype/src/base/ftdbgmem.c | 3 src/java.desktop/share/native/libfreetype/src/base/ftdebug.c | 4 src/java.desktop/share/native/libfreetype/src/base/ftfntfmt.c | 2 src/java.desktop/share/native/libfreetype/src/base/ftfstype.c | 2 src/java.desktop/share/native/libfreetype/src/base/ftgasp.c | 2 src/java.desktop/share/native/libfreetype/src/base/ftgloadr.c | 2 src/java.desktop/share/native/libfreetype/src/base/ftglyph.c | 17 src/java.desktop/share/native/libfreetype/src/base/fthash.c | 104 src/java.desktop/share/native/libfreetype/src/base/ftinit.c | 2 src/java.desktop/share/native/libfreetype/src/base/ftlcdfil.c | 273 src/java.desktop/share/native/libfreetype/src/base/ftmac.c | 2 src/java.desktop/share/native/libfreetype/src/base/ftmm.c | 37 src/java.desktop/share/native/libfreetype/src/base/ftobjs.c | 118 src/java.desktop/share/native/libfreetype/src/base/ftoutln.c | 2 src/java.desktop/share/native/libfreetype/src/base/ftpatent.c | 2 src/java.desktop/share/native/libfreetype/src/base/ftpsprop.c | 2 src/java.desktop/share/native/libfreetype/src/base/ftrfork.c | 10 src/java.desktop/share/native/libfreetype/src/base/ftsnames.c | 2 src/java.desktop/share/native/libfreetype/src/base/ftstream.c | 4 src/java.desktop/share/native/libfreetype/src/base/ftstroke.c | 24 src/java.desktop/share/native/libfreetype/src/base/ftsynth.c | 4 src/java.desktop/share/native/libfreetype/src/base/ftsystem.c | 4 src/java.desktop/share/native/libfreetype/src/base/fttrigon.c | 2 src/java.desktop/share/native/libfreetype/src/base/fttype1.c | 2 src/java.desktop/share/native/libfreetype/src/base/ftutil.c | 5 src/java.desktop/share/native/libfreetype/src/cff/cffcmap.c | 2 src/java.desktop/share/native/libfreetype/src/cff/cffcmap.h | 2 src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.c | 168 src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.h | 2 src/java.desktop/share/native/libfreetype/src/cff/cfferrs.h | 2 src/java.desktop/share/native/libfreetype/src/cff/cffgload.c | 70 src/java.desktop/share/native/libfreetype/src/cff/cffgload.h | 2 src/java.desktop/share/native/libfreetype/src/cff/cffload.c | 20 src/java.desktop/share/native/libfreetype/src/cff/cffload.h | 2 src/java.desktop/share/native/libfreetype/src/cff/cffobjs.c | 22 src/java.desktop/share/native/libfreetype/src/cff/cffobjs.h | 2 src/java.desktop/share/native/libfreetype/src/cff/cffparse.c | 10 src/java.desktop/share/native/libfreetype/src/cff/cffparse.h | 2 src/java.desktop/share/native/libfreetype/src/cff/cfftoken.h | 6 src/java.desktop/share/native/libfreetype/src/cid/ciderrs.h | 2 src/java.desktop/share/native/libfreetype/src/cid/cidgload.c | 46 src/java.desktop/share/native/libfreetype/src/cid/cidgload.h | 2 src/java.desktop/share/native/libfreetype/src/cid/cidload.c | 2 src/java.desktop/share/native/libfreetype/src/cid/cidload.h | 2 src/java.desktop/share/native/libfreetype/src/cid/cidobjs.c | 2 src/java.desktop/share/native/libfreetype/src/cid/cidobjs.h | 2 src/java.desktop/share/native/libfreetype/src/cid/cidparse.c | 2 src/java.desktop/share/native/libfreetype/src/cid/cidparse.h | 2 src/java.desktop/share/native/libfreetype/src/cid/cidriver.c | 2 src/java.desktop/share/native/libfreetype/src/cid/cidriver.h | 2 src/java.desktop/share/native/libfreetype/src/cid/cidtoken.h | 4 src/java.desktop/share/native/libfreetype/src/psaux/afmparse.c | 2 src/java.desktop/share/native/libfreetype/src/psaux/afmparse.h | 2 src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.c | 6 src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.h | 2 src/java.desktop/share/native/libfreetype/src/psaux/psauxerr.h | 2 src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.c | 2 src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.h | 5 src/java.desktop/share/native/libfreetype/src/psaux/psconv.c | 2 src/java.desktop/share/native/libfreetype/src/psaux/psconv.h | 2 src/java.desktop/share/native/libfreetype/src/psaux/psintrp.c | 2 src/java.desktop/share/native/libfreetype/src/psaux/psobjs.c | 9 src/java.desktop/share/native/libfreetype/src/psaux/psobjs.h | 2 src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.c | 2 src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.h | 2 src/java.desktop/share/native/libfreetype/src/psaux/t1decode.c | 4 src/java.desktop/share/native/libfreetype/src/psaux/t1decode.h | 2 src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.c | 244 src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.h | 2 src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.c | 52 src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.h | 2 src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.c | 2 src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.h | 2 src/java.desktop/share/native/libfreetype/src/pshinter/pshnterr.h | 2 src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.c | 12 src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.h | 2 src/java.desktop/share/native/libfreetype/src/psnames/psmodule.c | 2 src/java.desktop/share/native/libfreetype/src/psnames/psmodule.h | 2 src/java.desktop/share/native/libfreetype/src/psnames/psnamerr.h | 2 src/java.desktop/share/native/libfreetype/src/psnames/pstables.h | 2 src/java.desktop/share/native/libfreetype/src/raster/ftmisc.h | 2 src/java.desktop/share/native/libfreetype/src/raster/ftraster.c | 18 src/java.desktop/share/native/libfreetype/src/raster/ftraster.h | 2 src/java.desktop/share/native/libfreetype/src/raster/ftrend1.c | 2 src/java.desktop/share/native/libfreetype/src/raster/ftrend1.h | 2 src/java.desktop/share/native/libfreetype/src/raster/rasterrs.h | 2 src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.c | 7 src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.h | 2 src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.c | 11 src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.h | 2 src/java.desktop/share/native/libfreetype/src/sfnt/sferrors.h | 2 src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.c | 9 src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.h | 2 src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.c | 2 src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.h | 2 src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.c | 18 src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.h | 2 src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.c | 22 src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.h | 2 src/java.desktop/share/native/libfreetype/src/sfnt/ttcmapc.h | 2 src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.c | 14 src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.h | 2 src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.c | 2 src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.h | 2 src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.c | 5 src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.h | 8 src/java.desktop/share/native/libfreetype/src/sfnt/ttload.c | 32 src/java.desktop/share/native/libfreetype/src/sfnt/ttload.h | 2 src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.c | 4 src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.h | 2 src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.c | 2 src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.h | 2 src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.c | 66 src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.h | 2 src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.c | 2 src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.h | 2 src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.c | 90 src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.h | 13 src/java.desktop/share/native/libfreetype/src/smooth/ftsmerrs.h | 2 src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.c | 167 src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.h | 2 src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.c | 6 src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.h | 2 src/java.desktop/share/native/libfreetype/src/truetype/tterrors.h | 2 src/java.desktop/share/native/libfreetype/src/truetype/ttgload.c | 410 src/java.desktop/share/native/libfreetype/src/truetype/ttgload.h | 2 src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.c | 710 src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.h | 7 src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.c | 1589 - src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.h | 134 src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.c | 445 src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.h | 127 src/java.desktop/share/native/libfreetype/src/truetype/ttpload.c | 18 src/java.desktop/share/native/libfreetype/src/truetype/ttpload.h | 2 src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.c | 1013 - src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.h | 110 src/java.desktop/share/native/libfreetype/src/type1/t1afm.c | 2 src/java.desktop/share/native/libfreetype/src/type1/t1afm.h | 2 src/java.desktop/share/native/libfreetype/src/type1/t1driver.c | 2 src/java.desktop/share/native/libfreetype/src/type1/t1driver.h | 2 src/java.desktop/share/native/libfreetype/src/type1/t1errors.h | 2 src/java.desktop/share/native/libfreetype/src/type1/t1gload.c | 44 src/java.desktop/share/native/libfreetype/src/type1/t1gload.h | 2 src/java.desktop/share/native/libfreetype/src/type1/t1load.c | 8 src/java.desktop/share/native/libfreetype/src/type1/t1load.h | 2 src/java.desktop/share/native/libfreetype/src/type1/t1objs.c | 2 src/java.desktop/share/native/libfreetype/src/type1/t1objs.h | 2 src/java.desktop/share/native/libfreetype/src/type1/t1parse.c | 2 src/java.desktop/share/native/libfreetype/src/type1/t1parse.h | 2 src/java.desktop/share/native/libfreetype/src/type1/t1tokens.h | 4 src/java.desktop/share/native/libharfbuzz/OT/Color/COLR/COLR.hh | 92 src/java.desktop/share/native/libharfbuzz/OT/Color/CPAL/CPAL.hh | 1 src/java.desktop/share/native/libharfbuzz/OT/Layout/Common/Coverage.hh | 58 src/java.desktop/share/native/libharfbuzz/OT/Layout/Common/CoverageFormat1.hh | 4 src/java.desktop/share/native/libharfbuzz/OT/Layout/Common/CoverageFormat2.hh | 2 src/java.desktop/share/native/libharfbuzz/OT/Layout/GDEF/GDEF.hh | 58 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/Anchor.hh | 14 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/AnchorFormat3.hh | 15 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/AnchorMatrix.hh | 7 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/CursivePos.hh | 8 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/CursivePosFormat1.hh | 15 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/GPOS.hh | 66 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/LigatureArray.hh | 19 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkArray.hh | 10 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkBasePos.hh | 8 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkBasePosFormat1.hh | 33 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkLigPos.hh | 8 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkLigPosFormat1.hh | 18 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkMarkPos.hh | 8 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkMarkPosFormat1.hh | 32 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairPos.hh | 8 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairPosFormat1.hh | 41 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairPosFormat2.hh | 52 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/SinglePos.hh | 14 src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/ValueFormat.hh | 13 src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/AlternateSet.hh | 13 src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/AlternateSubst.hh | 14 src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/AlternateSubstFormat1.hh | 13 src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/Ligature.hh | 31 src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/LigatureSet.hh | 30 src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/LigatureSubst.hh | 14 src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/LigatureSubstFormat1.hh | 52 src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/MultipleSubst.hh | 14 src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/ReverseChainSingleSubst.hh | 8 src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/Sequence.hh | 2 src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/SingleSubst.hh | 14 src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/SingleSubstFormat1.hh | 15 src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/SingleSubstFormat2.hh | 11 src/java.desktop/share/native/libharfbuzz/OT/Layout/types.hh | 7 src/java.desktop/share/native/libharfbuzz/OT/Var/VARC/VARC.cc | 421 src/java.desktop/share/native/libharfbuzz/OT/Var/VARC/VARC.hh | 22 src/java.desktop/share/native/libharfbuzz/OT/glyf/Glyph.hh | 38 src/java.desktop/share/native/libharfbuzz/OT/glyf/SimpleGlyph.hh | 2 src/java.desktop/share/native/libharfbuzz/OT/glyf/glyf.hh | 147 src/java.desktop/share/native/libharfbuzz/graph/classdef-graph.hh | 4 src/java.desktop/share/native/libharfbuzz/graph/coverage-graph.hh | 74 src/java.desktop/share/native/libharfbuzz/graph/graph.hh | 334 src/java.desktop/share/native/libharfbuzz/graph/gsubgpos-context.hh | 1 src/java.desktop/share/native/libharfbuzz/graph/gsubgpos-graph.hh | 116 src/java.desktop/share/native/libharfbuzz/graph/markbasepos-graph.hh | 12 src/java.desktop/share/native/libharfbuzz/graph/pairpos-graph.hh | 19 src/java.desktop/share/native/libharfbuzz/graph/serialize.hh | 45 src/java.desktop/share/native/libharfbuzz/graph/split-helpers.hh | 4 src/java.desktop/share/native/libharfbuzz/hb-aat-layout-common.hh | 134 src/java.desktop/share/native/libharfbuzz/hb-aat-layout-kerx-table.hh | 74 src/java.desktop/share/native/libharfbuzz/hb-aat-layout-morx-table.hh | 23 src/java.desktop/share/native/libharfbuzz/hb-algs.hh | 288 src/java.desktop/share/native/libharfbuzz/hb-alloc-pool.hh | 105 src/java.desktop/share/native/libharfbuzz/hb-array.hh | 7 src/java.desktop/share/native/libharfbuzz/hb-atomic.hh | 96 src/java.desktop/share/native/libharfbuzz/hb-bimap.hh | 2 src/java.desktop/share/native/libharfbuzz/hb-bit-page.hh | 33 src/java.desktop/share/native/libharfbuzz/hb-bit-set-invertible.hh | 2 src/java.desktop/share/native/libharfbuzz/hb-bit-set.hh | 13 src/java.desktop/share/native/libharfbuzz/hb-buffer-deserialize-text-unicode.hh | 10 src/java.desktop/share/native/libharfbuzz/hb-buffer-serialize.cc | 2 src/java.desktop/share/native/libharfbuzz/hb-buffer-verify.cc | 6 src/java.desktop/share/native/libharfbuzz/hb-buffer.cc | 36 src/java.desktop/share/native/libharfbuzz/hb-buffer.hh | 73 src/java.desktop/share/native/libharfbuzz/hb-cache.hh | 33 src/java.desktop/share/native/libharfbuzz/hb-cff2-interp-cs.hh | 4 src/java.desktop/share/native/libharfbuzz/hb-common.cc | 47 src/java.desktop/share/native/libharfbuzz/hb-config.hh | 16 src/java.desktop/share/native/libharfbuzz/hb-debug.hh | 48 src/java.desktop/share/native/libharfbuzz/hb-deprecated.h | 8 src/java.desktop/share/native/libharfbuzz/hb-draw.cc | 20 src/java.desktop/share/native/libharfbuzz/hb-face-builder.cc | 3 src/java.desktop/share/native/libharfbuzz/hb-face.cc | 5 src/java.desktop/share/native/libharfbuzz/hb-font.cc | 248 src/java.desktop/share/native/libharfbuzz/hb-font.h | 129 src/java.desktop/share/native/libharfbuzz/hb-font.hh | 365 src/java.desktop/share/native/libharfbuzz/hb-free-pool.hh | 107 src/java.desktop/share/native/libharfbuzz/hb-ft.cc | 30 src/java.desktop/share/native/libharfbuzz/hb-geometry.hh | 251 src/java.desktop/share/native/libharfbuzz/hb-iter.hh | 11 src/java.desktop/share/native/libharfbuzz/hb-kern.hh | 2 src/java.desktop/share/native/libharfbuzz/hb-limits.hh | 8 src/java.desktop/share/native/libharfbuzz/hb-machinery.hh | 24 src/java.desktop/share/native/libharfbuzz/hb-map.hh | 51 src/java.desktop/share/native/libharfbuzz/hb-number-parser.hh | 8 src/java.desktop/share/native/libharfbuzz/hb-open-file.hh | 14 src/java.desktop/share/native/libharfbuzz/hb-open-type.hh | 207 src/java.desktop/share/native/libharfbuzz/hb-ot-cff-common.hh | 2 src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-std-str.hh | 782 src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-table.hh | 4 src/java.desktop/share/native/libharfbuzz/hb-ot-cff2-table.cc | 6 src/java.desktop/share/native/libharfbuzz/hb-ot-cmap-table.hh | 53 src/java.desktop/share/native/libharfbuzz/hb-ot-font.cc | 568 src/java.desktop/share/native/libharfbuzz/hb-ot-hmtx-table.hh | 79 src/java.desktop/share/native/libharfbuzz/hb-ot-kern-table.hh | 20 src/java.desktop/share/native/libharfbuzz/hb-ot-layout-base-table.hh | 20 src/java.desktop/share/native/libharfbuzz/hb-ot-layout-common.hh | 714 src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gpos-table.hh | 10 src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gsub-table.hh | 10 src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gsubgpos.hh | 1096 - src/java.desktop/share/native/libharfbuzz/hb-ot-layout.cc | 162 src/java.desktop/share/native/libharfbuzz/hb-ot-layout.h | 6 src/java.desktop/share/native/libharfbuzz/hb-ot-layout.hh | 32 src/java.desktop/share/native/libharfbuzz/hb-ot-math-table.hh | 6 src/java.desktop/share/native/libharfbuzz/hb-ot-post-macroman.hh | 516 src/java.desktop/share/native/libharfbuzz/hb-ot-shape-fallback.cc | 29 src/java.desktop/share/native/libharfbuzz/hb-ot-shape-normalize.cc | 12 src/java.desktop/share/native/libharfbuzz/hb-ot-shape-normalize.hh | 2 src/java.desktop/share/native/libharfbuzz/hb-ot-shape.cc | 216 src/java.desktop/share/native/libharfbuzz/hb-ot-shape.hh | 2 src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-joining-list.hh | 8 src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-table.hh | 22 src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic.cc | 2 src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-hangul.cc | 2 src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic-machine.hh | 14 src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic-table.cc | 12 src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic.cc | 48 src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-khmer-machine.hh | 14 src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-khmer.cc | 6 src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-myanmar-machine.hh | 14 src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-thai.cc | 6 src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-use-machine.hh | 14 src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-use-table.hh | 727 src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-vowel-constraints.cc | 4 src/java.desktop/share/native/libharfbuzz/hb-ot-shaper.hh | 6 src/java.desktop/share/native/libharfbuzz/hb-ot-stat-table.hh | 20 src/java.desktop/share/native/libharfbuzz/hb-ot-tag-table.hh | 8 src/java.desktop/share/native/libharfbuzz/hb-ot-var-avar-table.hh | 178 src/java.desktop/share/native/libharfbuzz/hb-ot-var-common.hh | 719 src/java.desktop/share/native/libharfbuzz/hb-ot-var-cvar-table.hh | 7 src/java.desktop/share/native/libharfbuzz/hb-ot-var-fvar-table.hh | 25 src/java.desktop/share/native/libharfbuzz/hb-ot-var-gvar-table.hh | 165 src/java.desktop/share/native/libharfbuzz/hb-ot-var-hvar-table.hh | 101 src/java.desktop/share/native/libharfbuzz/hb-ot-var.cc | 20 src/java.desktop/share/native/libharfbuzz/hb-ot-vorg-table.hh | 1 src/java.desktop/share/native/libharfbuzz/hb-outline.cc | 9 src/java.desktop/share/native/libharfbuzz/hb-outline.hh | 1 src/java.desktop/share/native/libharfbuzz/hb-paint-extents.cc | 14 src/java.desktop/share/native/libharfbuzz/hb-paint-extents.hh | 38 src/java.desktop/share/native/libharfbuzz/hb-paint.hh | 74 src/java.desktop/share/native/libharfbuzz/hb-pool.hh | 107 src/java.desktop/share/native/libharfbuzz/hb-priority-queue.hh | 12 src/java.desktop/share/native/libharfbuzz/hb-repacker.hh | 27 src/java.desktop/share/native/libharfbuzz/hb-sanitize.hh | 98 src/java.desktop/share/native/libharfbuzz/hb-script-list.h | 12 src/java.desktop/share/native/libharfbuzz/hb-serialize.hh | 9 src/java.desktop/share/native/libharfbuzz/hb-set-digest.hh | 6 src/java.desktop/share/native/libharfbuzz/hb-shape.cc | 8 src/java.desktop/share/native/libharfbuzz/hb-shaper-list.hh | 8 src/java.desktop/share/native/libharfbuzz/hb-static.cc | 23 src/java.desktop/share/native/libharfbuzz/hb-string-array.hh | 12 src/java.desktop/share/native/libharfbuzz/hb-subset-cff-common.hh | 6 src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-iup.hh | 15 src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-solver.cc | 38 src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-solver.hh | 22 src/java.desktop/share/native/libharfbuzz/hb-subset-plan-member-list.hh | 4 src/java.desktop/share/native/libharfbuzz/hb-subset-plan.cc | 19 src/java.desktop/share/native/libharfbuzz/hb-subset-plan.hh | 3 src/java.desktop/share/native/libharfbuzz/hb-subset.cc | 578 src/java.desktop/share/native/libharfbuzz/hb-subset.h | 5 src/java.desktop/share/native/libharfbuzz/hb-subset.hh | 1 src/java.desktop/share/native/libharfbuzz/hb-ucd-table.hh | 9223 ++++------ src/java.desktop/share/native/libharfbuzz/hb-unicode-emoji-table.hh | 86 src/java.desktop/share/native/libharfbuzz/hb-unicode.hh | 51 src/java.desktop/share/native/libharfbuzz/hb-utf.hh | 20 src/java.desktop/share/native/libharfbuzz/hb-vector.hh | 187 src/java.desktop/share/native/libharfbuzz/hb-version.h | 8 src/java.desktop/share/native/libharfbuzz/hb.hh | 29 src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java | 25 src/java.desktop/unix/classes/sun/awt/screencast/ScreencastHelper.java | 8 src/java.desktop/unix/classes/sun/awt/screencast/TokenStorage.java | 25 src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c | 21 src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp | 29 src/java.net.http/share/classes/jdk/internal/net/http/common/SSLFlowDelegate.java | 48 src/java.net.http/share/classes/jdk/internal/net/http/common/SubscriberWrapper.java | 4 src/java.rmi/share/classes/javax/rmi/ssl/SslRMIClientSocketFactory.java | 20 src/java.security.jgss/share/classes/javax/security/auth/kerberos/KeyImpl.java | 2 src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/AesDkCrypto.java | 26 src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/AesSha2DkCrypto.java | 26 src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/ArcFourCrypto.java | 2 src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java | 41 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/Const.java | 828 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/ExceptionConst.java | 7 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/Repository.java | 6 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/AccessFlags.java | 232 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/AnnotationEntry.java | 15 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Annotations.java | 10 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ArrayElementValue.java | 4 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Attribute.java | 8 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/BootstrapMethod.java | 15 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/BootstrapMethods.java | 6 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ClassFormatException.java | 10 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ClassParser.java | 12 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Code.java | 45 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/CodeException.java | 8 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Constant.java | 31 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantCP.java | 12 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantDouble.java | 6 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantFloat.java | 6 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantInteger.java | 6 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantLong.java | 6 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantObject.java | 7 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantPool.java | 29 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantUtf8.java | 23 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantValue.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Deprecated.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/DescendingVisitor.java | 41 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ElementValue.java | 7 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/EmptyVisitor.java | 9 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ExceptionTable.java | 11 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Field.java | 38 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/FieldOrMethod.java | 38 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/InnerClass.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/InnerClasses.java | 8 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/InvalidMethodSignatureException.java | 53 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/JavaClass.java | 152 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LineNumber.java | 4 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LineNumberTable.java | 23 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LocalVariableTable.java | 10 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LocalVariableTypeTable.java | 11 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Method.java | 49 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/MethodParameter.java | 12 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/MethodParameters.java | 8 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Module.java | 66 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleExports.java | 49 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleMainClass.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleOpens.java | 49 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModulePackages.java | 11 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleProvides.java | 45 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleRequires.java | 39 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/NestMembers.java | 11 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Node.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/PMGClass.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ParameterAnnotationEntry.java | 18 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ParameterAnnotations.java | 8 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Record.java | 153 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RecordComponentInfo.java | 139 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeInvisibleAnnotations.java | 8 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeInvisibleParameterAnnotations.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeVisibleAnnotations.java | 8 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeVisibleParameterAnnotations.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Signature.java | 10 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/SimpleElementValue.java | 20 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/SourceFile.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/StackMap.java | 10 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/StackMapEntry.java | 13 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/StackMapType.java | 29 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Synthetic.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Utility.java | 60 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Visitor.java | 32 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/package-info.java | 25 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ARRAYLENGTH.java | 6 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ATHROW.java | 7 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/AnnotationEntryGen.java | 22 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ArrayElementValueGen.java | 15 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ArrayType.java | 10 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/BranchHandle.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/CPInstruction.java | 6 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ClassElementValueGen.java | 8 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ClassGen.java | 82 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/CodeExceptionGen.java | 10 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ElementValuePairGen.java | 4 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/EnumElementValueGen.java | 26 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ExceptionThrower.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/FieldGen.java | 42 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/FieldGenOrMethodGen.java | 12 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/FieldOrMethod.java | 4 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ICONST.java | 1 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/INVOKEDYNAMIC.java | 8 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/Instruction.java | 6 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionConst.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionFactory.java | 28 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionHandle.java | 15 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionList.java | 69 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionTargeter.java | 9 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LCMP.java | 1 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LDC.java | 9 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LineNumberGen.java | 4 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LocalVariableGen.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LocalVariableInstruction.java | 6 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/MethodGen.java | 53 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ObjectType.java | 6 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/RET.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ReferenceType.java | 62 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/SWITCH.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/Select.java | 14 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/SimpleElementValueGen.java | 6 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/TargetLostException.java | 28 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/Type.java | 70 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/TypedInstruction.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/package-info.java | 26 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/package-info.java | 26 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/BCELComparator.java | 23 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/BCELFactory.java | 8 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/BCELifier.java | 91 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/Class2HTML.java | 10 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/ClassSet.java | 4 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/CodeHTML.java | 2 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/InstructionFinder.java | 7 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/Repository.java | 6 src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/package-info.java | 32 src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathExpressionImpl.java | 17 src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java | 5 src/java.xml/share/classes/jdk/xml/internal/Utils.java | 60 src/java.xml/share/legal/bcel.md | 2 src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java | 183 src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/RSACipherAdaptor.java | 155 src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java | 4 src/jdk.internal.le/share/classes/jdk/internal/org/jline/JdkConsoleProviderImpl.java | 1 src/jdk.jfr/share/classes/jdk/jfr/events/EventConfigurations.java | 6 src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformEventType.java | 16 src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java | 8 src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/PeriodicEvents.java | 6 src/jdk.management/aix/native/libmanagement_ext/UnixOperatingSystem.c | 99 test/hotspot/gtest/runtime/test_os.cpp | 160 test/hotspot/jtreg/TEST.ROOT | 2 test/hotspot/jtreg/compiler/loopopts/TestValidTypeInOverflowProtection.java | 114 test/hotspot/jtreg/compiler/loopstripmining/CheckLoopStripMining.java | 8 test/hotspot/jtreg/containers/docker/TestJFRWithJMX.java | 8 test/hotspot/jtreg/containers/docker/TestJcmd.java | 2 test/hotspot/jtreg/containers/docker/TestJcmdWithSideCar.java | 142 test/hotspot/jtreg/containers/docker/TestMemoryInvisibleParent.java | 117 test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java | 15 test/hotspot/jtreg/containers/docker/TestPids.java | 2 test/hotspot/jtreg/containers/systemd/SystemdMemoryAwarenessTest.java | 10 test/hotspot/jtreg/gc/arguments/TestG1CompressedOops.java | 86 test/hotspot/jtreg/gc/g1/TestEvacuationFailure.java | 7 test/hotspot/jtreg/runtime/Safepoint/TestAbortOnVMOperationTimeout.java | 1 test/hotspot/jtreg/runtime/Thread/AsyncExceptionOnMonitorEnter.java | 4 test/hotspot/jtreg/runtime/Thread/AsyncExceptionTest.java | 2 test/hotspot/jtreg/runtime/Thread/TestBreakSignalThreadDump.java | 4 test/hotspot/jtreg/runtime/Thread/ThreadCountLimit.java | 72 test/hotspot/jtreg/runtime/handshake/HandshakeTimeoutTest.java | 4 test/hotspot/jtreg/testlibrary/jittester/conf/default.properties | 2 test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/factories/StaticConstructorDefinitionFactory.java | 4 test/hotspot/jtreg/vmTestbase/nsk/share/gc/GC.java | 3 test/jaxp/TEST.ROOT | 2 test/jdk/ProblemList-Virtual.txt | 3 test/jdk/ProblemList.txt | 12 test/jdk/TEST.ROOT | 2 test/jdk/com/sun/jdi/JdbStopInNotificationThreadTest.java | 6 test/jdk/com/sun/jdi/TwoThreadsTest.java | 9 test/jdk/com/sun/jndi/ldap/LdapPoolTimeoutTest.java | 97 test/jdk/com/sun/tools/attach/java.policy.allow | 9 test/jdk/java/awt/Focus/AppletInitialFocusTest/AppletInitialFocusTest.java | 73 test/jdk/java/awt/Focus/AppletInitialFocusTest/AppletInitialFocusTest1.java | 73 test/jdk/java/awt/Focus/InitialFocusTest/InitialFocusTest.java | 73 test/jdk/java/awt/Focus/InitialFocusTest/InitialFocusTest1.java | 73 test/jdk/java/awt/Frame/MiscUndecorated/ActiveAWTWindowTest.java | 205 test/jdk/java/awt/Mouse/MouseModifiersUnitTest/ExtraButtonDrag.java | 212 test/jdk/java/awt/Multiscreen/MultiScreenInsetsTest/MultiScreenInsetsTest.java | 92 test/jdk/java/awt/Toolkit/ScreenInsetsTest/ScreenInsetsTest.java | 157 test/jdk/java/awt/font/TextLayout/TestLayoutVsICU.java | 889 test/jdk/java/awt/font/TextLayout/TestLayoutVsICU_jdkbase.xml | 1827 - test/jdk/java/awt/image/XBMDecoder/XBMDecoderTest.java | 99 test/jdk/java/awt/image/XBMDecoder/invalid.xbm | 2 test/jdk/java/awt/image/XBMDecoder/invalid_empty.xbm | 6 test/jdk/java/awt/image/XBMDecoder/invalid_hex.xbm | 3 test/jdk/java/awt/image/XBMDecoder/invalid_ht.xbm | 3 test/jdk/java/awt/image/XBMDecoder/invalid_plus.xbm | 3 test/jdk/java/awt/image/XBMDecoder/valid.xbm | 6 test/jdk/java/awt/image/XBMDecoder/valid_hex.xbm | 4 test/jdk/java/awt/image/XBMDecoder/valid_multiline.xbm | 8 test/jdk/java/awt/regtesthelpers/PassFailJFrame.java | 69 test/jdk/java/foreign/nested/TestNested.java | 2 test/jdk/java/io/Console/ModuleSelectionTest.java | 80 test/jdk/java/io/Console/moduleSelection.exp | 30 test/jdk/java/io/Serializable/cloneArray/CloneArray.java | 3 test/jdk/java/lang/Byte/Decode.java | 4 test/jdk/java/lang/Class/IsAnnotationType.java | 3 test/jdk/java/lang/Class/IsEnum.java | 3 test/jdk/java/lang/Class/IsSynthetic.java | 3 test/jdk/java/lang/Class/getEnclosingConstructor/EnclosingConstructorTests.java | 3 test/jdk/java/lang/Class/getEnclosingMethod/EnclosingMethodTests.java | 3 test/jdk/java/lang/Double/BitwiseConversion.java | 3 test/jdk/java/lang/Double/Constants.java | 3 test/jdk/java/lang/Double/Extrema.java | 3 test/jdk/java/lang/Double/NaNInfinityParsing.java | 3 test/jdk/java/lang/Double/ParseHexFloatingPoint.java | 3 test/jdk/java/lang/Double/ToHexString.java | 3 test/jdk/java/lang/Float/BitwiseConversion.java | 3 test/jdk/java/lang/Float/Constants.java | 3 test/jdk/java/lang/Float/Extrema.java | 3 test/jdk/java/lang/Float/NaNInfinityParsing.java | 3 test/jdk/java/lang/Integer/Decode.java | 4 test/jdk/java/lang/Integer/ParsingTest.java | 3 test/jdk/java/lang/Integer/Unsigned.java | 3 test/jdk/java/lang/Long/Decode.java | 4 test/jdk/java/lang/Long/ParsingTest.java | 3 test/jdk/java/lang/Long/Unsigned.java | 3 test/jdk/java/lang/ProcessBuilder/Basic.java | 4 test/jdk/java/lang/ProcessBuilder/SiblingIOEHandle.java | 7 test/jdk/java/lang/ProcessHandle/TEST.properties | 1 test/jdk/java/lang/RuntimeTests/exec/Space.java | 11 test/jdk/java/lang/RuntimeTests/exec/Status.java | 7 test/jdk/java/lang/Short/Decode.java | 4 test/jdk/java/lang/StringBuilder/RacingSBThreads.java | 303 test/jdk/java/lang/System/NonAnsiFileEncodingTest.java | 63 test/jdk/java/lang/Throwable/SuppressedExceptions.java | 3 test/jdk/java/lang/annotation/Missing/MissingTest.java | 3 test/jdk/java/lang/annotation/TestIncompleteAnnotationExceptionNPE.java | 3 test/jdk/java/lang/reflect/AnnotatedElement/TestAnnotatedElementDefaults.java | 3 test/jdk/java/lang/reflect/Constructor/GenericStringTest.java | 3 test/jdk/java/lang/reflect/Constructor/TestParameterAnnotations.java | 3 test/jdk/java/lang/reflect/DefaultAccessibility.java | 3 test/jdk/java/lang/reflect/Field/GenericStringTest.java | 3 test/jdk/java/lang/reflect/Generics/HashCodeTest.java | 3 test/jdk/java/lang/reflect/Generics/Probe.java | 3 test/jdk/java/lang/reflect/Generics/StringsAndBounds.java | 3 test/jdk/java/lang/reflect/Generics/TestParameterizedType.java | 3 test/jdk/java/lang/reflect/Generics/exceptionCauseTest.java | 3 test/jdk/java/lang/reflect/Generics/getAnnotationTest.java | 3 test/jdk/java/lang/reflect/Method/GenericStringTest.java | 3 test/jdk/java/lang/reflect/Method/IsDefaultTest.java | 3 test/jdk/java/lang/reflect/Method/defaultMethodModeling/DefaultMethodModeling.java | 3 test/jdk/java/lang/reflect/TypeVariable/TestAnnotatedElement.java | 3 test/jdk/java/math/BigDecimal/AddTests.java | 3 test/jdk/java/math/BigDecimal/CompareToTests.java | 3 test/jdk/java/math/BigDecimal/DivideTests.java | 3 test/jdk/java/math/BigDecimal/IntegralDivisionTests.java | 3 test/jdk/java/math/BigDecimal/NegateTests.java | 3 test/jdk/java/math/BigDecimal/PowTests.java | 3 test/jdk/java/math/BigDecimal/PrecisionTests.java | 3 test/jdk/java/math/BigDecimal/RoundingTests.java | 3 test/jdk/java/math/BigDecimal/ScaleByPowerOfTenTests.java | 3 test/jdk/java/math/BigDecimal/StrippingZerosTest.java | 3 test/jdk/java/math/BigDecimal/ToPlainStringTests.java | 3 test/jdk/java/math/BigDecimal/ZeroScalingTests.java | 3 test/jdk/java/math/BigInteger/CompareToTests.java | 3 test/jdk/java/math/BigInteger/ExtremeShiftingTests.java | 3 test/jdk/java/math/BigInteger/OperatorNpeTests.java | 3 test/jdk/java/math/BigInteger/StringConstructor.java | 3 test/jdk/java/math/BigInteger/TestValueExact.java | 3 test/jdk/java/math/RoundingMode/RoundingModeTests.java | 3 test/jdk/java/nio/Buffer/LimitDirectMemory.java | 2 test/jdk/java/nio/channels/Selector/HelperSlowToDie.java | 8 test/jdk/java/nio/channels/SocketChannel/AsyncCloseChannel.java | 7 test/jdk/java/nio/channels/SocketChannel/SocketInheritance.java | 6 test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java | 7 test/jdk/java/nio/channels/vthread/BlockingChannelOps.java | 140 test/jdk/java/nio/charset/RemovingSunIO/TestCOMP.java | 6 test/jdk/java/nio/file/DirectoryStream/DriveLetter.java | 8 test/jdk/java/nio/file/DirectoryStream/SecureDS.java | 24 test/jdk/java/nio/file/Files/CheckPermissions.java | 8 test/jdk/java/nio/file/Files/CopyAndMove.java | 44 test/jdk/java/nio/file/Files/CopyInterference.java | 157 test/jdk/java/nio/file/Files/CreateDirectories.java | 4 test/jdk/java/nio/file/Files/DeleteOnClose.java | 4 test/jdk/java/nio/file/Files/Misc.java | 13 test/jdk/java/nio/file/Files/SBC.java | 12 test/jdk/java/nio/file/Files/SetLastModifiedTime.java | 4 test/jdk/java/nio/file/Files/StreamTest.java | 22 test/jdk/java/nio/file/Files/SubstDrive.java | 7 test/jdk/java/nio/file/Files/SymlinkTime.java | 4 test/jdk/java/nio/file/Files/walkFileTree/CreateFileTree.java | 6 test/jdk/java/nio/file/Path/ToRealPath.java | 10 test/jdk/java/nio/file/TestUtil.java | 21 test/jdk/java/nio/file/WatchService/FileTreeModifier.java | 8 test/jdk/java/nio/file/attribute/DosFileAttributeView/Basic.java | 4 test/jdk/java/nio/file/attribute/PosixFileAttributeView/Basic.java | 4 test/jdk/java/nio/file/attribute/UserDefinedFileAttributeView/Basic.java | 4 test/jdk/java/rmi/server/RemoteServer/AddrInUse.java | 96 test/jdk/java/security/KeyStore/TestDisabledAlgorithms.java | 120 test/jdk/java/security/MessageDigest/TestDisabledAlgorithms.java | 93 test/jdk/java/security/Signature/TestDisabledAlgorithms.java | 91 test/jdk/java/text/testlib/HexDumpReader.java | 104 test/jdk/java/util/Locale/PreserveTagCase.java | 6 test/jdk/java/util/TimeZone/TimeZoneData/VERSION | 2 test/jdk/javax/crypto/Cipher/TestDisabledAlgorithms.java | 116 test/jdk/javax/crypto/Cipher/TestDisabledWithOids.java | 47 test/jdk/javax/crypto/Cipher/TestEmptyModePadding.java | 86 test/jdk/javax/net/ssl/SSLSession/CertMsgCheck.java | 8 test/jdk/javax/net/ssl/SSLSession/CheckSessionContext.java | 3 test/jdk/javax/net/ssl/Stapling/HttpsUrlConnClient.java | 86 test/jdk/javax/net/ssl/TLSCommon/interop/AbstractPeer.java | 9 test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcClient.java | 3 test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcServer.java | 3 test/jdk/javax/net/ssl/templates/TLSBase.java | 282 test/jdk/javax/rmi/ssl/SslRMIClientSocketFactory.policy | 4 test/jdk/javax/rmi/ssl/SslRMIClientSocketFactoryPermissionTest.java | 49 test/jdk/javax/swing/ButtonGroup/TestButtonGroupFocusTraversal.java | 69 test/jdk/javax/swing/GraphicsConfigNotifier/StalePreferredSize.java | 9 test/jdk/javax/swing/JColorChooser/Test8152419.java | 21 test/jdk/javax/swing/JComboBox/ComboPopupBug.java | 103 test/jdk/javax/swing/JRadioButton/4314194/bug4314194.java | 6 test/jdk/javax/swing/plaf/basic/BasicHTML/bug4248210.java | 120 test/jdk/javax/swing/regtesthelpers/Util.java | 68 test/jdk/javax/swing/text/html/CSS/8231286/HtmlFontSizeTest.java | 18 test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java | 15 test/jdk/jdk/internal/vm/Continuation/Fuzz.java | 3 test/jdk/jdk/jfr/event/runtime/TestBackToBackSensitive.java | 132 test/jdk/jdk/nio/zipfs/TestPosix.java | 4 test/jdk/sun/java2d/marlin/ClipShapeTest.java | 5 test/jdk/sun/security/krb5/NullStringToKey.java | 59 test/jdk/sun/security/krb5/RFC396xTest.java | 3 test/jdk/sun/security/krb5/auto/DiffSaltParams.java | 6 test/jdk/sun/security/krb5/auto/KDC.java | 43 test/jdk/sun/security/krb5/auto/UserIterCount.java | 61 test/jdk/sun/security/pkcs11/Cipher/TestDisabledAlgorithms.java | 81 test/jdk/sun/security/pkcs11/Signature/TestNONEwithRSA.java | 96 test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTClient.java | 174 test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTNoSessionCreation.java | 96 test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTParallel.java | 212 test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTSequence.java | 144 test/jdk/sun/security/ssl/SSLSessionImpl/ResumeChecksClient.java | 222 test/jdk/sun/security/ssl/SSLSessionImpl/ResumeChecksServer.java | 310 test/jdk/sun/security/ssl/X509TrustManagerImpl/distrust/Chunghwa.java | 69 test/jdk/sun/security/ssl/X509TrustManagerImpl/distrust/chains/chunghwa/chunghwaepkirootca-chain.pem | 50 test/jdk/sun/security/tools/keytool/EchoPassword.java | 150 test/jdk/sun/security/tools/keytool/SetInPassword.java | 44 test/jdk/sun/security/util/AlgorithmConstraints/InvalidCryptoDisabledAlgos.java | 63 test/jdk/sun/security/util/Password/EmptyIn.java | 74 test/jdk/sun/security/util/Resources/Usages.java | 4 test/jdk/sun/security/x509/URICertStore/CRLReadTimeout.java | 87 test/jdk/tools/jar/ReproducibleJar.java | 17 test/jdk/tools/launcher/ChangeDataModel.java | 3 test/jdk/tools/launcher/I18NTest.java | 3 test/jdk/tools/launcher/UnresolvedExceptions.java | 3 test/langtools/TEST.ROOT | 2 test/langtools/jdk/jshell/JdiHangingListenExecutionControlTest.java | 8 test/lib-test/TEST.ROOT | 4 test/lib-test/jdk/test/whitebox/WaitForRefProcTest.java | 30 test/lib/jdk/test/lib/containers/docker/DockerRunOptions.java | 14 test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java | 31 test/lib/jdk/test/lib/process/OutputAnalyzer.java | 14 test/lib/jdk/test/lib/security/OpensslArtifactFetcher.java | 2 test/lib/jdk/test/whitebox/WhiteBox.java | 2 test/micro/org/openjdk/bench/java/lang/reflect/NativeMethodInvoke.java | 79 979 files changed, 34096 insertions(+), 22989 deletions(-) dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp9rdype9v/openjdk-21_21.0.10+7-1~deb13u1.dsc: no acceptable signature found dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp9rdype9v/openjdk-21_21.0.11+10-1~deb13u1.dsc: no acceptable signature found diff -Nru openjdk-21-21.0.10+7/.jcheck/conf openjdk-21-21.0.11+10/.jcheck/conf --- openjdk-21-21.0.10+7/.jcheck/conf 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/.jcheck/conf 2026-04-17 19:09:35.000000000 +0000 @@ -1,7 +1,7 @@ [general] project=jdk-updates jbs=JDK -version=21.0.10 +version=21.0.11 [checks] error=author,committer,reviewers,merge,issues,executable,symlink,message,hg-tag,whitespace,problemlists diff -Nru openjdk-21-21.0.10+7/debian/changelog openjdk-21-21.0.11+10/debian/changelog --- openjdk-21-21.0.10+7/debian/changelog 2026-01-22 22:10:02.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/changelog 2026-04-24 18:36:40.000000000 +0000 @@ -1,8 +1,98 @@ -openjdk-21 (21.0.10+7-1~deb13u1) trixie-security; urgency=medium +openjdk-21 (21.0.11+10-1~deb13u1) trixie-security; urgency=medium * Rebuild for trixie - -- Moritz Muehlenhoff Thu, 22 Jan 2026 23:10:02 +0100 + -- Moritz Muehlenhoff Fri, 24 Apr 2026 20:36:54 +0200 + +openjdk-21 (21.0.11+10-1) unstable; urgency=medium + + * OpenJDK 21.0.11 release, build 10. + - CVEs: + + CVE-2026-22016: 8370529: Enhance Path Factories Redux + + CVE-2026-34282: 8374557: Enhance TLS connection handling + + CVE-2026-22021: 8371830: Enhance certificate chain validation + + CVE-2026-22013: 8370615: Improve Kerberos credentialing + + CVE-2026-23865: 8379158: Update FreeType to 2.14.2 + + CVE-2026-22018: 8370986: Enhance Zip file reading + + CVE-2026-22007: 8369575: Enhance crypto algorithm support + + CVE-2026-34268: 8371935: Enhance key generation + * d/rules: Check generated files only on amd64. This resolves riscv64 + ftbfs, as some architectures change with_check flag. + * d/t/problems.csv: Fix typo in loong64 excluded tests lists. + * Add common GPL and Apache license headers to copyright generator. + * d/copyright: Regenerate. + + -- Vladimir Petko Fri, 24 Apr 2026 13:36:40 +1200 + +openjdk-21 (21.0.11~9ea-2) unstable; urgency=medium + + * Ensure that all generated files are up to date: + - The copyright generator now checks if the current directory contains + an unpacked OpenJDK tree by verifying the presence of the + ASSEMBLY_EXCEPTION file. + - The copyright generator now drops common license text in-memory, + without running a shell script that modifies the source tree. + - d/rules: Add targets to generate all files and check that they match + the ones provided in the source package. + - d/rules: Add nogen DEB_BUILD_OPTION to disable file regeneration. + * d/rules: Use '-' instead of '~' in opt version string, swap package + version and distribution. + + -- Vladimir Petko Fri, 17 Apr 2026 09:54:54 +1200 + +openjdk-21 (21.0.11~9ea-1) unstable; urgency=medium + + * OpenJDK 21.0.11 early access, build 9. + * d/t/problems.csv: Update problem list. + + -- Vladimir Petko Fri, 10 Apr 2026 22:59:14 +1200 + +openjdk-21 (21.0.11~8ea-1) unstable; urgency=medium + + * OpenJDK 21.0.11 early access, build 8. + + [ Vladimir Petko ] + * d/rules: Revert replace '~' with '-' in the optional version string. + This should be resolved upstream. + * d/p/jdk-8381555.diff: Apply upstream patch to disable G1 Compressed + Oops test on 32 bit architectures (JDK-8381555). + + [ Matthias Klose ] + * d/t/jtreg-autopkgtest.in: Increase the timeout from 10 to 30 seconds + on loong64 (zero VM). + + -- Matthias Klose Fri, 27 Mar 2026 12:33:53 +0100 + +openjdk-21 (21.0.11~6ea-1) unstable; urgency=medium + + * OpenJDK 21.0.11 early access, build 6. + * d/rules: Remove '[' separator in the version string, it makes + version string invalid. + + -- Vladimir Petko Fri, 13 Mar 2026 14:25:04 +1300 + +openjdk-21 (21.0.11~5ea-1) unstable; urgency=medium + + * OpenJDK 21.0.11 early access, build 5. + + [ Miao Wang ] + * d/t/problems.csv: Add tests which take too long to finish on + loong64. + + [ Vladimir Petko ] + * d/rules: Separate package version in version string. + * d/dbg.py: Fix syntax errors in gdb unwinder, do not install unwinder + for zero, install hotspot unwinder in the correct directory. + * d/t/jtreg-autopkgtest.{in,sh}: Do not force agentvm for s390x jtreg + tests to resolve the build crash on Launchpad. + Disable debug traces. Load unwinder in the disabled state. + Return iterator rather than list from OpenJDKFrameFilter.flatten(). + Remove unused code from NativeMethodInfo. + + [ Matthias Klose ] + * Refresh patches. + + -- Matthias Klose Fri, 06 Mar 2026 14:15:29 +0100 openjdk-21 (21.0.10+7-1) unstable; urgency=medium diff -Nru openjdk-21-21.0.10+7/debian/control openjdk-21-21.0.11+10/debian/control --- openjdk-21-21.0.10+7/debian/control 2026-01-22 10:20:45.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/control 2026-04-24 18:36:54.000000000 +0000 @@ -7,7 +7,7 @@ m4, lsb-release, zip, unzip, sharutils, gawk, cpio, procps, wdiff, pkgconf, fastjar (>= 2:0.96-0ubuntu2), time, strip-nondeterminism, debugedit (>= 4.16), - jtreg7 (>= 7.3.1+1~) , libtestng7-java , xvfb , xauth , xfonts-base , libgl1-mesa-dri [!x32] , xfwm4 , x11-xkb-utils , dbus-x11 , libasmtools-java , xvfb , + jtreg7 , libtestng7-java , xvfb , xauth , xfonts-base , libgl1-mesa-dri [!x32] , xfwm4 , x11-xkb-utils , dbus-x11 , libasmtools-java , xvfb , autoconf, automake, ant, ant-optional, g++-14 , openjdk-21-jdk-headless:native | openjdk-20-jdk-headless:native, @@ -179,7 +179,7 @@ Multi-Arch: same Depends: openjdk-21-jdk (= ${binary:Version}), build-essential, xfwm4, xvfb, dbus-x11, libatk-wrapper-java, - libatk-wrapper-java-jni, jtreg7 (>= 7.3.1+1~), libtestng7-java, + libatk-wrapper-java-jni, jtreg7 (>= 7.5.2+1~), libtestng7-java, ${shlibs:Depends}, ${misc:Depends} Description: Java runtime based on OpenJDK (regression test support) diff -Nru openjdk-21-21.0.10+7/debian/copyright openjdk-21-21.0.11+10/debian/copyright --- openjdk-21-21.0.10+7/debian/copyright 2026-01-21 21:50:48.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/copyright 2026-04-24 01:35:11.000000000 +0000 @@ -667,6 +667,1084 @@ --- end of LICENSE --- . ------------------------------------------------------------------------------ + %% This notice is provided with respect to GCC - libgcc and libstdc++ 14.2.0, + which may be included with JRE 21, JDK 21 and OpenJDK 21 + . + --- begin of LICENSE --- + . + GNU GENERAL PUBLIC LICENSE v3: Refer to the copy under /usr/share/common-licenses + . + GCC RUNTIME LIBRARY EXCEPTION v3.1 + . + . + Version 3.1, 31 March 2009 + Copyright (C) 2009 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies of this + license document, but changing it is not allowed. + This GCC Runtime Library Exception ("Exception") is an additional + permission under section 7 of the GNU General Public License, version + 3 ("GPLv3"). It applies to a given file (the "Runtime Library") that + bears a notice placed by the copyright holder of the file stating that + the file is governed by GPLv3 along with this Exception. + When you use GCC to compile a program, GCC may combine portions of + certain GCC header files and runtime libraries with the compiled + program. The purpose of this Exception is to allow compilation of + non-GPL (including proprietary) programs to use, in this way, the + header files and runtime libraries covered by this Exception. + 0. Definitions. + A file is an "Independent Module" if it either requires the Runtime + Library for execution after a Compilation Process, or makes use of an + interface provided by the Runtime Library, but is not otherwise based + on the Runtime Library. + "GCC" means a version of the GNU Compiler Collection, with or without + modifications, governed by version 3 (or a specified later version) of + the GNU General Public License (GPL) with the option of using any + subsequent versions published by the FSF. + "GPL-compatible Software" is software whose conditions of propagation, + modification and use would permit combination with GCC in accord with + the license of GCC. + "Target Code" refers to output from any compiler for a real or virtual + target processor architecture, in executable form or suitable for + input to an assembler, loader, linker and/or execution + phase. Notwithstanding that, Target Code does not include data in any + format that is used as a compiler intermediate representation, or used + for producing a compiler intermediate representation. + The "Compilation Process" transforms code entirely represented in + non-intermediate languages designed for human-written code, and/or in + Java Virtual Machine byte code, into Target Code. Thus, for example, + use of source code generators and preprocessors need not be considered + part of the Compilation Process, since the Compilation Process can be + understood as starting with the output of the generators or + preprocessors. + A Compilation Process is "Eligible" if it is done using GCC, alone or + with other GPL-compatible software, or if it is done without using any + work based on GCC. For example, using non-GPL-compatible Software to + optimize any GCC intermediate representations would not qualify as an + Eligible Compilation Process. + 1. Grant of Additional Permission. + You have permission to propagate a work of Target Code formed by + combining the Runtime Library with Independent Modules, even if such + propagation would otherwise violate the terms of GPLv3, provided that + all Target Code was generated by Eligible Compilation Processes. You + may then convey such a combination under terms of your choice, + consistent with the licensing of the Independent Modules. + 2. No Weakening of GCC Copyleft. + The availability of this Exception does not imply any general + presumption that third-party software is unaffected by the copyleft + requirements of the license of GCC. + . + . + GNU GENERAL PUBLIC LICENSE v2: Refer to the copy under /usr/share/common-licenses + . + GNU LESSER GENERAL PUBLIC LICENSE v3 + . + . + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + This version of the GNU Lesser General Public License incorporates + the terms and conditions of version 3 of the GNU General Public + License, supplemented by the additional permissions listed below. + 0. Additional Definitions. + As used herein, "this License" refers to version 3 of the GNU Lesser + General Public License, and the "GNU GPL" refers to version 3 of the GNU + General Public License. + "The Library" refers to a covered work governed by this License, + other than an Application or a Combined Work as defined below. + An "Application" is any work that makes use of an interface provided + by the Library, but which is not otherwise based on the Library. + Defining a subclass of a class defined by the Library is deemed a mode + of using an interface provided by the Library. + A "Combined Work" is a work produced by combining or linking an + Application with the Library. The particular version of the Library + with which the Combined Work was made is also called the "Linked + Version". + The "Minimal Corresponding Source" for a Combined Work means the + Corresponding Source for the Combined Work, excluding any source code + for portions of the Combined Work that, considered in isolation, are + based on the Application, and not on the Linked Version. + The "Corresponding Application Code" for a Combined Work means the + object code and/or source code for the Application, including any data + and utility programs needed for reproducing the Combined Work from the + Application, but excluding the System Libraries of the Combined Work. + 1. Exception to Section 3 of the GNU GPL. + You may convey a covered work under sections 3 and 4 of this License + without being bound by section 3 of the GNU GPL. + 2. Conveying Modified Versions. + If you modify a copy of the Library, and, in your modifications, a + facility refers to a function or data to be supplied by an Application + that uses the facility (other than as an argument passed when the + facility is invoked), then you may convey a copy of the modified + version: + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + 3. Object Code Incorporating Material from Library Header Files. + The object code form of an Application may incorporate material from + a header file that is part of the Library. You may convey such object + code under terms of your choice, provided that, if the incorporated + material is not limited to numerical parameters, data structure + layouts and accessors, or small macros, inline functions and templates + (ten or fewer lines in length), you do both of the following: + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + b) Accompany the object code with a copy of the GNU GPL and this license + document. + 4. Combined Works. + You may convey a Combined Work under terms of your choice that, + taken together, effectively do not restrict modification of the + portions of the Library contained in the Combined Work and reverse + engineering for debugging such modifications, if you also do each of + the following: + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + d) Do one of the following: + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + 5. Combined Libraries. + You may place library facilities that are a work based on the + Library side by side in a single library together with other library + facilities that are not Applications and are not covered by this + License, and convey such a combined library under terms of your + choice, if you do both of the following: + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + 6. Revised Versions of the GNU Lesser General Public License. + The Free Software Foundation may publish revised and/or new versions + of the GNU Lesser General Public License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. + Each version is given a distinguishing version number. If the + Library as you received it specifies that a certain numbered version + of the GNU Lesser General Public License "or any later version" + applies to it, you have the option of following the terms and + conditions either of that published version or of any later version + published by the Free Software Foundation. If the Library as you + received it does not specify a version number of the GNU Lesser + General Public License, you may choose any version of the GNU Lesser + General Public License ever published by the Free Software Foundation. + If the Library as you received it specifies that a proxy can decide + whether future versions of the GNU Lesser General Public License shall + apply, that proxy's public statement of acceptance of any version is + permanent authorization for you to choose that version for the + Library. + . + . + GNU LESSER GENERAL PUBLIC LICENSE v2.1 + . + . + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + [This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + Preamble + The licenses for most software are designed to take away your + freedom to share and change it. By contrast, the GNU General Public + Licenses are intended to guarantee your freedom to share and change + free software--to make sure the software is free for all its users. + This license, the Lesser General Public License, applies to some + specially designated software packages--typically libraries--of the + Free Software Foundation and other authors who decide to use it. You + can use it too, but we suggest you first think carefully about whether + this license or the ordinary General Public License is the better + strategy to use in any particular case, based on the explanations + below. + When we speak of free software, we are referring to freedom of use, + not price. Our General Public Licenses are designed to make sure that + you have the freedom to distribute copies of free software (and charge + for this service if you wish); that you receive source code or can get + it if you want it; that you can change the software and use pieces of + it in new free programs; and that you are informed that you can do + these things. + To protect your rights, we need to make restrictions that forbid + distributors to deny you these rights or to ask you to surrender these + rights. These restrictions translate to certain responsibilities for + you if you distribute copies of the library or if you modify it. + For example, if you distribute copies of the library, whether gratis + or for a fee, you must give the recipients all the rights that we gave + you. You must make sure that they, too, receive or can get the source + code. If you link other code with the library, you must provide + complete object files to the recipients, so that they can relink them + with the library after making changes to the library and recompiling + it. And you must show them these terms so they know their rights. + We protect your rights with a two-step method: (1) we copyright the + library, and (2) we offer you this license, which gives you legal + permission to copy, distribute and/or modify the library. + To protect each distributor, we want to make it very clear that + there is no warranty for the free library. Also, if the library is + modified by someone else and passed on, the recipients should know + that what they have is not the original version, so that the original + author's reputation will not be affected by problems that might be + introduced by others. + Finally, software patents pose a constant threat to the existence of + any free program. We wish to make sure that a company cannot + effectively restrict the users of a free program by obtaining a + restrictive license from a patent holder. Therefore, we insist that + any patent license obtained for a version of the library must be + consistent with the full freedom of use specified in this license. + Most GNU software, including some libraries, is covered by the + ordinary GNU General Public License. This license, the GNU Lesser + General Public License, applies to certain designated libraries, and + is quite different from the ordinary General Public License. We use + this license for certain libraries in order to permit linking those + libraries into non-free programs. + When a program is linked with a library, whether statically or using + a shared library, the combination of the two is legally speaking a + combined work, a derivative of the original library. The ordinary + General Public License therefore permits such linking only if the + entire combination fits its criteria of freedom. The Lesser General + Public License permits more lax criteria for linking other code with + the library. + We call this license the "Lesser" General Public License because it + does Less to protect the user's freedom than the ordinary General + Public License. It also provides other free software developers Less + of an advantage over competing non-free programs. These disadvantages + are the reason we use the ordinary General Public License for many + libraries. However, the Lesser license provides advantages in certain + special circumstances. + For example, on rare occasions, there may be a special need to + encourage the widest possible use of a certain library, so that it + becomes a de-facto standard. To achieve this, non-free programs must + be allowed to use the library. A more frequent case is that a free + library does the same job as widely used non-free libraries. In this + case, there is little to gain by limiting the free library to free + software only, so we use the Lesser General Public License. + In other cases, permission to use a particular library in non-free + programs enables a greater number of people to use a large body of + free software. For example, permission to use the GNU C Library in + non-free programs enables many more people to use the whole GNU + operating system, as well as its variant, the GNU/Linux operating + system. + Although the Lesser General Public License is Less protective of the + users' freedom, it does ensure that the user of a program that is + linked with the Library has the freedom and the wherewithal to run + that program using a modified version of the Library. + The precise terms and conditions for copying, distribution and + modification follow. Pay close attention to the difference between a + "work based on the library" and a "work that uses the library". The + former contains code derived from the library, whereas the latter must + be combined with the library in order to run. + . + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + 0. This License Agreement applies to any software library or other + program which contains a notice placed by the copyright holder or + other authorized party saying it may be distributed under the terms of + this Lesser General Public License (also called "this License"). + Each licensee is addressed as "you". + A "library" means a collection of software functions and/or data + prepared so as to be conveniently linked with application programs + (which use some of those functions and data) to form executables. + The "Library", below, refers to any such software library or work + which has been distributed under these terms. A "work based on the + Library" means either the Library or any derivative work under + copyright law: that is to say, a work containing the Library or a + portion of it, either verbatim or with modifications and/or translated + straightforwardly into another language. (Hereinafter, translation is + included without limitation in the term "modification".) + "Source code" for a work means the preferred form of the work for + making modifications to it. For a library, complete source code means + all the source code for all modules it contains, plus any associated + interface definition files, plus the scripts used to control + compilation and installation of the library. + Activities other than copying, distribution and modification are not + covered by this License; they are outside its scope. The act of + running a program using the Library is not restricted, and output from + such a program is covered only if its contents constitute a work based + on the Library (independent of the use of the Library in a tool for + writing it). Whether that is true depends on what the Library does + and what the program that uses the Library does. + 1. You may copy and distribute verbatim copies of the Library's + complete source code as you receive it, in any medium, provided that + you conspicuously and appropriately publish on each copy an + appropriate copyright notice and disclaimer of warranty; keep intact + all the notices that refer to this License and to the absence of any + warranty; and distribute a copy of this License along with the + Library. + You may charge a fee for the physical act of transferring a copy, + and you may at your option offer warranty protection in exchange for a + fee. + 2. You may modify your copy or copies of the Library or any portion + of it, thus forming a work based on the Library, and copy and + distribute such modifications or work under the terms of Section 1 + above, provided that you also meet all of these conditions: + a) The modified work must itself be a software library. + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Library, + and can be reasonably considered independent and separate works in + themselves, then this License, and its terms, do not apply to those + sections when you distribute them as separate works. But when you + distribute the same sections as part of a whole which is a work based + on the Library, the distribution of the whole must be on the terms of + this License, whose permissions for other licensees extend to the + entire whole, and thus to each and every part regardless of who wrote + it. + Thus, it is not the intent of this section to claim rights or contest + your rights to work written entirely by you; rather, the intent is to + exercise the right to control the distribution of derivative or + collective works based on the Library. + In addition, mere aggregation of another work not based on the Library + with the Library (or with a work based on the Library) on a volume of + a storage or distribution medium does not bring the other work under + the scope of this License. + 3. You may opt to apply the terms of the ordinary GNU General Public + License instead of this License to a given copy of the Library. To do + this, you must alter all the notices that refer to this License, so + that they refer to the ordinary GNU General Public License, version 2, + instead of to this License. (If a newer version than version 2 of the + ordinary GNU General Public License has appeared, then you can specify + that version instead if you wish.) Do not make any other change in + these notices. + Once this change is made in a given copy, it is irreversible for + that copy, so the ordinary GNU General Public License applies to all + subsequent copies and derivative works made from that copy. + This option is useful when you wish to copy part of the code of + the Library into a program that is not a library. + 4. You may copy and distribute the Library (or a portion or + derivative of it, under Section 2) in object code or executable form + under the terms of Sections 1 and 2 above provided that you accompany + it with the complete corresponding machine-readable source code, which + must be distributed under the terms of Sections 1 and 2 above on a + medium customarily used for software interchange. + If distribution of object code is made by offering access to copy + from a designated place, then offering equivalent access to copy the + source code from the same place satisfies the requirement to + distribute the source code, even though third parties are not + compelled to copy the source along with the object code. + 5. A program that contains no derivative of any portion of the + Library, but is designed to work with the Library by being compiled or + linked with it, is called a "work that uses the Library". Such a + work, in isolation, is not a derivative work of the Library, and + therefore falls outside the scope of this License. + However, linking a "work that uses the Library" with the Library + creates an executable that is a derivative of the Library (because it + contains portions of the Library), rather than a "work that uses the + library". The executable is therefore covered by this License. + Section 6 states terms for distribution of such executables. + When a "work that uses the Library" uses material from a header file + that is part of the Library, the object code for the work may be a + derivative work of the Library even though the source code is not. + Whether this is true is especially significant if the work can be + linked without the Library, or if the work is itself a library. The + threshold for this to be true is not precisely defined by law. + If such an object file uses only numerical parameters, data + structure layouts and accessors, and small macros and small inline + functions (ten lines or less in length), then the use of the object + file is unrestricted, regardless of whether it is legally a derivative + work. (Executables containing this object code plus portions of the + Library will still fall under Section 6.) + Otherwise, if the work is a derivative of the Library, you may + distribute the object code for the work under the terms of Section 6. + Any executables containing that work also fall under Section 6, + whether or not they are linked directly with the Library itself. + 6. As an exception to the Sections above, you may also combine or + link a "work that uses the Library" with the Library to produce a + work containing portions of the Library, and distribute that work + under terms of your choice, provided that the terms permit + modification of the work for the customer's own use and reverse + engineering for debugging such modifications. + You must give prominent notice with each copy of the work that the + Library is used in it and that the Library and its use are covered by + this License. You must supply a copy of this License. If the work + during execution displays copyright notices, you must include the + copyright notice for the Library among them, as well as a reference + directing the user to the copy of this License. Also, you must do one + of these things: + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + c) Accompany the work with a written offer, valid for at least + three years, to give the same user the materials specified in + Subsection 6a, above, for a charge no more than the cost of + performing this distribution. + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + For an executable, the required form of the "work that uses the + Library" must include any data and utility programs needed for + reproducing the executable from it. However, as a special exception, + the materials to be distributed need not include anything that is + normally distributed (in either source or binary form) with the major + components (compiler, kernel, and so on) of the operating system on + which the executable runs, unless that component itself accompanies + the executable. + It may happen that this requirement contradicts the license + restrictions of other proprietary libraries that do not normally + accompany the operating system. Such a contradiction means you cannot + use both them and the Library together in an executable that you + distribute. + 7. You may place library facilities that are a work based on the + Library side-by-side in a single library together with other library + facilities not covered by this License, and distribute such a combined + library, provided that the separate distribution of the work based on + the Library and of the other library facilities is otherwise + permitted, and provided that you do these two things: + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + 8. You may not copy, modify, sublicense, link with, or distribute + the Library except as expressly provided under this License. Any + attempt otherwise to copy, modify, sublicense, link with, or + distribute the Library is void, and will automatically terminate your + rights under this License. However, parties who have received copies, + or rights, from you under this License will not have their licenses + terminated so long as such parties remain in full compliance. + 9. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify or + distribute the Library or its derivative works. These actions are + prohibited by law if you do not accept this License. Therefore, by + modifying or distributing the Library (or any work based on the + Library), you indicate your acceptance of this License to do so, and + all its terms and conditions for copying, distributing or modifying + the Library or works based on it. + 10. Each time you redistribute the Library (or any work based on the + Library), the recipient automatically receives a license from the + original licensor to copy, distribute, link with or modify the Library + subject to these terms and conditions. You may not impose any further + restrictions on the recipients' exercise of the rights granted herein. + You are not responsible for enforcing compliance by third parties with + this License. + 11. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot + distribute so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you + may not distribute the Library at all. For example, if a patent + license would not permit royalty-free redistribution of the Library by + all those who receive copies directly or indirectly through you, then + the only way you could satisfy both it and this License would be to + refrain entirely from distribution of the Library. + If any portion of this section is held invalid or unenforceable under + any particular circumstance, the balance of the section is intended to + apply, and the section as a whole is intended to apply in other + circumstances. + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of any + such claims; this section has the sole purpose of protecting the + integrity of the free software distribution system which is + implemented by public license practices. Many people have made + generous contributions to the wide range of software distributed + through that system in reliance on consistent application of that + system; it is up to the author/donor to decide if he or she is willing + to distribute software through any other system and a licensee cannot + impose that choice. + This section is intended to make thoroughly clear what is believed to + be a consequence of the rest of this License. + 12. If the distribution and/or use of the Library is restricted in + certain countries either by patents or by copyrighted interfaces, the + original copyright holder who places the Library under this License + may add an explicit geographical distribution limitation excluding those + countries, so that distribution is permitted only in or among + countries not thus excluded. In such case, this License incorporates + the limitation as if written in the body of this License. + 13. The Free Software Foundation may publish revised and/or new + versions of the Lesser General Public License from time to time. + Such new versions will be similar in spirit to the present version, + but may differ in detail to address new problems or concerns. + Each version is given a distinguishing version number. If the Library + specifies a version number of this License which applies to it and + "any later version", you have the option of following the terms and + conditions either of that version or of any later version published by + the Free Software Foundation. If the Library does not specify a + license version number, you may choose any version ever published by + the Free Software Foundation. + 14. If you wish to incorporate parts of the Library into other free + programs whose distribution conditions are incompatible with these, + write to the author to ask for permission. For software which is + copyrighted by the Free Software Foundation, write to the Free + Software Foundation; we sometimes make exceptions for this. Our + decision will be guided by the two goals of preserving the free status + of all derivatives of our free software and of promoting the sharing + and reuse of software generally. + NO WARRANTY + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO + WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR + OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE + LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME + THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY + AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU + FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR + CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE + LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING + RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A + FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF + SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + END OF TERMS AND CONDITIONS + . + How to Apply These Terms to Your New Libraries + If you develop a new library, and you want it to be of the greatest + possible use to the public, we recommend making it free software that + everyone can redistribute and change. You can do so by permitting + redistribution under these terms (or, alternatively, under the terms + of the ordinary General Public License). + To apply these terms, attach the following notices to the library. + It is safest to attach them to the start of each source file to most + effectively convey the exclusion of warranty; and each file should + have at least the "copyright" line and a pointer to where the full + notice is found. + + Copyright (C) + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Also add information on how to contact you by electronic and paper mail. + You should also get your employer (if you work as a programmer) or + your school, if any, to sign a "copyright disclaimer" for the library, + if necessary. Here is a sample; alter the names: + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James + Random Hacker. + , 1 April 1990 + Ty Coon, President of Vice + That's all there is to it! + . + . + GNU Free Documentation License v1.3 + . + . + GNU Free Documentation License + Version 1.3, 3 November 2008 + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + 0. PREAMBLE + The purpose of this License is to make a manual, textbook, or other + functional and useful document "free" in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or noncommercially. + Secondarily, this License preserves for the author and publisher a way + to get credit for their work, while not being considered responsible + for modifications made by others. + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. It + complements the GNU General Public License, which is a copyleft + license designed for free software. + We have designed this License in order to use it for manuals for free + software, because free software needs free documentation: a free + program should come with manuals providing the same freedoms that the + software does. But this License is not limited to software manuals; + it can be used for any textual work, regardless of subject matter or + whether it is published as a printed book. We recommend this License + principally for works whose purpose is instruction or reference. + 1. APPLICABILITY AND DEFINITIONS + This License applies to any manual or other work, in any medium, that + contains a notice placed by the copyright holder saying it can be + distributed under the terms of this License. Such a notice grants a + world-wide, royalty-free license, unlimited in duration, to use that + work under the conditions stated herein. The "Document", below, + refers to any such manual or work. Any member of the public is a + licensee, and is addressed as "you". You accept the license if you + copy, modify or distribute the work in a way requiring permission + under copyright law. + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + A "Secondary Section" is a named appendix or a front-matter section of + the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document's overall + subject (or to related matters) and contains nothing that could fall + directly within that overall subject. (Thus, if the Document is in + part a textbook of mathematics, a Secondary Section may not explain + any mathematics.) The relationship could be a matter of historical + connection with the subject or with related matters, or of legal, + commercial, philosophical, ethical or political position regarding + them. + The "Invariant Sections" are certain Secondary Sections whose titles + are designated, as being those of Invariant Sections, in the notice + that says that the Document is released under this License. If a + section does not fit the above definition of Secondary then it is not + allowed to be designated as Invariant. The Document may contain zero + Invariant Sections. If the Document does not identify any Invariant + Sections then there are none. + The "Cover Texts" are certain short passages of text that are listed, + as Front-Cover Texts or Back-Cover Texts, in the notice that says that + the Document is released under this License. A Front-Cover Text may + be at most 5 words, and a Back-Cover Text may be at most 25 words. + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images composed of + pixels) generic paint programs or (for drawings) some widely available + drawing editor, and that is suitable for input to text formatters or + for automatic translation to a variety of formats suitable for input + to text formatters. A copy made in an otherwise Transparent file + format whose markup, or absence of markup, has been arranged to thwart + or discourage subsequent modification by readers is not Transparent. + An image format is not Transparent if used for any substantial amount + of text. A copy that is not "Transparent" is called "Opaque". + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, SGML + or XML using a publicly available DTD, and standard-conforming simple + HTML, PostScript or PDF designed for human modification. Examples of + transparent image formats include PNG, XCF and JPG. Opaque formats + include proprietary formats that can be read and edited only by + proprietary word processors, SGML or XML for which the DTD and/or + processing tools are not generally available, and the + machine-generated HTML, PostScript or PDF produced by some word + processors for output purposes only. + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the material + this License requires to appear in the title page. For works in + formats which do not have any title page as such, "Title Page" means + the text near the most prominent appearance of the work's title, + preceding the beginning of the body of the text. + The "publisher" means any person or entity that distributes copies of + the Document to the public. + A section "Entitled XYZ" means a named subunit of the Document whose + title either is precisely XYZ or contains XYZ in parentheses following + text that translates XYZ in another language. (Here XYZ stands for a + specific section name mentioned below, such as "Acknowledgements", + "Dedications", "Endorsements", or "History".) To "Preserve the Title" + of such a section when you modify the Document means that it remains a + section "Entitled XYZ" according to this definition. + The Document may include Warranty Disclaimers next to the notice which + states that this License applies to the Document. These Warranty + Disclaimers are considered to be included by reference in this + License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and has + no effect on the meaning of this License. + 2. VERBATIM COPYING + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License applies + to the Document are reproduced in all copies, and that you add no + other conditions whatsoever to those of this License. You may not use + technical measures to obstruct or control the reading or further + copying of the copies you make or distribute. However, you may accept + compensation in exchange for copies. If you distribute a large enough + number of copies you must also follow the conditions in section 3. + You may also lend copies, under the same conditions stated above, and + you may publicly display copies. + 3. COPYING IN QUANTITY + If you publish printed copies (or copies in media that commonly have + printed covers) of the Document, numbering more than 100, and the + Document's license notice requires Cover Texts, you must enclose the + copies in covers that carry, clearly and legibly, all these Cover + Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on + the back cover. Both covers must also clearly and legibly identify + you as the publisher of these copies. The front cover must present + the full title with all words of the title equally prominent and + visible. You may add other material on the covers in addition. + Copying with changes limited to the covers, as long as they preserve + the title of the Document and satisfy these conditions, can be treated + as verbatim copying in other respects. + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto adjacent + pages. + If you publish or distribute Opaque copies of the Document numbering + more than 100, you must either include a machine-readable Transparent + copy along with each Opaque copy, or state in or with each Opaque copy + a computer-network location from which the general network-using + public has access to download using public-standard network protocols + a complete Transparent copy of the Document, free of added material. + If you use the latter option, you must take reasonably prudent steps, + when you begin distribution of Opaque copies in quantity, to ensure + that this Transparent copy will remain thus accessible at the stated + location until at least one year after the last time you distribute an + Opaque copy (directly or through your agents or retailers) of that + edition to the public. + It is requested, but not required, that you contact the authors of the + Document well before redistributing any large number of copies, to + give them a chance to provide you with an updated version of the + Document. + 4. MODIFICATIONS + You may copy and distribute a Modified Version of the Document under + the conditions of sections 2 and 3 above, provided that you release + the Modified Version under precisely this License, with the Modified + Version filling the role of the Document, thus licensing distribution + and modification of the Modified Version to whoever possesses a copy + of it. In addition, you must do these things in the Modified Version: + A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. + B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has fewer than five), + unless they release you from this requirement. + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + D. Preserve all the copyright notices of the Document. + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. + G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. + H. Include an unaltered copy of this License. + I. Preserve the section Entitled "History", Preserve its Title, and add + to it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section Entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. + J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. + K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section all + the substance and tone of each of the contributor acknowledgements + and/or dedications given therein. + L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. + M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. + N. Do not retitle any existing section to be Entitled "Endorsements" + or to conflict in title with any Invariant Section. + O. Preserve any Warranty Disclaimers. + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no material + copied from the Document, you may at your option designate some or all + of these sections as invariant. To do this, add their titles to the + list of Invariant Sections in the Modified Version's license notice. + These titles must be distinct from any other section titles. + You may add a section Entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties--for example, statements of peer review or that the text has + been approved by an organization as the authoritative definition of a + standard. + You may add a passage of up to five words as a Front-Cover Text, and a + passage of up to 25 words as a Back-Cover Text, to the end of the list + of Cover Texts in the Modified Version. Only one passage of + Front-Cover Text and one of Back-Cover Text may be added by (or + through arrangements made by) any one entity. If the Document already + includes a cover text for the same cover, previously added by you or + by arrangement made by the same entity you are acting on behalf of, + you may not add another; but you may replace the old one, on explicit + permission from the previous publisher that added the old one. + The author(s) and publisher(s) of the Document do not by this License + give permission to use their names for publicity for or to assert or + imply endorsement of any Modified Version. + 5. COMBINING DOCUMENTS + You may combine the Document with other documents released under this + License, under the terms defined in section 4 above for modified + versions, provided that you include in the combination all of the + Invariant Sections of all of the original documents, unmodified, and + list them all as Invariant Sections of your combined work in its + license notice, and that you preserve all their Warranty Disclaimers. + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name but + different contents, make the title of each such section unique by + adding at the end of it, in parentheses, the name of the original + author or publisher of that section if known, or else a unique number. + Make the same adjustment to the section titles in the list of + Invariant Sections in the license notice of the combined work. + In the combination, you must combine any sections Entitled "History" + in the various original documents, forming one section Entitled + "History"; likewise combine any sections Entitled "Acknowledgements", + and any sections Entitled "Dedications". You must delete all sections + Entitled "Endorsements". + 6. COLLECTIONS OF DOCUMENTS + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the rules + of this License for verbatim copying of each of the documents in all + other respects. + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert a + copy of this License into the extracted document, and follow this + License in all other respects regarding verbatim copying of that + document. + 7. AGGREGATION WITH INDEPENDENT WORKS + A compilation of the Document or its derivatives with other separate + and independent documents or works, in or on a volume of a storage or + distribution medium, is called an "aggregate" if the copyright + resulting from the compilation is not used to limit the legal rights + of the compilation's users beyond what the individual works permit. + When the Document is included in an aggregate, this License does not + apply to the other works in the aggregate which are not themselves + derivative works of the Document. + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half of + the entire aggregate, the Document's Cover Texts may be placed on + covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic form. + Otherwise they must appear on printed covers that bracket the whole + aggregate. + 8. TRANSLATION + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section 4. + Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also include + the original English version of this License and the original versions + of those notices and disclaimers. In case of a disagreement between + the translation and the original version of this License or a notice + or disclaimer, the original version will prevail. + If a section in the Document is Entitled "Acknowledgements", + "Dedications", or "History", the requirement (section 4) to Preserve + its Title (section 1) will typically require changing the actual + title. + 9. TERMINATION + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, and + will automatically terminate your rights under this License. + However, if you cease all violation of this License, then your license + from a particular copyright holder is reinstated (a) provisionally, + unless and until the copyright holder explicitly and finally + terminates your license, and (b) permanently, if the copyright holder + fails to notify you of the violation by some reasonable means prior to + 60 days after the cessation. + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from that + copyright holder, and you cure the violation prior to 30 days after + your receipt of the notice. + Termination of your rights under this section does not terminate the + licenses of parties who have received copies or rights from you under + this License. If your rights have been terminated and not permanently + reinstated, receipt of a copy of some or all of the same material does + not give you any rights to use it. + 10. FUTURE REVISIONS OF THIS LICENSE + The Free Software Foundation may publish new, revised versions of the + GNU Free Documentation License from time to time. Such new versions + will be similar in spirit to the present version, but may differ in + detail to address new problems or concerns. See + http://www.gnu.org/copyleft/. + Each version of the License is given a distinguishing version number. + If the Document specifies that a particular numbered version of this + License "or any later version" applies to it, you have the option of + following the terms and conditions either of that specified version or + of any later version that has been published (not as a draft) by the + Free Software Foundation. If the Document does not specify a version + number of this License, you may choose any version ever published (not + as a draft) by the Free Software Foundation. If the Document + specifies that a proxy can decide which future versions of this + License can be used, that proxy's public statement of acceptance of a + version permanently authorizes you to choose that version for the + Document. + 11. RELICENSING + "Massive Multiauthor Collaboration Site" (or "MMC Site") means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. A + "Massive Multiauthor Collaboration" (or "MMC") contained in the site + means any set of copyrightable works thus published on the MMC site. + "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + "Incorporate" means to publish or republish a Document, in whole or in + part, as part of another Document. + An MMC is "eligible for relicensing" if it is licensed under this + License, and if all works that were first published under this License + somewhere other than this MMC, and subsequently incorporated in whole or + in part into the MMC, (1) had no cover texts or invariant sections, and + (2) were thus incorporated prior to November 1, 2008. + The operator of an MMC Site may republish an MMC contained in the site + under CC-BY-SA on the same site at any time before August 1, 2009, + provided the MMC is eligible for relicensing. + ADDENDUM: How to use this License for your documents + To use this License in a document you have written, include a copy of + the License in the document and put the following copyright and + license notices just after the title page: + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, + replace the "with...Texts." line with this: + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + If you have Invariant Sections without Cover Texts, or some other + combination of the three, merge those two alternatives to suit the + situation. + If your document contains nontrivial examples of program code, we + recommend releasing these examples in parallel under your choice of + free software license, such as the GNU General Public License, + to permit their use in free software. + . + . + The Regents of the University of California + . + . + /*- + * Copyright (c) 1991 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 3. [rescinded 22 July 1999] + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + */ + . + . + The Go Authors + . + . + Copyright (c) 2009 The Go 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. + . + . + Apache License v2.0: Refer to the copy under /usr/share/common-licenses + . + . + --- end of LICENSE --- + . + ------------------------------------------------------------------------------ %% This notice is provided with respect to International Components for Unicode (ICU4J) v72.1, which may be included with JRE 21, JDK 21 and OpenJDK 21 . @@ -1879,7 +2957,7 @@ --- end of LICENSE --- . ------------------------------------------------------------------------------ - %% This notice is provided with respect to The FreeType Project: Freetype v2.13.2, + %% This notice is provided with respect to The FreeType Project: Freetype v2.14.2, which may be included with JRE 21, JDK 21 and OpenJDK 21 . --- begin of LICENSE --- @@ -1905,25 +2983,24 @@ FreeType License . . - Copyright (C) 1996-2023 by David Turner, Robert Wilhelm, and Werner Lemberg. - Copyright (C) 2007-2023 by Dereg Clegg and Michael Toftdal. - Copyright (C) 1996-2023 by Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. - Copyright (C) 2022-2023 by David Turner, Robert Wilhelm, Werner Lemberg, George Williams, and - Copyright (C) 2004-2023 by Masatake YAMATO and Redhat K.K. - Copyright (C) 2007-2023 by Derek Clegg and Michael Toftdal. - Copyright (C) 2003-2023 by Masatake YAMATO, Red Hat K.K., - Copyright (C) 1996-2023 by David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches. - Copyright (C) 2007-2023 by David Turner. - Copyright (C) 2022-2023 by David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti. - Copyright (C) 2007-2023 by Rahul Bhalerao , . - Copyright (C) 2008-2023 by David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya. - Copyright (C) 2013-2023 by Google, Inc. - Copyright (C) 2019-2023 by Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg. - Copyright (C) 2009-2023 by Oran Agra and Mickey Gabel. - Copyright (C) 2018-2023 by David Turner, Robert Wilhelm, Dominik Röttsches, and Werner Lemberg. - Copyright (C) 2004-2023 by David Turner, Robert Wilhelm, Werner Lemberg, and George Williams. - . - . + Copyright (C) 1996-2025 by David Turner, Robert Wilhelm, and Werner Lemberg. + Copyright (C) 2007-2025 by Dereg Clegg and Michael Toftdal. + Copyright (C) 1996-2025 by Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. + Copyright (C) 2022-2025 by David Turner, Robert Wilhelm, Werner Lemberg, George Williams, and + Copyright (C) 2004-2025 by Masatake YAMATO and Redhat K.K. + Copyright (C) 2007-2025 by Derek Clegg and Michael Toftdal. + Copyright (C) 2003-2025 by Masatake YAMATO, Red Hat K.K., + Copyright (C) 1996-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches. + Copyright (C) 2007-2025 by David Turner. + Copyright (C) 2022-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti. + Copyright (C) 2007-2025 by Rahul Bhalerao , . + Copyright (C) 2025 by Behdad Esfahbod. + Copyright (C) 2008-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya. + Copyright (C) 2013-2025 by Google, Inc. + Copyright (C) 2019-2025 by Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg. + Copyright (C) 2009-2025 by Oran Agra and Mickey Gabel. + Copyright (C) 2018-2025 by David Turner, Robert Wilhelm, Dominik Röttsches, and Werner Lemberg. + Copyright (C) 2004-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and George Williams. The FreeType Project LICENSE ---------------------------- . @@ -2093,13 +3170,14 @@ . . . + . GPL v2: Refer to the copy under /usr/share/common-licenses . Additional Freetype Attributions . . --------------------------------- - The below license applies to the following files: + The below applies to the following file(s): libfreetype/src/psaux/psarrst.c libfreetype/src/psaux/psarrst.h libfreetype/src/psaux/psblues.c @@ -2122,7 +3200,7 @@ libfreetype/src/psaux/psstack.h libfreetype/src/psaux/pstypes.h . - Copyright 2006-2014 Adobe Systems Incorporated. + Copyright (C) 2006-2014 Adobe Systems Incorporated. . This software, and all works of authorship, whether in source or object code form as indicated by the copyright notice(s) included @@ -2158,12 +3236,12 @@ . . --------------------------------- - The below license applies to the following files: + The below applies to the following file(s): libfreetype/include/freetype/internal/fthash.h libfreetype/src/base/fthash.c . - Copyright 2000 Computing Research Labs, New Mexico State University - Copyright 2001-2015 + Copyright (C) 2000 Computing Research Labs, New Mexico State University + Copyright (C) 2001-2015 . Francesco Zappa Nardelli . @@ -2191,7 +3269,7 @@ --- end of LICENSE --- . ------------------------------------------------------------------------------ - %% This notice is provided with respect to Harfbuzz v8.2.2, + %% This notice is provided with respect to Harfbuzz 12.3.2, which may be included with JRE 21, JDK 21 and OpenJDK 21 . --- begin of LICENSE --- @@ -2204,14 +3282,14 @@ For parts of HarfBuzz that are licensed under different licenses see individual files names COPYING in subdirectories where applicable. . - Copyright © 2010-2023 Google, Inc. + Copyright © 2010-2024 Google, Inc. Copyright © 2018-2020 Ebrahim Byagowi Copyright © 2004-2013 Red Hat, Inc. Copyright © 2019 Facebook, Inc. Copyright (C) 2012 Zilong Tan (eric.zltan@gmail.com) Copyright © 2007 Chris Wilson Copyright © 2018-2019 Adobe Inc. - Copyright © 2006-2023 Behdad Esfahbod + Copyright © 2006-2025 Behdad Esfahbod Copyright © 1998-2004 David Turner and Werner Lemberg Copyright © 2009 Keith Stribley Copyright © 2018 Khaled Hosny @@ -2250,7 +3328,7 @@ The contents of this directory are licensed under the following terms: . --------------------------------- - The below license applies to the following files: + The below applies to the following file(s): libharfbuzz/hb-ucd.cc . Copyright (C) 2012 Grigori Goronzy @@ -2268,13 +3346,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. . --------------------------------- - The below license applies to the following files: + The below applies to the following file(s): libharfbuzz/hb-unicode-emoji-table.hh . - © 2023 Unicode®, Inc. + © 2024 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 https://www.unicode.org/terms_of_use.html + For terms of use and license, see https://www.unicode.org/terms_of_use.html . . . @@ -2301,7 +3380,7 @@ --- end of LICENSE --- . ------------------------------------------------------------------------------ - %% This notice is provided with respect to Little Color Management System (LCMS) v2.16, + %% This notice is provided with respect to Little Color Management System (LCMS) v2.17, which may be included with JRE 21, JDK 21 and OpenJDK 21 . --- begin of LICENSE --- @@ -2311,7 +3390,7 @@ . MIT License . - Copyright (C) 1998-2023 Marti Maria Saguer + Copyright (C) 1998-2025 Marti Maria Saguer . Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -2332,10 +3411,10 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. . --------------------------------- - The below license applies to the following files: + The below applies to the following file(s): liblcms/cmssm.c . - Copyright 2001, softSurfer (www.softsurfer.com) + Copyright (C) 2001, softSurfer (www.softsurfer.com) . This code may be freely used and modified for any purpose providing that this copyright notice is included with it. @@ -2405,8 +3484,7 @@ Dimitrios Anastassakis Lemke Software Tim Zaman - . - . + Amir Montazery and Open Source Technology Improvement Fund (ostif.org), Google, for fuzzer fundings. . --- end of LICENSE --- . @@ -2552,7 +3630,7 @@ --- end of LICENSE --- . ------------------------------------------------------------------------------ - %% This notice is provided with respect to PipeWire 0.3.68, + %% This notice is provided with respect to PipeWire 1.3.81, which may be included with JRE 21, JDK 21 and OpenJDK 21 . --- begin of LICENSE --- @@ -2597,6 +3675,11 @@ Copyright © 2021 Red Hat, Inc. . . + spa/utils/cleanup.h: + . + Copyright © 2023 PipeWire authors + . + . --- end of LICENSE --- . ------------------------------------------------------------------------------ @@ -2641,7 +3724,7 @@ --- end of LICENSE --- . ------------------------------------------------------------------------------ - %% This notice is provided with respect to Apache Commons Byte Code Engineering Library (BCEL) Version 6.7.0, + %% This notice is provided with respect to Apache Commons Byte Code Engineering Library (BCEL) Version 6.10.0, which may be included with JRE 21, JDK 21 and OpenJDK 21 . --- begin of LICENSE --- @@ -2854,7 +3937,7 @@ --- end of LICENSE --- . ------------------------------------------------------------------------------ - %% This notice is provided with respect to Apache Santuario v3.0.3, + %% This notice is provided with respect to Apache Santuario v3.0.5, which may be included with JRE 21, JDK 21 and OpenJDK 21 . --- begin of LICENSE --- @@ -2865,7 +3948,7 @@ . . Apache Santuario - XML Security for Java - Copyright 1999-2023 The Apache Software Foundation + Copyright 1999-2024 The Apache Software Foundation . This product includes software developed at The Apache Software Foundation (http://www.apache.org/). @@ -2877,13 +3960,13 @@ Commission in the project in the ISIS Programme. . This product contains software that is - copyright (c) 2021, Oracle and/or its affiliates. + copyright (c) 2021, 2023, Oracle and/or its affiliates. . . --- end of LICENSE --- . ------------------------------------------------------------------------------ - %% This notice is provided with respect to OASIS PKCS #11 Cryptographic Token Interface v3.0, + %% This notice is provided with respect to OASIS PKCS #11 Cryptographic Token Interface v3.1, which may be included with JRE 21, JDK 21 and OpenJDK 21 . --- begin of LICENSE --- @@ -2891,14 +3974,14 @@ OASIS PKCS #11 Cryptographic Token Interface License . . - Copyright © OASIS Open 2020. All Rights Reserved. + Copyright © OASIS Open 2023. All Rights Reserved. . - All capitalized terms in the following text have the meanings + All capitalized terms in the following text have the meanings assigned to them in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The full Policy may be found at the OASIS website: - [http://www.oasis-open.org/policies-guidelines/ipr] + [https://www.oasis-open.org/policies-guidelines/ipr/]. . - This document and translations of it may be copied and furnished to + This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published, and distributed, in whole or in part, without restriction of any kind, @@ -2911,10 +3994,10 @@ forth in the OASIS IPR Policy, must be followed) or as required to translate it into languages other than English. . - The limited permissions granted above are perpetual and will not be + The limited permissions granted above are perpetual and will not be revoked by OASIS or its successors or assigns. . - This document and the information contained herein is provided on an + This document and the information contained herein is provided on an "AS IS" basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED @@ -2923,7 +4006,11 @@ CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THIS DOCUMENT OR ANY PART THEREOF. . - [OASIS requests that any OASIS Party or any other party that + As stated in the OASIS IPR Policy, the following three paragraphs in + brackets apply to OASIS Standards Final Deliverable documents (Committee + Specifications, OASIS Standards, or Approved Errata). + . + [OASIS requests that any OASIS Party or any other party that believes it has patent claims that would necessarily be infringed by implementations of this OASIS Standards Final Deliverable, to notify OASIS TC Administrator and provide an indication of its willingness to @@ -2931,7 +4018,7 @@ the IPR Mode of the OASIS Technical Committee that produced this deliverable.] . - [OASIS invites any party to contact the OASIS TC Administrator if it + [OASIS invites any party to contact the OASIS TC Administrator if it is aware of a claim of ownership of any patent claims that would necessarily be infringed by implementations of this OASIS Standards Final Deliverable by a patent holder that is not willing to provide a @@ -2940,7 +4027,7 @@ Final Deliverable. OASIS may include such claims on its website, but disclaims any obligation to do so.] . - [OASIS takes no position regarding the validity or scope of any + [OASIS takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this OASIS Standards Final Deliverable or the extent to which any license under @@ -3054,7 +4141,7 @@ --- end of LICENSE --- . ------------------------------------------------------------------------------ - %% This notice is provided with respect to JLine v3.22.0, + %% This notice is provided with respect to JLine v3.26.1, which may be included with JRE 21, JDK 21 and OpenJDK 21 . --- begin of LICENSE --- @@ -3062,7 +4149,7 @@ JLine License . . - Copyright (c) 2002-2018, the original author or authors. + Copyright (c) 2002-2023, the original author or authors. All rights reserved. . https://opensource.org/licenses/BSD-3-Clause @@ -3169,14 +4256,14 @@ --- end of LICENSE --- . ------------------------------------------------------------------------------ - %% This notice is provided with respect to jQuery UI v1.13.2, + %% This notice is provided with respect to jQuery UI v1.14.1, which may be included with JRE 21, JDK 21 and OpenJDK 21 . --- begin of LICENSE --- . jQuery UI License . - Copyright jQuery Foundation and other contributors, https://jquery.org/ + Copyright OpenJS Foundation and other contributors, https://openjsf.org/ . This software consists of voluntary contributions made by many individuals. For exact contribution history, see the revision history diff -Nru openjdk-21-21.0.10+7/debian/copyright-generator/copyright-gen.py openjdk-21-21.0.11+10/debian/copyright-generator/copyright-gen.py --- openjdk-21-21.0.10+7/debian/copyright-generator/copyright-gen.py 2026-01-21 21:50:48.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/copyright-generator/copyright-gen.py 2026-04-24 01:33:17.000000000 +0000 @@ -79,7 +79,7 @@ ] ## TODO: Can the script deduce this list? -upstream_authors = [ +upstream_authors = [ "Oracle and/or its affiliates", "Sun Microsystems, Inc", "Red Hat, Inc", @@ -114,7 +114,7 @@ def print_file_stanza(files, copyrights, license, comments): print_field("Files", True, files) print_field("Copyright", False, copyrights) - print_field("License", True, license) + print_field("License", True, license) if (comments is not None and len(comments) != 0): print_field("Comments", True, comments) print() # an empty line @@ -129,7 +129,7 @@ {upstream_authors_str} Packaged by: {packaged_by}""" - + def generate_header_stanza(): format = "https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/" excluded = generate_excluded_files_str() @@ -137,18 +137,34 @@ comment = generate_comment_str() print_header_stanza(format, excluded, source, comment) +def strip_license_line(line:str): + return line.replace("### ","").replace("```", "").replace("
", "").replace("
", "") + def get_content(path): lines = [] + COMMON_LICENSES = ["### Apache 2.0 License", + "### GNU GENERAL PUBLIC LICENSE v2", + "### GPL v2", + "### GPL version 3", + "### GNU GENERAL PUBLIC LICENSE v3", + "### Apache License v2.0"] + skip = False with open(path, 'r') as file: for line in file: - lines.append(line - .replace("### ","") - .replace("```", "") - .replace("
", "")
-        .replace("
", "")) - + if skip: + if line.startswith("### "): + skip = False + else: + continue + stripped = line.strip("\n") + if stripped in COMMON_LICENSES: + line = stripped + ": Refer to the copy under /usr/share/common-licenses\n\n" + lines.append(strip_license_line(line)) + skip = True + if not skip: + lines.append(strip_license_line(line)) return lines[0], "".join(lines[1:]) - + def fill_with_dots_and_indent(text): indentation = " " * 2 @@ -179,7 +195,7 @@ ------------------------------------------------------------------------------""" - + def gather_legal_dirs(path): legal_dirs = [] for root, dirs, files in os.walk(path): @@ -210,12 +226,17 @@ return file.path def search_source_rootdir(level, path = '.'): + if os.path.exists(path + "/ASSEMBLY_EXCEPTION"): + print("Assembly exception found. Skipping source package search.", file=sys.stderr) + return "." + # The user might have already pulled the source package. # Search for a downloaded package at three levels # - openjdk # - openjdk/debian # - openjdk/debian/copyright-generator # if one none found, download the source package + rootdir = find_directory(f"openjdk-{version}", path) if rootdir is not None: return rootdir @@ -244,9 +265,8 @@ print("No source package found. Download also failed. Aborting.") exit(2) print(f"Using the source package at {rootdir}", file = sys.stderr) - srcdir = f"{rootdir}/src"; + srcdir = f"{rootdir}/src"; - os.system(f"/bin/sh ./debian/copyright-generator/strip-common-licenses.sh {rootdir} {version}") generate_header_stanza(); licenses = f"""GPL with Classpath exception @@ -269,7 +289,7 @@ # clean-up if needs_cleanup: os.system(f"rm -rf *.debian.tar.xz *.orig.tar.xz *.dsc *googletest.tar.xz"); - + def detect_version(): @@ -293,4 +313,4 @@ print("Version not supported.") if __name__ == "__main__": - main() + main() diff -Nru openjdk-21-21.0.10+7/debian/copyright-generator/strip-common-licenses.sh openjdk-21-21.0.11+10/debian/copyright-generator/strip-common-licenses.sh --- openjdk-21-21.0.10+7/debian/copyright-generator/strip-common-licenses.sh 2026-01-20 20:31:32.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/copyright-generator/strip-common-licenses.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -SOURCE_DIR=$1 -VERSION=$2 -for LEGAL_DIR in `find $SOURCE_DIR/src -name legal`; do - for COMMON_LICENSE in "### Apache 2.0 License" "### GPL v2" "### GPL version 3"; do - for FILE in `grep -Rl "${COMMON_LICENSE}" $LEGAL_DIR`; do - sed -i "/^${COMMON_LICENSE}/,/^###/{/^###/!{d}}" $FILE - sed -i "s/${COMMON_LICENSE}/${COMMON_LICENSE}: Refer to the copy under \/usr\/share\/common-licenses\n/g" $FILE - done - done - # special cases - if [ $VERSION = "21" ] || [ $VERSION = "17" ] || [ $VERSION = "11" ]; then - FILE=$SOURCE_DIR/src/jdk.internal.le/share/legal/jline.md - sed -i "/^Apache License/,/^=====/{/^Apache License/!{/^=====/!{d}}}" $FILE - sed -i "s/^Apache License/Apache 2.0 License: Refer to the copy under \/usr\/share\/common-licenses\n\n/g" $FILE - fi -done - - diff -Nru openjdk-21-21.0.10+7/debian/dbg.py openjdk-21-21.0.11+10/debian/dbg.py --- openjdk-21-21.0.10+7/debian/dbg.py 2024-10-16 11:04:16.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/dbg.py 2026-03-01 21:52:24.000000000 +0000 @@ -1,29 +1,39 @@ # Copyright 2016, Red Hat and individual contributors # by the @authors tag. -# +# # This is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. -# +# # This software is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. -# +# # You should have received a copy of the GNU Lesser General Public # License along with this software; if not, write to the Free # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA, or see the FSF site: http://www.fsf.org. -# +# # @authors Andrew Dinn import gdb - +import traceback import re from gdb.FrameDecorator import FrameDecorator # we rely on the unwinder API provided by gdb.7.10 +_debug = False +_warning = False + +def warning(*args, **kwargs): + if _warning: + gdb.write(*args, **kwargs) + +def debug(*args, **kwargs): + if _debug: + gdb.write(*args, **kwargs) _dump_frame = False _have_unwinder = True @@ -38,14 +48,14 @@ def debug_write(msg): - gdb.write(msg) + debug(msg) # pass def t(msg): - gdb.write("%s\n" % msg) + debug("%s\n" % msg) # pass -# debug_write("dbg.py\n") +debug("dbg.py\n") # class providing various type conversions for gdb Value instances @@ -56,7 +66,7 @@ int_t = gdb.lookup_type('int') long_t = gdb.lookup_type('long') void_t = gdb.lookup_type('void') - + bytep_t = byte_t.pointer() charp_t = char_t.pointer() intp_t = int_t.pointer() @@ -64,7 +74,6 @@ voidp_t = void_t.pointer() codeblobp_t = gdb.lookup_type('CodeBlob').pointer() - cmethodp_t = gdb.lookup_type('CompiledMethod').pointer() nmethodp_t = gdb.lookup_type('nmethod').pointer() ptrp_t = voidp_t.pointer() @@ -162,7 +171,7 @@ @classmethod def class_init(cls): - # t("CodeHeap.class_init") + t("CodeHeap.class_init") if cls.class_inited: return # we can only proceed if we have the necessary heap symbols @@ -170,9 +179,9 @@ cls.heap_block_type = gdb.lookup_type("HeapBlock").pointer() cls.code_blob_type = gdb.lookup_type("CodeBlob").pointer() cls.class_inited = True - + def __init__(self, heap): - # t("CodeHeap.__init__") + t("CodeHeap.__init__") # make sure we have static inited successfuly self.class_init() # if we got here we are ok to create a new instance @@ -184,73 +193,73 @@ self.segmap_lo = self.segmap['_low'] self.segment_size = int(heap['_segment_size']) self.log2_segment_size = int(heap['_log2_segment_size']) - # debug_write("@@ heap.name = %s\n" % self.name) - # debug_write("@@ heap.lo = 0x%x\n" % self.lo) - # debug_write("@@ heap.hi = 0x%x\n" % self.hi) + debug("@@ heap.name = %s\n" % self.name) + debug("@@ heap.lo = 0x%x\n" % self.lo) + debug("@@ heap.hi = 0x%x\n" % self.hi) def inrange(self, x): - # t("CodeHeap.inrange") - return self.lo <= x and self.hi > x + debug("CodeHeap.inrange") + return self.lo <= x and self.hi > x def findblob(self, pc): - # t("CodeHeap.findblob") + debug("CodeHeap.findblob") x = Types.as_long(pc) - # debug_write("@@ findblob(%s, 0x%x)\n" % (self.name, pc)) - # debug_write("@@ pc (%s) = 0x%x \n" % (str(pc.type), pc)) - # debug_write("@@ self.lo = 0x%x\n" % self.lo) - # debug_write("@@ self.hi = 0x%x\n" % self.hi) + debug("@@ findblob(%s, 0x%x)\n" % (self.name, pc)) + debug("@@ pc (%s) = 0x%x \n" % (str(pc.type), pc)) + debug("@@ self.lo = 0x%x\n" % self.lo) + debug("@@ self.hi = 0x%x\n" % self.hi) # check pc is in this heap's range - # t("if not self.inrange(x):") + t("if not self.inrange(x):") if not self.inrange(x): return None - # debug_write("@@ pc in range\n") - # t("segments = 0") + debug("@@ pc in range\n") + t("segments = 0") segments = 0 - # debug_write("@@ segmap_lo (%s) = 0x%x\n" % (str(self.segmap_lo.type), self.segmap_lo)) - # debug_write("@@ self.lo = 0x%x \n" % self.lo) - # debug_write("@@ self.log2_segment_size = 0x%x \n" % self.log2_segment_size) - # t("offset = Types.as_long(pc - self.lo)") + debug("@@ segmap_lo (%s) = 0x%x\n" % (str(self.segmap_lo.type), self.segmap_lo)) + debug("@@ self.lo = 0x%x \n" % self.lo) + debug("@@ self.log2_segment_size = 0x%x \n" % self.log2_segment_size) + t("offset = Types.as_long(pc - self.lo)") offset = Types.as_long(pc - self.lo) - # debug_write("@@ offset = 0x%x\n" % offset) - # t("shift = self.log2_segment_size") + debug("@@ offset = 0x%x\n" % offset) + t("shift = self.log2_segment_size") shift = self.log2_segment_size - # debug_write("@@ shift = 0x%x\n" % shift) - # t("segment = offset >> shift") + debug("@@ shift = 0x%x\n" % shift) + t("segment = offset >> shift") segment = offset >> shift # segment = (offset >> self.log2_segment_size) #segment = offset >> (self.log2_segment_size & 0x31) - # debug_write("@@ segment = 0x%x\n" % segment) - # t("tag = (self.segmap_lo + segment).dereference() & 0xff") + debug("@@ segment = 0x%x\n" % segment) + t("tag = (self.segmap_lo + segment).dereference() & 0xff") tag = (self.segmap_lo + segment).dereference() & 0xff # tag = Types.load_byte(self.segmap_lo + segment) & 0xff - # debug_write("@@ tag (%s) = 0x%x\n" % (str(tag.type), tag)) - # t("while tag > 0 and segments < 64:") + debug("@@ tag (%s) = 0x%x\n" % (str(tag.type), tag)) + t("while tag > 0 and segments < 64:") while tag > 0 and segments < 64: - # t("segment = segment - tag") + t("segment = segment - tag") segment = segment - tag - # debug_write("@@ segment = 0x%x\n" % segment) - # t("tag = (self.segmap_lo + segment).dereference() & 0xff") + debug("@@ segment = 0x%x\n" % segment) + t("tag = (self.segmap_lo + segment).dereference() & 0xff") tag = (self.segmap_lo + segment).dereference() & 0xff - # debug_write("@@ tag (%s) = 0x%x\n" % (str(tag.type), tag)) - # t("segments += 1") + debug("@@ tag (%s) = 0x%x\n" % (str(tag.type), tag)) + t("segments += 1") segments += 1 - # t("if tag != 0:") + t("if tag != 0:") if tag != 0: - # t("return None") + t("return None") return None - # debug_write("@@ lo = 0x%x\n" % self.lo) - # debug_write("@@ segment << self.log2_segment_size = 0x%x\n" % (segment << self.log2_segment_size)) - # t("block_addr = self.lo + (segment << self.log2_segment_size)") + debug("@@ lo = 0x%x\n" % self.lo) + debug("@@ segment << self.log2_segment_size = 0x%x\n" % (segment << self.log2_segment_size)) + t("block_addr = self.lo + (segment << self.log2_segment_size)") block_addr = self.lo + (segment << self.log2_segment_size) - # debug_write("@@ block_addr (%s) = 0x%x\n" % (str(block_addr.type), block_addr)) - # t("heap_block = gdb.Value(block_addr).cast(CodeHeap.heap_block_type)") + debug("@@ block_addr (%s) = 0x%x\n" % (str(block_addr.type), block_addr)) + t("heap_block = gdb.Value(block_addr).cast(CodeHeap.heap_block_type)") heap_block = gdb.Value(block_addr).cast(CodeHeap.heap_block_type) - # debug_write("@@ heap_block (%s) = 0x%x\n" % (str(heap_block.type), heap_block)) - # t("if heap_block['_header']['_used'] != 1:") + debug("@@ heap_block (%s) = 0x%x\n" % (str(heap_block.type), heap_block)) + t("if heap_block['_header']['_used'] != 1:") if heap_block['_header']['_used'] != 1: # hmm, this is not meant to happen - # t("return None") + t("return None") return None - # t("blob = (heap_block + 1).cast(CodeHeap.code_blob_type)") + t("blob = (heap_block + 1).cast(CodeHeap.code_blob_type)") blob = (heap_block + 1).cast(CodeHeap.code_blob_type) return blob @@ -268,53 +277,53 @@ @classmethod def class_init(cls): - # t("CodeCache.class_init") + t("CodeCache.class_init") if cls.class_inited: return - # t("if cls.lo == 0 or cls.hi == 0:") + t("if cls.lo == 0 or cls.hi == 0:") if cls.lo == 0 or cls.hi == 0: try: - # t("cls.lo = gdb.parse_and_eval(\"CodeCache::_low_bound\")") + t("cls.lo = gdb.parse_and_eval(\"CodeCache::_low_bound\")") lo = gdb.parse_and_eval("CodeCache::_low_bound") cls.lo = Types.as_long(lo) - # debug_write("@@ CodeCache::_low_bound = 0x%x\n" % cls.lo) + debug("@@ CodeCache::_low_bound = 0x%x\n" % cls.lo) if cls.lo == 0: return - # t("cls.hi = gdb.parse_and_eval(\"CodeCache::_high_bound\")") + t("cls.hi = gdb.parse_and_eval(\"CodeCache::_high_bound\")") hi = gdb.parse_and_eval("CodeCache::_high_bound") cls.hi = Types.as_long(hi) - # debug_write("@@ CodeCache::_high_bound = 0x%x\n" % cls.hi) + debug("@@ CodeCache::_high_bound = 0x%x\n" % cls.hi) if cls.hi == 0: return except Exception as arg: - # debug_write("@@ %s\n" % arg) + debug("@@ %s\n" % arg) cls.lo = 0 cls.hi = 0 cls.class_inited = False raise - # t("f cls.heap_list == []:") + t("f cls.heap_list == []:") if cls.heap_list == []: try: - # t("heaps = gdb.parse_and_eval(\"CodeCache::_heaps\")") + t("heaps = gdb.parse_and_eval(\"CodeCache::_heaps\")") heaps = gdb.parse_and_eval("CodeCache::_heaps") - # debug_write("@@ CodeCache::_heaps (%s) = 0x%x\n" % (heaps.type, heaps)) - # t("len = int(heaps['_len'])") + debug("@@ CodeCache::_heaps (%s) = 0x%x\n" % (heaps.type, heaps)) + t("len = int(heaps['_len'])") len = int(heaps['_len']) - # debug_write("@@ CodeCache::_heaps->_len = %d\n" % len) - # t("data = heaps['_data']") + debug("@@ CodeCache::_heaps->_len = %d\n" % len) + t("data = heaps['_data']") data = heaps['_data'] - # debug_write("@@ CodeCache::_heaps->_data = 0x%x\n" % data) - # t("for i in range(0, len):") + debug("@@ CodeCache::_heaps->_data = 0x%x\n" % data) + t("for i in range(0, len):") for i in range(0, len): - # t("heap = CodeHeap((data + i).dereference())") + t("heap = CodeHeap((data + i).dereference())") heap = CodeHeap((data + i).dereference()) - # t("cls.heap_list.append(heap)") + t("cls.heap_list.append(heap)") cls.heap_list.append(heap) - # t("cls.heap_count += 1") + t("cls.heap_count += 1") cls.heap_count += 1 except Exception as arg: - # debug_write("@@ %s\n" % arg) + debug("@@ %s\n" % arg) cls.heap_list = [] cls.heap_count = 0 cls.class_inited = False @@ -323,29 +332,29 @@ @classmethod def inrange(cls, pc): - # t("CodeCache.inrange") + t("CodeCache.inrange") # make sure we are initialized cls.class_init() # if we got here we can use the heaps x = Types.as_long(pc) - # t("return cls.lo <= x and cls.hi > x") + t("return cls.lo <= x and cls.hi > x") return cls.lo <= x and cls.hi > x @classmethod def makestr(cls, charcnt, charptr): - # t("CodeCache.makestr") + t("CodeCache.makestr") #res = "" #for i in range(0, charcnt): # c = (charptr + i).dereference() # res = ("%s%c" % (res, c)) #return res - # debug_write("charcnt = %d charptr = %s\n" % (charcnt, str(charptr))) + debug("charcnt = %d charptr = %s\n" % (charcnt, str(charptr))) return charptr.string("ascii", "ignore", charcnt) # given a PC find the associated OpenJDK code blob instance @classmethod def findblob(cls, pc): - # t("CodeCache.findblob") + t("CodeCache.findblob") # make sure we are initialized cls.class_init() # if we got here we can use the heaps @@ -353,20 +362,20 @@ raise gdb.GdbError("dbg.findblob : address 0x%x is not in range!" % pc) for heap in cls.heap_list: try: - # t("blob = heap.findblob(pc)") + t("blob = heap.findblob(pc)") blob = heap.findblob(pc) except Exception as arg: - # debug_write("@@ findblob excepted %s\n" % str(arg)) - # t("blob = None") + debug("@@ findblob excepted %s\n" % str(arg)) + t("blob = None") blob = None - # t("if blob != None:") + t("if blob != None:") if blob != None: - # t("name=str(blob['_name'])") + t("name=str(blob['_name'])") name=str(blob['_name']) - # debug_write("@@ blob(0x%x) -> %s\n" % (pc, name)) - # t("return blob") + debug("@@ blob(0x%x) -> %s\n" % (pc, name)) + t("return blob") return blob - # t("raise gdb.GdbError") + t("raise gdb.GdbError") raise gdb.GdbError("dbg.findblob : no blob for inrange address 0x%x!" % pc) # abstract over some constants for stack frame layout @@ -424,41 +433,41 @@ return int(Types.load_byte(self.data + pos)) # read and return the next byte def read(self): - # t("CompressedStream.read()") + t("CompressedStream.read()") pos = self.pos b = self.at(pos) self.pos = pos+1 return b def read_int(self): - # t("CompressedStream.read_int()") + t("CompressedStream.read_int()") b0 = self.read() - # debug_write("b0 = 0x%x\n" % b0) + debug("b0 = 0x%x\n" % b0) if b0 < CompressedStream.L: return b0 return self.read_int_mb(b0) def read_signed_int(self): - # t("CompressedStream.read_signed_int()") + t("CompressedStream.read_signed_int()") return self.decode_sign(self.read_int()) def decode_sign(self, x): - # t("CompressedStream.decode_sign()") + t("CompressedStream.decode_sign()") return (x >> 1) ^ (0 - (x & 1)) def read_int_mb(self, b): t# ("CompressedStream.read_int_mb()") sum = b pos = self.pos - # debug_write("pos = %d\n" % pos) - # debug_write("sum = 0x%x\n" % sum) + debug("pos = %d\n" % pos) + debug("sum = 0x%x\n" % sum) lg_H_i = CompressedStream.lg_H i = 0 while (True): b_i = self.at(pos + i) - # debug_write("b_%d = %d\n" % (i, b_i)) + debug("b_%d = %d\n" % (i, b_i)) sum += (b_i << lg_H_i) - # debug_write("sum = 0x%x\n" % sum) + debug("sum = 0x%x\n" % sum) i += 1 if b_i < CompressedStream.L or i == CompressedStream.MAX_i: self.pos = pos + i - # debug_write("self.pos = %d\n" % self.pos) + debug("self.pos = %d\n" % self.pos) return sum lg_H_i += CompressedStream.lg_H @@ -473,7 +482,7 @@ class_inited = False @classmethod def class_init(cls): - # t("MethodBCIReader.class_init") + t("MethodBCIReader.class_init") if cls.class_inited: return # cache some useful types @@ -488,25 +497,25 @@ return Types.to_type(val, cls.pcdesc_p) def __init__(self, nmethod, method): - # t("MethodBCIReader.__init__") + t("MethodBCIReader.__init__") # ensure we have cached the necessary types self.class_init() # need to unpack pc scopes self.nmethod = nmethod self.method = method - # debug_write("nmethod (%s) = 0x%x\n" % (str(nmethod.type), Types.as_long(nmethod))) + debug("nmethod (%s) = 0x%x\n" % (str(nmethod.type), Types.as_long(nmethod))) blob = Types.to_type(nmethod, Types.codeblobp_t); self.code_begin = Types.as_long(blob['_code_begin']) self.code_end = Types.as_long(blob['_code_end']) scopes_pcs_begin_offset = Types.as_int(nmethod['_scopes_pcs_offset']) - # debug_write("scopes_pcs_begin_offset = 0x%x\n" % scopes_pcs_begin_offset) + debug("scopes_pcs_begin_offset = 0x%x\n" % scopes_pcs_begin_offset) scopes_pcs_end_offset = Types.as_int(nmethod['_dependencies_offset']) - # debug_write("scopes_pcs_end_offset = 0x%x\n" % scopes_pcs_end_offset) + debug("scopes_pcs_end_offset = 0x%x\n" % scopes_pcs_end_offset) header_begin = Types.cast_bytep(nmethod) self.scopes_pcs_begin = self.as_pcdesc_p(header_begin + scopes_pcs_begin_offset) - # debug_write("scopes_pcs_begin (%s) = 0x%x\n" % (str(self.scopes_pcs_begin.type), Types.as_long(self.scopes_pcs_begin))) + debug("scopes_pcs_begin (%s) = 0x%x\n" % (str(self.scopes_pcs_begin.type), Types.as_long(self.scopes_pcs_begin))) self.scopes_pcs_end = self.as_pcdesc_p(header_begin + scopes_pcs_end_offset) - # debug_write("scopes_pcs_end (%s) = 0x%x\n" % (str(self.scopes_pcs_end.type), Types.as_long(self.scopes_pcs_end))) + debug("scopes_pcs_end (%s) = 0x%x\n" % (str(self.scopes_pcs_end.type), Types.as_long(self.scopes_pcs_end))) def find_pc_desc(self, pc_off): lower = self.scopes_pcs_begin @@ -526,22 +535,22 @@ if scope_decode_offset == 0: return [ { 'method': self.method, 'bci': 0 } ] nmethod = self.nmethod - # debug_write("nmethod = 0x%x\n" % nmethod) - # debug_write("pc_desc = 0x%x\n" % Types.as_long(pc_desc)) + debug("nmethod = 0x%x\n" % nmethod) + debug("pc_desc = 0x%x\n" % Types.as_long(pc_desc)) base = Types.cast_bytep(nmethod) # scopes_data_offset = Types.as_int(nmethod['_scopes_data_offset']) # scopes_base = base + scopes_data_offset scopes_base = nmethod['_scopes_data_begin'] - # debug_write("scopes_base = 0x%x\n" % Types.as_long(scopes_base)) + debug("scopes_base = 0x%x\n" % Types.as_long(scopes_base)) metadata_offset = Types.as_int(nmethod['_metadata_offset']) metadata_base = Types.to_type(base + metadata_offset, self.metadata_pp) - # debug_write("metadata_base = 0x%x\n" % Types.as_long(metadata_base)) + debug("metadata_base = 0x%x\n" % Types.as_long(metadata_base)) scope = scopes_base + scope_decode_offset - # debug_write("scope = 0x%x\n" % Types.as_long(scope)) + debug("scope = 0x%x\n" % Types.as_long(scope)) stream = CompressedStream(scope) - # debug_write("stream = %s\n" % stream) + debug("stream = %s\n" % stream) sender = stream.read_int() - # debug_write("sender = %s\n" % sender) + debug("sender = %s\n" % sender) # method name is actually in metadata method_idx = stream.read_int() method_md = (metadata_base + (method_idx - 1)).dereference() @@ -549,10 +558,10 @@ method = Method(methodptr) # bci is offset by -1 to allow range [-1, ..., MAX_UINT) bci = stream.read_int() - 1 - # debug_write("method,bci = %s,0x%x\n" % (method.get_name(), bci)) + debug("method,bci = %s,0x%x\n" % (method.get_name(), bci)) result = [ { 'method': method, 'bci': bci } ] while sender > 0: - # debug_write("\nsender = 0x%x\n" % sender) + debug("\nsender = 0x%x\n" % sender) stream = CompressedStream(scopes_base + sender) sender = stream.read_int() method_idx = stream.read_int() @@ -561,7 +570,7 @@ method = Method(methodptr) # bci is offset by -1 to allow range [-1, ..., MAX_UINT) bci = stream.read_int() - 1 - # debug_write("method,bci = %s,0x%x\n" % (method.get_name(), bci)) + debug("method,bci = %s,0x%x\n" % (method.get_name(), bci)) result.append( { 'method': method, 'bci': bci } ) return result @@ -570,7 +579,7 @@ if pc < self.code_begin or pc >= self.code_end: return None pc_off = pc - self.code_begin - # debug_write("\npc_off = 0x%x\n" % pc_off) + debug("\npc_off = 0x%x\n" % pc_off) pc_desc = self.find_pc_desc(pc_off) if pc_desc is None: return None @@ -581,11 +590,11 @@ class LineReader: # table is a gdb.Value of type 'byte *' (strictly 'u_char *' in JVM code) def __init__(self, table): - # t("LineReader.init") + t("LineReader.init") self.table = table self.translations = {} def bc_to_line(self, bci): - # t("LineReader.bc_to_line()") + t("LineReader.bc_to_line()") try: return self.translations[bci] except Exception as arg: @@ -594,8 +603,8 @@ self.translations[bci] = line return line def compute_line(self, bci): - # t("LineReader.compute_line()") - # debug_write("table = 0x%x\n" % self.table) + t("LineReader.compute_line()") + debug("table = 0x%x\n" % self.table) bestline = -1 self.stream = CompressedStream(self.table) self._bci = 0 @@ -609,9 +618,9 @@ bestline = nextline return bestline def read_pair(self): - # t("LineReader.read_pair()") + t("LineReader.read_pair()") next = self.stream.read() - # debug_write("next = 0x%x\n" % next) + debug("next = 0x%x\n" % next) if next == 0: return False if next == 0xff: @@ -620,8 +629,8 @@ else: self._bci = self._bci + (next >> 3) self._line = self._line + (next & 0x7) - # debug_write("_bci = %d\n" % self._bci) - # debug_write("_line = %d\n" % self._line) + debug("_bci = %d\n" % self._bci) + debug("_line = %d\n" % self._line) return True # class to provide access to data relating to a Method object @@ -639,12 +648,12 @@ if self.name == None: self.make_name(self.methodptr) return self.name - + def get_klass_path(self): if self.name == None: self.make_name(self.methodptr) return self.klass_path - + def get_line(self, bci): if bci < 0: bci = 0 @@ -676,7 +685,7 @@ sig_str = CodeCache.makestr(sig_name_length, sig_name) self.sig_str = self.make_sig_str(sig_str) self.name = self.klass_str + "." + self.method_str + self.sig_str - + def make_sig_str(self, sig): in_sym_name = False sig_str = "" @@ -734,7 +743,7 @@ # frame PC address. class OpenJDKFrameDecorator(FrameDecorator): def __init__(self, base, methodname, filename, line): - super(FrameDecorator, self).__init__() + super(FrameDecorator, self).__init__(base) self._base = base self._methodname = methodname self._filename = filename @@ -742,87 +751,89 @@ def function(self): try: - # t("OpenJDKFrameDecorator.function") + t("OpenJDKFrameDecorator.function") return self._methodname except Exception as arg: - gdb.write("!!! function oops !!! %s\n" % arg) + debug("!!! function oops !!! %s\n" % arg) return None def method_name(self): - return _methodname + return self._methodname def filename(self): try: return self._filename except Exception as arg: - gdb.write("!!! filename oops !!! %s\n" % arg) + debug("!!! filename oops !!! %s\n" % arg) return None def line(self): try: return self._line except Exception as arg: - gdb.write("!!! line oops !!! %s\n" % arg) + debug("!!! line oops !!! %s\n" % arg) return None # A frame filter for OpenJDK. class OpenJDKFrameFilter(object): def __init__(self, unwinder): self.name="OpenJDK" - self.enabled = True + self.enabled = False self.priority = 100 self.unwinder = unwinder + self.unwinder.set_filter(self) def maybe_wrap_frame(self, frame): - # t("OpenJDKFrameFilter.maybe_wrap_frame") + t("OpenJDKFrameFilter.maybe_wrap_frame") if self.unwinder is None: return [ frame ] - # t("unwindercache = self.unwinder.unwindercache") + t("unwindercache = self.unwinder.unwindercache") unwindercache = self.unwinder.unwindercache if unwindercache is None: return [ frame ] - # t("base = frame.inferior_frame()") + t("base = frame.inferior_frame()") base = frame.inferior_frame() - # t("sp = Types.as_long(base.read_register('rsp'))") + t("sp = Types.as_long(base.read_register('rsp'))") sp = base.read_register('rsp') x = Types.as_long(sp) - # debug_write("@@ get info at unwindercache[0x%x]\n" % x) + debug("@@ get info at unwindercache[0x%x]\n" % x) try: cache_entry = unwindercache[x] except Exception as arg: + debug("@@ unwindercache lookup excepted %s\n" % str(arg)) # n.b. no such entry throws an exception # just ignore and use existing frame return [ frame ] try: if cache_entry is None: - # debug_write("@@ lookup found no cache_entry\n") + debug("@@ lookup found no cache_entry\n") return [ frame ] elif cache_entry.codetype == "unknown": - # debug_write("@@ lookup found unknown cache_entry\n") + debug("@@ lookup found unknown cache_entry\n") return [ frame ] else: - # debug_write("@@ got cache_entry for blob 0x%x at unwindercache[0x%x]\n" % (cache_entry.blob, x)) + debug("@@ got cache_entry for blob 0x%x at unwindercache[0x%x]\n" % (cache_entry.blob, x)) method_info = cache_entry.method_info if method_info == None: return [ frame ] else: return method_info.decorate(frame) except Exception as arg: - gdb.write("!!! maybe_wrap_frame oops !!! %s\n" % arg) + warning("!!! maybe_wrap_frame oops !!! %s / %s\n" % (arg, traceback.format_exc())) return [ frame ] def flatten(self, list_of_lists): - return [x for y in list_of_lists for x in y ] + return iter([x for y in list_of_lists for x in y ]) def filter(self, frame_iter): # return map(self.maybe_wrap_frame, frame_iter) return self.flatten( map(self.maybe_wrap_frame, frame_iter) ) - + # A frame id class, as specified by the gdb unwinder API. class OpenJDKFrameId(object): def __init__(self, sp, pc): - # t("OpenJDKFrameId.__init__") + t("OpenJDKFrameId.__init__") self.sp = sp self.pc = pc @@ -880,12 +891,11 @@ class CompiledMethodInfo(JavaMethodInfo): def __init__(self, entry): - # t("CompiledMethodInfo.__init__") + t("CompiledMethodInfo.__init__") super(CompiledMethodInfo,self).__init__(entry) blob = self.blob - cmethod = Types.to_type(blob, Types.cmethodp_t) nmethod = Types.to_type(blob, Types.nmethodp_t) - self.methodptr = cmethod['_method'] + self.methodptr = nmethod['_method'] const_method = self.methodptr['_constMethod'] bcbase = Types.cast_bytep(const_method + 1) self.code_begin = Types.as_long(blob['_code_begin']) @@ -893,7 +903,7 @@ self.cache_method_info() # get PC to BCI translator from the nmethod self.bytecode_index_reader = MethodBCIReader(nmethod, self.method) - # t("self.method_bci_stack = self.bytecode_index_reader.pc_to_method_bci_stack(self.pc)") + t("self.method_bci_stack = self.bytecode_index_reader.pc_to_method_bci_stack(self.pc)") self.method_bci_stack = self.bytecode_index_reader.pc_to_method_bci_stack(self.pc) # subclasses need to compute their method pointer @@ -909,7 +919,7 @@ return ("[inlined] %s" % name) def make_decorator(self, frame, pair, is_outer): - # t("make_decorator") + t("make_decorator") method = pair['method'] bci = pair['bci'] methodname = self.format_method_name(method, is_outer) @@ -927,16 +937,16 @@ try: decorators = [] pairs = self.method_bci_stack - # debug_write("converting method_bci_stack = %s\n" % self.method_bci_stack) + debug("converting method_bci_stack = %s\n" % self.method_bci_stack) l = len(pairs) for i in range(l): pair = pairs[i] - # debug_write("decorating pair %s\n" % pair) + debug("decorating pair %s\n" % pair) decorator = self.make_decorator(frame, pair, i == (l - 1)) decorators.append(decorator) return decorators except Exception as arg: - gdb.write("!!! decorate oops %s !!!\n" % arg) + debug("!!! decorate oops %s / %s !!!\n" % (arg, traceback.format_exc())) return [ frame ] # info for native frame @@ -944,14 +954,11 @@ class NativeMethodInfo(JavaMethodInfo): def __init__(self, entry): - # t("NativeMethodInfo.__init__") + t("NativeMethodInfo.__init__") super(NativeMethodInfo,self).__init__(entry) blob = self.blob - cmethod = Types.to_type(blob, Types.cmethodp_t) nmethod = Types.to_type(blob, Types.nmethodp_t) - self.methodptr = cmethod['_method'] - const_method = self.methodptr['_constMethod'] - bcbase = Types.cast_bytep(const_method + 1) + self.methodptr = nmethod['_method'] self.code_begin = Types.as_long(blob['_code_begin']) # get bc and line number info from method self.cache_method_info() @@ -982,7 +989,7 @@ # bytecode immediately follows const method const_method = self.methodptr['_constMethod'] bcbase = Types.cast_bytep(const_method + 1) - # debug_write("@@ bcbase = 0x%x\n" % Types.as_long(bcbase)) + debug("@@ bcbase = 0x%x\n" % Types.as_long(bcbase)) bcp_offset = FrameConstants.interpreter_frame_bcp_offset() * 8 if bcp is None: # interpreter frames store bytecodeptr in slot 8 @@ -998,14 +1005,14 @@ bcp_addr = gdb.Value((self.bp + bcp_offset) & 0xffffffffffffffff) bcp_val = Types.cast_bytep(Types.load_ptr(bcp_addr)) self.bcoff = Types.as_long(bcp_val - bcbase) - # debug_write("@@ bcoff = 0x%x\n" % self.bcoff) + debug("@@ bcoff = 0x%x\n" % self.bcoff) # line number table immediately following bytecode bytecode_size = Types.as_int(const_method['_code_size']) self.is_native = (bytecode_size == 0) # n.b. data in compressed line_number_table block is u_char - # debug_write("bytecode_size = 0x%x\n" % bytecode_size) + debug("bytecode_size = 0x%x\n" % bytecode_size) lnbase = Types.cast_bytep(bcbase + bytecode_size) - # debug_write("lnbase = 0x%x\n" % Types.as_long(lnbase)) + debug("lnbase = 0x%x\n" % Types.as_long(lnbase)) self.line_number_reader = LineReader(lnbase) self.cache_method_info() @@ -1021,7 +1028,7 @@ def line(self): line = self.line_number_reader.bc_to_line(self.bcoff) - # debug_write("bc_to_line(%d) = %d\n" % (self.bcoff, line)) + debug("bc_to_line(%d) = %d\n" % (self.bcoff, line)) if line < 0: line = None return line @@ -1033,7 +1040,7 @@ class OpenJDKUnwinderCacheEntry(object): def __init__(self, blob, sp, pc, bp, bcp, name, codetype): - # t("OpenJDKUnwinderCacheEntry.__init__") + t("OpenJDKUnwinderCacheEntry.__init__") self.blob = blob self.sp = sp self.pc = pc @@ -1051,7 +1058,7 @@ else: self.method_info = None except Exception as arg: - gdb.write("!!! failed to cache info for %s frame [pc: 0x%x sp:0x%x bp 0x%x] !!!\n!!! %s !!!\n" % (codetype, pc, sp, bp, arg)) + debug("!!! failed to cache info for %s frame [pc: 0x%x sp:0x%x bp 0x%x] !!!\n!!! %s !!!\n" % (codetype, pc, sp, bp, arg)) self.method_info = None # an unwinder class, an instance of which can be registered with gdb @@ -1059,13 +1066,28 @@ class OpenJDKUnwinder(Unwinder): def __init__(self): - # t("OpenJDKUnwinder.__init__") + t("OpenJDKUnwinder.__init__") super(OpenJDKUnwinder, self).__init__("OpenJDKUnwinder") # blob name will be in format '0xHexDigits "AlphaNumSpaces"' self.matcher=re.compile('^0x[a-fA-F0-9]+ "(.*)"$') self.unwindercache = {} self.invocations = {} + def set_filter(self, filter): + self.filter = filter + + @property + def enabled(self): + return self._enabled + + # Intercept when the user runs `enable/disable unwinder` + @enabled.setter + def enabled(self, value): + self._enabled = value + + if self.filter and value: + self.filter.enabled = value + # the method that gets called by the pyuw_sniffer def __call__(self, pending_frame): # sometimes when we call into python gdb routines @@ -1073,39 +1095,39 @@ # up calling the frame sniffer recursively # # so use a list keyed by thread to avoid recursive calls - # t("OpenJDKUnwinder.__call__") + t("OpenJDKUnwinder.__call__") thread = gdb.selected_thread() if self.invocations.get(thread) != None: - # debug_write("!!! blocked %s !!!\n" % str(thread)) + debug("!!! blocked %s !!!\n" % str(thread)) return None try: - # debug_write("!!! blocking %s !!!\n" % str(thread)) + debug("!!! blocking %s !!!\n" % str(thread)) self.invocations[thread] = thread result = self.call_sub(pending_frame) - # debug_write("!!! unblocking %s !!!\n" % str(thread)) + debug("!!! unblocking %s !!!\n" % str(thread)) self.invocations[thread] = None return result except Exception as arg: - gdb.write("!!! __call__ oops %s !!!\n" % arg) - # debug_write("!!! unblocking %s !!!\n" % str(thread)) + debug("!!! __call__ oops %s !!!\n" % arg) + debug("!!! unblocking %s !!!\n" % str(thread)) self.invocations[thread] = None return None def call_sub(self, pending_frame): - # t("OpenJDKUnwinder.__call_sub__") - # debug_write("@@ reading pending frame registers\n") + t("OpenJDKUnwinder.__call_sub__") + debug("@@ reading pending frame registers\n") pc = pending_frame.read_register('rip') - # debug_write("@@ pc = 0x%x\n" % Types.as_long(pc)) + debug("@@ pc = 0x%x\n" % Types.as_long(pc)) sp = pending_frame.read_register('rsp') - # debug_write("@@ sp = 0x%x\n" % Types.as_long(sp)) + debug("@@ sp = 0x%x\n" % Types.as_long(sp)) bp = pending_frame.read_register('rbp') - # debug_write("@@ bp = 0x%x\n" % Types.as_long(bp)) + debug("@@ bp = 0x%x\n" % Types.as_long(bp)) try: if not CodeCache.inrange(pc): - # t("not CodeCache.inrange(0x%x)\n" % pc) + t("not CodeCache.inrange(0x%x)\n" % pc) return None except Exception as arg: - # debug_write("@@ %s\n" % arg) + debug("@@ %s\n" % arg) return None if _dump_frame: debug_write(" pc = 0x%x\n" % Types.as_long(pc)) @@ -1130,59 +1152,59 @@ # convert returned value to a python int to force a check that # the register is defined. if not this will except bcp = gdb.Value(int(bcp)) - # debug_write("@@ bcp = 0x%x\n" % Types.as_long(bcp)) + debug("@@ bcp = 0x%x\n" % Types.as_long(bcp)) except Exception as arg: - # debug_write("@@ !!! call_sub oops %s !!! \n" % arg) + debug("@@ !!! call_sub oops %s !!! \n" % arg) bcp = None - # debug_write("@@ bcp = None\n") - # t("blob = CodeCache.findblob(pc)") + debug("@@ bcp = None\n") + t("blob = CodeCache.findblob(pc)") blob = CodeCache.findblob(pc) - # t("if blob is None:") + t("if blob is None:") if blob is None: - # t("return None") + t("return None") return None # if the blob is an nmethod then we use the frame # size to identify the frame base otherwise we # use the value in rbp - # t("name = str(blob['_name'])") + t("name = str(blob['_name'])") name = str(blob['_name']) # blob name will be in format '0xHexDigits "AlphaNumSpaces"' # and we just want the bit between the quotes m = self.matcher.match(name) if not m is None: - # debug_write("@@ m.group(1) == %s\n" % m.group(1)) + debug("@@ m.group(1) == %s\n" % m.group(1)) name = m.group(1) if name == "nmethod": - # debug_write("@@ compiled %s\n" % name) + debug("@@ compiled %s\n" % name) codetype = 'compiled' # TODO -- need to check if frame is complete # i.e. if ((char *)pc - (char *)blob) > blob['_code_begin'] + blob['_frame_complete_offset'] # if not then we have not pushed a frame. # what do we do then? use SP as BP??? frame_size = blob['_frame_size'] - # debug_write("@@ frame_size = 0x%x\n" % int(frame_size)) + debug("@@ frame_size = 0x%x\n" % int(frame_size)) # n.b. frame_size includes stacked rbp and rip hence the -2 bp = sp + ((frame_size - 2) * 8) - # debug_write("@@ revised bp = 0x%x\n" % Types.as_long(bp)) + debug("@@ revised bp = 0x%x\n" % Types.as_long(bp)) elif name == "native nmethod": - # debug_write("@@ native %s \n" % name) + debug("@@ native %s \n" % name) codetype = "native" elif name == "Interpreter": - # debug_write("@@ interpreted %s\n" %name) + debug("@@ interpreted %s\n" %name) codetype = "interpreted" elif name[:4] == "Stub": - # debug_write("@@ stub %s\n" % name) + debug("@@ stub %s\n" % name) codetype = "stub" else: - # debug_write("@@ unknown %s\n" % name) + debug("@@ unknown %s\n" % name) codetype = "unknown" # cache details of the current frame x = Types.as_long(sp) - # debug_write("@@ add %s cache entry for blob 0x%x at unwindercache[0x%x]\n" % (codetype, blob, x)) + debug("@@ add %s cache entry for blob 0x%x at unwindercache[0x%x]\n" % (codetype, blob, x)) self.unwindercache[x] = OpenJDKUnwinderCacheEntry(blob, sp, pc, bp, bcp, name, codetype) - # t("next_bp = Types.load_long(bp)") + t("next_bp = Types.load_long(bp)") next_bp = Types.load_long(bp) - # t("next_pc = Types.load_long(bp + 8)") + t("next_pc = Types.load_long(bp + 8)") next_pc = Types.load_long(bp + 8) # next_sp is normally just 2 words below current bp # but for interpreted frames we need to skip locals @@ -1195,16 +1217,16 @@ sender_sp_offset = FrameConstants.sender_sp_offset() * 8 next_sp = bp + sender_sp_offset # create unwind info for this frame - # t("frameid = OpenJDKFrameId(...)") + t("frameid = OpenJDKFrameId(...)") frameid = OpenJDKFrameId(Types.to_voidp(next_sp), Types.to_type(next_pc, pc.type)) - # debug_write("@@ created frame id\n") - # t("unwind_info = pending_frame.create_unwind_info(frameid)") + debug("@@ created frame id\n") + t("unwind_info = pending_frame.create_unwind_info(frameid)") unwind_info = pending_frame.create_unwind_info(frameid) - # debug_write("@@ created unwind info\n") - # debug_write("@@ next_bp = 0x%x\n" % next_bp) - # debug_write("@@ next_pc = 0x%x\n" % next_pc) - # debug_write("@@ next_sp = 0x%x\n" % next_sp) + debug("@@ created unwind info\n") + debug("@@ next_bp = 0x%x\n" % next_bp) + debug("@@ next_pc = 0x%x\n" % next_pc) + debug("@@ next_sp = 0x%x\n" % next_sp) # we must calculate pc, sp and bp. # # for now we only add the minimum of registers that we know @@ -1216,17 +1238,23 @@ debug_write("next pc = 0x%x\n" % Types.as_long(next_pc)) debug_write("next sp = 0x%x\n" % Types.as_long(next_sp)) debug_write("next bp = 0x%x\n" % Types.as_long(next_bp)) - # t("return unwind_info") + t("return unwind_info") return unwind_info # register the unwinder globally [probably really needs to be # registered solely with libjvm.so] def register_unwinder(): - unwinder = None - if _have_unwinder: - unwinder = OpenJDKUnwinder() - gdb.unwinder.register_unwinder(None, unwinder, replace=True) - filt = OpenJDKFrameFilter(unwinder) - gdb.frame_filters[filt.name] = filt + try: + unwinder = None + if _have_unwinder: + unwinder = OpenJDKUnwinder() + gdb.unwinder.register_unwinder(None, unwinder, replace=True) + filt = OpenJDKFrameFilter(unwinder) + gdb.frame_filters[filt.name] = filt + except Exception as arg: + traceback.format_exc() + debug("!!! register_unwinder failed %s / %s !!!\n" % (arg, traceback.format_exc())) + gdb.write("Failed to register OpenJDK unwinder and frame filter: %s\n" % arg) + gdb.write("Is openjdk-*-dbg package installed?\n") register_unwinder() diff -Nru openjdk-21-21.0.10+7/debian/patches/icc_loading_with_symlink.diff openjdk-21-21.0.11+10/debian/patches/icc_loading_with_symlink.diff --- openjdk-21-21.0.10+7/debian/patches/icc_loading_with_symlink.diff 2026-01-21 21:50:48.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/patches/icc_loading_with_symlink.diff 2026-04-24 01:32:54.000000000 +0000 @@ -1,6 +1,6 @@ --- a/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java +++ b/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java -@@ -1316,9 +1316,6 @@ +@@ -1380,9 +1380,6 @@ public sealed class ICC_Profile implemen dir = st.nextToken(); fullPath = dir + File.separatorChar + fileName; f = new File(fullPath); diff -Nru openjdk-21-21.0.10+7/debian/patches/jdk-8359735.patch openjdk-21-21.0.11+10/debian/patches/jdk-8359735.patch --- openjdk-21-21.0.10+7/debian/patches/jdk-8359735.patch 2026-01-21 21:50:48.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/patches/jdk-8359735.patch 2026-04-24 01:32:54.000000000 +0000 @@ -17,7 +17,7 @@ --- a/test/jdk/java/lang/ProcessBuilder/Basic.java +++ b/test/jdk/java/lang/ProcessBuilder/Basic.java -@@ -691,7 +691,7 @@ public class Basic { +@@ -699,7 +699,7 @@ public class Basic { public static String path() { return path; } private static final String path = path0(); private static String path0(){ @@ -26,7 +26,7 @@ return "/bin/true"; } else { File trueExe = new File("true"); -@@ -706,7 +706,7 @@ public class Basic { +@@ -714,7 +714,7 @@ public class Basic { public static String path() { return path; } private static final String path = path0(); private static String path0(){ diff -Nru openjdk-21-21.0.10+7/debian/patches/jdk-8381555.diff openjdk-21-21.0.11+10/debian/patches/jdk-8381555.diff --- openjdk-21-21.0.10+7/debian/patches/jdk-8381555.diff 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/patches/jdk-8381555.diff 2026-04-23 22:22:05.000000000 +0000 @@ -0,0 +1,29 @@ +From 81b6fcc3e9e6a5a53a7a53d8371d86a2f48f3d90 Mon Sep 17 00:00:00 2001 +From: Vladimir Petko +Date: Thu, 2 Apr 2026 13:12:48 +0000 +Subject: [PATCH] 8381555: + test/hotspot/jtreg/gc/arguments/TestG1CompressedOops.java fails on 32 bit + architectures +Origin: https://github.com/openjdk/jdk/commit/81b6fcc3e9e6a5a53a7a53d8371d86a2f48f3d90 +Bug: https://bugs.openjdk.org/browse/JDK-8381555 +Reviewed-by: jsikstro + +--- + test/hotspot/jtreg/gc/arguments/TestG1CompressedOops.java | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/test/hotspot/jtreg/gc/arguments/TestG1CompressedOops.java b/test/hotspot/jtreg/gc/arguments/TestG1CompressedOops.java +index 3aec113990c..c4c1d364308 100644 +--- a/test/hotspot/jtreg/gc/arguments/TestG1CompressedOops.java ++++ b/test/hotspot/jtreg/gc/arguments/TestG1CompressedOops.java +@@ -27,6 +27,7 @@ + /* + * @test TestG1CompressedOops + * @bug 8354145 ++ * @requires vm.bits == 64 + * @requires vm.flagless + * @summary Verify that the flag UseCompressedOops is updated properly + * @library /test/lib +-- +2.51.0 + diff -Nru openjdk-21-21.0.10+7/debian/patches/ldap-timeout-test-use-ip.patch openjdk-21-21.0.11+10/debian/patches/ldap-timeout-test-use-ip.patch --- openjdk-21-21.0.10+7/debian/patches/ldap-timeout-test-use-ip.patch 2026-01-21 20:46:58.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/patches/ldap-timeout-test-use-ip.patch 2026-04-23 23:50:14.000000000 +0000 @@ -6,7 +6,7 @@ Last-Update: 2023-03-27 --- a/test/jdk/com/sun/jndi/ldap/LdapPoolTimeoutTest.java +++ b/test/jdk/com/sun/jndi/ldap/LdapPoolTimeoutTest.java -@@ -86,7 +86,9 @@ +@@ -81,7 +81,9 @@ public class LdapPoolTimeoutTest { env.put("com.sun.jndi.ldap.read.timeout", String.valueOf(READ_MILLIS)); env.put("com.sun.jndi.ldap.connect.timeout", String.valueOf(CONNECT_MILLIS)); env.put("com.sun.jndi.ldap.connect.pool", "true"); @@ -16,4 +16,4 @@ + env.put(Context.PROVIDER_URL, "ldap://224.0.0.0:1234"); try { - futures.add(executorService.submit(() -> { attemptConnect(env); return null; })); + // launch a few concurrent connection attempts diff -Nru openjdk-21-21.0.10+7/debian/patches/machine-flag.diff openjdk-21-21.0.11+10/debian/patches/machine-flag.diff --- openjdk-21-21.0.10+7/debian/patches/machine-flag.diff 2026-01-21 21:50:48.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/patches/machine-flag.diff 2026-04-24 01:32:54.000000000 +0000 @@ -1,6 +1,6 @@ --- a/make/autoconf/flags.m4 +++ b/make/autoconf/flags.m4 -@@ -276,6 +276,7 @@ +@@ -272,6 +272,7 @@ AC_DEFUN_ONCE([FLAGS_PRE_TOOLCHAIN], test "x$OPENJDK_TARGET_CPU_ARCH" = xppc; then MACHINE_FLAG="-m${OPENJDK_TARGET_CPU_BITS}" fi @@ -8,7 +8,7 @@ fi if test "x$OPENJDK_TARGET_OS" = xmacosx; then -@@ -358,11 +359,8 @@ +@@ -354,11 +355,8 @@ AC_DEFUN([FLAGS_SETUP_TOOLCHAIN_CONTROL] AC_SUBST(COMPILER_COMMAND_FILE_FLAG) AC_SUBST(COMPILER_BINDCMD_FILE_FLAG) diff -Nru openjdk-21-21.0.10+7/debian/patches/series openjdk-21-21.0.11+10/debian/patches/series --- openjdk-21-21.0.10+7/debian/patches/series 2026-01-21 21:50:48.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/patches/series 2026-04-24 01:32:54.000000000 +0000 @@ -48,3 +48,4 @@ zero-alpha-workaround.diff #jdk-8347014-proposed.patch jdk-8359735.patch +jdk-8381555.diff diff -Nru openjdk-21-21.0.10+7/debian/rules openjdk-21-21.0.11+10/debian/rules --- openjdk-21-21.0.10+7/debian/rules 2026-01-21 21:54:12.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/rules 2026-04-24 01:33:08.000000000 +0000 @@ -538,10 +538,12 @@ --with-vendor-vm-bug-url='Unknown' endif +v_pkgrel_opt := $(subst ~,-,$(v_pkgrel)) + COMMON_CONFIGURE_ARGS += \ --with-version-pre='$(if $(filter yes, $(is_upstream_release)),,ea)' \ --with-version-build='$(v_upbuild)' \ - --with-version-opt='$(distribution)-$(v_pkgrel)' \ + --with-version-opt='$(v_pkgrel_opt)-$(distribution)' \ --with-copyright-year=$(PKGYEAR) \ COMMON_CONFIGURE_ARGS += \ @@ -961,7 +963,7 @@ control_vars += '-Vdbg:Conflicts=openjdk-11-dbg, openjdk-12-dbg, openjdk-13-dbg, openjdk-14-dbg, openjdk-15-dbg, openjdk-16-dbg' endif -debian/control: debian/control.in debian/tests/control debian/rules debian/watch +debian/control: debian/control.in debian/tests/control gen-autopkgtests debian/watch @cp -p debian/control debian/control.old sed \ -e 's/@basename@/$(basename)/g' \ @@ -997,20 +999,30 @@ rm -f debian/control.old; \ else \ diff -u debian/control.old debian/control | wdiff -d -; \ - echo "debian/control did change, please restart the build"; \ + echo "debian/control did change, please restart the build. Run make -f debian/rules update-control-files to update packaging sources."; \ rm -f debian/control.old; \ exit 1; \ fi -debian/tests/control: debian/tests/control.in debian/rules +debian/tests/control: debian/tests/control.in + cp -p $@ $@.old sed \ -e 's/@jtreg_dep@/$(jtreg_dep)/g' \ -e 's/@testng_dep@/$(testng_dep)/g' \ -e 's/@basename@/$(basename)/g' \ -e 's/@jtreg_archs@/$(jtreg_archs)/g' \ $< > $@; + @if cmp -s $@ $@.old; then \ + rm -f $@.old; \ + else \ + diff -u $@.old $@ | wdiff -d -; \ + echo "$@ did change, please restart the build. Run make -f debian/rules update-control-files to update packaging sources."; \ + rm -f $@.old; \ + exit 1; \ + fi -debian/tests/%.sh: debian/tests/%.in debian/rules +debian/tests/%.sh: debian/tests/%.in + cp -p $@ $@.old sed \ -e 's/@basename@/$(basename)/g' \ -e 's,@JDK_DIR@,/$(basedir),g' \ @@ -1019,6 +1031,14 @@ -e 's:@doc_dir@:/usr/share/doc/$(p_jrehl)/:g' \ $< > $@; chmod +x $@ + @if cmp -s $@ $@.old; then \ + rm -f $@.old; \ + else \ + diff -u $@.old $@ | wdiff -d -; \ + echo "$@ did change, please restart the build. Run make -f debian/rules update-control-files to update packaging sources."; \ + rm -f $@.old; \ + exit 1; \ + fi gen-autopkgtests: debian/tests/jtdiff-autopkgtest.sh \ debian/tests/jtreg-autopkgtest.sh \ @@ -1154,7 +1174,31 @@ build_stamps += stamps/jtreg-check-default -pre-build: +update-control-files: debian/control debian/tests/control gen-autopkgtests update-license + +update-license: + @cp -p debian/copyright debian/copyright.old + ./debian/copyright-generator/copyright-gen.py + @if cmp -s debian/copyright debian/copyright.old; then \ + rm -f debian/copyright.old; \ + else \ + diff -u debian/copyright.old debian/copyright | wdiff -d -; \ + echo "debian/copyright did change, please restart the build. Run make -f debian/rules update-control-files to update packaging sources."; \ + rm -f debian/copyright.old; \ + exit 1; \ + fi + +ifeq (,$(filter nogen, $(DEB_BUILD_OPTIONS))) +# Only check control files on amd64, other architectures may have +# nocheck set by d/rules, e.g. riscv64 +ifeq (amd64,$(DEB_HOST_ARCH)) +PRE_BUILD_DEP = update-control-files +endif +else +PRE_BUILD_DEP = +endif + +pre-build: $(PRE_BUILD_DEP) ifeq ($(with_check),yes) jtreg_version="$$(dpkg-query -f '$${Version}\n' -W $(jtreg_pkg))"; \ if ! dpkg --compare-versions $(min_jtreg_version) le $$jtreg_version; then \ @@ -1825,14 +1869,9 @@ : # OpenJDK Stack Unwinder and Frame Decorator ifneq (,$(filter $(DEB_HOST_ARCH),amd64)) - mkdir -p $(d_jrehl)/usr/share/gdb/auto-load/$(basedir)/jre/lib/server + mkdir -p $(d_jrehl)/usr/share/gdb/auto-load/$(basedir)/lib/server cp debian/dbg.py \ - $(d_jrehl)/usr/share/gdb/auto-load/$(basedir)/jre/lib/server/libjvm.so-gdb.py - ifneq (,$(filter zero, $(alternate_vms))) - mkdir -p $(d_jrez)/usr/share/gdb/auto-load/$(basedir)/jre/lib/zero - ln -sf ../server/libjvm.so-gdb.py \ - $(d_jrez)/usr/share/gdb/auto-load/$(basedir)/jre/lib/zero/libjvm.so - endif + $(d_jrehl)/usr/share/gdb/auto-load/$(basedir)/lib/server/libjvm.so-gdb.py endif ifeq ($(with_bridge),atk) @@ -2039,7 +2078,7 @@ dh_builddeb -a $(nodemo) $(nojrez) #$(bd_options) git_project = jdk21u -git_tag = jdk-21.0.10+7 +git_tag = jdk-21.0.11+10 package_version = $(shell echo $(PKGVERSION) | sed 's/-[^-][^-]*$$//') ifneq ($(is_upstream_release),yes) package_version := $(subst +,~,$(package_version)) @@ -2052,6 +2091,7 @@ gtestdir = ../$(basename)-$(package_version)-googletest.orig debian/watch: debian/watch.in debian/rules + @cp -p $@ $@.old sed \ -e 's|@git_url@|$(git_url)/tags|g' \ -e 's|@gtest_repo@|$(gtest_repo)/tags|g' \ @@ -2062,6 +2102,14 @@ ifeq ($(is_upstream_release),yes) sed -i 's|repack.*\\|repack,\\|g' debian/watch endif + @if cmp -s $@ $@.old; then \ + rm -f $@.old; \ + else \ + diff -u $@.old $@ | wdiff -d -; \ + echo "$@ did change, please restart the build"; \ + rm -f $@.old; \ + exit 1; \ + fi get-gtest: rm -rf $(gtestdir) || true @@ -2108,4 +2156,4 @@ rm -rf $(origdir) binary: binary-arch binary-indep -.PHONY: build build-arch build-indep clean binary-indep binary-arch binary install packaging-files +.PHONY: build build-arch build-indep clean binary-indep binary-arch binary install packaging-files debian/control debian/tests/control gen-autopkgtests debian/watch update-control-files update-license diff -Nru openjdk-21-21.0.10+7/debian/tests/control openjdk-21-21.0.11+10/debian/tests/control --- openjdk-21-21.0.10+7/debian/tests/control 2026-01-21 21:57:02.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/tests/control 2026-04-24 18:36:10.000000000 +0000 @@ -7,12 +7,12 @@ Restrictions: allow-stderr, superficial Tests: hotspot-autopkgtest.sh -Depends: @, jtreg7 (>= 7.3.1+1~), libtestng7-java, build-essential, bash, lsb-release, xfwm4, xvfb, xauth, dbus-x11, libatk-wrapper-java, libatk-wrapper-java-jni +Depends: @, jtreg7 (>= 7.5.2+1~), libtestng7-java, build-essential, bash, lsb-release, xfwm4, xvfb, xauth, dbus-x11, libatk-wrapper-java, libatk-wrapper-java-jni Restrictions: allow-stderr, skippable, flaky, rw-build-tree Architecture: amd64 i386 arm64 armhf ppc64 ppc64el riscv64 s390x alpha ia64 powerpc ppc64 sh4 x32 armel loong64 mipsel mips64el riscv64 Tests: jdk-autopkgtest.sh -Depends: @, jtreg7 (>= 7.3.1+1~), libtestng7-java, build-essential, bash, lsb-release, xfwm4, xvfb, xauth, dbus-x11, libatk-wrapper-java, libatk-wrapper-java-jni +Depends: @, jtreg7 (>= 7.5.2+1~), libtestng7-java, build-essential, bash, lsb-release, xfwm4, xvfb, xauth, dbus-x11, libatk-wrapper-java, libatk-wrapper-java-jni Restrictions: allow-stderr, skippable, flaky, rw-build-tree Architecture: amd64 i386 arm64 armhf ppc64 ppc64el riscv64 s390x alpha ia64 powerpc ppc64 sh4 x32 armel loong64 mipsel mips64el riscv64 diff -Nru openjdk-21-21.0.10+7/debian/tests/dependencies.sh openjdk-21-21.0.11+10/debian/tests/dependencies.sh --- openjdk-21-21.0.10+7/debian/tests/dependencies.sh 2026-01-21 21:50:48.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/tests/dependencies.sh 2026-04-24 01:32:54.000000000 +0000 @@ -27,7 +27,7 @@ ${jdk_path}/bin/java -Djava.security.debug=all \ -cp . ${AUTOPKGTEST_TMP}/Test.java > ${AUTOPKGTEST_TMP}/dependencies-pcsc.log 2>&1 -if grep "Using PC/SC library" ${AUTOPKGTEST_TMP}/dependencies-pcsc.log; then +if grep "pcsc: Using PC/SC library" ${AUTOPKGTEST_TMP}/dependencies-pcsc.log; then echo "Test passed." else cat ${AUTOPKGTEST_TMP}/dependencies-pcsc.log diff -Nru openjdk-21-21.0.10+7/debian/tests/jtreg-autopkgtest.in openjdk-21-21.0.11+10/debian/tests/jtreg-autopkgtest.in --- openjdk-21-21.0.10+7/debian/tests/jtreg-autopkgtest.in 2026-01-21 21:50:48.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/tests/jtreg-autopkgtest.in 2026-04-24 01:32:54.000000000 +0000 @@ -29,6 +29,9 @@ if [[ "armel" == *"${host_arch}"* ]]; then jt_options+=" -Xmx256M" fi +if [[ "s390x" != *"${host_arch}"* ]]; then + jt_options+=" -agentvm" +fi if dpkg --compare-versions ${jtreg_version} ge 4.2; then njobs=auto for opt in ${DEB_BUILD_OPTIONS:-}; do @@ -39,6 +42,13 @@ jt_options+=" -conc:$njobs" fi +# timeouts should be higher for zero builds +case ${host_arch} in + loong64) timeout=30;; + riscv64) timeout=30;; + *) timeout=10;; +esac + # check java binary if [ ! -x "${JDK_TO_TEST}/bin/java" ]; then echo "Error: JDK_TO_TEST: '${JDK_TO_TEST}/bin/java' is not an executable." >&2 @@ -108,8 +118,7 @@ -automatic \ -retain:none \ -ignore:quiet \ - -agentvm \ - -timeout:10 \ + -timeout:${timeout} \ -workDir:"${jtwork_dir}" \ -reportDir:"${report_dir}" \ -jdk:${JDK_TO_TEST} \ diff -Nru openjdk-21-21.0.10+7/debian/tests/jtreg-autopkgtest.sh openjdk-21-21.0.11+10/debian/tests/jtreg-autopkgtest.sh --- openjdk-21-21.0.10+7/debian/tests/jtreg-autopkgtest.sh 2026-01-21 21:50:48.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/tests/jtreg-autopkgtest.sh 2026-04-24 01:32:54.000000000 +0000 @@ -29,6 +29,9 @@ if [[ "armel" == *"${host_arch}"* ]]; then jt_options+=" -Xmx256M" fi +if [[ "s390x" != *"${host_arch}"* ]]; then + jt_options+=" -agentvm" +fi if dpkg --compare-versions ${jtreg_version} ge 4.2; then njobs=auto for opt in ${DEB_BUILD_OPTIONS:-}; do @@ -39,6 +42,13 @@ jt_options+=" -conc:$njobs" fi +# timeouts should be higher for zero builds +case ${host_arch} in + loong64) timeout=30;; + riscv64) timeout=30;; + *) timeout=10;; +esac + # check java binary if [ ! -x "${JDK_TO_TEST}/bin/java" ]; then echo "Error: JDK_TO_TEST: '${JDK_TO_TEST}/bin/java' is not an executable." >&2 @@ -108,8 +118,7 @@ -automatic \ -retain:none \ -ignore:quiet \ - -agentvm \ - -timeout:10 \ + -timeout:${timeout} \ -workDir:"${jtwork_dir}" \ -reportDir:"${report_dir}" \ -jdk:${JDK_TO_TEST} \ diff -Nru openjdk-21-21.0.10+7/debian/tests/problems.csv openjdk-21-21.0.11+10/debian/tests/problems.csv --- openjdk-21-21.0.10+7/debian/tests/problems.csv 2026-01-03 22:42:40.000000000 +0000 +++ openjdk-21-21.0.11+10/debian/tests/problems.csv 2026-04-24 01:33:16.000000000 +0000 @@ -1,7 +1,7 @@ Test,Bug,Comment,Packages,Arch,Release -Error: runtime/Unsafe/InternalErrorTest.java,JDK-8335238,"To investigate, not critical for security release – JDK-22 will expire before OO release",:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,i386,:release-all +Error: runtime/Unsafe/InternalErrorTest.java,JDK-8335238,"To investigate, not critical for security release – JDK-22 will expire before OO release",:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,i386,:release-all Error: serviceability/jvmti/vthread/SuspendResume1/SuspendResume1.java#default,,"Deadlock, new failure, not critical – JDK-22 will expire before OO release",:openjdk-22,ppc64el,:release-all -FAILED: compiler/arguments/CheckCICompilerCount.java,,"Existing failure (exit code 0, expected 1)",:openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,i386,:release-all +FAILED: compiler/arguments/CheckCICompilerCount.java,,"Existing failure (exit code 0, expected 1)",:openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,i386,:release-all FAILED: compiler/codecache/MHIntrinsicAllocFailureTest.java,JDK-8298947,The issue only happens on armhf platform. ,:openjdk-17:openjdk-21,armhf,:release-all FAILED: gtest/GTestWrapper.java,,"17:UninitializedDoubleElementWorkerDataArrayTest.print_summary_on_test_vm, ",:openjdk-17:openjdk-21,i386,:release-all FAILED: java/foreign/critical/TestCritical.java,,"SEGSEGV in test, submit bug, not critical for security release",:openjdk-22,s390x,:release-all @@ -12,38 +12,38 @@ FAILED: java/foreign/TestSegments.java,,Ignore test failure in the preview api,:openjdk-21,:i386,:release-all FAILED: java/foreign/TestUpcallHighArity.java,,Ignore test failure in the preview api,:openjdk-21,:i386,:release-all FAILED: java/foreign/TestUpcallStructScope.java,,Ignore test failure in the preview api,:openjdk-21,:i386,:release-all -FAILED: java/io/File/createTempFile/TargetDirectory.java,JDK-8166162,Container issue,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all +FAILED: java/io/File/createTempFile/TargetDirectory.java,JDK-8166162,Container issue,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all FAILED: java/io/File/GetXSpace.java,,"Container issue, disk space size exceeds 32 bit integer",:openjdk-17:openjdk-21:openjdk-22,:i386:armhf,:release-all -FAILED: java/nio/channels/FileChannel/directio/DirectIOTest.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/channels/FileChannel/directio/PreadDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/channels/FileChannel/directio/PwriteDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/channels/FileChannel/directio/ReadDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/channels/FileChannel/directio/WriteDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/file/attribute/AclFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all +FAILED: java/nio/channels/FileChannel/directio/DirectIOTest.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/channels/FileChannel/directio/PreadDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/channels/FileChannel/directio/PwriteDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/channels/FileChannel/directio/ReadDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/channels/FileChannel/directio/WriteDirect.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/file/attribute/AclFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all FAILED: java/nio/file/attribute/BasicFileAttributeView/CreationTime.java,JDK-8166162,Container issue,:openjdk-22,i386,:release-all -FAILED: java/nio/file/attribute/BasicFileAttributeView/SetTimesNanos.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/file/attribute/DosFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/file/attribute/PosixFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/file/attribute/UserDefinedFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/file/Files/CheckPermissions.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/file/Files/CopyAndMove.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/file/Files/CopyMoveVariations.java,JDK-8166162,Container issue,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/file/Files/FileAttributes.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/file/Files/InterruptCopy.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/file/Files/Misc.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/file/Files/TemporaryFiles.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: java/nio/file/FileStore/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: com/sun/net/httpserver/simpleserver/DocRootDirPermissionsTest.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all +FAILED: java/nio/file/attribute/BasicFileAttributeView/SetTimesNanos.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/file/attribute/DosFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/file/attribute/PosixFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/file/attribute/UserDefinedFileAttributeView/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/file/Files/CheckPermissions.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/file/Files/CopyAndMove.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/file/Files/CopyMoveVariations.java,JDK-8166162,Container issue,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/file/Files/FileAttributes.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/file/Files/InterruptCopy.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/file/Files/Misc.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/file/Files/TemporaryFiles.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: java/nio/file/FileStore/Basic.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: com/sun/net/httpserver/simpleserver/DocRootDirPermissionsTest.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11::openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all FAILED: runtime/cds/appcds/jcmd/JCmdTestDynamicDump.java,,flaky test (?) existing comment,:openjdk-17,:arch-all,:release-all FAILED: runtime/cds/appcds/jcmd/JCmdTestFileSafety.java,,flaky test (?) existing comment,:openjdk-17,i386:arm64:amd64:ppc64el,:release-all FAILED: runtime/cds/appcds/jcmd/JCmdTestStaticDump.java,,flaky test (?) existing comment,:openjdk-17,:arch-all,:release-all FAILED: runtime/ErrorHandling/MachCodeFramesInErrorFile.java,,java.lang.InternalError: a fault occurred in a recent unsafe memory access operation in compiled Java code at java.base/java.lang.Long.toHexString(Long.java:309) at,:openjdk-17:openjdk-21,armhf,:release-all FAILED: runtime/jni/nativeStack/TestNativeStack.java,JDK-8312016,"Backport fix (do not add patch, the fix just disables the test)",:openjdk-lts:openjdk-11:openjdk-17,armhf,:release-all -FAILED: runtime/LoadClass/LongBCP.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all +FAILED: runtime/LoadClass/LongBCP.java,JDK-8166162,Container issue,:openjdk-lts:openjdk-11:openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all FAILED: runtime/Monitor/ConcurrentDeflation.java,,LockingMode == 0 (LM_MONITOR) is not fully implemented on this architectureError: Could not create the Java Virtual Machine.,:openjdk-21,armhf,:release-all -FAILED: runtime/NMT/VirtualAllocCommitMerge.java,JDK-8309698,P4 bug (existing issue),:openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,s390x,:release-all +FAILED: runtime/NMT/VirtualAllocCommitMerge.java,JDK-8309698,P4 bug (existing issue),:openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,s390x,:release-all FAILED: serviceability/AsyncGetCallTrace/MyPackage/ASGCTBaseTest.java,JDK-8303168,Existing bug,:openjdk-21,armhf,:release-all -FAILED: tools/jlink/JLinkTest.java,JDK-8240349,Bugfix failed for i386 (P4 bug),:openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,i386,:release-all +FAILED: tools/jlink/JLinkTest.java,JDK-8240349,Bugfix failed for i386 (P4 bug),:openjdk-17:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,i386,:release-all FAILED: jdk/javadoc/doclet/dupThrowsTags/TestDupThrowsTags.java,,tests failing due to disable-doclint-by-default.diff (reproducible build maintainer patch),:openjdk-lts:openjdk-11,:arch-all,:release-all FAILED: jdk/javadoc/doclet/T6735320/T6735320.java,,tests failing due to disable-doclint-by-default.diff (reproducible build maintainer patch),:openjdk-lts:openjdk-11,:arch-all,:release-all FAILED: jdk/javadoc/doclet/testBadHtml/TestBadHtml.java,,tests failing due to disable-doclint-by-default.diff (reproducible build maintainer patch),:openjdk-lts:openjdk-11,:arch-all,:release-all @@ -84,6 +84,24 @@ FAILED: java/foreign/TestUpcallStack.java,, asserts due to the invalid structure size. Ignore as this is a preview API and the issue does not occur in openjdk-22. I will add it to the problemlist.,:openjdk-21,:armhf,:release-all FAILED: java/foreign/TestVarArgs.java,, asserts due to the invalid structure size. Ignore as this is a preview API and the issue does not occur in openjdk-22. I will add it to the problemlist.,:openjdk-21,:armhf,:release-all FAILED: runtime/os/TestTrimNative.java#trimNative,, java.lang.RuntimeException: We found fewer (periodic) trim lines in UL log than expected (expected at least 13 found 11). This looks like a flaky test - it asserts number of lines from the periodic trimmer e.g. src/hotspot/share/runtime/trimNativeHeap.hpp:56 which causes the test to fail due to the slow VM. Test passes locally.,:openjdk-21,:armhf,:release-all -FAILED: sun/security/util/Debug/DebugOptions.java,JDK-8339713,Stack overflow error on 32-bit platforms,:openjdk-17:openjdk-21:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:armhf:i386:s390x,:release-all -Error: jdk/jshell/TerminalNoExecTest.java,,BackingStoreException: Couldn't get file lock - possibly because the LP (non-root) container has no home directory,:openjdk-23:openjdk-24:openjdk-25:openjdk-26:,:arch-all,:release-all -FAILED: applications/ctw/modules/jdk_jfr.java,JDK-8352567, Unimplemented SharedRuntime::generate_jfr_write_checkpoint for S390x, :openjdk-25:openjdk-26:,:s390x,:release-all +FAILED: sun/security/util/Debug/DebugOptions.java,JDK-8339713,Stack overflow error on 32-bit platforms,:openjdk-17:openjdk-21:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:armhf:i386:s390x,:release-all +Error: jdk/jshell/TerminalNoExecTest.java,,BackingStoreException: Couldn't get file lock - possibly because the LP (non-root) container has no home directory,:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:arch-all,:release-all +FAILED: applications/ctw/modules/jdk_jfr.java,JDK-8352567, Unimplemented SharedRuntime::generate_jfr_write_checkpoint for S390x, :openjdk-25:openjdk-26:openjdk-27:,:s390x,:release-all +Error: serviceability/jvmti/thread/SuspendThreadList/suspendthrdlst01/suspendthrdlst01.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all +Error: serviceability/jvmti/thread/ResumeThreadList/resumethrdlst02/resumethrdlst02.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all +Error: serviceability/jvmti/thread/SuspendThread/suspendthrd01/suspendthrd01.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all +Error: serviceability/jvmti/thread/ResumeThreadList/resumethrdlst01/resumethrdlst01.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all +Error: serviceability/jvmti/thread/ResumeThread/resumethrd02/resumethrd02.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all +Error: serviceability/jvmti/thread/ResumeThread/resumethrd01/resumethrd01.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all +Error: serviceability/jvmti/thread/GetThreadState/thrstat02/thrstat02.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all +Error: serviceability/jvmti/thread/GetCurrentContendedMonitor/contmon02/contmon02.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all +Error: serviceability/jvmti/thread/GetCurrentContendedMonitor/contmon01/contmon01.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all +Error: serviceability/jvmti/SuspendWithCurrentThread/SuspendWithCurrentThread.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all +Error: runtime/NMT/SummaryDiffThreadCount.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all +Error: runtime/lockStack/TestStackWalk.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all +Error: compiler/loopopts/TestRemoveEmptyLoop.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all +Error: jdk/internal/shellsupport/doc/JavadocHelperTest.java,,Takes too long on loong64,:openjdk-21:openjdk-22:openjdk-23:openjdk-24:openjdk-25:openjdk-26:openjdk-27:,:loong64,:release-all +FAILED: tools/javac/tree/SourceDocTreeScannerTest.java,JDK-8332619,Test runs out of stack space on 32-bit platforms,:openjdk-21,:armhf:i386,:release-all +FAILED: tools/javac/patterns/SOEDeeplyNestedBlocksTest.java,JDK-8332619,Test runs out of stack space on 32-bit platforms,:openjdk-21,:armhf:i386,:release-all +FAILED: tools/javac/tree/TreePosTest.java,JDK-8332619,Test runs out of stack space on 32-bit platforms,:openjdk-21,:armhf:i386,:release-all +FAILED: java/time/test/java/time/format/TestUTCParse.java,JDK-8381709,jtreg test initialization issue,:openjdk-11,:arch-all,:release-all diff -Nru openjdk-21-21.0.10+7/make/autoconf/lib-bundled.m4 openjdk-21-21.0.11+10/make/autoconf/lib-bundled.m4 --- openjdk-21-21.0.10+7/make/autoconf/lib-bundled.m4 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/make/autoconf/lib-bundled.m4 2026-04-17 19:09:35.000000000 +0000 @@ -219,8 +219,8 @@ LIBZ_LIBS="" if test "x$USE_EXTERNAL_LIBZ" = "xfalse"; then LIBZ_CFLAGS="$LIBZ_CFLAGS -I$TOPDIR/src/java.base/share/native/libzip/zlib" - if test "x$OPENJDK_TARGET_OS" = xmacosx; then - LIBZ_CFLAGS="$LIBZ_CFLAGS -DHAVE_UNISTD_H" + if test "x$OPENJDK_TARGET_OS" = xmacosx -o "x$OPENJDK_TARGET_OS" = xaix -o "x$OPENJDK_TARGET_OS" = xlinux; then + LIBZ_CFLAGS="$LIBZ_CFLAGS -DHAVE_UNISTD_H=1 -DHAVE_STDARG_H=1" fi else LIBZ_LIBS="-lz" diff -Nru openjdk-21-21.0.10+7/make/autoconf/lib-tests.m4 openjdk-21-21.0.11+10/make/autoconf/lib-tests.m4 --- openjdk-21-21.0.10+7/make/autoconf/lib-tests.m4 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/make/autoconf/lib-tests.m4 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ # -# Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -28,7 +28,7 @@ ################################################################################ # Minimum supported versions -JTREG_MINIMUM_VERSION=7.3.1 +JTREG_MINIMUM_VERSION=7.5.2 GTEST_MINIMUM_VERSION=1.14.0 ############################################################################### diff -Nru openjdk-21-21.0.10+7/make/autoconf/platform.m4 openjdk-21-21.0.11+10/make/autoconf/platform.m4 --- openjdk-21-21.0.10+7/make/autoconf/platform.m4 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/make/autoconf/platform.m4 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2026, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -311,6 +311,12 @@ else OPENJDK_BUILD_OS_ENV="$VAR_OS" fi + # Special handling for MSYS2 that reports a Cygwin triplet as the default host triplet. + case `uname` in + MSYS*) + OPENJDK_BUILD_OS_ENV=windows.msys2 + ;; + esac OPENJDK_BUILD_CPU="$VAR_CPU" OPENJDK_BUILD_CPU_ARCH="$VAR_CPU_ARCH" OPENJDK_BUILD_CPU_BITS="$VAR_CPU_BITS" diff -Nru openjdk-21-21.0.10+7/make/common/Utils.gmk openjdk-21-21.0.11+10/make/common/Utils.gmk --- openjdk-21-21.0.10+7/make/common/Utils.gmk 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/make/common/Utils.gmk 2026-04-17 19:09:35.000000000 +0000 @@ -47,7 +47,7 @@ ################################################################################ # This macro works just like EscapeDollar above, but for #. -EscapeHash = $(subst \#,\\\#,$(subst \\\#,\#,$(strip $1))) +EscapeHash = $(subst $(HASH),\$(HASH),$(subst \$(HASH),$(HASH),$(strip $1))) ################################################################################ # This macro translates $ into $$ to protect the string from make itself. diff -Nru openjdk-21-21.0.10+7/make/conf/github-actions.conf openjdk-21-21.0.11+10/make/conf/github-actions.conf --- openjdk-21-21.0.10+7/make/conf/github-actions.conf 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/make/conf/github-actions.conf 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ # -# Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ # Versions and download locations for dependencies used by GitHub Actions (GHA) GTEST_VERSION=1.14.0 -JTREG_VERSION=7.3.1+1 +JTREG_VERSION=7.5.2+1 LINUX_X64_BOOT_JDK_EXT=tar.gz LINUX_X64_BOOT_JDK_URL=https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.6%2B7/OpenJDK21U-jdk_x64_linux_hotspot_21.0.6_7.tar.gz diff -Nru openjdk-21-21.0.10+7/make/conf/jib-profiles.js openjdk-21-21.0.11+10/make/conf/jib-profiles.js --- openjdk-21-21.0.10+7/make/conf/jib-profiles.js 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/make/conf/jib-profiles.js 2026-04-17 19:09:35.000000000 +0000 @@ -1185,9 +1185,9 @@ jtreg: { server: "jpg", product: "jtreg", - version: "7.3.1", + version: "7.5.2", build_number: "1", - file: "bundles/jtreg-7.3.1+1.zip", + file: "bundles/jtreg-7.5.2+1.zip", environment_name: "JT_HOME", environment_path: input.get("jtreg", "home_path") + "/bin", configure_args: "--with-jtreg=" + input.get("jtreg", "home_path"), diff -Nru openjdk-21-21.0.10+7/make/conf/version-numbers.conf openjdk-21-21.0.11+10/make/conf/version-numbers.conf --- openjdk-21-21.0.10+7/make/conf/version-numbers.conf 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/make/conf/version-numbers.conf 2026-04-17 19:09:35.000000000 +0000 @@ -28,12 +28,12 @@ DEFAULT_VERSION_FEATURE=21 DEFAULT_VERSION_INTERIM=0 -DEFAULT_VERSION_UPDATE=10 +DEFAULT_VERSION_UPDATE=11 DEFAULT_VERSION_PATCH=0 DEFAULT_VERSION_EXTRA1=0 DEFAULT_VERSION_EXTRA2=0 DEFAULT_VERSION_EXTRA3=0 -DEFAULT_VERSION_DATE=2026-01-20 +DEFAULT_VERSION_DATE=2026-04-21 DEFAULT_VERSION_CLASSFILE_MAJOR=65 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`" DEFAULT_VERSION_CLASSFILE_MINOR=0 DEFAULT_VERSION_DOCS_API_SINCE=11 diff -Nru openjdk-21-21.0.10+7/make/hotspot/lib/JvmMapfile.gmk openjdk-21-21.0.11+10/make/hotspot/lib/JvmMapfile.gmk --- openjdk-21-21.0.10+7/make/hotspot/lib/JvmMapfile.gmk 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/make/hotspot/lib/JvmMapfile.gmk 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ # -# Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -118,7 +118,7 @@ FILTER_SYMBOLS_AWK_SCRIPT := \ '{ \ - if ($$7 ~ /??_7.*@@6B@/ && $$7 !~ /type_info/ && $$7 !~ /lambda/) print $$7; \ + if ($$7 ~ /\?\?_7.*@@6B@/ && $$7 !~ /type_info/ && $$7 !~ /lambda/) print $$7; \ }' else diff -Nru openjdk-21-21.0.10+7/make/modules/java.base/Copy.gmk openjdk-21-21.0.11+10/make/modules/java.base/Copy.gmk --- openjdk-21-21.0.10+7/make/modules/java.base/Copy.gmk 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/make/modules/java.base/Copy.gmk 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ # -# Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2026, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -226,6 +226,10 @@ LEGAL_EXCLUDES += zlib.md endif +ifneq ($(TOOLCHAIN_TYPE), gcc) + LEGAL_EXCLUDES += gcc.md +endif + $(eval $(call SetupCopyLegalFiles, COPY_LEGAL, \ EXCLUDES := $(LEGAL_EXCLUDES), \ )) diff -Nru openjdk-21-21.0.10+7/make/modules/java.desktop/lib/Awt2dLibraries.gmk openjdk-21-21.0.11+10/make/modules/java.desktop/lib/Awt2dLibraries.gmk --- openjdk-21-21.0.10+7/make/modules/java.desktop/lib/Awt2dLibraries.gmk 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/make/modules/java.desktop/lib/Awt2dLibraries.gmk 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2026, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -810,6 +810,7 @@ DISABLED_WARNINGS_microsoft_dgif_lib.c := 4018 4267, \ DISABLED_WARNINGS_microsoft_splashscreen_impl.c := 4018 4267 4244, \ DISABLED_WARNINGS_microsoft_splashscreen_png.c := 4267, \ + DISABLED_WARNINGS_microsoft_pngread.c := 4146, \ DISABLED_WARNINGS_microsoft_splashscreen_sys.c := 4267 4244, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ diff -Nru openjdk-21-21.0.10+7/src/hotspot/cpu/aarch64/aarch64.ad openjdk-21-21.0.11+10/src/hotspot/cpu/aarch64/aarch64.ad --- openjdk-21-21.0.10+7/src/hotspot/cpu/aarch64/aarch64.ad 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/cpu/aarch64/aarch64.ad 2026-04-17 19:09:35.000000000 +0000 @@ -8082,10 +8082,11 @@ match(Set dst (ReverseBytesUS src)); ins_cost(INSN_COST); - format %{ "rev16w $dst, $src" %} + format %{ "rev16w $dst, $src\t# $dst -> unsigned short" %} ins_encode %{ __ rev16w(as_Register($dst$$reg), as_Register($src$$reg)); + __ narrow_subword_type(as_Register($dst$$reg), T_CHAR); %} ins_pipe(ialu_reg); diff -Nru openjdk-21-21.0.10+7/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp openjdk-21-21.0.11+10/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp --- openjdk-21-21.0.10+7/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -2425,6 +2425,17 @@ } } +void MacroAssembler::narrow_subword_type(Register reg, BasicType bt) { + assert(is_subword_type(bt), "required"); + switch (bt) { + case T_BOOLEAN: andw(reg, reg, 1); break; + case T_BYTE: sxtbw(reg, reg); break; + case T_CHAR: uxthw(reg, reg); break; + case T_SHORT: sxthw(reg, reg); break; + default: ShouldNotReachHere(); + } +} + void MacroAssembler::decrementw(Register reg, int value) { if (value < 0) { incrementw(reg, -value); return; } diff -Nru openjdk-21-21.0.10+7/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp openjdk-21-21.0.11+10/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp --- openjdk-21-21.0.10+7/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -31,6 +31,7 @@ #include "metaprogramming/enableIf.hpp" #include "oops/compressedOops.hpp" #include "runtime/vm_version.hpp" +#include "utilities/globalDefinitions.hpp" #include "utilities/powerOfTwo.hpp" class OopMap; @@ -678,6 +679,9 @@ // Support for sign-extension (hi:lo = extend_sign(lo)) void extend_sign(Register hi, Register lo); + // Clean up a subword typed value to the representation in compliance with JVMS §2.3 + void narrow_subword_type(Register reg, BasicType bt); + // Load and store values by size and signed-ness void load_sized_value(Register dst, Address src, size_t size_in_bytes, bool is_signed); void store_sized_value(Address dst, Register src, size_t size_in_bytes); diff -Nru openjdk-21-21.0.10+7/src/hotspot/cpu/arm/arm.ad openjdk-21-21.0.11+10/src/hotspot/cpu/arm/arm.ad --- openjdk-21-21.0.10+7/src/hotspot/cpu/arm/arm.ad 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/cpu/arm/arm.ad 2026-04-17 19:09:35.000000000 +0000 @@ -9387,10 +9387,12 @@ instruct bytes_reverse_unsigned_short(iRegI dst, iRegI src) %{ match(Set dst (ReverseBytesUS src)); - size(4); - format %{ "REV16 $dst,$src" %} + size(8); + format %{ "REV32 $dst,$src\n\t" + "LSR $dst,$dst,#16" %} ins_encode %{ - __ rev16($dst$$Register, $src$$Register); + __ rev($dst$$Register, $src$$Register); + __ mov($dst$$Register, AsmOperand($dst$$Register, lsr, 16)); %} ins_pipe( iload_mem ); // FIXME %} diff -Nru openjdk-21-21.0.10+7/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp --- openjdk-21-21.0.10+7/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -1268,11 +1268,11 @@ lhz(R11_scratch1, in_bytes(DataLayout::bci_offset()), R28_mdx); ld(R12_scratch2, in_bytes(Method::const_offset()), R19_method); addi(R11_scratch1, R11_scratch1, in_bytes(ConstMethod::codes_offset())); - add(R11_scratch1, R12_scratch2, R12_scratch2); + add(R11_scratch1, R11_scratch1, R12_scratch2); cmpd(CCR0, R11_scratch1, R14_bcp); beq(CCR0, verify_continue); - call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::verify_mdp ), R19_method, R14_bcp, R28_mdx); + call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::verify_mdp), R19_method, R14_bcp, R28_mdx); bind(verify_continue); #endif diff -Nru openjdk-21-21.0.10+7/src/hotspot/cpu/ppc/ppc.ad openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/ppc.ad --- openjdk-21-21.0.10+7/src/hotspot/cpu/ppc/ppc.ad 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/cpu/ppc/ppc.ad 2026-04-17 19:09:35.000000000 +0000 @@ -13072,28 +13072,41 @@ ins_pipe(pipe_class_default); %} +// Expand nodes for byte_reverse_int/ushort/short. +instruct rlwinm(iRegIdst dst, iRegIsrc src, immI16 shift, immI16 mb, immI16 me) %{ + effect(DEF dst, USE src, USE shift, USE mb, USE me); + predicate(false); + + format %{ "RLWINM $dst, $src, $shift, $mb, $me" %} + size(4); + ins_encode %{ + __ rlwinm($dst$$Register, $src$$Register, $shift$$constant, $mb$$constant, $me$$constant); + %} + ins_pipe(pipe_class_default); +%} + // Expand nodes for byte_reverse_int. -instruct insrwi_a(iRegIdst dst, iRegIsrc src, immI16 pos, immI16 shift) %{ - effect(DEF dst, USE src, USE pos, USE shift); +instruct insrwi_a(iRegIdst dst, iRegIsrc src, immI16 n, immI16 b) %{ + effect(DEF dst, USE src, USE n, USE b); predicate(false); - format %{ "INSRWI $dst, $src, $pos, $shift" %} + format %{ "INSRWI $dst, $src, $n, $b" %} size(4); ins_encode %{ - __ insrwi($dst$$Register, $src$$Register, $shift$$constant, $pos$$constant); + __ insrwi($dst$$Register, $src$$Register, $n$$constant, $b$$constant); %} ins_pipe(pipe_class_default); %} // As insrwi_a, but with USE_DEF. -instruct insrwi(iRegIdst dst, iRegIsrc src, immI16 pos, immI16 shift) %{ - effect(USE_DEF dst, USE src, USE pos, USE shift); +instruct insrwi(iRegIdst dst, iRegIsrc src, immI16 n, immI16 b) %{ + effect(USE_DEF dst, USE src, USE n, USE b); predicate(false); - format %{ "INSRWI $dst, $src, $pos, $shift" %} + format %{ "INSRWI $dst, $src, $n, $b" %} size(4); ins_encode %{ - __ insrwi($dst$$Register, $src$$Register, $shift$$constant, $pos$$constant); + __ insrwi($dst$$Register, $src$$Register, $n$$constant, $b$$constant); %} ins_pipe(pipe_class_default); %} @@ -13115,12 +13128,12 @@ iRegLdst tmpI3; urShiftI_reg_imm(tmpI1, src, imm24); - insrwi_a(dst, tmpI1, imm24, imm8); + insrwi_a(dst, tmpI1, imm8, imm24); urShiftI_reg_imm(tmpI2, src, imm16); - insrwi(dst, tmpI2, imm8, imm16); + insrwi(dst, tmpI2, imm16, imm8); urShiftI_reg_imm(tmpI3, src, imm8); insrwi(dst, tmpI3, imm8, imm8); - insrwi(dst, src, imm0, imm8); + insrwi(dst, src, imm8, imm0); %} %} @@ -13228,32 +13241,20 @@ ins_pipe(pipe_class_default); %} +// Need zero extend. Must not use brh only. instruct bytes_reverse_ushort_Ex(iRegIdst dst, iRegIsrc src) %{ match(Set dst (ReverseBytesUS src)); - predicate(!UseByteReverseInstructions); ins_cost(2*DEFAULT_COST); expand %{ + immI16 imm31 %{ (int) 31 %} + immI16 imm24 %{ (int) 24 %} immI16 imm16 %{ (int) 16 %} immI16 imm8 %{ (int) 8 %} - urShiftI_reg_imm(dst, src, imm8); - insrwi(dst, src, imm16, imm8); - %} -%} - -instruct bytes_reverse_ushort(iRegIdst dst, iRegIsrc src) %{ - match(Set dst (ReverseBytesUS src)); - predicate(UseByteReverseInstructions); - ins_cost(DEFAULT_COST); - size(4); - - format %{ "BRH $dst, $src" %} - - ins_encode %{ - __ brh($dst$$Register, $src$$Register); + rlwinm(dst, src, imm24, imm24, imm31); + insrwi(dst, src, imm8, imm16); %} - ins_pipe(pipe_class_default); %} instruct bytes_reverse_short_Ex(iRegIdst dst, iRegIsrc src) %{ @@ -13267,7 +13268,7 @@ iRegLdst tmpI1; urShiftI_reg_imm(tmpI1, src, imm8); - insrwi(tmpI1, src, imm16, imm8); + insrwi(tmpI1, src, imm8, imm16); extsh(dst, tmpI1); %} %} diff -Nru openjdk-21-21.0.10+7/src/hotspot/cpu/riscv/icache_riscv.cpp openjdk-21-21.0.11+10/src/hotspot/cpu/riscv/icache_riscv.cpp --- openjdk-21-21.0.10+7/src/hotspot/cpu/riscv/icache_riscv.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/cpu/riscv/icache_riscv.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -40,7 +40,8 @@ // We need to make sure stores happens before the I/D cache synchronization. __asm__ volatile("fence rw, rw" : : : "memory"); - RiscvFlushIcache::flush((uintptr_t)addr, ((uintptr_t)lines) << ICache::log2_line_size); + uintptr_t end = (uintptr_t)addr + ((uintptr_t)lines << ICache::log2_line_size); + RiscvFlushIcache::flush((uintptr_t)addr, end); return magic; } diff -Nru openjdk-21-21.0.10+7/src/hotspot/cpu/x86/macroAssembler_x86.cpp openjdk-21-21.0.11+10/src/hotspot/cpu/x86/macroAssembler_x86.cpp --- openjdk-21-21.0.10+7/src/hotspot/cpu/x86/macroAssembler_x86.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/cpu/x86/macroAssembler_x86.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -51,6 +51,7 @@ #include "runtime/safepointMechanism.hpp" #include "runtime/sharedRuntime.hpp" #include "runtime/stubRoutines.hpp" +#include "utilities/globalDefinitions.hpp" #include "utilities/macros.hpp" #ifdef PRODUCT @@ -3151,6 +3152,17 @@ } } +void MacroAssembler::narrow_subword_type(Register reg, BasicType bt) { + assert(is_subword_type(bt), "required"); + switch (bt) { + case T_BOOLEAN: andl(reg, 1); break; + case T_BYTE: movsbl(reg, reg); break; + case T_CHAR: movzwl(reg, reg); break; + case T_SHORT: movswl(reg, reg); break; + default: ShouldNotReachHere(); + } +} + void MacroAssembler::testl(Address dst, int32_t imm32) { if (imm32 >= 0 && is8bit(imm32)) { testb(dst, imm32); diff -Nru openjdk-21-21.0.10+7/src/hotspot/cpu/x86/macroAssembler_x86.hpp openjdk-21-21.0.11+10/src/hotspot/cpu/x86/macroAssembler_x86.hpp --- openjdk-21-21.0.10+7/src/hotspot/cpu/x86/macroAssembler_x86.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/cpu/x86/macroAssembler_x86.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -455,6 +455,9 @@ void sign_extend_short(Register reg); void sign_extend_byte(Register reg); + // Clean up a subword typed value to the representation in compliance with JVMS §2.3 + void narrow_subword_type(Register reg, BasicType bt); + // Division by power of 2, rounding towards 0 void division_with_shift(Register reg, int shift_value); diff -Nru openjdk-21-21.0.10+7/src/hotspot/cpu/x86/x86_32.ad openjdk-21-21.0.11+10/src/hotspot/cpu/x86/x86_32.ad --- openjdk-21-21.0.10+7/src/hotspot/cpu/x86/x86_32.ad 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/cpu/x86/x86_32.ad 2026-04-17 19:09:35.000000000 +0000 @@ -7406,10 +7406,11 @@ instruct xaddB( memory mem, xRegI newval, eFlagsReg cr) %{ match(Set newval (GetAndAddB mem newval)); effect(KILL cr); - format %{ "XADDB [$mem],$newval" %} + format %{ "XADDB [$mem],$newval\t# $newval -> byte" %} ins_encode %{ __ lock(); __ xaddb($mem$$Address, $newval$$Register); + __ narrow_subword_type($newval$$Register, T_BYTE); %} ins_pipe( pipe_cmpxchg ); %} @@ -7429,10 +7430,11 @@ instruct xaddS( memory mem, rRegI newval, eFlagsReg cr) %{ match(Set newval (GetAndAddS mem newval)); effect(KILL cr); - format %{ "XADDS [$mem],$newval" %} + format %{ "XADDS [$mem],$newval\t# $newval -> short" %} ins_encode %{ __ lock(); __ xaddw($mem$$Address, $newval$$Register); + __ narrow_subword_type($newval$$Register, T_SHORT); %} ins_pipe( pipe_cmpxchg ); %} @@ -7463,18 +7465,20 @@ // Important to match to xRegI: only 8-bit regs. instruct xchgB( memory mem, xRegI newval) %{ match(Set newval (GetAndSetB mem newval)); - format %{ "XCHGB $newval,[$mem]" %} + format %{ "XCHGB $newval,[$mem]\t# $newval -> byte" %} ins_encode %{ __ xchgb($newval$$Register, $mem$$Address); + __ narrow_subword_type($newval$$Register, T_BYTE); %} ins_pipe( pipe_cmpxchg ); %} instruct xchgS( memory mem, rRegI newval) %{ match(Set newval (GetAndSetS mem newval)); - format %{ "XCHGW $newval,[$mem]" %} + format %{ "XCHGW $newval,[$mem]\t# $newval -> short" %} ins_encode %{ __ xchgw($newval$$Register, $mem$$Address); + __ narrow_subword_type($newval$$Register, T_SHORT); %} ins_pipe( pipe_cmpxchg ); %} diff -Nru openjdk-21-21.0.10+7/src/hotspot/cpu/x86/x86_64.ad openjdk-21-21.0.11+10/src/hotspot/cpu/x86/x86_64.ad --- openjdk-21-21.0.10+7/src/hotspot/cpu/x86/x86_64.ad 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/cpu/x86/x86_64.ad 2026-04-17 19:09:35.000000000 +0000 @@ -8340,10 +8340,11 @@ instruct xaddB( memory mem, rRegI newval, rFlagsReg cr) %{ match(Set newval (GetAndAddB mem newval)); effect(KILL cr); - format %{ "XADDB [$mem],$newval" %} + format %{ "XADDB [$mem],$newval\t# $newval -> byte" %} ins_encode %{ __ lock(); __ xaddb($mem$$Address, $newval$$Register); + __ narrow_subword_type($newval$$Register, T_BYTE); %} ins_pipe( pipe_cmpxchg ); %} @@ -8363,10 +8364,11 @@ instruct xaddS( memory mem, rRegI newval, rFlagsReg cr) %{ match(Set newval (GetAndAddS mem newval)); effect(KILL cr); - format %{ "XADDW [$mem],$newval" %} + format %{ "XADDW [$mem],$newval\t# $newval -> short" %} ins_encode %{ __ lock(); __ xaddw($mem$$Address, $newval$$Register); + __ narrow_subword_type($newval$$Register, T_SHORT); %} ins_pipe( pipe_cmpxchg ); %} @@ -8419,18 +8421,20 @@ instruct xchgB( memory mem, rRegI newval) %{ match(Set newval (GetAndSetB mem newval)); - format %{ "XCHGB $newval,[$mem]" %} + format %{ "XCHGB $newval,[$mem]\t# $newval -> byte" %} ins_encode %{ __ xchgb($newval$$Register, $mem$$Address); + __ narrow_subword_type($newval$$Register, T_BYTE); %} ins_pipe( pipe_cmpxchg ); %} instruct xchgS( memory mem, rRegI newval) %{ match(Set newval (GetAndSetS mem newval)); - format %{ "XCHGW $newval,[$mem]" %} + format %{ "XCHGW $newval,[$mem]\t# $newval -> short" %} ins_encode %{ __ xchgw($newval$$Register, $mem$$Address); + __ narrow_subword_type($newval$$Register, T_SHORT); %} ins_pipe( pipe_cmpxchg ); %} diff -Nru openjdk-21-21.0.10+7/src/hotspot/os/linux/cgroupSubsystem_linux.cpp openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupSubsystem_linux.cpp --- openjdk-21-21.0.10+7/src/hotspot/os/linux/cgroupSubsystem_linux.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupSubsystem_linux.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -297,6 +297,7 @@ } else { log_debug(os, container)("Can't read %s, %s", controllers_file, os::strerror(errno)); *flags = INVALID_CGROUPS_V2; + fclose(controllers); return false; } for (int i = 0; i < CG_INFO_LENGTH; i++) { @@ -357,7 +358,7 @@ all_required_controllers_enabled = all_required_controllers_enabled && cg_infos[i]._enabled; } if (log_is_enabled(Debug, os, container) && !cg_infos[i]._enabled) { - log_debug(os, container)("controller %s is not enabled\n", cg_controller_name[i]); + log_debug(os, container)("controller %s is not enabled", cg_controller_name[i]); } } } diff -Nru openjdk-21-21.0.10+7/src/hotspot/os/linux/cgroupSubsystem_linux.hpp openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupSubsystem_linux.hpp --- openjdk-21-21.0.10+7/src/hotspot/os/linux/cgroupSubsystem_linux.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupSubsystem_linux.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -102,6 +102,17 @@ log_trace(os, container)(log_string " is: %s", retval); \ } +#define CONTAINER_READ_NUMERICAL_KEY_VALUE_CHECKED(controller, filename, key, log_string, retval) \ +{ \ + bool is_ok; \ + is_ok = controller->read_numerical_key_value(filename, key, &retval); \ + if (!is_ok) { \ + log_trace(os, container)(log_string " failed: %d", OSCONTAINER_ERROR); \ + return OSCONTAINER_ERROR; \ + } \ + log_trace(os, container)(log_string " is: " JULONG_FORMAT, retval); \ +} + class CgroupController: public CHeapObj { protected: char* _cgroup_path; diff -Nru openjdk-21-21.0.10+7/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp --- openjdk-21-21.0.10+7/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -123,6 +123,12 @@ } } +jlong CgroupV1MemoryController::uses_mem_hierarchy() { + julong use_hierarchy; + CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.use_hierarchy", "Use Hierarchy", use_hierarchy); + return (jlong)use_hierarchy; +} + /* * The common case, containers, we have _root == _cgroup_path, and thus set the * controller path to the _mount_point. This is where the limits are exposed in @@ -159,13 +165,13 @@ jlong CgroupV1MemoryController::read_memory_limit_in_bytes(julong phys_mem) { julong memlimit; CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.limit_in_bytes", "Memory Limit", memlimit); - if (memlimit >= phys_mem) { - verbose_log(memlimit, phys_mem); - return (jlong)-1; - } else { - verbose_log(memlimit, phys_mem); - return (jlong)memlimit; + if (memlimit >= phys_mem && uses_mem_hierarchy()) { + CONTAINER_READ_NUMERICAL_KEY_VALUE_CHECKED(reader(), "/memory.stat", + "hierarchical_memory_limit", "Hierarchical Memory Limit", + memlimit); } + verbose_log(memlimit, phys_mem); + return (jlong)((memlimit < phys_mem) ? memlimit : -1); } /* read_mem_swap @@ -183,12 +189,13 @@ jlong CgroupV1MemoryController::read_mem_swap(julong host_total_memsw) { julong memswlimit; CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.memsw.limit_in_bytes", "Memory and Swap Limit", memswlimit); - if (memswlimit >= host_total_memsw) { - log_trace(os, container)("Memory and Swap Limit is: Unlimited"); - return (jlong)-1; - } else { - return (jlong)memswlimit; + if (memswlimit >= host_total_memsw && uses_mem_hierarchy()) { + CONTAINER_READ_NUMERICAL_KEY_VALUE_CHECKED(reader(), "/memory.stat", + "hierarchical_memsw_limit", "Hierarchical Memory and Swap Limit", + memswlimit); } + verbose_log(memswlimit, host_total_memsw); + return (jlong)((memswlimit < host_total_memsw) ? memswlimit : -1); } jlong CgroupV1MemoryController::memory_and_swap_limit_in_bytes(julong host_mem, julong host_swap) { diff -Nru openjdk-21-21.0.10+7/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp --- openjdk-21-21.0.10+7/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -98,6 +98,7 @@ const char* mount_point() override { return reader()->mount_point(); } const char* cgroup_path() override { return reader()->cgroup_path(); } private: + jlong uses_mem_hierarchy(); jlong read_mem_swappiness(); jlong read_mem_swap(julong host_total_memsw); diff -Nru openjdk-21-21.0.10+7/src/hotspot/os/linux/gc/x/xSyscall_linux.hpp openjdk-21-21.0.11+10/src/hotspot/os/linux/gc/x/xSyscall_linux.hpp --- openjdk-21-21.0.10+7/src/hotspot/os/linux/gc/x/xSyscall_linux.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/os/linux/gc/x/xSyscall_linux.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -35,6 +35,10 @@ #define MPOL_F_ADDR (1<<1) #endif +#ifndef MAP_FIXED_NOREPLACE +#define MAP_FIXED_NOREPLACE 0x100000 +#endif + class XSyscall : public AllStatic { public: static int memfd_create(const char* name, unsigned int flags); diff -Nru openjdk-21-21.0.10+7/src/hotspot/os/linux/gc/z/zSyscall_linux.hpp openjdk-21-21.0.11+10/src/hotspot/os/linux/gc/z/zSyscall_linux.hpp --- openjdk-21-21.0.10+7/src/hotspot/os/linux/gc/z/zSyscall_linux.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/os/linux/gc/z/zSyscall_linux.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -35,6 +35,10 @@ #define MPOL_F_ADDR (1<<1) #endif +#ifndef MAP_FIXED_NOREPLACE +#define MAP_FIXED_NOREPLACE 0x100000 +#endif + class ZSyscall : public AllStatic { public: static int memfd_create(const char* name, unsigned int flags); diff -Nru openjdk-21-21.0.10+7/src/hotspot/os/linux/os_linux.cpp openjdk-21-21.0.11+10/src/hotspot/os/linux/os_linux.cpp --- openjdk-21-21.0.10+7/src/hotspot/os/linux/os_linux.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/os/linux/os_linux.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -3550,8 +3550,23 @@ // may not start from the requested address. Unlike Linux mmap(), this // function returns null to indicate failure. static char* anon_mmap(char* requested_addr, size_t bytes) { - // MAP_FIXED is intentionally left out, to leave existing mappings intact. - const int flags = MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS; + // If a requested address was given: + // + // The POSIX-conforming way is to *omit* MAP_FIXED. This will leave existing mappings intact. + // If the requested mapping area is blocked by a pre-existing mapping, the kernel will map + // somewhere else. On Linux, that alternative address appears to have no relation to the + // requested address. + // Unfortunately, this is not what we need - if we requested a specific address, we'd want + // to map there and nowhere else. Therefore we will unmap the block again, which means we + // just executed a needless mmap->munmap cycle. + // Since Linux 4.17, the kernel offers MAP_FIXED_NOREPLACE. With this flag, if a pre- + // existing mapping exists, the kernel will not map at an alternative point but instead + // return an error. We can therefore save that unnecessary mmap-munmap cycle. + // + // Backward compatibility: Older kernels will ignore the unknown flag; so mmap will behave + // as in mode (a). + const int flags = MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS | + ((requested_addr != nullptr) ? MAP_FIXED_NOREPLACE : 0); // Map reserved/uncommitted pages PROT_NONE so we fail early if we // touch an uncommitted page. Otherwise, the read/write might @@ -4320,6 +4335,7 @@ if (addr != nullptr) { // mmap() is successful but it fails to reserve at the requested address + log_trace(os, map)("Kernel rejected " PTR_FORMAT ", offered " PTR_FORMAT ".", p2i(requested_addr), p2i(addr)); anon_munmap(addr, bytes); } diff -Nru openjdk-21-21.0.10+7/src/hotspot/os/posix/gc/x/xVirtualMemory_posix.cpp openjdk-21-21.0.11+10/src/hotspot/os/posix/gc/x/xVirtualMemory_posix.cpp --- openjdk-21-21.0.10+7/src/hotspot/os/posix/gc/x/xVirtualMemory_posix.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/os/posix/gc/x/xVirtualMemory_posix.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -25,6 +25,9 @@ #include "gc/x/xAddress.inline.hpp" #include "gc/x/xVirtualMemory.hpp" #include "logging/log.hpp" +#ifdef LINUX +#include "gc/x/xSyscall_linux.hpp" +#endif #include #include @@ -38,7 +41,9 @@ } bool XVirtualMemoryManager::pd_reserve(uintptr_t addr, size_t size) { - const uintptr_t res = (uintptr_t)mmap((void*)addr, size, PROT_NONE, MAP_ANONYMOUS|MAP_PRIVATE|MAP_NORESERVE, -1, 0); + const int flags = MAP_ANONYMOUS|MAP_PRIVATE|MAP_NORESERVE LINUX_ONLY(|MAP_FIXED_NOREPLACE); + + const uintptr_t res = (uintptr_t)mmap((void*)addr, size, PROT_NONE, flags, -1, 0); if (res == (uintptr_t)MAP_FAILED) { // Failed to reserve memory return false; diff -Nru openjdk-21-21.0.10+7/src/hotspot/os/posix/gc/z/zVirtualMemory_posix.cpp openjdk-21-21.0.11+10/src/hotspot/os/posix/gc/z/zVirtualMemory_posix.cpp --- openjdk-21-21.0.10+7/src/hotspot/os/posix/gc/z/zVirtualMemory_posix.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/os/posix/gc/z/zVirtualMemory_posix.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -25,6 +25,9 @@ #include "gc/z/zAddress.inline.hpp" #include "gc/z/zVirtualMemory.hpp" #include "logging/log.hpp" +#ifdef LINUX +#include "gc/z/zSyscall_linux.hpp" +#endif #include #include @@ -38,7 +41,9 @@ } bool ZVirtualMemoryManager::pd_reserve(zaddress_unsafe addr, size_t size) { - void* const res = mmap((void*)untype(addr), size, PROT_NONE, MAP_ANONYMOUS|MAP_PRIVATE|MAP_NORESERVE, -1, 0); + const int flags = MAP_ANONYMOUS|MAP_PRIVATE|MAP_NORESERVE LINUX_ONLY(|MAP_FIXED_NOREPLACE); + + void* const res = mmap((void*)untype(addr), size, PROT_NONE, flags, -1, 0); if (res == MAP_FAILED) { // Failed to reserve memory return false; diff -Nru openjdk-21-21.0.10+7/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.cpp openjdk-21-21.0.11+10/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.cpp --- openjdk-21-21.0.10+7/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, Microsoft Corporation. All rights reserved. - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/cds/archiveBuilder.cpp openjdk-21-21.0.11+10/src/hotspot/share/cds/archiveBuilder.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/cds/archiveBuilder.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/cds/archiveBuilder.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -1046,7 +1046,7 @@ // longs and doubles will be split into two words. unitsize = sizeof(narrowOop); } - os::print_hex_dump(&lsh, base, top, unitsize, 32, requested_base); + os::print_hex_dump(&lsh, base, top, unitsize, /* print_ascii=*/true, /* bytes_per_line=*/32, requested_base); } } diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/classfile/classLoader.cpp openjdk-21-21.0.11+10/src/hotspot/share/classfile/classLoader.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/classfile/classLoader.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/classfile/classLoader.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -749,6 +749,7 @@ #if INCLUDE_CDS ClassLoaderExt::set_has_non_jar_in_classpath(); #endif + log_info(class, path)("failed: %s, err: %s", path, error_msg); return nullptr; } log_info(class, path)("opened: %s", path); diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/classfile/resolutionErrors.cpp openjdk-21-21.0.11+10/src/hotspot/share/classfile/resolutionErrors.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/classfile/resolutionErrors.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/classfile/resolutionErrors.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -74,7 +74,7 @@ ResolutionErrorKey key(pool(), cp_index); ResolutionErrorEntry *entry = new ResolutionErrorEntry(error, message, cause, cause_msg); - _resolution_error_table->put(key, entry); + _resolution_error_table->put_when_absent(key, entry); } // create new nest host error entry @@ -86,7 +86,7 @@ ResolutionErrorKey key(pool(), cp_index); ResolutionErrorEntry *entry = new ResolutionErrorEntry(message); - _resolution_error_table->put(key, entry); + _resolution_error_table->put_when_absent(key, entry); } // find entry in the table @@ -127,6 +127,13 @@ } } +void ResolutionErrorEntry::set_nest_host_error(const char* message) { + assert(_nest_host_error == nullptr, "caller should have checked"); + assert_lock_strong(SystemDictionary_lock); + _nest_host_error = message; +} + + class ResolutionErrorDeleteIterate : StackObj { ConstantPool* p; diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/classfile/resolutionErrors.hpp openjdk-21-21.0.11+10/src/hotspot/share/classfile/resolutionErrors.hpp --- openjdk-21-21.0.10+7/src/hotspot/share/classfile/resolutionErrors.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/classfile/resolutionErrors.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -93,10 +93,7 @@ ~ResolutionErrorEntry(); // The incoming nest host error message is already in the C-Heap. - void set_nest_host_error(const char* message) { - _nest_host_error = message; - } - + void set_nest_host_error(const char* message); Symbol* error() const { return _error; } const char* message() const { return _message; } diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/classfile/systemDictionary.cpp openjdk-21-21.0.11+10/src/hotspot/share/classfile/systemDictionary.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/classfile/systemDictionary.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/classfile/systemDictionary.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -55,6 +55,7 @@ #include "memory/resourceArea.hpp" #include "memory/universe.hpp" #include "oops/access.inline.hpp" +#include "oops/constantPool.inline.hpp" #include "oops/instanceKlass.hpp" #include "oops/klass.inline.hpp" #include "oops/method.inline.hpp" @@ -1829,18 +1830,28 @@ void SystemDictionary::add_nest_host_error(const constantPoolHandle& pool, int which, - const char* message) { + const stringStream& message) { { MutexLocker ml(Thread::current(), SystemDictionary_lock); ResolutionErrorEntry* entry = ResolutionErrorTable::find_entry(pool, which); - if (entry != nullptr && entry->nest_host_error() == nullptr) { + if (entry == nullptr) { + // Only add a new entry to the resolution error table if one hasn't been found for this + // constant pool index. In this case resolution succeeded but there's an error in this nest host + // that we use the table to record. + assert(pool->resolved_klass_at(which) != nullptr, "klass should be resolved if there is no entry"); + ResolutionErrorTable::add_entry(pool, which, message.as_string(true /* on C-heap */)); + } else { // An existing entry means we had a true resolution failure (LinkageError) with our nest host, but we // still want to add the error message for the higher-level access checks to report. We should // only reach here under the same error condition, so we can ignore the potential race with setting - // the message. If we see it is already set then we can ignore it. - entry->set_nest_host_error(message); - } else { - ResolutionErrorTable::add_entry(pool, which, message); + // the message. + const char* nhe = entry->nest_host_error(); + if (nhe == nullptr) { + entry->set_nest_host_error(message.as_string(true /* on C-heap */)); + } else { + DEBUG_ONLY(const char* msg = message.base();) + assert(strcmp(nhe, msg) == 0, "New message %s, differs from original %s", msg, nhe); + } } } } diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/classfile/systemDictionary.hpp openjdk-21-21.0.11+10/src/hotspot/share/classfile/systemDictionary.hpp --- openjdk-21-21.0.10+7/src/hotspot/share/classfile/systemDictionary.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/classfile/systemDictionary.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -282,7 +282,7 @@ // Record a nest host resolution/validation error static void add_nest_host_error(const constantPoolHandle& pool, int which, - const char* message); + const stringStream& message); static const char* find_nest_host_error(const constantPoolHandle& pool, int which); protected: diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/code/codeBlob.cpp openjdk-21-21.0.11+10/src/hotspot/share/code/codeBlob.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/code/codeBlob.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/code/codeBlob.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -672,6 +672,7 @@ nm->print_nmethod(true); } else { nm->print(st); + nm->print_code_snippet(st, addr); } return; } diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/code/nmethod.cpp openjdk-21-21.0.11+10/src/hotspot/share/code/nmethod.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/code/nmethod.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/code/nmethod.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -3385,6 +3385,46 @@ } #endif +void nmethod::print_code_snippet(outputStream* st, address addr) const { + if (entry_point() <= addr && addr < code_end()) { + // Pointing into the nmethod's code. Try to disassemble some instructions around addr. + // Determine conservative start and end points. + address start; + if (frame_complete_offset() != CodeOffsets::frame_never_safe && + addr >= code_begin() + frame_complete_offset()) { + start = code_begin() + frame_complete_offset(); + } else { + start = (addr < verified_entry_point()) ? entry_point() : verified_entry_point(); + } + address start_for_hex_dump = start; // We can choose a different starting point for hex dump, below. + address end = code_end(); + + // Try using relocations to find closer instruction start and end points. + // (Some platforms have variable length instructions and can only + // disassemble correctly at instruction start addresses.) + RelocIterator iter((nmethod*)this, start); + while (iter.next() && iter.addr() < addr) { // find relocation before addr + // Note: There's a relocation which doesn't point to an instruction start: + // ZBarrierRelocationFormatStoreGoodAfterMov with ZGC on x86_64 + // We could detect and skip it, but hex dump is still usable when + // disassembler produces garbage in such a very rare case. + start = iter.addr(); + // We want at least 64 Bytes ahead in hex dump. + if (iter.addr() <= (addr - 64)) start_for_hex_dump = iter.addr(); + } + if (iter.has_current()) { + if (iter.addr() == addr) iter.next(); // find relocation after addr + if (iter.has_current()) end = iter.addr(); + } + + // Always print hex. Disassembler may still have problems when hitting an incorrect instruction start. + os::print_hex_dump(st, start_for_hex_dump, end, 1, /* print_ascii=*/false); + if (!Disassembler::is_abstract()) { + Disassembler::decode(start, end, st); + } + } +} + #ifndef PRODUCT void nmethod::print_calls(outputStream* st) { diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/code/nmethod.hpp openjdk-21-21.0.11+10/src/hotspot/share/code/nmethod.hpp --- openjdk-21-21.0.10+7/src/hotspot/share/code/nmethod.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/code/nmethod.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -623,6 +623,7 @@ void print() const; void print(outputStream* st) const; void print_code(); + void print_code_snippet(outputStream* st, address addr) const; #if defined(SUPPORT_DATA_STRUCTS) // print output in opt build for disassembler library diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/gc/g1/g1Arguments.cpp openjdk-21-21.0.11+10/src/hotspot/share/gc/g1/g1Arguments.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/gc/g1/g1Arguments.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/gc/g1/g1Arguments.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -69,6 +69,9 @@ } size_t G1Arguments::conservative_max_heap_alignment() { + if (FLAG_IS_DEFAULT(G1HeapRegionSize)) { + return HeapRegion::max_ergonomics_size(); + } return HeapRegion::max_region_size(); } diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/gc/g1/g1CollectedHeap.cpp openjdk-21-21.0.11+10/src/hotspot/share/gc/g1/g1CollectedHeap.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/gc/g1/g1CollectedHeap.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/gc/g1/g1CollectedHeap.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -386,22 +386,26 @@ assert_heap_not_locked_and_not_at_safepoint(); assert(!is_humongous(requested_size), "we do not allow humongous TLABs"); - return attempt_allocation(min_size, requested_size, actual_size); + // Do not allow a GC because we are allocating a new TLAB to avoid an issue + // with UseGCOverheadLimit: although this GC would return null if the overhead + // limit would be exceeded, but it would likely free at least some space. + // So the subsequent outside-TLAB allocation could be successful anyway and + // the indication that the overhead limit had been exceeded swallowed. + return attempt_allocation(min_size, requested_size, actual_size, false /* allow_gc */); } -HeapWord* -G1CollectedHeap::mem_allocate(size_t word_size, - bool* gc_overhead_limit_was_exceeded) { +HeapWord* G1CollectedHeap::mem_allocate(size_t word_size, + bool* gc_overhead_limit_was_exceeded) { assert_heap_not_locked_and_not_at_safepoint(); if (is_humongous(word_size)) { return attempt_allocation_humongous(word_size); } size_t dummy = 0; - return attempt_allocation(word_size, word_size, &dummy); + return attempt_allocation(word_size, word_size, &dummy, true /* allow_gc */); } -HeapWord* G1CollectedHeap::attempt_allocation_slow(uint node_index, size_t word_size) { +HeapWord* G1CollectedHeap::attempt_allocation_slow(uint node_index, size_t word_size, bool allow_gc) { ResourceMark rm; // For retrieving the thread names in log messages. // Make sure you read the note in attempt_allocation_humongous(). @@ -430,6 +434,8 @@ result = _allocator->attempt_allocation_locked(node_index, word_size); if (result != nullptr) { return result; + } else if (!allow_gc) { + return nullptr; } // If the GCLocker is active and we are bound for a GC, try expanding young gen. @@ -631,7 +637,8 @@ inline HeapWord* G1CollectedHeap::attempt_allocation(size_t min_word_size, size_t desired_word_size, - size_t* actual_word_size) { + size_t* actual_word_size, + bool allow_gc) { assert_heap_not_locked_and_not_at_safepoint(); assert(!is_humongous(desired_word_size), "attempt_allocation() should not " "be called for humongous allocation requests"); @@ -643,7 +650,7 @@ if (result == nullptr) { *actual_word_size = desired_word_size; - result = attempt_allocation_slow(node_index, desired_word_size); + result = attempt_allocation_slow(node_index, desired_word_size, allow_gc); } assert_heap_not_locked(); diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/gc/g1/g1CollectedHeap.hpp openjdk-21-21.0.11+10/src/hotspot/share/gc/g1/g1CollectedHeap.hpp --- openjdk-21-21.0.10+7/src/hotspot/share/gc/g1/g1CollectedHeap.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/gc/g1/g1CollectedHeap.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -423,18 +423,14 @@ // // * If either call cannot satisfy the allocation request using the // current allocating region, they will try to get a new one. If - // this fails, they will attempt to do an evacuation pause and - // retry the allocation. - // - // * If all allocation attempts fail, even after trying to schedule - // an evacuation pause, allocate_new_tlab() will return null, - // whereas mem_allocate() will attempt a heap expansion and/or - // schedule a Full GC. + // this fails, (only) mem_allocate() will attempt to do an evacuation + // pause and retry the allocation. Allocate_new_tlab() will return null, + // deferring to the following mem_allocate(). // // * We do not allow humongous-sized TLABs. So, allocate_new_tlab // should never be called with word_size being humongous. All // humongous allocation requests should go to mem_allocate() which - // will satisfy them with a special path. + // will satisfy them in a special path. HeapWord* allocate_new_tlab(size_t min_size, size_t requested_size, @@ -448,12 +444,13 @@ // should only be used for non-humongous allocations. inline HeapWord* attempt_allocation(size_t min_word_size, size_t desired_word_size, - size_t* actual_word_size); - + size_t* actual_word_size, + bool allow_gc); // Second-level mutator allocation attempt: take the Heap_lock and // retry the allocation attempt, potentially scheduling a GC - // pause. This should only be used for non-humongous allocations. - HeapWord* attempt_allocation_slow(uint node_index, size_t word_size); + // pause if allow_gc is set. This should only be used for non-humongous + // allocations. + HeapWord* attempt_allocation_slow(uint node_index, size_t word_size, bool allow_gc); // Takes the Heap_lock and attempts a humongous allocation. It can // potentially schedule a GC pause. diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/gc/g1/heapRegion.cpp openjdk-21-21.0.11+10/src/hotspot/share/gc/g1/heapRegion.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/gc/g1/heapRegion.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/gc/g1/heapRegion.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -57,6 +57,10 @@ return HeapRegionBounds::max_size(); } +size_t HeapRegion::max_ergonomics_size() { + return HeapRegionBounds::max_ergonomics_size(); +} + size_t HeapRegion::min_region_size_in_words() { return HeapRegionBounds::min_size() >> LogHeapWordSize; } diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/gc/g1/heapRegion.hpp openjdk-21-21.0.11+10/src/hotspot/share/gc/g1/heapRegion.hpp --- openjdk-21-21.0.10+7/src/hotspot/share/gc/g1/heapRegion.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/gc/g1/heapRegion.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -321,6 +321,7 @@ } static size_t max_region_size(); + static size_t max_ergonomics_size(); static size_t min_region_size_in_words(); // It sets up the heap region size (GrainBytes / GrainWords), as well as diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/gc/shared/stringdedup/stringDedupStat.cpp openjdk-21-21.0.11+10/src/hotspot/share/gc/shared/stringdedup/stringDedupStat.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/gc/shared/stringdedup/stringDedupStat.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/gc/shared/stringdedup/stringDedupStat.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -101,13 +101,17 @@ log_info(stringdedup)( "Concurrent String Deduplication " - "%zu/" STRDEDUP_BYTES_FORMAT_NS " (new), " + "%zu (inspected), " + "%zu/" STRDEDUP_BYTES_FORMAT_NS " (new unknown), " "%zu/" STRDEDUP_BYTES_FORMAT_NS " (deduped), " - "avg " STRDEDUP_PERCENT_FORMAT_NS ", " + "total avg deduped/new unknown bytes " STRDEDUP_PERCENT_FORMAT_NS ", " + STRDEDUP_BYTES_FORMAT_NS " (total deduped)," STRDEDUP_BYTES_FORMAT_NS " (total new unknown), " STRDEDUP_ELAPSED_FORMAT_MS " of " STRDEDUP_ELAPSED_FORMAT_MS, + last_stat->_inspected, last_stat->_new, STRDEDUP_BYTES_PARAM(last_stat->_new_bytes), last_stat->_deduped, STRDEDUP_BYTES_PARAM(last_stat->_deduped_bytes), total_deduped_bytes_percent, + STRDEDUP_BYTES_PARAM(total_stat->_deduped_bytes), STRDEDUP_BYTES_PARAM(total_stat->_new_bytes), strdedup_elapsed_param_ms(last_stat->_process_elapsed), strdedup_elapsed_param_ms(last_stat->_active_elapsed)); } @@ -218,14 +222,14 @@ double replaced_percent = percent_of(_replaced, _new); double deleted_percent = percent_of(_deleted, _new); log_times(total ? "Total" : "Last"); - log_debug(stringdedup)(" Inspected: %12zu", _inspected); - log_debug(stringdedup)(" Known: %12zu(%5.1f%%)", _known, known_percent); - log_debug(stringdedup)(" Shared: %12zu(%5.1f%%)", _known_shared, known_shared_percent); - log_debug(stringdedup)(" New: %12zu(%5.1f%%)" STRDEDUP_BYTES_FORMAT, + log_debug(stringdedup)(" Inspected: %12zu", _inspected); + log_debug(stringdedup)(" Known: %12zu(%5.1f%%)", _known, known_percent); + log_debug(stringdedup)(" Shared: %12zu(%5.1f%%)", _known_shared, known_shared_percent); + log_debug(stringdedup)(" New unknown: %12zu(%5.1f%%)" STRDEDUP_BYTES_FORMAT, _new, new_percent, STRDEDUP_BYTES_PARAM(_new_bytes)); - log_debug(stringdedup)(" Replaced: %12zu(%5.1f%%)", _replaced, replaced_percent); - log_debug(stringdedup)(" Deleted: %12zu(%5.1f%%)", _deleted, deleted_percent); - log_debug(stringdedup)(" Deduplicated: %12zu(%5.1f%%)" STRDEDUP_BYTES_FORMAT "(%5.1f%%)", + log_debug(stringdedup)(" Replaced: %12zu(%5.1f%%)", _replaced, replaced_percent); + log_debug(stringdedup)(" Deleted: %12zu(%5.1f%%)", _deleted, deleted_percent); + log_debug(stringdedup)(" Deduplicated: %12zu(%5.1f%%)" STRDEDUP_BYTES_FORMAT "(%5.1f%%)", _deduped, deduped_percent, STRDEDUP_BYTES_PARAM(_deduped_bytes), deduped_bytes_percent); log_debug(stringdedup)(" Skipped: %zu (dead), %zu (incomplete), %zu (shared)", _skipped_dead, _skipped_incomplete, _skipped_shared); diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/oops/instanceKlass.cpp openjdk-21-21.0.11+10/src/hotspot/share/oops/instanceKlass.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/oops/instanceKlass.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/oops/instanceKlass.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -290,12 +290,11 @@ ss.print("Nest host resolution of %s with host %s failed: ", this->external_name(), target_host_class); java_lang_Throwable::print(PENDING_EXCEPTION, &ss); - const char* msg = ss.as_string(true /* on C-heap */); constantPoolHandle cph(THREAD, constants()); - SystemDictionary::add_nest_host_error(cph, _nest_host_index, msg); + SystemDictionary::add_nest_host_error(cph, _nest_host_index, ss); CLEAR_PENDING_EXCEPTION; - log_trace(class, nestmates)("%s", msg); + log_trace(class, nestmates)("%s", ss.base()); } else { // A valid nest-host is an instance class in the current package that lists this // class as a nest member. If any of these conditions are not met the class is @@ -334,10 +333,9 @@ k->external_name(), k->class_loader_data()->loader_name_and_id(), error); - const char* msg = ss.as_string(true /* on C-heap */); constantPoolHandle cph(THREAD, constants()); - SystemDictionary::add_nest_host_error(cph, _nest_host_index, msg); - log_trace(class, nestmates)("%s", msg); + SystemDictionary::add_nest_host_error(cph, _nest_host_index, ss); + log_trace(class, nestmates)("%s", ss.base()); } } } else { diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/opto/addnode.cpp openjdk-21-21.0.11+10/src/hotspot/share/opto/addnode.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/opto/addnode.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/opto/addnode.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -1342,8 +1342,10 @@ Node* x = add2->in(1); Node* con2 = add2->in(2); if (is_sub_con(con2)) { + // The graph could be dying (i.e. x is top) in which case type(x) is not a long. + const TypeLong* x_long = phase->type(x)->isa_long(); // Collapsed graph not equivalent if potential over/underflow -> bailing out (*) - if (can_overflow(phase->type(x)->is_long(), con1->get_long() + con2->get_long())) { + if (x_long == nullptr || can_overflow(x_long, con1->get_long() + con2->get_long())) { return nullptr; } Node* new_con = phase->transform(new AddLNode(con1, con2)); diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/opto/bytecodeInfo.cpp openjdk-21-21.0.11+10/src/hotspot/share/opto/bytecodeInfo.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/opto/bytecodeInfo.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/opto/bytecodeInfo.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -61,6 +61,7 @@ // Keep a private copy of the caller_jvms: _caller_jvms = new (C) JVMState(caller_jvms->method(), caller_tree->caller_jvms()); _caller_jvms->set_bci(caller_jvms->bci()); + _caller_jvms->set_receiver_info(caller_jvms->receiver_info()); assert(!caller_jvms->should_reexecute(), "there should be no reexecute bytecode with inlining"); assert(_caller_jvms->same_calls_as(caller_jvms), "consistent JVMS"); } @@ -440,24 +441,26 @@ // detect direct and indirect recursive inlining { - // count the current method and the callee const bool is_compiled_lambda_form = callee_method->is_compiled_lambda_form(); - int inline_level = 0; - if (!is_compiled_lambda_form) { - if (method() == callee_method) { - inline_level++; - } + const bool is_method_handle_invoker = is_compiled_lambda_form && !jvms->method()->is_compiled_lambda_form(); + + ciInstance* lform_callee_recv = nullptr; + if (is_compiled_lambda_form && !is_method_handle_invoker) { // MH invokers don't have a receiver + lform_callee_recv = jvms->compute_receiver_info(callee_method); } - // count callers of current method and callee - Node* callee_argument0 = is_compiled_lambda_form ? jvms->map()->argument(jvms, 0)->uncast() : nullptr; - for (JVMState* j = jvms->caller(); j != nullptr && j->has_method(); j = j->caller()) { + + int inline_level = 0; + for (JVMState* j = jvms; j != nullptr && j->has_method(); j = j->caller()) { if (j->method() == callee_method) { - if (is_compiled_lambda_form) { - // Since compiled lambda forms are heavily reused we allow recursive inlining. If it is truly - // a recursion (using the same "receiver") we limit inlining otherwise we can easily blow the - // compiler stack. - Node* caller_argument0 = j->map()->argument(j, 0)->uncast(); - if (caller_argument0 == callee_argument0) { + // Since compiled lambda forms are heavily reused we allow recursive inlining. If it is truly + // a recursion (using the same "receiver") we limit inlining otherwise we can easily blow the + // compiler stack. + if (lform_callee_recv != nullptr) { + ciInstance* lform_caller_recv = j->receiver_info(); + assert(lform_caller_recv != nullptr || j->depth() == 1 || + !j->caller()->method()->is_compiled_lambda_form(), // MH invoker + "missing receiver info"); + if (lform_caller_recv == lform_callee_recv || lform_caller_recv == nullptr) { inline_level++; } } else { diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/opto/callnode.cpp openjdk-21-21.0.11+10/src/hotspot/share/opto/callnode.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/opto/callnode.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/opto/callnode.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -263,7 +263,8 @@ //============================================================================= JVMState::JVMState(ciMethod* method, JVMState* caller) : - _method(method) { + _method(method), + _receiver_info(nullptr) { assert(method != nullptr, "must be valid call site"); _bci = InvocationEntryBci; _reexecute = Reexecute_Undefined; @@ -279,7 +280,8 @@ _sp = 0; } JVMState::JVMState(int stack_size) : - _method(nullptr) { + _method(nullptr), + _receiver_info(nullptr) { _bci = InvocationEntryBci; _reexecute = Reexecute_Undefined; debug_only(_map = (SafePointNode*)-1); @@ -614,6 +616,7 @@ n->set_endoff(_endoff); n->set_sp(_sp); n->set_map(_map); + n->set_receiver_info(_receiver_info); return n; } @@ -688,6 +691,20 @@ return size + Deoptimization::last_frame_adjust(0, callee_locals) * BytesPerWord; } +// Compute receiver info for a compiled lambda form at call site. +ciInstance* JVMState::compute_receiver_info(ciMethod* callee) const { + assert(callee != nullptr && callee->is_compiled_lambda_form(), ""); + if (has_method() && method()->is_compiled_lambda_form()) { // callee is not a MH invoker + Node* recv = map()->argument(this, 0); + assert(recv != nullptr, ""); + const TypeOopPtr* recv_toop = recv->bottom_type()->isa_oopptr(); + if (recv_toop != nullptr && recv_toop->const_oop() != nullptr) { + return recv_toop->const_oop()->as_instance(); + } + } + return nullptr; +} + //============================================================================= bool CallNode::cmp( const Node &n ) const { return _tf == ((CallNode&)n)._tf && _jvms == ((CallNode&)n)._jvms; } @@ -1262,7 +1279,7 @@ //============================================================================= -void SafePointNode::set_local(JVMState* jvms, uint idx, Node *c) { +void SafePointNode::set_local(const JVMState* jvms, uint idx, Node *c) { assert(verify_jvms(jvms), "jvms must match"); int loc = jvms->locoff() + idx; if (in(loc)->is_top() && idx > 0 && !c->is_top() ) { diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/opto/callnode.hpp openjdk-21-21.0.11+10/src/hotspot/share/opto/callnode.hpp --- openjdk-21-21.0.10+7/src/hotspot/share/opto/callnode.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/opto/callnode.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -207,6 +207,7 @@ int _bci; // Byte Code Index of this JVM point ReexecuteState _reexecute; // Whether this bytecode need to be re-executed ciMethod* _method; // Method Pointer + ciInstance* _receiver_info; // Constant receiver instance for compiled lambda forms SafePointNode* _map; // Map node associated with this scope public: friend class Compile; @@ -249,6 +250,7 @@ bool is_reexecute_undefined() const { return _reexecute==Reexecute_Undefined; } bool has_method() const { return _method != nullptr; } ciMethod* method() const { assert(has_method(), ""); return _method; } + ciInstance* receiver_info() const { assert(has_method(), ""); return _receiver_info; } JVMState* caller() const { return _caller; } SafePointNode* map() const { return _map; } uint depth() const { return _depth; } @@ -294,6 +296,7 @@ // _reexecute is initialized to "undefined" for a new bci void set_bci(int bci) {if(_bci != bci)_reexecute=Reexecute_Undefined; _bci = bci; } void set_should_reexecute(bool reexec) {_reexecute = reexec ? Reexecute_True : Reexecute_False;} + void set_receiver_info(ciInstance* recv) { assert(has_method() || recv == nullptr, ""); _receiver_info = recv; } // Miscellaneous utility functions JVMState* clone_deep(Compile* C) const; // recursively clones caller chain @@ -301,6 +304,7 @@ void set_map_deep(SafePointNode *map);// reset map for all callers void adapt_position(int delta); // Adapt offsets in in-array after adding an edge. int interpreter_frame_size() const; + ciInstance* compute_receiver_info(ciMethod* callee) const; #ifndef PRODUCT void print_method_with_lineno(outputStream* st, bool show_name) const; @@ -364,7 +368,7 @@ } private: - void verify_input(JVMState* jvms, uint idx) const { + void verify_input(const JVMState* jvms, uint idx) const { assert(verify_jvms(jvms), "jvms must match"); Node* n = in(idx); assert((!n->bottom_type()->isa_long() && !n->bottom_type()->isa_double()) || @@ -373,34 +377,44 @@ public: // Functionality from old debug nodes which has changed - Node *local(JVMState* jvms, uint idx) const { - verify_input(jvms, jvms->locoff() + idx); - return in(jvms->locoff() + idx); - } - Node *stack(JVMState* jvms, uint idx) const { - verify_input(jvms, jvms->stkoff() + idx); - return in(jvms->stkoff() + idx); - } - Node *argument(JVMState* jvms, uint idx) const { - verify_input(jvms, jvms->argoff() + idx); + Node* local(const JVMState* jvms, uint idx) const { + uint loc_idx = jvms->locoff() + idx; + assert(jvms->is_loc(loc_idx), "not a local slot"); + verify_input(jvms, loc_idx); + return in(loc_idx); + } + Node* stack(const JVMState* jvms, uint idx) const { + uint stk_idx = jvms->stkoff() + idx; + assert(jvms->is_stk(stk_idx), "not a stack slot"); + verify_input(jvms, stk_idx); + return in(stk_idx); + } + Node* argument(const JVMState* jvms, uint idx) const { + uint arg_idx = jvms->argoff() + idx; + assert(jvms->is_stk(arg_idx), "not an argument slot"); + verify_input(jvms, arg_idx); return in(jvms->argoff() + idx); } - Node *monitor_box(JVMState* jvms, uint idx) const { + Node* monitor_box(const JVMState* jvms, uint idx) const { assert(verify_jvms(jvms), "jvms must match"); - return in(jvms->monitor_box_offset(idx)); + uint mon_box_idx = jvms->monitor_box_offset(idx); + assert(jvms->is_monitor_box(mon_box_idx), "not a monitor box offset"); + return in(mon_box_idx); } - Node *monitor_obj(JVMState* jvms, uint idx) const { + Node* monitor_obj(const JVMState* jvms, uint idx) const { assert(verify_jvms(jvms), "jvms must match"); - return in(jvms->monitor_obj_offset(idx)); + uint mon_obj_idx = jvms->monitor_obj_offset(idx); + assert(jvms->is_mon(mon_obj_idx) && !jvms->is_monitor_box(mon_obj_idx), "not a monitor obj offset"); + return in(mon_obj_idx); } - void set_local(JVMState* jvms, uint idx, Node *c); + void set_local(const JVMState* jvms, uint idx, Node *c); - void set_stack(JVMState* jvms, uint idx, Node *c) { + void set_stack(const JVMState* jvms, uint idx, Node *c) { assert(verify_jvms(jvms), "jvms must match"); set_req(jvms->stkoff() + idx, c); } - void set_argument(JVMState* jvms, uint idx, Node *c) { + void set_argument(const JVMState* jvms, uint idx, Node *c) { assert(verify_jvms(jvms), "jvms must match"); set_req(jvms->argoff() + idx, c); } diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/opto/compile.cpp openjdk-21-21.0.11+10/src/hotspot/share/opto/compile.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/opto/compile.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/opto/compile.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -833,18 +833,8 @@ if (failing()) return; NOT_PRODUCT( verify_graph_edges(); ) - // If any phase is randomized for stress testing, seed random number - // generation and log the seed for repeatability. if (StressLCM || StressGCM || StressIGVN || StressCCP || StressIncrementalInlining) { - if (FLAG_IS_DEFAULT(StressSeed) || (FLAG_IS_ERGO(StressSeed) && directive->RepeatCompilationOption)) { - _stress_seed = static_cast(Ticks::now().nanoseconds()); - FLAG_SET_ERGO(StressSeed, _stress_seed); - } else { - _stress_seed = StressSeed; - } - if (_log != nullptr) { - _log->elem("stress_test seed='%u'", _stress_seed); - } + initialize_stress_seed(directive); } // Now optimize @@ -965,6 +955,11 @@ _igvn_worklist = new (comp_arena()) Unique_Node_List(comp_arena()); _types = new (comp_arena()) Type_Array(comp_arena()); _node_hash = new (comp_arena()) NodeHash(comp_arena(), 255); + + if (StressLCM || StressGCM) { + initialize_stress_seed(directive); + } + { PhaseGVN gvn; set_initial_gvn(&gvn); // not significant, but GraphKit guys use it pervasively @@ -5011,6 +5006,18 @@ // Auxiliary methods to support randomized stressing/fuzzing. +void Compile::initialize_stress_seed(const DirectiveSet* directive) { + if (FLAG_IS_DEFAULT(StressSeed) || (FLAG_IS_ERGO(StressSeed) && directive->RepeatCompilationOption)) { + _stress_seed = static_cast(Ticks::now().nanoseconds()); + FLAG_SET_ERGO(StressSeed, _stress_seed); + } else { + _stress_seed = StressSeed; + } + if (_log != nullptr) { + _log->elem("stress_test seed='%u'", _stress_seed); + } +} + int Compile::random() { _stress_seed = os::next_random(_stress_seed); return static_cast(_stress_seed); diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/opto/compile.hpp openjdk-21-21.0.11+10/src/hotspot/share/opto/compile.hpp --- openjdk-21-21.0.10+7/src/hotspot/share/opto/compile.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/opto/compile.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -1232,6 +1232,9 @@ int random(); bool randomized_select(int count); + // seed random number generation and log the seed for repeatability. + void initialize_stress_seed(const DirectiveSet* directive); + // supporting clone_map CloneMap& clone_map(); void set_clone_map(Dict* d); diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/opto/parse1.cpp openjdk-21-21.0.11+10/src/hotspot/share/opto/parse1.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/opto/parse1.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/opto/parse1.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -1170,6 +1170,13 @@ // Create an initial safepoint to hold JVM state during parsing JVMState* jvms = new (C) JVMState(method(), _caller->has_method() ? _caller : nullptr); set_map(new SafePointNode(len, jvms)); + + // Capture receiver info for compiled lambda forms. + if (method()->is_compiled_lambda_form()) { + ciInstance* recv_info = _caller->compute_receiver_info(method()); + jvms->set_receiver_info(recv_info); + } + jvms->set_map(map()); record_for_igvn(map()); assert(jvms->endoff() == len, "correct jvms sizing"); diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/prims/jvmtiEventController.cpp openjdk-21-21.0.11+10/src/hotspot/share/prims/jvmtiEventController.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/prims/jvmtiEventController.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/prims/jvmtiEventController.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -778,9 +778,6 @@ assert(Threads::number_of_threads() == 0 || JvmtiThreadState_lock->is_locked(), "sanity check"); EC_TRACE(("[*] # set event callbacks")); - // May be changing the event handler for ObjectFree. - flush_object_free_events(env); - env->set_event_callbacks(callbacks, size_of_callbacks); jlong enabled_bits = env->env_event_enable()->_event_callback_enabled.get_bits(); @@ -1081,6 +1078,8 @@ // call the functionality without holding the JvmtiThreadState_lock. JvmtiEventControllerPrivate::set_event_callbacks(env, callbacks, size_of_callbacks); } else { + JvmtiEventControllerPrivate::flush_object_free_events(env); + MutexLocker mu(JvmtiThreadState_lock); JvmtiEventControllerPrivate::set_event_callbacks(env, callbacks, size_of_callbacks); } @@ -1162,6 +1161,8 @@ // call the functionality without holding the JvmtiThreadState_lock. JvmtiEventControllerPrivate::env_dispose(env); } else { + JvmtiEventControllerPrivate::flush_object_free_events(env); + MutexLocker mu(JvmtiThreadState_lock); JvmtiEventControllerPrivate::env_dispose(env); } diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/runtime/os.cpp openjdk-21-21.0.11+10/src/hotspot/share/runtime/os.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/runtime/os.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/runtime/os.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -930,56 +930,73 @@ return have_function_name || have_library_name; } -ATTRIBUTE_NO_ASAN static bool read_safely_from(intptr_t* p, intptr_t* result) { - const intptr_t errval = 0x1717; - intptr_t i = SafeFetchN(p, errval); +ATTRIBUTE_NO_ASAN static bool read_safely_from(const uintptr_t* p, uintptr_t* result) { + DEBUG_ONLY(*result = 0xAAAA;) + const uintptr_t errval = 0x1717; + uintptr_t i = (uintptr_t)SafeFetchN((intptr_t*)p, errval); if (i == errval) { - i = SafeFetchN(p, ~errval); + i = (uintptr_t)SafeFetchN((intptr_t*)p, ~errval); if (i == ~errval) { return false; } } - (*result) = i; + (*result) = (uintptr_t)i; return true; } -static void print_hex_location(outputStream* st, address p, int unitsize) { +// Helper for os::print_hex_dump +static void print_ascii_form(stringStream& ascii_form, uint64_t value, int unitsize) { + union { + uint64_t v; + uint8_t c[sizeof(v)]; + } u = { value }; + for (int i = 0; i < unitsize; i++) { + const int idx = LITTLE_ENDIAN_ONLY(i) BIG_ENDIAN_ONLY(sizeof(u.v) - unitsize + i); + const uint8_t c = u.c[idx]; + ascii_form.put(isprint(c) && isascii(c) ? c : '.'); + } +} + +// Helper for os::print_hex_dump +static void print_hex_location(outputStream* st, const_address p, int unitsize, stringStream& ascii_form) { assert(is_aligned(p, unitsize), "Unaligned"); - address pa = align_down(p, sizeof(intptr_t)); + const uintptr_t* pa = (const uintptr_t*) align_down(p, sizeof(intptr_t)); #ifndef _LP64 // Special handling for printing qwords on 32-bit platforms if (unitsize == 8) { - intptr_t i1, i2; - if (read_safely_from((intptr_t*)pa, &i1) && - read_safely_from((intptr_t*)pa + 1, &i2)) { + uintptr_t i1 = 0, i2 = 0; + if (read_safely_from(pa, &i1) && + read_safely_from(pa + 1, &i2)) { const uint64_t value = LITTLE_ENDIAN_ONLY((((uint64_t)i2) << 32) | i1) BIG_ENDIAN_ONLY((((uint64_t)i1) << 32) | i2); st->print("%016" FORMAT64_MODIFIER "x", value); + print_ascii_form(ascii_form, value, unitsize); } else { st->print_raw("????????????????"); } return; } #endif // 32-bit, qwords - intptr_t i = 0; - if (read_safely_from((intptr_t*)pa, &i)) { + uintptr_t i = 0; + if (read_safely_from(pa, &i)) { // bytes: CA FE BA BE DE AD C0 DE // bytoff: 0 1 2 3 4 5 6 7 // LE bits: 0 8 16 24 32 40 48 56 // BE bits: 56 48 40 32 24 16 8 0 - const int offset = (int)(p - (address)pa); + const int offset = (int)(p - (const_address)pa); const int bitoffset = LITTLE_ENDIAN_ONLY(offset * BitsPerByte) BIG_ENDIAN_ONLY((int)((sizeof(intptr_t) - unitsize - offset) * BitsPerByte)); const int bitfieldsize = unitsize * BitsPerByte; - intptr_t value = bitfield(i, bitoffset, bitfieldsize); + uintptr_t value = bitfield(i, bitoffset, bitfieldsize); switch (unitsize) { case 1: st->print("%02x", (u1)value); break; case 2: st->print("%04x", (u2)value); break; case 4: st->print("%08x", (u4)value); break; case 8: st->print("%016" FORMAT64_MODIFIER "x", (u8)value); break; } + print_ascii_form(ascii_form, value, unitsize); } else { switch (unitsize) { case 1: st->print_raw("??"); break; @@ -990,36 +1007,56 @@ } } -void os::print_hex_dump(outputStream* st, address start, address end, int unitsize, - int bytes_per_line, address logical_start) { +void os::print_hex_dump(outputStream* st, const_address start, const_address end, int unitsize, + bool print_ascii, int bytes_per_line, const_address logical_start) { + constexpr int max_bytes_per_line = 64; assert(unitsize == 1 || unitsize == 2 || unitsize == 4 || unitsize == 8, "just checking"); + assert(bytes_per_line > 0 && bytes_per_line <= max_bytes_per_line && + is_power_of_2(bytes_per_line), "invalid bytes_per_line"); start = align_down(start, unitsize); logical_start = align_down(logical_start, unitsize); bytes_per_line = align_up(bytes_per_line, 8); int cols = 0; - int cols_per_line = bytes_per_line / unitsize; + const int cols_per_line = bytes_per_line / unitsize; - address p = start; - address logical_p = logical_start; + const_address p = start; + const_address logical_p = logical_start; + + stringStream ascii_form; // Print out the addresses as if we were starting from logical_start. - st->print(PTR_FORMAT ": ", p2i(logical_p)); while (p < end) { - print_hex_location(st, p, unitsize); + if (cols == 0) { + st->print(PTR_FORMAT ": ", p2i(logical_p)); + } + print_hex_location(st, p, unitsize, ascii_form); p += unitsize; logical_p += unitsize; cols++; - if (cols >= cols_per_line && p < end) { - cols = 0; + if (cols >= cols_per_line) { + if (print_ascii && !ascii_form.is_empty()) { + st->print(" %s", ascii_form.base()); + } + ascii_form.reset(); st->cr(); - st->print(PTR_FORMAT ": ", p2i(logical_p)); + cols = 0; } else { st->print(" "); } } - st->cr(); + + if (cols > 0) { // did not print a full line + if (print_ascii) { + // indent last ascii part to match that of full lines + const int size_of_printed_unit = unitsize * 2; + const int space_left = (cols_per_line - cols) * (size_of_printed_unit + 1); + st->sp(space_left); + st->print(" %s", ascii_form.base()); + } + st->cr(); + } } void os::print_dhm(outputStream* st, const char* startStr, long sec) { @@ -1057,7 +1094,7 @@ void os::print_instructions(outputStream* st, address pc, int unitsize) { st->print_cr("Instructions: (pc=" PTR_FORMAT ")", p2i(pc)); - print_hex_dump(st, pc - 256, pc + 256, unitsize); + print_hex_dump(st, pc - 256, pc + 256, unitsize, /* print_ascii=*/false); } void os::print_environment_variables(outputStream* st, const char** env_list) { diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/runtime/os.hpp openjdk-21-21.0.11+10/src/hotspot/share/runtime/os.hpp --- openjdk-21-21.0.10+7/src/hotspot/share/runtime/os.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/runtime/os.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -842,10 +842,10 @@ // return current frame. pc() and sp() are set to null on failure. static frame current_frame(); - static void print_hex_dump(outputStream* st, address start, address end, int unitsize, - int bytes_per_line, address logical_start); - static void print_hex_dump(outputStream* st, address start, address end, int unitsize) { - print_hex_dump(st, start, end, unitsize, /*bytes_per_line=*/16, /*logical_start=*/start); + static void print_hex_dump(outputStream* st, const_address start, const_address end, int unitsize, bool print_ascii, + int bytes_per_line, const_address logical_start); + static void print_hex_dump(outputStream* st, const_address start, const_address end, int unitsize, bool print_ascii = true) { + print_hex_dump(st, start, end, unitsize, print_ascii, /*bytes_per_line=*/16, /*logical_start=*/start); } // returns a string to describe the exception/signal; diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/utilities/globalDefinitions.hpp openjdk-21-21.0.11+10/src/hotspot/share/utilities/globalDefinitions.hpp --- openjdk-21-21.0.10+7/src/hotspot/share/utilities/globalDefinitions.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/utilities/globalDefinitions.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -473,6 +473,8 @@ inline address_word castable_address(address x) { return address_word(x) ; } inline address_word castable_address(void* x) { return address_word(x) ; } +typedef const u_char* const_address; + // Pointer subtraction. // The idea here is to avoid ptrdiff_t, which is signed and so doesn't have // the range we might need to find differences from one end of the heap diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/utilities/ostream.hpp openjdk-21-21.0.11+10/src/hotspot/share/utilities/ostream.hpp --- openjdk-21-21.0.10+7/src/hotspot/share/utilities/ostream.hpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/utilities/ostream.hpp 2026-04-17 19:09:35.000000000 +0000 @@ -226,6 +226,7 @@ return _buffer; }; void reset(); + bool is_empty() const { return _buffer[0] == '\0'; } // Copy to a resource, or C-heap, array as requested char* as_string(bool c_heap = false) const; }; diff -Nru openjdk-21-21.0.10+7/src/hotspot/share/utilities/vmError.cpp openjdk-21-21.0.11+10/src/hotspot/share/utilities/vmError.cpp --- openjdk-21-21.0.10+7/src/hotspot/share/utilities/vmError.cpp 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/hotspot/share/utilities/vmError.cpp 2026-04-17 19:09:35.000000000 +0000 @@ -484,6 +484,10 @@ static void print_oom_reasons(outputStream* st) { st->print_cr("# Possible reasons:"); st->print_cr("# The system is out of physical RAM or swap space"); +#ifdef LINUX + st->print_cr("# This process has exceeded the maximum number of memory mappings (check below"); + st->print_cr("# for `/proc/sys/vm/max_map_count` and `Total number of mappings`)"); +#endif if (UseCompressedOops) { st->print_cr("# This process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap"); } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/com/sun/crypto/provider/PBES1Core.java openjdk-21-21.0.11+10/src/java.base/share/classes/com/sun/crypto/provider/PBES1Core.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/com/sun/crypto/provider/PBES1Core.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/com/sun/crypto/provider/PBES1Core.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,7 +48,38 @@ private int blkSize; private String algo = null; private byte[] salt = null; - private int iCount = 10; + // RFC 8018 and NIST SP 800-132 sec 5.2 recommend 1000 as the minimum + private int iCount = PKCS12PBECipherCore.DEFAULT_COUNT; + + // utility method for checking weak salts of PBEWithMD5AndTripleDES cipher + private static boolean isWeak(byte[] s) { + // consider salts weak if it met both of the following conditions: + // 1) s[0...3] == s[4...7] + // 2) s[0] == s[3] && s[1] == s[2] + if (Arrays.equals(s, 0, 4, s, 4, 8)) { + return (s[0] == s[3]) && (s[1] == s[2]); + } + return false; + } + + // utility method for generating 8-byte salts + private static byte[] generateSalt(String algo, SecureRandom sr) { + byte[] salt = new byte[8]; + sr.nextBytes(salt); + // check and re-generate for DESede if necessary + if (algo.equals("DESede")) { + // prevent an infinite-loop in case of a rigged SecureRandom + int numAttempts = 50; + while (isWeak(salt)) { + sr.nextBytes(salt); + if (numAttempts-- < 0) { + throw new ProviderException( + "Unable to find salts after 50 attempts"); + } + } + } + return salt; + } /** * Creates an instance of PBE Cipher using the specified CipherSpi @@ -164,8 +195,7 @@ AlgorithmParameters getParameters() { AlgorithmParameters params = null; if (salt == null) { - salt = new byte[8]; - SunJCE.getRandom().nextBytes(salt); + salt = generateSalt(algo, SunJCE.getRandom()); } PBEParameterSpec pbeSpec = new PBEParameterSpec(salt, iCount); try { @@ -228,8 +258,7 @@ if (params == null) { // create random salt and use default iteration count - salt = new byte[8]; - random.nextBytes(salt); + salt = generateSalt(algo, random); } else { if (!(params instanceof PBEParameterSpec)) { throw new InvalidAlgorithmParameterException @@ -241,6 +270,15 @@ throw new InvalidAlgorithmParameterException ("Salt must be 8 bytes long"); } + // for DESede, reject weak salts for encryption + if (algo.equals("DESede") && + (opmode == Cipher.ENCRYPT_MODE || + opmode == Cipher.WRAP_MODE) && + isWeak(salt)) { + throw new InvalidAlgorithmParameterException( + "Weak salts cannot be used for encryption"); + } + iCount = ((PBEParameterSpec) params).getIterationCount(); if (iCount <= 0) { throw new InvalidAlgorithmParameterException diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/com/sun/crypto/provider/PKCS12PBECipherCore.java openjdk-21-21.0.11+10/src/java.base/share/classes/com/sun/crypto/provider/PKCS12PBECipherCore.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/com/sun/crypto/provider/PKCS12PBECipherCore.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/com/sun/crypto/provider/PKCS12PBECipherCore.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -53,7 +53,7 @@ private int iCount = 0; private static final int DEFAULT_SALT_LENGTH = 20; - private static final int DEFAULT_COUNT = 1024; + static final int DEFAULT_COUNT = 1024; static final int CIPHER_KEY = 1; static final int CIPHER_IV = 2; diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/com/sun/crypto/provider/RSACipherAdaptor.java openjdk-21-21.0.11+10/src/java.base/share/classes/com/sun/crypto/provider/RSACipherAdaptor.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/com/sun/crypto/provider/RSACipherAdaptor.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/com/sun/crypto/provider/RSACipherAdaptor.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.crypto.provider; + +import java.io.ByteArrayOutputStream; +import java.security.MessageDigest; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.SecureRandom; +import java.security.SignatureSpi; +import java.security.InvalidKeyException; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidParameterException; +import java.security.SignatureException; +import java.security.spec.AlgorithmParameterSpec; +import javax.crypto.Cipher; +import javax.crypto.BadPaddingException; +import javax.crypto.IllegalBlockSizeException; + +/** + * NONEwithRSA Signature implementation using the RSA/ECB/PKCS1Padding Cipher + * implementation from SunJCE. + */ +public final class RSACipherAdaptor extends SignatureSpi { + + private final RSACipher c; + private ByteArrayOutputStream verifyBuf; + + public RSACipherAdaptor() { + c = new RSACipher(); + } + + @Override + protected void engineInitVerify(PublicKey publicKey) + throws InvalidKeyException { + c.engineInit(Cipher.DECRYPT_MODE, publicKey, null); + if (verifyBuf == null) { + verifyBuf = new ByteArrayOutputStream(128); + } else { + verifyBuf.reset(); + } + } + + @Override + protected void engineInitSign(PrivateKey privateKey) + throws InvalidKeyException { + c.engineInit(Cipher.ENCRYPT_MODE, privateKey, null); + verifyBuf = null; + } + + @Override + protected void engineInitSign(PrivateKey privateKey, SecureRandom random) + throws InvalidKeyException { + c.engineInit(Cipher.ENCRYPT_MODE, privateKey, random); + verifyBuf = null; + } + + @Override + protected void engineUpdate(byte b) throws SignatureException { + engineUpdate(new byte[] {b}, 0, 1); + } + + @Override + protected void engineUpdate(byte[] b, int off, int len) + throws SignatureException { + if (verifyBuf != null) { + verifyBuf.write(b, off, len); + } else { + byte[] out = c.engineUpdate(b, off, len); + if ((out != null) && (out.length != 0)) { + throw new SignatureException + ("Cipher unexpectedly returned data"); + } + } + } + + @Override + protected byte[] engineSign() throws SignatureException { + try { + return c.engineDoFinal(null, 0, 0); + } catch (IllegalBlockSizeException | BadPaddingException e) { + throw new SignatureException("doFinal() failed", e); + } + } + + @Override + protected boolean engineVerify(byte[] sigBytes) throws SignatureException { + try { + byte[] out = c.engineDoFinal(sigBytes, 0, sigBytes.length); + byte[] data = verifyBuf.toByteArray(); + verifyBuf.reset(); + return MessageDigest.isEqual(out, data); + } catch (BadPaddingException e) { + // e.g. wrong public key used + // return false rather than throwing exception + return false; + } catch (IllegalBlockSizeException e) { + throw new SignatureException("doFinal() failed", e); + } + } + + @Override + protected void engineSetParameter(AlgorithmParameterSpec params) + throws InvalidAlgorithmParameterException { + if (params != null) { + throw new InvalidParameterException("Parameters not supported"); + } + } + + @Override + @SuppressWarnings("deprecation") + protected void engineSetParameter(String param, Object value) + throws InvalidParameterException { + throw new InvalidParameterException("Parameters not supported"); + } + + @Override + @SuppressWarnings("deprecation") + protected Object engineGetParameter(String param) + throws InvalidParameterException { + throw new InvalidParameterException("Parameters not supported"); + } +} diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/com/sun/crypto/provider/SunJCE.java openjdk-21-21.0.11+10/src/java.base/share/classes/com/sun/crypto/provider/SunJCE.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/com/sun/crypto/provider/SunJCE.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/com/sun/crypto/provider/SunJCE.java 2026-04-17 19:09:35.000000000 +0000 @@ -147,6 +147,12 @@ void putEntries() { // reuse attribute map and reset before each reuse HashMap attrs = new HashMap<>(3); + attrs.put("SupportedKeyClasses", + "java.security.interfaces.RSAPublicKey" + + "|java.security.interfaces.RSAPrivateKey"); + ps("Signature", "NONEwithRSA", + "com.sun.crypto.provider.RSACipherAdaptor", null, attrs); + // continue adding cipher specific attributes attrs.put("SupportedModes", "ECB"); attrs.put("SupportedPaddings", "NOPADDING|PKCS1PADDING|OAEPPADDING" + "|OAEPWITHMD5ANDMGF1PADDING" @@ -158,9 +164,6 @@ + "|OAEPWITHSHA-512ANDMGF1PADDING" + "|OAEPWITHSHA-512/224ANDMGF1PADDING" + "|OAEPWITHSHA-512/256ANDMGF1PADDING"); - attrs.put("SupportedKeyClasses", - "java.security.interfaces.RSAPublicKey" + - "|java.security.interfaces.RSAPrivateKey"); ps("Cipher", "RSA", "com.sun.crypto.provider.RSACipher", null, attrs); diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/java/io/Console.java openjdk-21-21.0.11+10/src/java.base/share/classes/java/io/Console.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/java/io/Console.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/java/io/Console.java 2026-04-17 19:09:35.000000000 +0000 @@ -25,6 +25,7 @@ package java.io; +import java.lang.annotation.Native; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.*; @@ -349,11 +350,17 @@ "Console class itself does not provide implementation"); } + @Native static final int TTY_STDIN_MASK = 0x00000001; + @Native static final int TTY_STDOUT_MASK = 0x00000002; + @Native static final int TTY_STDERR_MASK = 0x00000004; + // ttyStatus() returns bit patterns above, a bit is set if the corresponding file + // descriptor is a character device + private static final int ttyStatus = ttyStatus(); private static native String encoding(); static final Charset CHARSET; static { Charset cs = null; - boolean istty = istty(); + boolean istty = isStdinTty() && isStdoutTty(); if (istty) { String csname = encoding(); @@ -378,6 +385,9 @@ public Console console() { return cons; } + public boolean isStdinTty() { + return Console.isStdinTty(); + } }); } @@ -419,5 +429,14 @@ } private static final Console cons; - private static native boolean istty(); + private static boolean isStdinTty() { + return (ttyStatus & TTY_STDIN_MASK) != 0; + } + private static boolean isStdoutTty() { + return (ttyStatus & TTY_STDOUT_MASK) != 0; + } + private static boolean isStderrTty() { + return (ttyStatus & TTY_STDERR_MASK) != 0; + } + private static native int ttyStatus(); } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/java/lang/AbstractStringBuilder.java openjdk-21-21.0.11+10/src/java.base/share/classes/java/lang/AbstractStringBuilder.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/java/lang/AbstractStringBuilder.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/java/lang/AbstractStringBuilder.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -356,8 +356,12 @@ */ @Override public char charAt(int index) { + byte coder = this.coder; + byte[] value = this.value; + // Ensure count is less than or equal to capacity (racy reads and writes can produce inconsistent values) + int count = Math.min(this.count, value.length >> coder); checkIndex(index, count); - if (isLatin1()) { + if (coder == LATIN1) { return (char)(value[index] & 0xff); } return StringUTF16.getChar(value, index); @@ -416,6 +420,7 @@ * of this sequence. */ public int codePointBefore(int index) { + byte[] value = this.value; int i = index - 1; checkIndex(i, count); if (isLatin1()) { @@ -1720,7 +1725,7 @@ } else { inflate(); // store c to make sure it has a UTF16 char - StringUTF16.putChar(this.value, j++, c); + StringUTF16.putCharSB(this.value, j++, c); i++; StringUTF16.putCharsSB(this.value, j, s, i, end); return; @@ -1810,7 +1815,7 @@ count = j; inflate(); // Store c to make sure sb has a UTF16 char - StringUTF16.putChar(this.value, j++, c); + StringUTF16.putCharSB(this.value, j++, c); count = j; i++; StringUTF16.putCharsSB(this.value, j, s, i, end); diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/java/lang/System.java openjdk-21-21.0.11+10/src/java.base/share/classes/java/lang/System.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/java/lang/System.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/java/lang/System.java 2026-04-17 19:09:35.000000000 +0000 @@ -287,10 +287,11 @@ private static volatile Console cons; /** - * Returns the unique {@link java.io.Console Console} object associated + * Returns the unique {@link Console Console} object associated * with the current Java virtual machine, if any. * * @return The system console, if any, otherwise {@code null}. + * @see Console * * @since 1.6 */ diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/java/security/KeyStore.java openjdk-21-21.0.11+10/src/java.base/share/classes/java/security/KeyStore.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/java/security/KeyStore.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/java/security/KeyStore.java 2026-04-17 19:09:35.000000000 +0000 @@ -37,6 +37,7 @@ import javax.security.auth.callback.*; import sun.security.util.Debug; +import sun.security.util.CryptoAlgorithmConstraints; /** * This class represents a storage facility for cryptographic @@ -842,7 +843,7 @@ * The JDK Reference Implementation additionally uses the * {@code jdk.security.provider.preferred} * {@link Security#getProperty(String) Security} property to determine - * the preferred provider order for the specified algorithm. This + * the preferred provider order for the specified keystore type. This * may be different from the order of providers returned by * {@link Security#getProviders() Security.getProviders()}. * @@ -866,6 +867,11 @@ throws KeyStoreException { Objects.requireNonNull(type, "null type name"); + + if (!CryptoAlgorithmConstraints.permits("KEYSTORE", type)) { + throw new KeyStoreException(type + " is disabled"); + } + try { Object[] objs = Security.getImpl(type, "KeyStore", (String)null); return new KeyStore((KeyStoreSpi)objs[0], (Provider)objs[1], type); @@ -913,8 +919,15 @@ throws KeyStoreException, NoSuchProviderException { Objects.requireNonNull(type, "null type name"); - if (provider == null || provider.isEmpty()) + + if (provider == null || provider.isEmpty()) { throw new IllegalArgumentException("missing provider"); + } + + if (!CryptoAlgorithmConstraints.permits("KEYSTORE", type)) { + throw new KeyStoreException(type + " is disabled"); + } + try { Object[] objs = Security.getImpl(type, "KeyStore", provider); return new KeyStore((KeyStoreSpi)objs[0], (Provider)objs[1], type); @@ -958,8 +971,15 @@ throws KeyStoreException { Objects.requireNonNull(type, "null type name"); - if (provider == null) + + if (provider == null) { throw new IllegalArgumentException("missing provider"); + } + + if (!CryptoAlgorithmConstraints.permits("KEYSTORE", type)) { + throw new KeyStoreException(type + " is disabled"); + } + try { Object[] objs = Security.getImpl(type, "KeyStore", provider); return new KeyStore((KeyStoreSpi)objs[0], (Provider)objs[1], type); @@ -1802,8 +1822,12 @@ kdebug.println(s.getAlgorithm() + " keystore detected: " + file); } - keystore = new KeyStore(impl, p, s.getAlgorithm()); - break; + String ksAlgo = s.getAlgorithm(); + if (CryptoAlgorithmConstraints.permits( + "KEYSTORE", ksAlgo)) { + keystore = new KeyStore(impl, p, ksAlgo); + break; + } } } catch (NoSuchAlgorithmException e) { // ignore diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/java/security/MessageDigest.java openjdk-21-21.0.11+10/src/java.base/share/classes/java/security/MessageDigest.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/java/security/MessageDigest.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/java/security/MessageDigest.java 2026-04-17 19:09:35.000000000 +0000 @@ -33,6 +33,7 @@ import sun.security.jca.GetInstance; import sun.security.util.Debug; import sun.security.util.MessageDigestSpi2; +import sun.security.util.CryptoAlgorithmConstraints; import javax.crypto.SecretKey; @@ -180,10 +181,14 @@ throws NoSuchAlgorithmException { Objects.requireNonNull(algorithm, "null algorithm name"); - MessageDigest md; + + if (!CryptoAlgorithmConstraints.permits("MessageDigest", algorithm)) { + throw new NoSuchAlgorithmException(algorithm + " is disabled"); + } GetInstance.Instance instance = GetInstance.getInstance("MessageDigest", MessageDigestSpi.class, algorithm); + MessageDigest md; if (instance.impl instanceof MessageDigest messageDigest) { md = messageDigest; md.provider = instance.provider; @@ -241,12 +246,18 @@ throws NoSuchAlgorithmException, NoSuchProviderException { Objects.requireNonNull(algorithm, "null algorithm name"); - if (provider == null || provider.isEmpty()) + + if (provider == null || provider.isEmpty()) { throw new IllegalArgumentException("missing provider"); + } + + if (!CryptoAlgorithmConstraints.permits("MessageDigest", algorithm)) { + throw new NoSuchAlgorithmException(algorithm + " is disabled"); + } - MessageDigest md; GetInstance.Instance instance = GetInstance.getInstance("MessageDigest", MessageDigestSpi.class, algorithm, provider); + MessageDigest md; if (instance.impl instanceof MessageDigest messageDigest) { md = messageDigest; md.provider = instance.provider; @@ -295,8 +306,15 @@ throws NoSuchAlgorithmException { Objects.requireNonNull(algorithm, "null algorithm name"); - if (provider == null) + + if (provider == null) { throw new IllegalArgumentException("missing provider"); + } + + if (!CryptoAlgorithmConstraints.permits("MessageDigest", algorithm)) { + throw new NoSuchAlgorithmException(algorithm + " is disabled"); + } + Object[] objs = Security.getImpl(algorithm, "MessageDigest", provider); if (objs[0] instanceof MessageDigest md) { md.provider = (Provider)objs[1]; diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/java/security/Signature.java openjdk-21-21.0.11+10/src/java.base/share/classes/java/security/Signature.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/java/security/Signature.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/java/security/Signature.java 2026-04-17 19:09:35.000000000 +0000 @@ -36,14 +36,12 @@ import java.security.Provider.Service; -import javax.crypto.Cipher; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.BadPaddingException; -import javax.crypto.NoSuchPaddingException; import jdk.internal.access.JavaSecuritySignatureAccess; import jdk.internal.access.SharedSecrets; import sun.security.util.Debug; +import sun.security.util.CryptoAlgorithmConstraints; + import sun.security.jca.*; import sun.security.jca.GetInstance.Instance; import sun.security.util.KnownOIDs; @@ -203,20 +201,6 @@ this.algorithm = algorithm; } - // name of the special signature alg - private static final String RSA_SIGNATURE = "NONEwithRSA"; - - // name of the equivalent cipher alg - private static final String RSA_CIPHER = "RSA/ECB/PKCS1Padding"; - - // all the services we need to lookup for compatibility with Cipher - private static final List rsaIds = List.of( - new ServiceId("Signature", "NONEwithRSA"), - new ServiceId("Cipher", "RSA/ECB/PKCS1Padding"), - new ServiceId("Cipher", "RSA/ECB"), - new ServiceId("Cipher", "RSA//PKCS1Padding"), - new ServiceId("Cipher", "RSA")); - /** * Returns a {@code Signature} object that implements the specified * signature algorithm. @@ -231,12 +215,22 @@ * the {@link Security#getProviders() Security.getProviders()} method. * * @implNote - * The JDK Reference Implementation additionally uses the - * {@code jdk.security.provider.preferred} + * The JDK Reference Implementation additionally uses the following + * security properties: + *
    + *
  • the {@code jdk.security.provider.preferred} * {@link Security#getProperty(String) Security} property to determine * the preferred provider order for the specified algorithm. This * may be different from the order of providers returned by * {@link Security#getProviders() Security.getProviders()}. + *
  • + *
  • the {@code jdk.crypto.disabledAlgorithms} + * {@link Security#getProperty(String) Security} property to determine + * if the specified algorithm is allowed. If the + * {@systemProperty jdk.crypto.disabledAlgorithms} is set, it supersedes + * the security property value. + *
  • + *
* * @param algorithm the standard name of the algorithm requested. * See the Signature section in the list; - if (algorithm.equalsIgnoreCase(RSA_SIGNATURE)) { - list = GetInstance.getServices(rsaIds); - } else { - list = GetInstance.getServices("Signature", algorithm); + + if (!CryptoAlgorithmConstraints.permits("Signature", algorithm)) { + throw new NoSuchAlgorithmException(algorithm + " is disabled"); } + + List list = GetInstance.getServices("Signature", algorithm); Iterator t = list.iterator(); if (!t.hasNext()) { throw new NoSuchAlgorithmException @@ -319,10 +313,6 @@ } private static boolean isSpi(Service s) { - if (s.getType().equals("Cipher")) { - // must be a CipherSpi, which we can wrap with the CipherAdapter - return true; - } String className = s.getClassName(); Boolean result = signatureInfo.get(className); if (result == null) { @@ -387,18 +377,11 @@ public static Signature getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException { Objects.requireNonNull(algorithm, "null algorithm name"); - if (algorithm.equalsIgnoreCase(RSA_SIGNATURE)) { - // exception compatibility with existing code - if (provider == null || provider.isEmpty()) { - throw new IllegalArgumentException("missing provider"); - } - Provider p = Security.getProvider(provider); - if (p == null) { - throw new NoSuchProviderException - ("no such provider: " + provider); - } - return getInstanceRSA(p); + + if (!CryptoAlgorithmConstraints.permits("Signature", algorithm)) { + throw new NoSuchAlgorithmException(algorithm + " is disabled"); } + Instance instance = GetInstance.getInstance ("Signature", SignatureSpi.class, algorithm, provider); return getInstance(instance, algorithm); @@ -438,40 +421,16 @@ public static Signature getInstance(String algorithm, Provider provider) throws NoSuchAlgorithmException { Objects.requireNonNull(algorithm, "null algorithm name"); - if (algorithm.equalsIgnoreCase(RSA_SIGNATURE)) { - // exception compatibility with existing code - if (provider == null) { - throw new IllegalArgumentException("missing provider"); - } - return getInstanceRSA(provider); + + if (!CryptoAlgorithmConstraints.permits("Signature", algorithm)) { + throw new NoSuchAlgorithmException(algorithm + " is disabled"); } + Instance instance = GetInstance.getInstance ("Signature", SignatureSpi.class, algorithm, provider); return getInstance(instance, algorithm); } - // return an implementation for NONEwithRSA, which is a special case - // because of the Cipher.RSA/ECB/PKCS1Padding compatibility wrapper - private static Signature getInstanceRSA(Provider p) - throws NoSuchAlgorithmException { - // try Signature first - Service s = p.getService("Signature", RSA_SIGNATURE); - if (s != null) { - Instance instance = GetInstance.getInstance(s, SignatureSpi.class); - return getInstance(instance, RSA_SIGNATURE); - } - // check Cipher - try { - Cipher c = Cipher.getInstance(RSA_CIPHER, p); - return Delegate.of(new CipherAdapter(c), RSA_SIGNATURE); - } catch (GeneralSecurityException e) { - // throw Signature style exception message to avoid confusion, - // but append Cipher exception as cause - throw new NoSuchAlgorithmException("no such algorithm: " - + RSA_SIGNATURE + " for provider " + p.getName(), e); - } - } - /** * Returns the provider of this {@code Signature} object. * @@ -1167,22 +1126,12 @@ private static SignatureSpi newInstance(Service s) throws NoSuchAlgorithmException { - if (s.getType().equals("Cipher")) { - // must be NONEwithRSA - try { - Cipher c = Cipher.getInstance(RSA_CIPHER, s.getProvider()); - return new CipherAdapter(c); - } catch (NoSuchPaddingException e) { - throw new NoSuchAlgorithmException(e); - } - } else { - Object o = s.newInstance(null); - if (!(o instanceof SignatureSpi)) { - throw new NoSuchAlgorithmException - ("Not a SignatureSpi: " + o.getClass().getName()); - } - return (SignatureSpi)o; + Object o = s.newInstance(null); + if (!(o instanceof SignatureSpi)) { + throw new NoSuchAlgorithmException + ("Not a SignatureSpi: " + o.getClass().getName()); } + return (SignatureSpi)o; } // max number of debug warnings to print from chooseFirstProvider() @@ -1459,92 +1408,4 @@ return sigSpi.engineGetParameters(); } } - - // adapter for RSA/ECB/PKCS1Padding ciphers - @SuppressWarnings("deprecation") - private static class CipherAdapter extends SignatureSpi { - - private final Cipher cipher; - - private ByteArrayOutputStream data; - - CipherAdapter(Cipher cipher) { - this.cipher = cipher; - } - - protected void engineInitVerify(PublicKey publicKey) - throws InvalidKeyException { - cipher.init(Cipher.DECRYPT_MODE, publicKey); - if (data == null) { - data = new ByteArrayOutputStream(128); - } else { - data.reset(); - } - } - - protected void engineInitSign(PrivateKey privateKey) - throws InvalidKeyException { - cipher.init(Cipher.ENCRYPT_MODE, privateKey); - data = null; - } - - protected void engineInitSign(PrivateKey privateKey, - SecureRandom random) throws InvalidKeyException { - cipher.init(Cipher.ENCRYPT_MODE, privateKey, random); - data = null; - } - - protected void engineUpdate(byte b) throws SignatureException { - engineUpdate(new byte[] {b}, 0, 1); - } - - protected void engineUpdate(byte[] b, int off, int len) - throws SignatureException { - if (data != null) { - data.write(b, off, len); - return; - } - byte[] out = cipher.update(b, off, len); - if ((out != null) && (out.length != 0)) { - throw new SignatureException - ("Cipher unexpectedly returned data"); - } - } - - protected byte[] engineSign() throws SignatureException { - try { - return cipher.doFinal(); - } catch (IllegalBlockSizeException | BadPaddingException e) { - throw new SignatureException("doFinal() failed", e); - } - } - - protected boolean engineVerify(byte[] sigBytes) - throws SignatureException { - try { - byte[] out = cipher.doFinal(sigBytes); - byte[] dataBytes = data.toByteArray(); - data.reset(); - return MessageDigest.isEqual(out, dataBytes); - } catch (BadPaddingException e) { - // e.g. wrong public key used - // return false rather than throwing exception - return false; - } catch (IllegalBlockSizeException e) { - throw new SignatureException("doFinal() failed", e); - } - } - - protected void engineSetParameter(String param, Object value) - throws InvalidParameterException { - throw new InvalidParameterException("Parameters not supported"); - } - - protected Object engineGetParameter(String param) - throws InvalidParameterException { - throw new InvalidParameterException("Parameters not supported"); - } - - } - } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/java/time/ZoneOffset.java openjdk-21-21.0.11+10/src/java.base/share/classes/java/time/ZoneOffset.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/java/time/ZoneOffset.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/java/time/ZoneOffset.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -424,11 +424,17 @@ throw new DateTimeException("Zone offset not in valid range: -18:00 to +18:00"); } if (totalSeconds % (15 * SECONDS_PER_MINUTE) == 0) { - return SECONDS_CACHE.computeIfAbsent(totalSeconds, totalSecs -> { - ZoneOffset result = new ZoneOffset(totalSecs); + Integer totalSecs = totalSeconds; + ZoneOffset result = SECONDS_CACHE.get(totalSecs); + if (result == null) { + result = new ZoneOffset(totalSeconds); + var existing = SECONDS_CACHE.putIfAbsent(totalSecs, result); + if (existing != null) { + result = existing; + } ID_CACHE.putIfAbsent(result.getId(), result); - return result; - }); + } + return result; } else { return new ZoneOffset(totalSeconds); } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/java/time/format/DateTimeTextProvider.java openjdk-21-21.0.11+10/src/java.base/share/classes/java/time/format/DateTimeTextProvider.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/java/time/format/DateTimeTextProvider.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/java/time/format/DateTimeTextProvider.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -309,7 +309,15 @@ private Object findStore(TemporalField field, Locale locale) { Entry key = createEntry(field, locale); - return CACHE.computeIfAbsent(key, e -> createStore(e.getKey(), e.getValue())); + Object store = CACHE.get(key); + if (store == null) { + store = createStore(field, locale); + var existing = CACHE.putIfAbsent(key, store); + if (existing != null) { + store = existing; + } + } + return store; } private static int toWeekDay(int calWeekDay) { diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/java/time/format/DecimalStyle.java openjdk-21-21.0.11+10/src/java.base/share/classes/java/time/format/DecimalStyle.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/java/time/format/DecimalStyle.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/java/time/format/DecimalStyle.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -160,7 +160,15 @@ */ public static DecimalStyle of(Locale locale) { Objects.requireNonNull(locale, "locale"); - return CACHE.computeIfAbsent(locale, DecimalStyle::create); + DecimalStyle info = CACHE.get(locale); + if (info == null) { + info = create(locale); + var existing = CACHE.putIfAbsent(locale, info); + if (existing != null) { + info = existing; + } + } + return info; } private static DecimalStyle create(Locale locale) { diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/javax/crypto/Cipher.java openjdk-21-21.0.11+10/src/java.base/share/classes/javax/crypto/Cipher.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/javax/crypto/Cipher.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/javax/crypto/Cipher.java 2026-04-17 19:09:35.000000000 +0000 @@ -30,7 +30,6 @@ import java.util.concurrent.ConcurrentMap; import java.util.regex.*; - import java.security.*; import java.security.Provider.Service; import java.security.spec.AlgorithmParameterSpec; @@ -46,6 +45,7 @@ import sun.security.util.Debug; import sun.security.jca.*; import sun.security.util.KnownOIDs; +import sun.security.util.CryptoAlgorithmConstraints; /** * This class provides the functionality of a cryptographic cipher for @@ -310,19 +310,23 @@ private static final String SHA512TRUNCATED = "SHA512/2"; + // Parse the specified cipher transformation for algorithm and the + // optional mode and padding. If the transformation contains only + // algorithm, then only algorithm is returned. Otherwise, the + // transformation must contain all 3 and they must be non-empty. private static String[] tokenizeTransformation(String transformation) throws NoSuchAlgorithmException { if (transformation == null) { throw new NoSuchAlgorithmException("No transformation given"); } + /* - * array containing the components of a cipher transformation: + * Components of a cipher transformation: * - * index 0: algorithm component (e.g., AES) - * index 1: feedback component (e.g., CFB) - * index 2: padding component (e.g., PKCS5Padding) + * 1) algorithm component (e.g., AES) + * 2) feedback component (e.g., CFB) - optional + * 3) padding component (e.g., PKCS5Padding) - optional */ - String[] parts = { "", "", "" }; // check if the transformation contains algorithms with "/" in their // name which can cause the parsing logic to go wrong @@ -331,27 +335,35 @@ int startIdx = (sha512Idx == -1 ? 0 : sha512Idx + SHA512TRUNCATED.length()); int endIdx = transformation.indexOf('/', startIdx); - if (endIdx == -1) { - // algorithm - parts[0] = transformation.trim(); + + boolean algorithmOnly = (endIdx == -1); + String algo = (algorithmOnly ? transformation.trim() : + transformation.substring(0, endIdx).trim()); + if (algo.isEmpty()) { + throw new NoSuchAlgorithmException("Invalid transformation: " + + "algorithm not specified-" + + transformation); + } + if (algorithmOnly) { // done + return new String[] { algo }; } else { - // algorithm/mode/padding - parts[0] = transformation.substring(0, endIdx).trim(); + // continue parsing mode and padding startIdx = endIdx+1; endIdx = transformation.indexOf('/', startIdx); if (endIdx == -1) { throw new NoSuchAlgorithmException("Invalid transformation" + " format:" + transformation); } - parts[1] = transformation.substring(startIdx, endIdx).trim(); - parts[2] = transformation.substring(endIdx+1).trim(); - } - if (parts[0].isEmpty()) { - throw new NoSuchAlgorithmException("Invalid transformation: " + - "algorithm not specified-" + String mode = transformation.substring(startIdx, endIdx).trim(); + String padding = transformation.substring(endIdx+1).trim(); + // ensure mode and padding are specified + if (mode.isEmpty() || padding.isEmpty()) { + throw new NoSuchAlgorithmException("Invalid transformation: " + + "missing mode and/or padding-" + transformation); + } + return new String[] { algo, mode, padding }; } - return parts; } // Provider attribute name for supported chaining mode @@ -447,22 +459,17 @@ throws NoSuchAlgorithmException { String[] parts = tokenizeTransformation(transformation); - String alg = parts[0]; - String mode = parts[1]; - String pad = parts[2]; - - if ((mode.length() == 0) && (pad.length() == 0)) { + if (parts.length == 1) { // Algorithm only - Transform tr = new Transform(alg, "", null, null); - return Collections.singletonList(tr); + return List.of(new Transform(parts[0], "", null, null)); } else { - // Algorithm w/ at least mode or padding or both - List list = new ArrayList<>(4); - list.add(new Transform(alg, "/" + mode + "/" + pad, null, null)); - list.add(new Transform(alg, "/" + mode, null, pad)); - list.add(new Transform(alg, "//" + pad, mode, null)); - list.add(new Transform(alg, "", mode, pad)); - return list; + // Algorithm w/ both mode and padding + return List.of( + new Transform(parts[0], "/" + parts[1] + "/" + parts[2], + null, null), + new Transform(parts[0], "/" + parts[1], null, parts[2]), + new Transform(parts[0], "//" + parts[2], parts[1], null), + new Transform(parts[0], "", parts[1], parts[2])); } } @@ -534,6 +541,13 @@ if ((transformation == null) || transformation.isEmpty()) { throw new NoSuchAlgorithmException("Null or empty transformation"); } + + // throws NoSuchAlgorithmException if java.security disables it + if (!CryptoAlgorithmConstraints.permits("Cipher", transformation)) { + throw new NoSuchAlgorithmException(transformation + + " is disabled"); + } + List transforms = getTransforms(transformation); List cipherServices = new ArrayList<>(transforms.size()); for (Transform transform : transforms) { @@ -706,6 +720,13 @@ if (provider == null) { throw new IllegalArgumentException("Missing provider"); } + + // throws NoSuchAlgorithmException if java.security disables it + if (!CryptoAlgorithmConstraints.permits("Cipher", transformation)) { + throw new NoSuchAlgorithmException(transformation + + " is disabled"); + } + Exception failure = null; List transforms = getTransforms(transformation); boolean providerChecked = false; diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/jdk/internal/access/JavaIOAccess.java openjdk-21-21.0.11+10/src/java.base/share/classes/jdk/internal/access/JavaIOAccess.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/jdk/internal/access/JavaIOAccess.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/jdk/internal/access/JavaIOAccess.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,4 +29,5 @@ public interface JavaIOAccess { Console console(); + boolean isStdinTty(); } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/jdk/internal/io/JdkConsoleImpl.java openjdk-21-21.0.11+10/src/java.base/share/classes/jdk/internal/io/JdkConsoleImpl.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/jdk/internal/io/JdkConsoleImpl.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/jdk/internal/io/JdkConsoleImpl.java 2026-04-17 19:09:35.000000000 +0000 @@ -37,10 +37,14 @@ import java.util.Arrays; import java.util.Formatter; import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; import jdk.internal.access.SharedSecrets; +import jdk.internal.util.StaticProperty; import sun.nio.cs.StreamDecoder; import sun.nio.cs.StreamEncoder; +import sun.nio.cs.UTF_8; /** * JdkConsole implementation based on the platform's TTY. @@ -92,7 +96,55 @@ } @Override - public char[] readPassword(String fmt, Object ... args) { + public char[] readPassword(String format, Object ... args) { + return readPassword0(false, format, args); + } + + // These two methods are intended for sun.security.util.Password, so tools like keytool can + // use JdkConsoleImpl even when standard output is redirected. The Password class should first + // check if `System.console()` returns a Console instance and use it if available. Otherwise, + // it should call this method to obtain a JdkConsoleImpl. This ensures only one Console + // instance exists in the Java runtime. + private static final AtomicReference> INSTANCE = new AtomicReference<>(); + public static Optional passwordConsole() { + Optional result = INSTANCE.get(); + if (result != null) { + return result; + } + + synchronized (JdkConsoleImpl.class) { + result = INSTANCE.get(); + if (result != null) { + return result; + } + + // If there's already a proper console, throw an exception + if (System.console() != null) { + throw new IllegalStateException("Can't create a dedicated password " + + "console since a real console already exists"); + } + + // If stdin is NOT redirected, return an Optional containing a JdkConsoleImpl + // instance, otherwise an empty Optional. + result = SharedSecrets.getJavaIOAccess().isStdinTty() ? + Optional.of( + new JdkConsoleImpl( + UTF_8.INSTANCE)) : + Optional.empty(); + + INSTANCE.set(result); + return result; + } + } + + // Dedicated entry for sun.security.util.Password when stdout is redirected. + // This method strictly avoids producing any output by using noNewLine = true + // and an empty format string. + public char[] readPasswordNoNewLine() { + return readPassword0(true, ""); + } + + private char[] readPassword0(boolean noNewLine, String fmt, Object ... args) { char[] passwd = null; synchronized (writeLock) { synchronized(readLock) { @@ -120,7 +172,9 @@ ioe.addSuppressed(x); } if (ioe != null) { - Arrays.fill(passwd, ' '); + if (passwd != null) { + Arrays.fill(passwd, ' '); + } try { if (reader instanceof LineReader lr) { lr.zeroOut(); @@ -131,7 +185,9 @@ throw ioe; } } - pw.println(); + if (!noNewLine) { + pw.println(); + } } } return passwd; diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/jdk/internal/reflect/DirectMethodHandleAccessor.java openjdk-21-21.0.11+10/src/java.base/share/classes/jdk/internal/reflect/DirectMethodHandleAccessor.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/jdk/internal/reflect/DirectMethodHandleAccessor.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/jdk/internal/reflect/DirectMethodHandleAccessor.java 2026-04-17 19:09:35.000000000 +0000 @@ -46,7 +46,7 @@ * Creates a MethodAccessorImpl for a non-native method. */ static MethodAccessorImpl methodAccessor(Method method, MethodHandle target) { - assert !Modifier.isNative(method.getModifiers()); + assert !MethodHandleAccessorFactory.isSignaturePolymorphicMethod(method); return new DirectMethodHandleAccessor(method, target, false); } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/jdk/internal/reflect/MethodHandleAccessorFactory.java openjdk-21-21.0.11+10/src/java.base/share/classes/jdk/internal/reflect/MethodHandleAccessorFactory.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/jdk/internal/reflect/MethodHandleAccessorFactory.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/jdk/internal/reflect/MethodHandleAccessorFactory.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,7 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; +import java.lang.invoke.VarHandle; import java.lang.reflect.Constructor; import java.lang.reflect.Executable; import java.lang.reflect.Field; @@ -169,7 +170,7 @@ } private static MethodHandle getDirectMethod(Method method, boolean callerSensitive) throws IllegalAccessException { - var mtype = methodType(method.getReturnType(), method.getParameterTypes()); + var mtype = methodType(method.getReturnType(), reflectionFactory.getExecutableSharedParameterTypes(method)); var isStatic = Modifier.isStatic(method.getModifiers()); var dmh = isStatic ? JLIA.findStatic(method.getDeclaringClass(), method.getName(), mtype) : JLIA.findVirtual(method.getDeclaringClass(), method.getName(), mtype); @@ -191,7 +192,7 @@ private static MethodHandle findCallerSensitiveAdapter(Method method) throws IllegalAccessException { String name = method.getName(); // append a Class parameter - MethodType mtype = methodType(method.getReturnType(), method.getParameterTypes()) + MethodType mtype = methodType(method.getReturnType(), reflectionFactory.getExecutableSharedParameterTypes(method)) .appendParameterTypes(Class.class); boolean isStatic = Modifier.isStatic(method.getModifiers()); @@ -303,29 +304,43 @@ /* * Returns true if NativeAccessor should be used. + * + * Native accessor, i.e. VM reflection implementation, is used if one of + * the following conditions is met: + * 1. during VM early startup before method handle support is fully initialized + * 2. -Djdk.reflect.useNativeAccessorOnly=true is set + * 3. a signature polymorphic method + * 4. the member takes a variable number of arguments and the last parameter + * is not an array (see details below) + * 5. the member's method type has an arity >= 255 + * + * Conditions 3-5 are due to the restrictions of method handles. + * Otherwise, direct invocation of method handles is used. */ private static boolean useNativeAccessor(Executable member) { if (!VM.isJavaLangInvokeInited()) return true; - if (Modifier.isNative(member.getModifiers())) + if (ReflectionFactory.useNativeAccessorOnly()) // for testing only return true; - if (ReflectionFactory.useNativeAccessorOnly()) // for testing only + // java.lang.invoke cannot find the underlying native stubs of signature + // polymorphic methods that core reflection must invoke. + // Fall back to use the native implementation instead. + if (member instanceof Method method && isSignaturePolymorphicMethod(method)) return true; - // MethodHandle::withVarargs on a member with varargs modifier bit set - // verifies that the last parameter of the member must be an array type. - // The JVMS does not require the last parameter descriptor of the method descriptor - // is an array type if the ACC_VARARGS flag is set in the access_flags item. - // Hence the reflection implementation does not check the last parameter type - // if ACC_VARARGS flag is set. Workaround this by invoking through - // the native accessor. + // For members with ACC_VARARGS bit set, MethodHandles produced by lookup + // always have variable arity set and hence the last parameter of the member + // must be an array type. Such restriction does not exist in core reflection + // and the JVM, which always use fixed-arity invocations. Fall back to use + // the native implementation instead. int paramCount = member.getParameterCount(); if (member.isVarArgs() && - (paramCount == 0 || !(member.getParameterTypes()[paramCount-1].isArray()))) { + (paramCount == 0 || !(reflectionFactory.getExecutableSharedParameterTypes(member)[paramCount-1].isArray()))) { return true; } + // A method handle cannot be created if its type has an arity >= 255 // as the method handle's invoke method consumes an extra argument // of the method handle itself. Fall back to use the native implementation. @@ -345,7 +360,7 @@ */ private static int slotCount(Executable member) { int slots = 0; - Class[] ptypes = member.getParameterTypes(); + Class[] ptypes = reflectionFactory.getExecutableSharedParameterTypes(member); for (Class ptype : ptypes) { if (ptype == double.class || ptype == long.class) { slots++; @@ -355,6 +370,31 @@ (Modifier.isStatic(member.getModifiers()) ? 0 : 1); } + /** + * Signature-polymorphic methods. Lookup has special rules for these methods, + * but core reflection must observe them as they are declared, and reflective + * invocation must invoke the native method stubs that throw UOE. + * + * @param method the method to check + * @return {@code true} if this method is signature polymorphic + * @jls 15.12.3 Compile-Time Step 3: Is the Chosen Method Appropriate? + * @jvms 2.9.3 Signature Polymorphic Methods + */ + public static boolean isSignaturePolymorphicMethod(Method method) { + // ACC_NATIVE and ACC_VARARGS + if (!method.isVarArgs() || !Modifier.isNative(method.getModifiers())) { + return false; + } + // Declared in MethodHandle or VarHandle + var declaringClass = method.getDeclaringClass(); + if (declaringClass != MethodHandle.class && declaringClass != VarHandle.class) { + return false; + } + // Single parameter of declared type Object[] + Class[] parameters = reflectionFactory.getExecutableSharedParameterTypes(method); + return parameters.length == 1 && parameters[0] == Object[].class; + } + /* * Delay initializing these static fields until java.lang.invoke is fully initialized. */ @@ -363,4 +403,5 @@ } private static final Unsafe UNSAFE = Unsafe.getUnsafe(); + private static final ReflectionFactory reflectionFactory = ReflectionFactory.getReflectionFactory(); } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1864,22 +1864,7 @@ registry.invalidateAll(); if (!tryClose()) { - long reader = readerThread; - long writer = writerThread; - if (reader != 0 || writer != 0) { - if (NativeThread.isVirtualThread(reader) - || NativeThread.isVirtualThread(writer)) { - Poller.stopPoll(fdVal); - } - if (NativeThread.isNativeThread(reader) - || NativeThread.isNativeThread(writer)) { - nd.preClose(fd); - if (NativeThread.isNativeThread(reader)) - NativeThread.signal(reader); - if (NativeThread.isNativeThread(writer)) - NativeThread.signal(writer); - } - } + nd.preClose(fd, readerThread, writerThread); } } } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/nio/ch/NativeDispatcher.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/nio/ch/NativeDispatcher.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/nio/ch/NativeDispatcher.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/nio/ch/NativeDispatcher.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,8 @@ import java.io.FileDescriptor; import java.io.IOException; +import jdk.internal.access.JavaIOFileDescriptorAccess; +import jdk.internal.access.SharedSecrets; /** * Allows different platforms to call different native methods @@ -34,6 +36,7 @@ */ abstract class NativeDispatcher { + private static final JavaIOFileDescriptorAccess JIOFDA = SharedSecrets.getJavaIOFileDescriptorAccess(); abstract int read(FileDescriptor fd, long address, int len) throws IOException; @@ -69,11 +72,28 @@ abstract void close(FileDescriptor fd) throws IOException; - // Prepare the given fd for closing by duping it to a known internal fd - // that's already closed. This is necessary on some operating systems - // (Solaris and Linux) to prevent fd recycling. - // - void preClose(FileDescriptor fd) throws IOException { + /** + * Prepare the given file descriptor for closing. If a virtual thread is blocked + * on the file descriptor then it is unparked so that it stops polling. On Unix systems, + * if a platform thread is blocked on the file descriptor then the file descriptor is + * dup'ed to a special fd and the thread signalled so that the syscall fails with EINTR. + */ + final void preClose(FileDescriptor fd, long reader, long writer) throws IOException { + if (NativeThread.isVirtualThread(reader) || NativeThread.isVirtualThread(writer)) { + int fdVal = JIOFDA.get(fd); + Poller.stopPoll(fdVal); + } + if (NativeThread.isNativeThread(reader) || NativeThread.isNativeThread(writer)) { + implPreClose(fd, reader, writer); + } + } + + /** + * This method does nothing by default. On Unix systems the file descriptor is dup'ed + * to a special fd and native threads signalled. + */ + + void implPreClose(FileDescriptor fd, long reader, long writer) throws IOException { // Do nothing by default; this is only needed on Unix } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/nio/ch/NioSocketImpl.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/nio/ch/NioSocketImpl.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/nio/ch/NioSocketImpl.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/nio/ch/NioSocketImpl.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -900,20 +900,7 @@ // then the socket is pre-closed and the thread(s) signalled. The // last thread will close the file descriptor. if (!tryClose()) { - long reader = readerThread; - long writer = writerThread; - if (NativeThread.isVirtualThread(reader) - || NativeThread.isVirtualThread(writer)) { - Poller.stopPoll(fdVal(fd)); - } - if (NativeThread.isNativeThread(reader) - || NativeThread.isNativeThread(writer)) { - nd.preClose(fd); - if (NativeThread.isNativeThread(reader)) - NativeThread.signal(reader); - if (NativeThread.isNativeThread(writer)) - NativeThread.signal(writer); - } + nd.preClose(fd, readerThread, writerThread); } } } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -604,15 +604,7 @@ assert state < ST_CLOSING; state = ST_CLOSING; if (!tryClose()) { - long th = thread; - if (th != 0) { - if (NativeThread.isVirtualThread(th)) { - Poller.stopPoll(fdVal); - } else { - nd.preClose(fd); - NativeThread.signal(th); - } - } + nd.preClose(fd, thread, 0); } } } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1060,20 +1060,8 @@ } if (!tryClose()) { - long reader = readerThread; - long writer = writerThread; - if (NativeThread.isVirtualThread(reader) - || NativeThread.isVirtualThread(writer)) { - Poller.stopPoll(fdVal); - } - if (NativeThread.isNativeThread(reader) - || NativeThread.isNativeThread(writer)) { - nd.preClose(fd); - if (NativeThread.isNativeThread(reader)) - NativeThread.signal(reader); - if (NativeThread.isNativeThread(writer)) - NativeThread.signal(writer); - } + // prepare file descriptor for closing + nd.preClose(fd, readerThread, writerThread); } } } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/provider/MD4.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/provider/MD4.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/provider/MD4.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/provider/MD4.java 2026-04-17 19:09:35.000000000 +0000 @@ -78,13 +78,8 @@ }); } - public static MessageDigest getInstance() { - try { - return MessageDigest.getInstance("MD4", md4Provider); - } catch (NoSuchAlgorithmException e) { - // should never occur - throw new ProviderException(e); - } + public static MessageDigest getInstance() throws NoSuchAlgorithmException { + return MessageDigest.getInstance("MD4", md4Provider); } // Standard constructor, creates a new MD4 instance. diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/provider/X509Factory.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/provider/X509Factory.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/provider/X509Factory.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/provider/X509Factory.java 2026-04-17 19:09:35.000000000 +0000 @@ -64,6 +64,7 @@ public static final String END_CERT = "-----END CERTIFICATE-----"; private static final int ENC_MAX_LENGTH = 4096 * 1024; // 4 MB MAX + public static final int BER_ITERATION_COUNT = 128; // Limit nested depth private static final Cache certCache = Cache.newSoftMemoryCache(750); @@ -553,7 +554,7 @@ if (c == DerValue.tag_Sequence) { ByteArrayOutputStream bout = new ByteArrayOutputStream(2048); bout.write(c); - readBERInternal(is, bout, c); + readBERInternal(is, bout, c, BER_ITERATION_COUNT); return bout.toByteArray(); } else { // Read BASE64 encoded data, might skip info at the beginning @@ -675,12 +676,16 @@ * @param is Read from this InputStream * @param bout Write into this OutputStream * @param tag Tag already read (-1 mean not read) + * @param depth nesting depth limit * @return The current tag, used to check EOC in indefinite-length BER * @throws IOException Any parsing error */ private static int readBERInternal(InputStream is, - ByteArrayOutputStream bout, int tag) throws IOException { + ByteArrayOutputStream bout, int tag, int depth) throws IOException { + if (depth-- == 0) { + throw new IOException("Nesting sequence depth limit reached."); + } if (tag == -1) { // Not read before the call, read now tag = is.read(); if (tag == -1) { @@ -706,7 +711,7 @@ "Non constructed encoding must have definite length"); } while (true) { - int subTag = readBERInternal(is, bout, -1); + int subTag = readBERInternal(is, bout, -1, depth); if (subTag == 0) { // EOC, end of indefinite-length section break; } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,9 +43,7 @@ /** * Class to obtain CRLs via the CRLDistributionPoints extension. - * Note that the functionality of this class must be explicitly enabled - * via a system property, see the USE_CRLDP variable below. - * + *

* This class uses the URICertStore class to fetch CRLs. The URICertStore * class also implements CRL caching: see the class description for more * information. diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1022,13 +1022,17 @@ // any way to convey them back to the application. // That's the default, so no need to write code. builderParams.setDate(params.date()); - builderParams.setCertPathCheckers(params.certPathCheckers()); builderParams.setSigProvider(params.sigProvider()); // Skip revocation during this build to detect circular // references. But check revocation afterwards, using the // key (or any other that works). builderParams.setRevocationEnabled(false); + // Remove itself from params to avoid circular reference. + builderParams.setCertPathCheckers(params.certPathCheckers() + .stream() + .filter(checker -> checker != this) + .toList()); // check for AuthorityInformationAccess extension if (Builder.USE_AIA) { diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/Finished.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/Finished.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/Finished.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/Finished.java 2026-04-17 19:09:35.000000000 +0000 @@ -1147,7 +1147,9 @@ // // produce - NewSessionTicket.t13PosthandshakeProducer.produce(shc); + if (SSLConfiguration.serverNewSessionTicketCount > 0) { + NewSessionTicket.t13PosthandshakeProducer.produce(shc); + } } } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/HelloCookieManager.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/HelloCookieManager.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/HelloCookieManager.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/HelloCookieManager.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -187,7 +187,7 @@ byte[] secret; d10ManagerLock.lock(); try { - if (((cookieVersion >> 24) & 0xFF) == cookie[0]) { + if ((byte) ((cookieVersion >> 24) & 0xFF) == cookie[0]) { secret = cookieSecret; } else { secret = legacySecret; // including out of window cookies diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/NewSessionTicket.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/NewSessionTicket.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/NewSessionTicket.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/NewSessionTicket.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,11 @@ package sun.security.ssl; import java.io.IOException; -import java.math.BigInteger; import java.nio.ByteBuffer; import java.security.GeneralSecurityException; import java.security.SecureRandom; import java.text.MessageFormat; +import java.util.Arrays; import java.util.Locale; import javax.crypto.SecretKey; import javax.net.ssl.SSLHandshakeException; @@ -119,11 +119,6 @@ } @Override - public SSLHandshake handshakeType() { - return NEW_SESSION_TICKET; - } - - @Override public int messageLength() { return 4 + // ticketLifetime 2 + ticket.length; // len of ticket + ticket @@ -221,11 +216,6 @@ this.extensions = new SSLExtensions(this, m, supportedExtensions); } - @Override - public SSLHandshake handshakeType() { - return NEW_SESSION_TICKET; - } - int getTicketAgeAdd() { return ticketAgeAdd; } @@ -301,7 +291,7 @@ "tls13 resumption".getBytes(), nonce, hashAlg.hashLength); return hkdf.expand(resumptionMasterSecret, hkdfInfo, hashAlg.hashLength, "TlsPreSharedKey"); - } catch (GeneralSecurityException gse) { + } catch (GeneralSecurityException gse) { throw new SSLHandshakeException("Could not derive PSK", gse); } } @@ -332,8 +322,7 @@ // Is this session resumable? if (!hc.handshakeSession.isRejoinable()) { if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { - SSLLogger.fine( - "No session ticket produced: " + + SSLLogger.fine("No session ticket produced: " + "session is not resumable"); } @@ -351,8 +340,7 @@ if (pkemSpec == null || !pkemSpec.contains(PskKeyExchangeMode.PSK_DHE_KE)) { if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { - SSLLogger.fine( - "No session ticket produced: " + + SSLLogger.fine("No session ticket produced: " + "client does not support psk_dhe_ke"); } @@ -363,8 +351,7 @@ // using an allowable PSK exchange key mode. if (!hc.handshakeSession.isPSKable()) { if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { - SSLLogger.fine( - "No session ticket produced: " + + SSLLogger.fine("No session ticket produced: " + "No session ticket allowed in this session"); } @@ -375,76 +362,113 @@ // get a new session ID SSLSessionContextImpl sessionCache = (SSLSessionContextImpl) hc.sslContext.engineGetServerSessionContext(); - SessionId newId = new SessionId(true, - hc.sslContext.getSecureRandom()); - - SecretKey resumptionMasterSecret = - hc.handshakeSession.getResumptionMasterSecret(); - if (resumptionMasterSecret == null) { + int sessionTimeoutSeconds = sessionCache.getSessionTimeout(); + if (sessionTimeoutSeconds > MAX_TICKET_LIFETIME) { if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { - SSLLogger.fine( - "No session ticket produced: " + - "no resumption secret"); + SSLLogger.fine("No session ticket produced: " + + "session timeout is too long"); } return null; } - // construct the PSK and handshake message - BigInteger nonce = hc.handshakeSession.incrTicketNonceCounter(); - byte[] nonceArr = nonce.toByteArray(); - SecretKey psk = derivePreSharedKey( - hc.negotiatedCipherSuite.hashAlg, - resumptionMasterSecret, nonceArr); - - int sessionTimeoutSeconds = sessionCache.getSessionTimeout(); - if (sessionTimeoutSeconds > MAX_TICKET_LIFETIME) { - if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { - SSLLogger.fine( - "No session ticket produced: " + - "session timeout"); + // Send NewSessionTickets to the client based + if (SSLConfiguration.serverNewSessionTicketCount > 0) { + int i = 0; + NewSessionTicketMessage nstm; + while (i < SSLConfiguration.serverNewSessionTicketCount) { + nstm = generateNST(hc, sessionCache); + if (nstm == null) { + break; + } + nstm.write(hc.handshakeOutput); + i++; } - return null; + hc.handshakeOutput.flush(); + } + /* + * With large NST counts, a client that quickly closes after + * TLS Finished completes can cause SocketExceptions such as: + * Windows servers read-side throwing SocketException: + * "An established connection was aborted by the software in + * your host machine", which relates to error WSAECONNABORTED. + * A SocketException caused by a "broken pipe" has been observed on + * other systems. + * These are very unlikely situations when client and server are on + * different machines. + * + * RFC 8446 does not put requirements when an NST needs to be + * sent, but it should be sent very soon after TLS Finished for + * clients that will quickly resume to create more sessions. + * TLS 1.3 is different from TLS 1.2, there is more data the client + * should be aware of + */ + + // See note on TransportContext.needHandshakeFinishedStatus. + // + // Reset the needHandshakeFinishedStatus flag. The delivery + // of this post-handshake message will indicate the FINISHED + // handshake status. It is not needed to have a follow-on + // SSLEngine.wrap() any longer. + if (hc.conContext.needHandshakeFinishedStatus) { + hc.conContext.needHandshakeFinishedStatus = false; } - NewSessionTicketMessage nstm = null; + // clean the post handshake context + hc.conContext.finishPostHandshake(); + + // The message has been delivered. + return null; + } + + private NewSessionTicketMessage generateNST(HandshakeContext hc, + SSLSessionContextImpl sessionCache) throws IOException { + + NewSessionTicketMessage nstm; + SessionId newId = new SessionId(true, + hc.sslContext.getSecureRandom()); + + // construct the PSK and handshake message + byte[] nonce = hc.handshakeSession.incrTicketNonceCounter(); SSLSessionImpl sessionCopy = - new SSLSessionImpl(hc.handshakeSession, newId); - sessionCopy.setPreSharedKey(psk); + new SSLSessionImpl(hc.handshakeSession, newId); + sessionCopy.setPreSharedKey(derivePreSharedKey( + hc.negotiatedCipherSuite.hashAlg, + hc.handshakeSession.getResumptionMasterSecret(), nonce)); sessionCopy.setPskIdentity(newId.getId()); // If a stateless ticket is allowed, attempt to make one if (hc.statelessResumption && hc.handshakeSession.isStatelessable()) { nstm = new T13NewSessionTicketMessage(hc, - sessionTimeoutSeconds, + sessionCache.getSessionTimeout(), hc.sslContext.getSecureRandom(), - nonceArr, + nonce, new SessionTicketSpec().encrypt(hc, sessionCopy)); // If ticket construction failed, switch to session cache if (!nstm.isValid()) { hc.statelessResumption = false; } else { if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { - SSLLogger.fine( - "Produced NewSessionTicket stateless " + + SSLLogger.fine("Produced NewSessionTicket stateless " + "post-handshake message", nstm); } } + return nstm; } // If a session cache ticket is being used, make one if (!hc.statelessResumption || !hc.handshakeSession.isStatelessable()) { - nstm = new T13NewSessionTicketMessage(hc, sessionTimeoutSeconds, - hc.sslContext.getSecureRandom(), nonceArr, - newId.getId()); + nstm = new T13NewSessionTicketMessage(hc, + sessionCache.getSessionTimeout(), + hc.sslContext.getSecureRandom(), nonce, + newId.getId()); if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { - SSLLogger.fine( - "Produced NewSessionTicket post-handshake message", - nstm); + SSLLogger.fine("Produced NewSessionTicket " + + "post-handshake message", nstm); } // create and cache the new session @@ -453,29 +477,13 @@ hc.handshakeSession.addChild(sessionCopy); sessionCopy.setTicketAgeAdd(nstm.getTicketAgeAdd()); sessionCache.put(sessionCopy); + return nstm; } - // Output the handshake message. - if (nstm != null) { - // should never be null - nstm.write(hc.handshakeOutput); - hc.handshakeOutput.flush(); - - // See note on TransportContext.needHandshakeFinishedStatus. - // - // Reset the needHandshakeFinishedStatus flag. The delivery - // of this post-handshake message will indicate the FINISHED - // handshake status. It is not needed to have a follow-on - // SSLEngine.wrap() any longer. - if (hc.conContext.needHandshakeFinishedStatus) { - hc.conContext.needHandshakeFinishedStatus = false; - } + if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { + SSLLogger.fine("No NewSessionTicket created"); } - // clean the post handshake context - hc.conContext.finishPostHandshake(); - - // The message has been delivered. return null; } } @@ -497,8 +505,9 @@ ServerHandshakeContext shc = (ServerHandshakeContext)context; - // Is this session resumable? - if (!shc.handshakeSession.isRejoinable()) { + // Are new tickets allowed? If so, is this session resumable? + if (SSLConfiguration.serverNewSessionTicketCount == 0 || + !shc.handshakeSession.isRejoinable()) { return null; } @@ -578,7 +587,6 @@ "Discarding NewSessionTicket with lifetime " + nstm.ticketLifetime, nstm); } - sessionCache.remove(hc.handshakeSession.getSessionId()); return; } @@ -619,13 +627,19 @@ sessionCopy.setPreSharedKey(psk); sessionCopy.setTicketAgeAdd(nstm.getTicketAgeAdd()); sessionCopy.setPskIdentity(nstm.ticket); - sessionCache.put(sessionCopy); + sessionCache.put(sessionCopy, sessionCopy.isPSK()); + + if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { + SSLLogger.fine("MultiNST PSK (Server): " + + Utilities.toHexString(Arrays.copyOf(nstm.ticket, 16))); + } // clean the post handshake context hc.conContext.finishPostHandshake(); } } + /* TLS 1.2 spec does not specify multiple NST behavior.*/ private static final class T12NewSessionTicketConsumer implements SSLConsumer { // Prevent instantiation of this class. @@ -674,8 +688,7 @@ hc.handshakeSession.setPskIdentity(nstm.ticket); if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { - SSLLogger.fine("Consuming NewSessionTicket\n" + - nstm.toString()); + SSLLogger.fine("Consuming NewSessionTicket\n" + nstm); } } } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/PreSharedKeyExtension.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/PreSharedKeyExtension.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/PreSharedKeyExtension.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/PreSharedKeyExtension.java 2026-04-17 19:09:35.000000000 +0000 @@ -694,11 +694,13 @@ //The session cannot be used again. Remove it from the cache. SSLSessionContextImpl sessionCache = (SSLSessionContextImpl) chc.sslContext.engineGetClientSessionContext(); - sessionCache.remove(chc.resumingSession.getSessionId()); + sessionCache.remove(chc.resumingSession.getSessionId(), true); if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { SSLLogger.fine( "Found resumable session. Preparing PSK message."); + SSLLogger.fine( + "MultiNST PSK (Client): " + Utilities.toHexString(Arrays.copyOf(chc.pskIdentity, 16))); } List identities = new ArrayList<>(); diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/SSLConfiguration.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/SSLConfiguration.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/SSLConfiguration.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/SSLConfiguration.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -119,6 +119,11 @@ static final boolean enableDtlsResumeCookie = Utilities.getBooleanProperty( "jdk.tls.enableDtlsResumeCookie", true); + // Number of NewSessionTickets that will be sent by the server. + static final int serverNewSessionTicketCount; + // Default for NewSessionTickets + static final int SERVER_NST_DEFAULT = 1; + // Is the extended_master_secret extension supported? static { boolean supportExtendedMasterSecret = Utilities.getBooleanProperty( @@ -131,6 +136,33 @@ } } useExtendedMasterSecret = supportExtendedMasterSecret; + + /* + * jdk.tls.server.newSessionTicketCount system property + * Sets the number of NewSessionTickets sent to a TLS 1.3 resumption + * client. The value must be between 0 and 10. Default is defined by + * SERVER_NST_DEFAULT. + */ + Integer nstServerCount = GetIntegerAction.privilegedGetProperty( + "jdk.tls.server.newSessionTicketCount"); + if (nstServerCount == null || nstServerCount < 0 || + nstServerCount > 10) { + serverNewSessionTicketCount = SERVER_NST_DEFAULT; + if (nstServerCount != null && SSLLogger.isOn && + SSLLogger.isOn("ssl,handshake")) { + SSLLogger.fine( + "jdk.tls.server.newSessionTicketCount defaults to " + + SERVER_NST_DEFAULT + " as the property was not " + + "between 0 and 10"); + } + } else { + serverNewSessionTicketCount = nstServerCount; + if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { + SSLLogger.fine( + "jdk.tls.server.newSessionTicketCount set to " + + serverNewSessionTicketCount); + } + } } SSLConfiguration(SSLContextImpl sslContext, boolean isClientMode) { diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/SSLEngineImpl.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/SSLEngineImpl.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/SSLEngineImpl.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/SSLEngineImpl.java 2026-04-17 19:09:35.000000000 +0000 @@ -416,11 +416,12 @@ HandshakeStatus currentHandshakeStatus) throws IOException { // Don't bother to kickstart if handshaking is in progress, or if the // connection is not duplex-open. - if ((conContext.handshakeContext == null) && - conContext.protocolVersion.useTLS13PlusSpec() && - !conContext.isOutboundClosed() && - !conContext.isInboundClosed() && - !conContext.isBroken) { + if (SSLConfiguration.serverNewSessionTicketCount > 0 && + conContext.handshakeContext == null && + conContext.protocolVersion.useTLS13PlusSpec() && + !conContext.isOutboundClosed() && + !conContext.isInboundClosed() && + !conContext.isBroken) { if (SSLLogger.isOn && SSLLogger.isOn("ssl")) { SSLLogger.finest("trigger NST"); } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/SSLSessionContextImpl.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/SSLSessionContextImpl.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/SSLSessionContextImpl.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/SSLSessionContextImpl.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -63,6 +63,7 @@ final class SSLSessionContextImpl implements SSLSessionContext { private static final int DEFAULT_MAX_CACHE_SIZE = 20480; + private static final int DEFAULT_MAX_QUEUE_SIZE = 10; // Default lifetime of a session. 24 hours static final int DEFAULT_SESSION_TIMEOUT = 86400; @@ -87,14 +88,17 @@ cacheLimit = getDefaults(server); // default cache size // use soft reference - sessionCache = Cache.newSoftMemoryCache(cacheLimit, timeout); - sessionHostPortCache = Cache.newSoftMemoryCache(cacheLimit, timeout); if (server) { + sessionCache = Cache.newSoftMemoryCache(cacheLimit, timeout); + sessionHostPortCache = Cache.newSoftMemoryCache(cacheLimit, timeout); keyHashMap = new ConcurrentHashMap<>(); // Should be "randomly generated" according to RFC 5077, - // but doesn't necessarily has to be a true random number. + // but doesn't necessarily have to be a true random number. currentKeyID = new Random(System.nanoTime()).nextInt(); } else { + sessionCache = Cache.newSoftMemoryCache(cacheLimit, timeout); + sessionHostPortCache = Cache.newSoftMemoryQueue(cacheLimit, timeout, + DEFAULT_MAX_QUEUE_SIZE); keyHashMap = Map.of(); } } @@ -277,12 +281,22 @@ // time it created, which is a little longer than the expected. So // please do check isTimedout() while getting entry from the cache. void put(SSLSessionImpl s) { + put(s, false); + } + + /** + * Put an entry in the cache + * @param s SSLSessionImpl entry to be stored + * @param canQueue True if multiple entries may exist under one + * session entry. + */ + void put(SSLSessionImpl s, boolean canQueue) { sessionCache.put(s.getSessionId(), s); // If no hostname/port info is available, don't add this one. if ((s.getPeerHost() != null) && (s.getPeerPort() != -1)) { sessionHostPortCache.put( - getKey(s.getPeerHost(), s.getPeerPort()), s); + getKey(s.getPeerHost(), s.getPeerPort()), s, canQueue); } s.setContext(this); @@ -290,11 +304,17 @@ // package-private method, remove a cached SSLSession void remove(SessionId key) { + remove(key, false); + } + void remove(SessionId key, boolean isClient) { SSLSessionImpl s = sessionCache.get(key); if (s != null) { sessionCache.remove(key); - sessionHostPortCache.remove( + // A client keeps the cache entry for queued NST resumption. + if (!isClient) { + sessionHostPortCache.remove( getKey(s.getPeerHost(), s.getPeerPort())); + } } } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/SSLSessionImpl.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/SSLSessionImpl.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/SSLSessionImpl.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/SSLSessionImpl.java 2026-04-17 19:09:35.000000000 +0000 @@ -39,7 +39,6 @@ import java.util.Queue; import java.util.Collection; import java.util.Collections; -import java.util.Enumeration; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; @@ -133,7 +132,11 @@ private final List requestedServerNames; // Counter used to create unique nonces in NewSessionTicket - private BigInteger ticketNonceCounter = BigInteger.ONE; + private byte ticketNonceCounter = 1; + + // This boolean is true when a new set of NewSessionTickets are needed after + // the initial ones sent after the handshake. + boolean updateNST = false; // The endpoint identification algorithm used to check certificates // in this session. @@ -471,7 +474,12 @@ b = Record.getBytes16(buf); this.preSharedKey = new SecretKeySpec(b, alg); // Get identity len - this.pskIdentity = Record.getBytes8(buf); + i = Record.getInt8(buf); + if (i > 0) { + this.pskIdentity = Record.getBytes8(buf); + } else { + this.pskIdentity = null; + } break; default: throw new SSLException("Failed local certs of session."); @@ -685,14 +693,12 @@ this.pskIdentity = pskIdentity; } - BigInteger incrTicketNonceCounter() { - BigInteger result = ticketNonceCounter; - ticketNonceCounter = ticketNonceCounter.add(BigInteger.ONE); - return result; + byte[] incrTicketNonceCounter() { + return new byte[] {ticketNonceCounter++}; } boolean isPSKable() { - return (ticketNonceCounter.compareTo(BigInteger.ZERO) > 0); + return (ticketNonceCounter > 0); } /** @@ -751,6 +757,10 @@ return pskIdentity; } + public boolean isPSK() { + return (pskIdentity != null && pskIdentity.length > 0); + } + void setPeerCertificates(X509Certificate[] peer) { if (peerCerts == null) { peerCerts = peer; @@ -1203,7 +1213,6 @@ * sessions can be shared across different protection domains. */ private final ConcurrentHashMap boundValues; - boolean updateNST; /** * Assigns a session value. Session change events are given if diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java 2026-04-17 19:09:35.000000000 +0000 @@ -1319,7 +1319,6 @@ } // Check if NewSessionTicket PostHandshake message needs to be sent if (conContext.conSession.updateNST) { - conContext.conSession.updateNST = false; tryNewSessionTicket(); } } @@ -1555,15 +1554,17 @@ private void tryNewSessionTicket() throws IOException { // Don't bother to kickstart if handshaking is in progress, or if the // connection is not duplex-open. - if (!conContext.sslConfig.isClientMode && - conContext.protocolVersion.useTLS13PlusSpec() && - conContext.handshakeContext == null && - !conContext.isOutboundClosed() && - !conContext.isInboundClosed() && - !conContext.isBroken) { + if (SSLConfiguration.serverNewSessionTicketCount > 0 && + !conContext.sslConfig.isClientMode && + conContext.protocolVersion.useTLS13PlusSpec() && + conContext.handshakeContext == null && + !conContext.isOutboundClosed() && + !conContext.isInboundClosed() && + !conContext.isBroken) { if (SSLLogger.isOn && SSLLogger.isOn("ssl")) { SSLLogger.finest("trigger new session ticket"); } + conContext.conSession.updateNST = false; NewSessionTicket.t13PosthandshakeProducer.produce( new PostHandshakeContext(conContext)); } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/SSLSocketOutputRecord.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/SSLSocketOutputRecord.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/ssl/SSLSocketOutputRecord.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/ssl/SSLSocketOutputRecord.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -168,12 +168,12 @@ for (int limit = (offset + length); offset < limit;) { - int remains = (limit - offset) + (count - position); - int fragLen = Math.min(fragLimit, remains); + int remains = (limit - offset); + int fragLen = Math.min(fragLimit - count + position, remains); // use the buf of ByteArrayOutputStream write(source, offset, fragLen); - if (remains < fragLimit) { + if (remains < fragLen) { return; } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/util/AbstractAlgorithmConstraints.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/util/AbstractAlgorithmConstraints.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/util/AbstractAlgorithmConstraints.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/util/AbstractAlgorithmConstraints.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,8 +48,17 @@ // Get algorithm constraints from the specified security property. static Set getAlgorithms(String propertyName) { + return getAlgorithms(propertyName, false); + } + + // Get algorithm constraints from the specified security property or + // system property if allowSystemOverride == true. + static Set getAlgorithms(String propertyName, + boolean allowSystemOverride) { @SuppressWarnings("removal") - String property = AccessController.doPrivileged( + String property = allowSystemOverride ? + SecurityProperties.privilegedGetOverridable(propertyName) : + AccessController.doPrivileged( new PrivilegedAction() { @Override public String run() { @@ -74,7 +83,8 @@ if (algorithmsInProperty == null) { return Collections.emptySet(); } - Set algorithmsInPropertySet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + Set algorithmsInPropertySet = + new TreeSet<>(String.CASE_INSENSITIVE_ORDER); algorithmsInPropertySet.addAll(Arrays.asList(algorithmsInProperty)); return algorithmsInPropertySet; } @@ -89,17 +99,17 @@ return false; } - // decompose the algorithm into sub-elements - Set elements = decomposer.decompose(algorithm); - - // check the element of the elements - for (String element : elements) { - if (algorithms.contains(element)) { - return false; + if (decomposer != null) { + // decompose the algorithm into sub-elements + Set elements = decomposer.decompose(algorithm); + + // check the element of the elements + for (String element : elements) { + if (algorithms.contains(element)) { + return false; + } } } - return true; } - } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/util/Cache.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/util/Cache.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/util/Cache.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/util/Cache.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,8 +25,12 @@ package sun.security.util; +import javax.net.ssl.SSLSession; +import java.lang.ref.ReferenceQueue; +import java.lang.ref.SoftReference; import java.util.*; -import java.lang.ref.*; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; /** * Abstract base class and factory for caches. A cache is a key-value mapping. @@ -91,6 +95,15 @@ public abstract void put(K key, V value); /** + * Add V to the cache with the option to use a QueueCacheEntry if the + * cache is configured for it. If the cache is not configured for a queue, + * V will silently add the entry directly. + */ + public void put(K key, V value, boolean canQueue) { + put(key, value); + } + + /** * Get a value from the cache. */ public abstract V get(Object key); @@ -137,6 +150,11 @@ return new MemoryCache<>(true, size, timeout); } + public static Cache newSoftMemoryQueue(int size, int timeout, + int maxQueueSize) { + return new MemoryCache<>(true, size, timeout, maxQueueSize); + } + /** * Return a new memory cache with the specified maximum size, unlimited * lifetime for entries, with the values held by standard references. @@ -248,13 +266,12 @@ class MemoryCache extends Cache { - private static final float LOAD_FACTOR = 0.75f; - - // XXXX + // Debugging private static final boolean DEBUG = false; private final Map> cacheMap; private int maxSize; + final private int maxQueueSize; private long lifetime; private long nextExpirationTime = Long.MAX_VALUE; @@ -263,18 +280,25 @@ private final ReferenceQueue queue; public MemoryCache(boolean soft, int maxSize) { - this(soft, maxSize, 0); + this(soft, maxSize, 0, 0); } public MemoryCache(boolean soft, int maxSize, int lifetime) { + this(soft, maxSize, lifetime, 0); + } + + public MemoryCache(boolean soft, int maxSize, int lifetime, int qSize) { this.maxSize = maxSize; + this.maxQueueSize = qSize; this.lifetime = lifetime * 1000L; - if (soft) + if (soft) { this.queue = new ReferenceQueue<>(); - else + } else { this.queue = null; - - cacheMap = new LinkedHashMap<>(1, LOAD_FACTOR, true); + } + // LinkedHashMap is needed for its access order. 0.75f load factor is + // default. + cacheMap = new LinkedHashMap<>(1, 0.75f, true); } /** @@ -338,6 +362,10 @@ cnt++; } else if (nextExpirationTime > entry.getExpirationTime()) { nextExpirationTime = entry.getExpirationTime(); + // If this is a queue, check for some expired entries + if (entry instanceof QueueCacheEntry qe) { + qe.getQueue().removeIf(e -> !e.isValid(time)); + } } } if (DEBUG) { @@ -367,18 +395,60 @@ cacheMap.clear(); } - public synchronized void put(K key, V value) { + public void put(K key, V value) { + put(key, value, false); + } + + /** + * This puts an entry into the cacheMap. + * + * If canQueue is true, V will be added using a QueueCacheEntry which + * is added to cacheMap. If false, V is added to the cacheMap directly. + * The caller must keep a consistent canQueue value, mixing them can + * result in a queue being replaced with a single entry. + * + * This method is synchronized to avoid multiple QueueCacheEntry + * overwriting the same key. + * + * @param key key to the cacheMap + * @param value value to be stored + * @param canQueue can the value be put into a QueueCacheEntry + */ + public synchronized void put(K key, V value, boolean canQueue) { emptyQueue(); - long expirationTime = (lifetime == 0) ? 0 : - System.currentTimeMillis() + lifetime; + long expirationTime = + (lifetime == 0) ? 0 : System.currentTimeMillis() + lifetime; if (expirationTime < nextExpirationTime) { nextExpirationTime = expirationTime; } CacheEntry newEntry = newEntry(key, value, expirationTime, queue); - CacheEntry oldEntry = cacheMap.put(key, newEntry); - if (oldEntry != null) { - oldEntry.invalidate(); - return; + if (maxQueueSize == 0 || !canQueue) { + CacheEntry oldEntry = cacheMap.put(key, newEntry); + if (oldEntry != null) { + oldEntry.invalidate(); + } + } else { + CacheEntry entry = cacheMap.get(key); + switch (entry) { + case QueueCacheEntry qe -> { + qe.putValue(newEntry); + if (DEBUG) { + System.out.println("QueueCacheEntry= " + qe); + final AtomicInteger i = new AtomicInteger(1); + qe.queue.stream().forEach(e -> + System.out.println(i.getAndIncrement() + "= " + e)); + } + } + case null, default -> + cacheMap.put(key, new QueueCacheEntry<>(key, newEntry, + expirationTime, maxQueueSize)); + } + + if (DEBUG) { + System.out.println("Cache entry added: key=" + + key.toString() + ", class=" + + (entry != null ? entry.getClass().getName() : null)); + } } if (maxSize > 0 && cacheMap.size() > maxSize) { expungeExpiredEntries(); @@ -401,25 +471,37 @@ if (entry == null) { return null; } - long time = (lifetime == 0) ? 0 : System.currentTimeMillis(); - if (!entry.isValid(time)) { + + if (lifetime > 0 && !entry.isValid(System.currentTimeMillis())) { + cacheMap.remove(key); if (DEBUG) { System.out.println("Ignoring expired entry"); } - cacheMap.remove(key); return null; } + + // If the value is a queue, return a queue entry. + if (entry instanceof QueueCacheEntry qe) { + V result = qe.getValue(lifetime); + if (qe.isEmpty()) { + removeImpl(key); + } + return result; + } return entry.getValue(); } public synchronized void remove(Object key) { emptyQueue(); + removeImpl(key); + } + + private void removeImpl(Object key) { CacheEntry entry = cacheMap.remove(key); if (entry != null) { entry.invalidate(); } } - public synchronized V pull(Object key) { emptyQueue(); CacheEntry entry = cacheMap.remove(key); @@ -550,9 +632,8 @@ } } - private static class SoftCacheEntry - extends SoftReference - implements CacheEntry { + private static class SoftCacheEntry extends SoftReference + implements CacheEntry { private K key; private long expirationTime; @@ -589,6 +670,116 @@ key = null; expirationTime = -1; } + + @Override + public String toString() { + if (get() instanceof SSLSession se) + return HexFormat.of().formatHex(se.getId()); + return super.toString(); + } } -} + /** + * This CacheEntry type allows multiple V entries to be stored in + * one key in the cacheMap. + * + * This implementation is need for TLS clients that receive multiple + * PSKs or NewSessionTickets for server resumption. + */ + private static class QueueCacheEntry implements CacheEntry { + + // Limit the number of queue entries. + private final int MAXQUEUESIZE; + + final boolean DEBUG = false; + private K key; + private long expirationTime; + final Queue> queue = new ConcurrentLinkedQueue<>(); + + QueueCacheEntry(K key, CacheEntry entry, long expirationTime, + int maxSize) { + this.key = key; + this.expirationTime = expirationTime; + this.MAXQUEUESIZE = maxSize; + queue.add(entry); + } + + public K getKey() { + return key; + } + + public V getValue() { + return getValue(0); + } + + public V getValue(long lifetime) { + long time = (lifetime == 0) ? 0 : System.currentTimeMillis(); + do { + var entry = queue.poll(); + if (entry == null) { + return null; + } + if (entry.isValid(time)) { + return entry.getValue(); + } + entry.invalidate(); + } while (!queue.isEmpty()); + + return null; + } + + public long getExpirationTime() { + return expirationTime; + } + + public void setExpirationTime(long time) { + expirationTime = time; + } + + public void putValue(CacheEntry entry) { + if (DEBUG) { + System.out.println("Added to queue (size=" + queue.size() + + "): " + entry.getKey().toString() + ", " + entry); + } + // Update the cache entry's expiration time to the latest entry. + // The getValue() calls will remove expired tickets. + expirationTime = entry.getExpirationTime(); + // Limit the number of queue entries, removing the oldest. + if (queue.size() >= MAXQUEUESIZE) { + queue.remove(); + } + queue.add(entry); + } + + public boolean isValid(long currentTime) { + boolean valid = (currentTime <= expirationTime) && !queue.isEmpty(); + if (!valid) { + invalidate(); + } + return valid; + } + + public boolean isValid() { + return isValid(System.currentTimeMillis()); + } + + public void invalidate() { + clear(); + key = null; + expirationTime = -1; + } + + public void clear() { + queue.forEach(CacheEntry::invalidate); + queue.clear(); + } + + public boolean isEmpty() { + return queue.isEmpty(); + } + + public Queue> getQueue() { + return queue; + } + } +} \ No newline at end of file diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/util/CryptoAlgorithmConstraints.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/util/CryptoAlgorithmConstraints.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/util/CryptoAlgorithmConstraints.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/util/CryptoAlgorithmConstraints.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2025, 2026, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.util; + +import java.lang.ref.SoftReference; +import java.security.AlgorithmParameters; +import java.security.CryptoPrimitive; +import java.security.Key; +import java.util.Arrays; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * This class implements the algorithm constraints for the + * "jdk.crypto.disabledAlgorithms" security property. This security property + * can be overridden by the system property of the same name. See the + * java.security file for the syntax of the property value. + */ +public class CryptoAlgorithmConstraints extends AbstractAlgorithmConstraints { + private static final Debug debug = Debug.getInstance("jca"); + + // for validating the service + private static final Set SUPPORTED_SERVICES = + Set.of("Cipher", "KeyStore", "MessageDigest", "Signature"); + + // Disabled algorithm security property for JCE crypto services + private static final String PROPERTY_CRYPTO_DISABLED_ALGS = + "jdk.crypto.disabledAlgorithms"; + + private static class CryptoHolder { + static final CryptoAlgorithmConstraints CONSTRAINTS = + new CryptoAlgorithmConstraints(PROPERTY_CRYPTO_DISABLED_ALGS); + } + + private static void debug(String msg) { + if (debug != null) { + debug.println("CryptoAlgoConstraints: ", msg); + } + } + + public static boolean permits(String service, String algo) { + return CryptoHolder.CONSTRAINTS.cachedCheckAlgorithm( + service + "." + algo); + } + + private final Set disabledServices; // syntax is . + private volatile SoftReference> cacheRef = + new SoftReference<>(null); + + /** + * Initialize algorithm constraints with the specified security property + * {@code propertyName}. Note that if a system property of the same name + * is set, it overrides the security property. + * + * @param propertyName the security property name that define the disabled + * algorithm constraints + */ + CryptoAlgorithmConstraints(String propertyName) { + super(null); + disabledServices = getAlgorithms(propertyName, true); + String[] entries = disabledServices.toArray(new String[0]); + debug("Before " + Arrays.deepToString(entries)); + + for (String dk : entries) { + int idx = dk.indexOf("."); + if (idx < 1 || idx == dk.length() - 1) { + // wrong syntax: missing "." or empty service or algorithm + throw new IllegalArgumentException("Invalid entry: " + dk); + } + String service = dk.substring(0, idx); + String algo = dk.substring(idx + 1); + if (SUPPORTED_SERVICES.stream().anyMatch(e -> e.equalsIgnoreCase + (service))) { + KnownOIDs oid = KnownOIDs.findMatch(algo); + if (oid != null) { + debug("Add oid: " + oid.value()); + disabledServices.add(service + "." + oid.value()); + debug("Add oid stdName: " + oid.stdName()); + disabledServices.add(service + "." + oid.stdName()); + for (String a : oid.aliases()) { + debug("Add oid alias: " + a); + disabledServices.add(service + "." + a); + } + } + } else { + // unsupported service + throw new IllegalArgumentException("Invalid entry: " + dk); + } + } + debug("After " + Arrays.deepToString(disabledServices.toArray())); + } + + @Override + public final boolean permits(Set notUsed1, + String serviceDesc, AlgorithmParameters notUsed2) { + throw new UnsupportedOperationException("Unsupported permits() method"); + } + + @Override + public final boolean permits(Set primitives, Key key) { + throw new UnsupportedOperationException("Unsupported permits() method"); + } + + @Override + public final boolean permits(Set primitives, + String algorithm, Key key, AlgorithmParameters parameters) { + throw new UnsupportedOperationException("Unsupported permits() method"); + } + + // Return false if algorithm is found in the disabledServices Set. + // Otherwise, return true. + private boolean cachedCheckAlgorithm(String serviceDesc) { + Map cache; + if ((cache = cacheRef.get()) == null) { + synchronized (this) { + if ((cache = cacheRef.get()) == null) { + cache = new ConcurrentHashMap<>(); + cacheRef = new SoftReference<>(cache); + } + } + } + Boolean result = cache.get(serviceDesc); + if (result != null) { + return result; + } + result = checkAlgorithm(disabledServices, serviceDesc, null); + cache.put(serviceDesc, result); + return result; + } +} diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/util/KnownOIDs.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/util/KnownOIDs.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/util/KnownOIDs.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/util/KnownOIDs.java 2026-04-17 19:09:35.000000000 +0000 @@ -185,7 +185,7 @@ @Override boolean registerNames() { return false; } }, - RSA("1.2.840.113549.1.1.1"), // RSA encryption + RSA("1.2.840.113549.1.1.1", "RSA", "RSA/ECB/PKCS1Padding"), // RSA encryption MD2withRSA("1.2.840.113549.1.1.2"), MD5withRSA("1.2.840.113549.1.1.4"), diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/util/Password.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/util/Password.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/util/Password.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/util/Password.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,11 +29,13 @@ import java.nio.*; import java.nio.charset.*; import java.util.Arrays; + import jdk.internal.access.SharedSecrets; +import jdk.internal.io.JdkConsoleImpl; +import jdk.internal.misc.VM; /** * A utility class for reading passwords - * */ public class Password { /** Reads user password from given input stream. */ @@ -50,30 +52,39 @@ char[] consoleEntered = null; byte[] consoleBytes = null; + char[] buf = null; try { // Only use Console if `in` is the initial System.in - Console con; - if (!isEchoOn && - in == SharedSecrets.getJavaLangAccess().initialSystemIn() && - ((con = System.console()) != null)) { - consoleEntered = con.readPassword(); - // readPassword returns "" if you just press ENTER with the built-in Console, - // to be compatible with old Password class, change to null - if (consoleEntered == null || consoleEntered.length == 0) { - return null; + if (!isEchoOn) { + if (in == SharedSecrets.getJavaLangAccess().initialSystemIn() + && ConsoleHolder.consoleIsAvailable()) { + consoleEntered = ConsoleHolder.readPassword(); + // readPassword might return null. Stop now. + if (consoleEntered == null) { + return null; + } + consoleBytes = ConsoleHolder.convertToBytes(consoleEntered); + in = new ByteArrayInputStream(consoleBytes); + } else if (in == System.in && VM.isBooted() + && System.in.available() == 0) { + // Warn if reading password from System.in but it's empty. + // This may be running in an IDE Run Window or in JShell, + // which acts like an interactive console and echoes the + // entered password. In this case, print a warning that + // the password might be echoed. If available() is not zero, + // it's more likely the input comes from a pipe, such as + // "echo password |" or "cat password_file |" where input + // will be silently consumed without echoing to the screen. + // Warn only if VM is booted and ResourcesMgr is available. + System.err.print(ResourcesMgr.getString + ("warning.input.may.be.visible.on.screen")); } - consoleBytes = convertToBytes(consoleEntered); - in = new ByteArrayInputStream(consoleBytes); } // Rest of the lines still necessary for KeyStoreLoginModule // and when there is no console. - - char[] lineBuffer; - char[] buf; - - buf = lineBuffer = new char[128]; + buf = new char[128]; int room = buf.length; int offset = 0; @@ -101,11 +112,11 @@ /* fall through */ default: if (--room < 0) { + char[] oldBuf = buf; buf = new char[offset + 128]; room = buf.length - offset - 1; - System.arraycopy(lineBuffer, 0, buf, 0, offset); - Arrays.fill(lineBuffer, ' '); - lineBuffer = buf; + System.arraycopy(oldBuf, 0, buf, 0, offset); + Arrays.fill(oldBuf, ' '); } buf[offset++] = (char) c; break; @@ -118,8 +129,6 @@ char[] ret = new char[offset]; System.arraycopy(buf, 0, ret, 0, offset); - Arrays.fill(buf, ' '); - return ret; } finally { if (consoleEntered != null) { @@ -128,35 +137,72 @@ if (consoleBytes != null) { Arrays.fill(consoleBytes, (byte)0); } + if (buf != null) { + Arrays.fill(buf, ' '); + } } } - /** - * Change a password read from Console.readPassword() into - * its original bytes. - * - * @param pass a char[] - * @return its byte[] format, similar to new String(pass).getBytes() - */ - private static byte[] convertToBytes(char[] pass) { - if (enc == null) { - synchronized (Password.class) { - enc = System.console() - .charset() - .newEncoder() - .onMalformedInput(CodingErrorAction.REPLACE) - .onUnmappableCharacter(CodingErrorAction.REPLACE); - } + // Everything on Console or JdkConsoleImpl is inside this class. + private static class ConsoleHolder { + + // primary console; may be null + private static final Console c1; + // secondary console (when stdout is redirected); may be null + private static final JdkConsoleImpl c2; + // encoder for c1 or c2 + private static final CharsetEncoder enc; + + static { + c1 = System.console(); + Charset charset; + if (c1 != null) { + c2 = null; + charset = c1.charset(); + } else { + c2 = JdkConsoleImpl.passwordConsole().orElse(null); + charset = (c2 != null) ? c2.charset() : null; + } + enc = charset == null ? null : charset.newEncoder() + .onMalformedInput(CodingErrorAction.REPLACE) + .onUnmappableCharacter(CodingErrorAction.REPLACE); } - byte[] ba = new byte[(int)(enc.maxBytesPerChar() * pass.length)]; - ByteBuffer bb = ByteBuffer.wrap(ba); - synchronized (enc) { - enc.reset().encode(CharBuffer.wrap(pass), bb, true); + + public static boolean consoleIsAvailable() { + return c1 != null || c2 != null; } - if (bb.position() < ba.length) { - ba[bb.position()] = '\n'; + + public static char[] readPassword() { + assert consoleIsAvailable(); + if (c1 != null) { + return c1.readPassword(); + } else { + try { + return c2.readPasswordNoNewLine(); + } finally { + System.err.println(); + } + } + } + + /** + * Convert a password read from console into its original bytes. + * + * @param pass a char[] + * @return its byte[] format, equivalent to new String(pass).getBytes() + * but String is immutable and cannot be cleaned up. + */ + public static byte[] convertToBytes(char[] pass) { + assert consoleIsAvailable(); + byte[] ba = new byte[(int) (enc.maxBytesPerChar() * pass.length)]; + ByteBuffer bb = ByteBuffer.wrap(ba); + synchronized (enc) { + enc.reset().encode(CharBuffer.wrap(pass), bb, true); + } + if (bb.remaining() > 0) { + bb.put((byte)'\n'); // will be recognized as a stop sign + } + return ba; } - return ba; } - private static volatile CharsetEncoder enc; } diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/util/Resources.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/util/Resources.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/util/Resources.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/util/Resources.java 2026-04-17 19:09:35.000000000 +0000 @@ -138,6 +138,10 @@ // sun.security.pkcs11.SunPKCS11 {"PKCS11.Token.providerName.Password.", "PKCS11 Token [{0}] Password: "}, + + // sun.security.util.Password + {"warning.input.may.be.visible.on.screen", + "[WARNING: Input may be visible on screen]\u0020"}, }; diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/validator/CADistrustPolicy.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/validator/CADistrustPolicy.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/validator/CADistrustPolicy.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/validator/CADistrustPolicy.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -85,6 +85,22 @@ } CamerfirmaTLSPolicy.checkDistrust(chain); } + }, + + /** + * Distrust TLS Server certificates anchored by the Chunghwa ePKI root CA + * and issued after March 17, 2026. If enabled, this policy is currently + * enforced by the PKIX and SunX509 TrustManager implementations + * of the SunJSSE provider implementation. + */ + CHUNGHWA_TLS { + void checkDistrust(String variant, X509Certificate[] chain) + throws ValidatorException { + if (!variant.equals(Validator.VAR_TLS_SERVER)) { + return; + } + ChunghwaTLSPolicy.checkDistrust(chain); + } }; /** diff -Nru openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/validator/ChunghwaTLSPolicy.java openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/validator/ChunghwaTLSPolicy.java --- openjdk-21-21.0.10+7/src/java.base/share/classes/sun/security/validator/ChunghwaTLSPolicy.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/classes/sun/security/validator/ChunghwaTLSPolicy.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package sun.security.validator; + +import java.security.cert.X509Certificate; +import java.time.LocalDate; +import java.time.Month; +import java.time.ZoneOffset; +import java.util.Date; +import java.util.Map; +import java.util.Set; + +import sun.security.util.Debug; +import sun.security.x509.X509CertImpl; + +/** + * This class checks if Chunghwa issued TLS Server certificates should be + * restricted. + */ +final class ChunghwaTLSPolicy { + + private static final Debug debug = Debug.getInstance("certpath"); + + // SHA-256 certificate fingerprint of distrusted root for TLS + // cacerts alias: chunghwaepkirootca + // DN: OU=ePKI Root Certification Authority, + // O="Chunghwa Telecom Co., Ltd.", C=TW + private static final String FINGERPRINT = + "C0A6F4DC63A24BFDCF54EF2A6A082A0A72DE35803E2FF5FF527AE5D87206DFD5"; + + // Any TLS Server certificate that is anchored by the Chunghwa + // root above and is issued after this date will be distrusted. + private static final LocalDate MARCH_17_2026 = + LocalDate.of(2026, Month.MARCH, 17); + + /** + * This method assumes the eeCert is a TLS Server Cert and chains back to + * the anchor. + * + * @param chain the end-entity's certificate chain. The end entity cert + * is at index 0, the trust anchor at index n-1. + * @throws ValidatorException if the certificate is distrusted + */ + static void checkDistrust(X509Certificate[] chain) + throws ValidatorException { + X509Certificate anchor = chain[chain.length-1]; + String fp = fingerprint(anchor); + if (fp == null) { + throw new ValidatorException("Cannot generate fingerprint for " + + "trust anchor of TLS server certificate"); + } + if (FINGERPRINT.equalsIgnoreCase(fp)) { + Date notBefore = chain[0].getNotBefore(); + LocalDate ldNotBefore = LocalDate.ofInstant(notBefore.toInstant(), + ZoneOffset.UTC); + // reject if certificate is issued after March 17, 2026 + checkNotBefore(ldNotBefore, MARCH_17_2026, anchor); + } + } + + private static String fingerprint(X509Certificate cert) { + return X509CertImpl.getFingerprint("SHA-256", cert, debug); + } + + // Check whether the certificate's notBeforeDate is after the + // distrust date for the anchor (root CA). Throw ValidatorException + // if it is after the distrust date. + private static void checkNotBefore(LocalDate notBeforeDate, + LocalDate distrustDate, X509Certificate anchor) + throws ValidatorException { + if (notBeforeDate.isAfter(distrustDate)) { + throw new ValidatorException + ("TLS Server certificate issued after " + distrustDate + + " and anchored by a distrusted legacy Chunghwa root CA: " + + anchor.getSubjectX500Principal(), + ValidatorException.T_UNTRUSTED_CERT, anchor); + } + } + + private ChunghwaTLSPolicy() {} +} diff -Nru openjdk-21-21.0.10+7/src/java.base/share/conf/security/java.security openjdk-21-21.0.11+10/src/java.base/share/conf/security/java.security --- openjdk-21-21.0.10+7/src/java.base/share/conf/security/java.security 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/conf/security/java.security 2026-04-17 19:09:35.000000000 +0000 @@ -788,6 +788,54 @@ ecdsa_sha1 usage HandshakeSignature, dsa_sha1 usage HandshakeSignature # +# Algorithm restrictions for Java Crypto API services +# +# In some environments, certain algorithms may be undesirable for certain +# cryptographic services. For example, "MD2" is generally no longer considered +# to be a secure hash algorithm. This section describes the mechanism for +# disabling algorithms at the JCA/JCE level based on service name and algorithm +# name. +# +# If a system property of the same name is also specified, it supersedes the +# security property value defined here. +# +# The syntax of the disabled services string is described as follows: +# "DisabledService {, DisabledService}" +# +# DisabledService: +# Service.AlgorithmName +# +# Service: (one of the following, more services may be added later) +# Cipher | KeyStore | MessageDigest | Signature +# +# AlgorithmName: +# (see below) +# +# The "AlgorithmName" is the standard algorithm name of the disabled +# service. See the Java Security Standard Algorithm Names Specification +# for information about Standard Algorithm Names. Matching is +# performed using a case-insensitive exact matching rule. For Cipher service, +# its algorithm is the transformation string. +# +# Note: If the property value contains entries with invalid syntax or +# unsupported services at the time of checking, an ExceptionInInitializerError +# with a cause of IllegalArgumentException will be thrown. +# +# Note: The restriction is applied in the various getInstance(...) methods +# of the supported Service classes, i.e. Cipher, KeyStore, MessageDigest, +# and Signature. If the algorithm is disabled, a NoSuchAlgorithmException will +# be thrown by the getInstance methods of Cipher, MessageDigest, and Signature +# and a KeyStoreException by the getInstance methods of KeyStore. +# +# Note: This property is currently used by the JDK Reference implementation. +# It is not guaranteed to be examined and used by other implementations. +# +# Example: +# jdk.crypto.disabledAlgorithms=Cipher.RSA/ECB/PKCS1Padding, MessageDigest.MD2 +# +#jdk.crypto.disabledAlgorithms= + +# # Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS) # processing in JSSE implementation. # @@ -1360,6 +1408,9 @@ # CAMERFIRMA_TLS : Distrust TLS Server certificates anchored by # a Camerfirma root CA and issued after April 15, 2025. # +# CHUNGHWA_TLS : Distrust TLS Server certificates anchored by +# a Chunghwa root CA and issued after March 17, 2026. +# # Leading and trailing whitespace surrounding each value are ignored. # Unknown values are ignored. If the property is commented out or set to the # empty String, no policies are enforced. @@ -1371,7 +1422,8 @@ # jdk.certpath.disabledAlgorithms; those restrictions are still enforced even # if this property is not enabled. # -jdk.security.caDistrustPolicies=SYMANTEC_TLS,ENTRUST_TLS,CAMERFIRMA_TLS +jdk.security.caDistrustPolicies=SYMANTEC_TLS,ENTRUST_TLS,CAMERFIRMA_TLS,\ + CHUNGHWA_TLS # # FilePermission path canonicalization diff -Nru openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/VERSION openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/VERSION --- openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/VERSION 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/VERSION 2026-04-17 19:09:35.000000000 +0000 @@ -21,4 +21,4 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -tzdata2025b +tzdata2026a diff -Nru openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/africa openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/africa --- openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/africa 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/africa 2026-04-17 19:09:35.000000000 +0000 @@ -27,9 +27,9 @@ # 2009-05-17 by Arthur David Olson. # This file is by no means authoritative; if you think you know better, -# go ahead and edit the file (and please send any changes to -# tz@iana.org for general use in the future). For more, please see -# the file CONTRIBUTING in the tz distribution. +# go ahead and edit the file, and please send any changes to +# the public mailing list tz@iana.org for general use in the future. +# For more, please see the file CONTRIBUTING in the tz distribution. # From Paul Eggert (2018-05-27): # @@ -138,8 +138,9 @@ -1:00 - %z # Chad +# Fort-Lamy was renamed to N’Djamena on 1973-04-06. # Zone NAME STDOFF RULES FORMAT [UNTIL] -Zone Africa/Ndjamena 1:00:12 - LMT 1912 Jan 1 # N'Djamena +Zone Africa/Ndjamena 1:00:12 - LMT 1912 Jan 1 # Fort-Lamy 1:00 - WAT 1979 Oct 14 1:00 1:00 WAST 1980 Mar 8 1:00 - WAT diff -Nru openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/antarctica openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/antarctica --- openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/antarctica 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/antarctica 2026-04-17 19:09:35.000000000 +0000 @@ -26,13 +26,10 @@ # This file is in the public domain, so clarified as of # 2009-05-17 by Arthur David Olson. -# From Paul Eggert (1999-11-15): -# To keep things manageable, we list only locations occupied year-round; see -# COMNAP - Stations and Bases -# http://www.comnap.aq/comnap/comnap.nsf/P/Stations/ -# and -# Summary of the Peri-Antarctic Islands (1998-07-23) -# http://www.spri.cam.ac.uk/bob/periant.htm +# From Paul Eggert (2025-08-16): +# To keep things manageable, list only locations occupied year-round; see +# Antarctic Facilities Information +# https://www.comnap.aq/antarctic-facilities-information # for information. # Unless otherwise specified, we have no time zone information. @@ -167,6 +164,7 @@ # China - year-round bases # Great Wall, King George Island, -6213-05858, since 1985-02-20 # Zhongshan, Larsemann Hills, Prydz Bay, -6922+07623, since 1989-02-26 +# Qinling, Inexpressible I, Terra Nova Bay, -7456+16343, since 2024-02-07 # France - year-round bases (also see "France & Italy") # diff -Nru openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/asia openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/asia --- openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/asia 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/asia 2026-04-17 19:09:35.000000000 +0000 @@ -27,9 +27,9 @@ # 2009-05-17 by Arthur David Olson. # This file is by no means authoritative; if you think you know better, -# go ahead and edit the file (and please send any changes to -# tz@iana.org for general use in the future). For more, please see -# the file CONTRIBUTING in the tz distribution. +# go ahead and edit the file, and please send any changes to +# the public mailing list tz@iana.org for general use in the future. +# For more, please see the file CONTRIBUTING in the tz distribution. # From Paul Eggert (2019-07-11): # diff -Nru openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/australasia openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/australasia --- openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/australasia 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/australasia 2026-04-17 19:09:35.000000000 +0000 @@ -960,9 +960,9 @@ # NOTES # This file is by no means authoritative; if you think you know better, -# go ahead and edit the file (and please send any changes to -# tz@iana.org for general use in the future). For more, please see -# the file CONTRIBUTING in the tz distribution. +# go ahead and edit the file, and please send any changes to +# the public mailing list tz@iana.org for general use in the future. +# For more, please see the file CONTRIBUTING in the tz distribution. # From Paul Eggert (2018-11-18): # @@ -2011,6 +2011,7 @@ # From Paul Eggert (2018-11-19): # The 1921-01-15 introduction of standard time is in Shanks; it is also in # "Standard Time Throughout the World", US National Bureau of Standards (1935), +# https://nvlpubs.nist.gov/nistpubs/Legacy/circ/nbscircular406.pdf # page 3, which does not give the UT offset. In response to a comment by # Phake Nick I set the Nauru time of occupation by Japan to # 1942-08-29/1945-09-08 by using dates from: @@ -2078,9 +2079,10 @@ # https://webspace.science.uu.nl/~gent0113/idl/idl_alaska_samoa.htm # Although Shanks & Pottenger says they both switched to UT -11:30 -# in 1911, and to -11 in 1950. many earlier sources give -11 +# in 1911, and to -11 in 1950, many earlier sources give -11 # for American Samoa, e.g., the US National Bureau of Standards # circular "Standard Time Throughout the World", 1932. +# https://nvlpubs.nist.gov/nistpubs/Legacy/circ/nbscircular399.pdf # Assume American Samoa switched to -11 in 1911, not 1950, # and that after 1950 they agreed until (western) Samoa skipped a # day in 2011. Assume also that the Samoas follow the US and New diff -Nru openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/etcetera openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/etcetera --- openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/etcetera 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/etcetera 2026-04-17 19:09:35.000000000 +0000 @@ -43,7 +43,8 @@ # which load the "UTC" file to handle seconds properly. Zone Etc/UTC 0 - UTC -# Functions like gmtime load the "GMT" file to handle leap seconds properly. +# If leap second support is enabled, functions like gmtime +# load the "GMT" file to handle leap seconds properly. # Vanguard section, which works with most .zi parsers. #Zone GMT 0 - GMT # Rearguard section, for TZUpdater 2.3.2 and earlier. diff -Nru openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/europe openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/europe --- openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/europe 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/europe 2026-04-17 19:09:35.000000000 +0000 @@ -27,9 +27,9 @@ # 2009-05-17 by Arthur David Olson. # This file is by no means authoritative; if you think you know better, -# go ahead and edit the file (and please send any changes to -# tz@iana.org for general use in the future). For more, please see -# the file CONTRIBUTING in the tz distribution. +# go ahead and edit the file, and please send any changes to +# the public mailing list tz@iana.org for general use in the future. +# For more, please see the file CONTRIBUTING in the tz distribution. # From Paul Eggert (2017-02-10): # @@ -65,7 +65,7 @@ # . He writes: # "It is requested that corrections and additions to these tables # may be sent to Mr. John Milne, Royal Geographical Society, -# Savile Row, London." Nowadays please email them to tz@iana.org. +# Savile Row, London." Nowadays please see the file CONTRIBUTING. # # Byalokoz EL. New Counting of Time in Russia since July 1, 1919. # This Russian-language source was consulted by Vladimir Karpinsky; see @@ -77,7 +77,7 @@ # Десятая гос. тип., 1919. # http://resolver.gpntb.ru/purl?docushare/dsweb/Get/Resource-2011/Byalokoz__E.L.__Novyy__schet__vremeni__v__techenie__sutok__izd__2(1).pdf # -# Brazil's Divisão Serviço da Hora (DSHO), +# Brazil's Divisão de Serviços da Hora (DISHO) # History of Summer Time # # (1998-09-21, in Portuguese) @@ -937,7 +937,7 @@ Rule Belgium 1923 only - Apr 21 23:00s 1:00 S Rule Belgium 1924 only - Mar 29 23:00s 1:00 S Rule Belgium 1925 only - Apr 4 23:00s 1:00 S -# DSH writes that a royal decree of 1926-02-22 specified the Sun following 3rd +# DISHO writes that a royal decree of 1926-02-22 specified the Sun following 3rd # Sat in Apr (except if it's Easter, in which case it's one Sunday earlier), # to Sun following 1st Sat in Oct, and that a royal decree of 1928-09-15 # changed the transition times to 02:00 GMT. @@ -1064,9 +1064,19 @@ # Greenland # -# From Paul Eggert (2004-10-31): +# From Paul Eggert (2026-01-22): +# During World War II, Greenland was effectively independent of Denmark and +# observed daylight saving time. TIME, volume 37, page 23 (1941-04-21) +# says, +# "Penfield and West made their way to the U.S.'s most northerly consulate. +# They were astonished to find that Greenlanders, with almost 24 hours of +# sunlight a day during the summer, have daylight saving time." +# As the details are unknown they are omitted from the data for now. +# # During World War II, Germany maintained secret manned weather stations in # East Greenland and Franz Josef Land, but we don't know their time zones. +# Also, they're likely out of scope for the database +# as we lack resources to track every bit of military activity. # My source for this is Wilhelm Dege's book mentioned under Svalbard. # # From Paul Eggert (2017-12-10): @@ -1333,6 +1343,13 @@ # France # Monaco +# From Robert H. van Gent (2025-07-21): +# The most recent issue of the Annuaire [par le Bureau des Longitudes] +# on Gallica (2021) ... lists information for France +# https://gallica.bnf.fr/ark:/12148/bpt6k9127672b/f52.item +# From Paul Eggert (2025-07-21): +# Go with the 2020 Annuaire (published 2021) except as noted below. + # From Ciro Discepolo (2000-12-20): # # Henri Le Corre, Régimes horaires pour le monde entier, Éditions @@ -1394,7 +1411,6 @@ # problems in Algiers, Monaco and Tunis. # -# Shank & Pottenger seem to use '24:00' ambiguously; resolve it with Whitman. # Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule France 1916 only - Jun 14 23:00s 1:00 S Rule France 1916 1919 - Oct Sun>=1 23:00s 0 - @@ -1406,9 +1422,25 @@ Rule France 1921 only - Mar 14 23:00s 1:00 S Rule France 1921 only - Oct 25 23:00s 0 - Rule France 1922 only - Mar 25 23:00s 1:00 S -# DSH writes that a law of 1923-05-24 specified 3rd Sat in Apr at 23:00 to 1st -# Sat in Oct at 24:00; and that in 1930, because of Easter, the transitions -# were Apr 12 and Oct 5. Go with Shanks & Pottenger. +# From Robert H. van Gent (2025-07-22): +# There is a curious history behind the erroneous date for the start of +# daylight saving in France in 1923 as listed in the current issues of +# the Annuaire du Bureau des Longitudes. [See:] +# https://lists.iana.org/hyperkitty/list/tz@iana.org/message/MYQEJMSXO2AIEZ3UIXZKMTTAIPY7KNT2/ +# From Brian Inglis (2025-07-23): +# Légifrance JORF No. 0073 du 15 mars 1922 +# https://www.legifrance.gouv.fr/jorf/jo/id/JORFCONT000000008324 +# Légifrance JORF No. 0139 du 25 mai 1923 +# https://www.legifrance.gouv.fr/jorf/jo/id/JORFCONT000000008416 +# From Paul Eggert (2025-07-23): +# The latter specifies March's last Saturday at 23:00 to October's first +# Saturday at 24:00, except that if neighboring allies agree the dates +# can be moved to April's third Saturday and September's third Saturday. +# Apparently spring 1923 was tricky. DISHO writes that in 1930, +# because of Easter, the transitions were Apr 12 and Oct 5. +# Use the 2020 Annuaire dates, except for spring 1923 where +# Shanks & Pottenger's May 26 matches the dates given in the 1924 and +# 1961-2001 issues of the Annuaire. Rule France 1922 1938 - Oct Sat>=1 23:00s 0 - Rule France 1923 only - May 26 23:00s 1:00 S Rule France 1924 only - Mar 29 23:00s 1:00 S @@ -1958,7 +1990,6 @@ # From Stepan Golosunov (2016-03-07): # the act of the government of the Republic of Moldova Nr. 132 from 1990-05-04 -# http://lex.justice.md/viewdoc.php?action=view&view=doc&id=298782&lang=2 # ... says that since 1990-05-06 on the territory of the Moldavian SSR # time would be calculated as the standard time of the second time belt # plus one hour of the "summer" time. To implement that clocks would be @@ -2013,9 +2044,61 @@ # says the 2014-03-30 spring-forward transition was at 02:00 local time. # Guess that since 1997 Moldova has switched one hour before the EU. +# From Heitor David Pinto (2026-02-22): +# Soviet Moldovan resolution 132 of 1990 defined the summer time period from +# the last Sunday in March at 2:00 to the last Sunday in September at 3:00, +# matching the dates used in most of Europe at the time: +# https://web.archive.org/web/20211107050832/http://lex.justice.md/viewdoc.php?action=view&view=doc&id=298782&lang=1 +# +# It seems that in 1996 Moldova changed the end date to October like most of +# Europe, but kept the transitions at 2:00 and 3:00 rather than 1:00 UTC, +# which would have been locally 3:00 and 4:00.... +# +# The notices in the Moldovan government website and broadcaster showed the +# transitions at 2:00 and 3:00 until 2021: +# 2015 https://old.gov.md/en/node/7304 +# 2016 https://old.gov.md/en/node/12587 +# 2017 https://old.gov.md/en/node/20654 +# 2017 https://old.gov.md/en/content/moldova-upholds-winter-time-night-28-29-october +# 2018 https://old.gov.md/en/content/moldova-switch-summer-time +# 2018 https://old.gov.md/en/content/cabinet-ministers-informs-about-switch-winter-time-28-october +# 2019 https://old.gov.md/en/content/moldova-switch-summer-time-31-march +# 2019 https://old.gov.md/en/node/31122 +# 2020 https://old.gov.md/en/node/32771 +# 2020 https://old.gov.md/en/node/34497 +# 2021 https://trm.md/ro/social/moldova-trece-in-aceasta-noapte-la-ora-de-vara +# 2021 https://trm.md/en/social/republica-moldova-trece-la-ora-de-iarna1 +# +# However, since 2022, the notices showed the transitions at 3:00 and 4:00, +# matching the EU rule at 1:00 UTC: +# 2022 https://trm.md/en/social/in-acest-weekend-republica-moldova-trece-la-ora-de-vara +# 2022 https://old.gov.md/en/content/moldova-switch-winter-time +# 2023 https://moldova1.md/p/6587/ora-de-vara-2023-cum-schimbam-acele-ceasornicelor-si-cand-trecem-la-ora-de-vara +# 2023 https://old.gov.md/en/node/46662 +# 2024 https://moldova1.md/p/26535/republica-moldova-trece-la-ora-de-vara-in-acest-weekend +# 2024 https://moldova1.md/p/37768/republica-moldova-trece-in-aceasta-noapte-la-ora-de-iarna +# 2025 https://moldova1.md/p/46349/republica-moldova-trece-la-ora-de-vara-pe-30-martie-cum-ne-afecteaza-si-ce-recomanda-medicii +# 2025 https://moldova1.md/p/60469/republica-moldova-trece-la-ora-de-iarna-ceasurile-se-dau-inapoi-cu-o-ora +# +# It seems that the changes to the end date and transition times were just +# done in practice without formally changing the resolution. In late 2025, the +# government said that the Soviet resolution was still in force, and proposed +# a new resolution to replace it and formally establish the EU rule: +# ... based on the notices, it seems that in practice Moldova already +# uses the EU rule since 2022. This was also the year when Moldova applied to +# join the EU. +# +# From Robert Bastian (2026-02-26): +# This has been approved and published in the government gazette: +# https://monitorul.gov.md/ro/monitorul/view/pdf/3234/part/2#page=27 +# +# From Paul Eggert (2026-02-24): +# Also see Svetlana Rudenko, "Moldova abandons the 'Soviet era'", Logos Press, +# 2026-02-21 . + # Rule NAME FROM TO - IN ON AT SAVE LETTER/S -Rule Moldova 1997 max - Mar lastSun 2:00 1:00 S -Rule Moldova 1997 max - Oct lastSun 3:00 0 - +Rule Moldova 1997 2021 - Mar lastSun 2:00 1:00 S +Rule Moldova 1997 2021 - Oct lastSun 3:00 0 - # Zone NAME STDOFF RULES FORMAT [UNTIL] Zone Europe/Chisinau 1:55:20 - LMT 1880 @@ -2028,7 +2111,8 @@ 2:00 Russia EE%sT 1992 2:00 E-Eur EE%sT 1997 # See Romania commentary for the guessed 1997 transition to EU rules. - 2:00 Moldova EE%sT + 2:00 Moldova EE%sT 2022 + 2:00 EU EE%sT # Poland @@ -2119,12 +2203,10 @@ # all clocks therefore having to be advanced or set back correspondingly ... # Rule NAME FROM TO - IN ON AT SAVE LETTER/S -# From Tim Parenti (2024-07-01), per Paul Eggert (1999-01-30): -# DSH writes in their history that Decreto 1469 of 1915-03-30 established -# summer time and that, "despite" this, the change to the clocks was not done -# every year, depending on what Spain did, because of railroad schedules. -# In fact, that decree had nothing to do with DST; rather, it regulated the -# sending of time signals. But we do see linkage to Spain in the 1920s below. +# From Tim Parenti (2024-07-01): +# Decreto 1469 of 1915-03-30 ... had nothing to do with DST; +# rather it regulated the sending of time signals. +# But we do see linkage to Spain in the 1920s below. # https://dre.pt/dr/detalhe/decreto/1469-1915-285721 # https://dre.pt/application/conteudo/285721 # @@ -2416,7 +2498,7 @@ # Nine O'clock # (1998-10-23) reports that the switch occurred at # 04:00 local time in fall 1998. For lack of better info, -# assume that Romania and Moldova switched to EU rules in 1997, +# assume that Romania switched to EU rules in 1997, # the same year as Bulgaria. # # Rule NAME FROM TO - IN ON AT SAVE LETTER/S diff -Nru openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/iso3166.tab openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/iso3166.tab --- openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/iso3166.tab 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/iso3166.tab 2026-04-17 19:09:35.000000000 +0000 @@ -26,22 +26,22 @@ # This file is in the public domain, so clarified as of # 2009-05-17 by Arthur David Olson. # -# From Paul Eggert (2023-09-06): +# From Paul Eggert (2025-07-01): # This file contains a table of two-letter country codes. Columns are -# separated by a single tab. Lines beginning with '#' are comments. +# separated by a single tab. Lines beginning with ‘#’ are comments. # All text uses UTF-8 encoding. The columns of the table are as follows: # # 1. ISO 3166-1 alpha-2 country code, current as of -# ISO/TC 46 N1108 (2023-04-05). See: ISO/TC 46 Documents +# ISO/TC 46 N1127 (2024-02-29). See: ISO/TC 46 Documents # https://www.iso.org/committee/48750.html?view=documents # 2. The usual English name for the coded region. This sometimes # departs from ISO-listed names, sometimes so that sorted subsets -# of names are useful (e.g., "Samoa (American)" and "Samoa -# (western)" rather than "American Samoa" and "Samoa"), +# of names are useful (e.g., “Samoa (American)” and “Samoa +# (western)” rather than “American Samoa” and “Samoa”), # sometimes to avoid confusion among non-experts (e.g., -# "Czech Republic" and "Turkey" rather than "Czechia" and "Türkiye"), -# and sometimes to omit needless detail or churn (e.g., "Netherlands" -# rather than "Netherlands (the)" or "Netherlands (Kingdom of the)"). +# “Czech Republic” and “Turkey” rather than “Czechia” and “Türkiye”), +# and sometimes to omit needless detail or churn (e.g., “Netherlands” +# rather than “Netherlands (the)” or “Netherlands (Kingdom of the)”). # # The table is sorted by country code. # @@ -94,7 +94,7 @@ CF Central African Rep. CG Congo (Rep.) CH Switzerland -CI Côte d'Ivoire +CI Côte d’Ivoire CK Cook Islands CL Chile CM Cameroon diff -Nru openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/leapseconds openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/leapseconds --- openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/leapseconds 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/leapseconds 2026-04-17 19:09:35.000000000 +0000 @@ -28,7 +28,8 @@ # This file is generated automatically from the data in the public-domain # NIST/IERS format leap-seconds.list file, which can be copied from # -# or, in a variant with different comments, from +# or via a less-secure protocol and with different comments and +# less volatile last-modified and expiration timestamps, from # . # For more about leap-seconds.list, please see # The NTP Timescale and Leap Seconds @@ -92,11 +93,17 @@ # Any additional leap seconds will come after this. # This Expires line is commented out for now, # so that pre-2020a zic implementations do not reject this file. -#Expires 2025 Dec 28 00:00:00 +#Expires 2026 Dec 28 00:00:00 -# POSIX timestamps for the data in this file: -#updated 1736208000 (2025-01-07 00:00:00 UTC) -#expires 1766880000 (2025-12-28 00:00:00 UTC) +# Here are POSIX timestamps for the data in this file. +# "#updated" gives the last time the leap seconds data changed +# or, if this file was derived from the IERS leap-seconds.list, +# the last time that file changed in any way. +# "#expires" gives the first time this file might be wrong; +# if this file was derived from the IERS leap-seconds.list, +# this is typically a bit less than one year after "updated". +#updated 1767698058 (2026-01-06 11:14:18 UTC) +#expires 1798416000 (2026-12-28 00:00:00 UTC) # Updated through IERS Bulletin C (https://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat) -# File expires on 28 December 2025 +# File expires on 28 December 2026 diff -Nru openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/northamerica openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/northamerica --- openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/northamerica 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/northamerica 2026-04-17 19:09:35.000000000 +0000 @@ -29,9 +29,9 @@ # also includes Central America and the Caribbean # This file is by no means authoritative; if you think you know better, -# go ahead and edit the file (and please send any changes to -# tz@iana.org for general use in the future). For more, please see -# the file CONTRIBUTING in the tz distribution. +# go ahead and edit the file, and please send any changes to +# the public mailing list tz@iana.org for general use in the future. +# For more, please see the file CONTRIBUTING in the tz distribution. # From Paul Eggert (1999-03-22): # A reliable and entertaining source about time zones is @@ -1241,6 +1241,16 @@ # _Los Angeles Times_ (1998-11-10), A1, A10; it cites # Jimmy Skaggs, _The Great Guano Rush_ (1994). +# From Rob van Gent (2025-07-23): +# Another useful source for historical time zone information appears to be +# a series of circulars with the title "Standard Time Throughout the World" +# issued between 1925 and 1950 by the U.S. Bureau of Standards. +# I found the following issues online: +# https://nvlpubs.nist.gov/nistpubs/Legacy/circ/nbscircular280.pdf (1925) +# https://nvlpubs.nist.gov/nistpubs/Legacy/circ/nbscircular399.pdf (1932) +# https://nvlpubs.nist.gov/nistpubs/Legacy/circ/nbscircular406.pdf (1935) +# https://nvlpubs.nist.gov/nistpubs/Legacy/circ/nbscircular496.pdf (1950) + ################################################################################ @@ -2457,12 +2467,35 @@ # on the same dates or with a difference of one day. # So it may be easier to implement these changes as DST with rule CA # during this whole period. -# -# From Paul Eggert (2024-08-18): -# For now, maintain the slightly-different history for Baja California, + +# From Alois Treindl (2025-07-29): +# I did a quick newspaper archive research on https://hndm.iib.unam.mx/ +# and found that Periódico Oficial del Estado de Baja California Norte +# (1973-04-20) states clearly that DST was observed from last Sunday +# in April to last Sunday in October.... I have a few more data from the +# official bulletin for DST begin or end in Baja California 1964 1967 1969 +# 1972 1973 (already sent) 1974 1975 1976 I do not know whether it is safe to +# assume that it also applied in the years where I did not yet find proof. +# The 1974 end of DST contains a reference to an Acuerdo of 1973-dec-20 which +# I could not find.... One might assume that Baja California, which followed +# US-CA in all these other yours, did the same. +# +# From Paul Eggert (2025-08-04): +# Assume that Tijuana agreed with San Diego from 1953 through 1996, +# as this agrees with Alois Treindl's data and with Shanks. +# For now, keep the slightly-different 1948/1952 history for Baja California, # as we have no information on whether 1948/1952 clocks in Tijuana followed # the decrees or followed San Diego. +# From Mark Schapiro, writing in The Nation (2002-10-28): +# https://www.thenation.com/article/archive/sowing-disaster/ +# When Mexican clocks were turned back for daylight saving time in the spring, +# the Zapotecs refused to make the adjustment, insisting that they live in +# "God's time," not in what they derisively call "Fox time," referring to +# President Vicente Fox in far-off Mexico City. +# From Paul Eggert (2025-08-04): +# Unfortunately we have no data to track this informal practice. + # From Alan Perry (1996-02-15): # A guy from our Mexico subsidiary finally found the Presidential Decree # outlining the timezone changes in Mexico. @@ -2728,7 +2761,7 @@ # Chihuahua (near US border - western side) # This includes the municipios of Janos, Ascensión, Juárez, Guadalupe, and # Práxedis G Guerrero. -# http://gaceta.diputados.gob.mx/PDF/65/2a022/nov/20221124-VII.pdf +# https://gaceta.diputados.gob.mx/PDF/65/2022/nov/20221124-VII.pdf Zone America/Ciudad_Juarez -7:05:56 - LMT 1922 Jan 1 7:00u -7:00 - MST 1927 Jun 10 -6:00 - CST 1930 Nov 15 @@ -2743,7 +2776,7 @@ # Chihuahua (near US border - eastern side) # This includes the municipios of Coyame del Sotol, Ojinaga, and Manuel # Benavides. -# http://gaceta.diputados.gob.mx/PDF/65/2a022/nov/20221124-VII.pdf +# https://gaceta.diputados.gob.mx/PDF/65/2022/nov/20221124-VII.pdf Zone America/Ojinaga -6:57:40 - LMT 1922 Jan 1 7:00u -7:00 - MST 1927 Jun 10 -6:00 - CST 1930 Nov 15 @@ -2840,9 +2873,7 @@ -8:00 1:00 PDT 1951 Sep 30 2:00 -8:00 - PST 1952 Apr 27 2:00 -8:00 1:00 PDT 1952 Sep 28 2:00 - -8:00 - PST 1954 - -8:00 CA P%sT 1961 - -8:00 - PST 1976 + -8:00 CA P%sT 1967 -8:00 US P%sT 1996 -8:00 Mexico P%sT 2001 -8:00 US P%sT 2002 Feb 20 diff -Nru openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/southamerica openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/southamerica --- openjdk-21-21.0.10+7/src/java.base/share/data/tzdata/southamerica 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/data/tzdata/southamerica 2026-04-17 19:09:35.000000000 +0000 @@ -27,9 +27,9 @@ # 2009-05-17 by Arthur David Olson. # This file is by no means authoritative; if you think you know better, -# go ahead and edit the file (and please send any changes to -# tz@iana.org for general use in the future). For more, please see -# the file CONTRIBUTING in the tz distribution. +# go ahead and edit the file, and please send any changes to +# the public mailing list tz@iana.org for general use in the future. +# For more, please see the file CONTRIBUTING in the tz distribution. # From Paul Eggert (2016-12-05): # diff -Nru openjdk-21-21.0.10+7/src/java.base/share/legal/gcc.md openjdk-21-21.0.11+10/src/java.base/share/legal/gcc.md --- openjdk-21-21.0.10+7/src/java.base/share/legal/gcc.md 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/legal/gcc.md 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,2084 @@ +## GCC - libgcc and libstdc++ 14.2.0 + +### GNU GENERAL PUBLIC LICENSE v3 + +``` + Version 3, 29 June 2007 + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + Preamble + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + The precise terms and conditions for copying, distribution and +modification follow. + TERMS AND CONDITIONS + 0. Definitions. + "This License" refers to version 3 of the GNU General Public License. + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + A "covered work" means either the unmodified Program or a work based +on the Program. + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + 1. Source Code. + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + The Corresponding Source for a work in source code form is that +same work. + 2. Basic Permissions. + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + 4. Conveying Verbatim Copies. + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + 5. Conveying Modified Source Versions. + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + 6. Conveying Non-Source Forms. + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + 7. Additional Terms. + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + 8. Termination. + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + 9. Acceptance Not Required for Having Copies. + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + 10. Automatic Licensing of Downstream Recipients. + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + 11. Patents. + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + 12. No Surrender of Others' Freedom. + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + 13. Use with the GNU Affero General Public License. + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + 14. Revised Versions of this License. + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + 15. Disclaimer of Warranty. + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 16. Limitation of Liability. + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + 17. Interpretation of Sections 15 and 16. + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + END OF TERMS AND CONDITIONS + How to Apply These Terms to Your New Programs + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + Copyright (C) + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program. If not, see . +Also add information on how to contact you by electronic and paper mail. + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. +``` + +### GCC RUNTIME LIBRARY EXCEPTION v3.1 + +``` +Version 3.1, 31 March 2009 +Copyright (C) 2009 Free Software Foundation, Inc. +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. +This GCC Runtime Library Exception ("Exception") is an additional +permission under section 7 of the GNU General Public License, version +3 ("GPLv3"). It applies to a given file (the "Runtime Library") that +bears a notice placed by the copyright holder of the file stating that +the file is governed by GPLv3 along with this Exception. +When you use GCC to compile a program, GCC may combine portions of +certain GCC header files and runtime libraries with the compiled +program. The purpose of this Exception is to allow compilation of +non-GPL (including proprietary) programs to use, in this way, the +header files and runtime libraries covered by this Exception. +0. Definitions. +A file is an "Independent Module" if it either requires the Runtime +Library for execution after a Compilation Process, or makes use of an +interface provided by the Runtime Library, but is not otherwise based +on the Runtime Library. +"GCC" means a version of the GNU Compiler Collection, with or without +modifications, governed by version 3 (or a specified later version) of +the GNU General Public License (GPL) with the option of using any +subsequent versions published by the FSF. +"GPL-compatible Software" is software whose conditions of propagation, +modification and use would permit combination with GCC in accord with +the license of GCC. +"Target Code" refers to output from any compiler for a real or virtual +target processor architecture, in executable form or suitable for +input to an assembler, loader, linker and/or execution +phase. Notwithstanding that, Target Code does not include data in any +format that is used as a compiler intermediate representation, or used +for producing a compiler intermediate representation. +The "Compilation Process" transforms code entirely represented in +non-intermediate languages designed for human-written code, and/or in +Java Virtual Machine byte code, into Target Code. Thus, for example, +use of source code generators and preprocessors need not be considered +part of the Compilation Process, since the Compilation Process can be +understood as starting with the output of the generators or +preprocessors. +A Compilation Process is "Eligible" if it is done using GCC, alone or +with other GPL-compatible software, or if it is done without using any +work based on GCC. For example, using non-GPL-compatible Software to +optimize any GCC intermediate representations would not qualify as an +Eligible Compilation Process. +1. Grant of Additional Permission. +You have permission to propagate a work of Target Code formed by +combining the Runtime Library with Independent Modules, even if such +propagation would otherwise violate the terms of GPLv3, provided that +all Target Code was generated by Eligible Compilation Processes. You +may then convey such a combination under terms of your choice, +consistent with the licensing of the Independent Modules. +2. No Weakening of GCC Copyleft. +The availability of this Exception does not imply any general +presumption that third-party software is unaffected by the copyleft +requirements of the license of GCC. +``` + +### GNU GENERAL PUBLIC LICENSE v2 + +``` + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + Preamble + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + NO WARRANTY + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + Copyright (C) + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +Also add information on how to contact you by electronic and paper mail. +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + , 1 April 1989 + Ty Coon, President of Vice +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. +``` + +### GNU LESSER GENERAL PUBLIC LICENSE v3 + +``` + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + 0. Additional Definitions. + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + 1. Exception to Section 3 of the GNU GPL. + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + 2. Conveying Modified Versions. + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + 3. Object Code Incorporating Material from Library Header Files. + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + b) Accompany the object code with a copy of the GNU GPL and this license + document. + 4. Combined Works. + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + d) Do one of the following: + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + 5. Combined Libraries. + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + 6. Revised Versions of the GNU Lesser General Public License. + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. +``` + +### GNU LESSER GENERAL PUBLIC LICENSE v2.1 + +``` + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + Preamble + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations +below. + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it +becomes a de-facto standard. To achieve this, non-free programs must +be allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control +compilation and installation of the library. + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + a) The modified work must itself be a software library. + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + c) Accompany the work with a written offer, valid for at least + three years, to give the same user the materials specified in + Subsection 6a, above, for a charge no more than the cost of + performing this distribution. + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply, and the section as a whole is intended to apply in other +circumstances. +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License +may add an explicit geographical distribution limitation excluding those +countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + NO WARRANTY + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms +of the ordinary General Public License). + To apply these terms, attach the following notices to the library. +It is safest to attach them to the start of each source file to most +effectively convey the exclusion of warranty; and each file should +have at least the "copyright" line and a pointer to where the full +notice is found. + + Copyright (C) + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +Also add information on how to contact you by electronic and paper mail. +You should also get your employer (if you work as a programmer) or +your school, if any, to sign a "copyright disclaimer" for the library, +if necessary. Here is a sample; alter the names: + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James + Random Hacker. + , 1 April 1990 + Ty Coon, President of Vice +That's all there is to it! +``` + +### GNU Free Documentation License v1.3 + +``` + GNU Free Documentation License + Version 1.3, 3 November 2008 + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. +0. PREAMBLE +The purpose of this License is to make a manual, textbook, or other +functional and useful document "free" in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. +1. APPLICABILITY AND DEFINITIONS +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The "Document", below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as "you". You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not "Transparent" is called "Opaque". +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. +The "publisher" means any person or entity that distributes copies of +the Document to the public. +A section "Entitled XYZ" means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as "Acknowledgements", +"Dedications", "Endorsements", or "History".) To "Preserve the Title" +of such a section when you modify the Document means that it remains a +section "Entitled XYZ" according to this definition. +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. +2. VERBATIM COPYING +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no +other conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. +3. COPYING IN QUANTITY +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to +give them a chance to provide you with an updated version of the +Document. +4. MODIFICATIONS +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has fewer than five), + unless they release you from this requirement. +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. +D. Preserve all the copyright notices of the Document. +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. +H. Include an unaltered copy of this License. +I. Preserve the section Entitled "History", Preserve its Title, and add + to it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section Entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. +K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section all + the substance and tone of each of the contributor acknowledgements + and/or dedications given therein. +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. +M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. +N. Do not retitle any existing section to be Entitled "Endorsements" + or to conflict in title with any Invariant Section. +O. Preserve any Warranty Disclaimers. +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. +You may add a section Entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. +5. COMBINING DOCUMENTS +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. +In the combination, you must combine any sections Entitled "History" +in the various original documents, forming one section Entitled +"History"; likewise combine any sections Entitled "Acknowledgements", +and any sections Entitled "Dedications". You must delete all sections +Entitled "Endorsements". +6. COLLECTIONS OF DOCUMENTS +You may make a collection consisting of the Document and other +documents released under this License, and replace the individual +copies of this License in the various documents with a single copy +that is included in the collection, provided that you follow the rules +of this License for verbatim copying of each of the documents in all +other respects. +You may extract a single document from such a collection, and +distribute it individually under this License, provided you insert a +copy of this License into the extracted document, and follow this +License in all other respects regarding verbatim copying of that +document. +7. AGGREGATION WITH INDEPENDENT WORKS +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. +8. TRANSLATION +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. +If a section in the Document is Entitled "Acknowledgements", +"Dedications", or "History", the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. +9. TERMINATION +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. +10. FUTURE REVISIONS OF THIS LICENSE +The Free Software Foundation may publish new, revised versions of the +GNU Free Documentation License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. +11. RELICENSING +"Massive Multiauthor Collaboration Site" (or "MMC Site") means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +"Massive Multiauthor Collaboration" (or "MMC") contained in the site +means any set of copyrightable works thus published on the MMC site. +"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. +"Incorporate" means to publish or republish a Document, in whole or in +part, as part of another Document. +An MMC is "eligible for relicensing" if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole or +in part into the MMC, (1) had no cover texts or invariant sections, and +(2) were thus incorporated prior to November 1, 2008. +The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. +ADDENDUM: How to use this License for your documents +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License". +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. +``` + +### The Regents of the University of California + +``` +/*- + * Copyright (c) 1991 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 3. [rescinded 22 July 1999] + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + */ +``` + +### The Go Authors + +``` +Copyright (c) 2009 The Go 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. +``` + +### Apache License v2.0 + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + 1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + Copyright [yyyy] [name of copyright owner] + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + diff -Nru openjdk-21-21.0.10+7/src/java.base/share/legal/zlib.md openjdk-21-21.0.11+10/src/java.base/share/legal/zlib.md --- openjdk-21-21.0.10+7/src/java.base/share/legal/zlib.md 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.base/share/legal/zlib.md 2026-04-17 19:09:35.000000000 +0000 @@ -1,9 +1,9 @@ -## zlib v1.3.1 +## zlib v1.3.2 ### zlib License

 
-Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
+Copyright (C) 1995-2026 Jean-loup Gailly and Mark Adler
 
 This software is provided 'as-is', without any express or implied
 warranty.  In no event will the authors be held liable for any damages
diff -Nru openjdk-21-21.0.10+7/src/java.base/share/native/libzip/zip_util.c openjdk-21-21.0.11+10/src/java.base/share/native/libzip/zip_util.c
--- openjdk-21-21.0.10+7/src/java.base/share/native/libzip/zip_util.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.base/share/native/libzip/zip_util.c	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2026, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -575,7 +575,7 @@
 readCEN(jzfile *zip, jint knownTotal)
 {
     /* Following are unsigned 32-bit */
-    jlong endpos, end64pos, cenpos, cenlen, cenoff;
+    jlong endpos, end64pos, cenpos, cenlen, cenoff, total64;
     /* Following are unsigned 16-bit */
     jint total, tablelen, i, j;
     unsigned char *cenbuf = NULL;
@@ -609,7 +609,16 @@
         if ((end64pos = findEND64(zip, end64buf, endpos)) != -1) {
             cenlen = ZIP64_ENDSIZ(end64buf);
             cenoff = ZIP64_ENDOFF(end64buf);
-            total = (jint)ZIP64_ENDTOT(end64buf);
+            total64 = ZIP64_ENDTOT(end64buf);
+            /* ZIP64 size, offset and total-count fields are unsigned 64-bit
+             * values. Sizes and offsets that do not fit in signed jlong
+             * (i.e., >= 2^63), or total values that do not fit in jint, are
+             * not supported and indicate a corrupt or invalid zip file.
+             */
+            if (cenlen < 0 || cenoff < 0 || total64 < 0 || total64 > INT_MAX) {
+                ZIP_FORMAT_ERROR("Zip64 END values exceed supported size");
+            }
+            total = (jint)total64;
             endpos = end64pos;
             endhdrlen = ZIP64_ENDHDR;
         }
@@ -1140,20 +1149,8 @@
     }
 }
 
-/*
- * Returns the zip entry corresponding to the specified name, or
- * NULL if not found.
- */
-jzentry *
-ZIP_GetEntry(jzfile *zip, char *name, jint ulen)
-{
-    if (ulen == 0) {
-        return ZIP_GetEntry2(zip, name, (jint)strlen(name), JNI_FALSE);
-    }
-    return ZIP_GetEntry2(zip, name, ulen, JNI_TRUE);
-}
-
-jboolean equals(char* name1, int len1, char* name2, int len2) {
+static jboolean
+equals(const char* name1, int len1, const char* name2, int len2) {
     if (len1 != len2) {
         return JNI_FALSE;
     }
@@ -1165,16 +1162,12 @@
     return JNI_TRUE;
 }
 
-/*
- * Returns the zip entry corresponding to the specified name, or
- * NULL if not found.
- * This method supports embedded null character in "name", use ulen
- * for the length of "name".
- */
 jzentry *
-ZIP_GetEntry2(jzfile *zip, char *name, jint ulen, jboolean addSlash)
+ZIP_GetEntry(jzfile *zip, const char *name)
 {
-    unsigned int hsh = hashN(name, ulen);
+    // length of the entry name being searched for
+    const jint name_len =  (jint) strlen(name);
+    const unsigned int hsh = hashN(name, name_len);
     jint idx;
     jzentry *ze = 0;
 
@@ -1185,79 +1178,47 @@
 
     idx = zip->table[hsh % zip->tablelen];
 
+    /* Check the cached entry first */
+    ze = zip->cache;
+    if (ze && equals(ze->name, ze->nlen, name, name_len)) {
+        /* Cache hit!  Remove and return the cached entry. */
+        zip->cache = 0;
+        ZIP_Unlock(zip);
+        return ze;
+    }
+    ze = 0;
+
     /*
-     * This while loop is an optimization where a double lookup
-     * for name and name+/ is being performed. The name char
-     * array has enough room at the end to try again with a
-     * slash appended if the first table lookup does not succeed.
+     * Search down the target hash chain for a cell whose
+     * 32 bit hash matches the hashed name.
      */
-    while(1) {
+    while (idx != ZIP_ENDCHAIN) {
+        jzcell *zc = &zip->entries[idx];
 
-        /* Check the cached entry first */
-        ze = zip->cache;
-        if (ze && equals(ze->name, ze->nlen, name, ulen)) {
-            /* Cache hit!  Remove and return the cached entry. */
-            zip->cache = 0;
-            ZIP_Unlock(zip);
-            return ze;
-        }
-        ze = 0;
-
-        /*
-         * Search down the target hash chain for a cell whose
-         * 32 bit hash matches the hashed name.
-         */
-        while (idx != ZIP_ENDCHAIN) {
-            jzcell *zc = &zip->entries[idx];
-
-            if (zc->hash == hsh) {
-                /*
-                 * OK, we've found a ZIP entry whose 32 bit hashcode
-                 * matches the name we're looking for.  Try to read
-                 * its entry information from the CEN.  If the CEN
-                 * name matches the name we're looking for, we're
-                 * done.
-                 * If the names don't match (which should be very rare)
-                 * we keep searching.
-                 */
-                ze = newEntry(zip, zc, ACCESS_RANDOM);
-                if (ze && equals(ze->name, ze->nlen, name, ulen)) {
-                    break;
-                }
-                if (ze != 0) {
-                    /* We need to release the lock across the free call */
-                    ZIP_Unlock(zip);
-                    ZIP_FreeEntry(zip, ze);
-                    ZIP_Lock(zip);
-                }
-                ze = 0;
+        if (zc->hash == hsh) {
+            /*
+             * OK, we've found a ZIP entry whose 32 bit hashcode
+             * matches the name we're looking for.  Try to read
+             * its entry information from the CEN.  If the CEN
+             * name matches the name we're looking for, we're
+             * done.
+             * If the names don't match (which should be very rare)
+             * we keep searching.
+             */
+            ze = newEntry(zip, zc, ACCESS_RANDOM);
+            if (ze && equals(ze->name, ze->nlen, name, name_len)) {
+                break;
             }
-            idx = zc->next;
-        }
-
-        /* Entry found, return it */
-        if (ze != 0) {
-            break;
-        }
-
-        /* If no need to try appending slash, we are done */
-        if (!addSlash) {
-            break;
-        }
-
-        /* Slash is already there? */
-        if (ulen > 0 && name[ulen - 1] == '/') {
-            break;
+            if (ze != 0) {
+                /* We need to release the lock across the free call */
+                ZIP_Unlock(zip);
+                ZIP_FreeEntry(zip, ze);
+                ZIP_Lock(zip);
+            }
+            ze = 0;
         }
-
-        /* Add slash and try once more */
-        name[ulen++] = '/';
-        name[ulen] = '\0';
-        hsh = hash_append(hsh, '/');
-        idx = zip->table[hsh % zip->tablelen];
-        addSlash = JNI_FALSE;
+        idx = zc->next;
     }
-
 Finally:
     ZIP_Unlock(zip);
     return ze;
@@ -1469,9 +1430,9 @@
  * has the size bigger than 2**32 bytes in ONE invocation.
  */
 JNIEXPORT jzentry *
-ZIP_FindEntry(jzfile *zip, char *name, jint *sizeP, jint *nameLenP)
+ZIP_FindEntry(jzfile *zip, const char *name, jint *sizeP, jint *nameLenP)
 {
-    jzentry *entry = ZIP_GetEntry(zip, name, 0);
+    jzentry *entry = ZIP_GetEntry(zip, name);
     if (entry) {
         *sizeP = (jint)entry->size;
         *nameLenP = (jint)strlen(entry->name);
diff -Nru openjdk-21-21.0.10+7/src/java.base/share/native/libzip/zip_util.h openjdk-21-21.0.11+10/src/java.base/share/native/libzip/zip_util.h
--- openjdk-21-21.0.10+7/src/java.base/share/native/libzip/zip_util.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.base/share/native/libzip/zip_util.h	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2026, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -241,8 +241,15 @@
  */
 #define ZIP_ENDCHAIN ((jint)-1)
 
+/*
+ * Returns the ZIP entry corresponding to the given (NULL terminated)
+ * entry name. Returns NULL if no entry is found by that name.
+ * If the entry is found, then the value of the given sizeP will be
+ * updated to the ZIP entry's size and the value of nameLenP will be
+ * updated to the ZIP entry name's length.
+ */
 JNIEXPORT jzentry *
-ZIP_FindEntry(jzfile *zip, char *name, jint *sizeP, jint *nameLenP);
+ZIP_FindEntry(jzfile *zip, const char *name, jint *sizeP, jint *nameLenP);
 
 JNIEXPORT jboolean
 ZIP_ReadEntry(jzfile *zip, jzentry *entry, unsigned char *buf, char *entrynm);
@@ -268,8 +275,12 @@
 JNIEXPORT void
 ZIP_Close(jzfile *zip);
 
+/*
+ * Returns the ZIP entry corresponding to the given (NULL terminated)
+ * entry name. Returns NULL if no entry is found by that name.
+ */
 jzentry *
-ZIP_GetEntry(jzfile *zip, char *name, jint ulen);
+ZIP_GetEntry(jzfile *zip, const char *name);
 void
 ZIP_Lock(jzfile *zip);
 void
@@ -279,7 +290,6 @@
 void
 ZIP_FreeEntry(jzfile *zip, jzentry *ze);
 jlong ZIP_GetEntryDataOffset(jzfile *zip, jzentry *entry);
-jzentry * ZIP_GetEntry2(jzfile *zip, char *name, jint ulen, jboolean addSlash);
 
 JNIEXPORT jboolean
 ZIP_InflateFully(void *inBuf, jlong inLen, void *outBuf, jlong outLen, char **pmsg);
diff -Nru openjdk-21-21.0.10+7/src/java.base/unix/classes/sun/nio/ch/DatagramDispatcher.java openjdk-21-21.0.11+10/src/java.base/unix/classes/sun/nio/ch/DatagramDispatcher.java
--- openjdk-21-21.0.10+7/src/java.base/unix/classes/sun/nio/ch/DatagramDispatcher.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.base/unix/classes/sun/nio/ch/DatagramDispatcher.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -39,46 +39,43 @@
         IOUtil.load();
     }
 
+    @Override
     int read(FileDescriptor fd, long address, int len) throws IOException {
         return read0(fd, address, len);
     }
 
+    @Override
     long readv(FileDescriptor fd, long address, int len) throws IOException {
         return readv0(fd, address, len);
     }
 
+    @Override
     int write(FileDescriptor fd, long address, int len) throws IOException {
         return write0(fd, address, len);
     }
 
+    @Override
     long writev(FileDescriptor fd, long address, int len) throws IOException {
         return writev0(fd, address, len);
     }
 
-    void close(FileDescriptor fd) throws IOException {
-        close0(fd);
-    }
-
-    void preClose(FileDescriptor fd) throws IOException {
-        preClose0(fd);
-    }
-
+    @Override
     void dup(FileDescriptor fd1, FileDescriptor fd2) throws IOException {
         dup0(fd1, fd2);
     }
 
-    static native int read0(FileDescriptor fd, long address, int len)
+    private static native int read0(FileDescriptor fd, long address, int len)
         throws IOException;
 
-    static native long readv0(FileDescriptor fd, long address, int len)
+    private static native long readv0(FileDescriptor fd, long address, int len)
         throws IOException;
 
-    static native int write0(FileDescriptor fd, long address, int len)
+    private static native int write0(FileDescriptor fd, long address, int len)
         throws IOException;
 
-    static native long writev0(FileDescriptor fd, long address, int len)
+    private static native long writev0(FileDescriptor fd, long address, int len)
         throws IOException;
 
-    static native void dup0(FileDescriptor fd1, FileDescriptor fd2)
+    private static native void dup0(FileDescriptor fd1, FileDescriptor fd2)
         throws IOException;
 }
diff -Nru openjdk-21-21.0.10+7/src/java.base/unix/classes/sun/nio/ch/NativeThread.java openjdk-21-21.0.11+10/src/java.base/unix/classes/sun/nio/ch/NativeThread.java
--- openjdk-21-21.0.10+7/src/java.base/unix/classes/sun/nio/ch/NativeThread.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.base/unix/classes/sun/nio/ch/NativeThread.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -86,6 +86,17 @@
         return (tid == VIRTUAL_THREAD_ID);
     }
 
+    /**
+     * Return true if the operating system supports pending signals. If a signal is sent
+     * to a thread but cannot be delivered immediately then it will be delivered when the
+     * thread is in the appropriate state.
+     */
+    static boolean supportPendingSignals() {
+        return supportPendingSignals0();
+    }
+
+    private static native boolean supportPendingSignals0();
+
     // Returns an opaque token representing the native thread underlying the
     // invoking Java thread.  On systems that do not require signalling, this
     // method always returns 0.
diff -Nru openjdk-21-21.0.10+7/src/java.base/unix/classes/sun/nio/ch/SinkChannelImpl.java openjdk-21-21.0.11+10/src/java.base/unix/classes/sun/nio/ch/SinkChannelImpl.java
--- openjdk-21-21.0.10+7/src/java.base/unix/classes/sun/nio/ch/SinkChannelImpl.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.base/unix/classes/sun/nio/ch/SinkChannelImpl.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -42,7 +42,7 @@
     implements SelChImpl
 {
     // Used to make native read and write calls
-    private static final NativeDispatcher nd = new FileDispatcherImpl();
+    private static final NativeDispatcher nd = new SocketDispatcher();
 
     // The file descriptor associated with this channel
     private final FileDescriptor fd;
@@ -152,15 +152,7 @@
             assert state < ST_CLOSING;
             state = ST_CLOSING;
             if (!tryClose()) {
-                long th = thread;
-                if (th != 0) {
-                    if (NativeThread.isVirtualThread(th)) {
-                        Poller.stopPoll(fdVal);
-                    } else {
-                        nd.preClose(fd);
-                        NativeThread.signal(th);
-                    }
-                }
+                nd.preClose(fd, thread, 0);
             }
         }
     }
diff -Nru openjdk-21-21.0.10+7/src/java.base/unix/classes/sun/nio/ch/SocketDispatcher.java openjdk-21-21.0.11+10/src/java.base/unix/classes/sun/nio/ch/SocketDispatcher.java
--- openjdk-21-21.0.10+7/src/java.base/unix/classes/sun/nio/ch/SocketDispatcher.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.base/unix/classes/sun/nio/ch/SocketDispatcher.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -43,6 +43,7 @@
      * @throws sun.net.ConnectionResetException if connection reset is detected
      * @throws IOException if another I/O error occurs
      */
+    @Override
     int read(FileDescriptor fd, long address, int len) throws IOException {
         return read0(fd, address, len);
     }
@@ -54,26 +55,21 @@
      * @throws sun.net.ConnectionResetException if connection reset is detected
      * @throws IOException if another I/O error occurs
      */
+    @Override
     long readv(FileDescriptor fd, long address, int len) throws IOException {
         return readv0(fd, address, len);
     }
 
+    @Override
     int write(FileDescriptor fd, long address, int len) throws IOException {
         return write0(fd, address, len);
     }
 
+    @Override
     long writev(FileDescriptor fd, long address, int len) throws IOException {
         return writev0(fd, address, len);
     }
 
-    void close(FileDescriptor fd) throws IOException {
-        close0(fd);
-    }
-
-    void preClose(FileDescriptor fd) throws IOException {
-        preClose0(fd);
-    }
-
     // -- Native methods --
 
     private static native int read0(FileDescriptor fd, long address, int len)
@@ -82,10 +78,10 @@
     private static native long readv0(FileDescriptor fd, long address, int len)
         throws IOException;
 
-    static native int write0(FileDescriptor fd, long address, int len)
+    private static native int write0(FileDescriptor fd, long address, int len)
         throws IOException;
 
-    static native long writev0(FileDescriptor fd, long address, int len)
+    private static native long writev0(FileDescriptor fd, long address, int len)
         throws IOException;
 
     static {
diff -Nru openjdk-21-21.0.10+7/src/java.base/unix/classes/sun/nio/ch/SourceChannelImpl.java openjdk-21-21.0.11+10/src/java.base/unix/classes/sun/nio/ch/SourceChannelImpl.java
--- openjdk-21-21.0.10+7/src/java.base/unix/classes/sun/nio/ch/SourceChannelImpl.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.base/unix/classes/sun/nio/ch/SourceChannelImpl.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -42,7 +42,7 @@
     implements SelChImpl
 {
     // Used to make native read and write calls
-    private static final NativeDispatcher nd = new FileDispatcherImpl();
+    private static final NativeDispatcher nd = new SocketDispatcher();
 
     // The file descriptor associated with this channel
     private final FileDescriptor fd;
@@ -152,15 +152,7 @@
             assert state < ST_CLOSING;
             state = ST_CLOSING;
             if (!tryClose()) {
-                long th = thread;
-                if (th != 0) {
-                    if (NativeThread.isVirtualThread(th)) {
-                        Poller.stopPoll(fdVal);
-                    } else {
-                        nd.preClose(fd);
-                        NativeThread.signal(th);
-                    }
-                }
+                nd.preClose(fd, thread, 0);
             }
         }
     }
diff -Nru openjdk-21-21.0.10+7/src/java.base/unix/classes/sun/nio/ch/UnixDispatcher.java openjdk-21-21.0.11+10/src/java.base/unix/classes/sun/nio/ch/UnixDispatcher.java
--- openjdk-21-21.0.10+7/src/java.base/unix/classes/sun/nio/ch/UnixDispatcher.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.base/unix/classes/sun/nio/ch/UnixDispatcher.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,18 +29,34 @@
 import java.io.IOException;
 
 abstract class UnixDispatcher extends NativeDispatcher {
+    private static final boolean SUPPORTS_PENDING_SIGNALS = NativeThread.supportPendingSignals();
 
+    @Override
     void close(FileDescriptor fd) throws IOException {
         close0(fd);
     }
 
-    void preClose(FileDescriptor fd) throws IOException {
+    private void signalThreads(long reader, long writer) {
+        if (NativeThread.isNativeThread(reader))
+            NativeThread.signal(reader);
+        if (NativeThread.isNativeThread(writer))
+            NativeThread.signal(writer);
+    }
+
+    @Override
+    void implPreClose(FileDescriptor fd, long reader, long writer) throws IOException {
+        if (SUPPORTS_PENDING_SIGNALS) {
+            signalThreads(reader, writer);
+        }
         preClose0(fd);
+        if (!SUPPORTS_PENDING_SIGNALS) {
+            signalThreads(reader, writer);
+        }
     }
 
-    static native void close0(FileDescriptor fd) throws IOException;
+    private static native void close0(FileDescriptor fd) throws IOException;
 
-    static native void preClose0(FileDescriptor fd) throws IOException;
+    private static native void preClose0(FileDescriptor fd) throws IOException;
 
     static native void init();
 
diff -Nru openjdk-21-21.0.10+7/src/java.base/unix/classes/sun/nio/fs/UnixFileSystem.java openjdk-21-21.0.11+10/src/java.base/unix/classes/sun/nio/fs/UnixFileSystem.java
--- openjdk-21-21.0.10+7/src/java.base/unix/classes/sun/nio/fs/UnixFileSystem.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.base/unix/classes/sun/nio/fs/UnixFileSystem.java	2026-04-17 19:09:35.000000000 +0000
@@ -32,6 +32,7 @@
 import java.nio.file.FileAlreadyExistsException;
 import java.nio.file.FileStore;
 import java.nio.file.FileSystem;
+import java.nio.file.FileSystemException;
 import java.nio.file.LinkOption;
 import java.nio.file.LinkPermission;
 import java.nio.file.Path;
@@ -519,6 +520,8 @@
         try {
             mkdir(target, attrs.mode());
         } catch (UnixException x) {
+            if (x.errno() == EEXIST && flags.replaceExisting)
+                throw new FileSystemException(target.toString());
             x.rethrowAsIOException(target);
         }
 
@@ -665,6 +668,8 @@
                             O_EXCL),
                            attrs.mode());
             } catch (UnixException x) {
+                if (x.errno() == EEXIST && flags.replaceExisting)
+                    throw new FileSystemException(target.toString());
                 x.rethrowAsIOException(target);
             }
 
@@ -783,6 +788,8 @@
                 }
             }
         } catch (UnixException x) {
+            if (x.errno() == EEXIST && flags.replaceExisting)
+                throw new FileSystemException(target.toString());
             x.rethrowAsIOException(target);
         }
     }
@@ -797,6 +804,8 @@
         try {
             mknod(target, attrs.mode(), attrs.rdev());
         } catch (UnixException x) {
+            if (x.errno() == EEXIST && flags.replaceExisting)
+                throw new FileSystemException(target.toString());
             x.rethrowAsIOException(target);
         }
         boolean done = false;
diff -Nru openjdk-21-21.0.10+7/src/java.base/unix/native/libjava/Console_md.c openjdk-21-21.0.11+10/src/java.base/unix/native/libjava/Console_md.c
--- openjdk-21-21.0.10+7/src/java.base/unix/native/libjava/Console_md.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.base/unix/native/libjava/Console_md.c	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,10 +31,21 @@
 #include 
 #include 
 
-JNIEXPORT jboolean JNICALL
-Java_java_io_Console_istty(JNIEnv *env, jclass cls)
+JNIEXPORT jint JNICALL
+Java_java_io_Console_ttyStatus(JNIEnv *env, jclass cls)
 {
-    return isatty(fileno(stdin)) && isatty(fileno(stdout));
+    jint ret = 0;
+
+    if (isatty(fileno(stdin))) {
+        ret |= java_io_Console_TTY_STDIN_MASK;
+    }
+    if (isatty(fileno(stdout))) {
+        ret |= java_io_Console_TTY_STDOUT_MASK;
+    }
+    if (isatty(fileno(stderr))) {
+        ret |= java_io_Console_TTY_STDERR_MASK;
+    }
+    return ret;
 }
 
 JNIEXPORT jstring JNICALL
diff -Nru openjdk-21-21.0.10+7/src/java.base/unix/native/libnio/ch/NativeThread.c openjdk-21-21.0.11+10/src/java.base/unix/native/libnio/ch/NativeThread.c
--- openjdk-21-21.0.10+7/src/java.base/unix/native/libnio/ch/NativeThread.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.base/unix/native/libnio/ch/NativeThread.c	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -88,3 +88,12 @@
 #endif
         JNU_ThrowIOExceptionWithLastError(env, "Thread signal failed");
 }
+
+JNIEXPORT jboolean JNICALL
+Java_sun_nio_ch_NativeThread_supportPendingSignals0(JNIEnv *env, jclass cl) {
+#if defined(_AIX)
+    return JNI_TRUE;
+#else
+    return JNI_FALSE;
+#endif
+}
diff -Nru openjdk-21-21.0.10+7/src/java.base/windows/classes/sun/nio/ch/DatagramDispatcher.java openjdk-21-21.0.11+10/src/java.base/windows/classes/sun/nio/ch/DatagramDispatcher.java
--- openjdk-21-21.0.10+7/src/java.base/windows/classes/sun/nio/ch/DatagramDispatcher.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.base/windows/classes/sun/nio/ch/DatagramDispatcher.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -36,22 +36,27 @@
 class DatagramDispatcher extends NativeDispatcher {
     DatagramDispatcher() { }
 
+    @Override
     int read(FileDescriptor fd, long address, int len) throws IOException {
         return read0(fd, address, len);
     }
 
+    @Override
     long readv(FileDescriptor fd, long address, int len) throws IOException {
         return readv0(fd, address, len);
     }
 
+    @Override
     int write(FileDescriptor fd, long address, int len) throws IOException {
         return write0(fd, address, len);
     }
 
+    @Override
     long writev(FileDescriptor fd, long address, int len) throws IOException {
         return writev0(fd, address, len);
     }
 
+    @Override
     void close(FileDescriptor fd) throws IOException {
         SocketDispatcher.invalidateAndClose(fd);
     }
diff -Nru openjdk-21-21.0.10+7/src/java.base/windows/classes/sun/nio/ch/SocketDispatcher.java openjdk-21-21.0.11+10/src/java.base/windows/classes/sun/nio/ch/SocketDispatcher.java
--- openjdk-21-21.0.10+7/src/java.base/windows/classes/sun/nio/ch/SocketDispatcher.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.base/windows/classes/sun/nio/ch/SocketDispatcher.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -42,26 +42,27 @@
 
     SocketDispatcher() { }
 
+    @Override
     int read(FileDescriptor fd, long address, int len) throws IOException {
         return read0(fd, address, len);
     }
 
+    @Override
     long readv(FileDescriptor fd, long address, int len) throws IOException {
         return readv0(fd, address, len);
     }
 
+    @Override
     int write(FileDescriptor fd, long address, int len) throws IOException {
         return write0(fd, address, len);
     }
 
+    @Override
     long writev(FileDescriptor fd, long address, int len) throws IOException {
         return writev0(fd, address, len);
     }
 
-    void preClose(FileDescriptor fd) throws IOException {
-        throw new UnsupportedOperationException();
-    }
-
+    @Override
     void close(FileDescriptor fd) throws IOException {
         invalidateAndClose(fd);
     }
diff -Nru openjdk-21-21.0.10+7/src/java.base/windows/native/libjava/Console_md.c openjdk-21-21.0.11+10/src/java.base/windows/native/libjava/Console_md.c
--- openjdk-21-21.0.10+7/src/java.base/windows/native/libjava/Console_md.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.base/windows/native/libjava/Console_md.c	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,23 +31,30 @@
 #include 
 #include 
 
-JNIEXPORT jboolean JNICALL
-Java_java_io_Console_istty(JNIEnv *env, jclass cls)
+JNIEXPORT jint JNICALL
+Java_java_io_Console_ttyStatus(JNIEnv *env, jclass cls)
 {
+    jint ret = 0;
     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
     HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
+    HANDLE hStdErr = GetStdHandle(STD_ERROR_HANDLE);
 
-    if (hStdIn == INVALID_HANDLE_VALUE ||
-        hStdOut == INVALID_HANDLE_VALUE) {
-        return JNI_FALSE;
+    if (hStdIn != INVALID_HANDLE_VALUE &&
+        GetFileType(hStdIn) == FILE_TYPE_CHAR) {
+        ret |= java_io_Console_TTY_STDIN_MASK;
     }
 
-    if (GetFileType(hStdIn) != FILE_TYPE_CHAR ||
-        GetFileType(hStdOut) != FILE_TYPE_CHAR) {
-        return JNI_FALSE;
+    if (hStdOut != INVALID_HANDLE_VALUE &&
+        GetFileType(hStdOut) == FILE_TYPE_CHAR) {
+        ret |= java_io_Console_TTY_STDOUT_MASK;
     }
 
-    return JNI_TRUE;
+    if (hStdErr != INVALID_HANDLE_VALUE &&
+        GetFileType(hStdErr) == FILE_TYPE_CHAR) {
+        ret |= java_io_Console_TTY_STDERR_MASK;
+    }
+
+    return ret;
 }
 
 JNIEXPORT jstring JNICALL
diff -Nru openjdk-21-21.0.10+7/src/java.base/windows/native/libjava/TimeZone_md.c openjdk-21-21.0.11+10/src/java.base/windows/native/libjava/TimeZone_md.c
--- openjdk-21-21.0.10+7/src/java.base/windows/native/libjava/TimeZone_md.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.base/windows/native/libjava/TimeZone_md.c	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -435,7 +435,7 @@
     strcpy(mapFileName, java_home_dir);
     strcat(mapFileName, MAPPINGS_FILE);
 
-    if ((fp = fopen(mapFileName, "r")) == NULL) {
+    if (fopen_s(&fp, mapFileName, "rt") != 0) {
         jio_fprintf(stderr, "can't open %s.\n", mapFileName);
         free((void *) mapFileName);
         return NULL;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/macosx/native/libawt_lwawt/font/CGGlyphImages.m openjdk-21-21.0.11+10/src/java.desktop/macosx/native/libawt_lwawt/font/CGGlyphImages.m
--- openjdk-21-21.0.10+7/src/java.desktop/macosx/native/libawt_lwawt/font/CGGlyphImages.m	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/macosx/native/libawt_lwawt/font/CGGlyphImages.m	2026-04-17 19:09:35.000000000 +0000
@@ -494,8 +494,8 @@
         const CGGI_RenderingMode* mode)
 {
     if (canvas->image != NULL &&
-        width  * CGGI_GLYPH_CANVAS_SLACK <= canvas->image->width &&
-        height * CGGI_GLYPH_CANVAS_SLACK <= canvas->image->height)
+        width < canvas->image->width &&
+        height < canvas->image->height)
     {
         return;
     }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/classes/sun/awt/geom/AreaOp.java openjdk-21-21.0.11+10/src/java.desktop/share/classes/sun/awt/geom/AreaOp.java
--- openjdk-21-21.0.10+7/src/java.desktop/share/classes/sun/awt/geom/AreaOp.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/classes/sun/awt/geom/AreaOp.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -146,6 +146,8 @@
     public static final int RSTAG_INSIDE = 1;
     public static final int RSTAG_OUTSIDE = -1;
 
+    public static final int MAX_LINK_COUNT = 1024;
+
     public abstract void newRow();
 
     public abstract int classify(Edge e);
@@ -195,6 +197,25 @@
         }
     };
 
+    private void consumeSubCurves(Vector subcurves,
+                                  Vector chains,
+                                  Vector curve) {
+        finalizeSubCurves(subcurves, chains);
+        Enumeration enum_ = subcurves.elements();
+        while (enum_.hasMoreElements()) {
+            CurveLink link = enum_.nextElement();
+            curve.add(link.getMoveto());
+            CurveLink nextlink = link;
+            while ((nextlink = nextlink.getNext()) != null) {
+                if (!link.absorb(nextlink)) {
+                    curve.add(link.getSubCurve());
+                    link = nextlink;
+                }
+            }
+            curve.add(link.getSubCurve());
+        }
+    }
+
     private Vector pruneEdges(Vector edges) {
         int numedges = edges.size();
         if (numedges < 2) {
@@ -218,6 +239,8 @@
         Vector subcurves = new Vector<>();
         Vector chains = new Vector<>();
         Vector links = new Vector<>();
+        Vector ret = new Vector<>();
+        int linkCount = 0;
         // Active edges are between left (inclusive) and right (exclusive)
         while (left < numedges) {
             double y = yrange[0];
@@ -390,27 +413,22 @@
                     System.out.println("  "+link.getSubCurve());
                 }
             }
+            // If we have complex area calculation, we should consume the
+            // intermediate subcurves to optimize memory footprint
+            if (linkCount >= MAX_LINK_COUNT) {
+                consumeSubCurves(subcurves, chains, ret);
+                linkCount = 0;
+                chains.clear();
+                subcurves.clear();
+            }
+            linkCount += links.size();
             resolveLinks(subcurves, chains, links);
             links.clear();
             // Finally capture the bottom of the valid Y range as the top
             // of the next Y range.
             yrange[0] = yend;
         }
-        finalizeSubCurves(subcurves, chains);
-        Vector ret = new Vector<>();
-        Enumeration enum_ = subcurves.elements();
-        while (enum_.hasMoreElements()) {
-            CurveLink link = enum_.nextElement();
-            ret.add(link.getMoveto());
-            CurveLink nextlink = link;
-            while ((nextlink = nextlink.getNext()) != null) {
-                if (!link.absorb(nextlink)) {
-                    ret.add(link.getSubCurve());
-                    link = nextlink;
-                }
-            }
-            ret.add(link.getSubCurve());
-        }
+        consumeSubCurves(subcurves, chains, ret);
         return ret;
     }
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/classes/sun/awt/geom/Curve.java openjdk-21-21.0.11+10/src/java.desktop/share/classes/sun/awt/geom/Curve.java
--- openjdk-21-21.0.10+7/src/java.desktop/share/classes/sun/awt/geom/Curve.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/classes/sun/awt/geom/Curve.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1046,6 +1046,9 @@
             double bump = ymin;
             double maxbump = Math.min(ymin * 1E13, (y1 - y0) * .1);
             double y = y0 + bump;
+            if (!Double.isFinite(y1)) {
+                return 0;
+            }
             while (y <= y1) {
                 if (fairlyClose(this.XforY(y), that.XforY(y))) {
                     if ((bump *= 2) > maxbump) {
@@ -1319,7 +1322,7 @@
 
     public boolean fairlyClose(double v1, double v2) {
         return (Math.abs(v1 - v2) <
-                Math.max(Math.abs(v1), Math.abs(v2)) * 1E-10);
+                Math.max(Math.abs(v1), Math.abs(v2)) * 1E-8);
     }
 
     public abstract int getSegment(double[] coords);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/classes/sun/awt/image/XbmImageDecoder.java openjdk-21-21.0.11+10/src/java.desktop/share/classes/sun/awt/image/XbmImageDecoder.java
--- openjdk-21-21.0.10+7/src/java.desktop/share/classes/sun/awt/image/XbmImageDecoder.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/classes/sun/awt/image/XbmImageDecoder.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2026, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,13 +23,22 @@
  * questions.
  */
 
-/*-
+/*
  *      Reads xbitmap format images into a DIBitmap structure.
  */
 package sun.awt.image;
 
-import java.io.*;
-import java.awt.image.*;
+import java.awt.image.ImageConsumer;
+import java.awt.image.IndexColorModel;
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static java.lang.Math.multiplyExact;
 
 /**
  * Parse files of the form:
@@ -50,6 +59,8 @@
                                    ImageConsumer.COMPLETESCANLINES |
                                    ImageConsumer.SINGLEPASS |
                                    ImageConsumer.SINGLEFRAME);
+    private static final int MAX_XBM_SIZE = 16384;
+    private static final int HEADER_SCAN_LIMIT = 100;
 
     public XbmImageDecoder(InputStreamImageSource src, InputStream is) {
         super(src, is);
@@ -72,107 +83,155 @@
      * produce an image from the stream.
      */
     public void produceImage() throws IOException, ImageFormatException {
-        char[] nm = new char[80];
-        int c;
-        int i = 0;
-        int state = 0;
         int H = 0;
         int W = 0;
         int x = 0;
         int y = 0;
-        boolean start = true;
+        int n = 0;
+        int state = 0;
         byte[] raster = null;
         IndexColorModel model = null;
-        while (!aborted && (c = input.read()) != -1) {
-            if ('a' <= c && c <= 'z' ||
-                    'A' <= c && c <= 'Z' ||
-                    '0' <= c && c <= '9' || c == '#' || c == '_') {
-                if (i < 78)
-                    nm[i++] = (char) c;
-            } else if (i > 0) {
-                int nc = i;
-                i = 0;
-                if (start) {
-                    if (nc != 7 ||
-                        nm[0] != '#' ||
-                        nm[1] != 'd' ||
-                        nm[2] != 'e' ||
-                        nm[3] != 'f' ||
-                        nm[4] != 'i' ||
-                        nm[5] != 'n' ||
-                        nm[6] != 'e')
-                    {
-                        error("Not an XBM file");
-                    }
-                    start = false;
-                }
-                if (nm[nc - 1] == 'h')
-                    state = 1;  /* expecting width */
-                else if (nm[nc - 1] == 't' && nc > 1 && nm[nc - 2] == 'h')
-                    state = 2;  /* expecting height */
-                else if (nc > 2 && state < 0 && nm[0] == '0' && nm[1] == 'x') {
-                    int n = 0;
-                    for (int p = 2; p < nc; p++) {
-                        c = nm[p];
-                        if ('0' <= c && c <= '9')
-                            c = c - '0';
-                        else if ('A' <= c && c <= 'Z')
-                            c = c - 'A' + 10;
-                        else if ('a' <= c && c <= 'z')
-                            c = c - 'a' + 10;
-                        else
-                            c = 0;
-                        n = n * 16 + c;
+
+        String matchRegex = "\\s*(0[xX])?((?:(?!,|\\};).)+)(,|\\};)";
+        String replaceRegex = "0[xX]|,|\\s+|\\};";
+
+        String line;
+        int lineNum = 0;
+
+        try (BufferedReader br = new BufferedReader(new InputStreamReader(input))) {
+            // loop to process XBM header - width, height and create raster
+            while (!aborted && (line = br.readLine()) != null
+                    && lineNum <= HEADER_SCAN_LIMIT) {
+                lineNum++;
+                // process #define stmts
+                if (line.trim().startsWith("#define")) {
+                    String[] token = line.split("\\s+");
+                    if (token.length != 3) {
+                        error("Error while parsing define statement");
                     }
-                    for (int mask = 1; mask <= 0x80; mask <<= 1) {
-                        if (x < W) {
-                            if ((n & mask) != 0)
-                                raster[x] = 1;
-                            else
-                                raster[x] = 0;
+                    try {
+                        if (!token[2].isBlank() && state == 0) {
+                            if (token[1].endsWith("th")) {
+                                W = Integer.parseInt(token[2]);
+                            } else if (token[1].endsWith("t")) {
+                                H = Integer.parseInt(token[2]);
+                            }
+                            state = 1; // after first dimension is set
+                        } else if (!token[2].isBlank() && state == 1) {
+                            if (token[1].endsWith("th")) {
+                                W = Integer.parseInt(token[2]);
+                            } else if (token[1].endsWith("t")) {
+                                H = Integer.parseInt(token[2]);
+                            }
+                            state = 2; // after second dimension is set
                         }
-                        x++;
+                    } catch (NumberFormatException nfe) {
+                        // parseInt() can throw NFE
+                        error("Error while parsing width or height.");
                     }
-                    if (x >= W) {
-                        if (setPixels(0, y, W, 1, model, raster, 0, W) <= 0) {
-                            return;
-                        }
-                        x = 0;
-                        if (y++ >= H) {
-                            break;
-                        }
+                }
+
+                if (state == 2) {
+                    if (W <= 0 || H <= 0) {
+                        error("Invalid values for width or height.");
+                    }
+                    if (multiplyExact(W, H) > MAX_XBM_SIZE) {
+                        error("Large XBM file size."
+                                + " Maximum allowed size: " + MAX_XBM_SIZE);
+                    }
+                    model = new IndexColorModel(8, 2, XbmColormap,
+                            0, false, 0);
+                    setDimensions(W, H);
+                    setColorModel(model);
+                    setHints(XbmHints);
+                    headerComplete();
+                    raster = new byte[W];
+                    state = 3;
+                    break;
+                }
+            }
+
+            if (state != 3) {
+                error("Width or Height of XBM file not defined");
+            }
+
+            boolean contFlag = false;
+            StringBuilder sb = new StringBuilder();
+
+            // loop to process image data
+            while (!aborted && (line = br.readLine()) != null) {
+                lineNum++;
+
+                if (!contFlag) {
+                    if (line.contains("[]")) {
+                        contFlag = true;
+                    } else {
+                        continue;
                     }
+                }
+
+                int end = line.indexOf(';');
+                if (end >= 0) {
+                    sb.append(line, 0, end + 1);
+                    break;
                 } else {
-                    int n = 0;
-                    for (int p = 0; p < nc; p++)
-                        if ('0' <= (c = nm[p]) && c <= '9')
-                            n = n * 10 + c - '0';
-                        else {
-                            n = -1;
-                            break;
-                        }
-                    if (n > 0 && state > 0) {
-                        if (state == 1)
-                            W = n;
+                    sb.append(line).append(System.lineSeparator());
+                }
+            }
+
+            String resultLine = sb.toString();
+            int cutOffIndex = resultLine.indexOf('{');
+            resultLine = resultLine.substring(cutOffIndex + 1);
+
+            Matcher matcher = Pattern.compile(matchRegex).matcher(resultLine);
+            while (matcher.find()) {
+                if (y >= H) {
+                    error("Scan size of XBM file exceeds"
+                            + " the defined width x height");
+                }
+
+                int startIndex = matcher.start();
+                int endIndex = matcher.end();
+                String hexByte = resultLine.substring(startIndex, endIndex);
+                hexByte = hexByte.replaceAll("^\\s+", "");
+
+                if (!(hexByte.startsWith("0x")
+                        || hexByte.startsWith("0X"))) {
+                    error("Invalid hexadecimal number at Ln#:" + lineNum
+                            + " Col#:" + (startIndex + 1));
+                }
+                hexByte = hexByte.replaceAll(replaceRegex, "");
+                if (hexByte.length() != 2) {
+                    error("Invalid hexadecimal number at Ln#:" + lineNum
+                            + " Col#:" + (startIndex + 1));
+                }
+
+                try {
+                    n = Integer.parseInt(hexByte, 16);
+                } catch (NumberFormatException nfe) {
+                    error("Error parsing hexadecimal at Ln#:" + lineNum
+                            + " Col#:" + (startIndex + 1));
+                }
+                for (int mask = 1; mask <= 0x80; mask <<= 1) {
+                    if (x < W) {
+                        if ((n & mask) != 0)
+                            raster[x] = 1;
                         else
-                            H = n;
-                        if (W == 0 || H == 0)
-                            state = 0;
-                        else {
-                            model = new IndexColorModel(8, 2, XbmColormap,
-                                                        0, false, 0);
-                            setDimensions(W, H);
-                            setColorModel(model);
-                            setHints(XbmHints);
-                            headerComplete();
-                            raster = new byte[W];
-                            state = -1;
-                        }
+                            raster[x] = 0;
+                    }
+                    x++;
+                }
+
+                if (x >= W) {
+                    int result = setPixels(0, y, W, 1, model, raster, 0, W);
+                    if (result <= 0) {
+                        error("Unexpected error occurred during setPixel()");
                     }
+                    x = 0;
+                    y++;
                 }
             }
+            imageComplete(ImageConsumer.STATICIMAGEDONE, true);
         }
-        input.close();
-        imageComplete(ImageConsumer.STATICIMAGEDONE, true);
     }
 }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/classes/sun/font/CompositeFont.java openjdk-21-21.0.11+10/src/java.desktop/share/classes/sun/font/CompositeFont.java
--- openjdk-21-21.0.10+7/src/java.desktop/share/classes/sun/font/CompositeFont.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/classes/sun/font/CompositeFont.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -88,7 +88,7 @@
 
         /*
          * See if this is a windows locale which has a system EUDC font.
-         * If so add it as the final fallback component of the composite.
+         * If so add it as the first fallback component of the composite.
          * The caller could be responsible for this, but for now it seems
          * better that it is handled internally to the CompositeFont class.
          */
@@ -114,8 +114,8 @@
             components[msCnt] = fm.getEUDCFont();
             deferredInitialisation = new boolean[numSlots];
             if (defer) {
-                for (int i=0; i, .
-Copyright (C) 2008-2024 by David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya.
-Copyright (C) 2013-2024 by Google, Inc.
-Copyright (C) 2019-2024 by Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg.
-Copyright (C) 2009-2024 by Oran Agra and Mickey Gabel.
-Copyright (C) 2018-2024 by David Turner, Robert Wilhelm, Dominik Röttsches, and Werner Lemberg.
-Copyright (C) 2004-2024 by David Turner, Robert Wilhelm, Werner Lemberg, and George Williams.
-
-
+Copyright (C) 1996-2025 by David Turner, Robert Wilhelm, and Werner Lemberg.
+Copyright (C) 2007-2025 by Dereg Clegg and Michael Toftdal.
+Copyright (C) 1996-2025 by Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.
+Copyright (C) 2022-2025 by David Turner, Robert Wilhelm, Werner Lemberg, George Williams, and
+Copyright (C) 2004-2025 by Masatake YAMATO and Redhat K.K.
+Copyright (C) 2007-2025 by Derek Clegg and Michael Toftdal.
+Copyright (C) 2003-2025 by Masatake YAMATO, Red Hat K.K.,
+Copyright (C) 1996-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches.
+Copyright (C) 2007-2025 by David Turner.
+Copyright (C) 2022-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti.
+Copyright (C) 2007-2025 by Rahul Bhalerao , .
+Copyright (C) 2025 by Behdad Esfahbod.
+Copyright (C) 2008-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya.
+Copyright (C) 2013-2025 by Google, Inc.
+Copyright (C) 2019-2025 by Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg.
+Copyright (C) 2009-2025 by Oran Agra and Mickey Gabel.
+Copyright (C) 2018-2025 by David Turner, Robert Wilhelm, Dominik Röttsches, and Werner Lemberg.
+Copyright (C) 2004-2025 by David Turner, Robert Wilhelm, Werner Lemberg, and George Williams.
                     The FreeType Project LICENSE
                     ----------------------------
 
@@ -207,6 +206,7 @@
 
     https://www.freetype.org
 
+
 ```
 
 ### GPL v2
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/legal/giflib.md openjdk-21-21.0.11+10/src/java.desktop/share/legal/giflib.md
--- openjdk-21-21.0.10+7/src/java.desktop/share/legal/giflib.md	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/legal/giflib.md	2026-04-17 19:09:35.000000000 +0000
@@ -1,9 +1,9 @@
-## GIFLIB v5.2.2
+## GIFLIB v6.1.2
 
 ### GIFLIB License
 ```
 
-The GIFLIB distribution is Copyright (c) 1997  Eric S. Raymond
+= MIT LICENSE
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
@@ -23,8 +23,19 @@
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 
+---------------------------------
+The below applies to the following file(s):
+giflib/dgif_lib.c
+giflib/gifalloc.c
+giflib/gif_err.c
+giflib/openbsd-reallocarray.c
+
+Copyright (C) 1989 Gershon Elber
+Copyright (C) 2008 Otto Moerbeek 
+Copyright (C) Eric S. Raymond 
+
+SPDX-License-Identifier: MIT
 
-tree/README
 
 == Authors ==
 
@@ -38,13 +49,4 @@
 Eric Raymond 
 current as well as long time former maintainer of giflib code
 
-There have been many other contributors; see the attributions in the
-version-control history to learn more.
-
-
-tree/openbsd-reallocarray.c
-
-Copyright (C) 2008 Otto Moerbeek 
-SPDX-License-Identifier: MIT
-
 ```
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/legal/harfbuzz.md openjdk-21-21.0.11+10/src/java.desktop/share/legal/harfbuzz.md
--- openjdk-21-21.0.10+7/src/java.desktop/share/legal/harfbuzz.md	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/legal/harfbuzz.md	2026-04-17 19:09:35.000000000 +0000
@@ -1,4 +1,4 @@
-## Harfbuzz 11.2.0
+## Harfbuzz 12.3.2
 
 ### Harfbuzz License
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/legal/libpng.md openjdk-21-21.0.11+10/src/java.desktop/share/legal/libpng.md
--- openjdk-21-21.0.10+7/src/java.desktop/share/legal/libpng.md	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/legal/libpng.md	2026-04-17 19:09:35.000000000 +0000
@@ -1,4 +1,4 @@
-## libpng v1.6.51
+## libpng v1.6.57
 
 ### libpng License
 
@@ -9,8 +9,8 @@
 PNG Reference Library License version 2
 ---------------------------------------
 
-Copyright (C) 1995-2025 The PNG Reference Library Authors.
-Copyright (C) 2018-2025 Cosmin Truta
+Copyright (C) 1995-2026 The PNG Reference Library Authors.
+Copyright (C) 2018-2026 Cosmin Truta
 Copyright (C) 1998-2018 Glenn Randers-Pehrson
 Copyright (C) 1996-1997 Andreas Dilger
 Copyright (C) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -158,6 +158,7 @@
 Authors, for copyright and licensing purposes.
 
  * Adam Richter
+ * Alexander Smorkalov
  * Andreas Dilger
  * Chris Blume
  * Cosmin Truta
@@ -167,8 +168,10 @@
  * Glenn Randers-Pehrson
  * Greg Roelofs
  * Guy Eric Schalnat
+ * Halil Oktay
  * James Yu
  * John Bowler
+ * Joshua Inscoe
  * Kevin Bracey
  * Lucas Chollet
  * Magnus Holmgren
@@ -177,19 +180,23 @@
  * Mans Rullgard
  * Matt Sarett
  * Mike Klein
+ * Mohammad Seet
  * Pascal Massimino
  * Paul Schmidt
+ * Petr Simecek
  * Philippe Antoine
  * Qiang Zhou
  * Sam Bushell
  * Samuel Williams
  * Simon-Pierre Cadieux
+ * Taegu Ha (하태구)
  * Tim Wegner
  * Tobias Stoeckmann
  * Tom Lane
  * Tom Tanner
  * Vadim Barkov
  * Willem van Schaik
+ * Yuelin Wang (王跃林)
  * Zhijie Liang
  * Apple Inc.
     - Zixu Wang (王子旭)
@@ -209,6 +216,8 @@
     - ZhangLixia (张利霞)
  * Samsung Group
     - Filip Wasil
+ * SpacemiT Hangzhou Technology, Co.
+    - Liang Junzhao (梁俊钊)
 
 The build projects, the build scripts, the test scripts, and other
 files in the "projects", "scripts" and "tests" directories, have
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/config/ftconfig.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/config/ftconfig.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/config/ftconfig.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/config/ftconfig.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   ANSI-specific configuration file (specification only).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/config/ftheader.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/config/ftheader.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/config/ftheader.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/config/ftheader.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Build macros of the FreeType 2 library.
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/config/ftoption.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/config/ftoption.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/config/ftoption.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/config/ftoption.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   User-selectable configuration macros (specification only).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -158,12 +158,12 @@
 
   /**************************************************************************
    *
-   * If this macro is defined, try to use an inlined assembler version of the
-   * @FT_MulFix function, which is a 'hotspot' when loading and hinting
-   * glyphs, and which should be executed as fast as possible.
+   * If this macro is defined, try to use an inlined 64-bit or assembler
+   * version of the @FT_MulFix function, which is a 'hotspot' when loading
+   * and hinting glyphs, and which should be executed as fast as possible.
    *
-   * Note that if your compiler or CPU is not supported, this will default to
-   * the standard and portable implementation found in `ftcalc.c`.
+   * If your compiler is not C99-compliant or CPU assembly is not supported,
+   * you can disable this option.
    */
 #define FT_CONFIG_OPTION_INLINE_MULFIX
 
@@ -295,6 +295,31 @@
 
   /**************************************************************************
    *
+   * HarfBuzz dynamic support.
+   *
+   *   Define this macro if you want the HarfBuzz library to be loaded at
+   *   runtime instead of being linked to FreeType.
+   *
+   *   This option has no effect if `FT_CONFIG_OPTION_USE_HARFBUZZ` is not
+   *   defined.
+   *
+   *   When this option is enabled, FreeType will try to load the HarfBuzz
+   *   library at runtime, using `dlopen` or `LoadLibrary`, depending on the
+   *   platform.  On Microsoft platforms, the library name looked up is
+   *   `libharfbuzz-0.dll`.  On Apple platforms, the library name looked up
+   *   is `libharfbuzz.0.dylib`.  On all other platforms, the library name
+   *   looked up is `libharfbuzz.so.0`.  This name can be overridden by
+   *   defining the macro `FT_LIBHARFBUZZ` at FreeType compilation time.
+   *
+   *   If you use a build system like cmake or the `configure` script,
+   *   options set by those programs have precedence, overwriting the value
+   *   here with the configured one.
+   */
+/* #define FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC */
+
+
+  /**************************************************************************
+   *
    * Brotli support.
    *
    *   FreeType uses the Brotli library to provide support for decompressing
@@ -679,7 +704,7 @@
    * defined.
    *
    * [1]
-   * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
+   * https://learn.microsoft.com/typography/cleartype/truetypecleartype
    */
 #define TT_CONFIG_OPTION_SUBPIXEL_HINTING
 
@@ -697,7 +722,7 @@
    * flags array which can be used to disambiguate, but old fonts will not
    * have them.
    *
-   *   https://www.microsoft.com/typography/otspec/glyf.htm
+   *   https://learn.microsoft.com/typography/opentype/spec/glyf
    *   https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html
    */
 #undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
@@ -734,7 +759,13 @@
   /**************************************************************************
    *
    * Define `TT_CONFIG_OPTION_BDF` if you want to include support for an
-   * embedded 'BDF~' table within SFNT-based bitmap formats.
+   * embedded 'BDF~' table within an SFNT-based `.otb` font file.  This table
+   * is an extension used by X11 to preserve BDF properties after conversion
+   * to SFNT containers.  See
+   *
+   *   https://fontforge.org/docs/techref/non-standard.html#non-standard-bdf
+   *
+   * for more details.
    */
 /* #define TT_CONFIG_OPTION_BDF */
 
@@ -760,10 +791,10 @@
   /**************************************************************************
    *
    * Option `TT_CONFIG_OPTION_GPOS_KERNING` enables a basic GPOS kerning
-   * implementation (for TrueType fonts only).  With this defined, FreeType
-   * is able to get kerning pair data from the GPOS 'kern' feature as well as
-   * legacy 'kern' tables; without this defined, FreeType will only be able
-   * to use legacy 'kern' tables.
+   * implementation (for TrueType and OpenType fonts only).  With this
+   * defined, FreeType is able to get kerning pair data from the GPOS 'kern'
+   * feature as well as legacy 'kern' tables; without this defined, FreeType
+   * will only be able to use legacy 'kern' tables.
    *
    * Note that FreeType does not support more advanced GPOS layout features;
    * even the 'kern' feature implemented here doesn't handle more
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/config/ftstdlib.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/config/ftstdlib.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/config/ftstdlib.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/config/ftstdlib.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   ANSI-specific library and header configuration file (specification
  *   only).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/config/integer-types.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/config/integer-types.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/config/integer-types.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/config/integer-types.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType integer types definitions.
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -17,6 +17,8 @@
 #ifndef FREETYPE_CONFIG_INTEGER_TYPES_H_
 #define FREETYPE_CONFIG_INTEGER_TYPES_H_
 
+FT_BEGIN_HEADER
+
   /* There are systems (like the Texas Instruments 'C54x) where a `char`  */
   /* has 16~bits.  ANSI~C says that `sizeof(char)` is always~1.  Since an */
   /* `int` has 16~bits also for this system, `sizeof(int)` gives~1 which  */
@@ -242,9 +244,34 @@
 #endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
 
 #ifdef FT_INT64
+
   typedef FT_INT64   FT_Int64;
   typedef FT_UINT64  FT_UInt64;
-#endif
 
+#  define FT_INT64_ZERO  0
+
+#else  /* !FT_INT64 */
+
+  /* we need to emulate 64-bit data types if none are available */
+
+  typedef struct  FT_Int64_
+  {
+    FT_UInt32  lo;
+    FT_UInt32  hi;
+
+  } FT_Int64;
+
+  typedef struct  FT_UInt64_
+  {
+    FT_UInt32  lo;
+    FT_UInt32  hi;
+
+  } FT_UInt64;
+
+#  define FT_INT64_ZERO  { 0, 0 }
+
+#endif /* !FT_INT64 */
+
+FT_END_HEADER
 
 #endif  /* FREETYPE_CONFIG_INTEGER_TYPES_H_ */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/config/mac-support.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/config/mac-support.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/config/mac-support.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/config/mac-support.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Mac/OS X support configuration header.
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -24,6 +24,7 @@
    *   This is the only necessary change, so it is defined here instead
    *   providing a new configuration file.
    */
+#ifdef FT_MACINTOSH
 #if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )
   /* No Carbon frameworks for 64bit 10.4.x.                         */
   /* `AvailabilityMacros.h` is available since Mac OS X 10.2,       */
@@ -36,6 +37,7 @@
     ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 )
 #undef FT_MACINTOSH
 #endif
+#endif  /* __APPLE__ ... */
 
 #elif defined( __SC__ ) || defined( __MRC__ )
   /* Classic MacOS compilers */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/config/public-macros.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/config/public-macros.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/config/public-macros.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/config/public-macros.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Define a set of compiler macros used in public FreeType headers.
  *
- * Copyright (C) 2020-2024 by
+ * Copyright (C) 2020-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -62,8 +62,8 @@
    * because it is needed by `FT_EXPORT`.
    */
 
-  /* Visual C, mingw */
-#if defined( _WIN32 )
+  /* Visual C, MinGW, Cygwin */
+#if defined( _WIN32 ) || defined( __CYGWIN__ )
 
 #if defined( FT2_BUILD_LIBRARY ) && defined( DLL_EXPORT )
 #define FT_PUBLIC_FUNCTION_ATTRIBUTE  __declspec( dllexport )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/freetype.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/freetype.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/freetype.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/freetype.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType high-level API and common types (specification only).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -811,7 +811,7 @@
    *   FT_ENCODING_MS_SYMBOL ::
    *     Microsoft Symbol encoding, used to encode mathematical symbols and
    *     wingdings.  For more information, see
-   *     'https://www.microsoft.com/typography/otspec/recom.htm#non-standard-symbol-fonts',
+   *     'https://learn.microsoft.com/typography/opentype/spec/recom#non-standard-symbol-fonts',
    *     'http://www.kostis.net/charsets/symbol.htm', and
    *     'http://www.kostis.net/charsets/wingding.htm'.
    *
@@ -1068,12 +1068,12 @@
    *     the face in the font file (starting with value~0).  They are set
    *     to~0 if there is only one face in the font file.
    *
-   *     [Since 2.6.1] Bits 16-30 are relevant to GX and OpenType variation
-   *     fonts only, holding the named instance index for the current face
-   *     index (starting with value~1; value~0 indicates font access without
-   *     a named instance).  For non-variation fonts, bits 16-30 are ignored.
-   *     If we have the third named instance of face~4, say, `face_index` is
-   *     set to 0x00030004.
+   *     [Since 2.6.1] Bits 16-30 are relevant to TrueType GX and OpenType
+   *     Font Variations only, holding the named instance index for the
+   *     current face index (starting with value~1; value~0 indicates font
+   *     access without a named instance).  For non-variation fonts, bits
+   *     16-30 are ignored.  If we have the third named instance of face~4,
+   *     say, `face_index` is set to 0x00030004.
    *
    *     Bit 31 is always zero (that is, `face_index` is always a positive
    *     value).
@@ -1092,10 +1092,10 @@
    *     the face; see @FT_STYLE_FLAG_XXX for the details.
    *
    *     [Since 2.6.1] Bits 16-30 hold the number of named instances
-   *     available for the current face if we have a GX or OpenType variation
-   *     (sub)font.  Bit 31 is always zero (that is, `style_flags` is always
-   *     a positive value).  Note that a variation font has always at least
-   *     one named instance, namely the default instance.
+   *     available for the current face if we have a TrueType GX or OpenType
+   *     Font Variation.  Bit 31 is always zero (that is, `style_flags` is
+   *     always a positive value).  Note that a variation font has always at
+   *     least one named instance, namely the default instance.
    *
    *   num_glyphs ::
    *     The number of glyphs in the face.  If the face is scalable and has
@@ -1159,7 +1159,7 @@
    *     Note that the bounding box might be off by (at least) one pixel for
    *     hinted fonts.  See @FT_Size_Metrics for further discussion.
    *
-   *     Note that the bounding box does not vary in OpenType variation fonts
+   *     Note that the bounding box does not vary in OpenType Font Variations
    *     and should only be used in relation to the default instance.
    *
    *   units_per_EM ::
@@ -1218,7 +1218,7 @@
    *   Fields may be changed after a call to @FT_Attach_File or
    *   @FT_Attach_Stream.
    *
-   *   For an OpenType variation font, the values of the following fields can
+   *   For OpenType Font Variations, the values of the following fields can
    *   change after a call to @FT_Set_Var_Design_Coordinates (and friends) if
    *   the font contains an 'MVAR' table: `ascender`, `descender`, `height`,
    *   `underline_position`, and `underline_thickness`.
@@ -1336,7 +1336,7 @@
    *   FT_FACE_FLAG_MULTIPLE_MASTERS ::
    *     The face contains multiple masters and is capable of interpolating
    *     between them.  Supported formats are Adobe MM, TrueType GX, and
-   *     OpenType variation fonts.
+   *     OpenType Font Variations.
    *
    *     See section @multiple_masters for API details.
    *
@@ -1609,7 +1609,7 @@
    *
    * @description:
    *   A macro that returns true whenever a face object is a named instance
-   *   of a GX or OpenType variation font.
+   *   of a TrueType GX or OpenType Font Variations.
    *
    *   [Since 2.9] Changing the design coordinates with
    *   @FT_Set_Var_Design_Coordinates or @FT_Set_Var_Blend_Coordinates does
@@ -2147,7 +2147,7 @@
    *     freed.
    *
    *     [Since 2.10.1] If @FT_LOAD_NO_SCALE is set, outline coordinates of
-   *     OpenType variation fonts for a selected instance are internally
+   *     OpenType Font Variations for a selected instance are internally
    *     handled as 26.6 fractional font units but returned as (rounded)
    *     integers, as expected.  To get unrounded font units, don't use
    *     @FT_LOAD_NO_SCALE but load the glyph with @FT_LOAD_NO_HINTING and
@@ -2640,14 +2640,14 @@
    *     the face in the font file (starting with value~0).  Set it to~0 if
    *     there is only one face in the font file.
    *
-   *     [Since 2.6.1] Bits 16-30 are relevant to GX and OpenType variation
-   *     fonts only, specifying the named instance index for the current face
-   *     index (starting with value~1; value~0 makes FreeType ignore named
-   *     instances).  For non-variation fonts, bits 16-30 are ignored.
-   *     Assuming that you want to access the third named instance in face~4,
-   *     `face_index` should be set to 0x00030004.  If you want to access
-   *     face~4 without variation handling, simply set `face_index` to
-   *     value~4.
+   *     [Since 2.6.1] Bits 16-30 are relevant to TrueType GX and OpenType
+   *     Font Variations only, specifying the named instance index for the
+   *     current face index (starting with value~1; value~0 makes FreeType
+   *     ignore named instances).  For non-variation fonts, bits 16-30 are
+   *     ignored.  Assuming that you want to access the third named instance
+   *     in face~4, `face_index` should be set to 0x00030004.  If you want
+   *     to access face~4 without variation handling, simply set
+   *     `face_index` to value~4.
    *
    *     `FT_Open_Face` and its siblings can be used to quickly check whether
    *     the font format of a given font resource is supported by FreeType.
@@ -2914,11 +2914,11 @@
    *   of the available glyphs at a given ppem value is available.  FreeType
    *   silently uses outlines if there is no bitmap for a given glyph index.
    *
-   *   For GX and OpenType variation fonts, a bitmap strike makes sense only
-   *   if the default instance is active (that is, no glyph variation takes
-   *   place); otherwise, FreeType simply ignores bitmap strikes.  The same
-   *   is true for all named instances that are different from the default
-   *   instance.
+   *   For TrueType GX and OpenType Font Variations, a bitmap strike makes
+   *   sense only if the default instance is active (that is, no glyph
+   *   variation takes place); otherwise, FreeType simply ignores bitmap
+   *   strikes.  The same is true for all named instances that are different
+   *   from the default instance.
    *
    *   Don't use this function if you are using the FreeType cache API.
    */
@@ -3078,7 +3078,7 @@
    *   is dependent entirely on how the size is defined in the source face.
    *   The font designer chooses the final size of each glyph relative to
    *   this size.  For more information refer to
-   *   'https://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html'.
+   *   'https://freetype.org/freetype2/docs/glyphs/glyphs-2.html'.
    *
    *   Contrary to @FT_Set_Char_Size, this function doesn't have special code
    *   to normalize zero-valued widths, heights, or resolutions, which are
@@ -3441,8 +3441,10 @@
    *     blending of the color glyph layers associated with the glyph index,
    *     using the same bitmap format as embedded color bitmap images.  This
    *     is mainly for convenience and works only for glyphs in 'COLR' v0
-   *     tables (or glyphs in 'COLR' v1 tables that exclusively use v0
-   *     features).  For full control of color layers use
+   *     tables.  **There is no rendering support for 'COLR' v1** (with the
+   *     exception of v1 tables that exclusively use v0 features)!  You need
+   *     a graphics library like Skia or Cairo to interpret the graphics
+   *     commands stored in v1 tables.  For full control of color layers use
    *     @FT_Get_Color_Glyph_Layer and FreeType's color functions like
    *     @FT_Palette_Select instead of setting @FT_LOAD_COLOR for rendering
    *     so that the client application can handle blending by itself.
@@ -3895,8 +3897,10 @@
    *
    *   This process can cost performance.  There is an approximation that
    *   does not need to know about the background color; see
-   *   https://bel.fi/alankila/lcd/ and
-   *   https://bel.fi/alankila/lcd/alpcor.html for details.
+   *   https://web.archive.org/web/20211019204945/https://bel.fi/alankila/lcd/
+   *   and
+   *   https://web.archive.org/web/20210211002939/https://bel.fi/alankila/lcd/alpcor.html
+   *   for details.
    *
    *   **ATTENTION**: Linear blending is even more important when dealing
    *   with subpixel-rendered glyphs to prevent color-fringing!  A
@@ -3993,13 +3997,13 @@
    *   out of the scope of this API function -- they can be implemented
    *   through format-specific interfaces.
    *
-   *   Note that, for TrueType fonts only, this can extract data from both
-   *   the 'kern' table and the basic, pair-wise kerning feature from the
-   *   GPOS table (with `TT_CONFIG_OPTION_GPOS_KERNING` enabled), though
-   *   FreeType does not support the more advanced GPOS layout features; use
-   *   a library like HarfBuzz for those instead.  If a font has both a
-   *   'kern' table and kern features of a GPOS table, the 'kern' table will
-   *   be used.
+   *   Note that, for TrueType and OpenType fonts only, this can extract data
+   *   from both the 'kern' table and the basic, pair-wise kerning feature
+   *   from the GPOS table (with `TT_CONFIG_OPTION_GPOS_KERNING` enabled),
+   *   though FreeType does not support the more advanced GPOS layout
+   *   features; use a library like HarfBuzz for those instead.  If a font
+   *   has both a 'kern' table and kern features of a GPOS table, the 'kern'
+   *   table will be used.
    *
    *   Also note for right-to-left scripts, the functionality may differ for
    *   fonts with GPOS tables vs. 'kern' tables.  For GPOS, right-to-left
@@ -4314,14 +4318,13 @@
    *     property `no-stem-darkening` provided by the 'autofit', 'cff',
    *     'type1', and 't1cid' modules; see @no-stem-darkening).
    *
-   *   * @FT_PARAM_TAG_LCD_FILTER_WEIGHTS (LCD filter weights, corresponding
-   *     to function @FT_Library_SetLcdFilterWeights).
-   *
    *   * @FT_PARAM_TAG_RANDOM_SEED (seed value for the CFF, Type~1, and CID
    *     'random' operator, corresponding to the `random-seed` property
    *     provided by the 'cff', 'type1', and 't1cid' modules; see
    *     @random-seed).
    *
+   *   * @FT_PARAM_TAG_LCD_FILTER_WEIGHTS (no longer supported).
+   *
    *   Pass `NULL` as `data` in @FT_Parameter for a given tag to reset the
    *   option and use the library or module default again.
    *
@@ -4348,25 +4351,17 @@
    *     FT_Bool              darken_stems = 1;
    *
    *     FT_Parameter         property2;
-   *     FT_LcdFiveTapFilter  custom_weight =
-   *                            { 0x11, 0x44, 0x56, 0x44, 0x11 };
-   *
-   *     FT_Parameter         property3;
    *     FT_Int32             random_seed = 314159265;
    *
-   *     FT_Parameter         properties[3] = { property1,
-   *                                            property2,
-   *                                            property3 };
+   *     FT_Parameter         properties[2] = { property1,
+   *                                            property2 };
    *
    *
    *     property1.tag  = FT_PARAM_TAG_STEM_DARKENING;
    *     property1.data = &darken_stems;
    *
-   *     property2.tag  = FT_PARAM_TAG_LCD_FILTER_WEIGHTS;
-   *     property2.data = custom_weight;
-   *
-   *     property3.tag  = FT_PARAM_TAG_RANDOM_SEED;
-   *     property3.data = &random_seed;
+   *     property2.tag  = FT_PARAM_TAG_RANDOM_SEED;
+   *     property2.data = &random_seed;
    *
    *     FT_Face_Properties( face, 3, properties );
    *   ```
@@ -4377,7 +4372,7 @@
    *     FT_Parameter  property;
    *
    *
-   *     property.tag  = FT_PARAM_TAG_LCD_FILTER_WEIGHTS;
+   *     property.tag  = FT_PARAM_TAG_STEM_DARKENING;
    *     property.data = NULL;
    *
    *     FT_Face_Properties( face, 1, &property );
@@ -4530,7 +4525,7 @@
    *   table description in the OpenType specification for the meaning of the
    *   various flags (which get synthesized for non-OpenType subglyphs).
    *
-   *     https://docs.microsoft.com/en-us/typography/opentype/spec/glyf#composite-glyph-description
+   *     https://learn.microsoft.com/typography/opentype/spec/glyf#composite-glyph-description
    *
    * @values:
    *   FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS ::
@@ -4593,7 +4588,7 @@
    *   interpreted depending on the flags returned in `*p_flags`.  See the
    *   OpenType specification for details.
    *
-   *     https://docs.microsoft.com/en-us/typography/opentype/spec/glyf#composite-glyph-description
+   *     https://learn.microsoft.com/typography/opentype/spec/glyf#composite-glyph-description
    *
    */
   FT_EXPORT( FT_Error )
@@ -4619,7 +4614,7 @@
    *   associated with a font.
    *
    *   See
-   *   https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf
+   *   https://adobe-type-tools.github.io/font-tech-notes/pdfs/AcrobatDC_FontPolicies.pdf
    *   for more details.
    *
    * @values:
@@ -5173,8 +5168,8 @@
    *
    */
 #define FREETYPE_MAJOR  2
-#define FREETYPE_MINOR  13
-#define FREETYPE_PATCH  3
+#define FREETYPE_MINOR  14
+#define FREETYPE_PATCH  2
 
 
   /**************************************************************************
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftadvanc.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftadvanc.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftadvanc.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftadvanc.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Quick computation of advance widths (specification only).
  *
- * Copyright (C) 2008-2024 by
+ * Copyright (C) 2008-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftbbox.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftbbox.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftbbox.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftbbox.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType exact bbox computation (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftbdf.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftbdf.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftbdf.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftbdf.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType API for accessing BDF-specific strings (specification).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -44,7 +44,8 @@
    *
    * @description:
    *   This section contains the declaration of functions specific to BDF and
-   *   PCF fonts.
+   *   PCF fonts.  They also work for SFNT bitmap fonts that contain a 'BDF~'
+   *   table like X11's `.otb` fonts.
    *
    */
 
@@ -151,7 +152,9 @@
    *   FreeType error code.  0~means success.
    *
    * @note:
-   *   This function only works with BDF faces, returning an error otherwise.
+   *   This function only works with BDF faces and SFNT fonts that have a
+   *   'BDF~' table, returning an error otherwise.  For the latter, a bitmap
+   *   strike size must be selected first.
    */
   FT_EXPORT( FT_Error )
   FT_Get_BDF_Charset_ID( FT_Face       face,
@@ -165,7 +168,7 @@
    *    FT_Get_BDF_Property
    *
    * @description:
-   *    Retrieve a BDF property from a BDF or PCF font file.
+   *    Retrieve a BDF property from a BDF or PCF font.
    *
    * @input:
    *    face ::
@@ -196,6 +199,9 @@
    *
    *   In case of error, `aproperty->type` is always set to
    *   @BDF_PROPERTY_TYPE_NONE.
+   *
+   *   This also works with SFNT fonts that have a 'BDF~' table, after a
+   *   bitmap strike size has been selected.
    */
   FT_EXPORT( FT_Error )
   FT_Get_BDF_Property( FT_Face           face,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftbitmap.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftbitmap.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftbitmap.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftbitmap.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType utility functions for bitmaps (specification).
  *
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftcid.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftcid.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftcid.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftcid.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType API for accessing CID font information (specification).
  *
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
  * Dereg Clegg and Michael Toftdal.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftcolor.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftcolor.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftcolor.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftcolor.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType's glyph color management (specification).
  *
- * Copyright (C) 2018-2024 by
+ * Copyright (C) 2018-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -317,6 +317,15 @@
    * @description:
    *   The functions described here allow access of colored glyph layer data
    *   in OpenType's 'COLR' tables.
+   *
+   *   Note that FreeType does *not* provide rendering in general of glyphs
+   *   that use a 'COLR' table!  While FreeType has very limited rendering
+   *   support for 'COLR' v0 tables (without a possibility to change the
+   *   color palette) via @FT_Render_Glyph, there is no such convenience
+   *   code for 'COLR' v1 tables -- while it appears that v1 is simply an
+   *   'improved' version of v0, this is not the case: it is a completely
+   *   different color font format, and you need a dedicated graphics
+   *   library like Skia or Cairo to handle a v1 table's drawing commands.
    */
 
 
@@ -359,7 +368,7 @@
    *   iteratively retrieve the colored glyph layers associated with the
    *   current glyph slot.
    *
-   *     https://docs.microsoft.com/en-us/typography/opentype/spec/colr
+   *     https://learn.microsoft.com/typography/opentype/spec/colr
    *
    *   The glyph layer data for a given glyph index, if present, provides an
    *   alternative, multi-color glyph representation: Instead of rendering
@@ -1518,7 +1527,7 @@
    *
    * @return:
    *   Value~1 if a clip box is found.  If no clip box is found or an error
-   *   occured, value~0 is returned.
+   *   occurred, value~0 is returned.
    *
    * @note:
    *   To retrieve the clip box in font units, reset scale to units-per-em
@@ -1646,7 +1655,7 @@
    *
    * @return:
    *   Value~1 if everything is OK.  Value~0 if no details can be found for
-   *   this paint or any other error occured.
+   *   this paint or any other error occurred.
    *
    * @since:
    *   2.13
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftdriver.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftdriver.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftdriver.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftdriver.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType API for controlling driver modules (specification only).
  *
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -282,7 +282,7 @@
    *   minimize hinting techniques that were problematic with the extra
    *   resolution of ClearType; see
    *   http://rastertragedy.com/RTRCh4.htm#Sec1 and
-   *   https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx.
+   *   https://learn.microsoft.com/typography/cleartype/truetypecleartype.
    *   This technique is not to be confused with ClearType compatible widths.
    *   ClearType backward compatibility has no direct impact on changing
    *   advance widths, but there might be an indirect impact on disabling
@@ -784,7 +784,7 @@
    *
    *   Details on subpixel hinting and some of the necessary tweaks can be
    *   found in Greg Hitchcock's whitepaper at
-   *   'https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'.
+   *   'https://learn.microsoft.com/typography/cleartype/truetypecleartype'.
    *   Note that FreeType currently doesn't really 'subpixel hint' (6x1, 6x2,
    *   or 6x5 supersampling) like discussed in the paper.  Depending on the
    *   chosen interpreter, it simply ignores instructions on vertical stems
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/fterrdef.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/fterrdef.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/fterrdef.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/fterrdef.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType error codes (specification).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/fterrors.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/fterrors.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/fterrors.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/fterrors.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType error code handling (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftfntfmt.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftfntfmt.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftfntfmt.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftfntfmt.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Support functions for font formats.
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftgasp.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftgasp.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftgasp.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftgasp.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Access of TrueType's 'gasp' table (specification).
  *
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftglyph.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftglyph.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftglyph.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftglyph.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType convenience functions to handle glyphs (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftgzip.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftgzip.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftgzip.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftgzip.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Gzip-compressed stream support.
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftimage.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftimage.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftimage.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftimage.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   FreeType glyph image formats and default raster interface
  *   (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -267,6 +267,10 @@
    *   *logical* one.  For example, if @FT_Pixel_Mode is set to
    *   `FT_PIXEL_MODE_LCD`, the logical width is a just a third of the
    *   physical one.
+   *
+   *   An empty bitmap with a NULL `buffer` is valid, with `rows` and/or
+   *   `pitch` also set to 0.  Such bitmaps might be produced while rendering
+   *   empty or degenerate outlines.
    */
   typedef struct  FT_Bitmap_
   {
@@ -439,7 +443,7 @@
    *   rasterizer; see the `tags` field in @FT_Outline.
    *
    *   Please refer to the description of the 'SCANTYPE' instruction in the
-   *   [OpenType specification](https://learn.microsoft.com/en-us/typography/opentype/spec/tt_instructions#scantype)
+   *   [OpenType specification](https://learn.microsoft.com/typography/opentype/spec/tt_instructions#scantype)
    *   how simple drop-outs, smart drop-outs, and stubs are defined.
    */
 #define FT_OUTLINE_NONE             0x0
@@ -871,7 +875,7 @@
    */
   typedef struct  FT_Span_
   {
-    short           x;
+    unsigned short  x;
     unsigned short  len;
     unsigned char   coverage;
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftincrem.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftincrem.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftincrem.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftincrem.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType incremental loading (specification).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftlcdfil.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftlcdfil.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftlcdfil.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftlcdfil.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   FreeType API for color filtering of subpixel bitmap glyphs
  *   (specification).
  *
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -145,16 +145,10 @@
    *
    *   FT_LCD_FILTER_LEGACY ::
    *   FT_LCD_FILTER_LEGACY1 ::
-   *     This filter corresponds to the original libXft color filter.  It
-   *     provides high contrast output but can exhibit really bad color
-   *     fringes if glyphs are not extremely well hinted to the pixel grid.
-   *     This filter is only provided for comparison purposes, and might be
-   *     disabled or stay unsupported in the future. The second value is
-   *     provided for compatibility with FontConfig, which historically used
-   *     different enumeration, sometimes incorrectly forwarded to FreeType.
+   *     The legacy libXft color filter is no longer supported and ignored.
    *
    * @since:
-   *   2.3.0 (`FT_LCD_FILTER_LEGACY1` since 2.6.2)
+   *   2.3.0
    */
   typedef enum  FT_LcdFilter_
   {
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftlist.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftlist.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftlist.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftlist.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Generic list support for FreeType (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftlogging.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftlogging.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftlogging.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftlogging.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Additional debugging APIs.
  *
- * Copyright (C) 2020-2024 by
+ * Copyright (C) 2020-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftmac.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftmac.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftmac.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftmac.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Additional Mac-specific API.
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftmm.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftmm.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftmm.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftmm.h	2026-04-17 19:09:35.000000000 +0000
@@ -2,9 +2,9 @@
  *
  * ftmm.h
  *
- *   FreeType Multiple Master font interface (specification).
+ *   FreeType variation font interface (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -37,24 +37,79 @@
    *   multiple_masters
    *
    * @title:
-   *   Multiple Masters
+   *   OpenType Font Variations, TrueType GX, and Adobe MM Fonts
    *
    * @abstract:
-   *   How to manage Multiple Masters fonts.
+   *   How to manage variable fonts with multiple design axes.
    *
    * @description:
-   *   The following types and functions are used to manage Multiple Master
-   *   fonts, i.e., the selection of specific design instances by setting
-   *   design axis coordinates.
+   *   The following types and functions manage OpenType Font Variations,
+   *   Adobe Multiple Master (MM) fonts, and Apple TrueType GX fonts.  These
+   *   formats have in common that they allow the selection of specific
+   *   design instances by setting design coordinates for one or more axes
+   *   like font weight or width.
    *
-   *   Besides Adobe MM fonts, the interface supports Apple's TrueType GX and
-   *   OpenType variation fonts.  Some of the routines only work with Adobe
-   *   MM fonts, others will work with all three types.  They are similar
-   *   enough that a consistent interface makes sense.
+   *   For historical reasons there are two interfaces.  The first, older one
+   *   can be used with Adobe MM fonts only, and the second, newer one is a
+   *   unified interface that handles all three font formats.  However, some
+   *   differences remain and are documented accordingly; in particular,
+   *   Adobe MM fonts don't have named instances (see below).
    *
-   *   For Adobe MM fonts, macro @FT_IS_SFNT returns false.  For GX and
-   *   OpenType variation fonts, it returns true.
+   *   For Adobe MM fonts, macro @FT_IS_SFNT returns false.  For TrueType GX
+   *   and OpenType Font Variations, it returns true.
    *
+   *   We use mostly the terminology of the OpenType standard.  Here are some
+   *   important technical terms.
+   *
+   *   * A 'named instance' is a tuple of design coordinates that has a
+   *     string ID (i.e., an index into the font's 'name' table) associated
+   *     with it.  The font can tell the user that, for example,
+   *     [Weight=700,Width=110] is 'Bold'.  Another name for 'named instance'
+   *     is 'named style'.
+   *
+   *       Adobe MM fonts don't have named instances.
+   *
+   *   * The 'default instance' of a variation font is that instance for
+   *     which the nth axis coordinate is equal to the nth default axis
+   *     coordinate (i.e., `axis[n].def` as specified in the @FT_MM_Var
+   *     structure), with~n covering all axes.  In TrueType GX and OpenType
+   *     Font Variations, the default instance is explicitly given.  In Adobe
+   *     MM fonts, the `WeightVector` entry as found in the font file is
+   *     taken as the default instance.
+   *
+   *       For TrueType GX and OpenType Font Variations, FreeType synthesizes
+   *       a named instance for the default instance if the font does not
+   *       contain such an entry.
+   *
+   *   * 'Design coordinates' are the axis values found in a variation font
+   *      file.  Their meaning is specified by the font designer and the
+   *      values are rather arbitrary.
+   *
+   *       For example, the 'weight' axis in design coordinates might vary
+   *       between 100 (thin) and 900 (heavy) in font~A, while font~B
+   *       contains values between 400 (normal) and 800 (extra bold).
+   *
+   *   * 'Normalized coordinates' are design coordinates mapped to a standard
+   *     range; they are also called 'blend coordinates'.
+   *
+   *       For TrueType GX and OpenType Font Variations, the range is [-1;1],
+   *       with the minimum mapped to value~-1, the default mapped to
+   *       value~0, and the maximum mapped to value~1, and all other
+   *       coordinates mapped to intervening points.  Please look up the
+   *       [OpenType
+   *       specification](https://learn.microsoft.com/en-us/typography/opentype/spec/otvaroverview)
+   *       on how this mapping works in detail.
+   *
+   *       For Adobe MM fonts, this standard range is [0;1], with the minimum
+   *       mapped to value~0 and the maximum mapped to value~1, and all other
+   *       coordinates mapped to intervening points.  Please look up [Adobe
+   *       TechNote
+   *       #5015](https://adobe-type-tools.github.io/font-tech-notes/pdfs/5015.Type1_Supp.pdf)
+   *       on how this mapping works in detail.
+   *
+   *       Assuming that the two fonts in the previous example are OpenType
+   *       Font Variations, both font~A's [100;900] and font~B's [400;800]
+   *       coordinate ranges get mapped to [-1;1].
    */
 
 
@@ -64,14 +119,14 @@
    *   T1_MAX_MM_XXX
    *
    * @description:
-   *   Multiple Masters limits as defined in their specifications.
+   *   Adobe MM font limits as defined in their specifications.
    *
    * @values:
    *   T1_MAX_MM_AXIS ::
-   *     The maximum number of Multiple Masters axes.
+   *     The maximum number of Adobe MM font axes.
    *
    *   T1_MAX_MM_DESIGNS ::
-   *     The maximum number of Multiple Masters designs.
+   *     The maximum number of Adobe MM font designs.
    *
    *   T1_MAX_MM_MAP_POINTS ::
    *     The maximum number of elements in a design map.
@@ -88,11 +143,10 @@
    *   FT_MM_Axis
    *
    * @description:
-   *   A structure to model a given axis in design space for Multiple Masters
-   *   fonts.
+   *   A structure to model a given axis in design space for Adobe MM fonts.
    *
-   *   This structure can't be used for TrueType GX or OpenType variation
-   *   fonts.
+   *   This structure can't be used with TrueType GX or OpenType Font
+   *   Variations.
    *
    * @fields:
    *   name ::
@@ -119,17 +173,17 @@
    *   FT_Multi_Master
    *
    * @description:
-   *   A structure to model the axes and space of a Multiple Masters font.
+   *   A structure to model the axes and space of an Adobe MM font.
    *
-   *   This structure can't be used for TrueType GX or OpenType variation
-   *   fonts.
+   *   This structure can't be used with TrueType GX or OpenType Font
+   *   Variations.
    *
    * @fields:
    *   num_axis ::
    *     Number of axes.  Cannot exceed~4.
    *
    *   num_designs ::
-   *     Number of designs; should be normally 2^num_axis even though the
+   *     Number of designs; should be normally `2^num_axis` even though the
    *     Type~1 specification strangely allows for intermediate designs to be
    *     present.  This number cannot exceed~16.
    *
@@ -151,13 +205,13 @@
    *   FT_Var_Axis
    *
    * @description:
-   *   A structure to model a given axis in design space for Multiple
-   *   Masters, TrueType GX, and OpenType variation fonts.
+   *   A structure to model a given axis in design space for Adobe MM fonts,
+   *   TrueType GX, and OpenType Font Variations.
    *
    * @fields:
    *   name ::
    *     The axis's name.  Not always meaningful for TrueType GX or OpenType
-   *     variation fonts.
+   *     Font Variations.
    *
    *   minimum ::
    *     The axis's minimum design coordinate.
@@ -171,17 +225,17 @@
    *
    *   tag ::
    *     The axis's tag (the equivalent to 'name' for TrueType GX and
-   *     OpenType variation fonts).  FreeType provides default values for
+   *     OpenType Font Variations).  FreeType provides default values for
    *     Adobe MM fonts if possible.
    *
    *   strid ::
    *     The axis name entry in the font's 'name' table.  This is another
    *     (and often better) version of the 'name' field for TrueType GX or
-   *     OpenType variation fonts.  Not meaningful for Adobe MM fonts.
+   *     OpenType Font Variations.  Not meaningful for Adobe MM fonts.
    *
    * @note:
    *   The fields `minimum`, `def`, and `maximum` are 16.16 fractional values
-   *   for TrueType GX and OpenType variation fonts.  For Adobe MM fonts, the
+   *   for TrueType GX and OpenType Font Variations.  For Adobe MM fonts, the
    *   values are whole numbers (i.e., the fractional part is zero).
    */
   typedef struct  FT_Var_Axis_
@@ -205,7 +259,7 @@
    *
    * @description:
    *   A structure to model a named instance in a TrueType GX or OpenType
-   *   variation font.
+   *   Font Variations.
    *
    *   This structure can't be used for Adobe MM fonts.
    *
@@ -215,11 +269,11 @@
    *     entry for each axis.
    *
    *   strid ::
-   *     The entry in 'name' table identifying this instance.
+   *     An index into the 'name' table identifying this instance.
    *
    *   psid ::
-   *     The entry in 'name' table identifying a PostScript name for this
-   *     instance.  Value 0xFFFF indicates a missing entry.
+   *     An index into the 'name' table identifying a PostScript name for
+   *     this instance.  Value 0xFFFF indicates a missing entry.
    */
   typedef struct  FT_Var_Named_Style_
   {
@@ -236,39 +290,33 @@
    *   FT_MM_Var
    *
    * @description:
-   *   A structure to model the axes and space of an Adobe MM, TrueType GX,
-   *   or OpenType variation font.
+   *   A structure to model the axes and space of Adobe MM fonts, TrueType
+   *   GX, or OpenType Font Variations.
    *
    *   Some fields are specific to one format and not to the others.
    *
    * @fields:
    *   num_axis ::
    *     The number of axes.  The maximum value is~4 for Adobe MM fonts; no
-   *     limit in TrueType GX or OpenType variation fonts.
+   *     limit in TrueType GX or OpenType Font Variations.
    *
    *   num_designs ::
-   *     The number of designs; should be normally 2^num_axis for Adobe MM
-   *     fonts.  Not meaningful for TrueType GX or OpenType variation fonts
+   *     The number of designs; should be normally `2^num_axis` for Adobe MM
+   *     fonts.  Not meaningful for TrueType GX or OpenType Font Variations
    *     (where every glyph could have a different number of designs).
    *
    *   num_namedstyles ::
-   *     The number of named styles; a 'named style' is a tuple of design
-   *     coordinates that has a string ID (in the 'name' table) associated
-   *     with it.  The font can tell the user that, for example,
-   *     [Weight=1.5,Width=1.1] is 'Bold'.  Another name for 'named style' is
-   *     'named instance'.
-   *
-   *     For Adobe Multiple Masters fonts, this value is always zero because
-   *     the format does not support named styles.
+   *     The number of named instances.  For Adobe MM fonts, this value is
+   *     always zero.
    *
    *   axis ::
-   *     An axis descriptor table.  TrueType GX and OpenType variation fonts
+   *     An axis descriptor table.  TrueType GX and OpenType Font Variations
    *     contain slightly more data than Adobe MM fonts.  Memory management
    *     of this pointer is done internally by FreeType.
    *
    *   namedstyle ::
-   *     A named style (instance) table.  Only meaningful for TrueType GX and
-   *     OpenType variation fonts.  Memory management of this pointer is done
+   *     An array of named instances.  Only meaningful for TrueType GX and
+   *     OpenType Font Variations.  Memory management of this pointer is done
    *     internally by FreeType.
    */
   typedef struct  FT_MM_Var_
@@ -290,8 +338,8 @@
    * @description:
    *   Retrieve a variation descriptor of a given Adobe MM font.
    *
-   *   This function can't be used with TrueType GX or OpenType variation
-   *   fonts.
+   *   This function can't be used with TrueType GX or OpenType Font
+   *   Variations.
    *
    * @input:
    *   face ::
@@ -299,7 +347,7 @@
    *
    * @output:
    *   amaster ::
-   *     The Multiple Masters descriptor.
+   *     The Adobe MM font's variation descriptor.
    *
    * @return:
    *   FreeType error code.  0~means success.
@@ -366,8 +414,8 @@
    *   For Adobe MM fonts, choose an interpolated font design through design
    *   coordinates.
    *
-   *   This function can't be used with TrueType GX or OpenType variation
-   *   fonts.
+   *   This function can't be used with TrueType GX or OpenType Font
+   *   Variations.
    *
    * @inout:
    *   face ::
@@ -391,8 +439,8 @@
    *
    *   [Since 2.9] If `num_coords` is larger than zero, this function sets
    *   the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field
-   *   (i.e., @FT_IS_VARIATION will return true).  If `num_coords` is zero,
-   *   this bit flag gets unset.
+   *   (i.e., @FT_IS_VARIATION returns true).  If `num_coords` is zero, this
+   *   bit flag gets unset.
    */
   FT_EXPORT( FT_Error )
   FT_Set_MM_Design_Coordinates( FT_Face   face,
@@ -428,7 +476,7 @@
    *
    * @note:
    *   The design coordinates are 16.16 fractional values for TrueType GX and
-   *   OpenType variation fonts.  For Adobe MM fonts, the values are supposed
+   *   OpenType Font Variations.  For Adobe MM fonts, the values are supposed
    *   to be whole numbers (i.e., the fractional part is zero).
    *
    *   [Since 2.8.1] To reset all axes to the default values, call the
@@ -438,8 +486,14 @@
    *
    *   [Since 2.9] If `num_coords` is larger than zero, this function sets
    *   the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field
-   *   (i.e., @FT_IS_VARIATION will return true).  If `num_coords` is zero,
-   *   this bit flag gets unset.
+   *   (i.e., @FT_IS_VARIATION returns true).  If `num_coords` is zero, this
+   *   bit flag gets unset.
+   *
+   *   [Since 2.14] This function also sets the @FT_FACE_FLAG_VARIATION bit
+   *   in @FT_Face's `face_flags` field (i.e., @FT_IS_VARIATION returns
+   *   true) if any of the provided coordinates is different from the face's
+   *   default value for the corresponding axis, that is, the set up face is
+   *   not at its default position.
    */
   FT_EXPORT( FT_Error )
   FT_Set_Var_Design_Coordinates( FT_Face    face,
@@ -468,14 +522,14 @@
    *
    * @output:
    *   coords ::
-   *     The design coordinates array.
+   *     The design coordinates array, which must be allocated by the user.
    *
    * @return:
    *   FreeType error code.  0~means success.
    *
    * @note:
    *   The design coordinates are 16.16 fractional values for TrueType GX and
-   *   OpenType variation fonts.  For Adobe MM fonts, the values are whole
+   *   OpenType Font Variations.  For Adobe MM fonts, the values are whole
    *   numbers (i.e., the fractional part is zero).
    *
    * @since:
@@ -493,8 +547,7 @@
    *   FT_Set_MM_Blend_Coordinates
    *
    * @description:
-   *   Choose an interpolated font design through normalized blend
-   *   coordinates.
+   *   Choose an interpolated font design through normalized coordinates.
    *
    *   This function works with all supported variation formats.
    *
@@ -509,9 +562,10 @@
    *     the number of axes, use default values for the remaining axes.
    *
    *   coords ::
-   *     The design coordinates array.  Each element is a 16.16 fractional
-   *     value and must be between 0 and 1.0 for Adobe MM fonts, and between
-   *     -1.0 and 1.0 for TrueType GX and OpenType variation fonts.
+   *     The normalized coordinates array.  Each element is a 16.16
+   *     fractional value and must be between 0 and 1.0 for Adobe MM fonts,
+   *     and between -1.0 and 1.0 for TrueType GX and OpenType Font
+   *     Variations.
    *
    * @return:
    *   FreeType error code.  0~means success.
@@ -524,8 +578,14 @@
    *
    *   [Since 2.9] If `num_coords` is larger than zero, this function sets
    *   the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field
-   *   (i.e., @FT_IS_VARIATION will return true).  If `num_coords` is zero,
-   *   this bit flag gets unset.
+   *   (i.e., @FT_IS_VARIATION returns true).  If `num_coords` is zero, this
+   *   bit flag gets unset.
+   *
+   *   [Since 2.14] This function also sets the @FT_FACE_FLAG_VARIATION bit
+   *   in @FT_Face's `face_flags` field (i.e., @FT_IS_VARIATION returns
+   *   true) if any of the provided coordinates is different from the face's
+   *   default value for the corresponding axis, that is, the set up face is
+   *   not at its default position.
    */
   FT_EXPORT( FT_Error )
   FT_Set_MM_Blend_Coordinates( FT_Face    face,
@@ -539,8 +599,8 @@
    *   FT_Get_MM_Blend_Coordinates
    *
    * @description:
-   *   Get the normalized blend coordinates of the currently selected
-   *   interpolated font.
+   *   Get the normalized coordinates of the currently selected interpolated
+   *   font.
    *
    *   This function works with all supported variation formats.
    *
@@ -549,14 +609,14 @@
    *     A handle to the source face.
    *
    *   num_coords ::
-   *     The number of normalized blend coordinates to retrieve.  If it is
-   *     larger than the number of axes, set the excess values to~0.5 for
-   *     Adobe MM fonts, and to~0 for TrueType GX and OpenType variation
-   *     fonts.
+   *     The number of normalized coordinates to retrieve.  If it is larger
+   *     than the number of axes, set the excess values to~0.5 for Adobe MM
+   *     fonts, and to~0 for TrueType GX and OpenType Font Variations.
    *
    * @output:
    *   coords ::
-   *     The normalized blend coordinates array (as 16.16 fractional values).
+   *     The normalized coordinates array (as 16.16 fractional values), which
+   *     must be allocated by the user.
    *
    * @return:
    *   FreeType error code.  0~means success.
@@ -610,8 +670,8 @@
    *   For Adobe MM fonts, choose an interpolated font design by directly
    *   setting the weight vector.
    *
-   *   This function can't be used with TrueType GX or OpenType variation
-   *   fonts.
+   *   This function can't be used with TrueType GX or OpenType Font
+   *   Variations.
    *
    * @inout:
    *   face ::
@@ -630,16 +690,16 @@
    *   FreeType error code.  0~means success.
    *
    * @note:
-   *   Adobe Multiple Master fonts limit the number of designs, and thus the
-   *   length of the weight vector to 16~elements.
+   *   Adobe MM fonts limit the number of designs, and thus the length of the
+   *   weight vector, to 16~elements.
    *
    *   If `len` is larger than zero, this function sets the
    *   @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field (i.e.,
-   *   @FT_IS_VARIATION will return true).  If `len` is zero, this bit flag
-   *   is unset and the weight vector array is reset to the default values.
+   *   @FT_IS_VARIATION returns true).  If `len` is zero, this bit flag is
+   *   unset and the weight vector array is reset to the default values.
    *
    *   The Adobe documentation also states that the values in the
-   *   WeightVector array must total 1.0 +/-~0.001.  In practice this does
+   *   `WeightVector` array must total 1.0 +/-~0.001.  In practice this does
    *   not seem to be enforced, so is not enforced here, either.
    *
    * @since:
@@ -659,8 +719,8 @@
    * @description:
    *   For Adobe MM fonts, retrieve the current weight vector of the font.
    *
-   *   This function can't be used with TrueType GX or OpenType variation
-   *   fonts.
+   *   This function can't be used with TrueType GX or OpenType Font
+   *   Variations.
    *
    * @inout:
    *   face ::
@@ -677,14 +737,14 @@
    *
    * @output:
    *   weightvector ::
-   *     An array to be filled.
+   *     An array to be filled; it must be allocated by the user.
    *
    * @return:
    *   FreeType error code.  0~means success.
    *
    * @note:
-   *   Adobe Multiple Master fonts limit the number of designs, and thus the
-   *   length of the WeightVector to~16.
+   *   Adobe MM fonts limit the number of designs, and thus the length of the
+   *   weight vector, to~16 elements.
    *
    * @since:
    *   2.10
@@ -760,8 +820,8 @@
    *     A handle to the source face.
    *
    *   instance_index ::
-   *     The index of the requested instance, starting with value 1.  If set
-   *     to value 0, FreeType switches to font access without a named
+   *     The index of the requested instance, starting with value~1.  If set
+   *     to value~0, FreeType switches to font access without a named
    *     instance.
    *
    * @return:
@@ -771,11 +831,11 @@
    *   The function uses the value of `instance_index` to set bits 16-30 of
    *   the face's `face_index` field.  It also resets any variation applied
    *   to the font, and the @FT_FACE_FLAG_VARIATION bit of the face's
-   *   `face_flags` field gets reset to zero (i.e., @FT_IS_VARIATION will
-   *   return false).
+   *   `face_flags` field gets reset to zero (i.e., @FT_IS_VARIATION returns
+   *   false).
    *
-   *   For Adobe MM fonts (which don't have named instances) this function
-   *   simply resets the current face to the default instance.
+   *   For Adobe MM fonts, this function resets the current face to the
+   *   default instance.
    *
    * @since:
    *   2.9
@@ -794,10 +854,6 @@
    *   Retrieve the index of the default named instance, to be used with
    *   @FT_Set_Named_Instance.
    *
-   *   The default instance of a variation font is that instance for which
-   *   the nth axis coordinate is equal to `axis[n].def` (as specified in the
-   *   @FT_MM_Var structure), with~n covering all axes.
-   *
    *   FreeType synthesizes a named instance for the default instance if the
    *   font does not contain such an entry.
    *
@@ -813,8 +869,8 @@
    *   FreeType error code.  0~means success.
    *
    * @note:
-   *   For Adobe MM fonts (which don't have named instances) this function
-   *   always returns zero for `instance_index`.
+   *   For Adobe MM fonts, this function always returns zero for
+   *   `instance_index`.
    *
    * @since:
    *   2.13.1
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftmodapi.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftmodapi.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftmodapi.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftmodapi.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType modules public interface (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftmoderr.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftmoderr.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftmoderr.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftmoderr.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType module error offsets (specification).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftoutln.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftoutln.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftoutln.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftoutln.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Support for the FT_Outline type used to store glyph shapes of
  *   most scalable font formats (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftparams.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftparams.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftparams.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftparams.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType API for possible FT_Parameter tags (specification only).
  *
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -133,11 +133,8 @@
    *   FT_PARAM_TAG_LCD_FILTER_WEIGHTS
    *
    * @description:
-   *   An @FT_Parameter tag to be used with @FT_Face_Properties.  The
-   *   corresponding argument specifies the five LCD filter weights for a
-   *   given face (if using @FT_LOAD_TARGET_LCD, for example), overriding the
-   *   global default values or the values set up with
-   *   @FT_Library_SetLcdFilterWeights.
+   *   Overriding global LCD filter weights with custom values for a given
+   *   face is no longer supported and ignored.
    *
    * @since:
    *   2.8
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftrender.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftrender.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftrender.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftrender.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType renderer modules public interface (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftsizes.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftsizes.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftsizes.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftsizes.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType size objects management (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftsnames.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftsnames.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftsnames.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftsnames.h	2026-04-17 19:09:35.000000000 +0000
@@ -7,7 +7,7 @@
  *
  *   This is _not_ used to retrieve glyph names!
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftstroke.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftstroke.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftstroke.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftstroke.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType path stroker (specification).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftsynth.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftsynth.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftsynth.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftsynth.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   FreeType synthesizing code for emboldening and slanting
  *   (specification).
  *
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftsystem.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftsystem.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ftsystem.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ftsystem.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType low-level system interface definition (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/fttrigon.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/fttrigon.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/fttrigon.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/fttrigon.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType trigonometric functions (specification).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/fttypes.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/fttypes.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/fttypes.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/fttypes.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType simple types definitions (specification only).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/autohint.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/autohint.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/autohint.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/autohint.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   High-level 'autohint' module-specific interface (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/cffotypes.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/cffotypes.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/cffotypes.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/cffotypes.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Basic OpenType/CFF object type definitions (specification).
  *
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/cfftypes.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/cfftypes.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/cfftypes.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/cfftypes.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Basic OpenType/CFF type definitions and interface (specification
  *   only).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -191,8 +191,8 @@
     FT_UInt    weight;
     FT_Bool    is_fixed_pitch;
     FT_Fixed   italic_angle;
-    FT_Fixed   underline_position;
-    FT_Fixed   underline_thickness;
+    FT_Short   underline_position;
+    FT_UShort  underline_thickness;
     FT_Int     paint_type;
     FT_Int     charstring_type;
     FT_Matrix  font_matrix;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/compiler-macros.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/compiler-macros.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/compiler-macros.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/compiler-macros.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Compiler-specific macro definitions used internally by FreeType.
  *
- * Copyright (C) 2020-2024 by
+ * Copyright (C) 2020-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -128,8 +128,8 @@
    * before a function declaration.
    */
 
-  /* Visual C, mingw */
-#if defined( _WIN32 )
+  /* Visual C, MinGW, Cygwin */
+#if defined( _WIN32 ) || defined( __CYGWIN__ )
 #define FT_INTERNAL_FUNCTION_ATTRIBUTE  /* empty */
 
   /* gcc, clang */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftcalc.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftcalc.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftcalc.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftcalc.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Arithmetic computations (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -27,17 +27,87 @@
 FT_BEGIN_HEADER
 
 
+  /*
+   * The following macros have two purposes.
+   *
+   * - Tag places where overflow is expected and harmless.
+   *
+   * - Avoid run-time undefined behavior sanitizer errors.
+   *
+   * Use with care!
+   */
+#define ADD_INT( a, b )                           \
+          (FT_Int)( (FT_UInt)(a) + (FT_UInt)(b) )
+#define SUB_INT( a, b )                           \
+          (FT_Int)( (FT_UInt)(a) - (FT_UInt)(b) )
+#define MUL_INT( a, b )                           \
+          (FT_Int)( (FT_UInt)(a) * (FT_UInt)(b) )
+#define NEG_INT( a )                              \
+          (FT_Int)( (FT_UInt)0 - (FT_UInt)(a) )
+
+#define ADD_LONG( a, b )                             \
+          (FT_Long)( (FT_ULong)(a) + (FT_ULong)(b) )
+#define SUB_LONG( a, b )                             \
+          (FT_Long)( (FT_ULong)(a) - (FT_ULong)(b) )
+#define MUL_LONG( a, b )                             \
+          (FT_Long)( (FT_ULong)(a) * (FT_ULong)(b) )
+#define NEG_LONG( a )                                \
+          (FT_Long)( (FT_ULong)0 - (FT_ULong)(a) )
+
+#define ADD_INT32( a, b )                               \
+          (FT_Int32)( (FT_UInt32)(a) + (FT_UInt32)(b) )
+#define SUB_INT32( a, b )                               \
+          (FT_Int32)( (FT_UInt32)(a) - (FT_UInt32)(b) )
+#define MUL_INT32( a, b )                               \
+          (FT_Int32)( (FT_UInt32)(a) * (FT_UInt32)(b) )
+#define NEG_INT32( a )                                  \
+          (FT_Int32)( (FT_UInt32)0 - (FT_UInt32)(a) )
+
+#ifdef FT_INT64
+
+#define ADD_INT64( a, b )                               \
+          (FT_Int64)( (FT_UInt64)(a) + (FT_UInt64)(b) )
+#define SUB_INT64( a, b )                               \
+          (FT_Int64)( (FT_UInt64)(a) - (FT_UInt64)(b) )
+#define MUL_INT64( a, b )                               \
+          (FT_Int64)( (FT_UInt64)(a) * (FT_UInt64)(b) )
+#define NEG_INT64( a )                                  \
+          (FT_Int64)( (FT_UInt64)0 - (FT_UInt64)(a) )
+
+#endif /* FT_INT64 */
+
+
   /**************************************************************************
    *
    * FT_MulDiv() and FT_MulFix() are declared in freetype.h.
    *
    */
 
-#ifndef  FT_CONFIG_OPTION_NO_ASSEMBLER
-  /* Provide assembler fragments for performance-critical functions. */
-  /* These must be defined `static __inline__' with GCC.             */
+#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
 
-#if defined( __CC_ARM ) || defined( __ARMCC__ )  /* RVCT */
+#ifdef FT_INT64
+
+  static inline FT_Long
+  FT_MulFix_64( FT_Long  a,
+                FT_Long  b )
+  {
+    FT_Int64  ab = MUL_INT64( a, b );
+
+
+    ab = ADD_INT64( ab, 0x8000 + ( ab >> 63 ) );  /* rounding phase */
+
+    return (FT_Long)( ab >> 16 );
+  }
+
+
+#define FT_MulFix( a, b )  FT_MulFix_64( a, b )
+
+#elif !defined( FT_CONFIG_OPTION_NO_ASSEMBLER )
+  /* Provide 32-bit assembler fragments for optimized FT_MulFix. */
+  /* These must be defined `static __inline__' or similar.       */
+
+#if defined( __arm__ )                                 && \
+    ( defined( __thumb2__ ) || !defined( __thumb__ ) )
 
 #define FT_MULFIX_ASSEMBLER  FT_MulFix_arm
 
@@ -49,6 +119,7 @@
   {
     FT_Int32  t, t2;
 
+#if defined( __CC_ARM ) || defined( __ARMCC__ )  /* RVCT */
 
     __asm
     {
@@ -60,28 +131,8 @@
       mov   a,  t2, lsr #16         /* a   = t2 >> 16 */
       orr   a,  a,  t,  lsl #16     /* a  |= t << 16 */
     }
-    return a;
-  }
-
-#endif /* __CC_ARM || __ARMCC__ */
-
-
-#ifdef __GNUC__
-
-#if defined( __arm__ )                                 && \
-    ( !defined( __thumb__ ) || defined( __thumb2__ ) ) && \
-    !( defined( __CC_ARM ) || defined( __ARMCC__ ) )
-
-#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm
-
-  /* documentation is in freetype.h */
-
-  static __inline__ FT_Int32
-  FT_MulFix_arm( FT_Int32  a,
-                 FT_Int32  b )
-  {
-    FT_Int32  t, t2;
 
+#elif defined( __GNUC__ )
 
     __asm__ __volatile__ (
       "smull  %1, %2, %4, %3\n\t"       /* (lo=%1,hi=%2) = a*b */
@@ -98,26 +149,25 @@
       : "=r"(a), "=&r"(t2), "=&r"(t)
       : "r"(a), "r"(b)
       : "cc" );
-    return a;
-  }
 
-#endif /* __arm__                      && */
-       /* ( __thumb2__ || !__thumb__ ) && */
-       /* !( __CC_ARM || __ARMCC__ )      */
+#endif
 
+    return a;
+  }
 
-#if defined( __i386__ )
+#elif defined( __i386__ ) || defined( _M_IX86 )
 
 #define FT_MULFIX_ASSEMBLER  FT_MulFix_i386
 
   /* documentation is in freetype.h */
 
-  static __inline__ FT_Int32
+  static __inline FT_Int32
   FT_MulFix_i386( FT_Int32  a,
                   FT_Int32  b )
   {
     FT_Int32  result;
 
+#if defined( __GNUC__ )
 
     __asm__ __volatile__ (
       "imul  %%edx\n"
@@ -132,27 +182,8 @@
       : "=a"(result), "=d"(b)
       : "a"(a), "d"(b)
       : "%ecx", "cc" );
-    return result;
-  }
-
-#endif /* i386 */
-
-#endif /* __GNUC__ */
-
-
-#ifdef _MSC_VER /* Visual C++ */
 
-#ifdef _M_IX86
-
-#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386
-
-  /* documentation is in freetype.h */
-
-  static __inline FT_Int32
-  FT_MulFix_i386( FT_Int32  a,
-                  FT_Int32  b )
-  {
-    FT_Int32  result;
+#elif defined( _MSC_VER )
 
     __asm
     {
@@ -169,81 +200,21 @@
       add eax, edx
       mov result, eax
     }
-    return result;
-  }
-
-#endif /* _M_IX86 */
 
-#endif /* _MSC_VER */
-
-
-#if defined( __GNUC__ ) && defined( __x86_64__ )
-
-#define FT_MULFIX_ASSEMBLER  FT_MulFix_x86_64
-
-  static __inline__ FT_Int32
-  FT_MulFix_x86_64( FT_Int32  a,
-                    FT_Int32  b )
-  {
-    /* Temporarily disable the warning that C90 doesn't support */
-    /* `long long'.                                             */
-#if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 6 )
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wlong-long"
 #endif
 
-#if 1
-    /* Technically not an assembly fragment, but GCC does a really good */
-    /* job at inlining it and generating good machine code for it.      */
-    long long  ret, tmp;
-
-
-    ret  = (long long)a * b;
-    tmp  = ret >> 63;
-    ret += 0x8000 + tmp;
-
-    return (FT_Int32)( ret >> 16 );
-#else
-
-    /* For some reason, GCC 4.6 on Ubuntu 12.04 generates invalid machine  */
-    /* code from the lines below.  The main issue is that `wide_a' is not  */
-    /* properly initialized by sign-extending `a'.  Instead, the generated */
-    /* machine code assumes that the register that contains `a' on input   */
-    /* can be used directly as a 64-bit value, which is wrong most of the  */
-    /* time.                                                               */
-    long long  wide_a = (long long)a;
-    long long  wide_b = (long long)b;
-    long long  result;
-
-
-    __asm__ __volatile__ (
-      "imul %2, %1\n"
-      "mov %1, %0\n"
-      "sar $63, %0\n"
-      "lea 0x8000(%1, %0), %0\n"
-      "sar $16, %0\n"
-      : "=&r"(result), "=&r"(wide_a)
-      : "r"(wide_b)
-      : "cc" );
-
-    return (FT_Int32)result;
-#endif
-
-#if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 6 )
-#pragma GCC diagnostic pop
-#endif
+    return result;
   }
 
-#endif /* __GNUC__ && __x86_64__ */
-
-#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
-
+#endif /* __i386__ || _M_IX86 */
 
-#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
 #ifdef FT_MULFIX_ASSEMBLER
 #define FT_MulFix( a, b )  FT_MULFIX_ASSEMBLER( (FT_Int32)(a), (FT_Int32)(b) )
 #endif
-#endif
+
+#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+#endif /* FT_CONFIG_OPTION_INLINE_MULFIX */
 
 
   /**************************************************************************
@@ -278,40 +249,6 @@
                       FT_Long  c );
 
 
-  /**************************************************************************
-   *
-   * @function:
-   *   FT_MulAddFix
-   *
-   * @description:
-   *   Compute `(s[0] * f[0] + s[1] * f[1] + ...) / 0x10000`, where `s[n]` is
-   *   usually a 16.16 scalar.
-   *
-   * @input:
-   *   s ::
-   *     The array of scalars.
-   *   f ::
-   *     The array of factors.
-   *   count ::
-   *     The number of entries in the array.
-   *
-   * @return:
-   *   The result of `(s[0] * f[0] + s[1] * f[1] + ...) / 0x10000`.
-   *
-   * @note:
-   *   This function is currently used for the scaled delta computation of
-   *   variation stores.  It internally uses 64-bit data types when
-   *   available, otherwise it emulates 64-bit math by using 32-bit
-   *   operations, which produce a correct result but most likely at a slower
-   *   performance in comparison to the implementation base on `int64_t`.
-   *
-   */
-  FT_BASE( FT_Int32 )
-  FT_MulAddFix( FT_Fixed*  s,
-                FT_Int32*  f,
-                FT_UInt    count );
-
-
   /*
    * A variant of FT_Matrix_Multiply which scales its result afterwards.  The
    * idea is that both `a' and `b' are scaled by factors of 10 so that the
@@ -455,6 +392,10 @@
 
 #define FT_MSB( x )  FT_MSB_i386( x )
 
+#elif defined( __CC_ARM )
+
+#define FT_MSB( x )  ( 31 - __clz( x ) )
+
 #elif defined( __SunOS_5_11 )
 
 #include 
@@ -526,55 +467,6 @@
 
 #define ROUND_F26DOT6( x )     ( ( (x) + 32 - ( x < 0 ) ) & -64 )
 
-  /*
-   * The following macros have two purposes.
-   *
-   * - Tag places where overflow is expected and harmless.
-   *
-   * - Avoid run-time sanitizer errors.
-   *
-   * Use with care!
-   */
-#define ADD_INT( a, b )                           \
-          (FT_Int)( (FT_UInt)(a) + (FT_UInt)(b) )
-#define SUB_INT( a, b )                           \
-          (FT_Int)( (FT_UInt)(a) - (FT_UInt)(b) )
-#define MUL_INT( a, b )                           \
-          (FT_Int)( (FT_UInt)(a) * (FT_UInt)(b) )
-#define NEG_INT( a )                              \
-          (FT_Int)( (FT_UInt)0 - (FT_UInt)(a) )
-
-#define ADD_LONG( a, b )                             \
-          (FT_Long)( (FT_ULong)(a) + (FT_ULong)(b) )
-#define SUB_LONG( a, b )                             \
-          (FT_Long)( (FT_ULong)(a) - (FT_ULong)(b) )
-#define MUL_LONG( a, b )                             \
-          (FT_Long)( (FT_ULong)(a) * (FT_ULong)(b) )
-#define NEG_LONG( a )                                \
-          (FT_Long)( (FT_ULong)0 - (FT_ULong)(a) )
-
-#define ADD_INT32( a, b )                               \
-          (FT_Int32)( (FT_UInt32)(a) + (FT_UInt32)(b) )
-#define SUB_INT32( a, b )                               \
-          (FT_Int32)( (FT_UInt32)(a) - (FT_UInt32)(b) )
-#define MUL_INT32( a, b )                               \
-          (FT_Int32)( (FT_UInt32)(a) * (FT_UInt32)(b) )
-#define NEG_INT32( a )                                  \
-          (FT_Int32)( (FT_UInt32)0 - (FT_UInt32)(a) )
-
-#ifdef FT_INT64
-
-#define ADD_INT64( a, b )                               \
-          (FT_Int64)( (FT_UInt64)(a) + (FT_UInt64)(b) )
-#define SUB_INT64( a, b )                               \
-          (FT_Int64)( (FT_UInt64)(a) - (FT_UInt64)(b) )
-#define MUL_INT64( a, b )                               \
-          (FT_Int64)( (FT_UInt64)(a) * (FT_UInt64)(b) )
-#define NEG_INT64( a )                                  \
-          (FT_Int64)( (FT_UInt64)0 - (FT_UInt64)(a) )
-
-#endif /* FT_INT64 */
-
 
 FT_END_HEADER
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdebug.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdebug.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdebug.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdebug.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Debugging and logging component (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdrv.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdrv.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdrv.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftdrv.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType internal font driver interface (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftgloadr.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftgloadr.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftgloadr.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftgloadr.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType glyph loader (specification).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/fthash.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/fthash.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/fthash.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/fthash.h	2026-04-17 19:09:35.000000000 +0000
@@ -117,6 +117,18 @@
                       FT_Hash    hash,
                       FT_Memory  memory );
 
+  FT_Error
+  ft_hash_str_insert_no_overwrite( const char*  key,
+                                   size_t       data,
+                                   FT_Hash      hash,
+                                   FT_Memory    memory );
+
+  FT_Error
+  ft_hash_num_insert_no_overwrite( FT_Int     num,
+                                   size_t     data,
+                                   FT_Hash    hash,
+                                   FT_Memory  memory );
+
   size_t*
   ft_hash_str_lookup( const char*  key,
                       FT_Hash      hash );
@@ -125,6 +137,17 @@
   ft_hash_num_lookup( FT_Int   num,
                       FT_Hash  hash );
 
+  FT_Bool
+  ft_hash_num_iterator( FT_UInt  *idx,
+                        FT_Int   *key,
+                        size_t   *value,
+                        FT_Hash   hash );
+
+  FT_Bool
+  ft_hash_str_iterator( FT_UInt      *idx,
+                        const char*  *key,
+                        size_t       *value,
+                        FT_Hash       hash );
 
 FT_END_HEADER
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmemory.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmemory.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmemory.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmemory.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType memory management macros (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmmtypes.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmmtypes.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmmtypes.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftmmtypes.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   OpenType Variations type definitions for internal use
  *   with the multi-masters service (specification).
  *
- * Copyright (C) 2022-2024 by
+ * Copyright (C) 2022-2025 by
  * David Turner, Robert Wilhelm, Werner Lemberg, George Williams, and
  * Dominik Röttsches.
  *
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftobjs.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftobjs.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftobjs.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftobjs.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType private base classes (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -275,6 +275,28 @@
                   FT_GlyphSlot    slot,
                   FT_Render_Mode  mode );
 
+
+  /**************************************************************************
+   *
+   * @Function:
+   *   find_unicode_charmap
+   *
+   * @Description:
+   *   This function finds a Unicode charmap, if there is one.  And if there
+   *   is more than one, it tries to favour the more extensive one, i.e., one
+   *   that supports UCS-4 against those which are limited to the BMP (UCS-2
+   *   encoding.)
+   *
+   *   If a unicode charmap is found, `face->charmap` is set to it.
+   *
+   *   This function is called from `open_face`, from `FT_Select_Charmap(...,
+   *   FT_ENCODING_UNICODE)`, and also from `afadjust.c` in the 'autofit'
+   *   module.
+   */
+  FT_BASE( FT_Error )
+  find_unicode_charmap( FT_Face  face );
+
+
 #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
 
   typedef void  (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap*      bitmap,
@@ -343,11 +365,6 @@
    *     Value~0 means to use the font's value.  Value~-1 means to use the
    *     CFF driver's default.
    *
-   *   lcd_weights ::
-   *   lcd_filter_func ::
-   *     These fields specify the LCD filtering weights and callback function
-   *     for ClearType-style subpixel rendering.
-   *
    *   refcount ::
    *     A counter initialized to~1 at the time an @FT_Face structure is
    *     created.  @FT_Reference_Face increments this counter, and
@@ -369,11 +386,6 @@
     FT_Char              no_stem_darkening;
     FT_Int32             random_seed;
 
-#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-    FT_LcdFiveTapFilter      lcd_weights;      /* filter weights, if any */
-    FT_Bitmap_LcdFilterFunc  lcd_filter_func;  /* filtering callback     */
-#endif
-
     FT_Int  refcount;
 
   } FT_Face_InternalRec;
@@ -498,9 +510,9 @@
    */
   typedef struct  FT_ModuleRec_
   {
-    FT_Module_Class*  clazz;
-    FT_Library        library;
-    FT_Memory         memory;
+    const FT_Module_Class*  clazz;
+    FT_Library              library;
+    FT_Memory               memory;
 
   } FT_ModuleRec;
 
@@ -702,9 +714,9 @@
                               const FT_Vector*  origin );
 
   /* Allocate a new bitmap buffer in a glyph slot. */
+  /* Dimensions must be preset in advance.         */
   FT_BASE( FT_Error )
-  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,
-                             FT_ULong      size );
+  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot );
 
 
   /* Set the bitmap buffer in a glyph slot to a given pointer.  The buffer */
@@ -867,10 +879,6 @@
    *   lcd_weights ::
    *     The LCD filter weights for ClearType-style subpixel rendering.
    *
-   *   lcd_filter_func ::
-   *     The LCD filtering callback function for for ClearType-style subpixel
-   *     rendering.
-   *
    *   lcd_geometry ::
    *     This array specifies LCD subpixel geometry and controls Harmony LCD
    *     rendering technique, alternative to ClearType.
@@ -904,7 +912,6 @@
 
 #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
     FT_LcdFiveTapFilter      lcd_weights;      /* filter weights, if any */
-    FT_Bitmap_LcdFilterFunc  lcd_filter_func;  /* filtering callback     */
 #else
     FT_Vector                lcd_geometry[3];  /* RGB subpixel positions */
 #endif
@@ -973,17 +980,6 @@
 #endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
 
 
-  /* Define default raster's interface.  The default raster is located in  */
-  /* `src/base/ftraster.c'.                                                */
-  /*                                                                       */
-  /* Client applications can register new rasters through the              */
-  /* FT_Set_Raster() API.                                                  */
-
-#ifndef FT_NO_DEFAULT_RASTER
-  FT_EXPORT_VAR( FT_Raster_Funcs )  ft_default_raster;
-#endif
-
-
   /**************************************************************************
    *
    * @macro:
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftpsprop.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftpsprop.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftpsprop.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftpsprop.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Get and set properties of PostScript drivers (specification).
  *
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftrfork.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftrfork.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftrfork.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftrfork.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Embedded resource forks accessor (specification).
  *
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
  * Masatake YAMATO and Redhat K.K.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftserv.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftserv.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftserv.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftserv.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType services (specification only).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftstream.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftstream.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftstream.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftstream.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Stream handling (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/fttrace.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/fttrace.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/fttrace.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/fttrace.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Tracing handling (specification only).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -19,7 +19,7 @@
   /* definitions of trace levels for FreeType 2 */
 
   /* the maximum string length (if the argument to `FT_TRACE_DEF` */
-  /* gets used as a string) plus one charachter for ':' plus      */
+  /* gets used as a string) plus one character for ':' plus       */
   /* another one for the trace level                              */
 #define FT_MAX_TRACE_LEVEL_LENGTH  (9 + 1 + 1)
 
@@ -159,6 +159,7 @@
 FT_TRACE_DEF( gxvtrak )
 
   /* autofit components */
+FT_TRACE_DEF( afadjust )
 FT_TRACE_DEF( afcjk )
 FT_TRACE_DEF( afglobal )
 FT_TRACE_DEF( afhints )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftvalid.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftvalid.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftvalid.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/ftvalid.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType validation support (specification).
  *
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/psaux.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/psaux.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/psaux.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/psaux.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Auxiliary functions and data structures related to PostScript fonts
  *   (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/pshints.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/pshints.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/pshints.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/pshints.h	2026-04-17 19:09:35.000000000 +0000
@@ -6,7 +6,7 @@
  *   recorders (specification only).  These are used to support native
  *   T1/T2 hints in the 'type1', 'cid', and 'cff' font drivers.
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svbdf.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svbdf.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svbdf.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svbdf.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType BDF services (specification).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcfftl.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcfftl.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcfftl.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcfftl.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType CFF tables loader service (specification).
  *
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcid.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcid.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcid.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svcid.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType CID font services (specification).
  *
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
  * Derek Clegg and Michael Toftdal.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svfntfmt.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svfntfmt.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svfntfmt.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svfntfmt.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType font format service (specification only).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgldict.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgldict.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgldict.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgldict.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType glyph dictionary services (specification).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgxval.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgxval.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgxval.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svgxval.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType API for validating TrueTypeGX/AAT tables (specification).
  *
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
  * Masatake YAMATO, Red Hat K.K.,
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svkern.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svkern.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svkern.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svkern.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType Kerning service (specification).
  *
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmetric.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmetric.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmetric.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmetric.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType services for metrics variations (specification).
  *
- * Copyright (C) 2016-2024 by
+ * Copyright (C) 2016-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -77,7 +77,7 @@
   typedef void
   (*FT_Metrics_Adjust_Func)( FT_Face  face );
 
-  typedef FT_Error
+  typedef void
   (*FT_Size_Reset_Func)( FT_Size  size );
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmm.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmm.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmm.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svmm.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType Multiple Masters and GX var services (specification).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svotval.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svotval.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svotval.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svotval.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType OpenType validation service (specification).
  *
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpfr.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpfr.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpfr.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpfr.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Internal PFR service functions (specification).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpostnm.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpostnm.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpostnm.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpostnm.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType PostScript name services (specification).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svprop.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svprop.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svprop.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svprop.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType property service (specification).
  *
- * Copyright (C) 2012-2024 by
+ * Copyright (C) 2012-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpscmap.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpscmap.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpscmap.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpscmap.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType PostScript charmap service (specification).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpsinfo.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpsinfo.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpsinfo.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svpsinfo.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType PostScript info service (specification).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svsfnt.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svsfnt.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svsfnt.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svsfnt.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType SFNT table loading service (specification).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttcmap.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttcmap.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttcmap.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttcmap.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType TrueType/sfnt cmap extra information service.
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * Masatake YAMATO, Redhat K.K.,
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svtteng.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svtteng.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svtteng.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svtteng.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType TrueType engine query service (specification).
  *
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttglyf.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttglyf.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttglyf.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svttglyf.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType TrueType glyph service.
  *
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
  * David Turner.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svwinfnt.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svwinfnt.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svwinfnt.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/services/svwinfnt.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType Windows FNT/FONT service (specification).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/sfnt.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/sfnt.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/sfnt.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/sfnt.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   High-level 'sfnt' driver interface (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -612,7 +612,7 @@
    *
    * @return:
    *   Value~1 if a ClipBox is found.  If no clip box is found or an
-   *   error occured, value~0 is returned.
+   *   error occurred, value~0 is returned.
    */
   typedef FT_Bool
   ( *TT_Get_Color_Glyph_ClipBox_Func )( TT_Face      face,
@@ -707,7 +707,7 @@
    *
    * @return:
    *   Value~1 if everything is OK.  Value~0 if no details can be found for
-   *   this paint or any other error occured.
+   *   this paint or any other error occurred.
    */
   typedef FT_Bool
   ( *TT_Get_Paint_Func )( TT_Face         face,
@@ -808,7 +808,7 @@
    *     corresponding (1,0) Apple entry.
    *
    * @return:
-   *   1 if there is either a win or apple entry (or both), 0 otheriwse.
+   *   1 if there is either a win or apple entry (or both), 0 otherwise.
    */
   typedef FT_Bool
   (*TT_Get_Name_ID_Func)( TT_Face    face,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/svginterface.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/svginterface.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/svginterface.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/svginterface.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Interface of ot-svg module (specification only).
  *
- * Copyright (C) 2022-2024 by
+ * Copyright (C) 2022-2025 by
  * David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/t1types.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/t1types.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/t1types.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/t1types.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Basic Type1/Type2 type definitions and interface (specification
  *   only).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/tttypes.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/tttypes.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/tttypes.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/tttypes.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Basic SFNT/TrueType type definitions and interface (specification
  *   only).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -930,8 +930,8 @@
    *   resolution and scaling independent parts of a TrueType font resource.
    *
    * @note:
-   *   The TT_Face structure is also used as a 'parent class' for the
-   *   OpenType-CFF class (T2_Face).
+   *   The TT_Face structure is also used for CFF support; see file
+   *   `cffotypes.h`.
    */
   typedef struct TT_FaceRec_*  TT_Face;
 
@@ -1276,10 +1276,6 @@
    *
    *     If varied by the `CVAR' table, non-integer values are possible.
    *
-   *   interpreter ::
-   *     A pointer to the TrueType bytecode interpreters field is also used
-   *     to hook the debugger in 'ttdebug'.
-   *
    *   extra ::
    *     Reserved for third-party font drivers.
    *
@@ -1521,10 +1517,6 @@
     FT_ULong              cvt_size;
     FT_Int32*             cvt;
 
-    /* A pointer to the bytecode interpreter to use.  This is also */
-    /* used to hook the debugger for the `ttdebug' utility.        */
-    TT_Interpreter        interpreter;
-
 
     /************************************************************************
      *
@@ -1582,11 +1574,6 @@
     FT_UInt32             kern_avail_bits;
     FT_UInt32             kern_order_bits;
 
-#ifdef TT_CONFIG_OPTION_GPOS_KERNING
-    FT_Byte*              gpos_table;
-    FT_Bool               gpos_kerning_available;
-#endif
-
 #ifdef TT_CONFIG_OPTION_BDF
     TT_BDFRec             bdf;
 #endif /* TT_CONFIG_OPTION_BDF */
@@ -1608,6 +1595,15 @@
     /* since 2.12 */
     void*                 svg;
 
+#ifdef TT_CONFIG_OPTION_GPOS_KERNING
+    /* since 2.13.3 */
+    FT_Byte*              gpos_table;
+    /* since 2.14 */
+    /* This is actually an array of GPOS lookup subtables. */
+    FT_UInt32*            gpos_lookups_kerning;
+    FT_UInt               num_gpos_lookups_kerning;
+#endif
+
   } TT_FaceRec;
 
 
@@ -1621,15 +1617,6 @@
    *   coordinates.
    *
    * @fields:
-   *   memory ::
-   *     A handle to the memory manager.
-   *
-   *   max_points ::
-   *     The maximum size in points of the zone.
-   *
-   *   max_contours ::
-   *     Max size in links contours of the zone.
-   *
    *   n_points ::
    *     The current number of points in the zone.
    *
@@ -1653,9 +1640,6 @@
    */
   typedef struct  TT_GlyphZoneRec_
   {
-    FT_Memory   memory;
-    FT_UShort   max_points;
-    FT_UShort   max_contours;
     FT_UShort   n_points;    /* number of points in zone    */
     FT_UShort   n_contours;  /* number of contours          */
 
@@ -1714,7 +1698,6 @@
     TT_GlyphZoneRec  zone;
 
     TT_ExecContext   exec;
-    FT_Byte*         instructions;
     FT_ULong         ins_pos;
 
     /* for possible extensibility in other formats */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/wofftypes.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/wofftypes.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/internal/wofftypes.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/internal/wofftypes.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Basic WOFF/WOFF2 type definitions and interface (specification
  *   only).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/otsvg.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/otsvg.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/otsvg.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/otsvg.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Interface for OT-SVG support related things (specification).
  *
- * Copyright (C) 2022-2024 by
+ * Copyright (C) 2022-2025 by
  * David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/t1tables.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/t1tables.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/t1tables.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/t1tables.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Basic Type 1/Type 2 tables definitions and interface (specification
  *   only).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -92,7 +92,7 @@
     FT_String*  full_name;
     FT_String*  family_name;
     FT_String*  weight;
-    FT_Long     italic_angle;
+    FT_Fixed    italic_angle;
     FT_Bool     is_fixed_pitch;
     FT_Short    underline_position;
     FT_UShort   underline_thickness;
@@ -645,7 +645,7 @@
     PS_DICT_UNDERLINE_POSITION,     /* FT_Short   */
     PS_DICT_UNDERLINE_THICKNESS,    /* FT_UShort  */
     PS_DICT_FS_TYPE,                /* FT_UShort  */
-    PS_DICT_ITALIC_ANGLE,           /* FT_Long    */
+    PS_DICT_ITALIC_ANGLE,           /* FT_Fixed   */
 
     PS_DICT_MAX = PS_DICT_ITALIC_ANGLE
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ttnameid.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ttnameid.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/ttnameid.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/ttnameid.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType name ID definitions (specification only).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -436,7 +436,7 @@
    *
    *   The canonical source for Microsoft's IDs is
    *
-   *     https://docs.microsoft.com/en-us/windows/desktop/Intl/language-identifier-constants-and-strings ,
+   *     https://learn.microsoft.com/windows/win32/intl/language-identifier-constants-and-strings ,
    *
    *   however, we only provide macros for language identifiers present in
    *   the OpenType specification: Microsoft has abandoned the concept of
@@ -847,113 +847,113 @@
   /* --------------- */
 
   /* Bit  0   Basic Latin */
-#define TT_UCR_BASIC_LATIN                     (1L <<  0) /* U+0020-U+007E */
+#define TT_UCR_BASIC_LATIN                    (1UL <<  0) /* U+0020-U+007E */
   /* Bit  1   C1 Controls and Latin-1 Supplement */
-#define TT_UCR_LATIN1_SUPPLEMENT               (1L <<  1) /* U+0080-U+00FF */
+#define TT_UCR_LATIN1_SUPPLEMENT              (1UL <<  1) /* U+0080-U+00FF */
   /* Bit  2   Latin Extended-A */
-#define TT_UCR_LATIN_EXTENDED_A                (1L <<  2) /* U+0100-U+017F */
+#define TT_UCR_LATIN_EXTENDED_A               (1UL <<  2) /* U+0100-U+017F */
   /* Bit  3   Latin Extended-B */
-#define TT_UCR_LATIN_EXTENDED_B                (1L <<  3) /* U+0180-U+024F */
+#define TT_UCR_LATIN_EXTENDED_B               (1UL <<  3) /* U+0180-U+024F */
   /* Bit  4   IPA Extensions                 */
   /*          Phonetic Extensions            */
   /*          Phonetic Extensions Supplement */
-#define TT_UCR_IPA_EXTENSIONS                  (1L <<  4) /* U+0250-U+02AF */
+#define TT_UCR_IPA_EXTENSIONS                 (1UL <<  4) /* U+0250-U+02AF */
                                                           /* U+1D00-U+1D7F */
                                                           /* U+1D80-U+1DBF */
   /* Bit  5   Spacing Modifier Letters */
   /*          Modifier Tone Letters    */
-#define TT_UCR_SPACING_MODIFIER                (1L <<  5) /* U+02B0-U+02FF */
+#define TT_UCR_SPACING_MODIFIER               (1UL <<  5) /* U+02B0-U+02FF */
                                                           /* U+A700-U+A71F */
   /* Bit  6   Combining Diacritical Marks            */
   /*          Combining Diacritical Marks Supplement */
-#define TT_UCR_COMBINING_DIACRITICAL_MARKS     (1L <<  6) /* U+0300-U+036F */
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS    (1UL <<  6) /* U+0300-U+036F */
                                                           /* U+1DC0-U+1DFF */
   /* Bit  7   Greek and Coptic */
-#define TT_UCR_GREEK                           (1L <<  7) /* U+0370-U+03FF */
+#define TT_UCR_GREEK                          (1UL <<  7) /* U+0370-U+03FF */
   /* Bit  8   Coptic */
-#define TT_UCR_COPTIC                          (1L <<  8) /* U+2C80-U+2CFF */
+#define TT_UCR_COPTIC                         (1UL <<  8) /* U+2C80-U+2CFF */
   /* Bit  9   Cyrillic            */
   /*          Cyrillic Supplement */
   /*          Cyrillic Extended-A */
   /*          Cyrillic Extended-B */
-#define TT_UCR_CYRILLIC                        (1L <<  9) /* U+0400-U+04FF */
+#define TT_UCR_CYRILLIC                       (1UL <<  9) /* U+0400-U+04FF */
                                                           /* U+0500-U+052F */
                                                           /* U+2DE0-U+2DFF */
                                                           /* U+A640-U+A69F */
   /* Bit 10   Armenian */
-#define TT_UCR_ARMENIAN                        (1L << 10) /* U+0530-U+058F */
+#define TT_UCR_ARMENIAN                       (1UL << 10) /* U+0530-U+058F */
   /* Bit 11   Hebrew */
-#define TT_UCR_HEBREW                          (1L << 11) /* U+0590-U+05FF */
+#define TT_UCR_HEBREW                         (1UL << 11) /* U+0590-U+05FF */
   /* Bit 12   Vai */
-#define TT_UCR_VAI                             (1L << 12) /* U+A500-U+A63F */
+#define TT_UCR_VAI                            (1UL << 12) /* U+A500-U+A63F */
   /* Bit 13   Arabic            */
   /*          Arabic Supplement */
-#define TT_UCR_ARABIC                          (1L << 13) /* U+0600-U+06FF */
+#define TT_UCR_ARABIC                         (1UL << 13) /* U+0600-U+06FF */
                                                           /* U+0750-U+077F */
   /* Bit 14   NKo */
-#define TT_UCR_NKO                             (1L << 14) /* U+07C0-U+07FF */
+#define TT_UCR_NKO                            (1UL << 14) /* U+07C0-U+07FF */
   /* Bit 15   Devanagari */
-#define TT_UCR_DEVANAGARI                      (1L << 15) /* U+0900-U+097F */
-  /* Bit 16   Bengali */
-#define TT_UCR_BENGALI                         (1L << 16) /* U+0980-U+09FF */
+#define TT_UCR_DEVANAGARI                     (1UL << 15) /* U+0900-U+097F */
+  /* Bit 16   Bangla (Bengali) */
+#define TT_UCR_BENGALI                        (1UL << 16) /* U+0980-U+09FF */
   /* Bit 17   Gurmukhi */
-#define TT_UCR_GURMUKHI                        (1L << 17) /* U+0A00-U+0A7F */
+#define TT_UCR_GURMUKHI                       (1UL << 17) /* U+0A00-U+0A7F */
   /* Bit 18   Gujarati */
-#define TT_UCR_GUJARATI                        (1L << 18) /* U+0A80-U+0AFF */
-  /* Bit 19   Oriya */
-#define TT_UCR_ORIYA                           (1L << 19) /* U+0B00-U+0B7F */
+#define TT_UCR_GUJARATI                       (1UL << 18) /* U+0A80-U+0AFF */
+  /* Bit 19   Oriya (Odia) */
+#define TT_UCR_ORIYA                          (1UL << 19) /* U+0B00-U+0B7F */
   /* Bit 20   Tamil */
-#define TT_UCR_TAMIL                           (1L << 20) /* U+0B80-U+0BFF */
+#define TT_UCR_TAMIL                          (1UL << 20) /* U+0B80-U+0BFF */
   /* Bit 21   Telugu */
-#define TT_UCR_TELUGU                          (1L << 21) /* U+0C00-U+0C7F */
+#define TT_UCR_TELUGU                         (1UL << 21) /* U+0C00-U+0C7F */
   /* Bit 22   Kannada */
-#define TT_UCR_KANNADA                         (1L << 22) /* U+0C80-U+0CFF */
+#define TT_UCR_KANNADA                        (1UL << 22) /* U+0C80-U+0CFF */
   /* Bit 23   Malayalam */
-#define TT_UCR_MALAYALAM                       (1L << 23) /* U+0D00-U+0D7F */
+#define TT_UCR_MALAYALAM                      (1UL << 23) /* U+0D00-U+0D7F */
   /* Bit 24   Thai */
-#define TT_UCR_THAI                            (1L << 24) /* U+0E00-U+0E7F */
+#define TT_UCR_THAI                           (1UL << 24) /* U+0E00-U+0E7F */
   /* Bit 25   Lao */
-#define TT_UCR_LAO                             (1L << 25) /* U+0E80-U+0EFF */
+#define TT_UCR_LAO                            (1UL << 25) /* U+0E80-U+0EFF */
   /* Bit 26   Georgian            */
   /*          Georgian Supplement */
-#define TT_UCR_GEORGIAN                        (1L << 26) /* U+10A0-U+10FF */
+#define TT_UCR_GEORGIAN                       (1UL << 26) /* U+10A0-U+10FF */
                                                           /* U+2D00-U+2D2F */
   /* Bit 27   Balinese */
-#define TT_UCR_BALINESE                        (1L << 27) /* U+1B00-U+1B7F */
+#define TT_UCR_BALINESE                       (1UL << 27) /* U+1B00-U+1B7F */
   /* Bit 28   Hangul Jamo */
-#define TT_UCR_HANGUL_JAMO                     (1L << 28) /* U+1100-U+11FF */
+#define TT_UCR_HANGUL_JAMO                    (1UL << 28) /* U+1100-U+11FF */
   /* Bit 29   Latin Extended Additional */
   /*          Latin Extended-C          */
   /*          Latin Extended-D          */
-#define TT_UCR_LATIN_EXTENDED_ADDITIONAL       (1L << 29) /* U+1E00-U+1EFF */
+#define TT_UCR_LATIN_EXTENDED_ADDITIONAL      (1UL << 29) /* U+1E00-U+1EFF */
                                                           /* U+2C60-U+2C7F */
                                                           /* U+A720-U+A7FF */
   /* Bit 30   Greek Extended */
-#define TT_UCR_GREEK_EXTENDED                  (1L << 30) /* U+1F00-U+1FFF */
+#define TT_UCR_GREEK_EXTENDED                 (1UL << 30) /* U+1F00-U+1FFF */
   /* Bit 31   General Punctuation      */
   /*          Supplemental Punctuation */
-#define TT_UCR_GENERAL_PUNCTUATION             (1L << 31) /* U+2000-U+206F */
+#define TT_UCR_GENERAL_PUNCTUATION            (1UL << 31) /* U+2000-U+206F */
                                                           /* U+2E00-U+2E7F */
 
   /* ulUnicodeRange2 */
   /* --------------- */
 
   /* Bit 32   Superscripts And Subscripts */
-#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS         (1L <<  0) /* U+2070-U+209F */
+#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS        (1UL <<  0) /* U+2070-U+209F */
   /* Bit 33   Currency Symbols */
-#define TT_UCR_CURRENCY_SYMBOLS                (1L <<  1) /* U+20A0-U+20CF */
+#define TT_UCR_CURRENCY_SYMBOLS               (1UL <<  1) /* U+20A0-U+20CF */
   /* Bit 34   Combining Diacritical Marks For Symbols */
 #define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \
-                                               (1L <<  2) /* U+20D0-U+20FF */
+                                              (1UL <<  2) /* U+20D0-U+20FF */
   /* Bit 35   Letterlike Symbols */
-#define TT_UCR_LETTERLIKE_SYMBOLS              (1L <<  3) /* U+2100-U+214F */
+#define TT_UCR_LETTERLIKE_SYMBOLS             (1UL <<  3) /* U+2100-U+214F */
   /* Bit 36   Number Forms */
-#define TT_UCR_NUMBER_FORMS                    (1L <<  4) /* U+2150-U+218F */
+#define TT_UCR_NUMBER_FORMS                   (1UL <<  4) /* U+2150-U+218F */
   /* Bit 37   Arrows                           */
   /*          Supplemental Arrows-A            */
   /*          Supplemental Arrows-B            */
   /*          Miscellaneous Symbols and Arrows */
-#define TT_UCR_ARROWS                          (1L <<  5) /* U+2190-U+21FF */
+#define TT_UCR_ARROWS                         (1UL <<  5) /* U+2190-U+21FF */
                                                           /* U+27F0-U+27FF */
                                                           /* U+2900-U+297F */
                                                           /* U+2B00-U+2BFF */
@@ -961,52 +961,52 @@
   /*          Supplemental Mathematical Operators  */
   /*          Miscellaneous Mathematical Symbols-A */
   /*          Miscellaneous Mathematical Symbols-B */
-#define TT_UCR_MATHEMATICAL_OPERATORS          (1L <<  6) /* U+2200-U+22FF */
+#define TT_UCR_MATHEMATICAL_OPERATORS         (1UL <<  6) /* U+2200-U+22FF */
                                                           /* U+2A00-U+2AFF */
                                                           /* U+27C0-U+27EF */
                                                           /* U+2980-U+29FF */
   /* Bit 39 Miscellaneous Technical */
-#define TT_UCR_MISCELLANEOUS_TECHNICAL         (1L <<  7) /* U+2300-U+23FF */
+#define TT_UCR_MISCELLANEOUS_TECHNICAL        (1UL <<  7) /* U+2300-U+23FF */
   /* Bit 40   Control Pictures */
-#define TT_UCR_CONTROL_PICTURES                (1L <<  8) /* U+2400-U+243F */
+#define TT_UCR_CONTROL_PICTURES               (1UL <<  8) /* U+2400-U+243F */
   /* Bit 41   Optical Character Recognition */
-#define TT_UCR_OCR                             (1L <<  9) /* U+2440-U+245F */
+#define TT_UCR_OCR                            (1UL <<  9) /* U+2440-U+245F */
   /* Bit 42   Enclosed Alphanumerics */
-#define TT_UCR_ENCLOSED_ALPHANUMERICS          (1L << 10) /* U+2460-U+24FF */
+#define TT_UCR_ENCLOSED_ALPHANUMERICS         (1UL << 10) /* U+2460-U+24FF */
   /* Bit 43   Box Drawing */
-#define TT_UCR_BOX_DRAWING                     (1L << 11) /* U+2500-U+257F */
+#define TT_UCR_BOX_DRAWING                    (1UL << 11) /* U+2500-U+257F */
   /* Bit 44   Block Elements */
-#define TT_UCR_BLOCK_ELEMENTS                  (1L << 12) /* U+2580-U+259F */
+#define TT_UCR_BLOCK_ELEMENTS                 (1UL << 12) /* U+2580-U+259F */
   /* Bit 45   Geometric Shapes */
-#define TT_UCR_GEOMETRIC_SHAPES                (1L << 13) /* U+25A0-U+25FF */
+#define TT_UCR_GEOMETRIC_SHAPES               (1UL << 13) /* U+25A0-U+25FF */
   /* Bit 46   Miscellaneous Symbols */
-#define TT_UCR_MISCELLANEOUS_SYMBOLS           (1L << 14) /* U+2600-U+26FF */
+#define TT_UCR_MISCELLANEOUS_SYMBOLS          (1UL << 14) /* U+2600-U+26FF */
   /* Bit 47   Dingbats */
-#define TT_UCR_DINGBATS                        (1L << 15) /* U+2700-U+27BF */
+#define TT_UCR_DINGBATS                       (1UL << 15) /* U+2700-U+27BF */
   /* Bit 48   CJK Symbols and Punctuation */
-#define TT_UCR_CJK_SYMBOLS                     (1L << 16) /* U+3000-U+303F */
+#define TT_UCR_CJK_SYMBOLS                    (1UL << 16) /* U+3000-U+303F */
   /* Bit 49   Hiragana */
-#define TT_UCR_HIRAGANA                        (1L << 17) /* U+3040-U+309F */
+#define TT_UCR_HIRAGANA                       (1UL << 17) /* U+3040-U+309F */
   /* Bit 50   Katakana                     */
   /*          Katakana Phonetic Extensions */
-#define TT_UCR_KATAKANA                        (1L << 18) /* U+30A0-U+30FF */
+#define TT_UCR_KATAKANA                       (1UL << 18) /* U+30A0-U+30FF */
                                                           /* U+31F0-U+31FF */
   /* Bit 51   Bopomofo          */
   /*          Bopomofo Extended */
-#define TT_UCR_BOPOMOFO                        (1L << 19) /* U+3100-U+312F */
+#define TT_UCR_BOPOMOFO                       (1UL << 19) /* U+3100-U+312F */
                                                           /* U+31A0-U+31BF */
   /* Bit 52   Hangul Compatibility Jamo */
-#define TT_UCR_HANGUL_COMPATIBILITY_JAMO       (1L << 20) /* U+3130-U+318F */
+#define TT_UCR_HANGUL_COMPATIBILITY_JAMO      (1UL << 20) /* U+3130-U+318F */
   /* Bit 53   Phags-Pa */
-#define TT_UCR_CJK_MISC                        (1L << 21) /* U+A840-U+A87F */
-#define TT_UCR_KANBUN  TT_UCR_CJK_MISC /* deprecated */
-#define TT_UCR_PHAGSPA
+#define TT_UCR_PHAGSPA                        (1UL << 21) /* U+A840-U+A87F */
+#define TT_UCR_KANBUN    TT_UCR_PHAGSPA  /* deprecated */
+#define TT_UCR_CJK_MISC  TT_UCR_PHAGSPA  /* deprecated */
   /* Bit 54   Enclosed CJK Letters and Months */
-#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS     (1L << 22) /* U+3200-U+32FF */
+#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS    (1UL << 22) /* U+3200-U+32FF */
   /* Bit 55   CJK Compatibility */
-#define TT_UCR_CJK_COMPATIBILITY               (1L << 23) /* U+3300-U+33FF */
+#define TT_UCR_CJK_COMPATIBILITY              (1UL << 23) /* U+3300-U+33FF */
   /* Bit 56   Hangul Syllables */
-#define TT_UCR_HANGUL                          (1L << 24) /* U+AC00-U+D7A3 */
+#define TT_UCR_HANGUL                         (1UL << 24) /* U+AC00-U+D7A3 */
   /* Bit 57   High Surrogates              */
   /*          High Private Use Surrogates  */
   /*          Low Surrogates               */
@@ -1017,12 +1017,12 @@
   /* Basic Multilingual Plane that is      */
   /* supported by this font.  So it really */
   /* means >= U+10000.                     */
-#define TT_UCR_SURROGATES                      (1L << 25) /* U+D800-U+DB7F */
+#define TT_UCR_SURROGATES                     (1UL << 25) /* U+D800-U+DB7F */
                                                           /* U+DB80-U+DBFF */
                                                           /* U+DC00-U+DFFF */
 #define TT_UCR_NON_PLANE_0  TT_UCR_SURROGATES
   /* Bit 58  Phoenician */
-#define TT_UCR_PHOENICIAN                      (1L << 26) /*U+10900-U+1091F*/
+#define TT_UCR_PHOENICIAN                     (1UL << 26) /*U+10900-U+1091F*/
   /* Bit 59   CJK Unified Ideographs             */
   /*          CJK Radicals Supplement            */
   /*          Kangxi Radicals                    */
@@ -1030,7 +1030,7 @@
   /*          CJK Unified Ideographs Extension A */
   /*          CJK Unified Ideographs Extension B */
   /*          Kanbun                             */
-#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS          (1L << 27) /* U+4E00-U+9FFF */
+#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS         (1UL << 27) /* U+4E00-U+9FFF */
                                                           /* U+2E80-U+2EFF */
                                                           /* U+2F00-U+2FDF */
                                                           /* U+2FF0-U+2FFF */
@@ -1038,178 +1038,178 @@
                                                           /*U+20000-U+2A6DF*/
                                                           /* U+3190-U+319F */
   /* Bit 60   Private Use */
-#define TT_UCR_PRIVATE_USE                     (1L << 28) /* U+E000-U+F8FF */
+#define TT_UCR_PRIVATE_USE                    (1UL << 28) /* U+E000-U+F8FF */
   /* Bit 61   CJK Strokes                             */
   /*          CJK Compatibility Ideographs            */
   /*          CJK Compatibility Ideographs Supplement */
-#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS    (1L << 29) /* U+31C0-U+31EF */
+#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS   (1UL << 29) /* U+31C0-U+31EF */
                                                           /* U+F900-U+FAFF */
                                                           /*U+2F800-U+2FA1F*/
   /* Bit 62   Alphabetic Presentation Forms */
-#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS   (1L << 30) /* U+FB00-U+FB4F */
+#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS  (1UL << 30) /* U+FB00-U+FB4F */
   /* Bit 63   Arabic Presentation Forms-A */
-#define TT_UCR_ARABIC_PRESENTATION_FORMS_A     (1L << 31) /* U+FB50-U+FDFF */
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_A    (1UL << 31) /* U+FB50-U+FDFF */
 
   /* ulUnicodeRange3 */
   /* --------------- */
 
   /* Bit 64   Combining Half Marks */
-#define TT_UCR_COMBINING_HALF_MARKS            (1L <<  0) /* U+FE20-U+FE2F */
+#define TT_UCR_COMBINING_HALF_MARKS           (1UL <<  0) /* U+FE20-U+FE2F */
   /* Bit 65   Vertical forms          */
   /*          CJK Compatibility Forms */
-#define TT_UCR_CJK_COMPATIBILITY_FORMS         (1L <<  1) /* U+FE10-U+FE1F */
+#define TT_UCR_CJK_COMPATIBILITY_FORMS        (1UL <<  1) /* U+FE10-U+FE1F */
                                                           /* U+FE30-U+FE4F */
   /* Bit 66   Small Form Variants */
-#define TT_UCR_SMALL_FORM_VARIANTS             (1L <<  2) /* U+FE50-U+FE6F */
+#define TT_UCR_SMALL_FORM_VARIANTS            (1UL <<  2) /* U+FE50-U+FE6F */
   /* Bit 67   Arabic Presentation Forms-B */
-#define TT_UCR_ARABIC_PRESENTATION_FORMS_B     (1L <<  3) /* U+FE70-U+FEFE */
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_B    (1UL <<  3) /* U+FE70-U+FEFF */
   /* Bit 68   Halfwidth and Fullwidth Forms */
-#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS       (1L <<  4) /* U+FF00-U+FFEF */
+#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS      (1UL <<  4) /* U+FF00-U+FFEF */
   /* Bit 69   Specials */
-#define TT_UCR_SPECIALS                        (1L <<  5) /* U+FFF0-U+FFFD */
+#define TT_UCR_SPECIALS                       (1UL <<  5) /* U+FFF0-U+FFFF */
   /* Bit 70   Tibetan */
-#define TT_UCR_TIBETAN                         (1L <<  6) /* U+0F00-U+0FFF */
+#define TT_UCR_TIBETAN                        (1UL <<  6) /* U+0F00-U+0FFF */
   /* Bit 71   Syriac */
-#define TT_UCR_SYRIAC                          (1L <<  7) /* U+0700-U+074F */
+#define TT_UCR_SYRIAC                         (1UL <<  7) /* U+0700-U+074F */
   /* Bit 72   Thaana */
-#define TT_UCR_THAANA                          (1L <<  8) /* U+0780-U+07BF */
+#define TT_UCR_THAANA                         (1UL <<  8) /* U+0780-U+07BF */
   /* Bit 73   Sinhala */
-#define TT_UCR_SINHALA                         (1L <<  9) /* U+0D80-U+0DFF */
+#define TT_UCR_SINHALA                        (1UL <<  9) /* U+0D80-U+0DFF */
   /* Bit 74   Myanmar */
-#define TT_UCR_MYANMAR                         (1L << 10) /* U+1000-U+109F */
+#define TT_UCR_MYANMAR                        (1UL << 10) /* U+1000-U+109F */
   /* Bit 75   Ethiopic            */
   /*          Ethiopic Supplement */
   /*          Ethiopic Extended   */
-#define TT_UCR_ETHIOPIC                        (1L << 11) /* U+1200-U+137F */
+#define TT_UCR_ETHIOPIC                       (1UL << 11) /* U+1200-U+137F */
                                                           /* U+1380-U+139F */
                                                           /* U+2D80-U+2DDF */
   /* Bit 76   Cherokee */
-#define TT_UCR_CHEROKEE                        (1L << 12) /* U+13A0-U+13FF */
+#define TT_UCR_CHEROKEE                       (1UL << 12) /* U+13A0-U+13FF */
   /* Bit 77   Unified Canadian Aboriginal Syllabics */
-#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS   (1L << 13) /* U+1400-U+167F */
+#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS  (1UL << 13) /* U+1400-U+167F */
   /* Bit 78   Ogham */
-#define TT_UCR_OGHAM                           (1L << 14) /* U+1680-U+169F */
+#define TT_UCR_OGHAM                          (1UL << 14) /* U+1680-U+169F */
   /* Bit 79   Runic */
-#define TT_UCR_RUNIC                           (1L << 15) /* U+16A0-U+16FF */
+#define TT_UCR_RUNIC                          (1UL << 15) /* U+16A0-U+16FF */
   /* Bit 80   Khmer         */
   /*          Khmer Symbols */
-#define TT_UCR_KHMER                           (1L << 16) /* U+1780-U+17FF */
+#define TT_UCR_KHMER                          (1UL << 16) /* U+1780-U+17FF */
                                                           /* U+19E0-U+19FF */
   /* Bit 81   Mongolian */
-#define TT_UCR_MONGOLIAN                       (1L << 17) /* U+1800-U+18AF */
+#define TT_UCR_MONGOLIAN                      (1UL << 17) /* U+1800-U+18AF */
   /* Bit 82   Braille Patterns */
-#define TT_UCR_BRAILLE                         (1L << 18) /* U+2800-U+28FF */
+#define TT_UCR_BRAILLE                        (1UL << 18) /* U+2800-U+28FF */
   /* Bit 83   Yi Syllables */
   /*          Yi Radicals  */
-#define TT_UCR_YI                              (1L << 19) /* U+A000-U+A48F */
+#define TT_UCR_YI                             (1UL << 19) /* U+A000-U+A48F */
                                                           /* U+A490-U+A4CF */
   /* Bit 84   Tagalog  */
   /*          Hanunoo  */
   /*          Buhid    */
   /*          Tagbanwa */
-#define TT_UCR_PHILIPPINE                      (1L << 20) /* U+1700-U+171F */
+#define TT_UCR_PHILIPPINE                     (1UL << 20) /* U+1700-U+171F */
                                                           /* U+1720-U+173F */
                                                           /* U+1740-U+175F */
                                                           /* U+1760-U+177F */
   /* Bit 85   Old Italic */
-#define TT_UCR_OLD_ITALIC                      (1L << 21) /*U+10300-U+1032F*/
+#define TT_UCR_OLD_ITALIC                     (1UL << 21) /*U+10300-U+1032F*/
   /* Bit 86   Gothic */
-#define TT_UCR_GOTHIC                          (1L << 22) /*U+10330-U+1034F*/
+#define TT_UCR_GOTHIC                         (1UL << 22) /*U+10330-U+1034F*/
   /* Bit 87   Deseret */
-#define TT_UCR_DESERET                         (1L << 23) /*U+10400-U+1044F*/
+#define TT_UCR_DESERET                        (1UL << 23) /*U+10400-U+1044F*/
   /* Bit 88   Byzantine Musical Symbols      */
   /*          Musical Symbols                */
   /*          Ancient Greek Musical Notation */
-#define TT_UCR_MUSICAL_SYMBOLS                 (1L << 24) /*U+1D000-U+1D0FF*/
+#define TT_UCR_MUSICAL_SYMBOLS                (1UL << 24) /*U+1D000-U+1D0FF*/
                                                           /*U+1D100-U+1D1FF*/
                                                           /*U+1D200-U+1D24F*/
   /* Bit 89   Mathematical Alphanumeric Symbols */
-#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS       (1L << 25) /*U+1D400-U+1D7FF*/
+#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS      (1UL << 25) /*U+1D400-U+1D7FF*/
   /* Bit 90   Private Use (plane 15) */
   /*          Private Use (plane 16) */
-#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY       (1L << 26) /*U+F0000-U+FFFFD*/
+#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY      (1UL << 26) /*U+F0000-U+FFFFD*/
                                                         /*U+100000-U+10FFFD*/
   /* Bit 91   Variation Selectors            */
   /*          Variation Selectors Supplement */
-#define TT_UCR_VARIATION_SELECTORS             (1L << 27) /* U+FE00-U+FE0F */
+#define TT_UCR_VARIATION_SELECTORS            (1UL << 27) /* U+FE00-U+FE0F */
                                                           /*U+E0100-U+E01EF*/
   /* Bit 92   Tags */
-#define TT_UCR_TAGS                            (1L << 28) /*U+E0000-U+E007F*/
+#define TT_UCR_TAGS                           (1UL << 28) /*U+E0000-U+E007F*/
   /* Bit 93   Limbu */
-#define TT_UCR_LIMBU                           (1L << 29) /* U+1900-U+194F */
+#define TT_UCR_LIMBU                          (1UL << 29) /* U+1900-U+194F */
   /* Bit 94   Tai Le */
-#define TT_UCR_TAI_LE                          (1L << 30) /* U+1950-U+197F */
+#define TT_UCR_TAI_LE                         (1UL << 30) /* U+1950-U+197F */
   /* Bit 95   New Tai Lue */
-#define TT_UCR_NEW_TAI_LUE                     (1L << 31) /* U+1980-U+19DF */
+#define TT_UCR_NEW_TAI_LUE                    (1UL << 31) /* U+1980-U+19DF */
 
   /* ulUnicodeRange4 */
   /* --------------- */
 
   /* Bit 96   Buginese */
-#define TT_UCR_BUGINESE                        (1L <<  0) /* U+1A00-U+1A1F */
+#define TT_UCR_BUGINESE                       (1UL <<  0) /* U+1A00-U+1A1F */
   /* Bit 97   Glagolitic */
-#define TT_UCR_GLAGOLITIC                      (1L <<  1) /* U+2C00-U+2C5F */
+#define TT_UCR_GLAGOLITIC                     (1UL <<  1) /* U+2C00-U+2C5F */
   /* Bit 98   Tifinagh */
-#define TT_UCR_TIFINAGH                        (1L <<  2) /* U+2D30-U+2D7F */
+#define TT_UCR_TIFINAGH                       (1UL <<  2) /* U+2D30-U+2D7F */
   /* Bit 99   Yijing Hexagram Symbols */
-#define TT_UCR_YIJING                          (1L <<  3) /* U+4DC0-U+4DFF */
+#define TT_UCR_YIJING                         (1UL <<  3) /* U+4DC0-U+4DFF */
   /* Bit 100  Syloti Nagri */
-#define TT_UCR_SYLOTI_NAGRI                    (1L <<  4) /* U+A800-U+A82F */
+#define TT_UCR_SYLOTI_NAGRI                   (1UL <<  4) /* U+A800-U+A82F */
   /* Bit 101  Linear B Syllabary */
   /*          Linear B Ideograms */
   /*          Aegean Numbers     */
-#define TT_UCR_LINEAR_B                        (1L <<  5) /*U+10000-U+1007F*/
+#define TT_UCR_LINEAR_B                       (1UL <<  5) /*U+10000-U+1007F*/
                                                           /*U+10080-U+100FF*/
                                                           /*U+10100-U+1013F*/
   /* Bit 102  Ancient Greek Numbers */
-#define TT_UCR_ANCIENT_GREEK_NUMBERS           (1L <<  6) /*U+10140-U+1018F*/
+#define TT_UCR_ANCIENT_GREEK_NUMBERS          (1UL <<  6) /*U+10140-U+1018F*/
   /* Bit 103  Ugaritic */
-#define TT_UCR_UGARITIC                        (1L <<  7) /*U+10380-U+1039F*/
+#define TT_UCR_UGARITIC                       (1UL <<  7) /*U+10380-U+1039F*/
   /* Bit 104  Old Persian */
-#define TT_UCR_OLD_PERSIAN                     (1L <<  8) /*U+103A0-U+103DF*/
+#define TT_UCR_OLD_PERSIAN                    (1UL <<  8) /*U+103A0-U+103DF*/
   /* Bit 105  Shavian */
-#define TT_UCR_SHAVIAN                         (1L <<  9) /*U+10450-U+1047F*/
+#define TT_UCR_SHAVIAN                        (1UL <<  9) /*U+10450-U+1047F*/
   /* Bit 106  Osmanya */
-#define TT_UCR_OSMANYA                         (1L << 10) /*U+10480-U+104AF*/
+#define TT_UCR_OSMANYA                        (1UL << 10) /*U+10480-U+104AF*/
   /* Bit 107  Cypriot Syllabary */
-#define TT_UCR_CYPRIOT_SYLLABARY               (1L << 11) /*U+10800-U+1083F*/
+#define TT_UCR_CYPRIOT_SYLLABARY              (1UL << 11) /*U+10800-U+1083F*/
   /* Bit 108  Kharoshthi */
-#define TT_UCR_KHAROSHTHI                      (1L << 12) /*U+10A00-U+10A5F*/
+#define TT_UCR_KHAROSHTHI                     (1UL << 12) /*U+10A00-U+10A5F*/
   /* Bit 109  Tai Xuan Jing Symbols */
-#define TT_UCR_TAI_XUAN_JING                   (1L << 13) /*U+1D300-U+1D35F*/
+#define TT_UCR_TAI_XUAN_JING                  (1UL << 13) /*U+1D300-U+1D35F*/
   /* Bit 110  Cuneiform                         */
   /*          Cuneiform Numbers and Punctuation */
-#define TT_UCR_CUNEIFORM                       (1L << 14) /*U+12000-U+123FF*/
+#define TT_UCR_CUNEIFORM                      (1UL << 14) /*U+12000-U+123FF*/
                                                           /*U+12400-U+1247F*/
   /* Bit 111  Counting Rod Numerals */
-#define TT_UCR_COUNTING_ROD_NUMERALS           (1L << 15) /*U+1D360-U+1D37F*/
+#define TT_UCR_COUNTING_ROD_NUMERALS          (1UL << 15) /*U+1D360-U+1D37F*/
   /* Bit 112  Sundanese */
-#define TT_UCR_SUNDANESE                       (1L << 16) /* U+1B80-U+1BBF */
+#define TT_UCR_SUNDANESE                      (1UL << 16) /* U+1B80-U+1BBF */
   /* Bit 113  Lepcha */
-#define TT_UCR_LEPCHA                          (1L << 17) /* U+1C00-U+1C4F */
+#define TT_UCR_LEPCHA                         (1UL << 17) /* U+1C00-U+1C4F */
   /* Bit 114  Ol Chiki */
-#define TT_UCR_OL_CHIKI                        (1L << 18) /* U+1C50-U+1C7F */
+#define TT_UCR_OL_CHIKI                       (1UL << 18) /* U+1C50-U+1C7F */
   /* Bit 115  Saurashtra */
-#define TT_UCR_SAURASHTRA                      (1L << 19) /* U+A880-U+A8DF */
+#define TT_UCR_SAURASHTRA                     (1UL << 19) /* U+A880-U+A8DF */
   /* Bit 116  Kayah Li */
-#define TT_UCR_KAYAH_LI                        (1L << 20) /* U+A900-U+A92F */
+#define TT_UCR_KAYAH_LI                       (1UL << 20) /* U+A900-U+A92F */
   /* Bit 117  Rejang */
-#define TT_UCR_REJANG                          (1L << 21) /* U+A930-U+A95F */
+#define TT_UCR_REJANG                         (1UL << 21) /* U+A930-U+A95F */
   /* Bit 118  Cham */
-#define TT_UCR_CHAM                            (1L << 22) /* U+AA00-U+AA5F */
+#define TT_UCR_CHAM                           (1UL << 22) /* U+AA00-U+AA5F */
   /* Bit 119  Ancient Symbols */
-#define TT_UCR_ANCIENT_SYMBOLS                 (1L << 23) /*U+10190-U+101CF*/
+#define TT_UCR_ANCIENT_SYMBOLS                (1UL << 23) /*U+10190-U+101CF*/
   /* Bit 120  Phaistos Disc */
-#define TT_UCR_PHAISTOS_DISC                   (1L << 24) /*U+101D0-U+101FF*/
+#define TT_UCR_PHAISTOS_DISC                  (1UL << 24) /*U+101D0-U+101FF*/
   /* Bit 121  Carian */
   /*          Lycian */
   /*          Lydian */
-#define TT_UCR_OLD_ANATOLIAN                   (1L << 25) /*U+102A0-U+102DF*/
+#define TT_UCR_OLD_ANATOLIAN                  (1UL << 25) /*U+102A0-U+102DF*/
                                                           /*U+10280-U+1029F*/
                                                           /*U+10920-U+1093F*/
   /* Bit 122  Domino Tiles  */
   /*          Mahjong Tiles */
-#define TT_UCR_GAME_TILES                      (1L << 26) /*U+1F030-U+1F09F*/
+#define TT_UCR_GAME_TILES                     (1UL << 26) /*U+1F030-U+1F09F*/
                                                           /*U+1F000-U+1F02F*/
   /* Bit 123-127 Reserved for process-internal usage */
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/tttables.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/tttables.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/tttables.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/tttables.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Basic SFNT/TrueType tables definitions and interface
  *   (specification only).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -192,7 +192,7 @@
    *     A pointer into the 'hmtx' table.
    *
    * @note:
-   *   For an OpenType variation font, the values of the following fields can
+   *   For OpenType Font Variations, the values of the following fields can
    *   change after a call to @FT_Set_Var_Design_Coordinates (and friends) if
    *   the font contains an 'MVAR' table: `caret_Slope_Rise`,
    *   `caret_Slope_Run`, and `caret_Offset`.
@@ -310,7 +310,7 @@
    *     A pointer into the 'vmtx' table.
    *
    * @note:
-   *   For an OpenType variation font, the values of the following fields can
+   *   For OpenType Font Variations, the values of the following fields can
    *   change after a call to @FT_Set_Var_Design_Coordinates (and friends) if
    *   the font contains an 'MVAR' table: `Ascender`, `Descender`,
    *   `Line_Gap`, `caret_Slope_Rise`, `caret_Slope_Run`, and `caret_Offset`.
@@ -359,7 +359,7 @@
    *   table.  In this case, the `version` field is always set to 0xFFFF.
    *
    * @note:
-   *   For an OpenType variation font, the values of the following fields can
+   *   For OpenType Font Variations, the values of the following fields can
    *   change after a call to @FT_Set_Var_Design_Coordinates (and friends) if
    *   the font contains an 'MVAR' table: `sCapHeight`, `sTypoAscender`,
    *   `sTypoDescender`, `sTypoLineGap`, `sxHeight`, `usWinAscent`,
@@ -442,7 +442,7 @@
    *   them.
    *
    * @note:
-   *   For an OpenType variation font, the values of the following fields can
+   *   For OpenType Font Variations, the values of the following fields can
    *   change after a call to @FT_Set_Var_Design_Coordinates (and friends) if
    *   the font contains an 'MVAR' table: `underlinePosition` and
    *   `underlineThickness`.
@@ -705,6 +705,9 @@
    *     definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new
    *     one with @FT_MAKE_TAG.
    *
+   *     [Since 2.14] Use value~1 if you want to access the table directory
+   *     of the (currently selected) font.
+   *
    *   offset ::
    *     The starting offset in the table (or file if tag~==~0).
    *
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/tttags.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/tttags.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/freetype/tttags.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/freetype/tttags.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Tags for TrueType and OpenType tables (specification only).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/ft2build.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/ft2build.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/include/ft2build.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/include/ft2build.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType 2 build and setup macros.
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.c	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.c	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,1621 @@
+/****************************************************************************
+ *
+ * afadjust.c
+ *
+ *   Auto-fitter routines to adjust components based on charcode (body).
+ *
+ * Copyright (C) 2023-2025 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * Written by Craig White .
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT.  By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ */
+
+#include "afadjust.h"
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+#  include "afgsub.h"
+#endif
+
+#include 
+#include 
+#include 
+#include 
+
+#define AF_ADJUSTMENT_DATABASE_LENGTH           \
+          ( sizeof ( adjustment_database ) /    \
+            sizeof ( adjustment_database[0] ) )
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  afadjust
+
+
+  typedef struct  AF_AdjustmentDatabaseEntry_
+  {
+    FT_UInt32  codepoint;
+    FT_UInt32  flags;
+
+  } AF_AdjustmentDatabaseEntry;
+
+
+  /*
+    All entries in this list must be sorted by ascending Unicode code
+    points.  The table entries are 3 numbers consisting of:
+
+    - Unicode code point.
+    - The vertical adjustment type.  This should be a combination of the
+      AF_ADJUST_XXX and AF_IGNORE_XXX macros.
+  */
+  static AF_AdjustmentDatabaseEntry  adjustment_database[] =
+  {
+    /* C0 Controls and Basic Latin */
+    { 0x21,  AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ! */
+    { 0x51,  AF_IGNORE_CAPITAL_BOTTOM } , /* Q */
+    { 0x3F,  AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ? */
+    { 0x69,  AF_ADJUST_UP }, /* i */
+    { 0x6A,  AF_ADJUST_UP }, /* j */
+#if 0
+    /* XXX TODO */
+    { 0x7E,  AF_ADJUST_TILDE_TOP }, /* ~ */
+#endif
+
+    /* C1 Controls and Latin-1 Supplement */
+    { 0xA1,  AF_ADJUST_UP }, /* ¡ */
+    { 0xA6,  AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ¦ */
+    { 0xAA,  AF_ADJUST_UP }, /* ª */
+    { 0xBA,  AF_ADJUST_UP }, /* º */
+    { 0xBF,  AF_ADJUST_UP }, /* ¿ */
+
+    { 0xC0,  AF_ADJUST_UP }, /* À */
+    { 0xC1,  AF_ADJUST_UP }, /* Á */
+    { 0xC2,  AF_ADJUST_UP }, /* Â */
+    { 0xC3,  AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ã */
+    { 0xC4,  AF_ADJUST_UP }, /* Ä */
+    { 0xC5,  AF_ADJUST_UP }, /* Å */
+    { 0xC7,  AF_IGNORE_CAPITAL_BOTTOM }, /* Ç */
+    { 0xC8,  AF_ADJUST_UP }, /* È */
+    { 0xC9,  AF_ADJUST_UP }, /* É */
+    { 0xCA,  AF_ADJUST_UP }, /* Ê */
+    { 0xCB,  AF_ADJUST_UP }, /* Ë */
+    { 0xCC,  AF_ADJUST_UP }, /* Ì */
+    { 0xCD,  AF_ADJUST_UP }, /* Í */
+    { 0xCE,  AF_ADJUST_UP }, /* Î */
+    { 0xCF,  AF_ADJUST_UP }, /* Ï */
+
+    { 0xD1,  AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ñ */
+    { 0xD2,  AF_ADJUST_UP }, /* Ò */
+    { 0xD3,  AF_ADJUST_UP }, /* Ó */
+    { 0xD4,  AF_ADJUST_UP }, /* Ô */
+    { 0xD5,  AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Õ */
+    { 0xD6,  AF_ADJUST_UP }, /* Ö */
+    { 0xD8,  AF_IGNORE_CAPITAL_TOP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ø */
+    { 0xD9,  AF_ADJUST_UP }, /* Ù */
+    { 0xDA,  AF_ADJUST_UP }, /* Ú */
+    { 0xDB,  AF_ADJUST_UP }, /* Û */
+    { 0xDC,  AF_ADJUST_UP }, /* Ü */
+    { 0xDD,  AF_ADJUST_UP }, /* Ý */
+
+    { 0xE0,  AF_ADJUST_UP }, /* à */
+    { 0xE1,  AF_ADJUST_UP }, /* á */
+    { 0xE2,  AF_ADJUST_UP }, /* â */
+    { 0xE3,  AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ã */
+    { 0xE4,  AF_ADJUST_UP }, /* ä */
+    { 0xE5,  AF_ADJUST_UP }, /* å */
+    { 0xE7,  AF_IGNORE_SMALL_BOTTOM }, /* ç */
+    { 0xE8,  AF_ADJUST_UP }, /* è */
+    { 0xE9,  AF_ADJUST_UP }, /* é */
+    { 0xEA,  AF_ADJUST_UP }, /* ê */
+    { 0xEB,  AF_ADJUST_UP }, /* ë */
+    { 0xEC,  AF_ADJUST_UP }, /* ì */
+    { 0xED,  AF_ADJUST_UP }, /* í */
+    { 0xEE,  AF_ADJUST_UP }, /* î */
+    { 0xEF,  AF_ADJUST_UP }, /* ï */
+
+    { 0xF1,  AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ñ */
+    { 0xF2,  AF_ADJUST_UP }, /* ò */
+    { 0xF3,  AF_ADJUST_UP }, /* ó */
+    { 0xF4,  AF_ADJUST_UP }, /* ô */
+    { 0xF5,  AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* õ */
+    { 0xF6,  AF_ADJUST_UP }, /* ö */
+    { 0xF8,  AF_IGNORE_SMALL_TOP | AF_IGNORE_SMALL_BOTTOM }, /* ø */
+    { 0xF9,  AF_ADJUST_UP }, /* ù */
+    { 0xFA,  AF_ADJUST_UP }, /* ú */
+    { 0xFB,  AF_ADJUST_UP }, /* û */
+    { 0xFC,  AF_ADJUST_UP }, /* ü */
+    { 0xFD,  AF_ADJUST_UP }, /* ý */
+    { 0xFF,  AF_ADJUST_UP }, /* ÿ */
+
+    /* Latin Extended-A */
+    { 0x100, AF_ADJUST_UP }, /* Ā */
+    { 0x101, AF_ADJUST_UP }, /* ā */
+    { 0x102, AF_ADJUST_UP }, /* Ă */
+    { 0x103, AF_ADJUST_UP }, /* ă */
+    { 0x104, AF_IGNORE_CAPITAL_BOTTOM }, /* Ą */
+    { 0x105, AF_IGNORE_SMALL_BOTTOM }, /* ą */
+    { 0x106, AF_ADJUST_UP }, /* Ć */
+    { 0x107, AF_ADJUST_UP }, /* ć */
+    { 0x108, AF_ADJUST_UP }, /* Ĉ */
+    { 0x109, AF_ADJUST_UP }, /* ĉ */
+    { 0x10A, AF_ADJUST_UP }, /* Ċ */
+    { 0x10B, AF_ADJUST_UP }, /* ċ */
+    { 0x10C, AF_ADJUST_UP }, /* Č */
+    { 0x10D, AF_ADJUST_UP }, /* č */
+    { 0x10E, AF_ADJUST_UP }, /* Ď */
+
+    { 0x112, AF_ADJUST_UP }, /* Ē */
+    { 0x113, AF_ADJUST_UP }, /* ē */
+    { 0x114, AF_ADJUST_UP }, /* Ĕ */
+    { 0x115, AF_ADJUST_UP }, /* ĕ */
+    { 0x116, AF_ADJUST_UP }, /* Ė */
+    { 0x117, AF_ADJUST_UP }, /* ė */
+    { 0x118, AF_IGNORE_CAPITAL_BOTTOM }, /* Ę */
+    { 0x119, AF_IGNORE_SMALL_BOTTOM }, /* ę */
+    { 0x11A, AF_ADJUST_UP }, /* Ě */
+    { 0x11B, AF_ADJUST_UP }, /* ě */
+    { 0x11C, AF_ADJUST_UP }, /* Ĝ */
+    { 0x11D, AF_ADJUST_UP }, /* ĝ */
+    { 0x11E, AF_ADJUST_UP }, /* Ğ */
+    { 0x11F, AF_ADJUST_UP }, /* ğ */
+
+    { 0x120, AF_ADJUST_UP }, /* Ġ */
+    { 0x121, AF_ADJUST_UP }, /* ġ */
+    { 0x122, AF_ADJUST_DOWN }, /* Ģ */
+    { 0x123, AF_ADJUST_UP }, /* ģ */
+    { 0x124, AF_ADJUST_UP }, /* Ĥ */
+    { 0x125, AF_ADJUST_UP }, /* ĥ */
+    { 0x128, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ĩ */
+    { 0x129, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ĩ */
+    { 0x12A, AF_ADJUST_UP }, /* Ī */
+    { 0x12B, AF_ADJUST_UP }, /* ī */
+    { 0x12C, AF_ADJUST_UP }, /* Ĭ */
+    { 0x12D, AF_ADJUST_UP }, /* ĭ */
+    { 0x12E, AF_IGNORE_CAPITAL_BOTTOM }, /* Į */
+    { 0x12F, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* į */
+
+    { 0x130, AF_ADJUST_UP }, /* İ */
+    { 0x133, AF_ADJUST_UP }, /* ij */
+    { 0x134, AF_ADJUST_UP }, /* Ĵ */
+    { 0x135, AF_ADJUST_UP }, /* ĵ */
+    { 0x136, AF_ADJUST_DOWN }, /* Ķ */
+    { 0x137, AF_ADJUST_DOWN }, /* ķ */
+    { 0x139, AF_ADJUST_UP }, /* Ĺ */
+    { 0x13A, AF_ADJUST_UP }, /* ĺ */
+    { 0x13B, AF_ADJUST_DOWN }, /* Ļ */
+    { 0x13C, AF_ADJUST_DOWN }, /* ļ */
+
+    { 0x143, AF_ADJUST_UP }, /* Ń */
+    { 0x144, AF_ADJUST_UP }, /* ń */
+    { 0x145, AF_ADJUST_DOWN }, /* Ņ */
+    { 0x146, AF_ADJUST_DOWN }, /* ņ */
+    { 0x147, AF_ADJUST_UP }, /* Ň */
+    { 0x148, AF_ADJUST_UP }, /* ň */
+    { 0x14C, AF_ADJUST_UP }, /* Ō */
+    { 0x14D, AF_ADJUST_UP }, /* ō */
+    { 0x14E, AF_ADJUST_UP }, /* Ŏ */
+    { 0x14F, AF_ADJUST_UP }, /* ŏ */
+
+    { 0x150, AF_ADJUST_UP }, /* Ő */
+    { 0x151, AF_ADJUST_UP }, /* ő */
+    { 0x154, AF_ADJUST_UP }, /* Ŕ */
+    { 0x155, AF_ADJUST_UP }, /* ŕ */
+    { 0x156, AF_ADJUST_DOWN }, /* Ŗ */
+    { 0x157, AF_ADJUST_DOWN }, /* ŗ */
+    { 0x158, AF_ADJUST_UP }, /* Ř */
+    { 0x159, AF_ADJUST_UP }, /* ř */
+    { 0x15A, AF_ADJUST_UP }, /* Ś */
+    { 0x15B, AF_ADJUST_UP }, /* ś */
+    { 0x15C, AF_ADJUST_UP }, /* Ŝ */
+    { 0x15D, AF_ADJUST_UP }, /* ŝ */
+    { 0x15E, AF_IGNORE_CAPITAL_BOTTOM }, /* Ş */
+    { 0x15F, AF_IGNORE_SMALL_BOTTOM }, /* ş */
+
+    { 0x160, AF_ADJUST_UP }, /* Š */
+    { 0x161, AF_ADJUST_UP }, /* š */
+    { 0x162, AF_IGNORE_CAPITAL_BOTTOM }, /* Ţ */
+    { 0x163, AF_IGNORE_SMALL_BOTTOM }, /* ţ */
+    { 0x164, AF_ADJUST_UP }, /* Ť */
+    { 0x168, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ũ */
+    { 0x169, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ũ */
+    { 0x16A, AF_ADJUST_UP }, /* Ū */
+    { 0x16B, AF_ADJUST_UP }, /* ū */
+    { 0x16C, AF_ADJUST_UP }, /* Ŭ */
+    { 0x16D, AF_ADJUST_UP }, /* ŭ */
+    { 0x16E, AF_ADJUST_UP }, /* Ů */
+    { 0x16F, AF_ADJUST_UP }, /* ů */
+
+    { 0x170, AF_ADJUST_UP }, /* Ű */
+    { 0x171, AF_ADJUST_UP }, /* ű */
+    { 0x172, AF_IGNORE_CAPITAL_BOTTOM }, /* Ų */
+    { 0x173, AF_IGNORE_SMALL_BOTTOM }, /* ų */
+    { 0x174, AF_ADJUST_UP }, /* Ŵ */
+    { 0x175, AF_ADJUST_UP }, /* ŵ */
+    { 0x176, AF_ADJUST_UP }, /* Ŷ */
+    { 0x177, AF_ADJUST_UP }, /* ŷ */
+    { 0x178, AF_ADJUST_UP }, /* Ÿ */
+    { 0x179, AF_ADJUST_UP }, /* Ź */
+    { 0x17A, AF_ADJUST_UP }, /* ź */
+    { 0x17B, AF_ADJUST_UP }, /* Ż */
+    { 0x17C, AF_ADJUST_UP }, /* ż */
+    { 0x17D, AF_ADJUST_UP }, /* Ž */
+    { 0x17E, AF_ADJUST_UP }, /* ž */
+
+    /* Latin Extended-B */
+    { 0x187, AF_IGNORE_CAPITAL_TOP }, /* Ƈ */
+    { 0x188, AF_IGNORE_SMALL_TOP }, /* ƈ */
+
+    { 0x1A0, AF_IGNORE_CAPITAL_TOP }, /* Ơ */
+    { 0x1A1, AF_IGNORE_SMALL_TOP }, /* ơ */
+    { 0x1A5, AF_IGNORE_SMALL_TOP }, /* ƥ */
+    { 0x1AB, AF_IGNORE_SMALL_BOTTOM }, /* ƫ */
+    { 0x1AE, AF_IGNORE_CAPITAL_BOTTOM }, /* Ʈ */
+    { 0x1AF, AF_IGNORE_CAPITAL_TOP }, /* Ư */
+
+    { 0x1B0, AF_IGNORE_SMALL_TOP }, /* ư */
+    { 0x1B4, AF_IGNORE_SMALL_TOP }, /* ƴ */
+
+    { 0x1C3, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ǃ */
+    { 0x1C4, AF_ADJUST_UP }, /* DŽ */
+#if 0
+    { 0x1C5, AF_ADJUST_UP }, /* Dž */
+    { 0x1C6, AF_ADJUST_UP }, /* dž */
+    { 0x1C8, AF_ADJUST_UP }, /* Lj */
+    { 0x1C9, AF_ADJUST_UP }, /* lj */
+    { 0x1CB, AF_ADJUST_UP }, /* Nj */
+#endif
+    { 0x1CC, AF_ADJUST_UP }, /* nj */
+    { 0x1CD, AF_ADJUST_UP }, /* Ǎ */
+    { 0x1CE, AF_ADJUST_UP }, /* ǎ */
+    { 0x1CF, AF_ADJUST_UP }, /* Ǐ */
+
+    { 0x1D0, AF_ADJUST_UP }, /* ǐ */
+    { 0x1D1, AF_ADJUST_UP }, /* Ǒ */
+    { 0x1D2, AF_ADJUST_UP }, /* ǒ */
+    { 0x1D3, AF_ADJUST_UP }, /* Ǔ */
+    { 0x1D4, AF_ADJUST_UP }, /* ǔ */
+    { 0x1D5, AF_ADJUST_UP2 }, /* Ǖ */
+    { 0x1D6, AF_ADJUST_UP2 }, /* ǖ */
+    { 0x1D7, AF_ADJUST_UP2 }, /* Ǘ */
+    { 0x1D8, AF_ADJUST_UP2 }, /* ǘ */
+    { 0x1D9, AF_ADJUST_UP2 }, /* Ǚ */
+    { 0x1DA, AF_ADJUST_UP2 }, /* ǚ */
+    { 0x1DB, AF_ADJUST_UP2 }, /* Ǜ */
+    { 0x1DC, AF_ADJUST_UP2 }, /* ǜ */
+    { 0x1DE, AF_ADJUST_UP2 }, /* Ǟ */
+    { 0x1DF, AF_ADJUST_UP2 }, /* ǟ */
+
+    { 0x1E0, AF_ADJUST_UP2 }, /* Ǡ */
+    { 0x1E1, AF_ADJUST_UP2 }, /* ǡ */
+    { 0x1E2, AF_ADJUST_UP }, /* Ǣ */
+    { 0x1E3, AF_ADJUST_UP }, /* ǣ */
+    { 0x1E6, AF_ADJUST_UP }, /* Ǧ */
+    { 0x1E7, AF_ADJUST_UP }, /* ǧ */
+    { 0x1E8, AF_ADJUST_UP }, /* Ǩ */
+    { 0x1E9, AF_ADJUST_UP }, /* ǩ */
+    { 0x1EA, AF_IGNORE_CAPITAL_BOTTOM }, /* Ǫ */
+    { 0x1EB, AF_IGNORE_SMALL_BOTTOM }, /* ǫ */
+    { 0x1EC, AF_ADJUST_UP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ǭ */
+    { 0x1ED, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* ǭ */
+    { 0x1EE, AF_ADJUST_UP }, /* Ǯ */
+    { 0x1EF, AF_ADJUST_UP }, /* ǯ */
+
+    { 0x1F0, AF_ADJUST_UP }, /* ǰ */
+    { 0x1F4, AF_ADJUST_UP }, /* Ǵ */
+    { 0x1F5, AF_ADJUST_UP }, /* ǵ */
+    { 0x1F8, AF_ADJUST_UP }, /* Ǹ */
+    { 0x1F9, AF_ADJUST_UP }, /* ǹ */
+    { 0x1FA, AF_ADJUST_UP2 }, /* Ǻ */
+    { 0x1FB, AF_ADJUST_UP2 }, /* ǻ */
+    { 0x1FC, AF_ADJUST_UP }, /* Ǽ */
+    { 0x1FD, AF_ADJUST_UP }, /* ǽ */
+    { 0x1FE, AF_ADJUST_UP }, /* Ǿ */
+    { 0x1FF, AF_ADJUST_UP }, /* ǿ */
+
+    { 0x200, AF_ADJUST_UP }, /* Ȁ */
+    { 0x201, AF_ADJUST_UP }, /* ȁ */
+    { 0x202, AF_ADJUST_UP }, /* Ȃ */
+    { 0x203, AF_ADJUST_UP }, /* ȃ */
+    { 0x204, AF_ADJUST_UP }, /* Ȅ */
+    { 0x205, AF_ADJUST_UP }, /* ȅ */
+    { 0x206, AF_ADJUST_UP }, /* Ȇ */
+    { 0x207, AF_ADJUST_UP }, /* ȇ */
+    { 0x208, AF_ADJUST_UP }, /* Ȉ */
+    { 0x209, AF_ADJUST_UP }, /* ȉ */
+    { 0x20A, AF_ADJUST_UP }, /* Ȋ */
+    { 0x20B, AF_ADJUST_UP }, /* ȋ */
+    { 0x20C, AF_ADJUST_UP }, /* Ȍ */
+    { 0x20D, AF_ADJUST_UP }, /* ȍ */
+    { 0x20E, AF_ADJUST_UP }, /* Ȏ */
+    { 0x20F, AF_ADJUST_UP }, /* ȏ */
+
+    { 0x210, AF_ADJUST_UP }, /* Ȑ */
+    { 0x211, AF_ADJUST_UP }, /* ȑ */
+    { 0x212, AF_ADJUST_UP }, /* Ȓ */
+    { 0x213, AF_ADJUST_UP }, /* ȓ */
+    { 0x214, AF_ADJUST_UP }, /* Ȕ */
+    { 0x215, AF_ADJUST_UP }, /* ȕ */
+    { 0x216, AF_ADJUST_UP }, /* Ȗ */
+    { 0x217, AF_ADJUST_UP }, /* ȗ */
+    { 0x218, AF_ADJUST_DOWN }, /* Ș */
+    { 0x219, AF_ADJUST_DOWN }, /* ș */
+    { 0x21A, AF_ADJUST_DOWN }, /* Ț */
+    { 0x21B, AF_ADJUST_DOWN }, /* ț */
+    { 0x21E, AF_ADJUST_UP }, /* Ȟ */
+    { 0x21F, AF_ADJUST_UP }, /* ȟ */
+
+    { 0x224, AF_IGNORE_CAPITAL_BOTTOM }, /* Ȥ */
+    { 0x225, AF_IGNORE_SMALL_BOTTOM }, /* ȥ */
+    { 0x226, AF_ADJUST_UP }, /* Ȧ */
+    { 0x227, AF_ADJUST_UP }, /* ȧ */
+    { 0x228, AF_IGNORE_CAPITAL_BOTTOM }, /* Ȩ */
+    { 0x229, AF_IGNORE_SMALL_BOTTOM }, /* ȩ */
+    { 0x22A, AF_ADJUST_UP2 }, /* Ȫ */
+    { 0x22B, AF_ADJUST_UP2 }, /* ȫ */
+    { 0x22C, AF_ADJUST_UP2 }, /* Ȭ */
+    { 0x22D, AF_ADJUST_UP2 }, /* ȭ */
+    { 0x22E, AF_ADJUST_UP }, /* Ȯ */
+    { 0x22F, AF_ADJUST_UP }, /* ȯ */
+
+    { 0x230, AF_ADJUST_UP2 }, /* Ȱ */
+    { 0x231, AF_ADJUST_UP2 }, /* ȱ */
+    { 0x232, AF_ADJUST_UP }, /* Ȳ */
+    { 0x233, AF_ADJUST_UP }, /* ȳ */
+    { 0x23A, AF_IGNORE_CAPITAL_TOP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ⱥ */
+    { 0x23B, AF_IGNORE_CAPITAL_TOP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ȼ */
+    { 0x23F, AF_IGNORE_SMALL_BOTTOM }, /* ȿ */
+
+    { 0x240, AF_IGNORE_SMALL_BOTTOM }, /* ɀ */
+    { 0x249, AF_ADJUST_UP }, /* ɉ */
+
+    /* IPA Extensions */
+    { 0x256, AF_IGNORE_SMALL_BOTTOM }, /* ɖ */
+
+    { 0x260, AF_IGNORE_SMALL_TOP }, /* ɠ */
+    { 0x267, AF_IGNORE_SMALL_BOTTOM }, /* ɧ */
+    { 0x268, AF_ADJUST_UP }, /* ɨ */
+
+    { 0x272, AF_IGNORE_SMALL_BOTTOM }, /* ɲ */
+    { 0x273, AF_IGNORE_SMALL_BOTTOM }, /* ɳ */
+    { 0x27B, AF_IGNORE_SMALL_BOTTOM }, /* ɻ */
+    { 0x27D, AF_IGNORE_SMALL_BOTTOM }, /* ɽ */
+
+    { 0x282, AF_IGNORE_SMALL_BOTTOM }, /* ʂ */
+    { 0x288, AF_IGNORE_SMALL_BOTTOM }, /* ʈ */
+
+    { 0x290, AF_IGNORE_SMALL_BOTTOM }, /* ʐ */
+    { 0x29B, AF_IGNORE_SMALL_TOP }, /* ʛ */
+
+    { 0x2A0, AF_IGNORE_SMALL_TOP }, /* ʠ */
+
+    /* Spacing Modifier Letters */
+    { 0x2B2, AF_ADJUST_UP }, /* ʲ */
+    { 0x2B5, AF_IGNORE_SMALL_BOTTOM }, /* ʵ */
+
+    /* Greek and Coptic */
+    { 0x390, AF_ADJUST_UP2 }, /* ΐ */
+
+    { 0x3AA, AF_ADJUST_UP }, /* Ϊ */
+    { 0x3AB, AF_ADJUST_UP }, /* Ϋ */
+    { 0x3AC, AF_ADJUST_UP }, /* ά */
+    { 0x3AD, AF_ADJUST_UP }, /* έ */
+    { 0x3AE, AF_ADJUST_UP }, /* ή */
+    { 0x3AF, AF_ADJUST_UP }, /* ί */
+
+    { 0x3B0, AF_ADJUST_UP2 }, /* ΰ */
+
+    { 0x3CA, AF_ADJUST_UP }, /* ϊ */
+    { 0x3CB, AF_ADJUST_UP }, /* ϋ */
+    { 0x3CC, AF_ADJUST_UP }, /* ό */
+    { 0x3CD, AF_ADJUST_UP }, /* ύ */
+    { 0x3CE, AF_ADJUST_UP }, /* ώ */
+    { 0x3CF, AF_IGNORE_CAPITAL_BOTTOM }, /* Ϗ */
+
+    { 0x3D4, AF_ADJUST_UP }, /* ϔ */
+    { 0x3D7, AF_IGNORE_SMALL_BOTTOM }, /* ϗ */
+    { 0x3D9, AF_IGNORE_SMALL_BOTTOM }, /* ϙ */
+
+    { 0x3E2, AF_IGNORE_CAPITAL_BOTTOM }, /* Ϣ */
+    { 0x3E3, AF_IGNORE_SMALL_BOTTOM }, /* ϣ */
+
+    { 0x3F3, AF_ADJUST_UP }, /* ϳ */
+
+    /* Cyrillic */
+    { 0x400, AF_ADJUST_UP }, /* Ѐ */
+    { 0x401, AF_ADJUST_UP }, /* Ё */
+    { 0x403, AF_ADJUST_UP }, /* Ѓ */
+    { 0x407, AF_ADJUST_UP }, /* Ї */
+    { 0x40C, AF_ADJUST_UP }, /* Ќ */
+    { 0x40D, AF_ADJUST_UP }, /* Ѝ */
+    { 0x40E, AF_ADJUST_UP }, /* Ў */
+    { 0x40F, AF_IGNORE_CAPITAL_BOTTOM }, /* Џ */
+
+    { 0x419, AF_ADJUST_UP }, /* Й */
+
+    { 0x426, AF_IGNORE_CAPITAL_BOTTOM }, /* Ц */
+    { 0x429, AF_IGNORE_CAPITAL_BOTTOM }, /* Щ */
+
+    { 0x439, AF_ADJUST_UP }, /* й */
+
+    { 0x446, AF_IGNORE_SMALL_BOTTOM }, /* ц */
+    { 0x449, AF_IGNORE_SMALL_BOTTOM }, /* щ */
+
+    { 0x450, AF_ADJUST_UP }, /* ѐ */
+    { 0x451, AF_ADJUST_UP }, /* ё */
+    { 0x453, AF_ADJUST_UP }, /* ѓ */
+    { 0x456, AF_ADJUST_UP }, /* і */
+    { 0x457, AF_ADJUST_UP }, /* ї */
+    { 0x458, AF_ADJUST_UP }, /* ј */
+    { 0x45C, AF_ADJUST_UP }, /* ќ */
+    { 0x45D, AF_ADJUST_UP }, /* ѝ */
+    { 0x45E, AF_ADJUST_UP }, /* ў */
+    { 0x45F, AF_IGNORE_SMALL_BOTTOM }, /* џ */
+
+    { 0x476, AF_ADJUST_UP }, /* Ѷ */
+    { 0x477, AF_ADJUST_UP }, /* ѷ */
+    { 0x47C, AF_ADJUST_UP2 }, /* Ѽ */
+    { 0x47D, AF_ADJUST_UP2 }, /* ѽ */
+    { 0x47E, AF_ADJUST_UP }, /* Ѿ */
+    { 0x47F, AF_ADJUST_UP }, /* ѿ */
+
+    { 0x480, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҁ */
+    { 0x481, AF_IGNORE_SMALL_BOTTOM }, /* ҁ */
+    { 0x48A, AF_ADJUST_UP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ҋ */
+    { 0x48B, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* ҋ */
+
+    { 0x490, AF_IGNORE_CAPITAL_TOP }, /* Ґ */
+    { 0x491, AF_IGNORE_SMALL_TOP }, /* ґ */
+    { 0x496, AF_IGNORE_CAPITAL_BOTTOM }, /* Җ */
+    { 0x497, AF_IGNORE_SMALL_BOTTOM }, /* җ */
+    { 0x498, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҙ */
+    { 0x499, AF_IGNORE_SMALL_BOTTOM }, /* ҙ */
+    { 0x49A, AF_IGNORE_CAPITAL_BOTTOM }, /* Қ */
+    { 0x49B, AF_IGNORE_SMALL_BOTTOM }, /* қ */
+
+    { 0x4A2, AF_IGNORE_CAPITAL_BOTTOM }, /* Ң */
+    { 0x4A3, AF_IGNORE_SMALL_BOTTOM }, /* ң */
+    { 0x4AA, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҫ */
+    { 0x4AB, AF_IGNORE_SMALL_BOTTOM }, /* ҫ */
+    { 0x4AC, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҭ */
+    { 0x4AD, AF_IGNORE_SMALL_BOTTOM }, /* ҭ */
+
+    { 0x4B2, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҳ */
+    { 0x4B3, AF_IGNORE_SMALL_BOTTOM }, /* ҳ */
+    { 0x4B4, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҵ */
+    { 0x4B5, AF_IGNORE_SMALL_BOTTOM }, /* ҵ */
+    { 0x4B6, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҷ */
+    { 0x4B7, AF_IGNORE_SMALL_BOTTOM }, /* ҷ */
+    { 0x4BE, AF_IGNORE_CAPITAL_BOTTOM }, /* Ҿ */
+    { 0x4BF, AF_IGNORE_SMALL_BOTTOM }, /* ҿ */
+
+    { 0x4C1, AF_ADJUST_UP }, /* Ӂ */
+    { 0x4C2, AF_ADJUST_UP }, /* ӂ */
+    { 0x4C5, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӆ */
+    { 0x4C6, AF_IGNORE_SMALL_BOTTOM }, /* ӆ */
+    { 0x4C9, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӊ */
+    { 0x4CA, AF_IGNORE_SMALL_BOTTOM }, /* ӊ */
+    { 0x4CB, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӌ */
+    { 0x4CC, AF_IGNORE_SMALL_BOTTOM }, /* ӌ */
+    { 0x4CD, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӎ */
+    { 0x4CE, AF_IGNORE_SMALL_BOTTOM }, /* ӎ */
+
+    { 0x4D0, AF_ADJUST_UP }, /* Ӑ */
+    { 0x4D1, AF_ADJUST_UP }, /* ӑ */
+    { 0x4D2, AF_ADJUST_UP }, /* Ӓ */
+    { 0x4D3, AF_ADJUST_UP }, /* ӓ */
+    { 0x4D6, AF_ADJUST_UP }, /* Ӗ */
+    { 0x4D7, AF_ADJUST_UP }, /* ӗ */
+    { 0x4DA, AF_ADJUST_UP }, /* Ӛ */
+    { 0x4DB, AF_ADJUST_UP }, /* ӛ */
+    { 0x4DC, AF_ADJUST_UP }, /* Ӝ */
+    { 0x4DD, AF_ADJUST_UP }, /* ӝ */
+    { 0x4DE, AF_ADJUST_UP }, /* Ӟ */
+    { 0x4DF, AF_ADJUST_UP }, /* ӟ */
+
+    { 0x4E2, AF_ADJUST_UP }, /* Ӣ */
+    { 0x4E3, AF_ADJUST_UP }, /* ӣ */
+    { 0x4E4, AF_ADJUST_UP }, /* Ӥ */
+    { 0x4E5, AF_ADJUST_UP }, /* ӥ */
+    { 0x4E6, AF_ADJUST_UP }, /* Ӧ */
+    { 0x4E7, AF_ADJUST_UP }, /* ӧ */
+    { 0x4EA, AF_ADJUST_UP }, /* Ӫ */
+    { 0x4EB, AF_ADJUST_UP }, /* ӫ */
+    { 0x4EC, AF_ADJUST_UP }, /* Ӭ */
+    { 0x4ED, AF_ADJUST_UP }, /* ӭ */
+    { 0x4EE, AF_ADJUST_UP }, /* Ӯ */
+    { 0x4EF, AF_ADJUST_UP }, /* ӯ */
+
+    { 0x4F0, AF_ADJUST_UP }, /* Ӱ */
+    { 0x4F1, AF_ADJUST_UP }, /* ӱ */
+    { 0x4F2, AF_ADJUST_UP }, /* Ӳ */
+    { 0x4F3, AF_ADJUST_UP }, /* ӳ */
+    { 0x4F4, AF_ADJUST_UP }, /* Ӵ */
+    { 0x4F5, AF_ADJUST_UP }, /* ӵ */
+    { 0x4F6, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӷ */
+    { 0x4F7, AF_IGNORE_SMALL_BOTTOM }, /* ӷ */
+    { 0x4F8, AF_ADJUST_UP }, /* Ӹ */
+    { 0x4F9, AF_ADJUST_UP }, /* ӹ */
+    { 0x4FA, AF_IGNORE_CAPITAL_BOTTOM }, /* Ӻ */
+    { 0x4FB, AF_IGNORE_SMALL_BOTTOM }, /* ӻ */
+
+    /* Cyrillic Supplement */
+    { 0x506, AF_IGNORE_CAPITAL_BOTTOM }, /* Ԇ */
+    { 0x507, AF_IGNORE_SMALL_BOTTOM }, /* ԇ */
+
+    { 0x524, AF_IGNORE_CAPITAL_BOTTOM }, /* Ԥ */
+    { 0x525, AF_IGNORE_SMALL_BOTTOM }, /* ԥ */
+    { 0x526, AF_IGNORE_CAPITAL_BOTTOM }, /* Ԧ */
+    { 0x527, AF_IGNORE_SMALL_BOTTOM }, /* ԧ */
+    { 0x52E, AF_IGNORE_CAPITAL_BOTTOM }, /* Ԯ */
+    { 0x52F, AF_IGNORE_SMALL_BOTTOM }, /* ԯ */
+
+    /* Cherokee */
+    { 0x13A5, AF_ADJUST_UP }, /* Ꭵ */
+
+    /* Phonetic Extensions */
+    { 0x1D09, AF_ADJUST_DOWN }, /* ᴉ */
+
+    { 0x1D4E, AF_ADJUST_DOWN }, /* ᵎ */
+
+    { 0x1D51, AF_IGNORE_SMALL_BOTTOM }, /* ᵑ */
+
+    { 0x1D62, AF_ADJUST_UP }, /* ᵢ */
+
+    /* Phonetic Extensions Supplement */
+    { 0x1D80, AF_IGNORE_SMALL_BOTTOM }, /* ᶀ */
+    { 0x1D81, AF_IGNORE_SMALL_BOTTOM }, /* ᶁ */
+    { 0x1D82, AF_IGNORE_SMALL_BOTTOM }, /* ᶂ */
+    { 0x1D84, AF_IGNORE_SMALL_BOTTOM }, /* ᶄ */
+    { 0x1D85, AF_IGNORE_SMALL_BOTTOM }, /* ᶅ */
+    { 0x1D86, AF_IGNORE_SMALL_BOTTOM }, /* ᶆ */
+    { 0x1D87, AF_IGNORE_SMALL_BOTTOM }, /* ᶇ */
+    { 0x1D89, AF_IGNORE_SMALL_BOTTOM }, /* ᶉ */
+    { 0x1D8A, AF_IGNORE_SMALL_BOTTOM }, /* ᶊ */
+    { 0x1D8C, AF_IGNORE_SMALL_BOTTOM }, /* ᶌ */
+    { 0x1D8D, AF_IGNORE_SMALL_BOTTOM }, /* ᶍ */
+    { 0x1D8E, AF_IGNORE_SMALL_BOTTOM }, /* ᶎ */
+    { 0x1D8F, AF_IGNORE_SMALL_BOTTOM }, /* ᶏ */
+
+    { 0x1D90, AF_IGNORE_SMALL_BOTTOM }, /* ᶐ */
+    { 0x1D91, AF_IGNORE_SMALL_BOTTOM }, /* ᶑ */
+    { 0x1D92, AF_IGNORE_SMALL_BOTTOM }, /* ᶒ */
+    { 0x1D93, AF_IGNORE_SMALL_BOTTOM }, /* ᶓ */
+    { 0x1D94, AF_IGNORE_SMALL_BOTTOM }, /* ᶔ */
+    { 0x1D95, AF_IGNORE_SMALL_BOTTOM }, /* ᶕ */
+    { 0x1D96, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* ᶖ */
+    { 0x1D97, AF_IGNORE_SMALL_BOTTOM }, /* ᶗ */
+    { 0x1D98, AF_IGNORE_SMALL_BOTTOM }, /* ᶘ */
+    { 0x1D99, AF_IGNORE_SMALL_BOTTOM }, /* ᶙ */
+    { 0x1D9A, AF_IGNORE_SMALL_BOTTOM }, /* ᶚ */
+
+    { 0x1DA4, AF_ADJUST_UP }, /* ᶤ */
+    { 0x1DA8, AF_ADJUST_UP }, /* ᶨ */
+    { 0x1DA9, AF_IGNORE_SMALL_BOTTOM }, /* ᶩ */
+    { 0x1DAA, AF_IGNORE_SMALL_BOTTOM }, /* ᶪ */
+    { 0x1DAC, AF_IGNORE_SMALL_BOTTOM }, /* ᶬ */
+    { 0x1DAE, AF_IGNORE_SMALL_BOTTOM }, /* ᶮ */
+    { 0x1DAF, AF_IGNORE_SMALL_BOTTOM }, /* ᶯ */
+
+    { 0x1DB3, AF_IGNORE_SMALL_BOTTOM }, /* ᶳ */
+    { 0x1DB5, AF_IGNORE_SMALL_BOTTOM }, /* ᶵ */
+    { 0x1DBC, AF_IGNORE_SMALL_BOTTOM }, /* ᶼ */
+
+    /* Latin Extended Additional */
+    { 0x1E00, AF_ADJUST_DOWN }, /* Ḁ */
+    { 0x1E01, AF_ADJUST_DOWN }, /* ḁ */
+    { 0x1E02, AF_ADJUST_UP }, /* Ḃ */
+    { 0x1E03, AF_ADJUST_UP }, /* ḃ */
+    { 0x1E04, AF_ADJUST_DOWN }, /* Ḅ */
+    { 0x1E05, AF_ADJUST_DOWN }, /* ḅ */
+    { 0x1E06, AF_ADJUST_DOWN }, /* Ḇ */
+    { 0x1E07, AF_ADJUST_DOWN }, /* ḇ */
+    { 0x1E08, AF_ADJUST_UP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ḉ */
+    { 0x1E09, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* ḉ */
+    { 0x1E0A, AF_ADJUST_UP }, /* Ḋ */
+    { 0x1E0B, AF_ADJUST_UP }, /* ḋ */
+    { 0x1E0C, AF_ADJUST_DOWN }, /* Ḍ */
+    { 0x1E0D, AF_ADJUST_DOWN }, /* ḍ */
+    { 0x1E0E, AF_ADJUST_DOWN }, /* Ḏ */
+    { 0x1E0F, AF_ADJUST_DOWN }, /* ḏ */
+
+    { 0x1E10, AF_ADJUST_DOWN }, /* Ḑ */
+    { 0x1E11, AF_ADJUST_DOWN }, /* ḑ */
+    { 0x1E12, AF_ADJUST_DOWN }, /* Ḓ */
+    { 0x1E13, AF_ADJUST_DOWN }, /* ḓ */
+    { 0x1E14, AF_ADJUST_UP2 }, /* Ḕ */
+    { 0x1E15, AF_ADJUST_UP2 }, /* ḕ */
+    { 0x1E16, AF_ADJUST_UP2 }, /* Ḗ */
+    { 0x1E17, AF_ADJUST_UP2 }, /* ḗ */
+    { 0x1E18, AF_ADJUST_DOWN }, /* Ḙ */
+    { 0x1E19, AF_ADJUST_DOWN }, /* ḙ */
+    { 0x1E1A, AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* Ḛ */
+    { 0x1E1B, AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* ḛ */
+    { 0x1E1C, AF_ADJUST_UP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ḝ */
+    { 0x1E1D, AF_ADJUST_UP | AF_IGNORE_SMALL_BOTTOM }, /* ḝ */
+    { 0x1E1E, AF_ADJUST_UP }, /* Ḟ */
+    { 0x1E1F, AF_ADJUST_UP }, /* ḟ */
+
+    { 0x1E20, AF_ADJUST_UP }, /* Ḡ */
+    { 0x1E21, AF_ADJUST_UP }, /* ḡ */
+    { 0x1E22, AF_ADJUST_UP }, /* Ḣ */
+    { 0x1E23, AF_ADJUST_UP }, /* ḣ */
+    { 0x1E24, AF_ADJUST_DOWN }, /* Ḥ */
+    { 0x1E25, AF_ADJUST_DOWN }, /* ḥ */
+    { 0x1E26, AF_ADJUST_UP }, /* Ḧ */
+    { 0x1E27, AF_ADJUST_UP }, /* ḧ */
+    { 0x1E28, AF_IGNORE_CAPITAL_BOTTOM }, /* Ḩ */
+    { 0x1E29, AF_IGNORE_SMALL_BOTTOM }, /* ḩ */
+    { 0x1E2A, AF_ADJUST_DOWN }, /* Ḫ */
+    { 0x1E2B, AF_ADJUST_DOWN }, /* ḫ */
+    { 0x1E2C, AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* Ḭ */
+    { 0x1E2D, AF_ADJUST_UP | AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* ḭ */
+    { 0x1E2E, AF_ADJUST_UP2 }, /* Ḯ */
+    { 0x1E2F, AF_ADJUST_UP2 }, /* ḯ */
+
+    { 0x1E30, AF_ADJUST_UP }, /* Ḱ */
+    { 0x1E31, AF_ADJUST_UP }, /* ḱ */
+    { 0x1E32, AF_ADJUST_DOWN }, /* Ḳ */
+    { 0x1E33, AF_ADJUST_DOWN }, /* ḳ */
+    { 0x1E34, AF_ADJUST_DOWN }, /* Ḵ */
+    { 0x1E35, AF_ADJUST_DOWN }, /* ḵ */
+    { 0x1E36, AF_ADJUST_DOWN }, /* Ḷ */
+    { 0x1E37, AF_ADJUST_DOWN }, /* ḷ */
+    { 0x1E38, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ḹ */
+    { 0x1E39, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ḹ */
+    { 0x1E3A, AF_ADJUST_DOWN }, /* Ḻ */
+    { 0x1E3B, AF_ADJUST_DOWN }, /* ḻ */
+    { 0x1E3C, AF_ADJUST_DOWN }, /* Ḽ */
+    { 0x1E3D, AF_ADJUST_DOWN }, /* ḽ */
+    { 0x1E3E, AF_ADJUST_UP }, /* Ḿ */
+    { 0x1E3F, AF_ADJUST_UP }, /* ḿ */
+
+    { 0x1E40, AF_ADJUST_UP }, /* Ṁ */
+    { 0x1E41, AF_ADJUST_UP }, /* ṁ */
+    { 0x1E42, AF_ADJUST_DOWN }, /* Ṃ */
+    { 0x1E43, AF_ADJUST_DOWN }, /* ṃ */
+    { 0x1E44, AF_ADJUST_UP }, /* Ṅ */
+    { 0x1E45, AF_ADJUST_UP }, /* ṅ */
+    { 0x1E46, AF_ADJUST_DOWN }, /* Ṇ */
+    { 0x1E47, AF_ADJUST_DOWN }, /* ṇ */
+    { 0x1E48, AF_ADJUST_DOWN }, /* Ṉ */
+    { 0x1E49, AF_ADJUST_DOWN }, /* ṉ */
+    { 0x1E4A, AF_ADJUST_DOWN }, /* Ṋ */
+    { 0x1E4B, AF_ADJUST_DOWN }, /* ṋ */
+    { 0x1E4C, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* Ṍ */
+    { 0x1E4D, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* ṍ */
+    { 0x1E4E, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* Ṏ */
+    { 0x1E4F, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* ṏ */
+
+    { 0x1E50, AF_ADJUST_UP2 }, /* Ṑ */
+    { 0x1E51, AF_ADJUST_UP2 }, /* ṑ */
+    { 0x1E52, AF_ADJUST_UP2 }, /* Ṓ */
+    { 0x1E53, AF_ADJUST_UP2 }, /* ṓ */
+    { 0x1E54, AF_ADJUST_UP }, /* Ṕ */
+    { 0x1E55, AF_ADJUST_UP }, /* ṕ */
+    { 0x1E56, AF_ADJUST_UP }, /* Ṗ */
+    { 0x1E57, AF_ADJUST_UP }, /* ṗ */
+    { 0x1E58, AF_ADJUST_UP }, /* Ṙ */
+    { 0x1E59, AF_ADJUST_UP }, /* ṙ */
+    { 0x1E5A, AF_ADJUST_DOWN }, /* Ṛ */
+    { 0x1E5B, AF_ADJUST_DOWN }, /* ṛ */
+    { 0x1E5C, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ṝ */
+    { 0x1E5D, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ṝ */
+    { 0x1E5E, AF_ADJUST_DOWN }, /* Ṟ */
+    { 0x1E5F, AF_ADJUST_DOWN }, /* ṟ */
+
+    { 0x1E60, AF_ADJUST_UP }, /* Ṡ */
+    { 0x1E61, AF_ADJUST_UP }, /* ṡ */
+    { 0x1E62, AF_ADJUST_DOWN }, /* Ṣ */
+    { 0x1E63, AF_ADJUST_DOWN }, /* ṣ */
+    { 0x1E64, AF_ADJUST_UP }, /* Ṥ */
+    { 0x1E65, AF_ADJUST_UP }, /* ṥ */
+    { 0x1E66, AF_ADJUST_UP }, /* Ṧ */
+    { 0x1E67, AF_ADJUST_UP }, /* ṧ */
+    { 0x1E68, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ṩ */
+    { 0x1E69, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ṩ */
+    { 0x1E6A, AF_ADJUST_UP }, /* Ṫ */
+    { 0x1E6B, AF_ADJUST_UP }, /* ṫ */
+    { 0x1E6C, AF_ADJUST_DOWN }, /* Ṭ */
+    { 0x1E6D, AF_ADJUST_DOWN }, /* ṭ */
+    { 0x1E6E, AF_ADJUST_DOWN }, /* Ṯ */
+    { 0x1E6F, AF_ADJUST_DOWN }, /* ṯ */
+
+    { 0x1E70, AF_ADJUST_DOWN }, /* Ṱ */
+    { 0x1E71, AF_ADJUST_DOWN }, /* ṱ */
+    { 0x1E72, AF_ADJUST_DOWN }, /* Ṳ */
+    { 0x1E73, AF_ADJUST_DOWN }, /* ṳ */
+    { 0x1E74, AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* Ṵ */
+    { 0x1E75, AF_ADJUST_DOWN | AF_ADJUST_TILDE_BOTTOM }, /* ṵ */
+    { 0x1E76, AF_ADJUST_DOWN }, /* Ṷ */
+    { 0x1E77, AF_ADJUST_DOWN }, /* ṷ */
+    { 0x1E78, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* Ṹ */
+    { 0x1E79, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP2 }, /* ṹ */
+    { 0x1E7A, AF_ADJUST_UP2 }, /* Ṻ */
+    { 0x1E7B, AF_ADJUST_UP2 }, /* ṻ */
+    { 0x1E7C, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ṽ */
+    { 0x1E7D, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ṽ */
+    { 0x1E7E, AF_ADJUST_DOWN }, /* Ṿ */
+    { 0x1E7F, AF_ADJUST_DOWN }, /* ṿ */
+
+    { 0x1E80, AF_ADJUST_UP }, /* Ẁ */
+    { 0x1E81, AF_ADJUST_UP }, /* ẁ */
+    { 0x1E82, AF_ADJUST_UP }, /* Ẃ */
+    { 0x1E83, AF_ADJUST_UP }, /* ẃ */
+    { 0x1E84, AF_ADJUST_UP }, /* Ẅ */
+    { 0x1E85, AF_ADJUST_UP }, /* ẅ */
+    { 0x1E86, AF_ADJUST_UP }, /* Ẇ */
+    { 0x1E87, AF_ADJUST_UP }, /* ẇ */
+    { 0x1E88, AF_ADJUST_DOWN }, /* Ẉ */
+    { 0x1E89, AF_ADJUST_DOWN }, /* ẉ */
+    { 0x1E8A, AF_ADJUST_UP }, /* Ẋ */
+    { 0x1E8B, AF_ADJUST_UP }, /* ẋ */
+    { 0x1E8C, AF_ADJUST_UP }, /* Ẍ */
+    { 0x1E8D, AF_ADJUST_UP }, /* ẍ */
+    { 0x1E8E, AF_ADJUST_UP }, /* Ẏ */
+    { 0x1E8F, AF_ADJUST_UP }, /* ẏ */
+
+    { 0x1E90, AF_ADJUST_UP }, /* Ẑ */
+    { 0x1E91, AF_ADJUST_UP }, /* ẑ */
+    { 0x1E92, AF_ADJUST_DOWN }, /* Ẓ */
+    { 0x1E93, AF_ADJUST_DOWN }, /* ẓ */
+    { 0x1E94, AF_ADJUST_DOWN }, /* Ẕ */
+    { 0x1E95, AF_ADJUST_DOWN }, /* ẕ */
+    { 0x1E96, AF_ADJUST_DOWN }, /* ẖ */
+    { 0x1E97, AF_ADJUST_UP }, /* ẗ */
+    { 0x1E98, AF_ADJUST_UP }, /* ẘ */
+    { 0x1E99, AF_ADJUST_UP }, /* ẙ */
+    { 0x1E9A, AF_ADJUST_UP }, /* ẚ */
+    { 0x1E9B, AF_ADJUST_UP }, /* ẛ */
+
+    { 0x1EA0, AF_ADJUST_DOWN }, /* Ạ */
+    { 0x1EA1, AF_ADJUST_DOWN }, /* ạ */
+    { 0x1EA2, AF_ADJUST_UP }, /* Ả */
+    { 0x1EA3, AF_ADJUST_UP }, /* ả */
+    { 0x1EA4, AF_ADJUST_UP2 }, /* Ấ */
+    { 0x1EA5, AF_ADJUST_UP2 }, /* ấ */
+    { 0x1EA6, AF_ADJUST_UP2 }, /* Ầ */
+    { 0x1EA7, AF_ADJUST_UP2 }, /* ầ */
+    { 0x1EA8, AF_ADJUST_UP2 }, /* Ẩ */
+    { 0x1EA9, AF_ADJUST_UP2 }, /* ẩ */
+    { 0x1EAA, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* Ẫ */
+    { 0x1EAB, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ẫ */
+    { 0x1EAC, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ậ */
+    { 0x1EAD, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ậ */
+    { 0x1EAE, AF_ADJUST_UP2 }, /* Ắ */
+    { 0x1EAF, AF_ADJUST_UP2 }, /* ắ */
+
+    { 0x1EB0, AF_ADJUST_UP2 }, /* Ằ */
+    { 0x1EB1, AF_ADJUST_UP2 }, /* ằ */
+    { 0x1EB2, AF_ADJUST_UP2 }, /* Ẳ */
+    { 0x1EB3, AF_ADJUST_UP2 }, /* ẳ */
+    { 0x1EB4, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* Ẵ */
+    { 0x1EB5, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ẵ */
+    { 0x1EB6, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ặ */
+    { 0x1EB7, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ặ */
+    { 0x1EB8, AF_ADJUST_DOWN }, /* Ẹ */
+    { 0x1EB9, AF_ADJUST_DOWN }, /* ẹ */
+    { 0x1EBA, AF_ADJUST_UP }, /* Ẻ */
+    { 0x1EBB, AF_ADJUST_UP }, /* ẻ */
+    { 0x1EBC, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ẽ */
+    { 0x1EBD, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ẽ */
+    { 0x1EBE, AF_ADJUST_UP2 }, /* Ế */
+    { 0x1EBF, AF_ADJUST_UP2 }, /* ế */
+
+    { 0x1EC0, AF_ADJUST_UP2 }, /* Ề */
+    { 0x1EC1, AF_ADJUST_UP2 }, /* ề */
+    { 0x1EC2, AF_ADJUST_UP2 }, /* Ể */
+    { 0x1EC3, AF_ADJUST_UP2 }, /* ể */
+    { 0x1EC4, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* Ễ */
+    { 0x1EC5, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ễ */
+    { 0x1EC6, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ệ */
+    { 0x1EC7, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ệ */
+    { 0x1EC8, AF_ADJUST_UP }, /* Ỉ */
+    { 0x1EC9, AF_ADJUST_UP }, /* ỉ */
+    { 0x1ECA, AF_ADJUST_DOWN }, /* Ị */
+    { 0x1ECB, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ị */
+    { 0x1ECC, AF_ADJUST_DOWN }, /* Ọ */
+    { 0x1ECD, AF_ADJUST_DOWN }, /* ọ */
+    { 0x1ECE, AF_ADJUST_UP }, /* Ỏ */
+    { 0x1ECF, AF_ADJUST_UP }, /* ỏ */
+
+    { 0x1ED0, AF_ADJUST_UP2 }, /* Ố */
+    { 0x1ED1, AF_ADJUST_UP2 }, /* ố */
+    { 0x1ED2, AF_ADJUST_UP2 }, /* Ồ */
+    { 0x1ED3, AF_ADJUST_UP2 }, /* ồ */
+    { 0x1ED4, AF_ADJUST_UP2 }, /* Ổ */
+    { 0x1ED5, AF_ADJUST_UP2 }, /* ổ */
+    { 0x1ED6, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* Ỗ */
+    { 0x1ED7, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ỗ */
+    { 0x1ED8, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* Ộ */
+    { 0x1ED9, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ộ */
+    { 0x1EDA, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ớ */
+    { 0x1EDB, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ớ */
+    { 0x1EDC, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ờ */
+    { 0x1EDD, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ờ */
+    { 0x1EDE, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ở */
+    { 0x1EDF, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ở */
+
+    { 0x1EE0, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_IGNORE_CAPITAL_TOP }, /* Ỡ */
+    { 0x1EE1, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_IGNORE_SMALL_TOP }, /* ỡ */
+    { 0x1EE2, AF_ADJUST_DOWN | AF_IGNORE_CAPITAL_TOP }, /* Ợ */
+    { 0x1EE3, AF_ADJUST_DOWN | AF_IGNORE_SMALL_TOP }, /* ợ */
+    { 0x1EE4, AF_ADJUST_DOWN }, /* Ụ */
+    { 0x1EE5, AF_ADJUST_DOWN }, /* ụ */
+    { 0x1EE6, AF_ADJUST_UP }, /* Ủ */
+    { 0x1EE7, AF_ADJUST_UP }, /* ủ */
+    { 0x1EE8, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ứ */
+    { 0x1EE9, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ứ */
+    { 0x1EEA, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ừ */
+    { 0x1EEB, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ừ */
+    { 0x1EEC, AF_ADJUST_UP | AF_IGNORE_CAPITAL_TOP }, /* Ử */
+    { 0x1EED, AF_ADJUST_UP | AF_IGNORE_SMALL_TOP }, /* ử */
+    { 0x1EEE, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_IGNORE_CAPITAL_TOP }, /* Ữ */
+    { 0x1EEF, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_IGNORE_SMALL_TOP }, /* ữ */
+
+    { 0x1EF0, AF_ADJUST_DOWN | AF_IGNORE_CAPITAL_TOP }, /* Ự */
+    { 0x1EF1, AF_ADJUST_DOWN | AF_IGNORE_SMALL_TOP }, /* ự */
+    { 0x1EF2, AF_ADJUST_UP }, /* Ỳ */
+    { 0x1EF3, AF_ADJUST_UP }, /* ỳ */
+    { 0x1EF4, AF_ADJUST_DOWN }, /* Ỵ */
+    { 0x1EF5, AF_ADJUST_DOWN }, /* ỵ */
+    { 0x1EF6, AF_ADJUST_UP }, /* Ỷ */
+    { 0x1EF7, AF_ADJUST_UP }, /* ỷ */
+    { 0x1EF8, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* Ỹ */
+    { 0x1EF9, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ỹ */
+
+    /* Greek Extended */
+    { 0x1F00, AF_ADJUST_UP }, /* ἀ */
+    { 0x1F01, AF_ADJUST_UP }, /* ἁ */
+    { 0x1F02, AF_ADJUST_UP }, /* ἂ */
+    { 0x1F03, AF_ADJUST_UP }, /* ἃ */
+    { 0x1F04, AF_ADJUST_UP }, /* ἄ */
+    { 0x1F05, AF_ADJUST_UP }, /* ἅ */
+    { 0x1F06, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἆ */
+    { 0x1F07, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἇ */
+
+    { 0x1F10, AF_ADJUST_UP }, /* ἐ */
+    { 0x1F11, AF_ADJUST_UP }, /* ἑ */
+    { 0x1F12, AF_ADJUST_UP }, /* ἒ */
+    { 0x1F13, AF_ADJUST_UP }, /* ἓ */
+    { 0x1F14, AF_ADJUST_UP }, /* ἔ */
+    { 0x1F15, AF_ADJUST_UP }, /* ἕ */
+
+    { 0x1F20, AF_ADJUST_UP }, /* ἠ */
+    { 0x1F21, AF_ADJUST_UP }, /* ἡ */
+    { 0x1F22, AF_ADJUST_UP }, /* ἢ */
+    { 0x1F23, AF_ADJUST_UP }, /* ἣ */
+    { 0x1F24, AF_ADJUST_UP }, /* ἤ */
+    { 0x1F25, AF_ADJUST_UP }, /* ἥ */
+    { 0x1F26, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἦ */
+    { 0x1F27, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἧ */
+
+    { 0x1F30, AF_ADJUST_UP }, /* ἰ */
+    { 0x1F31, AF_ADJUST_UP }, /* ἱ */
+    { 0x1F32, AF_ADJUST_UP }, /* ἲ */
+    { 0x1F33, AF_ADJUST_UP }, /* ἳ */
+    { 0x1F34, AF_ADJUST_UP }, /* ἴ */
+    { 0x1F35, AF_ADJUST_UP }, /* ἵ */
+    { 0x1F36, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἶ */
+    { 0x1F37, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ἷ */
+
+    { 0x1F40, AF_ADJUST_UP }, /* ὀ */
+    { 0x1F41, AF_ADJUST_UP }, /* ὁ */
+    { 0x1F42, AF_ADJUST_UP }, /* ὂ */
+    { 0x1F43, AF_ADJUST_UP }, /* ὃ */
+    { 0x1F44, AF_ADJUST_UP }, /* ὄ */
+    { 0x1F45, AF_ADJUST_UP }, /* ὅ */
+
+    { 0x1F50, AF_ADJUST_UP }, /* ὐ */
+    { 0x1F51, AF_ADJUST_UP }, /* ὑ */
+    { 0x1F52, AF_ADJUST_UP }, /* ὒ */
+    { 0x1F53, AF_ADJUST_UP }, /* ὓ */
+    { 0x1F54, AF_ADJUST_UP }, /* ὔ */
+    { 0x1F55, AF_ADJUST_UP }, /* ὕ */
+    { 0x1F56, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ὖ */
+    { 0x1F57, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ὗ */
+
+    { 0x1F60, AF_ADJUST_UP }, /* ὠ */
+    { 0x1F61, AF_ADJUST_UP }, /* ὡ */
+    { 0x1F62, AF_ADJUST_UP }, /* ὢ */
+    { 0x1F63, AF_ADJUST_UP }, /* ὣ */
+    { 0x1F64, AF_ADJUST_UP }, /* ὤ */
+    { 0x1F65, AF_ADJUST_UP }, /* ὥ */
+    { 0x1F66, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ὦ */
+    { 0x1F67, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ὧ */
+
+    { 0x1F70, AF_ADJUST_UP }, /* ὰ */
+    { 0x1F71, AF_ADJUST_UP }, /* ά */
+    { 0x1F72, AF_ADJUST_UP }, /* ὲ */
+    { 0x1F73, AF_ADJUST_UP }, /* έ */
+    { 0x1F74, AF_ADJUST_UP }, /* ὴ */
+    { 0x1F75, AF_ADJUST_UP }, /* ή */
+    { 0x1F76, AF_ADJUST_UP }, /* ὶ */
+    { 0x1F77, AF_ADJUST_UP }, /* ί */
+    { 0x1F78, AF_ADJUST_UP }, /* ὸ */
+    { 0x1F79, AF_ADJUST_UP }, /* ό */
+    { 0x1F7A, AF_ADJUST_UP }, /* ὺ */
+    { 0x1F7B, AF_ADJUST_UP }, /* ύ */
+    { 0x1F7C, AF_ADJUST_UP }, /* ὼ */
+    { 0x1F7D, AF_ADJUST_UP }, /* ώ */
+
+    { 0x1F80, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾀ */
+    { 0x1F81, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾁ */
+    { 0x1F82, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾂ */
+    { 0x1F83, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾃ */
+    { 0x1F84, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾄ */
+    { 0x1F85, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾅ */
+    { 0x1F86, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾆ */
+    { 0x1F87, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾇ */
+    { 0x1F88, AF_ADJUST_DOWN }, /* ᾈ */
+    { 0x1F89, AF_ADJUST_DOWN }, /* ᾉ */
+    { 0x1F8A, AF_ADJUST_DOWN }, /* ᾊ */
+    { 0x1F8B, AF_ADJUST_DOWN }, /* ᾋ */
+    { 0x1F8C, AF_ADJUST_DOWN }, /* ᾌ */
+    { 0x1F8D, AF_ADJUST_DOWN }, /* ᾍ */
+    { 0x1F8E, AF_ADJUST_DOWN }, /* ᾎ */
+    { 0x1F8F, AF_ADJUST_DOWN }, /* ᾏ */
+
+    { 0x1F90, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾐ */
+    { 0x1F91, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾑ */
+    { 0x1F92, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾒ */
+    { 0x1F93, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾓ */
+    { 0x1F94, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾔ */
+    { 0x1F95, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾕ */
+    { 0x1F96, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾖ */
+    { 0x1F97, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾗ */
+    { 0x1F98, AF_ADJUST_DOWN }, /* ᾘ */
+    { 0x1F99, AF_ADJUST_DOWN }, /* ᾙ */
+    { 0x1F9A, AF_ADJUST_DOWN }, /* ᾚ */
+    { 0x1F9B, AF_ADJUST_DOWN }, /* ᾛ */
+    { 0x1F9C, AF_ADJUST_DOWN }, /* ᾜ */
+    { 0x1F9D, AF_ADJUST_DOWN }, /* ᾝ */
+    { 0x1F9E, AF_ADJUST_DOWN }, /* ᾞ */
+    { 0x1F9F, AF_ADJUST_DOWN }, /* ᾟ */
+
+    { 0x1FA0, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾠ */
+    { 0x1FA1, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾡ */
+    { 0x1FA2, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾢ */
+    { 0x1FA3, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾣ */
+    { 0x1FA4, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾤ */
+    { 0x1FA5, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾥ */
+    { 0x1FA6, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾦ */
+    { 0x1FA7, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾧ */
+    { 0x1FA8, AF_ADJUST_DOWN }, /* ᾨ */
+    { 0x1FA9, AF_ADJUST_DOWN }, /* ᾩ */
+    { 0x1FAA, AF_ADJUST_DOWN }, /* ᾪ */
+    { 0x1FAB, AF_ADJUST_DOWN }, /* ᾫ */
+    { 0x1FAC, AF_ADJUST_DOWN }, /* ᾬ */
+    { 0x1FAD, AF_ADJUST_DOWN }, /* ᾭ */
+    { 0x1FAE, AF_ADJUST_DOWN }, /* ᾮ */
+    { 0x1FAF, AF_ADJUST_DOWN }, /* ᾯ */
+
+    { 0x1FB0, AF_ADJUST_UP }, /* ᾰ */
+    { 0x1FB1, AF_ADJUST_UP }, /* ᾱ */
+    { 0x1FB2, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾲ */
+    { 0x1FB3, AF_ADJUST_DOWN }, /* ᾳ */
+    { 0x1FB4, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ᾴ */
+    { 0x1FB6, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ᾶ */
+    { 0x1FB7, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ᾷ */
+    { 0x1FB8, AF_ADJUST_UP }, /* Ᾰ */
+    { 0x1FB9, AF_ADJUST_UP }, /* Ᾱ */
+    { 0x1FBC, AF_ADJUST_DOWN }, /* ᾼ */
+
+    { 0x1FC2, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ῂ */
+    { 0x1FC3, AF_ADJUST_DOWN }, /* ῃ */
+    { 0x1FC4, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ῄ */
+    { 0x1FC6, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ῆ */
+    { 0x1FC7, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ῇ */
+    { 0x1FCC, AF_ADJUST_DOWN }, /* ῌ */
+
+    { 0x1FD0, AF_ADJUST_UP }, /* ῐ */
+    { 0x1FD1, AF_ADJUST_UP }, /* ῑ */
+    { 0x1FD2, AF_ADJUST_UP2 }, /* ῒ */
+    { 0x1FD3, AF_ADJUST_UP2 }, /* ΐ */
+    { 0x1FD6, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ῖ */
+    { 0x1FD7, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ῗ */
+    { 0x1FD8, AF_ADJUST_UP }, /* Ῐ */
+    { 0x1FD9, AF_ADJUST_UP }, /* Ῑ */
+
+    { 0x1FE0, AF_ADJUST_UP }, /* ῠ */
+    { 0x1FE1, AF_ADJUST_UP }, /* ῡ */
+    { 0x1FE2, AF_ADJUST_UP2 }, /* ῢ */
+    { 0x1FE3, AF_ADJUST_UP2 }, /* ΰ */
+    { 0x1FE4, AF_ADJUST_UP }, /* ῤ */
+    { 0x1FE5, AF_ADJUST_UP }, /* ῥ */
+    { 0x1FE6, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ῦ */
+    { 0x1FE7, AF_ADJUST_UP2 | AF_ADJUST_TILDE_TOP }, /* ῧ */
+    { 0x1FE8, AF_ADJUST_UP }, /* Ῠ */
+    { 0x1FE9, AF_ADJUST_UP }, /* Ῡ */
+    { 0x1FF2, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ῲ */
+    { 0x1FF3, AF_ADJUST_DOWN }, /* ῳ */
+    { 0x1FF4, AF_ADJUST_UP | AF_ADJUST_DOWN }, /* ῴ */
+    { 0x1FF6, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP }, /* ῶ */
+    { 0x1FF7, AF_ADJUST_UP | AF_ADJUST_TILDE_TOP | AF_ADJUST_DOWN }, /* ῷ */
+    { 0x1FFC, AF_ADJUST_DOWN }, /* ῼ */
+
+    /* General Punctuation */
+    { 0x203C, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ‼ */
+    { 0x203D, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ‽ */
+
+    { 0x2047, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ⁇ */
+    { 0x2048, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ⁈ */
+    { 0x2049, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ⁉ */
+
+    /* Superscripts and Subscripts */
+    { 0x2071, AF_ADJUST_UP }, /* ⁱ */
+
+    /* Currency Symbols */
+    { 0x20AB, AF_ADJUST_DOWN }, /* ₫ */
+
+    { 0x20C0, AF_ADJUST_DOWN }, /* ⃀ */
+
+    /* Number Forms */
+    { 0x2170, AF_ADJUST_UP }, /* ⅰ */
+    { 0x2171, AF_ADJUST_UP }, /* ⅱ */
+    { 0x2172, AF_ADJUST_UP }, /* ⅲ */
+    { 0x2173, AF_ADJUST_UP }, /* ⅳ */
+    { 0x2175, AF_ADJUST_UP }, /* ⅵ */
+    { 0x2176, AF_ADJUST_UP }, /* ⅶ */
+    { 0x2177, AF_ADJUST_UP }, /* ⅷ */
+    { 0x2178, AF_ADJUST_UP }, /* ⅸ */
+    { 0x217A, AF_ADJUST_UP }, /* ⅺ */
+    { 0x217B, AF_ADJUST_UP }, /* ⅻ */
+
+    /* Latin Extended-C */
+    { 0x2C64, AF_IGNORE_CAPITAL_BOTTOM } , /* Ɽ */
+    { 0x2C67, AF_IGNORE_CAPITAL_BOTTOM } , /* Ⱨ */
+    { 0x2C68, AF_IGNORE_SMALL_BOTTOM } , /* ⱨ */
+    { 0x2C69, AF_IGNORE_CAPITAL_BOTTOM } , /* Ⱪ */
+    { 0x2C6A, AF_IGNORE_SMALL_BOTTOM } , /* ⱪ */
+    { 0x2C6B, AF_IGNORE_CAPITAL_BOTTOM } , /* Ⱬ */
+    { 0x2C6C, AF_IGNORE_SMALL_BOTTOM } , /* ⱬ */
+    { 0x2C6E, AF_IGNORE_CAPITAL_BOTTOM } , /* Ɱ */
+
+    { 0x2C7C, AF_ADJUST_UP }, /* ⱼ */
+    { 0x2C7E, AF_IGNORE_CAPITAL_BOTTOM } , /* Ȿ */
+    { 0x2C7F, AF_IGNORE_CAPITAL_BOTTOM } , /* Ɀ */
+
+    /* Coptic */
+    { 0x2CC2, AF_ADJUST_UP }, /* Ⳃ */
+    { 0x2CC3, AF_ADJUST_UP }, /* ⳃ */
+
+    /* Supplemental Punctuation */
+    { 0x2E18, AF_ADJUST_UP }, /* ⸘ */
+
+    { 0x2E2E, AF_ADJUST_UP | AF_ADJUST_NO_HEIGHT_CHECK }, /* ⸮ */
+
+    /* Cyrillic Extended-B */
+    { 0xA640, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꙁ */
+    { 0xA641, AF_IGNORE_SMALL_BOTTOM } , /* ꙁ */
+    { 0xA642, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꙃ */
+    { 0xA643, AF_IGNORE_SMALL_BOTTOM } , /* ꙃ */
+
+    { 0xA680, AF_IGNORE_CAPITAL_TOP } , /* Ꚁ */
+    { 0xA681, AF_IGNORE_SMALL_TOP } , /* ꚁ */
+    { 0xA688, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꚉ */
+    { 0xA689, AF_IGNORE_SMALL_BOTTOM } , /* ꚉ */
+    { 0xA68A, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꚋ */
+    { 0xA68B, AF_IGNORE_SMALL_BOTTOM } , /* ꚋ */
+    { 0xA68E, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꚏ */
+    { 0xA68F, AF_IGNORE_SMALL_BOTTOM } , /* ꚏ */
+
+    { 0xA690, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꚑ */
+    { 0xA691, AF_IGNORE_SMALL_BOTTOM } , /* ꚑ */
+    { 0xA696, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꚗ */
+    { 0xA697, AF_IGNORE_SMALL_BOTTOM } , /* ꚗ */
+
+    /* Latin Extended-D */
+    { 0xA726, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꜧ */
+    { 0xA727, AF_IGNORE_SMALL_BOTTOM } , /* ꜧ */
+
+    { 0xA756, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꝗ */
+    { 0xA758, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꝙ */
+
+    { 0xA771, AF_IGNORE_SMALL_BOTTOM } , /* ꝱ */
+    { 0xA772, AF_IGNORE_SMALL_BOTTOM } , /* ꝲ */
+    { 0xA773, AF_IGNORE_SMALL_BOTTOM } , /* ꝳ */
+    { 0xA774, AF_IGNORE_SMALL_BOTTOM } , /* ꝴ */
+    { 0xA776, AF_IGNORE_SMALL_BOTTOM } , /* ꝶ */
+
+    { 0xA790, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꞑ */
+    { 0xA791, AF_IGNORE_SMALL_BOTTOM } , /* ꞑ */
+    { 0xA794, AF_IGNORE_SMALL_BOTTOM } , /* ꞔ */
+    { 0xA795, AF_IGNORE_SMALL_BOTTOM } , /* ꞕ */
+
+    { 0xA7C0, AF_IGNORE_CAPITAL_TOP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ꟁ */
+    { 0xA7C1, AF_IGNORE_SMALL_TOP | AF_IGNORE_SMALL_BOTTOM }, /* ꟁ */
+    { 0xA7C4, AF_IGNORE_CAPITAL_BOTTOM } , /* Ꞔ */
+    { 0xA7C5, AF_IGNORE_CAPITAL_BOTTOM } , /* Ʂ */
+    { 0xA7C6, AF_IGNORE_CAPITAL_BOTTOM } , /* Ᶎ */
+    { 0xA7CC, AF_IGNORE_CAPITAL_TOP | AF_IGNORE_CAPITAL_BOTTOM }, /* Ꟍ */
+    { 0xA7CD, AF_IGNORE_SMALL_TOP | AF_IGNORE_SMALL_BOTTOM }, /* ꟍ */
+
+    /* Latin Extended-E */
+    { 0xAB3C, AF_IGNORE_SMALL_BOTTOM } , /* ꬼ */
+
+    { 0xAB46, AF_IGNORE_SMALL_BOTTOM } , /* ꭆ */
+
+    { 0xAB5C, AF_IGNORE_SMALL_BOTTOM } , /* ꭜ */
+
+    { 0xAB66, AF_IGNORE_SMALL_BOTTOM } , /* ꭦ */
+    { 0xAB67, AF_IGNORE_SMALL_BOTTOM } , /* ꭧ */
+  };
+
+
+  FT_LOCAL_DEF( FT_UInt32 )
+  af_adjustment_database_lookup( FT_UInt32  codepoint )
+  {
+    /* Binary search for database entry */
+    FT_Offset  low  = 0;
+    FT_Offset  high = AF_ADJUSTMENT_DATABASE_LENGTH - 1;
+
+
+    while ( high >= low )
+    {
+      FT_Offset  mid           = ( low + high ) / 2;
+      FT_UInt32  mid_codepoint = adjustment_database[mid].codepoint;
+
+
+      if ( mid_codepoint < codepoint )
+        low = mid + 1;
+      else if ( mid_codepoint > codepoint )
+        high = mid - 1;
+      else
+        return adjustment_database[mid].flags;
+    }
+
+    return 0;
+  }
+
+
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+
+  static FT_Error
+  add_substitute( FT_Int     glyph_idx,
+                  size_t     value,
+                  FT_UInt32  codepoint,
+                  FT_Hash    reverse_map,
+                  FT_Hash    subst_map,
+                  FT_Memory  memory )
+  {
+    FT_Error  error;
+
+    FT_Int  first_substitute = (FT_Int)( value & 0xFFFF );
+
+    FT_UInt  used = reverse_map->used;
+
+
+    /*
+      OpenType features like 'unic' map lowercase letter glyphs to uppercase
+      forms (and vice versa), which could lead to the use of wrong entries
+      in the adjustment database.  For this reason we don't overwrite,
+      prioritizing cmap entries.
+
+      XXX Note, however, that this cannot cover all cases since there might
+      be contradictory entries for glyphs not in the cmap.  A possible
+      solution might be to specially mark pairs of related lowercase and
+      uppercase characters in the adjustment database that have diacritics
+      on different vertical sides (for example, U+0122 'Ģ' and U+0123 'ģ').
+      The auto-hinter could then perform a topological analysis to do the
+      right thing.
+    */
+    error = ft_hash_num_insert_no_overwrite( first_substitute, codepoint,
+                                             reverse_map, memory );
+    if ( error )
+      return error;
+
+    if ( reverse_map->used > used )
+    {
+      size_t*  subst = ft_hash_num_lookup( first_substitute, subst_map );
+
+
+      if ( subst )
+      {
+        error = add_substitute( first_substitute, *subst, codepoint,
+                                reverse_map, subst_map, memory );
+        if ( error )
+          return error;
+      }
+    }
+
+    /* The remaining substitutes. */
+    if ( value & 0xFFFF0000U )
+    {
+      FT_UInt  num_substitutes = value >> 16;
+
+      FT_UInt  i;
+
+
+      for ( i = 1; i <= num_substitutes; i++ )
+      {
+        FT_Int   idx        = glyph_idx + (FT_Int)( i << 16 );
+        size_t*  substitute = ft_hash_num_lookup( idx, subst_map );
+
+
+        used = reverse_map->used;
+
+        error = ft_hash_num_insert_no_overwrite( *substitute,
+                                                 codepoint,
+                                                 reverse_map,
+                                                 memory );
+        if ( error )
+          return error;
+
+        if ( reverse_map->used > used )
+        {
+          size_t*  subst = ft_hash_num_lookup( *substitute, subst_map );
+
+
+          if ( subst )
+          {
+            error = add_substitute( *substitute, *subst, codepoint,
+                                    reverse_map, subst_map, memory );
+            if ( error )
+              return error;
+          }
+        }
+      }
+    }
+
+    return FT_Err_Ok;
+  }
+
+#endif /* FT_CONFIG_OPTION_USE_HARFBUZZ */
+
+
+  /* Construct a 'reverse cmap' (i.e., a mapping from glyph indices to   */
+  /* character codes) for all glyphs that an input code point could turn */
+  /* into.                                                               */
+  /*                                                                     */
+  /* If HarfBuzz support is not available, this is the direct inversion  */
+  /* of the cmap table, otherwise the mapping gets extended with data    */
+  /* from the 'GSUB' table.                                              */
+  FT_LOCAL_DEF( FT_Error )
+  af_reverse_character_map_new( FT_Hash         *map,
+                                AF_StyleMetrics  metrics )
+  {
+    FT_Error  error;
+
+    AF_FaceGlobals  globals = metrics->globals;
+    FT_Face         face    = globals->face;
+    FT_Memory       memory  = face->memory;
+
+    FT_CharMap  old_charmap;
+
+    FT_UInt32  codepoint;
+    FT_Offset  i;
+
+
+    FT_TRACE4(( "af_reverse_character_map_new:"
+                " building reverse character map (style `%s')\n",
+                af_style_names[metrics->style_class->style] ));
+
+    /* Search for a unicode charmap.           */
+    /* If there isn't one, create a blank map. */
+
+    /* Back up `face->charmap` because `find_unicode_charmap` sets it. */
+    old_charmap = face->charmap;
+
+    if ( ( error = find_unicode_charmap( face ) ) )
+      goto Exit;
+
+    *map = NULL;
+    if ( FT_QNEW( *map ) )
+      goto Exit;
+
+    error = ft_hash_num_init( *map, memory );
+    if ( error )
+      goto Exit;
+
+    /* Initialize reverse cmap with data directly from the cmap table. */
+    for ( i = 0; i < AF_ADJUSTMENT_DATABASE_LENGTH; i++ )
+    {
+      FT_Int  cmap_glyph;
+
+
+      /*
+        We cannot restrict `codepoint` to character ranges; we have no
+        control what data the script-specific portion of the GSUB table
+        actually holds.
+
+        An example is `arial.ttf` version 7.00; in this font, there are
+        lookups for Cyrillic (lookup 43), Greek (lookup 44), and Latin
+        (lookup 45) that map capital letter glyphs to small capital glyphs.
+        It is tempting to expect that script-specific versions of the 'c2sc'
+        feature only use script-specific lookups.  However, this is not the
+        case in this font: the feature uses all three lookups regardless of
+        the script.
+
+        The auto-hinter, while assigning glyphs to styles, uses the first
+        coverage result it encounters for a particular glyph.  For example,
+        if the coverage for Cyrillic is tested before Latin (as is currently
+        the case), glyphs without a cmap entry that are covered in 'c2sc'
+        are treated as Cyrillic.
+
+        If we now look at glyph 3498, which is a small-caps version of the
+        Latin character 'A grave' (U+00C0, glyph 172), we can see that it is
+        registered as belonging to a Cyrillic style due to the algorithm
+        just described.  As a result, checking only for characters from the
+        Latin range would miss this glyph; we thus have to test all
+        character codes in the database.
+      */
+      codepoint = adjustment_database[i].codepoint;
+
+      cmap_glyph = (FT_Int)FT_Get_Char_Index( face, codepoint );
+      if ( cmap_glyph == 0 )
+        continue;
+
+      error = ft_hash_num_insert( cmap_glyph, codepoint, *map, memory );
+      if ( error )
+        goto Exit;
+    }
+
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+
+    if ( ft_hb_enabled( globals ) )
+    {
+      hb_font_t  *hb_font;
+      hb_face_t  *hb_face;
+
+      hb_set_t    *gsub_lookups;
+      hb_script_t  script;
+
+      unsigned int  script_count   = 1;
+      hb_tag_t      script_tags[2] = { HB_TAG_NONE, HB_TAG_NONE };
+
+      FT_Hash  subst_map = NULL;
+
+      hb_codepoint_t  idx;
+      FT_UInt         hash_idx;
+      FT_Int          glyph_idx;
+      size_t          value;
+
+
+      /* No need to check whether HarfBuzz has allocation issues; */
+      /* it continues to work in such cases and simply returns    */
+      /* 'empty' objects that do nothing.                         */
+
+      hb_font = globals->hb_font;
+      hb_face = hb( font_get_face )( hb_font );
+
+      gsub_lookups = hb( set_create )();
+
+      script = af_hb_scripts[metrics->style_class->script];
+
+      hb( ot_tags_from_script_and_language )( script, NULL,
+                                              &script_count, script_tags,
+                                              NULL, NULL );
+
+      /* Compute set of all script-specific GSUB lookups. */
+      hb( ot_layout_collect_lookups )( hb_face,
+                                       HB_OT_TAG_GSUB,
+                                       script_tags, NULL, NULL,
+                                       gsub_lookups );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+      {
+        FT_Bool  have_idx = FALSE;
+
+
+        FT_TRACE4(( "  GSUB lookups to check:\n" ));
+
+        FT_TRACE4(( "  " ));
+        idx = HB_SET_VALUE_INVALID;
+        while ( hb( set_next )( gsub_lookups, &idx ) )
+          if ( idx < globals->gsub_lookup_count            &&
+               globals->gsub_lookups_single_alternate[idx] )
+          {
+            have_idx = TRUE;
+            FT_TRACE4(( "  %u", idx ));
+          }
+        if ( !have_idx )
+          FT_TRACE4(( "  (none)" ));
+        FT_TRACE4(( "\n" ));
+
+        FT_TRACE4(( "\n" ));
+      }
+#endif
+
+      if ( FT_QNEW( subst_map ) )
+        goto Exit_HarfBuzz;
+
+      error = ft_hash_num_init( subst_map, memory );
+      if ( error )
+        goto Exit_HarfBuzz;
+
+      idx = HB_SET_VALUE_INVALID;
+      while ( hb( set_next )( gsub_lookups, &idx ) )
+      {
+        FT_UInt32  offset;
+
+
+        /* HarfBuzz only validates lookup indices while   */
+        /* processing lookups, not while collecting them, */
+        /* so we have to do that by ourselves.            */
+        if ( idx < globals->gsub_lookup_count )
+          offset = globals->gsub_lookups_single_alternate[idx];
+        else
+          offset = 0;
+
+        /* Put all substitutions into a single hash table.  Note that   */
+        /* the hash values usually contain more than a single character */
+        /* code; this can happen if different 'SingleSubst' subtables   */
+        /* map a given glyph index to different substitutions, or if    */
+        /* 'AlternateSubst' subtable entries are present.               */
+        if ( offset )
+          af_map_lookup( globals, subst_map, offset );
+      }
+
+      /*
+        Now iterate over the collected substitution data in `subst_map`
+        (using recursion to resolve one-to-many mappings) and insert the
+        data into the reverse cmap.
+
+        As an example, suppose we have the following cmap and substitution
+        data:
+
+          cmap: X -> a
+                Y -> b
+                Z -> c
+
+          substitutions: a -> b
+                         b -> c, d
+                         d -> e
+
+        The reverse map now becomes as follows.
+
+          a -> X
+          b -> Y
+          c -> Z (via cmap, ignoring mapping from 'b')
+          d -> Y (via 'b')
+          e -> Y (via 'b' and 'd')
+      */
+
+      hash_idx = 0;
+      while ( ft_hash_num_iterator( &hash_idx,
+                                    &glyph_idx,
+                                    &value,
+                                    subst_map ) )
+      {
+        size_t*  val;
+
+
+        /* Ignore keys that do not point to the first substitute. */
+        if ( (FT_UInt)glyph_idx & 0xFFFF0000U )
+          continue;
+
+        /* Ignore glyph indices that are not related to accents. */
+        val = ft_hash_num_lookup( glyph_idx, *map );
+        if ( !val )
+          continue;
+
+        codepoint = *val;
+
+        error = add_substitute( glyph_idx, value, codepoint,
+                                *map, subst_map, memory );
+        if ( error )
+          break;
+      }
+
+    Exit_HarfBuzz:
+      hb( set_destroy )( gsub_lookups );
+
+      ft_hash_num_free( subst_map, memory );
+      FT_FREE( subst_map );
+
+      if ( error )
+        goto Exit;
+    }
+
+#endif /* FT_CONFIG_OPTION_USE_HARFBUZZ */
+
+    FT_TRACE4(( "    reverse character map built successfully"
+                " with %u entries\n", ( *map )->used ));
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+    {
+      FT_UInt  cnt;
+
+
+      FT_TRACE7(( "       gidx   code    flags\n" ));
+               /* "      XXXXX  0xXXXX  XXXXXXXXXXX..." */
+      FT_TRACE7(( "     ------------------------------\n" ));
+
+      for ( cnt = 0; cnt < globals->glyph_count; cnt++ )
+      {
+        size_t*    val;
+        FT_UInt32  adj_type;
+
+        const char*  flag_names[] =
+        {
+          "up",          /* AF_ADJUST_UP    */
+          "down",        /* AF_ADJUST_DOWN  */
+          "double up",   /* AF_ADJUST_UP2   */
+          "double down", /* AF_ADJUST_DOWN2 */
+
+          "top tilde",          /* AF_ADJUST_TILDE_TOP     */
+          "bottom tilde",       /* AF_ADJUST_TILDE_BOTTOM  */
+          "below-top tilde",    /* AF_ADJUST_TILDE_TOP2    */
+          "above-bottom tilde", /* AF_ADJUST_TILDE_BOTTOM2 */
+
+          "ignore capital top",    /* AF_IGNORE_CAPITAL_TOP    */
+          "ignore capital bottom", /* AF_IGNORE_CAPITAL_BOTTOM */
+          "ignore small top",      /* AF_IGNORE_SMALL_TOP      */
+          "ignore small bottom",   /* AF_IGNORE_SMALL_BOTTOM   */
+        };
+        size_t  flag_names_size = sizeof ( flag_names ) / sizeof ( char* );
+
+        char  flag_str[256];
+        int   need_comma;
+
+        size_t  j;
+
+
+        val = ft_hash_num_lookup( (FT_Int)cnt, *map );
+        if ( !val )
+          continue;
+        codepoint = *val;
+
+        adj_type = af_adjustment_database_lookup( codepoint );
+        if ( !adj_type )
+          continue;
+
+        flag_str[0] = '\0';
+        need_comma  = 0;
+
+        for ( j = 0; j < flag_names_size; j++ )
+        {
+          if ( adj_type & (1 << j ) )
+          {
+            if ( !need_comma )
+              need_comma = 1;
+            else
+              strcat( flag_str, ", " );
+            strcat( flag_str, flag_names[j] );
+          }
+        }
+
+        FT_TRACE7(( "      %5u  0x%04X  %s\n", cnt, codepoint, flag_str ));
+      }
+    }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+  Exit:
+    face->charmap = old_charmap;
+
+    if ( error )
+    {
+      FT_TRACE4(( "    error while building reverse character map."
+                  " Using blank map.\n" ));
+
+      if ( *map )
+        ft_hash_num_free( *map, memory );
+
+      FT_FREE( *map );
+      *map = NULL;
+      return error;
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  af_reverse_character_map_done( FT_Hash    map,
+                                 FT_Memory  memory )
+  {
+    if ( map )
+      ft_hash_num_free( map, memory );
+    FT_FREE( map );
+
+    return FT_Err_Ok;
+  }
+
+
+/* END */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.h	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afadjust.h	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,130 @@
+/****************************************************************************
+ *
+ * afadjust.h
+ *
+ *   Auto-fitter routines to adjust components based on charcode (header).
+ *
+ * Copyright (C) 2023-2025 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * Written by Craig White .
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT.  By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ */
+
+
+#ifndef AFADJUST_H_
+#define AFADJUST_H_
+
+#include 
+
+#include "afglobal.h"
+#include "aftypes.h"
+
+
+FT_BEGIN_HEADER
+
+  /*
+   * Adjustment type flags.
+   *
+   * They also specify topological constraints that the auto-hinter relies
+   * on.  For example, using `AF_ADJUST_UP` implies that we have two
+   * enclosing contours, one for the base glyph and one for the diacritic
+   * above, and no other contour inbetween or above.  With 'enclosing' it is
+   * meant that such a contour can contain more inner contours.
+   *
+   */
+
+  /* Find the topmost contour and push it up until its lowest point is */
+  /* one pixel above the highest point not enclosed by that contour.   */
+#define AF_ADJUST_UP  0x01
+
+  /* Find the bottommost contour and push it down until its highest point */
+  /* is one pixel below the lowest point not enclosed by that contour.    */
+#define AF_ADJUST_DOWN  0x02
+
+  /* Find the contour below the topmost contour and push it up, together */
+  /* with the topmost contour, until its lowest point is one pixel above */
+  /* the highest point not enclosed by that contour.  This flag is       */
+  /* mutually exclusive with `AF_ADJUST_UP`.                             */
+#define AF_ADJUST_UP2  0x04
+
+  /* Find the contour above the bottommost contour and push it down,  */
+  /* together with the bottommost contour, until its highest point is */
+  /* one pixel below the lowest point not enclosed by that contour.   */
+  /* This flag is mutually exclusive with `AF_ADJUST_DOWN`.           */
+#define AF_ADJUST_DOWN2  0x08
+
+  /* The topmost contour is a tilde.  Enlarge it vertically so that it    */
+  /* stays legible at small sizes, not degenerating to a horizontal line. */
+#define AF_ADJUST_TILDE_TOP  0x10
+
+  /* The bottommost contour is a tilde.  Enlarge it vertically so that it */
+  /* stays legible at small sizes, not degenerating to a horizontal line. */
+#define AF_ADJUST_TILDE_BOTTOM  0x20
+
+  /* The contour below the topmost contour is a tilde.  Enlarge it        */
+  /* vertically so that it stays legible at small sizes, not degenerating */
+  /* to a horizontal line.  To be used with `AF_ADJUST_UP2` only.         */
+#define AF_ADJUST_TILDE_TOP2  0x40
+
+  /* The contour above the bottommost contour is a tilde.  Enlarge it     */
+  /* vertically so that it stays legible at small sizes, not degenerating */
+  /* to a horizontal line.  To be used with `AF_ADJUST_DOWN2` only.       */
+#define AF_ADJUST_TILDE_BOTTOM2  0x80
+
+  /* Make the auto-hinter ignore any diacritic (either a separate contour */
+  /* or part of the base character outline) that is attached to the top   */
+  /* of an uppercase base character.                                      */
+#define AF_IGNORE_CAPITAL_TOP  0x100
+
+  /* Make the auto-hinter ignore any diacritic (either a separate contour */
+  /* or part of the base character outline) that is attached to the       */
+  /* bottom of an uppercase base character.                               */
+#define AF_IGNORE_CAPITAL_BOTTOM  0x200
+
+  /* Make the auto-hinter ignore any diacritic (either a separate contour */
+  /* or part of the base character outline) that is attached to the top   */
+  /* of a lowercase base character.                                       */
+#define AF_IGNORE_SMALL_TOP  0x400
+
+  /* Make the auto-hinter ignore any diacritic (either a separate contour */
+  /* or part of the base character outline) that is attached to the       */
+  /* bottom of a lowercase base character.                                */
+#define AF_IGNORE_SMALL_BOTTOM  0x800
+
+  /* By default, the AF_ADJUST_XXX flags are applied only if diacritics */
+  /* have a 'small' height (based on some heuristic checks).  If this   */
+  /* flag is set, no such check is performed.                           */
+#define AF_ADJUST_NO_HEIGHT_CHECK  0x1000
+
+  /* No adjustment, i.e., no flag is set. */
+#define AF_ADJUST_NONE  0x00
+
+
+  FT_LOCAL( FT_UInt32 )
+  af_adjustment_database_lookup( FT_UInt32  codepoint );
+
+  /* Allocate and populate the reverse character map, */
+  /* using the character map within the face.         */
+  FT_LOCAL( FT_Error )
+  af_reverse_character_map_new( FT_Hash         *map,
+                                AF_StyleMetrics  metrics );
+
+  /* Free the reverse character map. */
+  FT_LOCAL( FT_Error )
+  af_reverse_character_map_done( FT_Hash    map,
+                                 FT_Memory  memory );
+
+
+FT_END_HEADER
+
+#endif /* AFADJUST_H_ */
+
+
+/* END */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afblue.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afblue.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afblue.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afblue.c	2026-04-17 19:09:35.000000000 +0000
@@ -7,7 +7,7 @@
  *
  *   Auto-fitter data for blue strings (body).
  *
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -467,24 +467,24 @@
   af_blue_stringsets[] =
   {
     /* */
-    { AF_BLUE_STRING_ADLAM_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0                                 },
+    { AF_BLUE_STRING_ADLAM_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP            },
+    { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
     { AF_BLUE_STRING_ADLAM_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
-                                           AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
-    { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM,   0                                 },
-    { AF_BLUE_STRING_MAX,                  0                                 },
+                                           AF_BLUE_PROPERTY_LATIN_X_HEIGHT       },
+    { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM,   AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   },
+    { AF_BLUE_STRING_MAX,                  0                                     },
     { AF_BLUE_STRING_ARABIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP     },
     { AF_BLUE_STRING_ARABIC_BOTTOM, 0                              },
     { AF_BLUE_STRING_ARABIC_JOIN,   AF_BLUE_PROPERTY_LATIN_NEUTRAL },
     { AF_BLUE_STRING_MAX,           0                              },
-    { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM,  0                                 },
-    { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            },
+    { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM,  AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
+    { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP            },
     { AF_BLUE_STRING_ARMENIAN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
-                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
-    { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM,    0                                 },
-    { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0                                 },
-    { AF_BLUE_STRING_MAX,                      0                                 },
+                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT       },
+    { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM,    AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   },
+    { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0                                     },
+    { AF_BLUE_STRING_MAX,                      0                                     },
     { AF_BLUE_STRING_AVESTAN_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_AVESTAN_BOTTOM, 0                          },
     { AF_BLUE_STRING_MAX,            0                          },
@@ -508,14 +508,14 @@
     { AF_BLUE_STRING_CHAKMA_BOTTOM,    0                          },
     { AF_BLUE_STRING_CHAKMA_DESCENDER, 0                          },
     { AF_BLUE_STRING_MAX,              0                          },
-    { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM,       0                                 },
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP,          AF_BLUE_PROPERTY_LATIN_TOP          },
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM,       0                                   },
     { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
-                                                      AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
-    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0                                 },
-    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM,  0                                 },
-    { AF_BLUE_STRING_MAX,                             0                                 },
+                                                      AF_BLUE_PROPERTY_LATIN_X_HEIGHT     },
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM },
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP,     AF_BLUE_PROPERTY_LATIN_TOP          },
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM,  0                                   },
+    { AF_BLUE_STRING_MAX,                             0                                   },
     { AF_BLUE_STRING_CARIAN_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_CARIAN_BOTTOM, 0                          },
     { AF_BLUE_STRING_MAX,           0                          },
@@ -527,24 +527,24 @@
     { AF_BLUE_STRING_CHEROKEE_SMALL,           0                                 },
     { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0                                 },
     { AF_BLUE_STRING_MAX,                      0                                 },
-    { AF_BLUE_STRING_COPTIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0                                 },
+    { AF_BLUE_STRING_COPTIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP            },
+    { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
     { AF_BLUE_STRING_COPTIC_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
-                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
-    { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM,   0                                 },
-    { AF_BLUE_STRING_MAX,                   0                                 },
+                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT       },
+    { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM,   AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   },
+    { AF_BLUE_STRING_MAX,                   0                                     },
     { AF_BLUE_STRING_CYPRIOT_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_CYPRIOT_BOTTOM, 0                          },
     { AF_BLUE_STRING_CYPRIOT_SMALL,  AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_CYPRIOT_SMALL,  0                          },
     { AF_BLUE_STRING_MAX,            0                          },
-    { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM,  0                                 },
+    { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            },
+    { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM,  AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
     { AF_BLUE_STRING_CYRILLIC_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
-                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
-    { AF_BLUE_STRING_CYRILLIC_SMALL,           0                                 },
-    { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0                                 },
-    { AF_BLUE_STRING_MAX,                      0                                 },
+                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT       },
+    { AF_BLUE_STRING_CYRILLIC_SMALL,           0                                     },
+    { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0                                     },
+    { AF_BLUE_STRING_MAX,                      0                                     },
     { AF_BLUE_STRING_DEVANAGARI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        },
     { AF_BLUE_STRING_DEVANAGARI_HEAD,   AF_BLUE_PROPERTY_LATIN_TOP        },
     { AF_BLUE_STRING_DEVANAGARI_BASE,   AF_BLUE_PROPERTY_LATIN_TOP      |
@@ -553,12 +553,12 @@
     { AF_BLUE_STRING_DEVANAGARI_BASE,   0                                 },
     { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0                                 },
     { AF_BLUE_STRING_MAX,               0                                 },
-    { AF_BLUE_STRING_DESERET_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0                                 },
+    { AF_BLUE_STRING_DESERET_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP            },
+    { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
     { AF_BLUE_STRING_DESERET_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
-                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
-    { AF_BLUE_STRING_DESERET_SMALL_BOTTOM,   0                                 },
-    { AF_BLUE_STRING_MAX,                    0                                 },
+                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT       },
+    { AF_BLUE_STRING_DESERET_SMALL_BOTTOM,   AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   },
+    { AF_BLUE_STRING_MAX,                    0                                     },
     { AF_BLUE_STRING_ETHIOPIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0                          },
     { AF_BLUE_STRING_MAX,             0                          },
@@ -578,23 +578,23 @@
     { AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        },
     { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0                                 },
     { AF_BLUE_STRING_MAX,                         0                                 },
-    { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0                                 },
+    { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP            },
+    { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
     { AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
-                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
-    { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM,   0                                 },
-    { AF_BLUE_STRING_MAX,                       0                                 },
+                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT       },
+    { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM,   AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   },
+    { AF_BLUE_STRING_MAX,                       0                                     },
     { AF_BLUE_STRING_GOTHIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_GOTHIC_BOTTOM, 0                          },
     { AF_BLUE_STRING_MAX,           0                          },
-    { AF_BLUE_STRING_GREEK_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM,  0                                 },
-    { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP,  AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_GREEK_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            },
+    { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM,  AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
+    { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP,  AF_BLUE_PROPERTY_LATIN_TOP            },
     { AF_BLUE_STRING_GREEK_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
-                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
-    { AF_BLUE_STRING_GREEK_SMALL,           0                                 },
-    { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0                                 },
-    { AF_BLUE_STRING_MAX,                   0                                 },
+                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT       },
+    { AF_BLUE_STRING_GREEK_SMALL,           0                                     },
+    { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0                                     },
+    { AF_BLUE_STRING_MAX,                   0                                     },
     { AF_BLUE_STRING_GUJARATI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
                                          AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
     { AF_BLUE_STRING_GUJARATI_BOTTOM,    0                                 },
@@ -643,45 +643,45 @@
     { AF_BLUE_STRING_LAO_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP        },
     { AF_BLUE_STRING_LAO_DESCENDER,      0                                 },
     { AF_BLUE_STRING_MAX,                0                                 },
-    { AF_BLUE_STRING_LATIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM,  0                                 },
-    { AF_BLUE_STRING_LATIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_LATIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            },
+    { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM,  AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
+    { AF_BLUE_STRING_LATIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            },
     { AF_BLUE_STRING_LATIN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
-                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
-    { AF_BLUE_STRING_LATIN_SMALL_BOTTOM,    0                                 },
-    { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0                                 },
-    { AF_BLUE_STRING_MAX,                   0                                 },
-    { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM,  0                                 },
-    { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
+                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT       },
+    { AF_BLUE_STRING_LATIN_SMALL_BOTTOM,    AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   },
+    { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0                                     },
+    { AF_BLUE_STRING_MAX,                   0                                     },
+    { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            },
+    { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM,  AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
+    { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            },
     { AF_BLUE_STRING_LATIN_SUBS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
-                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
-    { AF_BLUE_STRING_LATIN_SUBS_SMALL,           0                                 },
-    { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0                                 },
-    { AF_BLUE_STRING_MAX,                        0                                 },
-    { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM,  0                                 },
-    { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
+                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT       },
+    { AF_BLUE_STRING_LATIN_SUBS_SMALL,           0                                     },
+    { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0                                     },
+    { AF_BLUE_STRING_MAX,                        0                                     },
+    { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            },
+    { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM,  AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
+    { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            },
     { AF_BLUE_STRING_LATIN_SUPS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
-                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
-    { AF_BLUE_STRING_LATIN_SUPS_SMALL,           0                                 },
-    { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0                                 },
-    { AF_BLUE_STRING_MAX,                        0                                 },
+                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT       },
+    { AF_BLUE_STRING_LATIN_SUPS_SMALL,           0                                     },
+    { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0                                     },
+    { AF_BLUE_STRING_MAX,                        0                                     },
     { AF_BLUE_STRING_LISU_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_LISU_BOTTOM, 0                          },
     { AF_BLUE_STRING_MAX,         0                          },
     { AF_BLUE_STRING_MALAYALAM_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0                          },
     { AF_BLUE_STRING_MAX,              0                          },
-    { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM,  0                                 },
-    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            },
+    { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM,  AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
+    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            },
     { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
-                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
-    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM,    0                                 },
-    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER, 0                                 },
-    { AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP,       AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_MAX,                         0                                 },
+                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT       },
+    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM,    AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   },
+    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER, 0                                     },
+    { AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP,       AF_BLUE_PROPERTY_LATIN_TOP            },
+    { AF_BLUE_STRING_MAX,                         0                                     },
     { AF_BLUE_STRING_MONGOLIAN_TOP_BASE,    AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE, 0                          },
     { AF_BLUE_STRING_MAX,                   0                          },
@@ -691,12 +691,12 @@
     { AF_BLUE_STRING_MYANMAR_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        },
     { AF_BLUE_STRING_MYANMAR_DESCENDER, 0                                 },
     { AF_BLUE_STRING_MAX,               0                                 },
-    { AF_BLUE_STRING_NKO_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_NKO_BOTTOM,       0                                 },
+    { AF_BLUE_STRING_NKO_TOP,          AF_BLUE_PROPERTY_LATIN_TOP          },
+    { AF_BLUE_STRING_NKO_BOTTOM,       0                                   },
     { AF_BLUE_STRING_NKO_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
-                                       AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
-    { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0                                 },
-    { AF_BLUE_STRING_MAX,              0                                 },
+                                       AF_BLUE_PROPERTY_LATIN_X_HEIGHT     },
+    { AF_BLUE_STRING_NKO_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM },
+    { AF_BLUE_STRING_MAX,              0                                   },
     { AF_BLUE_STRING_MAX, 0 },
     { AF_BLUE_STRING_OL_CHIKI, AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_OL_CHIKI, 0                          },
@@ -704,15 +704,15 @@
     { AF_BLUE_STRING_OLD_TURKIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_OLD_TURKIC_BOTTOM, 0                          },
     { AF_BLUE_STRING_MAX,               0                          },
-    { AF_BLUE_STRING_OSAGE_CAPITAL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP       },
-    { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM,    0                                },
-    { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0                                },
-    { AF_BLUE_STRING_OSAGE_SMALL_TOP,         AF_BLUE_PROPERTY_LATIN_TOP     |
-                                              AF_BLUE_PROPERTY_LATIN_X_HEIGHT  },
-    { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM,      0                                },
-    { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER,    AF_BLUE_PROPERTY_LATIN_TOP       },
-    { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER,   0                                },
-    { AF_BLUE_STRING_MAX,                     0                                },
+    { AF_BLUE_STRING_OSAGE_CAPITAL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP            },
+    { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM,    AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM },
+    { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0                                     },
+    { AF_BLUE_STRING_OSAGE_SMALL_TOP,         AF_BLUE_PROPERTY_LATIN_TOP      |
+                                              AF_BLUE_PROPERTY_LATIN_X_HEIGHT       },
+    { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM,      AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   },
+    { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER,    AF_BLUE_PROPERTY_LATIN_TOP            },
+    { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER,   0                                     },
+    { AF_BLUE_STRING_MAX,                     0                                     },
     { AF_BLUE_STRING_OSMANYA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_OSMANYA_BOTTOM, 0                          },
     { AF_BLUE_STRING_MAX,            0                          },
@@ -723,13 +723,13 @@
     { AF_BLUE_STRING_SAURASHTRA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0                          },
     { AF_BLUE_STRING_MAX,               0                          },
-    { AF_BLUE_STRING_SHAVIAN_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_SHAVIAN_BOTTOM,       0                                 },
-    { AF_BLUE_STRING_SHAVIAN_DESCENDER,    0                                 },
+    { AF_BLUE_STRING_SHAVIAN_TOP,          AF_BLUE_PROPERTY_LATIN_TOP          },
+    { AF_BLUE_STRING_SHAVIAN_BOTTOM,       0                                   },
+    { AF_BLUE_STRING_SHAVIAN_DESCENDER,    0                                   },
     { AF_BLUE_STRING_SHAVIAN_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
-                                           AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
-    { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0                                 },
-    { AF_BLUE_STRING_MAX,                  0                                 },
+                                           AF_BLUE_PROPERTY_LATIN_X_HEIGHT     },
+    { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM },
+    { AF_BLUE_STRING_MAX,                  0                                   },
     { AF_BLUE_STRING_SINHALA_TOP,       AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_SINHALA_BOTTOM,    0                          },
     { AF_BLUE_STRING_SINHALA_DESCENDER, 0                          },
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afblue.cin openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afblue.cin
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afblue.cin	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afblue.cin	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter data for blue strings (body).
  *
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afblue.dat openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afblue.dat
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afblue.dat	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afblue.dat	2026-04-17 19:09:35.000000000 +0000
@@ -2,7 +2,7 @@
 //
 //   Auto-fitter data for blue strings.
 //
-// Copyright (C) 2013-2024 by
+// Copyright (C) 2013-2025 by
 // David Turner, Robert Wilhelm, and Werner Lemberg.
 //
 // This file is part of the FreeType project, and may only be used,
@@ -699,12 +699,12 @@
 AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
 
   AF_BLUE_STRINGSET_ADLM
-    { AF_BLUE_STRING_ADLAM_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0                                 }
+    { AF_BLUE_STRING_ADLAM_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP            }
+    { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
     { AF_BLUE_STRING_ADLAM_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
-                                           AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
-    { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM,   0                                 }
-    { AF_BLUE_STRING_MAX,                  0                                 }
+                                           AF_BLUE_PROPERTY_LATIN_X_HEIGHT       }
+    { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM,   AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   }
+    { AF_BLUE_STRING_MAX,                  0                                     }
 
   AF_BLUE_STRINGSET_ARAB
     { AF_BLUE_STRING_ARABIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP     }
@@ -713,14 +713,14 @@
     { AF_BLUE_STRING_MAX,           0                              }
 
   AF_BLUE_STRINGSET_ARMN
-    { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM,  0                                 }
-    { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            }
+    { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM,  AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
+    { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP            }
     { AF_BLUE_STRING_ARMENIAN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
-                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
-    { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM,    0                                 }
-    { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0                                 }
-    { AF_BLUE_STRING_MAX,                      0                                 }
+                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT       }
+    { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM,    AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   }
+    { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0                                     }
+    { AF_BLUE_STRING_MAX,                      0                                     }
 
   AF_BLUE_STRINGSET_AVST
     { AF_BLUE_STRING_AVESTAN_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
@@ -756,14 +756,14 @@
     { AF_BLUE_STRING_MAX,              0                          }
 
   AF_BLUE_STRINGSET_CANS
-    { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM,       0                                 }
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP,          AF_BLUE_PROPERTY_LATIN_TOP          }
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM,       0                                   }
     { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
-                                                      AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
-    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0                                 }
-    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM,  0                                 }
-    { AF_BLUE_STRING_MAX,                             0                                 }
+                                                      AF_BLUE_PROPERTY_LATIN_X_HEIGHT     }
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM }
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP,     AF_BLUE_PROPERTY_LATIN_TOP          }
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM,  0                                   }
+    { AF_BLUE_STRING_MAX,                             0                                   }
 
   AF_BLUE_STRINGSET_CARI
     { AF_BLUE_STRING_CARIAN_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
@@ -781,12 +781,12 @@
     { AF_BLUE_STRING_MAX,                      0                                 }
 
   AF_BLUE_STRINGSET_COPT
-    { AF_BLUE_STRING_COPTIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0                                 }
+    { AF_BLUE_STRING_COPTIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP            }
+    { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
     { AF_BLUE_STRING_COPTIC_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
-                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
-    { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM,   0                                 }
-    { AF_BLUE_STRING_MAX,                   0                                 }
+                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT       }
+    { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM,   AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   }
+    { AF_BLUE_STRING_MAX,                   0                                     }
 
   AF_BLUE_STRINGSET_CPRT
     { AF_BLUE_STRING_CYPRIOT_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
@@ -796,13 +796,13 @@
     { AF_BLUE_STRING_MAX,            0                          }
 
   AF_BLUE_STRINGSET_CYRL
-    { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM,  0                                 }
+    { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            }
+    { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM,  AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
     { AF_BLUE_STRING_CYRILLIC_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
-                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
-    { AF_BLUE_STRING_CYRILLIC_SMALL,           0                                 }
-    { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0                                 }
-    { AF_BLUE_STRING_MAX,                      0                                 }
+                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT       }
+    { AF_BLUE_STRING_CYRILLIC_SMALL,           0                                     }
+    { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0                                     }
+    { AF_BLUE_STRING_MAX,                      0                                     }
 
   AF_BLUE_STRINGSET_DEVA
     { AF_BLUE_STRING_DEVANAGARI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
@@ -815,12 +815,12 @@
     { AF_BLUE_STRING_MAX,               0                                 }
 
   AF_BLUE_STRINGSET_DSRT
-    { AF_BLUE_STRING_DESERET_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0                                 }
+    { AF_BLUE_STRING_DESERET_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP            }
+    { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
     { AF_BLUE_STRING_DESERET_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
-                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
-    { AF_BLUE_STRING_DESERET_SMALL_BOTTOM,   0                                 }
-    { AF_BLUE_STRING_MAX,                    0                                 }
+                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT       }
+    { AF_BLUE_STRING_DESERET_SMALL_BOTTOM,   AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   }
+    { AF_BLUE_STRING_MAX,                    0                                     }
 
   AF_BLUE_STRINGSET_ETHI
     { AF_BLUE_STRING_ETHIOPIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
@@ -848,12 +848,12 @@
     { AF_BLUE_STRING_MAX,                         0                                 }
 
   AF_BLUE_STRINGSET_GLAG
-    { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0                                 }
+    { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP            }
+    { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
     { AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
-                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
-    { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM,   0                                 }
-    { AF_BLUE_STRING_MAX,                       0                                 }
+                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT       }
+    { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM,   AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   }
+    { AF_BLUE_STRING_MAX,                       0                                     }
 
   AF_BLUE_STRINGSET_GOTH
     { AF_BLUE_STRING_GOTHIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
@@ -861,14 +861,14 @@
     { AF_BLUE_STRING_MAX,           0                          }
 
   AF_BLUE_STRINGSET_GREK
-    { AF_BLUE_STRING_GREEK_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM,  0                                 }
-    { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP,  AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_GREEK_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            }
+    { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM,  AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
+    { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP,  AF_BLUE_PROPERTY_LATIN_TOP            }
     { AF_BLUE_STRING_GREEK_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
-                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
-    { AF_BLUE_STRING_GREEK_SMALL,           0                                 }
-    { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0                                 }
-    { AF_BLUE_STRING_MAX,                   0                                 }
+                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT       }
+    { AF_BLUE_STRING_GREEK_SMALL,           0                                     }
+    { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0                                     }
+    { AF_BLUE_STRING_MAX,                   0                                     }
 
   AF_BLUE_STRINGSET_GUJR
     { AF_BLUE_STRING_GUJARATI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
@@ -935,34 +935,34 @@
     { AF_BLUE_STRING_MAX,                0                                 }
 
   AF_BLUE_STRINGSET_LATN
-    { AF_BLUE_STRING_LATIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM,  0                                 }
-    { AF_BLUE_STRING_LATIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_LATIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            }
+    { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM,  AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
+    { AF_BLUE_STRING_LATIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            }
     { AF_BLUE_STRING_LATIN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
-                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
-    { AF_BLUE_STRING_LATIN_SMALL_BOTTOM,    0                                 }
-    { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0                                 }
-    { AF_BLUE_STRING_MAX,                   0                                 }
+                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT       }
+    { AF_BLUE_STRING_LATIN_SMALL_BOTTOM,    AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   }
+    { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0                                     }
+    { AF_BLUE_STRING_MAX,                   0                                     }
 
   AF_BLUE_STRINGSET_LATB
-    { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM,  0                                 }
-    { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            }
+    { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM,  AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
+    { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            }
     { AF_BLUE_STRING_LATIN_SUBS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
-                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
-    { AF_BLUE_STRING_LATIN_SUBS_SMALL,           0                                 }
-    { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0                                 }
-    { AF_BLUE_STRING_MAX,                        0                                 }
+                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT       }
+    { AF_BLUE_STRING_LATIN_SUBS_SMALL,           0                                     }
+    { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0                                     }
+    { AF_BLUE_STRING_MAX,                        0                                     }
 
   AF_BLUE_STRINGSET_LATP
-    { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM,  0                                 }
-    { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            }
+    { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM,  AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
+    { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            }
     { AF_BLUE_STRING_LATIN_SUPS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
-                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
-    { AF_BLUE_STRING_LATIN_SUPS_SMALL,           0                                 }
-    { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0                                 }
-    { AF_BLUE_STRING_MAX,                        0                                 }
+                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT       }
+    { AF_BLUE_STRING_LATIN_SUPS_SMALL,           0                                     }
+    { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0                                     }
+    { AF_BLUE_STRING_MAX,                        0                                     }
 
   AF_BLUE_STRINGSET_LISU
     { AF_BLUE_STRING_LISU_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
@@ -975,15 +975,15 @@
     { AF_BLUE_STRING_MAX,              0                          }
 
   AF_BLUE_STRINGSET_MEDF
-    { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM,  0                                 }
-    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            }
+    { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM,  AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
+    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP            }
     { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
-                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
-    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM,    0                                 }
-    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER, 0                                 }
-    { AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP,       AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_MAX,                         0                                 }
+                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT       }
+    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM,    AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   }
+    { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER, 0                                     }
+    { AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP,       AF_BLUE_PROPERTY_LATIN_TOP            }
+    { AF_BLUE_STRING_MAX,                         0                                     }
 
   AF_BLUE_STRINGSET_MONG
     { AF_BLUE_STRING_MONGOLIAN_TOP_BASE,    AF_BLUE_PROPERTY_LATIN_TOP }
@@ -999,12 +999,12 @@
     { AF_BLUE_STRING_MAX,               0                                 }
 
   AF_BLUE_STRINGSET_NKOO
-    { AF_BLUE_STRING_NKO_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_NKO_BOTTOM,       0                                 }
+    { AF_BLUE_STRING_NKO_TOP,          AF_BLUE_PROPERTY_LATIN_TOP          }
+    { AF_BLUE_STRING_NKO_BOTTOM,       0                                   }
     { AF_BLUE_STRING_NKO_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
-                                       AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
-    { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0                                 }
-    { AF_BLUE_STRING_MAX,              0                                 }
+                                       AF_BLUE_PROPERTY_LATIN_X_HEIGHT     }
+    { AF_BLUE_STRING_NKO_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM }
+    { AF_BLUE_STRING_MAX,              0                                   }
 
   AF_BLUE_STRINGSET_NONE
     { AF_BLUE_STRING_MAX, 0 }
@@ -1020,15 +1020,15 @@
     { AF_BLUE_STRING_MAX,               0                          }
 
   AF_BLUE_STRINGSET_OSGE
-    { AF_BLUE_STRING_OSAGE_CAPITAL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP       }
-    { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM,    0                                }
-    { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0                                }
-    { AF_BLUE_STRING_OSAGE_SMALL_TOP,         AF_BLUE_PROPERTY_LATIN_TOP     |
-                                              AF_BLUE_PROPERTY_LATIN_X_HEIGHT  }
-    { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM,      0                                }
-    { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER,    AF_BLUE_PROPERTY_LATIN_TOP       }
-    { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER,   0                                }
-    { AF_BLUE_STRING_MAX,                     0                                }
+    { AF_BLUE_STRING_OSAGE_CAPITAL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP            }
+    { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM,    AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM }
+    { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0                                     }
+    { AF_BLUE_STRING_OSAGE_SMALL_TOP,         AF_BLUE_PROPERTY_LATIN_TOP      |
+                                              AF_BLUE_PROPERTY_LATIN_X_HEIGHT       }
+    { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM,      AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM   }
+    { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER,    AF_BLUE_PROPERTY_LATIN_TOP            }
+    { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER,   0                                     }
+    { AF_BLUE_STRING_MAX,                     0                                     }
 
   AF_BLUE_STRINGSET_OSMA
     { AF_BLUE_STRING_OSMANYA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
@@ -1047,13 +1047,13 @@
     { AF_BLUE_STRING_MAX,               0                          }
 
   AF_BLUE_STRINGSET_SHAW
-    { AF_BLUE_STRING_SHAVIAN_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_SHAVIAN_BOTTOM,       0                                 }
-    { AF_BLUE_STRING_SHAVIAN_DESCENDER,    0                                 }
+    { AF_BLUE_STRING_SHAVIAN_TOP,          AF_BLUE_PROPERTY_LATIN_TOP          }
+    { AF_BLUE_STRING_SHAVIAN_BOTTOM,       0                                   }
+    { AF_BLUE_STRING_SHAVIAN_DESCENDER,    0                                   }
     { AF_BLUE_STRING_SHAVIAN_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
-                                           AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
-    { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0                                 }
-    { AF_BLUE_STRING_MAX,                  0                                 }
+                                           AF_BLUE_PROPERTY_LATIN_X_HEIGHT     }
+    { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM }
+    { AF_BLUE_STRING_MAX,                  0                                   }
 
   AF_BLUE_STRINGSET_SINH
     { AF_BLUE_STRING_SINHALA_TOP,       AF_BLUE_PROPERTY_LATIN_TOP }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afblue.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afblue.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afblue.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afblue.h	2026-04-17 19:09:35.000000000 +0000
@@ -7,7 +7,7 @@
  *
  *   Auto-fitter data for blue strings (specification).
  *
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -314,14 +314,17 @@
   /* Properties are specific to a writing system.  We assume that a given  */
   /* blue string can't be used in more than a single writing system, which */
   /* is a safe bet.                                                        */
-#define AF_BLUE_PROPERTY_LATIN_TOP       ( 1U << 0 )  /* must have value 1 */
+#define AF_BLUE_PROPERTY_LATIN_TOP       ( 1U << 0 )    /* must be value 1 */
 #define AF_BLUE_PROPERTY_LATIN_SUB_TOP   ( 1U << 1 )
 #define AF_BLUE_PROPERTY_LATIN_NEUTRAL   ( 1U << 2 )
 #define AF_BLUE_PROPERTY_LATIN_X_HEIGHT  ( 1U << 3 )
 #define AF_BLUE_PROPERTY_LATIN_LONG      ( 1U << 4 )
 
-#define AF_BLUE_PROPERTY_CJK_TOP    ( 1U << 0 )       /* must have value 1 */
-#define AF_BLUE_PROPERTY_CJK_HORIZ  ( 1U << 1 )       /* must have value 2 */
+#define AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM  ( 1U << 5 )
+#define AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM    ( 1U << 6 )
+
+#define AF_BLUE_PROPERTY_CJK_TOP    ( 1U << 0 )         /* must be value 1 */
+#define AF_BLUE_PROPERTY_CJK_HORIZ  ( 1U << 1 )         /* must be value 2 */
 #define AF_BLUE_PROPERTY_CJK_RIGHT  AF_BLUE_PROPERTY_CJK_TOP
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afblue.hin openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afblue.hin
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afblue.hin	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afblue.hin	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter data for blue strings (specification).
  *
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -99,14 +99,17 @@
   /* Properties are specific to a writing system.  We assume that a given  */
   /* blue string can't be used in more than a single writing system, which */
   /* is a safe bet.                                                        */
-#define AF_BLUE_PROPERTY_LATIN_TOP       ( 1U << 0 )  /* must have value 1 */
+#define AF_BLUE_PROPERTY_LATIN_TOP       ( 1U << 0 )    /* must be value 1 */
 #define AF_BLUE_PROPERTY_LATIN_SUB_TOP   ( 1U << 1 )
 #define AF_BLUE_PROPERTY_LATIN_NEUTRAL   ( 1U << 2 )
 #define AF_BLUE_PROPERTY_LATIN_X_HEIGHT  ( 1U << 3 )
 #define AF_BLUE_PROPERTY_LATIN_LONG      ( 1U << 4 )
 
-#define AF_BLUE_PROPERTY_CJK_TOP    ( 1U << 0 )       /* must have value 1 */
-#define AF_BLUE_PROPERTY_CJK_HORIZ  ( 1U << 1 )       /* must have value 2 */
+#define AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM  ( 1U << 5 )
+#define AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM    ( 1U << 6 )
+
+#define AF_BLUE_PROPERTY_CJK_TOP    ( 1U << 0 )         /* must be value 1 */
+#define AF_BLUE_PROPERTY_CJK_HORIZ  ( 1U << 1 )         /* must be value 2 */
 #define AF_BLUE_PROPERTY_CJK_RIGHT  AF_BLUE_PROPERTY_CJK_TOP
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter hinting routines for CJK writing system (body).
  *
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -90,12 +90,8 @@
 
       /* If HarfBuzz is not available, we need a pointer to a single */
       /* unsigned long value.                                        */
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-      void*     shaper_buf;
-#else
       FT_ULong  shaper_buf_;
       void*     shaper_buf = &shaper_buf_;
-#endif
 
       const char*  p;
 
@@ -105,9 +101,8 @@
 
       p = script_class->standard_charstring;
 
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-      shaper_buf = af_shaper_buf_create( face );
-#endif
+      if ( ft_hb_enabled( metrics->root.globals ) )
+        shaper_buf = af_shaper_buf_create( metrics->root.globals );
 
       /* We check a list of standard characters.  The first match wins. */
 
@@ -144,7 +139,7 @@
           break;
       }
 
-      af_shaper_buf_destroy( face, shaper_buf );
+      af_shaper_buf_destroy( metrics->root.globals, shaper_buf );
 
       if ( !glyph_index )
         goto Exit;
@@ -152,7 +147,7 @@
       if ( !glyph_index )
         goto Exit;
 
-      FT_TRACE5(( "standard character: U+%04lX (glyph index %ld)\n",
+      FT_TRACE5(( "standard character: U+%04lX (glyph index %lu)\n",
                   ch, glyph_index ));
 
       error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
@@ -297,12 +292,8 @@
 
     /* If HarfBuzz is not available, we need a pointer to a single */
     /* unsigned long value.                                        */
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-    void*     shaper_buf;
-#else
     FT_ULong  shaper_buf_;
     void*     shaper_buf = &shaper_buf_;
-#endif
 
 
     /* we walk over the blue character strings as specified in the   */
@@ -313,9 +304,8 @@
     FT_TRACE5(( "==========================\n" ));
     FT_TRACE5(( "\n" ));
 
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-    shaper_buf = af_shaper_buf_create( face );
-#endif
+    if ( ft_hb_enabled( metrics->root.globals ) )
+      shaper_buf = af_shaper_buf_create( metrics->root.globals );
 
     for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ )
     {
@@ -340,7 +330,7 @@
         };
 
 
-        FT_TRACE5(( "blue zone %d (%s):\n",
+        FT_TRACE5(( "blue zone %u (%s):\n",
                     axis->blue_count,
                     cjk_blue_name[AF_CJK_IS_HORIZ_BLUE( bs ) |
                                   AF_CJK_IS_TOP_BLUE( bs )   ] ));
@@ -553,7 +543,7 @@
 
     } /* end for loop */
 
-    af_shaper_buf_destroy( face, shaper_buf );
+    af_shaper_buf_destroy( metrics->root.globals, shaper_buf );
 
     FT_TRACE5(( "\n" ));
 
@@ -572,23 +562,20 @@
 
     /* If HarfBuzz is not available, we need a pointer to a single */
     /* unsigned long value.                                        */
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-    void*     shaper_buf;
-#else
     FT_ULong  shaper_buf_;
     void*     shaper_buf = &shaper_buf_;
-#endif
 
     /* in all supported charmaps, digits have character codes 0x30-0x39 */
     const char   digits[] = "0 1 2 3 4 5 6 7 8 9";
     const char*  p;
 
+    FT_UNUSED( face );
+
 
     p = digits;
 
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-    shaper_buf = af_shaper_buf_create( face );
-#endif
+    if ( ft_hb_enabled( metrics->root.globals ) )
+      shaper_buf = af_shaper_buf_create( metrics->root.globals );
 
     while ( *p )
     {
@@ -624,7 +611,7 @@
       }
     }
 
-    af_shaper_buf_destroy( face, shaper_buf );
+    af_shaper_buf_destroy( metrics->root.globals, shaper_buf );
 
     metrics->root.digits_have_same_width = same_width;
   }
@@ -710,7 +697,7 @@
         FT_Pos  delta1, delta2;
 
 
-        blue->ref.fit  = FT_PIX_ROUND( blue->ref.cur );
+        blue->ref.fit = FT_PIX_ROUND( blue->ref.cur );
 
         /* shoot is under shoot for cjk */
         delta1 = FT_DivFix( blue->ref.fit, scale ) - blue->shoot.org;
@@ -736,7 +723,7 @@
 
         blue->shoot.fit = blue->ref.fit - delta2;
 
-        FT_TRACE5(( ">> active cjk blue zone %c%d[%ld/%ld]:\n",
+        FT_TRACE5(( ">> active cjk blue zone %c%u[%ld/%ld]:\n",
                     ( dim == AF_DIMENSION_HORZ ) ? 'H' : 'V',
                     nn, blue->ref.org, blue->shoot.org ));
         FT_TRACE5(( "     ref:   cur=%.2f fit=%.2f\n",
@@ -1378,7 +1365,7 @@
   }
 
 
-  /* Initalize hinting engine. */
+  /* Initialize hinting engine. */
 
   FT_LOCAL_DEF( FT_Error )
   af_cjk_hints_init( AF_GlyphHints    hints,
@@ -2185,7 +2172,7 @@
   af_cjk_align_edge_points( AF_GlyphHints  hints,
                             AF_Dimension   dim )
   {
-    AF_AxisHints  axis       = & hints->axis[dim];
+    AF_AxisHints  axis       = &hints->axis[dim];
     AF_Edge       edges      = axis->edges;
     AF_Edge       edge_limit = FT_OFFSET( edges, axis->num_edges );
     AF_Edge       edge;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afcjk.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter hinting routines for CJK writing system (specification).
  *
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afcover.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afcover.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afcover.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afcover.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter coverages (specification only).
  *
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.c	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Auto-fitter dummy routines to be used if no hinting should be
  *   performed (body).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afdummy.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Auto-fitter dummy routines to be used if no hinting should be
  *   performed (specification).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/aferrors.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/aferrors.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/aferrors.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/aferrors.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Autofitter error codes (specification only).
  *
- * Copyright (C) 2005-2024 by
+ * Copyright (C) 2005-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter routines to compute global hinting values (body).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -22,6 +22,11 @@
 #include "afws-decl.h"
 #include 
 
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+#  include "afgsub.h"
+#  include "ft-hb-ft.h"
+#endif
+
 
   /**************************************************************************
    *
@@ -184,7 +189,7 @@
           if ( gindex != 0                                                &&
                gindex < globals->glyph_count                              &&
                ( gstyles[gindex] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED )
-            gstyles[gindex] = ss;
+            gstyles[gindex] = ss | AF_HAS_CMAP_ENTRY;
 
           for (;;)
           {
@@ -195,7 +200,7 @@
 
             if ( gindex < globals->glyph_count                              &&
                  ( gstyles[gindex] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED )
-              gstyles[gindex] = ss;
+              gstyles[gindex] = ss | AF_HAS_CMAP_ENTRY;
           }
         }
 
@@ -301,7 +306,7 @@
           if ( !( count % 10 ) )
             FT_TRACE4(( " " ));
 
-          FT_TRACE4(( " %d", idx ));
+          FT_TRACE4(( " %u", idx ));
           count++;
 
           if ( !( count % 10 ) )
@@ -356,8 +361,21 @@
     globals->scale_down_factor         = 0;
 
 #ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-    globals->hb_font = hb_ft_font_create_( face, NULL );
-    globals->hb_buf  = hb_buffer_create();
+    if ( ft_hb_enabled ( globals ) )
+    {
+      globals->hb_font = ft_hb_ft_font_create( globals );
+      globals->hb_buf  = hb( buffer_create )();
+
+      af_parse_gsub( globals );
+    }
+    else
+    {
+      globals->hb_font = NULL;
+      globals->hb_buf  = NULL;
+
+      globals->gsub                          = NULL;
+      globals->gsub_lookups_single_alternate = NULL;
+    }
 #endif
 
     error = af_face_globals_compute_style_coverage( globals );
@@ -405,8 +423,14 @@
       }
 
 #ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-      hb_font_destroy( globals->hb_font );
-      hb_buffer_destroy( globals->hb_buf );
+      if ( ft_hb_enabled ( globals ) )
+      {
+        hb( font_destroy )( globals->hb_font );
+        hb( buffer_destroy )( globals->hb_buf );
+
+        FT_FREE( globals->gsub );
+        FT_FREE( globals->gsub_lookups_single_alternate );
+      }
 #endif
 
       /* no need to free `globals->glyph_styles'; */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afglobal.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Auto-fitter routines to compute global hinting values
  *   (specification).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -73,15 +73,17 @@
   /* default script for OpenType; ignored if HarfBuzz isn't used */
 #define AF_SCRIPT_DEFAULT    AF_SCRIPT_LATN
 
-  /* a bit mask for AF_DIGIT and AF_NONBASE */
-#define AF_STYLE_MASK        0x3FFF
+  /* a bit mask for AF_DIGIT, AF_NONBASE, and AF_HAS_CMAP_ENTRY */
+#define AF_STYLE_MASK        0x1FFF
   /* an uncovered glyph      */
 #define AF_STYLE_UNASSIGNED  AF_STYLE_MASK
 
-  /* if this flag is set, we have an ASCII digit   */
+  /* if this flag is set, we have an ASCII digit */
 #define AF_DIGIT             0x8000U
   /* if this flag is set, we have a non-base character */
 #define AF_NONBASE           0x4000U
+  /* if this flag is set, the glyph has a (direct) cmap entry */
+#define AF_HAS_CMAP_ENTRY    0x2000U
 
   /* `increase-x-height' property */
 #define AF_PROP_INCREASE_X_HEIGHT_MIN  6
@@ -111,6 +113,13 @@
 #ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
     hb_font_t*       hb_font;
     hb_buffer_t*     hb_buf;           /* for feature comparison */
+
+    /* The GSUB table. */
+    FT_Byte*         gsub;
+    /* An array of lookup offsets (of `gsub_lookup_count` elements), */
+    /* with only SingleSubst and AlternateSubst lookups non-NULL.    */
+    FT_UShort        gsub_lookup_count;
+    FT_UInt32*       gsub_lookups_single_alternate;
 #endif
 
     /* per-face auto-hinter properties */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afhints.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afhints.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afhints.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afhints.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter hinting routines (body).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -840,6 +840,10 @@
 
     if ( hints->contours != hints->embedded.contours )
       FT_FREE( hints->contours );
+    if ( hints->contour_y_minima != hints->embedded.contour_y_minima )
+      FT_FREE( hints->contour_y_minima );
+    if ( hints->contour_y_maxima != hints->embedded.contour_y_maxima )
+      FT_FREE( hints->contour_y_maxima );
     hints->max_contours = 0;
     hints->num_contours = 0;
 
@@ -896,19 +900,30 @@
     {
       if ( !hints->contours )
       {
-        hints->contours     = hints->embedded.contours;
+        hints->contours         = hints->embedded.contours;
+        hints->contour_y_minima = hints->embedded.contour_y_minima;
+        hints->contour_y_maxima = hints->embedded.contour_y_maxima;
+
         hints->max_contours = AF_CONTOURS_EMBEDDED;
       }
     }
     else if ( new_max > old_max )
     {
       if ( hints->contours == hints->embedded.contours )
-        hints->contours = NULL;
+      {
+        hints->contours         = NULL;
+        hints->contour_y_minima = NULL;
+        hints->contour_y_maxima = NULL;
+      }
 
       new_max = ( new_max + 3 ) & ~3; /* round up to a multiple of 4 */
 
       if ( FT_RENEW_ARRAY( hints->contours, old_max, new_max ) )
         goto Exit;
+      if ( FT_RENEW_ARRAY( hints->contour_y_minima, old_max, new_max ) )
+        goto Exit;
+      if ( FT_RENEW_ARRAY( hints->contour_y_maxima, old_max, new_max ) )
+        goto Exit;
 
       hints->max_contours = new_max;
     }
@@ -1324,7 +1339,7 @@
   af_glyph_hints_align_edge_points( AF_GlyphHints  hints,
                                     AF_Dimension   dim )
   {
-    AF_AxisHints  axis          = & hints->axis[dim];
+    AF_AxisHints  axis          = &hints->axis[dim];
     AF_Segment    segments      = axis->segments;
     AF_Segment    segment_limit = FT_OFFSET( segments, axis->num_segments );
     AF_Segment    seg;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afhints.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afhints.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afhints.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afhints.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter hinting routines (specification).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -222,6 +222,9 @@
   /* the distance to the next point is very small */
 #define AF_FLAG_NEAR  ( 1U << 5 )
 
+  /* prevent the auto-hinter from adding such a point to a segment */
+#define AF_FLAG_IGNORE  ( 1U << 6 )
+
 
   /* edge hint flags */
 #define AF_EDGE_NORMAL  0
@@ -229,6 +232,7 @@
 #define AF_EDGE_SERIF    ( 1U << 1 )
 #define AF_EDGE_DONE     ( 1U << 2 )
 #define AF_EDGE_NEUTRAL  ( 1U << 3 ) /* edge aligns to a neutral blue zone */
+#define AF_EDGE_NO_BLUE  ( 1U << 4 ) /* do not align edge to blue zone     */
 
 
   typedef struct AF_PointRec_*    AF_Point;
@@ -303,6 +307,7 @@
 
   } AF_EdgeRec;
 
+
 #define AF_SEGMENTS_EMBEDDED  18   /* number of embedded segments   */
 #define AF_EDGES_EMBEDDED     12   /* number of embedded edges      */
 
@@ -346,9 +351,11 @@
     FT_Int           num_points;    /* number of used points      */
     AF_Point         points;        /* points array               */
 
-    FT_Int           max_contours;  /* number of allocated contours */
-    FT_Int           num_contours;  /* number of used contours      */
-    AF_Point*        contours;      /* contours array               */
+    FT_Int           max_contours;     /* number of allocated contours    */
+    FT_Int           num_contours;     /* number of used contours         */
+    AF_Point*        contours;         /* contours array                  */
+    FT_Pos*          contour_y_minima; /* array with y maxima of contours */
+    FT_Pos*          contour_y_maxima; /* array with y minima of contours */
 
     AF_AxisHintsRec  axis[AF_DIMENSION_MAX];
 
@@ -357,11 +364,13 @@
                                     /* implementations         */
     AF_StyleMetrics  metrics;
 
-    /* Two arrays to avoid allocation penalty.            */
+    /* Some arrays to avoid allocation penalty.           */
     /* The `embedded' structure must be the last element! */
     struct
     {
       AF_Point       contours[AF_CONTOURS_EMBEDDED];
+      FT_Pos         contour_y_minima[AF_CONTOURS_EMBEDDED];
+      FT_Pos         contour_y_maxima[AF_CONTOURS_EMBEDDED];
       AF_PointRec    points[AF_POINTS_EMBEDDED];
     } embedded;
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afindic.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afindic.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afindic.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afindic.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter hinting routines for Indic writing system (body).
  *
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
  * Rahul Bhalerao , .
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afindic.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afindic.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afindic.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afindic.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Auto-fitter hinting routines for Indic writing system
  *   (specification).
  *
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
  * Rahul Bhalerao , .
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter hinting routines for latin writing system (body).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -22,6 +22,7 @@
 #include "afglobal.h"
 #include "aflatin.h"
 #include "aferrors.h"
+#include "afadjust.h"
 
 
   /**************************************************************************
@@ -81,12 +82,8 @@
 
       /* If HarfBuzz is not available, we need a pointer to a single */
       /* unsigned long value.                                        */
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-      void*     shaper_buf;
-#else
       FT_ULong  shaper_buf_;
       void*     shaper_buf = &shaper_buf_;
-#endif
 
       const char*  p;
 
@@ -97,9 +94,9 @@
 
       p = script_class->standard_charstring;
 
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-      shaper_buf = af_shaper_buf_create( face );
-#endif
+      if ( ft_hb_enabled ( metrics->root.globals ) )
+        shaper_buf = af_shaper_buf_create( metrics->root.globals );
+
       /*
        * We check a list of standard characters to catch features like
        * `c2sc' (small caps from caps) that don't contain lowercase letters
@@ -140,7 +137,7 @@
           break;
       }
 
-      af_shaper_buf_destroy( face, shaper_buf );
+      af_shaper_buf_destroy( metrics->root.globals, shaper_buf );
 
       if ( !glyph_index )
       {
@@ -149,7 +146,7 @@
         goto Exit;
       }
 
-      FT_TRACE5(( "standard character: U+%04lX (glyph index %ld)\n",
+      FT_TRACE5(( "standard character: U+%04lX (glyph index %lu)\n",
                   ch, glyph_index ));
 
       error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
@@ -334,12 +331,8 @@
 
     /* If HarfBuzz is not available, we need a pointer to a single */
     /* unsigned long value.                                        */
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-    void*     shaper_buf;
-#else
     FT_ULong  shaper_buf_;
     void*     shaper_buf = &shaper_buf_;
-#endif
 
 
     /* we walk over the blue character strings as specified in the */
@@ -349,9 +342,8 @@
     FT_TRACE5(( "============================\n" ));
     FT_TRACE5(( "\n" ));
 
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-    shaper_buf = af_shaper_buf_create( face );
-#endif
+    if ( ft_hb_enabled ( metrics->root.globals ) )
+      shaper_buf = af_shaper_buf_create( metrics->root.globals );
 
     for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ )
     {
@@ -367,7 +359,7 @@
         FT_Bool  have_flag = 0;
 
 
-        FT_TRACE5(( "blue zone %d", axis->blue_count ));
+        FT_TRACE5(( "blue zone %u", axis->blue_count ));
 
         if ( bs->properties )
         {
@@ -407,6 +399,20 @@
             FT_TRACE5(( "long" ));
           }
 
+          if ( AF_LATIN_IS_CAPITAL_BOTTOM_BLUE( bs ) )
+          {
+            if ( have_flag )
+              FT_TRACE5(( ", " ));
+            FT_TRACE5(( "capital bottom" ));
+          }
+
+          if ( AF_LATIN_IS_SMALL_BOTTOM_BLUE( bs ) )
+          {
+            if ( have_flag )
+              FT_TRACE5(( ", " ));
+            FT_TRACE5(( "small bottom" ));
+          }
+
           FT_TRACE5(( ")" ));
         }
 
@@ -454,9 +460,9 @@
         }
 
         if ( AF_LATIN_IS_TOP_BLUE( bs ) )
-          best_y_extremum = FT_INT_MIN;
+          best_y_extremum = FT_LONG_MIN;
         else
-          best_y_extremum = FT_INT_MAX;
+          best_y_extremum = FT_LONG_MAX;
 
         /* iterate over all glyph elements of the character cluster */
         /* and get the data of the `biggest' one                    */
@@ -487,7 +493,7 @@
             if ( num_idx == 1 )
               FT_TRACE5(( "  U+%04lX contains no (usable) outlines\n", ch ));
             else
-              FT_TRACE5(( "  component %d of cluster starting with U+%04lX"
+              FT_TRACE5(( "  component %u of cluster starting with U+%04lX"
                           " contains no (usable) outlines\n", i, ch ));
 #endif
             continue;
@@ -825,7 +831,7 @@
             if ( num_idx == 1 )
               FT_TRACE5(( "  U+%04lX: best_y = %5ld", ch, best_y ));
             else
-              FT_TRACE5(( "  component %d of cluster starting with U+%04lX:"
+              FT_TRACE5(( "  component %u of cluster starting with U+%04lX:"
                           " best_y = %5ld", i, ch, best_y ));
 #endif
 
@@ -879,8 +885,8 @@
 
         } /* end for loop */
 
-        if ( !( best_y_extremum == FT_INT_MIN ||
-                best_y_extremum == FT_INT_MAX ) )
+        if ( !( best_y_extremum == FT_LONG_MIN ||
+                best_y_extremum == FT_LONG_MAX ) )
         {
           if ( best_round )
             rounds[num_rounds++] = best_y_extremum;
@@ -959,6 +965,10 @@
         blue->flags |= AF_LATIN_BLUE_SUB_TOP;
       if ( AF_LATIN_IS_NEUTRAL_BLUE( bs ) )
         blue->flags |= AF_LATIN_BLUE_NEUTRAL;
+      if ( AF_LATIN_IS_CAPITAL_BOTTOM_BLUE( bs ) )
+        blue->flags |= AF_LATIN_BLUE_BOTTOM;
+      if ( AF_LATIN_IS_SMALL_BOTTOM_BLUE( bs ) )
+        blue->flags |= AF_LATIN_BLUE_BOTTOM_SMALL;
 
       /*
        * The following flag is used later to adjust the y and x scales
@@ -973,7 +983,7 @@
 
     } /* end for loop */
 
-    af_shaper_buf_destroy( face, shaper_buf );
+    af_shaper_buf_destroy( metrics->root.globals, shaper_buf );
 
     if ( axis->blue_count )
     {
@@ -1070,23 +1080,20 @@
 
     /* If HarfBuzz is not available, we need a pointer to a single */
     /* unsigned long value.                                        */
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-    void*     shaper_buf;
-#else
     FT_ULong  shaper_buf_;
     void*     shaper_buf = &shaper_buf_;
-#endif
 
     /* in all supported charmaps, digits have character codes 0x30-0x39 */
     const char   digits[] = "0 1 2 3 4 5 6 7 8 9";
     const char*  p;
 
+    FT_UNUSED( face );
+
 
     p = digits;
 
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-    shaper_buf = af_shaper_buf_create( face );
-#endif
+    if ( ft_hb_enabled ( metrics->root.globals ) )
+      shaper_buf = af_shaper_buf_create( metrics->root.globals );
 
     while ( *p )
     {
@@ -1122,7 +1129,7 @@
       }
     }
 
-    af_shaper_buf_destroy( face, shaper_buf );
+    af_shaper_buf_destroy( metrics->root.globals, shaper_buf );
 
     metrics->root.digits_have_same_width = same_width;
   }
@@ -1155,6 +1162,9 @@
       af_latin_metrics_check_digits( metrics, face );
     }
 
+    af_reverse_character_map_new( &metrics->root.reverse_charmap,
+                                  &metrics->root );
+
   Exit:
     face->charmap = oldmap;
     return error;
@@ -1263,7 +1273,7 @@
               max_height = FT_MAX( max_height, -Axis->blues[nn].descender );
             }
 
-            dist  = FT_MulFix( max_height, new_scale - scale );
+            dist = FT_MulFix( max_height, new_scale - scale );
 
             if ( -128 < dist && dist < 128 )
             {
@@ -1466,13 +1476,13 @@
         AF_LatinBlue  blue = &axis->blues[nn];
 
 
-        FT_TRACE5(( "  reference %d: %ld scaled to %.2f%s\n",
+        FT_TRACE5(( "  reference %u: %ld scaled to %.2f%s\n",
                     nn,
                     blue->ref.org,
                     (double)blue->ref.fit / 64,
                     ( blue->flags & AF_LATIN_BLUE_ACTIVE ) ? ""
                                                            : " (inactive)" ));
-        FT_TRACE5(( "  overshoot %d: %ld scaled to %.2f%s\n",
+        FT_TRACE5(( "  overshoot %u: %ld scaled to %.2f%s\n",
                     nn,
                     blue->shoot.org,
                     (double)blue->shoot.fit / 64,
@@ -1484,6 +1494,17 @@
   }
 
 
+  FT_CALLBACK_DEF( void )
+  af_latin_metrics_done( AF_StyleMetrics  metrics_ )
+  {
+    AF_LatinMetrics  metrics = (AF_LatinMetrics)metrics_;
+
+
+    af_reverse_character_map_done( metrics->root.reverse_charmap,
+                                   metrics->root.globals->face->memory );
+  }
+
+
   /* Scale global values in both directions. */
 
   FT_LOCAL_DEF( void )
@@ -1617,7 +1638,8 @@
       FT_Pos     prev_max_on_coord = max_on_coord;
 
 
-      if ( FT_ABS( last->out_dir )  == major_dir &&
+      if ( !( point->flags & AF_FLAG_IGNORE )    &&
+           FT_ABS( last->out_dir )  == major_dir &&
            FT_ABS( point->out_dir ) == major_dir )
       {
         /* we are already on an edge, try to locate its start */
@@ -1676,13 +1698,17 @@
               max_on_coord = v;
           }
 
-          if ( point->out_dir != segment_dir || point == last )
+          if ( point->flags & AF_FLAG_IGNORE ||
+               point->out_dir != segment_dir ||
+               point == last )
           {
             /* check whether the new segment's start point is identical to */
             /* the previous segment's end point; for example, this might   */
             /* happen for spikes                                           */
 
-            if ( !prev_segment || segment->first != prev_segment->last )
+            if ( point->flags & AF_FLAG_IGNORE        ||
+                 !prev_segment                        ||
+                 segment->first != prev_segment->last )
             {
               /* points are different: we are just leaving an edge, thus */
               /* record a new segment                                    */
@@ -1842,7 +1868,8 @@
         /* if we are not on an edge, check whether the major direction */
         /* coincides with the current point's `out' direction, or      */
         /* whether we have a single-point contour                      */
-        if ( !on_edge                                  &&
+        if ( !( point->flags & AF_FLAG_IGNORE )        &&
+             !on_edge                                  &&
              ( FT_ABS( point->out_dir ) == major_dir ||
                point == point->prev                  ) )
         {
@@ -2521,6 +2548,9 @@
       FT_Pos    best_dist;                 /* initial threshold */
 
 
+      if ( edge->flags & AF_EDGE_NO_BLUE )
+        continue;
+
       /* compute the initial threshold as a fraction of the EM size */
       /* (the value 40 is heuristic)                                */
       best_dist = FT_MulFix( metrics->units_per_em / 40, scale );
@@ -2610,7 +2640,7 @@
   }
 
 
-  /* Initalize hinting engine. */
+  /* Initialize hinting engine. */
 
   static FT_Error
   af_latin_hints_init( AF_GlyphHints    hints,
@@ -2737,6 +2767,1198 @@
   }
 
 
+#undef  FT_COMPONENT
+#define FT_COMPONENT  afadjust
+
+
+  static void
+  af_move_contour_vertically( AF_Point  contour,
+                              FT_Int    movement )
+  {
+    AF_Point  point       = contour;
+    AF_Point  first_point = point;
+
+
+    if ( point )
+    {
+      do
+      {
+        point->y += movement;
+        point     = point->next;
+
+      } while ( point != first_point );
+    }
+  }
+
+
+  /* Move all contours higher than `limit` by `delta`. */
+  static void
+  af_move_contours_up( AF_GlyphHints  hints,
+                       FT_Pos         limit,
+                       FT_Pos         delta )
+  {
+    FT_Int  contour;
+
+
+    for ( contour = 0; contour < hints->num_contours; contour++ )
+    {
+      FT_Pos  min_y = hints->contour_y_minima[contour];
+      FT_Pos  max_y = hints->contour_y_maxima[contour];
+
+
+      if ( min_y < max_y &&
+           min_y > limit )
+        af_move_contour_vertically( hints->contours[contour],
+                                    delta );
+    }
+  }
+
+
+  static void
+  af_move_contours_down( AF_GlyphHints  hints,
+                         FT_Pos         limit,
+                         FT_Pos         delta )
+  {
+    FT_Int  contour;
+
+
+    for ( contour = 0; contour < hints->num_contours; contour++ )
+    {
+      FT_Pos  min_y = hints->contour_y_minima[contour];
+      FT_Pos  max_y = hints->contour_y_maxima[contour];
+
+
+      if ( min_y < max_y &&
+           max_y < limit )
+        af_move_contour_vertically( hints->contours[contour],
+                                    -delta );
+    }
+  }
+
+
+  /* Compute vertical extrema of all contours and store them in the */
+  /* `contour_y_minima` and `contour_y_maxima` arrays of `hints`.   */
+  static void
+  af_compute_vertical_extrema( AF_GlyphHints  hints )
+  {
+    FT_Int  contour;
+
+
+    for ( contour = 0; contour < hints->num_contours; contour++ )
+    {
+      FT_Pos  min_y = FT_LONG_MAX;
+      FT_Pos  max_y = FT_LONG_MIN;
+
+      AF_Point  first_point = hints->contours[contour];
+      AF_Point  point       = first_point;
+
+
+      if ( !first_point || first_point->next->next == first_point )
+        goto End_loop;
+
+      do
+      {
+        if ( point->y < min_y )
+          min_y = point->y;
+        if ( point->y > max_y )
+          max_y = point->y;
+
+        point = point->next;
+
+      } while ( point != first_point );
+
+    End_loop:
+      hints->contour_y_minima[contour] = min_y;
+      hints->contour_y_maxima[contour] = max_y;
+    }
+  }
+
+
+  static FT_Int
+  af_find_highest_contour( AF_GlyphHints  hints )
+  {
+    FT_Int  highest_contour = 0;
+    FT_Pos  highest_min_y   = FT_LONG_MAX;
+    FT_Pos  highest_max_y   = FT_LONG_MIN;
+
+    FT_Int  contour;
+
+
+    /* At this point we have one 'lower' (usually the base glyph)   */
+    /* and one 'upper' object (usually the diacritic glyph).  If    */
+    /* there are more contours, they must be enclosed within either */
+    /* 'lower' or 'upper'.  To find this enclosing 'upper' contour  */
+    /* it is thus sufficient to search for the contour with the     */
+    /* highest y maximum value.                                     */
+    for ( contour = 0; contour < hints->num_contours; contour++ )
+    {
+      FT_Pos  current_min_y = hints->contour_y_minima[contour];
+      FT_Pos  current_max_y = hints->contour_y_maxima[contour];
+
+
+      /* If we have two contours with the same maximum value, take */
+      /* the one that has a smaller height.                        */
+      if ( current_max_y > highest_max_y      ||
+           ( current_max_y == highest_max_y &&
+             current_min_y > highest_min_y  ) )
+      {
+        highest_min_y   = current_min_y;
+        highest_max_y   = current_max_y;
+        highest_contour = contour;
+      }
+    }
+
+    return highest_contour;
+  }
+
+
+  static FT_Int
+  af_find_second_highest_contour( AF_GlyphHints  hints )
+  {
+    FT_Int  highest_contour;
+    FT_Pos  highest_min_y;
+
+    FT_Int  second_highest_contour = 0;
+    FT_Pos  second_highest_max_y   = FT_LONG_MIN;
+
+    FT_Int  contour;
+
+
+    if ( hints->num_contours < 3 )
+      return 0;
+
+    highest_contour = af_find_highest_contour( hints );
+    highest_min_y   = hints->contour_y_minima[highest_contour];
+
+    /* Search the contour with the largest vertical maximum that has a */
+    /* vertical minimum lower than the vertical minimum of the topmost */
+    /* contour.                                                        */
+    for ( contour = 0; contour < hints->num_contours; contour++ )
+    {
+      FT_Pos  current_min_y;
+      FT_Pos  current_max_y;
+
+
+      if ( contour == highest_contour )
+        continue;
+
+      current_min_y = hints->contour_y_minima[contour];
+      current_max_y = hints->contour_y_maxima[contour];
+
+      if ( current_max_y > second_highest_max_y &&
+           current_min_y < highest_min_y        )
+      {
+        second_highest_max_y   = current_max_y;
+        second_highest_contour = contour;
+      }
+    }
+
+    return second_highest_contour;
+  }
+
+
+  static FT_Int
+  af_find_lowest_contour( AF_GlyphHints  hints )
+  {
+    FT_Int  lowest_contour = 0;
+    FT_Pos  lowest_min_y   = FT_LONG_MAX;
+    FT_Pos  lowest_max_y   = FT_LONG_MIN;
+
+    FT_Int  contour;
+
+
+    for ( contour = 0; contour < hints->num_contours; contour++ )
+    {
+      FT_Pos  current_min_y = hints->contour_y_minima[contour];
+      FT_Pos  current_max_y = hints->contour_y_maxima[contour];
+
+
+      if ( current_min_y < lowest_min_y      ||
+           ( current_min_y == lowest_min_y &&
+             current_max_y < lowest_max_y  ) )
+      {
+        lowest_min_y   = current_min_y;
+        lowest_max_y   = current_max_y;
+        lowest_contour = contour;
+      }
+    }
+
+    return lowest_contour;
+  }
+
+
+  static FT_Int
+  af_find_second_lowest_contour( AF_GlyphHints  hints )
+  {
+    FT_Int  lowest_contour;
+    FT_Pos  lowest_max_y;
+
+    FT_Int  second_lowest_contour = 0;
+    FT_Pos  second_lowest_min_y   = FT_LONG_MAX;
+
+    FT_Int  contour;
+
+
+    if ( hints->num_contours < 3 )
+      return 0;
+
+    lowest_contour = af_find_lowest_contour( hints );
+    lowest_max_y   = hints->contour_y_maxima[lowest_contour];
+
+    for ( contour = 0; contour < hints->num_contours; contour++ )
+    {
+      FT_Pos  current_min_y;
+      FT_Pos  current_max_y;
+
+
+      if ( contour == lowest_contour )
+        continue;
+
+      current_min_y = hints->contour_y_minima[contour];
+      current_max_y = hints->contour_y_maxima[contour];
+
+      if ( current_min_y < second_lowest_min_y &&
+           current_max_y > lowest_max_y        )
+      {
+        second_lowest_min_y   = current_min_y;
+        second_lowest_contour = contour;
+      }
+    }
+
+    return second_lowest_contour;
+  }
+
+
+  /* While aligning edges to blue zones, make the auto-hinter */
+  /* ignore the ones that are higher than `pos`.              */
+  static void
+  af_prevent_top_blue_alignment( AF_GlyphHints  hints,
+                                 FT_Pos         pos )
+  {
+    AF_AxisHints  axis = &hints->axis[AF_DIMENSION_VERT];
+
+    AF_Edge  edges      = axis->edges;
+    AF_Edge  edge_limit = FT_OFFSET( edges, axis->num_edges );
+    AF_Edge  edge;
+
+
+    for ( edge = edges; edge < edge_limit; edge++ )
+      if ( edge->pos > pos )
+        edge->flags |= AF_EDGE_NO_BLUE;
+  }
+
+
+  static void
+  af_prevent_bottom_blue_alignment( AF_GlyphHints  hints,
+                                    FT_Pos         pos )
+  {
+    AF_AxisHints  axis = &hints->axis[AF_DIMENSION_VERT];
+
+    AF_Edge  edges      = axis->edges;
+    AF_Edge  edge_limit = FT_OFFSET( edges, axis->num_edges );
+    AF_Edge  edge;
+
+
+    for ( edge = edges; edge < edge_limit; edge++ )
+      if ( edge->pos < pos )
+        edge->flags |= AF_EDGE_NO_BLUE;
+  }
+
+
+  static void
+  af_latin_get_base_glyph_blues( AF_GlyphHints  hints,
+                                 FT_Bool        is_capital,
+                                 AF_LatinBlue*  top,
+                                 AF_LatinBlue*  bottom )
+  {
+    AF_LatinMetrics  metrics = (AF_LatinMetrics)hints->metrics;
+    AF_LatinAxis     axis    = &metrics->axis[AF_DIMENSION_VERT];
+
+    FT_UInt  top_flag;
+    FT_UInt  bottom_flag;
+
+    FT_UInt  i;
+
+
+    top_flag  = is_capital ? AF_LATIN_BLUE_TOP
+                           : AF_LATIN_BLUE_ADJUSTMENT;
+    top_flag |= AF_LATIN_BLUE_ACTIVE;
+
+    for ( i = 0; i < axis->blue_count; i++ )
+      if ( ( axis->blues[i].flags & top_flag ) == top_flag )
+        break;
+    if ( i < axis->blue_count )
+      *top = &axis->blues[i];
+
+    bottom_flag  = is_capital ? AF_LATIN_BLUE_BOTTOM
+                              : AF_LATIN_BLUE_BOTTOM_SMALL;
+    bottom_flag |= AF_LATIN_BLUE_ACTIVE;
+
+    for ( i = 0; i < axis->blue_count; i++ )
+      if ( ( axis->blues[i].flags & bottom_flag ) == bottom_flag )
+        break;
+    if ( i < axis->blue_count )
+      *bottom = &axis->blues[i];
+  }
+
+
+  /* Make the auto-hinter ignore top blue zones while aligning edges. */
+  /* This affects everything that is higher than a vertical position  */
+  /* based on the lowercase or uppercase top and bottom blue zones    */
+  /* (depending on `is_capital`).                                     */
+  static void
+  af_latin_ignore_top( AF_GlyphHints  hints,
+                       AF_LatinBlue   top_blue,
+                       AF_LatinBlue   bottom_blue )
+  {
+    FT_Pos  base_glyph_height;
+    FT_Pos  limit;
+
+
+    /* Ignore blue zones that are higher than a heuristic threshold     */
+    /* (value 7 corresponds to approx. 14%, which should be sufficient  */
+    /* to exceed the height of uppercase serifs.  We also add a quarter */
+    /* of a pixel as a safety measure.                                  */
+    base_glyph_height = top_blue->shoot.cur - bottom_blue->shoot.cur;
+    limit             = top_blue->shoot.cur + base_glyph_height / 7 + 16;
+
+    af_prevent_top_blue_alignment( hints, limit );
+  }
+
+
+  static void
+  af_latin_ignore_bottom( AF_GlyphHints  hints,
+                          AF_LatinBlue   top_blue,
+                          AF_LatinBlue   bottom_blue )
+  {
+    FT_Pos  base_glyph_height;
+    FT_Pos  limit;
+
+
+    base_glyph_height = top_blue->shoot.cur - bottom_blue->shoot.cur;
+    limit             = bottom_blue->shoot.cur - base_glyph_height / 7 - 16;
+
+    af_prevent_bottom_blue_alignment( hints, limit );
+  }
+
+
+  static void
+  af_touch_contour( AF_GlyphHints  hints,
+                    FT_Int         contour )
+  {
+    AF_Point  first_point = hints->contours[contour];
+    AF_Point  p           = first_point;
+
+
+    do
+    {
+      p = p->next;
+
+      p->flags |= AF_FLAG_IGNORE;
+      if ( !( p->flags & AF_FLAG_CONTROL ) )
+        p->flags |= AF_FLAG_TOUCH_Y;
+
+    } while ( p != first_point );
+  }
+
+
+  static void
+  af_touch_top_contours( AF_GlyphHints  hints,
+                         FT_Int         limit_contour )
+  {
+    FT_Pos  limit = hints->contour_y_minima[limit_contour];
+
+    FT_Int  contour;
+
+
+    for ( contour = 0; contour < hints->num_contours; contour++ )
+    {
+      FT_Pos  min_y = hints->contour_y_minima[contour];
+      FT_Pos  max_y = hints->contour_y_maxima[contour];
+
+
+      if ( min_y < max_y  &&
+           min_y >= limit )
+        af_touch_contour( hints, contour );
+    }
+  }
+
+
+  static void
+  af_touch_bottom_contours( AF_GlyphHints  hints,
+                            FT_Int         limit_contour )
+  {
+    FT_Pos  limit = hints->contour_y_minima[limit_contour];
+
+    FT_Int  contour;
+
+
+    for ( contour = 0; contour < hints->num_contours; contour++ )
+    {
+      FT_Pos  min_y = hints->contour_y_minima[contour];
+      FT_Pos  max_y = hints->contour_y_maxima[contour];
+
+
+      if ( min_y < max_y  &&
+           max_y <= limit )
+        af_touch_contour( hints, contour );
+    }
+  }
+
+
+  /* Stretch tilde vertically, if necessary, and return the height */
+  /* difference between the original and the stretched outline.    */
+  static FT_Pos
+  af_latin_stretch_top_tilde( AF_GlyphHints  hints,
+                              FT_Int         tilde_contour )
+  {
+    AF_Point  p           = hints->contours[tilde_contour];
+    AF_Point  first_point = p;
+
+    FT_Pos  min_y = hints->contour_y_minima[tilde_contour];
+    FT_Pos  max_y = hints->contour_y_maxima[tilde_contour];
+
+    FT_Pos   min_measurement   = FT_LONG_MAX;
+    FT_Bool  measurement_taken = FALSE;
+
+    FT_Pos  height;
+    FT_Pos  extremum_threshold;
+    FT_Pos  target_height;
+
+
+    if ( min_y == max_y )
+      return 0;
+
+    FT_TRACE4(( "af_latin_stretch_top_tilde: min y: %ld, max y: %ld\n",
+                min_y, max_y ));
+
+    height             = SUB_LONG( max_y, min_y );
+    extremum_threshold = height / 8;    /* Value 8 is heuristic. */
+
+    /* Find points that are local vertical round extrema, and which   */
+    /* do not coincide with the vertical extreme values (i.e., we     */
+    /* search for the 'other' wiggles in the tilde), then measure the */
+    /* distance to the vertical extreme values.  Try to find the one  */
+    /* with the smallest distance.                                    */
+    /*                                                                */
+    /* The algorithm only works for tilde shapes that don't deviate   */
+    /* from the standard shape too much.  In particular, the wiggles  */
+    /* must be round extrema.                                         */
+    do
+    {
+      p = p->next;
+
+      if ( !( p->flags & AF_FLAG_CONTROL )          &&
+           p->prev->y == p->y && p->next->y == p->y &&
+           p->y != min_y && p->y != max_y           &&
+           p->prev->flags & AF_FLAG_CONTROL         &&
+           p->next->flags & AF_FLAG_CONTROL         )
+      {
+        /* This point could be a candidate.  Find the next and previous */
+        /* on-curve points, and make sure they are both either above or */
+        /* below the point, then make the measurement.                  */
+        AF_Point  prev_on = p->prev;
+        AF_Point  next_on = p->next;
+
+        FT_Pos  measurement;
+
+
+        while ( prev_on->flags & AF_FLAG_CONTROL )
+          prev_on = prev_on->prev;
+        while ( next_on->flags & AF_FLAG_CONTROL )
+          next_on = next_on->next;
+
+        if ( next_on->y > p->y && prev_on->y > p->y )
+          measurement = SUB_LONG( p->y, min_y );
+        else if ( next_on->y < p->y && prev_on->y < p->y )
+          measurement = SUB_LONG( max_y, p->y );
+        else
+          continue;
+
+        /* Ignore hits that are too near to a vertical extremum. */
+        if ( measurement < extremum_threshold )
+          continue;
+
+        if ( !measurement_taken || measurement < min_measurement )
+        {
+          measurement_taken = TRUE;
+          min_measurement   = measurement;
+        }
+      }
+
+    } while ( p != first_point );
+
+    if ( !measurement_taken )
+      min_measurement = 0;
+
+    FT_TRACE4(( "af_latin_stretch_top_tilde: min measurement %ld\n",
+                min_measurement ));
+
+    /* To preserve the stretched shape we prevent that the tilde */
+    /* gets auto-hinted; we do this for all contours equal or    */
+    /* above the vertical minimum of `tilde_contour`.            */
+    af_touch_top_contours( hints, tilde_contour );
+
+    /* XXX This is an important element of the algorithm; */
+    /*     we need a description.                         */
+    target_height = min_measurement + 64;
+    if ( height >= target_height )
+      return 0;
+
+    /* Do the scaling. */
+    p = first_point;
+    do
+    {
+      p    = p->next;
+      /* We adjust the height of the diacritic only, which means */
+      /* we are never dealing with (valid) large numbers and can */
+      /* thus avoid `FT_MulFix`.                                 */
+      p->y = ADD_LONG( MUL_LONG( SUB_LONG( p->y,
+                                           min_y ),
+                                 target_height ) / height,
+                       min_y );
+
+    } while ( p != first_point );
+
+    return target_height - height;
+  }
+
+
+  static FT_Pos
+  af_latin_stretch_bottom_tilde( AF_GlyphHints  hints,
+                                 FT_Int         tilde_contour )
+  {
+    AF_Point  p           = hints->contours[tilde_contour];
+    AF_Point  first_point = p;
+
+    FT_Pos  min_y = hints->contour_y_minima[tilde_contour];
+    FT_Pos  max_y = hints->contour_y_maxima[tilde_contour];
+
+    FT_Pos   min_measurement   = FT_LONG_MAX;
+    FT_Bool  measurement_taken = FALSE;
+
+    FT_Pos  height;
+    FT_Pos  extremum_threshold;
+    FT_Pos  target_height;
+
+
+    if ( min_y == max_y )
+      return 0;
+
+    FT_TRACE4(( "af_latin_stretch_bottom_tilde: min y: %ld, max y: %ld\n",
+                min_y, max_y ));
+
+    height             = SUB_LONG( max_y, min_y );
+    extremum_threshold = height / 8;
+
+    do
+    {
+      p = p->next;
+
+      if ( !( p->flags & AF_FLAG_CONTROL )          &&
+           p->prev->y == p->y && p->next->y == p->y &&
+           p->y != min_y && p->y != max_y           &&
+           p->prev->flags & AF_FLAG_CONTROL         &&
+           p->next->flags & AF_FLAG_CONTROL         )
+      {
+        AF_Point  prev_on = p->prev;
+        AF_Point  next_on = p->next;
+
+        FT_Pos  measurement;
+
+
+        while ( prev_on->flags & AF_FLAG_CONTROL )
+          prev_on = prev_on->prev;
+        while ( next_on->flags & AF_FLAG_CONTROL )
+          next_on = next_on->next;
+
+        if ( next_on->y > p->y && prev_on->y > p->y )
+          measurement = SUB_LONG( p->y, min_y );
+        else if ( next_on->y < p->y && prev_on->y < p->y )
+          measurement = SUB_LONG( max_y, p->y );
+        else
+          continue;
+
+        if ( measurement < extremum_threshold )
+          continue;
+
+        if ( !measurement_taken || measurement < min_measurement )
+        {
+          measurement_taken = TRUE;
+          min_measurement   = measurement;
+        }
+      }
+
+    } while ( p != first_point );
+
+    if ( !measurement_taken )
+      min_measurement = 0;
+
+    FT_TRACE4(( "af_latin_stretch_bottom_tilde: min measurement %ld\n",
+                min_measurement ));
+
+    af_touch_bottom_contours( hints, tilde_contour );
+
+    target_height = min_measurement + 64;
+    if ( height >= target_height )
+      return 0;
+
+    p = first_point;
+    do
+    {
+      p    = p->next;
+      p->y = ADD_LONG( MUL_LONG( SUB_LONG( p->y,
+                                           max_y ),
+                                 target_height ) / height,
+                       max_y );
+
+    } while ( p != first_point );
+
+    return target_height - height;
+  }
+
+
+  /*
+    As part of `af_latin_stretch_top_tilde`, normally all points in the
+    tilde are marked as touched, so the existing grid fitting will leave the
+    tilde misaligned with the grid.
+
+    This function moves the tilde contour down to be grid-fitted.  We assume
+    that if moving the tilde down would cause it to touch or overlap another
+    countour, the vertical adjustment step will fix it.
+
+    Because the vertical adjustment step comes after all other grid-fitting
+    steps, the top edge of the contour under the tilde is usually aligned
+    with a horizontal grid line.  The vertical gap enforced by the vertical
+    adjustment is exactly one pixel, so if the top edge of the contour below
+    the tilde is on a grid line, the resulting tilde contour will also be
+    grid-aligned.
+
+    But in cases where the gap is already big enough so that the vertical
+    adjustment does nothing, this function ensures that even without the
+    intervention of the vertical adjustment step, the tilde will be
+    grid-aligned.
+
+    Return the vertical alignment amount.
+  */
+  static FT_Pos
+  af_latin_align_top_tilde( AF_GlyphHints  hints,
+                            FT_Int         tilde_contour )
+  {
+    AF_Point  p           = hints->contours[tilde_contour];
+    AF_Point  first_point = p;
+
+    FT_Pos  min_y = p->y;
+    FT_Pos  max_y = p->y;
+
+    FT_Pos  min_y_rounded;
+    FT_Pos  delta;
+    FT_Pos  height;
+
+
+    /* Find vertical extrema of the (now stretched) tilde contour. */
+    do
+    {
+      p = p->next;
+      if ( p->y < min_y )
+        min_y = p->y;
+      if ( p->y > max_y )
+        max_y = p->y;
+
+    } while ( p != first_point );
+
+    /* Align bottom of the tilde to the grid. */
+    min_y_rounded = FT_PIX_ROUND_LONG( min_y );
+    delta         = SUB_LONG( min_y_rounded, min_y );
+    height        = SUB_LONG( max_y, min_y );
+
+    /* If the tilde is less than 3 pixels tall, snap the center of it */
+    /* to the grid instead of the bottom to improve readability.      */
+    if ( height < 64 * 3 )
+      delta += ( FT_PIX_ROUND( height ) - height ) / 2;
+
+    af_move_contour_vertically( first_point, delta );
+
+    return delta;
+  }
+
+
+  static FT_Pos
+  af_latin_align_bottom_tilde( AF_GlyphHints  hints,
+                               FT_Int         tilde_contour )
+  {
+    AF_Point  p           = hints->contours[tilde_contour];
+    AF_Point  first_point = p;
+
+    FT_Pos  min_y = p->y;
+    FT_Pos  max_y = p->y;
+
+    FT_Pos  max_y_rounded;
+    FT_Pos  delta;
+    FT_Pos  height;
+
+
+    do
+    {
+      p = p->next;
+      if ( p->y < min_y )
+        min_y = p->y;
+      if ( p->y > max_y )
+        max_y = p->y;
+
+    } while ( p != first_point );
+
+    max_y_rounded = FT_PIX_ROUND_LONG( max_y );
+    delta         = SUB_LONG( max_y_rounded, max_y );
+    height        = SUB_LONG( max_y, min_y );
+
+    if ( height < 64 * 3 )
+      delta -= ( FT_PIX_ROUND( height ) - height ) / 2;
+
+    af_move_contour_vertically( first_point, delta );
+
+    return delta;
+  }
+
+
+  /* Return 1 if the given contour overlaps horizontally with the bounding */
+  /* box of all other contours combined.  This is a helper for function    */
+  /* `af_glyph_hints_apply_vertical_separation_adjustments`.               */
+  static FT_Bool
+  af_check_contour_horizontal_overlap( AF_GlyphHints  hints,
+                                       FT_Int         contour_index )
+  {
+    FT_Pos  contour_max_x = FT_LONG_MIN;
+    FT_Pos  contour_min_x = FT_LONG_MAX;
+    FT_Pos  others_max_x  = FT_LONG_MIN;
+    FT_Pos  others_min_x  = FT_LONG_MAX;
+
+    FT_Int  contour;
+
+    FT_Bool  horizontal_overlap;
+
+
+    for ( contour = 0; contour < hints->num_contours; contour++ )
+    {
+      AF_Point  first_point = hints->contours[contour];
+      AF_Point  p           = first_point;
+
+
+      /* Ignore dimensionless contours (i.e., contours with only one or */
+      /* two points).                                                   */
+      if ( first_point->next->next == first_point )
+        continue;
+
+      do
+      {
+        p = p->next;
+
+        if ( contour == contour_index )
+        {
+          if ( p->x < contour_min_x )
+            contour_min_x = p->x;
+          if ( p->x > contour_max_x )
+            contour_max_x = p->x;
+        }
+        else
+        {
+          if ( p->x < others_min_x )
+            others_min_x = p->x;
+          if ( p->x > others_max_x )
+            others_max_x = p->x;
+        }
+      } while ( p != first_point );
+    }
+
+    horizontal_overlap =
+      ( others_min_x <= contour_max_x && contour_max_x <= others_max_x ) ||
+      ( others_min_x <= contour_min_x && contour_min_x <= others_max_x ) ||
+      ( contour_max_x >= others_max_x && contour_min_x <= others_min_x );
+
+    return horizontal_overlap;
+  }
+
+
+  static void
+  af_glyph_hints_apply_vertical_separation_adjustments(
+    AF_GlyphHints  hints,
+    AF_Dimension   dim,
+    FT_UInt        glyph_index,
+    FT_Pos         accent_height_limit,
+    FT_Hash        reverse_charmap )
+  {
+    FT_Bool  adjust_top       = FALSE;
+    FT_Bool  adjust_below_top = FALSE;
+
+    FT_Bool  adjust_bottom       = FALSE;
+    FT_Bool  adjust_above_bottom = FALSE;
+
+    size_t*    val;
+    FT_UInt32  adj_type = AF_ADJUST_NONE;
+
+
+    FT_TRACE4(( "Entering"
+                " af_glyph_hints_apply_vertical_separation_adjustments\n" ));
+
+    if ( dim != AF_DIMENSION_VERT )
+      return;
+
+    val = ft_hash_num_lookup( (FT_Int)glyph_index, reverse_charmap );
+    if ( val )
+    {
+      FT_UInt  codepoint = *val;
+
+
+      adj_type = af_adjustment_database_lookup( codepoint );
+
+      if ( adj_type )
+      {
+        adjust_top       = !!( adj_type & AF_ADJUST_UP );
+        adjust_below_top = !!( adj_type & AF_ADJUST_UP2 );
+
+        adjust_bottom       = !!( adj_type & AF_ADJUST_DOWN );
+        adjust_above_bottom = !!( adj_type & AF_ADJUST_DOWN2 );
+      }
+    }
+
+    if ( ( ( adjust_top || adjust_bottom ) &&
+           hints->num_contours >= 2        )             ||
+         ( ( adjust_below_top || adjust_above_bottom ) &&
+           hints->num_contours >= 3                    ) )
+    {
+      /* Recompute vertical extrema, this time acting on already */
+      /* auto-hinted outlines.                                   */
+      af_compute_vertical_extrema( hints );
+    }
+
+    if ( ( adjust_top && hints->num_contours >= 2 )       ||
+         ( adjust_below_top && hints->num_contours >= 3 ) )
+    {
+      FT_Int  high_contour;
+      FT_Pos  high_min_y;
+      FT_Pos  high_max_y;
+      FT_Pos  high_height;
+
+      FT_Int  tilde_contour;
+      FT_Pos  tilde_min_y;
+      FT_Pos  tilde_max_y;
+      FT_Pos  tilde_height;
+
+      FT_Int   contour;
+      FT_Bool  horizontal_overlap;
+
+      FT_Pos  min_distance         = 64;
+      FT_Pos  adjustment_amount;
+      FT_Pos  calculated_amount;
+      FT_Pos  centering_adjustment = 0;
+      FT_Pos  pos;
+
+      FT_Bool  is_top_tilde       = !!( adj_type & AF_ADJUST_TILDE_TOP );
+      FT_Bool  is_below_top_tilde = !!( adj_type & AF_ADJUST_TILDE_TOP2 );
+
+
+      FT_TRACE4(( "af_glyph_hints_apply_vertical_separation_adjustments:\n"
+                  "  Applying vertical adjustment: %s\n",
+                  adjust_top ? "AF_ADJUST_TOP" : "AF_ADJUST_TOP2" ));
+
+      high_contour = adjust_below_top
+                       ? af_find_second_highest_contour( hints )
+                       : af_find_highest_contour( hints );
+
+      /* Check for a horizontal overlap between the high contour and the */
+      /* rest.  If there is no overlap, do not adjust.                   */
+      horizontal_overlap =
+        af_check_contour_horizontal_overlap( hints, high_contour );
+      if ( !horizontal_overlap )
+      {
+        FT_TRACE4(( "    High contour does not horizontally overlap"
+                    " with other contours.\n"
+                    "    Skipping adjustment.\n" ));
+        return;
+      }
+
+      high_min_y  = hints->contour_y_minima[high_contour];
+      high_max_y  = hints->contour_y_maxima[high_contour];
+      high_height = SUB_LONG( high_max_y, high_min_y );
+
+      if ( high_height > accent_height_limit )
+      {
+        FT_TRACE4(( "    High contour height (%.2f) exceeds accent height"
+                    " limit (%.2f).\n"
+                    "    Skipping adjustment.\n",
+                    (double)high_height / 64,
+                    (double)accent_height_limit / 64 ));
+        return;
+      }
+
+      /* If the difference between the vertical minimum of the high   */
+      /* contour and the vertical maximum of another contour is less  */
+      /* than a pixel, shift up the high contour to make the distance */
+      /* one pixel.                                                   */
+      for ( contour = 0; contour < hints->num_contours; contour++ )
+      {
+        FT_Pos  min_y;
+        FT_Pos  max_y;
+        FT_Pos  distance;
+
+
+        if ( contour == high_contour )
+          continue;
+
+        min_y = hints->contour_y_minima[contour];
+        max_y = hints->contour_y_maxima[contour];
+
+        /* We also check that the y minimum of the 'other' contour */
+        /* is below the high contour to avoid potential false hits */
+        /* with contours enclosed in the high one.                 */
+        distance = SUB_LONG( high_min_y, max_y );
+        if ( distance < 64           &&
+             distance < min_distance &&
+             min_y < high_min_y      )
+          min_distance = distance;
+      }
+
+      adjustment_amount = 64 - min_distance;
+
+      if ( is_top_tilde || is_below_top_tilde )
+      {
+        tilde_contour = adjust_top
+                          ? high_contour
+                          : ( is_below_top_tilde
+                                ? high_contour
+                                : af_find_highest_contour( hints ) );
+
+        tilde_min_y  = hints->contour_y_minima[tilde_contour];
+        tilde_max_y  = hints->contour_y_maxima[tilde_contour];
+        tilde_height = SUB_LONG( tilde_max_y, tilde_min_y);
+
+        /* The vertical separation adjustment potentially undoes a */
+        /* tilde center alignment.  If it would grid-align a tilde */
+        /* less than 3 pixels in height, shift additionally to     */
+        /* re-center the tilde.                                    */
+
+        pos = ADD_LONG( high_min_y, adjustment_amount );
+        if ( adjust_below_top && is_top_tilde )
+          pos += high_height;
+
+        if ( pos % 64 == 0 && tilde_height < 3 * 64 )
+        {
+          centering_adjustment = ( FT_PIX_ROUND( tilde_height ) -
+                                   tilde_height ) / 2;
+
+          FT_TRACE4(( "    Additional tilde centering adjustment: %ld\n",
+                      centering_adjustment ));
+        }
+      }
+
+      if ( ( adjust_top && is_top_tilde )             ||
+           ( adjust_below_top && is_below_top_tilde ) )
+        calculated_amount = adjustment_amount + centering_adjustment;
+      else
+        calculated_amount = adjustment_amount;
+
+      /* allow a delta of 2/64px to handle rounding differences */
+      FT_TRACE4(( "    Calculated adjustment amount: %ld%s\n",
+                  calculated_amount,
+                  ( calculated_amount < -2                               ||
+                    ( adjustment_amount > 66 && calculated_amount > 66 ) )
+                      ? " (out of range [-2;66], not adjusting)" : "" ));
+
+      if ( calculated_amount != 0                                 &&
+           calculated_amount >= -2                                &&
+           ( calculated_amount <= 66 || adjustment_amount <= 66 ) )
+      {
+        /* Value 8 is heuristic. */
+        FT_Pos  height_delta = high_height / 8;
+        FT_Pos  min_y_limit  = SUB_LONG( high_min_y, height_delta );
+
+
+        FT_TRACE4(( "    Pushing high contour %ld units up\n",
+                    calculated_amount ));
+
+        /* While we use only a single contour (the 'high' one) for    */
+        /* computing `adjustment_amount`, we apply it to all contours */
+        /* that are (approximately) in the same vertical range or     */
+        /* higher.  This covers, for example, the inner contour of    */
+        /* the Czech ring accent or the second acute accent in the    */
+        /* Hungarian double acute accent.                             */
+        af_move_contours_up( hints, min_y_limit, adjustment_amount );
+
+        if ( adjust_below_top && is_top_tilde )
+        {
+          FT_TRACE4(( "    Pushing top tilde %ld units up\n",
+                      centering_adjustment ));
+
+          af_move_contours_up( hints,
+                               ADD_LONG( min_y_limit, high_height ),
+                               centering_adjustment );
+        }
+      }
+    }
+
+    if ( ( adjust_bottom && hints->num_contours >= 2 )       ||
+         ( adjust_above_bottom && hints->num_contours >= 3 ) )
+    {
+      FT_Int  low_contour;
+      FT_Pos  low_min_y;
+      FT_Pos  low_max_y;
+      FT_Pos  low_height;
+
+      FT_Int  tilde_contour;
+      FT_Pos  tilde_min_y;
+      FT_Pos  tilde_max_y;
+      FT_Pos  tilde_height;
+
+      FT_Int   contour;
+      FT_Bool  horizontal_overlap;
+
+      FT_Pos  min_distance         = 64;
+      FT_Pos  adjustment_amount;
+      FT_Pos  calculated_amount;
+      FT_Pos  centering_adjustment = 0;
+      FT_Pos  pos;
+
+      FT_Bool  is_bottom_tilde =
+                 !!( adj_type & AF_ADJUST_TILDE_BOTTOM );
+      FT_Bool  is_above_bottom_tilde =
+                 !!( adj_type & AF_ADJUST_TILDE_BOTTOM2 );
+
+
+      FT_TRACE4(( "af_glyph_hints_apply_vertical_separation_adjustments:\n"
+                  "  Applying vertical adjustment: %s\n",
+                  adjust_bottom ? "AF_ADJUST_DOWN": "AF_ADJUST_DOWN2" ));
+
+      low_contour = adjust_above_bottom
+                      ? af_find_second_lowest_contour( hints )
+                      : af_find_lowest_contour( hints );
+
+      horizontal_overlap =
+        af_check_contour_horizontal_overlap( hints, low_contour );
+      if ( !horizontal_overlap )
+      {
+        FT_TRACE4(( "    Low contour does not horizontally overlap"
+                    " with other contours.\n"
+                    "    Skipping adjustment.\n" ));
+        return;
+      }
+
+      low_min_y  = hints->contour_y_minima[low_contour];
+      low_max_y  = hints->contour_y_maxima[low_contour];
+      low_height = SUB_LONG( low_max_y, low_min_y );
+
+      if ( low_height > accent_height_limit )
+      {
+        FT_TRACE4(( "    Low contour height (%.2f) exceeds accent height"
+                    " limit (%.2f).\n"
+                    "    Skipping adjustment.\n",
+                    (double)low_height / 64,
+                    (double)accent_height_limit / 64 ));
+        return;
+      }
+
+      for ( contour = 0; contour < hints->num_contours; contour++ )
+      {
+        FT_Pos  min_y;
+        FT_Pos  max_y;
+        FT_Pos  distance;
+
+
+        if ( contour == low_contour )
+          continue;
+
+        min_y = hints->contour_y_minima[contour];
+        max_y = hints->contour_y_maxima[contour];
+
+        distance = SUB_LONG( min_y, low_max_y );
+        if ( distance < 64           &&
+             distance < min_distance &&
+             max_y > low_max_y       )
+          min_distance = distance;
+      }
+
+      adjustment_amount = 64 - min_distance;
+
+      if ( is_bottom_tilde || is_above_bottom_tilde )
+      {
+        tilde_contour = adjust_bottom
+                          ? low_contour
+                          : ( is_above_bottom_tilde
+                                ? low_contour
+                                : af_find_lowest_contour( hints ) );
+
+        tilde_min_y  = hints->contour_y_minima[tilde_contour];
+        tilde_max_y  = hints->contour_y_maxima[tilde_contour];
+        tilde_height = SUB_LONG( tilde_max_y, tilde_min_y );
+
+        pos = SUB_LONG( low_max_y, adjustment_amount );
+        if ( adjust_above_bottom && is_bottom_tilde )
+          pos -= low_height;
+
+        if ( pos % 64 == 0 && tilde_height < 3 * 64 )
+        {
+          centering_adjustment = ( FT_PIX_ROUND( tilde_height ) -
+                                   tilde_height ) / 2;
+
+          FT_TRACE4(( "    Additional tilde centering adjustment: %ld\n",
+                      centering_adjustment ));
+        }
+      }
+
+      if ( ( adjust_bottom && is_bottom_tilde )             ||
+           ( adjust_above_bottom && is_above_bottom_tilde ) )
+        calculated_amount = adjustment_amount + centering_adjustment;
+      else
+        calculated_amount = adjustment_amount;
+
+      FT_TRACE4(( "    Calculated adjustment amount: %ld%s\n",
+                  calculated_amount,
+                  ( calculated_amount < -2                               ||
+                    ( adjustment_amount > 66 && calculated_amount > 66 ) )
+                      ? " (out of range [-2;66], not adjusting)" : "" ));
+
+      if ( calculated_amount != 0                                 &&
+           calculated_amount >= -2                                &&
+           ( calculated_amount <= 66 || adjustment_amount <= 66 ) )
+      {
+        FT_Pos  height_delta = low_height / 8;
+        FT_Pos  max_y_limit  = ADD_LONG( low_max_y, height_delta );
+
+
+        FT_TRACE4(( "    Pushing low contour %ld units down\n",
+                    calculated_amount ));
+
+        af_move_contours_down( hints, max_y_limit, adjustment_amount );
+
+        if ( adjust_above_bottom && is_bottom_tilde )
+        {
+          FT_TRACE4(( "    Pushing bottom tilde %ld units down\n",
+                      centering_adjustment ));
+
+          af_move_contours_down( hints,
+                                 SUB_LONG( max_y_limit, low_height ),
+                                 centering_adjustment );
+        }
+      }
+    }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    if ( !( ( ( adjust_top || adjust_bottom ) &&
+              hints->num_contours >= 2        )             ||
+            ( ( adjust_below_top || adjust_above_bottom ) &&
+              hints->num_contours >= 3                    ) ) )
+      FT_TRACE4(( "af_glyph_hints_apply_vertical_separation_adjustments:\n"
+                  "  No vertical adjustment applied\n" ));
+#endif
+
+    FT_TRACE4(( "Exiting"
+                " af_glyph_hints_apply_vertical_separation_adjustments\n" ));
+  }
+
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  aflatin
+
+
   /* Compute the snapped width of a given stem, ignoring very thin ones. */
   /* There is a lot of voodoo in this function; changing the hard-coded  */
   /* parameters influence the whole hinting process.                     */
@@ -2998,13 +4220,15 @@
   af_latin_hint_edges( AF_GlyphHints  hints,
                        AF_Dimension   dim )
   {
-    AF_AxisHints  axis       = &hints->axis[dim];
-    AF_Edge       edges      = axis->edges;
-    AF_Edge       edge_limit = FT_OFFSET( edges, axis->num_edges );
-    FT_PtrDist    n_edges;
-    AF_Edge       edge;
-    AF_Edge       anchor     = NULL;
-    FT_Int        has_serifs = 0;
+    AF_AxisHints  axis = &hints->axis[dim];
+
+    AF_Edge     edges      = axis->edges;
+    AF_Edge     edge_limit = FT_OFFSET( edges, axis->num_edges );
+    AF_Edge     edge;
+    FT_PtrDist  n_edges;
+
+    AF_Edge  anchor             = NULL;
+    FT_Bool  has_non_stem_edges = 0;
 
     AF_StyleClass   style_class  = hints->metrics->style_class;
     AF_ScriptClass  script_class = af_script_classes[style_class->script];
@@ -3131,7 +4355,7 @@
       edge2 = edge->link;
       if ( !edge2 )
       {
-        has_serifs++;
+        has_non_stem_edges = TRUE;
         continue;
       }
 
@@ -3408,7 +4632,7 @@
       }
     }
 
-    if ( has_serifs || !anchor )
+    if ( has_non_stem_edges || !anchor )
     {
       /*
        * now hint the remaining edges (serifs and single) in order
@@ -3426,9 +4650,75 @@
 
         if ( edge->serif )
         {
+          AF_Edge  e, top, bottom;
+          FT_Pos   min_pos, max_pos;
+
+
+          /* Check whether we have a real serif -- if there are  */
+          /* other edges with overlapping (or enclosed) segments */
+          /* between the primary and serif edge, we have not.    */
+          /*                                                     */
+          /* Such a situation might happen if an accent is very  */
+          /* near to its base glyph (for example, Vietnamese     */
+          /* uppercase letters with two accents in `arial.ttf`), */
+          /* and the segment detection algorithm classifies the  */
+          /* top of the accent incorrectly as a serif.           */
           delta = edge->serif->opos - edge->opos;
           if ( delta < 0 )
+          {
             delta = -delta;
+
+            top    = edge;
+            bottom = edge->serif;
+          }
+          else
+          {
+            top    = edge->serif;
+            bottom = edge;
+          }
+
+          if ( delta < 64 + 32 )
+          {
+            /* take care of outline orientation while computing extrema */
+            min_pos = FT_MIN( FT_MIN( FT_MIN( top->first->first->v,
+                                              top->first->last->v ),
+                                      FT_MIN( top->last->first->v,
+                                              top->last->last->v ) ),
+                              FT_MIN( FT_MIN( bottom->first->first->v,
+                                              bottom->first->last->v ),
+                                      FT_MIN( bottom->last->first->v,
+                                              bottom->last->last->v ) ) );
+            max_pos = FT_MAX( FT_MAX( FT_MAX( top->first->first->v,
+                                              top->first->last->v ),
+                                      FT_MAX( top->last->first->v,
+                                              top->last->last->v ) ),
+                              FT_MAX( FT_MAX( bottom->first->first->v,
+                                              bottom->first->last->v ),
+                                      FT_MAX( bottom->last->first->v,
+                                              bottom->last->last->v ) ) );
+
+            for ( e = bottom + 1; e < top; e++ )
+            {
+              FT_Pos  e_min = FT_MIN( FT_MIN( e->first->first->v,
+                                              e->first->last->v ),
+                                      FT_MIN( e->last->first->v,
+                                              e->last->last->v ) );
+              FT_Pos  e_max = FT_MAX( FT_MAX( e->first->first->v,
+                                              e->first->last->v ),
+                                      FT_MAX( e->last->first->v,
+                                              e->last->last->v ) );
+
+              if ( !( ( e_min < min_pos && e_max < min_pos ) ||
+                      ( e_min > max_pos && e_max > max_pos ) ) )
+              {
+                delta = 1000;  /* not a real serif */
+                break;
+              }
+            }
+
+            if ( delta == 1000 )
+              continue;
+          }
         }
 
         if ( delta < 64 + 16 )
@@ -3562,6 +4852,8 @@
 
     AF_LatinAxis  axis;
 
+    FT_Pos  accent_height_limit = 0;
+
 
     error = af_glyph_hints_reload( hints, outline );
     if ( error )
@@ -3581,11 +4873,172 @@
 
     if ( AF_HINTS_DO_VERTICAL( hints ) )
     {
+      size_t*  val;
+
+      FT_Int  top_tilde_contour    = 0;
+      FT_Int  bottom_tilde_contour = 0;
+
+      FT_Int  below_top_tilde_contour    = 0;
+      FT_Int  above_bottom_tilde_contour = 0;
+
+      AF_LatinBlue  capital_top_blue    = NULL;
+      AF_LatinBlue  capital_bottom_blue = NULL;
+
+      AF_LatinBlue  small_top_blue    = NULL;
+      AF_LatinBlue  small_bottom_blue = NULL;
+
+      FT_Bool  have_flags = FALSE;
+
+      FT_Bool  is_top_tilde    = FALSE;
+      FT_Bool  is_bottom_tilde = FALSE;
+
+      FT_Bool  is_below_top_tilde    = FALSE;
+      FT_Bool  is_above_bottom_tilde = FALSE;
+
+      FT_Bool  ignore_capital_top    = FALSE;
+      FT_Bool  ignore_capital_bottom = FALSE;
+
+      FT_Bool  ignore_small_top    = FALSE;
+      FT_Bool  ignore_small_bottom = FALSE;
+
+      FT_Bool  do_height_check = TRUE;
+
+      FT_Pos  limit;
+      FT_Pos  y_offset;
+
+
+      val = ft_hash_num_lookup( (FT_Int)glyph_index,
+                                metrics->root.reverse_charmap );
+      if ( val )
+      {
+        FT_UInt    codepoint = *val;
+        FT_UInt32  adj_type  = af_adjustment_database_lookup( codepoint );
+
+
+        if ( adj_type )
+        {
+          have_flags = !!adj_type;
+
+          is_top_tilde    = !!( adj_type & AF_ADJUST_TILDE_TOP );
+          is_bottom_tilde = !!( adj_type & AF_ADJUST_TILDE_BOTTOM );
+
+          is_below_top_tilde    = !!( adj_type & AF_ADJUST_TILDE_TOP2 );
+          is_above_bottom_tilde = !!( adj_type & AF_ADJUST_TILDE_BOTTOM2 );
+
+          ignore_capital_top    = !!( adj_type & AF_IGNORE_CAPITAL_TOP );
+          ignore_capital_bottom = !!( adj_type & AF_IGNORE_CAPITAL_BOTTOM );
+
+          ignore_small_top    = !!( adj_type & AF_IGNORE_SMALL_TOP );
+          ignore_small_bottom = !!( adj_type & AF_IGNORE_SMALL_BOTTOM );
+
+          do_height_check = !( adj_type & AF_ADJUST_NO_HEIGHT_CHECK );
+        }
+      }
+
+      if ( is_top_tilde || is_bottom_tilde             ||
+           is_below_top_tilde || is_above_bottom_tilde )
+        af_compute_vertical_extrema( hints );
+
+      /* Process inner tilde glyphs first. */
+      if ( is_below_top_tilde )
+      {
+        below_top_tilde_contour = af_find_second_highest_contour( hints );
+
+        y_offset = af_latin_stretch_top_tilde(
+                     hints, below_top_tilde_contour );
+        y_offset += af_latin_align_top_tilde(
+                      hints, below_top_tilde_contour );
+
+        limit = hints->contour_y_minima[below_top_tilde_contour];
+        af_move_contours_up( hints, limit, y_offset );
+      }
+      if ( is_above_bottom_tilde )
+      {
+        above_bottom_tilde_contour = af_find_second_lowest_contour( hints );
+
+        y_offset = af_latin_stretch_bottom_tilde(
+                     hints, above_bottom_tilde_contour );
+        y_offset -= af_latin_align_bottom_tilde(
+                      hints, above_bottom_tilde_contour );
+
+        limit = hints->contour_y_maxima[above_bottom_tilde_contour];
+        af_move_contours_down( hints, limit, y_offset );
+      }
+
+      if ( is_top_tilde )
+      {
+        top_tilde_contour = af_find_highest_contour( hints );
+
+        (void)af_latin_stretch_top_tilde( hints, top_tilde_contour );
+        (void)af_latin_align_top_tilde( hints, top_tilde_contour );
+      }
+      if ( is_bottom_tilde )
+      {
+        bottom_tilde_contour = af_find_lowest_contour( hints );
+
+        (void)af_latin_stretch_bottom_tilde( hints, bottom_tilde_contour );
+        (void)af_latin_align_bottom_tilde( hints, bottom_tilde_contour );
+      }
+
       axis  = &metrics->axis[AF_DIMENSION_VERT];
       error = af_latin_hints_detect_features( hints,
                                               axis->width_count,
                                               axis->widths,
                                               AF_DIMENSION_VERT );
+
+      if ( have_flags )
+      {
+        af_latin_get_base_glyph_blues( hints,
+                                       TRUE,
+                                       &capital_top_blue,
+                                       &capital_bottom_blue );
+        af_latin_get_base_glyph_blues( hints,
+                                       FALSE,
+                                       &small_top_blue,
+                                       &small_bottom_blue );
+
+        if ( do_height_check )
+        {
+          /* Set a heuristic limit for the accent height so that    */
+          /* `af_glyph_hints_apply_vertical_separation_adjustments` */
+          /* can correctly ignore the case where an accent is       */
+          /* unexpectedly not the highest (or lowest) contour.      */
+
+          /* Either 2/3 of the lowercase blue zone height... */
+          if ( small_top_blue && small_bottom_blue )
+            accent_height_limit = 2 * ( small_top_blue->shoot.cur -
+                                        small_bottom_blue->shoot.cur ) / 3;
+          /* or 1/2 of the uppercase blue zone height... */
+          else if ( capital_top_blue && capital_bottom_blue )
+            accent_height_limit = ( capital_top_blue->shoot.cur -
+                                    capital_bottom_blue->shoot.cur ) / 2;
+          /* or half of the standard PostScript ascender value (8/10) */
+          /* of the EM value, scaled.                                 */
+          else
+            accent_height_limit = FT_MulFix( metrics->units_per_em * 4 / 10,
+                                             metrics->root.scaler.y_scale );
+        }
+      }
+
+      if ( capital_top_blue && capital_bottom_blue )
+      {
+        if ( ignore_capital_top )
+          af_latin_ignore_top( hints,
+                               capital_top_blue, capital_bottom_blue );
+        if ( ignore_capital_bottom )
+          af_latin_ignore_bottom( hints,
+                                  capital_top_blue, capital_bottom_blue );
+      }
+      if ( small_top_blue && small_bottom_blue )
+      {
+        if ( ignore_small_top )
+          af_latin_ignore_top( hints,
+                               small_top_blue, small_bottom_blue );
+        if ( ignore_small_bottom )
+          af_latin_ignore_bottom( hints,
+                                  small_top_blue, small_bottom_blue );
+      }
+
       if ( error )
         goto Exit;
 
@@ -3604,6 +5057,12 @@
         af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim );
         af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim );
         af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim );
+        af_glyph_hints_apply_vertical_separation_adjustments(
+          hints,
+          (AF_Dimension)dim,
+          glyph_index,
+          accent_height_limit,
+          metrics->root.reverse_charmap );
       }
     }
 
@@ -3632,7 +5091,7 @@
 
     (AF_WritingSystem_InitMetricsFunc) af_latin_metrics_init,        /* style_metrics_init    */
     (AF_WritingSystem_ScaleMetricsFunc)af_latin_metrics_scale,       /* style_metrics_scale   */
-    (AF_WritingSystem_DoneMetricsFunc) NULL,                         /* style_metrics_done    */
+    (AF_WritingSystem_DoneMetricsFunc) af_latin_metrics_done,        /* style_metrics_done    */
     (AF_WritingSystem_GetStdWidthsFunc)af_latin_get_standard_widths, /* style_metrics_getstdw */
 
     (AF_WritingSystem_InitHintsFunc)   af_latin_hints_init,          /* style_hints_init      */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/aflatin.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Auto-fitter hinting routines for latin writing system
  *   (specification).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -61,17 +61,26 @@
           ( (b)->properties & AF_BLUE_PROPERTY_LATIN_X_HEIGHT )
 #define AF_LATIN_IS_LONG_BLUE( b ) \
           ( (b)->properties & AF_BLUE_PROPERTY_LATIN_LONG )
+#define AF_LATIN_IS_CAPITAL_BOTTOM_BLUE( b ) \
+          ( (b)->properties & AF_BLUE_PROPERTY_LATIN_CAPITAL_BOTTOM )
+#define AF_LATIN_IS_SMALL_BOTTOM_BLUE( b ) \
+          ( (b)->properties & AF_BLUE_PROPERTY_LATIN_SMALL_BOTTOM )
 
 #define AF_LATIN_MAX_WIDTHS  16
 
 
-#define AF_LATIN_BLUE_ACTIVE      ( 1U << 0 ) /* zone height is <= 3/4px   */
-#define AF_LATIN_BLUE_TOP         ( 1U << 1 ) /* we have a top blue zone   */
-#define AF_LATIN_BLUE_SUB_TOP     ( 1U << 2 ) /* we have a subscript top   */
-                                              /* blue zone                 */
-#define AF_LATIN_BLUE_NEUTRAL     ( 1U << 3 ) /* we have neutral blue zone */
-#define AF_LATIN_BLUE_ADJUSTMENT  ( 1U << 4 ) /* used for scale adjustment */
-                                              /* optimization              */
+#define AF_LATIN_BLUE_ACTIVE        ( 1U << 0 ) /* zone height is <= 3/4px */
+#define AF_LATIN_BLUE_TOP           ( 1U << 1 ) /* we have a top blue zone */
+#define AF_LATIN_BLUE_SUB_TOP       ( 1U << 2 ) /* we have a subscript     */
+                                                /* top blue zone           */
+#define AF_LATIN_BLUE_NEUTRAL       ( 1U << 3 ) /* we have a neutral blue  */
+                                                /* zone                    */
+#define AF_LATIN_BLUE_ADJUSTMENT    ( 1U << 4 ) /* used for scale adjustm. */
+                                                /* optimization            */
+#define AF_LATIN_BLUE_BOTTOM        ( 1U << 5 ) /* we have a capital       */
+                                                /* letter bottom blue zone */
+#define AF_LATIN_BLUE_BOTTOM_SMALL  ( 1U << 6 ) /* we have a small letter  */
+                                                /* bottom blue zone        */
 
 
   typedef struct  AF_LatinBlueRec_
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afloader.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afloader.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afloader.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afloader.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter glyph loading routines (body).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -524,16 +524,18 @@
 
       bbox.xMin = FT_PIX_FLOOR( bbox.xMin );
       bbox.yMin = FT_PIX_FLOOR( bbox.yMin );
-      bbox.xMax = FT_PIX_CEIL(  bbox.xMax );
-      bbox.yMax = FT_PIX_CEIL(  bbox.yMax );
+      bbox.xMax = FT_PIX_CEIL_LONG( bbox.xMax );
+      bbox.yMax = FT_PIX_CEIL_LONG( bbox.yMax );
 
-      slot->metrics.width        = bbox.xMax - bbox.xMin;
-      slot->metrics.height       = bbox.yMax - bbox.yMin;
+      slot->metrics.width        = SUB_LONG( bbox.xMax, bbox.xMin );
+      slot->metrics.height       = SUB_LONG( bbox.yMax, bbox.yMin );
       slot->metrics.horiBearingX = bbox.xMin;
       slot->metrics.horiBearingY = bbox.yMax;
 
-      slot->metrics.vertBearingX = FT_PIX_FLOOR( bbox.xMin + vvector.x );
-      slot->metrics.vertBearingY = FT_PIX_FLOOR( bbox.yMax + vvector.y );
+      slot->metrics.vertBearingX = FT_PIX_FLOOR( ADD_LONG( bbox.xMin,
+                                                           vvector.x ) );
+      slot->metrics.vertBearingY = FT_PIX_FLOOR( ADD_LONG( bbox.yMax,
+                                                           vvector.y ) );
 
       /* for mono-width fonts (like Andale, Courier, etc.) we need */
       /* to keep the original rounded advance width; ditto for     */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afloader.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afloader.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afloader.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afloader.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter glyph loading routines (specification).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter module implementation (body).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -146,7 +146,7 @@
 
       if ( !af_style_classes[ss] )
       {
-        FT_TRACE2(( "af_property_set: Invalid value %d for property `%s'\n",
+        FT_TRACE2(( "af_property_set: Invalid value %u for property `%s'\n",
                     *fallback_script, property_name ));
         return FT_THROW( Invalid_Argument );
       }
@@ -412,6 +412,11 @@
     module->darken_params[6]  = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4;
     module->darken_params[7]  = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4;
 
+#if defined( FT_CONFIG_OPTION_USE_HARFBUZZ )         && \
+    defined( FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC )
+    ft_hb_funcs_init( module );
+#endif
+
     return FT_Err_Ok;
   }
 
@@ -421,6 +426,11 @@
   {
     FT_UNUSED( ft_module );
 
+#if defined( FT_CONFIG_OPTION_USE_HARFBUZZ )         && \
+    defined( FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC )
+    ft_hb_funcs_done( (AF_Module)ft_module );
+#endif
+
 #ifdef FT_DEBUG_AUTOFIT
     if ( af_debug_hints_rec_->memory )
       af_glyph_hints_done( af_debug_hints_rec_ );
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afmodule.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter module implementation (specification).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -22,6 +22,7 @@
 #include 
 #include 
 
+#include "ft-hb.h"
 
 FT_BEGIN_HEADER
 
@@ -40,6 +41,11 @@
     FT_Bool       no_stem_darkening;
     FT_Int        darken_params[8];
 
+#if defined( FT_CONFIG_OPTION_USE_HARFBUZZ )         && \
+    defined( FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC )
+    ft_hb_funcs_t*  hb_funcs;
+#endif
+
   } AF_ModuleRec, *AF_Module;
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afranges.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afranges.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afranges.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afranges.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter Unicode script ranges (body).
  *
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -73,9 +73,11 @@
   {
     AF_UNIRANGE_REC(  0x0600,  0x06FF ),  /* Arabic                                 */
     AF_UNIRANGE_REC(  0x0750,  0x07FF ),  /* Arabic Supplement                      */
+    AF_UNIRANGE_REC(  0x0870,  0x089F ),  /* Arabic Extended-B                      */
     AF_UNIRANGE_REC(  0x08A0,  0x08FF ),  /* Arabic Extended-A                      */
     AF_UNIRANGE_REC(  0xFB50,  0xFDFF ),  /* Arabic Presentation Forms-A            */
     AF_UNIRANGE_REC(  0xFE70,  0xFEFF ),  /* Arabic Presentation Forms-B            */
+    AF_UNIRANGE_REC( 0x10EC0, 0x10EFF ),  /* Arabic Extended-C                      */
     AF_UNIRANGE_REC( 0x1EE00, 0x1EEFF ),  /* Arabic Mathematical Alphabetic Symbols */
     AF_UNIRANGE_REC(       0,       0 )
   };
@@ -90,8 +92,9 @@
     AF_UNIRANGE_REC(  0x06DF,  0x06E4 ),
     AF_UNIRANGE_REC(  0x06E7,  0x06E8 ),
     AF_UNIRANGE_REC(  0x06EA,  0x06ED ),
-    AF_UNIRANGE_REC(  0x08D4,  0x08E1 ),
-    AF_UNIRANGE_REC(  0x08D3,  0x08FF ),
+    AF_UNIRANGE_REC(  0x0897,  0x089F ),
+    AF_UNIRANGE_REC(  0x08CA,  0x08E1 ),
+    AF_UNIRANGE_REC(  0x08E3,  0x08FF ),
     AF_UNIRANGE_REC(  0xFBB2,  0xFBC1 ),
     AF_UNIRANGE_REC(  0xFE70,  0xFE70 ),
     AF_UNIRANGE_REC(  0xFE72,  0xFE72 ),
@@ -101,6 +104,7 @@
     AF_UNIRANGE_REC(  0xFE7A,  0xFE7A ),
     AF_UNIRANGE_REC(  0xFE7C,  0xFE7C ),
     AF_UNIRANGE_REC(  0xFE7E,  0xFE7E ),
+    AF_UNIRANGE_REC( 0x10EFD, 0x10EFF ),
     AF_UNIRANGE_REC(       0,       0 )
   };
 
@@ -198,8 +202,9 @@
 
   const AF_Script_UniRangeRec  af_cans_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x1400,  0x167F ), /* Unified Canadian Aboriginal Syllabics          */
-    AF_UNIRANGE_REC(  0x18B0,  0x18FF ), /* Unified Canadian Aboriginal Syllabics Extended */
+    AF_UNIRANGE_REC(  0x1400,  0x167F ), /* Unified Canadian Aboriginal Syllabics            */
+    AF_UNIRANGE_REC(  0x18B0,  0x18FF ), /* Unified Canadian Aboriginal Syllabics Extended   */
+    AF_UNIRANGE_REC( 0x11AB0, 0x11ABF ), /* Unified Canadian Aboriginal Syllabics Extended-A */
     AF_UNIRANGE_REC(       0,       0 )
   };
 
@@ -259,6 +264,9 @@
   };
 
 
+  /* TODO: Split off data for new 'cyrb' (subscript) and 'cyrp'     */
+  /*       (superscript) groups (mainly from the Extended-D block), */
+  /*       in analogy to 'latb' and 'latp'?                         */
   const AF_Script_UniRangeRec  af_cyrl_uniranges[] =
   {
     AF_UNIRANGE_REC(  0x0400,  0x04FF ),  /* Cyrillic            */
@@ -266,6 +274,7 @@
     AF_UNIRANGE_REC(  0x2DE0,  0x2DFF ),  /* Cyrillic Extended-A */
     AF_UNIRANGE_REC(  0xA640,  0xA69F ),  /* Cyrillic Extended-B */
     AF_UNIRANGE_REC(  0x1C80,  0x1C8F ),  /* Cyrillic Extended-C */
+    AF_UNIRANGE_REC( 0x1E030, 0x1E08F ),  /* Cyrillic Extended-D */
     AF_UNIRANGE_REC(       0,       0 )
   };
 
@@ -285,15 +294,16 @@
 
   const AF_Script_UniRangeRec  af_deva_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0900,  0x093B ),  /* Devanagari          */
+    AF_UNIRANGE_REC(  0x0900,  0x093B ),  /* Devanagari            */
     /* omitting U+093C nukta */
-    AF_UNIRANGE_REC(  0x093D,  0x0950 ),  /* ... continued       */
+    AF_UNIRANGE_REC(  0x093D,  0x0950 ),  /* ... continued         */
     /* omitting U+0951 udatta, U+0952 anudatta */
-    AF_UNIRANGE_REC(  0x0953,  0x0963 ),  /* ... continued       */
+    AF_UNIRANGE_REC(  0x0953,  0x0963 ),  /* ... continued         */
     /* omitting U+0964 danda, U+0965 double danda */
-    AF_UNIRANGE_REC(  0x0966,  0x097F ),  /* ... continued       */
-    AF_UNIRANGE_REC(  0x20B9,  0x20B9 ),  /* (new) Rupee sign    */
-    AF_UNIRANGE_REC(  0xA8E0,  0xA8FF ),  /* Devanagari Extended */
+    AF_UNIRANGE_REC(  0x0966,  0x097F ),  /* ... continued         */
+    AF_UNIRANGE_REC(  0x20B9,  0x20B9 ),  /* (new) Rupee sign      */
+    AF_UNIRANGE_REC(  0xA8E0,  0xA8FF ),  /* Devanagari Extended   */
+    AF_UNIRANGE_REC( 0x11B00, 0x11B5F ),  /* Devanagari Extended-A */
     AF_UNIRANGE_REC(       0,       0 )
   };
 
@@ -329,6 +339,7 @@
     AF_UNIRANGE_REC(  0x1380,  0x139F ),  /* Ethiopic Supplement */
     AF_UNIRANGE_REC(  0x2D80,  0x2DDF ),  /* Ethiopic Extended   */
     AF_UNIRANGE_REC(  0xAB00,  0xAB2F ),  /* Ethiopic Extended-A */
+    AF_UNIRANGE_REC( 0x1E7E0, 0x1E7FF ),  /* Ethiopic Extended-B */
     AF_UNIRANGE_REC(       0,       0 )
   };
 
@@ -534,7 +545,7 @@
   {
     AF_UNIRANGE_REC(  0x0EB1,  0x0EB1 ),
     AF_UNIRANGE_REC(  0x0EB4,  0x0EBC ),
-    AF_UNIRANGE_REC(  0x0EC8,  0x0ECD ),
+    AF_UNIRANGE_REC(  0x0EC8,  0x0ECE ),
     AF_UNIRANGE_REC(       0,       0 )
   };
 
@@ -567,12 +578,15 @@
     AF_UNIRANGE_REC(  0x2C7E,  0x2C7F ),  /* ... continued                          */
     AF_UNIRANGE_REC(  0x2E00,  0x2E7F ),  /* Supplemental Punctuation               */
     AF_UNIRANGE_REC(  0xA720,  0xA76F ),  /* Latin Extended-D                       */
-    AF_UNIRANGE_REC(  0xA771,  0xA7F7 ),  /* ... continued                          */
+    AF_UNIRANGE_REC(  0xA771,  0xA7F0 ),  /* ... continued                          */
+    AF_UNIRANGE_REC(  0xA7F2,  0xA7F7 ),  /* ... continued                          */
     AF_UNIRANGE_REC(  0xA7FA,  0xA7FF ),  /* ... continued                          */
     AF_UNIRANGE_REC(  0xAB30,  0xAB5B ),  /* Latin Extended-E                       */
-    AF_UNIRANGE_REC(  0xAB60,  0xAB6F ),  /* ... continued                          */
+    AF_UNIRANGE_REC(  0xAB60,  0xAB68 ),  /* ... continued                          */
+    AF_UNIRANGE_REC(  0xAB6A,  0xAB6F ),  /* ... continued                          */
     AF_UNIRANGE_REC(  0xFB00,  0xFB06 ),  /* Alphab. Present. Forms (Latin Ligs)    */
     AF_UNIRANGE_REC( 0x1D400, 0x1D7FF ),  /* Mathematical Alphanumeric Symbols      */
+    AF_UNIRANGE_REC( 0x1DF00, 0x1DFFF ),  /* Latin Extended-G                       */
     AF_UNIRANGE_REC(       0,       0 )
   };
 
@@ -588,7 +602,7 @@
     AF_UNIRANGE_REC(  0x02B9,  0x02DF ),
     AF_UNIRANGE_REC(  0x02E5,  0x02FF ),
     AF_UNIRANGE_REC(  0x0300,  0x036F ),
-    AF_UNIRANGE_REC(  0x1AB0,  0x1ABE ),
+    AF_UNIRANGE_REC(  0x1AB0,  0x1AEB ),
     AF_UNIRANGE_REC(  0x1DC0,  0x1DFF ),
     AF_UNIRANGE_REC(  0x2017,  0x2017 ),
     AF_UNIRANGE_REC(  0x203E,  0x203E ),
@@ -625,8 +639,11 @@
     AF_UNIRANGE_REC(  0x2070,  0x207F ),  /* superscript digits and letters      */
     AF_UNIRANGE_REC(  0x2C7D,  0x2C7D ),  /* modifier letter capital v           */
     AF_UNIRANGE_REC(  0xA770,  0xA770 ),  /* modifier letter us                  */
+    AF_UNIRANGE_REC(  0xA7F1,  0xA7F1 ),  /* modifier letter capital s           */
     AF_UNIRANGE_REC(  0xA7F8,  0xA7F9 ),  /* more modifier letters               */
     AF_UNIRANGE_REC(  0xAB5C,  0xAB5F ),  /* more modifier letters               */
+    AF_UNIRANGE_REC(  0xAB69,  0xAB69 ),  /* modifier letter small turned w      */
+    AF_UNIRANGE_REC( 0x10780, 0x107FB ),  /* Latin Extended-F                    */
     AF_UNIRANGE_REC(       0,       0 )
   };
 
@@ -638,7 +655,8 @@
 
   const AF_Script_UniRangeRec  af_lisu_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0xA4D0,  0xA4FF ),    /* Lisu */
+    AF_UNIRANGE_REC(  0xA4D0,  0xA4FF ),    /* Lisu            */
+    AF_UNIRANGE_REC( 0x11FB0, 0x11FBF ),    /* Lisu Supplement */
     AF_UNIRANGE_REC(       0,       0 )
   };
 
@@ -696,6 +714,7 @@
     AF_UNIRANGE_REC(  0x1000,  0x109F ),    /* Myanmar            */
     AF_UNIRANGE_REC(  0xA9E0,  0xA9FF ),    /* Myanmar Extended-B */
     AF_UNIRANGE_REC(  0xAA60,  0xAA7F ),    /* Myanmar Extended-A */
+    AF_UNIRANGE_REC( 0x116D0, 0x116FF ),    /* Myanmar Extended-C */
     AF_UNIRANGE_REC(       0,       0 )
   };
 
@@ -836,6 +855,7 @@
 
   const AF_Script_UniRangeRec  af_sinh_nonbase_uniranges[] =
   {
+    AF_UNIRANGE_REC(  0x0D81,  0x0D81 ),
     AF_UNIRANGE_REC(  0x0DCA,  0x0DCA ),
     AF_UNIRANGE_REC(  0x0DD2,  0x0DD6 ),
     AF_UNIRANGE_REC(       0,       0 )
@@ -859,7 +879,8 @@
 
   const AF_Script_UniRangeRec  af_taml_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0B80,  0x0BFF ),  /* Tamil */
+    AF_UNIRANGE_REC(  0x0B80,  0x0BFF ),  /* Tamil            */
+    AF_UNIRANGE_REC( 0x11FC0, 0x11FFF ),  /* Tamil Supplement */
     AF_UNIRANGE_REC(       0,       0 )
   };
 
@@ -899,6 +920,7 @@
   {
     AF_UNIRANGE_REC(  0x0C00,  0x0C00 ),
     AF_UNIRANGE_REC(  0x0C04,  0x0C04 ),
+    AF_UNIRANGE_REC(  0x0C3C,  0x0C3C ),
     AF_UNIRANGE_REC(  0x0C3E,  0x0C40 ),
     AF_UNIRANGE_REC(  0x0C46,  0x0C56 ),
     AF_UNIRANGE_REC(  0x0C62,  0x0C63 ),
@@ -992,6 +1014,7 @@
     AF_UNIRANGE_REC(  0xA806,  0xA806 ),
     AF_UNIRANGE_REC(  0xA80B,  0xA80B ),
     AF_UNIRANGE_REC(  0xA825,  0xA826 ),
+    AF_UNIRANGE_REC(  0xA82C,  0xA82C ),
     AF_UNIRANGE_REC(       0,       0 )
   };
 
@@ -1048,15 +1071,21 @@
     AF_UNIRANGE_REC(  0xFE10,  0xFE1F ),  /* Vertical forms                          */
     AF_UNIRANGE_REC(  0xFE30,  0xFE4F ),  /* CJK Compatibility Forms                 */
     AF_UNIRANGE_REC(  0xFF00,  0xFFEF ),  /* Halfwidth and Fullwidth Forms           */
+    AF_UNIRANGE_REC( 0x1AFF0, 0x1AFFF ),  /* Kana Extended-B                         */
     AF_UNIRANGE_REC( 0x1B000, 0x1B0FF ),  /* Kana Supplement                         */
     AF_UNIRANGE_REC( 0x1B100, 0x1B12F ),  /* Kana Extended-A                         */
+    AF_UNIRANGE_REC( 0x1B130, 0x1B16F ),  /* Small Kana Extension                    */
     AF_UNIRANGE_REC( 0x1D300, 0x1D35F ),  /* Tai Xuan Hing Symbols                   */
     AF_UNIRANGE_REC( 0x20000, 0x2A6DF ),  /* CJK Unified Ideographs Extension B      */
     AF_UNIRANGE_REC( 0x2A700, 0x2B73F ),  /* CJK Unified Ideographs Extension C      */
     AF_UNIRANGE_REC( 0x2B740, 0x2B81F ),  /* CJK Unified Ideographs Extension D      */
     AF_UNIRANGE_REC( 0x2B820, 0x2CEAF ),  /* CJK Unified Ideographs Extension E      */
     AF_UNIRANGE_REC( 0x2CEB0, 0x2EBEF ),  /* CJK Unified Ideographs Extension F      */
+    AF_UNIRANGE_REC( 0x2EBF0, 0x2EE5D ),  /* CJK Unified Ideographs Extension I      */
     AF_UNIRANGE_REC( 0x2F800, 0x2FA1F ),  /* CJK Compatibility Ideographs Supplement */
+    AF_UNIRANGE_REC( 0x30000, 0x3134A ),  /* CJK Unified Ideographs Extension G      */
+    AF_UNIRANGE_REC( 0x31350, 0x323AF ),  /* CJK Unified Ideographs Extension H      */
+    AF_UNIRANGE_REC( 0x323B0, 0x33479 ),  /* CJK Unified Ideographs Extension J      */
     AF_UNIRANGE_REC(       0,       0 )
   };
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afranges.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afranges.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afranges.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afranges.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter Unicode script ranges (specification).
  *
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afscript.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afscript.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afscript.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afscript.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter scripts (specification only).
  *
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   HarfBuzz interface for accessing OpenType features (body).
  *
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -22,8 +22,8 @@
 #include "aftypes.h"
 #include "afshaper.h"
 
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
 
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
 
   /**************************************************************************
    *
@@ -89,17 +89,18 @@
 #define SCRIPT( s, S, d, h, H, ss )  h,
 
 
-  static const hb_script_t  scripts[] =
+  FT_LOCAL_ARRAY_DEF( hb_script_t )
+  af_hb_scripts[] =
   {
 #include "afscript.h"
   };
 
 
-  FT_Error
-  af_shaper_get_coverage( AF_FaceGlobals  globals,
-                          AF_StyleClass   style_class,
-                          FT_UShort*      gstyles,
-                          FT_Bool         default_script )
+  static FT_Error
+  af_shaper_get_coverage_hb( AF_FaceGlobals  globals,
+                             AF_StyleClass   style_class,
+                             FT_UShort*      gstyles,
+                             FT_Bool         default_script )
   {
     hb_face_t*  face;
 
@@ -124,10 +125,10 @@
     if ( !globals || !style_class || !gstyles )
       return FT_THROW( Invalid_Argument );
 
-    face = hb_font_get_face( globals->hb_font );
+    face = hb( font_get_face )( globals->hb_font );
 
     coverage_tags = coverages[style_class->coverage];
-    script        = scripts[style_class->script];
+    script        = af_hb_scripts[style_class->script];
 
     /* Convert a HarfBuzz script tag into the corresponding OpenType */
     /* tag or tags -- some Indic scripts like Devanagari have an old */
@@ -137,19 +138,19 @@
       hb_tag_t      tags[3];
 
 
-      hb_ot_tags_from_script_and_language( script,
-                                           HB_LANGUAGE_INVALID,
-                                           &tags_count,
-                                           tags,
-                                           NULL,
-                                           NULL );
+      hb( ot_tags_from_script_and_language )( script,
+                                              HB_LANGUAGE_INVALID,
+                                              &tags_count,
+                                              tags,
+                                              NULL,
+                                              NULL );
       script_tags[0] = tags_count > 0 ? tags[0] : HB_TAG_NONE;
       script_tags[1] = tags_count > 1 ? tags[1] : HB_TAG_NONE;
       script_tags[2] = tags_count > 2 ? tags[2] : HB_TAG_NONE;
     }
 
-    /* If the second tag is HB_OT_TAG_DEFAULT_SCRIPT, change that to     */
-    /* HB_TAG_NONE except for the default script.                        */
+    /* If the second tag is HB_OT_TAG_DEFAULT_SCRIPT, change that to */
+    /* HB_TAG_NONE except for the default script.                    */
     if ( default_script )
     {
       if ( script_tags[0] == HB_TAG_NONE )
@@ -170,15 +171,15 @@
         goto Exit;
     }
 
-    gsub_lookups = hb_set_create();
-    hb_ot_layout_collect_lookups( face,
-                                  HB_OT_TAG_GSUB,
-                                  script_tags,
-                                  NULL,
-                                  coverage_tags,
-                                  gsub_lookups );
+    gsub_lookups = hb( set_create )();
+    hb( ot_layout_collect_lookups )( face,
+                                     HB_OT_TAG_GSUB,
+                                     script_tags,
+                                     NULL,
+                                     coverage_tags,
+                                     gsub_lookups );
 
-    if ( hb_set_is_empty( gsub_lookups ) )
+    if ( hb( set_is_empty )( gsub_lookups ) )
       goto Exit; /* nothing to do */
 
     FT_TRACE4(( "GSUB lookups (style `%s'):\n",
@@ -189,22 +190,22 @@
     count = 0;
 #endif
 
-    gsub_glyphs = hb_set_create();
-    for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups, &idx ); )
+    gsub_glyphs = hb( set_create )();
+    for ( idx = HB_SET_VALUE_INVALID; hb( set_next )( gsub_lookups, &idx ); )
     {
 #ifdef FT_DEBUG_LEVEL_TRACE
-      FT_TRACE4(( " %d", idx ));
+      FT_TRACE4(( " %u", idx ));
       count++;
 #endif
 
       /* get output coverage of GSUB feature */
-      hb_ot_layout_lookup_collect_glyphs( face,
-                                          HB_OT_TAG_GSUB,
-                                          idx,
-                                          NULL,
-                                          NULL,
-                                          NULL,
-                                          gsub_glyphs );
+      hb( ot_layout_lookup_collect_glyphs )( face,
+                                             HB_OT_TAG_GSUB,
+                                             idx,
+                                             NULL,
+                                             NULL,
+                                             NULL,
+                                             gsub_glyphs );
     }
 
 #ifdef FT_DEBUG_LEVEL_TRACE
@@ -218,34 +219,34 @@
                 af_style_names[style_class->style] ));
     FT_TRACE4(( " " ));
 
-    gpos_lookups = hb_set_create();
-    hb_ot_layout_collect_lookups( face,
-                                  HB_OT_TAG_GPOS,
-                                  script_tags,
-                                  NULL,
-                                  coverage_tags,
-                                  gpos_lookups );
+    gpos_lookups = hb( set_create )();
+    hb( ot_layout_collect_lookups )( face,
+                                     HB_OT_TAG_GPOS,
+                                     script_tags,
+                                     NULL,
+                                     coverage_tags,
+                                     gpos_lookups );
 
 #ifdef FT_DEBUG_LEVEL_TRACE
     count = 0;
 #endif
 
-    gpos_glyphs = hb_set_create();
-    for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gpos_lookups, &idx ); )
+    gpos_glyphs = hb( set_create )();
+    for ( idx = HB_SET_VALUE_INVALID; hb( set_next )( gpos_lookups, &idx ); )
     {
 #ifdef FT_DEBUG_LEVEL_TRACE
-      FT_TRACE4(( " %d", idx ));
+      FT_TRACE4(( " %u", idx ));
       count++;
 #endif
 
       /* get input coverage of GPOS feature */
-      hb_ot_layout_lookup_collect_glyphs( face,
-                                          HB_OT_TAG_GPOS,
-                                          idx,
-                                          NULL,
-                                          gpos_glyphs,
-                                          NULL,
-                                          NULL );
+      hb( ot_layout_lookup_collect_glyphs )( face,
+                                             HB_OT_TAG_GPOS,
+                                             idx,
+                                             NULL,
+                                             gpos_glyphs,
+                                             NULL,
+                                             NULL );
     }
 
 #ifdef FT_DEBUG_LEVEL_TRACE
@@ -281,14 +282,14 @@
 
           GET_UTF8_CHAR( ch, p );
 
-          for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups,
-                                                         &idx ); )
+          for ( idx = HB_SET_VALUE_INVALID; hb( set_next )( gsub_lookups,
+                                                            &idx ); )
           {
             hb_codepoint_t  gidx = FT_Get_Char_Index( globals->face, ch );
 
 
-            if ( hb_ot_layout_lookup_would_substitute( face, idx,
-                                                       &gidx, 1, 1 ) )
+            if ( hb( ot_layout_lookup_would_substitute )( face, idx,
+                                                          &gidx, 1, 1 ) )
             {
               found = 1;
               break;
@@ -352,14 +353,14 @@
      *
      */
     if ( style_class->coverage != AF_COVERAGE_DEFAULT )
-      hb_set_subtract( gsub_glyphs, gpos_glyphs );
+      hb( set_subtract )( gsub_glyphs, gpos_glyphs );
 
 #ifdef FT_DEBUG_LEVEL_TRACE
     FT_TRACE4(( "  glyphs without GPOS data (`*' means already assigned)" ));
     count = 0;
 #endif
 
-    for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_glyphs, &idx ); )
+    for ( idx = HB_SET_VALUE_INVALID; hb( set_next )( gsub_glyphs, &idx ); )
     {
 #ifdef FT_DEBUG_LEVEL_TRACE
       if ( !( count % 10 ) )
@@ -368,7 +369,7 @@
         FT_TRACE4(( "   " ));
       }
 
-      FT_TRACE4(( " %d", idx ));
+      FT_TRACE4(( " %u", idx ));
       count++;
 #endif
 
@@ -397,10 +398,10 @@
 #endif
 
   Exit:
-    hb_set_destroy( gsub_lookups );
-    hb_set_destroy( gsub_glyphs  );
-    hb_set_destroy( gpos_lookups );
-    hb_set_destroy( gpos_glyphs  );
+    hb( set_destroy )( gsub_lookups );
+    hb( set_destroy )( gsub_glyphs  );
+    hb( set_destroy )( gpos_lookups );
+    hb( set_destroy )( gpos_glyphs  );
 
     return FT_Err_Ok;
   }
@@ -437,31 +438,33 @@
   };
 
 
-  void*
-  af_shaper_buf_create( FT_Face  face )
+  static void*
+  af_shaper_buf_create_hb( AF_FaceGlobals  globals )
   {
-    FT_UNUSED( face );
+    FT_UNUSED( globals );
 
-    return (void*)hb_buffer_create();
+    return (void*)hb( buffer_create )();
   }
 
 
-  void
-  af_shaper_buf_destroy( FT_Face  face,
-                         void*    buf )
+  static void
+  af_shaper_buf_destroy_hb( AF_FaceGlobals  globals,
+                            void*           buf )
   {
-    FT_UNUSED( face );
+    FT_UNUSED( globals );
 
-    hb_buffer_destroy( (hb_buffer_t*)buf );
+    hb( buffer_destroy )( (hb_buffer_t*)buf );
   }
 
 
-  const char*
-  af_shaper_get_cluster( const char*      p,
-                         AF_StyleMetrics  metrics,
-                         void*            buf_,
-                         unsigned int*    count )
+  static const char*
+  af_shaper_get_cluster_hb( const char*      p,
+                            AF_StyleMetrics  metrics,
+                            void*            buf_,
+                            unsigned int*    count )
   {
+    AF_FaceGlobals  globals = metrics->globals;
+
     AF_StyleClass        style_class;
     const hb_feature_t*  feature;
     FT_Int               upem;
@@ -472,6 +475,8 @@
     hb_font_t*      font;
     hb_codepoint_t  dummy;
 
+    FT_UNUSED( globals );
+
 
     upem        = (FT_Int)metrics->globals->face->units_per_EM;
     style_class = metrics->style_class;
@@ -480,7 +485,7 @@
     font = metrics->globals->hb_font;
 
     /* we shape at a size of units per EM; this means font units */
-    hb_font_set_scale( font, upem, upem );
+    hb( font_set_scale )( font, upem, upem );
 
     while ( *p == ' ' )
       p++;
@@ -492,15 +497,15 @@
     len = (int)( q - p );
 
     /* feed character(s) to the HarfBuzz buffer */
-    hb_buffer_clear_contents( buf );
-    hb_buffer_add_utf8( buf, p, len, 0, len );
+    hb( buffer_clear_contents )( buf );
+    hb( buffer_add_utf8 )( buf, p, len, 0, len );
 
     /* we let HarfBuzz guess the script and writing direction */
-    hb_buffer_guess_segment_properties( buf );
+    hb( buffer_guess_segment_properties )( buf );
 
     /* shape buffer, which means conversion from character codes to */
     /* glyph indices, possibly applying a feature                   */
-    hb_shape( font, buf, feature, feature ? 1 : 0 );
+    hb( shape )( font, buf, feature, feature ? 1 : 0 );
 
     if ( feature )
     {
@@ -517,13 +522,13 @@
       /* glyph indices; otherwise the affected glyph or glyphs aren't     */
       /* available at all in the feature                                  */
 
-      hb_buffer_clear_contents( hb_buf );
-      hb_buffer_add_utf8( hb_buf, p, len, 0, len );
-      hb_buffer_guess_segment_properties( hb_buf );
-      hb_shape( font, hb_buf, NULL, 0 );
+      hb( buffer_clear_contents )( hb_buf );
+      hb( buffer_add_utf8 )( hb_buf, p, len, 0, len );
+      hb( buffer_guess_segment_properties )( hb_buf );
+      hb( shape )( font, hb_buf, NULL, 0 );
 
-      ginfo    = hb_buffer_get_glyph_infos( buf, &gcount );
-      hb_ginfo = hb_buffer_get_glyph_infos( hb_buf, &hb_gcount );
+      ginfo    = hb( buffer_get_glyph_infos )( buf, &gcount );
+      hb_ginfo = hb( buffer_get_glyph_infos )( hb_buf, &hb_gcount );
 
       if ( gcount == hb_gcount )
       {
@@ -537,12 +542,12 @@
         if ( i == gcount )
         {
           /* both buffers have identical glyph indices */
-          hb_buffer_clear_contents( buf );
+          hb( buffer_clear_contents )( buf );
         }
       }
     }
 
-    *count = hb_buffer_get_length( buf );
+    *count = hb( buffer_get_length )( buf );
 
 #ifdef FT_DEBUG_LEVEL_TRACE
     if ( feature && *count > 1 )
@@ -554,23 +559,25 @@
   }
 
 
-  FT_ULong
-  af_shaper_get_elem( AF_StyleMetrics  metrics,
-                      void*            buf_,
-                      unsigned int     idx,
-                      FT_Long*         advance,
-                      FT_Long*         y_offset )
+  static FT_ULong
+  af_shaper_get_elem_hb( AF_StyleMetrics  metrics,
+                         void*            buf_,
+                         unsigned int     idx,
+                         FT_Long*         advance,
+                         FT_Long*         y_offset )
   {
+    AF_FaceGlobals  globals = metrics->globals;
+
     hb_buffer_t*          buf = (hb_buffer_t*)buf_;
     hb_glyph_info_t*      ginfo;
     hb_glyph_position_t*  gpos;
     unsigned int          gcount;
 
-    FT_UNUSED( metrics );
+    FT_UNUSED( globals );
 
 
-    ginfo = hb_buffer_get_glyph_infos( buf, &gcount );
-    gpos  = hb_buffer_get_glyph_positions( buf, &gcount );
+    ginfo = hb( buffer_get_glyph_infos )( buf, &gcount );
+    gpos  = hb( buffer_get_glyph_positions )( buf, &gcount );
 
     if ( idx >= gcount )
       return 0;
@@ -584,14 +591,14 @@
   }
 
 
-#else /* !FT_CONFIG_OPTION_USE_HARFBUZZ */
+#endif /* FT_CONFIG_OPTION_USE_HARFBUZZ */
 
 
-  FT_Error
-  af_shaper_get_coverage( AF_FaceGlobals  globals,
-                          AF_StyleClass   style_class,
-                          FT_UShort*      gstyles,
-                          FT_Bool         default_script )
+  static FT_Error
+  af_shaper_get_coverage_nohb( AF_FaceGlobals  globals,
+                               AF_StyleClass   style_class,
+                               FT_UShort*      gstyles,
+                               FT_Bool         default_script )
   {
     FT_UNUSED( globals );
     FT_UNUSED( style_class );
@@ -602,29 +609,29 @@
   }
 
 
-  void*
-  af_shaper_buf_create( FT_Face  face )
+  static void*
+  af_shaper_buf_create_nohb( AF_FaceGlobals  globals )
   {
-    FT_UNUSED( face );
+    FT_UNUSED( globals );
 
     return NULL;
   }
 
 
-  void
-  af_shaper_buf_destroy( FT_Face  face,
-                         void*    buf )
+  static void
+  af_shaper_buf_destroy_nohb( AF_FaceGlobals  globals,
+                              void*    buf )
   {
-    FT_UNUSED( face );
+    FT_UNUSED( globals );
     FT_UNUSED( buf );
   }
 
 
-  const char*
-  af_shaper_get_cluster( const char*      p,
-                         AF_StyleMetrics  metrics,
-                         void*            buf_,
-                         unsigned int*    count )
+  static const char*
+  af_shaper_get_cluster_nohb( const char*      p,
+                              AF_StyleMetrics  metrics,
+                              void*            buf_,
+                              unsigned int*    count )
   {
     FT_Face    face      = metrics->globals->face;
     FT_ULong   ch, dummy = 0;
@@ -656,12 +663,12 @@
   }
 
 
-  FT_ULong
-  af_shaper_get_elem( AF_StyleMetrics  metrics,
-                      void*            buf_,
-                      unsigned int     idx,
-                      FT_Long*         advance,
-                      FT_Long*         y_offset )
+  static FT_ULong
+  af_shaper_get_elem_nohb( AF_StyleMetrics  metrics,
+                           void*            buf_,
+                           unsigned int     idx,
+                           FT_Long*         advance,
+                           FT_Long*         y_offset )
   {
     FT_Face   face        = metrics->globals->face;
     FT_ULong  glyph_index = *(FT_ULong*)buf_;
@@ -684,7 +691,90 @@
   }
 
 
-#endif /* !FT_CONFIG_OPTION_USE_HARFBUZZ */
+  /********************************************************************/
+
+  FT_Error
+  af_shaper_get_coverage( AF_FaceGlobals  globals,
+                          AF_StyleClass   style_class,
+                          FT_UShort*      gstyles,
+                          FT_Bool         default_script )
+  {
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+    if ( ft_hb_enabled( globals ) )
+      return af_shaper_get_coverage_hb( globals,
+                                        style_class,
+                                        gstyles,
+                                        default_script );
+    else
+#endif
+      return af_shaper_get_coverage_nohb( globals,
+                                          style_class,
+                                          gstyles,
+                                          default_script );
+  }
+
+
+  void*
+  af_shaper_buf_create( AF_FaceGlobals  globals )
+  {
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+    if ( ft_hb_enabled( globals ) )
+      return af_shaper_buf_create_hb( globals );
+    else
+#endif
+      return af_shaper_buf_create_nohb( globals );
+  }
+
+
+  void
+  af_shaper_buf_destroy( AF_FaceGlobals  globals,
+                         void*           buf )
+  {
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+    if ( ft_hb_enabled( globals ) )
+      af_shaper_buf_destroy_hb( globals, buf );
+    else
+#endif
+      af_shaper_buf_destroy_nohb( globals, buf );
+  }
+
+
+  const char*
+  af_shaper_get_cluster( const char*      p,
+                         AF_StyleMetrics  metrics,
+                         void*            buf_,
+                         unsigned int*    count )
+  {
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+    if ( ft_hb_enabled( metrics->globals ) )
+      return af_shaper_get_cluster_hb( p, metrics, buf_, count );
+    else
+#endif
+      return af_shaper_get_cluster_nohb( p, metrics, buf_, count );
+  }
+
+
+  FT_ULong
+  af_shaper_get_elem( AF_StyleMetrics  metrics,
+                      void*            buf_,
+                      unsigned int     idx,
+                      FT_Long*         advance,
+                      FT_Long*         y_offset )
+  {
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+    if ( ft_hb_enabled( metrics->globals ) )
+      return af_shaper_get_elem_hb( metrics,
+                                    buf_,
+                                    idx,
+                                    advance,
+                                    y_offset );
+#endif
+      return af_shaper_get_elem_nohb( metrics,
+                                      buf_,
+                                      idx,
+                                      advance,
+                                      y_offset );
+  }
 
 
 /* END */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afshaper.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   HarfBuzz interface for accessing OpenType features (specification).
  *
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -23,17 +23,14 @@
 #include 
 
 
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-
-#include 
-#include 
-#include "ft-hb.h"
+FT_BEGIN_HEADER
 
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+  FT_LOCAL_ARRAY( hb_script_t )
+  af_hb_scripts[];
 #endif
 
 
-FT_BEGIN_HEADER
-
   FT_Error
   af_shaper_get_coverage( AF_FaceGlobals  globals,
                           AF_StyleClass   style_class,
@@ -42,11 +39,11 @@
 
 
   void*
-  af_shaper_buf_create( FT_Face  face );
+  af_shaper_buf_create( AF_FaceGlobals  globals );
 
   void
-  af_shaper_buf_destroy( FT_Face  face,
-                         void*    buf );
+  af_shaper_buf_destroy( AF_FaceGlobals  globals,
+                         void*           buf );
 
   const char*
   af_shaper_get_cluster( const char*      p,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afstyles.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afstyles.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afstyles.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afstyles.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter styles (specification only).
  *
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -50,36 +50,36 @@
                  AF_COVERAGE_ ## C )
 
 #undef  META_STYLE_LATIN
-#define META_STYLE_LATIN( s, S, ds )                     \
-          STYLE_LATIN( s, S, c2cp, C2CP, ds,             \
+#define META_STYLE_LATIN( s, S, ds )                    \
+          STYLE_LATIN( s, S, c2cp, C2CP, ds,            \
                        "petite capitals from capitals", \
-                       PETITE_CAPITALS_FROM_CAPITALS )   \
-          STYLE_LATIN( s, S, c2sc, C2SC, ds,             \
+                       PETITE_CAPITALS_FROM_CAPITALS )  \
+          STYLE_LATIN( s, S, c2sc, C2SC, ds,            \
                        "small capitals from capitals",  \
-                       SMALL_CAPITALS_FROM_CAPITALS )    \
-          STYLE_LATIN( s, S, ordn, ORDN, ds,             \
-                       "ordinals",                       \
-                       ORDINALS )                        \
-          STYLE_LATIN( s, S, pcap, PCAP, ds,             \
-                       "petite capitals",                \
-                       PETITE_CAPITALS )                 \
-          STYLE_LATIN( s, S, sinf, SINF, ds,             \
-                       "scientific inferiors",           \
-                       SCIENTIFIC_INFERIORS )            \
-          STYLE_LATIN( s, S, smcp, SMCP, ds,             \
-                       "small capitals",                 \
-                       SMALL_CAPITALS )                  \
-          STYLE_LATIN( s, S, subs, SUBS, ds,             \
-                       "subscript",                      \
-                       SUBSCRIPT )                       \
-          STYLE_LATIN( s, S, sups, SUPS, ds,             \
-                       "superscript",                    \
-                       SUPERSCRIPT )                     \
-          STYLE_LATIN( s, S, titl, TITL, ds,             \
-                       "titling",                        \
-                       TITLING )                         \
-          STYLE_LATIN( s, S, dflt, DFLT, ds,             \
-                       "default",                        \
+                       SMALL_CAPITALS_FROM_CAPITALS )   \
+          STYLE_LATIN( s, S, ordn, ORDN, ds,            \
+                       "ordinals",                      \
+                       ORDINALS )                       \
+          STYLE_LATIN( s, S, pcap, PCAP, ds,            \
+                       "petite capitals",               \
+                       PETITE_CAPITALS )                \
+          STYLE_LATIN( s, S, sinf, SINF, ds,            \
+                       "scientific inferiors",          \
+                       SCIENTIFIC_INFERIORS )           \
+          STYLE_LATIN( s, S, smcp, SMCP, ds,            \
+                       "small capitals",                \
+                       SMALL_CAPITALS )                 \
+          STYLE_LATIN( s, S, subs, SUBS, ds,            \
+                       "subscript",                     \
+                       SUBSCRIPT )                      \
+          STYLE_LATIN( s, S, sups, SUPS, ds,            \
+                       "superscript",                   \
+                       SUPERSCRIPT )                    \
+          STYLE_LATIN( s, S, titl, TITL, ds,            \
+                       "titling",                       \
+                       TITLING )                        \
+          STYLE_LATIN( s, S, dflt, DFLT, ds,            \
+                       "default",                       \
                        DEFAULT )
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/aftypes.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/aftypes.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/aftypes.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/aftypes.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter types (specification only).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -35,6 +35,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 
@@ -406,6 +407,7 @@
 
   typedef struct AF_FaceGlobalsRec_*  AF_FaceGlobals;
 
+
   /* This is the main structure that combines everything.  Autofit modules */
   /* specific to writing systems derive their structures from it, for      */
   /* example `AF_LatinMetrics'.                                            */
@@ -418,6 +420,8 @@
 
     AF_FaceGlobals  globals;    /* to access properties */
 
+    FT_Hash  reverse_charmap;
+
   } AF_StyleMetricsRec;
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afws-decl.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afws-decl.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afws-decl.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afws-decl.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter writing system declarations (specification only).
  *
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afws-iter.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afws-iter.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/afws-iter.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/afws-iter.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auto-fitter writing systems iterator (specification only).
  *
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.c	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.c	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,197 @@
+/****************************************************************************
+ *
+ * ft-hb.c
+ *
+ *   FreeType-HarfBuzz bridge (body).
+ *
+ * Copyright (C) 2025 by
+ * Behdad Esfahbod.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT.  By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ */
+
+
+#if !defined( _WIN32 ) && !defined( _GNU_SOURCE )
+#  define _GNU_SOURCE  1  /* for RTLD_DEFAULT */
+#endif
+
+#include 
+#include 
+
+#include "afglobal.h"
+
+#include "ft-hb.h"
+
+
+#if defined( FT_CONFIG_OPTION_USE_HARFBUZZ )         && \
+    defined( FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC )
+
+#ifndef FT_LIBHARFBUZZ
+#  ifdef _WIN32
+#    define FT_LIBHARFBUZZ "libharfbuzz-0.dll"
+#  else
+#    ifdef __APPLE__
+#      define FT_LIBHARFBUZZ "libharfbuzz.0.dylib"
+#    else
+#      define FT_LIBHARFBUZZ "libharfbuzz.so.0"
+#    endif
+#  endif
+#endif
+
+#ifdef _WIN32
+
+#  include 
+
+#else /* !_WIN32 */
+
+#  include 
+
+  /* The GCC pragma suppresses the warning "ISO C forbids     */
+  /* assignment between function pointer and 'void *'", which */
+  /* inevitably gets emitted with `-Wpedantic`; see the man   */
+  /* page of function `dlsym` for more information.           */
+#  if defined( __GNUC__ )
+#    pragma GCC diagnostic push
+#    ifndef __cplusplus
+#      pragma GCC diagnostic ignored "-Wpedantic"
+#    endif
+#  endif
+
+#endif /* !_WIN32 */
+
+
+  FT_LOCAL_DEF( void )
+  ft_hb_funcs_init( struct AF_ModuleRec_  *af_module )
+  {
+    FT_Memory  memory = af_module->root.memory;
+    FT_Error   error;
+
+    ft_hb_funcs_t                *funcs           = NULL;
+    ft_hb_version_atleast_func_t  version_atleast = NULL;
+
+#ifdef _WIN32
+    HANDLE  lib;
+#  define DLSYM( lib, name ) \
+            (ft_ ## name ## _func_t)GetProcAddress( lib, #name )
+#else
+    void  *lib;
+#  define DLSYM( lib, name ) \
+            (ft_ ## name ## _func_t)dlsym( lib, #name )
+#endif
+
+
+    af_module->hb_funcs = NULL;
+
+    if ( FT_NEW( funcs ) )
+      return;
+    FT_ZERO( funcs );
+
+#ifdef _WIN32
+
+    lib = LoadLibraryA( FT_LIBHARFBUZZ );
+    if ( !lib )
+      goto Fail;
+    version_atleast = DLSYM( lib, hb_version_atleast );
+
+#else /* !_WIN32 */
+
+#  ifdef RTLD_DEFAULT
+#    define FT_RTLD_FLAGS RTLD_LAZY | RTLD_GLOBAL
+    lib             = RTLD_DEFAULT;
+    version_atleast = DLSYM( lib, hb_version_atleast );
+#  else
+#    define FT_RTLD_FLAGS RTLD_LAZY
+#  endif
+
+    if ( !version_atleast )
+    {
+      /* Load the HarfBuzz library.
+       *
+       * We never close the library, since we opened it with RTLD_GLOBAL.
+       * This is important for the case where we are using HarfBuzz as a
+       * shared library, and we want to use the symbols from the library in
+       * other shared libraries or clients.  HarfBuzz holds onto global
+       * variables, and closing the library will cause them to be
+       * invalidated.
+       */
+      lib = dlopen( FT_LIBHARFBUZZ, FT_RTLD_FLAGS );
+      if ( !lib )
+        goto Fail;
+      version_atleast = DLSYM( lib, hb_version_atleast );
+    }
+
+#endif /* !_WIN32 */
+
+    if ( !version_atleast )
+      goto Fail;
+
+    /* Load all symbols we use. */
+#define HB_EXTERN( ret, name, args )  \
+  {                                   \
+    funcs->name = DLSYM( lib, name ); \
+    if ( !funcs->name )               \
+      goto Fail;                      \
+  }
+#include "ft-hb-decls.h"
+#undef HB_EXTERN
+
+#undef DLSYM
+
+    af_module->hb_funcs = funcs;
+    return;
+
+  Fail:
+    if ( funcs )
+      FT_FREE( funcs );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  ft_hb_funcs_done( struct AF_ModuleRec_  *af_module )
+  {
+    FT_Memory  memory = af_module->root.memory;
+
+
+    if ( af_module->hb_funcs )
+    {
+      FT_FREE( af_module->hb_funcs );
+      af_module->hb_funcs = NULL;
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  ft_hb_enabled( struct AF_FaceGlobalsRec_  *globals )
+  {
+    return globals->module->hb_funcs != NULL;
+  }
+
+#ifndef _WIN32
+#  if defined( __GNUC__ )
+#    pragma GCC diagnostic pop
+#  endif
+#endif
+
+#else /* !FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC */
+
+  FT_LOCAL_DEF( FT_Bool )
+  ft_hb_enabled( struct AF_FaceGlobalsRec_  *globals )
+  {
+    FT_UNUSED( globals );
+
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+    return TRUE;
+#else
+    return FALSE;
+#endif
+  }
+
+#endif /* !FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC */
+
+
+/* END */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.h	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/autofit/ft-hb.h	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,82 @@
+/****************************************************************************
+ *
+ * ft-hb.h
+ *
+ *   FreeType-HarfBuzz bridge (specification).
+ *
+ * Copyright (C) 2025 by
+ * Behdad Esfahbod.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT.  By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ */
+
+
+#ifndef FT_HB_H
+#define FT_HB_H
+
+#include 
+#include 
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+
+#  include "ft-hb-types.h"
+
+#  ifdef FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC
+
+#    define HB_EXTERN( ret, name, args ) \
+              typedef ret (*ft_ ## name ## _func_t) args;
+#    include "ft-hb-decls.h"
+#    undef HB_EXTERN
+
+  typedef struct ft_hb_funcs_t
+  {
+#    define HB_EXTERN( ret, name, args ) \
+              ft_ ## name ## _func_t  name;
+#    include "ft-hb-decls.h"
+#    undef HB_EXTERN
+  } ft_hb_funcs_t;
+
+  struct  AF_ModuleRec_;
+
+  FT_LOCAL( void )
+  ft_hb_funcs_init( struct AF_ModuleRec_  *af_module );
+
+  FT_LOCAL( void )
+  ft_hb_funcs_done( struct AF_ModuleRec_  *af_module );
+
+#    define hb( x )  globals->module->hb_funcs->hb_ ## x
+
+#  else /* !FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC */
+
+#    define HB_EXTERN( ret, name, args ) \
+              ret name args;
+#    include "ft-hb-decls.h"
+#    undef HB_EXTERN
+
+#    define hb( x )  hb_ ## x
+
+#  endif /* !FT_CONFIG_OPTION_USE_HARFBUZZ_DYNAMIC */
+
+#endif /* FT_CONFIG_OPTION_USE_HARFBUZZ */
+
+
+  struct AF_FaceGlobalsRec_;
+
+  FT_LOCAL( FT_Bool )
+  ft_hb_enabled( struct AF_FaceGlobalsRec_  *globals );
+
+
+FT_END_HEADER
+
+#endif /* FT_HB_H */
+
+
+/* END */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftadvanc.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftadvanc.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftadvanc.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftadvanc.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Quick computation of advance widths (body).
  *
- * Copyright (C) 2008-2024 by
+ * Copyright (C) 2008-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -20,6 +20,7 @@
 
 #include 
 #include 
+#include 
 
 
   static FT_Error
@@ -47,11 +48,43 @@
     /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c)        */
 
     for ( nn = 0; nn < count; nn++ )
-      advances[nn] = FT_MulDiv( advances[nn], scale, 64 );
+      advances[nn] = FT_MulFix( 1024 * advances[nn], scale );
 
     return FT_Err_Ok;
   }
 
+  /* loading (and hinting) to calculate the advances is slow  */
+  /* unless TrueType hdmx table is provided as an accelerator */
+  static FT_Error
+  ft_load_advances( FT_Face   face,
+                    FT_UInt   gindex,
+                    FT_UInt   count,
+                    FT_Int32  flags,
+                    FT_Fixed  *padvances )
+  {
+    FT_UInt   nn;
+    FT_Error  error   = FT_Err_Ok;
+    FT_Pos    factor  = flags & FT_LOAD_NO_SCALE ? 1 : 1024;
+    FT_Pos*   advance = flags & FT_LOAD_VERTICAL_LAYOUT
+                          ? &face->glyph->advance.y
+                          : &face->glyph->advance.x;
+
+
+    flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
+
+    for ( nn = 0; nn < count; nn++ )
+    {
+      error = FT_Load_Glyph( face, gindex + nn, flags );
+      if ( error )
+        break;
+
+      /* scale from 26.6 to 16.16, unless NO_SCALE was requested */
+      padvances[nn] = *advance * factor;
+    }
+
+    return error;
+  }
+
 
    /* at the moment, we can perform fast advance retrieval only in */
    /* the following cases:                                         */
@@ -102,7 +135,10 @@
         return error;
     }
 
-    return FT_Get_Advances( face, gindex, 1, flags, padvance );
+    if ( flags & FT_ADVANCE_FLAG_FAST_ONLY )
+      return FT_THROW( Unimplemented_Feature );
+
+    return ft_load_advances( face, gindex, 1, flags, padvance );
   }
 
 
@@ -115,12 +151,9 @@
                    FT_Int32   flags,
                    FT_Fixed  *padvances )
   {
-    FT_Error  error = FT_Err_Ok;
-
     FT_Face_GetAdvancesFunc  func;
 
-    FT_UInt  num, end, nn;
-    FT_Int   factor;
+    FT_UInt  num, end;
 
 
     if ( !face )
@@ -140,6 +173,9 @@
     func = face->driver->clazz->get_advances;
     if ( func && LOAD_ADVANCE_FAST_CHECK( face, flags ) )
     {
+      FT_Error  error;
+
+
       error = func( face, start, count, flags, padvances );
       if ( !error )
         return ft_face_scale_advances_( face, padvances, count, flags );
@@ -148,26 +184,10 @@
         return error;
     }
 
-    error = FT_Err_Ok;
-
     if ( flags & FT_ADVANCE_FLAG_FAST_ONLY )
       return FT_THROW( Unimplemented_Feature );
 
-    flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
-    factor = ( flags & FT_LOAD_NO_SCALE ) ? 1 : 1024;
-    for ( nn = 0; nn < count; nn++ )
-    {
-      error = FT_Load_Glyph( face, start + nn, flags );
-      if ( error )
-        break;
-
-      /* scale from 26.6 to 16.16, unless NO_SCALE was requested */
-      padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
-                      ? face->glyph->advance.y * factor
-                      : face->glyph->advance.x * factor;
-    }
-
-    return error;
+    return ft_load_advances( face, start, count, flags, padvances );
   }
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftbase.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftbase.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftbase.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftbase.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Private functions used in the `base' module (specification).
  *
- * Copyright (C) 2008-2024 by
+ * Copyright (C) 2008-2025 by
  * David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -34,7 +34,7 @@
 #ifdef FT_CONFIG_OPTION_MAC_FONTS
 
   /* MacOS resource fork cannot exceed 16MB at least for Carbon code; */
-  /* see https://support.microsoft.com/en-us/kb/130437                */
+  /* see https://jeffpar.github.io/kbarchive/kb/130/Q130437/          */
 #define FT_MAC_RFORK_MAX_LEN  0x00FFFFFFUL
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftbbox.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftbbox.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftbbox.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftbbox.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType bbox computation (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftbitmap.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftbitmap.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftbitmap.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftbitmap.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType utility functions for bitmaps (body).
  *
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -876,13 +876,13 @@
 
 #ifdef FT_DEBUG_LEVEL_TRACE
     FT_TRACE5(( "FT_Bitmap_Blend:\n" ));
-    FT_TRACE5(( "  source bitmap: (%ld, %ld) -- (%ld, %ld); %d x %d\n",
+    FT_TRACE5(( "  source bitmap: (%ld, %ld) -- (%ld, %ld); %u x %u\n",
       source_llx / 64, source_lly / 64,
       source_urx / 64, source_ury / 64,
       source_->width, source_->rows ));
 
     if ( target->width && target->rows )
-      FT_TRACE5(( "  target bitmap: (%ld, %ld) -- (%ld, %ld); %d x %d\n",
+      FT_TRACE5(( "  target bitmap: (%ld, %ld) -- (%ld, %ld); %u x %u\n",
         target_llx / 64, target_lly / 64,
         target_urx / 64, target_ury / 64,
         target->width, target->rows ));
@@ -890,7 +890,7 @@
       FT_TRACE5(( "  target bitmap: empty\n" ));
 
     if ( final_width && final_rows )
-      FT_TRACE5(( "  final bitmap: (%ld, %ld) -- (%ld, %ld); %d x %d\n",
+      FT_TRACE5(( "  final bitmap: (%ld, %ld) -- (%ld, %ld); %u x %u\n",
         final_llx / 64, final_lly / 64,
         final_urx / 64, final_ury / 64,
         final_width, final_rows ));
@@ -922,14 +922,7 @@
       target->pitch      = (int)final_width * 4;
       target->num_grays  = 256;
 
-      if ( FT_LONG_MAX / target->pitch < (int)target->rows )
-      {
-        FT_TRACE5(( "FT_Blend_Bitmap: target bitmap too large (%d x %d)\n",
-                     final_width, final_rows ));
-        return FT_THROW( Invalid_Argument );
-      }
-
-      if ( FT_ALLOC( target->buffer, target->pitch * (int)target->rows ) )
+      if ( FT_ALLOC_MULT( target->buffer, target->rows, target->pitch ) )
         return error;
 
       free_target_bitmap_on_error = 1;
@@ -950,16 +943,9 @@
 
       new_pitch = (int)final_width * 4;
 
-      if ( FT_LONG_MAX / new_pitch < (int)final_rows )
-      {
-        FT_TRACE5(( "FT_Blend_Bitmap: target bitmap too large (%d x %d)\n",
-                     final_width, final_rows ));
-        return FT_THROW( Invalid_Argument );
-      }
-
       /* TODO: provide an in-buffer solution for large bitmaps */
       /*       to avoid allocation of a new buffer             */
-      if ( FT_ALLOC( buffer, new_pitch * (int)final_rows ) )
+      if ( FT_ALLOC_MULT( buffer, final_rows, new_pitch ) )
         goto Error;
 
       /* copy data to new buffer */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftcalc.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftcalc.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftcalc.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftcalc.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Arithmetic computations (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -38,24 +38,11 @@
 #include 
 #include 
 
-
-#ifdef FT_MULFIX_ASSEMBLER
-#undef FT_MulFix
+  /* cancel inlining macro from internal/ftcalc.h */
+#ifdef FT_MulFix
+#  undef FT_MulFix
 #endif
 
-/* we need to emulate a 64-bit data type if a real one isn't available */
-
-#ifndef FT_INT64
-
-  typedef struct  FT_Int64_
-  {
-    FT_UInt32  lo;
-    FT_UInt32  hi;
-
-  } FT_Int64;
-
-#endif /* !FT_INT64 */
-
 
   /**************************************************************************
    *
@@ -88,7 +75,7 @@
   FT_EXPORT_DEF( FT_Fixed )
   FT_RoundFix( FT_Fixed  a )
   {
-    return ( ADD_LONG( a, 0x8000L - ( a < 0 ) ) ) & ~0xFFFFL;
+    return ADD_LONG( a, 0x8000L - ( a < 0 ) ) & ~0xFFFFL;
   }
 
 
@@ -97,7 +84,7 @@
   FT_EXPORT_DEF( FT_Fixed )
   FT_CeilFix( FT_Fixed  a )
   {
-    return ( ADD_LONG( a, 0xFFFFL ) ) & ~0xFFFFL;
+    return ADD_LONG( a, 0xFFFFL ) & ~0xFFFFL;
   }
 
 
@@ -225,18 +212,18 @@
   FT_MulFix( FT_Long  a_,
              FT_Long  b_ )
   {
-#ifdef FT_MULFIX_ASSEMBLER
+#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
 
-    return FT_MULFIX_ASSEMBLER( (FT_Int32)a_, (FT_Int32)b_ );
+    return FT_MulFix_64( a_, b_ );
 
 #else
 
-    FT_Int64  ab = (FT_Int64)a_ * (FT_Int64)b_;
+    FT_Int64  ab = MUL_INT64( a_, b_ );
 
     /* this requires arithmetic right shift of signed numbers */
-    return (FT_Long)( ( ab + 0x8000L - ( ab < 0 ) ) >> 16 );
+    return (FT_Long)( ( ab + 0x8000L + ( ab >> 63 ) ) >> 16 );
 
-#endif /* FT_MULFIX_ASSEMBLER */
+#endif /* FT_CONFIG_OPTION_INLINE_MULFIX */
   }
 
 
@@ -975,43 +962,36 @@
 
 #else
 
-    FT_Int  result;
+    FT_Int64  z1, z2;
+    FT_Int    result;
 
 
-    if ( ADD_LONG( FT_ABS( in_x ), FT_ABS( out_y ) ) <= 131071L &&
-         ADD_LONG( FT_ABS( in_y ), FT_ABS( out_x ) ) <= 131071L )
+    if ( (FT_ULong)FT_ABS( in_x ) + (FT_ULong)FT_ABS( out_y ) <= 92681UL )
     {
-      FT_Long  z1 = MUL_LONG( in_x, out_y );
-      FT_Long  z2 = MUL_LONG( in_y, out_x );
-
-
-      if ( z1 > z2 )
-        result = +1;
-      else if ( z1 < z2 )
-        result = -1;
-      else
-        result = 0;
+      z1.lo = (FT_UInt32)in_x * (FT_UInt32)out_y;
+      z1.hi = (FT_UInt32)( (FT_Int32)z1.lo >> 31 );  /* sign-expansion */
     }
-    else /* products might overflow 32 bits */
-    {
-      FT_Int64  z1, z2;
-
-
-      /* XXX: this function does not allow 64-bit arguments */
+    else
       ft_multo64( (FT_UInt32)in_x, (FT_UInt32)out_y, &z1 );
-      ft_multo64( (FT_UInt32)in_y, (FT_UInt32)out_x, &z2 );
 
-      if ( z1.hi > z2.hi )
-        result = +1;
-      else if ( z1.hi < z2.hi )
-        result = -1;
-      else if ( z1.lo > z2.lo )
-        result = +1;
-      else if ( z1.lo < z2.lo )
-        result = -1;
-      else
-        result = 0;
+    if ( (FT_ULong)FT_ABS( in_y ) + (FT_ULong)FT_ABS( out_x ) <= 92681UL )
+    {
+      z2.lo = (FT_UInt32)in_y * (FT_UInt32)out_x;
+      z2.hi = (FT_UInt32)( (FT_Int32)z2.lo >> 31 );  /* sign-expansion */
     }
+    else
+      ft_multo64( (FT_UInt32)in_y, (FT_UInt32)out_x, &z2 );
+
+    if      ( (FT_Int32)z1.hi > (FT_Int32)z2.hi )
+      result = +1;
+    else if ( (FT_Int32)z1.hi < (FT_Int32)z2.hi )
+      result = -1;
+    else if ( z1.lo > z2.lo )
+      result = +1;
+    else if ( z1.lo < z2.lo )
+      result = -1;
+    else
+      result =  0;
 
     /* XXX: only the sign of return value, +1/0/-1 must be used */
     return result;
@@ -1065,62 +1045,4 @@
   }
 
 
-  FT_BASE_DEF( FT_Int32 )
-  FT_MulAddFix( FT_Fixed*  s,
-                FT_Int32*  f,
-                FT_UInt    count )
-  {
-    FT_UInt   i;
-    FT_Int64  temp;
-
-
-#ifdef FT_INT64
-    temp = 0;
-
-    for ( i = 0; i < count; ++i )
-      temp += (FT_Int64)s[i] * f[i];
-
-    return (FT_Int32)( ( temp + 0x8000 ) >> 16 );
-#else
-    temp.hi = 0;
-    temp.lo = 0;
-
-    for ( i = 0; i < count; ++i )
-    {
-      FT_Int64  multResult;
-
-      FT_Int     sign  = 1;
-      FT_UInt32  carry = 0;
-
-      FT_UInt32  scalar;
-      FT_UInt32  factor;
-
-
-      FT_MOVE_SIGN( FT_UInt32, s[i], scalar, sign );
-      FT_MOVE_SIGN( FT_UInt32, f[i], factor, sign );
-
-      ft_multo64( scalar, factor, &multResult );
-
-      if ( sign < 0 )
-      {
-        /* Emulated `FT_Int64` negation. */
-        carry = ( multResult.lo == 0 );
-
-        multResult.lo = ~multResult.lo + 1;
-        multResult.hi = ~multResult.hi + carry;
-      }
-
-      FT_Add64( &temp, &multResult, &temp );
-    }
-
-    /* Shift and round value. */
-    return (FT_Int32)( ( ( temp.hi << 16 ) | ( temp.lo >> 16 ) )
-                                     + ( 1 & ( temp.lo >> 15 ) ) );
-
-
-#endif /* !FT_INT64 */
-
-  }
-
-
 /* END */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftcid.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftcid.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftcid.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftcid.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType API for accessing CID font information.
  *
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
  * Derek Clegg and Michael Toftdal.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftcolor.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftcolor.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftcolor.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftcolor.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType's glyph color management (body).
  *
- * Copyright (C) 2018-2024 by
+ * Copyright (C) 2018-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -56,9 +56,7 @@
                      FT_Color*  *apalette )
   {
     FT_Error  error;
-
-    TT_Face       ttface;
-    SFNT_Service  sfnt;
+    TT_Face   ttface = (TT_Face)face;
 
 
     if ( !face )
@@ -72,14 +70,17 @@
       return FT_Err_Ok;
     }
 
-    ttface = (TT_Face)face;
-    sfnt   = (SFNT_Service)ttface->sfnt;
+    if ( palette_index != ttface->palette_index )
+    {
+      SFNT_Service  sfnt = (SFNT_Service)ttface->sfnt;
+
 
-    error = sfnt->set_palette( ttface, palette_index );
-    if ( error )
-      return error;
+      error = sfnt->set_palette( ttface, palette_index );
+      if ( error )
+        return error;
 
-    ttface->palette_index = palette_index;
+      ttface->palette_index = palette_index;
+    }
 
     if ( apalette )
       *apalette = ttface->palette;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftdbgmem.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftdbgmem.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftdbgmem.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftdbgmem.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Memory debugger (body).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -139,7 +139,6 @@
   } FT_MemTableRec;
 
 
-#define FT_MEM_SIZE_MIN  7
 #define FT_MEM_SIZE_MAX  13845163
 
 #define FT_FILENAME( x )  ( (x) ? (x) : "unknown file" )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftdebug.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftdebug.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftdebug.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftdebug.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Debugging and logging component (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -64,7 +64,7 @@
    *    with the actual log message if set to true.
    *
    * 5. The flag `ft_timestamp_flag` prints time along with the actual log
-   *    message if set to ture.
+   *    message if set to true.
    *
    * 6. `ft_have_newline_char` is used to differentiate between a log
    *    message with and without a trailing newline character.
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftfntfmt.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftfntfmt.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftfntfmt.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftfntfmt.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType utility file for font formats (body).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftfstype.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftfstype.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftfstype.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftfstype.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType utility file to access FSType data (body).
  *
- * Copyright (C) 2008-2024 by
+ * Copyright (C) 2008-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftgasp.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftgasp.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftgasp.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftgasp.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Access of TrueType's `gasp' table (body).
  *
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftgloadr.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftgloadr.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftgloadr.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftgloadr.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType glyph loader (body).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftglyph.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftglyph.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftglyph.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftglyph.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType convenience functions to handle glyphs (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -62,7 +62,7 @@
                         FT_GlyphSlot  slot )
   {
     FT_BitmapGlyph  glyph   = (FT_BitmapGlyph)bitmap_glyph;
-    FT_Error        error   = FT_Err_Ok;
+    FT_Error        error;
     FT_Library      library = FT_GLYPH( glyph )->library;
 
 
@@ -75,17 +75,8 @@
     glyph->left = slot->bitmap_left;
     glyph->top  = slot->bitmap_top;
 
-    /* do lazy copying whenever possible */
-    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
-    {
-      glyph->bitmap          = slot->bitmap;
-      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
-    }
-    else
-    {
-      FT_Bitmap_Init( &glyph->bitmap );
-      error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap );
-    }
+    FT_Bitmap_Init( &glyph->bitmap );
+    error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap );
 
   Exit:
     return error;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/fthash.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/fthash.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/fthash.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/fthash.c	2026-04-17 19:09:35.000000000 +0000
@@ -41,6 +41,7 @@
 
 #include 
 #include 
+#include 
 
 
 #define INITIAL_HT_SIZE  241
@@ -233,7 +234,8 @@
   hash_insert( FT_Hashkey  key,
                size_t      data,
                FT_Hash     hash,
-               FT_Memory   memory )
+               FT_Memory   memory,
+               FT_Bool     overwrite )
   {
     FT_Hashnode   nn;
     FT_Hashnode*  bp    = hash_bucket( key, hash );
@@ -259,7 +261,7 @@
 
       hash->used++;
     }
-    else
+    else if ( overwrite )
       nn->data = data;
 
   Exit:
@@ -278,7 +280,7 @@
 
     hk.str = key;
 
-    return hash_insert( hk, data, hash, memory );
+    return hash_insert( hk, data, hash, memory, TRUE );
   }
 
 
@@ -293,7 +295,37 @@
 
     hk.num = num;
 
-    return hash_insert( hk, data, hash, memory );
+    return hash_insert( hk, data, hash, memory, TRUE );
+  }
+
+
+  FT_Error
+  ft_hash_str_insert_no_overwrite( const char*  key,
+                                   size_t       data,
+                                   FT_Hash      hash,
+                                   FT_Memory    memory )
+  {
+    FT_Hashkey  hk;
+
+
+    hk.str = key;
+
+    return hash_insert( hk, data, hash, memory, FALSE );
+  }
+
+
+  FT_Error
+  ft_hash_num_insert_no_overwrite( FT_Int     num,
+                                   size_t     data,
+                                   FT_Hash    hash,
+                                   FT_Memory  memory )
+  {
+    FT_Hashkey  hk;
+
+
+    hk.num = num;
+
+    return hash_insert( hk, data, hash, memory, FALSE );
   }
 
 
@@ -335,4 +367,68 @@
   }
 
 
+  FT_Bool
+  ft_hash_num_iterator( FT_UInt  *idx,
+                        FT_Int   *key,
+                        size_t   *value,
+                        FT_Hash   hash )
+  {
+    FT_Hashnode  nn = NULL;
+
+
+    while ( 1 )
+    {
+      if ( *idx >= hash->size )
+        return 0;
+
+      nn = hash->table[*idx];
+      if ( nn )
+        break;
+
+      (*idx)++;
+    }
+
+    if ( key )
+      *key = nn->key.num;
+    if ( value )
+      *value = nn->data;
+
+    (*idx)++;
+
+    return 1;
+  }
+
+
+  FT_Bool
+  ft_hash_str_iterator( FT_UInt      *idx,
+                        const char*  *key,
+                        size_t       *value,
+                        FT_Hash       hash )
+  {
+    FT_Hashnode  nn = NULL;
+
+
+    while ( 1 )
+    {
+      if ( *idx >= hash->size )
+        return 0;
+
+      nn = hash->table[*idx];
+      if ( nn )
+        break;
+
+      (*idx)++;
+    }
+
+    if ( key )
+      *key = nn->key.str;
+    if ( value )
+      *value = nn->data;
+
+    (*idx)++;
+
+    return 1;
+  }
+
+
 /* END */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftinit.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftinit.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftinit.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftinit.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType initialization layer (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftlcdfil.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftlcdfil.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftlcdfil.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftlcdfil.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType API for color filtering of subpixel bitmap glyphs (body).
  *
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -25,264 +25,27 @@
 
 #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
 
-/* define USE_LEGACY to implement the legacy filter */
-#define  USE_LEGACY
-
-#define FT_SHIFTCLAMP( x )  ( x >>= 8, (FT_Byte)( x > 255 ? 255 : x ) )
-
-
-  /* add padding according to filter weights */
+  /* add padding sufficient for a 5-tap filter, */
+  /* which is 2/3 of a pixel                    */
   FT_BASE_DEF( void )
   ft_lcd_padding( FT_BBox*        cbox,
                   FT_GlyphSlot    slot,
                   FT_Render_Mode  mode )
   {
-    FT_Byte*                 lcd_weights;
-    FT_Bitmap_LcdFilterFunc  lcd_filter_func;
-
-
-    /* Per-face LCD filtering takes priority if set up. */
-    if ( slot->face && slot->face->internal->lcd_filter_func )
-    {
-      lcd_weights     = slot->face->internal->lcd_weights;
-      lcd_filter_func = slot->face->internal->lcd_filter_func;
-    }
-    else
-    {
-      lcd_weights     = slot->library->lcd_weights;
-      lcd_filter_func = slot->library->lcd_filter_func;
-    }
-
-    if ( lcd_filter_func == ft_lcd_filter_fir )
-    {
-      if ( mode == FT_RENDER_MODE_LCD )
-      {
-        cbox->xMin -= lcd_weights[0] ? 43 :
-                      lcd_weights[1] ? 22 : 0;
-        cbox->xMax += lcd_weights[4] ? 43 :
-                      lcd_weights[3] ? 22 : 0;
-      }
-      else if ( mode == FT_RENDER_MODE_LCD_V )
-      {
-        cbox->yMin -= lcd_weights[0] ? 43 :
-                      lcd_weights[1] ? 22 : 0;
-        cbox->yMax += lcd_weights[4] ? 43 :
-                      lcd_weights[3] ? 22 : 0;
-      }
-    }
-  }
-
-
-  /* FIR filter used by the default and light filters */
-  FT_BASE_DEF( void )
-  ft_lcd_filter_fir( FT_Bitmap*           bitmap,
-                     FT_LcdFiveTapFilter  weights )
-  {
-    FT_UInt   width  = (FT_UInt)bitmap->width;
-    FT_UInt   height = (FT_UInt)bitmap->rows;
-    FT_Int    pitch  = bitmap->pitch;
-    FT_Byte*  origin = bitmap->buffer;
-    FT_Byte   mode   = bitmap->pixel_mode;
-
-
-    /* take care of bitmap flow */
-    if ( pitch > 0 && height > 0 )
-      origin += pitch * (FT_Int)( height - 1 );
-
-    /* horizontal in-place FIR filter */
-    if ( mode == FT_PIXEL_MODE_LCD && width >= 2 )
-    {
-      FT_Byte*  line = origin;
-
-
-      /* `fir' must be at least 32 bit wide, since the sum of */
-      /* the values in `weights' can exceed 0xFF              */
-
-      for ( ; height > 0; height--, line -= pitch )
-      {
-        FT_UInt  fir[5];
-        FT_UInt  val, xx;
-
-
-        val    = line[0];
-        fir[2] = weights[2] * val;
-        fir[3] = weights[3] * val;
-        fir[4] = weights[4] * val;
-
-        val    = line[1];
-        fir[1] = fir[2] + weights[1] * val;
-        fir[2] = fir[3] + weights[2] * val;
-        fir[3] = fir[4] + weights[3] * val;
-        fir[4] =          weights[4] * val;
-
-        for ( xx = 2; xx < width; xx++ )
-        {
-          val    = line[xx];
-          fir[0] = fir[1] + weights[0] * val;
-          fir[1] = fir[2] + weights[1] * val;
-          fir[2] = fir[3] + weights[2] * val;
-          fir[3] = fir[4] + weights[3] * val;
-          fir[4] =          weights[4] * val;
-
-          line[xx - 2] = FT_SHIFTCLAMP( fir[0] );
-        }
-
-        line[xx - 2] = FT_SHIFTCLAMP( fir[1] );
-        line[xx - 1] = FT_SHIFTCLAMP( fir[2] );
-      }
-    }
-
-    /* vertical in-place FIR filter */
-    else if ( mode == FT_PIXEL_MODE_LCD_V && height >= 2 )
-    {
-      FT_Byte*  column = origin;
-
-
-      for ( ; width > 0; width--, column++ )
-      {
-        FT_Byte*  col = column;
-        FT_UInt   fir[5];
-        FT_UInt   val, yy;
-
-
-        val    = col[0];
-        fir[2] = weights[2] * val;
-        fir[3] = weights[3] * val;
-        fir[4] = weights[4] * val;
-        col   -= pitch;
-
-        val    = col[0];
-        fir[1] = fir[2] + weights[1] * val;
-        fir[2] = fir[3] + weights[2] * val;
-        fir[3] = fir[4] + weights[3] * val;
-        fir[4] =          weights[4] * val;
-        col   -= pitch;
-
-        for ( yy = 2; yy < height; yy++, col -= pitch )
-        {
-          val    = col[0];
-          fir[0] = fir[1] + weights[0] * val;
-          fir[1] = fir[2] + weights[1] * val;
-          fir[2] = fir[3] + weights[2] * val;
-          fir[3] = fir[4] + weights[3] * val;
-          fir[4] =          weights[4] * val;
-
-          col[pitch * 2]  = FT_SHIFTCLAMP( fir[0] );
-        }
-
-        col[pitch * 2]  = FT_SHIFTCLAMP( fir[1] );
-        col[pitch]      = FT_SHIFTCLAMP( fir[2] );
-      }
-    }
-  }
-
-
-#ifdef USE_LEGACY
-
-  /* intra-pixel filter used by the legacy filter */
-  static void
-  _ft_lcd_filter_legacy( FT_Bitmap*      bitmap,
-                         FT_Byte*        weights )
-  {
-    FT_UInt   width  = (FT_UInt)bitmap->width;
-    FT_UInt   height = (FT_UInt)bitmap->rows;
-    FT_Int    pitch  = bitmap->pitch;
-    FT_Byte*  origin = bitmap->buffer;
-    FT_Byte   mode   = bitmap->pixel_mode;
-
-    static const unsigned int  filters[3][3] =
-    {
-      { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 },
-      { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 },
-      { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 }
-    };
-
-    FT_UNUSED( weights );
-
-
-    /* take care of bitmap flow */
-    if ( pitch > 0 && height > 0 )
-      origin += pitch * (FT_Int)( height - 1 );
+    FT_UNUSED( slot );
 
-    /* horizontal in-place intra-pixel filter */
-    if ( mode == FT_PIXEL_MODE_LCD && width >= 3 )
+    if ( mode == FT_RENDER_MODE_LCD )
     {
-      FT_Byte*  line = origin;
-
-
-      for ( ; height > 0; height--, line -= pitch )
-      {
-        FT_UInt  xx;
-
-
-        for ( xx = 0; xx < width; xx += 3 )
-        {
-          FT_UInt  r, g, b;
-          FT_UInt  p;
-
-
-          p  = line[xx];
-          r  = filters[0][0] * p;
-          g  = filters[0][1] * p;
-          b  = filters[0][2] * p;
-
-          p  = line[xx + 1];
-          r += filters[1][0] * p;
-          g += filters[1][1] * p;
-          b += filters[1][2] * p;
-
-          p  = line[xx + 2];
-          r += filters[2][0] * p;
-          g += filters[2][1] * p;
-          b += filters[2][2] * p;
-
-          line[xx]     = (FT_Byte)( r / 65536 );
-          line[xx + 1] = (FT_Byte)( g / 65536 );
-          line[xx + 2] = (FT_Byte)( b / 65536 );
-        }
-      }
+      cbox->xMin -= 43;
+      cbox->xMax += 43;
     }
-    else if ( mode == FT_PIXEL_MODE_LCD_V && height >= 3 )
+    else if ( mode == FT_RENDER_MODE_LCD_V )
     {
-      FT_Byte*  column = origin;
-
-
-      for ( ; width > 0; width--, column++ )
-      {
-        FT_Byte*  col = column - 2 * pitch;
-
-
-        for ( ; height > 0; height -= 3, col -= 3 * pitch )
-        {
-          FT_UInt  r, g, b;
-          FT_UInt  p;
-
-
-          p  = col[0];
-          r  = filters[0][0] * p;
-          g  = filters[0][1] * p;
-          b  = filters[0][2] * p;
-
-          p  = col[pitch];
-          r += filters[1][0] * p;
-          g += filters[1][1] * p;
-          b += filters[1][2] * p;
-
-          p  = col[pitch * 2];
-          r += filters[2][0] * p;
-          g += filters[2][1] * p;
-          b += filters[2][2] * p;
-
-          col[0]         = (FT_Byte)( r / 65536 );
-          col[pitch]     = (FT_Byte)( g / 65536 );
-          col[pitch * 2] = (FT_Byte)( b / 65536 );
-        }
-      }
+      cbox->yMin -= 43;
+      cbox->yMax += 43;
     }
   }
 
-#endif /* USE_LEGACY */
-
 
   /* documentation in ftlcdfil.h */
 
@@ -297,7 +60,6 @@
       return FT_THROW( Invalid_Argument );
 
     ft_memcpy( library->lcd_weights, weights, FT_LCD_FILTER_FIVE_TAPS );
-    library->lcd_filter_func = ft_lcd_filter_fir;
 
     return FT_Err_Ok;
   }
@@ -321,32 +83,23 @@
     switch ( filter )
     {
     case FT_LCD_FILTER_NONE:
-      library->lcd_filter_func = NULL;
+      ft_memset( library->lcd_weights,
+                 0,
+                 FT_LCD_FILTER_FIVE_TAPS );
       break;
 
     case FT_LCD_FILTER_DEFAULT:
       ft_memcpy( library->lcd_weights,
                  default_weights,
                  FT_LCD_FILTER_FIVE_TAPS );
-      library->lcd_filter_func = ft_lcd_filter_fir;
       break;
 
     case FT_LCD_FILTER_LIGHT:
       ft_memcpy( library->lcd_weights,
                  light_weights,
                  FT_LCD_FILTER_FIVE_TAPS );
-      library->lcd_filter_func = ft_lcd_filter_fir;
       break;
 
-#ifdef USE_LEGACY
-
-    case FT_LCD_FILTER_LEGACY:
-    case FT_LCD_FILTER_LEGACY1:
-      library->lcd_filter_func = _ft_lcd_filter_legacy;
-      break;
-
-#endif
-
     default:
       return FT_THROW( Invalid_Argument );
     }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftmac.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftmac.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftmac.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftmac.c	2026-04-17 19:09:35.000000000 +0000
@@ -8,7 +8,7 @@
  * This file is for Mac OS X only; see builds/mac/ftoldmac.c for
  * classic platforms built by MPW.
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftmm.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftmm.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftmm.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftmm.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Multiple Master font support (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -292,6 +292,9 @@
     if ( num_coords && !coords )
       return FT_THROW( Invalid_Argument );
 
+    if ( !num_coords && !FT_IS_VARIATION( face ) )
+      return FT_Err_Ok;  /* nothing to be done */
+
     error = ft_face_get_mm_service( face, &service_mm );
     if ( !error )
     {
@@ -299,15 +302,21 @@
       if ( service_mm->set_var_design )
         error = service_mm->set_var_design( face, num_coords, coords );
 
-      if ( !error || error == -1 )
+      if ( !error || error == -1 || error == -2 )
       {
         FT_Bool  is_variation_old = FT_IS_VARIATION( face );
 
 
-        if ( num_coords )
-          face->face_flags |= FT_FACE_FLAG_VARIATION;
-        else
-          face->face_flags &= ~FT_FACE_FLAG_VARIATION;
+        if ( error != -1 )
+        {
+          if ( error == -2 ) /* -2 means is_variable. */
+          {
+            face->face_flags |= FT_FACE_FLAG_VARIATION;
+            error             = FT_Err_Ok;
+          }
+          else
+            face->face_flags &= ~FT_FACE_FLAG_VARIATION;
+        }
 
         if ( service_mm->construct_ps_name )
         {
@@ -474,15 +483,21 @@
       if ( service_mm->set_mm_blend )
         error = service_mm->set_mm_blend( face, num_coords, coords );
 
-      if ( !error || error == -1 )
+      if ( !error || error == -1 || error == -2 )
       {
         FT_Bool  is_variation_old = FT_IS_VARIATION( face );
 
 
-        if ( num_coords )
-          face->face_flags |= FT_FACE_FLAG_VARIATION;
-        else
-          face->face_flags &= ~FT_FACE_FLAG_VARIATION;
+        if ( error != -1 )
+        {
+          if ( error == -2 ) /* -2 means is_variable. */
+          {
+            face->face_flags |= FT_FACE_FLAG_VARIATION;
+            error             = FT_Err_Ok;
+          }
+          else
+            face->face_flags &= ~FT_FACE_FLAG_VARIATION;
+        }
 
         if ( service_mm->construct_ps_name )
         {
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftobjs.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftobjs.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftobjs.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftobjs.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType private base classes (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -524,12 +524,28 @@
     bitmap->rows       = (unsigned int)height;
     bitmap->pitch      = pitch;
 
-    if ( pbox.xMin < -0x8000 || pbox.xMax > 0x7FFF ||
-         pbox.yMin < -0x8000 || pbox.yMax > 0x7FFF )
+    /* Flag the bounding box size unsuitable for rendering. */
+    /* FT_Renderer modules should check the return value.   */
+    /* The limit is based on the ppem value when available. */
     {
-      FT_TRACE3(( "ft_glyphslot_preset_bitmap: [%ld %ld %ld %ld]\n",
-                  pbox.xMin, pbox.yMin, pbox.xMax, pbox.yMax ));
-      return 1;
+      FT_Face  face = slot->face;
+      FT_Pos   xlim = 0x8000;
+      FT_Pos   ylim = 0x8000;
+
+
+      if ( face )
+      {
+        xlim = FT_MIN( xlim, 10 * face->size->metrics.x_ppem );
+        ylim = FT_MIN( ylim, 10 * face->size->metrics.y_ppem );
+      }
+
+      if ( pbox.xMin < -xlim || pbox.xMax >= xlim ||
+           pbox.yMin < -ylim || pbox.yMax >= ylim )
+      {
+        FT_TRACE3(( "ft_glyphslot_preset_bitmap: [%ld %ld %ld %ld]\n",
+                    pbox.xMin, pbox.yMin, pbox.xMax, pbox.yMax ));
+        return 1;
+      }
     }
 
     return 0;
@@ -549,8 +565,7 @@
 
 
   FT_BASE_DEF( FT_Error )
-  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,
-                             FT_ULong      size )
+  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot )
   {
     FT_Memory  memory = FT_FACE_MEMORY( slot->face );
     FT_Error   error;
@@ -561,7 +576,10 @@
     else
       slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
 
-    FT_MEM_ALLOC( slot->bitmap.buffer, size );
+    /* dimensions must be preset */
+    FT_MEM_ALLOC_MULT( slot->bitmap.buffer,
+                       slot->bitmap.rows,
+                       slot->bitmap.pitch );
     return error;
   }
 
@@ -905,7 +923,6 @@
     FT_Library    library;
     FT_Bool       autohint = FALSE;
     FT_Module     hinter;
-    TT_Face       ttface = (TT_Face)face;
 
 
     if ( !face || !face->size || !face->glyph )
@@ -983,6 +1000,7 @@
       {
         FT_Render_Mode  mode = FT_LOAD_TARGET_MODE( load_flags );
         FT_Bool         is_light_type1;
+        TT_Face         ttface = (TT_Face)face;
 
 
         /* only the new Adobe engine (for both CFF and Type 1) is `light'; */
@@ -994,8 +1012,7 @@
         /* the check for `num_locations' assures that we actually    */
         /* test for instructions in a TTF and not in a CFF-based OTF */
         /*                                                           */
-        /* since `maxSizeOfInstructions' might be unreliable, we     */
-        /* check the size of the `fpgm' and `prep' tables, too --    */
+        /* we check the size of the `fpgm' and `prep' tables, too -- */
         /* the assumption is that there don't exist real TTFs where  */
         /* both `fpgm' and `prep' tables are missing                 */
         if ( ( mode == FT_RENDER_MODE_LIGHT           &&
@@ -1003,9 +1020,8 @@
                  !is_light_type1                    ) )         ||
              ( FT_IS_SFNT( face )                             &&
                ttface->num_locations                          &&
-               ttface->max_profile.maxSizeOfInstructions == 0 &&
                ttface->font_program_size == 0                 &&
-               ttface->cvt_program_size == 0                  ) )
+               ttface->cvt_program_size <= 7                  ) )
           autohint = TRUE;
       }
     }
@@ -1172,9 +1188,9 @@
     }
 
 #ifdef FT_DEBUG_LEVEL_TRACE
-    FT_TRACE5(( "FT_Load_Glyph: index %d, flags 0x%x\n",
+    FT_TRACE5(( "FT_Load_Glyph: index %u, flags 0x%x\n",
                 glyph_index, load_flags ));
-    FT_TRACE5(( "  bitmap %dx%d %s, %s (mode %d)\n",
+    FT_TRACE5(( "  bitmap %ux%u %s, %s (mode %d)\n",
                 slot->bitmap.width,
                 slot->bitmap.rows,
                 slot->outline.points ?
@@ -1253,14 +1269,14 @@
     FT_Driver  driver = (FT_Driver)driver_;
 
 
-    /* finalize client-specific data */
-    if ( size->generic.finalizer )
-      size->generic.finalizer( size );
-
     /* finalize format-specific stuff */
     if ( driver->clazz->done_size )
       driver->clazz->done_size( size );
 
+    /* finalize client-specific data */
+    if ( size->generic.finalizer )
+      size->generic.finalizer( size );
+
     FT_FREE( size->internal );
     FT_FREE( size );
   }
@@ -1322,10 +1338,6 @@
                       driver );
     face->size = NULL;
 
-    /* now discard client data */
-    if ( face->generic.finalizer )
-      face->generic.finalizer( face );
-
     /* discard charmaps */
     destroy_charmaps( face, memory );
 
@@ -1340,6 +1352,10 @@
 
     face->stream = NULL;
 
+    /* now discard client data */
+    if ( face->generic.finalizer )
+      face->generic.finalizer( face );
+
     /* get rid of it */
     if ( face->internal )
     {
@@ -1359,21 +1375,9 @@
   }
 
 
-  /**************************************************************************
-   *
-   * @Function:
-   *   find_unicode_charmap
-   *
-   * @Description:
-   *   This function finds a Unicode charmap, if there is one.
-   *   And if there is more than one, it tries to favour the more
-   *   extensive one, i.e., one that supports UCS-4 against those which
-   *   are limited to the BMP (said UCS-2 encoding.)
-   *
-   *   This function is called from open_face() (just below), and also
-   *   from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ).
-   */
-  static FT_Error
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( FT_Error )
   find_unicode_charmap( FT_Face  face )
   {
     FT_CharMap*  first;
@@ -1427,7 +1431,10 @@
         if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT &&
                cur[0]->encoding_id == TT_MS_ID_UCS_4        )     ||
              ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE &&
-               cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32    ) )
+               cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32    ) ||
+             ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE &&
+               cur[0]->encoding_id == TT_APPLE_ID_FULL_UNICODE  &&
+               FT_Get_CMap_Format( cur[0] ) == 13               ) )
         {
           face->charmap = cur[0];
           return FT_Err_Ok;
@@ -2125,7 +2132,7 @@
       if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len )
         goto Exit2;
 
-      FT_TRACE3(( "    Load POST fragment #%d (%ld byte) to buffer"
+      FT_TRACE3(( "    Load POST fragment #%d (%lu byte) to buffer"
                   " %p + 0x%08lx\n",
                   i, rlen, (void*)pfb_data, pfb_pos ));
 
@@ -2398,7 +2405,7 @@
       is_darwin_vfs = ft_raccess_rule_by_darwin_vfs( library, i );
       if ( is_darwin_vfs && vfs_rfork_has_no_font )
       {
-        FT_TRACE3(( "Skip rule %d: darwin vfs resource fork"
+        FT_TRACE3(( "Skip rule %u: darwin vfs resource fork"
                     " is already checked and"
                     " no font is found\n",
                     i ));
@@ -2407,7 +2414,7 @@
 
       if ( errors[i] )
       {
-        FT_TRACE3(( "Error 0x%x has occurred in rule %d\n",
+        FT_TRACE3(( "Error 0x%x has occurred in rule %u\n",
                     errors[i], i ));
         continue;
       }
@@ -2415,7 +2422,7 @@
       args2.flags    = FT_OPEN_PATHNAME;
       args2.pathname = file_names[i] ? file_names[i] : args->pathname;
 
-      FT_TRACE3(( "Try rule %d: %s (offset=%ld) ...",
+      FT_TRACE3(( "Try rule %u: %s (offset=%ld) ...",
                   i, args2.pathname, offsets[i] ));
 
       error = FT_Stream_New( library, &args2, &stream2 );
@@ -2812,11 +2819,6 @@
       internal->refcount = 1;
 
       internal->no_stem_darkening = -1;
-
-#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-      /* Per-face filtering can only be set up by FT_Face_Properties */
-      internal->lcd_filter_func = NULL;
-#endif
     }
 
     if ( aface )
@@ -4046,18 +4048,8 @@
       }
       else if ( properties->tag == FT_PARAM_TAG_LCD_FILTER_WEIGHTS )
       {
-#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-        if ( properties->data )
-        {
-          ft_memcpy( face->internal->lcd_weights,
-                     properties->data,
-                     FT_LCD_FILTER_FIVE_TAPS );
-          face->internal->lcd_filter_func = ft_lcd_filter_fir;
-        }
-#else
         error = FT_THROW( Unimplemented_Feature );
         goto Exit;
-#endif
       }
       else if ( properties->tag == FT_PARAM_TAG_RANDOM_SEED )
       {
@@ -5044,9 +5036,9 @@
   static void
   Destroy_Module( FT_Module  module )
   {
-    FT_Memory         memory  = module->memory;
-    FT_Module_Class*  clazz   = module->clazz;
-    FT_Library        library = module->library;
+    const FT_Module_Class*  clazz   = module->clazz;
+    FT_Library              library = module->library;
+    FT_Memory               memory  = module->memory;
 
 
     if ( library && library->auto_hinter == module )
@@ -5125,9 +5117,9 @@
       goto Exit;
 
     /* base initialization */
+    module->clazz   = clazz;
     module->library = library;
     module->memory  = memory;
-    module->clazz   = (FT_Module_Class*)clazz;
 
     /* check whether the module is a renderer - this must be performed */
     /* before the normal module initialization                         */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftoutln.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftoutln.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftoutln.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftoutln.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType outline management (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftpatent.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftpatent.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftpatent.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftpatent.c	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   FreeType API for checking patented TrueType bytecode instructions
  *   (body).  Obsolete, retained for backward compatibility.
  *
- * Copyright (C) 2007-2024 by
+ * Copyright (C) 2007-2025 by
  * David Turner.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftpsprop.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftpsprop.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftpsprop.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftpsprop.c	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Get and set properties of PostScript drivers (body).
  *   See `ftdriver.h' for available properties.
  *
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftrfork.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftrfork.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftrfork.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftrfork.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Embedded resource forks accessor (body).
  *
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
  * Masatake YAMATO and Redhat K.K.
  *
  * FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are
@@ -269,14 +269,8 @@
            * According to Inside Macintosh: More Macintosh Toolbox,
            * "Resource IDs" (1-46), there are some reserved IDs.
            * However, FreeType2 is not a font synthesizer, no need
-           * to check the acceptable resource ID.
+           * to check the acceptable resource ID or its attributes.
            */
-          if ( temp < 0 )
-          {
-            error = FT_THROW( Invalid_Table );
-            goto Exit;
-          }
-
           ref[j].offset = temp & 0xFFFFFFL;
 
           FT_TRACE3(( "             [%d]:"
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftsnames.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftsnames.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftsnames.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftsnames.c	2026-04-17 19:09:35.000000000 +0000
@@ -7,7 +7,7 @@
  *
  *   This is _not_ used to retrieve glyph names!
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftstream.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftstream.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftstream.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftstream.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   I/O stream support (body).
  *
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -242,7 +242,7 @@
     FT_ULong  read_bytes;
 
 
-    FT_TRACE7(( "FT_Stream_EnterFrame: %ld bytes\n", count ));
+    FT_TRACE7(( "FT_Stream_EnterFrame: %lu bytes\n", count ));
 
     /* check for nested frame access */
     FT_ASSERT( stream && stream->cursor == 0 );
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftstroke.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftstroke.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftstroke.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftstroke.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType path stroker (body).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -1070,7 +1070,7 @@
         if ( theta == FT_ANGLE_PI2 )
           theta = -rotate;
 
-        phi    = stroker->angle_in + theta + rotate;
+        phi = stroker->angle_in + theta + rotate;
 
         FT_Vector_From_Polar( &sigma, stroker->miter_limit, theta );
 
@@ -1371,7 +1371,7 @@
     arc[1] = *control;
     arc[2] = stroker->center;
 
-    while ( arc >= bez_stack )
+    do
     {
       FT_Angle  angle_in, angle_out;
 
@@ -1524,10 +1524,12 @@
         }
       }
 
-      arc -= 2;
-
       stroker->angle_in = angle_out;
-    }
+
+      if ( arc == bez_stack )
+        break;
+      arc -= 2;
+    } while ( 1 );
 
     stroker->center      = *to;
     stroker->line_length = 0;
@@ -1577,7 +1579,7 @@
     arc[2] = *control1;
     arc[3] = stroker->center;
 
-    while ( arc >= bez_stack )
+    do
     {
       FT_Angle  angle_in, angle_mid, angle_out;
 
@@ -1741,10 +1743,12 @@
         }
       }
 
-      arc -= 3;
-
       stroker->angle_in = angle_out;
-    }
+
+      if ( arc == bez_stack )
+        break;
+      arc -= 3;
+    } while ( 1 );
 
     stroker->center      = *to;
     stroker->line_length = 0;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftsynth.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftsynth.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftsynth.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftsynth.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType synthesizing code for emboldening and slanting (body).
  *
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -141,7 +141,7 @@
       /*
        * XXX: overflow check for 16-bit system, for compatibility
        *      with FT_GlyphSlot_Embolden() since FreeType 2.1.10.
-       *      unfortunately, this function return no informations
+       *      unfortunately, this function returns no information
        *      about the cause of error.
        */
       if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftsystem.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftsystem.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftsystem.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftsystem.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   ANSI-specific FreeType low-level system interface (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -280,7 +280,7 @@
     stream->close = ft_ansi_stream_close;
 
     FT_TRACE1(( "FT_Stream_Open:" ));
-    FT_TRACE1(( " opened `%s' (%ld bytes) successfully\n",
+    FT_TRACE1(( " opened `%s' (%lu bytes) successfully\n",
                 filepathname, stream->size ));
 
     return FT_Err_Ok;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/fttrigon.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/fttrigon.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/fttrigon.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/fttrigon.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType trigonometric functions (body).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/fttype1.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/fttype1.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/fttype1.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/fttype1.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType utility file for PS names support (body).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftutil.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftutil.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/base/ftutil.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/base/ftutil.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType utility file for memory and list management (body).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -424,11 +424,10 @@
     while ( cur )
     {
       FT_ListNode  next = cur->next;
-      void*        data = cur->data;
 
 
       if ( destroy )
-        destroy( memory, data, user );
+        destroy( memory, cur->data, user );
 
       FT_FREE( cur );
       cur = next;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CFF character mapping table (cmap) support (body).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffcmap.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CFF character mapping table (cmap) support (specification).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   OpenType font driver implementation (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -121,7 +121,20 @@
     kerning->y = 0;
 
     if ( sfnt )
-      kerning->x = sfnt->get_kerning( cffface, left_glyph, right_glyph );
+    {
+      /* Use 'kern' table if available since that can be faster; otherwise */
+      /* use GPOS kerning pairs if available.                              */
+      if ( cffface->kern_avail_bits )
+        kerning->x = sfnt->get_kerning( cffface,
+                                        left_glyph,
+                                        right_glyph );
+#ifdef TT_CONFIG_OPTION_GPOS_KERNING
+      else if ( cffface->num_gpos_lookups_kerning )
+        kerning->x = sfnt->get_gpos_kerning( cffface,
+                                             left_glyph,
+                                             right_glyph );
+#endif
+    }
 
     return FT_Err_Ok;
   }
@@ -168,25 +181,7 @@
     CFF_Size       cffsize = (CFF_Size)size;
 
 
-    if ( !cffslot )
-      return FT_THROW( Invalid_Slot_Handle );
-
-    FT_TRACE1(( "cff_glyph_load: glyph index %d\n", glyph_index ));
-
-    /* check whether we want a scaled outline or bitmap */
-    if ( !cffsize )
-      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
-
-    /* reset the size object if necessary */
-    if ( load_flags & FT_LOAD_NO_SCALE )
-      size = NULL;
-
-    if ( size )
-    {
-      /* these two objects must have the same parent */
-      if ( size->face != slot->face )
-        return FT_THROW( Invalid_Face_Handle );
-    }
+    FT_TRACE1(( "cff_glyph_load: glyph index %u\n", glyph_index ));
 
     /* now load the glyph outline if necessary */
     error = cff_slot_load( cffslot, cffsize, glyph_index, load_flags );
@@ -205,105 +200,70 @@
                     FT_Int32   flags,
                     FT_Fixed*  advances )
   {
-    FT_UInt       nn;
-    FT_Error      error = FT_Err_Ok;
-    FT_GlyphSlot  slot  = face->glyph;
+    CFF_Face  cffface = (CFF_Face)face;
+    FT_Bool   horz;
+    FT_UInt   nn;
+
 
+    if ( !FT_IS_SFNT( face ) )
+      return FT_THROW( Unimplemented_Feature );
 
-    if ( FT_IS_SFNT( face ) )
+    horz = !( flags & FT_LOAD_VERTICAL_LAYOUT );
+
+    if ( horz )
     {
       /* OpenType 1.7 mandates that the data from `hmtx' table be used; */
       /* it is no longer necessary that those values are identical to   */
       /* the values in the `CFF' table                                  */
+      if ( !cffface->horizontal.number_Of_HMetrics )
+        return FT_THROW( Unimplemented_Feature );
 
-      CFF_Face  cffface = (CFF_Face)face;
-      FT_Short  dummy;
-
-
-      if ( flags & FT_LOAD_VERTICAL_LAYOUT )
-      {
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-        /* no fast retrieval for blended MM fonts without VVAR table */
-        if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
-             !( cffface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
-          return FT_THROW( Unimplemented_Feature );
+      /* no fast retrieval for blended MM fonts without HVAR table */
+      if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
+           !( cffface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
+        return FT_THROW( Unimplemented_Feature );
 #endif
+    }
+    else  /* vertical */
+    {
+      /* check whether we have data from the `vmtx' table at all; */
+      /* otherwise we extract the info from the CFF glyphstrings  */
+      /* (instead of synthesizing a global value using the `OS/2' */
+      /* table)                                                   */
+      if ( !cffface->vertical_info )
+        return FT_THROW( Unimplemented_Feature );
 
-        /* check whether we have data from the `vmtx' table at all; */
-        /* otherwise we extract the info from the CFF glyphstrings  */
-        /* (instead of synthesizing a global value using the `OS/2' */
-        /* table)                                                   */
-        if ( !cffface->vertical_info )
-          goto Missing_Table;
-
-        for ( nn = 0; nn < count; nn++ )
-        {
-          FT_UShort  ah;
-
-
-          ( (SFNT_Service)cffface->sfnt )->get_metrics( cffface,
-                                                        1,
-                                                        start + nn,
-                                                        &dummy,
-                                                        &ah );
-
-          FT_TRACE5(( "  idx %d: advance height %d font unit%s\n",
-                      start + nn,
-                      ah,
-                      ah == 1 ? "" : "s" ));
-          advances[nn] = ah;
-        }
-      }
-      else
-      {
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-        /* no fast retrieval for blended MM fonts without HVAR table */
-        if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
-             !( cffface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
-          return FT_THROW( Unimplemented_Feature );
+      /* no fast retrieval for blended MM fonts without VVAR table */
+      if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
+           !( cffface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
+        return FT_THROW( Unimplemented_Feature );
 #endif
-
-        /* check whether we have data from the `hmtx' table at all */
-        if ( !cffface->horizontal.number_Of_HMetrics )
-          goto Missing_Table;
-
-        for ( nn = 0; nn < count; nn++ )
-        {
-          FT_UShort  aw;
-
-
-          ( (SFNT_Service)cffface->sfnt )->get_metrics( cffface,
-                                                        0,
-                                                        start + nn,
-                                                        &dummy,
-                                                        &aw );
-
-          FT_TRACE5(( "  idx %d: advance width %d font unit%s\n",
-                      start + nn,
-                      aw,
-                      aw == 1 ? "" : "s" ));
-          advances[nn] = aw;
-        }
-      }
-
-      return error;
     }
 
-  Missing_Table:
-    flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
-
+    /* proceed to fast advances */
     for ( nn = 0; nn < count; nn++ )
     {
-      error = cff_glyph_load( slot, face->size, start + nn, flags );
-      if ( error )
-        break;
-
-      advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
-                     ? slot->linearVertAdvance
-                     : slot->linearHoriAdvance;
+      FT_UShort  aw;
+      FT_Short   dummy;
+
+
+      ( (SFNT_Service)cffface->sfnt )->get_metrics( cffface,
+                                                    !horz,
+                                                    start + nn,
+                                                    &dummy,
+                                                    &aw );
+
+      FT_TRACE5(( "  idx %u: advance %s %d font unit%s\n",
+                  start + nn,
+                  horz ? "width" : "height",
+                  aw,
+                  aw == 1 ? "" : "s" ));
+      advances[nn] = aw;
     }
 
-    return error;
+    return FT_Err_Ok;
   }
 
 
@@ -496,8 +456,8 @@
                                                          dict->weight );
       font_info->italic_angle        = dict->italic_angle;
       font_info->is_fixed_pitch      = dict->is_fixed_pitch;
-      font_info->underline_position  = (FT_Short)dict->underline_position;
-      font_info->underline_thickness = (FT_UShort)dict->underline_thickness;
+      font_info->underline_position  = dict->underline_position;
+      font_info->underline_thickness = dict->underline_thickness;
 
       cff->font_info = font_info;
     }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffdrivr.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   High-level OpenType driver interface (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cfferrs.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cfferrs.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cfferrs.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cfferrs.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CFF error codes (specification only).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffgload.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffgload.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffgload.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffgload.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   OpenType Glyph Loader (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -238,24 +238,12 @@
     else if ( glyph_index >= cff->num_glyphs )
       return FT_THROW( Invalid_Argument );
 
-    if ( load_flags & FT_LOAD_NO_RECURSE )
-      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
-
-    glyph->x_scale = 0x10000L;
-    glyph->y_scale = 0x10000L;
-    if ( size )
-    {
-      glyph->x_scale = size->root.metrics.x_scale;
-      glyph->y_scale = size->root.metrics.y_scale;
-    }
-
 #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
 
     /* try to load embedded bitmap if any              */
     /*                                                 */
     /* XXX: The convention should be emphasized in     */
     /*      the documents because it can be confusing. */
-    if ( size )
     {
       CFF_Face      cff_face = (CFF_Face)size->root.face;
       SFNT_Service  sfnt     = (SFNT_Service)cff_face->sfnt;
@@ -284,9 +272,6 @@
           FT_Short   dummy;
 
 
-          glyph->root.outline.n_points   = 0;
-          glyph->root.outline.n_contours = 0;
-
           glyph->root.metrics.width  = (FT_Pos)metrics.width  * 64;
           glyph->root.metrics.height = (FT_Pos)metrics.height * 64;
 
@@ -423,6 +408,25 @@
 
 #endif /* FT_CONFIG_OPTION_SVG */
 
+    /* top-level code ensures that FT_LOAD_NO_HINTING is set */
+    /* if FT_LOAD_NO_SCALE is active                         */
+    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+    scaled  = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 );
+
+    glyph->hint        = hinting;
+    glyph->scaled      = scaled;
+
+    if ( scaled )
+    {
+      glyph->x_scale = size->root.metrics.x_scale;
+      glyph->y_scale = size->root.metrics.y_scale;
+    }
+    else
+    {
+      glyph->x_scale = 0x10000L;
+      glyph->y_scale = 0x10000L;
+    }
+
     /* if we have a CID subfont, use its matrix (which has already */
     /* been multiplied with the root matrix)                       */
 
@@ -457,18 +461,6 @@
       font_offset = cff->top_font.font_dict.font_offset;
     }
 
-    glyph->root.outline.n_points   = 0;
-    glyph->root.outline.n_contours = 0;
-
-    /* top-level code ensures that FT_LOAD_NO_HINTING is set */
-    /* if FT_LOAD_NO_SCALE is active                         */
-    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
-    scaled  = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 );
-
-    glyph->hint        = hinting;
-    glyph->scaled      = scaled;
-    glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;  /* by default */
-
     {
 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE
       PS_Driver  driver = (PS_Driver)FT_FACE_DRIVER( face );
@@ -602,10 +594,8 @@
     {
       /* Now, set the metrics -- this is rather simple, as   */
       /* the left side bearing is the xMin, and the top side */
-      /* bearing the yMax.                                   */
-
-      /* For composite glyphs, return only left side bearing and */
-      /* advance width.                                          */
+      /* bearing the yMax. For composite glyphs, return only */
+      /* left side bearing and advance width.                */
       if ( load_flags & FT_LOAD_NO_RECURSE )
       {
         FT_Slot_Internal  internal = glyph->root.internal;
@@ -624,6 +614,12 @@
         FT_Bool            has_vertical_info;
 
 
+        glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;
+
+        glyph->root.outline.flags = FT_OUTLINE_REVERSE_FILL;
+        if ( size && size->root.metrics.y_ppem < 24 )
+          glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
         if ( face->horizontal.number_Of_HMetrics )
         {
           FT_Short   horiBearingX = 0;
@@ -677,14 +673,6 @@
 
         glyph->root.linearVertAdvance = metrics->vertAdvance;
 
-        glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;
-
-        glyph->root.outline.flags = 0;
-        if ( size && size->root.metrics.y_ppem < 24 )
-          glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION;
-
-        glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL;
-
         /* apply the font matrix, if any */
         if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L ||
              font_matrix.xy != 0        || font_matrix.yx != 0        )
@@ -707,7 +695,7 @@
           metrics->vertAdvance += font_offset.y;
         }
 
-        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling )
+        if ( scaled || force_scaling )
         {
           /* scale the outline and the metrics */
           FT_Int       n;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffgload.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffgload.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffgload.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffgload.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   OpenType Glyph Loader (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffload.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffload.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffload.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffload.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   OpenType and CFF data/program tables loader (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -442,7 +442,7 @@
       if ( cur_offset != 0 )
       {
         FT_TRACE0(( "cff_index_get_pointers:"
-                    " invalid first offset value %ld set to zero\n",
+                    " invalid first offset value %lu set to zero\n",
                     cur_offset ));
         cur_offset = 0;
       }
@@ -559,8 +559,8 @@
            idx->data_offset > stream->size - off2 + 1 )
       {
         FT_ERROR(( "cff_index_access_element:"
-                   " offset to next entry (%ld)"
-                   " exceeds the end of stream (%ld)\n",
+                   " offset to next entry (%lu)"
+                   " exceeds the end of stream (%lu)\n",
                    off2, stream->size - idx->data_offset + 1 ));
         off2 = stream->size - idx->data_offset + 1;
       }
@@ -982,7 +982,7 @@
             if ( glyph_sid > 0xFFFFL - nleft )
             {
               FT_ERROR(( "cff_charset_load: invalid SID range trimmed"
-                         " nleft=%d -> %ld\n", nleft, 0xFFFFL - glyph_sid ));
+                         " nleft=%u -> %ld\n", nleft, 0xFFFFL - glyph_sid ));
               nleft = ( FT_UInt )( 0xFFFFL - glyph_sid );
             }
 
@@ -1315,7 +1315,7 @@
 
     if ( numOperands > count )
     {
-      FT_TRACE4(( " cff_blend_doBlend: Stack underflow %d argument%s\n",
+      FT_TRACE4(( " cff_blend_doBlend: Stack underflow %u argument%s\n",
                   count,
                   count == 1 ? "" : "s" ));
 
@@ -1466,7 +1466,7 @@
       if ( master == 0 )
       {
         blend->BV[master] = FT_FIXED_ONE;
-        FT_TRACE4(( "   build blend vector len %d\n", len ));
+        FT_TRACE4(( "   build blend vector len %u\n", len ));
         FT_TRACE4(( "   [ %f ", blend->BV[master] / 65536.0 ));
         continue;
       }
@@ -2014,8 +2014,8 @@
     /* set defaults */
     FT_ZERO( top );
 
-    top->underline_position  = -( 100L << 16 );
-    top->underline_thickness = 50L << 16;
+    top->underline_position  = -100;
+    top->underline_thickness = 50;
     top->charstring_type     = 2;
     top->font_matrix.xx      = 0x10000L;
     top->font_matrix.yy      = 0x10000L;
@@ -2341,7 +2341,7 @@
       if ( face_index > 0 && subfont_index >= font->name_index.count )
       {
         FT_ERROR(( "cff_font_load:"
-                   " invalid subfont index for pure CFF font (%d)\n",
+                   " invalid subfont index for pure CFF font (%u)\n",
                    subfont_index ));
         error = FT_THROW( Invalid_Argument );
         goto Exit;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffload.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffload.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffload.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffload.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   OpenType & CFF data/program tables loader (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   OpenType objects manager (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -537,8 +537,8 @@
 
       sfnt_format = 1;
 
-      /* now, the font can be either an OpenType/CFF font, or an SVG CEF */
-      /* font; in the latter case it doesn't have a `head' table         */
+      /* the font may be OpenType/CFF, SVG CEF, or sfnt/CFF; a `head' table */
+      /* implies OpenType/CFF, otherwise just look for an optional cmap     */
       error = face->goto_table( face, TTAG_head, stream, 0 );
       if ( !error )
       {
@@ -554,7 +554,9 @@
       {
         /* load the `cmap' table explicitly */
         error = sfnt->load_cmap( face, stream );
-        if ( error )
+
+        /* this may fail because CID-keyed fonts don't have a cmap */
+        if ( FT_ERR_NEQ( error, Table_Missing ) && FT_ERR_NEQ( error, Ok ) )
           goto Exit;
       }
 
@@ -651,7 +653,7 @@
         {
           s = cff_index_get_sid_string( cff, idx );
           if ( s )
-            FT_TRACE4(( "  %5d %s\n", idx, s ));
+            FT_TRACE4(( "  %5u %s\n", idx, s ));
         }
 
         /* In Multiple Master CFFs, two SIDs hold the Normalize Design  */
@@ -666,7 +668,7 @@
           FT_PtrDist  l;
 
 
-          FT_TRACE4(( "  %5d ", idx + 390 ));
+          FT_TRACE4(( "  %5u ", idx + 390 ));
           for ( l = 0; l < s1len; l++ )
             FT_TRACE4(( "%c", s1[l] ));
           FT_TRACE4(( "\n" ));
@@ -681,7 +683,7 @@
           FT_PtrDist  l;
 
 
-          FT_TRACE4(( "  %5d ", cff->num_strings + 390 ));
+          FT_TRACE4(( "  %5u ", cff->num_strings + 390 ));
           for ( l = 0; l < s1len; l++ )
             FT_TRACE4(( "%c", s1[l] ));
           FT_TRACE4(( "\n" ));
@@ -844,10 +846,8 @@
           cffface->height = (FT_Short)( cffface->ascender -
                                         cffface->descender );
 
-        cffface->underline_position  =
-          (FT_Short)( dict->underline_position >> 16 );
-        cffface->underline_thickness =
-          (FT_Short)( dict->underline_thickness >> 16 );
+        cffface->underline_position  = (FT_Short)dict->underline_position;
+        cffface->underline_thickness = (FT_Short)dict->underline_thickness;
 
         /* retrieve font family & style name */
         if ( dict->family_name )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffobjs.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   OpenType objects manager (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffparse.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffparse.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffparse.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffparse.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CFF token stream parser (body)
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -892,7 +892,7 @@
                    dict->cid_supplement ));
       error = FT_Err_Ok;
 
-      FT_TRACE4(( " %d %d %ld\n",
+      FT_TRACE4(( " %u %u %ld\n",
                   dict->cid_registry,
                   dict->cid_ordering,
                   dict->cid_supplement ));
@@ -929,7 +929,7 @@
 
     priv->vsindex = (FT_UInt)cff_parse_num( parser, data++ );
 
-    FT_TRACE4(( " %d\n", priv->vsindex ));
+    FT_TRACE4(( " %u\n", priv->vsindex ));
 
     error = FT_Err_Ok;
 
@@ -979,7 +979,7 @@
       goto Exit;
     }
 
-    FT_TRACE4(( "   %d value%s blended\n",
+    FT_TRACE4(( "   %u value%s blended\n",
                 numBlends,
                 numBlends == 1 ? "" : "s" ));
 
@@ -1014,7 +1014,7 @@
     if ( dict->maxstack < CFF2_DEFAULT_STACK )
       dict->maxstack = CFF2_DEFAULT_STACK;
 
-    FT_TRACE4(( " %d\n", dict->maxstack ));
+    FT_TRACE4(( " %u\n", dict->maxstack ));
 
   Exit:
     return error;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffparse.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffparse.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cffparse.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cffparse.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CFF token stream parser (specification)
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cfftoken.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cfftoken.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cff/cfftoken.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cff/cfftoken.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CFF token definitions (specification only).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -30,8 +30,8 @@
   CFF_FIELD_STRING  ( 4,     weight,              "Weight" )
   CFF_FIELD_BOOL    ( 0x101, is_fixed_pitch,      "isFixedPitch" )
   CFF_FIELD_FIXED   ( 0x102, italic_angle,        "ItalicAngle" )
-  CFF_FIELD_FIXED   ( 0x103, underline_position,  "UnderlinePosition" )
-  CFF_FIELD_FIXED   ( 0x104, underline_thickness, "UnderlineThickness" )
+  CFF_FIELD_NUM     ( 0x103, underline_position,  "UnderlinePosition" )
+  CFF_FIELD_NUM     ( 0x104, underline_thickness, "UnderlineThickness" )
   CFF_FIELD_NUM     ( 0x105, paint_type,          "PaintType" )
   CFF_FIELD_NUM     ( 0x106, charstring_type,     "CharstringType" )
   CFF_FIELD_CALLBACK( 0x107, font_matrix,         "FontMatrix" )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/ciderrs.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/ciderrs.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/ciderrs.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/ciderrs.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CID error codes (specification only).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidgload.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidgload.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidgload.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidgload.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CID-keyed Type1 Glyph Loader (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -103,20 +103,20 @@
       if ( ( cid->fd_bytes == 1 && fd_select == 0xFFU   ) ||
            ( cid->fd_bytes == 2 && fd_select == 0xFFFFU ) )
       {
-        FT_TRACE1(( "cid_load_glyph: fail for glyph index %d:\n",
+        FT_TRACE1(( "cid_load_glyph: fail for glyph index %u:\n",
                     glyph_index ));
-        FT_TRACE1(( "                FD number %ld is the maximum\n",
+        FT_TRACE1(( "                FD number %lu is the maximum\n",
                     fd_select ));
-        FT_TRACE1(( "                integer fitting into %d byte%s\n",
+        FT_TRACE1(( "                integer fitting into %u byte%s\n",
                     cid->fd_bytes, cid->fd_bytes == 1 ? "" : "s" ));
       }
       else
       {
-        FT_TRACE0(( "cid_load_glyph: fail for glyph index %d:\n",
+        FT_TRACE0(( "cid_load_glyph: fail for glyph index %u:\n",
                     glyph_index ));
-        FT_TRACE0(( "                FD number %ld is larger\n",
+        FT_TRACE0(( "                FD number %lu is larger\n",
                     fd_select ));
-        FT_TRACE0(( "                than number of dictionaries (%d)\n",
+        FT_TRACE0(( "                than number of dictionaries (%u)\n",
                     cid->num_dicts ));
       }
 
@@ -125,7 +125,7 @@
     }
     else if ( off2 > stream->size )
     {
-      FT_TRACE0(( "cid_load_glyph: fail for glyph index %d:\n",
+      FT_TRACE0(( "cid_load_glyph: fail for glyph index %u:\n",
                   glyph_index ));
       FT_TRACE0(( "               end of the glyph data\n" ));
       FT_TRACE0(( "               is beyond the data stream\n" ));
@@ -135,7 +135,7 @@
     }
     else if ( off1 > off2 )
     {
-      FT_TRACE0(( "cid_load_glyph: fail for glyph index %d:\n",
+      FT_TRACE0(( "cid_load_glyph: fail for glyph index %u:\n",
                   glyph_index ));
       FT_TRACE0(( "                the end position of glyph data\n" ));
       FT_TRACE0(( "                is set before the start position\n" ));
@@ -252,8 +252,8 @@
       cs_offset = decoder->lenIV >= 0 ? (FT_UInt)decoder->lenIV : 0;
       if ( cs_offset > glyph_length )
       {
-        FT_TRACE0(( "cid_load_glyph: fail for glyph_index=%d, "
-                    "offset to the charstring is beyond glyph length\n",
+        FT_TRACE0(( "cid_load_glyph: fail for glyph_index=%u,"
+                    " offset to the charstring is beyond glyph length\n",
                     glyph_index ));
         error = FT_THROW( Invalid_Offset );
         goto Exit;
@@ -452,16 +452,12 @@
     glyph->x_scale = cidsize->metrics.x_scale;
     glyph->y_scale = cidsize->metrics.y_scale;
 
-    cidglyph->outline.n_points   = 0;
-    cidglyph->outline.n_contours = 0;
-
     hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&
                        ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
     scaled  = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 );
 
     glyph->hint      = hinting;
     glyph->scaled    = scaled;
-    cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;
 
     error = psaux->t1_decoder_funcs->init( &decoder,
                                            cidglyph->face,
@@ -501,12 +497,8 @@
 
     /* now set the metrics -- this is rather simple, as    */
     /* the left side bearing is the xMin, and the top side */
-    /* bearing the yMax                                    */
-    cidglyph->outline.flags &= FT_OUTLINE_OWNER;
-    cidglyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
-
-    /* for composite glyphs, return only left side bearing and */
-    /* advance width                                           */
+    /* bearing the yMax; for composite glyphs, return only */
+    /* left side bearing and advance width                 */
     if ( load_flags & FT_LOAD_NO_RECURSE )
     {
       FT_Slot_Internal  internal = cidglyph->internal;
@@ -527,6 +519,13 @@
       FT_Glyph_Metrics*  metrics = &cidglyph->metrics;
 
 
+      cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+      cidglyph->outline.flags &= FT_OUTLINE_OWNER;
+      cidglyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
+      if ( cidsize->metrics.y_ppem < 24 )
+        cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
       /* copy the _unscaled_ advance width */
       metrics->horiAdvance =
         FIXED_TO_INT( decoder.builder.advance.x );
@@ -539,11 +538,6 @@
                                       face->cid.font_bbox.yMin ) >> 16;
       cidglyph->linearVertAdvance = metrics->vertAdvance;
 
-      cidglyph->format            = FT_GLYPH_FORMAT_OUTLINE;
-
-      if ( cidsize->metrics.y_ppem < 24 )
-        cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
-
       /* apply the font matrix, if any */
       if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L ||
            font_matrix.xy != 0        || font_matrix.yx != 0        )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidgload.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidgload.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidgload.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidgload.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   OpenType Glyph Loader (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidload.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidload.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidload.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidload.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CID-keyed Type1 font loader (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidload.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidload.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidload.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidload.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CID-keyed Type1 font loader (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CID objects manager (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidobjs.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CID objects manager (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidparse.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidparse.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidparse.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidparse.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CID-keyed Type1 parser (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidparse.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidparse.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidparse.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidparse.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CID-keyed Type1 parser (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidriver.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidriver.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidriver.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidriver.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CID driver interface (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidriver.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidriver.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidriver.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidriver.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   High-level CID driver interface (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidtoken.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidtoken.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/cid/cidtoken.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/cid/cidtoken.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   CID token definitions (specification only).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -47,7 +47,7 @@
   T1_FIELD_STRING( "FullName",           full_name,           0 )
   T1_FIELD_STRING( "FamilyName",         family_name,         0 )
   T1_FIELD_STRING( "Weight",             weight,              0 )
-  T1_FIELD_NUM   ( "ItalicAngle",        italic_angle,        0 )
+  T1_FIELD_FIXED ( "ItalicAngle",        italic_angle,        0 )
   T1_FIELD_BOOL  ( "isFixedPitch",       is_fixed_pitch,      0 )
   T1_FIELD_NUM   ( "UnderlinePosition",  underline_position,  0 )
   T1_FIELD_NUM   ( "UnderlineThickness", underline_thickness, 0 )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   AFM parser (body).
  *
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/afmparse.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   AFM parser (specification).
  *
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   PostScript CFF (Type 2) decoding routines (body).
  *
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -2141,7 +2141,7 @@
                                       decoder->locals_bias );
 
 
-            FT_TRACE4(( " callsubr (idx %d, entering level %td)\n",
+            FT_TRACE4(( " callsubr (idx %u, entering level %td)\n",
                         idx,
                         zone - decoder->zones + 1 ));
 
@@ -2185,7 +2185,7 @@
                                       decoder->globals_bias );
 
 
-            FT_TRACE4(( " callgsubr (idx %d, entering level %td)\n",
+            FT_TRACE4(( " callgsubr (idx %u, entering level %td)\n",
                         idx,
                         zone - decoder->zones + 1 ));
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/cffdecode.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   PostScript CFF (Type 2) decoding routines (specification).
  *
- * Copyright (C) 2017-2024 by
+ * Copyright (C) 2017-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psauxerr.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psauxerr.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psauxerr.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psauxerr.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   PS auxiliary module error codes (specification only).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType auxiliary PostScript module implementation (body).
  *
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psauxmod.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType auxiliary PostScript module implementation (specification).
  *
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -46,9 +46,6 @@
   const CFF_Decoder_FuncsRec  cff_decoder_funcs;
 
 
-  FT_EXPORT_VAR( const FT_Module_Class )  psaux_driver_class;
-
-
   FT_DECLARE_MODULE( psaux_module_class )
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psconv.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psconv.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psconv.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psconv.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Some convenience conversions (body).
  *
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psconv.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psconv.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psconv.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psconv.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Some convenience conversions (specification).
  *
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psintrp.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psintrp.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psintrp.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psintrp.c	2026-04-17 19:09:35.000000000 +0000
@@ -618,7 +618,7 @@
     /*       Our copy of it does not change that requirement.         */
     cf2_arrstack_setCount( &subrStack, CF2_MAX_SUBR + 1 );
 
-    charstring  = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack );
+    charstring = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack );
 
     /* catch errors so far */
     if ( *error )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auxiliary functions for PostScript fonts (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -460,6 +460,9 @@
       case '%':
         skip_comment( &cur, limit );
         break;
+
+      default:
+        break;
       }
     }
 
@@ -1145,7 +1148,7 @@
             FT_ERROR(( "ps_parser_load_field:"
                        " expected a name or string\n" ));
             FT_ERROR(( "                     "
-                       " but found token of type %d instead\n",
+                       " but found token of type %u instead\n",
                        token.type ));
             error = FT_THROW( Invalid_File_Format );
             goto Exit;
@@ -1225,7 +1228,7 @@
             if ( result < 0 || (FT_UInt)result < max_objects )
             {
               FT_ERROR(( "ps_parser_load_field:"
-                         " expected %d integer%s in the %s subarray\n",
+                         " expected %u integer%s in the %s subarray\n",
                          max_objects, max_objects > 1 ? "s" : "",
                          i == 0 ? "first"
                                 : ( i == 1 ? "second"
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/psobjs.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Auxiliary functions for PostScript fonts (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Type 1 character map support (body).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/t1cmap.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Type 1 character map support (specification).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   PostScript Type 1 decoding routines (body).
  *
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -1633,7 +1633,7 @@
 
         default:
           FT_ERROR(( "t1_decoder_parse_charstrings:"
-                     " unhandled opcode %d\n", op ));
+                     " unhandled opcode %u\n", op ));
           goto Syntax_Error;
         }
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psaux/t1decode.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   PostScript Type 1 decoding routines (specification).
  *
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   PostScript hinting algorithm (body).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used
@@ -35,10 +35,6 @@
 #endif
 
 
-#define  COMPUTE_INFLEXS  /* compute inflection points to optimize `S' */
-                          /* and similar glyphs                        */
-
-
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
@@ -100,7 +96,7 @@
 
     if ( idx >= table->max_hints )
     {
-      FT_TRACE0(( "psh_hint_table_record: invalid hint index %d\n", idx ));
+      FT_TRACE0(( "psh_hint_table_record: invalid hint index %u\n", idx ));
       return;
     }
 
@@ -920,117 +916,6 @@
 #define  psh_corner_orientation  ft_corner_orientation
 
 
-#ifdef COMPUTE_INFLEXS
-
-  /* compute all inflex points in a given glyph */
-  static void
-  psh_glyph_compute_inflections( PSH_Glyph  glyph )
-  {
-    FT_UInt  n;
-
-
-    for ( n = 0; n < glyph->num_contours; n++ )
-    {
-      PSH_Point  first, start, end, before, after;
-      FT_Pos     in_x, in_y, out_x, out_y;
-      FT_Int     orient_prev, orient_cur;
-      FT_Int     finished = 0;
-
-
-      /* we need at least 4 points to create an inflection point */
-      if ( glyph->contours[n].count < 4 )
-        continue;
-
-      /* compute first segment in contour */
-      first = glyph->contours[n].start;
-
-      start = end = first;
-      do
-      {
-        end = end->next;
-        if ( end == first )
-          goto Skip;
-
-        in_x = end->org_u - start->org_u;
-        in_y = end->org_v - start->org_v;
-
-      } while ( in_x == 0 && in_y == 0 );
-
-      /* extend the segment start whenever possible */
-      before = start;
-      do
-      {
-        do
-        {
-          start  = before;
-          before = before->prev;
-          if ( before == first )
-            goto Skip;
-
-          out_x = start->org_u - before->org_u;
-          out_y = start->org_v - before->org_v;
-
-        } while ( out_x == 0 && out_y == 0 );
-
-        orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y );
-
-      } while ( orient_prev == 0 );
-
-      first = start;
-      in_x  = out_x;
-      in_y  = out_y;
-
-      /* now, process all segments in the contour */
-      do
-      {
-        /* first, extend current segment's end whenever possible */
-        after = end;
-        do
-        {
-          do
-          {
-            end   = after;
-            after = after->next;
-            if ( after == first )
-              finished = 1;
-
-            out_x = after->org_u - end->org_u;
-            out_y = after->org_v - end->org_v;
-
-          } while ( out_x == 0 && out_y == 0 );
-
-          orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y );
-
-        } while ( orient_cur == 0 );
-
-        if ( ( orient_cur ^ orient_prev ) < 0 )
-        {
-          do
-          {
-            psh_point_set_inflex( start );
-            start = start->next;
-          }
-          while ( start != end );
-
-          psh_point_set_inflex( start );
-        }
-
-        start       = end;
-        end         = after;
-        orient_prev = orient_cur;
-        in_x        = out_x;
-        in_y        = out_y;
-
-      } while ( !finished );
-
-    Skip:
-      ;
-    }
-  }
-
-#endif /* COMPUTE_INFLEXS */
-
-
   static void
   psh_glyph_done( PSH_Glyph  glyph )
   {
@@ -1258,11 +1143,6 @@
     glyph->outline = outline;
     glyph->globals = globals;
 
-#ifdef COMPUTE_INFLEXS
-    psh_glyph_load_points( glyph, 0 );
-    psh_glyph_compute_inflections( glyph );
-#endif /* COMPUTE_INFLEXS */
-
     /* now deal with hints tables */
     error = psh_hint_table_init( &glyph->hint_tables [0],
                                  &ps_hints->dimension[0].hints,
@@ -1285,122 +1165,47 @@
   }
 
 
-  /* compute all extrema in a glyph for a given dimension */
+  /* compute all extreme and inflection points */
+  /* in a glyph for a given dimension          */
   static void
   psh_glyph_compute_extrema( PSH_Glyph  glyph )
   {
     FT_UInt  n;
 
 
-    /* first of all, compute all local extrema */
     for ( n = 0; n < glyph->num_contours; n++ )
     {
-      PSH_Point  first = glyph->contours[n].start;
-      PSH_Point  point, before, after;
+      PSH_Point  first, point, before, after;
 
 
-      if ( glyph->contours[n].count == 0 )
+      /* we need at least 3 points to create an extremum */
+      if ( glyph->contours[n].count < 3 )
         continue;
 
-      point  = first;
-      before = point;
+      first = glyph->contours[n].start;
+      point = first->prev;
+      after = first;
 
       do
       {
-        before = before->prev;
-        if ( before == first )
-          goto Skip;
-
-      } while ( before->org_u == point->org_u );
-
-      first = point = before->next;
-
-      for (;;)
-      {
-        after = point;
-        do
-        {
-          after = after->next;
-          if ( after == first )
-            goto Next;
-
-        } while ( after->org_u == point->org_u );
-
-        if ( before->org_u < point->org_u )
-        {
-          if ( after->org_u < point->org_u )
-          {
-            /* local maximum */
-            goto Extremum;
-          }
-        }
-        else /* before->org_u > point->org_u */
-        {
-          if ( after->org_u > point->org_u )
-          {
-            /* local minimum */
-          Extremum:
-            do
-            {
-              psh_point_set_extremum( point );
-              point = point->next;
-
-            } while ( point != after );
-          }
-        }
-
-        before = after->prev;
+        before = point;
         point  = after;
+        after  = point->next;
 
-      } /* for  */
-
-    Next:
-      ;
-    }
-
-    /* for each extremum, determine its direction along the */
-    /* orthogonal axis                                      */
-    for ( n = 0; n < glyph->num_points; n++ )
-    {
-      PSH_Point  point, before, after;
-
-
-      point  = &glyph->points[n];
-      before = point;
-      after  = point;
-
-      if ( psh_point_is_extremum( point ) )
-      {
-        do
-        {
-          before = before->prev;
-          if ( before == point )
-            goto Skip;
-
-        } while ( before->org_v == point->org_v );
+        if ( ( before->org_u < point->org_u && point->org_u < after->org_u ) ||
+             ( before->org_u > point->org_u && point->org_u > after->org_u ) )
+          continue;
 
-        do
-        {
-          after = after->next;
-          if ( after == point )
-            goto Skip;
+        /* otherwise this is either extremum or inflection point */
+        psh_point_set_extremum( point );
 
-        } while ( after->org_v == point->org_v );
-      }
-
-      if ( before->org_v < point->org_v &&
-           after->org_v  > point->org_v )
-      {
-        psh_point_set_positive( point );
-      }
-      else if ( before->org_v > point->org_v &&
-                after->org_v  < point->org_v )
-      {
-        psh_point_set_negative( point );
-      }
+        /* also note its direction */
+        if ( before->org_v < after->org_v )
+          psh_point_set_positive( point );
+        else if ( before->org_v > after->org_v )
+          psh_point_set_negative( point );
 
-    Skip:
-      ;
+      } while ( after != first );
     }
   }
 
@@ -1836,8 +1641,7 @@
              point->dir_in != point->dir_out )
           continue;
 
-        if ( !psh_point_is_extremum( point ) &&
-             !psh_point_is_inflex( point )   )
+        if ( !psh_point_is_extremum( point ) )
           continue;
 
         point->flags &= ~PSH_POINT_SMOOTH;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshalgo.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   PostScript hinting algorithm (specification).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.c	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   PostScript hinter global hinting management (body).
  *   Inspired by the new auto-hinter module.
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used
@@ -376,36 +376,24 @@
     /* not.  We simply need to compare the vertical scale     */
     /* parameter to the raw bluescale value.  Here is why:    */
     /*                                                        */
-    /*   We need to suppress overshoots for all pointsizes.   */
-    /*   At 300dpi that satisfies:                            */
+    /* The specs explain how the bluescale is calculated      */
+    /* from the desired maximum rounded pointsize at 300 dpi  */
+    /* and assuming upem of 1000.                             */
     /*                                                        */
-    /*      pointsize < 240*bluescale + 0.49                  */
+    /*    bluescale = ( pointsize - 0.49 ) / 240              */
     /*                                                        */
-    /*   This corresponds to:                                 */
+    /* For unrounded pointsize in general terms               */
     /*                                                        */
-    /*      pixelsize < 1000*bluescale + 49/24                */
+    /*    bluescale = ( pointsize * dpi / 72 ) / upem         */
     /*                                                        */
-    /*      scale*EM_Size < 1000*bluescale + 49/24            */
+    /* which is                                               */
     /*                                                        */
-    /*   However, for normal Type 1 fonts, EM_Size is 1000!   */
-    /*   We thus only check:                                  */
+    /*    bluescale = pixelsize / upem                        */
     /*                                                        */
-    /*      scale < bluescale + 49/24000                      */
+    /* Therefore, the bluescale value can be used directly    */
+    /* as a scale limit, now that it is in comparable units   */
     /*                                                        */
-    /*   which we shorten to                                  */
-    /*                                                        */
-    /*      "scale < bluescale"                               */
-    /*                                                        */
-    /* Note that `blue_scale' is stored 1000 times its real   */
-    /* value, and that `scale' converts from font units to    */
-    /* fractional pixels.                                     */
-    /*                                                        */
-
-    /* 1000 / 64 = 125 / 8 */
-    if ( scale >= 0x20C49BAL )
-      blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 );
-    else
-      blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 );
+    blues->no_overshoots = FT_BOOL( scale < blues->blue_scale );
 
     /*                                                        */
     /*  The blue threshold is the font units distance under   */
@@ -420,8 +408,8 @@
       FT_Int  threshold = blues->blue_shift;
 
 
-      while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 )
-        threshold--;
+      if ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 )
+        threshold = 32 * 0x10000L / scale;
 
       blues->blue_threshold = threshold;
     }
@@ -708,7 +696,6 @@
 
       /* limit the BlueScale value to `1 / max_of_blue_zone_heights' */
       {
-        FT_Fixed  max_scale;
         FT_Short  max_height = 1;
 
 
@@ -725,11 +712,12 @@
                                           priv->family_other_blues,
                                           max_height );
 
-        /* BlueScale is scaled 1000 times */
-        max_scale = FT_DivFix( 1000, max_height );
-        globals->blues.blue_scale = priv->blue_scale < max_scale
-                                      ? priv->blue_scale
-                                      : max_scale;
+        /* restrict BlueScale value that is amplified 1000-fold and */
+        /* rescale it to be comparable to the metrics scale         */
+        if ( FT_MulFix( max_height, priv->blue_scale ) < 1000 )
+          globals->blues.blue_scale = priv->blue_scale * 8 / 125;
+        else
+          globals->blues.blue_scale = 64 * 0x10000L / max_height;
       }
 
       globals->blues.blue_shift = priv->blue_shift;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshglob.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   PostScript hinter global hinting management.
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType PostScript hinter module implementation (body).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshmod.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   PostScript hinter module interface (specification).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshnterr.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshnterr.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshnterr.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshnterr.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   PS Hinter error codes (specification only).
  *
- * Copyright (C) 2003-2024 by
+ * Copyright (C) 2003-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType PostScript hints recorder (body).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -467,7 +467,7 @@
       table->num_masks--;
     }
     else
-      FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%d,%d)\n",
+      FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%u,%u)\n",
                   index1, index2 ));
 
   Exit:
@@ -817,7 +817,7 @@
     /* limit "dimension" to 0..1 */
     if ( dimension > 1 )
     {
-      FT_TRACE0(( "ps_hints_stem: invalid dimension (%d) used\n",
+      FT_TRACE0(( "ps_hints_stem: invalid dimension (%u) used\n",
                   dimension ));
       dimension = ( dimension != 0 );
     }
@@ -870,7 +870,7 @@
       /* limit "dimension" to 0..1 */
       if ( dimension > 1 )
       {
-        FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%d) used\n",
+        FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%u) used\n",
                     dimension ));
         dimension = ( dimension != 0 );
       }
@@ -976,7 +976,7 @@
       if ( bit_count !=  count1 + count2 )
       {
         FT_TRACE0(( "ps_hints_t2mask:"
-                    " called with invalid bitcount %d (instead of %d)\n",
+                    " called with invalid bitcount %u (instead of %u)\n",
                    bit_count, count1 + count2 ));
 
         /* simply ignore the operator */
@@ -1022,7 +1022,7 @@
       if ( bit_count !=  count1 + count2 )
       {
         FT_TRACE0(( "ps_hints_t2counter:"
-                    " called with invalid bitcount %d (instead of %d)\n",
+                    " called with invalid bitcount %u (instead of %u)\n",
                    bit_count, count1 + count2 ));
 
         /* simply ignore the operator */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/pshinter/pshrec.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Postscript (Type1/Type2) hints recorder (specification).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   psnames module implementation (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psnames/psmodule.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   High-level psnames module interface (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psnames/psnamerr.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psnames/psnamerr.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psnames/psnamerr.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psnames/psnamerr.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   PS names module error codes (specification only).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psnames/pstables.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psnames/pstables.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/psnames/pstables.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/psnames/pstables.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   PostScript glyph names.
  *
- * Copyright (C) 2005-2024 by
+ * Copyright (C) 2005-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/raster/ftmisc.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/raster/ftmisc.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/raster/ftmisc.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/raster/ftmisc.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Miscellaneous macros for stand-alone rasterizer (specification
  *   only).
  *
- * Copyright (C) 2005-2024 by
+ * Copyright (C) 2005-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/raster/ftraster.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/raster/ftraster.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/raster/ftraster.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/raster/ftraster.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType glyph rasterizer (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -251,7 +251,11 @@
   /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */
   /* for clipping computations.  It simply uses the FT_MulDiv() function   */
   /* defined in `ftcalc.h'.                                                */
-#define SMulDiv_No_Round  FT_MulDiv_No_Round
+#ifdef FT_INT64
+#define SMulDiv( a, b, c )  (Long)( (FT_Int64)(a) * (b) / (c) )
+#else
+#define SMulDiv  FT_MulDiv_No_Round
+#endif
 
   /* The rasterizer is a very general purpose component; please leave */
   /* the following redefinitions there (you never know your target    */
@@ -653,7 +657,7 @@
       ras.cProfile->height = 0;
     }
 
-    ras.cProfile->flags  = ras.dropOutControl;
+    ras.cProfile->flags = ras.dropOutControl;
 
     switch ( aState )
     {
@@ -967,14 +971,14 @@
       goto Fin;
     }
 
-    Ix     = SMulDiv_No_Round( e - y1, Dx, Dy );
+    Ix     = SMulDiv( e - y1, Dx, Dy );
     x1    += Ix;
     *top++ = x1;
 
     if ( --size )
     {
       Ax = Dx * ( e - y1 )    - Dy * Ix;  /* remainder */
-      Ix = FMulDiv( ras.precision, Dx, Dy );
+      Ix = SMulDiv( ras.precision, Dx, Dy );
       Rx = Dx * ras.precision - Dy * Ix;  /* remainder */
       Dx = 1;
 
@@ -1090,8 +1094,8 @@
     PLong  top;
 
 
-    y1  = arc[degree].y;
-    y2  = arc[0].y;
+    y1 = arc[degree].y;
+    y2 = arc[0].y;
 
     if ( y2 < miny || y1 > maxy )
       return SUCCESS;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/raster/ftraster.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/raster/ftraster.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/raster/ftraster.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/raster/ftraster.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType glyph rasterizer (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType glyph rasterizer interface (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/raster/ftrend1.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   The FreeType glyph rasterizer interface (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/raster/rasterrs.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/raster/rasterrs.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/raster/rasterrs.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/raster/rasterrs.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   monochrome renderer error codes (specification only).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   PNG Bitmap glyph support.
  *
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
  * Google, Inc.
  * Written by Stuart Gill and Behdad Esfahbod.
  *
@@ -420,10 +420,7 @@
     if ( populate_map_and_metrics )
     {
       /* this doesn't overflow: 0x7FFF * 0x7FFF * 4 < 2^32 */
-      FT_ULong  size = map->rows * (FT_ULong)map->pitch;
-
-
-      error = ft_glyphslot_alloc_bitmap( slot, size );
+      error = ft_glyphslot_alloc_bitmap( slot );
       if ( error )
         goto DestroyExit;
     }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/pngshim.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   PNG Bitmap glyph support.
  *
- * Copyright (C) 2013-2024 by
+ * Copyright (C) 2013-2025 by
  * Google, Inc.
  * Written by Stuart Gill and Behdad Esfahbod.
  *
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   High-level SFNT driver interface (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -895,7 +895,7 @@
         FT_TRACE0(( "sfnt_get_var_ps_name:"
                     " Shortening variation PS name prefix\n" ));
         FT_TRACE0(( "                     "
-                    " to %d characters\n", len ));
+                    " to %u characters\n", len ));
       }
 
       face->var_postscript_prefix     = result;
@@ -1142,12 +1142,7 @@
     FT_Error         error;
 
 
-    /* XXX: I don't know whether this is correct, since
-     *      tt_face_find_bdf_prop only returns something correct if we have
-     *      previously selected a size that is listed in the BDF table.
-     *      Should we change the BDF table format to include single offsets
-     *      for `CHARSET_REGISTRY' and `CHARSET_ENCODING'?
-     */
+    /* We expect that a bitmap strike has been selected. */
     error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", ®istry );
     if ( !error )
     {
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfdriver.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   High-level SFNT driver interface (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sferrors.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sferrors.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sferrors.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sferrors.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   SFNT error codes (specification only).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   SFNT object management (base).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -579,6 +579,9 @@
     if ( face_instance_index < 0 && face_index > 0 )
       face_index--;
 
+    /* Note that `face_index` is also used to enumerate elements */
+    /* of containers like a Mac Resource; this means we must     */
+    /* check whether we actually have a TTC.                     */
     if ( face_index >= face->ttc_header.count )
     {
       if ( face_instance_index >= 0 )
@@ -1127,9 +1130,9 @@
         flags |= FT_FACE_FLAG_VERTICAL;
 
       /* kerning available ? */
-      if ( TT_FACE_HAS_KERNING( face )
+      if ( face->kern_avail_bits
 #ifdef TT_CONFIG_OPTION_GPOS_KERNING
-           || face->gpos_kerning_available
+           || face->num_gpos_lookups_kerning
 #endif
          )
         flags |= FT_FACE_FLAG_KERNING;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfobjs.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   SFNT object management (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   WOFF format management (base).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   WOFFF format management (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   WOFF2 format management (base).
  *
- * Copyright (C) 2019-2024 by
+ * Copyright (C) 2019-2025 by
  * Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -902,7 +902,7 @@
       substreams[i].offset = pos + offset;
       substreams[i].size   = substream_size;
 
-      FT_TRACE5(( "  Substream %d: offset = %lu; size = %lu;\n",
+      FT_TRACE5(( "  Substream %u: offset = %lu; size = %lu;\n",
                   i, substreams[i].offset, substreams[i].size ));
       offset += substream_size;
     }
@@ -1043,7 +1043,6 @@
         FT_ULong   total_n_points = 0;
         FT_UShort  n_points_contour;
         FT_UInt    j;
-        FT_ULong   flag_size;
         FT_ULong   triplet_size;
         FT_ULong   triplet_bytes_used;
         FT_Bool    have_overlap  = FALSE;
@@ -1088,8 +1087,8 @@
         }
         substreams[N_POINTS_STREAM].offset = FT_STREAM_POS();
 
-        flag_size = total_n_points;
-        if ( flag_size > substreams[FLAG_STREAM].size )
+        points_size += total_n_points;
+        if ( points_size > substreams[FLAG_STREAM].size )
           goto Fail;
 
         flags_buf   = stream->base + substreams[FLAG_STREAM].offset;
@@ -1106,8 +1105,7 @@
         triplet_bytes_used = 0;
 
         /* Create array to store point information. */
-        points_size = total_n_points;
-        if ( FT_QNEW_ARRAY( points, points_size ) )
+        if ( FT_QNEW_ARRAY( points, total_n_points ) )
           goto Fail;
 
         if ( triplet_decode( flags_buf,
@@ -1118,7 +1116,7 @@
                              &triplet_bytes_used ) )
           goto Fail;
 
-        substreams[FLAG_STREAM].offset  += flag_size;
+        substreams[FLAG_STREAM].offset  += total_n_points;
         substreams[GLYPH_STREAM].offset += triplet_bytes_used;
 
         if ( FT_STREAM_SEEK( substreams[GLYPH_STREAM].offset ) ||
@@ -1592,7 +1590,7 @@
       WOFF2_TableRec  table = *( indices[nn] );
 
 
-      FT_TRACE3(( "Seeking to %ld with table size %ld.\n",
+      FT_TRACE3(( "Seeking to %lu with table size %lu.\n",
                   table.src_offset, table.src_length ));
       FT_TRACE3(( "Table tag: %c%c%c%c.\n",
                   (FT_Char)( table.Tag >> 24 ),
@@ -1943,7 +1941,7 @@
       src_offset       += table->TransformLength;
       table->dst_offset = 0;
 
-      FT_TRACE2(( "  %c%c%c%c  %08d  %08d   %08ld    %08ld    %08ld\n",
+      FT_TRACE2(( "  %c%c%c%c  %08d  %08d   %08lu    %08lu    %08lu\n",
                   (FT_Char)( table->Tag >> 24 ),
                   (FT_Char)( table->Tag >> 16 ),
                   (FT_Char)( table->Tag >> 8  ),
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/sfwoff2.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   WOFFF2 format management (specification).
  *
- * Copyright (C) 2019-2024 by
+ * Copyright (C) 2019-2025 by
  * Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType character mapping table (cmap) support (body).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -179,7 +179,7 @@
 
 
     cmap_info->format   = 0;
-    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+    cmap_info->language = TT_PEEK_USHORT( p );
 
     return FT_Err_Ok;
   }
@@ -596,7 +596,7 @@
 
 
     cmap_info->format   = 2;
-    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+    cmap_info->language = TT_PEEK_USHORT( p );
 
     return FT_Err_Ok;
   }
@@ -1539,7 +1539,7 @@
 
 
     cmap_info->format   = 4;
-    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+    cmap_info->language = TT_PEEK_USHORT( p );
 
     return FT_Err_Ok;
   }
@@ -1712,7 +1712,7 @@
 
 
     cmap_info->format   = 6;
-    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+    cmap_info->language = TT_PEEK_USHORT( p );
 
     return FT_Err_Ok;
   }
@@ -2009,7 +2009,7 @@
 
 
     cmap_info->format   = 8;
-    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+    cmap_info->language = TT_PEEK_ULONG( p );
 
     return FT_Err_Ok;
   }
@@ -2184,7 +2184,7 @@
 
 
     cmap_info->format   = 10;
-    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+    cmap_info->language = TT_PEEK_ULONG( p );
 
     return FT_Err_Ok;
   }
@@ -2528,7 +2528,7 @@
 
 
     cmap_info->format   = 12;
-    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+    cmap_info->language = TT_PEEK_ULONG( p );
 
     return FT_Err_Ok;
   }
@@ -2844,7 +2844,7 @@
 
 
     cmap_info->format   = 13;
-    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+    cmap_info->language = TT_PEEK_ULONG( p );
 
     return FT_Err_Ok;
   }
@@ -3792,7 +3792,7 @@
       return FT_THROW( Invalid_Table );
 
     /* Version 1.8.3 of the OpenType specification contains the following */
-    /* (https://docs.microsoft.com/en-us/typography/opentype/spec/cmap):  */
+    /* (https://learn.microsoft.com/typography/opentype/spec/cmap):       */
     /*                                                                    */
     /*   The 'cmap' table version number remains at 0x0000 for fonts that */
     /*   make use of the newer subtable formats.                          */
@@ -3803,7 +3803,7 @@
     p += 2;
 
     num_cmaps = TT_NEXT_USHORT( p );
-    FT_TRACE4(( "tt_face_build_cmaps: %d cmaps\n", num_cmaps ));
+    FT_TRACE4(( "tt_face_build_cmaps: %u cmaps\n", num_cmaps ));
 
     limit = table + face->cmap_size;
     for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmap.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType character mapping table (cmap) support (specification).
  *
- * Copyright (C) 2002-2024 by
+ * Copyright (C) 2002-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmapc.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmapc.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmapc.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttcmapc.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TT CMAP classes definitions (specification only).
  *
- * Copyright (C) 2009-2024 by
+ * Copyright (C) 2009-2025 by
  * Oran Agra and Mickey Gabel.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType and OpenType colored glyph layer support (body).
  *
- * Copyright (C) 2018-2024 by
+ * Copyright (C) 2018-2025 by
  * David Turner, Robert Wilhelm, Dominik Röttsches, and Werner Lemberg.
  *
  * Originally written by Shao Yu Zhang .
@@ -51,7 +51,7 @@
 #define COLOR_STOP_SIZE                   6U
 #define VAR_IDX_BASE_SIZE                 4U
 #define LAYER_SIZE                        4U
-/* https://docs.microsoft.com/en-us/typography/opentype/spec/colr#colr-header */
+/* https://learn.microsoft.com/typography/opentype/spec/colr#colr-header */
 /* 3 * uint16 + 2 * Offset32 */
 #define COLRV0_HEADER_SIZE               14U
 /* COLRV0_HEADER_SIZE + 5 * Offset32 */
@@ -1749,7 +1749,6 @@
     FT_UInt  x, y;
     FT_Byte  b, g, r, alpha;
 
-    FT_ULong  size;
     FT_Byte*  src;
     FT_Byte*  dst;
 
@@ -1767,13 +1766,9 @@
       dstSlot->bitmap.pitch      = (int)dstSlot->bitmap.width * 4;
       dstSlot->bitmap.num_grays  = 256;
 
-      size = dstSlot->bitmap.rows * (unsigned int)dstSlot->bitmap.pitch;
-
-      error = ft_glyphslot_alloc_bitmap( dstSlot, size );
+      error = ft_glyphslot_alloc_bitmap( dstSlot );
       if ( error )
         return error;
-
-      FT_MEM_ZERO( dstSlot->bitmap.buffer, size );
     }
     else
     {
@@ -1805,8 +1800,7 @@
         FT_Byte*  q;
 
 
-        size  = rows * pitch;
-        if ( FT_ALLOC( buf, size ) )
+        if ( FT_ALLOC_MULT( buf, rows, pitch ) )
           return error;
 
         p = dstSlot->bitmap.buffer;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttcolr.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType and OpenType colored glyph layer support (specification).
  *
- * Copyright (C) 2018-2024 by
+ * Copyright (C) 2018-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * Originally written by Shao Yu Zhang .
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType and OpenType color palette support (body).
  *
- * Copyright (C) 2018-2024 by
+ * Copyright (C) 2018-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * Originally written by Shao Yu Zhang .
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttcpal.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType and OpenType color palette support (specification).
  *
- * Copyright (C) 2018-2024 by
+ * Copyright (C) 2018-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * Originally written by Shao Yu Zhang .
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.c	2026-04-17 19:09:35.000000000 +0000
@@ -2,10 +2,9 @@
  *
  * ttkern.c
  *
- *   Load the basic TrueType kerning table.  This doesn't handle
- *   kerning data within the GPOS table at the moment.
+ *   Routines to parse and access the 'kern' table for kerning (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttkern.h	2026-04-17 19:09:35.000000000 +0000
@@ -2,10 +2,10 @@
  *
  * ttkern.h
  *
- *   Load the basic TrueType kerning table.  This doesn't handle
- *   kerning data within the GPOS table at the moment.
+ *   Routines to parse and access the 'kern' table for kerning
+ *   (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -40,8 +40,6 @@
                        FT_UInt     left_glyph,
                        FT_UInt     right_glyph );
 
-#define TT_FACE_HAS_KERNING( face )  ( (face)->kern_avail_bits != 0 )
-
 
 FT_END_HEADER
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.c	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Load the basic TrueType tables, i.e., tables that can be either in
  *   TTF or OTF fonts (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -535,7 +535,8 @@
    *     The tag of table to load.  Use the value 0 if you want
    *     to access the whole font file, else set this parameter
    *     to a valid TrueType table tag that you can forge with
-   *     the MAKE_TT_TAG macro.
+   *     the MAKE_TT_TAG macro.  Use value 1 to access the table
+   *     directory.
    *
    *   offset ::
    *     The starting offset in the table (or the file if
@@ -577,7 +578,29 @@
     FT_ULong   size;
 
 
-    if ( tag != 0 )
+    if ( tag == 0 )
+    {
+      /* The whole font file. */
+      size = face->root.stream->size;
+    }
+    else if ( tag == 1 )
+    {
+      /* The currently selected font's table directory.            */
+      /*                                                           */
+      /* Note that `face_index` is also used to enumerate elements */
+      /* of containers like a Mac Resource; this means we must     */
+      /* check whether we actually have a TTC (with multiple table */
+      /* directories).                                             */
+      FT_Long  idx = face->root.face_index & 0xFFFF;
+
+
+      if ( idx >= face->ttc_header.count )
+        idx = 0;
+
+      offset += face->ttc_header.offsets[idx];
+      size    = 4 + 8 + 16 * face->num_tables;
+    }
+    else
     {
       /* look for tag in font directory */
       table = tt_face_lookup_table( face, tag );
@@ -590,9 +613,6 @@
       offset += table->Offset;
       size    = table->Length;
     }
-    else
-      /* tag == 0 -- the user wants to access the font file directly */
-      size = face->root.stream->size;
 
     if ( length && *length == 0 )
     {
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttload.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   Load the basic TrueType tables, i.e., tables that can be either in
  *   TTF or OTF fonts (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Load the metrics tables common to TTF and OTF fonts (body).
  *
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -306,7 +306,7 @@
     }
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-    if ( var && face->blend )
+    if ( var && FT_IS_VARIATION( &face->root ) )
     {
       FT_Face  f = FT_FACE( face );
       FT_Int   a = (FT_Int)*aadvance;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttmtx.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Load the metrics tables common to TTF and OTF fonts (specification).
  *
- * Copyright (C) 2006-2024 by
+ * Copyright (C) 2006-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.c	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   PostScript name table processing for TrueType and OpenType fonts
  *   (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttpost.h	2026-04-17 19:09:35.000000000 +0000
@@ -5,7 +5,7 @@
  *   PostScript name table processing for TrueType and OpenType fonts
  *   (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType and OpenType embedded bitmap support (body).
  *
- * Copyright (C) 2005-2024 by
+ * Copyright (C) 2005-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * Copyright 2013 by Google, Inc.
@@ -342,7 +342,7 @@
             FT_TRACE2(( "tt_face_load_strike_metrics:"
                         " sanitizing invalid ascender and descender\n" ));
             FT_TRACE2(( "                            "
-                        " values for strike %ld (%dppem, %dppem)\n",
+                        " values for strike %lu (%dppem, %dppem)\n",
                         strike_index,
                         metrics->x_ppem, metrics->y_ppem ));
 
@@ -547,7 +547,6 @@
     FT_Error    error = FT_Err_Ok;
     FT_UInt     width, height;
     FT_Bitmap*  map = decoder->bitmap;
-    FT_ULong    size;
 
 
     if ( !decoder->metrics_loaded )
@@ -599,17 +598,11 @@
       goto Exit;
     }
 
-    size = map->rows * (FT_ULong)map->pitch;
-
-    /* check that there is no empty image */
-    if ( size == 0 )
-      goto Exit;     /* exit successfully! */
-
     if ( metrics_only )
       goto Exit;     /* only metrics are requested */
 
-    error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size );
-    if ( error )
+    error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph );
+    if ( error || !map->buffer )
       goto Exit;
 
     decoder->bitmap_allocated = 1;
@@ -993,7 +986,7 @@
       goto Fail;
     }
 
-    FT_TRACE3(( "tt_sbit_decoder_load_compound: loading %d component%s\n",
+    FT_TRACE3(( "tt_sbit_decoder_load_compound: loading %u component%s\n",
                 num_components,
                 num_components == 1 ? "" : "s" ));
 
@@ -1419,7 +1412,7 @@
     image_start = image_offset + image_start;
 
     FT_TRACE3(( "tt_sbit_decoder_load_image:"
-                " found sbit (format %d) for glyph index %d\n",
+                " found sbit (format %u) for glyph index %u\n",
                 image_format, glyph_index ));
 
     return tt_sbit_decoder_load_bitmap( decoder,
@@ -1438,13 +1431,13 @@
     if ( recurse_count )
     {
       FT_TRACE4(( "tt_sbit_decoder_load_image:"
-                  " missing subglyph sbit with glyph index %d\n",
+                  " missing subglyph sbit with glyph index %u\n",
                   glyph_index ));
       return FT_THROW( Invalid_Composite );
     }
 
     FT_TRACE4(( "tt_sbit_decoder_load_image:"
-                " no sbit found for glyph index %d\n", glyph_index ));
+                " no sbit found for glyph index %u\n", glyph_index ));
     return FT_THROW( Missing_Bitmap );
   }
 
@@ -1462,12 +1455,13 @@
     FT_Int    originOffsetX, originOffsetY;
     FT_Tag    graphicType;
     FT_Int    recurse_depth = 0;
+    FT_Bool   flipped       = FALSE;
 
     FT_Error  error;
     FT_Byte*  p;
 
-    FT_UNUSED( map );
 #ifndef FT_CONFIG_OPTION_USE_PNG
+    FT_UNUSED( map );
     FT_UNUSED( metrics_only );
 #endif
 
@@ -1517,12 +1511,16 @@
 
     switch ( graphicType )
     {
+    case FT_MAKE_TAG( 'f', 'l', 'i', 'p' ):
+      flipped = !flipped;
+      FALL_THROUGH;
+
     case FT_MAKE_TAG( 'd', 'u', 'p', 'e' ):
-      if ( recurse_depth < 4 )
+      if ( recurse_depth++ < 4 )
       {
         glyph_index = FT_GET_USHORT();
         FT_FRAME_EXIT();
-        recurse_depth++;
+
         goto retry;
       }
       error = FT_THROW( Invalid_File_Format );
@@ -1540,6 +1538,38 @@
                              glyph_end - glyph_start - 8,
                              TRUE,
                              metrics_only );
+      if ( flipped && !metrics_only && !error )
+      {
+        FT_UInt32*  curr_pos = (FT_UInt32*)map->buffer;
+
+        /* `Load_SBit_Png` always returns a pixmap with 32 bits per pixel */
+        /* and no extra pitch bytes.                                      */
+        FT_UInt  width = map->width;
+        FT_UInt  y;
+
+
+        for ( y = 0; y < map->rows; y++ )
+        {
+          FT_UInt32*  left  = curr_pos;
+          FT_UInt32*  right = curr_pos + width - 1;
+
+
+          while ( left < right )
+          {
+            FT_UInt32  value;
+
+
+            value  = *right;
+            *right = *left;
+            *left  = value;
+
+            left++;
+            right--;
+          }
+
+          curr_pos += width;
+        }
+      }
 #else
       error = FT_THROW( Unimplemented_Feature );
 #endif
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/ttsbit.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType and OpenType embedded bitmap support (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   WOFF2 Font table tags (base).
  *
- * Copyright (C) 2019-2024 by
+ * Copyright (C) 2019-2025 by
  * Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/sfnt/woff2tags.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   WOFF2 Font table tags (specification).
  *
- * Copyright (C) 2019-2024 by
+ * Copyright (C) 2019-2025 by
  * Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   A new `perfect' anti-aliasing renderer (body).
  *
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -157,10 +157,6 @@
 
 #define ft_memset   memset
 
-#define ft_setjmp   setjmp
-#define ft_longjmp  longjmp
-#define ft_jmp_buf  jmp_buf
-
 typedef ptrdiff_t  FT_PtrDist;
 
 
@@ -170,8 +166,8 @@
 #define Smooth_Err_Invalid_Argument     -3
 #define Smooth_Err_Raster_Overflow      -4
 
-#define FT_BEGIN_HEADER
-#define FT_END_HEADER
+#define FT_BEGIN_HEADER  /* nothing */
+#define FT_END_HEADER    /* nothing */
 
 #include "ftimage.h"
 #include "ftgrays.h"
@@ -495,6 +491,7 @@
     TCoord  min_ey, max_ey;
     TCoord  count_ey;        /* same as (max_ey - min_ey) */
 
+    int         error;       /* pool overflow exception                  */
     PCell       cell;        /* current cell                             */
     PCell       cell_free;   /* call allocation next free slot           */
     PCell       cell_null;   /* last cell, used as dumpster and limit    */
@@ -510,8 +507,6 @@
     FT_Raster_Span_Func  render_span;
     void*                render_span_data;
 
-    ft_jmp_buf  jump_buffer;
-
   } gray_TWorker, *gray_PWorker;
 
 #if defined( _MSC_VER )
@@ -613,9 +608,14 @@
       }
 
       /* insert new cell */
-      cell = ras.cell_free++;
-      if ( cell >= ras.cell_null )
-        ft_longjmp( ras.jump_buffer, 1 );
+      cell = ras.cell_free;
+      if ( cell == ras.cell_null )
+      {
+        ras.error = FT_THROW( Raster_Overflow );
+        goto Found;
+      }
+
+      ras.cell_free = cell + 1;
 
       cell->x     = ex;
       cell->area  = 0;
@@ -1353,7 +1353,8 @@
 
     ras.x = x;
     ras.y = y;
-    return 0;
+
+    return ras.error;
   }
 
 
@@ -1365,7 +1366,8 @@
 
 
     gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) );
-    return 0;
+
+    return ras.error;
   }
 
 
@@ -1378,7 +1380,8 @@
 
 
     gray_render_conic( RAS_VAR_ control, to );
-    return 0;
+
+    return ras.error;
   }
 
 
@@ -1392,7 +1395,8 @@
 
 
     gray_render_cubic( RAS_VAR_ control1, control2, to );
-    return 0;
+
+    return ras.error;
   }
 
 
@@ -1700,30 +1704,22 @@
   gray_convert_glyph_inner( RAS_ARG_
                             int  continued )
   {
-    volatile int  error;
+    int  error;
 
 
-    if ( ft_setjmp( ras.jump_buffer ) == 0 )
-    {
-      if ( continued )
-        FT_Trace_Disable();
-      error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );
-      if ( continued )
-        FT_Trace_Enable();
-
-      FT_TRACE7(( "band [%d..%d]: %td cell%s remaining\n",
-                  ras.min_ey,
-                  ras.max_ey,
-                  ras.cell_null - ras.cell_free,
-                  ras.cell_null - ras.cell_free == 1 ? "" : "s" ));
-    }
-    else
-    {
-      error = FT_THROW( Raster_Overflow );
-
-      FT_TRACE7(( "band [%d..%d]: to be bisected\n",
-                  ras.min_ey, ras.max_ey ));
-    }
+    if ( continued )
+      FT_Trace_Disable();
+    error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );
+    if ( continued )
+      FT_Trace_Enable();
+
+    FT_TRACE7(( error == Smooth_Err_Raster_Overflow
+                  ? "band [%d..%d]: to be bisected\n"
+                  : "band [%d..%d]: %td cell%s remaining\n",
+                ras.min_ey,
+                ras.max_ey,
+                ras.cell_null - ras.cell_free,
+                ras.cell_null - ras.cell_free == 1 ? "" : "s" ));
 
     return error;
   }
@@ -1808,7 +1804,7 @@
           FT_FILL_RULE( coverage, cover, fill );
 
           span[n].coverage = (unsigned char)coverage;
-          span[n].x        = (short)x;
+          span[n].x        = (unsigned short)x;
           span[n].len      = (unsigned short)( cell->x - x );
 
           if ( ++n == FT_MAX_GRAY_SPANS )
@@ -1827,7 +1823,7 @@
           FT_FILL_RULE( coverage, area, fill );
 
           span[n].coverage = (unsigned char)coverage;
-          span[n].x        = (short)cell->x;
+          span[n].x        = (unsigned short)cell->x;
           span[n].len      = 1;
 
           if ( ++n == FT_MAX_GRAY_SPANS )
@@ -1873,6 +1869,7 @@
     TCoord*  band;
 
     int  continued = 0;
+    int  error     = Smooth_Err_Ok;
 
 
     /* Initialize the null cell at the end of the poll. */
@@ -1907,7 +1904,6 @@
       do
       {
         TCoord  i;
-        int     error;
 
 
         ras.min_ex = band[1];
@@ -1922,6 +1918,7 @@
 
         ras.cell_free = buffer + n;
         ras.cell      = ras.cell_null;
+        ras.error     = Smooth_Err_Ok;
 
         error     = gray_convert_glyph_inner( RAS_VAR_ continued );
         continued = 1;
@@ -1936,7 +1933,7 @@
           continue;
         }
         else if ( error != Smooth_Err_Raster_Overflow )
-          return error;
+          goto Exit;
 
         /* render pool overflow; we will reduce the render band by half */
         i = ( band[0] - band[1] ) >> 1;
@@ -1945,7 +1942,8 @@
         if ( i == 0 )
         {
           FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" ));
-          return FT_THROW( Raster_Overflow );
+          error = FT_THROW( Raster_Overflow );
+          goto Exit;
         }
 
         band++;
@@ -1954,7 +1952,11 @@
       } while ( band >= bands );
     }
 
-    return Smooth_Err_Ok;
+  Exit:
+    ras.cell   = ras.cell_free = ras.cell_null = NULL;
+    ras.ycells = NULL;
+
+    return error;
   }
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/smooth/ftgrays.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   FreeType smooth renderer declaration
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -19,11 +19,6 @@
 #ifndef FTGRAYS_H_
 #define FTGRAYS_H_
 
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-
 #ifdef STANDALONE_
 #include "ftimage.h"
 #else
@@ -31,6 +26,7 @@
 #include 
 #endif
 
+FT_BEGIN_HEADER
 
   /**************************************************************************
    *
@@ -46,10 +42,7 @@
 
   FT_EXPORT_VAR( const FT_Raster_Funcs )  ft_grays_raster;
 
-
-#ifdef __cplusplus
-  }
-#endif
+FT_END_HEADER
 
 #endif /* FTGRAYS_H_ */
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/smooth/ftsmerrs.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/smooth/ftsmerrs.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/smooth/ftsmerrs.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/smooth/ftsmerrs.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   smooth renderer error codes (specification only).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Anti-aliasing renderer interface (body).
  *
- * Copyright (C) 2000-2024 by
+ * Copyright (C) 2000-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -80,6 +80,7 @@
   {
     unsigned char*  origin;  /* pixmap origin at the bottom-left */
     int             pitch;   /* pitch to go down one row */
+    unsigned char   wght[5]; /* filtering weights */
 
   } TOrigin;
 
@@ -274,6 +275,32 @@
   }
 
 
+  /* This function applies a horizontal filter in direct rendering mode */
+  static void
+  ft_smooth_lcd_spans( int             y,
+                       int             count,
+                       const FT_Span*  spans,
+                       void*           target_ )   /* TOrigin* */
+  {
+    TOrigin*  target = (TOrigin*)target_;
+
+    unsigned char*  dst_line = target->origin - y * target->pitch - 2;
+    unsigned char*  dst;
+    unsigned short  w;
+
+
+    for ( ; count--; spans++ )
+      for ( dst = dst_line + spans->x, w = spans->len; w--; dst++ )
+      {
+        dst[0] += ( spans->coverage * target->wght[0] + 85 ) >> 8;
+        dst[1] += ( spans->coverage * target->wght[1] + 85 ) >> 8;
+        dst[2] += ( spans->coverage * target->wght[2] + 85 ) >> 8;
+        dst[3] += ( spans->coverage * target->wght[3] + 85 ) >> 8;
+        dst[4] += ( spans->coverage * target->wght[4] + 85 ) >> 8;
+      }
+  }
+
+
   static FT_Error
   ft_smooth_raster_lcd( FT_Renderer  render,
                         FT_Outline*  outline,
@@ -285,11 +312,47 @@
     FT_Vector*  vec;
 
     FT_Raster_Params  params;
+    TOrigin           target;
 
 
-    params.target = bitmap;
-    params.source = outline;
-    params.flags  = FT_RASTER_FLAG_AA;
+    if ( render->root.library->lcd_weights[2] )
+    {
+      /* Reject outlines that are too wide for 16-bit FT_Span.       */
+      /* Other limits are applied upstream with the same error code. */
+      if ( bitmap->width > 0x7FFF )
+        return FT_THROW( Raster_Overflow );
+
+      /* Set up direct rendering for instant filtering. */
+      params.source     = outline;
+      params.flags      = FT_RASTER_FLAG_AA | FT_RASTER_FLAG_DIRECT;
+      params.gray_spans = ft_smooth_lcd_spans;
+      params.user       = ⌖
+
+      params.clip_box.xMin = 0;
+      params.clip_box.yMin = 0;
+      params.clip_box.xMax = bitmap->width;
+      params.clip_box.yMax = bitmap->rows;
+
+      if ( bitmap->pitch < 0 )
+        target.origin = bitmap->buffer;
+      else
+        target.origin = bitmap->buffer
+                        + ( bitmap->rows - 1 ) * (unsigned int)bitmap->pitch;
+
+      target.pitch = bitmap->pitch;
+
+      target.wght[0] = render->root.library->lcd_weights[0];
+      target.wght[1] = render->root.library->lcd_weights[1];
+      target.wght[2] = render->root.library->lcd_weights[2];
+      target.wght[3] = render->root.library->lcd_weights[3];
+      target.wght[4] = render->root.library->lcd_weights[4];
+    }
+    else
+    {
+      params.target = bitmap;
+      params.source = outline;
+      params.flags  = FT_RASTER_FLAG_AA;
+    }
 
     /* implode outline */
     for ( vec = points; vec < points_end; vec++ )
@@ -306,6 +369,32 @@
   }
 
 
+  /* This function applies a vertical filter in direct rendering mode */
+  static void
+  ft_smooth_lcdv_spans( int             y,
+                        int             count,
+                        const FT_Span*  spans,
+                        void*           target_ )   /* TOrigin* */
+  {
+    TOrigin*  target = (TOrigin*)target_;
+
+    int             pitch    = target->pitch;
+    unsigned char*  dst_line = target->origin - ( y + 2 ) * pitch;
+    unsigned char*  dst;
+    unsigned short  w;
+
+
+    for ( ; count--; spans++ )
+      for ( dst = dst_line + spans->x, w = spans->len; w--; dst++ )
+      {
+        dst[        0] += ( spans->coverage * target->wght[0] + 85 ) >> 8;
+        dst[    pitch] += ( spans->coverage * target->wght[1] + 85 ) >> 8;
+        dst[2 * pitch] += ( spans->coverage * target->wght[2] + 85 ) >> 8;
+        dst[3 * pitch] += ( spans->coverage * target->wght[3] + 85 ) >> 8;
+        dst[4 * pitch] += ( spans->coverage * target->wght[4] + 85 ) >> 8;
+      }
+  }
+
   static FT_Error
   ft_smooth_raster_lcdv( FT_Renderer  render,
                          FT_Outline*  outline,
@@ -317,11 +406,42 @@
     FT_Vector*  vec;
 
     FT_Raster_Params  params;
+    TOrigin           target;
 
 
-    params.target = bitmap;
-    params.source = outline;
-    params.flags  = FT_RASTER_FLAG_AA;
+    if ( render->root.library->lcd_weights[2] )
+    {
+      /* Set up direct rendering for instant filtering. */
+      params.source     = outline;
+      params.flags      = FT_RASTER_FLAG_AA | FT_RASTER_FLAG_DIRECT;
+      params.gray_spans = ft_smooth_lcdv_spans;
+      params.user       = ⌖
+
+      params.clip_box.xMin = 0;
+      params.clip_box.yMin = 0;
+      params.clip_box.xMax = bitmap->width;
+      params.clip_box.yMax = bitmap->rows;
+
+      if ( bitmap->pitch < 0 )
+        target.origin = bitmap->buffer;
+      else
+        target.origin = bitmap->buffer
+                        + ( bitmap->rows - 1 ) * (unsigned int)bitmap->pitch;
+
+      target.pitch = bitmap->pitch;
+
+      target.wght[0] = render->root.library->lcd_weights[0];
+      target.wght[1] = render->root.library->lcd_weights[1];
+      target.wght[2] = render->root.library->lcd_weights[2];
+      target.wght[3] = render->root.library->lcd_weights[3];
+      target.wght[4] = render->root.library->lcd_weights[4];
+    }
+    else
+    {
+      params.target = bitmap;
+      params.source = outline;
+      params.flags  = FT_RASTER_FLAG_AA;
+    }
 
     /* implode outline */
     for ( vec = points; vec < points_end; vec++ )
@@ -494,12 +614,6 @@
     else
       y_shift += 64 * (FT_Int)bitmap->rows;
 
-    if ( origin )
-    {
-      x_shift += origin->x;
-      y_shift += origin->y;
-    }
-
     /* translate outline to render it into the bitmap */
     if ( x_shift || y_shift )
       FT_Outline_Translate( outline, x_shift, y_shift );
@@ -527,33 +641,6 @@
         error = ft_smooth_raster_lcd ( render, outline, bitmap );
       else if ( mode == FT_RENDER_MODE_LCD_V )
         error = ft_smooth_raster_lcdv( render, outline, bitmap );
-
-#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-
-      /* finally apply filtering */
-      {
-        FT_Byte*                 lcd_weights;
-        FT_Bitmap_LcdFilterFunc  lcd_filter_func;
-
-
-        /* Per-face LCD filtering takes priority if set up. */
-        if ( slot->face && slot->face->internal->lcd_filter_func )
-        {
-          lcd_weights     = slot->face->internal->lcd_weights;
-          lcd_filter_func = slot->face->internal->lcd_filter_func;
-        }
-        else
-        {
-          lcd_weights     = slot->library->lcd_weights;
-          lcd_filter_func = slot->library->lcd_filter_func;
-        }
-
-        if ( lcd_filter_func )
-          lcd_filter_func( bitmap, lcd_weights );
-      }
-
-#endif /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
-
     }
 
   Exit:
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/smooth/ftsmooth.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Anti-aliasing renderer interface (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType font driver implementation (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -220,12 +220,12 @@
     {
       /* Use 'kern' table if available since that can be faster; otherwise */
       /* use GPOS kerning pairs if available.                              */
-      if ( ttface->kern_avail_bits != 0 )
+      if ( ttface->kern_avail_bits )
         kerning->x = sfnt->get_kerning( ttface,
                                         left_glyph,
                                         right_glyph );
 #ifdef TT_CONFIG_OPTION_GPOS_KERNING
-      else if ( ttface->gpos_kerning_available )
+      else if ( ttface->num_gpos_lookups_kerning )
         kerning->x = sfnt->get_gpos_kerning( ttface,
                                              left_glyph,
                                              right_glyph );
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttdriver.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   High-level TrueType driver interface (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/tterrors.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/tterrors.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/tterrors.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/tterrors.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType error codes (specification only).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType Glyph Loader (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -660,7 +660,7 @@
     } while ( subglyph->flags & MORE_COMPONENTS );
 
     gloader->current.num_subglyphs = num_subglyphs;
-    FT_TRACE5(( "  %d component%s\n",
+    FT_TRACE5(( "  %u component%s\n",
                 num_subglyphs,
                 num_subglyphs > 1 ? "s" : "" ));
 
@@ -674,7 +674,7 @@
       for ( i = 0; i < num_subglyphs; i++ )
       {
         if ( num_subglyphs > 1 )
-          FT_TRACE7(( "    subglyph %d:\n", i ));
+          FT_TRACE7(( "    subglyph %u:\n", i ));
 
         FT_TRACE7(( "      glyph index: %d\n", subglyph->index ));
 
@@ -777,15 +777,11 @@
   TT_Hint_Glyph( TT_Loader  loader,
                  FT_Bool    is_composite )
   {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    TT_Face    face   = loader->face;
-    TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
-#endif
-
     TT_GlyphZone  zone = &loader->zone;
 
 #ifdef TT_USE_BYTECODE_INTERPRETER
     TT_ExecContext  exec  = loader->exec;
+    TT_Size         size  = loader->size;
     FT_Long         n_ins = exec->glyphSize;
 #else
     FT_UNUSED( is_composite );
@@ -797,9 +793,6 @@
     if ( n_ins > 0 )
       FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points );
 
-    /* Reset graphics state. */
-    exec->GS = loader->size->GS;
-
     /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */
     /*      completely refer to the (already) hinted subglyphs.     */
     if ( is_composite )
@@ -811,8 +804,8 @@
     }
     else
     {
-      exec->metrics.x_scale = loader->size->metrics->x_scale;
-      exec->metrics.y_scale = loader->size->metrics->y_scale;
+      exec->metrics.x_scale = size->metrics->x_scale;
+      exec->metrics.y_scale = size->metrics->y_scale;
     }
 #endif
 
@@ -838,7 +831,7 @@
       exec->is_composite = is_composite;
       exec->pts          = *zone;
 
-      error = TT_Run_Context( exec );
+      error = TT_Run_Context( exec, size );
       if ( error && exec->pedantic_hinting )
         return error;
 
@@ -854,8 +847,7 @@
     /* to change bearings or advance widths.                               */
 
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 &&
-         exec->backward_compatibility )
+    if ( exec->backward_compatibility )
       return FT_Err_Ok;
 #endif
 
@@ -1152,30 +1144,15 @@
         x = FT_MulFix( x, x_scale );
         y = FT_MulFix( y, y_scale );
 
-        if ( subglyph->flags & ROUND_XY_TO_GRID )
+        if ( subglyph->flags & ROUND_XY_TO_GRID &&
+             IS_HINTED( loader->load_flags )    )
         {
-          TT_Face    face   = loader->face;
-          TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
-
-
-          if ( IS_HINTED( loader->load_flags ) )
-          {
-            /*
-             * We round the horizontal offset only if there is hinting along
-             * the x axis; this corresponds to integer advance width values.
-             *
-             * Theoretically, a glyph's bytecode can toggle ClearType's
-             * `backward compatibility' mode, which would allow modification
-             * of the advance width.  In reality, however, applications
-             * neither allow nor expect modified advance widths if subpixel
-             * rendering is active.
-             *
-             */
-            if ( driver->interpreter_version == TT_INTERPRETER_VERSION_35 )
-              x = FT_PIX_ROUND( x );
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+          if ( !loader->exec->backward_compatibility )
+#endif
+            x = FT_PIX_ROUND( x );
 
-            y = FT_PIX_ROUND( y );
-          }
+          y = FT_PIX_ROUND( y );
         }
       }
     }
@@ -1204,8 +1181,6 @@
   {
     FT_Error     error;
     FT_Outline*  outline = &loader->gloader->base.outline;
-    FT_Stream    stream = loader->stream;
-    FT_UShort    n_ins;
     FT_UInt      i;
 
 
@@ -1224,8 +1199,10 @@
 #ifdef TT_USE_BYTECODE_INTERPRETER
 
     {
-      TT_ExecContext  exec = loader->exec;
+      TT_ExecContext  exec   = loader->exec;
       FT_Memory       memory = exec->memory;
+      FT_Stream       stream = loader->stream;
+      FT_UShort       n_ins;
 
 
       if ( exec->glyphSize )
@@ -1378,8 +1355,9 @@
 
       if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 &&
            loader->exec                                             &&
-           loader->exec->subpixel_hinting_lean                      &&
-           loader->exec->grayscale_cleartype                        )
+           loader->exec->mode != FT_RENDER_MODE_MONO                &&
+           loader->exec->mode != FT_RENDER_MODE_LCD                 &&
+           loader->exec->mode != FT_RENDER_MODE_LCD_V               )
       {
         loader->pp3.x = loader->advance / 2;
         loader->pp4.x = loader->advance / 2;
@@ -1444,13 +1422,13 @@
 
 #ifdef FT_DEBUG_LEVEL_TRACE
     if ( recurse_count )
-      FT_TRACE5(( "  nesting level: %d\n", recurse_count ));
+      FT_TRACE5(( "  nesting level: %u\n", recurse_count ));
 #endif
 
     /* some fonts have an incorrect value of `maxComponentDepth' */
     if ( recurse_count > face->max_profile.maxComponentDepth )
     {
-      FT_TRACE1(( "load_truetype_glyph: maxComponentDepth set to %d\n",
+      FT_TRACE1(( "load_truetype_glyph: maxComponentDepth set to %u\n",
                   recurse_count ));
       face->max_profile.maxComponentDepth = (FT_UShort)recurse_count;
     }
@@ -1566,18 +1544,18 @@
     if ( header_only )
       goto Exit;
 
-    if ( loader->byte_len == 0 || loader->n_contours == 0 )
-    {
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
-      tt_get_metrics_incremental( loader, glyph_index );
+    tt_get_metrics_incremental( loader, glyph_index );
 #endif
-      tt_loader_set_pp( loader );
+    tt_loader_set_pp( loader );
 
+    /* shortcut for empty glyphs */
+    if ( loader->byte_len == 0 || loader->n_contours == 0 )
+    {
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 
-      if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ||
-           FT_IS_VARIATION( FT_FACE( face ) )      )
+      if ( !IS_DEFAULT_INSTANCE( FT_FACE( face ) ) )
       {
         /* a small outline structure with four elements for */
         /* communication with `TT_Vary_Apply_Glyph_Deltas'  */
@@ -1627,11 +1605,6 @@
       goto Exit;
     }
 
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    tt_get_metrics_incremental( loader, glyph_index );
-#endif
-    tt_loader_set_pp( loader );
-
 
     /***********************************************************************/
     /***********************************************************************/
@@ -1735,8 +1708,7 @@
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 
-      if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ||
-           FT_IS_VARIATION( FT_FACE( face ) )      )
+      if ( !IS_DEFAULT_INSTANCE( FT_FACE( face ) ) )
       {
         FT_UShort    i, limit;
         FT_SubGlyph  subglyph;
@@ -1953,6 +1925,9 @@
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
 
+    /* restore the original stream */
+    loader->stream = face->root.stream;
+
     if ( glyph_data_loaded )
       face->root.internal->incremental_interface->funcs->free_glyph_data(
         face->root.internal->incremental_interface->object,
@@ -2112,7 +2087,6 @@
   {
     TT_Face             face   = (TT_Face)glyph->face;
     SFNT_Service        sfnt   = (SFNT_Service)face->sfnt;
-    FT_Stream           stream = face->root.stream;
     FT_Error            error;
     TT_SBit_MetricsRec  sbit_metrics;
 
@@ -2121,14 +2095,11 @@
                                    size->strike_index,
                                    glyph_index,
                                    (FT_UInt)load_flags,
-                                   stream,
+                                   face->root.stream,
                                    &glyph->bitmap,
                                    &sbit_metrics );
     if ( !error )
     {
-      glyph->outline.n_points   = 0;
-      glyph->outline.n_contours = 0;
-
       glyph->metrics.width  = (FT_Pos)sbit_metrics.width  * 64;
       glyph->metrics.height = (FT_Pos)sbit_metrics.height * 64;
 
@@ -2153,6 +2124,50 @@
         glyph->bitmap_top  = sbit_metrics.horiBearingY;
       }
     }
+    /* a missing glyph in a bitmap-only font is assumed whitespace */
+    /* that needs to be constructed using metrics data from `hmtx' */
+    /* and, optionally, `vmtx' tables                              */
+    else if ( FT_ERR_EQ( error, Missing_Bitmap ) &&
+              !FT_IS_SCALABLE( glyph->face )     &&
+              face->horz_metrics_size            )
+    {
+      FT_Fixed  x_scale = size->root.metrics.x_scale;
+      FT_Fixed  y_scale = size->root.metrics.y_scale;
+
+      FT_Short  left_bearing = 0;
+      FT_Short  top_bearing  = 0;
+
+      FT_UShort  advance_width  = 0;
+      FT_UShort  advance_height = 0;
+
+
+      TT_Get_HMetrics( face, glyph_index,
+                       &left_bearing,
+                       &advance_width );
+      TT_Get_VMetrics( face, glyph_index,
+                       0,
+                       &top_bearing,
+                       &advance_height );
+
+      glyph->metrics.width  = 0;
+      glyph->metrics.height = 0;
+
+      glyph->metrics.horiBearingX = FT_MulFix( left_bearing, x_scale );
+      glyph->metrics.horiBearingY = 0;
+      glyph->metrics.horiAdvance  = FT_MulFix( advance_width, x_scale );
+
+      glyph->metrics.vertBearingX = 0;
+      glyph->metrics.vertBearingY = FT_MulFix( top_bearing, y_scale );
+      glyph->metrics.vertAdvance  = FT_MulFix( advance_height, y_scale );
+
+      glyph->format            = FT_GLYPH_FORMAT_BITMAP;
+      glyph->bitmap.pixel_mode = FT_PIXEL_MODE_MONO;
+
+      glyph->bitmap_left = 0;
+      glyph->bitmap_top  = 0;
+
+      error = FT_Err_Ok;
+    }
 
     return error;
   }
@@ -2168,15 +2183,6 @@
                   FT_Bool       glyf_table_only )
   {
     TT_Face    face   = (TT_Face)glyph->face;
-    FT_Stream  stream = face->root.stream;
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-    FT_Error   error;
-    FT_Bool    pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    TT_Driver  driver   = (TT_Driver)FT_FACE_DRIVER( glyph->face );
-#endif
-#endif
 
 
     FT_ZERO( loader );
@@ -2186,122 +2192,80 @@
     /* load execution context */
     if ( IS_HINTED( load_flags ) && !glyf_table_only )
     {
+      FT_Error        error;
       TT_ExecContext  exec;
-      FT_Bool         grayscale = TRUE;
+      FT_Render_Mode  mode      = FT_LOAD_TARGET_MODE( load_flags );
+      FT_Bool         grayscale = FT_BOOL( mode != FT_RENDER_MODE_MONO );
+      FT_Bool         reexecute = FALSE;
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-      FT_Bool         subpixel_hinting_lean;
-      FT_Bool         grayscale_cleartype;
+      TT_Driver       driver    = (TT_Driver)FT_FACE_DRIVER( glyph->face );
 #endif
 
-      FT_Bool  reexecute = FALSE;
-
 
-      if ( size->bytecode_ready < 0 || size->cvt_ready < 0 )
+      if ( size->bytecode_ready > 0 )
+        return size->bytecode_ready;
+      if ( size->bytecode_ready < 0 )
       {
-        error = tt_size_ready_bytecode( size, pedantic );
+        FT_Bool  pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
+
+
+        error = tt_size_init_bytecode( size, pedantic );
         if ( error )
           return error;
       }
-      else if ( size->bytecode_ready )
-        return size->bytecode_ready;
-      else if ( size->cvt_ready )
-        return size->cvt_ready;
 
-      /* query new execution context */
       exec = size->context;
-      if ( !exec )
-        return FT_THROW( Could_Not_Find_Context );
-
-      grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                             FT_RENDER_MODE_MONO             );
 
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+      /* reset backward compatibility; note that */
+      /* the CVT program always runs without it  */
+      exec->backward_compatibility = 0;
+
       if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 )
       {
-        subpixel_hinting_lean =
-          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                   FT_RENDER_MODE_MONO               );
-        grayscale_cleartype =
-          FT_BOOL( subpixel_hinting_lean         &&
-                   !( ( load_flags         &
-                        FT_LOAD_TARGET_LCD )   ||
-                      ( load_flags           &
-                        FT_LOAD_TARGET_LCD_V ) ) );
-        exec->vertical_lcd_lean =
-          FT_BOOL( subpixel_hinting_lean    &&
-                   ( load_flags           &
-                     FT_LOAD_TARGET_LCD_V ) );
-        grayscale = FT_BOOL( grayscale && !subpixel_hinting_lean );
-      }
-      else
-      {
-        subpixel_hinting_lean   = FALSE;
-        grayscale_cleartype     = FALSE;
-        exec->vertical_lcd_lean = FALSE;
-      }
-#endif
+        grayscale = FALSE;
 
-      error = TT_Load_Context( exec, face, size );
-      if ( error )
-        return error;
-
-      {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-        if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 )
+        /* any mode change requires a re-execution of the CVT program */
+        if ( mode != exec->mode )
         {
-          /* a change from mono to subpixel rendering (and vice versa) */
-          /* requires a re-execution of the CVT program                */
-          if ( subpixel_hinting_lean != exec->subpixel_hinting_lean )
-          {
-            FT_TRACE4(( "tt_loader_init: subpixel hinting change,"
-                        " re-executing `prep' table\n" ));
-
-            exec->subpixel_hinting_lean = subpixel_hinting_lean;
-            reexecute                   = TRUE;
-          }
-
-          /* a change from colored to grayscale subpixel rendering (and */
-          /* vice versa) requires a re-execution of the CVT program     */
-          if ( grayscale_cleartype != exec->grayscale_cleartype )
-          {
-            FT_TRACE4(( "tt_loader_init: grayscale subpixel hinting change,"
-                        " re-executing `prep' table\n" ));
+          FT_TRACE4(( "tt_loader_init: render mode change,"
+                      " re-executing `prep' table\n" ));
 
-            exec->grayscale_cleartype = grayscale_cleartype;
-            reexecute                 = TRUE;
-          }
+          exec->mode = mode;
+          reexecute  = TRUE;
         }
+      }
 #endif
 
-        /* a change from mono to grayscale rendering (and vice versa) */
-        /* requires a re-execution of the CVT program                 */
-        if ( grayscale != exec->grayscale )
-        {
-          FT_TRACE4(( "tt_loader_init: grayscale hinting change,"
-                      " re-executing `prep' table\n" ));
+      /* a change from mono to grayscale rendering (and vice versa) */
+      /* requires a re-execution of the CVT program                 */
+      if ( grayscale != exec->grayscale )
+      {
+        FT_TRACE4(( "tt_loader_init: grayscale hinting change,"
+                    " re-executing `prep' table\n" ));
 
-          exec->grayscale = grayscale;
-          reexecute       = TRUE;
-        }
+        exec->grayscale = grayscale;
+        reexecute       = TRUE;
       }
 
-      if ( reexecute )
+      if ( size->cvt_ready > 0 )
+        return size->cvt_ready;
+      if ( size->cvt_ready < 0 || reexecute )
       {
-        error = tt_size_run_prep( size, pedantic );
-        if ( error )
-          return error;
-        error = TT_Load_Context( exec, face, size );
+        error = tt_size_run_prep( size );
         if ( error )
           return error;
       }
 
+      TT_Load_Context( exec, face, size );
+
       /* check whether the cvt program has disabled hinting */
-      if ( exec->GS.instruct_control & 1 )
+      if ( size->GS.instruct_control & 1 )
         load_flags |= FT_LOAD_NO_HINTING;
 
-      /* load default graphics state -- if needed */
-      if ( exec->GS.instruct_control & 2 )
-        exec->GS = tt_default_graphics_state;
+      /* check whether GS modifications should be reverted */
+      if ( size->GS.instruct_control & 2 )
+        size->GS = tt_default_graphics_state;
 
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
       /*
@@ -2318,28 +2282,24 @@
        *
        */
       if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 &&
-           subpixel_hinting_lean                                    &&
+           mode != FT_RENDER_MODE_MONO                              &&
            !FT_IS_TRICKY( glyph->face )                             )
-        exec->backward_compatibility = !( exec->GS.instruct_control & 4 );
-      else
-        exec->backward_compatibility = FALSE;
+        exec->backward_compatibility = ( size->GS.instruct_control & 4 ) ^ 4;
+
 #endif /* TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL */
 
-      exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
       loader->exec = exec;
-      loader->instructions = exec->glyphIns;
 
       /* Use the hdmx table if any unless FT_LOAD_COMPUTE_METRICS */
       /* is set or backward compatibility mode of the v38 or v40  */
       /* interpreters is active.  See `ttinterp.h' for details on */
       /* backward compatibility mode.                             */
-      if ( IS_HINTED( loader->load_flags )                                &&
-           !( loader->load_flags & FT_LOAD_COMPUTE_METRICS )              &&
+      if ( IS_HINTED( load_flags )                   &&
+           !( load_flags & FT_LOAD_COMPUTE_METRICS ) &&
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-           !( driver->interpreter_version == TT_INTERPRETER_VERSION_40  &&
-              exec->backward_compatibility                              ) &&
+           !exec->backward_compatibility             &&
 #endif
-           !face->postscript.isFixedPitch                                 )
+           !face->postscript.isFixedPitch            )
       {
         loader->widthp = size->widthp;
       }
@@ -2364,7 +2324,7 @@
     loader->face   = face;
     loader->size   = size;
     loader->glyph  = (FT_GlyphSlot)glyph;
-    loader->stream = stream;
+    loader->stream = face->root.stream;
 
     loader->composites.head = NULL;
     loader->composites.tail = NULL;
@@ -2426,84 +2386,26 @@
     TT_LoaderRec  loader;
 
 
-    FT_TRACE1(( "TT_Load_Glyph: glyph index %d\n", glyph_index ));
+    FT_TRACE1(( "TT_Load_Glyph: glyph index %u\n", glyph_index ));
 
 #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
 
     /* try to load embedded bitmap (if any) */
-    if ( size->strike_index != 0xFFFFFFFFUL      &&
-         ( load_flags & FT_LOAD_NO_BITMAP ) == 0 &&
-         IS_DEFAULT_INSTANCE( glyph->face )      )
+    if ( size->strike_index != 0xFFFFFFFFUL  &&
+         !( load_flags & FT_LOAD_NO_BITMAP &&
+            FT_IS_SCALABLE( glyph->face )  ) &&
+         IS_DEFAULT_INSTANCE( glyph->face )  )
     {
-      FT_Fixed  x_scale = size->root.metrics.x_scale;
-      FT_Fixed  y_scale = size->root.metrics.y_scale;
-
-
       error = load_sbit_image( size, glyph, glyph_index, load_flags );
-      if ( FT_ERR_EQ( error, Missing_Bitmap ) )
-      {
-        /* the bitmap strike is incomplete and misses the requested glyph; */
-        /* if we have a bitmap-only font, return an empty glyph            */
-        if ( !FT_IS_SCALABLE( glyph->face ) )
-        {
-          FT_Short  left_bearing = 0;
-          FT_Short  top_bearing  = 0;
-
-          FT_UShort  advance_width  = 0;
-          FT_UShort  advance_height = 0;
-
-
-          /* to return an empty glyph, however, we need metrics data   */
-          /* from the `hmtx' (or `vmtx') table; the assumption is that */
-          /* empty glyphs are missing intentionally, representing      */
-          /* whitespace - not having at least horizontal metrics is    */
-          /* thus considered an error                                  */
-          if ( !face->horz_metrics_size )
-            return error;
-
-          /* we now construct an empty bitmap glyph */
-          TT_Get_HMetrics( face, glyph_index,
-                           &left_bearing,
-                           &advance_width );
-          TT_Get_VMetrics( face, glyph_index,
-                           0,
-                           &top_bearing,
-                           &advance_height );
-
-          glyph->outline.n_points   = 0;
-          glyph->outline.n_contours = 0;
-
-          glyph->metrics.width  = 0;
-          glyph->metrics.height = 0;
-
-          glyph->metrics.horiBearingX = FT_MulFix( left_bearing, x_scale );
-          glyph->metrics.horiBearingY = 0;
-          glyph->metrics.horiAdvance  = FT_MulFix( advance_width, x_scale );
-
-          glyph->metrics.vertBearingX = 0;
-          glyph->metrics.vertBearingY = FT_MulFix( top_bearing, y_scale );
-          glyph->metrics.vertAdvance  = FT_MulFix( advance_height, y_scale );
-
-          glyph->format            = FT_GLYPH_FORMAT_BITMAP;
-          glyph->bitmap.pixel_mode = FT_PIXEL_MODE_MONO;
-
-          glyph->bitmap_left = 0;
-          glyph->bitmap_top  = 0;
-
-          return FT_Err_Ok;
-        }
-      }
-      else if ( error )
-      {
-        /* return error if font is not scalable */
-        if ( !FT_IS_SCALABLE( glyph->face ) )
-          return error;
-      }
-      else
+      if ( !error )
       {
         if ( FT_IS_SCALABLE( glyph->face ) ||
              FT_HAS_SBIX( glyph->face )    )
         {
+          FT_Fixed  x_scale = size->root.metrics.x_scale;
+          FT_Fixed  y_scale = size->root.metrics.y_scale;
+
+
           /* for the bbox we need the header only */
           (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE );
           (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE );
@@ -2550,8 +2452,10 @@
                                                     y_scale );
         }
 
-        return FT_Err_Ok;
+        goto Exit;
       }
+      else if ( !FT_IS_SCALABLE( glyph->face ) )
+        goto Exit;
     }
 
     if ( load_flags & FT_LOAD_SBITS_ONLY )
@@ -2563,7 +2467,7 @@
 #endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
 
     /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */
-    if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid )
+    if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.ppem )
     {
       error = FT_THROW( Invalid_Size_Handle );
       goto Exit;
@@ -2614,7 +2518,7 @@
         glyph->metrics.horiAdvance = FT_MulFix( advanceX, x_scale );
         glyph->metrics.vertAdvance = FT_MulFix( advanceY, y_scale );
 
-        return error;
+        goto Exit;
       }
 
       FT_TRACE3(( "Failed to load SVG glyph\n" ));
@@ -2642,10 +2546,6 @@
       goto Done;
     }
 
-    glyph->format        = FT_GLYPH_FORMAT_OUTLINE;
-    glyph->num_subglyphs = 0;
-    glyph->outline.flags = 0;
-
     /* main loading loop */
     error = load_truetype_glyph( &loader, glyph_index, 0, FALSE );
     if ( !error )
@@ -2657,9 +2557,18 @@
       }
       else
       {
+        glyph->format         = FT_GLYPH_FORMAT_OUTLINE;
+
         glyph->outline        = loader.gloader->base.outline;
         glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS;
 
+        /* Set the `high precision' bit flag.  This is _critical_ to   */
+        /* get correct output for monochrome TrueType glyphs at all    */
+        /* sizes using the bytecode interpreter.                       */
+        if ( !( load_flags & FT_LOAD_NO_SCALE ) &&
+             size->metrics->y_ppem < 24         )
+          glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
         /* Translate array so that (0,0) is the glyph's origin.  Note  */
         /* that this behaviour is independent on the value of bit 1 of */
         /* the `flags' field in the `head' table -- at least major     */
@@ -2708,14 +2617,6 @@
       error = compute_glyph_metrics( &loader, glyph_index );
     }
 
-    /* Set the `high precision' bit flag.                           */
-    /* This is _critical_ to get correct output for monochrome      */
-    /* TrueType glyphs at all sizes using the bytecode interpreter. */
-    /*                                                              */
-    if ( !( load_flags & FT_LOAD_NO_SCALE ) &&
-         size->metrics->y_ppem < 24         )
-      glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
-
     FT_TRACE1(( "  subglyphs = %u, contours = %hu, points = %hu,"
                 " flags = 0x%.3x\n",
                 loader.gloader->base.num_subglyphs,
@@ -2727,11 +2628,8 @@
     tt_loader_done( &loader );
 
   Exit:
-#ifdef FT_DEBUG_LEVEL_TRACE
-    if ( error )
-      FT_TRACE1(( "  failed (error code 0x%x)\n",
-                  error ));
-#endif
+    FT_TRACE1(( error ? "  failed (error code 0x%x)\n" : "",
+                error ));
 
     return error;
   }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttgload.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType Glyph Loader (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType GX Font Variation loader
  *
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
  * David Turner, Robert Wilhelm, Werner Lemberg, and George Williams.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -489,8 +489,9 @@
     FT_UShort  axis_count;
     FT_UInt    region_count;
 
-    FT_UInt  i, j;
-    FT_Bool  long_words;
+    FT_UInt   i, j;
+    FT_Byte*  bytes;
+    FT_Bool   long_words;
 
     GX_Blend   blend           = ttface->blend;
     FT_ULong*  dataOffsetArray = NULL;
@@ -526,11 +527,15 @@
     if ( FT_QNEW_ARRAY( dataOffsetArray, data_count ) )
       goto Exit;
 
+    if ( FT_FRAME_ENTER( data_count * 4 ) )
+      goto Exit;
+
+    bytes = stream->cursor;
+
     for ( i = 0; i < data_count; i++ )
-    {
-      if ( FT_READ_ULONG( dataOffsetArray[i] ) )
-        goto Exit;
-    }
+      dataOffsetArray[i] = FT_NEXT_ULONG( bytes );
+
+    FT_FRAME_EXIT();
 
     /* parse array of region records (region list) */
     if ( FT_STREAM_SEEK( offset + region_offset ) )
@@ -564,13 +569,26 @@
       goto Exit;
     itemStore->regionCount = region_count;
 
-    for ( i = 0; i < itemStore->regionCount; i++ )
+    if ( FT_FRAME_ENTER( (FT_Long)region_count * axis_count * 6 ) )
+    {
+      FT_TRACE2(( "tt_var_load_item_variation_store:"
+                  " not enough data for variation regions\n" ));
+      error = FT_THROW( Invalid_Table );
+      goto Exit;
+    }
+
+    bytes = stream->cursor;
+
+    for ( i = 0; i < region_count; i++ )
     {
       GX_AxisCoords  axisCoords;
 
 
       if ( FT_NEW_ARRAY( itemStore->varRegionList[i].axisList, axis_count ) )
+      {
+        FT_FRAME_EXIT();
         goto Exit;
+      }
 
       axisCoords = itemStore->varRegionList[i].axisList;
 
@@ -579,10 +597,9 @@
         FT_Int  start, peak, end;
 
 
-        if ( FT_READ_SHORT( start ) ||
-             FT_READ_SHORT( peak )  ||
-             FT_READ_SHORT( end )   )
-          goto Exit;
+        start = FT_NEXT_SHORT( bytes );
+        peak  = FT_NEXT_SHORT( bytes );
+        end   = FT_NEXT_SHORT( bytes );
 
         /* immediately tag invalid ranges with special peak = 0 */
         if ( ( start < 0 && end > 0 ) || start > peak || peak > end )
@@ -594,6 +611,8 @@
       }
     }
 
+    FT_FRAME_EXIT();
+
     /* end of region list parse */
 
     /* use dataOffsetArray now to parse varData items */
@@ -625,7 +644,7 @@
       /* check some data consistency */
       if ( word_delta_count > region_idx_count )
       {
-        FT_TRACE2(( "bad short count %d or region count %d\n",
+        FT_TRACE2(( "bad short count %d or region count %u\n",
                     word_delta_count,
                     region_idx_count ));
         error = FT_THROW( Invalid_Table );
@@ -634,7 +653,7 @@
 
       if ( region_idx_count > itemStore->regionCount )
       {
-        FT_TRACE2(( "inconsistent regionCount %d in varData[%d]\n",
+        FT_TRACE2(( "inconsistent regionCount %u in varData[%u]\n",
                     region_idx_count,
                     i ));
         error = FT_THROW( Invalid_Table );
@@ -648,29 +667,39 @@
       varData->wordDeltaCount = word_delta_count;
       varData->longWords      = long_words;
 
+      if ( FT_FRAME_ENTER( region_idx_count * 2 ) )
+      {
+        FT_TRACE2(( "tt_var_load_item_variation_store:"
+                    " not enough data for region indices\n" ));
+        error = FT_THROW( Invalid_Table );
+        goto Exit;
+      }
+
+      bytes = stream->cursor;
+
       for ( j = 0; j < varData->regionIdxCount; j++ )
       {
-        if ( FT_READ_USHORT( varData->regionIndices[j] ) )
-          goto Exit;
+        varData->regionIndices[j] = FT_NEXT_USHORT( bytes );
 
         if ( varData->regionIndices[j] >= itemStore->regionCount )
         {
-          FT_TRACE2(( "bad region index %d\n",
+          FT_TRACE2(( "bad region index %u\n",
                       varData->regionIndices[j] ));
+          FT_FRAME_EXIT();
           error = FT_THROW( Invalid_Table );
           goto Exit;
         }
       }
 
+      FT_FRAME_EXIT();
+
       per_region_size = word_delta_count + region_idx_count;
       if ( long_words )
         per_region_size *= 2;
 
-      if ( FT_NEW_ARRAY( varData->deltaSet, per_region_size * item_count ) )
+      if ( FT_QALLOC_MULT( varData->deltaSet, item_count, per_region_size ) )
         goto Exit;
-      if ( FT_Stream_Read( stream,
-                           varData->deltaSet,
-                           per_region_size * item_count ) )
+      if ( FT_STREAM_READ( varData->deltaSet, item_count * per_region_size ) )
       {
         FT_TRACE2(( "deltaSet read failed." ));
         error = FT_THROW( Invalid_Table );
@@ -706,6 +735,7 @@
     FT_UInt   innerIndexMask;
     FT_ULong  i;
     FT_UInt   j;
+    FT_Byte*  bytes;
 
 
     if ( FT_STREAM_SEEK( offset )    ||
@@ -757,6 +787,16 @@
     if ( FT_NEW_ARRAY( map->outerIndex, map->mapCount ) )
       goto Exit;
 
+    if ( FT_FRAME_ENTER( map->mapCount * entrySize ) )
+    {
+      FT_TRACE2(( "tt_var_load_delta_set_index_mapping:"
+                  " invalid number of delta-set index mappings\n" ));
+      error = FT_THROW( Invalid_Table );
+      goto Exit;
+    }
+
+    bytes = stream->cursor;
+
     for ( i = 0; i < map->mapCount; i++ )
     {
       FT_UInt  mapData = 0;
@@ -769,9 +809,7 @@
         FT_Byte  data;
 
 
-        if ( FT_READ_BYTE( data ) )
-          goto Exit;
-
+        data    = FT_NEXT_BYTE( bytes );
         mapData = ( mapData << 8 ) | data;
       }
 
@@ -789,7 +827,7 @@
 
       if ( outerIndex >= itemStore->dataCount )
       {
-        FT_TRACE2(( "outerIndex[%ld] == %d out of range\n",
+        FT_TRACE2(( "outerIndex[%lu] == %u out of range\n",
                     i,
                     outerIndex ));
         error = FT_THROW( Invalid_Table );
@@ -802,7 +840,7 @@
 
       if ( innerIndex >= itemStore->varData[outerIndex].itemCount )
       {
-        FT_TRACE2(( "innerIndex[%ld] == %d out of range\n",
+        FT_TRACE2(( "innerIndex[%lu] == %u out of range\n",
                     i,
                     innerIndex ));
         error = FT_THROW( Invalid_Table );
@@ -812,6 +850,8 @@
       map->innerIndex[i] = innerIndex;
     }
 
+    FT_FRAME_EXIT();
+
   Exit:
     return error;
   }
@@ -965,28 +1005,181 @@
   }
 
 
+  static FT_Fixed
+  tt_calculate_scalar( GX_AxisCoords  axis,
+                       FT_UInt        axisCount,
+                       FT_Fixed*      normalizedcoords )
+  {
+    FT_Fixed  scalar = 0x10000L;
+    FT_UInt   j;
+
+
+    /* Inner loop steps through axes in this region. */
+    for ( j = 0; j < axisCount; j++, axis++ )
+    {
+      FT_Fixed  ncv = normalizedcoords[j];
+
+
+      /* Compute the scalar contribution of this axis, */
+      /* with peak of 0 used for invalid axes.         */
+      if ( axis->peakCoord == ncv ||
+           axis->peakCoord == 0   )
+        continue;
+
+      /* Ignore this region if coordinates are out of range. */
+      else if ( ncv <= axis->startCoord ||
+                ncv >= axis->endCoord   )
+      {
+        scalar = 0;
+        break;
+      }
+
+      /* Cumulative product of all the axis scalars. */
+      else if ( ncv < axis->peakCoord )
+        scalar = FT_MulDiv( scalar,
+                            ncv - axis->startCoord,
+                            axis->peakCoord - axis->startCoord );
+      else   /* ncv > axis->peakCoord */
+        scalar = FT_MulDiv( scalar,
+                            axis->endCoord - ncv,
+                            axis->endCoord - axis->peakCoord );
+
+    } /* per-axis loop */
+
+    return scalar;
+  }
+
+
+  static FT_Int64
+  ft_mul_add_delta_scalar( FT_Int64  returnValue,
+                           FT_Int32  delta,
+                           FT_Int32  scalar )
+  {
+
+#ifdef FT_INT64
+
+    return returnValue + (FT_Int64)delta * scalar;
+
+#else /* !FT_INT64 */
+
+    if ( (FT_UInt32)( delta + 0x8000 ) <= 0x20000 )
+    {
+      /* Fast path: multiplication result fits into 32 bits. */
+
+      FT_Int32  lo = delta * scalar;
+
+
+      returnValue.lo += (FT_UInt32)lo;
+
+      if ( returnValue.lo < (FT_UInt32)lo )
+        returnValue.hi += ( lo < 0 ) ? 0 : 1;
+
+      if ( lo < 0 )
+        returnValue.hi -= 1;
+
+      return returnValue;
+    }
+    else
+    {
+      /* Slow path: full 32x32 -> 64-bit signed multiplication. */
+
+      FT_Int64 product;
+
+      /* Get absolute values. */
+      FT_UInt32  a = ( delta < 0 ) ? -delta : delta;
+      FT_UInt32  b = ( scalar < 0 ) ? -scalar : scalar;
+
+      /* Prepare unsigned multiplication. */
+      FT_UInt32  a_lo = a & 0xFFFF;
+      FT_UInt32  a_hi = a >> 16;
+
+      FT_UInt32  b_lo = b & 0xFFFF;
+      FT_UInt32  b_hi = b >> 16;
+
+      /* Partial products. */
+      FT_UInt32  p0 = a_lo * b_lo;
+      FT_UInt32  p1 = a_lo * b_hi;
+      FT_UInt32  p2 = a_hi * b_lo;
+      FT_UInt32  p3 = a_hi * b_hi;
+
+      /* Combine: result = p3 << 32 + (p1 + p2) << 16 + p0 */
+      FT_UInt32  mid       = p1 + p2;
+      FT_UInt32  mid_carry = ( mid < p1 );
+
+      FT_UInt32  carry;
+
+
+      product.lo = ( mid << 16 ) + ( p0 & 0xFFFF );
+      carry      = ( product.lo < ( p0 & 0xFFFF ) ) ? 1 : 0;
+      product.hi = p3 + ( mid >> 16 ) + mid_carry + carry;
+
+      /* If result should be negative, negate. */
+      if ( ( delta < 0 ) ^ ( scalar < 0 ) )
+      {
+        product.lo = ~product.lo + 1;
+        product.hi = ~product.hi + ( product.lo == 0 ? 1 : 0 );
+      }
+
+      /* Add to `returnValue`. */
+      returnValue.lo += product.lo;
+      if ( returnValue.lo < product.lo )
+        returnValue.hi++;
+      returnValue.hi += product.hi;
+
+      return returnValue;
+    }
+
+#endif /* !FT_INT64 */
+
+  }
+
+
+  static FT_ItemVarDelta
+  ft_round_and_shift16( FT_Int64  returnValue )
+  {
+
+#ifdef FT_INT64
+
+    return (FT_ItemVarDelta)( returnValue + 0x8000L ) >> 16;
+
+#else /* !FT_INT64 */
+
+    FT_UInt hi = returnValue.hi;
+    FT_UInt lo = returnValue.lo;
+
+    FT_UInt delta;
+
+
+    /* Add 0x8000 to round. */
+    lo += 0x8000;
+    if ( lo < 0x8000 )  /* overflow occurred */
+      hi += 1;
+
+    /* Shift right by 16 bits. */
+    delta = ( hi << 16 ) | ( lo >> 16 );
+
+    return (FT_ItemVarDelta)delta;
+
+#endif /* !FT_INT64 */
+
+  }
+
+
   FT_LOCAL_DEF( FT_ItemVarDelta )
   tt_var_get_item_delta( FT_Face          face,        /* TT_Face */
                          GX_ItemVarStore  itemStore,
                          FT_UInt          outerIndex,
                          FT_UInt          innerIndex )
   {
-    TT_Face    ttface = (TT_Face)face;
-    FT_Stream  stream = FT_FACE_STREAM( face );
-    FT_Memory  memory = stream->memory;
-    FT_Error   error  = FT_Err_Ok;
+    TT_Face  ttface = (TT_Face)face;
+
+    GX_ItemVarData  varData;
 
-    GX_ItemVarData    varData;
-    FT_ItemVarDelta*  deltaSet = NULL;
-    FT_ItemVarDelta   deltaSetStack[16];
-
-    FT_Fixed*  scalars = NULL;
-    FT_Fixed   scalarsStack[16];
-
-    FT_UInt          master, j;
-    FT_ItemVarDelta  returnValue = 0;
-    FT_UInt          per_region_size;
-    FT_Byte*         bytes;
+    FT_UInt   master;
+    FT_Int64  returnValue = FT_INT64_ZERO;
+    FT_UInt   shift_base  = 1;
+    FT_UInt   per_region_size;
+    FT_Byte*  bytes;
 
 
     if ( !ttface->blend || !ttface->blend->normalizedcoords )
@@ -1011,113 +1204,63 @@
     if ( varData->regionIdxCount == 0 )
       return 0; /* Avoid "applying zero offset to null pointer". */
 
-    if ( varData->regionIdxCount < 16 )
-    {
-      deltaSet = deltaSetStack;
-      scalars  = scalarsStack;
-    }
-    else
-    {
-      if ( FT_QNEW_ARRAY( deltaSet, varData->regionIdxCount ) )
-        goto Exit;
-      if ( FT_QNEW_ARRAY( scalars, varData->regionIdxCount ) )
-        goto Exit;
-    }
-
     /* Parse delta set.                                            */
     /*                                                             */
     /* Deltas are (word_delta_count + region_idx_count) bytes each */
     /* if `longWords` isn't set, and twice as much otherwise.      */
     per_region_size = varData->wordDeltaCount + varData->regionIdxCount;
     if ( varData->longWords )
+    {
+      shift_base       = 2;
       per_region_size *= 2;
+    }
 
     bytes = varData->deltaSet + per_region_size * innerIndex;
 
-    if ( varData->longWords )
-    {
-      for ( master = 0; master < varData->wordDeltaCount; master++ )
-        deltaSet[master] = FT_NEXT_LONG( bytes );
-      for ( ; master < varData->regionIdxCount; master++ )
-        deltaSet[master] = FT_NEXT_SHORT( bytes );
-    }
-    else
-    {
-      for ( master = 0; master < varData->wordDeltaCount; master++ )
-        deltaSet[master] = FT_NEXT_SHORT( bytes );
-      for ( ; master < varData->regionIdxCount; master++ )
-        deltaSet[master] = FT_NEXT_CHAR( bytes );
-    }
-
     /* outer loop steps through master designs to be blended */
     for ( master = 0; master < varData->regionIdxCount; master++ )
     {
-      FT_Fixed  scalar      = 0x10000L;
-      FT_UInt   regionIndex = varData->regionIndices[master];
+      FT_UInt  regionIndex = varData->regionIndices[master];
 
       GX_AxisCoords  axis = itemStore->varRegionList[regionIndex].axisList;
 
+      FT_Fixed  scalar = tt_calculate_scalar(
+                           axis,
+                           itemStore->axisCount,
+                           ttface->blend->normalizedcoords );
 
-      /* inner loop steps through axes in this region */
-      for ( j = 0; j < itemStore->axisCount; j++, axis++ )
-      {
-        FT_Fixed  ncv = ttface->blend->normalizedcoords[j];
 
+      if ( scalar )
+      {
+        FT_Int  delta;
 
-        /* compute the scalar contribution of this axis */
-        /* with peak of 0 used for invalid axes         */
-        if ( axis->peakCoord == ncv ||
-             axis->peakCoord == 0   )
-          continue;
 
-        /* ignore this region if coords are out of range */
-        else if ( ncv <= axis->startCoord ||
-                  ncv >= axis->endCoord   )
+        if ( varData->longWords )
         {
-          scalar = 0;
-          break;
+          if ( master < varData->wordDeltaCount )
+            delta = FT_NEXT_LONG( bytes );
+          else
+            delta = FT_NEXT_SHORT( bytes );
+        }
+        else
+        {
+          if ( master < varData->wordDeltaCount )
+            delta = FT_NEXT_SHORT( bytes );
+          else
+            delta = FT_NEXT_CHAR( bytes );
         }
 
-        /* cumulative product of all the axis scalars */
-        else if ( ncv < axis->peakCoord )
-          scalar = FT_MulDiv( scalar,
-                              ncv - axis->startCoord,
-                              axis->peakCoord - axis->startCoord );
-        else   /* ncv > axis->peakCoord */
-          scalar = FT_MulDiv( scalar,
-                              axis->endCoord - ncv,
-                              axis->endCoord - axis->peakCoord );
-
-      } /* per-axis loop */
-
-      scalars[master] = scalar;
+        returnValue = ft_mul_add_delta_scalar( returnValue, delta, scalar );
+      }
+      else
+      {
+        /* Branch-free, yay. */
+        bytes += shift_base << ( master < varData->wordDeltaCount );
+      }
 
     } /* per-region loop */
 
-
-    /* Compute the scaled delta for this region.
-     *
-     * From: https://docs.microsoft.com/en-us/typography/opentype/spec/otvarcommonformats#item-variation-store-header-and-item-variation-data-subtables:
-     *
-     *   `Fixed` is a 32-bit (16.16) type and, in the general case, requires
-     *   32-bit deltas.  As described above, the `DeltaSet` record can
-     *   accommodate deltas that are, logically, either 16-bit or 32-bit.
-     *   When scaled deltas are applied to `Fixed` values, the `Fixed` value
-     *   is treated like a 32-bit integer.
-     *
-     * `FT_MulAddFix` internally uses 64-bit precision; it thus can handle
-     * deltas ranging from small 8-bit to large 32-bit values that are
-     * applied to 16.16 `FT_Fixed` / OpenType `Fixed` values.
-     */
-    returnValue = FT_MulAddFix( scalars, deltaSet, varData->regionIdxCount );
-
-  Exit:
-    if ( scalars != scalarsStack )
-      FT_FREE( scalars );
-    if ( deltaSet != deltaSetStack )
-      FT_FREE( deltaSet );
-
-    return returnValue;
+    return ft_round_and_shift16( returnValue );
   }
 
 
@@ -1643,6 +1786,7 @@
     GX_Blend      blend  = face->blend;
     FT_Error      error;
     FT_UInt       i, j;
+    FT_Byte*      bytes;
     FT_ULong      table_len;
     FT_ULong      gvar_start;
     FT_ULong      offsetToData;
@@ -1734,6 +1878,8 @@
     if ( FT_FRAME_ENTER( offsets_len ) )
       goto Exit;
 
+    bytes = stream->cursor;
+
     /* offsets (one more offset than glyphs, to mark size of last) */
     if ( FT_QNEW_ARRAY( blend->glyphoffsets, gvar_head.glyphCount + 1 ) )
       goto Fail2;
@@ -1744,16 +1890,24 @@
       FT_ULong  max_offset = 0;
 
 
+      if ( stream->limit - stream->cursor < gvar_head.glyphCount * 4 )
+      {
+        FT_TRACE2(( "ft_var_load_gvar:"
+                    " glyph variation data offset not enough\n" ));
+        error = FT_THROW( Invalid_Table );
+        goto Fail;
+      }
+
       for ( i = 0; i <= gvar_head.glyphCount; i++ )
       {
-        blend->glyphoffsets[i] = offsetToData + FT_GET_ULONG();
+        blend->glyphoffsets[i] = offsetToData + FT_NEXT_ULONG( bytes );
 
         if ( max_offset <= blend->glyphoffsets[i] )
           max_offset = blend->glyphoffsets[i];
         else
         {
           FT_TRACE2(( "ft_var_load_gvar:"
-                      " glyph variation data offset %d not monotonic\n",
+                      " glyph variation data offset %u not monotonic\n",
                       i ));
           blend->glyphoffsets[i] = max_offset;
         }
@@ -1762,7 +1916,7 @@
         if ( limit < blend->glyphoffsets[i] )
         {
           FT_TRACE2(( "ft_var_load_gvar:"
-                      " glyph variation data offset %d out of range\n",
+                      " glyph variation data offset %u out of range\n",
                       i ));
           blend->glyphoffsets[i] = limit;
         }
@@ -1774,16 +1928,24 @@
       FT_ULong  max_offset = 0;
 
 
+      if ( stream->limit - stream->cursor < gvar_head.glyphCount * 2 )
+      {
+        FT_TRACE2(( "ft_var_load_gvar:"
+                    " glyph variation data offset not enough\n" ));
+        error = FT_THROW( Invalid_Table );
+        goto Fail;
+      }
+
       for ( i = 0; i <= gvar_head.glyphCount; i++ )
       {
-        blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2;
+        blend->glyphoffsets[i] = offsetToData + FT_NEXT_USHORT( bytes ) * 2;
 
         if ( max_offset <= blend->glyphoffsets[i] )
           max_offset = blend->glyphoffsets[i];
         else
         {
           FT_TRACE2(( "ft_var_load_gvar:"
-                      " glyph variation data offset %d not monotonic\n",
+                      " glyph variation data offset %u not monotonic\n",
                       i ));
           blend->glyphoffsets[i] = max_offset;
         }
@@ -1792,7 +1954,7 @@
         if ( limit < blend->glyphoffsets[i] )
         {
           FT_TRACE2(( "ft_var_load_gvar:"
-                      " glyph variation data offset %d out of range\n",
+                      " glyph variation data offset %u out of range\n",
                       i ));
           blend->glyphoffsets[i] = limit;
         }
@@ -1814,6 +1976,8 @@
         goto Fail;
       }
 
+      bytes = stream->cursor;
+
       if ( FT_QNEW_ARRAY( blend->tuplecoords,
                           gvar_head.axisCount * gvar_head.globalCoordCount ) )
         goto Fail2;
@@ -1824,13 +1988,17 @@
         for ( j = 0; j < (FT_UInt)gvar_head.axisCount; j++ )
         {
           blend->tuplecoords[i * gvar_head.axisCount + j] =
-            FT_fdot14ToFixed( FT_GET_SHORT() );
+            FT_fdot14ToFixed( FT_NEXT_SHORT( bytes ) );
           FT_TRACE5(( "%.5f ",
             (double)blend->tuplecoords[i * gvar_head.axisCount + j] / 65536 ));
         }
         FT_TRACE5(( "]\n" ));
       }
 
+      if ( FT_NEW_ARRAY( blend->tuplescalars,
+                         gvar_head.globalCoordCount ) )
+        goto Fail2;
+
       blend->tuplecount = gvar_head.globalCoordCount;
 
       FT_TRACE5(( "\n" ));
@@ -1896,15 +2064,25 @@
 
     for ( i = 0; i < blend->num_axis; i++ )
     {
-      FT_Fixed  ncv = blend->normalizedcoords[i];
+      FT_Fixed  ncv;
 
 
-      FT_TRACE6(( "    axis %d coordinate %.5f:\n", i, (double)ncv / 65536 ));
+      if ( tuple_coords[i] == 0 )
+      {
+        FT_TRACE6(( "      tuple coordinate is zero, ignore\n" ));
+        continue;
+      }
 
-      /* It's not clear why (for intermediate tuples) we don't need     */
-      /* to check against start/end -- the documentation says we don't. */
-      /* Similarly, it's unclear why we don't need to scale along the   */
-      /* axis.                                                          */
+      ncv = blend->normalizedcoords[i];
+
+      FT_TRACE6(( "    axis %u coordinate %.5f:\n", i, (double)ncv / 65536 ));
+
+      if ( ncv == 0 )
+      {
+        FT_TRACE6(( "      axis coordinate is zero, stop\n" ));
+        apply = 0;
+        break;
+      }
 
       if ( tuple_coords[i] == ncv )
       {
@@ -1914,12 +2092,6 @@
         continue;
       }
 
-      if ( tuple_coords[i] == 0 )
-      {
-        FT_TRACE6(( "      tuple coordinate is zero, ignore\n" ));
-        continue;
-      }
-
       if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) )
       {
         /* not an intermediate tuple */
@@ -2001,7 +2173,7 @@
     if ( num_coords > mmvar->num_axis )
     {
       FT_TRACE2(( "ft_var_to_normalized:"
-                  " only using first %d of %d coordinates\n",
+                  " only using first %u of %u coordinates\n",
                   mmvar->num_axis, num_coords ));
       num_coords = mmvar->num_axis;
     }
@@ -2016,7 +2188,7 @@
       FT_Fixed  coord = coords[i];
 
 
-      FT_TRACE5(( "    %d: %.5f\n", i, (double)coord / 65536 ));
+      FT_TRACE5(( "    %u: %.5f\n", i, (double)coord / 65536 ));
       if ( coord > a->maximum || coord < a->minimum )
       {
         FT_TRACE1(( "ft_var_to_normalized: design coordinate %.5f\n",
@@ -2156,7 +2328,7 @@
     if ( num_coords > blend->num_axis )
     {
       FT_TRACE2(( "ft_var_to_design:"
-                  " only using first %d of %d coordinates\n",
+                  " only using first %u of %u coordinates\n",
                   blend->num_axis, num_coords ));
       nc = blend->num_axis;
     }
@@ -2516,7 +2688,7 @@
                       "    minimum     default     maximum   flags\n" ));
                    /* "  XXXX.XXXXX  XXXX.XXXXX  XXXX.XXXXX  0xXXXX" */
 
-        FT_TRACE5(( "  %3d  `%s'"
+        FT_TRACE5(( "  %3u  `%s'"
                     "  %10.5f  %10.5f  %10.5f  0x%04X%s\n",
                     i,
                     a->name,
@@ -2608,7 +2780,7 @@
 
           (void)FT_STREAM_SEEK( pos );
 
-          FT_TRACE5(( "  named instance %d (%s%s%s, %s%s%s)\n",
+          FT_TRACE5(( "  named instance %u (%s%s%s, %s%s%s)\n",
                       i,
                       strname ? "name: `" : "",
                       strname ? strname : "unnamed",
@@ -2636,7 +2808,7 @@
         FT_UInt  strid = ~0U;
 
 
-        /* The default instance is missing in array the    */
+        /* The default instance is missing in the array    */
         /* of named instances; try to synthesize an entry. */
         /* If this fails, `default_named_instance` remains */
         /* at value zero, which doesn't do any harm.       */
@@ -2766,10 +2938,18 @@
     } manageCvt;
 
 
-    face->doblend = FALSE;
-
     if ( !face->blend )
     {
+      face->doblend = FALSE;
+      for ( i = 0; i < num_coords; i++ )
+        if ( coords[i] )
+        {
+          face->doblend = TRUE;
+          break;
+        }
+      if ( !face->doblend )
+        goto Exit;
+
       if ( FT_SET_ERROR( TT_Get_MM_Var( FT_FACE( face ), NULL ) ) )
         goto Exit;
     }
@@ -2780,7 +2960,7 @@
     if ( num_coords > mmvar->num_axis )
     {
       FT_TRACE2(( "TT_Set_MM_Blend:"
-                  " only using first %d of %d coordinates\n",
+                  " only using first %u of %u coordinates\n",
                   mmvar->num_axis, num_coords ));
       num_coords = mmvar->num_axis;
     }
@@ -2882,11 +3062,7 @@
 
       /* return value -1 indicates `no change' */
       if ( !have_diff )
-      {
-        face->doblend = TRUE;
-
         return -1;
-      }
 
       for ( ; i < mmvar->num_axis; i++ )
       {
@@ -2915,7 +3091,15 @@
                         blend->normalizedcoords,
                         blend->coords );
 
-    face->doblend = TRUE;
+    face->doblend = FALSE;
+    for ( i = 0; i < blend->num_axis; i++ )
+    {
+      if ( blend->normalizedcoords[i] )
+      {
+        face->doblend = TRUE;
+        break;
+      }
+    }
 
     if ( face->cvt )
     {
@@ -2941,6 +3125,9 @@
       }
     }
 
+    for ( i = 0 ; i < blend->tuplecount ; i++ )
+      blend->tuplescalars[i] = (FT_Fixed)-0x20000L;
+
   Exit:
     return error;
   }
@@ -2980,7 +3167,24 @@
                    FT_UInt    num_coords,
                    FT_Fixed*  coords )
   {
-    return tt_set_mm_blend( (TT_Face)face, num_coords, coords, 1 );
+    FT_Error  error;
+
+
+    error = tt_set_mm_blend( (TT_Face)face, num_coords, coords, 1 );
+    if ( error == FT_Err_Ok )
+    {
+      FT_UInt  i;
+
+
+      for ( i = 0; i < num_coords; i++ )
+        if ( coords[i] )
+        {
+          error = -2; /* -2 means is_variable. */
+          break;
+        }
+    }
+
+    return error;
   }
 
 
@@ -3043,7 +3247,7 @@
     if ( num_coords > blend->num_axis )
     {
       FT_TRACE2(( "TT_Get_MM_Blend:"
-                  " only using first %d of %d coordinates\n",
+                  " only using first %u of %u coordinates\n",
                   blend->num_axis, num_coords ));
       nc = blend->num_axis;
     }
@@ -3125,7 +3329,7 @@
     if ( num_coords > mmvar->num_axis )
     {
       FT_TRACE2(( "TT_Set_Var_Design:"
-                  " only using first %d of %d coordinates\n",
+                  " only using first %u of %u coordinates\n",
                   mmvar->num_axis, num_coords ));
       num_coords = mmvar->num_axis;
     }
@@ -3201,6 +3405,15 @@
     if ( error )
       goto Exit;
 
+    for ( i = 0; i < num_coords; i++ )
+    {
+      if ( normalized[i] )
+      {
+        error = -2; /* -2 means is_variable. */
+        break;
+      }
+    }
+
   Exit:
     FT_FREE( normalized );
     return error;
@@ -3237,10 +3450,12 @@
                      FT_UInt    num_coords,
                      FT_Fixed*  coords )
   {
-    TT_Face   ttface = (TT_Face)face;
-    FT_Error  error  = FT_Err_Ok;
-    GX_Blend  blend;
-    FT_UInt   i, nc;
+    TT_Face       ttface = (TT_Face)face;
+    FT_Error      error  = FT_Err_Ok;
+    GX_Blend      blend;
+    FT_MM_Var*    mmvar;
+    FT_Var_Axis*  a;
+    FT_UInt       i, nc;
 
 
     if ( !ttface->blend )
@@ -3263,24 +3478,26 @@
     if ( num_coords > blend->num_axis )
     {
       FT_TRACE2(( "TT_Get_Var_Design:"
-                  " only using first %d of %d coordinates\n",
+                  " only using first %u of %u coordinates\n",
                   blend->num_axis, num_coords ));
       nc = blend->num_axis;
     }
 
+    mmvar = blend->mmvar;
+    a     = mmvar->axis;
     if ( ttface->doblend )
     {
-      for ( i = 0; i < nc; i++ )
+      for ( i = 0; i < nc; i++, a++ )
         coords[i] = blend->coords[i];
     }
     else
     {
-      for ( i = 0; i < nc; i++ )
-        coords[i] = 0;
+      for ( i = 0; i < nc; i++, a++ )
+        coords[i] = a->def;
     }
 
-    for ( ; i < num_coords; i++ )
-      coords[i] = 0;
+    for ( ; i < num_coords; i++, a++ )
+      coords[i] = a->def;
 
     return FT_Err_Ok;
   }
@@ -3373,6 +3590,9 @@
       error = TT_Set_Var_Design( face, 0, NULL );
     }
 
+    if ( error == -1 || error == -2 )
+      error = FT_Err_Ok;
+
   Exit:
     return error;
   }
@@ -3591,7 +3811,7 @@
       FT_Stream_SeekSet( stream, here );
     }
 
-    FT_TRACE5(( "cvar: there %s %d tuple%s:\n",
+    FT_TRACE5(( "cvar: there %s %u tuple%s:\n",
                 ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "is" : "are",
                 tupleCount & GX_TC_TUPLE_COUNT_MASK,
                 ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "" : "s" ));
@@ -3610,7 +3830,7 @@
       FT_Fixed  apply;
 
 
-      FT_TRACE6(( "  tuple %d:\n", i ));
+      FT_TRACE6(( "  tuple %u:\n", i ));
 
       tupleDataSize = FT_GET_USHORT();
       tupleIndex    = FT_GET_USHORT();
@@ -3676,7 +3896,7 @@
       if ( !points || !deltas )
         ; /* failure, ignore it */
 
-      else if ( localpoints == ALL_POINTS )
+      else if ( points == ALL_POINTS )
       {
 #ifdef FT_DEBUG_LEVEL_TRACE
         int  count = 0;
@@ -3697,7 +3917,7 @@
 #ifdef FT_DEBUG_LEVEL_TRACE
           if ( old_cvt_delta != cvt_deltas[j] )
           {
-            FT_TRACE7(( "      %d: %f -> %f\n",
+            FT_TRACE7(( "      %u: %f -> %f\n",
                         j,
                         (double)( FT_fdot6ToFixed( face->cvt[j] ) +
                                     old_cvt_delta ) / 65536,
@@ -4027,7 +4247,7 @@
                               FT_Outline*  outline,
                               FT_Vector*   unrounded )
   {
-    FT_Error   error;
+    FT_Error   error       = FT_Err_Ok;
     TT_Face    face        = loader->face;
     FT_Stream  stream      = face->root.stream;
     FT_Memory  memory      = stream->memory;
@@ -4047,6 +4267,15 @@
     FT_ULong  here;
     FT_UInt   i, j;
 
+    FT_UInt   peak_coords_size;
+    FT_UInt   point_deltas_x_size;
+    FT_UInt   points_org_size;
+    FT_UInt   points_out_size;
+    FT_UInt   has_delta_size;
+    FT_UInt   pool_size;
+    FT_Byte*  pool = NULL;
+    FT_Byte*  p;
+
     FT_Fixed*  peak_coords = NULL;
     FT_Fixed*  tuple_coords;
     FT_Fixed*  im_start_coords;
@@ -4067,21 +4296,24 @@
     FT_Fixed*  point_deltas_y = NULL;
 
 
-    if ( !face->doblend || !blend )
-      return FT_THROW( Invalid_Argument );
-
     for ( i = 0; i < n_points; i++ )
     {
       unrounded[i].x = INT_TO_F26DOT6( outline->points[i].x );
       unrounded[i].y = INT_TO_F26DOT6( outline->points[i].y );
     }
 
+    if ( !face->doblend  )
+      goto Exit;
+
+    if ( !blend )
+      return FT_THROW( Invalid_Argument );
+
     if ( glyph_index >= blend->gv_glyphcnt      ||
          blend->glyphoffsets[glyph_index] ==
            blend->glyphoffsets[glyph_index + 1] )
     {
       FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:"
-                  " no variation data for glyph %d\n", glyph_index ));
+                  " no variation data for glyph %u\n", glyph_index ));
       return FT_Err_Ok;
     }
 
@@ -4125,18 +4357,41 @@
       FT_Stream_SeekSet( stream, here );
     }
 
-    FT_TRACE5(( "gvar: there %s %d tuple%s:\n",
+    FT_TRACE5(( "gvar: there %s %u tuple%s:\n",
                 ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "is" : "are",
                 tupleCount & GX_TC_TUPLE_COUNT_MASK,
                 ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "" : "s" ));
 
-    if ( FT_QNEW_ARRAY( peak_coords, 3 * blend->num_axis ) ||
-         FT_NEW_ARRAY( point_deltas_x, 2 * n_points )      ||
-         FT_QNEW_ARRAY( points_org, n_points )             ||
-         FT_QNEW_ARRAY( points_out, n_points )             ||
-         FT_QNEW_ARRAY( has_delta, n_points )              )
+    peak_coords_size    = ALIGN_SIZE( 3 * blend->num_axis *
+                                      sizeof ( *peak_coords ) );
+    point_deltas_x_size = ALIGN_SIZE( 2 * n_points *
+                                      sizeof ( *point_deltas_x ) );
+    points_org_size     = ALIGN_SIZE( n_points * sizeof ( *points_org ) );
+    points_out_size     = ALIGN_SIZE( n_points * sizeof ( *points_out ) );
+    has_delta_size      = ALIGN_SIZE( n_points * sizeof ( *has_delta ) );
+
+    pool_size = peak_coords_size    +
+                point_deltas_x_size +
+                points_org_size     +
+                points_out_size     +
+                has_delta_size;
+
+    if ( FT_ALLOC( pool, pool_size ) )
       goto Exit;
 
+    p               = pool;
+    peak_coords     = (FT_Fixed*)p;
+    p              += peak_coords_size;
+    point_deltas_x  = (FT_Fixed*)p;
+    p              += point_deltas_x_size;
+    points_org      = (FT_Vector*)p;
+    p              += points_org_size;
+    points_out      = (FT_Vector*)p;
+    p              += points_out_size;
+    has_delta       = (FT_Bool*)p;
+
+    FT_ARRAY_ZERO( point_deltas_x, 2 * n_points );
+
     im_start_coords = peak_coords + blend->num_axis;
     im_end_coords   = im_start_coords + blend->num_axis;
     point_deltas_y  = point_deltas_x + n_points;
@@ -4147,27 +4402,70 @@
       points_org[j].y = FT_intToFixed( outline->points[j].y );
     }
 
-    for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); i++ )
+    p = stream->cursor;
+
+    tupleCount &= GX_TC_TUPLE_COUNT_MASK;
+    for ( i = 0; i < tupleCount; i++ )
     {
-      FT_UInt   tupleDataSize;
-      FT_UInt   tupleIndex;
-      FT_Fixed  apply;
+      FT_UInt    tupleDataSize;
+      FT_UInt    tupleIndex;
+      FT_Fixed   apply;
+      FT_Fixed*  tupleScalars;
 
 
-      FT_TRACE6(( "  tuple %d:\n", i ));
+      FT_TRACE6(( "  tuple %u:\n", i ));
 
-      tupleDataSize = FT_GET_USHORT();
-      tupleIndex    = FT_GET_USHORT();
+      tupleScalars = blend->tuplescalars;
+
+      /* Enter frame for four bytes. */
+      if ( 4 > stream->limit - p )
+      {
+        FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:"
+                    " invalid glyph variation array header\n" ));
+        error = FT_THROW( Invalid_Table );
+        goto Exit;
+      }
+
+      tupleDataSize = FT_NEXT_USHORT( p );
+      tupleIndex    = FT_NEXT_USHORT( p );
+
+      if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
+        tupleScalars = NULL;
 
       if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
       {
+        if ( 2 * blend->num_axis > (FT_UInt)( stream->limit - p ) )
+        {
+          FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:"
+                      " invalid glyph variation array header\n" ));
+          error = FT_THROW( Invalid_Table );
+          goto Exit;
+        }
+
         for ( j = 0; j < blend->num_axis; j++ )
-          peak_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() );
+          peak_coords[j] = FT_fdot14ToFixed( FT_NEXT_SHORT( p ) );
+
         tuple_coords = peak_coords;
+        tupleScalars = NULL;
       }
       else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) < blend->tuplecount )
+      {
+        FT_Fixed  scalar =
+                    tupleScalars
+                      ? tupleScalars[tupleIndex & GX_TI_TUPLE_INDEX_MASK]
+                      : (FT_Fixed)-0x20000;
+
+
+        if ( scalar != (FT_Fixed)-0x20000 )
+        {
+          apply = scalar;
+          goto apply_found;
+        }
+
         tuple_coords = blend->tuplecoords +
-            ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) * blend->num_axis;
+                         ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) *
+                         blend->num_axis;
+      }
       else
       {
         FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:"
@@ -4179,10 +4477,18 @@
 
       if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
       {
+        if ( 4 * blend->num_axis > (FT_UInt)( stream->limit - p ) )
+        {
+          FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:"
+                      " invalid glyph variation array header\n" ));
+          error = FT_THROW( Invalid_Table );
+          goto Exit;
+        }
+
         for ( j = 0; j < blend->num_axis; j++ )
-          im_start_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() );
+          im_start_coords[j] = FT_fdot14ToFixed( FT_NEXT_SHORT( p ) );
         for ( j = 0; j < blend->num_axis; j++ )
-          im_end_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() );
+          im_end_coords[j] = FT_fdot14ToFixed( FT_NEXT_SHORT( p ) );
       }
 
       apply = ft_var_apply_tuple( blend,
@@ -4191,6 +4497,11 @@
                                   im_start_coords,
                                   im_end_coords );
 
+      if ( tupleScalars )
+        tupleScalars[tupleIndex & GX_TI_TUPLE_INDEX_MASK] = apply;
+
+    apply_found:
+
       if ( apply == 0 )              /* tuple isn't active for our blend */
       {
         offsetToData += tupleDataSize;
@@ -4247,7 +4558,7 @@
 #ifdef FT_DEBUG_LEVEL_TRACE
           if ( point_delta_x || point_delta_y )
           {
-            FT_TRACE7(( "      %d: (%f, %f) -> (%f, %f)\n",
+            FT_TRACE7(( "      %u: (%f, %f) -> (%f, %f)\n",
                         j,
                         (double)( FT_intToFixed( outline->points[j].x ) +
                                     old_point_delta_x ) / 65536,
@@ -4321,7 +4632,7 @@
 #ifdef FT_DEBUG_LEVEL_TRACE
           if ( point_delta_x || point_delta_y )
           {
-            FT_TRACE7(( "      %d: (%f, %f) -> (%f, %f)\n",
+            FT_TRACE7(( "      %u: (%f, %f) -> (%f, %f)\n",
                         j,
                         (double)( FT_intToFixed( outline->points[j].x ) +
                                     old_point_delta_x ) / 65536,
@@ -4402,11 +4713,7 @@
   Exit:
     if ( sharedpoints != ALL_POINTS )
       FT_FREE( sharedpoints );
-    FT_FREE( points_org );
-    FT_FREE( points_out );
-    FT_FREE( has_delta );
-    FT_FREE( peak_coords );
-    FT_FREE( point_deltas_x );
+    FT_FREE( pool );
 
   FExit:
     FT_FRAME_EXIT();
@@ -4577,6 +4884,7 @@
         FT_FREE( blend->mvar_table );
       }
 
+      FT_FREE( blend->tuplescalars );
       FT_FREE( blend->tuplecoords );
       FT_FREE( blend->glyphoffsets );
       FT_FREE( blend );
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttgxvar.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType GX Font Variation loader (specification)
  *
- * Copyright (C) 2004-2024 by
+ * Copyright (C) 2004-2025 by
  * David Turner, Robert Wilhelm, Werner Lemberg and George Williams.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -255,6 +255,10 @@
    *     A two-dimensional array that holds the shared tuple coordinates
    *     in the `gvar' table.
    *
+   *   tuplescalars ::
+   *     A one-dimensional array that holds the shared tuple
+   *     scalars in the `gvar' table for current face coordinates.
+   *
    *   gv_glyphcnt ::
    *     The number of glyphs handled in the `gvar' table.
    *
@@ -293,6 +297,7 @@
 
     FT_UInt         tuplecount;
     FT_Fixed*       tuplecoords;      /* tuplecoords[tuplecount][num_axis] */
+    FT_Fixed*       tuplescalars;     /* tuplescalars[tuplecount]          */
 
     FT_UInt         gv_glyphcnt;
     FT_ULong*       glyphoffsets;         /* glyphoffsets[gv_glyphcnt + 1] */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType bytecode interpreter (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -27,6 +27,8 @@
 #include 
 #include 
 
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
 #include "ttinterp.h"
 #include "tterrors.h"
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
@@ -34,9 +36,6 @@
 #endif
 
 
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-
   /**************************************************************************
    *
    * The macro FT_COMPONENT is used in trace mode.  It is an implicit
@@ -89,58 +88,37 @@
 #define FAILURE  1
 
 
-  /**************************************************************************
-   *
-   *                       CODERANGE FUNCTIONS
-   *
-   */
+  /* The default value for `scan_control' is documented as FALSE in the */
+  /* TrueType specification.  This is confusing since it implies a      */
+  /* Boolean value.  However, this is not the case, thus both the       */
+  /* default values of our `scan_type' and `scan_control' fields (which */
+  /* the documentation's `scan_control' variable is split into) are     */
+  /* zero.                                                              */
+  /*                                                                    */
+  /* The rounding compensation should logically belong here but poorly  */
+  /* described in the OpenType specs.  It was probably important in the */
+  /* days of dot matrix printers.  The values are referenced by color   */
+  /* as Gray, Black, and White in order. The Apple specification says   */
+  /* that the Gray compensation is always zero.  The fourth value is    */
+  /* not described at all, but Greg says that it is the same as Gray.   */
+  /* FreeType sets all compensation values to zero.                     */
+
+  const TT_GraphicsState  tt_default_graphics_state =
+  {
+    0, 0, 0,  1, 1, 1,
+    { 0x4000, 0 }, { 0x4000, 0 }, { 0x4000, 0 },
+    1, 1, { 0, 0, 0, 0 },
+
+    64, 68, 0, 0, 9, 3,
+    TRUE, 0, FALSE, 0
+  };
 
 
   /**************************************************************************
    *
-   * @Function:
-   *   TT_Goto_CodeRange
-   *
-   * @Description:
-   *   Switches to a new code range (updates the code related elements in
-   *   `exec', and `IP').
-   *
-   * @Input:
-   *   range ::
-   *     The new execution code range.
-   *
-   *   IP ::
-   *     The new IP in the new code range.
+   *                       CODERANGE FUNCTIONS
    *
-   * @InOut:
-   *   exec ::
-   *     The target execution context.
    */
-  FT_LOCAL_DEF( void )
-  TT_Goto_CodeRange( TT_ExecContext  exec,
-                     FT_Int          range,
-                     FT_Long         IP )
-  {
-    TT_CodeRange*  coderange;
-
-
-    FT_ASSERT( range >= 1 && range <= 3 );
-
-    coderange = &exec->codeRangeTable[range - 1];
-
-    FT_ASSERT( coderange->base );
-
-    /* NOTE: Because the last instruction of a program may be a CALL */
-    /*       which will return to the first byte *after* the code    */
-    /*       range, we test for IP <= Size instead of IP < Size.     */
-    /*                                                               */
-    FT_ASSERT( IP <= coderange->size );
-
-    exec->code     = coderange->base;
-    exec->codeSize = coderange->size;
-    exec->IP       = IP;
-    exec->curRange = range;
-  }
 
 
   /**************************************************************************
@@ -168,13 +146,19 @@
   FT_LOCAL_DEF( void )
   TT_Set_CodeRange( TT_ExecContext  exec,
                     FT_Int          range,
-                    void*           base,
+                    FT_Byte*        base,
                     FT_Long         length )
   {
     FT_ASSERT( range >= 1 && range <= 3 );
 
-    exec->codeRangeTable[range - 1].base = (FT_Byte*)base;
+    exec->codeRangeTable[range - 1].base = base;
     exec->codeRangeTable[range - 1].size = length;
+
+    exec->code     = base;
+    exec->codeSize = length;
+    exec->IP       = 0;
+    exec->curRange = range;
+    exec->iniRange = range;
   }
 
 
@@ -224,9 +208,6 @@
    *   exec ::
    *     A handle to the target execution context.
    *
-   *   memory ::
-   *     A handle to the parent memory object.
-   *
    * @Note:
    *   Only the glyph loader and debugger should call this function.
    */
@@ -240,10 +221,6 @@
     exec->maxPoints   = 0;
     exec->maxContours = 0;
 
-    /* free stack */
-    FT_FREE( exec->stack );
-    exec->stackSize = 0;
-
     /* free glyf cvt working area */
     FT_FREE( exec->glyfCvt );
     exec->glyfCvtSize = 0;
@@ -295,79 +272,31 @@
    *
    *   Note that not all members of `TT_ExecContext` get initialized.
    */
-  FT_LOCAL_DEF( FT_Error )
+  FT_LOCAL_DEF( void )
   TT_Load_Context( TT_ExecContext  exec,
                    TT_Face         face,
                    TT_Size         size )
   {
-    FT_Int          i;
-    TT_MaxProfile*  maxp;
-    FT_Error        error;
-    FT_Memory       memory = exec->memory;
+    FT_Memory  memory = exec->memory;
 
 
     exec->face = face;
-    maxp       = &face->max_profile;
     exec->size = size;
 
-    if ( size )
-    {
-      exec->numFDefs   = size->num_function_defs;
-      exec->maxFDefs   = size->max_function_defs;
-      exec->numIDefs   = size->num_instruction_defs;
-      exec->maxIDefs   = size->max_instruction_defs;
-      exec->FDefs      = size->function_defs;
-      exec->IDefs      = size->instruction_defs;
-      exec->pointSize  = size->point_size;
-      exec->tt_metrics = size->ttmetrics;
-      exec->metrics    = *size->metrics;
-
-      exec->maxFunc    = size->max_func;
-      exec->maxIns     = size->max_ins;
-
-      for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
-        exec->codeRangeTable[i] = size->codeRangeTable[i];
-
-      /* set graphics state */
-      exec->GS = size->GS;
-
-      exec->cvtSize = size->cvt_size;
-      exec->cvt     = size->cvt;
-
-      exec->storeSize = size->storage_size;
-      exec->storage   = size->storage;
-
-      exec->twilight  = size->twilight;
-
-      /* In case of multi-threading it can happen that the old size object */
-      /* no longer exists, thus we must clear all glyph zone references.   */
-      FT_ZERO( &exec->zp0 );
-      exec->zp1 = exec->zp0;
-      exec->zp2 = exec->zp0;
-    }
-
-    /* XXX: We reserve a little more elements on the stack to deal safely */
-    /*      with broken fonts like arialbs, courbs, timesbs, etc.         */
-    if ( FT_QRENEW_ARRAY( exec->stack,
-                          exec->stackSize,
-                          maxp->maxStackElements + 32 ) )
-      return error;
-    exec->stackSize = maxp->maxStackElements + 32;
+    /* CVT and storage are not persistent in FreeType */
+    /* reset them after they might have been modified */
+    exec->storage = exec->stack   + exec->stackSize;
+    exec->cvt     = exec->storage + exec->storeSize;
 
     /* free previous glyph code range */
     FT_FREE( exec->glyphIns );
     exec->glyphSize = 0;
 
-    exec->pts.n_points   = 0;
-    exec->pts.n_contours = 0;
-
-    exec->zp1 = exec->pts;
-    exec->zp2 = exec->pts;
-    exec->zp0 = exec->pts;
-
-    exec->instruction_trap = FALSE;
+    exec->pointSize  = size->point_size;
+    exec->tt_metrics = size->ttmetrics;
+    exec->metrics    = *size->metrics;
 
-    return FT_Err_Ok;
+    exec->twilight   = size->twilight;
   }
 
 
@@ -394,89 +323,22 @@
   TT_Save_Context( TT_ExecContext  exec,
                    TT_Size         size )
   {
-    FT_Int  i;
-
-
-    /* XXX: Will probably disappear soon with all the code range */
-    /*      management, which is now rather obsolete.            */
-    /*                                                           */
-    size->num_function_defs    = exec->numFDefs;
-    size->num_instruction_defs = exec->numIDefs;
-
-    size->max_func = exec->maxFunc;
-    size->max_ins  = exec->maxIns;
+    /* UNDOCUMENTED!                                            */
+    /* Only these GS values can be modified by the CVT program. */
 
-    for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
-      size->codeRangeTable[i] = exec->codeRangeTable[i];
+    size->GS.minimum_distance    = exec->GS.minimum_distance;
+    size->GS.control_value_cutin = exec->GS.control_value_cutin;
+    size->GS.single_width_cutin  = exec->GS.single_width_cutin;
+    size->GS.single_width_value  = exec->GS.single_width_value;
+    size->GS.delta_base          = exec->GS.delta_base;
+    size->GS.delta_shift         = exec->GS.delta_shift;
+    size->GS.auto_flip           = exec->GS.auto_flip;
+    size->GS.instruct_control    = exec->GS.instruct_control;
+    size->GS.scan_control        = exec->GS.scan_control;
+    size->GS.scan_type           = exec->GS.scan_type;
   }
 
 
-  /**************************************************************************
-   *
-   * @Function:
-   *   TT_Run_Context
-   *
-   * @Description:
-   *   Executes one or more instructions in the execution context.
-   *
-   * @Input:
-   *   exec ::
-   *     A handle to the target execution context.
-   *
-   * @Return:
-   *   TrueType error code.  0 means success.
-   */
-  FT_LOCAL_DEF( FT_Error )
-  TT_Run_Context( TT_ExecContext  exec )
-  {
-    TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 );
-
-    exec->zp0 = exec->pts;
-    exec->zp1 = exec->pts;
-    exec->zp2 = exec->pts;
-
-    exec->GS.gep0 = 1;
-    exec->GS.gep1 = 1;
-    exec->GS.gep2 = 1;
-
-    exec->GS.projVector.x = 0x4000;
-    exec->GS.projVector.y = 0x0000;
-
-    exec->GS.freeVector = exec->GS.projVector;
-    exec->GS.dualVector = exec->GS.projVector;
-
-    exec->GS.round_state = 1;
-    exec->GS.loop        = 1;
-
-    /* some glyphs leave something on the stack. so we clean it */
-    /* before a new execution.                                  */
-    exec->top     = 0;
-    exec->callTop = 0;
-
-    return exec->face->interpreter( exec );
-  }
-
-
-  /* The default value for `scan_control' is documented as FALSE in the */
-  /* TrueType specification.  This is confusing since it implies a      */
-  /* Boolean value.  However, this is not the case, thus both the       */
-  /* default values of our `scan_type' and `scan_control' fields (which */
-  /* the documentation's `scan_control' variable is split into) are     */
-  /* zero.                                                              */
-
-  const TT_GraphicsState  tt_default_graphics_state =
-  {
-    0, 0, 0,
-    { 0x4000, 0 },
-    { 0x4000, 0 },
-    { 0x4000, 0 },
-
-    1, 64, 1,
-    TRUE, 68, 0, 0, 9, 3,
-    0, FALSE, 0, 1, 1, 1
-  };
-
-
   /* documentation is in ttinterp.h */
 
   FT_EXPORT_DEF( TT_ExecContext )
@@ -485,7 +347,8 @@
     FT_Memory  memory;
     FT_Error   error;
 
-    TT_ExecContext  exec = NULL;
+    TT_ExecContext     exec = NULL;
+    FT_DebugHook_Func  interp;
 
 
     if ( !driver )
@@ -497,6 +360,15 @@
     if ( FT_NEW( exec ) )
       goto Fail;
 
+    /* set `exec->interpreter' according to the debug hook present, */
+    /* which is used by 'ttdebug'.                                  */
+    interp = driver->root.root.library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE];
+
+    if ( interp )
+      exec->interpreter = (TT_Interpreter)interp;
+    else
+      exec->interpreter = (TT_Interpreter)TT_RunIns;
+
     /* create callStack here, other allocations delayed */
     exec->memory   = memory;
     exec->callSize = 32;
@@ -1160,20 +1032,35 @@
 #undef PACK
 
 
-#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER
+#ifdef FT_INT64
+
+#define TT_MulFix14( a, b )  TT_MulFix14_64( a, b )
+
+  static inline FT_F26Dot6
+  TT_MulFix14_64( FT_F26Dot6  a,
+                  FT_F2Dot14  b )
+  {
+    FT_Int64  ab = MUL_INT64( a, b );
+
+
+    ab = ADD_INT64( ab, 0x2000 + ( ab >> 63 ) );  /* rounding phase */
+
+    return (FT_F26Dot6)( ab >> 14 );
+  }
+
+#elif !defined( FT_CONFIG_OPTION_NO_ASSEMBLER )
 
 #if defined( __arm__ )                                 && \
     ( defined( __thumb2__ ) || !defined( __thumb__ ) )
 
 #define TT_MulFix14  TT_MulFix14_arm
 
-  static FT_Int32
+  static __inline FT_Int32
   TT_MulFix14_arm( FT_Int32  a,
-                   FT_Int    b )
+                   FT_Int32  b )
   {
     FT_Int32  t, t2;
 
-
 #if defined( __CC_ARM ) || defined( __ARMCC__ )
 
     __asm
@@ -1199,8 +1086,8 @@
 #endif
       "adds   %1, %1, %0\n\t"           /* %1 += %0 */
       "adc    %2, %2, #0\n\t"           /* %2 += carry */
-      "mov    %0, %1, lsr #14\n\t"      /* %0  = %1 >> 16 */
-      "orr    %0, %0, %2, lsl #18\n\t"  /* %0 |= %2 << 16 */
+      "mov    %0, %1, lsr #14\n\t"      /* %0  = %1 >> 14 */
+      "orr    %0, %0, %2, lsl #18\n\t"  /* %0 |= %2 << 18 */
       : "=r"(a), "=&r"(t2), "=&r"(t)
       : "r"(a), "r"(b)
       : "cc" );
@@ -1210,49 +1097,60 @@
     return a;
   }
 
-#endif /* __arm__ && ( __thumb2__ || !__thumb__ ) */
+#elif defined( __i386__ ) || defined( _M_IX86 )
 
-#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
-
-
-#if defined( __GNUC__ )                              && \
-    ( defined( __i386__ ) || defined( __x86_64__ ) )
+#define TT_MulFix14  TT_MulFix14_i386
 
-#define TT_MulFix14  TT_MulFix14_long_long
-
-  /* Temporarily disable the warning that C90 doesn't support `long long'. */
-#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
-#pragma GCC diagnostic push
-#endif
-#pragma GCC diagnostic ignored "-Wlong-long"
+  /* documentation is in freetype.h */
 
-  /* This is declared `noinline' because inlining the function results */
-  /* in slower code.  The `pure' attribute indicates that the result   */
-  /* only depends on the parameters.                                   */
-  static __attribute__(( noinline ))
-         __attribute__(( pure )) FT_Int32
-  TT_MulFix14_long_long( FT_Int32  a,
-                         FT_Int    b )
+  static __inline FT_Int32
+  TT_MulFixi14_i386( FT_Int32  a,
+                     FT_Int32  b )
   {
+    FT_Int32  result;
 
-    long long  ret = (long long)a * b;
+#if defined( __GNUC__ )
 
-    /* The following line assumes that right shifting of signed values */
-    /* will actually preserve the sign bit.  The exact behaviour is    */
-    /* undefined, but this is true on x86 and x86_64.                  */
-    long long  tmp = ret >> 63;
+    __asm__ __volatile__ (
+      "imul  %%edx\n"
+      "movl  %%edx, %%ecx\n"
+      "sarl  $31, %%ecx\n"
+      "addl  $0x2000, %%ecx\n"
+      "addl  %%ecx, %%eax\n"
+      "adcl  $0, %%edx\n"
+      "shrl  $14, %%eax\n"
+      "shll  $18, %%edx\n"
+      "addl  %%edx, %%eax\n"
+      : "=a"(result), "=d"(b)
+      : "a"(a), "d"(b)
+      : "%ecx", "cc" );
 
+#elif defined( _MSC_VER)
 
-    ret += 0x2000 + tmp;
+    __asm
+    {
+      mov eax, a
+      mov edx, b
+      imul edx
+      mov ecx, edx
+      sar ecx, 31
+      add ecx, 2000h
+      add eax, ecx
+      adc edx, 0
+      shr eax, 14
+      shl edx, 18
+      add eax, edx
+      mov result, eax
+    }
 
-    return (FT_Int32)( ret >> 14 );
+#endif
+
+    return result;
   }
 
-#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
-#pragma GCC diagnostic pop
-#endif
+#endif /* __i386__ || _M_IX86 */
 
-#endif /* __GNUC__ && ( __i386__ || __x86_64__ ) */
+#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
 
 
 #ifndef TT_MulFix14
@@ -1262,92 +1160,59 @@
   /* for platforms where sizeof(int) == 2.                   */
   static FT_Int32
   TT_MulFix14( FT_Int32  a,
-               FT_Int    b )
+               FT_Int16  b )
   {
-    FT_Int32   sign;
-    FT_UInt32  ah, al, mid, lo, hi;
-
+    FT_Int32   m, hi;
+    FT_UInt32  l, lo;
 
-    sign = a ^ b;
 
-    if ( a < 0 )
-      a = -a;
-    if ( b < 0 )
-      b = -b;
+    /* compute a*b as 64-bit (hi_lo) value */
+    l = (FT_UInt32)( ( a & 0xFFFFU ) * b );
+    m = ( a >> 16 ) * b;
 
-    ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU );
-    al = (FT_UInt32)( a & 0xFFFFU );
+    lo = l + ( (FT_UInt32)m << 16 );
+    hi = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo < l );
 
-    lo    = al * b;
-    mid   = ah * b;
-    hi    = mid >> 16;
-    mid   = ( mid << 16 ) + ( 1 << 13 ); /* rounding */
-    lo   += mid;
-    if ( lo < mid )
-      hi += 1;
-
-    mid = ( lo >> 14 ) | ( hi << 18 );
+    /* divide the result by 2^14 with rounding */
+    l   = lo + 0x2000U + (FT_UInt32)( hi >> 31 );  /* rounding phase */
+    hi += ( l < lo );
 
-    return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid;
+    return (FT_F26Dot6)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
   }
 
 #endif  /* !TT_MulFix14 */
 
 
-#if defined( __GNUC__ )        && \
-    ( defined( __i386__ )   ||    \
-      defined( __x86_64__ ) ||    \
-      defined( __arm__ )    )
+#ifdef FT_INT64
 
-#define TT_DotFix14  TT_DotFix14_long_long
-
-#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
-#pragma GCC diagnostic push
-#endif
-#pragma GCC diagnostic ignored "-Wlong-long"
-
-  static __attribute__(( pure )) FT_Int32
-  TT_DotFix14_long_long( FT_Int32  ax,
-                         FT_Int32  ay,
-                         FT_Int    bx,
-                         FT_Int    by )
+  /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */
+  static inline FT_F26Dot6
+  TT_DotFix14( FT_F26Dot6  ax,
+               FT_F26Dot6  ay,
+               FT_F2Dot14  bx,
+               FT_F2Dot14  by )
   {
-    /* Temporarily disable the warning that C90 doesn't support */
-    /* `long long'.                                             */
-
-    long long  temp1 = (long long)ax * bx;
-    long long  temp2 = (long long)ay * by;
-
+    FT_Int64  c = ADD_INT64( MUL_INT64( ax, bx ), MUL_INT64( ay, by ) );
 
-    temp1 += temp2;
-    temp2  = temp1 >> 63;
-    temp1 += 0x2000 + temp2;
 
-    return (FT_Int32)( temp1 >> 14 );
+    c = ADD_INT64( c, 0x2000 + ( c >> 63 ) );  /* rounding phase */
 
+    return (FT_F26Dot6)( c >> 14 );
   }
 
-#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
-#pragma GCC diagnostic pop
-#endif
-
-#endif /* __GNUC__ && (__arm__ || __i386__ || __x86_64__) */
-
-
-#ifndef TT_DotFix14
+#else
 
-  /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */
-  static FT_Int32
-  TT_DotFix14( FT_Int32  ax,
-               FT_Int32  ay,
-               FT_Int    bx,
-               FT_Int    by )
+  static inline FT_F26Dot6
+  TT_DotFix14( FT_F26Dot6  ax,
+               FT_F26Dot6  ay,
+               FT_F2Dot14  bx,
+               FT_F2Dot14  by )
   {
-    FT_Int32   m, s, hi1, hi2, hi;
+    FT_Int32   m, hi1, hi2, hi;
     FT_UInt32  l, lo1, lo2, lo;
 
 
-    /* compute ax*bx as 64-bit value */
+    /* compute ax*bx as 64-bit (hi_lo) value */
     l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx );
     m = ( ax >> 16 ) * bx;
 
@@ -1366,18 +1231,13 @@
     hi = hi1 + hi2 + ( lo < lo1 );
 
     /* divide the result by 2^14 with rounding */
-    s   = hi >> 31;
-    l   = lo + (FT_UInt32)s;
-    hi += s + ( l < lo );
-    lo  = l;
-
-    l   = lo + 0x2000U;
+    l   = lo + 0x2000U + (FT_UInt32)( hi >> 31 );  /* rounding phase */
     hi += ( l < lo );
 
-    return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
+    return (FT_F26Dot6)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
   }
 
-#endif /* TT_DotFix14 */
+#endif /* !FT_INT64 */
 
 
   /**************************************************************************
@@ -1534,31 +1394,6 @@
   /**************************************************************************
    *
    * @Function:
-   *   GetShortIns
-   *
-   * @Description:
-   *   Returns a short integer taken from the instruction stream at
-   *   address IP.
-   *
-   * @Return:
-   *   Short read at code[IP].
-   *
-   * @Note:
-   *   This one could become a macro.
-   */
-  static FT_Short
-  GetShortIns( TT_ExecContext  exc )
-  {
-    /* Reading a byte stream so there is no endianness (DaveP) */
-    exc->IP += 2;
-    return (FT_Short)( ( exc->code[exc->IP - 2] << 8 ) +
-                         exc->code[exc->IP - 1]      );
-  }
-
-
-  /**************************************************************************
-   *
-   * @Function:
    *   Ins_Goto_CodeRange
    *
    * @Description:
@@ -1609,6 +1444,7 @@
     exc->code     = range->base;
     exc->codeSize = range->size;
     exc->IP       = aIP;
+    exc->length   = 0;
     exc->curRange = aRange;
 
     return SUCCESS;
@@ -1671,48 +1507,33 @@
                FT_UShort       point,
                FT_F26Dot6      distance )
   {
-    FT_F26Dot6  v;
+    FT_Fixed  v;
 
 
-    v = exc->GS.freeVector.x;
-
+    v = exc->moveVector.x;
     if ( v != 0 )
     {
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
       /* Exception to the post-IUP curfew: Allow the x component of */
       /* diagonal moves, but only post-IUP.  DejaVu tries to adjust */
       /* diagonal stems like on `Z' and `z' post-IUP.               */
-      if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility )
-        zone->cur[point].x = ADD_LONG( zone->cur[point].x,
-                                       FT_MulDiv( distance,
-                                                  v,
-                                                  exc->F_dot_P ) );
-      else
+      if ( !exc->backward_compatibility )
 #endif
-
-      if ( NO_SUBPIXEL_HINTING )
         zone->cur[point].x = ADD_LONG( zone->cur[point].x,
-                                       FT_MulDiv( distance,
-                                                  v,
-                                                  exc->F_dot_P ) );
+                                       FT_MulFix( distance, v ) );
 
       zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;
     }
 
-    v = exc->GS.freeVector.y;
-
+    v = exc->moveVector.y;
     if ( v != 0 )
     {
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-      if ( !( SUBPIXEL_HINTING_MINIMAL    &&
-              exc->backward_compatibility &&
-              exc->iupx_called            &&
-              exc->iupy_called            ) )
+      /* See `ttinterp.h' for details on backward compatibility mode. */
+      if ( exc->backward_compatibility != 0x7 )
 #endif
         zone->cur[point].y = ADD_LONG( zone->cur[point].y,
-                                       FT_MulDiv( distance,
-                                                  v,
-                                                  exc->F_dot_P ) );
+                                       FT_MulFix( distance, v ) );
 
       zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
     }
@@ -1745,24 +1566,20 @@
                     FT_UShort       point,
                     FT_F26Dot6      distance )
   {
-    FT_F26Dot6  v;
+    FT_Fixed  v;
 
 
-    v = exc->GS.freeVector.x;
+    v = exc->moveVector.x;
 
     if ( v != 0 )
       zone->org[point].x = ADD_LONG( zone->org[point].x,
-                                     FT_MulDiv( distance,
-                                                v,
-                                                exc->F_dot_P ) );
+                                     FT_MulFix( distance, v ) );
 
-    v = exc->GS.freeVector.y;
+    v = exc->moveVector.y;
 
     if ( v != 0 )
       zone->org[point].y = ADD_LONG( zone->org[point].y,
-                                     FT_MulDiv( distance,
-                                                v,
-                                                exc->F_dot_P ) );
+                                     FT_MulFix( distance, v ) );
   }
 
 
@@ -1784,12 +1601,8 @@
                  FT_F26Dot6      distance )
   {
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility )
-      zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance );
-    else
+    if ( !exc->backward_compatibility )
 #endif
-
-    if ( NO_SUBPIXEL_HINTING )
       zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance );
 
     zone->tags[point]  |= FT_CURVE_TAG_TOUCH_X;
@@ -1805,9 +1618,8 @@
     FT_UNUSED( exc );
 
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    if ( !( SUBPIXEL_HINTING_MINIMAL             &&
-            exc->backward_compatibility          &&
-            exc->iupx_called && exc->iupy_called ) )
+    /* See `ttinterp.h' for details on backward compatibility mode. */
+    if ( exc->backward_compatibility != 0x7 )
 #endif
       zone->cur[point].y = ADD_LONG( zone->cur[point].y, distance );
 
@@ -1860,8 +1672,8 @@
    *   distance ::
    *     The distance (not) to round.
    *
-   *   color ::
-   *     The engine compensation color.
+   *   compensation ::
+   *     The engine compensation.
    *
    * @Return:
    *   The compensated distance.
@@ -1869,10 +1681,10 @@
   static FT_F26Dot6
   Round_None( TT_ExecContext  exc,
               FT_F26Dot6      distance,
-              FT_Int          color )
+              FT_F26Dot6      compensation )
   {
-    FT_F26Dot6  compensation = exc->tt_metrics.compensations[color];
     FT_F26Dot6  val;
+    FT_UNUSED( exc );
 
 
     if ( distance >= 0 )
@@ -1903,8 +1715,8 @@
    *   distance ::
    *     The distance to round.
    *
-   *   color ::
-   *     The engine compensation color.
+   *   compensation ::
+   *     The engine compensation.
    *
    * @Return:
    *   Rounded distance.
@@ -1912,10 +1724,10 @@
   static FT_F26Dot6
   Round_To_Grid( TT_ExecContext  exc,
                  FT_F26Dot6      distance,
-                 FT_Int          color )
+                 FT_F26Dot6      compensation )
   {
-    FT_F26Dot6  compensation = exc->tt_metrics.compensations[color];
     FT_F26Dot6  val;
+    FT_UNUSED( exc );
 
 
     if ( distance >= 0 )
@@ -1948,8 +1760,8 @@
    *   distance ::
    *     The distance to round.
    *
-   *   color ::
-   *     The engine compensation color.
+   *   compensation ::
+   *     The engine compensation.
    *
    * @Return:
    *   Rounded distance.
@@ -1957,10 +1769,10 @@
   static FT_F26Dot6
   Round_To_Half_Grid( TT_ExecContext  exc,
                       FT_F26Dot6      distance,
-                      FT_Int          color )
+                      FT_F26Dot6      compensation )
   {
-    FT_F26Dot6  compensation = exc->tt_metrics.compensations[color];
     FT_F26Dot6  val;
+    FT_UNUSED( exc );
 
 
     if ( distance >= 0 )
@@ -1995,8 +1807,8 @@
    *   distance ::
    *     The distance to round.
    *
-   *   color ::
-   *     The engine compensation color.
+   *   compensation ::
+   *     The engine compensation.
    *
    * @Return:
    *   Rounded distance.
@@ -2004,10 +1816,10 @@
   static FT_F26Dot6
   Round_Down_To_Grid( TT_ExecContext  exc,
                       FT_F26Dot6      distance,
-                      FT_Int          color )
+                      FT_F26Dot6      compensation )
   {
-    FT_F26Dot6  compensation = exc->tt_metrics.compensations[color];
     FT_F26Dot6  val;
+    FT_UNUSED( exc );
 
 
     if ( distance >= 0 )
@@ -2039,8 +1851,8 @@
    *   distance ::
    *     The distance to round.
    *
-   *   color ::
-   *     The engine compensation color.
+   *   compensation ::
+   *     The engine compensation.
    *
    * @Return:
    *   Rounded distance.
@@ -2048,10 +1860,10 @@
   static FT_F26Dot6
   Round_Up_To_Grid( TT_ExecContext  exc,
                     FT_F26Dot6      distance,
-                    FT_Int          color )
+                    FT_F26Dot6      compensation )
   {
-    FT_F26Dot6  compensation = exc->tt_metrics.compensations[color];
     FT_F26Dot6  val;
+    FT_UNUSED( exc );
 
 
     if ( distance >= 0 )
@@ -2084,8 +1896,8 @@
    *   distance ::
    *     The distance to round.
    *
-   *   color ::
-   *     The engine compensation color.
+   *   compensation ::
+   *     The engine compensation.
    *
    * @Return:
    *   Rounded distance.
@@ -2093,10 +1905,10 @@
   static FT_F26Dot6
   Round_To_Double_Grid( TT_ExecContext  exc,
                         FT_F26Dot6      distance,
-                        FT_Int          color )
+                        FT_F26Dot6      compensation )
   {
-    FT_F26Dot6  compensation = exc->tt_metrics.compensations[color];
     FT_F26Dot6  val;
+    FT_UNUSED( exc );
 
 
     if ( distance >= 0 )
@@ -2129,8 +1941,8 @@
    *   distance ::
    *     The distance to round.
    *
-   *   color ::
-   *     The engine compensation color.
+   *   compensation ::
+   *     The engine compensation.
    *
    * @Return:
    *   Rounded distance.
@@ -2144,9 +1956,8 @@
   static FT_F26Dot6
   Round_Super( TT_ExecContext  exc,
                FT_F26Dot6      distance,
-               FT_Int          color )
+               FT_F26Dot6      compensation )
   {
-    FT_F26Dot6  compensation = exc->tt_metrics.compensations[color];
     FT_F26Dot6  val;
 
 
@@ -2185,8 +1996,8 @@
    *   distance ::
    *     The distance to round.
    *
-   *   color ::
-   *     The engine compensation color.
+   *   compensation ::
+   *     The engine compensation.
    *
    * @Return:
    *   Rounded distance.
@@ -2198,9 +2009,8 @@
   static FT_F26Dot6
   Round_Super_45( TT_ExecContext  exc,
                   FT_F26Dot6      distance,
-                  FT_Int          color )
+                  FT_F26Dot6      compensation )
   {
-    FT_F26Dot6  compensation = exc->tt_metrics.compensations[color];
     FT_F26Dot6  val;
 
 
@@ -2230,59 +2040,6 @@
   /**************************************************************************
    *
    * @Function:
-   *   Compute_Round
-   *
-   * @Description:
-   *   Sets the rounding mode.
-   *
-   * @Input:
-   *   round_mode ::
-   *     The rounding mode to be used.
-   */
-  static void
-  Compute_Round( TT_ExecContext  exc,
-                 FT_Byte         round_mode )
-  {
-    switch ( round_mode )
-    {
-    case TT_Round_Off:
-      exc->func_round = (TT_Round_Func)Round_None;
-      break;
-
-    case TT_Round_To_Grid:
-      exc->func_round = (TT_Round_Func)Round_To_Grid;
-      break;
-
-    case TT_Round_Up_To_Grid:
-      exc->func_round = (TT_Round_Func)Round_Up_To_Grid;
-      break;
-
-    case TT_Round_Down_To_Grid:
-      exc->func_round = (TT_Round_Func)Round_Down_To_Grid;
-      break;
-
-    case TT_Round_To_Half_Grid:
-      exc->func_round = (TT_Round_Func)Round_To_Half_Grid;
-      break;
-
-    case TT_Round_To_Double_Grid:
-      exc->func_round = (TT_Round_Func)Round_To_Double_Grid;
-      break;
-
-    case TT_Round_Super:
-      exc->func_round = (TT_Round_Func)Round_Super;
-      break;
-
-    case TT_Round_Super_45:
-      exc->func_round = (TT_Round_Func)Round_Super_45;
-      break;
-    }
-  }
-
-
-  /**************************************************************************
-   *
-   * @Function:
    *   SetSuperRound
    *
    * @Description:
@@ -2481,14 +2238,45 @@
   static void
   Compute_Funcs( TT_ExecContext  exc )
   {
-    if ( exc->GS.freeVector.x == 0x4000 )
-      exc->F_dot_P = exc->GS.projVector.x;
-    else if ( exc->GS.freeVector.y == 0x4000 )
-      exc->F_dot_P = exc->GS.projVector.y;
-    else
-      exc->F_dot_P =
-        ( (FT_Long)exc->GS.projVector.x * exc->GS.freeVector.x +
-          (FT_Long)exc->GS.projVector.y * exc->GS.freeVector.y ) >> 14;
+    FT_Long  F_dot_P =
+             ( (FT_Long)exc->GS.projVector.x * exc->GS.freeVector.x +
+               (FT_Long)exc->GS.projVector.y * exc->GS.freeVector.y +
+               0x2000L ) >> 14;
+
+
+    if ( F_dot_P >= 0x3FFEL )
+    {
+      /* commonly collinear */
+      exc->moveVector.x = exc->GS.freeVector.x * 4;
+      exc->moveVector.y = exc->GS.freeVector.y * 4;
+    }
+    else if ( -0x400L < F_dot_P && F_dot_P < 0x400L )
+    {
+      /* prohibitively orthogonal */
+      exc->moveVector.x = 0;
+      exc->moveVector.y = 0;
+    }
+    else
+    {
+      exc->moveVector.x = exc->GS.freeVector.x * 0x10000L / F_dot_P;
+      exc->moveVector.y = exc->GS.freeVector.y * 0x10000L / F_dot_P;
+    }
+
+    if ( F_dot_P >= 0x3FFEL && exc->GS.freeVector.x == 0x4000 )
+    {
+      exc->func_move      = (TT_Move_Func)Direct_Move_X;
+      exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;
+    }
+    else if ( F_dot_P >= 0x3FFEL && exc->GS.freeVector.y == 0x4000 )
+    {
+      exc->func_move      = (TT_Move_Func)Direct_Move_Y;
+      exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;
+    }
+    else
+    {
+      exc->func_move      = (TT_Move_Func)Direct_Move;
+      exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig;
+    }
 
     if ( exc->GS.projVector.x == 0x4000 )
       exc->func_project = (TT_Project_Func)Project_x;
@@ -2504,29 +2292,6 @@
     else
       exc->func_dualproj = (TT_Project_Func)Dual_Project;
 
-    exc->func_move      = (TT_Move_Func)Direct_Move;
-    exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig;
-
-    if ( exc->F_dot_P == 0x4000L )
-    {
-      if ( exc->GS.freeVector.x == 0x4000 )
-      {
-        exc->func_move      = (TT_Move_Func)Direct_Move_X;
-        exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;
-      }
-      else if ( exc->GS.freeVector.y == 0x4000 )
-      {
-        exc->func_move      = (TT_Move_Func)Direct_Move_Y;
-        exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;
-      }
-    }
-
-    /* at small sizes, F_dot_P can become too small, resulting   */
-    /* in overflows and `spikes' in a number of glyphs like `w'. */
-
-    if ( FT_ABS( exc->F_dot_P ) < 0x400L )
-      exc->F_dot_P = 0x4000L;
-
     /* Disable cached aspect ratio */
     exc->tt_metrics.ratio = 0;
   }
@@ -2799,7 +2564,7 @@
   Ins_ODD( TT_ExecContext  exc,
            FT_Long*        args )
   {
-    args[0] = ( ( exc->func_round( exc, args[0], 3 ) & 127 ) == 64 );
+    args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 64 ) == 64 );
   }
 
 
@@ -2813,7 +2578,7 @@
   Ins_EVEN( TT_ExecContext  exc,
             FT_Long*        args )
   {
-    args[0] = ( ( exc->func_round( exc, args[0], 3 ) & 127 ) == 0 );
+    args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 64 ) == 0 );
   }
 
 
@@ -3020,7 +2785,7 @@
         FT_MEM_QRENEW_ARRAY( exc->glyfStorage,
                              exc->glyfStoreSize,
                              exc->storeSize );
-        exc->error  = error;
+        exc->error = error;
         if ( error )
           return;
 
@@ -3143,7 +2908,8 @@
   Ins_ROUND( TT_ExecContext  exc,
              FT_Long*        args )
   {
-    args[0] = exc->func_round( exc, args[0], exc->opcode & 3 );
+    args[0] = exc->func_round( exc, args[0],
+                               exc->GS.compensation[exc->opcode & 3] );
   }
 
 
@@ -3157,7 +2923,8 @@
   Ins_NROUND( TT_ExecContext  exc,
               FT_Long*        args )
   {
-    args[0] = Round_None( exc, args[0], exc->opcode & 3 );
+    args[0] = Round_None( exc, args[0],
+                          exc->GS.compensation[exc->opcode & 3] );
   }
 
 
@@ -3211,13 +2978,11 @@
     }
     else
     {
-      K = exc->stack[exc->args - L];
+      K = args[-L];
 
-      FT_ARRAY_MOVE( &exc->stack[exc->args - L    ],
-                     &exc->stack[exc->args - L + 1],
-                     ( L - 1 ) );
+      FT_ARRAY_MOVE( args - L, args - L + 1, L - 1 );
 
-      exc->stack[exc->args - 1] = K;
+      args[-1] = K;
     }
   }
 
@@ -3244,7 +3009,7 @@
       args[0] = 0;
     }
     else
-      args[0] = exc->stack[exc->args - L];
+      args[0] = args[-L];
   }
 
 
@@ -3314,8 +3079,7 @@
         exc->length = 2 - exc->length * exc->code[exc->IP + 1];
       }
 
-      if ( exc->IP + exc->length <= exc->codeSize )
-        return SUCCESS;
+      return SUCCESS;
     }
 
   Fail_Overflow:
@@ -3363,6 +3127,9 @@
         nIfs--;
         Out = FT_BOOL( nIfs == 0 );
         break;
+
+      default:
+        break;
       }
     } while ( Out == 0 );
   }
@@ -3396,6 +3163,9 @@
       case 0x59:    /* EIF */
         nIfs--;
         break;
+
+      default:
+        break;
       }
     } while ( nIfs != 0 );
   }
@@ -3439,7 +3209,7 @@
       return;
     }
 
-    exc->step_ins = FALSE;
+    exc->length = 0;
 
     if ( args[0] < 0 )
     {
@@ -3540,10 +3310,10 @@
       return;
     }
 
-    rec->range          = exc->curRange;
-    rec->opc            = (FT_UInt16)n;
-    rec->start          = exc->IP + 1;
-    rec->active         = TRUE;
+    rec->range  = exc->curRange;
+    rec->opc    = (FT_UInt16)n;
+    rec->start  = exc->IP + 1;
+    rec->active = TRUE;
 
     if ( n > exc->maxFunc )
       exc->maxFunc = (FT_UInt16)n;
@@ -3555,14 +3325,17 @@
     {
       switch ( exc->opcode )
       {
-      case 0x89:    /* IDEF */
-      case 0x2C:    /* FDEF */
+      case 0x89:   /* IDEF */
+      case 0x2C:   /* FDEF */
         exc->error = FT_THROW( Nested_DEFS );
         return;
 
       case 0x2D:   /* ENDF */
         rec->end = exc->IP;
         return;
+
+      default:
+        break;
       }
     }
   }
@@ -3592,12 +3365,11 @@
 
     pRec->Cur_Count--;
 
-    exc->step_ins = FALSE;
-
     if ( pRec->Cur_Count > 0 )
     {
       exc->callTop++;
-      exc->IP = pRec->Def->start;
+      exc->IP     = pRec->Def->start;
+      exc->length = 0;
     }
     else
       /* Loop through the current function */
@@ -3685,8 +3457,6 @@
 
     Ins_Goto_CodeRange( exc, def->range, def->start );
 
-    exc->step_ins = FALSE;
-
     return;
 
   Fail:
@@ -3764,8 +3534,6 @@
 
       Ins_Goto_CodeRange( exc, def->range, def->start );
 
-      exc->step_ins = FALSE;
-
       exc->loopcall_counter += (FT_ULong)args[0];
       if ( exc->loopcall_counter > exc->loopcall_counter_max )
         exc->error = FT_THROW( Execution_Too_Long );
@@ -3845,9 +3613,13 @@
       case 0x2C:   /* FDEF */
         exc->error = FT_THROW( Nested_DEFS );
         return;
+
       case 0x2D:   /* ENDF */
         def->end = exc->IP;
         return;
+
+      default:
+        break;
       }
     }
   }
@@ -3870,10 +3642,23 @@
   Ins_NPUSHB( TT_ExecContext  exc,
               FT_Long*        args )
   {
-    FT_UShort  L, K;
+    FT_Long  IP = exc->IP;
+    FT_Int   L, K;
 
 
-    L = (FT_UShort)exc->code[exc->IP + 1];
+    if ( ++IP >= exc->codeSize )
+    {
+      exc->error = FT_THROW( Code_Overflow );
+      return;
+    }
+
+    L = exc->code[IP];
+
+    if ( IP + L >= exc->codeSize )
+    {
+      exc->error = FT_THROW( Code_Overflow );
+      return;
+    }
 
     if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) )
     {
@@ -3881,10 +3666,11 @@
       return;
     }
 
-    for ( K = 1; K <= L; K++ )
-      args[K - 1] = exc->code[exc->IP + K + 1];
+    for ( K = 0; K < L; K++ )
+      args[K] = exc->code[++IP];
 
     exc->new_top += L;
+    exc->IP       = IP;
   }
 
 
@@ -3898,10 +3684,23 @@
   Ins_NPUSHW( TT_ExecContext  exc,
               FT_Long*        args )
   {
-    FT_UShort  L, K;
+    FT_Long  IP = exc->IP;
+    FT_Int   L, K;
 
 
-    L = (FT_UShort)exc->code[exc->IP + 1];
+    if ( ++IP >= exc->codeSize )
+    {
+      exc->error = FT_THROW( Code_Overflow );
+      return;
+    }
+
+    L = exc->code[IP];
+
+    if ( IP + 2 * L >= exc->codeSize )
+    {
+      exc->error = FT_THROW( Code_Overflow );
+      return;
+    }
 
     if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) )
     {
@@ -3909,13 +3708,12 @@
       return;
     }
 
-    exc->IP += 2;
-
-    for ( K = 0; K < L; K++ )
-      args[K] = GetShortIns( exc );
+    /* note casting for sign-extension */
+    for ( K = 0; K < L; K++, IP += 2 )
+      args[K] = (FT_Short)( exc->code[IP + 1] << 8 ) | exc->code[IP + 2];
 
-    exc->step_ins = FALSE;
     exc->new_top += L;
+    exc->IP       = IP;
   }
 
 
@@ -3929,10 +3727,17 @@
   Ins_PUSHB( TT_ExecContext  exc,
              FT_Long*        args )
   {
-    FT_UShort  L, K;
+    FT_Long  IP = exc->IP;
+    FT_Int   L, K;
 
 
-    L = (FT_UShort)( exc->opcode - 0xB0 + 1 );
+    L = exc->opcode - 0xB0 + 1;
+
+    if ( IP + L >= exc->codeSize )
+    {
+      exc->error = FT_THROW( Code_Overflow );
+      return;
+    }
 
     if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) )
     {
@@ -3940,8 +3745,10 @@
       return;
     }
 
-    for ( K = 1; K <= L; K++ )
-      args[K - 1] = exc->code[exc->IP + K];
+    for ( K = 0; K < L; K++ )
+      args[K] = exc->code[++IP];
+
+    exc->IP = IP;
   }
 
 
@@ -3955,10 +3762,17 @@
   Ins_PUSHW( TT_ExecContext  exc,
              FT_Long*        args )
   {
-    FT_UShort  L, K;
+    FT_Long  IP = exc->IP;
+    FT_Int   L, K;
 
 
-    L = (FT_UShort)( exc->opcode - 0xB8 + 1 );
+    L = exc->opcode - 0xB8 + 1;
+
+    if ( IP + 2 * L >= exc->codeSize )
+    {
+      exc->error = FT_THROW( Code_Overflow );
+      return;
+    }
 
     if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) )
     {
@@ -3966,12 +3780,11 @@
       return;
     }
 
-    exc->IP++;
-
-    for ( K = 0; K < L; K++ )
-      args[K] = GetShortIns( exc );
+    /* note casting for sign-extension */
+    for ( K = 0; K < L; K++, IP += 2 )
+      args[K] = (FT_Short)( exc->code[IP + 1] << 8 ) | exc->code[IP + 2];
 
-    exc->step_ins = FALSE;
+    exc->IP = IP;
   }
 
 
@@ -4142,15 +3955,12 @@
   Ins_SPVFS( TT_ExecContext  exc,
              FT_Long*        args )
   {
-    FT_Short  S;
     FT_Long   X, Y;
 
 
     /* Only use low 16bits, then sign extend */
-    S = (FT_Short)args[1];
-    Y = (FT_Long)S;
-    S = (FT_Short)args[0];
-    X = (FT_Long)S;
+    Y = (FT_Short)args[1];
+    X = (FT_Short)args[0];
 
     Normalize( X, Y, &exc->GS.projVector );
 
@@ -4169,15 +3979,12 @@
   Ins_SFVFS( TT_ExecContext  exc,
              FT_Long*        args )
   {
-    FT_Short  S;
     FT_Long   X, Y;
 
 
     /* Only use low 16bits, then sign extend */
-    S = (FT_Short)args[1];
-    Y = (FT_Long)S;
-    S = (FT_Short)args[0];
-    X = S;
+    Y = (FT_Short)args[1];
+    X = (FT_Short)args[0];
 
     Normalize( X, Y, &exc->GS.freeVector );
     Compute_Funcs( exc );
@@ -4915,7 +4722,7 @@
       /* compatibility hacks and lets them program points to the grid like */
       /* it's 1996.  They might sign a waiver for just one glyph, though.  */
       if ( SUBPIXEL_HINTING_MINIMAL )
-        exc->backward_compatibility = !FT_BOOL( L == 4 );
+        exc->backward_compatibility = ( L & 4 ) ^ 4;
 #endif
     }
     else if ( exc->pedantic_hinting )
@@ -4999,32 +4806,31 @@
    * Stack:        uint32... -->
    */
   static void
-  Ins_FLIPPT( TT_ExecContext  exc )
+  Ins_FLIPPT( TT_ExecContext  exc,
+              FT_Long*        args )
   {
+    FT_Long    loop = exc->GS.loop;
     FT_UShort  point;
 
 
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    /* See `ttinterp.h' for details on backward compatibility mode. */
-    if ( SUBPIXEL_HINTING_MINIMAL    &&
-         exc->backward_compatibility &&
-         exc->iupx_called            &&
-         exc->iupy_called            )
-      goto Fail;
-#endif
-
-    if ( exc->top < exc->GS.loop )
+    if ( exc->new_top < loop )
     {
       if ( exc->pedantic_hinting )
         exc->error = FT_THROW( Too_Few_Arguments );
       goto Fail;
     }
 
-    while ( exc->GS.loop > 0 )
-    {
-      exc->args--;
+    exc->new_top -= loop;
 
-      point = (FT_UShort)exc->stack[exc->args];
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    /* See `ttinterp.h' for details on backward compatibility mode. */
+    if ( exc->backward_compatibility == 0x7 )
+      goto Fail;
+#endif
+
+    while ( loop-- )
+    {
+      point = (FT_UShort)*(--args);
 
       if ( BOUNDS( point, exc->pts.n_points ) )
       {
@@ -5036,13 +4842,10 @@
       }
       else
         exc->pts.tags[point] ^= FT_CURVE_TAG_ON;
-
-      exc->GS.loop--;
     }
 
   Fail:
     exc->GS.loop = 1;
-    exc->new_top = exc->args;
   }
 
 
@@ -5061,10 +4864,7 @@
 
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
     /* See `ttinterp.h' for details on backward compatibility mode. */
-    if ( SUBPIXEL_HINTING_MINIMAL    &&
-         exc->backward_compatibility &&
-         exc->iupx_called            &&
-         exc->iupy_called            )
+    if ( exc->backward_compatibility == 0x7 )
       return;
 #endif
 
@@ -5099,10 +4899,7 @@
 
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
     /* See `ttinterp.h' for details on backward compatibility mode. */
-    if ( SUBPIXEL_HINTING_MINIMAL    &&
-         exc->backward_compatibility &&
-         exc->iupx_called            &&
-         exc->iupy_called            )
+    if ( exc->backward_compatibility == 0x7 )
       return;
 #endif
 
@@ -5158,8 +4955,8 @@
 
     d = PROJECT( zp.cur + p, zp.org + p );
 
-    *x = FT_MulDiv( d, (FT_Long)exc->GS.freeVector.x, exc->F_dot_P );
-    *y = FT_MulDiv( d, (FT_Long)exc->GS.freeVector.y, exc->F_dot_P );
+    *x = FT_MulFix( d, exc->moveVector.x );
+    *y = FT_MulFix( d, exc->moveVector.y );
 
     return SUCCESS;
   }
@@ -5176,8 +4973,8 @@
     if ( exc->GS.freeVector.x != 0 )
     {
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-      if ( !( SUBPIXEL_HINTING_MINIMAL    &&
-              exc->backward_compatibility ) )
+      /* See `ttinterp.h' for details on backward compatibility mode. */
+      if ( !exc->backward_compatibility )
 #endif
         exc->zp2.cur[point].x = ADD_LONG( exc->zp2.cur[point].x, dx );
 
@@ -5188,10 +4985,8 @@
     if ( exc->GS.freeVector.y != 0 )
     {
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-      if ( !( SUBPIXEL_HINTING_MINIMAL    &&
-              exc->backward_compatibility &&
-              exc->iupx_called            &&
-              exc->iupy_called            ) )
+      /* See `ttinterp.h' for details on backward compatibility mode. */
+      if ( exc->backward_compatibility != 0x7 )
 #endif
         exc->zp2.cur[point].y = ADD_LONG( exc->zp2.cur[point].y, dy );
 
@@ -5208,8 +5003,10 @@
    * Stack:        uint32... -->
    */
   static void
-  Ins_SHP( TT_ExecContext  exc )
+  Ins_SHP( TT_ExecContext  exc,
+           FT_Long*        args )
   {
+    FT_Long          loop = exc->GS.loop;
     TT_GlyphZoneRec  zp;
     FT_UShort        refp;
 
@@ -5217,20 +5014,21 @@
     FT_UShort        point;
 
 
-    if ( exc->top < exc->GS.loop )
+    if ( exc->new_top < loop )
     {
       if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
+        exc->error = FT_THROW( Too_Few_Arguments );
       goto Fail;
     }
 
+    exc->new_top -= loop;
+
     if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) )
       return;
 
-    while ( exc->GS.loop > 0 )
+    while ( loop-- )
     {
-      exc->args--;
-      point = (FT_UShort)exc->stack[exc->args];
+      point = (FT_UShort)*(--args);
 
       if ( BOUNDS( point, exc->zp2.n_points ) )
       {
@@ -5242,13 +5040,10 @@
       }
       else
         Move_Zp2_Point( exc, point, dx, dy, TRUE );
-
-      exc->GS.loop--;
     }
 
   Fail:
     exc->GS.loop = 1;
-    exc->new_top = exc->args;
   }
 
 
@@ -5364,6 +5159,7 @@
   Ins_SHPIX( TT_ExecContext  exc,
              FT_Long*        args )
   {
+    FT_Long     loop = exc->GS.loop;
     FT_F26Dot6  dx, dy;
     FT_UShort   point;
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
@@ -5373,22 +5169,21 @@
 #endif
 
 
-
-    if ( exc->top < exc->GS.loop + 1 )
+    if ( exc->new_top < loop )
     {
       if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
+        exc->error = FT_THROW( Too_Few_Arguments );
       goto Fail;
     }
 
+    exc->new_top -= loop;
+
     dx = TT_MulFix14( args[0], exc->GS.freeVector.x );
     dy = TT_MulFix14( args[0], exc->GS.freeVector.y );
 
-    while ( exc->GS.loop > 0 )
+    while ( loop-- )
     {
-      exc->args--;
-
-      point = (FT_UShort)exc->stack[exc->args];
+      point = (FT_UShort)*(--args);
 
       if ( BOUNDS( point, exc->zp2.n_points ) )
       {
@@ -5400,8 +5195,7 @@
       }
       else
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-      if ( SUBPIXEL_HINTING_MINIMAL    &&
-           exc->backward_compatibility )
+      if ( exc->backward_compatibility )
       {
         /* Special case: allow SHPIX to move points in the twilight zone.  */
         /* Otherwise, treat SHPIX the same as DELTAP.  Unbreaks various    */
@@ -5409,7 +5203,7 @@
         /* that would glitch severely after calling ALIGNRP after a        */
         /* blocked SHPIX.                                                  */
         if ( in_twilight                                                ||
-             ( !( exc->iupx_called && exc->iupy_called )              &&
+             ( exc->backward_compatibility != 0x7                     &&
                ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) ||
                  ( exc->zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y )    ) ) )
           Move_Zp2_Point( exc, point, 0, dy, TRUE );
@@ -5417,13 +5211,10 @@
       else
 #endif
         Move_Zp2_Point( exc, point, dx, dy, TRUE );
-
-      exc->GS.loop--;
     }
 
   Fail:
     exc->GS.loop = 1;
-    exc->new_top = exc->args;
   }
 
 
@@ -5502,7 +5293,7 @@
     if ( ( exc->opcode & 1 ) != 0 )
     {
       cur_dist = FAST_PROJECT( &exc->zp0.cur[point] );
-      distance = SUB_LONG( exc->func_round( exc, cur_dist, 3 ), cur_dist );
+      distance = SUB_LONG( exc->func_round( exc, cur_dist, 0 ), cur_dist );
     }
     else
       distance = 0;
@@ -5566,7 +5357,7 @@
     if ( exc->GS.gep0 == 0 )   /* If in twilight zone */
     {
       exc->zp0.org[point].x = TT_MulFix14( distance,
-                                             exc->GS.freeVector.x );
+                                           exc->GS.freeVector.x );
       exc->zp0.org[point].y = TT_MulFix14( distance,
                                            exc->GS.freeVector.y );
       exc->zp0.cur[point]   = exc->zp0.org[point];
@@ -5587,7 +5378,7 @@
       if ( delta > control_value_cutin )
         distance = org_dist;
 
-      distance = exc->func_round( exc, distance, 3 );
+      distance = exc->func_round( exc, distance, 0 );
     }
 
     exc->func_move( exc, &exc->zp0, point, SUB_LONG( distance, org_dist ) );
@@ -5609,7 +5400,7 @@
             FT_Long*        args )
   {
     FT_UShort   point = 0;
-    FT_F26Dot6  org_dist, distance;
+    FT_F26Dot6  org_dist, distance, compensation;
 
 
     point = (FT_UShort)args[0];
@@ -5664,11 +5455,11 @@
     /* single width cut-in test */
 
     /* |org_dist - single_width_value| < single_width_cutin */
-    if ( exc->GS.single_width_cutin > 0          &&
-         org_dist < exc->GS.single_width_value +
-                      exc->GS.single_width_cutin &&
-         org_dist > exc->GS.single_width_value -
-                      exc->GS.single_width_cutin )
+    if ( exc->GS.single_width_cutin > 0                    &&
+         org_dist < ADD_LONG( exc->GS.single_width_value,
+                              exc->GS.single_width_cutin ) &&
+         org_dist > SUB_LONG( exc->GS.single_width_value,
+                              exc->GS.single_width_cutin ) )
     {
       if ( org_dist >= 0 )
         org_dist = exc->GS.single_width_value;
@@ -5678,12 +5469,12 @@
 
     /* round flag */
 
+    compensation = exc->GS.compensation[exc->opcode & 3];
+
     if ( ( exc->opcode & 4 ) != 0 )
-    {
-      distance = exc->func_round( exc, org_dist, exc->opcode & 3 );
-    }
+      distance = exc->func_round( exc, org_dist, compensation );
     else
-      distance = Round_None( exc, org_dist, exc->opcode & 3 );
+      distance = Round_None( exc, org_dist, compensation );
 
     /* minimum distance flag */
 
@@ -5735,7 +5526,8 @@
     FT_F26Dot6  cvt_dist,
                 distance,
                 cur_dist,
-                org_dist;
+                org_dist,
+                compensation;
 
     FT_F26Dot6  delta;
 
@@ -5801,6 +5593,8 @@
 
     /* control value cut-in and round */
 
+    compensation = exc->GS.compensation[exc->opcode & 3];
+
     if ( ( exc->opcode & 4 ) != 0 )
     {
       /* XXX: UNDOCUMENTED!  Only perform cut-in test when both points */
@@ -5831,16 +5625,16 @@
           cvt_dist = org_dist;
       }
 
-      distance = exc->func_round( exc, cvt_dist, exc->opcode & 3 );
+      distance = exc->func_round( exc, cvt_dist, compensation );
     }
     else
-      distance = Round_None( exc, cvt_dist, exc->opcode & 3 );
+      distance = Round_None( exc, cvt_dist, compensation );
 
     /* minimum distance test */
 
     if ( ( exc->opcode & 8 ) != 0 )
     {
-      FT_F26Dot6  minimum_distance    = exc->GS.minimum_distance;
+      FT_F26Dot6  minimum_distance = exc->GS.minimum_distance;
 
 
       if ( org_dist >= 0 )
@@ -5862,11 +5656,10 @@
 
   Fail:
     exc->GS.rp1 = exc->GS.rp0;
+    exc->GS.rp2 = point;
 
     if ( ( exc->opcode & 16 ) != 0 )
       exc->GS.rp0 = point;
-
-    exc->GS.rp2 = point;
   }
 
 
@@ -5877,25 +5670,33 @@
    * Stack:        uint32 uint32... -->
    */
   static void
-  Ins_ALIGNRP( TT_ExecContext  exc )
+  Ins_ALIGNRP( TT_ExecContext  exc,
+               FT_Long*        args )
   {
+    FT_Long     loop = exc->GS.loop;
     FT_UShort   point;
     FT_F26Dot6  distance;
 
 
-    if ( exc->top < exc->GS.loop                  ||
-         BOUNDS( exc->GS.rp0, exc->zp0.n_points ) )
+    if ( exc->new_top < loop )
     {
       if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
+        exc->error = FT_THROW( Too_Few_Arguments );
       goto Fail;
     }
 
-    while ( exc->GS.loop > 0 )
+    exc->new_top -= loop;
+
+    if ( BOUNDS( exc->GS.rp0, exc->zp0.n_points ) )
     {
-      exc->args--;
+      if ( exc->pedantic_hinting )
+        exc->error = FT_THROW( Invalid_Reference );
+      goto Fail;
+    }
 
-      point = (FT_UShort)exc->stack[exc->args];
+    while ( loop-- )
+    {
+      point = (FT_UShort)*(--args);
 
       if ( BOUNDS( point, exc->zp1.n_points ) )
       {
@@ -5912,13 +5713,10 @@
 
         exc->func_move( exc, &exc->zp1, point, NEG_LONG( distance ) );
       }
-
-      exc->GS.loop--;
     }
 
   Fail:
     exc->GS.loop = 1;
-    exc->new_top = exc->args;
   }
 
 
@@ -6060,15 +5858,26 @@
   /* SOMETIMES, DUMBER CODE IS BETTER CODE */
 
   static void
-  Ins_IP( TT_ExecContext  exc )
+  Ins_IP( TT_ExecContext  exc,
+          FT_Long*        args )
   {
+    FT_Long     loop = exc->GS.loop;
     FT_F26Dot6  old_range, cur_range;
     FT_Vector*  orus_base;
     FT_Vector*  cur_base;
     FT_Int      twilight;
 
 
-    if ( exc->top < exc->GS.loop )
+    if ( exc->new_top < loop )
+    {
+      if ( exc->pedantic_hinting )
+        exc->error = FT_THROW( Too_Few_Arguments );
+      goto Fail;
+    }
+
+    exc->new_top -= loop;
+
+    if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) )
     {
       if ( exc->pedantic_hinting )
         exc->error = FT_THROW( Invalid_Reference );
@@ -6084,13 +5893,6 @@
                  exc->GS.gep1 == 0 ||
                  exc->GS.gep2 == 0 );
 
-    if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      goto Fail;
-    }
-
     if ( twilight )
       orus_base = &exc->zp0.org[exc->GS.rp1];
     else
@@ -6102,8 +5904,7 @@
     /*      fonts out there (e.g. [aeu]grave in monotype.ttf)   */
     /*      calling IP[] with bad values of rp[12].             */
     /*      Do something sane when this odd thing happens.      */
-    if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) ||
-         BOUNDS( exc->GS.rp2, exc->zp1.n_points ) )
+    if ( BOUNDS( exc->GS.rp2, exc->zp1.n_points ) )
     {
       old_range = 0;
       cur_range = 0;
@@ -6132,9 +5933,9 @@
       cur_range = PROJECT( &exc->zp1.cur[exc->GS.rp2], cur_base );
     }
 
-    for ( ; exc->GS.loop > 0; exc->GS.loop-- )
+    while ( loop-- )
     {
-      FT_UInt     point = (FT_UInt)exc->stack[--exc->args];
+      FT_UInt     point = (FT_UInt)*(--args);
       FT_F26Dot6  org_dist, cur_dist, new_dist;
 
 
@@ -6206,7 +6007,6 @@
 
   Fail:
     exc->GS.loop = 1;
-    exc->new_top = exc->args;
   }
 
 
@@ -6405,17 +6205,10 @@
     /* See `ttinterp.h' for details on backward compatibility mode.  */
     /* Allow IUP until it has been called on both axes.  Immediately */
     /* return on subsequent ones.                                    */
-    if ( SUBPIXEL_HINTING_MINIMAL    &&
-         exc->backward_compatibility )
-    {
-      if ( exc->iupx_called && exc->iupy_called )
-        return;
-
-      if ( exc->opcode & 1 )
-        exc->iupx_called = TRUE;
-      else
-        exc->iupy_called = TRUE;
-    }
+    if ( exc->backward_compatibility == 0x7 )
+      return;
+    else if ( exc->backward_compatibility )
+      exc->backward_compatibility |= 1 << ( exc->opcode & 1 );
 #endif
 
     /* ignore empty outlines */
@@ -6507,30 +6300,50 @@
   Ins_DELTAP( TT_ExecContext  exc,
               FT_Long*        args )
   {
-    FT_ULong   nump, k;
+    FT_Long    nump;
     FT_UShort  A;
-    FT_ULong   C, P;
-    FT_Long    B;
+    FT_Long    B, P, F;
 
 
-    P    = (FT_ULong)exc->func_cur_ppem( exc );
-    nump = (FT_ULong)args[0];   /* some points theoretically may occur more
-                                   than once, thus UShort isn't enough */
+    nump = args[0];  /* signed value for convenience */
 
-    for ( k = 1; k <= nump; k++ )
+    if ( nump < 0 || nump > exc->new_top / 2 )
     {
-      if ( exc->args < 2 )
-      {
-        if ( exc->pedantic_hinting )
-          exc->error = FT_THROW( Too_Few_Arguments );
-        exc->args = 0;
-        goto Fail;
-      }
+      if ( exc->pedantic_hinting )
+        exc->error = FT_THROW( Too_Few_Arguments );
 
-      exc->args -= 2;
+      nump = exc->new_top / 2;
+    }
+
+    exc->new_top -= 2 * nump;
+
+    P = exc->func_cur_ppem( exc ) - exc->GS.delta_base;
 
-      A = (FT_UShort)exc->stack[exc->args + 1];
-      B = exc->stack[exc->args];
+    switch ( exc->opcode )
+    {
+    case 0x5D:
+      break;
+
+    case 0x71:
+      P -= 16;
+      break;
+
+    case 0x72:
+      P -= 32;
+      break;
+    }
+
+    /* check applicable range of adjusted ppem */
+    if ( P & ~0xF )         /* P < 0 || P > 15 */
+      return;
+
+    P <<= 4;
+    F   = 1L << ( 6 - exc->GS.delta_shift );
+
+    while ( nump-- )
+    {
+      A = (FT_UShort)*(--args);
+      B = *(--args);
 
       /* XXX: Because some popular fonts contain some invalid DeltaP */
       /*      instructions, we simply ignore them when the stacked   */
@@ -6538,41 +6351,28 @@
       /*      error.  As a delta instruction doesn't change a glyph  */
       /*      in great ways, this shouldn't be a problem.            */
 
-      if ( !BOUNDS( A, exc->zp0.n_points ) )
+      if ( BOUNDS( A, exc->zp0.n_points ) )
       {
-        C = ( (FT_ULong)B & 0xF0 ) >> 4;
-
-        switch ( exc->opcode )
+        if ( exc->pedantic_hinting )
         {
-        case 0x5D:
-          break;
-
-        case 0x71:
-          C += 16;
-          break;
-
-        case 0x72:
-          C += 32;
-          break;
+          exc->error = FT_THROW( Invalid_Reference );
+          return;
         }
-
-        C += exc->GS.delta_base;
-
-        if ( P == C )
+      }
+      else
+      {
+        if ( ( B & 0xF0 ) == P )
         {
-          B = ( (FT_ULong)B & 0xF ) - 8;
+          B = ( B & 0xF ) - 8;
           if ( B >= 0 )
             B++;
-          B *= 1L << ( 6 - exc->GS.delta_shift );
-
+          B *= F;
 
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-          /* See `ttinterp.h' for details on backward compatibility */
-          /* mode.                                                  */
-          if ( SUBPIXEL_HINTING_MINIMAL    &&
-               exc->backward_compatibility )
+          /* See `ttinterp.h' for details on backward compatibility mode. */
+          if ( exc->backward_compatibility )
           {
-            if ( !( exc->iupx_called && exc->iupy_called )              &&
+            if ( exc->backward_compatibility != 0x7                     &&
                  ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) ||
                    ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y )        ) )
               exc->func_move( exc, &exc->zp0, A, B );
@@ -6582,13 +6382,7 @@
             exc->func_move( exc, &exc->zp0, A, B );
         }
       }
-      else
-        if ( exc->pedantic_hinting )
-          exc->error = FT_THROW( Invalid_Reference );
     }
-
-  Fail:
-    exc->new_top = exc->args;
   }
 
 
@@ -6602,28 +6396,50 @@
   Ins_DELTAC( TT_ExecContext  exc,
               FT_Long*        args )
   {
-    FT_ULong  nump, k;
-    FT_ULong  A, C, P;
-    FT_Long   B;
+    FT_Long   nump;
+    FT_ULong  A;
+    FT_Long   B, P, F;
 
 
-    P    = (FT_ULong)exc->func_cur_ppem( exc );
-    nump = (FT_ULong)args[0];
+    nump = args[0];  /* signed value for convenience */
 
-    for ( k = 1; k <= nump; k++ )
+    if ( nump < 0 || nump > exc->new_top / 2 )
     {
-      if ( exc->args < 2 )
-      {
-        if ( exc->pedantic_hinting )
-          exc->error = FT_THROW( Too_Few_Arguments );
-        exc->args = 0;
-        goto Fail;
-      }
+      if ( exc->pedantic_hinting )
+        exc->error = FT_THROW( Too_Few_Arguments );
 
-      exc->args -= 2;
+      nump = exc->new_top / 2;
+    }
+
+    exc->new_top -= 2 * nump;
+
+    P = exc->func_cur_ppem( exc ) - exc->GS.delta_base;
 
-      A = (FT_ULong)exc->stack[exc->args + 1];
-      B = exc->stack[exc->args];
+    switch ( exc->opcode )
+    {
+    case 0x73:
+      break;
+
+    case 0x74:
+      P -= 16;
+      break;
+
+    case 0x75:
+      P -= 32;
+      break;
+    }
+
+    /* check applicable range of adjusted ppem */
+    if ( P & ~0xF )         /* P < 0 || P > 15 */
+      return;
+
+    P <<= 4;
+    F   = 1L << ( 6 - exc->GS.delta_shift );
+
+    while ( nump-- )
+    {
+      A = (FT_ULong)*(--args);
+      B = *(--args);
 
       if ( BOUNDSL( A, exc->cvtSize ) )
       {
@@ -6635,38 +6451,17 @@
       }
       else
       {
-        C = ( (FT_ULong)B & 0xF0 ) >> 4;
-
-        switch ( exc->opcode )
+        if ( ( B & 0xF0 ) == P )
         {
-        case 0x73:
-          break;
-
-        case 0x74:
-          C += 16;
-          break;
-
-        case 0x75:
-          C += 32;
-          break;
-        }
-
-        C += exc->GS.delta_base;
-
-        if ( P == C )
-        {
-          B = ( (FT_ULong)B & 0xF ) - 8;
+          B = ( B & 0xF ) - 8;
           if ( B >= 0 )
             B++;
-          B *= 1L << ( 6 - exc->GS.delta_shift );
+          B *= F;
 
           exc->func_move_cvt( exc, A, B );
         }
       }
     }
-
-  Fail:
-    exc->new_top = exc->args;
   }
 
 
@@ -6736,7 +6531,7 @@
     /* Otherwise, instructions may behave weirdly and rendering results */
     /* may differ between v35 and v40 mode, e.g., in `Times New Roman   */
     /* Bold Italic'. */
-    if ( SUBPIXEL_HINTING_MINIMAL && exc->subpixel_hinting_lean )
+    if ( SUBPIXEL_HINTING_MINIMAL && exc->mode != FT_RENDER_MODE_MONO )
     {
       /*********************************
        * HINTING FOR SUBPIXEL
@@ -6753,7 +6548,7 @@
        * Selector Bit:  8
        * Return Bit(s): 15
        */
-      if ( ( args[0] & 256 ) != 0 && exc->vertical_lcd_lean )
+      if ( ( args[0] & 256 ) != 0 && exc->mode == FT_RENDER_MODE_LCD_V )
         K |= 1 << 15;
 
       /*********************************
@@ -6774,7 +6569,7 @@
        * The only smoothing method FreeType supports unless someone sets
        * FT_LOAD_TARGET_MONO.
        */
-      if ( ( args[0] & 2048 ) != 0 && exc->subpixel_hinting_lean )
+      if ( ( args[0] & 2048 ) != 0 && exc->mode != FT_RENDER_MODE_MONO )
         K |= 1 << 18;
 
       /*********************************
@@ -6786,7 +6581,10 @@
        * Grayscale rendering is what FreeType does anyway unless someone
        * sets FT_LOAD_TARGET_MONO or FT_LOAD_TARGET_LCD(_V)
        */
-      if ( ( args[0] & 4096 ) != 0 && exc->grayscale_cleartype )
+      if ( ( args[0] & 4096 ) != 0           &&
+           exc->mode != FT_RENDER_MODE_MONO  &&
+           exc->mode != FT_RENDER_MODE_LCD   &&
+           exc->mode != FT_RENDER_MODE_LCD_V )
         K |= 1 << 19;
     }
 #endif
@@ -6833,6 +6631,8 @@
       for ( i = 0; i < num_axes; i++ )
         args[i] = 0;
     }
+
+    exc->new_top += num_axes;
   }
 
 
@@ -6883,7 +6683,6 @@
 
         Ins_Goto_CodeRange( exc, def->range, def->start );
 
-        exc->step_ins = FALSE;
         return;
       }
     }
@@ -6928,96 +6727,22 @@
   TT_RunIns( void*  exec )
   {
     TT_ExecContext  exc = (TT_ExecContext)exec;
+    FT_ULong        ins_counter = 0;
 
-    FT_ULong   ins_counter = 0;  /* executed instructions counter */
-    FT_ULong   num_twilight_points;
-    FT_UShort  i;
-
-
-    /* We restrict the number of twilight points to a reasonable,     */
-    /* heuristic value to avoid slow execution of malformed bytecode. */
-    num_twilight_points = FT_MAX( 30,
-                                  2 * ( exc->pts.n_points + exc->cvtSize ) );
-    if ( exc->twilight.n_points > num_twilight_points )
-    {
-      if ( num_twilight_points > 0xFFFFU )
-        num_twilight_points = 0xFFFFU;
-
-      FT_TRACE5(( "TT_RunIns: Resetting number of twilight points\n" ));
-      FT_TRACE5(( "           from %d to the more reasonable value %ld\n",
-                  exc->twilight.n_points,
-                  num_twilight_points ));
-      exc->twilight.n_points = (FT_UShort)num_twilight_points;
-    }
-
-    /* Set up loop detectors.  We restrict the number of LOOPCALL loops */
-    /* and the number of JMPR, JROT, and JROF calls with a negative     */
-    /* argument to values that depend on various parameters like the    */
-    /* size of the CVT table or the number of points in the current     */
-    /* glyph (if applicable).                                           */
-    /*                                                                  */
-    /* The idea is that in real-world bytecode you either iterate over  */
-    /* all CVT entries (in the `prep' table), or over all points (or    */
-    /* contours, in the `glyf' table) of a glyph, and such iterations   */
-    /* don't happen very often.                                         */
-    exc->loopcall_counter = 0;
-    exc->neg_jump_counter = 0;
-
-    /* The maximum values are heuristic. */
-    if ( exc->pts.n_points )
-      exc->loopcall_counter_max = FT_MAX( 50,
-                                          10 * exc->pts.n_points ) +
-                                  FT_MAX( 50,
-                                          exc->cvtSize / 10 );
-    else
-      exc->loopcall_counter_max = 300 + 22 * exc->cvtSize;
-
-    /* as a protection against an unreasonable number of CVT entries  */
-    /* we assume at most 100 control values per glyph for the counter */
-    if ( exc->loopcall_counter_max >
-         100 * (FT_ULong)exc->face->root.num_glyphs )
-      exc->loopcall_counter_max = 100 * (FT_ULong)exc->face->root.num_glyphs;
-
-    FT_TRACE5(( "TT_RunIns: Limiting total number of loops in LOOPCALL"
-                " to %ld\n", exc->loopcall_counter_max ));
-
-    exc->neg_jump_counter_max = exc->loopcall_counter_max;
-    FT_TRACE5(( "TT_RunIns: Limiting total number of backward jumps"
-                " to %ld\n", exc->neg_jump_counter_max ));
-
-    /* set PPEM and CVT functions */
-    exc->tt_metrics.ratio = 0;
-    if ( exc->metrics.x_ppem != exc->metrics.y_ppem )
-    {
-      /* non-square pixels, use the stretched routines */
-      exc->func_cur_ppem  = Current_Ppem_Stretched;
-      exc->func_read_cvt  = Read_CVT_Stretched;
-      exc->func_write_cvt = Write_CVT_Stretched;
-      exc->func_move_cvt  = Move_CVT_Stretched;
-    }
-    else
-    {
-      /* square pixels, use normal routines */
-      exc->func_cur_ppem  = Current_Ppem;
-      exc->func_read_cvt  = Read_CVT;
-      exc->func_write_cvt = Write_CVT;
-      exc->func_move_cvt  = Move_CVT;
-    }
-
-    exc->iniRange    = exc->curRange;
-
-    Compute_Funcs( exc );
-    Compute_Round( exc, (FT_Byte)exc->GS.round_state );
-
-    /* These flags cancel execution of some opcodes after IUP is called */
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    exc->iupx_called = FALSE;
-    exc->iupy_called = FALSE;
-#endif
 
     do
     {
+      /* increment instruction counter and check if we didn't */
+      /* run this program for too long (e.g. infinite loops). */
+      if ( ++ins_counter > TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES )
+      {
+        exc->error = FT_THROW( Execution_Too_Long );
+        goto LErrorLabel_;
+      }
+
+      exc->error  = FT_Err_Ok;
       exc->opcode = exc->code[exc->IP];
+      exc->length = 1;
 
 #ifdef FT_DEBUG_LEVEL_TRACE
       if ( ft_trace_levels[trace_ttinterp] >= 6 )
@@ -7041,17 +6766,6 @@
       }
 #endif /* FT_DEBUG_LEVEL_TRACE */
 
-      if ( ( exc->length = opcode_length[exc->opcode] ) < 0 )
-      {
-        if ( exc->IP + 1 >= exc->codeSize )
-          goto LErrorCodeOverflow_;
-
-        exc->length = 2 - exc->length * exc->code[exc->IP + 1];
-      }
-
-      if ( exc->IP + exc->length > exc->codeSize )
-        goto LErrorCodeOverflow_;
-
       /* First, let's check for empty stack and overflow */
       exc->args = exc->top - ( Pop_Push_Count[exc->opcode] >> 4 );
 
@@ -7059,6 +6773,9 @@
       /* One can also interpret it as the index of the last argument.    */
       if ( exc->args < 0 )
       {
+        FT_UShort  i;
+
+
         if ( exc->pedantic_hinting )
         {
           exc->error = FT_THROW( Too_Few_Arguments );
@@ -7071,21 +6788,7 @@
         exc->args = 0;
       }
 
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-      if ( exc->opcode == 0x91 )
-      {
-        /* this is very special: GETVARIATION returns */
-        /* a variable number of arguments             */
-
-        /* it is the job of the application to `activate' GX handling, */
-        /* that is, calling any of the GX API functions on the current */
-        /* font to select a variation instance                         */
-        if ( exc->face->blend )
-          exc->new_top = exc->args + exc->face->blend->num_axis;
-      }
-      else
-#endif
-        exc->new_top = exc->args + ( Pop_Push_Count[exc->opcode] & 15 );
+      exc->new_top = exc->args + ( Pop_Push_Count[exc->opcode] & 15 );
 
       /* `new_top' is the new top of the stack, after the instruction's */
       /* execution.  `top' will be set to `new_top' after the `switch'  */
@@ -7096,9 +6799,6 @@
         goto LErrorLabel_;
       }
 
-      exc->step_ins = TRUE;
-      exc->error    = FT_Err_Ok;
-
       {
         FT_Long*  args   = exc->stack + exc->args;
         FT_Byte   opcode = exc->opcode;
@@ -7281,7 +6981,7 @@
 
         case 0x32:  /* SHP */
         case 0x33:  /* SHP */
-          Ins_SHP( exc );
+          Ins_SHP( exc, args );
           break;
 
         case 0x34:  /* SHC */
@@ -7299,7 +6999,7 @@
           break;
 
         case 0x39:  /* IP    */
-          Ins_IP( exc );
+          Ins_IP( exc, args );
           break;
 
         case 0x3A:  /* MSIRP */
@@ -7308,7 +7008,7 @@
           break;
 
         case 0x3C:  /* AlignRP */
-          Ins_ALIGNRP( exc );
+          Ins_ALIGNRP( exc, args );
           break;
 
         case 0x3D:  /* RTDG */
@@ -7544,7 +7244,7 @@
           break;
 
         case 0x80:  /* FLIPPT */
-          Ins_FLIPPT( exc );
+          Ins_FLIPPT( exc, args );
           break;
 
         case 0x81:  /* FLIPRGON */
@@ -7642,13 +7342,13 @@
       {
         switch ( exc->error )
         {
-          /* looking for redefined instructions */
         case FT_ERR( Invalid_Opcode ):
           {
             TT_DefRecord*  def   = exc->IDefs;
             TT_DefRecord*  limit = FT_OFFSET( def, exc->numIDefs );
 
 
+            /* looking for redefined instructions */
             for ( ; def < limit; def++ )
             {
               if ( def->active && exc->opcode == (FT_Byte)def->opc )
@@ -7678,37 +7378,15 @@
               }
             }
           }
-
-          exc->error = FT_THROW( Invalid_Opcode );
-          goto LErrorLabel_;
-
-#if 0
-          break;   /* Unreachable code warning suppression.             */
-                   /* Leave to remind in case a later change the editor */
-                   /* to consider break;                                */
-#endif
+          FALL_THROUGH;
 
         default:
           goto LErrorLabel_;
-
-#if 0
-        break;
-#endif
         }
       }
 
       exc->top = exc->new_top;
-
-      if ( exc->step_ins )
-        exc->IP += exc->length;
-
-      /* increment instruction counter and check if we didn't */
-      /* run this program for too long (e.g. infinite loops). */
-      if ( ++ins_counter > TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES )
-      {
-        exc->error = FT_THROW( Execution_Too_Long );
-        goto LErrorLabel_;
-      }
+      exc->IP += exc->length;
 
     LSuiteLabel_:
       if ( exc->IP >= exc->codeSize )
@@ -7724,15 +7402,12 @@
     } while ( !exc->instruction_trap );
 
   LNo_Error_:
-    FT_TRACE4(( "  %ld instruction%s executed\n",
+    FT_TRACE4(( "  %lu instruction%s executed\n",
                 ins_counter,
                 ins_counter == 1 ? "" : "s" ));
 
     return FT_Err_Ok;
 
-  LErrorCodeOverflow_:
-    exc->error = FT_THROW( Code_Overflow );
-
   LErrorLabel_:
     if ( exc->error && !exc->instruction_trap )
       FT_TRACE1(( "  The interpreter returned error 0x%x\n", exc->error ));
@@ -7740,6 +7415,126 @@
     return exc->error;
   }
 
+
+  /**************************************************************************
+   *
+   * @Function:
+   *   TT_Run_Context
+   *
+   * @Description:
+   *   Executes one or more instructions in the execution context.
+   *
+   * @Input:
+   *   exec ::
+   *     A handle to the target execution context.
+   *
+   * @Return:
+   *   TrueType error code.  0 means success.
+   */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Run_Context( TT_ExecContext  exec,
+                  TT_Size         size )
+  {
+    FT_ULong   num_twilight_points;
+
+
+    exec->zp0 = exec->pts;
+    exec->zp1 = exec->pts;
+    exec->zp2 = exec->pts;
+
+    /* We restrict the number of twilight points to a reasonable,     */
+    /* heuristic value to avoid slow execution of malformed bytecode. */
+    /* The selected value is large enough to support fonts hinted     */
+    /* with `ttfautohint`, which uses twilight points to store        */
+    /* vertical coordinates of (auto-hinter) segments.                */
+    num_twilight_points = FT_MAX( 30,
+                                  2 * ( exec->pts.n_points + exec->cvtSize ) );
+    if ( exec->twilight.n_points > num_twilight_points )
+    {
+      if ( num_twilight_points > 0xFFFFU )
+        num_twilight_points = 0xFFFFU;
+
+      FT_TRACE5(( "TT_RunIns: Resetting number of twilight points\n" ));
+      FT_TRACE5(( "           from %d to the more reasonable value %lu\n",
+                  exec->twilight.n_points,
+                  num_twilight_points ));
+      exec->twilight.n_points = (FT_UShort)num_twilight_points;
+    }
+
+    /* Set up loop detectors.  We restrict the number of LOOPCALL loops */
+    /* and the number of JMPR, JROT, and JROF calls with a negative     */
+    /* argument to values that depend on various parameters like the    */
+    /* size of the CVT table or the number of points in the current     */
+    /* glyph (if applicable).                                           */
+    /*                                                                  */
+    /* The idea is that in real-world bytecode you either iterate over  */
+    /* all CVT entries (in the `prep' table), or over all points (or    */
+    /* contours, in the `glyf' table) of a glyph, and such iterations   */
+    /* don't happen very often.                                         */
+    exec->loopcall_counter = 0;
+    exec->neg_jump_counter = 0;
+
+    /* The maximum values are heuristic. */
+    if ( exec->pts.n_points )
+      exec->loopcall_counter_max = FT_MAX( 50,
+                                           10 * exec->pts.n_points ) +
+                                   FT_MAX( 50,
+                                           exec->cvtSize / 10 );
+    else
+      exec->loopcall_counter_max = 300 + 22 * exec->cvtSize;
+
+    /* as a protection against an unreasonable number of CVT entries  */
+    /* we assume at most 100 control values per glyph for the counter */
+    if ( exec->loopcall_counter_max >
+         100 * (FT_ULong)exec->face->root.num_glyphs )
+      exec->loopcall_counter_max = 100 * (FT_ULong)exec->face->root.num_glyphs;
+
+    FT_TRACE5(( "TT_RunIns: Limiting total number of loops in LOOPCALL"
+                " to %lu\n", exec->loopcall_counter_max ));
+
+    exec->neg_jump_counter_max = exec->loopcall_counter_max;
+    FT_TRACE5(( "TT_RunIns: Limiting total number of backward jumps"
+                " to %lu\n", exec->neg_jump_counter_max ));
+
+    /* set PPEM and CVT functions */
+    if ( exec->metrics.x_ppem != exec->metrics.y_ppem )
+    {
+      /* non-square pixels, use the stretched routines */
+      exec->func_cur_ppem  = Current_Ppem_Stretched;
+      exec->func_read_cvt  = Read_CVT_Stretched;
+      exec->func_write_cvt = Write_CVT_Stretched;
+      exec->func_move_cvt  = Move_CVT_Stretched;
+    }
+    else
+    {
+      /* square pixels, use normal routines */
+      exec->func_cur_ppem  = Current_Ppem;
+      exec->func_read_cvt  = Read_CVT;
+      exec->func_write_cvt = Write_CVT;
+      exec->func_move_cvt  = Move_CVT;
+    }
+
+    /* reset graphics state */
+    exec->GS         = size->GS;
+    exec->func_round = (TT_Round_Func)Round_To_Grid;
+    Compute_Funcs( exec );
+
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    /* Reset IUP tracking bits in the backward compatibility mode. */
+    /* See `ttinterp.h' for details.                               */
+    exec->backward_compatibility &= ~0x3;
+#endif
+
+    /* some glyphs leave something on the stack, */
+    /* so we clean it before a new execution.    */
+    exec->top     = 0;
+    exec->callTop = 0;
+
+    exec->instruction_trap = FALSE;
+
+    return exec->interpreter( exec );
+  }
+
 #else /* !TT_USE_BYTECODE_INTERPRETER */
 
   /* ANSI C doesn't like empty source files */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttinterp.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType bytecode interpreter (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -41,6 +41,60 @@
 
   /**************************************************************************
    *
+   * EXECUTION SUBTABLES
+   *
+   * These sub-tables relate to instruction execution.
+   *
+   */
+
+
+#define TT_MAX_CODE_RANGES  3
+
+
+  /**************************************************************************
+   *
+   * There can only be 3 active code ranges at once:
+   *   - the Font Program
+   *   - the CVT Program
+   *   - a glyph's instructions set
+   */
+  typedef enum  TT_CodeRange_Tag_
+  {
+    tt_coderange_none = 0,
+    tt_coderange_font,
+    tt_coderange_cvt,
+    tt_coderange_glyph
+
+  } TT_CodeRange_Tag;
+
+
+  typedef struct  TT_CodeRange_
+  {
+    FT_Byte*  base;
+    FT_Long   size;
+
+  } TT_CodeRange;
+
+  typedef TT_CodeRange  TT_CodeRangeTable[TT_MAX_CODE_RANGES];
+
+
+  /**************************************************************************
+   *
+   * Defines a function/instruction definition record.
+   */
+  typedef struct  TT_DefRecord_
+  {
+    FT_Int    range;          /* in which code range is it located?     */
+    FT_Long   start;          /* where does it start?                   */
+    FT_Long   end;            /* where does it end?                     */
+    FT_UInt   opc;            /* function #, or instruction code        */
+    FT_Bool   active;         /* is it active?                          */
+
+  } TT_DefRecord, *TT_DefArray;
+
+
+  /**************************************************************************
+   *
    * Function types used by the interpreter, depending on various modes
    * (e.g. the rounding mode, whether to render a vertical or horizontal
    * line etc).
@@ -51,7 +105,7 @@
   typedef FT_F26Dot6
   (*TT_Round_Func)( TT_ExecContext  exc,
                     FT_F26Dot6      distance,
-                    FT_Int          color );
+                    FT_F26Dot6      compensation );
 
   /* Point displacement along the freedom vector routine */
   typedef void
@@ -111,12 +165,13 @@
     TT_Face            face;       /* ! */
     TT_Size            size;       /* ! */
     FT_Memory          memory;
+    TT_Interpreter     interpreter;
 
     /* instructions state */
 
     FT_Error           error;      /* last execution error */
 
-    FT_Long            top;        /* @ top of exec. stack */
+    FT_Long            top;        /* @! top of exec. stack */
 
     FT_Long            stackSize;  /* ! size of exec. stack */
     FT_Long*           stack;      /* ! current exec. stack */
@@ -142,11 +197,9 @@
     FT_Long            IP;        /* current instruction pointer */
     FT_Long            codeSize;  /* size of current range       */
 
-    FT_Byte            opcode;    /* current opcode              */
-    FT_Int             length;    /* length of current opcode    */
+    FT_Byte            opcode;    /* current opcode             */
+    FT_Int             length;    /* opcode length or increment */
 
-    FT_Bool            step_ins;  /* true if the interpreter must */
-                                  /* increment IP after ins. exec */
     FT_ULong           cvtSize;   /* ! */
     FT_Long*           cvt;       /* ! */
     FT_ULong           glyfCvtSize;
@@ -166,9 +219,9 @@
     FT_UInt            maxFunc;   /* ! maximum function index    */
     FT_UInt            maxIns;    /* ! maximum instruction index */
 
-    FT_Int             callTop,    /* @ top of call stack during execution */
-                       callSize;   /*   size of call stack                 */
-    TT_CallStack       callStack;  /*   call stack                         */
+    FT_Int             callTop,    /* @! top of call stack during execution */
+                       callSize;   /*    size of call stack                 */
+    TT_CallStack       callStack;  /*    call stack                         */
 
     FT_UShort          maxPoints;    /* capacity of this context's `pts' */
     FT_Short           maxContours;  /* record, expressed in points and  */
@@ -189,16 +242,14 @@
     FT_Bool            instruction_trap; /* ! If `True', the interpreter   */
                                          /*   exits after each instruction */
 
-    TT_GraphicsState   default_GS;       /* graphics state resulting from   */
-                                         /* the prep program                */
     FT_Bool            is_composite;     /* true if the glyph is composite  */
     FT_Bool            pedantic_hinting; /* true if pedantic interpretation */
 
     /* latest interpreter additions */
 
-    FT_Long            F_dot_P;    /* dot product of freedom and projection */
-                                   /* vectors                               */
-    TT_Round_Func      func_round; /* current rounding function             */
+    TT_Round_Func      func_round;     /* current rounding function   */
+
+    FT_Vector          moveVector;     /* "projected" freedom vector  */
 
     TT_Project_Func    func_project,   /* current projection function */
                        func_dualproj,  /* current dual proj. function */
@@ -327,34 +378,13 @@
      *
      */
 
-    /* Using v40 implies subpixel hinting, unless FT_RENDER_MODE_MONO has been
-     * requested.  Used to detect interpreter */
-    /* version switches.  `_lean' to differentiate from the Infinality */
-    /* `subpixel_hinting', which is managed differently.               */
-    FT_Bool            subpixel_hinting_lean;
-
-    /* Long side of a LCD subpixel is vertical (e.g., screen is rotated). */
-    /* `_lean' to differentiate from the Infinality `vertical_lcd', which */
-    /* is managed differently.                                            */
-    FT_Bool            vertical_lcd_lean;
-
-    /* Default to backward compatibility mode in v40 interpreter.  If   */
-    /* this is false, it implies the interpreter is in v35 or in native */
-    /* ClearType mode.                                                  */
-    FT_Bool            backward_compatibility;
-
-    /* Useful for detecting and denying post-IUP trickery that is usually */
-    /* used to fix pixel patterns (`superhinting').                       */
-    FT_Bool            iupx_called;
-    FT_Bool            iupy_called;
-
-    /* ClearType hinting and grayscale rendering, as used by Universal */
-    /* Windows Platform apps (Windows 8 and above).  Like the standard */
-    /* colorful ClearType mode, it utilizes a vastly increased virtual */
-    /* resolution on the x axis.  Different from bi-level hinting and  */
-    /* grayscale rendering, the old mode from Win9x days that roughly  */
-    /* adheres to the physical pixel grid on both axes.                */
-    FT_Bool            grayscale_cleartype;
+    /* Activate backward compatibility (bit 2) and track IUP (bits 0-1). */
+    /* If this is zero, it means that the interpreter is either in v35   */
+    /* or in native ClearType mode.                                      */
+    FT_Int             backward_compatibility;
+
+    FT_Render_Mode     mode;  /* target render mode */
+
 #endif /* TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL */
 
     /* We maintain two counters (in addition to the instruction counter) */
@@ -371,22 +401,15 @@
   extern const TT_GraphicsState  tt_default_graphics_state;
 
 
-#ifdef TT_USE_BYTECODE_INTERPRETER
-  FT_LOCAL( void )
-  TT_Goto_CodeRange( TT_ExecContext  exec,
-                     FT_Int          range,
-                     FT_Long         IP );
-
   FT_LOCAL( void )
   TT_Set_CodeRange( TT_ExecContext  exec,
                     FT_Int          range,
-                    void*           base,
+                    FT_Byte*        base,
                     FT_Long         length );
 
   FT_LOCAL( void )
   TT_Clear_CodeRange( TT_ExecContext  exec,
                       FT_Int          range );
-#endif /* TT_USE_BYTECODE_INTERPRETER */
 
 
   /**************************************************************************
@@ -413,22 +436,21 @@
   TT_New_Context( TT_Driver  driver );
 
 
-#ifdef TT_USE_BYTECODE_INTERPRETER
   FT_LOCAL( void )
   TT_Done_Context( TT_ExecContext  exec );
 
-  FT_LOCAL( FT_Error )
+  FT_LOCAL( void )
   TT_Load_Context( TT_ExecContext  exec,
                    TT_Face         face,
                    TT_Size         size );
 
   FT_LOCAL( void )
   TT_Save_Context( TT_ExecContext  exec,
-                   TT_Size         ins );
+                   TT_Size         size );
 
   FT_LOCAL( FT_Error )
-  TT_Run_Context( TT_ExecContext  exec );
-#endif /* TT_USE_BYTECODE_INTERPRETER */
+  TT_Run_Context( TT_ExecContext  exec,
+                  TT_Size         size );
 
 
   /**************************************************************************
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Objects manager (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -67,23 +67,13 @@
    *     A pointer to the target glyph zone.
    */
   FT_LOCAL_DEF( void )
-  tt_glyphzone_done( TT_GlyphZone  zone )
+  tt_glyphzone_done( FT_Memory     memory,
+                     TT_GlyphZone  zone )
   {
-    FT_Memory  memory = zone->memory;
+    FT_FREE( zone->org );
 
-
-    if ( memory )
-    {
-      FT_FREE( zone->contours );
-      FT_FREE( zone->tags );
-      FT_FREE( zone->cur );
-      FT_FREE( zone->org );
-      FT_FREE( zone->orus );
-
-      zone->max_points   = zone->n_points   = 0;
-      zone->max_contours = zone->n_contours = 0;
-      zone->memory       = NULL;
-    }
+    zone->n_points   = 0;
+    zone->n_contours = 0;
   }
 
 
@@ -119,23 +109,22 @@
                     TT_GlyphZone  zone )
   {
     FT_Error  error;
+    FT_Long   size = 3 * maxPoints * sizeof ( FT_Vector ) +
+                       maxContours * sizeof ( FT_UShort ) +
+                         maxPoints * sizeof ( FT_Byte );
 
 
-    FT_ZERO( zone );
-    zone->memory = memory;
-
-    if ( FT_NEW_ARRAY( zone->org,      maxPoints   ) ||
-         FT_NEW_ARRAY( zone->cur,      maxPoints   ) ||
-         FT_NEW_ARRAY( zone->orus,     maxPoints   ) ||
-         FT_NEW_ARRAY( zone->tags,     maxPoints   ) ||
-         FT_NEW_ARRAY( zone->contours, maxContours ) )
+    if ( !FT_ALLOC( zone->org, size ) )
     {
-      tt_glyphzone_done( zone );
-    }
-    else
-    {
-      zone->max_points   = maxPoints;
-      zone->max_contours = maxContours;
+      zone->n_points   = maxPoints;
+      zone->n_contours = maxContours;
+
+      zone->cur      =               zone->org      + maxPoints;
+      zone->orus     =               zone->cur      + maxPoints;
+      zone->contours = (FT_UShort*)( zone->orus     + maxPoints );
+      zone->tags     =   (FT_Byte*)( zone->contours + maxContours );
+
+      zone->first_point = 0;
     }
 
     return error;
@@ -488,8 +477,7 @@
     int        j, k;
 
 
-    FT_MEM_SET( num_matched_ids, 0,
-                sizeof ( int ) * TRICK_SFNT_IDS_NUM_FACES );
+    FT_ARRAY_ZERO( num_matched_ids, TRICK_SFNT_IDS_NUM_FACES );
     has_cvt  = FALSE;
     has_fpgm = FALSE;
     has_prep = FALSE;
@@ -787,7 +775,7 @@
       FT_UInt  instance_index = (FT_UInt)face_index >> 16;
 
 
-      if ( FT_HAS_MULTIPLE_MASTERS( ttface ) )
+      if ( instance_index && FT_HAS_MULTIPLE_MASTERS( ttface ) )
       {
         error = FT_Set_Named_Instance( ttface, instance_index );
         if ( error )
@@ -885,59 +873,18 @@
    *   size ::
    *     A handle to the size object.
    *
-   *   pedantic ::
-   *     Set if bytecode execution should be pedantic.
-   *
    * @Return:
    *   FreeType error code.  0 means success.
    */
   FT_LOCAL_DEF( FT_Error )
-  tt_size_run_fpgm( TT_Size  size,
-                    FT_Bool  pedantic )
+  tt_size_run_fpgm( TT_Size  size )
   {
     TT_Face         face = (TT_Face)size->root.face;
-    TT_ExecContext  exec;
+    TT_ExecContext  exec = size->context;
     FT_Error        error;
 
 
-    exec = size->context;
-
-    error = TT_Load_Context( exec, face, size );
-    if ( error )
-      return error;
-
-    exec->callTop = 0;
-    exec->top     = 0;
-
-    exec->period    = 64;
-    exec->phase     = 0;
-    exec->threshold = 0;
-
-    exec->instruction_trap = FALSE;
-    exec->F_dot_P          = 0x4000L;
-
-    exec->pedantic_hinting = pedantic;
-
-    {
-      FT_Size_Metrics*  size_metrics = &exec->metrics;
-      TT_Size_Metrics*  tt_metrics   = &exec->tt_metrics;
-
-
-      size_metrics->x_ppem   = 0;
-      size_metrics->y_ppem   = 0;
-      size_metrics->x_scale  = 0;
-      size_metrics->y_scale  = 0;
-
-      tt_metrics->ppem  = 0;
-      tt_metrics->scale = 0;
-      tt_metrics->ratio = 0x10000L;
-    }
-
-    /* allow font program execution */
-    TT_Set_CodeRange( exec,
-                      tt_coderange_font,
-                      face->font_program,
-                      (FT_Long)face->font_program_size );
+    TT_Load_Context( exec, face, size );
 
     /* disable CVT and glyph programs coderange */
     TT_Clear_CodeRange( exec, tt_coderange_cvt );
@@ -945,15 +892,19 @@
 
     if ( face->font_program_size > 0 )
     {
-      TT_Goto_CodeRange( exec, tt_coderange_font, 0 );
+      /* allow font program execution */
+      TT_Set_CodeRange( exec,
+                        tt_coderange_font,
+                        face->font_program,
+                        (FT_Long)face->font_program_size );
+
+      exec->pts.n_points   = 0;
+      exec->pts.n_contours = 0;
 
       FT_TRACE4(( "Executing `fpgm' table.\n" ));
-      error = face->interpreter( exec );
-#ifdef FT_DEBUG_LEVEL_TRACE
-      if ( error )
-        FT_TRACE4(( "  interpretation failed with error code 0x%x\n",
-                    error ));
-#endif
+      error = TT_Run_Context( exec, size );
+      FT_TRACE4(( error ? "  failed (error code 0x%x)\n" : "",
+                  error ));
     }
     else
       error = FT_Err_Ok;
@@ -979,212 +930,146 @@
    *   size ::
    *     A handle to the size object.
    *
-   *   pedantic ::
-   *     Set if bytecode execution should be pedantic.
-   *
    * @Return:
    *   FreeType error code.  0 means success.
    */
   FT_LOCAL_DEF( FT_Error )
-  tt_size_run_prep( TT_Size  size,
-                    FT_Bool  pedantic )
+  tt_size_run_prep( TT_Size  size )
   {
     TT_Face         face = (TT_Face)size->root.face;
-    TT_ExecContext  exec;
+    TT_ExecContext  exec = size->context;
     FT_Error        error;
     FT_UInt         i;
 
 
+    /* set default GS, twilight points, and storage */
+    /* before CV program can modify them.           */
+    size->GS = tt_default_graphics_state;
+
+    /* all twilight points are originally zero */
+    FT_ARRAY_ZERO( size->twilight.org, size->twilight.n_points );
+    FT_ARRAY_ZERO( size->twilight.cur, size->twilight.n_points );
+
+    TT_Load_Context( exec, face, size );
+
+    /* clear storage area */
+    FT_ARRAY_ZERO( exec->storage, exec->storeSize );
+
     /* Scale the cvt values to the new ppem.            */
     /* By default, we use the y ppem value for scaling. */
     FT_TRACE6(( "CVT values:\n" ));
-    for ( i = 0; i < size->cvt_size; i++ )
+    for ( i = 0; i < exec->cvtSize; i++ )
     {
       /* Unscaled CVT values are already stored in 26.6 format.            */
       /* Note that this scaling operation is very sensitive to rounding;   */
       /* the integer division by 64 must be applied to the first argument. */
-      size->cvt[i] = FT_MulFix( face->cvt[i] / 64, size->ttmetrics.scale );
-      FT_TRACE6(( "  %3d: %f (%f)\n",
-                  i, (double)face->cvt[i] / 64, (double)size->cvt[i] / 64 ));
+      exec->cvt[i] = FT_MulFix( face->cvt[i] / 64, size->ttmetrics.scale );
+      FT_TRACE6(( "  %3u: %f (%f)\n",
+                  i, (double)face->cvt[i] / 64, (double)exec->cvt[i] / 64 ));
     }
     FT_TRACE6(( "\n" ));
 
-    exec = size->context;
-
-    error = TT_Load_Context( exec, face, size );
-    if ( error )
-      return error;
-
-    exec->callTop = 0;
-    exec->top     = 0;
-
-    exec->instruction_trap = FALSE;
-
-    exec->pedantic_hinting = pedantic;
-
-    TT_Set_CodeRange( exec,
-                      tt_coderange_cvt,
-                      face->cvt_program,
-                      (FT_Long)face->cvt_program_size );
-
     TT_Clear_CodeRange( exec, tt_coderange_glyph );
 
     if ( face->cvt_program_size > 0 )
     {
-      TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );
+      /* allow CV program execution */
+      TT_Set_CodeRange( exec,
+                        tt_coderange_cvt,
+                        face->cvt_program,
+                        (FT_Long)face->cvt_program_size );
+
+      exec->pts.n_points   = 0;
+      exec->pts.n_contours = 0;
 
       FT_TRACE4(( "Executing `prep' table.\n" ));
-      error = face->interpreter( exec );
-#ifdef FT_DEBUG_LEVEL_TRACE
-      if ( error )
-        FT_TRACE4(( "  interpretation failed with error code 0x%x\n",
-                    error ));
-#endif
+      error = TT_Run_Context( exec, size );
+      FT_TRACE4(( error ? "  failed (error code 0x%x)\n" : "",
+                  error ));
     }
     else
       error = FT_Err_Ok;
 
     size->cvt_ready = error;
 
-    /* UNDOCUMENTED!  The MS rasterizer doesn't allow the following */
-    /* graphics state variables to be modified by the CVT program.  */
-
-    exec->GS.dualVector.x = 0x4000;
-    exec->GS.dualVector.y = 0;
-    exec->GS.projVector.x = 0x4000;
-    exec->GS.projVector.y = 0x0;
-    exec->GS.freeVector.x = 0x4000;
-    exec->GS.freeVector.y = 0x0;
-
-    exec->GS.rp0 = 0;
-    exec->GS.rp1 = 0;
-    exec->GS.rp2 = 0;
-
-    exec->GS.gep0 = 1;
-    exec->GS.gep1 = 1;
-    exec->GS.gep2 = 1;
-
-    exec->GS.loop = 1;
-
-    /* save as default graphics state */
-    size->GS = exec->GS;
-
-    TT_Save_Context( exec, size );
+    if ( !error )
+      TT_Save_Context( exec, size );
 
     return error;
   }
 
 
   static void
-  tt_size_done_bytecode( FT_Size  ftsize )
+  tt_size_done_bytecode( TT_Size  size )
   {
-    TT_Size    size   = (TT_Size)ftsize;
-    TT_Face    face   = (TT_Face)ftsize->face;
-    FT_Memory  memory = face->root.memory;
+    FT_Memory       memory = size->root.face->memory;
+    TT_ExecContext  exec   = size->context;
 
-    if ( size->context )
+
+    if ( exec )
     {
-      TT_Done_Context( size->context );
+      FT_FREE( exec->stack );
+      FT_FREE( exec->FDefs );
+
+      TT_Done_Context( exec );
       size->context = NULL;
     }
 
-    FT_FREE( size->cvt );
-    size->cvt_size = 0;
-
-    /* free storage area */
-    FT_FREE( size->storage );
-    size->storage_size = 0;
-
     /* twilight zone */
-    tt_glyphzone_done( &size->twilight );
-
-    FT_FREE( size->function_defs );
-    FT_FREE( size->instruction_defs );
-
-    size->num_function_defs    = 0;
-    size->max_function_defs    = 0;
-    size->num_instruction_defs = 0;
-    size->max_instruction_defs = 0;
-
-    size->max_func = 0;
-    size->max_ins  = 0;
-
-    size->bytecode_ready = -1;
-    size->cvt_ready      = -1;
+    tt_glyphzone_done( memory, &size->twilight );
   }
 
 
   /* Initialize bytecode-related fields in the size object.       */
   /* We do this only if bytecode interpretation is really needed. */
-  static FT_Error
-  tt_size_init_bytecode( FT_Size  ftsize,
+  FT_LOCAL_DEF( FT_Error )
+  tt_size_init_bytecode( TT_Size  size,
                          FT_Bool  pedantic )
   {
     FT_Error   error;
-    TT_Size    size = (TT_Size)ftsize;
-    TT_Face    face = (TT_Face)ftsize->face;
-    FT_Memory  memory = face->root.memory;
+    TT_Face    face = (TT_Face)size->root.face;
+    FT_Memory  memory = size->root.face->memory;
 
     FT_UShort       n_twilight;
     TT_MaxProfile*  maxp = &face->max_profile;
+    TT_ExecContext  exec;
 
 
-    /* clean up bytecode related data */
-    FT_FREE( size->function_defs );
-    FT_FREE( size->instruction_defs );
-    FT_FREE( size->cvt );
-    FT_FREE( size->storage );
-
-    if ( size->context )
-      TT_Done_Context( size->context );
-    tt_glyphzone_done( &size->twilight );
-
-    size->bytecode_ready = -1;
-    size->cvt_ready      = -1;
-
-    size->context = TT_New_Context( (TT_Driver)face->root.driver );
+    exec = TT_New_Context( (TT_Driver)face->root.driver );
+    if ( !exec )
+      return FT_THROW( Could_Not_Find_Context );
 
-    size->max_function_defs    = maxp->maxFunctionDefs;
-    size->max_instruction_defs = maxp->maxInstructionDefs;
+    size->context = exec;
 
-    size->num_function_defs    = 0;
-    size->num_instruction_defs = 0;
+    exec->pedantic_hinting = pedantic;
 
-    size->max_func = 0;
-    size->max_ins  = 0;
+    exec->maxFDefs = maxp->maxFunctionDefs;
+    exec->maxIDefs = maxp->maxInstructionDefs;
 
-    size->cvt_size     = face->cvt_size;
-    size->storage_size = maxp->maxStorage;
+    if ( FT_NEW_ARRAY( exec->FDefs, exec->maxFDefs + exec->maxIDefs ) )
+      goto Fail;
 
-    /* Set default metrics */
-    {
-      TT_Size_Metrics*  tt_metrics = &size->ttmetrics;
+    exec->IDefs = exec->FDefs + exec->maxFDefs;
 
+    exec->numFDefs = 0;
+    exec->numIDefs = 0;
 
-      tt_metrics->rotated   = FALSE;
-      tt_metrics->stretched = FALSE;
+    exec->maxFunc = 0;
+    exec->maxIns  = 0;
 
-      /* Set default engine compensation.  Value 3 is not described */
-      /* in the OpenType specification (as of Mai 2019), but Greg   */
-      /* says that MS handles it the same as `gray'.                */
-      /*                                                            */
-      /* The Apple specification says that the compensation for     */
-      /* `gray' is always zero.  FreeType doesn't do any            */
-      /* compensation at all.                                       */
-      tt_metrics->compensations[0] = 0;   /* gray  */
-      tt_metrics->compensations[1] = 0;   /* black */
-      tt_metrics->compensations[2] = 0;   /* white */
-      tt_metrics->compensations[3] = 0;   /* zero  */
-    }
+    /* XXX: We reserve a little more elements on the stack to deal */
+    /*      with broken fonts like arialbs, courbs, timesbs, etc.  */
+    exec->stackSize = maxp->maxStackElements + 32;
+    exec->storeSize = maxp->maxStorage;
+    exec->cvtSize   = face->cvt_size;
 
-    /* allocate function defs, instruction defs, cvt, and storage area */
-    if ( FT_NEW_ARRAY( size->function_defs,    size->max_function_defs    ) ||
-         FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) ||
-         FT_NEW_ARRAY( size->cvt,              size->cvt_size             ) ||
-         FT_NEW_ARRAY( size->storage,          size->storage_size         ) )
-      goto Exit;
+    if ( FT_NEW_ARRAY( exec->stack,
+                       exec->stackSize +
+                         (FT_Long)( exec->storeSize + exec->cvtSize ) ) )
+      goto Fail;
 
-    /* reserve twilight zone */
+    /* reserve twilight zone and set GS before fpgm is executed, */
+    /* just in case, even though fpgm should not touch them      */
     n_twilight = maxp->maxTwilightPoints;
 
     /* there are 4 phantom points (do we need this?) */
@@ -1192,22 +1077,13 @@
 
     error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight );
     if ( error )
-      goto Exit;
-
-    size->twilight.n_points = n_twilight;
-
-    size->GS = tt_default_graphics_state;
-
-    /* set `face->interpreter' according to the debug hook present */
-    {
-      FT_Library  library = face->root.driver->root.library;
+      goto Fail;
 
+    size->GS        = tt_default_graphics_state;
+    size->cvt_ready = -1;
 
-      face->interpreter = (TT_Interpreter)
-                            library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE];
-      if ( !face->interpreter )
-        face->interpreter = (TT_Interpreter)TT_RunIns;
-    }
+    size->ttmetrics.rotated   = FALSE;
+    size->ttmetrics.stretched = FALSE;
 
     /* Fine, now run the font program! */
 
@@ -1217,59 +1093,11 @@
     /* to be executed just once; calling it again is completely useless   */
     /* and might even lead to extremely slow behaviour if it is malformed */
     /* (containing an infinite loop, for example).                        */
-    error = tt_size_run_fpgm( size, pedantic );
+    error = tt_size_run_fpgm( size );
     return error;
 
-  Exit:
-    if ( error )
-      tt_size_done_bytecode( ftsize );
-
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  tt_size_ready_bytecode( TT_Size  size,
-                          FT_Bool  pedantic )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    if ( size->bytecode_ready < 0 )
-      error = tt_size_init_bytecode( (FT_Size)size, pedantic );
-    else
-      error = size->bytecode_ready;
-
-    if ( error )
-      goto Exit;
-
-    /* rescale CVT when needed */
-    if ( size->cvt_ready < 0 )
-    {
-      FT_UShort  i;
-
-
-      /* all twilight points are originally zero */
-      for ( i = 0; i < size->twilight.n_points; i++ )
-      {
-        size->twilight.org[i].x = 0;
-        size->twilight.org[i].y = 0;
-        size->twilight.cur[i].x = 0;
-        size->twilight.cur[i].y = 0;
-      }
-
-      /* clear storage area */
-      for ( i = 0; i < size->storage_size; i++ )
-        size->storage[i] = 0;
-
-      size->GS = tt_default_graphics_state;
-
-      error = tt_size_run_prep( size, pedantic );
-    }
-    else
-      error = size->cvt_ready;
-
-  Exit:
+  Fail:
+    tt_size_done_bytecode( size );
     return error;
   }
 
@@ -1300,11 +1128,9 @@
 
 #ifdef TT_USE_BYTECODE_INTERPRETER
     size->bytecode_ready = -1;
-    size->cvt_ready      = -1;
 #endif
 
-    size->ttmetrics.valid = FALSE;
-    size->strike_index    = 0xFFFFFFFFUL;
+    size->strike_index = 0xFFFFFFFFUL;
 
     return error;
   }
@@ -1325,14 +1151,11 @@
   FT_LOCAL_DEF( void )
   tt_size_done( FT_Size  ttsize )           /* TT_Size */
   {
-    TT_Size  size = (TT_Size)ttsize;
-
-
 #ifdef TT_USE_BYTECODE_INTERPRETER
-    tt_size_done_bytecode( ttsize );
+    tt_size_done_bytecode( (TT_Size)ttsize );
+#else
+    FT_UNUSED( ttsize );
 #endif
-
-    size->ttmetrics.valid = FALSE;
   }
 
 
@@ -1353,21 +1176,13 @@
    *     function must take `FT_Size` as a result. The passed `FT_Size` is
    *     expected to point to a `TT_Size`.
    */
-  FT_LOCAL_DEF( FT_Error )
+  FT_LOCAL_DEF( void )
   tt_size_reset_height( FT_Size  ft_size )
   {
     TT_Size           size         = (TT_Size)ft_size;
-    TT_Face           face         = (TT_Face)size->root.face;
+    TT_Face           face         = (TT_Face)ft_size->face;
     FT_Size_Metrics*  size_metrics = &size->hinted_metrics;
 
-    size->ttmetrics.valid = FALSE;
-
-    /* copy the result from base layer */
-    *size_metrics = size->root.metrics;
-
-    if ( size_metrics->x_ppem < 1 || size_metrics->y_ppem < 1 )
-      return FT_THROW( Invalid_PPem );
-
     /* This bit flag, if set, indicates that the ppems must be       */
     /* rounded to integers.  Nearly all TrueType fonts have this bit */
     /* set, as hinting won't work really well otherwise.             */
@@ -1385,10 +1200,6 @@
                                FT_MulFix( face->root.height,
                                           size_metrics->y_scale ) );
     }
-
-    size->ttmetrics.valid = TRUE;
-
-    return FT_Err_Ok;
   }
 
 
@@ -1408,14 +1219,20 @@
   FT_LOCAL_DEF( FT_Error )
   tt_size_reset( TT_Size  size )
   {
-    FT_Error          error;
     TT_Face           face         = (TT_Face)size->root.face;
     FT_Size_Metrics*  size_metrics = &size->hinted_metrics;
 
 
-    error = tt_size_reset_height( (FT_Size)size );
-    if ( error )
-      return error;
+    /* invalidate the size object first */
+    size->ttmetrics.ppem = 0;
+
+    if ( size->root.metrics.x_ppem == 0 || size->root.metrics.y_ppem == 0 )
+      return FT_THROW( Invalid_PPem );
+
+    /* copy the result from base layer */
+    *size_metrics = size->root.metrics;
+
+    tt_size_reset_height( (FT_Size)size );
 
     if ( face->header.Flags & 8 )
     {
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttobjs.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Objects manager (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -53,6 +53,8 @@
   typedef FT_GlyphSlot  TT_GlyphSlot;
 
 
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
   /**************************************************************************
    *
    * @Struct:
@@ -67,21 +69,27 @@
     FT_UShort      rp1;
     FT_UShort      rp2;
 
+    FT_UShort      gep0;
+    FT_UShort      gep1;
+    FT_UShort      gep2;
+
     FT_UnitVector  dualVector;
     FT_UnitVector  projVector;
     FT_UnitVector  freeVector;
 
     FT_Long        loop;
-    FT_F26Dot6     minimum_distance;
     FT_Int         round_state;
+    FT_F26Dot6     compensation[4];   /* device-specific compensations  */
 
-    FT_Bool        auto_flip;
+    /* default values below can be modified by 'fpgm' and 'prep' */
+    FT_F26Dot6     minimum_distance;
     FT_F26Dot6     control_value_cutin;
     FT_F26Dot6     single_width_cutin;
     FT_F26Dot6     single_width_value;
     FT_UShort      delta_base;
     FT_UShort      delta_shift;
 
+    FT_Bool        auto_flip;
     FT_Byte        instruct_control;
     /* According to Greg Hitchcock from Microsoft, the `scan_control'     */
     /* variable as documented in the TrueType specification is a 32-bit   */
@@ -90,17 +98,12 @@
     FT_Bool        scan_control;
     FT_Int         scan_type;
 
-    FT_UShort      gep0;
-    FT_UShort      gep1;
-    FT_UShort      gep2;
-
   } TT_GraphicsState;
 
 
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
   FT_LOCAL( void )
-  tt_glyphzone_done( TT_GlyphZone  zone );
+  tt_glyphzone_done( FT_Memory     memory,
+                     TT_GlyphZone  zone );
 
   FT_LOCAL( FT_Error )
   tt_glyphzone_new( FT_Memory     memory,
@@ -114,73 +117,6 @@
 
   /**************************************************************************
    *
-   * EXECUTION SUBTABLES
-   *
-   * These sub-tables relate to instruction execution.
-   *
-   */
-
-
-#define TT_MAX_CODE_RANGES  3
-
-
-  /**************************************************************************
-   *
-   * There can only be 3 active code ranges at once:
-   *   - the Font Program
-   *   - the CVT Program
-   *   - a glyph's instructions set
-   */
-  typedef enum  TT_CodeRange_Tag_
-  {
-    tt_coderange_none = 0,
-    tt_coderange_font,
-    tt_coderange_cvt,
-    tt_coderange_glyph
-
-  } TT_CodeRange_Tag;
-
-
-  typedef struct  TT_CodeRange_
-  {
-    FT_Byte*  base;
-    FT_Long   size;
-
-  } TT_CodeRange;
-
-  typedef TT_CodeRange  TT_CodeRangeTable[TT_MAX_CODE_RANGES];
-
-
-  /**************************************************************************
-   *
-   * Defines a function/instruction definition record.
-   */
-  typedef struct  TT_DefRecord_
-  {
-    FT_Int    range;          /* in which code range is it located?     */
-    FT_Long   start;          /* where does it start?                   */
-    FT_Long   end;            /* where does it end?                     */
-    FT_UInt   opc;            /* function #, or instruction code        */
-    FT_Bool   active;         /* is it active?                          */
-
-  } TT_DefRecord, *TT_DefArray;
-
-
-  /**************************************************************************
-   *
-   * Subglyph transformation record.
-   */
-  typedef struct  TT_Transform_
-  {
-    FT_Fixed    xx, xy;     /* transformation matrix coefficients */
-    FT_Fixed    yx, yy;
-    FT_F26Dot6  ox, oy;     /* offsets                            */
-
-  } TT_Transform;
-
-
-  /**************************************************************************
-   *
    * A note regarding non-squared pixels:
    *
    * (This text will probably go into some docs at some time; for now, it
@@ -251,13 +187,9 @@
     FT_Long     x_ratio;
     FT_Long     y_ratio;
 
-    FT_UShort   ppem;               /* maximum ppem size              */
     FT_Long     ratio;              /* current ratio                  */
     FT_Fixed    scale;
-
-    FT_F26Dot6  compensations[4];   /* device-specific compensations  */
-
-    FT_Bool     valid;
+    FT_UShort   ppem;               /* maximum ppem size              */
 
     FT_Bool     rotated;            /* `is the glyph rotated?'-flag   */
     FT_Bool     stretched;          /* `is the glyph stretched?'-flag */
@@ -288,27 +220,8 @@
 
     FT_Long            point_size;    /* for the `MPS' bytecode instruction */
 
-    FT_UInt            num_function_defs; /* number of function definitions */
-    FT_UInt            max_function_defs;
-    TT_DefArray        function_defs;     /* table of function definitions  */
-
-    FT_UInt            num_instruction_defs;  /* number of ins. definitions */
-    FT_UInt            max_instruction_defs;
-    TT_DefArray        instruction_defs;      /* table of ins. definitions  */
-
-    FT_UInt            max_func;
-    FT_UInt            max_ins;
-
-    TT_CodeRangeTable  codeRangeTable;
-
     TT_GraphicsState   GS;
 
-    FT_ULong           cvt_size;      /* the scaled control value table */
-    FT_Long*           cvt;
-
-    FT_UShort          storage_size; /* The storage area is now part of */
-    FT_Long*           storage;      /* the instance                    */
-
     TT_GlyphZoneRec    twilight;     /* The instance's twilight zone    */
 
     TT_ExecContext     context;
@@ -375,20 +288,18 @@
 #ifdef TT_USE_BYTECODE_INTERPRETER
 
   FT_LOCAL( FT_Error )
-  tt_size_run_fpgm( TT_Size  size,
-                    FT_Bool  pedantic );
+  tt_size_run_fpgm( TT_Size  size );
 
   FT_LOCAL( FT_Error )
-  tt_size_run_prep( TT_Size  size,
-                    FT_Bool  pedantic );
+  tt_size_run_prep( TT_Size  size );
 
   FT_LOCAL( FT_Error )
-  tt_size_ready_bytecode( TT_Size  size,
-                          FT_Bool  pedantic );
+  tt_size_init_bytecode( TT_Size  size,
+                         FT_Bool  pedantic );
 
 #endif /* TT_USE_BYTECODE_INTERPRETER */
 
-  FT_LOCAL( FT_Error )
+  FT_LOCAL( void )
   tt_size_reset_height( FT_Size  size );
 
   FT_LOCAL( FT_Error )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType-specific tables loader (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -110,7 +110,7 @@
 
     if ( face->num_locations != (FT_ULong)face->root.num_glyphs + 1 )
     {
-      FT_TRACE2(( "glyph count mismatch!  loca: %ld, maxp: %ld\n",
+      FT_TRACE2(( "glyph count mismatch!  loca: %lu, maxp: %ld\n",
                   face->num_locations - 1, face->root.num_glyphs ));
 
       /* we only handle the case where `maxp' gives a larger value */
@@ -151,7 +151,7 @@
           face->num_locations = (FT_ULong)face->root.num_glyphs + 1;
           table_len           = new_loca_len;
 
-          FT_TRACE2(( "adjusting num_locations to %ld\n",
+          FT_TRACE2(( "adjusting num_locations to %lu\n",
                       face->num_locations ));
         }
         else
@@ -225,7 +225,7 @@
     if ( pos1 > ttface->glyf_len )
     {
       FT_TRACE1(( "tt_face_get_location:"
-                  " too large offset (0x%08lx) found for glyph index %d,\n",
+                  " too large offset (0x%08lx) found for glyph index %u,\n",
                   pos1, gindex ));
       FT_TRACE1(( "                     "
                   " exceeding the end of `glyf' table (0x%08lx)\n",
@@ -240,17 +240,17 @@
       if ( gindex == ttface->num_locations - 2 )
       {
         FT_TRACE1(( "tt_face_get_location:"
-                    " too large size (%ld bytes) found for glyph index %d,\n",
+                    " too large size (%lu bytes) found for glyph index %u,\n",
                     pos2 - pos1, gindex ));
         FT_TRACE1(( "                     "
-                    " truncating at the end of `glyf' table to %ld bytes\n",
+                    " truncating at the end of `glyf' table to %lu bytes\n",
                     ttface->glyf_len - pos1 ));
         pos2 = ttface->glyf_len;
       }
       else
       {
         FT_TRACE1(( "tt_face_get_location:"
-                    " too large offset (0x%08lx) found for glyph index %d,\n",
+                    " too large offset (0x%08lx) found for glyph index %u,\n",
                     pos2, gindex + 1 ));
         FT_TRACE1(( "                     "
                     " exceeding the end of `glyf' table (0x%08lx)\n",
@@ -419,7 +419,7 @@
       if ( FT_FRAME_EXTRACT( table_len, face->font_program ) )
         goto Exit;
 
-      FT_TRACE2(( "loaded, %12ld bytes\n", face->font_program_size ));
+      FT_TRACE2(( "loaded, %12lu bytes\n", face->font_program_size ));
     }
 
   Exit:
@@ -482,7 +482,7 @@
       if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) )
         goto Exit;
 
-      FT_TRACE2(( "loaded, %12ld bytes\n", face->cvt_program_size ));
+      FT_TRACE2(( "loaded, %12lu bytes\n", face->cvt_program_size ));
     }
 
   Exit:
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttpload.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   TrueType-specific tables loader (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.c	1970-01-01 00:00:00.000000000 +0000
@@ -1,1013 +0,0 @@
-/****************************************************************************
- *
- * ttsubpix.c
- *
- *   TrueType Subpixel Hinting.
- *
- * Copyright (C) 2010-2023 by
- * David Turner, Robert Wilhelm, and Werner Lemberg.
- *
- * This file is part of the FreeType project, and may only be used,
- * modified, and distributed under the terms of the FreeType project
- * license, LICENSE.TXT.  By continuing to use, modify, or distribute
- * this file you indicate that you have read the license and
- * understand and accept it fully.
- *
- */
-
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#include "ttsubpix.h"
-
-
-#if defined( TT_USE_BYTECODE_INTERPRETER )            && \
-    defined( TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY )
-
-  /**************************************************************************
-   *
-   * These rules affect how the TT Interpreter does hinting, with the
-   * goal of doing subpixel hinting by (in general) ignoring x moves.
-   * Some of these rules are fixes that go above and beyond the
-   * stated techniques in the MS whitepaper on Cleartype, due to
-   * artifacts in many glyphs.  So, these rules make some glyphs render
-   * better than they do in the MS rasterizer.
-   *
-   * "" string or 0 int/char indicates to apply to all glyphs.
-   * "-" used as dummy placeholders, but any non-matching string works.
-   *
-   * Some of this could arguably be implemented in fontconfig, however:
-   *
-   * - Fontconfig can't set things on a glyph-by-glyph basis.
-   * - The tweaks that happen here are very low-level, from an average
-   *   user's point of view and are best implemented in the hinter.
-   *
-   * The goal is to make the subpixel hinting techniques as generalized
-   * as possible across all fonts to prevent the need for extra rules such
-   * as these.
-   *
-   * The rule structure is designed so that entirely new rules can easily
-   * be added when a new compatibility feature is discovered.
-   *
-   * The rule structures could also use some enhancement to handle ranges.
-   *
-   *     ****************** WORK IN PROGRESS *******************
-   */
-
-  /* These are `classes' of fonts that can be grouped together and used in */
-  /* rules below.  A blank entry "" is required at the end of these!       */
-#define FAMILY_CLASS_RULES_SIZE  7
-
-  static const SPH_Font_Class  FAMILY_CLASS_Rules
-                               [FAMILY_CLASS_RULES_SIZE] =
-  {
-    { "MS Legacy Fonts",
-      { "Aharoni",
-        "Andale Mono",
-        "Andalus",
-        "Angsana New",
-        "AngsanaUPC",
-        "Arabic Transparent",
-        "Arial Black",
-        "Arial Narrow",
-        "Arial Unicode MS",
-        "Arial",
-        "Batang",
-        "Browallia New",
-        "BrowalliaUPC",
-        "Comic Sans MS",
-        "Cordia New",
-        "CordiaUPC",
-        "Courier New",
-        "DFKai-SB",
-        "David Transparent",
-        "David",
-        "DilleniaUPC",
-        "Estrangelo Edessa",
-        "EucrosiaUPC",
-        "FangSong_GB2312",
-        "Fixed Miriam Transparent",
-        "FrankRuehl",
-        "Franklin Gothic Medium",
-        "FreesiaUPC",
-        "Garamond",
-        "Gautami",
-        "Georgia",
-        "Gulim",
-        "Impact",
-        "IrisUPC",
-        "JasmineUPC",
-        "KaiTi_GB2312",
-        "KodchiangUPC",
-        "Latha",
-        "Levenim MT",
-        "LilyUPC",
-        "Lucida Console",
-        "Lucida Sans Unicode",
-        "MS Gothic",
-        "MS Mincho",
-        "MV Boli",
-        "Mangal",
-        "Marlett",
-        "Microsoft Sans Serif",
-        "Mingliu",
-        "Miriam Fixed",
-        "Miriam Transparent",
-        "Miriam",
-        "Narkisim",
-        "Palatino Linotype",
-        "Raavi",
-        "Rod Transparent",
-        "Rod",
-        "Shruti",
-        "SimHei",
-        "Simplified Arabic Fixed",
-        "Simplified Arabic",
-        "Simsun",
-        "Sylfaen",
-        "Symbol",
-        "Tahoma",
-        "Times New Roman",
-        "Traditional Arabic",
-        "Trebuchet MS",
-        "Tunga",
-        "Verdana",
-        "Webdings",
-        "Wingdings",
-        "",
-      },
-    },
-    { "Core MS Legacy Fonts",
-      { "Arial Black",
-        "Arial Narrow",
-        "Arial Unicode MS",
-        "Arial",
-        "Comic Sans MS",
-        "Courier New",
-        "Garamond",
-        "Georgia",
-        "Impact",
-        "Lucida Console",
-        "Lucida Sans Unicode",
-        "Microsoft Sans Serif",
-        "Palatino Linotype",
-        "Tahoma",
-        "Times New Roman",
-        "Trebuchet MS",
-        "Verdana",
-        "",
-      },
-    },
-    { "Apple Legacy Fonts",
-      { "Geneva",
-        "Times",
-        "Monaco",
-        "Century",
-        "Chalkboard",
-        "Lobster",
-        "Century Gothic",
-        "Optima",
-        "Lucida Grande",
-        "Gill Sans",
-        "Baskerville",
-        "Helvetica",
-        "Helvetica Neue",
-        "",
-      },
-    },
-    { "Legacy Sans Fonts",
-      { "Andale Mono",
-        "Arial Unicode MS",
-        "Arial",
-        "Century Gothic",
-        "Comic Sans MS",
-        "Franklin Gothic Medium",
-        "Geneva",
-        "Lucida Console",
-        "Lucida Grande",
-        "Lucida Sans Unicode",
-        "Lucida Sans Typewriter",
-        "Microsoft Sans Serif",
-        "Monaco",
-        "Tahoma",
-        "Trebuchet MS",
-        "Verdana",
-        "",
-      },
-    },
-
-    { "Misc Legacy Fonts",
-      { "Dark Courier", "", }, },
-    { "Verdana Clones",
-      { "DejaVu Sans",
-        "Bitstream Vera Sans", "", }, },
-    { "Verdana and Clones",
-      { "DejaVu Sans",
-        "Bitstream Vera Sans",
-        "Verdana", "", }, },
-  };
-
-
-  /* Define this to force natural (i.e. not bitmap-compatible) widths.     */
-  /* The default leans strongly towards natural widths except for a few    */
-  /* legacy fonts where a selective combination produces nicer results.    */
-/* #define FORCE_NATURAL_WIDTHS   */
-
-
-  /* Define `classes' of styles that can be grouped together and used in   */
-  /* rules below.  A blank entry "" is required at the end of these!       */
-#define STYLE_CLASS_RULES_SIZE  5
-
-  static const SPH_Font_Class  STYLE_CLASS_Rules
-                               [STYLE_CLASS_RULES_SIZE] =
-  {
-    { "Regular Class",
-      { "Regular",
-        "Book",
-        "Medium",
-        "Roman",
-        "Normal",
-        "",
-      },
-    },
-    { "Regular/Italic Class",
-      { "Regular",
-        "Book",
-        "Medium",
-        "Italic",
-        "Oblique",
-        "Roman",
-        "Normal",
-        "",
-      },
-    },
-    { "Bold/BoldItalic Class",
-      { "Bold",
-        "Bold Italic",
-        "Black",
-        "",
-      },
-    },
-    { "Bold/Italic/BoldItalic Class",
-      { "Bold",
-        "Bold Italic",
-        "Black",
-        "Italic",
-        "Oblique",
-        "",
-      },
-    },
-    { "Regular/Bold Class",
-      { "Regular",
-        "Book",
-        "Medium",
-        "Normal",
-        "Roman",
-        "Bold",
-        "Black",
-        "",
-      },
-    },
-  };
-
-
-  /* Force special legacy fixes for fonts.                                 */
-#define COMPATIBILITY_MODE_RULES_SIZE  1
-
-  static const SPH_TweakRule  COMPATIBILITY_MODE_Rules
-                              [COMPATIBILITY_MODE_RULES_SIZE] =
-  {
-    { "Verdana Clones", 0, "", 0 },
-  };
-
-
-  /* Don't do subpixel (ignore_x_mode) hinting; do normal hinting.         */
-#define PIXEL_HINTING_RULES_SIZE  2
-
-  static const SPH_TweakRule  PIXEL_HINTING_Rules
-                              [PIXEL_HINTING_RULES_SIZE] =
-  {
-    /* these characters are almost always safe */
-    { "Courier New", 12, "Italic", 'z' },
-    { "Courier New", 11, "Italic", 'z' },
-  };
-
-
-  /* Subpixel hinting ignores SHPIX rules on X.  Force SHPIX for these.    */
-#define DO_SHPIX_RULES_SIZE  1
-
-  static const SPH_TweakRule  DO_SHPIX_Rules
-                              [DO_SHPIX_RULES_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Skip Y moves that start with a point that is not on a Y pixel         */
-  /* boundary and don't move that point to a Y pixel boundary.             */
-#define SKIP_NONPIXEL_Y_MOVES_RULES_SIZE  4
-
-  static const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_Rules
-                              [SKIP_NONPIXEL_Y_MOVES_RULES_SIZE] =
-  {
-    /* fix vwxyz thinness */
-    { "Consolas", 0, "", 0 },
-    /* Fix thin middle stems */
-    { "Core MS Legacy Fonts", 0, "Regular", 0 },
-    /* Cyrillic small letter I */
-    { "Legacy Sans Fonts", 0, "", 0 },
-    /* Fix artifacts with some Regular & Bold */
-    { "Verdana Clones", 0, "", 0 },
-  };
-
-
-#define SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1
-
-  static const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions
-                              [SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
-  {
-    /* Fixes < and > */
-    { "Courier New", 0, "Regular", 0 },
-  };
-
-
-  /* Skip Y moves that start with a point that is not on a Y pixel         */
-  /* boundary and don't move that point to a Y pixel boundary.             */
-#define SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE  2
-
-  static const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_DELTAP_Rules
-                              [SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE] =
-  {
-    /* Maintain thickness of diagonal in 'N' */
-    { "Times New Roman", 0, "Regular/Bold Class", 'N' },
-    { "Georgia", 0, "Regular/Bold Class", 'N' },
-  };
-
-
-  /* Skip Y moves that move a point off a Y pixel boundary.                */
-#define SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE  1
-
-  static const SPH_TweakRule  SKIP_OFFPIXEL_Y_MOVES_Rules
-                              [SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-#define SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1
-
-  static const SPH_TweakRule  SKIP_OFFPIXEL_Y_MOVES_Rules_Exceptions
-                              [SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Round moves that don't move a point to a Y pixel boundary.            */
-#define ROUND_NONPIXEL_Y_MOVES_RULES_SIZE  2
-
-  static const SPH_TweakRule  ROUND_NONPIXEL_Y_MOVES_Rules
-                              [ROUND_NONPIXEL_Y_MOVES_RULES_SIZE] =
-  {
-    /* Droid font instructions don't snap Y to pixels */
-    { "Droid Sans", 0, "Regular/Italic Class", 0 },
-    { "Droid Sans Mono", 0, "", 0 },
-  };
-
-
-#define ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1
-
-  static const SPH_TweakRule  ROUND_NONPIXEL_Y_MOVES_Rules_Exceptions
-                              [ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Allow a Direct_Move along X freedom vector if matched.                */
-#define ALLOW_X_DMOVE_RULES_SIZE  1
-
-  static const SPH_TweakRule  ALLOW_X_DMOVE_Rules
-                              [ALLOW_X_DMOVE_RULES_SIZE] =
-  {
-    /* Fixes vanishing diagonal in 4 */
-    { "Verdana", 0, "Regular", '4' },
-  };
-
-
-  /* Return MS rasterizer version 35 if matched.                           */
-#define RASTERIZER_35_RULES_SIZE  8
-
-  static const SPH_TweakRule  RASTERIZER_35_Rules
-                              [RASTERIZER_35_RULES_SIZE] =
-  {
-    /* This seems to be the only way to make these look good */
-    { "Times New Roman", 0, "Regular", 'i' },
-    { "Times New Roman", 0, "Regular", 'j' },
-    { "Times New Roman", 0, "Regular", 'm' },
-    { "Times New Roman", 0, "Regular", 'r' },
-    { "Times New Roman", 0, "Regular", 'a' },
-    { "Times New Roman", 0, "Regular", 'n' },
-    { "Times New Roman", 0, "Regular", 'p' },
-    { "Times", 0, "", 0 },
-  };
-
-
-  /* Don't round to the subpixel grid.  Round to pixel grid.               */
-#define NORMAL_ROUND_RULES_SIZE  1
-
-  static const SPH_TweakRule  NORMAL_ROUND_Rules
-                              [NORMAL_ROUND_RULES_SIZE] =
-  {
-    /* Fix serif thickness for certain ppems */
-    /* Can probably be generalized somehow   */
-    { "Courier New", 0, "", 0 },
-  };
-
-
-  /* Skip IUP instructions if matched.                                     */
-#define SKIP_IUP_RULES_SIZE  1
-
-  static const SPH_TweakRule  SKIP_IUP_Rules
-                              [SKIP_IUP_RULES_SIZE] =
-  {
-    { "Arial", 13, "Regular", 'a' },
-  };
-
-
-  /* Skip MIAP Twilight hack if matched.                                   */
-#define MIAP_HACK_RULES_SIZE  1
-
-  static const SPH_TweakRule  MIAP_HACK_Rules
-                              [MIAP_HACK_RULES_SIZE] =
-  {
-    { "Geneva", 12, "", 0 },
-  };
-
-
-  /* Skip DELTAP instructions if matched.                                  */
-#define ALWAYS_SKIP_DELTAP_RULES_SIZE  23
-
-  static const SPH_TweakRule  ALWAYS_SKIP_DELTAP_Rules
-                              [ALWAYS_SKIP_DELTAP_RULES_SIZE] =
-  {
-    { "Georgia", 0, "Regular", 'k' },
-    /* fix various problems with e in different versions */
-    { "Trebuchet MS", 14, "Regular", 'e' },
-    { "Trebuchet MS", 13, "Regular", 'e' },
-    { "Trebuchet MS", 15, "Regular", 'e' },
-    { "Trebuchet MS", 0, "Italic", 'v' },
-    { "Trebuchet MS", 0, "Italic", 'w' },
-    { "Trebuchet MS", 0, "Regular", 'Y' },
-    { "Arial", 11, "Regular", 's' },
-    /* prevent problems with '3' and others */
-    { "Verdana", 10, "Regular", 0 },
-    { "Verdana", 9, "Regular", 0 },
-    /* Cyrillic small letter short I */
-    { "Legacy Sans Fonts", 0, "", 0x438 },
-    { "Legacy Sans Fonts", 0, "", 0x439 },
-    { "Arial", 10, "Regular", '6' },
-    { "Arial", 0, "Bold/BoldItalic Class", 'a' },
-    /* Make horizontal stems consistent with the rest */
-    { "Arial", 24, "Bold", 'a' },
-    { "Arial", 25, "Bold", 'a' },
-    { "Arial", 24, "Bold", 's' },
-    { "Arial", 25, "Bold", 's' },
-    { "Arial", 34, "Bold", 's' },
-    { "Arial", 35, "Bold", 's' },
-    { "Arial", 36, "Bold", 's' },
-    { "Arial", 25, "Regular", 's' },
-    { "Arial", 26, "Regular", 's' },
-  };
-
-
-  /* Always do DELTAP instructions if matched.                             */
-#define ALWAYS_DO_DELTAP_RULES_SIZE  1
-
-  static const SPH_TweakRule  ALWAYS_DO_DELTAP_Rules
-                              [ALWAYS_DO_DELTAP_RULES_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Don't allow ALIGNRP after IUP.                                        */
-#define NO_ALIGNRP_AFTER_IUP_RULES_SIZE  1
-
-  static const SPH_TweakRule  NO_ALIGNRP_AFTER_IUP_Rules
-                              [NO_ALIGNRP_AFTER_IUP_RULES_SIZE] =
-  {
-    /* Prevent creation of dents in outline */
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Don't allow DELTAP after IUP.                                         */
-#define NO_DELTAP_AFTER_IUP_RULES_SIZE  1
-
-  static const SPH_TweakRule  NO_DELTAP_AFTER_IUP_Rules
-                              [NO_DELTAP_AFTER_IUP_RULES_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Don't allow CALL after IUP.                                           */
-#define NO_CALL_AFTER_IUP_RULES_SIZE  1
-
-  static const SPH_TweakRule  NO_CALL_AFTER_IUP_Rules
-                              [NO_CALL_AFTER_IUP_RULES_SIZE] =
-  {
-    /* Prevent creation of dents in outline */
-    { "-", 0, "", 0 },
-  };
-
-
-  /* De-embolden these glyphs slightly.                                    */
-#define DEEMBOLDEN_RULES_SIZE  9
-
-  static const SPH_TweakRule  DEEMBOLDEN_Rules
-                              [DEEMBOLDEN_RULES_SIZE] =
-  {
-    { "Courier New", 0, "Bold", 'A' },
-    { "Courier New", 0, "Bold", 'W' },
-    { "Courier New", 0, "Bold", 'w' },
-    { "Courier New", 0, "Bold", 'M' },
-    { "Courier New", 0, "Bold", 'X' },
-    { "Courier New", 0, "Bold", 'K' },
-    { "Courier New", 0, "Bold", 'x' },
-    { "Courier New", 0, "Bold", 'z' },
-    { "Courier New", 0, "Bold", 'v' },
-  };
-
-
-  /* Embolden these glyphs slightly.                                       */
-#define EMBOLDEN_RULES_SIZE  2
-
-  static const SPH_TweakRule  EMBOLDEN_Rules
-                              [EMBOLDEN_RULES_SIZE] =
-  {
-    { "Courier New", 0, "Regular", 0 },
-    { "Courier New", 0, "Italic", 0 },
-  };
-
-
-  /* This is a CVT hack that makes thick horizontal stems on 2, 5, 7       */
-  /* similar to Windows XP.                                                */
-#define TIMES_NEW_ROMAN_HACK_RULES_SIZE  12
-
-  static const SPH_TweakRule  TIMES_NEW_ROMAN_HACK_Rules
-                              [TIMES_NEW_ROMAN_HACK_RULES_SIZE] =
-  {
-    { "Times New Roman", 16, "Italic", '2' },
-    { "Times New Roman", 16, "Italic", '5' },
-    { "Times New Roman", 16, "Italic", '7' },
-    { "Times New Roman", 16, "Regular", '2' },
-    { "Times New Roman", 16, "Regular", '5' },
-    { "Times New Roman", 16, "Regular", '7' },
-    { "Times New Roman", 17, "Italic", '2' },
-    { "Times New Roman", 17, "Italic", '5' },
-    { "Times New Roman", 17, "Italic", '7' },
-    { "Times New Roman", 17, "Regular", '2' },
-    { "Times New Roman", 17, "Regular", '5' },
-    { "Times New Roman", 17, "Regular", '7' },
-  };
-
-
-  /* This fudges distance on 2 to get rid of the vanishing stem issue.     */
-  /* A real solution to this is certainly welcome.                         */
-#define COURIER_NEW_2_HACK_RULES_SIZE  15
-
-  static const SPH_TweakRule  COURIER_NEW_2_HACK_Rules
-                              [COURIER_NEW_2_HACK_RULES_SIZE] =
-  {
-    { "Courier New", 10, "Regular", '2' },
-    { "Courier New", 11, "Regular", '2' },
-    { "Courier New", 12, "Regular", '2' },
-    { "Courier New", 13, "Regular", '2' },
-    { "Courier New", 14, "Regular", '2' },
-    { "Courier New", 15, "Regular", '2' },
-    { "Courier New", 16, "Regular", '2' },
-    { "Courier New", 17, "Regular", '2' },
-    { "Courier New", 18, "Regular", '2' },
-    { "Courier New", 19, "Regular", '2' },
-    { "Courier New", 20, "Regular", '2' },
-    { "Courier New", 21, "Regular", '2' },
-    { "Courier New", 22, "Regular", '2' },
-    { "Courier New", 23, "Regular", '2' },
-    { "Courier New", 24, "Regular", '2' },
-  };
-
-
-#ifndef FORCE_NATURAL_WIDTHS
-
-  /* Use compatible widths with these glyphs.  Compatible widths is always */
-  /* on when doing B/W TrueType instructing, but is used selectively here, */
-  /* typically on glyphs with 3 or more vertical stems.                    */
-#define COMPATIBLE_WIDTHS_RULES_SIZE  38
-
-  static const SPH_TweakRule  COMPATIBLE_WIDTHS_Rules
-                              [COMPATIBLE_WIDTHS_RULES_SIZE] =
-  {
-    { "Arial Unicode MS", 12, "Regular Class", 'm' },
-    { "Arial Unicode MS", 14, "Regular Class", 'm' },
-    /* Cyrillic small letter sha */
-    { "Arial", 10, "Regular Class", 0x448 },
-    { "Arial", 11, "Regular Class", 'm' },
-    { "Arial", 12, "Regular Class", 'm' },
-    /* Cyrillic small letter sha */
-    { "Arial", 12, "Regular Class", 0x448 },
-    { "Arial", 13, "Regular Class", 0x448 },
-    { "Arial", 14, "Regular Class", 'm' },
-    /* Cyrillic small letter sha */
-    { "Arial", 14, "Regular Class", 0x448 },
-    { "Arial", 15, "Regular Class", 0x448 },
-    { "Arial", 17, "Regular Class", 'm' },
-    { "DejaVu Sans", 15, "Regular Class", 0 },
-    { "Microsoft Sans Serif", 11, "Regular Class", 0 },
-    { "Microsoft Sans Serif", 12, "Regular Class", 0 },
-    { "Segoe UI", 11, "Regular Class", 0 },
-    { "Monaco", 0, "Regular Class", 0 },
-    { "Segoe UI", 12, "Regular Class", 'm' },
-    { "Segoe UI", 14, "Regular Class", 'm' },
-    { "Tahoma", 11, "Regular Class", 0 },
-    { "Times New Roman", 16, "Regular Class", 'c' },
-    { "Times New Roman", 16, "Regular Class", 'm' },
-    { "Times New Roman", 16, "Regular Class", 'o' },
-    { "Times New Roman", 16, "Regular Class", 'w' },
-    { "Trebuchet MS", 11, "Regular Class", 0 },
-    { "Trebuchet MS", 12, "Regular Class", 0 },
-    { "Trebuchet MS", 14, "Regular Class", 0 },
-    { "Trebuchet MS", 15, "Regular Class", 0 },
-    { "Ubuntu", 12, "Regular Class", 'm' },
-    /* Cyrillic small letter sha */
-    { "Verdana", 10, "Regular Class", 0x448 },
-    { "Verdana", 11, "Regular Class", 0x448 },
-    { "Verdana and Clones", 12, "Regular Class", 'i' },
-    { "Verdana and Clones", 12, "Regular Class", 'j' },
-    { "Verdana and Clones", 12, "Regular Class", 'l' },
-    { "Verdana and Clones", 12, "Regular Class", 'm' },
-    { "Verdana and Clones", 13, "Regular Class", 'i' },
-    { "Verdana and Clones", 13, "Regular Class", 'j' },
-    { "Verdana and Clones", 13, "Regular Class", 'l' },
-    { "Verdana and Clones", 14, "Regular Class", 'm' },
-  };
-
-
-  /* Scaling slightly in the x-direction prior to hinting results in       */
-  /* more visually pleasing glyphs in certain cases.                       */
-  /* This sometimes needs to be coordinated with compatible width rules.   */
-  /* A value of 1000 corresponds to a scaled value of 1.0.                 */
-
-#define X_SCALING_RULES_SIZE  50
-
-  static const SPH_ScaleRule  X_SCALING_Rules[X_SCALING_RULES_SIZE] =
-  {
-    { "DejaVu Sans", 12, "Regular Class", 'm', 950 },
-    { "Verdana and Clones", 12, "Regular Class", 'a', 1100 },
-    { "Verdana and Clones", 13, "Regular Class", 'a', 1050 },
-    { "Arial", 11, "Regular Class", 'm', 975 },
-    { "Arial", 12, "Regular Class", 'm', 1050 },
-    /* Cyrillic small letter el */
-    { "Arial", 13, "Regular Class", 0x43B, 950 },
-    { "Arial", 13, "Regular Class", 'o', 950 },
-    { "Arial", 13, "Regular Class", 'e', 950 },
-    { "Arial", 14, "Regular Class", 'm', 950 },
-    /* Cyrillic small letter el */
-    { "Arial", 15, "Regular Class", 0x43B, 925 },
-    { "Bitstream Vera Sans", 10, "Regular/Italic Class", 0, 1100 },
-    { "Bitstream Vera Sans", 12, "Regular/Italic Class", 0, 1050 },
-    { "Bitstream Vera Sans", 16, "Regular Class", 0, 1050 },
-    { "Bitstream Vera Sans", 9, "Regular/Italic Class", 0, 1050 },
-    { "DejaVu Sans", 12, "Regular Class", 'l', 975 },
-    { "DejaVu Sans", 12, "Regular Class", 'i', 975 },
-    { "DejaVu Sans", 12, "Regular Class", 'j', 975 },
-    { "DejaVu Sans", 13, "Regular Class", 'l', 950 },
-    { "DejaVu Sans", 13, "Regular Class", 'i', 950 },
-    { "DejaVu Sans", 13, "Regular Class", 'j', 950 },
-    { "DejaVu Sans", 10, "Regular/Italic Class", 0, 1100 },
-    { "DejaVu Sans", 12, "Regular/Italic Class", 0, 1050 },
-    { "Georgia", 10, "", 0, 1050 },
-    { "Georgia", 11, "", 0, 1100 },
-    { "Georgia", 12, "", 0, 1025 },
-    { "Georgia", 13, "", 0, 1050 },
-    { "Georgia", 16, "", 0, 1050 },
-    { "Georgia", 17, "", 0, 1030 },
-    { "Liberation Sans", 12, "Regular Class", 'm', 1100 },
-    { "Lucida Grande", 11, "Regular Class", 'm', 1100 },
-    { "Microsoft Sans Serif", 11, "Regular Class", 'm', 950 },
-    { "Microsoft Sans Serif", 12, "Regular Class", 'm', 1050 },
-    { "Segoe UI", 12, "Regular Class", 'H', 1050 },
-    { "Segoe UI", 12, "Regular Class", 'm', 1050 },
-    { "Segoe UI", 14, "Regular Class", 'm', 1050 },
-    { "Tahoma", 11, "Regular Class", 'i', 975 },
-    { "Tahoma", 11, "Regular Class", 'l', 975 },
-    { "Tahoma", 11, "Regular Class", 'j', 900 },
-    { "Tahoma", 11, "Regular Class", 'm', 918 },
-    { "Verdana", 10, "Regular/Italic Class", 0, 1100 },
-    { "Verdana", 12, "Regular Class", 'm', 975 },
-    { "Verdana", 12, "Regular/Italic Class", 0, 1050 },
-    { "Verdana", 13, "Regular/Italic Class", 'i', 950 },
-    { "Verdana", 13, "Regular/Italic Class", 'j', 950 },
-    { "Verdana", 13, "Regular/Italic Class", 'l', 950 },
-    { "Verdana", 16, "Regular Class", 0, 1050 },
-    { "Verdana", 9, "Regular/Italic Class", 0, 1050 },
-    { "Times New Roman", 16, "Regular Class", 'm', 918 },
-    { "Trebuchet MS", 11, "Regular Class", 'm', 800 },
-    { "Trebuchet MS", 12, "Regular Class", 'm', 800 },
-  };
-
-#else
-
-#define COMPATIBLE_WIDTHS_RULES_SIZE  1
-
-  static const SPH_TweakRule  COMPATIBLE_WIDTHS_Rules
-                              [COMPATIBLE_WIDTHS_RULES_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-#define X_SCALING_RULES_SIZE  1
-
-  static const SPH_ScaleRule  X_SCALING_Rules
-                              [X_SCALING_RULES_SIZE] =
-  {
-    { "-", 0, "", 0, 1000 },
-  };
-
-#endif /* FORCE_NATURAL_WIDTHS */
-
-
-  static FT_Bool
-  is_member_of_family_class( const FT_String*  detected_font_name,
-                             const FT_String*  rule_font_name )
-  {
-    FT_UInt  i, j;
-
-
-    /* Does font name match rule family? */
-    if ( ft_strcmp( detected_font_name, rule_font_name ) == 0 )
-      return TRUE;
-
-    /* Is font name a wildcard ""? */
-    if ( ft_strcmp( rule_font_name, "" ) == 0 )
-      return TRUE;
-
-    /* Is font name contained in a class list? */
-    for ( i = 0; i < FAMILY_CLASS_RULES_SIZE; i++ )
-    {
-      if ( ft_strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 )
-      {
-        for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
-        {
-          if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j], "" ) == 0 )
-            continue;
-          if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j],
-                          detected_font_name ) == 0 )
-            return TRUE;
-        }
-      }
-    }
-
-    return FALSE;
-  }
-
-
-  static FT_Bool
-  is_member_of_style_class( const FT_String*  detected_font_style,
-                            const FT_String*  rule_font_style )
-  {
-    FT_UInt  i, j;
-
-
-    /* Does font style match rule style? */
-    if ( ft_strcmp( detected_font_style, rule_font_style ) == 0 )
-      return TRUE;
-
-    /* Is font style a wildcard ""? */
-    if ( ft_strcmp( rule_font_style, "" ) == 0 )
-      return TRUE;
-
-    /* Is font style contained in a class list? */
-    for ( i = 0; i < STYLE_CLASS_RULES_SIZE; i++ )
-    {
-      if ( ft_strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 )
-      {
-        for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
-        {
-          if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j], "" ) == 0 )
-            continue;
-          if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j],
-                          detected_font_style ) == 0 )
-            return TRUE;
-        }
-      }
-    }
-
-    return FALSE;
-  }
-
-
-  FT_LOCAL_DEF( FT_Bool )
-  sph_test_tweak( TT_Face               face,
-                  const FT_String*      family,
-                  FT_UInt               ppem,
-                  const FT_String*      style,
-                  FT_UInt               glyph_index,
-                  const SPH_TweakRule*  rule,
-                  FT_UInt               num_rules )
-  {
-    FT_UInt  i;
-
-
-    /* rule checks may be able to be optimized further */
-    for ( i = 0; i < num_rules; i++ )
-    {
-      if ( family                                                   &&
-           ( is_member_of_family_class ( family, rule[i].family ) ) )
-        if ( rule[i].ppem == 0    ||
-             rule[i].ppem == ppem )
-          if ( style                                             &&
-               is_member_of_style_class ( style, rule[i].style ) )
-            if ( rule[i].glyph == 0                                ||
-                 FT_Get_Char_Index( (FT_Face)face,
-                                    rule[i].glyph ) == glyph_index )
-        return TRUE;
-    }
-
-    return FALSE;
-  }
-
-
-  static FT_UInt
-  scale_test_tweak( TT_Face               face,
-                    const FT_String*      family,
-                    FT_UInt               ppem,
-                    const FT_String*      style,
-                    FT_UInt               glyph_index,
-                    const SPH_ScaleRule*  rule,
-                    FT_UInt               num_rules )
-  {
-    FT_UInt  i;
-
-
-    /* rule checks may be able to be optimized further */
-    for ( i = 0; i < num_rules; i++ )
-    {
-      if ( family                                                   &&
-           ( is_member_of_family_class ( family, rule[i].family ) ) )
-        if ( rule[i].ppem == 0    ||
-             rule[i].ppem == ppem )
-          if ( style                                            &&
-               is_member_of_style_class( style, rule[i].style ) )
-            if ( rule[i].glyph == 0                                ||
-                 FT_Get_Char_Index( (FT_Face)face,
-                                    rule[i].glyph ) == glyph_index )
-        return rule[i].scale;
-    }
-
-    return 1000;
-  }
-
-
-  FT_LOCAL_DEF( FT_UInt )
-  sph_test_tweak_x_scaling( TT_Face           face,
-                            const FT_String*  family,
-                            FT_UInt           ppem,
-                            const FT_String*  style,
-                            FT_UInt           glyph_index )
-  {
-    return scale_test_tweak( face, family, ppem, style, glyph_index,
-                             X_SCALING_Rules, X_SCALING_RULES_SIZE );
-  }
-
-
-#define TWEAK_RULES( x )                                       \
-  if ( sph_test_tweak( face, family, ppem, style, glyph_index, \
-                       x##_Rules, x##_RULES_SIZE ) )           \
-    loader->exec->sph_tweak_flags |= SPH_TWEAK_##x
-
-#define TWEAK_RULES_EXCEPTIONS( x )                                        \
-  if ( sph_test_tweak( face, family, ppem, style, glyph_index,             \
-                       x##_Rules_Exceptions, x##_RULES_EXCEPTIONS_SIZE ) ) \
-    loader->exec->sph_tweak_flags &= ~SPH_TWEAK_##x
-
-
-  FT_LOCAL_DEF( void )
-  sph_set_tweaks( TT_Loader  loader,
-                  FT_UInt    glyph_index )
-  {
-    TT_Face     face   = loader->face;
-    FT_String*  family = face->root.family_name;
-    FT_UInt     ppem   = loader->size->metrics->x_ppem;
-    FT_String*  style  = face->root.style_name;
-
-
-    /* don't apply rules if style isn't set */
-    if ( !face->root.style_name )
-      return;
-
-#ifdef SPH_DEBUG_MORE_VERBOSE
-    printf( "%s,%d,%s,%c=%d ",
-            family, ppem, style, glyph_index, glyph_index );
-#endif
-
-    TWEAK_RULES( PIXEL_HINTING );
-
-    if ( loader->exec->sph_tweak_flags & SPH_TWEAK_PIXEL_HINTING )
-    {
-      loader->exec->ignore_x_mode = FALSE;
-      return;
-    }
-
-    TWEAK_RULES( ALLOW_X_DMOVE );
-    TWEAK_RULES( ALWAYS_DO_DELTAP );
-    TWEAK_RULES( ALWAYS_SKIP_DELTAP );
-    TWEAK_RULES( DEEMBOLDEN );
-    TWEAK_RULES( DO_SHPIX );
-    TWEAK_RULES( EMBOLDEN );
-    TWEAK_RULES( MIAP_HACK );
-    TWEAK_RULES( NORMAL_ROUND );
-    TWEAK_RULES( NO_ALIGNRP_AFTER_IUP );
-    TWEAK_RULES( NO_CALL_AFTER_IUP );
-    TWEAK_RULES( NO_DELTAP_AFTER_IUP );
-    TWEAK_RULES( RASTERIZER_35 );
-    TWEAK_RULES( SKIP_IUP );
-
-    TWEAK_RULES( SKIP_OFFPIXEL_Y_MOVES );
-    TWEAK_RULES_EXCEPTIONS( SKIP_OFFPIXEL_Y_MOVES );
-
-    TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES_DELTAP );
-
-    TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES );
-    TWEAK_RULES_EXCEPTIONS( SKIP_NONPIXEL_Y_MOVES );
-
-    TWEAK_RULES( ROUND_NONPIXEL_Y_MOVES );
-    TWEAK_RULES_EXCEPTIONS( ROUND_NONPIXEL_Y_MOVES );
-
-    if ( loader->exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )
-    {
-      if ( loader->exec->rasterizer_version != TT_INTERPRETER_VERSION_35 )
-      {
-        loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
-        loader->exec->size->cvt_ready    = -1;
-
-        tt_size_ready_bytecode(
-          loader->exec->size,
-          FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );
-      }
-      else
-        loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
-    }
-    else
-    {
-      if ( loader->exec->rasterizer_version  !=
-           SPH_OPTION_SET_RASTERIZER_VERSION )
-      {
-        loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
-        loader->exec->size->cvt_ready    = -1;
-
-        tt_size_ready_bytecode(
-          loader->exec->size,
-          FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );
-      }
-      else
-        loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
-    }
-
-    if ( IS_HINTED( loader->load_flags ) )
-    {
-      TWEAK_RULES( TIMES_NEW_ROMAN_HACK );
-      TWEAK_RULES( COURIER_NEW_2_HACK );
-    }
-
-    if ( sph_test_tweak( face, family, ppem, style, glyph_index,
-           COMPATIBILITY_MODE_Rules, COMPATIBILITY_MODE_RULES_SIZE ) )
-      loader->exec->face->sph_compatibility_mode = TRUE;
-
-
-    if ( IS_HINTED( loader->load_flags ) )
-    {
-      if ( sph_test_tweak( face, family, ppem, style, glyph_index,
-             COMPATIBLE_WIDTHS_Rules, COMPATIBLE_WIDTHS_RULES_SIZE ) )
-        loader->exec->compatible_widths |= TRUE;
-    }
-  }
-
-#else /* !(TT_USE_BYTECODE_INTERPRETER &&          */
-      /*   TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */
-
-  /* ANSI C doesn't like empty source files */
-  typedef int  _tt_subpix_dummy;
-
-#endif /* !(TT_USE_BYTECODE_INTERPRETER &&          */
-       /*   TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */
-
-
-/* END */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/truetype/ttsubpix.h	1970-01-01 00:00:00.000000000 +0000
@@ -1,110 +0,0 @@
-/****************************************************************************
- *
- * ttsubpix.h
- *
- *   TrueType Subpixel Hinting.
- *
- * Copyright (C) 2010-2023 by
- * David Turner, Robert Wilhelm, and Werner Lemberg.
- *
- * This file is part of the FreeType project, and may only be used,
- * modified, and distributed under the terms of the FreeType project
- * license, LICENSE.TXT.  By continuing to use, modify, or distribute
- * this file you indicate that you have read the license and
- * understand and accept it fully.
- *
- */
-
-
-#ifndef TTSUBPIX_H_
-#define TTSUBPIX_H_
-
-#include "ttobjs.h"
-#include "ttinterp.h"
-
-
-FT_BEGIN_HEADER
-
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-  /**************************************************************************
-   *
-   * ID flags to identify special functions at FDEF and runtime.
-   *
-   */
-#define SPH_FDEF_INLINE_DELTA_1       0x0000001
-#define SPH_FDEF_INLINE_DELTA_2       0x0000002
-#define SPH_FDEF_DIAGONAL_STROKE      0x0000004
-#define SPH_FDEF_VACUFORM_ROUND_1     0x0000008
-#define SPH_FDEF_TTFAUTOHINT_1        0x0000010
-#define SPH_FDEF_SPACING_1            0x0000020
-#define SPH_FDEF_SPACING_2            0x0000040
-#define SPH_FDEF_TYPEMAN_STROKES      0x0000080
-#define SPH_FDEF_TYPEMAN_DIAGENDCTRL  0x0000100
-
-
-  /**************************************************************************
-   *
-   * Tweak flags that are set for each glyph by the below rules.
-   *
-   */
-#define SPH_TWEAK_ALLOW_X_DMOVE                   0x0000001UL
-#define SPH_TWEAK_ALWAYS_DO_DELTAP                0x0000002UL
-#define SPH_TWEAK_ALWAYS_SKIP_DELTAP              0x0000004UL
-#define SPH_TWEAK_COURIER_NEW_2_HACK              0x0000008UL
-#define SPH_TWEAK_DEEMBOLDEN                      0x0000010UL
-#define SPH_TWEAK_DO_SHPIX                        0x0000020UL
-#define SPH_TWEAK_EMBOLDEN                        0x0000040UL
-#define SPH_TWEAK_MIAP_HACK                       0x0000080UL
-#define SPH_TWEAK_NORMAL_ROUND                    0x0000100UL
-#define SPH_TWEAK_NO_ALIGNRP_AFTER_IUP            0x0000200UL
-#define SPH_TWEAK_NO_CALL_AFTER_IUP               0x0000400UL
-#define SPH_TWEAK_NO_DELTAP_AFTER_IUP             0x0000800UL
-#define SPH_TWEAK_PIXEL_HINTING                   0x0001000UL
-#define SPH_TWEAK_RASTERIZER_35                   0x0002000UL
-#define SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES          0x0004000UL
-#define SPH_TWEAK_SKIP_IUP                        0x0008000UL
-#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES           0x0010000UL
-#define SPH_TWEAK_SKIP_OFFPIXEL_Y_MOVES           0x0020000UL
-#define SPH_TWEAK_TIMES_NEW_ROMAN_HACK            0x0040000UL
-#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP    0x0080000UL
-
-
-  FT_LOCAL( FT_Bool )
-  sph_test_tweak( TT_Face               face,
-                  const FT_String*      family,
-                  FT_UInt               ppem,
-                  const FT_String*      style,
-                  FT_UInt               glyph_index,
-                  const SPH_TweakRule*  rule,
-                  FT_UInt               num_rules );
-
-  FT_LOCAL( FT_UInt )
-  sph_test_tweak_x_scaling( TT_Face           face,
-                            const FT_String*  family,
-                            FT_UInt           ppem,
-                            const FT_String*  style,
-                            FT_UInt           glyph_index );
-
-  FT_LOCAL( void )
-  sph_set_tweaks( TT_Loader  loader,
-                  FT_UInt    glyph_index );
-
-
-  /* These macros are defined absent a method for setting them */
-#define SPH_OPTION_BITMAP_WIDTHS           FALSE
-#define SPH_OPTION_SET_SUBPIXEL            TRUE
-#define SPH_OPTION_SET_GRAYSCALE           FALSE
-#define SPH_OPTION_SET_COMPATIBLE_WIDTHS   FALSE
-#define SPH_OPTION_SET_RASTERIZER_VERSION  38
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-
-FT_END_HEADER
-
-#endif /* TTSUBPIX_H_ */
-
-
-/* END */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1afm.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1afm.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1afm.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1afm.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   AFM support for Type 1 fonts (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1afm.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1afm.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1afm.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1afm.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   AFM support for Type 1 fonts (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1driver.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1driver.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1driver.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1driver.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Type 1 driver interface (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1driver.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1driver.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1driver.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1driver.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   High-level Type 1 driver interface (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1errors.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1errors.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1errors.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1errors.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Type 1 error codes (specification only).
  *
- * Copyright (C) 2001-2024 by
+ * Copyright (C) 2001-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1gload.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1gload.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1gload.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1gload.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Type 1 Glyph Loader (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -70,8 +70,13 @@
     /* For incremental fonts get the character data using the */
     /* callback function.                                     */
     if ( inc )
+    {
+      /* So `free_glyph_data` knows whether to free it. */
+      char_string->pointer = NULL;
+
       error = inc->funcs->get_glyph_data( inc->object,
                                           glyph_index, char_string );
+    }
     else
 
 #endif /* FT_CONFIG_OPTION_INCREMENTAL */
@@ -155,6 +160,9 @@
       decoder->builder.advance.y      = INT_TO_FIXED( metrics.advance_v );
     }
 
+    if ( error && inc )
+      inc->funcs->free_glyph_data( inc->object, char_string );
+
 #endif /* FT_CONFIG_OPTION_INCREMENTAL */
 
     return error;
@@ -295,7 +303,7 @@
       {
         advances[nn] = 0;
 
-        FT_TRACE5(( "  idx %d: advance height 0 font units\n",
+        FT_TRACE5(( "  idx %u: advance height 0 font units\n",
                     first + nn ));
       }
 
@@ -333,7 +341,7 @@
       else
         advances[nn] = 0;
 
-      FT_TRACE5(( "  idx %d: advance width %ld font unit%s\n",
+      FT_TRACE5(( "  idx %u: advance width %ld font unit%s\n",
                   first + nn,
                   advances[nn],
                   advances[nn] == 1 ? "" : "s" ));
@@ -380,7 +388,7 @@
       goto Exit;
     }
 
-    FT_TRACE1(( "T1_Load_Glyph: glyph index %d\n", glyph_index ));
+    FT_TRACE1(( "T1_Load_Glyph: glyph index %u\n", glyph_index ));
 
     FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
 
@@ -398,16 +406,12 @@
       glyph->y_scale = 0x10000L;
     }
 
-    t1glyph->outline.n_points   = 0;
-    t1glyph->outline.n_contours = 0;
-
     hinting = FT_BOOL( !( load_flags & FT_LOAD_NO_SCALE   ) &&
                        !( load_flags & FT_LOAD_NO_HINTING ) );
     scaled  = FT_BOOL( !( load_flags & FT_LOAD_NO_SCALE   ) );
 
     glyph->hint     = hinting;
     glyph->scaled   = scaled;
-    t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
 
     error = decoder_funcs->init( &decoder,
                                  t1glyph->face,
@@ -452,16 +456,12 @@
 
     must_finish_decoder = FALSE;
 
-    /* now, set the metrics -- this is rather simple, as   */
-    /* the left side bearing is the xMin, and the top side */
-    /* bearing the yMax                                    */
     if ( !error )
     {
-      t1glyph->outline.flags &= FT_OUTLINE_OWNER;
-      t1glyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
-
-      /* for composite glyphs, return only left side bearing and */
-      /* advance width                                           */
+      /* now, set the metrics -- this is rather simple, as   */
+      /* the left side bearing is the xMin, and the top side */
+      /* bearing the yMax; for composite glyphs, return only */
+      /* left side bearing and advance width                 */
       if ( load_flags & FT_LOAD_NO_RECURSE )
       {
         FT_Slot_Internal  internal = t1glyph->internal;
@@ -482,6 +482,13 @@
         FT_Glyph_Metrics*  metrics = &t1glyph->metrics;
 
 
+        t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+        t1glyph->outline.flags &= FT_OUTLINE_OWNER;
+        t1glyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
+        if ( t1size && t1size->metrics.y_ppem < 24 )
+          t1glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
         /* copy the _unscaled_ advance width */
         metrics->horiAdvance =
           FIXED_TO_INT( decoder.builder.advance.x );
@@ -504,11 +511,6 @@
             FIXED_TO_INT( decoder.builder.advance.y );
         }
 
-        t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
-
-        if ( t1size && t1size->metrics.y_ppem < 24 )
-          t1glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
-
 #if 1
         /* apply the font matrix, if any */
         if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L ||
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1gload.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1gload.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1gload.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1gload.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Type 1 Glyph Loader (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1load.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1load.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1load.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1load.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Type 1 font loader (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -471,7 +471,7 @@
     nc = num_coords;
     if ( num_coords > blend->num_axis )
     {
-      FT_TRACE2(( "T1_Get_MM_Blend: only using first %d of %d coordinates\n",
+      FT_TRACE2(( "T1_Get_MM_Blend: only using first %u of %u coordinates\n",
                   blend->num_axis, num_coords ));
       nc = blend->num_axis;
     }
@@ -640,7 +640,7 @@
   {
     FT_UNUSED( instance_index );
 
-    return T1_Set_MM_Blend( face, 0, NULL );
+    return T1_Set_MM_WeightVector( face, 0, NULL );
   }
 
 
@@ -691,7 +691,7 @@
     if ( num_coords > blend->num_axis )
     {
       FT_TRACE2(( "T1_Get_Var_Design:"
-                  " only using first %d of %d coordinates\n",
+                  " only using first %u of %u coordinates\n",
                   blend->num_axis, num_coords ));
       nc = blend->num_axis;
     }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1load.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1load.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1load.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1load.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Type 1 font loader (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1objs.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1objs.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1objs.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1objs.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Type 1 objects manager (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1objs.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1objs.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1objs.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1objs.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Type 1 objects manager (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1parse.c openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1parse.c
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1parse.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1parse.c	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Type 1 parser (body).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1parse.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1parse.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1parse.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1parse.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Type 1 parser (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1tokens.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1tokens.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libfreetype/src/type1/t1tokens.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libfreetype/src/type1/t1tokens.h	2026-04-17 19:09:35.000000000 +0000
@@ -4,7 +4,7 @@
  *
  *   Type 1 tokenizer (specification).
  *
- * Copyright (C) 1996-2024 by
+ * Copyright (C) 1996-2025 by
  * David Turner, Robert Wilhelm, and Werner Lemberg.
  *
  * This file is part of the FreeType project, and may only be used,
@@ -33,7 +33,7 @@
                    T1_FIELD_DICT_FONTDICT )
 
   /* we use pointers to detect modifications made by synthetic fonts */
-  T1_FIELD_NUM   ( "ItalicAngle",        italic_angle,
+  T1_FIELD_FIXED ( "ItalicAngle",        italic_angle,
                    T1_FIELD_DICT_FONTDICT )
   T1_FIELD_BOOL  ( "isFixedPitch",       is_fixed_pitch,
                    T1_FIELD_DICT_FONTDICT )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Color/COLR/COLR.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Color/COLR/COLR.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Color/COLR/COLR.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Color/COLR/COLR.hh	2026-04-17 19:09:35.000000000 +0000
@@ -104,7 +104,7 @@
     foreground (foreground_),
     instancer (instancer_)
   {
-    if (font->is_synthetic ())
+    if (font->is_synthetic)
     {
       font = hb_font_create_sub_font (font);
       hb_font_set_synthetic_bold (font, 0, 0, true);
@@ -178,7 +178,10 @@
   { glyphs->add (glyph_id); }
 
   void add_layer_indices (unsigned first_layer_index, unsigned num_of_layers)
-  { layer_indices->add_range (first_layer_index, first_layer_index + num_of_layers - 1); }
+  {
+    if (num_of_layers == 0) return;
+    layer_indices->add_range (first_layer_index, first_layer_index + num_of_layers - 1);
+  }
 
   void add_palette_index (unsigned palette_index)
   { palette_indices->add (palette_index); }
@@ -650,10 +653,10 @@
     TRACE_SUBSET (this);
     auto *out = c->serializer->embed (this);
     if (unlikely (!out)) return_trace (false);
-    return_trace (c->serializer->check_assign (out->firstLayerIndex, c->plan->colrv1_layers.get (firstLayerIndex),
-                                               HB_SERIALIZE_ERROR_INT_OVERFLOW));
 
-    return_trace (true);
+    uint32_t first_layer_index = numLayers ? c->plan->colrv1_layers.get (firstLayerIndex) : 0;
+    return_trace (c->serializer->check_assign (out->firstLayerIndex, first_layer_index,
+                                               HB_SERIALIZE_ERROR_INT_OVERFLOW));
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -1075,9 +1078,9 @@
     float ddx = dx + c->instancer (varIdxBase, 0);
     float ddy = dy + c->instancer (varIdxBase, 1);
 
-    bool p1 = c->funcs->push_translate (c->data, ddx, ddy);
+    c->funcs->push_translate (c->data, ddx, ddy);
     c->recurse (this+src);
-    if (p1) c->funcs->pop_transform (c->data);
+    c->funcs->pop_transform (c->data);
   }
 
   HBUINT8               format; /* format = 14(noVar) or 15 (Var) */
@@ -1124,9 +1127,9 @@
     float sx = scaleX.to_float (c->instancer (varIdxBase, 0));
     float sy = scaleY.to_float (c->instancer (varIdxBase, 1));
 
-    bool p1 = c->funcs->push_scale (c->data, sx, sy);
+    c->funcs->push_scale (c->data, sx, sy);
     c->recurse (this+src);
-    if (p1) c->funcs->pop_transform (c->data);
+    c->funcs->pop_transform (c->data);
   }
 
   HBUINT8               format; /* format = 16 (noVar) or 17(Var) */
@@ -1177,13 +1180,9 @@
     float tCenterX = centerX + c->instancer (varIdxBase, 2);
     float tCenterY = centerY + c->instancer (varIdxBase, 3);
 
-    bool p1 = c->funcs->push_translate (c->data, +tCenterX, +tCenterY);
-    bool p2 = c->funcs->push_scale (c->data, sx, sy);
-    bool p3 = c->funcs->push_translate (c->data, -tCenterX, -tCenterY);
+    c->funcs->push_scale_around_center (c->data, sx, sy, tCenterX, tCenterY);
     c->recurse (this+src);
-    if (p3) c->funcs->pop_transform (c->data);
-    if (p2) c->funcs->pop_transform (c->data);
-    if (p1) c->funcs->pop_transform (c->data);
+    c->funcs->pop_transform (c->data);
   }
 
   HBUINT8               format; /* format = 18 (noVar) or 19(Var) */
@@ -1228,9 +1227,9 @@
     TRACE_PAINT (this);
     float s = scale.to_float (c->instancer (varIdxBase, 0));
 
-    bool p1 = c->funcs->push_scale (c->data, s, s);
+    c->funcs->push_scale (c->data, s, s);
     c->recurse (this+src);
-    if (p1) c->funcs->pop_transform (c->data);
+    c->funcs->pop_transform (c->data);
   }
 
   HBUINT8               format; /* format = 20 (noVar) or 21(Var) */
@@ -1278,13 +1277,9 @@
     float tCenterX = centerX + c->instancer (varIdxBase, 1);
     float tCenterY = centerY + c->instancer (varIdxBase, 2);
 
-    bool p1 = c->funcs->push_translate (c->data, +tCenterX, +tCenterY);
-    bool p2 = c->funcs->push_scale (c->data, s, s);
-    bool p3 = c->funcs->push_translate (c->data, -tCenterX, -tCenterY);
+    c->funcs->push_scale_around_center (c->data, s, s, tCenterX, tCenterY);
     c->recurse (this+src);
-    if (p3) c->funcs->pop_transform (c->data);
-    if (p2) c->funcs->pop_transform (c->data);
-    if (p1) c->funcs->pop_transform (c->data);
+    c->funcs->pop_transform (c->data);
   }
 
   HBUINT8               format; /* format = 22 (noVar) or 23(Var) */
@@ -1328,9 +1323,9 @@
     TRACE_PAINT (this);
     float a = angle.to_float (c->instancer (varIdxBase, 0));
 
-    bool p1 = c->funcs->push_rotate (c->data, a);
+    c->funcs->push_rotate (c->data, a);
     c->recurse (this+src);
-    if (p1) c->funcs->pop_transform (c->data);
+    c->funcs->pop_transform (c->data);
   }
 
   HBUINT8               format; /* format = 24 (noVar) or 25(Var) */
@@ -1378,13 +1373,9 @@
     float tCenterX = centerX + c->instancer (varIdxBase, 1);
     float tCenterY = centerY + c->instancer (varIdxBase, 2);
 
-    bool p1 = c->funcs->push_translate (c->data, +tCenterX, +tCenterY);
-    bool p2 = c->funcs->push_rotate (c->data, a);
-    bool p3 = c->funcs->push_translate (c->data, -tCenterX, -tCenterY);
+    c->funcs->push_rotate_around_center (c->data, a, tCenterX, tCenterY);
     c->recurse (this+src);
-    if (p3) c->funcs->pop_transform (c->data);
-    if (p2) c->funcs->pop_transform (c->data);
-    if (p1) c->funcs->pop_transform (c->data);
+    c->funcs->pop_transform (c->data);
   }
 
   HBUINT8               format; /* format = 26 (noVar) or 27(Var) */
@@ -1432,9 +1423,9 @@
     float sx = xSkewAngle.to_float(c->instancer (varIdxBase, 0));
     float sy = ySkewAngle.to_float(c->instancer (varIdxBase, 1));
 
-    bool p1 = c->funcs->push_skew (c->data, sx, sy);
+    c->funcs->push_skew (c->data, sx, sy);
     c->recurse (this+src);
-    if (p1) c->funcs->pop_transform (c->data);
+    c->funcs->pop_transform (c->data);
   }
 
   HBUINT8               format; /* format = 28(noVar) or 29 (Var) */
@@ -1485,13 +1476,9 @@
     float tCenterX = centerX + c->instancer (varIdxBase, 2);
     float tCenterY = centerY + c->instancer (varIdxBase, 3);
 
-    bool p1 = c->funcs->push_translate (c->data, +tCenterX, +tCenterY);
-    bool p2 = c->funcs->push_skew (c->data, sx, sy);
-    bool p3 = c->funcs->push_translate (c->data, -tCenterX, -tCenterY);
+    c->funcs->push_skew_around_center (c->data, sx, sy, tCenterX, tCenterY);
     c->recurse (this+src);
-    if (p3) c->funcs->pop_transform (c->data);
-    if (p2) c->funcs->pop_transform (c->data);
-    if (p1) c->funcs->pop_transform (c->data);
+    c->funcs->pop_transform (c->data);
   }
 
   HBUINT8               format; /* format = 30(noVar) or 31 (Var) */
@@ -1626,7 +1613,7 @@
                const ItemVarStoreInstancer &instancer) const
   {
     TRACE_SUBSET (this);
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: return_trace (u.format1.subset (c, instancer, VarIdx::NO_VARIATION));
     case 2: return_trace (u.format2.subset (c, instancer));
     default:return_trace (c->default_return_value ());
@@ -1635,7 +1622,7 @@
 
   void closurev1 (hb_colrv1_closure_context_t* c) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 2: u.format2.closurev1 (c); return;
     default:return;
     }
@@ -1644,9 +1631,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...));
     case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...));
     default:return_trace (c->default_return_value ());
@@ -1657,7 +1644,7 @@
                     const ItemVarStoreInstancer &instancer) const
   {
     ClipBoxData clip_box;
-    switch (u.format) {
+    switch (u.format.v) {
     case 1:
       u.format1.get_clip_box (clip_box, instancer);
       break;
@@ -1677,7 +1664,7 @@
 
   protected:
   union {
-  HBUINT8               format;         /* Format identifier */
+  struct { HBUINT8 v; } format;         /* Format identifier */
   ClipBoxFormat1        format1;
   ClipBoxFormat2        format2;
   } u;
@@ -1857,9 +1844,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: return_trace (c->dispatch (u.paintformat1, std::forward (ds)...));
     case 2: return_trace (c->dispatch (u.paintformat2, std::forward (ds)...));
     case 3: return_trace (c->dispatch (u.paintformat3, std::forward (ds)...));
@@ -1898,7 +1885,7 @@
 
   protected:
   union {
-  HBUINT8                                       format;
+  struct { HBUINT8 v; }                         format;
   PaintColrLayers                               paintformat1;
   NoVariable                        paintformat2;
   Variable                          paintformat3;
@@ -2073,7 +2060,7 @@
     outer_bit_count = 1;
     inner_bit_count = 1;
 
-    if (unlikely (!output_map.resize (map_count, false))) return false;
+    if (unlikely (!output_map.resize_dirty (map_count))) return false;
 
     for (unsigned idx = 0; idx < map_count; idx++)
     {
@@ -2693,7 +2680,8 @@
   {
     ItemVarStoreInstancer instancer (get_var_store_ptr (),
                                      get_delta_set_index_map_ptr (),
-                                     hb_array (font->coords, font->num_coords));
+                                     hb_array (font->coords,
+                                               font->has_nonzero_coords ? font->num_coords : 0));
     hb_paint_context_t c (this, funcs, data, font, palette_index, foreground, instancer);
 
     hb_decycler_node_t node (c.glyphs_decycler);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Color/CPAL/CPAL.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Color/CPAL/CPAL.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Color/CPAL/CPAL.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Color/CPAL/CPAL.hh	2026-04-17 19:09:35.000000000 +0000
@@ -307,6 +307,7 @@
       if (first_color_to_layer_index.has (first_color_record_idx)) continue;
 
       first_color_index_for_layer.push (first_color_record_idx);
+      if (unlikely (!c->serializer->propagate_error (first_color_index_for_layer))) return_trace (false);
       first_color_to_layer_index.set (first_color_record_idx,
                                       first_color_index_for_layer.length - 1);
     }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/Common/Coverage.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/Common/Coverage.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/Common/Coverage.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/Common/Coverage.hh	2026-04-17 19:09:35.000000000 +0000
@@ -46,7 +46,7 @@
 
   protected:
   union {
-  HBUINT16                      format;         /* Format identifier */
+  struct { HBUINT16 v; }        format;         /* Format identifier */
   CoverageFormat1_3 format1;
   CoverageFormat2_4 format2;
 #ifndef HB_NO_BEYOND_64K
@@ -55,7 +55,7 @@
 #endif
   } u;
   public:
-  DEFINE_SIZE_UNION (2, format);
+  DEFINE_SIZE_UNION (2, format.v);
 
 #ifndef HB_OPTIMIZE_SIZE
   HB_ALWAYS_INLINE
@@ -63,9 +63,9 @@
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return_trace (false);
+    if (!u.format.v.sanitize (c)) return_trace (false);
     hb_barrier ();
-    switch (u.format)
+    switch (u.format.v)
     {
     case 1: return_trace (u.format1.sanitize (c));
     case 2: return_trace (u.format2.sanitize (c));
@@ -86,7 +86,7 @@
   unsigned int get (hb_codepoint_t k) const { return get_coverage (k); }
   unsigned int get_coverage (hb_codepoint_t glyph_id) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: return u.format1.get_coverage (glyph_id);
     case 2: return u.format2.get_coverage (glyph_id);
 #ifndef HB_NO_BEYOND_64K
@@ -97,18 +97,38 @@
     }
   }
   unsigned int get_coverage (hb_codepoint_t glyph_id,
-                             hb_ot_lookup_cache_t *cache) const
+                             hb_ot_layout_mapping_cache_t *cache) const
   {
     unsigned coverage;
-    if (cache && cache->get (glyph_id, &coverage)) return coverage;
+    if (cache && cache->get (glyph_id, &coverage)) return coverage < cache->MAX_VALUE ? coverage : NOT_COVERED;
     coverage = get_coverage (glyph_id);
-    if (cache) cache->set (glyph_id, coverage);
+    if (cache) {
+      if (coverage == NOT_COVERED)
+        cache->set_unchecked (glyph_id, cache->MAX_VALUE);
+      else if (likely (coverage < cache->MAX_VALUE))
+        cache->set_unchecked (glyph_id, coverage);
+    }
+    return coverage;
+  }
+
+  unsigned int get_coverage_binary (hb_codepoint_t glyph_id,
+                                    hb_ot_layout_binary_cache_t *cache) const
+  {
+    unsigned coverage;
+    if (cache && cache->get (glyph_id, &coverage)) return coverage < cache->MAX_VALUE ? coverage : NOT_COVERED;
+    coverage = get_coverage (glyph_id);
+    if (cache) {
+      if (coverage == NOT_COVERED)
+        cache->set_unchecked (glyph_id, cache->MAX_VALUE);
+      else
+        cache->set_unchecked (glyph_id, 0);
+    }
     return coverage;
   }
 
   unsigned get_population () const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: return u.format1.get_population ();
     case 2: return u.format2.get_population ();
 #ifndef HB_NO_BEYOND_64K
@@ -140,11 +160,11 @@
       last = g;
       if (g > max) max = g;
     }
-    u.format = !unsorted && count <= num_ranges * 3 ? 1 : 2;
+    u.format.v = !unsorted && count <= num_ranges * 3 ? 1 : 2;
 
 #ifndef HB_NO_BEYOND_64K
     if (max > 0xFFFFu)
-      u.format += 2;
+      u.format.v += 2;
     if (unlikely (max > 0xFFFFFFu))
 #else
     if (unlikely (max > 0xFFFFu))
@@ -154,7 +174,7 @@
       return_trace (false);
     }
 
-    switch (u.format)
+    switch (u.format.v)
     {
     case 1: return_trace (u.format1.serialize (c, glyphs));
     case 2: return_trace (u.format2.serialize (c, glyphs));
@@ -185,7 +205,7 @@
 
   bool intersects (const hb_set_t *glyphs) const
   {
-    switch (u.format)
+    switch (u.format.v)
     {
     case 1: return u.format1.intersects (glyphs);
     case 2: return u.format2.intersects (glyphs);
@@ -198,7 +218,7 @@
   }
   bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const
   {
-    switch (u.format)
+    switch (u.format.v)
     {
     case 1: return u.format1.intersects_coverage (glyphs, index);
     case 2: return u.format2.intersects_coverage (glyphs, index);
@@ -212,7 +232,7 @@
 
   unsigned cost () const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.cost ();
     case 2: hb_barrier (); return u.format2.cost ();
 #ifndef HB_NO_BEYOND_64K
@@ -228,7 +248,7 @@
   template 
   bool collect_coverage (set_t *glyphs) const
   {
-    switch (u.format)
+    switch (u.format.v)
     {
     case 1: return u.format1.collect_coverage (glyphs);
     case 2: return u.format2.collect_coverage (glyphs);
@@ -244,7 +264,7 @@
             hb_requires (hb_is_sink_of (IterableOut, hb_codepoint_t))>
   void intersect_set (const hb_set_t &glyphs, IterableOut&& intersect_glyphs) const
   {
-    switch (u.format)
+    switch (u.format.v)
     {
     case 1: return u.format1.intersect_set (glyphs, intersect_glyphs);
     case 2: return u.format2.intersect_set (glyphs, intersect_glyphs);
@@ -262,7 +282,7 @@
     iter_t (const Coverage &c_ = Null (Coverage))
     {
       hb_memset (this, 0, sizeof (*this));
-      format = c_.u.format;
+      format = c_.u.format.v;
       switch (format)
       {
       case 1: u.format1.init (c_.u.format1); return;
@@ -332,7 +352,7 @@
     }
     iter_t __end__ () const
     {
-      iter_t it = {};
+      iter_t it;
       it.format = format;
       switch (format)
       {
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/Common/CoverageFormat1.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/Common/CoverageFormat1.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/Common/CoverageFormat1.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/Common/CoverageFormat1.hh	2026-04-17 19:09:35.000000000 +0000
@@ -41,11 +41,11 @@
 {
   friend struct Coverage;
 
-  protected:
+  public:
   HBUINT16      coverageFormat; /* Format identifier--format = 1 */
   SortedArray16Of
                 glyphArray;     /* Array of GlyphIDs--in numerical order */
-  public:
+
   DEFINE_SIZE_ARRAY (4, glyphArray);
 
   private:
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/Common/CoverageFormat2.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/Common/CoverageFormat2.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/Common/CoverageFormat2.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/Common/CoverageFormat2.hh	2026-04-17 19:09:35.000000000 +0000
@@ -40,7 +40,7 @@
 {
   friend struct Coverage;
 
-  protected:
+  public:
   HBUINT16      coverageFormat; /* Format identifier--format = 2 */
   SortedArray16Of>
                 rangeRecord;    /* Array of glyph ranges--ordered by
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GDEF/GDEF.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GDEF/GDEF.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GDEF/GDEF.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GDEF/GDEF.hh	2026-04-17 19:09:35.000000000 +0000
@@ -252,7 +252,7 @@
                                  hb_codepoint_t glyph_id,
                                  const ItemVariationStore &var_store) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: return u.format1.get_caret_value (font, direction);
     case 2: return u.format2.get_caret_value (font, direction, glyph_id);
     case 3: return u.format3.get_caret_value (font, direction, var_store);
@@ -263,9 +263,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...));
     case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...));
     case 3: return_trace (c->dispatch (u.format3, std::forward (ds)...));
@@ -275,7 +275,7 @@
 
   void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1:
     case 2:
       return;
@@ -289,9 +289,9 @@
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return_trace (false);
+    if (!u.format.v.sanitize (c)) return_trace (false);
     hb_barrier ();
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: return_trace (u.format1.sanitize (c));
     case 2: return_trace (u.format2.sanitize (c));
     case 3: return_trace (u.format3.sanitize (c));
@@ -301,13 +301,13 @@
 
   protected:
   union {
-  HBUINT16              format;         /* Format identifier */
+  struct { HBUINT16 v; }        format;         /* Format identifier */
   CaretValueFormat1     format1;
   CaretValueFormat2     format2;
   CaretValueFormat3     format3;
   } u;
   public:
-  DEFINE_SIZE_UNION (2, format);
+  DEFINE_SIZE_UNION (2, format.v);
 };
 
 struct LigGlyph
@@ -519,7 +519,7 @@
 {
   bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: return u.format1.covers (set_index, glyph_id);
     default:return false;
     }
@@ -528,7 +528,7 @@
   template 
   void collect_coverage (hb_vector_t &sets) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: u.format1.collect_coverage (sets); return;
     default:return;
     }
@@ -537,7 +537,7 @@
   void collect_used_mark_sets (const hb_set_t& glyph_set,
                                hb_set_t& used_mark_sets /* OUT */) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: u.format1.collect_used_mark_sets (glyph_set, used_mark_sets); return;
     default:return;
     }
@@ -546,7 +546,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: return_trace (u.format1.subset (c));
     default:return_trace (false);
     }
@@ -555,9 +555,9 @@
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return_trace (false);
+    if (!u.format.v.sanitize (c)) return_trace (false);
     hb_barrier ();
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: return_trace (u.format1.sanitize (c));
     default:return_trace (true);
     }
@@ -565,11 +565,11 @@
 
   protected:
   union {
-  HBUINT16              format;         /* Format identifier */
+  struct { HBUINT16 v; }        format;         /* Format identifier */
   MarkGlyphSetsFormat1  format1;
   } u;
   public:
-  DEFINE_SIZE_UNION (2, format);
+  DEFINE_SIZE_UNION (2, format.v);
 };
 
 
@@ -977,7 +977,7 @@
       }
 
 #ifndef HB_NO_GDEF_CACHE
-      table->get_mark_glyph_sets ().collect_coverage (mark_glyph_set_digests);
+      table->get_mark_glyph_sets ().collect_coverage (mark_glyph_sets);
 #endif
     }
     ~accelerator_t () { table.destroy (); }
@@ -1002,18 +1002,34 @@
 
     }
 
+    HB_ALWAYS_INLINE
     bool mark_set_covers (unsigned int set_index, hb_codepoint_t glyph_id) const
     {
       return
 #ifndef HB_NO_GDEF_CACHE
-             mark_glyph_set_digests[set_index].may_have (glyph_id) &&
+             // We can access arrayZ directly because of sanitize_lookup_props() guarantee.
+             mark_glyph_sets.arrayZ[set_index].may_have (glyph_id) &&
 #endif
-             table->mark_set_covers (set_index, glyph_id);
+             table->mark_set_covers (set_index, glyph_id)
+      ;
+    }
+
+    unsigned sanitize_lookup_props (unsigned lookup_props) const
+    {
+#ifndef HB_NO_GDEF_CACHE
+      if (lookup_props & LookupFlag::UseMarkFilteringSet &&
+          (lookup_props >> 16) >= mark_glyph_sets.length)
+      {
+        // Invalid mark filtering set index; unset the flag.
+        lookup_props &= ~LookupFlag::UseMarkFilteringSet;
+      }
+#endif
+      return lookup_props;
     }
 
     hb_blob_ptr_t table;
 #ifndef HB_NO_GDEF_CACHE
-    hb_vector_t mark_glyph_set_digests;
+    hb_vector_t mark_glyph_sets;
     mutable hb_cache_t<21, 3> glyph_props_cache;
     static_assert (sizeof (glyph_props_cache) == 512, "");
 #endif
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/Anchor.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/Anchor.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/Anchor.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/Anchor.hh	2026-04-17 19:09:35.000000000 +0000
@@ -13,20 +13,20 @@
 {
   protected:
   union {
-  HBUINT16              format;         /* Format identifier */
+  struct { HBUINT16 v; } format;        /* Format identifier */
   AnchorFormat1         format1;
   AnchorFormat2         format2;
   AnchorFormat3         format3;
   } u;
   public:
-  DEFINE_SIZE_UNION (2, format);
+  DEFINE_SIZE_UNION (2, format.v);
 
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return_trace (false);
+    if (!u.format.v.sanitize (c)) return_trace (false);
     hb_barrier ();
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: return_trace (u.format1.sanitize (c));
     case 2: return_trace (u.format2.sanitize (c));
     case 3: return_trace (u.format3.sanitize (c));
@@ -38,7 +38,7 @@
                    float *x, float *y) const
   {
     *x = *y = 0;
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: u.format1.get_anchor (c, glyph_id, x, y); return;
     case 2: u.format2.get_anchor (c, glyph_id, x, y); return;
     case 3: u.format3.get_anchor (c, glyph_id, x, y); return;
@@ -49,7 +49,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: return_trace (bool (reinterpret_cast (u.format1.copy (c->serializer))));
     case 2:
       if (c->plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
@@ -66,7 +66,7 @@
 
   void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: case 2:
       return;
     case 3:
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/AnchorFormat3.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/AnchorFormat3.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/AnchorFormat3.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/AnchorFormat3.hh	2026-04-17 19:09:35.000000000 +0000
@@ -37,12 +37,12 @@
     *x = font->em_fscale_x (xCoordinate);
     *y = font->em_fscale_y (yCoordinate);
 
-    if ((font->x_ppem || font->num_coords) && xDeviceTable.sanitize (&c->sanitizer, this))
+    if ((font->x_ppem || font->has_nonzero_coords) && xDeviceTable.sanitize (&c->sanitizer, this))
     {
       hb_barrier ();
       *x += (this+xDeviceTable).get_x_delta (font, c->var_store, c->var_store_cache);
     }
-    if ((font->y_ppem || font->num_coords) && yDeviceTable.sanitize (&c->sanitizer, this))
+    if ((font->y_ppem || font->has_nonzero_coords) && yDeviceTable.sanitize (&c->sanitizer, this))
     {
       hb_barrier ();
       *y += (this+yDeviceTable).get_y_delta (font, c->var_store, c->var_store_cache);
@@ -91,10 +91,13 @@
       }
     }
 
-    /* in case that all axes are pinned or no variations after instantiation,
-     * both var_idxes will be mapped to HB_OT_LAYOUT_NO_VARIATIONS_INDEX */
-    if (x_varidx == HB_OT_LAYOUT_NO_VARIATIONS_INDEX &&
-        y_varidx == HB_OT_LAYOUT_NO_VARIATIONS_INDEX)
+
+    bool no_downgrade = (!xDeviceTable.is_null () && !(this+xDeviceTable).is_variation_device ()) ||
+                        x_varidx != HB_OT_LAYOUT_NO_VARIATIONS_INDEX ||
+                        y_varidx != HB_OT_LAYOUT_NO_VARIATIONS_INDEX ||
+                        (!yDeviceTable.is_null () && !(this+yDeviceTable).is_variation_device ());
+
+    if (!no_downgrade)
       return_trace (c->serializer->check_assign (out->format, 1, HB_SERIALIZE_ERROR_INT_OVERFLOW));
 
     if (!c->serializer->embed (xDeviceTable)) return_trace (false);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/AnchorMatrix.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/AnchorMatrix.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/AnchorMatrix.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/AnchorMatrix.hh	2026-04-17 19:09:35.000000000 +0000
@@ -77,6 +77,13 @@
 
     return_trace (true);
   }
+
+  bool offset_is_null (unsigned row, unsigned col, unsigned num_cols) const
+  {
+    if (unlikely (row >= rows || col >= num_cols)) return true;
+    auto &offset = matrixZ[row * num_cols + col];
+    return offset.is_null ();
+  }
 };
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/CursivePos.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/CursivePos.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/CursivePos.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/CursivePos.hh	2026-04-17 19:09:35.000000000 +0000
@@ -11,7 +11,7 @@
 {
   protected:
   union {
-  HBUINT16              format;         /* Format identifier */
+  struct { HBUINT16 v; } format;        /* Format identifier */
   CursivePosFormat1     format1;
   } u;
 
@@ -19,9 +19,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...));
     default:return_trace (c->default_return_value ());
     }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/CursivePosFormat1.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/CursivePosFormat1.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/CursivePosFormat1.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/CursivePosFormat1.hh	2026-04-17 19:09:35.000000000 +0000
@@ -50,8 +50,9 @@
   DEFINE_SIZE_STATIC (4);
 };
 
-static void
-reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction, unsigned int new_parent) {
+static inline void
+reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction, unsigned int new_parent)
+{
   int chain = pos[i].attach_chain(), type = pos[i].attach_type();
   if (likely (!chain || 0 == (type & ATTACH_TYPE_CURSIVE)))
     return;
@@ -130,7 +131,7 @@
         unlikely (!this_record.entryAnchor.sanitize (&c->sanitizer, this))) return_trace (false);
     hb_barrier ();
 
-    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    auto &skippy_iter = c->iter_input;
     skippy_iter.reset_fast (buffer->idx);
     unsigned unsafe_from;
     if (unlikely (!skippy_iter.prev (&unsafe_from)))
@@ -229,8 +230,13 @@
      */
     reverse_cursive_minor_offset (pos, child, c->direction, parent);
 
-    pos[child].attach_type() = ATTACH_TYPE_CURSIVE;
     pos[child].attach_chain() = (int) parent - (int) child;
+    if (pos[child].attach_chain() != (int) parent - (int) child)
+    {
+      pos[child].attach_chain() = 0;
+      goto overflow;
+    }
+    pos[child].attach_type() = ATTACH_TYPE_CURSIVE;
     buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
     if (likely (HB_DIRECTION_IS_HORIZONTAL (c->direction)))
       pos[child].y_offset = y_offset;
@@ -256,6 +262,7 @@
                           i, j);
     }
 
+  overflow:
     buffer->idx++;
     return_trace (true);
   }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/GPOS.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/GPOS.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/GPOS.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/GPOS.hh	2026-04-17 19:09:35.000000000 +0000
@@ -80,9 +80,8 @@
 {
   /* Adjusts offsets of attached glyphs (both cursive and mark) to accumulate
    * offset of glyph they are attached to. */
-  int chain = pos[i].attach_chain(), type = pos[i].attach_type();
-  if (likely (!chain))
-    return;
+  int chain = pos[i].attach_chain();
+  int type = pos[i].attach_type();
 
   pos[i].attach_chain() = 0;
 
@@ -94,7 +93,8 @@
   if (unlikely (!nesting_level))
     return;
 
-  propagate_attachment_offsets (pos, len, j, direction, nesting_level - 1);
+  if (pos[j].attach_chain())
+    propagate_attachment_offsets (pos, len, j, direction, nesting_level - 1);
 
   assert (!!(type & GPOS_impl::ATTACH_TYPE_MARK) ^ !!(type & GPOS_impl::ATTACH_TYPE_CURSIVE));
 
@@ -110,17 +110,37 @@
     pos[i].x_offset += pos[j].x_offset;
     pos[i].y_offset += pos[j].y_offset;
 
-    assert (j < i);
-    if (HB_DIRECTION_IS_FORWARD (direction))
-      for (unsigned int k = j; k < i; k++) {
-        pos[i].x_offset -= pos[k].x_advance;
-        pos[i].y_offset -= pos[k].y_advance;
-      }
-    else
-      for (unsigned int k = j + 1; k < i + 1; k++) {
-        pos[i].x_offset += pos[k].x_advance;
-        pos[i].y_offset += pos[k].y_advance;
-      }
+    // i is the position of the mark; j is the base.
+    if (j < i)
+    {
+      /* This is the common case: mark follows base.
+       * And currently the only way in OpenType. */
+      if (HB_DIRECTION_IS_FORWARD (direction))
+        for (unsigned int k = j; k < i; k++) {
+          pos[i].x_offset -= pos[k].x_advance;
+          pos[i].y_offset -= pos[k].y_advance;
+        }
+      else
+        for (unsigned int k = j + 1; k < i + 1; k++) {
+          pos[i].x_offset += pos[k].x_advance;
+          pos[i].y_offset += pos[k].y_advance;
+        }
+    }
+    else // j > i
+    {
+      /* This can happen with `kerx`: a mark attaching
+       * to a base after it in the logical order. */
+      if (HB_DIRECTION_IS_FORWARD (direction))
+        for (unsigned int k = i; k < j; k++) {
+          pos[i].x_offset += pos[k].x_advance;
+          pos[i].y_offset += pos[k].y_advance;
+        }
+      else
+        for (unsigned int k = i + 1; k < j + 1; k++) {
+          pos[i].x_offset -= pos[k].x_advance;
+          pos[i].y_offset -= pos[k].y_advance;
+        }
+    }
   }
 }
 
@@ -149,8 +169,20 @@
 
   /* Handle attachments */
   if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT)
-    for (unsigned i = 0; i < len; i++)
-      propagate_attachment_offsets (pos, len, i, direction);
+  {
+    auto *pos = buffer->pos;
+    // https://github.com/harfbuzz/harfbuzz/issues/5514
+    if (HB_DIRECTION_IS_FORWARD (direction))
+    {
+      for (unsigned i = 0; i < len; i++)
+        if (pos[i].attach_chain())
+          propagate_attachment_offsets (pos, len, i, direction);
+    } else {
+      for (unsigned i = len; i-- > 0; )
+        if (pos[i].attach_chain())
+          propagate_attachment_offsets (pos, len, i, direction);
+    }
+  }
 
   if (unlikely (font->slant_xy) &&
       HB_DIRECTION_IS_HORIZONTAL (direction))
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/LigatureArray.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/LigatureArray.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/LigatureArray.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/LigatureArray.hh	2026-04-17 19:09:35.000000000 +0000
@@ -19,22 +19,30 @@
   bool subset (hb_subset_context_t *c,
                Iterator             coverage,
                unsigned             class_count,
-               const hb_map_t      *klass_mapping) const
+               const hb_map_t      *klass_mapping,
+               hb_sorted_vector_t &new_coverage /* OUT */) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
+    const hb_map_t &glyph_map = c->plan->glyph_map_gsub;
 
     auto *out = c->serializer->start_embed (this);
     if (unlikely (!c->serializer->extend_min (out)))  return_trace (false);
 
     bool ret = false;
     for (const auto _ : + hb_zip (coverage, *this)
-                  | hb_filter (glyphset, hb_first))
+                        | hb_filter (glyph_map, hb_first))
     {
+      const LigatureAttach& src = (this + _.second);
+      bool non_empty = + hb_range (src.rows * class_count)
+                       | hb_filter ([=] (unsigned index) { return klass_mapping->has (index % class_count); })
+                       | hb_map ([&] (const unsigned index) { return !src.offset_is_null (index / class_count, index % class_count, class_count); })
+                       | hb_any;
+
+      if (!non_empty) continue;
+
       auto *matrix = out->serialize_append (c->serializer);
       if (unlikely (!matrix)) return_trace (false);
 
-      const LigatureAttach& src = (this + _.second);
       auto indexes =
           + hb_range (src.rows * class_count)
           | hb_filter ([=] (unsigned index) { return klass_mapping->has (index % class_count); })
@@ -44,6 +52,9 @@
                                        this,
                                        src.rows,
                                        indexes);
+
+      hb_codepoint_t new_gid = glyph_map.get (_.first);
+      new_coverage.push (new_gid);
     }
     return_trace (ret);
   }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkArray.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkArray.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkArray.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkArray.hh	2026-04-17 19:09:35.000000000 +0000
@@ -47,10 +47,15 @@
     }
 
     hb_glyph_position_t &o = buffer->cur_pos();
+    o.attach_chain() = (int) glyph_pos - (int) buffer->idx;
+    if (o.attach_chain() != (int) glyph_pos - (int) buffer->idx)
+    {
+      o.attach_chain() = 0;
+      goto overflow;
+    }
+    o.attach_type() = ATTACH_TYPE_MARK;
     o.x_offset = roundf (base_x - mark_x);
     o.y_offset = roundf (base_y - mark_y);
-    o.attach_type() = ATTACH_TYPE_MARK;
-    o.attach_chain() = (int) glyph_pos - (int) buffer->idx;
     buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
 
     if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ())
@@ -60,6 +65,7 @@
                           c->buffer->idx, glyph_pos);
     }
 
+  overflow:
     buffer->idx++;
     return_trace (true);
   }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkBasePos.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkBasePos.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkBasePos.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkBasePos.hh	2026-04-17 19:09:35.000000000 +0000
@@ -11,7 +11,7 @@
 {
   protected:
   union {
-  HBUINT16                              format;         /* Format identifier */
+  struct { HBUINT16 v; }                format;         /* Format identifier */
   MarkBasePosFormat1_2      format1;
 #ifndef HB_NO_BEYOND_64K
   MarkBasePosFormat1_2     format2;
@@ -22,9 +22,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...));
 #ifndef HB_NO_BEYOND_64K
     case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...));
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkBasePosFormat1.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkBasePosFormat1.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkBasePosFormat1.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkBasePosFormat1.hh	2026-04-17 19:09:35.000000000 +0000
@@ -119,7 +119,7 @@
     /* Now we search backwards for a non-mark glyph.
      * We don't use skippy_iter.prev() to avoid O(n^2) behavior. */
 
-    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    auto &skippy_iter = c->iter_input;
     skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
 
     if (c->last_base_until > buffer->idx)
@@ -209,19 +209,22 @@
     ;
 
     new_coverage.reset ();
-    + base_iter
-    | hb_map (hb_first)
-    | hb_map (glyph_map)
-    | hb_sink (new_coverage)
-    ;
-
-    if (!out->baseCoverage.serialize_serialize (c->serializer, new_coverage.iter ()))
-      return_trace (false);
-
     hb_sorted_vector_t base_indexes;
-    for (const unsigned row : + base_iter
-                              | hb_map (hb_second))
+    auto &base_array = (this+baseArray);
+    for (const auto _ : + base_iter)
     {
+      unsigned row = _.second;
+      bool non_empty = + hb_range ((unsigned) classCount)
+                       | hb_filter (klass_mapping)
+                       | hb_map ([&] (const unsigned col) { return !base_array.offset_is_null (row, col, (unsigned) classCount); })
+                       | hb_any
+                       ;
+
+      if (!non_empty) continue;
+
+      hb_codepoint_t new_g = glyph_map.get ( _.first);
+      new_coverage.push (new_g);
+
       + hb_range ((unsigned) classCount)
       | hb_filter (klass_mapping)
       | hb_map ([&] (const unsigned col) { return row * (unsigned) classCount + col; })
@@ -229,8 +232,12 @@
       ;
     }
 
+    if (!new_coverage) return_trace (false);
+    if (!out->baseCoverage.serialize_serialize (c->serializer, new_coverage.iter ()))
+      return_trace (false);
+
     return_trace (out->baseArray.serialize_subset (c, baseArray, this,
-                                                   base_iter.len (),
+                                                   new_coverage.length,
                                                    base_indexes.iter ()));
   }
 };
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkLigPos.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkLigPos.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkLigPos.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkLigPos.hh	2026-04-17 19:09:35.000000000 +0000
@@ -11,7 +11,7 @@
 {
   protected:
   union {
-  HBUINT16                              format;         /* Format identifier */
+  struct { HBUINT16 v; }                format;         /* Format identifier */
   MarkLigPosFormat1_2       format1;
 #ifndef HB_NO_BEYOND_64K
   MarkLigPosFormat1_2      format2;
@@ -22,9 +22,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...));
 #ifndef HB_NO_BEYOND_64K
     case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...));
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkLigPosFormat1.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkLigPosFormat1.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkLigPosFormat1.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkLigPosFormat1.hh	2026-04-17 19:09:35.000000000 +0000
@@ -101,7 +101,7 @@
 
     /* Now we search backwards for a non-mark glyph */
 
-    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    auto &skippy_iter = c->iter_input;
     skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
 
     if (c->last_base_until > buffer->idx)
@@ -200,19 +200,13 @@
                                                     &klass_mapping)))
       return_trace (false);
 
-    auto new_ligature_coverage =
-    + hb_iter (this + ligatureCoverage)
-    | hb_take ((this + ligatureArray).len)
-    | hb_map_retains_sorting (glyph_map)
-    | hb_filter ([] (hb_codepoint_t glyph) { return glyph != HB_MAP_VALUE_INVALID; })
-    ;
-
-    if (!out->ligatureCoverage.serialize_serialize (c->serializer, new_ligature_coverage))
+    hb_sorted_vector_t new_lig_coverage;
+    if (!out->ligatureArray.serialize_subset (c, ligatureArray, this,
+                                              hb_iter (this+ligatureCoverage),
+                                              classCount, &klass_mapping, new_lig_coverage))
       return_trace (false);
 
-    return_trace (out->ligatureArray.serialize_subset (c, ligatureArray, this,
-                                                       hb_iter (this+ligatureCoverage),
-                                                       classCount, &klass_mapping));
+    return_trace (out->ligatureCoverage.serialize_serialize (c->serializer, new_lig_coverage.iter ()));
   }
 
 };
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkMarkPos.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkMarkPos.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkMarkPos.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkMarkPos.hh	2026-04-17 19:09:35.000000000 +0000
@@ -11,7 +11,7 @@
 {
   protected:
   union {
-  HBUINT16                              format;         /* Format identifier */
+  struct { HBUINT16 v; }                format;         /* Format identifier */
   MarkMarkPosFormat1_2      format1;
 #ifndef HB_NO_BEYOND_64K
   MarkMarkPosFormat1_2     format2;
@@ -22,9 +22,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...));
 #ifndef HB_NO_BEYOND_64K
     case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...));
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkMarkPosFormat1.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkMarkPosFormat1.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkMarkPosFormat1.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/MarkMarkPosFormat1.hh	2026-04-17 19:09:35.000000000 +0000
@@ -100,7 +100,7 @@
     if (likely (mark1_index == NOT_COVERED)) return_trace (false);
 
     /* now we search backwards for a suitable mark glyph until a non-mark glyph */
-    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    auto &skippy_iter = c->iter_input;
     skippy_iter.reset_fast (buffer->idx);
     skippy_iter.set_lookup_props (c->lookup_props & ~(uint32_t)LookupFlag::IgnoreFlags);
     unsigned unsafe_from;
@@ -196,19 +196,23 @@
     ;
 
     new_coverage.reset ();
-    + mark2_iter
-    | hb_map (hb_first)
-    | hb_map (glyph_map)
-    | hb_sink (new_coverage)
-    ;
-
-    if (!out->mark2Coverage.serialize_serialize (c->serializer, new_coverage.iter ()))
-      return_trace (false);
-
     hb_sorted_vector_t mark2_indexes;
-    for (const unsigned row : + mark2_iter
-                              | hb_map (hb_second))
+    auto &mark2_array = (this+mark2Array);
+    for (const auto _ : + mark2_iter)
     {
+      unsigned row = _.second;
+
+      bool non_empty = + hb_range ((unsigned) classCount)
+                       | hb_filter (klass_mapping)
+                       | hb_map ([&] (const unsigned col) { return !mark2_array.offset_is_null (row, col, (unsigned) classCount); })
+                       | hb_any
+                       ;
+
+      if (!non_empty) continue;
+
+      hb_codepoint_t new_g = glyph_map.get ( _.first);
+      new_coverage.push (new_g);
+
       + hb_range ((unsigned) classCount)
       | hb_filter (klass_mapping)
       | hb_map ([&] (const unsigned col) { return row * (unsigned) classCount + col; })
@@ -216,6 +220,10 @@
       ;
     }
 
+    if (!new_coverage) return_trace (false);
+    if (!out->mark2Coverage.serialize_serialize (c->serializer, new_coverage.iter ()))
+      return_trace (false);
+
     return_trace (out->mark2Array.serialize_subset (c, mark2Array, this,
                                                     mark2_iter.len (),
                                                     mark2_indexes.iter ()));
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairPos.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairPos.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairPos.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairPos.hh	2026-04-17 19:09:35.000000000 +0000
@@ -12,7 +12,7 @@
 {
   protected:
   union {
-  HBUINT16                      format;         /* Format identifier */
+  struct { HBUINT16 v; }        format;         /* Format identifier */
   PairPosFormat1_3  format1;
   PairPosFormat2_4  format2;
 #ifndef HB_NO_BEYOND_64K
@@ -25,9 +25,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...));
     case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...));
 #ifndef HB_NO_BEYOND_64K
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairPosFormat1.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairPosFormat1.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairPosFormat1.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairPosFormat1.hh	2026-04-17 19:09:35.000000000 +0000
@@ -103,52 +103,35 @@
 
   const Coverage &get_coverage () const { return this+coverage; }
 
-  unsigned cache_cost () const
+  struct external_cache_t
   {
-    return (this+coverage).cost ();
-  }
-  static void * cache_func (void *p, hb_ot_lookup_cache_op_t op)
+    hb_ot_layout_mapping_cache_t coverage;
+  };
+  void *external_cache_create () const
   {
-    switch (op)
+    external_cache_t *cache = (external_cache_t *) hb_malloc (sizeof (external_cache_t));
+    if (likely (cache))
     {
-      case hb_ot_lookup_cache_op_t::CREATE:
-      {
-        hb_ot_lookup_cache_t *cache = (hb_ot_lookup_cache_t *) hb_malloc (sizeof (hb_ot_lookup_cache_t));
-        if (likely (cache))
-          cache->clear ();
-        return cache;
-      }
-      case hb_ot_lookup_cache_op_t::ENTER:
-        return (void *) true;
-      case hb_ot_lookup_cache_op_t::LEAVE:
-        return nullptr;
-      case hb_ot_lookup_cache_op_t::DESTROY:
-      {
-        hb_ot_lookup_cache_t *cache = (hb_ot_lookup_cache_t *) p;
-        hb_free (cache);
-        return nullptr;
-      }
+      cache->coverage.clear ();
     }
-    return nullptr;
+    return cache;
   }
 
-  bool apply_cached (hb_ot_apply_context_t *c) const { return _apply (c, true); }
-  bool apply (hb_ot_apply_context_t *c) const { return _apply (c, false); }
-  bool _apply (hb_ot_apply_context_t *c, bool cached) const
+  bool apply (hb_ot_apply_context_t *c, void *external_cache) const
   {
     TRACE_APPLY (this);
 
     hb_buffer_t *buffer = c->buffer;
 
 #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
-    hb_ot_lookup_cache_t *cache = cached ? (hb_ot_lookup_cache_t *) c->lookup_accel->cache : nullptr;
-    unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint, cache);
+    external_cache_t *cache = (external_cache_t *) external_cache;
+    unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint, cache ? &cache->coverage : nullptr);
 #else
     unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
 #endif
     if (index == NOT_COVERED) return_trace (false);
 
-    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    auto &skippy_iter = c->iter_input;
     skippy_iter.reset_fast (buffer->idx);
     unsigned unsafe_to;
     if (unlikely (!skippy_iter.next (&unsafe_to)))
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairPosFormat2.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairPosFormat2.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairPosFormat2.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/PairPosFormat2.hh	2026-04-17 19:09:35.000000000 +0000
@@ -123,63 +123,39 @@
 
   const Coverage &get_coverage () const { return this+coverage; }
 
-  struct pair_pos_cache_t
+  struct external_cache_t
   {
-    hb_ot_lookup_cache_t coverage;
-    hb_ot_lookup_cache_t first;
-    hb_ot_lookup_cache_t second;
+    hb_ot_layout_mapping_cache_t coverage;
+    hb_ot_layout_mapping_cache_t first;
+    hb_ot_layout_mapping_cache_t second;
   };
-
-  unsigned cache_cost () const
-  {
-    return (this+coverage).cost () + (this+classDef1).cost () + (this+classDef2).cost ();
-  }
-  static void * cache_func (void *p, hb_ot_lookup_cache_op_t op)
+  void *external_cache_create () const
   {
-    switch (op)
+    external_cache_t *cache = (external_cache_t *) hb_malloc (sizeof (external_cache_t));
+    if (likely (cache))
     {
-      case hb_ot_lookup_cache_op_t::CREATE:
-      {
-        pair_pos_cache_t *cache = (pair_pos_cache_t *) hb_malloc (sizeof (pair_pos_cache_t));
-        if (likely (cache))
-        {
-          cache->coverage.clear ();
-          cache->first.clear ();
-          cache->second.clear ();
-        }
-        return cache;
-      }
-      case hb_ot_lookup_cache_op_t::ENTER:
-        return (void *) true;
-      case hb_ot_lookup_cache_op_t::LEAVE:
-        return nullptr;
-      case hb_ot_lookup_cache_op_t::DESTROY:
-        {
-          pair_pos_cache_t *cache = (pair_pos_cache_t *) p;
-          hb_free (cache);
-          return nullptr;
-        }
+      cache->coverage.clear ();
+      cache->first.clear ();
+      cache->second.clear ();
     }
-    return nullptr;
+    return cache;
   }
 
-  bool apply_cached (hb_ot_apply_context_t *c) const { return _apply (c, true); }
-  bool apply (hb_ot_apply_context_t *c) const { return _apply (c, false); }
-  bool _apply (hb_ot_apply_context_t *c, bool cached) const
+  bool apply (hb_ot_apply_context_t *c, void *external_cache) const
   {
     TRACE_APPLY (this);
 
     hb_buffer_t *buffer = c->buffer;
 
 #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
-    pair_pos_cache_t *cache = cached ? (pair_pos_cache_t *) c->lookup_accel->cache : nullptr;
+    external_cache_t *cache = (external_cache_t *) external_cache;
     unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint, cache ? &cache->coverage : nullptr);
 #else
     unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
 #endif
     if (index == NOT_COVERED) return_trace (false);
 
-    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    auto &skippy_iter = c->iter_input;
     skippy_iter.reset_fast (buffer->idx);
     unsigned unsafe_to;
     if (unlikely (!skippy_iter.next (&unsafe_to)))
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/SinglePos.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/SinglePos.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/SinglePos.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/SinglePos.hh	2026-04-17 19:09:35.000000000 +0000
@@ -12,7 +12,7 @@
 {
   protected:
   union {
-  HBUINT16              format;         /* Format identifier */
+  struct { HBUINT16 v; } format;        /* Format identifier */
   SinglePosFormat1      format1;
   SinglePosFormat2      format2;
   } u;
@@ -41,7 +41,7 @@
                   const hb_hashmap_t> *layout_variation_idx_delta_map,
                   unsigned newFormat)
   {
-    if (unlikely (!c->extend_min (u.format))) return;
+    if (unlikely (!c->extend_min (u.format.v))) return;
     unsigned format = 2;
     ValueFormat new_format;
     new_format = newFormat;
@@ -49,8 +49,8 @@
     if (glyph_val_iter_pairs)
       format = get_format (glyph_val_iter_pairs);
 
-    u.format = format;
-    switch (u.format) {
+    u.format.v = format;
+    switch (u.format.v) {
     case 1: u.format1.serialize (c,
                                  src,
                                  glyph_val_iter_pairs,
@@ -70,9 +70,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...));
     case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...));
     default:return_trace (c->default_return_value ());
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/ValueFormat.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/ValueFormat.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/ValueFormat.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/ValueFormat.hh	2026-04-17 19:09:35.000000000 +0000
@@ -56,9 +56,14 @@
                                          * PosTable (may be NULL) */
 #endif
 
-  IntType& operator = (uint16_t i) { v = i; return *this; }
+  NumType& operator = (uint16_t i) { v = i; return *this; }
 
-  unsigned int get_len () const  { return hb_popcount ((unsigned int) *this); }
+  // Note: spec says skip 2 bytes per bit in the valueformat. But reports
+  // from Microsoft developers indicate that only the fields that are
+  // currently defined are counted. We don't expect any new fields to
+  // be added to ValueFormat. As such, we use the faster hb_popcount8
+  // that only processes the lowest 8 bits.
+  unsigned int get_len () const  { return hb_popcount8 ((uint8_t) *this); }
   unsigned int get_size () const { return get_len () * Value::static_size; }
 
   hb_vector_t get_device_table_indices () const {
@@ -111,8 +116,8 @@
 
     if (!has_device ()) return ret;
 
-    bool use_x_device = font->x_ppem || font->num_coords;
-    bool use_y_device = font->y_ppem || font->num_coords;
+    bool use_x_device = font->x_ppem || font->has_nonzero_coords;
+    bool use_y_device = font->y_ppem || font->has_nonzero_coords;
 
     if (!use_x_device && !use_y_device) return ret;
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/AlternateSet.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/AlternateSet.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/AlternateSet.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/AlternateSet.hh	2026-04-17 19:09:35.000000000 +0000
@@ -91,6 +91,19 @@
     return alternates.len;
   }
 
+  void
+  collect_alternates (hb_codepoint_t gid,
+                      hb_map_t  *alternate_count /* IN/OUT */,
+                      hb_map_t  *alternate_glyphs /* IN/OUT */) const
+  {
+    + hb_enumerate (alternates)
+    | hb_map ([gid] (hb_pair_t _) { return hb_pair (gid + (_.first << 24), _.second); })
+    | hb_apply ([&] (const hb_pair_t &p) -> void
+                { _hb_collect_glyph_alternates_add (p.first, p.second,
+                                                    alternate_count, alternate_glyphs); })
+    ;
+  }
+
   template 
   bool serialize (hb_serialize_context_t *c,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/AlternateSubst.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/AlternateSubst.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/AlternateSubst.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/AlternateSubst.hh	2026-04-17 19:09:35.000000000 +0000
@@ -12,7 +12,7 @@
 {
   protected:
   union {
-  HBUINT16                              format;         /* Format identifier */
+  struct { HBUINT16 v; }                format;         /* Format identifier */
   AlternateSubstFormat1_2   format1;
 #ifndef HB_NO_BEYOND_64K
   AlternateSubstFormat1_2  format2;
@@ -23,9 +23,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...));
 #ifndef HB_NO_BEYOND_64K
     case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...));
@@ -42,10 +42,10 @@
                   hb_array_t alternate_glyphs_list)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (u.format))) return_trace (false);
+    if (unlikely (!c->extend_min (u.format.v))) return_trace (false);
     unsigned int format = 1;
-    u.format = format;
-    switch (u.format) {
+    u.format.v = format;
+    switch (u.format.v) {
     case 1: return_trace (u.format1.serialize (c, glyphs, alternate_len_list, alternate_glyphs_list));
     default:return_trace (false);
     }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/AlternateSubstFormat1.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/AlternateSubstFormat1.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/AlternateSubstFormat1.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/AlternateSubstFormat1.hh	2026-04-17 19:09:35.000000000 +0000
@@ -69,6 +69,19 @@
   { return (this+alternateSet[(this+coverage).get_coverage (gid)])
            .get_alternates (start_offset, alternate_count, alternate_glyphs); }
 
+  void
+  collect_glyph_alternates (hb_map_t  *alternate_count /* IN/OUT */,
+                            hb_map_t  *alternate_glyphs /* IN/OUT */) const
+  {
+    + hb_iter (alternateSet)
+    | hb_map (hb_add (this))
+    | hb_zip (this+coverage)
+    | hb_apply ([&] (const hb_pair_t &, hb_codepoint_t> _) {
+                  _.first.collect_alternates (_.second, alternate_count, alternate_glyphs);
+                })
+    ;
+  }
+
   bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/Ligature.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/Ligature.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/Ligature.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/Ligature.hh	2026-04-17 19:09:35.000000000 +0000
@@ -44,6 +44,18 @@
     c->output->add (ligGlyph);
   }
 
+  template 
+  void collect_second (set_t &s) const
+  {
+    if (unlikely (!component.get_length ()))
+    {
+      // A ligature without any components. Anything matches.
+      s = set_t::full ();
+      return;
+    }
+    s.add (component.arrayZ[0]);
+  }
+
   bool would_apply (hb_would_apply_context_t *c) const
   {
     if (c->len != component.lenP1)
@@ -91,15 +103,6 @@
     unsigned int total_component_count = 0;
 
     if (unlikely (count > HB_MAX_CONTEXT_LENGTH)) return false;
-    unsigned match_positions_stack[4];
-    unsigned *match_positions = match_positions_stack;
-    if (unlikely (count > ARRAY_LENGTH (match_positions_stack)))
-    {
-      match_positions = (unsigned *) hb_malloc (hb_max (count, 1u) * sizeof (unsigned));
-      if (unlikely (!match_positions))
-        return_trace (false);
-    }
-
     unsigned int match_end = 0;
 
     if (likely (!match_input (c, count,
@@ -107,12 +110,9 @@
                               match_glyph,
                               nullptr,
                               &match_end,
-                              match_positions,
                               &total_component_count)))
     {
       c->buffer->unsafe_to_concat (c->buffer->idx, match_end);
-      if (match_positions != match_positions_stack)
-        hb_free (match_positions);
       return_trace (false);
     }
 
@@ -129,10 +129,10 @@
       match_end += delta;
       for (unsigned i = 0; i < count; i++)
       {
-        match_positions[i] += delta;
+        c->match_positions[i] += delta;
         if (i)
           *p++ = ',';
-        snprintf (p, sizeof(buf) - (p - buf), "%u", match_positions[i]);
+        snprintf (p, sizeof(buf) - (p - buf), "%u", c->match_positions[i]);
         p += strlen(p);
       }
 
@@ -143,7 +143,6 @@
 
     ligate_input (c,
                   count,
-                  match_positions,
                   match_end,
                   ligGlyph,
                   total_component_count);
@@ -156,8 +155,6 @@
                           pos);
     }
 
-    if (match_positions != match_positions_stack)
-      hb_free (match_positions);
     return_trace (true);
   }
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/LigatureSet.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/LigatureSet.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/LigatureSet.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/LigatureSet.hh	2026-04-17 19:09:35.000000000 +0000
@@ -11,11 +11,11 @@
 template 
 struct LigatureSet
 {
-  protected:
+  public:
   Array16OfOffset16To>
                 ligature;               /* Array LigatureSet tables
                                          * ordered by preference */
-  public:
+
   DEFINE_SIZE_ARRAY (2, ligature);
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -62,6 +62,15 @@
     ;
   }
 
+  template 
+  void collect_seconds (set_t &s) const
+  {
+    + hb_iter (ligature)
+    | hb_map (hb_add (this))
+    | hb_apply ([&s] (const Ligature &_) { _.collect_second (s); })
+    ;
+  }
+
   bool would_apply (hb_would_apply_context_t *c) const
   {
     return
@@ -72,14 +81,14 @@
     ;
   }
 
-  bool apply (hb_ot_apply_context_t *c) const
+  bool apply (hb_ot_apply_context_t *c, const hb_set_digest_t *seconds = nullptr) const
   {
     TRACE_APPLY (this);
 
     unsigned int num_ligs = ligature.len;
 
 #ifndef HB_NO_OT_RULESETS_FAST_PATH
-    if (HB_OPTIMIZE_SIZE_VAL || num_ligs <= 4)
+    if (HB_OPTIMIZE_SIZE_VAL || num_ligs <= 1)
 #endif
     {
     slow:
@@ -91,21 +100,21 @@
       return_trace (false);
     }
 
-    /* This version is optimized for speed by matching the first component
+    /* This version is optimized for speed by matching the second component
      * of the ligature here, instead of calling into the ligation code.
      *
      * This is replicated in ChainRuleSet and RuleSet. */
 
-    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    auto &skippy_iter = c->iter_context;
     skippy_iter.reset (c->buffer->idx);
     skippy_iter.set_match_func (match_always, nullptr);
     skippy_iter.set_glyph_data ((HBUINT16 *) nullptr);
     unsigned unsafe_to;
-    hb_codepoint_t first = (unsigned) -1;
+    hb_codepoint_t second = (unsigned) -1;
     bool matched = skippy_iter.next (&unsafe_to);
     if (likely (matched))
     {
-      first = c->buffer->info[skippy_iter.idx].codepoint;
+      second = c->buffer->info[skippy_iter.idx].codepoint;
       unsafe_to = skippy_iter.idx + 1;
 
       if (skippy_iter.may_skip (c->buffer->info[skippy_iter.idx]))
@@ -118,13 +127,14 @@
     else
       goto slow;
 
+    if (seconds && !seconds->may_have (second))
+      return_trace (false);
     bool unsafe_to_concat = false;
-
     for (unsigned int i = 0; i < num_ligs; i++)
     {
       const auto &lig = this+ligature.arrayZ[i];
       if (unlikely (lig.component.lenP1 <= 1) ||
-          lig.component.arrayZ[0] == first)
+          lig.component.arrayZ[0] == second)
       {
         if (lig.apply (c))
         {
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/LigatureSubst.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/LigatureSubst.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/LigatureSubst.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/LigatureSubst.hh	2026-04-17 19:09:35.000000000 +0000
@@ -12,7 +12,7 @@
 {
   protected:
   union {
-  HBUINT16                              format;         /* Format identifier */
+  struct { HBUINT16 v; }                format;         /* Format identifier */
   LigatureSubstFormat1_2    format1;
 #ifndef HB_NO_BEYOND_64K
   LigatureSubstFormat1_2   format2;
@@ -23,9 +23,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...));
 #ifndef HB_NO_BEYOND_64K
     case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...));
@@ -45,10 +45,10 @@
                   hb_array_t component_list /* Starting from second for each ligature */)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (u.format))) return_trace (false);
+    if (unlikely (!c->extend_min (u.format.v))) return_trace (false);
     unsigned int format = 1;
-    u.format = format;
-    switch (u.format) {
+    u.format.v = format;
+    switch (u.format.v) {
     case 1: return_trace (u.format1.serialize (c,
                                                first_glyphs,
                                                ligature_per_first_glyph_count_list,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/LigatureSubstFormat1.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/LigatureSubstFormat1.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/LigatureSubstFormat1.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/LigatureSubstFormat1.hh	2026-04-17 19:09:35.000000000 +0000
@@ -78,52 +78,44 @@
     return lig_set.would_apply (c);
   }
 
-  unsigned cache_cost () const
+  struct external_cache_t
   {
-    return (this+coverage).cost ();
-  }
-  static void * cache_func (void *p, hb_ot_lookup_cache_op_t op)
+    hb_ot_layout_mapping_cache_t coverage;
+    hb_set_digest_t seconds;
+  };
+  void *external_cache_create () const
   {
-    switch (op)
+    external_cache_t *cache = (external_cache_t *) hb_malloc (sizeof (external_cache_t));
+    if (likely (cache))
     {
-      case hb_ot_lookup_cache_op_t::CREATE:
-      {
-        hb_ot_lookup_cache_t *cache = (hb_ot_lookup_cache_t *) hb_malloc (sizeof (hb_ot_lookup_cache_t));
-        if (likely (cache))
-          cache->clear ();
-        return cache;
-      }
-      case hb_ot_lookup_cache_op_t::ENTER:
-        return (void *) true;
-      case hb_ot_lookup_cache_op_t::LEAVE:
-        return nullptr;
-      case hb_ot_lookup_cache_op_t::DESTROY:
-      {
-        hb_ot_lookup_cache_t *cache = (hb_ot_lookup_cache_t *) p;
-        hb_free (cache);
-        return nullptr;
-      }
+      cache->coverage.clear ();
+
+      cache->seconds.init ();
+      + hb_iter (ligatureSet)
+      | hb_map (hb_add (this))
+      | hb_apply ([cache] (const LigatureSet &_) { _.collect_seconds (cache->seconds); })
+      ;
     }
-    return nullptr;
+    return cache;
   }
 
-  bool apply_cached (hb_ot_apply_context_t *c) const { return _apply (c, true); }
-  bool apply (hb_ot_apply_context_t *c) const { return _apply (c, false); }
-  bool _apply (hb_ot_apply_context_t *c, bool cached) const
+  bool apply (hb_ot_apply_context_t *c, void *external_cache) const
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
 
 #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
-    hb_ot_lookup_cache_t *cache = cached ? (hb_ot_lookup_cache_t *) c->lookup_accel->cache : nullptr;
-    unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint, cache);
+    external_cache_t *cache = (external_cache_t *) external_cache;
+    const hb_set_digest_t *seconds = cache ? &cache->seconds : nullptr;
+    unsigned int index = (this+coverage).get_coverage (buffer->cur().codepoint, cache ? &cache->coverage : nullptr);
 #else
-    unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
+    const hb_set_digest_t *seconds = nullptr;
+    unsigned int index = (this+coverage).get_coverage (buffer->cur().codepoint);
 #endif
     if (index == NOT_COVERED) return_trace (false);
 
     const auto &lig_set = this+ligatureSet[index];
-    return_trace (lig_set.apply (c));
+    return_trace (lig_set.apply (c, seconds));
   }
 
   bool serialize (hb_serialize_context_t *c,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/MultipleSubst.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/MultipleSubst.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/MultipleSubst.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/MultipleSubst.hh	2026-04-17 19:09:35.000000000 +0000
@@ -12,7 +12,7 @@
 {
   protected:
   union {
-  HBUINT16                              format;         /* Format identifier */
+  struct { HBUINT16 v; }                format;         /* Format identifier */
   MultipleSubstFormat1_2    format1;
 #ifndef HB_NO_BEYOND_64K
   MultipleSubstFormat1_2   format2;
@@ -24,9 +24,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...));
 #ifndef HB_NO_BEYOND_64K
     case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...));
@@ -41,10 +41,10 @@
                   Iterator it)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (u.format))) return_trace (false);
+    if (unlikely (!c->extend_min (u.format.v))) return_trace (false);
     unsigned int format = 1;
-    u.format = format;
-    switch (u.format) {
+    u.format.v = format;
+    switch (u.format.v) {
     case 1: return_trace (u.format1.serialize (c, it));
     default:return_trace (false);
     }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/ReverseChainSingleSubst.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/ReverseChainSingleSubst.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/ReverseChainSingleSubst.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/ReverseChainSingleSubst.hh	2026-04-17 19:09:35.000000000 +0000
@@ -12,7 +12,7 @@
 {
   protected:
   union {
-  HBUINT16                              format;         /* Format identifier */
+  struct { HBUINT16 v; }                format;         /* Format identifier */
   ReverseChainSingleSubstFormat1        format1;
   } u;
 
@@ -20,9 +20,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...));
     default:return_trace (c->default_return_value ());
     }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/Sequence.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/Sequence.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/Sequence.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/Sequence.hh	2026-04-17 19:09:35.000000000 +0000
@@ -115,7 +115,7 @@
 
       for (unsigned i = c->buffer->idx - count; i < c->buffer->idx; i++)
       {
-        if (buf < p)
+        if (buf < p && sizeof(buf) - 1u > unsigned (p - buf))
           *p++ = ',';
         snprintf (p, sizeof(buf) - (p - buf), "%u", i);
         p += strlen(p);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/SingleSubst.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/SingleSubst.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/SingleSubst.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/SingleSubst.hh	2026-04-17 19:09:35.000000000 +0000
@@ -13,7 +13,7 @@
 {
   protected:
   union {
-  HBUINT16                              format;         /* Format identifier */
+  struct { HBUINT16 v; }                format;         /* Format identifier */
   SingleSubstFormat1_3      format1;
   SingleSubstFormat2_4      format2;
 #ifndef HB_NO_BEYOND_64K
@@ -27,9 +27,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...));
     case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...));
 #ifndef HB_NO_BEYOND_64K
@@ -47,7 +47,7 @@
                   Iterator glyphs)
   {
     TRACE_SERIALIZE (this);
-    if (unlikely (!c->extend_min (u.format))) return_trace (false);
+    if (unlikely (!c->extend_min (u.format.v))) return_trace (false);
     unsigned format = 2;
     unsigned delta = 0;
     if (glyphs)
@@ -71,8 +71,8 @@
       if (!hb_all (++(+glyphs), delta, get_delta)) format += 1;
     }
 
-    u.format = format;
-    switch (u.format) {
+    u.format.v = format;
+    switch (u.format.v) {
     case 1: return_trace (u.format1.serialize (c,
                                                + glyphs
                                                | hb_map_retains_sorting (hb_first),
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/SingleSubstFormat1.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/SingleSubstFormat1.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/SingleSubstFormat1.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/SingleSubstFormat1.hh	2026-04-17 19:09:35.000000000 +0000
@@ -123,6 +123,21 @@
     return 1;
   }
 
+  void
+  collect_glyph_alternates (hb_map_t  *alternate_count /* IN/OUT */,
+                            hb_map_t  *alternate_glyphs /* IN/OUT */) const
+  {
+    hb_codepoint_t d = deltaGlyphID;
+    hb_codepoint_t mask = get_mask ();
+
+    + hb_iter (this+coverage)
+    | hb_map ([d, mask] (hb_codepoint_t g) { return hb_pair (g, (g + d) & mask); })
+    | hb_apply ([&] (const hb_pair_t &p) -> void
+                { _hb_collect_glyph_alternates_add (p.first, p.second,
+                                                    alternate_count, alternate_glyphs); })
+    ;
+  }
+
   bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/SingleSubstFormat2.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/SingleSubstFormat2.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/SingleSubstFormat2.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/GSUB/SingleSubstFormat2.hh	2026-04-17 19:09:35.000000000 +0000
@@ -100,6 +100,17 @@
     return 1;
   }
 
+  void
+  collect_glyph_alternates (hb_map_t  *alternate_count /* IN/OUT */,
+                            hb_map_t  *alternate_glyphs /* IN/OUT */) const
+  {
+    + hb_zip (this+coverage, substitute)
+    | hb_apply ([&] (const hb_pair_t &p) -> void
+                { _hb_collect_glyph_alternates_add (p.first, p.second,
+                                                    alternate_count, alternate_glyphs); })
+    ;
+  }
+
   bool apply (hb_ot_apply_context_t *c) const
   {
     TRACE_APPLY (this);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/types.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/types.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Layout/types.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Layout/types.hh	2026-04-17 19:09:35.000000000 +0000
@@ -29,8 +29,11 @@
 #ifndef OT_LAYOUT_TYPES_HH
 #define OT_LAYOUT_TYPES_HH
 
-using hb_ot_lookup_cache_t = hb_cache_t<15, 8, 7>;
-static_assert (sizeof (hb_ot_lookup_cache_t) == 256, "");
+using hb_ot_layout_mapping_cache_t = hb_cache_t<16, 8, 8>;
+static_assert (sizeof (hb_ot_layout_mapping_cache_t) == 512, "");
+
+using hb_ot_layout_binary_cache_t = hb_cache_t<14, 1, 8>;
+static_assert (sizeof (hb_ot_layout_binary_cache_t) == 256, "");
 
 namespace OT {
 namespace Layout {
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Var/VARC/VARC.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Var/VARC/VARC.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Var/VARC/VARC.cc	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Var/VARC/VARC.cc	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,421 @@
+#include "VARC.hh"
+
+#ifndef HB_NO_VAR_COMPOSITES
+
+#include "../../../hb-draw.hh"
+#include "../../../hb-ot-layout-common.hh"
+#include "../../../hb-ot-layout-gdef-table.hh"
+
+namespace OT {
+
+//namespace Var {
+
+
+#ifndef HB_NO_DRAW
+
+struct hb_transforming_pen_context_t
+{
+  hb_transform_t<> transform;
+  hb_draw_funcs_t *dfuncs;
+  void *data;
+  hb_draw_state_t *st;
+};
+
+static void
+hb_transforming_pen_move_to (hb_draw_funcs_t *dfuncs HB_UNUSED,
+                             void *data,
+                             hb_draw_state_t *st,
+                             float to_x, float to_y,
+                             void *user_data HB_UNUSED)
+{
+  hb_transforming_pen_context_t *c = (hb_transforming_pen_context_t *) data;
+
+  c->transform.transform_point (to_x, to_y);
+
+  c->dfuncs->move_to (c->data, *c->st, to_x, to_y);
+}
+
+static void
+hb_transforming_pen_line_to (hb_draw_funcs_t *dfuncs HB_UNUSED,
+                             void *data,
+                             hb_draw_state_t *st,
+                             float to_x, float to_y,
+                             void *user_data HB_UNUSED)
+{
+  hb_transforming_pen_context_t *c = (hb_transforming_pen_context_t *) data;
+
+  c->transform.transform_point (to_x, to_y);
+
+  c->dfuncs->line_to (c->data, *c->st, to_x, to_y);
+}
+
+static void
+hb_transforming_pen_quadratic_to (hb_draw_funcs_t *dfuncs HB_UNUSED,
+                                  void *data,
+                                  hb_draw_state_t *st,
+                                  float control_x, float control_y,
+                                  float to_x, float to_y,
+                                  void *user_data HB_UNUSED)
+{
+  hb_transforming_pen_context_t *c = (hb_transforming_pen_context_t *) data;
+
+  c->transform.transform_point (control_x, control_y);
+  c->transform.transform_point (to_x, to_y);
+
+  c->dfuncs->quadratic_to (c->data, *c->st, control_x, control_y, to_x, to_y);
+}
+
+static void
+hb_transforming_pen_cubic_to (hb_draw_funcs_t *dfuncs HB_UNUSED,
+                              void *data,
+                              hb_draw_state_t *st,
+                              float control1_x, float control1_y,
+                              float control2_x, float control2_y,
+                              float to_x, float to_y,
+                              void *user_data HB_UNUSED)
+{
+  hb_transforming_pen_context_t *c = (hb_transforming_pen_context_t *) data;
+
+  c->transform.transform_point (control1_x, control1_y);
+  c->transform.transform_point (control2_x, control2_y);
+  c->transform.transform_point (to_x, to_y);
+
+  c->dfuncs->cubic_to (c->data, *c->st, control1_x, control1_y, control2_x, control2_y, to_x, to_y);
+}
+
+static void
+hb_transforming_pen_close_path (hb_draw_funcs_t *dfuncs HB_UNUSED,
+                                void *data,
+                                hb_draw_state_t *st,
+                                void *user_data HB_UNUSED)
+{
+  hb_transforming_pen_context_t *c = (hb_transforming_pen_context_t *) data;
+
+  c->dfuncs->close_path (c->data, *c->st);
+}
+
+static inline void free_static_transforming_pen_funcs ();
+
+static struct hb_transforming_pen_funcs_lazy_loader_t : hb_draw_funcs_lazy_loader_t
+{
+  static hb_draw_funcs_t *create ()
+  {
+    hb_draw_funcs_t *funcs = hb_draw_funcs_create ();
+
+    hb_draw_funcs_set_move_to_func (funcs, hb_transforming_pen_move_to, nullptr, nullptr);
+    hb_draw_funcs_set_line_to_func (funcs, hb_transforming_pen_line_to, nullptr, nullptr);
+    hb_draw_funcs_set_quadratic_to_func (funcs, hb_transforming_pen_quadratic_to, nullptr, nullptr);
+    hb_draw_funcs_set_cubic_to_func (funcs, hb_transforming_pen_cubic_to, nullptr, nullptr);
+    hb_draw_funcs_set_close_path_func (funcs, hb_transforming_pen_close_path, nullptr, nullptr);
+
+    hb_draw_funcs_make_immutable (funcs);
+
+    hb_atexit (free_static_transforming_pen_funcs);
+
+    return funcs;
+  }
+} static_transforming_pen_funcs;
+
+static inline
+void free_static_transforming_pen_funcs ()
+{
+  static_transforming_pen_funcs.free_instance ();
+}
+
+static hb_draw_funcs_t *
+hb_transforming_pen_get_funcs ()
+{
+  return static_transforming_pen_funcs.get_unconst ();
+}
+
+hb_ubytes_t
+VarComponent::get_path_at (const hb_varc_context_t &c,
+                           hb_codepoint_t parent_gid,
+                           hb_array_t coords,
+                           hb_transform_t<> total_transform,
+                           hb_ubytes_t total_record,
+                           hb_scalar_cache_t *cache) const
+{
+  const unsigned char *end = total_record.arrayZ + total_record.length;
+  const unsigned char *record = total_record.arrayZ;
+
+  auto &VARC = *c.font->face->table.VARC->table;
+  auto &varStore = &VARC+VARC.varStore;
+
+#define READ_UINT32VAR(name) \
+  HB_STMT_START { \
+    if (unlikely (unsigned (end - record) < HBUINT32VAR::min_size)) return hb_ubytes_t (); \
+    hb_barrier (); \
+    auto &varint = * (const HBUINT32VAR *) record; \
+    unsigned size = varint.get_size (); \
+    if (unlikely (unsigned (end - record) < size)) return hb_ubytes_t (); \
+    name = (uint32_t) varint; \
+    record += size; \
+  } HB_STMT_END
+
+  uint32_t flags;
+  READ_UINT32VAR (flags);
+
+  // gid
+
+  hb_codepoint_t gid = 0;
+  if (flags & (unsigned) flags_t::GID_IS_24BIT)
+  {
+    if (unlikely (unsigned (end - record) < HBGlyphID24::static_size))
+      return hb_ubytes_t ();
+    hb_barrier ();
+    gid = * (const HBGlyphID24 *) record;
+    record += HBGlyphID24::static_size;
+  }
+  else
+  {
+    if (unlikely (unsigned (end - record) < HBGlyphID16::static_size))
+      return hb_ubytes_t ();
+    hb_barrier ();
+    gid = * (const HBGlyphID16 *) record;
+    record += HBGlyphID16::static_size;
+  }
+
+  // Condition
+  bool show = true;
+  if (flags & (unsigned) flags_t::HAVE_CONDITION)
+  {
+    unsigned conditionIndex;
+    READ_UINT32VAR (conditionIndex);
+    const auto &condition = (&VARC+VARC.conditionList)[conditionIndex];
+    auto instancer = MultiItemVarStoreInstancer(&varStore, nullptr, coords, cache);
+    show = condition.evaluate (coords.arrayZ, coords.length, &instancer);
+  }
+
+  // Axis values
+
+  auto &axisIndices = c.scratch.axisIndices;
+  axisIndices.clear ();
+  auto &axisValues = c.scratch.axisValues;
+  axisValues.clear ();
+  if (flags & (unsigned) flags_t::HAVE_AXES)
+  {
+    unsigned axisIndicesIndex;
+    READ_UINT32VAR (axisIndicesIndex);
+    axisIndices.extend ((&VARC+VARC.axisIndicesList)[axisIndicesIndex]);
+    axisValues.resize (axisIndices.length);
+    const HBUINT8 *p = (const HBUINT8 *) record;
+    TupleValues::decompile (p, axisValues, (const HBUINT8 *) end);
+    record = (const unsigned char *) p;
+  }
+
+  // Apply variations if any
+  if (flags & (unsigned) flags_t::AXIS_VALUES_HAVE_VARIATION)
+  {
+    uint32_t axisValuesVarIdx;
+    READ_UINT32VAR (axisValuesVarIdx);
+    if (show && coords && !axisValues.in_error ())
+      varStore.get_delta (axisValuesVarIdx, coords, axisValues.as_array (), cache);
+  }
+
+  auto component_coords = coords;
+  /* Copying coords is expensive; so we have put an arbitrary
+   * limit on the max number of coords for now. */
+  if ((flags & (unsigned) flags_t::RESET_UNSPECIFIED_AXES) ||
+      coords.length > HB_VAR_COMPOSITE_MAX_AXES)
+    component_coords = hb_array (c.font->coords, c.font->num_coords);
+
+  // Transform
+
+  uint32_t transformVarIdx = VarIdx::NO_VARIATION;
+  if (flags & (unsigned) flags_t::TRANSFORM_HAS_VARIATION)
+    READ_UINT32VAR (transformVarIdx);
+
+#define PROCESS_TRANSFORM_COMPONENTS \
+        HB_STMT_START { \
+        PROCESS_TRANSFORM_COMPONENT (FWORD, 1.0f, HAVE_TRANSLATE_X, translateX); \
+        PROCESS_TRANSFORM_COMPONENT (FWORD, 1.0f, HAVE_TRANSLATE_Y, translateY); \
+        PROCESS_TRANSFORM_COMPONENT (F4DOT12, HB_PI, HAVE_ROTATION, rotation); \
+        PROCESS_TRANSFORM_COMPONENT (F6DOT10, 1.0f, HAVE_SCALE_X, scaleX); \
+        PROCESS_TRANSFORM_COMPONENT (F6DOT10, 1.0f, HAVE_SCALE_Y, scaleY); \
+        PROCESS_TRANSFORM_COMPONENT (F4DOT12, HB_PI, HAVE_SKEW_X, skewX); \
+        PROCESS_TRANSFORM_COMPONENT (F4DOT12, HB_PI, HAVE_SKEW_Y, skewY); \
+        PROCESS_TRANSFORM_COMPONENT (FWORD, 1.0f, HAVE_TCENTER_X, tCenterX); \
+        PROCESS_TRANSFORM_COMPONENT (FWORD, 1.0f, HAVE_TCENTER_Y, tCenterY); \
+        } HB_STMT_END
+
+  hb_transform_decomposed_t<> transform;
+
+  // Read transform components
+#define PROCESS_TRANSFORM_COMPONENT(type, mult, flag, name) \
+        if (flags & (unsigned) flags_t::flag) \
+        { \
+          static_assert (type::static_size == HBINT16::static_size, ""); \
+          if (unlikely (unsigned (end - record) < HBINT16::static_size)) \
+            return hb_ubytes_t (); \
+          hb_barrier (); \
+          transform.name = mult * * (const HBINT16 *) record; \
+          record += HBINT16::static_size; \
+        }
+  PROCESS_TRANSFORM_COMPONENTS;
+#undef PROCESS_TRANSFORM_COMPONENT
+
+  // Read reserved records
+  unsigned i = flags & (unsigned) flags_t::RESERVED_MASK;
+  while (i)
+  {
+    HB_UNUSED uint32_t discard;
+    READ_UINT32VAR (discard);
+    i &= i - 1;
+  }
+
+  /* Parsing is over now. */
+
+  if (show)
+  {
+    // Only use coord_setter if there's actually any axis overrides.
+    coord_setter_t coord_setter (axisIndices ? component_coords : hb_array ());
+    // Go backwards, to reduce coord_setter vector reallocations.
+    for (unsigned i = axisIndices.length; i; i--)
+      coord_setter[axisIndices[i - 1]] = axisValues[i - 1];
+    if (axisIndices)
+      component_coords = coord_setter.get_coords ();
+
+    // Apply transform variations if any
+    if (transformVarIdx != VarIdx::NO_VARIATION && coords)
+    {
+      float transformValues[9];
+      unsigned numTransformValues = 0;
+#define PROCESS_TRANSFORM_COMPONENT(type, mult, flag, name) \
+          if (flags & (unsigned) flags_t::flag) \
+            transformValues[numTransformValues++] = transform.name / mult;
+      PROCESS_TRANSFORM_COMPONENTS;
+#undef PROCESS_TRANSFORM_COMPONENT
+      varStore.get_delta (transformVarIdx, coords, hb_array (transformValues, numTransformValues), cache);
+      numTransformValues = 0;
+#define PROCESS_TRANSFORM_COMPONENT(type, mult, flag, name) \
+          if (flags & (unsigned) flags_t::flag) \
+            transform.name = transformValues[numTransformValues++] * mult;
+      PROCESS_TRANSFORM_COMPONENTS;
+#undef PROCESS_TRANSFORM_COMPONENT
+    }
+
+    // Divide them by their divisors
+#define PROCESS_TRANSFORM_COMPONENT(type, mult, flag, name) \
+          if (flags & (unsigned) flags_t::flag) \
+          { \
+            HBINT16 int_v; \
+            int_v = roundf (transform.name); \
+            type typed_v = * (const type *) &int_v; \
+            float float_v = (float) typed_v; \
+            transform.name = float_v; \
+          }
+    PROCESS_TRANSFORM_COMPONENTS;
+#undef PROCESS_TRANSFORM_COMPONENT
+
+    if (!(flags & (unsigned) flags_t::HAVE_SCALE_Y))
+      transform.scaleY = transform.scaleX;
+
+    total_transform.transform (transform.to_transform ());
+    total_transform.scale (c.font->x_mult ? 1.f / c.font->x_multf : 0.f,
+                           c.font->y_mult ? 1.f / c.font->y_multf : 0.f);
+
+    bool same_coords = component_coords.length == coords.length &&
+                       component_coords.arrayZ == coords.arrayZ;
+
+    c.depth_left--;
+    VARC.get_path_at (c, gid,
+                      component_coords, total_transform,
+                      parent_gid,
+                      same_coords ? cache : nullptr);
+    c.depth_left++;
+  }
+
+#undef PROCESS_TRANSFORM_COMPONENTS
+#undef READ_UINT32VAR
+
+  return hb_ubytes_t (record, end - record);
+}
+
+bool
+VARC::get_path_at (const hb_varc_context_t &c,
+                   hb_codepoint_t glyph,
+                   hb_array_t coords,
+                   hb_transform_t<> transform,
+                   hb_codepoint_t parent_glyph,
+                   hb_scalar_cache_t *parent_cache) const
+{
+  // Don't recurse on the same glyph.
+  unsigned idx = glyph == parent_glyph ?
+                 NOT_COVERED :
+                 (this+coverage).get_coverage (glyph);
+  if (idx == NOT_COVERED)
+  {
+    if (c.draw_session)
+    {
+      // Build a transforming pen to apply the transform.
+      hb_draw_funcs_t *transformer_funcs = hb_transforming_pen_get_funcs ();
+      hb_transforming_pen_context_t context {transform,
+                                             c.draw_session->funcs,
+                                             c.draw_session->draw_data,
+                                             &c.draw_session->st};
+      hb_draw_session_t transformer_session {transformer_funcs, &context};
+      hb_draw_session_t &shape_draw_session = transform.is_identity () ? *c.draw_session : transformer_session;
+
+      if (c.font->face->table.glyf->get_path_at (c.font, glyph, shape_draw_session, coords, c.scratch.glyf_scratch)) return true;
+#ifndef HB_NO_CFF
+      if (c.font->face->table.cff2->get_path_at (c.font, glyph, shape_draw_session, coords)) return true;
+      if (c.font->face->table.cff1->get_path (c.font, glyph, shape_draw_session)) return true; // Doesn't have variations
+#endif
+      return false;
+    }
+    else if (c.extents)
+    {
+      hb_glyph_extents_t glyph_extents;
+      if (!c.font->face->table.glyf->get_extents_at (c.font, glyph, &glyph_extents, coords))
+#ifndef HB_NO_CFF
+      if (!c.font->face->table.cff2->get_extents_at (c.font, glyph, &glyph_extents, coords))
+      if (!c.font->face->table.cff1->get_extents (c.font, glyph, &glyph_extents)) // Doesn't have variations
+#endif
+        return false;
+
+      hb_extents_t<> comp_extents (glyph_extents);
+      transform.transform_extents (comp_extents);
+      c.extents->union_ (comp_extents);
+    }
+    return true;
+  }
+
+  if (c.depth_left <= 0)
+    return true;
+
+  if (c.edges_left <= 0)
+    return true;
+  (c.edges_left)--;
+
+  hb_decycler_node_t node (c.decycler);
+  if (unlikely (!node.visit (glyph)))
+    return true;
+
+  hb_ubytes_t record = (this+glyphRecords)[idx];
+
+  hb_scalar_cache_t static_cache;
+  hb_scalar_cache_t *cache = parent_cache ?
+                                  parent_cache :
+                                  (this+varStore).create_cache (&static_cache);
+
+  transform.scale (c.font->x_multf, c.font->y_multf);
+
+  VarCompositeGlyph::get_path_at (c,
+                                  glyph,
+                                  coords, transform,
+                                  record,
+                                  cache);
+
+  if (cache != parent_cache)
+    (this+varStore).destroy_cache (cache, &static_cache);
+
+  return true;
+}
+
+#endif
+
+//} // namespace Var
+} // namespace OT
+
+#endif
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Var/VARC/VARC.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Var/VARC/VARC.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/Var/VARC/VARC.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/Var/VARC/VARC.hh	2026-04-17 19:09:35.000000000 +0000
@@ -32,7 +32,7 @@
 {
   hb_font_t *font;
   hb_draw_session_t *draw_session;
-  hb_extents_t *extents;
+  hb_extents_t<> *extents;
   mutable hb_decycler_t decycler;
   mutable signed edges_left;
   mutable signed depth_left;
@@ -65,9 +65,9 @@
   get_path_at (const hb_varc_context_t &c,
                hb_codepoint_t parent_gid,
                hb_array_t coords,
-               hb_transform_t transform,
+               hb_transform_t<> transform,
                hb_ubytes_t record,
-               VarRegionList::cache_t *cache = nullptr) const;
+               hb_scalar_cache_t *cache = nullptr) const;
 };
 
 struct VarCompositeGlyph
@@ -76,9 +76,9 @@
   get_path_at (const hb_varc_context_t &c,
                hb_codepoint_t gid,
                hb_array_t coords,
-               hb_transform_t transform,
+               hb_transform_t<> transform,
                hb_ubytes_t record,
-               VarRegionList::cache_t *cache)
+               hb_scalar_cache_t *cache)
   {
     while (record)
     {
@@ -104,9 +104,9 @@
   get_path_at (const hb_varc_context_t &c,
                hb_codepoint_t gid,
                hb_array_t coords,
-               hb_transform_t transform = HB_TRANSFORM_IDENTITY,
+               hb_transform_t<> transform = HB_TRANSFORM_IDENTITY,
                hb_codepoint_t parent_gid = HB_CODEPOINT_INVALID,
-               VarRegionList::cache_t *parent_cache = nullptr) const;
+               hb_scalar_cache_t *parent_cache = nullptr) const;
 
   bool
   get_path (hb_font_t *font,
@@ -129,7 +129,7 @@
   bool
   get_extents (hb_font_t *font,
                hb_codepoint_t gid,
-               hb_extents_t *extents,
+               hb_extents_t<> *extents,
                hb_varc_scratch_t &scratch) const
   {
     hb_varc_context_t c {font,
@@ -194,9 +194,10 @@
                  hb_codepoint_t gid,
                  hb_glyph_extents_t *extents) const
     {
+#ifndef HB_NO_DRAW
       if (!table->has_data ()) return false;
 
-      hb_extents_t f_extents;
+      hb_extents_t<> f_extents;
 
       auto *scratch = acquire_scratch ();
       if (unlikely (!scratch)) return true;
@@ -207,6 +208,9 @@
         *extents = f_extents.to_glyph_extents (font->x_scale < 0, font->y_scale < 0);
 
       return ret;
+#else
+      return false;
+#endif
     }
 
     private:
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/glyf/Glyph.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/glyf/Glyph.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/glyf/Glyph.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/glyf/Glyph.hh	2026-04-17 19:09:35.000000000 +0000
@@ -102,17 +102,15 @@
     if (unlikely (!points.resize (points.length + PHANTOM_COUNT))) return false;
     hb_array_t phantoms = points.as_array ().sub_array (points.length - PHANTOM_COUNT, PHANTOM_COUNT);
     {
+      // Duplicated code.
       int lsb = 0;
-      int h_delta = face->table.hmtx->get_leading_bearing_without_var_unscaled (gid, &lsb) ?
-                    (int) header->xMin - lsb : 0;
+      face->table.hmtx->get_leading_bearing_without_var_unscaled (gid, &lsb);
+      int h_delta = (int) header->xMin - lsb;
       HB_UNUSED int tsb = 0;
-      int v_orig  = (int) header->yMax +
 #ifndef HB_NO_VERTICAL
-                    ((void) face->table.vmtx->get_leading_bearing_without_var_unscaled (gid, &tsb), tsb)
-#else
-                    0
+      face->table.vmtx->get_leading_bearing_without_var_unscaled (gid, &tsb);
 #endif
-                    ;
+      int v_orig  = (int) header->yMax + tsb;
       unsigned h_adv = face->table.hmtx->get_advance_without_var_unscaled (gid);
       unsigned v_adv =
 #ifndef HB_NO_VERTICAL
@@ -314,6 +312,7 @@
                    bool use_my_metrics = true,
                    bool phantom_only = false,
                    hb_array_t coords = hb_array_t (),
+                   hb_scalar_cache_t *gvar_cache = nullptr,
                    unsigned int depth = 0,
                    unsigned *edge_count = nullptr) const
   {
@@ -328,7 +327,7 @@
       head_maxp_info->maxComponentDepth = hb_max (head_maxp_info->maxComponentDepth, depth);
     }
 
-    if (!coords)
+    if (!coords && font->has_nonzero_coords)
       coords = hb_array (font->coords, font->num_coords);
 
     contour_point_vector_t &points = type == SIMPLE ? all_points : scratch.comp_points;
@@ -357,17 +356,15 @@
     if (unlikely (!points.resize (points.length + PHANTOM_COUNT))) return false;
     hb_array_t phantoms = points.as_array ().sub_array (points.length - PHANTOM_COUNT, PHANTOM_COUNT);
     {
+      // Duplicated code.
       int lsb = 0;
-      int h_delta = glyf_accelerator.hmtx->get_leading_bearing_without_var_unscaled (gid, &lsb) ?
-                    (int) header->xMin - lsb : 0;
+      glyf_accelerator.hmtx->get_leading_bearing_without_var_unscaled (gid, &lsb);
+      int h_delta = (int) header->xMin - lsb;
       HB_UNUSED int tsb = 0;
-      int v_orig  = (int) header->yMax +
 #ifndef HB_NO_VERTICAL
-                    ((void) glyf_accelerator.vmtx->get_leading_bearing_without_var_unscaled (gid, &tsb), tsb)
-#else
-                    0
+      glyf_accelerator.vmtx->get_leading_bearing_without_var_unscaled (gid, &tsb);
 #endif
-                    ;
+      int v_orig  = (int) header->yMax + tsb;
       unsigned h_adv = glyf_accelerator.hmtx->get_advance_without_var_unscaled (gid);
       unsigned v_adv =
 #ifndef HB_NO_VERTICAL
@@ -383,7 +380,7 @@
     }
 
 #ifndef HB_NO_VAR
-    if (coords)
+    if (hb_any (coords))
     {
 #ifndef HB_NO_BEYOND_64K
       if (glyf_accelerator.GVAR->has_data ())
@@ -391,6 +388,7 @@
                                                        coords,
                                                        points.as_array ().sub_array (old_length),
                                                        scratch,
+                                                       gvar_cache,
                                                        phantom_only && type == SIMPLE);
       else
 #endif
@@ -398,6 +396,7 @@
                                                        coords,
                                                        points.as_array ().sub_array (old_length),
                                                        scratch,
+                                                       gvar_cache,
                                                        phantom_only && type == SIMPLE);
     }
 #endif
@@ -447,6 +446,7 @@
                                                     use_my_metrics,
                                                     phantom_only,
                                                     coords,
+                                                    gvar_cache,
                                                     depth + 1,
                                                     edge_count)))
         {
@@ -533,7 +533,11 @@
   bool get_extents_without_var_scaled (hb_font_t *font, const glyf_accelerator_t &glyf_accelerator,
                                        hb_glyph_extents_t *extents) const
   {
-    if (type == EMPTY) return true; /* Empty glyph; zero extents. */
+    if (type == EMPTY)
+    {
+      *extents = {0, 0, 0, 0};
+      return true; /* Empty glyph; zero extents. */
+    }
     return header->get_extents_without_var_scaled (font, glyf_accelerator, gid, extents);
   }
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/glyf/SimpleGlyph.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/glyf/SimpleGlyph.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/glyf/SimpleGlyph.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/glyf/SimpleGlyph.hh	2026-04-17 19:09:35.000000000 +0000
@@ -189,7 +189,7 @@
 
     unsigned old_length = points.length;
     points.alloc (points.length + num_points + 4); // Allocate for phantom points, to avoid a possible copy
-    if (unlikely (!points.resize (points.length + num_points, false))) return false;
+    if (unlikely (!points.resize_dirty (points.length + num_points))) return false;
     auto points_ = points.as_array ().sub_array (old_length);
     if (!phantom_only)
       hb_memset (points_.arrayZ, 0, sizeof (contour_point_t) * num_points);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/glyf/glyf.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/glyf/glyf.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/OT/glyf/glyf.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/OT/glyf/glyf.hh	2026-04-17 19:09:35.000000000 +0000
@@ -220,7 +220,8 @@
   template
   bool get_points (hb_font_t *font, hb_codepoint_t gid, T consumer,
                    hb_array_t coords,
-                   hb_glyf_scratch_t &scratch) const
+                   hb_glyf_scratch_t &scratch,
+                   hb_scalar_cache_t *gvar_cache = nullptr) const
   {
     if (gid >= num_glyphs) return false;
 
@@ -228,7 +229,7 @@
     all_points.resize (0);
 
     bool phantom_only = !consumer.is_consuming_contour_points ();
-    if (unlikely (!glyph_for_gid (gid).get_points (font, *this, all_points, scratch, nullptr, nullptr, nullptr, true, true, phantom_only, coords)))
+    if (unlikely (!glyph_for_gid (gid).get_points (font, *this, all_points, scratch, nullptr, nullptr, nullptr, true, true, phantom_only, coords, gvar_cache)))
       return false;
 
     unsigned count = all_points.length;
@@ -371,69 +372,67 @@
     contour_point_t *get_phantoms_sink () { return phantoms; }
   };
 
+#ifndef HB_NO_VAR
   unsigned
-  get_advance_with_var_unscaled (hb_font_t *font, hb_codepoint_t gid, bool is_vertical) const
+  get_advance_with_var_unscaled (hb_codepoint_t gid,
+                                 hb_font_t *font,
+                                 bool is_vertical,
+                                  hb_glyf_scratch_t &scratch,
+                                 hb_scalar_cache_t *gvar_cache = nullptr) const
   {
     if (unlikely (gid >= num_glyphs)) return 0;
 
     bool success = false;
 
     contour_point_t phantoms[glyf_impl::PHANTOM_COUNT];
-    if (font->num_coords)
+    success = get_points (font, gid, points_aggregator_t (font, nullptr, phantoms, false),
+                          hb_array (font->coords,
+                                    font->has_nonzero_coords ? font->num_coords : 0),
+                          scratch, gvar_cache);
+    if (unlikely (!success))
     {
-      hb_glyf_scratch_t scratch;
-      success = get_points (font, gid, points_aggregator_t (font, nullptr, phantoms, false),
-                            hb_array (font->coords, font->num_coords),
-                            scratch);
+      unsigned upem = font->face->get_upem ();
+      return is_vertical ? upem : upem / 2;
     }
 
-    if (unlikely (!success))
-      return
-#ifndef HB_NO_VERTICAL
-        is_vertical ? vmtx->get_advance_without_var_unscaled (gid) :
-#endif
-        hmtx->get_advance_without_var_unscaled (gid);
-
     float result = is_vertical
                  ? phantoms[glyf_impl::PHANTOM_TOP].y - phantoms[glyf_impl::PHANTOM_BOTTOM].y
                  : phantoms[glyf_impl::PHANTOM_RIGHT].x - phantoms[glyf_impl::PHANTOM_LEFT].x;
     return hb_clamp (roundf (result), 0.f, (float) UINT_MAX / 2);
   }
 
-  bool get_leading_bearing_with_var_unscaled (hb_font_t *font, hb_codepoint_t gid, bool is_vertical, int *lsb) const
+  float
+  get_v_origin_with_var_unscaled (hb_codepoint_t gid,
+                                  hb_font_t *font,
+                                  hb_glyf_scratch_t &scratch,
+                                  hb_scalar_cache_t *gvar_cache = nullptr) const
   {
-    if (unlikely (gid >= num_glyphs)) return false;
+    if (unlikely (gid >= num_glyphs)) return 0;
+
+    bool success = false;
 
-    hb_glyph_extents_t extents;
-    hb_glyf_scratch_t scratch;
     contour_point_t phantoms[glyf_impl::PHANTOM_COUNT];
-    if (unlikely (!get_points (font, gid, points_aggregator_t (font, &extents, phantoms, false),
-                               hb_array (font->coords, font->num_coords),
-                               scratch)))
-      return false;
+    success = get_points (font, gid, points_aggregator_t (font, nullptr, phantoms, false),
+                          hb_array (font->coords,
+                                    font->has_nonzero_coords ? font->num_coords : 0),
+                          scratch, gvar_cache);
+    if (unlikely (!success))
+    {
+      return font->face->get_upem ();
+    }
 
-    *lsb = is_vertical
-         ? roundf (phantoms[glyf_impl::PHANTOM_TOP].y) - extents.y_bearing
-         : roundf (phantoms[glyf_impl::PHANTOM_LEFT].x);
-    return true;
+    return phantoms[glyf_impl::PHANTOM_TOP].y;
   }
 #endif
-
-  bool get_leading_bearing_without_var_unscaled (hb_codepoint_t gid, bool is_vertical, int *lsb) const
-  {
-    if (unlikely (gid >= num_glyphs)) return false;
-    if (is_vertical) return false; // TODO Humm, what to do here?
-
-    *lsb = glyph_for_gid (gid).get_header ()->xMin;
-    return true;
-  }
+#endif
 
   public:
 
   bool get_extents (hb_font_t *font,
                     hb_codepoint_t gid,
                     hb_glyph_extents_t *extents) const
-  { return get_extents_at (font, gid, extents, hb_array (font->coords, font->num_coords)); }
+  { return get_extents_at (font, gid, extents, hb_array (font->coords,
+                                                         font->has_nonzero_coords ? font->num_coords : 0)); }
 
   bool get_extents_at (hb_font_t *font,
                        hb_codepoint_t gid,
@@ -445,12 +444,15 @@
 #ifndef HB_NO_VAR
     if (coords)
     {
-      hb_glyf_scratch_t scratch;
-      return get_points (font,
-                         gid,
-                         points_aggregator_t (font, extents, nullptr, true),
-                         coords,
-                         scratch);
+      hb_glyf_scratch_t *scratch = acquire_scratch ();
+      if (unlikely (!scratch)) return false;
+      bool ret = get_points (font,
+                             gid,
+                             points_aggregator_t (font, extents, nullptr, true),
+                             coords,
+                             *scratch);
+      release_scratch (scratch);
+      return ret;
     }
 #endif
     return glyph_for_gid (gid).get_extents_without_var_scaled (font, *this, extents);
@@ -485,33 +487,20 @@
   }
 
   bool
-  get_path (hb_font_t *font, hb_codepoint_t gid, hb_draw_session_t &draw_session) const
+  get_path (hb_font_t *font, hb_codepoint_t gid, hb_draw_session_t &draw_session, hb_scalar_cache_t *gvar_cache = nullptr) const
   {
     if (!has_data ()) return false;
 
-    hb_glyf_scratch_t *scratch;
-
-    // Borrow the cached strach buffer.
-    {
-      scratch = cached_scratch.get_acquire ();
-      if (!scratch || unlikely (!cached_scratch.cmpexch (scratch, nullptr)))
-      {
-        scratch = (hb_glyf_scratch_t *) hb_calloc (1, sizeof (hb_glyf_scratch_t));
-        if (unlikely (!scratch))
-          return true;
-      }
-    }
+    hb_glyf_scratch_t *scratch = acquire_scratch ();
+    if (unlikely (!scratch)) return true;
 
     bool ret = get_points (font, gid, glyf_impl::path_builder_t (font, draw_session),
-                           hb_array (font->coords, font->num_coords),
-                           *scratch);
+                           hb_array (font->coords,
+                                     font->has_nonzero_coords ? font->num_coords : 0),
+                           *scratch,
+                            gvar_cache);
 
-    // Put it back.
-    if (!cached_scratch.cmpexch (nullptr, scratch))
-    {
-      scratch->~hb_glyf_scratch_t ();
-      hb_free (scratch);
-    }
+    release_scratch (scratch);
 
     return ret;
   }
@@ -519,12 +508,38 @@
   bool
   get_path_at (hb_font_t *font, hb_codepoint_t gid, hb_draw_session_t &draw_session,
                hb_array_t coords,
-               hb_glyf_scratch_t &scratch) const
+               hb_glyf_scratch_t &scratch,
+               hb_scalar_cache_t *gvar_cache = nullptr) const
   {
     if (!has_data ()) return false;
     return get_points (font, gid, glyf_impl::path_builder_t (font, draw_session),
                        coords,
-                       scratch);
+                       scratch,
+                       gvar_cache);
+  }
+
+
+  hb_glyf_scratch_t *acquire_scratch () const
+  {
+    if (!has_data ()) return nullptr;
+    hb_glyf_scratch_t *scratch = cached_scratch.get_acquire ();
+    if (!scratch || unlikely (!cached_scratch.cmpexch (scratch, nullptr)))
+    {
+      scratch = (hb_glyf_scratch_t *) hb_calloc (1, sizeof (hb_glyf_scratch_t));
+      if (unlikely (!scratch))
+        return nullptr;
+    }
+    return scratch;
+  }
+  void release_scratch (hb_glyf_scratch_t *scratch) const
+  {
+    if (!scratch)
+      return;
+    if (!cached_scratch.cmpexch (nullptr, scratch))
+    {
+      scratch->~hb_glyf_scratch_t ();
+      hb_free (scratch);
+    }
   }
 
 #ifndef HB_NO_VAR
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/classdef-graph.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/classdef-graph.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/classdef-graph.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/classdef-graph.hh	2026-04-17 19:09:35.000000000 +0000
@@ -74,7 +74,7 @@
     class_def_link->width = SmallTypes::size;
     class_def_link->objidx = class_def_prime_id;
     class_def_link->position = link_position;
-    class_def_prime_vertex.add_parent (parent_id);
+    class_def_prime_vertex.add_parent (parent_id, false);
 
     return true;
   }
@@ -117,7 +117,7 @@
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
     if (vertex_len < OT::ClassDef::min_size) return false;
     hb_barrier ();
-    switch (u.format)
+    switch (u.format.v)
     {
     case 1: return ((ClassDefFormat1*)this)->sanitize (vertex);
     case 2: return ((ClassDefFormat2*)this)->sanitize (vertex);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/coverage-graph.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/coverage-graph.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/coverage-graph.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/coverage-graph.hh	2026-04-17 19:09:35.000000000 +0000
@@ -32,29 +32,27 @@
 
 namespace graph {
 
-struct CoverageFormat1 : public OT::Layout::Common::CoverageFormat1_3
-{
-  bool sanitize (graph_t::vertex_t& vertex) const
-  {
-    int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
-    constexpr unsigned min_size = OT::Layout::Common::CoverageFormat1_3::min_size;
-    if (vertex_len < min_size) return false;
-    hb_barrier ();
-    return vertex_len >= min_size + glyphArray.get_size () - glyphArray.len.get_size ();
-  }
-};
-
-struct CoverageFormat2 : public OT::Layout::Common::CoverageFormat2_4
-{
-  bool sanitize (graph_t::vertex_t& vertex) const
-  {
-    int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
-    constexpr unsigned min_size = OT::Layout::Common::CoverageFormat2_4::min_size;
-    if (vertex_len < min_size) return false;
-    hb_barrier ();
-    return vertex_len >= min_size + rangeRecord.get_size () - rangeRecord.len.get_size ();
-  }
-};
+static bool sanitize (
+  const OT::Layout::Common::CoverageFormat1_3* thiz,
+  graph_t::vertex_t& vertex
+) {
+  int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+  constexpr unsigned min_size = OT::Layout::Common::CoverageFormat1_3::min_size;
+  if (vertex_len < min_size) return false;
+  hb_barrier ();
+  return vertex_len >= min_size + thiz->glyphArray.get_size () - thiz->glyphArray.len.get_size ();
+}
+
+static bool sanitize (
+  const OT::Layout::Common::CoverageFormat2_4* thiz,
+  graph_t::vertex_t& vertex
+) {
+  int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
+  constexpr unsigned min_size = OT::Layout::Common::CoverageFormat2_4::min_size;
+  if (vertex_len < min_size) return false;
+  hb_barrier ();
+  return vertex_len >= min_size + thiz->rangeRecord.get_size () - thiz->rangeRecord.len.get_size ();
+}
 
 struct Coverage : public OT::Layout::Common::Coverage
 {
@@ -98,11 +96,33 @@
     coverage_link->width = SmallTypes::size;
     coverage_link->objidx = coverage_prime_id;
     coverage_link->position = link_position;
-    coverage_prime_vertex.add_parent (parent_id);
+    coverage_prime_vertex.add_parent (parent_id, false);
 
     return (Coverage*) coverage_prime_vertex.obj.head;
   }
 
+  // Filter an existing coverage table to glyphs at indices [start, end) and replace it with the filtered version.
+  static bool filter_coverage (gsubgpos_graph_context_t& c,
+                               unsigned existing_coverage,
+                               unsigned start, unsigned end) {
+    unsigned coverage_size = c.graph.vertices_[existing_coverage].table_size ();
+    auto& coverage_v = c.graph.vertices_[existing_coverage];
+    Coverage* coverage_table = (Coverage*) coverage_v.obj.head;
+    if (!coverage_table || !coverage_table->sanitize (coverage_v))
+      return false;
+
+    auto new_coverage =
+        + hb_zip (coverage_table->iter (), hb_range ())
+        | hb_filter ([&] (hb_pair_t p) {
+          return p.second >= start && p.second < end;
+        })
+        | hb_map_retains_sorting (hb_first)
+        ;
+
+    return make_coverage (c, new_coverage, existing_coverage, coverage_size * 2 + 100);
+  }
+
+  // Replace the coverage table at dest obj with one covering 'glyphs'.
   template
   static bool make_coverage (gsubgpos_graph_context_t& c,
                              It glyphs,
@@ -141,10 +161,10 @@
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
     if (vertex_len < OT::Layout::Common::Coverage::min_size) return false;
     hb_barrier ();
-    switch (u.format)
+    switch (u.format.v)
     {
-    case 1: return ((CoverageFormat1*)this)->sanitize (vertex);
-    case 2: return ((CoverageFormat2*)this)->sanitize (vertex);
+    case 1: return graph::sanitize ((const OT::Layout::Common::CoverageFormat1_3*) this, vertex);
+    case 2: return graph::sanitize ((const OT::Layout::Common::CoverageFormat2_4*) this, vertex);
 #ifndef HB_NO_BEYOND_64K
     // Not currently supported
     case 3:
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/graph.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/graph.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/graph.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/graph.hh	2026-04-17 19:09:35.000000000 +0000
@@ -50,6 +50,7 @@
     private:
     unsigned incoming_edges_ = 0;
     unsigned single_parent = (unsigned) -1;
+    bool has_incoming_virtual_edges_ = false;
     hb_hashmap_t parents;
     public:
 
@@ -66,6 +67,11 @@
       return parents.in_error ();
     }
 
+    bool has_incoming_virtual_edges () const
+    {
+      return has_incoming_virtual_edges_;
+    }
+
     bool link_positions_valid (unsigned num_objects, bool removed_nil)
     {
       hb_set_t assigned_bytes;
@@ -121,7 +127,9 @@
       }
     }
 
-    bool equals (const vertex_t& other,
+    bool equals (unsigned this_index,
+                 unsigned other_index,
+                 const vertex_t& other,
                  const graph_t& graph,
                  const graph_t& other_graph,
                  unsigned depth) const
@@ -129,8 +137,10 @@
       if (!(as_bytes () == other.as_bytes ()))
       {
         DEBUG_MSG (SUBSET_REPACK, nullptr,
-                   "vertex [%lu] bytes != [%lu] bytes, depth = %u",
+                   "vertex %u [%lu bytes] != %u [%lu bytes], depth = %u",
+                   this_index,
                    (unsigned long) table_size (),
+                   other_index,
                    (unsigned long) other.table_size (),
                    depth);
 
@@ -162,6 +172,7 @@
       hb_swap (a.single_parent, b.single_parent);
       hb_swap (a.parents, b.parents);
       hb_swap (a.incoming_edges_, b.incoming_edges_);
+      hb_swap (a.has_incoming_virtual_edges_, b.has_incoming_virtual_edges_);
       hb_swap (a.start, b.start);
       hb_swap (a.end, b.end);
       hb_swap (a.priority, b.priority);
@@ -207,13 +218,16 @@
     void reset_parents ()
     {
       incoming_edges_ = 0;
+      has_incoming_virtual_edges_ = false;
       single_parent = (unsigned) -1;
       parents.reset ();
     }
 
-    void add_parent (unsigned parent_index)
+    void add_parent (unsigned parent_index, bool is_virtual)
     {
       assert (parent_index != (unsigned) -1);
+      has_incoming_virtual_edges_ |= is_virtual;
+
       if (incoming_edges_ == 0)
       {
         single_parent = parent_index;
@@ -408,7 +422,7 @@
             link_a.bias != link_b.bias)
           return false;
 
-        if (!graph.vertices_[link_a.objidx].equals (
+        if (!graph.vertices_[link_a.objidx].equals (link_a.objidx, link_b.objidx,
                 other_graph.vertices_[link_b.objidx], graph, other_graph, depth + 1))
           return false;
 
@@ -456,8 +470,12 @@
     num_roots_for_space_.push (1);
     bool removed_nil = false;
     vertices_.alloc (objects.length);
-    vertices_scratch_.alloc (objects.length);
+    ordering_.resize (objects.length);
+    ordering_scratch_.alloc (objects.length);
+
     unsigned count = objects.length;
+    unsigned order = objects.length;
+    unsigned skip = 0;
     for (unsigned i = 0; i < count; i++)
     {
       // If this graph came from a serialization buffer object 0 is the
@@ -465,6 +483,9 @@
       if (i == 0 && !objects.arrayZ[i])
       {
         removed_nil = true;
+        order--;
+        ordering_.resize(objects.length - 1);
+        skip++;
         continue;
       }
 
@@ -474,6 +495,12 @@
 
       check_success (v->link_positions_valid (count, removed_nil));
 
+      // To start we set the ordering to match the provided objects
+      // list. Note: objects are provided to us in reverse order (ie.
+      // the last object is the root).
+      unsigned obj_idx = i - skip;
+      ordering_[--order] = obj_idx;
+
       if (!removed_nil) continue;
       // Fix indices to account for removed nil object.
       for (auto& l : v->obj.all_links_writer ()) {
@@ -490,17 +517,20 @@
 
   bool operator== (const graph_t& other) const
   {
-    return root ().equals (other.root (), *this, other, 0);
+    return root ().equals (root_idx(), other.root_idx(), other.root (), *this, other, 0);
   }
 
   void print () const {
-    for (int i = vertices_.length - 1; i >= 0; i--)
+    for (unsigned id : ordering_)
     {
-      const auto& v = vertices_[i];
-      printf("%d: %u [", i, (unsigned int)v.table_size());
+      const auto& v = vertices_[id];
+      printf("%u: %u [", id, (unsigned int)v.table_size());
       for (const auto &l : v.obj.real_links) {
         printf("%u, ", l.objidx);
       }
+      for (const auto &l : v.obj.virtual_links) {
+        printf("v%u, ", l.objidx);
+      }
       printf("]\n");
     }
   }
@@ -516,6 +546,7 @@
   {
     return !successful ||
         vertices_.in_error () ||
+        ordering_.in_error() ||
         num_roots_for_space_.in_error ();
   }
 
@@ -526,10 +557,10 @@
 
   unsigned root_idx () const
   {
-    // Object graphs are in reverse order, the first object is at the end
-    // of the vector. Since the graph is topologically sorted it's safe to
+    // First element of ordering_ is the root.
+    // Since the graph is topologically sorted it's safe to
     // assume the first object has no incoming edges.
-    return vertices_.length - 1;
+    return ordering_[0];
   }
 
   const hb_serialize_context_t::object_t& object (unsigned i) const
@@ -556,7 +587,7 @@
     link->width = 2;
     link->objidx = child_id;
     link->position = (char*) offset - (char*) v.obj.head;
-    vertices_[child_id].add_parent (parent_id);
+    vertices_[child_id].add_parent (parent_id, false);
   }
 
   /*
@@ -587,55 +618,51 @@
 
     hb_priority_queue_t queue;
     queue.alloc (vertices_.length);
-    hb_vector_t &sorted_graph = vertices_scratch_;
-    if (unlikely (!check_success (sorted_graph.resize (vertices_.length)))) return;
-    hb_vector_t id_map;
-    if (unlikely (!check_success (id_map.resize (vertices_.length)))) return;
+    hb_vector_t &new_ordering = ordering_scratch_;
+    if (unlikely (!check_success (new_ordering.resize (vertices_.length)))) return;
 
     hb_vector_t removed_edges;
     if (unlikely (!check_success (removed_edges.resize (vertices_.length)))) return;
     update_parents ();
 
     queue.insert (root ().modified_distance (0), root_idx ());
-    int new_id = root_idx ();
     unsigned order = 1;
+    unsigned pos = 0;
     while (!queue.in_error () && !queue.is_empty ())
     {
       unsigned next_id = queue.pop_minimum().second;
 
-      sorted_graph[new_id] = std::move (vertices_[next_id]);
-      const vertex_t& next = sorted_graph[new_id];
-
-      if (unlikely (!check_success(new_id >= 0))) {
+      if (unlikely (!check_success(pos < new_ordering.length))) {
         // We are out of ids. Which means we've visited a node more than once.
         // This graph contains a cycle which is not allowed.
         DEBUG_MSG (SUBSET_REPACK, nullptr, "Invalid graph. Contains cycle.");
         return;
       }
-
-      id_map[next_id] = new_id--;
+      new_ordering[pos++] = next_id;
+      const vertex_t& next = vertices_[next_id];
 
       for (const auto& link : next.obj.all_links ()) {
         removed_edges[link.objidx]++;
-        if (!(vertices_[link.objidx].incoming_edges () - removed_edges[link.objidx]))
+        const auto& v = vertices_[link.objidx];
+        if (!(v.incoming_edges () - removed_edges[link.objidx]))
           // Add the order that the links were encountered to the priority.
           // This ensures that ties between priorities objects are broken in a consistent
           // way. More specifically this is set up so that if a set of objects have the same
           // distance they'll be added to the topological order in the order that they are
           // referenced from the parent object.
-          queue.insert (vertices_[link.objidx].modified_distance (order++),
+          queue.insert (v.modified_distance (order++),
                         link.objidx);
       }
     }
 
     check_success (!queue.in_error ());
-    check_success (!sorted_graph.in_error ());
+    check_success (!new_ordering.in_error ());
 
-    check_success (remap_all_obj_indices (id_map, &sorted_graph));
-    vertices_ = std::move (sorted_graph);
+    hb_swap (ordering_, new_ordering);
 
-    if (!check_success (new_id == -1))
+    if (!check_success (pos == vertices_.length)) {
       print_orphaned_nodes ();
+    }
   }
 
   /*
@@ -645,8 +672,8 @@
    */
   void find_space_roots (hb_set_t& visited, hb_set_t& roots)
   {
-    int root_index = (int) root_idx ();
-    for (int i = root_index; i >= 0; i--)
+    unsigned root_index = root_idx ();
+    for (unsigned i : ordering_)
     {
       if (visited.has (i)) continue;
 
@@ -829,7 +856,6 @@
     if (subgraph.in_error ())
       return false;
 
-    unsigned original_root_idx = root_idx ();
     hb_map_t index_map;
     bool made_changes = false;
     for (auto entry : subgraph.iter ())
@@ -852,14 +878,6 @@
     if (!made_changes)
       return false;
 
-    if (original_root_idx != root_idx ()
-        && parents.has (original_root_idx))
-    {
-      // If the root idx has changed since parents was determined, update root idx in parents
-      parents.add (root_idx ());
-      parents.del (original_root_idx);
-    }
-
     auto new_subgraph =
         + subgraph.keys ()
         | hb_map([&] (uint32_t node_idx) {
@@ -943,12 +961,14 @@
   /*
    * Moves the child of old_parent_idx pointed to by old_offset to a new
    * vertex at the new_offset.
+   *
+   * Returns the id of the child node that was moved.
    */
   template
-  void move_child (unsigned old_parent_idx,
-                   const O* old_offset,
-                   unsigned new_parent_idx,
-                   const O* new_offset)
+  unsigned move_child (unsigned old_parent_idx,
+                       const O* old_offset,
+                       unsigned new_parent_idx,
+                       const O* new_offset)
   {
     distance_invalid = true;
     positions_invalid = true;
@@ -965,10 +985,56 @@
     new_link->position = (const char*) new_offset - (const char*) new_v.obj.head;
 
     auto& child = vertices_[child_id];
-    child.add_parent (new_parent_idx);
+    child.add_parent (new_parent_idx, false);
 
     old_v.remove_real_link (child_id, old_offset);
     child.remove_parent (old_parent_idx);
+
+    return child_id;
+  }
+
+  /*
+   * Moves all outgoing links in old parent that have
+   * a link position between [old_post_start, old_pos_end)
+   * to the new parent. Links are placed serially in the new
+   * parent starting at new_pos_start.
+   */
+  template
+  void move_children (unsigned old_parent_idx,
+                      unsigned old_pos_start,
+                      unsigned old_pos_end,
+                      unsigned new_parent_idx,
+                      unsigned new_pos_start)
+  {
+    distance_invalid = true;
+    positions_invalid = true;
+
+    auto& old_v = vertices_[old_parent_idx];
+    auto& new_v = vertices_[new_parent_idx];
+
+    hb_vector_t old_links;
+    for (const auto& l : old_v.obj.real_links)
+    {
+      if (l.position < old_pos_start || l.position >= old_pos_end)
+      {
+        old_links.push(l);
+        continue;
+      }
+
+      unsigned array_pos = l.position - old_pos_start;
+
+      unsigned child_id = l.objidx;
+      auto* new_link = new_v.obj.real_links.push ();
+      new_link->width = O::static_size;
+      new_link->objidx = child_id;
+      new_link->position = new_pos_start + array_pos;
+
+      auto& child = vertices_[child_id];
+      child.add_parent (new_parent_idx, false);
+      child.remove_parent (old_parent_idx);
+    }
+
+    old_v.obj.real_links = std::move (old_links);
   }
 
   /*
@@ -1000,8 +1066,11 @@
     distance_invalid = true;
 
     auto* clone = vertices_.push ();
+    unsigned clone_idx = vertices_.length - 1;
+    ordering_.push(clone_idx);
+
     auto& child = vertices_[node_idx];
-    if (vertices_.in_error ()) {
+    if (vertices_.in_error () || ordering_.in_error()) {
       return -1;
     }
 
@@ -1011,30 +1080,20 @@
     clone->space = child.space;
     clone->reset_parents ();
 
-    unsigned clone_idx = vertices_.length - 2;
     for (const auto& l : child.obj.real_links)
     {
       clone->obj.real_links.push (l);
-      vertices_[l.objidx].add_parent (clone_idx);
+      vertices_[l.objidx].add_parent (clone_idx, false);
     }
     for (const auto& l : child.obj.virtual_links)
     {
       clone->obj.virtual_links.push (l);
-      vertices_[l.objidx].add_parent (clone_idx);
+      vertices_[l.objidx].add_parent (clone_idx, true);
     }
 
     check_success (!clone->obj.real_links.in_error ());
     check_success (!clone->obj.virtual_links.in_error ());
 
-    // The last object is the root of the graph, so swap back the root to the end.
-    // The root's obj idx does change, however since it's root nothing else refers to it.
-    // all other obj idx's will be unaffected.
-    hb_swap (vertices_[vertices_.length - 2], *clone);
-
-    // Since the root moved, update the parents arrays of all children on the root.
-    for (const auto& l : root ().obj.all_links ())
-      vertices_[l.objidx].remap_parent (root_idx () - 1, root_idx ());
-
     return clone_idx;
   }
 
@@ -1045,24 +1104,6 @@
    *
    * Returns the index of the newly created duplicate.
    *
-   * If the child_idx only has incoming edges from parent_idx, this
-   * will do nothing and return the original child_idx.
-   */
-  unsigned duplicate_if_shared (unsigned parent_idx, unsigned child_idx)
-  {
-    unsigned new_idx = duplicate (parent_idx, child_idx);
-    if (new_idx == (unsigned) -1) return child_idx;
-    return new_idx;
-  }
-
-
-  /*
-   * Creates a copy of child and re-assigns the link from
-   * parent to the clone. The copy is a shallow copy, objects
-   * linked from child are not duplicated.
-   *
-   * Returns the index of the newly created duplicate.
-   *
    * If the child_idx only has incoming edges from parent_idx,
    * duplication isn't possible and this will return -1.
    */
@@ -1073,10 +1114,15 @@
     const auto& child = vertices_[child_idx];
     unsigned links_to_child = child.incoming_edges_from_parent(parent_idx);
 
-    if (child.incoming_edges () <= links_to_child)
+    if (child.incoming_edges () <= links_to_child || child.has_incoming_virtual_edges())
     {
       // Can't duplicate this node, doing so would orphan the original one as all remaining links
       // to child are from parent.
+      //
+      // We don't allow duplication of nodes with incoming virtual edges because we don't track
+      // the number of virtual vs real incoming edges. As a result we can't tell if a node
+      // with virtual edges may end up orphaned by duplication (ie. where one copy is only pointed
+      // to by virtual edges).
       DEBUG_MSG (SUBSET_REPACK, nullptr, "  Not duplicating %u => %u",
                  parent_idx, child_idx);
       return -1;
@@ -1091,12 +1137,15 @@
     if (parent_idx == clone_idx) parent_idx++;
 
     auto& parent = vertices_[parent_idx];
+    unsigned count = 0;
+    unsigned num_real = parent.obj.real_links.length;
     for (auto& l : parent.obj.all_links_writer ())
     {
+      count++;
       if (l.objidx != child_idx)
         continue;
 
-      reassign_link (l, parent_idx, clone_idx);
+      reassign_link (l, parent_idx, clone_idx, count > num_real);
     }
 
     return clone_idx;
@@ -1129,10 +1178,15 @@
       links_to_child += child.incoming_edges_from_parent(parent_idx);
     }
 
-    if (child.incoming_edges () <= links_to_child)
+    if (child.incoming_edges () <= links_to_child || child.has_incoming_virtual_edges())
     {
       // Can't duplicate this node, doing so would orphan the original one as all remaining links
       // to child are from parent.
+      //
+      // We don't allow duplication of nodes with incoming virtual edges because we don't track
+      // the number of virtual vs real incoming edges. As a result we can't tell if a node
+      // with virtual edges may end up orphaned by duplication (ie. where one copy is only pointed
+      // to by virtual edges).
       DEBUG_MSG (SUBSET_REPACK, nullptr, "  Not duplicating %u, ..., %u => %u", first_parent, last_parent, child_idx);
       return -1;
     }
@@ -1146,12 +1200,15 @@
       // duplicate shifts the root node idx, so if parent_idx was root update it.
       if (parent_idx == clone_idx) parent_idx++;
       auto& parent = vertices_[parent_idx];
+      unsigned count = 0;
+      unsigned num_real = parent.obj.real_links.length;
       for (auto& l : parent.obj.all_links_writer ())
       {
+        count++;
         if (l.objidx != child_idx)
           continue;
 
-        reassign_link (l, parent_idx, clone_idx);
+        reassign_link (l, parent_idx, clone_idx, count > num_real);
       }
     }
 
@@ -1168,7 +1225,10 @@
     distance_invalid = true;
 
     auto* clone = vertices_.push ();
-    if (vertices_.in_error ()) {
+    unsigned clone_idx = vertices_.length - 1;
+    ordering_.push(clone_idx);
+
+    if (vertices_.in_error () || ordering_.in_error()) {
       return -1;
     }
 
@@ -1177,18 +1237,35 @@
     clone->distance = 0;
     clone->space = 0;
 
-    unsigned clone_idx = vertices_.length - 2;
+    return clone_idx;
+  }
 
-    // The last object is the root of the graph, so swap back the root to the end.
-    // The root's obj idx does change, however since it's root nothing else refers to it.
-    // all other obj idx's will be unaffected.
-    hb_swap (vertices_[vertices_.length - 2], *clone);
-
-    // Since the root moved, update the parents arrays of all children on the root.
-    for (const auto& l : root ().obj.all_links ())
-      vertices_[l.objidx].remap_parent (root_idx () - 1, root_idx ());
+  /*
+   * Creates a new child node and remap the old child to it.
+   *
+   * Returns the index of the newly created child.
+   *
+   */
+  unsigned remap_child (unsigned parent_idx, unsigned old_child_idx)
+  {
+    unsigned new_child_idx = duplicate (old_child_idx);
+    if (new_child_idx == (unsigned) -1) return -1;
 
-    return clone_idx;
+    auto& parent = vertices_[parent_idx];
+    for (auto& l : parent.obj.real_links)
+    {
+      if (l.objidx != old_child_idx)
+        continue;
+      reassign_link (l, parent_idx, new_child_idx, false);
+    }
+
+    for (auto& l : parent.obj.virtual_links)
+    {
+      if (l.objidx != old_child_idx)
+        continue;
+      reassign_link (l, parent_idx, new_child_idx, true);
+    }
+    return new_child_idx;
   }
 
   /*
@@ -1279,6 +1356,7 @@
     if (!DEBUG_ENABLED(SUBSET_REPACK)) return;
 
     DEBUG_MSG (SUBSET_REPACK, nullptr, "Graph is not fully connected.");
+
     parents_invalid = true;
     update_parents();
 
@@ -1348,7 +1426,8 @@
     size_t total_size = 0;
     unsigned count = vertices_.length;
     for (unsigned i = 0; i < count; i++) {
-      size_t size = vertices_.arrayZ[i].obj.tail - vertices_.arrayZ[i].obj.head;
+      const auto& obj = vertices_.arrayZ[i].obj;
+      size_t size = obj.tail - obj.head;
       total_size += size;
     }
     return total_size;
@@ -1398,8 +1477,11 @@
 
     for (unsigned p = 0; p < count; p++)
     {
-      for (auto& l : vertices_.arrayZ[p].obj.all_links ())
-        vertices_[l.objidx].add_parent (p);
+      for (auto& l : vertices_.arrayZ[p].obj.real_links)
+        vertices_[l.objidx].add_parent (p, false);
+
+      for (auto& l : vertices_.arrayZ[p].obj.virtual_links)
+        vertices_[l.objidx].add_parent (p, true);
     }
 
     for (unsigned i = 0; i < count; i++)
@@ -1418,7 +1500,7 @@
     if (!positions_invalid) return;
 
     unsigned current_pos = 0;
-    for (int i = root_idx (); i >= 0; i--)
+    for (unsigned i : ordering_)
     {
       auto& v = vertices_[i];
       v.start = current_pos;
@@ -1450,11 +1532,11 @@
     unsigned count = vertices_.length;
     for (unsigned i = 0; i < count; i++)
       vertices_.arrayZ[i].distance = hb_int_max (int64_t);
-    vertices_.tail ().distance = 0;
+    vertices_[root_idx ()].distance = 0;
 
     hb_priority_queue_t queue;
     queue.alloc (count);
-    queue.insert (0, vertices_.length - 1);
+    queue.insert (0, root_idx ());
 
     hb_vector_t visited;
     visited.resize (vertices_.length);
@@ -1464,22 +1546,23 @@
       unsigned next_idx = queue.pop_minimum ().second;
       if (visited[next_idx]) continue;
       const auto& next = vertices_[next_idx];
-      int64_t next_distance = vertices_[next_idx].distance;
+      int64_t next_distance = next.distance;
       visited[next_idx] = true;
 
       for (const auto& link : next.obj.all_links ())
       {
         if (visited[link.objidx]) continue;
 
-        const auto& child = vertices_.arrayZ[link.objidx].obj;
+        auto& child_v = vertices_.arrayZ[link.objidx];
+        const auto& child = child_v.obj;
         unsigned link_width = link.width ? link.width : 4; // treat virtual offsets as 32 bits wide
         int64_t child_weight = (child.tail - child.head) +
-                               ((int64_t) 1 << (link_width * 8)) * (vertices_.arrayZ[link.objidx].space + 1);
+                               ((int64_t) 1 << (link_width * 8)) * (child_v.space + 1);
         int64_t child_distance = next_distance + child_weight;
 
-        if (child_distance < vertices_.arrayZ[link.objidx].distance)
+        if (child_distance < child_v.distance)
         {
-          vertices_.arrayZ[link.objidx].distance = child_distance;
+          child_v.distance = child_distance;
           queue.insert (child_distance, link.objidx);
         }
       }
@@ -1502,12 +1585,13 @@
    */
   void reassign_link (hb_serialize_context_t::object_t::link_t& link,
                       unsigned parent_idx,
-                      unsigned new_idx)
+                      unsigned new_idx,
+                      bool is_virtual)
   {
     unsigned old_idx = link.objidx;
     link.objidx = new_idx;
     vertices_[old_idx].remove_parent (parent_idx);
-    vertices_[new_idx].add_parent (parent_idx);
+    vertices_[new_idx].add_parent (parent_idx, is_virtual);
   }
 
   /*
@@ -1521,37 +1605,22 @@
     if (!id_map) return;
     for (unsigned i : subgraph)
     {
-      for (auto& link : vertices_[i].obj.all_links_writer ())
+      auto& obj = vertices_[i].obj;
+      unsigned num_real = obj.real_links.length;
+      unsigned count = 0;
+      for (auto& link : obj.all_links_writer ())
       {
+        count++;
         const uint32_t *v;
         if (!id_map.has (link.objidx, &v)) continue;
-        if (only_wide && !(link.width == 4 && !link.is_signed)) continue;
+        if (only_wide && (link.is_signed || (link.width != 4 && link.width != 3))) continue;
 
-        reassign_link (link, i, *v);
+        reassign_link (link, i, *v, count > num_real);
       }
     }
   }
 
   /*
-   * Updates all objidx's in all links using the provided mapping.
-   */
-  bool remap_all_obj_indices (const hb_vector_t& id_map,
-                              hb_vector_t* sorted_graph) const
-  {
-    unsigned count = sorted_graph->length;
-    for (unsigned i = 0; i < count; i++)
-    {
-      if (!(*sorted_graph)[i].remap_parents (id_map))
-        return false;
-      for (auto& link : sorted_graph->arrayZ[i].obj.all_links_writer ())
-      {
-        link.objidx = id_map[link.objidx];
-      }
-    }
-    return true;
-  }
-
-  /*
    * Finds all nodes in targets that are reachable from start_idx, nodes in visited will be skipped.
    * For this search the graph is treated as being undirected.
    *
@@ -1586,7 +1655,16 @@
  public:
   // TODO(garretrieger): make private, will need to move most of offset overflow code into graph.
   hb_vector_t vertices_;
-  hb_vector_t vertices_scratch_;
+
+  // Specifies the current topological ordering of this graph
+  //
+  // ordering_[pos] = obj index
+  //
+  // specifies that the 'pos'th spot is filled by the object
+  // given by obj index.
+  hb_vector_t ordering_;
+  hb_vector_t ordering_scratch_;
+
  private:
   bool parents_invalid;
   bool distance_invalid;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/gsubgpos-context.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/gsubgpos-context.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/gsubgpos-context.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/gsubgpos-context.hh	2026-04-17 19:09:35.000000000 +0000
@@ -41,6 +41,7 @@
   unsigned lookup_list_index;
   hb_hashmap_t lookups;
   hb_hashmap_t subtable_to_extension;
+  hb_hashmap_t> split_subtables;
 
   HB_INTERNAL gsubgpos_graph_context_t (hb_tag_t table_tag_,
                                         graph_t& graph_);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/gsubgpos-graph.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/gsubgpos-graph.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/gsubgpos-graph.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/gsubgpos-graph.hh	2026-04-17 19:09:35.000000000 +0000
@@ -27,9 +27,11 @@
 #include "graph.hh"
 #include "../hb-ot-layout-gsubgpos.hh"
 #include "../OT/Layout/GSUB/ExtensionSubst.hh"
+#include "../OT/Layout/GSUB/SubstLookupSubTable.hh"
 #include "gsubgpos-context.hh"
 #include "pairpos-graph.hh"
 #include "markbasepos-graph.hh"
+#include "ligature-graph.hh"
 
 #ifndef GRAPH_GSUBGPOS_GRAPH_HH
 #define GRAPH_GSUBGPOS_GRAPH_HH
@@ -85,6 +87,12 @@
     return lookupType == extension_type (table_tag);
   }
 
+  bool use_mark_filtering_set () const
+  {
+    unsigned flag = lookupFlag;
+    return flag & 0x0010u;
+  }
+
   bool make_extension (gsubgpos_graph_context_t& c,
                        unsigned this_index)
   {
@@ -120,22 +128,18 @@
     unsigned type = lookupType;
     bool is_ext = is_extension (c.table_tag);
 
-    if (c.table_tag != HB_OT_TAG_GPOS)
+    if (c.table_tag != HB_OT_TAG_GPOS && c.table_tag != HB_OT_TAG_GSUB)
       return true;
 
-    if (!is_ext &&
-        type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::Pair &&
-        type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::MarkBase)
+    if (!is_ext && !is_supported_gpos_type(type, c) && !is_supported_gsub_type(type, c))
       return true;
 
     hb_vector_t>> all_new_subtables;
     for (unsigned i = 0; i < subTable.len; i++)
     {
       unsigned subtable_index = c.graph.index_for_offset (this_index, &subTable[i]);
-      unsigned parent_index = this_index;
       if (is_ext) {
         unsigned ext_subtable_index = subtable_index;
-        parent_index = ext_subtable_index;
         ExtensionFormat1* extension =
             (ExtensionFormat1*)
             c.graph.object (ext_subtable_index).head;
@@ -144,26 +148,47 @@
 
         subtable_index = extension->get_subtable_index (c.graph, ext_subtable_index);
         type = extension->get_lookup_type ();
-        if (type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::Pair
-            && type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::MarkBase)
+        if (!is_supported_gpos_type(type, c) && !is_supported_gsub_type(type, c))
           continue;
       }
 
-      hb_vector_t new_sub_tables;
-      switch (type)
+      hb_vector_t* split_result;
+      if (c.split_subtables.has (subtable_index, &split_result))
       {
-      case 2:
-        new_sub_tables = split_subtable (c, parent_index, subtable_index); break;
-      case 4:
-        new_sub_tables = split_subtable (c, parent_index, subtable_index); break;
-      default:
-        break;
+        if (split_result->length == 0)
+          continue;
+        all_new_subtables.push (hb_pair(i, *split_result));
+      }
+      else
+      {
+        hb_vector_t new_sub_tables;
+
+        if (c.table_tag == HB_OT_TAG_GPOS) {
+          switch (type)
+          {
+          case 2:
+            new_sub_tables = split_subtable (c, subtable_index); break;
+          case 4:
+            new_sub_tables = split_subtable (c, subtable_index); break;
+          default:
+            break;
+          }
+        } else if (c.table_tag == HB_OT_TAG_GSUB) {
+          switch (type)
+          {
+          case 4:
+            new_sub_tables = split_subtable (c, subtable_index); break;
+          default:
+            break;
+          }
+        }
+
+        if (new_sub_tables.in_error ()) return false;
+
+        c.split_subtables.set (subtable_index, new_sub_tables);
+        if (new_sub_tables)
+          all_new_subtables.push (hb_pair (i, std::move (new_sub_tables)));
       }
-      if (new_sub_tables.in_error ()) return false;
-      if (!new_sub_tables) continue;
-      hb_pair_t>* entry = all_new_subtables.push ();
-      entry->first = i;
-      entry->second = std::move (new_sub_tables);
     }
 
     if (all_new_subtables) {
@@ -175,30 +200,29 @@
 
   template
   hb_vector_t split_subtable (gsubgpos_graph_context_t& c,
-                                        unsigned parent_idx,
                                         unsigned objidx)
   {
     T* sub_table = (T*) c.graph.object (objidx).head;
     if (!sub_table || !sub_table->sanitize (c.graph.vertices_[objidx]))
       return hb_vector_t ();
 
-    return sub_table->split_subtables (c, parent_idx, objidx);
+    return sub_table->split_subtables (c, objidx);
   }
 
   bool add_sub_tables (gsubgpos_graph_context_t& c,
                        unsigned this_index,
                        unsigned type,
-                       hb_vector_t>>& subtable_ids)
+                       const hb_vector_t>>& subtable_ids)
   {
     bool is_ext = is_extension (c.table_tag);
-    auto& v = c.graph.vertices_[this_index];
+    auto* v = &c.graph.vertices_[this_index];
     fix_existing_subtable_links (c, this_index, subtable_ids);
 
     unsigned new_subtable_count = 0;
     for (const auto& p : subtable_ids)
       new_subtable_count += p.second.length;
 
-    size_t new_size = v.table_size ()
+    size_t new_size = v->table_size ()
                       + new_subtable_count * OT::Offset16::static_size;
     char* buffer = (char*) hb_calloc (1, new_size);
     if (!buffer) return false;
@@ -207,10 +231,13 @@
       hb_free (buffer);
      return false;
     }
-    hb_memcpy (buffer, v.obj.head, v.table_size());
+    hb_memcpy (buffer, v->obj.head, v->table_size());
 
-    v.obj.head = buffer;
-    v.obj.tail = buffer + new_size;
+    if (use_mark_filtering_set ())
+      hb_memcpy (buffer + new_size - 2, v->obj.tail - 2, 2);
+
+    v->obj.head = buffer;
+    v->obj.tail = buffer + new_size;
 
     Lookup* new_lookup = (Lookup*) buffer;
 
@@ -226,21 +253,23 @@
         if (is_ext)
         {
           unsigned ext_id = create_extension_subtable (c, subtable_id, type);
-          c.graph.vertices_[subtable_id].add_parent (ext_id);
+          c.graph.vertices_[subtable_id].add_parent (ext_id, false);
           subtable_id = ext_id;
+          // the reference to v may have changed on adding a node, so reassign it.
+          v = &c.graph.vertices_[this_index];
         }
 
-        auto* link = v.obj.real_links.push ();
+        auto* link = v->obj.real_links.push ();
         link->width = 2;
         link->objidx = subtable_id;
         link->position = (char*) &new_lookup->subTable[offset_index++] -
                          (char*) new_lookup;
-        c.graph.vertices_[subtable_id].add_parent (this_index);
+        c.graph.vertices_[subtable_id].add_parent (this_index, false);
       }
     }
 
     // Repacker sort order depends on link order, which we've messed up so resort it.
-    v.obj.real_links.qsort ();
+    v->obj.real_links.qsort ();
 
     // The head location of the lookup has changed, invalidating the lookups map entry
     // in the context. Update the map.
@@ -250,17 +279,15 @@
 
   void fix_existing_subtable_links (gsubgpos_graph_context_t& c,
                                     unsigned this_index,
-                                    hb_vector_t>>& subtable_ids)
+                                    const hb_vector_t>>& subtable_ids)
   {
     auto& v = c.graph.vertices_[this_index];
-    Lookup* lookup = (Lookup*) v.obj.head;
-
     unsigned shift = 0;
     for (const auto& p : subtable_ids)
     {
       unsigned insert_index = p.first + shift;
       unsigned pos_offset = p.second.length * OT::Offset16::static_size;
-      unsigned insert_offset = (char*) &lookup->subTable[insert_index] - (char*) lookup;
+      unsigned insert_offset = Lookup::min_size + insert_index * OT::Offset16::static_size;
       shift += p.second.length;
 
       for (auto& l : v.obj.all_links_writer ())
@@ -326,7 +353,7 @@
 
     // Make extension point at the subtable.
     auto& ext_vertex = c.graph.vertices_[ext_index];
-    ext_vertex.add_parent (lookup_index);
+    ext_vertex.add_parent (lookup_index, false);
     if (!existing_ext_index)
       subtable_vertex.remap_parent (lookup_index, ext_index);
 
@@ -334,6 +361,19 @@
   }
 
  private:
+  bool is_supported_gsub_type(unsigned type, gsubgpos_graph_context_t& c) const {
+    return (c.table_tag == HB_OT_TAG_GSUB) && (
+      type == OT::Layout::GSUB_impl::SubstLookupSubTable::Type::Ligature
+    );
+  }
+
+  bool is_supported_gpos_type(unsigned type, gsubgpos_graph_context_t& c) const {
+   return (c.table_tag == HB_OT_TAG_GPOS) && (
+      type == OT::Layout::GPOS_impl::PosLookupSubTable::Type::Pair ||
+      type == OT::Layout::GPOS_impl::PosLookupSubTable::Type::MarkBase
+    );
+  }
+
   unsigned extension_type (hb_tag_t table_tag) const
   {
     switch (table_tag)
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/markbasepos-graph.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/markbasepos-graph.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/markbasepos-graph.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/markbasepos-graph.hh	2026-04-17 19:09:35.000000000 +0000
@@ -212,7 +212,6 @@
   }
 
   hb_vector_t split_subtables (gsubgpos_graph_context_t& c,
-                                         unsigned parent_index,
                                          unsigned this_index)
   {
     hb_set_t visited;
@@ -265,7 +264,7 @@
     split_context_t split_context {
       c,
       this,
-      c.graph.duplicate_if_shared (parent_index, this_index),
+      this_index,
       std::move (class_to_info),
       c.graph.vertices_[mark_array_id].position_to_index_map (),
     };
@@ -478,12 +477,11 @@
 struct MarkBasePos : public OT::Layout::GPOS_impl::MarkBasePos
 {
   hb_vector_t split_subtables (gsubgpos_graph_context_t& c,
-                                         unsigned parent_index,
                                          unsigned this_index)
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1:
-      return ((MarkBasePosFormat1*)(&u.format1))->split_subtables (c, parent_index, this_index);
+      return ((MarkBasePosFormat1*)(&u.format1))->split_subtables (c, this_index);
 #ifndef HB_NO_BEYOND_64K
     case 2: HB_FALLTHROUGH;
       // Don't split 24bit MarkBasePos's.
@@ -496,10 +494,10 @@
   bool sanitize (graph_t::vertex_t& vertex) const
   {
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
-    if (vertex_len < u.format.get_size ()) return false;
+    if (vertex_len < u.format.v.get_size ()) return false;
     hb_barrier ();
 
-    switch (u.format) {
+    switch (u.format.v) {
     case 1:
       return ((MarkBasePosFormat1*)(&u.format1))->sanitize (vertex);
 #ifndef HB_NO_BEYOND_64K
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/pairpos-graph.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/pairpos-graph.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/pairpos-graph.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/pairpos-graph.hh	2026-04-17 19:09:35.000000000 +0000
@@ -49,7 +49,6 @@
   }
 
   hb_vector_t split_subtables (gsubgpos_graph_context_t& c,
-                                         unsigned parent_index,
                                          unsigned this_index)
   {
     hb_set_t visited;
@@ -84,7 +83,7 @@
     split_context_t split_context {
       c,
       this,
-      c.graph.duplicate_if_shared (parent_index, this_index),
+      this_index,
     };
 
     return actuate_subtable_split (split_context, split_points);
@@ -207,7 +206,6 @@
   }
 
   hb_vector_t split_subtables (gsubgpos_graph_context_t& c,
-                                         unsigned parent_index,
                                          unsigned this_index)
   {
     const unsigned base_size = OT::Layout::GPOS_impl::PairPosFormat2_4::min_size;
@@ -291,7 +289,7 @@
     split_context_t split_context {
       c,
       this,
-      c.graph.duplicate_if_shared (parent_index, this_index),
+      this_index,
       class1_record_size,
       total_value_len,
       value_1_len,
@@ -423,7 +421,7 @@
     class_def_link->width = SmallTypes::size;
     class_def_link->objidx = class_def_2_id;
     class_def_link->position = 10;
-    graph.vertices_[class_def_2_id].add_parent (pair_pos_prime_id);
+    graph.vertices_[class_def_2_id].add_parent (pair_pos_prime_id, false);
     graph.duplicate (pair_pos_prime_id, class_def_2_id);
 
     return pair_pos_prime_id;
@@ -607,14 +605,13 @@
 struct PairPos : public OT::Layout::GPOS_impl::PairPos
 {
   hb_vector_t split_subtables (gsubgpos_graph_context_t& c,
-                                         unsigned parent_index,
                                          unsigned this_index)
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1:
-      return ((PairPosFormat1*)(&u.format1))->split_subtables (c, parent_index, this_index);
+      return ((PairPosFormat1*)(&u.format1))->split_subtables (c, this_index);
     case 2:
-      return ((PairPosFormat2*)(&u.format2))->split_subtables (c, parent_index, this_index);
+      return ((PairPosFormat2*)(&u.format2))->split_subtables (c, this_index);
 #ifndef HB_NO_BEYOND_64K
     case 3: HB_FALLTHROUGH;
     case 4: HB_FALLTHROUGH;
@@ -628,10 +625,10 @@
   bool sanitize (graph_t::vertex_t& vertex) const
   {
     int64_t vertex_len = vertex.obj.tail - vertex.obj.head;
-    if (vertex_len < u.format.get_size ()) return false;
+    if (vertex_len < u.format.v.get_size ()) return false;
     hb_barrier ();
 
-    switch (u.format) {
+    switch (u.format.v) {
     case 1:
       return ((PairPosFormat1*)(&u.format1))->sanitize (vertex);
     case 2:
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/serialize.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/serialize.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/serialize.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/serialize.hh	2026-04-17 19:09:35.000000000 +0000
@@ -113,7 +113,7 @@
 
   hb_hashmap_t record_set;
   const auto& vertices = graph.vertices_;
-  for (int parent_idx = vertices.length - 1; parent_idx >= 0; parent_idx--)
+  for (unsigned parent_idx : graph.ordering_)
   {
     // Don't need to check virtual links for overflow
     for (const auto& link : vertices.arrayZ[parent_idx].obj.real_links)
@@ -172,14 +172,16 @@
 template  inline void
 serialize_link_of_type (const hb_serialize_context_t::object_t::link_t& link,
                         char* head,
+                        unsigned size,
+                        const hb_vector_t& id_map,
                         hb_serialize_context_t* c)
 {
+  assert(link.position + link.width <= size);
+
   OT::Offset* offset = reinterpret_cast*> (head + link.position);
   *offset = 0;
   c->add_link (*offset,
-               // serializer has an extra nil object at the start of the
-               // object array. So all id's are +1 of what our id's are.
-               link.objidx + 1,
+               id_map[link.objidx],
                (hb_serialize_context_t::whence_t) link.whence,
                link.bias);
 }
@@ -187,6 +189,8 @@
 inline
 void serialize_link (const hb_serialize_context_t::object_t::link_t& link,
                      char* head,
+                     unsigned size,
+                     const hb_vector_t& id_map,
                      hb_serialize_context_t* c)
 {
   switch (link.width)
@@ -197,21 +201,21 @@
     case 4:
       if (link.is_signed)
       {
-        serialize_link_of_type (link, head, c);
+        serialize_link_of_type (link, head, size, id_map, c);
       } else {
-        serialize_link_of_type (link, head, c);
+        serialize_link_of_type (link, head, size, id_map, c);
       }
       return;
     case 2:
       if (link.is_signed)
       {
-        serialize_link_of_type (link, head, c);
+        serialize_link_of_type (link, head, size, id_map, c);
       } else {
-        serialize_link_of_type (link, head, c);
+        serialize_link_of_type (link, head, size, id_map, c);
       }
       return;
     case 3:
-      serialize_link_of_type (link, head, c);
+      serialize_link_of_type (link, head, size, id_map, c);
       return;
     default:
       // Unexpected link width.
@@ -237,25 +241,36 @@
 
   c.start_serialize ();
   const auto& vertices = graph.vertices_;
-  for (unsigned i = 0; i < vertices.length; i++) {
+
+  // Objects are placed in the serializer in reverse order since children need
+  // to be inserted before their parents.
+
+  // Maps from our obj id's to the id's used during this serialization.
+  hb_vector_t id_map;
+  id_map.resize(graph.ordering_.length);
+  for (int pos = graph.ordering_.length - 1; pos >= 0; pos--) {
+    unsigned i = graph.ordering_[pos];
     c.push ();
 
-    size_t size = vertices[i].obj.tail - vertices[i].obj.head;
+    auto& v = vertices[i];
+
+    size_t size = v.obj.tail - v.obj.head;
+
     char* start = c.allocate_size  (size);
     if (!start) {
       DEBUG_MSG (SUBSET_REPACK, nullptr, "Buffer out of space.");
       return nullptr;
     }
 
-    hb_memcpy (start, vertices[i].obj.head, size);
+    hb_memcpy (start, v.obj.head, size);
 
     // Only real links needs to be serialized.
-    for (const auto& link : vertices[i].obj.real_links)
-      serialize_link (link, start, &c);
+    for (const auto& link : v.obj.real_links)
+      serialize_link (link, start, size, id_map, &c);
 
     // All duplications are already encoded in the graph, so don't
     // enable sharing during packing.
-    c.pop_pack (false);
+    id_map[i] = c.pop_pack (false);
   }
   c.end_serialize ();
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/split-helpers.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/split-helpers.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/graph/split-helpers.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/graph/split-helpers.hh	2026-04-17 19:09:35.000000000 +0000
@@ -49,7 +49,7 @@
     if (id == (unsigned) -1)
     {
       new_objects.reset ();
-      new_objects.allocated = -1; // mark error
+      new_objects.ensure_error ();
       return new_objects;
     }
     new_objects.push (id);
@@ -58,7 +58,7 @@
   if (!split_context.shrink (split_points[0]))
   {
     new_objects.reset ();
-    new_objects.allocated = -1; // mark error
+    new_objects.ensure_error ();
   }
 
   return new_objects;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-common.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-common.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-common.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-common.hh	2026-04-17 19:09:35.000000000 +0000
@@ -47,8 +47,7 @@
 
 struct ankr;
 
-using hb_aat_class_cache_t = hb_cache_t<15, 8, 7>;
-static_assert (sizeof (hb_aat_class_cache_t) == 256, "");
+using hb_aat_class_cache_t = hb_ot_layout_mapping_cache_t;
 
 struct hb_aat_scratch_t
 {
@@ -79,7 +78,10 @@
   {
     hb_bit_set_t *s = buffer_glyph_set.get_acquire ();
     if (s && buffer_glyph_set.cmpexch (s, nullptr))
+    {
+      s->clear ();
       return s;
+    }
 
     s = (hb_bit_set_t *) hb_calloc (1, sizeof (hb_bit_set_t));
     if (unlikely (!s))
@@ -124,13 +126,14 @@
   const OT::GDEF &gdef;
   bool has_glyph_classes;
   const hb_sorted_vector_t *range_flags = nullptr;
+  hb_mask_t subtable_flags = 0;
+  bool buffer_is_reversed = false;
+  // Caches
   bool using_buffer_glyph_set = false;
   hb_bit_set_t *buffer_glyph_set = nullptr;
-  const hb_bit_set_t *left_set = nullptr;
-  const hb_bit_set_t *right_set = nullptr;
-  const hb_bit_set_t *machine_glyph_set = nullptr;
+  const hb_bit_set_t *first_set = nullptr;
+  const hb_bit_set_t *second_set = nullptr;
   hb_aat_class_cache_t *machine_class_cache = nullptr;
-  hb_mask_t subtable_flags = 0;
 
   /* Unused. For debug tracing only. */
   unsigned int lookup_index;
@@ -146,6 +149,12 @@
 
   void set_lookup_index (unsigned int i) { lookup_index = i; }
 
+  void reverse_buffer ()
+  {
+    buffer->reverse ();
+    buffer_is_reversed = !buffer_is_reversed;
+  }
+
   void setup_buffer_glyph_set ()
   {
     using_buffer_glyph_set = buffer->len >= 4 && buffer_glyph_set;
@@ -156,11 +165,11 @@
   bool buffer_intersects_machine () const
   {
     if (likely (using_buffer_glyph_set))
-      return buffer_glyph_set->intersects (*machine_glyph_set);
+      return buffer_glyph_set->intersects (*first_set);
 
     // Faster for shorter buffers.
     for (unsigned i = 0; i < buffer->len; i++)
-      if (machine_glyph_set->has (buffer->info[i].codepoint))
+      if (first_set->has (buffer->info[i].codepoint))
         return true;
     return false;
   }
@@ -639,6 +648,23 @@
     glyphs.add_range (firstGlyph, firstGlyph + glyphCount - 1);
   }
 
+  template 
+  void collect_glyphs_filtered (set_t &glyphs, const filter_t &filter) const
+  {
+    if (unlikely (!glyphCount)) return;
+    if (firstGlyph == DELETED_GLYPH) return;
+    const HBUINT8 *p = valueArrayZ.arrayZ;
+    for (unsigned i = 0; i < glyphCount; i++)
+    {
+      unsigned int v = 0;
+      unsigned int count = valueSize;
+      for (unsigned int j = 0; j < count; j++)
+        v = (v << 8) | *p++;
+      if (filter (v))
+        glyphs.add (firstGlyph + i);
+    }
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -666,7 +692,7 @@
 {
   const T* get_value (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 0: hb_barrier (); return u.format0.get_value (glyph_id, num_glyphs);
     case 2: hb_barrier (); return u.format2.get_value (glyph_id);
     case 4: hb_barrier (); return u.format4.get_value (glyph_id);
@@ -678,7 +704,7 @@
 
   const typename T::type get_value_or_null (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
       /* Format 10 cannot return a pointer. */
       case 10: hb_barrier (); return u.format10.get_value_or_null (glyph_id);
       default:
@@ -690,7 +716,7 @@
   template 
   void collect_glyphs (set_t &glyphs, unsigned int num_glyphs) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 0: hb_barrier (); u.format0.collect_glyphs (glyphs, num_glyphs); return;
     case 2: hb_barrier (); u.format2.collect_glyphs (glyphs); return;
     case 4: hb_barrier (); u.format4.collect_glyphs (glyphs); return;
@@ -703,12 +729,13 @@
   template 
   void collect_glyphs_filtered (set_t &glyphs, unsigned num_glyphs, const filter_t &filter) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 0: hb_barrier (); u.format0.collect_glyphs_filtered (glyphs, num_glyphs, filter); return;
     case 2: hb_barrier (); u.format2.collect_glyphs_filtered (glyphs, filter); return;
     case 4: hb_barrier (); u.format4.collect_glyphs_filtered (glyphs, filter); return;
     case 6: hb_barrier (); u.format6.collect_glyphs_filtered (glyphs, filter); return;
     case 8: hb_barrier (); u.format8.collect_glyphs_filtered (glyphs, filter); return;
+    case 10: hb_barrier (); u.format10.collect_glyphs_filtered (glyphs, filter); return;
     default:return;
     }
   }
@@ -724,9 +751,9 @@
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return_trace (false);
+    if (!u.format.v.sanitize (c)) return_trace (false);
     hb_barrier ();
-    switch (u.format) {
+    switch (u.format.v) {
     case 0: hb_barrier (); return_trace (u.format0.sanitize (c));
     case 2: hb_barrier (); return_trace (u.format2.sanitize (c));
     case 4: hb_barrier (); return_trace (u.format4.sanitize (c));
@@ -739,9 +766,9 @@
   bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return_trace (false);
+    if (!u.format.v.sanitize (c)) return_trace (false);
     hb_barrier ();
-    switch (u.format) {
+    switch (u.format.v) {
     case 0: hb_barrier (); return_trace (u.format0.sanitize (c, base));
     case 2: hb_barrier (); return_trace (u.format2.sanitize (c, base));
     case 4: hb_barrier (); return_trace (u.format4.sanitize (c, base));
@@ -754,7 +781,7 @@
 
   protected:
   union {
-  HBUINT16              format;         /* Format identifier */
+  struct { HBUINT16 v; }        format;         /* Format identifier */
   LookupFormat0      format0;
   LookupFormat2      format2;
   LookupFormat4      format4;
@@ -763,7 +790,7 @@
   LookupFormat10     format10;
   } u;
   public:
-  DEFINE_SIZE_UNION (2, format);
+  DEFINE_SIZE_UNION (2, format.v);
 };
 DECLARE_NULL_NAMESPACE_BYTES_TEMPLATE1 (AAT, Lookup, 2);
 
@@ -838,11 +865,6 @@
     STATE_START_OF_LINE = 1,
   };
 
-  template 
-  void collect_glyphs (set_t &glyphs, unsigned num_glyphs) const
-  {
-    (this+classTable).collect_glyphs (glyphs, num_glyphs);
-  }
   template 
   void collect_initial_glyphs (set_t &glyphs, unsigned num_glyphs, const table_t &table) const
   {
@@ -1082,6 +1104,8 @@
     for (unsigned i = 0; i < subtable_count; i++)
     {
       uint32_t offset = (uint32_t) subtableOffsets[i];
+      // A font file called SFNSDisplay.ttf has value 0xFFFFFFFF in the offsets.
+      // Just ignore it.
       if (offset == 0 || offset == 0xFFFFFFFF)
         continue;
       if (unlikely (!subtableOffsets[i].sanitize (c, this, bytes)))
@@ -1192,11 +1216,24 @@
     int state = StateTableT::STATE_START_OF_TEXT;
     // If there's only one range, we already checked the flag.
     auto *last_range = ac->range_flags && (ac->range_flags->length > 1) ? &(*ac->range_flags)[0] : nullptr;
+    const bool start_state_safe_to_break_eot =
+      !c->table->is_actionable (machine.get_entry (StateTableT::STATE_START_OF_TEXT, CLASS_END_OF_TEXT));
     for (buffer->idx = 0; buffer->successful;)
     {
-      /* This block is copied in NoncontextualSubtable::apply. Keep in sync. */
-      if (last_range)
+      unsigned int klass = likely (buffer->idx < buffer->len) ?
+                           machine.get_class (buffer->cur().codepoint, num_glyphs, ac->machine_class_cache) :
+                           (unsigned) CLASS_END_OF_TEXT;
+    resume:
+      DEBUG_MSG (APPLY, nullptr, "c%u at %u", klass, buffer->idx);
+      const EntryT &entry = machine.get_entry (state, klass);
+      const int next_state = machine.new_state (entry.newState);
+
+      bool is_not_epsilon_transition = !(entry.flags & Flags::DontAdvance);
+      bool is_not_actionable = !c->table->is_actionable (entry);
+
+      if (unlikely (last_range))
       {
+        /* This block is copied in NoncontextualSubtable::apply. Keep in sync. */
         auto *range = last_range;
         if (buffer->idx < buffer->len)
         {
@@ -1211,7 +1248,7 @@
         }
         if (!(range->flags & ac->subtable_flags))
         {
-          if (buffer->idx == buffer->len || unlikely (!buffer->successful))
+          if (buffer->idx == buffer->len)
             break;
 
           state = StateTableT::STATE_START_OF_TEXT;
@@ -1219,13 +1256,42 @@
           continue;
         }
       }
+      else
+      {
+        // Fast path for when transitioning from start-state to start-state with
+        // no action and advancing. Do so as long as the class remains the same.
+        // This is common with runs of non-actionable glyphs.
+
+        bool is_null_transition = state == StateTableT::STATE_START_OF_TEXT &&
+                                  next_state == StateTableT::STATE_START_OF_TEXT &&
+                                  start_state_safe_to_break_eot &&
+                                  is_not_actionable &&
+                                  is_not_epsilon_transition &&
+                                  !last_range;
 
-      unsigned int klass = likely (buffer->idx < buffer->len) ?
-                           machine.get_class (buffer->cur().codepoint, num_glyphs, ac->machine_class_cache) :
-                           (unsigned) CLASS_END_OF_TEXT;
-      DEBUG_MSG (APPLY, nullptr, "c%u at %u", klass, buffer->idx);
-      const EntryT &entry = machine.get_entry (state, klass);
-      const int next_state = machine.new_state (entry.newState);
+        if (is_null_transition)
+        {
+          unsigned old_klass = klass;
+          do
+          {
+            c->transition (buffer, this, entry);
+
+            if (buffer->idx == buffer->len || !buffer->successful)
+              break;
+
+            (void) buffer->next_glyph ();
+
+            klass = likely (buffer->idx < buffer->len) ?
+                     machine.get_class (buffer->cur().codepoint, num_glyphs, ac->machine_class_cache) :
+                     (unsigned) CLASS_END_OF_TEXT;
+          } while (klass == old_klass);
+
+          if (buffer->idx == buffer->len || !buffer->successful)
+            break;
+
+          goto resume;
+        }
+      }
 
       /* Conditions under which it's guaranteed safe-to-break before current glyph:
        *
@@ -1292,10 +1358,10 @@
       state = next_state;
       DEBUG_MSG (APPLY, nullptr, "s%d", state);
 
-      if (buffer->idx == buffer->len || unlikely (!buffer->successful))
+      if (buffer->idx == buffer->len)
         break;
 
-      if (!(entry.flags & Flags::DontAdvance) || buffer->max_ops-- <= 0)
+      if (is_not_epsilon_transition || buffer->max_ops-- <= 0)
         (void) buffer->next_glyph ();
     }
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-kerx-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-kerx-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-kerx-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-kerx-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -120,12 +120,12 @@
   }
 
   template 
-  void collect_glyphs (set_t &left_set, set_t &right_set, unsigned num_glyphs) const
+  void collect_glyphs (set_t &first_set, set_t &second_set, unsigned num_glyphs) const
   {
     for (const KernPair& pair : pairs)
     {
-      left_set.add (pair.left);
-      right_set.add (pair.right);
+      first_set.add (pair.left);
+      second_set.add (pair.right);
     }
   }
 
@@ -140,7 +140,7 @@
 
     int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
     {
-      if (!(*c->left_set)[left] || !(*c->right_set)[right]) return 0;
+      if (!(*c->first_set)[left] || !(*c->second_set)[right]) return 0;
       return table.get_kerning (left, right, c);
     }
   };
@@ -396,10 +396,10 @@
   }
 
   template 
-  void collect_glyphs (set_t &left_set, set_t &right_set, unsigned num_glyphs) const
+  void collect_glyphs (set_t &first_set, set_t &second_set, unsigned num_glyphs) const
   {
-    machine.collect_initial_glyphs (left_set, num_glyphs, *this);
-    //machine.collect_glyphs (right_set, num_glyphs); // right_set is unused for machine kerning
+    machine.collect_initial_glyphs (first_set, num_glyphs, *this);
+    //machine.collect_glyphs (second_set, num_glyphs); // second_set is unused for machine kerning
   }
 
   protected:
@@ -451,10 +451,10 @@
   }
 
   template 
-  void collect_glyphs (set_t &left_set, set_t &right_set, unsigned num_glyphs) const
+  void collect_glyphs (set_t &first_set, set_t &second_set, unsigned num_glyphs) const
   {
-    (this+leftClassTable).collect_glyphs (left_set, num_glyphs);
-    (this+rightClassTable).collect_glyphs (right_set, num_glyphs);
+    (this+leftClassTable).collect_glyphs (first_set, num_glyphs);
+    (this+rightClassTable).collect_glyphs (second_set, num_glyphs);
   }
 
   struct accelerator_t
@@ -468,7 +468,7 @@
 
     int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
     {
-      if (!(*c->left_set)[left] || !(*c->right_set)[right]) return 0;
+      if (!(*c->first_set)[left] || !(*c->second_set)[right]) return 0;
       return table.get_kerning (left, right, c);
     }
   };
@@ -629,6 +629,8 @@
         }
         o.attach_type() = OT::Layout::GPOS_impl::ATTACH_TYPE_MARK;
         o.attach_chain() = (int) mark - (int) buffer->idx;
+        if (c->buffer_is_reversed)
+          o.attach_chain() = -o.attach_chain();
         buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
       }
 
@@ -671,10 +673,10 @@
   }
 
   template 
-  void collect_glyphs (set_t &left_set, set_t &right_set, unsigned num_glyphs) const
+  void collect_glyphs (set_t &first_set, set_t &second_set, unsigned num_glyphs) const
   {
-    machine.collect_initial_glyphs (left_set, num_glyphs, *this);
-    //machine.collect_glyphs (right_set, num_glyphs); // right_set is unused for machine kerning
+    machine.collect_initial_glyphs (first_set, num_glyphs, *this);
+    //machine.collect_glyphs (second_set, num_glyphs); // second_set is unused for machine kerning
   }
 
   protected:
@@ -762,19 +764,19 @@
   }
 
   template 
-  void collect_glyphs (set_t &left_set, set_t &right_set, unsigned num_glyphs) const
+  void collect_glyphs (set_t &first_set, set_t &second_set, unsigned num_glyphs) const
   {
     if (is_long ())
     {
       const auto &t = u.l;
-      (this+t.rowIndexTable).collect_glyphs (left_set, num_glyphs);
-      (this+t.columnIndexTable).collect_glyphs (right_set, num_glyphs);
+      (this+t.rowIndexTable).collect_glyphs (first_set, num_glyphs);
+      (this+t.columnIndexTable).collect_glyphs (second_set, num_glyphs);
     }
     else
     {
       const auto &t = u.s;
-      (this+t.rowIndexTable).collect_glyphs (left_set, num_glyphs);
-      (this+t.columnIndexTable).collect_glyphs (right_set, num_glyphs);
+      (this+t.rowIndexTable).collect_glyphs (first_set, num_glyphs);
+      (this+t.columnIndexTable).collect_glyphs (second_set, num_glyphs);
     }
   }
 
@@ -789,7 +791,7 @@
 
     int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
     {
-      if (!(*c->left_set)[left] || !(*c->right_set)[right]) return 0;
+      if (!(*c->first_set)[left] || !(*c->second_set)[right]) return 0;
       return table.get_kerning (left, right, c);
     }
   };
@@ -878,15 +880,15 @@
   }
 
   template 
-  void collect_glyphs (set_t &left_set, set_t &right_set, unsigned num_glyphs) const
+  void collect_glyphs (set_t &first_set, set_t &second_set, unsigned num_glyphs) const
   {
     unsigned int subtable_type = get_type ();
     switch (subtable_type) {
-    case 0:     u.format0.collect_glyphs (left_set, right_set, num_glyphs); return;
-    case 1:     u.format1.collect_glyphs (left_set, right_set, num_glyphs); return;
-    case 2:     u.format2.collect_glyphs (left_set, right_set, num_glyphs); return;
-    case 4:     u.format4.collect_glyphs (left_set, right_set, num_glyphs); return;
-    case 6:     u.format6.collect_glyphs (left_set, right_set, num_glyphs); return;
+    case 0:     u.format0.collect_glyphs (first_set, second_set, num_glyphs); return;
+    case 1:     u.format1.collect_glyphs (first_set, second_set, num_glyphs); return;
+    case 2:     u.format2.collect_glyphs (first_set, second_set, num_glyphs); return;
+    case 4:     u.format4.collect_glyphs (first_set, second_set, num_glyphs); return;
+    case 6:     u.format6.collect_glyphs (first_set, second_set, num_glyphs); return;
     default:    return;
     }
   }
@@ -923,8 +925,8 @@
 
 struct kern_subtable_accelerator_data_t
 {
-  hb_bit_set_t left_set;
-  hb_bit_set_t right_set;
+  hb_bit_set_t first_set;
+  hb_bit_set_t second_set;
   mutable hb_aat_class_cache_t class_cache;
 };
 
@@ -1017,9 +1019,8 @@
       if (HB_DIRECTION_IS_HORIZONTAL (c->buffer->props.direction) != st->u.header.is_horizontal ())
         goto skip;
 
-      c->left_set = &subtable_accel.left_set;
-      c->right_set = &subtable_accel.right_set;
-      c->machine_glyph_set = &subtable_accel.left_set;
+      c->first_set = &subtable_accel.first_set;
+      c->second_set = &subtable_accel.second_set;
       c->machine_class_cache = &subtable_accel.class_cache;
 
       if (!c->buffer_intersects_machine ())
@@ -1051,8 +1052,8 @@
         }
       }
 
-      if (reverse)
-        c->buffer->reverse ();
+      if (reverse != c->buffer_is_reversed)
+        c->reverse_buffer ();
 
       {
         /* See comment in sanitize() for conditional here. */
@@ -1060,15 +1061,14 @@
         ret |= st->dispatch (c);
       }
 
-      if (reverse)
-        c->buffer->reverse ();
-
       (void) c->buffer->message (c->font, "end subtable %u", c->lookup_index);
 
     skip:
       st = &StructAfter (*st);
       c->set_lookup_index (c->lookup_index + 1);
     }
+    if (c->buffer_is_reversed)
+      c->reverse_buffer ();
 
     return ret;
   }
@@ -1133,7 +1133,7 @@
       if (unlikely (accel_data.subtable_accels.in_error ()))
           return accel_data;
 
-      st->collect_glyphs (subtable_accel.left_set, subtable_accel.right_set, num_glyphs);
+      st->collect_glyphs (subtable_accel.first_set, subtable_accel.second_set, num_glyphs);
       subtable_accel.class_cache.clear ();
 
       st = &StructAfter (*st);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-morx-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-morx-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-morx-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-aat-layout-morx-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -487,7 +487,7 @@
       if (entry.flags & LigatureEntryT::SetComponent)
       {
         /* Never mark same index twice, in case DontAdvance was used... */
-        if (match_length && match_positions[(match_length - 1u) % ARRAY_LENGTH (match_positions)] == buffer->out_len)
+        if (unlikely (match_length && match_positions[(match_length - 1u) % ARRAY_LENGTH (match_positions)] == buffer->out_len))
           match_length--;
 
         match_positions[match_length++ % ARRAY_LENGTH (match_positions)] = buffer->out_len;
@@ -640,7 +640,7 @@
     for (unsigned int i = 0; i < count; i++)
     {
       /* This block copied from StateTableDriver::drive. Keep in sync. */
-      if (last_range)
+      if (unlikely (last_range))
       {
         auto *range = last_range;
         {
@@ -1169,15 +1169,15 @@
                    hb_map ([subtable_flags] (const hb_aat_map_t::range_flags_t _) -> bool { return subtable_flags & (_.flags); })))
         goto skip;
 
-      c->subtable_flags = subtable_flags;
-      c->machine_glyph_set = accel ? &accel->subtables[i].glyph_set : &Null(hb_bit_set_t);
-      c->machine_class_cache = accel ? &accel->subtables[i].class_cache : nullptr;
-
       if (!(coverage & ChainSubtable::AllDirections) &&
           HB_DIRECTION_IS_VERTICAL (c->buffer->props.direction) !=
           bool (coverage & ChainSubtable::Vertical))
         goto skip;
 
+      c->subtable_flags = subtable_flags;
+      c->first_set = accel ? &accel->subtables[i].glyph_set : &Null(hb_bit_set_t);
+      c->machine_class_cache = accel ? &accel->subtables[i].class_cache : nullptr;
+
       if (!c->buffer_intersects_machine ())
       {
         (void) c->buffer->message (c->font, "skipped chainsubtable %u because no glyph matches", c->lookup_index);
@@ -1219,22 +1219,21 @@
       if (!c->buffer->message (c->font, "start chainsubtable %u", c->lookup_index))
         goto skip;
 
-      if (reverse)
-        c->buffer->reverse ();
+      if (reverse != c->buffer_is_reversed)
+        c->reverse_buffer ();
 
       subtable->apply (c);
 
-      if (reverse)
-        c->buffer->reverse ();
-
       (void) c->buffer->message (c->font, "end chainsubtable %u", c->lookup_index);
 
-      if (unlikely (!c->buffer->successful)) return;
+      if (unlikely (!c->buffer->successful)) break;
 
     skip:
       subtable = &StructAfter> (*subtable);
       c->set_lookup_index (c->lookup_index + 1);
     }
+    if (c->buffer_is_reversed)
+      c->reverse_buffer ();
   }
 
   unsigned int get_size () const { return length; }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-algs.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-algs.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-algs.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-algs.hh	2026-04-17 19:09:35.000000000 +0000
@@ -78,129 +78,246 @@
 
 
 /*
- * Big-endian integers.
+ * Fixed-endian integers / floats.
  */
 
+
 /* Endian swap, used in Windows related backends */
 static inline constexpr uint16_t hb_uint16_swap (uint16_t v)
 { return (v >> 8) | (v << 8); }
 static inline constexpr uint32_t hb_uint32_swap (uint32_t v)
 { return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); }
 
-#ifndef HB_FAST_INT_ACCESS
+template 
+struct __attribute__((packed)) hb_packed_t { Type v; };
+
+#ifndef HB_FAST_NUM_ACCESS
+
 #if defined(__OPTIMIZE__) && \
     defined(__BYTE_ORDER) && \
     (__BYTE_ORDER == __BIG_ENDIAN || \
      (__BYTE_ORDER == __LITTLE_ENDIAN && \
       hb_has_builtin(__builtin_bswap16) && \
-      hb_has_builtin(__builtin_bswap32)))
-#define HB_FAST_INT_ACCESS 1
+      hb_has_builtin(__builtin_bswap32) && \
+      hb_has_builtin(__builtin_bswap64)))
+#define HB_FAST_NUM_ACCESS 1
 #else
-#define HB_FAST_INT_ACCESS 0
+#define HB_FAST_NUM_ACCESS 0
 #endif
+
+// https://github.com/harfbuzz/harfbuzz/issues/5456
+#if defined(__GNUC__) && !defined(__clang__) && (__GNUC__ <= 12)
+#undef HB_FAST_NUM_ACCESS
+#define HB_FAST_NUM_ACCESS 0
 #endif
 
-template 
-struct BEInt;
-template 
-struct BEInt
+#endif
+
+template 
+struct HBInt;
+template 
+struct HBInt
 {
   public:
-  BEInt () = default;
-  constexpr BEInt (Type V) : v {uint8_t (V)} {}
+  HBInt () = default;
+  constexpr HBInt (Type V) : v {uint8_t (V)} {}
   constexpr operator Type () const { return v; }
   private: uint8_t v;
 };
-template 
-struct BEInt
+template 
+struct HBInt
 {
-  struct __attribute__((packed)) packed_uint16_t { uint16_t v; };
-
   public:
-  BEInt () = default;
+  HBInt () = default;
 
-  BEInt (Type V)
-#if HB_FAST_INT_ACCESS
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-  { ((packed_uint16_t *) v)->v = __builtin_bswap16 (V); }
-#else /* __BYTE_ORDER == __BIG_ENDIAN */
-  { ((packed_uint16_t *) v)->v = V; }
-#endif
+  HBInt (Type V)
+#if HB_FAST_NUM_ACCESS
+  {
+    if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
+      ((hb_packed_t *) v)->v = V;
+    else
+      ((hb_packed_t *) v)->v = __builtin_bswap16 (V);
+  }
 #else
-    : v {uint8_t ((V >>  8) & 0xFF),
-         uint8_t ((V      ) & 0xFF)} {}
+    : v {BE ? uint8_t ((V >>  8) & 0xFF) : uint8_t ((V      ) & 0xFF),
+         BE ? uint8_t ((V      ) & 0xFF) : uint8_t ((V >>  8) & 0xFF)} {}
 #endif
 
-  constexpr operator Type () const {
-#if HB_FAST_INT_ACCESS
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-    return __builtin_bswap16 (((packed_uint16_t *) v)->v);
-#else /* __BYTE_ORDER == __BIG_ENDIAN */
-    return ((packed_uint16_t *) v)->v;
-#endif
+  constexpr operator Type () const
+  {
+#if HB_FAST_NUM_ACCESS
+    return (BE == (__BYTE_ORDER == __BIG_ENDIAN)) ?
+      ((const hb_packed_t *) v)->v
+    :
+      __builtin_bswap16 (((const hb_packed_t *) v)->v)
+    ;
 #else
-    return (v[0] <<  8)
-         + (v[1]      );
+    return (BE ? (v[0] <<  8) : (v[0]      ))
+         + (BE ? (v[1]      ) : (v[1] <<  8));
 #endif
   }
   private: uint8_t v[2];
 };
-template 
-struct BEInt
+template 
+struct HBInt
 {
   static_assert (!std::is_signed::value, "");
   public:
-  BEInt () = default;
-  constexpr BEInt (Type V) : v {uint8_t ((V >> 16) & 0xFF),
-                                uint8_t ((V >>  8) & 0xFF),
-                                uint8_t ((V      ) & 0xFF)} {}
-
-  constexpr operator Type () const { return (v[0] << 16)
-                                          + (v[1] <<  8)
-                                          + (v[2]      ); }
+  HBInt () = default;
+  constexpr HBInt (Type V) : v {BE ? uint8_t ((V >> 16) & 0xFF) : uint8_t ((V >> 16) & 0xFF),
+                                BE ? uint8_t ((V >>  8) & 0xFF) : uint8_t ((V >>  8) & 0xFF),
+                                BE ? uint8_t ((V      ) & 0xFF) : uint8_t ((V      ) & 0xFF)} {}
+
+  constexpr operator Type () const { return (BE ? (v[0] << 16) : (v[0]      ))
+                                          + (BE ? (v[1] <<  8) : (v[1] <<  8))
+                                          + (BE ? (v[2]      ) : (v[2] << 16)); }
   private: uint8_t v[3];
 };
-template 
-struct BEInt
+template 
+struct HBInt
 {
-  struct __attribute__((packed)) packed_uint32_t { uint32_t v; };
+  template 
+  friend struct HBFloat;
 
   public:
-  BEInt () = default;
+  HBInt () = default;
 
-  BEInt (Type V)
-#if HB_FAST_INT_ACCESS
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-  { ((packed_uint32_t *) v)->v = __builtin_bswap32 (V); }
-#else /* __BYTE_ORDER == __BIG_ENDIAN */
-  { ((packed_uint32_t *) v)->v = V; }
-#endif
+  HBInt (Type V)
+#if HB_FAST_NUM_ACCESS
+  {
+    if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
+      ((hb_packed_t *) v)->v = V;
+    else
+      ((hb_packed_t *) v)->v = __builtin_bswap32 (V);
+  }
 #else
-    : v {uint8_t ((V >> 24) & 0xFF),
-         uint8_t ((V >> 16) & 0xFF),
-         uint8_t ((V >>  8) & 0xFF),
-         uint8_t ((V      ) & 0xFF)} {}
+    : v {BE ? uint8_t ((V >> 24) & 0xFF) : uint8_t ((V      ) & 0xFF),
+         BE ? uint8_t ((V >> 16) & 0xFF) : uint8_t ((V >>  8) & 0xFF),
+         BE ? uint8_t ((V >>  8) & 0xFF) : uint8_t ((V >> 16) & 0xFF),
+         BE ? uint8_t ((V      ) & 0xFF) : uint8_t ((V >> 24) & 0xFF)} {}
 #endif
 
   constexpr operator Type () const {
-#if HB_FAST_INT_ACCESS
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-    return __builtin_bswap32 (((packed_uint32_t *) v)->v);
-#else /* __BYTE_ORDER == __BIG_ENDIAN */
-    return ((packed_uint32_t *) v)->v;
-#endif
+#if HB_FAST_NUM_ACCESS
+    return (BE == (__BYTE_ORDER == __BIG_ENDIAN)) ?
+      ((const hb_packed_t *) v)->v
+    :
+      __builtin_bswap32 (((const hb_packed_t *) v)->v)
+    ;
 #else
-    return (v[0] << 24)
-         + (v[1] << 16)
-         + (v[2] <<  8)
-         + (v[3]      );
+    return (BE ? (v[0] << 24) : (v[0]      ))
+         + (BE ? (v[1] << 16) : (v[1] <<  8))
+         + (BE ? (v[2] <<  8) : (v[2] << 16))
+         + (BE ? (v[3]      ) : (v[3] << 24));
 #endif
   }
   private: uint8_t v[4];
 };
+template 
+struct HBInt
+{
+  template 
+  friend struct HBFloat;
+
+  public:
+  HBInt () = default;
+
+  HBInt (Type V)
+#if HB_FAST_NUM_ACCESS
+  {
+    if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
+      ((hb_packed_t *) v)->v = V;
+    else
+      ((hb_packed_t *) v)->v = __builtin_bswap64 (V);
+  }
+#else
+    : v {BE ? uint8_t ((V >> 56) & 0xFF) : uint8_t ((V      ) & 0xFF),
+         BE ? uint8_t ((V >> 48) & 0xFF) : uint8_t ((V >>  8) & 0xFF),
+         BE ? uint8_t ((V >> 40) & 0xFF) : uint8_t ((V >> 16) & 0xFF),
+         BE ? uint8_t ((V >> 32) & 0xFF) : uint8_t ((V >> 24) & 0xFF),
+         BE ? uint8_t ((V >> 24) & 0xFF) : uint8_t ((V >> 32) & 0xFF),
+         BE ? uint8_t ((V >> 16) & 0xFF) : uint8_t ((V >> 40) & 0xFF),
+         BE ? uint8_t ((V >>  8) & 0xFF) : uint8_t ((V >> 48) & 0xFF),
+         BE ? uint8_t ((V      ) & 0xFF) : uint8_t ((V >> 56) & 0xFF)} {}
+#endif
+
+  constexpr operator Type () const {
+#if HB_FAST_NUM_ACCESS
+    return (BE == (__BYTE_ORDER == __BIG_ENDIAN)) ?
+      ((const hb_packed_t *) v)->v
+    :
+      __builtin_bswap64 (((const hb_packed_t *) v)->v)
+    ;
+#else
+    return (BE ? (uint64_t (v[0]) << 56) : (uint64_t (v[0])      ))
+         + (BE ? (uint64_t (v[1]) << 48) : (uint64_t (v[1]) <<  8))
+         + (BE ? (uint64_t (v[2]) << 40) : (uint64_t (v[2]) << 16))
+         + (BE ? (uint64_t (v[3]) << 32) : (uint64_t (v[3]) << 24))
+         + (BE ? (uint64_t (v[4]) << 24) : (uint64_t (v[4]) << 32))
+         + (BE ? (uint64_t (v[5]) << 16) : (uint64_t (v[5]) << 40))
+         + (BE ? (uint64_t (v[6]) <<  8) : (uint64_t (v[6]) << 48))
+         + (BE ? (uint64_t (v[7])      ) : (uint64_t (v[7]) << 56));
+#endif
+  }
+  private: uint8_t v[8];
+};
 
 /* Floats. */
 
+template 
+struct HBFloat
+{
+  using IntType = typename std::conditional::type;
+
+  public:
+  HBFloat () = default;
+
+  HBFloat (Type V)
+  {
+#if HB_FAST_NUM_ACCESS
+    {
+      if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
+      {
+        ((hb_packed_t *) v)->v = V;
+        return;
+      }
+    }
+#endif
+
+    union {
+      hb_packed_t f;
+      hb_packed_t i;
+    } u = {{V}};
+
+    const HBInt I = u.i.v;
+    for (unsigned i = 0; i < Bytes; i++)
+      v[i] = I.v[i];
+  }
+
+  /* c++14 constexpr */ operator Type () const
+  {
+#if HB_FAST_NUM_ACCESS
+    {
+      if (BE == (__BYTE_ORDER == __BIG_ENDIAN))
+        return ((const hb_packed_t *) v)->v;
+    }
+#endif
+
+    HBInt I;
+    for (unsigned i = 0; i < Bytes; i++)
+      I.v[i] = v[i];
+
+    union {
+      hb_packed_t i;
+      hb_packed_t f;
+    } u = {{I}};
+
+    return u.f.v;
+  }
+  private: uint8_t v[Bytes];
+};
+
+
 /* We want our rounding towards +infinity. */
 static inline double
 _hb_roundf (double x) { return floor (x + .5); }
@@ -210,6 +327,27 @@
 
 #define roundf(x) _hb_roundf(x)
 
+static inline void
+hb_sincos (float rotation, float &s, float &c)
+{
+#ifdef HAVE_SINCOSF
+  sincosf (rotation, &s, &c);
+#else
+  c = cosf (rotation);
+  s = sinf (rotation);
+#endif
+}
+static inline void
+hb_sincos (double rotation, double &s, double &c)
+{
+#ifdef HAVE_SINCOS
+  sincos (rotation, &s, &c);
+#else
+  c = cos (rotation);
+  s = sin (rotation);
+#endif
+}
+
 
 /* Encodes three unsigned integers in one 64-bit number.  If the inputs have more than 21 bits,
  * values will be truncated / overlap, and might not decode exactly. */
@@ -734,6 +872,17 @@
  * Bithacks.
  */
 
+/* Return the number of 1 bits in a uint8_t; faster than hb_popcount() */
+static inline unsigned
+hb_popcount8 (uint8_t v)
+{
+  static const uint8_t popcount4[16] = {
+    0, 1, 1, 2, 1, 2, 2, 3,
+    1, 2, 2, 3, 2, 3, 3, 4
+  };
+  return popcount4[v & 0xF] + popcount4[v >> 4];
+}
+
 /* Return the number of 1 bits in v. */
 template 
 static inline unsigned int
@@ -1070,6 +1219,7 @@
 }
 
 template 
+HB_HOT
 static inline bool
 hb_bsearch_impl (unsigned *pos, /* Out */
                  const K& key,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-alloc-pool.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-alloc-pool.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-alloc-pool.hh	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-alloc-pool.hh	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,105 @@
+/*
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_ALLOC_POOL_HH
+#define HB_ALLOC_POOL_HH
+
+#include "hb-vector.hh"
+
+/* Memory pool for persistent small- to medium-sized allocations.
+ *
+ * Some AI musings on this, not necessarily true:
+ *
+ * This is a very simple implementation, but it's good enough for our
+ * purposes.  It's not thread-safe.  It's not very fast.  It's not
+ * very memory efficient.  It's not very cache efficient.  It's not
+ * very anything efficient.  But it's simple and it works.  And it's
+ * good enough for our purposes.  If you need something more
+ * sophisticated, use a real allocator.  Or use a real language. */
+
+struct hb_alloc_pool_t
+{
+  unsigned ChunkSize = 65536 - 2 * sizeof (void *);
+
+  void *alloc (size_t size, unsigned alignment = 2 * sizeof (void *))
+  {
+    if (unlikely (chunks.in_error ())) return nullptr;
+
+    assert (alignment > 0);
+    assert (alignment <= 2 * sizeof (void *));
+    assert ((alignment & (alignment - 1)) == 0); /* power of two */
+
+    if (size > (ChunkSize) / 4)
+    {
+      /* Big chunk, allocate separately.  */
+      hb_vector_t chunk;
+      if (unlikely (!chunk.resize (size))) return nullptr;
+      void *ret = chunk.arrayZ;
+      chunks.push (std::move (chunk));
+      if (chunks.in_error ()) return nullptr;
+      if (chunks.length > 1)
+      {
+        // Bring back the previous last chunk to the end, so that
+        // we can continue to allocate from it.
+        hb_swap (chunks.arrayZ[chunks.length - 1], chunks.arrayZ[chunks.length - 2]);
+      }
+      return ret;
+    }
+
+    unsigned pad = (unsigned) ((alignment - ((uintptr_t) current_chunk.arrayZ & (alignment - 1))) & (alignment - 1));
+
+    // Small chunk, allocate from the last chunk.
+    if (current_chunk.length < pad + size)
+    {
+      chunks.push ();
+      if (unlikely (chunks.in_error ())) return nullptr;
+      hb_vector_t &chunk = chunks.arrayZ[chunks.length - 1];
+      if (unlikely (!chunk.resize (ChunkSize))) return nullptr;
+      current_chunk = chunk;
+      pad = (unsigned) ((alignment - ((uintptr_t) current_chunk.arrayZ & (alignment - 1))) & (alignment - 1));
+    }
+
+    current_chunk += pad;
+
+    assert (current_chunk.length >= size);
+    void *ret = current_chunk.arrayZ;
+    current_chunk += size;
+    return ret;
+  }
+
+  void discard (void *p_, size_t size)
+  {
+    // Reclaim memory if we can.
+    char *p = (char *) p_;
+    if (current_chunk.arrayZ == p + size && current_chunk.backwards_length >= size)
+      current_chunk -= size;
+  }
+
+  private:
+  hb_vector_t> chunks;
+  hb_array_t current_chunk;
+};
+
+
+#endif /* HB_ALLOC_POOL_HH */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-array.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-array.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-array.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-array.hh	2026-04-17 19:09:35.000000000 +0000
@@ -291,6 +291,13 @@
         && (unsigned int) (arrayZ + length - (const char *) p) >= size;
   }
 
+  template 
+  bool check_end (const void *p) const
+  {
+    return (uintptr_t) (((const char *) p) - arrayZ) <= length;
+  }
+
   /* Only call if you allocated the underlying array using hb_malloc() or similar. */
   void fini ()
   { hb_free ((void *) arrayZ); arrayZ = nullptr; length = 0; }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-atomic.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-atomic.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-atomic.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-atomic.hh	2026-04-17 19:09:35.000000000 +0000
@@ -40,7 +40,6 @@
  * Atomic integers and pointers.
  */
 
-
 /* We need external help for these */
 
 #if defined(hb_atomic_int_impl_add) \
@@ -80,27 +79,11 @@
 
 #include 
 
+#define HB_STL_ATOMIC_IMPL
+
 #define _hb_memory_r_barrier()                  std::atomic_thread_fence(std::memory_order_acquire)
 #define _hb_memory_w_barrier()                  std::atomic_thread_fence(std::memory_order_release)
 
-#define hb_atomic_int_impl_add(AI, V)           (reinterpret_cast::type> *> (AI)->fetch_add ((V), std::memory_order_acq_rel))
-#define hb_atomic_int_impl_set_relaxed(AI, V)   (reinterpret_cast::type> *> (AI)->store ((V), std::memory_order_relaxed))
-#define hb_atomic_int_impl_set(AI, V)           (reinterpret_cast::type> *> (AI)->store ((V), std::memory_order_release))
-#define hb_atomic_int_impl_get_relaxed(AI)      (reinterpret_cast::type> const *> (AI)->load (std::memory_order_relaxed))
-#define hb_atomic_int_impl_get(AI)              (reinterpret_cast::type> const *> (AI)->load (std::memory_order_acquire))
-
-#define hb_atomic_ptr_impl_set_relaxed(P, V)    (reinterpret_cast *> (P)->store ((V), std::memory_order_relaxed))
-#define hb_atomic_ptr_impl_get_relaxed(P)       (reinterpret_cast const *> (P)->load (std::memory_order_relaxed))
-#define hb_atomic_ptr_impl_get(P)               (reinterpret_cast *> (P)->load (std::memory_order_acquire))
-static inline bool
-_hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N)
-{
-  const void *O = O_; // Need lvalue
-  return reinterpret_cast *> (P)->compare_exchange_weak (O, N, std::memory_order_acq_rel, std::memory_order_relaxed);
-}
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)       _hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
-
-
 #else /* defined(HB_NO_MT) */
 
 #define hb_atomic_int_impl_add(AI, V)           ((*(AI) += (V)) - (V))
@@ -159,6 +142,76 @@
 inline void *hb_atomic_ptr_impl_get (void ** const P)   { void *v = *P; _hb_memory_r_barrier (); return v; }
 #endif
 
+#ifdef HB_STL_ATOMIC_IMPL
+template 
+struct hb_atomic_t
+{
+  hb_atomic_t () = default;
+  constexpr hb_atomic_t (T v) : v (v) {}
+  constexpr hb_atomic_t (const hb_atomic_t& o) : v (o.get_relaxed ()) {}
+  constexpr hb_atomic_t (hb_atomic_t&& o) : v (o.get_relaxed ()) { o.set_relaxed ({}); }
+
+  hb_atomic_t &operator= (const hb_atomic_t& o) { set_relaxed (o.get_relaxed ()); return *this; }
+  hb_atomic_t &operator= (hb_atomic_t&& o){ set_relaxed (o.get_relaxed ()); o.set_relaxed ({}); return *this; }
+  hb_atomic_t &operator= (T v_)
+  {
+    set_relaxed (v_);
+    return *this;
+  }
+  operator T () const { return get_relaxed (); }
+
+  void set_relaxed (T v_) { v.store (v_, std::memory_order_relaxed); }
+  void set_release (T v_) { v.store (v_, std::memory_order_release); }
+  T get_relaxed () const { return v.load (std::memory_order_relaxed); }
+  T get_acquire () const { return v.load (std::memory_order_acquire); }
+  T inc () { return v.fetch_add (1, std::memory_order_acq_rel); }
+  T dec () { return v.fetch_add (-1, std::memory_order_acq_rel); }
+
+  int operator++ (int) { return inc (); }
+  int operator-- (int) { return dec (); }
+
+  friend void swap (hb_atomic_t &a, hb_atomic_t &b) noexcept
+  {
+    T v = a.get_acquire ();
+    a.set_relaxed (b.get_acquire ());
+    b.set_relaxed (v);
+  }
+
+  std::atomic v = 0;
+};
+
+template 
+struct hb_atomic_t
+{
+  hb_atomic_t () = default;
+  constexpr hb_atomic_t (T *v) : v (v) {}
+  hb_atomic_t (const hb_atomic_t &other) = delete;
+
+  void init (T *v_ = nullptr) { set_relaxed (v_); }
+  void set_relaxed (T *v_) { v.store (v_, std::memory_order_relaxed); }
+  T *get_relaxed () const { return v.load (std::memory_order_relaxed); }
+  T *get_acquire () const { return v.load (std::memory_order_acquire); }
+  bool cmpexch (T *old, T *new_) { return v.compare_exchange_weak (old, new_, std::memory_order_acq_rel, std::memory_order_relaxed); }
+
+  operator bool () const { return get_acquire () != nullptr; }
+  T *operator->() const { return get_acquire (); }
+  template 
+  operator C * () const
+  {
+    return get_acquire ();
+  }
+
+  friend void swap (hb_atomic_t &a, hb_atomic_t &b) noexcept
+  {
+    T *p = a.get_acquire ();
+    a.set_relaxed (b.get_acquire ());
+    b.set_relaxed (p);
+  }
+
+  std::atomic v = nullptr;
+};
+
+#else
 
 template 
 struct hb_atomic_t
@@ -178,7 +231,6 @@
 
   int operator ++ (int) { return inc (); }
   int operator -- (int) { return dec (); }
-  long operator |= (long v_) { set_relaxed (get_relaxed () | v_); return *this; }
 
   T v = 0;
 };
@@ -194,7 +246,7 @@
   void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
   T *get_relaxed () const { return (T *) hb_atomic_ptr_impl_get_relaxed (&v); }
   T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
-  bool cmpexch (const T *old, T *new_) { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
+  bool cmpexch (T *old, T *new_) { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
 
   operator bool () const { return get_acquire () != nullptr; }
   T * operator -> () const                    { return get_acquire (); }
@@ -203,6 +255,8 @@
   T *v = nullptr;
 };
 
+#endif
+
 static inline bool hb_barrier ()
 {
   _hb_compiler_memory_r_barrier ();
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-bimap.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-bimap.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-bimap.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-bimap.hh	2026-04-17 19:09:35.000000000 +0000
@@ -176,7 +176,7 @@
   {
     hb_codepoint_t  count = get_population ();
     hb_vector_t  work;
-    if (unlikely (!work.resize (count, false))) return;
+    if (unlikely (!work.resize_dirty  (count))) return;
 
     for (hb_codepoint_t rhs = 0; rhs < count; rhs++)
       work.arrayZ[rhs] = back_map[rhs];
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-bit-page.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-bit-page.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-bit-page.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-bit-page.hh	2026-04-17 19:09:35.000000000 +0000
@@ -142,6 +142,7 @@
 
   bool operator [] (hb_codepoint_t g) const { return get (g); }
   bool operator () (hb_codepoint_t g) const { return get (g); }
+  bool has (hb_codepoint_t g) const { return get (g); }
 
   void add_range (hb_codepoint_t a, hb_codepoint_t b)
   {
@@ -290,7 +291,7 @@
     unsigned int j = m & ELT_MASK;
 
     const elt_t vv = v[i] & ~((elt_t (1) << j) - 1);
-    for (const elt_t *p = &vv; i < len (); p = &v[++i])
+    for (const elt_t *p = &vv; i < len (); p = ((const elt_t *) &v[0]) + (++i))
       if (*p)
       {
         *codepoint = i * ELT_BITS + elt_get_min (*p);
@@ -346,6 +347,36 @@
     return 0;
   }
 
+  /*
+   * Iterator implementation.
+   */
+  struct iter_t : hb_iter_with_fallback_t
+  {
+    static constexpr bool is_sorted_iterator = true;
+    iter_t (const hb_bit_page_t &s_ = Null (hb_bit_page_t), bool init = true) : s (&s_), v (INVALID)
+    {
+      if (init)
+        v = s->get_min ();
+    }
+
+    typedef hb_codepoint_t __item_t__;
+    hb_codepoint_t __item__ () const { return v; }
+    bool __more__ () const { return v != INVALID; }
+    void __next__ () {
+       s->next (&v);
+    }
+    void __prev__ () { s->previous (&v); }
+    iter_t end () const { return iter_t (*s, false); }
+    bool operator != (const iter_t& o) const
+    { return v != o.v; }
+
+    protected:
+    const hb_bit_page_t *s;
+    hb_codepoint_t v;
+  };
+  iter_t iter () const { return iter_t (*this); }
+  operator iter_t () const { return iter (); }
+
   static constexpr hb_codepoint_t INVALID = HB_SET_VALUE_INVALID;
 
   typedef unsigned long long elt_t;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-bit-set-invertible.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-bit-set-invertible.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-bit-set-invertible.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-bit-set-invertible.hh	2026-04-17 19:09:35.000000000 +0000
@@ -368,7 +368,7 @@
     unsigned __len__ () const { return l; }
     iter_t end () const { return iter_t (*s, false); }
     bool operator != (const iter_t& o) const
-    { return v != o.v || s != o.s; }
+    { return v != o.v; }
 
     protected:
     const hb_bit_set_invertible_t *s;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-bit-set.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-bit-set.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-bit-set.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-bit-set.hh	2026-04-17 19:09:35.000000000 +0000
@@ -91,10 +91,10 @@
     if (pages.length < count && (unsigned) pages.allocated < count && count <= 2)
       exact_size = true; // Most sets are small and local
 
-    if (unlikely (!pages.resize (count, clear, exact_size) ||
-        !page_map.resize (count, clear)))
+    if (unlikely (!pages.resize_full (count, clear, exact_size) ||
+        !page_map.resize_full (count, clear, false)))
     {
-      pages.resize (page_map.length, clear, exact_size);
+      pages.resize_full (page_map.length, clear, exact_size);
       successful = false;
       return false;
     }
@@ -108,10 +108,11 @@
     page_map.alloc (sz);
   }
 
-  void reset ()
+  hb_bit_set_t& reset ()
   {
     successful = true;
     clear ();
+    return *this;
   }
 
   void clear ()
@@ -394,7 +395,7 @@
   {
     if (unlikely (!successful)) return;
     unsigned int count = other.pages.length;
-    if (unlikely (!resize (count, false, exact_size)))
+    if (unlikely (!resize  (count, false, exact_size)))
       return;
     population = other.population;
 
@@ -922,7 +923,7 @@
     unsigned __len__ () const { return l; }
     iter_t end () const { return iter_t (*s, false); }
     bool operator != (const iter_t& o) const
-    { return s != o.s || v != o.v; }
+    { return v != o.v; }
 
     protected:
     const hb_bit_set_t *s;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-buffer-deserialize-text-unicode.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer-deserialize-text-unicode.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-buffer-deserialize-text-unicode.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer-deserialize-text-unicode.hh	2026-04-17 19:09:35.000000000 +0000
@@ -32,7 +32,7 @@
 #include "hb.hh"
 
 
-#line 36 "hb-buffer-deserialize-text-unicode.hh"
+#line 33 "hb-buffer-deserialize-text-unicode.hh"
 static const unsigned char _deserialize_text_unicode_trans_keys[] = {
         0u, 0u, 43u, 102u, 48u, 102u, 48u, 124u, 48u, 57u, 62u, 124u, 48u, 124u, 60u, 117u,
         85u, 117u, 85u, 117u, 0
@@ -150,12 +150,12 @@
   hb_glyph_info_t info = {0};
   const hb_glyph_position_t pos = {0};
 
-#line 154 "hb-buffer-deserialize-text-unicode.hh"
+#line 147 "hb-buffer-deserialize-text-unicode.hh"
         {
         cs = deserialize_text_unicode_start;
         }
 
-#line 159 "hb-buffer-deserialize-text-unicode.hh"
+#line 150 "hb-buffer-deserialize-text-unicode.hh"
         {
         int _slen;
         int _trans;
@@ -215,7 +215,7 @@
         hb_memset (&info, 0, sizeof (info));
 }
         break;
-#line 219 "hb-buffer-deserialize-text-unicode.hh"
+#line 203 "hb-buffer-deserialize-text-unicode.hh"
         }
 
 _again:
@@ -238,7 +238,7 @@
         *end_ptr = p;
 }
         break;
-#line 242 "hb-buffer-deserialize-text-unicode.hh"
+#line 224 "hb-buffer-deserialize-text-unicode.hh"
         }
         }
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-buffer-serialize.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer-serialize.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-buffer-serialize.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer-serialize.cc	2026-04-17 19:09:35.000000000 +0000
@@ -427,7 +427,7 @@
  *   #HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES flag is set. Then,
  *   - If #HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS is not set, `=` then #hb_glyph_info_t.cluster.
  *   - If #HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS is not set, the #hb_glyph_position_t in the format:
- *     - If both #hb_glyph_position_t.x_offset and #hb_glyph_position_t.y_offset are not 0, `@x_offset,y_offset`. Then,
+ *     - If #hb_glyph_position_t.x_offset and #hb_glyph_position_t.y_offset are not both 0, `@x_offset,y_offset`. Then,
  *     - `+x_advance`, then `,y_advance` if #hb_glyph_position_t.y_advance is not 0. Then,
  *   - If #HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS is set, the #hb_glyph_extents_t in the format ``
  *
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-buffer-verify.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer-verify.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-buffer-verify.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer-verify.cc	2026-04-17 19:09:35.000000000 +0000
@@ -163,7 +163,7 @@
 
     hb_buffer_append (fragment, text_buffer, text_start, text_end);
     if (!hb_shape_full (font, fragment, features, num_features, shapers) ||
-        fragment->successful || fragment->shaping_failed)
+        fragment->successful)
     {
       hb_buffer_destroy (reconstruction);
       hb_buffer_destroy (fragment);
@@ -313,11 +313,11 @@
    * Shape the two fragment streams.
    */
   if (!hb_shape_full (font, fragments[0], features, num_features, shapers) ||
-      !fragments[0]->successful || fragments[0]->shaping_failed)
+      !fragments[0]->successful)
     goto out;
 
   if (!hb_shape_full (font, fragments[1], features, num_features, shapers) ||
-      !fragments[1]->successful || fragments[1]->shaping_failed)
+      !fragments[1]->successful)
     goto out;
 
   if (!forward)
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-buffer.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-buffer.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer.cc	2026-04-17 19:09:35.000000000 +0000
@@ -158,14 +158,15 @@
 bool
 hb_buffer_t::enlarge (unsigned int size)
 {
-  if (unlikely (!successful))
-    return false;
   if (unlikely (size > max_len))
   {
     successful = false;
     return false;
   }
 
+  if (unlikely (!successful))
+    return false;
+
   unsigned int new_allocated = allocated;
   hb_glyph_position_t *new_pos = nullptr;
   hb_glyph_info_t *new_info = nullptr;
@@ -226,6 +227,13 @@
   assert (have_output);
   if (unlikely (!ensure (len + count))) return false;
 
+  max_ops -= len - idx;
+  if (unlikely (max_ops < 0))
+  {
+    successful = false;
+    return false;
+  }
+
   memmove (info + idx + count, info + idx, (len - idx) * sizeof (info[0]));
   if (idx + count > len)
   {
@@ -297,7 +305,6 @@
   props = default_props;
 
   successful = true;
-  shaping_failed = false;
   have_output = false;
   have_positions = false;
 
@@ -320,7 +327,6 @@
 {
   deallocate_var_all ();
   serial = 0;
-  shaping_failed = false;
   scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
   unsigned mul;
   if (likely (!hb_unsigned_mul_overflows (len, HB_BUFFER_MAX_LEN_FACTOR, &mul)))
@@ -339,7 +345,6 @@
   max_ops = HB_BUFFER_MAX_OPS_DEFAULT;
   deallocate_var_all ();
   serial = 0;
-  // Intentionally not reseting shaping_failed, such that it can be inspected.
 }
 
 
@@ -520,7 +525,19 @@
   hb_mask_t not_mask = ~mask;
   value &= mask;
 
+  max_ops -= len;
+  if (unlikely (max_ops < 0))
+    successful = false;
+
   unsigned int count = len;
+
+  if (cluster_start == 0 && cluster_end == (unsigned int) -1)
+  {
+    for (unsigned int i = 0; i < count; i++)
+      info[i].mask = (info[i].mask & not_mask) | value;
+    return;
+  }
+
   for (unsigned int i = 0; i < count; i++)
     if (cluster_start <= info[i].cluster && info[i].cluster < cluster_end)
       info[i].mask = (info[i].mask & not_mask) | value;
@@ -536,6 +553,10 @@
     return;
   }
 
+  max_ops -= end - start;
+  if (unlikely (max_ops < 0))
+    successful = false;
+
   unsigned int cluster = info[start].cluster;
 
   for (unsigned int i = start + 1; i < end; i++)
@@ -569,6 +590,10 @@
   if (unlikely (end - start < 2))
     return;
 
+  max_ops -= end - start;
+  if (unlikely (max_ops < 0))
+    successful = false;
+
   unsigned int cluster = out_info[start].cluster;
 
   for (unsigned int i = start + 1; i < end; i++)
@@ -726,7 +751,6 @@
   HB_SEGMENT_PROPERTIES_DEFAULT,
 
   false, /* successful */
-  true, /* shaping_failed */
   false, /* have_output */
   true  /* have_positions */
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-buffer.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-buffer.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-buffer.hh	2026-04-17 19:09:35.000000000 +0000
@@ -32,6 +32,7 @@
 
 #include "hb.hh"
 #include "hb-unicode.hh"
+#include "hb-set-digest.hh"
 
 
 static_assert ((sizeof (hb_glyph_info_t) == 20), "");
@@ -44,14 +45,14 @@
 
 enum hb_buffer_scratch_flags_t {
   HB_BUFFER_SCRATCH_FLAG_DEFAULT                        = 0x00000000u,
-  HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII                  = 0x00000001u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_FRACTION_SLASH             = 0x00000001u,
   HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES         = 0x00000002u,
   HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK             = 0x00000004u,
   HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT            = 0x00000008u,
   HB_BUFFER_SCRATCH_FLAG_HAS_CGJ                        = 0x00000010u,
-  HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS                = 0x00000020u,
-  HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE            = 0x00000040u,
-  HB_BUFFER_SCRATCH_FLAG_HAS_VARIATION_SELECTOR_FALLBACK= 0x00000080u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE            = 0x00000020u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_VARIATION_SELECTOR_FALLBACK= 0x00000040u,
+  HB_BUFFER_SCRATCH_FLAG_HAS_CONTINUATIONS              = 0x00000080u,
 
   /* Reserved for shapers' internal use. */
   HB_BUFFER_SCRATCH_FLAG_SHAPER0                        = 0x01000000u,
@@ -90,7 +91,6 @@
   hb_segment_properties_t props; /* Script, language, direction */
 
   bool successful; /* Allocations successful */
-  bool shaping_failed; /* Shaping failure */
   bool have_output; /* Whether we have an output buffer going on */
   bool have_positions; /* Whether we have positions */
 
@@ -110,6 +110,7 @@
   hb_codepoint_t context[2][CONTEXT_LENGTH];
   unsigned int context_len[2];
 
+  hb_set_digest_t digest; /* Manually updated sometimes */
 
   /*
    * Managed by enter / leave
@@ -200,6 +201,12 @@
   void collect_codepoints (set_t &d) const
   { d.clear (); d.add_array (&info[0].codepoint, len, sizeof (info[0])); }
 
+  void update_digest ()
+  {
+    digest = hb_set_digest_t ();
+    collect_codepoints (digest);
+  }
+
   HB_INTERNAL void similar (const hb_buffer_t &src);
   HB_INTERNAL void reset ();
   HB_INTERNAL void clear ();
@@ -346,7 +353,7 @@
     {
       if (out_info != info || out_len != idx)
       {
-        if (unlikely (!make_room_for (1, 1))) return false;
+        if (unlikely (!ensure (out_len + 1))) return false;
         out_info[out_len] = info[idx];
       }
       out_len++;
@@ -363,7 +370,7 @@
     {
       if (out_info != info || out_len != idx)
       {
-        if (unlikely (!make_room_for (n, n))) return false;
+        if (unlikely (!ensure (out_len + n))) return false;
         memmove (out_info + out_len, info + idx, n * sizeof (out_info[0]));
       }
       out_len += n;
@@ -404,22 +411,12 @@
   /* Adds glyph flags in mask to infos with clusters between start and end.
    * The start index will be from out-buffer if from_out_buffer is true.
    * If interior is true, then the cluster having the minimum value is skipped. */
-  void _set_glyph_flags (hb_mask_t mask,
-                         unsigned start = 0,
-                         unsigned end = (unsigned) -1,
-                         bool interior = false,
-                         bool from_out_buffer = false)
+  void _set_glyph_flags_impl (hb_mask_t mask,
+                              unsigned start,
+                              unsigned end,
+                              bool interior,
+                              bool from_out_buffer)
   {
-    end = hb_min (end, len);
-
-    if (unlikely (end - start > 255))
-      return;
-
-    if (interior && !from_out_buffer && end - start < 2)
-      return;
-
-    scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
-
     if (!from_out_buffer || !have_output)
     {
       if (!interior)
@@ -456,6 +453,25 @@
     }
   }
 
+  HB_ALWAYS_INLINE
+  void _set_glyph_flags (hb_mask_t mask,
+                         unsigned start = 0,
+                         unsigned end = (unsigned) -1,
+                         bool interior = false,
+                         bool from_out_buffer = false)
+  {
+    if (unlikely (end != (unsigned) -1 && end - start > 255))
+      return;
+
+    end = hb_min (end, len);
+
+    if (interior && !from_out_buffer && end - start < 2)
+      return;
+
+    _set_glyph_flags_impl (mask, start, end, interior, from_out_buffer);
+  }
+
+
   void unsafe_to_break (unsigned int start = 0, unsigned int end = -1)
   {
     _set_glyph_flags (HB_GLYPH_FLAG_UNSAFE_TO_BREAK | HB_GLYPH_FLAG_UNSAFE_TO_CONCAT,
@@ -606,6 +622,10 @@
     if (unlikely (start == end))
       return;
 
+    max_ops -= end - start;
+    if (unlikely (max_ops < 0))
+      successful = false;
+
     unsigned cluster_first = infos[start].cluster;
     unsigned cluster_last = infos[end - 1].cluster;
 
@@ -614,10 +634,7 @@
     {
       for (unsigned int i = start; i < end; i++)
         if (cluster != infos[i].cluster)
-        {
-          scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
           infos[i].mask |= mask;
-        }
       return;
     }
 
@@ -626,18 +643,12 @@
     if (cluster == cluster_first)
     {
       for (unsigned int i = end; start < i && infos[i - 1].cluster != cluster_first; i--)
-      {
-        scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
         infos[i - 1].mask |= mask;
-      }
     }
     else /* cluster == cluster_last */
     {
       for (unsigned int i = start; i < end && infos[i].cluster != cluster_last; i++)
-      {
-        scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
         infos[i].mask |= mask;
-      }
     }
   }
   unsigned
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-cache.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-cache.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-cache.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-cache.hh	2026-04-17 19:09:35.000000000 +0000
@@ -64,17 +64,23 @@
 struct hb_cache_t
 {
   using item_t = typename std::conditional,
-                                                                     hb_atomic_t>::type,
-                                           typename std::conditional::type
+                                           typename std::conditional,
+                                                                     typename std::conditional,
+                                                                                               hb_atomic_t>::type>::type,
+                                           typename std::conditional::type>::type
                                           >::type;
 
   static_assert ((key_bits >= cache_bits), "");
   static_assert ((key_bits + value_bits <= cache_bits + 8 * sizeof (item_t)), "");
 
+  static constexpr unsigned MAX_VALUE = (1u << value_bits) - 1;
+
   hb_cache_t () { clear (); }
 
   void clear ()
@@ -83,25 +89,32 @@
       v = -1;
   }
 
+  HB_HOT
   bool get (unsigned int key, unsigned int *value) const
   {
     unsigned int k = key & ((1u<> value_bits) != (key >> cache_bits))
       return false;
     *value = v & ((1u<> key_bits) || (value >> value_bits)))
-      return false; /* Overflows */
+      return; /* Overflows */
+    set_unchecked (key, value);
+  }
+
+  HB_HOT
+  void set_unchecked (unsigned int key, unsigned int value)
+  {
     unsigned int k = key & ((1u<>cache_bits)<size;
+    do_blend = num_coords && varStore->size;
     set_ivs (acc.privateDicts[fd].ivs);
   }
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-common.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-common.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-common.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-common.cc	2026-04-17 19:09:35.000000000 +0000
@@ -40,43 +40,6 @@
  **/
 
 
-/* hb_options_t */
-
-hb_atomic_t _hb_options;
-
-void
-_hb_options_init ()
-{
-  hb_options_union_t u;
-  u.i = 0;
-  u.opts.initialized = true;
-
-  const char *c = getenv ("HB_OPTIONS");
-  if (c)
-  {
-    while (*c)
-    {
-      const char *p = strchr (c, ':');
-      if (!p)
-        p = c + strlen (c);
-
-#define OPTION(name, symbol) \
-        if (0 == strncmp (c, name, p - c) && strlen (name) == static_cast(p - c)) do { u.opts.symbol = true; } while (0)
-
-      OPTION ("uniscribe-bug-compatible", uniscribe_bug_compatible);
-
-#undef OPTION
-
-      c = *p ? p + 1 : p;
-    }
-
-  }
-
-  /* This is idempotent and threadsafe. */
-  _hb_options = u.i;
-}
-
-
 /* hb_tag_t */
 
 /**
@@ -545,8 +508,11 @@
  * Fetches the #hb_direction_t of a script when it is
  * set horizontally. All right-to-left scripts will return
  * #HB_DIRECTION_RTL. All left-to-right scripts will return
- * #HB_DIRECTION_LTR.  Scripts that can be written either
- * horizontally or vertically will return #HB_DIRECTION_INVALID.
+ * #HB_DIRECTION_LTR.
+ *
+ * Scripts that can be written either right-to-left or
+ * left-to-right will return #HB_DIRECTION_INVALID.
+ *
  * Unknown scripts will return #HB_DIRECTION_LTR.
  *
  * Return value: The horizontal #hb_direction_t of @script
@@ -628,6 +594,9 @@
     /* Unicode-16.0 additions */
     case HB_SCRIPT_GARAY:
 
+    /* Unicode-17.0 additions */
+    case HB_SCRIPT_SIDETIC:
+
       return HB_DIRECTION_RTL;
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-config.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-config.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-config.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-config.hh	2026-04-17 19:09:35.000000000 +0000
@@ -38,7 +38,6 @@
 #ifndef HB_EXPERIMENTAL_API
 #define HB_NO_BEYOND_64K
 #define HB_NO_CUBIC_GLYF
-#define HB_NO_VAR_COMPOSITES
 #endif
 
 #ifdef HB_TINY
@@ -91,7 +90,10 @@
 #ifdef HB_MINI
 #define HB_NO_AAT
 #define HB_NO_LEGACY
-#define HB_NO_BORING_EXPANSION
+#define HB_NO_BEYOND_64K
+#define HB_NO_CUBIC_GLYF
+#define HB_NO_VAR_COMPOSITES
+#define HB_NO_VAR_HVF
 #endif
 
 #ifdef __OPTIMIZE_SIZE__
@@ -109,12 +111,6 @@
 
 /* Closure of options. */
 
-#ifdef HB_NO_BORING_EXPANSION
-#define HB_NO_BEYOND_64K
-#define HB_NO_CUBIC_GLYF
-#define HB_NO_VAR_COMPOSITES
-#endif
-
 #ifdef HB_NO_VAR
 #define HB_NO_VAR_COMPOSITES
 #endif
@@ -149,10 +145,6 @@
 #define HB_NO_PAINT
 #endif
 
-#ifdef HB_NO_GETENV
-#define HB_NO_UNISCRIBE_BUG_COMPATIBLE
-#endif
-
 #ifdef HB_NO_LEGACY
 #define HB_NO_CMAP_LEGACY_SUBTABLES
 #define HB_NO_FALLBACK_SHAPE
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-debug.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-debug.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-debug.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-debug.hh	2026-04-17 19:09:35.000000000 +0000
@@ -38,48 +38,6 @@
 
 
 /*
- * Global runtime options.
- */
-
-struct hb_options_t
-{
-  bool unused : 1; /* In-case sign bit is here. */
-  bool initialized : 1;
-  bool uniscribe_bug_compatible : 1;
-};
-
-union hb_options_union_t {
-  unsigned i;
-  hb_options_t opts;
-};
-static_assert ((sizeof (hb_atomic_t) >= sizeof (hb_options_union_t)), "");
-
-HB_INTERNAL void
-_hb_options_init ();
-
-extern HB_INTERNAL hb_atomic_t _hb_options;
-
-static inline hb_options_t
-hb_options ()
-{
-#ifdef HB_NO_GETENV
-  return hb_options_t ();
-#endif
-  /* Make a local copy, so we can access bitfield threadsafely. */
-  hb_options_union_t u;
-  u.i = _hb_options;
-
-  if (unlikely (!u.i))
-  {
-    _hb_options_init ();
-    u.i = _hb_options;
-  }
-
-  return u.opts;
-}
-
-
-/*
  * Debug output (needs enabling at compile time.)
  */
 
@@ -394,6 +352,10 @@
 #define HB_DEBUG_WASM (HB_DEBUG+0)
 #endif
 
+#ifndef HB_DEBUG_KBTS
+#define HB_DEBUG_KBTS (HB_DEBUG+0)
+#endif
+
 /*
  * With tracing.
  */
@@ -484,7 +446,7 @@
 
 
 #ifndef HB_BUFFER_MESSAGE_MORE
-#define HB_BUFFER_MESSAGE_MORE (HB_DEBUG+1)
+#define HB_BUFFER_MESSAGE_MORE (HB_DEBUG+0)
 #endif
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-deprecated.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-deprecated.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-deprecated.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-deprecated.h	2026-04-17 19:09:35.000000000 +0000
@@ -287,7 +287,7 @@
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
  * Since: 7.0.0
- * XDeprecated: REPLACEME: Use hb_font_draw_glyph_func_or_fail_t instead.
+ * Deprecated: 11.2.0: Use hb_font_draw_glyph_func_or_fail_t instead.
  **/
 typedef void (*hb_font_draw_glyph_func_t) (hb_font_t *font, void *font_data,
                                            hb_codepoint_t glyph,
@@ -308,7 +308,7 @@
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
  * Since: 7.0.0
- * XDeprecated: REPLACEME: Use hb_font_paint_glyph_or_fail_func_t instead.
+ * Deprecated: 11.2.0: Use hb_font_paint_glyph_or_fail_func_t instead.
  */
 typedef hb_bool_t (*hb_font_paint_glyph_func_t) (hb_font_t *font, void *font_data,
                                                  hb_codepoint_t glyph,
@@ -346,7 +346,7 @@
  * Sets the implementation function for #hb_font_draw_glyph_func_t.
  *
  * Since: 7.0.0
- * XDeprecated: REPLACEME: Use hb_font_funcs_set_draw_glyph_or_fail_func instead.
+ * Deprecated: 11.2.0: Use hb_font_funcs_set_draw_glyph_or_fail_func instead.
  **/
 HB_DEPRECATED_FOR (hb_font_funcs_set_draw_glyph_or_fail_func)
 HB_EXTERN void
@@ -364,7 +364,7 @@
  * Sets the implementation function for #hb_font_paint_glyph_func_t.
  *
  * Since: 7.0.0
- * XDeprecated: REPLACEME: Use hb_font_funcs_set_paint_glyph_or_fail_func() instead.
+ * Deprecated: 11.2.0: Use hb_font_funcs_set_paint_glyph_or_fail_func() instead.
  */
 HB_DEPRECATED_FOR (hb_font_funcs_set_paint_glyph_or_fail_func)
 HB_EXTERN void
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-draw.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-draw.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-draw.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-draw.cc	2026-04-17 19:09:35.000000000 +0000
@@ -63,14 +63,14 @@
                           float to_x, float to_y,
                           void *user_data HB_UNUSED)
 {
-#define HB_ONE_THIRD 0.33333333f
+#define HB_TWO_THIRD 0.66666666666666666666666667f
   dfuncs->emit_cubic_to (draw_data, *st,
-                         (st->current_x + 2.f * control_x) * HB_ONE_THIRD,
-                         (st->current_y + 2.f * control_y) * HB_ONE_THIRD,
-                         (to_x + 2.f * control_x) * HB_ONE_THIRD,
-                         (to_y + 2.f * control_y) * HB_ONE_THIRD,
+                         st->current_x + (control_x - st->current_x) * HB_TWO_THIRD,
+                         st->current_y + (control_y - st->current_y) * HB_TWO_THIRD,
+                         to_x + (control_x - to_x) * HB_TWO_THIRD,
+                         to_y + (control_y - to_y) * HB_TWO_THIRD,
                          to_x, to_y);
-#undef HB_ONE_THIRD
+#undef HB_TWO_THIRD
 }
 
 static void
@@ -467,7 +467,7 @@
                          float to_x, float to_y,
                          void *user_data HB_UNUSED)
 {
-  hb_extents_t *extents = (hb_extents_t *) data;
+  hb_extents_t<> *extents = (hb_extents_t<> *) data;
 
   extents->add_point (to_x, to_y);
 }
@@ -479,7 +479,7 @@
                          float to_x, float to_y,
                          void *user_data HB_UNUSED)
 {
-  hb_extents_t *extents = (hb_extents_t *) data;
+  hb_extents_t<> *extents = (hb_extents_t<> *) data;
 
   extents->add_point (to_x, to_y);
 }
@@ -492,7 +492,7 @@
                               float to_x, float to_y,
                               void *user_data HB_UNUSED)
 {
-  hb_extents_t *extents = (hb_extents_t *) data;
+  hb_extents_t<> *extents = (hb_extents_t<> *) data;
 
   extents->add_point (control_x, control_y);
   extents->add_point (to_x, to_y);
@@ -507,7 +507,7 @@
                           float to_x, float to_y,
                           void *user_data HB_UNUSED)
 {
-  hb_extents_t *extents = (hb_extents_t *) data;
+  hb_extents_t<> *extents = (hb_extents_t<> *) data;
 
   extents->add_point (control1_x, control1_y);
   extents->add_point (control2_x, control2_y);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-face-builder.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-face-builder.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-face-builder.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-face-builder.cc	2026-04-17 19:09:35.000000000 +0000
@@ -169,8 +169,7 @@
 
   if (unlikely (start_offset >= population))
   {
-    if (table_count)
-      *table_count = 0;
+    *table_count = 0;
     return population;
   }
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-face.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-face.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-face.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-face.cc	2026-04-17 19:09:35.000000000 +0000
@@ -84,8 +84,7 @@
 
   hb_sanitize_context_t c (blob);
 
-  const char *start = hb_blob_get_data (blob, nullptr);
-  auto *ot = reinterpret_cast (const_cast (start));
+  auto *ot = blob->as ();
   if (unlikely (!ot->sanitize (&c)))
     return 0;
 
@@ -329,7 +328,7 @@
   return face;
 }
 
-static struct supported_face_loaders_t {
+static const struct supported_face_loaders_t {
         char name[16];
         hb_face_t * (*from_file) (const char *font_file, unsigned face_index);
         hb_face_t * (*from_blob) (hb_blob_t *blob, unsigned face_index);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-font.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-font.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-font.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-font.cc	2026-04-17 19:09:35.000000000 +0000
@@ -246,7 +246,6 @@
                                  hb_codepoint_t  glyph HB_UNUSED,
                                  void           *user_data HB_UNUSED)
 {
-  /* TODO use font_extents.ascender+descender */
   return -font->y_scale;
 }
 
@@ -352,6 +351,10 @@
                                     hb_position_t  *y,
                                     void           *user_data HB_UNUSED)
 {
+  if (font->has_glyph_h_origins_func_set ())
+  {
+    return font->get_glyph_h_origins (1, &glyph, 0, x, 0, y, 0, false);
+  }
   hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y);
   if (ret)
     font->parent_scale_position (x, y);
@@ -366,7 +369,6 @@
                                 hb_position_t  *y,
                                 void           *user_data HB_UNUSED)
 {
-  *x = *y = 0;
   return false;
 }
 
@@ -378,12 +380,100 @@
                                     hb_position_t  *y,
                                     void           *user_data HB_UNUSED)
 {
+  if (font->has_glyph_v_origins_func_set ())
+  {
+    return font->get_glyph_v_origins (1, &glyph, 0, x, 0, y, 0, false);
+  }
   hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y);
   if (ret)
     font->parent_scale_position (x, y);
   return ret;
 }
 
+#define hb_font_get_glyph_h_origins_nil hb_font_get_glyph_h_origins_default
+
+static hb_bool_t
+hb_font_get_glyph_h_origins_default (hb_font_t *font HB_UNUSED,
+                                     void *font_data HB_UNUSED,
+                                     unsigned int count,
+                                     const hb_codepoint_t *first_glyph HB_UNUSED,
+                                     unsigned glyph_stride HB_UNUSED,
+                                     hb_position_t *first_x,
+                                     unsigned x_stride,
+                                     hb_position_t *first_y,
+                                     unsigned y_stride,
+                                     void *user_data HB_UNUSED)
+{
+  if (font->has_glyph_h_origin_func_set ())
+  {
+    for (unsigned int i = 0; i < count; i++)
+    {
+      font->get_glyph_h_origin (*first_glyph, first_x, first_y, false);
+      first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride);
+      first_x = &StructAtOffsetUnaligned (first_x, x_stride);
+      first_y = &StructAtOffsetUnaligned (first_y, y_stride);
+    }
+    return true;
+  }
+
+  hb_bool_t ret = font->parent->get_glyph_h_origins (count,
+                                                     first_glyph, glyph_stride,
+                                                     first_x, x_stride,
+                                                     first_y, y_stride);
+  if (ret)
+  {
+    for (unsigned i = 0; i < count; i++)
+    {
+      font->parent_scale_position (first_x, first_y);
+      first_x = &StructAtOffsetUnaligned (first_x, x_stride);
+      first_y = &StructAtOffsetUnaligned (first_y, y_stride);
+    }
+  }
+  return ret;
+}
+
+#define hb_font_get_glyph_v_origins_nil hb_font_get_glyph_v_origins_default
+
+static hb_bool_t
+hb_font_get_glyph_v_origins_default (hb_font_t *font HB_UNUSED,
+                                     void *font_data HB_UNUSED,
+                                     unsigned int count,
+                                     const hb_codepoint_t *first_glyph HB_UNUSED,
+                                     unsigned glyph_stride HB_UNUSED,
+                                     hb_position_t *first_x,
+                                     unsigned x_stride,
+                                     hb_position_t *first_y,
+                                     unsigned y_stride,
+                                     void *user_data HB_UNUSED)
+{
+  if (font->has_glyph_v_origin_func_set ())
+  {
+    for (unsigned int i = 0; i < count; i++)
+    {
+      font->get_glyph_v_origin (*first_glyph, first_x, first_y, false);
+      first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride);
+      first_x = &StructAtOffsetUnaligned (first_x, x_stride);
+      first_y = &StructAtOffsetUnaligned (first_y, y_stride);
+    }
+    return true;
+  }
+
+  hb_bool_t ret = font->parent->get_glyph_v_origins (count,
+                                                     first_glyph, glyph_stride,
+                                                     first_x, x_stride,
+                                                     first_y, y_stride);
+  if (ret)
+  {
+    for (unsigned i = 0; i < count; i++)
+    {
+      font->parent_scale_position (first_x, first_y);
+      first_x = &StructAtOffsetUnaligned (first_x, x_stride);
+      first_y = &StructAtOffsetUnaligned (first_y, y_stride);
+    }
+  }
+  return ret;
+}
+
 static hb_position_t
 hb_font_get_glyph_h_kerning_nil (hb_font_t      *font HB_UNUSED,
                                  void           *font_data HB_UNUSED,
@@ -1257,6 +1347,77 @@
 }
 
 /**
+ * hb_font_get_glyph_h_origins:
+ * @font: #hb_font_t to work upon
+ * @count: The number of glyph IDs in the sequence queried
+ * @first_glyph: The first glyph ID to query
+ * @glyph_stride: The stride between successive glyph IDs
+ * @first_x: (out): The first X coordinate of the origin retrieved
+ * @x_stride: The stride between successive X coordinates
+ * @first_y: (out): The first Y coordinate of the origin retrieved
+ * @y_stride: The stride between successive Y coordinates
+ *
+ * Fetches the (X,Y) coordinates of the origin for requested glyph IDs
+ * in the specified font, for horizontal text segments.
+ *
+ * Return value: `true` if data found, `false` otherwise
+ *
+ * Since: 11.3.0
+ **/
+hb_bool_t
+hb_font_get_glyph_h_origins (hb_font_t      *font,
+                             unsigned int    count,
+                             const hb_codepoint_t *first_glyph,
+                             unsigned int    glyph_stride,
+                             hb_position_t  *first_x,
+                             unsigned int    x_stride,
+                             hb_position_t  *first_y,
+                             unsigned int    y_stride)
+
+{
+  return font->get_glyph_h_origins (count,
+                                    first_glyph, glyph_stride,
+                                    first_x, x_stride,
+                                    first_y, y_stride);
+}
+
+/**
+ * hb_font_get_glyph_v_origins:
+ * @font: #hb_font_t to work upon
+ * @count: The number of glyph IDs in the sequence queried
+ * @first_glyph: The first glyph ID to query
+ * @glyph_stride: The stride between successive glyph IDs
+ * @first_x: (out): The first X coordinate of the origin retrieved
+ * @x_stride: The stride between successive X coordinates
+ * @first_y: (out): The first Y coordinate of the origin retrieved
+ * @y_stride: The stride between successive Y coordinates
+ *
+ * Fetches the (X,Y) coordinates of the origin for requested glyph IDs
+ * in the specified font, for vertical text segments.
+ *
+ * Return value: `true` if data found, `false` otherwise
+ *
+ * Since: 11.3.0
+ **/
+hb_bool_t
+hb_font_get_glyph_v_origins (hb_font_t      *font,
+                             unsigned int    count,
+                             const hb_codepoint_t *first_glyph,
+                             unsigned int    glyph_stride,
+                             hb_position_t  *first_x,
+                             unsigned int    x_stride,
+                             hb_position_t  *first_y,
+                             unsigned int    y_stride)
+
+{
+  return font->get_glyph_v_origins (count,
+                                    first_glyph, glyph_stride,
+                                    first_x, x_stride,
+                                    first_y, y_stride);
+}
+
+
+/**
  * hb_font_get_glyph_h_kerning:
  * @font: #hb_font_t to work upon
  * @left_glyph: The glyph ID of the left glyph in the glyph pair
@@ -1443,7 +1604,7 @@
  *
  * Return value: `true` if glyph was drawn, `false` otherwise
  *
- * XSince: REPLACEME
+ * Since: 11.2.0
  **/
 hb_bool_t
 hb_font_draw_glyph_or_fail (hb_font_t *font,
@@ -1480,7 +1641,7 @@
  *
  * Return value: `true` if glyph was painted, `false` otherwise
  *
- * XSince: REPLACEME
+ * Since: 11.2.0
  */
 hb_bool_t
 hb_font_paint_glyph_or_fail (hb_font_t *font,
@@ -1883,6 +2044,7 @@
 
   1000, /* x_scale */
   1000, /* y_scale */
+  false, /* is_synthetic */
   0.f, /* x_embolden */
   0.f, /* y_embolden */
   true, /* embolden_in_place */
@@ -1900,6 +2062,7 @@
   0, /* ptem */
 
   HB_FONT_NO_VAR_NAMED_INSTANCE, /* instance_index */
+  false, /* has_nonzero_coords */
   0, /* num_coords */
   nullptr, /* coords */
   nullptr, /* design_coords */
@@ -1960,8 +2123,14 @@
   hb_font_set_funcs_using (font, nullptr);
 
 #ifndef HB_NO_VAR
-  if (face && face->index >> 16)
-    hb_font_set_var_named_instance (font, (face->index >> 16) - 1);
+  // Initialize variations.
+  if (likely (face))
+  {
+    if (face->index >> 16)
+      hb_font_set_var_named_instance (font, (face->index >> 16) - 1);
+    else
+      hb_font_set_variations (font, nullptr, 0);
+  }
 #endif
 
   return font;
@@ -1979,6 +2148,7 @@
   font->coords = coords;
   font->design_coords = design_coords;
   font->num_coords = coords_length;
+  font->has_nonzero_coords = hb_any (hb_array (coords, coords_length));
 
   font->changed ();
   font->serial_coords = font->serial;
@@ -2393,7 +2563,7 @@
   font->changed ();
 }
 
-static struct supported_font_funcs_t {
+static const struct supported_font_funcs_t {
         char name[16];
         void (*func) (hb_font_t *);
 } supported_font_funcs[] =
@@ -2450,6 +2620,9 @@
 hb_font_set_funcs_using (hb_font_t  *font,
                          const char *name)
 {
+  if (unlikely (hb_object_is_immutable (font)))
+    return false;
+
   bool retry = false;
 
   if (!name || !*name)
@@ -2704,12 +2877,12 @@
  *
  * Return value: `true` if the font is synthetic, `false` otherwise.
  *
- * XSince: REPLACEME
+ * Since: 11.2.0
  */
 hb_bool_t
 hb_font_is_synthetic (hb_font_t *font)
 {
-  return font->is_synthetic ();
+  return font->is_synthetic;
 }
 
 /**
@@ -2858,12 +3031,6 @@
   if (hb_object_is_immutable (font))
     return;
 
-  if (!variations_length && font->instance_index == HB_FONT_NO_VAR_NAMED_INSTANCE)
-  {
-    hb_font_set_var_coords_normalized (font, nullptr, 0);
-    return;
-  }
-
   const OT::fvar &fvar = *font->face->table.fvar;
   auto axes = fvar.get_axes ();
   const unsigned coords_length = axes.length;
@@ -2970,7 +3137,6 @@
 
   hb_ot_var_normalize_coords (font->face, coords_length, design_coords, normalized);
   _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length);
-
 }
 
 /**
@@ -2991,11 +3157,16 @@
 void
 hb_font_set_var_coords_design (hb_font_t    *font,
                                const float  *coords,
-                               unsigned int  coords_length)
+                               unsigned int  input_coords_length)
 {
   if (hb_object_is_immutable (font))
     return;
 
+  const OT::fvar &fvar = *font->face->table.fvar;
+  auto axes = fvar.get_axes ();
+  const unsigned coords_length = axes.length;
+
+  input_coords_length = hb_min (input_coords_length, coords_length);
   int *normalized = coords_length ? (int *) hb_calloc (coords_length, sizeof (int)) : nullptr;
   float *design_coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (float)) : nullptr;
 
@@ -3006,8 +3177,11 @@
     return;
   }
 
-  if (coords_length)
-    hb_memcpy (design_coords, coords, coords_length * sizeof (font->design_coords[0]));
+  if (input_coords_length)
+    hb_memcpy (design_coords, coords, input_coords_length * sizeof (font->design_coords[0]));
+  // Fill in the rest with default values
+  for (unsigned int i = input_coords_length; i < coords_length; i++)
+    design_coords[i] = axes[i].get_default ();
 
   hb_ot_var_normalize_coords (font->face, coords_length, coords, normalized);
   _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length);
@@ -3072,34 +3246,31 @@
 void
 hb_font_set_var_coords_normalized (hb_font_t    *font,
                                    const int    *coords, /* 2.14 normalized */
-                                   unsigned int  coords_length)
+                                   unsigned int  input_coords_length)
 {
   if (hb_object_is_immutable (font))
     return;
 
+  const OT::fvar &fvar = *font->face->table.fvar;
+  auto axes = fvar.get_axes ();
+  unsigned coords_length = axes.length;
+
+  input_coords_length = hb_min (input_coords_length, coords_length);
   int *copy = coords_length ? (int *) hb_calloc (coords_length, sizeof (coords[0])) : nullptr;
-  int *unmapped = coords_length ? (int *) hb_calloc (coords_length, sizeof (coords[0])) : nullptr;
   float *design_coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (design_coords[0])) : nullptr;
 
-  if (unlikely (coords_length && !(copy && unmapped && design_coords)))
+  if (unlikely (coords_length && !(copy && design_coords)))
   {
     hb_free (copy);
-    hb_free (unmapped);
     hb_free (design_coords);
     return;
   }
 
-  if (coords_length)
-  {
-    hb_memcpy (copy, coords, coords_length * sizeof (coords[0]));
-    hb_memcpy (unmapped, coords, coords_length * sizeof (coords[0]));
-  }
+  if (input_coords_length)
+    hb_memcpy (copy, coords, input_coords_length * sizeof (coords[0]));
 
-  /* Best effort design coords simulation */
-  font->face->table.avar->unmap_coords (unmapped, coords_length);
   for (unsigned int i = 0; i < coords_length; ++i)
-    design_coords[i] = font->face->table.fvar->unnormalize_axis_value (i, unmapped[i]);
-  hb_free (unmapped);
+    design_coords[i] = NAN;
 
   _hb_font_adopt_var_coords (font, copy, design_coords, coords_length);
 }
@@ -3112,8 +3283,8 @@
  * Fetches the list of normalized variation coordinates currently
  * set on a font.
  *
- * Note that this returned array may only contain values for some
- * (or none) of the axes; omitted axes effectively have zero values.
+ * Note that if no variation coordinates are set, this function may
+ * return %NULL.
  *
  * Return value is valid as long as variation coordinates of the font
  * are not modified.
@@ -3140,9 +3311,12 @@
  * Fetches the list of variation coordinates (in design-space units) currently
  * set on a font.
  *
- * Note that this returned array may only contain values for some
- * (or none) of the axes; omitted axes effectively have their default
- * values.
+ * Note that if no variation coordinates are set, this function may
+ * return %NULL.
+ *
+ * If variations have been set on the font using normalized coordinates
+ * (i.e. via hb_font_set_var_coords_normalized()), the design coordinates will
+ * have NaN (Not a Number) values.
  *
  * Return value is valid as long as variation coordinates of the font
  * are not modified.
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-font.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-font.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-font.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-font.h	2026-04-17 19:09:35.000000000 +0000
@@ -97,7 +97,7 @@
  * @descender: The depth of typographic descenders.
  * @line_gap: The suggested line-spacing gap.
  *
- * Font-wide extent values, measured in font units.
+ * Font-wide extent values, measured in scaled units.
  *
  * Note that typically @ascender is positive and @descender
  * negative, in coordinate systems that grow up.
@@ -332,7 +332,7 @@
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
- * This method should retrieve the (X,Y) coordinates (in font units) of the
+ * This method should retrieve the (X,Y) coordinates (in scaled units) of the
  * origin for a glyph. Each coordinate must be returned in an #hb_position_t
  * output parameter.
  *
@@ -349,7 +349,7 @@
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
- * This method should retrieve the (X,Y) coordinates (in font units) of the
+ * This method should retrieve the (X,Y) coordinates (in scaled units) of the
  * origin for a glyph, for horizontal-direction text segments. Each
  * coordinate must be returned in an #hb_position_t output parameter.
  *
@@ -361,7 +361,7 @@
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
- * This method should retrieve the (X,Y) coordinates (in font units) of the
+ * This method should retrieve the (X,Y) coordinates (in scaled units) of the
  * origin for a glyph, for vertical-direction text segments. Each coordinate
  * must be returned in an #hb_position_t output parameter.
  *
@@ -369,6 +369,65 @@
 typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_v_origin_func_t;
 
 /**
+ * hb_font_get_glyph_origins_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @first_glyph: The first glyph ID to query
+ * @count: number of glyphs to query
+ * @glyph_stride: The stride between successive glyph IDs
+ * @first_x: (out): The first origin X coordinate retrieved
+ * @x_stride: The stride between successive origin X coordinates
+ * @first_y: (out): The first origin Y coordinate retrieved
+ * @y_stride: The stride between successive origin Y coordinates
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the (X,Y) coordinates (in scaled units) of the
+ * origin for each requested glyph. Each coordinate value must be returned in
+ * an #hb_position_t in the two output parameters.
+ *
+ * Return value: `true` if data found, `false` otherwise
+ *
+ * Since: 11.3.0
+ **/
+typedef hb_bool_t (*hb_font_get_glyph_origins_func_t) (hb_font_t *font, void *font_data,
+                                                       unsigned int count,
+                                                       const hb_codepoint_t *first_glyph,
+                                                       unsigned glyph_stride,
+                                                       hb_position_t *first_x,
+                                                       unsigned x_stride,
+                                                       hb_position_t *first_y,
+                                                       unsigned y_stride,
+                                                       void *user_data);
+
+/**
+ * hb_font_get_glyph_h_origins_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the (X,Y) coordinates (in scaled units) of the
+ * origin for requested glyph, for horizontal-direction text segments. Each
+ * coordinate must be returned in a the x/y #hb_position_t output parameters.
+ *
+ * Since: 11.3.0
+ **/
+typedef hb_font_get_glyph_origins_func_t hb_font_get_glyph_h_origins_func_t;
+
+/**
+ * hb_font_get_glyph_v_origins_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the (X,Y) coordinates (in scaled units) of the
+ * origin for requested glyph, for vertical-direction text segments. Each
+ * coordinate must be returned in a the x/y #hb_position_t output parameters.
+ *
+ * Since: 11.3.0
+ **/
+typedef hb_font_get_glyph_origins_func_t hb_font_get_glyph_v_origins_func_t;
+
+/**
  * hb_font_get_glyph_kerning_func_t:
  * @font: #hb_font_t to work upon
  * @font_data: @font user data pointer
@@ -428,7 +487,7 @@
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
- * This method should retrieve the (X,Y) coordinates (in font units) for a
+ * This method should retrieve the (X,Y) coordinates (in scaled units) for a
  * specified contour point in a glyph. Each coordinate must be returned as
  * an #hb_position_t output parameter.
  *
@@ -498,7 +557,7 @@
  *
  * Return value: `true` if glyph was drawn, `false` otherwise
  *
- * XSince: REPLACEME
+ * Since: 11.2.0
  **/
 typedef hb_bool_t (*hb_font_draw_glyph_or_fail_func_t) (hb_font_t *font, void *font_data,
                                                         hb_codepoint_t glyph,
@@ -520,7 +579,7 @@
  *
  * Return value: `true` if glyph was painted, `false` otherwise
  *
- * XSince: REPLACEME
+ * Since: 11.2.0
  */
 typedef hb_bool_t (*hb_font_paint_glyph_or_fail_func_t) (hb_font_t *font, void *font_data,
                                                          hb_codepoint_t glyph,
@@ -708,6 +767,38 @@
                                        void *user_data, hb_destroy_func_t destroy);
 
 /**
+ * hb_font_funcs_set_glyph_h_origins_func:
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
+ *
+ * Sets the implementation function for #hb_font_get_glyph_h_origins_func_t.
+ *
+ * Since: 11.3.0
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_h_origins_func (hb_font_funcs_t *ffuncs,
+                                        hb_font_get_glyph_h_origins_func_t func,
+                                        void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_glyph_v_origins_func:
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
+ *
+ * Sets the implementation function for #hb_font_get_glyph_v_origins_func_t.
+ *
+ * Since: 11.3.0
+ **/
+HB_EXTERN void
+hb_font_funcs_set_glyph_v_origins_func (hb_font_funcs_t *ffuncs,
+                                        hb_font_get_glyph_v_origins_func_t func,
+                                        void *user_data, hb_destroy_func_t destroy);
+
+/**
  * hb_font_funcs_set_glyph_h_kerning_func:
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
@@ -796,7 +887,7 @@
  *
  * Sets the implementation function for #hb_font_draw_glyph_or_fail_func_t.
  *
- * XSince: REPLACEME
+ * Since: 11.2.0
  **/
 HB_EXTERN void
 hb_font_funcs_set_draw_glyph_or_fail_func (hb_font_funcs_t *ffuncs,
@@ -812,7 +903,7 @@
  *
  * Sets the implementation function for #hb_font_paint_glyph_or_fail_func_t.
  *
- * XSince: REPLACEME
+ * Since: 11.2.0
  */
 HB_EXTERN void
 hb_font_funcs_set_paint_glyph_or_fail_func (hb_font_funcs_t *ffuncs,
@@ -876,6 +967,26 @@
                             hb_codepoint_t glyph,
                             hb_position_t *x, hb_position_t *y);
 
+HB_EXTERN hb_bool_t
+hb_font_get_glyph_h_origins (hb_font_t *font,
+                             unsigned int count,
+                             const hb_codepoint_t *first_glyph,
+                             unsigned glyph_stride,
+                             hb_position_t *first_x,
+                             unsigned x_stride,
+                             hb_position_t *first_y,
+                             unsigned y_stride);
+
+HB_EXTERN hb_bool_t
+hb_font_get_glyph_v_origins (hb_font_t *font,
+                             unsigned int count,
+                             const hb_codepoint_t *first_glyph,
+                             unsigned glyph_stride,
+                             hb_position_t *first_x,
+                             unsigned x_stride,
+                             hb_position_t *first_y,
+                             unsigned y_stride);
+
 HB_EXTERN hb_position_t
 hb_font_get_glyph_h_kerning (hb_font_t *font,
                              hb_codepoint_t left_glyph, hb_codepoint_t right_glyph);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-font.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-font.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-font.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-font.hh	2026-04-17 19:09:35.000000000 +0000
@@ -55,6 +55,8 @@
   HB_FONT_FUNC_IMPLEMENT (get_,glyph_v_advances) \
   HB_FONT_FUNC_IMPLEMENT (get_,glyph_h_origin) \
   HB_FONT_FUNC_IMPLEMENT (get_,glyph_v_origin) \
+  HB_FONT_FUNC_IMPLEMENT (get_,glyph_h_origins) \
+  HB_FONT_FUNC_IMPLEMENT (get_,glyph_v_origins) \
   HB_FONT_FUNC_IMPLEMENT (get_,glyph_h_kerning) \
   HB_IF_NOT_DEPRECATED (HB_FONT_FUNC_IMPLEMENT (get_,glyph_v_kerning)) \
   HB_FONT_FUNC_IMPLEMENT (get_,glyph_extents) \
@@ -118,6 +120,8 @@
   int32_t x_scale;
   int32_t y_scale;
 
+  bool is_synthetic;
+
   float x_embolden;
   float y_embolden;
   bool embolden_in_place;
@@ -139,6 +143,7 @@
 
   /* Font variation coordinates. */
   unsigned int instance_index;
+  bool has_nonzero_coords;
   unsigned int num_coords;
   int *coords;
   float *design_coords;
@@ -430,21 +435,127 @@
   }
 
   hb_bool_t get_glyph_h_origin (hb_codepoint_t glyph,
-                                hb_position_t *x, hb_position_t *y)
+                                hb_position_t *x, hb_position_t *y,
+                                bool synthetic = true)
   {
     *x = *y = 0;
-    return klass->get.f.glyph_h_origin (this, user_data,
-                                        glyph, x, y,
-                                        !klass->user_data ? nullptr : klass->user_data->glyph_h_origin);
+    bool ret = klass->get.f.glyph_h_origin (this, user_data,
+                                            glyph, x, y,
+                                            !klass->user_data ? nullptr : klass->user_data->glyph_h_origin);
+
+    if (synthetic && ret)
+    {
+      /* Slant is ignored as it does not affect glyph origin */
+
+      /* Embolden */
+      if (!embolden_in_place)
+      {
+        *x += x_scale < 0 ? -x_strength : x_strength;
+        *y += y_scale < 0 ? -y_strength : y_strength;
+      }
+    }
+
+    return ret;
   }
 
   hb_bool_t get_glyph_v_origin (hb_codepoint_t glyph,
-                                hb_position_t *x, hb_position_t *y)
+                                hb_position_t *x, hb_position_t *y,
+                                bool synthetic = true)
   {
     *x = *y = 0;
-    return klass->get.f.glyph_v_origin (this, user_data,
-                                        glyph, x, y,
-                                        !klass->user_data ? nullptr : klass->user_data->glyph_v_origin);
+    bool ret = klass->get.f.glyph_v_origin (this, user_data,
+                                            glyph, x, y,
+                                            !klass->user_data ? nullptr : klass->user_data->glyph_v_origin);
+
+    if (synthetic && ret)
+    {
+      /* Slant is ignored as it does not affect glyph origin */
+
+      /* Embolden */
+      if (!embolden_in_place)
+      {
+        *x += x_scale < 0 ? -x_strength : x_strength;
+        *y += y_scale < 0 ? -y_strength : y_strength;
+      }
+    }
+
+    return ret;
+  }
+
+  hb_bool_t get_glyph_h_origins (unsigned int count,
+                                 const hb_codepoint_t *first_glyph,
+                                 unsigned int glyph_stride,
+                                 hb_position_t *first_x,
+                                 unsigned int x_stride,
+                                 hb_position_t *first_y,
+                                 unsigned int y_stride,
+                                 bool synthetic = true)
+
+  {
+    bool ret = klass->get.f.glyph_h_origins (this, user_data,
+                                             count,
+                                             first_glyph, glyph_stride,
+                                             first_x, x_stride, first_y, y_stride,
+                                             !klass->user_data ? nullptr : klass->user_data->glyph_h_origins);
+
+    if (synthetic && ret)
+    {
+      hb_position_t x_shift = x_scale < 0 ? -x_strength : x_strength;
+      hb_position_t y_shift = y_scale < 0 ? -y_strength : y_strength;
+      for (unsigned i = 0; i < count; i++)
+      {
+        /* Slant is ignored as it does not affect glyph origin */
+
+        /* Embolden */
+        if (!embolden_in_place)
+        {
+          *first_x += x_shift;
+          *first_y += y_shift;
+        }
+        first_x = &StructAtOffsetUnaligned (first_x, x_stride);
+        first_y = &StructAtOffsetUnaligned (first_y, y_stride);
+      }
+    }
+
+    return ret;
+  }
+
+  hb_bool_t get_glyph_v_origins (unsigned int count,
+                                 const hb_codepoint_t *first_glyph,
+                                 unsigned int glyph_stride,
+                                 hb_position_t *first_x,
+                                 unsigned int x_stride,
+                                 hb_position_t *first_y,
+                                 unsigned int y_stride,
+                                 bool synthetic = true)
+
+  {
+    bool ret = klass->get.f.glyph_v_origins (this, user_data,
+                                             count,
+                                             first_glyph, glyph_stride,
+                                             first_x, x_stride, first_y, y_stride,
+                                             !klass->user_data ? nullptr : klass->user_data->glyph_v_origins);
+
+    if (synthetic && is_synthetic && ret)
+    {
+      hb_position_t x_shift = x_scale < 0 ? -x_strength : x_strength;
+      hb_position_t y_shift = y_scale < 0 ? -y_strength : y_strength;
+      for (unsigned i = 0; i < count; i++)
+      {
+        /* Slant is ignored as it does not affect glyph origin */
+
+        /* Embolden */
+        if (!embolden_in_place)
+        {
+          *first_x += x_shift;
+          *first_y += y_shift;
+        }
+        first_x = &StructAtOffsetUnaligned (first_x, x_stride);
+        first_y = &StructAtOffsetUnaligned (first_y, y_stride);
+      }
+    }
+
+    return ret;
   }
 
   hb_position_t get_glyph_h_kerning (hb_codepoint_t left_glyph,
@@ -486,7 +597,7 @@
                                          extents,
                                          !klass->user_data ? nullptr : klass->user_data->glyph_extents);
     }
-    if (!is_synthetic () &&
+    if (!is_synthetic &&
         klass->get.f.glyph_extents (this, user_data,
                                     glyph,
                                     extents,
@@ -496,6 +607,7 @@
     /* Try getting extents from paint(), then draw(), *then* get_extents()
      * and apply synthetic settings in the last case. */
 
+#ifndef HB_NO_PAINT
     hb_paint_extents_context_t paint_extents;
     if (paint_glyph_or_fail (glyph,
                              hb_paint_extents_get_funcs (), &paint_extents,
@@ -504,14 +616,17 @@
       *extents = paint_extents.get_extents ().to_glyph_extents ();
       return true;
     }
+#endif
 
-    hb_extents_t draw_extents;
+#ifndef HB_NO_DRAW
+    hb_extents_t<> draw_extents;
     if (draw_glyph_or_fail (glyph,
                             hb_draw_extents_get_funcs (), &draw_extents))
     {
       *extents = draw_extents.to_glyph_extents ();
       return true;
     }
+#endif
 
     bool ret = klass->get.f.glyph_extents (this, user_data,
                                            glyph,
@@ -575,6 +690,7 @@
                            hb_draw_funcs_t *draw_funcs, void *draw_data,
                            bool synthetic = true)
   {
+#ifndef HB_NO_DRAW
 #ifndef HB_NO_OUTLINE
     bool embolden = x_strength || y_strength;
     bool slanted = slant_xy;
@@ -603,7 +719,13 @@
     // Slant before embolden; produces nicer results.
 
     if (slanted)
+    {
+      hb_position_t xo = 0, yo = 0;
+      get_glyph_h_origin (glyph, &xo, &yo, false);
+      outline.translate (-xo, -yo);
       outline.slant (slant_xy);
+      outline.translate (xo, yo);
+    }
 
     if (embolden)
     {
@@ -618,6 +740,8 @@
 
     return true;
 #endif
+#endif
+    return false;
   }
 
   bool paint_glyph_or_fail (hb_codepoint_t glyph,
@@ -626,6 +750,7 @@
                             hb_color_t foreground,
                             bool synthetic = true)
   {
+#ifndef HB_NO_PAINT
     /* Slant */
     if (synthetic && slant_xy)
       hb_paint_push_transform (paint_funcs, paint_data,
@@ -643,6 +768,8 @@
       hb_paint_pop_transform (paint_funcs, paint_data);
 
     return ret;
+#endif
+    return false;
   }
 
   /* A bit higher-level, and with fallback */
@@ -704,6 +831,28 @@
       get_glyph_v_advances (count, first_glyph, glyph_stride, first_advance, advance_stride);
   }
 
+  void apply_offset (hb_position_t *x, hb_position_t *y,
+                     hb_position_t dx, hb_position_t dy,
+                     signed mult)
+  {
+    assert (mult == -1 || mult == +1);
+
+    *x += dx * mult;
+    *y += dy * mult;
+  }
+  void add_offset (hb_position_t *x, hb_position_t *y,
+                   hb_position_t dx, hb_position_t dy)
+  {
+    *x += dx;
+    *y += dy;
+  }
+  void subtract_offset (hb_position_t *x, hb_position_t *y,
+                        hb_position_t dx, hb_position_t dy)
+  {
+    *x -= dx;
+    *y -= dy;
+  }
+
   void guess_v_origin_minus_h_origin (hb_codepoint_t glyph,
                                       hb_position_t *x, hb_position_t *y)
   {
@@ -714,6 +863,141 @@
     *y = extents.ascender;
   }
 
+  void apply_glyph_h_origins_with_fallback (hb_buffer_t *buf, int mult)
+  {
+    bool has_ascender = false;
+    hb_position_t ascender = 0;
+
+    struct { hb_position_t x, y; } origins[32];
+
+    unsigned int offset = 0;
+    unsigned int count = buf->len;
+    while (offset < count)
+    {
+      unsigned n = hb_min (count - offset, ARRAY_LENGTH (origins));
+      if (!get_glyph_h_origins (n,
+                                &buf->info[offset].codepoint, sizeof (hb_glyph_info_t),
+                                &origins[0].x, sizeof (origins[0]),
+                                &origins[0].y, sizeof (origins[0])))
+      {
+        if (get_glyph_v_origins (n,
+                                  &buf->info[offset].codepoint, sizeof (hb_glyph_info_t),
+                                  &origins[0].x, sizeof (origins[0]),
+                                  &origins[0].y, sizeof (origins[0])))
+        {
+          if (!has_ascender)
+          {
+            hb_font_extents_t extents;
+            get_h_extents_with_fallback (&extents);
+            ascender = extents.ascender;
+            has_ascender = true;
+          }
+
+          /* We got the v_origins, adjust them to h_origins. */
+          for (unsigned j = 0; j < n; j++)
+          {
+            hb_codepoint_t glyph = buf->info[offset + j].codepoint;
+            origins[j].x -= get_glyph_h_advance (glyph) / 2;
+            origins[j].y -= ascender;
+          }
+        }
+        else
+        {
+          for (unsigned j = 0; j < n; j++)
+          {
+            origins[j].x = 0;
+            origins[j].y = 0;
+          }
+        }
+      }
+
+      assert (mult == -1 || mult == +1);
+      if (mult == +1)
+        for (unsigned j = 0; j < n; j++)
+        {
+          hb_glyph_position_t *pos = &buf->pos[offset + j];
+          add_offset (&pos->x_offset, &pos->y_offset,
+                      origins[j].x, origins[j].y);
+        }
+      else /* mult == -1 */
+        for (unsigned j = 0; j < n; j++)
+        {
+          hb_glyph_position_t *pos = &buf->pos[offset + j];
+          subtract_offset (&pos->x_offset, &pos->y_offset,
+                           origins[j].x, origins[j].y);
+        }
+
+      offset += n;
+    }
+  }
+  void apply_glyph_v_origins_with_fallback (hb_buffer_t *buf, int mult)
+  {
+    bool has_ascender = false;
+    hb_position_t ascender = 0;
+
+    struct { hb_position_t x, y; } origins[32];
+
+    unsigned int offset = 0;
+    unsigned int count = buf->len;
+    while (offset < count)
+    {
+      unsigned n = hb_min (count - offset, ARRAY_LENGTH (origins));
+      if (!get_glyph_v_origins (n,
+                                &buf->info[offset].codepoint, sizeof (hb_glyph_info_t),
+                                &origins[0].x, sizeof (origins[0]),
+                                &origins[0].y, sizeof (origins[0])))
+      {
+        if (get_glyph_h_origins (n,
+                                 &buf->info[offset].codepoint, sizeof (hb_glyph_info_t),
+                                 &origins[0].x, sizeof (origins[0]),
+                                 &origins[0].y, sizeof (origins[0])))
+        {
+          if (!has_ascender)
+          {
+            hb_font_extents_t extents;
+            get_h_extents_with_fallback (&extents);
+            ascender = extents.ascender;
+            has_ascender = true;
+          }
+
+          /* We got the h_origins, adjust them to v_origins. */
+          for (unsigned j = 0; j < n; j++)
+          {
+            hb_codepoint_t glyph = buf->info[offset + j].codepoint;
+            origins[j].x += get_glyph_h_advance (glyph) / 2;
+            origins[j].y += ascender;
+          }
+        }
+        else
+        {
+          for (unsigned j = 0; j < n; j++)
+          {
+            origins[j].x = 0;
+            origins[j].y = 0;
+          }
+        }
+      }
+
+      assert (mult == -1 || mult == +1);
+      if (mult == +1)
+        for (unsigned j = 0; j < n; j++)
+        {
+          hb_glyph_position_t *pos = &buf->pos[offset + j];
+          add_offset (&pos->x_offset, &pos->y_offset,
+                      origins[j].x, origins[j].y);
+        }
+      else /* mult == -1 */
+        for (unsigned j = 0; j < n; j++)
+        {
+          hb_glyph_position_t *pos = &buf->pos[offset + j];
+          subtract_offset (&pos->x_offset, &pos->y_offset,
+                           origins[j].x, origins[j].y);
+        }
+
+      offset += n;
+    }
+  }
+
   void get_glyph_h_origin_with_fallback (hb_codepoint_t glyph,
                                          hb_position_t *x, hb_position_t *y)
   {
@@ -722,7 +1006,7 @@
     {
       hb_position_t dx, dy;
       guess_v_origin_minus_h_origin (glyph, &dx, &dy);
-      *x -= dx; *y -= dy;
+      subtract_offset (x, y, dx, dy);
     }
   }
   void get_glyph_v_origin_with_fallback (hb_codepoint_t glyph,
@@ -733,7 +1017,7 @@
     {
       hb_position_t dx, dy;
       guess_v_origin_minus_h_origin (glyph, &dx, &dy);
-      *x += dx; *y += dy;
+      add_offset (x, y, dx, dy);
     }
   }
 
@@ -747,68 +1031,38 @@
       get_glyph_v_origin_with_fallback (glyph, x, y);
   }
 
-  void add_glyph_h_origin (hb_codepoint_t glyph,
-                           hb_position_t *x, hb_position_t *y)
+  void add_glyph_h_origins (hb_buffer_t *buf)
   {
-    hb_position_t origin_x, origin_y;
-
-    get_glyph_h_origin_with_fallback (glyph, &origin_x, &origin_y);
-
-    *x += origin_x;
-    *y += origin_y;
+    apply_glyph_h_origins_with_fallback (buf, +1);
   }
-  void add_glyph_v_origin (hb_codepoint_t glyph,
-                           hb_position_t *x, hb_position_t *y)
+  void add_glyph_v_origins (hb_buffer_t *buf)
   {
-    hb_position_t origin_x, origin_y;
-
-    get_glyph_v_origin_with_fallback (glyph, &origin_x, &origin_y);
-
-    *x += origin_x;
-    *y += origin_y;
+    apply_glyph_v_origins_with_fallback (buf, +1);
   }
   void add_glyph_origin_for_direction (hb_codepoint_t glyph,
                                        hb_direction_t direction,
                                        hb_position_t *x, hb_position_t *y)
   {
     hb_position_t origin_x, origin_y;
-
     get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y);
-
-    *x += origin_x;
-    *y += origin_y;
+    add_offset (x, y, origin_x, origin_y);
   }
 
-  void subtract_glyph_h_origin (hb_codepoint_t glyph,
-                                hb_position_t *x, hb_position_t *y)
+  void subtract_glyph_h_origins (hb_buffer_t *buf)
   {
-    hb_position_t origin_x, origin_y;
-
-    get_glyph_h_origin_with_fallback (glyph, &origin_x, &origin_y);
-
-    *x -= origin_x;
-    *y -= origin_y;
+    apply_glyph_h_origins_with_fallback (buf, -1);
   }
-  void subtract_glyph_v_origin (hb_codepoint_t glyph,
-                                hb_position_t *x, hb_position_t *y)
+  void subtract_glyph_v_origins (hb_buffer_t *buf)
   {
-    hb_position_t origin_x, origin_y;
-
-    get_glyph_v_origin_with_fallback (glyph, &origin_x, &origin_y);
-
-    *x -= origin_x;
-    *y -= origin_y;
+    apply_glyph_v_origins_with_fallback (buf, -1);
   }
   void subtract_glyph_origin_for_direction (hb_codepoint_t glyph,
                                             hb_direction_t direction,
                                             hb_position_t *x, hb_position_t *y)
   {
     hb_position_t origin_x, origin_y;
-
     get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y);
-
-    *x -= origin_x;
-    *y -= origin_y;
+    subtract_offset (x, y, origin_x, origin_y);
   }
 
   void get_glyph_kerning_for_direction (hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
@@ -890,11 +1144,6 @@
     return false;
   }
 
-  bool is_synthetic () const
-  {
-    return x_embolden || y_embolden || slant;
-  }
-
   void changed ()
   {
     float upem = face->get_upem ();
@@ -906,6 +1155,8 @@
     bool y_neg = y_scale < 0;
     y_mult = (y_neg ? -((int64_t) -y_scale << 16) : ((int64_t) y_scale << 16)) / upem;
 
+    is_synthetic =  x_embolden || y_embolden || slant;
+
     x_strength = roundf (abs (x_scale) * x_embolden);
     y_strength = roundf (abs (y_scale) * y_embolden);
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-free-pool.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-free-pool.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-free-pool.hh	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-free-pool.hh	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,107 @@
+/*
+ * Copyright © 2019  Facebook, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Facebook Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_FREE_POOL_HH
+#define HB_FREE_POOL_HH
+
+#include "hb.hh"
+
+/* Memory pool for persistent alloc/free of small objects.
+ *
+ * Some AI musings on this, not necessarily true:
+ *
+ * This is a very simple implementation, but it's good enough for our
+ * purposes.  It's not thread-safe.  It's not very fast.  It's not
+ * very memory efficient.  It's not very cache efficient.  It's not
+ * very anything efficient.  But it's simple and it works.  And it's
+ * good enough for our purposes.  If you need something more
+ * sophisticated, use a real allocator.  Or use a real language. */
+
+template 
+struct hb_free_pool_t
+{
+  hb_free_pool_t () : next (nullptr) {}
+  ~hb_free_pool_t ()
+  {
+    next = nullptr;
+
+    + hb_iter (chunks)
+    | hb_apply (hb_free)
+    ;
+  }
+
+  T* alloc ()
+  {
+    if (unlikely (!next))
+    {
+      if (unlikely (!chunks.alloc (chunks.length + 1))) return nullptr;
+      chunk_t *chunk = (chunk_t *) hb_malloc (sizeof (chunk_t));
+      if (unlikely (!chunk)) return nullptr;
+      chunks.push (chunk);
+      next = chunk->thread ();
+    }
+
+    T* obj = next;
+    next = * ((T**) next);
+
+    hb_memset (obj, 0, sizeof (T));
+
+    return obj;
+  }
+
+  void release (T* obj)
+  {
+    * (T**) obj = next;
+    next = obj;
+  }
+
+  private:
+
+  static_assert (ChunkLen > 1, "");
+  static_assert (sizeof (T) >= sizeof (void *), "");
+  static_assert (alignof (T) % alignof (void *) == 0, "");
+
+  struct chunk_t
+  {
+    T* thread ()
+    {
+      for (unsigned i = 0; i < ARRAY_LENGTH (arrayZ) - 1; i++)
+        * (T**) &arrayZ[i] = &arrayZ[i + 1];
+
+      * (T**) &arrayZ[ARRAY_LENGTH (arrayZ) - 1] = nullptr;
+
+      return arrayZ;
+    }
+
+    T arrayZ[ChunkLen];
+  };
+
+  T* next;
+  hb_vector_t chunks;
+};
+
+
+#endif /* HB_FREE_POOL_HH */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ft.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ft.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ft.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ft.cc	2026-04-17 19:09:35.000000000 +0000
@@ -143,6 +143,9 @@
 /* hb_font changed, update FT_Face. */
 static void _hb_ft_hb_font_changed (hb_font_t *font, FT_Face ft_face)
 {
+  if (unlikely (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy))
+    return;
+
   hb_ft_font_t *ft_font = (hb_ft_font_t *) font->user_data;
 
   float x_mult = 1.f, y_mult = 1.f;
@@ -184,12 +187,14 @@
     FT_Set_Transform (ft_face, &matrix, nullptr);
     ft_font->transform = true;
   }
+  else
+    FT_Set_Transform (ft_face, nullptr, nullptr);
 
 #if defined(HAVE_FT_GET_VAR_BLEND_COORDINATES) && !defined(HB_NO_VAR)
-  unsigned int num_coords;
-  const float *coords = hb_font_get_var_coords_design (font, &num_coords);
-  if (num_coords)
+  if (font->has_nonzero_coords)
   {
+    unsigned int num_coords;
+    const float *coords = hb_font_get_var_coords_design (font, &num_coords);
     FT_Fixed *ft_coords = (FT_Fixed *) hb_calloc (num_coords, sizeof (FT_Fixed));
     if (ft_coords)
     {
@@ -199,6 +204,12 @@
       hb_free (ft_coords);
     }
   }
+  else if (font->num_coords)
+  {
+    // Some old versions of FreeType crash if we
+    // call this function on non-variable fonts.
+    FT_Set_Var_Design_Coordinates (ft_face, 0, nullptr);
+  }
 #endif
 }
 
@@ -1093,6 +1104,10 @@
   FT_ULong  length = 0;
   FT_Error error;
 
+  /* In new FreeType, a tag value of 1 loads the SFNT table directory. Reject it. */
+  if (tag == 1)
+    return nullptr;
+
   /* Note: FreeType like HarfBuzz uses the NONE tag for fetching the entire blob */
 
   error = FT_Load_Sfnt_Table (ft_face, tag, 0, nullptr, &length);
@@ -1366,7 +1381,7 @@
 
         for (unsigned int i = 0; i < mm_var->num_axis; ++i)
          {
-          coords[i] = ft_coords[i] >>= 2;
+          coords[i] = (ft_coords[i] + 2) >> 2;
           nonzero = nonzero || coords[i];
          }
 
@@ -1717,7 +1732,12 @@
   ft_face->generic.finalizer = _release_blob;
 
   // And the FT_Library to the blob
-  hb_blob_set_user_data (blob, &ft_library_key, ft_library, destroy_ft_library, true);
+  if (unlikely (!hb_blob_set_user_data (blob, &ft_library_key, ft_library, destroy_ft_library, true)))
+  {
+    DEBUG_MSG (FT, font, "hb_blob_set_user_data() failed");
+    FT_Done_Face (ft_face);
+    return;
+  }
 
   _hb_ft_font_set_funcs (font, ft_face, true);
   hb_ft_font_set_load_flags (font, FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-geometry.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-geometry.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-geometry.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-geometry.hh	2026-04-17 19:09:35.000000000 +0000
@@ -26,7 +26,10 @@
 
 #include "hb.hh"
 
+#include "hb-algs.hh"
 
+
+template 
 struct hb_extents_t
 {
   hb_extents_t () {}
@@ -35,7 +38,7 @@
                 ymin (hb_min (extents.y_bearing, extents.y_bearing + extents.height)),
                 xmax (hb_max (extents.x_bearing, extents.x_bearing + extents.width)),
                 ymax (hb_max (extents.y_bearing, extents.y_bearing + extents.height)) {}
-  hb_extents_t (float xmin, float ymin, float xmax, float ymax) :
+  hb_extents_t (Float xmin, Float ymin, Float xmax, Float ymax) :
     xmin (xmin), ymin (ymin), xmax (xmax), ymax (ymax) {}
 
   bool is_empty () const { return xmin >= xmax || ymin >= ymax; }
@@ -69,7 +72,7 @@
   }
 
   void
-  add_point (float x, float y)
+  add_point (Float x, Float y)
   {
     if (unlikely (is_void ()))
     {
@@ -97,62 +100,69 @@
                                yneg ? y1 - y0 : y0 - y1};
   }
 
-  float xmin = 0.f;
-  float ymin = 0.f;
-  float xmax = -1.f;
-  float ymax = -1.f;
+  Float xmin = 0;
+  Float ymin = 0;
+  Float xmax = -1;
+  Float ymax = -1;
 };
 
+template 
 struct hb_transform_t
 {
   hb_transform_t () {}
-  hb_transform_t (float xx, float yx,
-                  float xy, float yy,
-                  float x0, float y0) :
+  hb_transform_t (Float xx, Float yx,
+                  Float xy, Float yy,
+                  Float x0, Float y0) :
     xx (xx), yx (yx), xy (xy), yy (yy), x0 (x0), y0 (y0) {}
 
   bool is_identity () const
   {
-    return xx == 1.f && yx == 0.f &&
-           xy == 0.f && yy == 1.f &&
-           x0 == 0.f && y0 == 0.f;
+    return xx == 1 && yx == 0 &&
+           xy == 0 && yy == 1 &&
+           x0 == 0 && y0 == 0;
   }
-
-  void multiply (const hb_transform_t &o)
+  bool is_translation () const
   {
-    /* Copied from cairo, with "o" being "a" there and "this" being "b" there. */
-    hb_transform_t r;
-
-    r.xx = o.xx * xx + o.yx * xy;
-    r.yx = o.xx * yx + o.yx * yy;
-
-    r.xy = o.xy * xx + o.yy * xy;
-    r.yy = o.xy * yx + o.yy * yy;
-
-    r.x0 = o.x0 * xx + o.y0 * xy + x0;
-    r.y0 = o.x0 * yx + o.y0 * yy + y0;
+    return xx == 1 && yx == 0 &&
+           xy == 0 && yy == 1;
+  }
 
-    *this = r;
+  void multiply (const hb_transform_t &o, bool before=false)
+  {
+    // Copied from cairo-matrix.c
+    const hb_transform_t &a = before ? o : *this;
+    const hb_transform_t &b = before ? *this : o;
+    *this = {
+      a.xx * b.xx + a.xy * b.yx,
+      a.yx * b.xx + a.yy * b.yx,
+      a.xx * b.xy + a.xy * b.yy,
+      a.yx * b.xy + a.yy * b.yy,
+      a.xx * b.x0 + a.xy * b.y0 + a.x0,
+      a.yx * b.x0 + a.yy * b.y0 + a.y0
+    };
   }
 
-  void transform_distance (float &dx, float &dy) const
+  HB_ALWAYS_INLINE
+  void transform_distance (Float &dx, Float &dy) const
   {
-    float new_x = xx * dx + xy * dy;
-    float new_y = yx * dx + yy * dy;
+    Float new_x = xx * dx + xy * dy;
+    Float new_y = yx * dx + yy * dy;
     dx = new_x;
     dy = new_y;
   }
 
-  void transform_point (float &x, float &y) const
+  HB_ALWAYS_INLINE
+  void transform_point (Float &x, Float &y) const
   {
-    transform_distance (x, y);
-    x += x0;
-    y += y0;
+    Float new_x = x0 + xx * x + xy * y;
+    Float new_y = y0 + yx * x + yy * y;
+    x = new_x;
+    y = new_y;
   }
 
-  void transform_extents (hb_extents_t &extents) const
+  void transform_extents (hb_extents_t &extents) const
   {
-    float quad_x[4], quad_y[4];
+    Float quad_x[4], quad_y[4];
 
     quad_x[0] = extents.xmin;
     quad_y[0] = extents.ymin;
@@ -163,7 +173,7 @@
     quad_x[3] = extents.xmax;
     quad_y[3] = extents.ymax;
 
-    extents = hb_extents_t {};
+    extents = hb_extents_t {};
     for (unsigned i = 0; i < 4; i++)
     {
       transform_point (quad_x[i], quad_y[i]);
@@ -171,20 +181,36 @@
     }
   }
 
-  void transform (const hb_transform_t &o) { multiply (o); }
+  void transform (const hb_transform_t &o, bool before=false) { multiply (o, before); }
 
-  void translate (float x, float y)
+  static hb_transform_t translation (Float x, Float y)
   {
-    if (x == 0.f && y == 0.f)
-      return;
+    return {1, 0, 0, 1, x, y};
+  }
+  void translate (Float x, Float y, bool before=false)
+  {
+    if (before)
+    {
+      x0 += x;
+      y0 += y;
+    }
+    else
+    {
+      if (x == 0 && y == 0)
+        return;
 
-    x0 += xx * x + xy * y;
-    y0 += yx * x + yy * y;
+      x0 += xx * x + xy * y;
+      y0 += yx * x + yy * y;
+    }
   }
 
-  void scale (float scaleX, float scaleY)
+  static hb_transform_t scaling (Float scaleX, Float scaleY)
+  {
+    return {scaleX, 0, 0, scaleY, 0, 0};
+  }
+  void scale (Float scaleX, Float scaleY)
   {
-    if (scaleX == 1.f && scaleY == 1.f)
+    if (scaleX == 1 && scaleY == 1)
       return;
 
     xx *= scaleX;
@@ -192,52 +218,94 @@
     xy *= scaleY;
     yy *= scaleY;
   }
-
-  void rotate (float rotation)
+  static hb_transform_t scaling_around_center (Float scaleX, Float scaleY, Float center_x, Float center_y)
+  {
+    return {scaleX, 0, 0, scaleY,
+            center_x ? (1 - scaleX) * center_x : 0,
+            center_y ? (1 - scaleY) * center_y : 0};
+  }
+  void scale_around_center (Float scaleX, Float scaleY, Float center_x, Float center_y)
   {
-    if (rotation == 0.f)
+    if (scaleX == 1 && scaleY == 1)
       return;
 
+    transform (scaling_around_center (scaleX, scaleY, center_x, center_y));
+  }
+
+  static hb_transform_t rotation (Float radians)
+  {
     // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L240
-    rotation = rotation * HB_PI;
-    float c;
-    float s;
-#ifdef HAVE_SINCOSF
-    sincosf (rotation, &s, &c);
-#else
-    c = cosf (rotation);
-    s = sinf (rotation);
-#endif
-    auto other = hb_transform_t{c, s, -s, c, 0.f, 0.f};
-    transform (other);
+    Float c;
+    Float s;
+    hb_sincos (radians, s, c);
+    return {c, s, -s, c, 0, 0};
+  }
+  void rotate (Float radians, bool before=false)
+  {
+    if (radians == 0)
+      return;
+
+    transform (rotation (radians), before);
   }
 
-  void skew (float skewX, float skewY)
+  static hb_transform_t rotation_around_center (Float radians, Float center_x, Float center_y)
   {
-    if (skewX == 0.f && skewY == 0.f)
+    Float s, c;
+    hb_sincos (radians, s, c);
+    return {
+      c, s, -s, c,
+      (1 - c) * center_x + s * center_y,
+      -s * center_x +  (1 - c) * center_y
+    };
+  }
+  void rotate_around_center (Float radians, Float center_x, Float center_y, bool before=false)
+  {
+    if (radians == 0)
       return;
 
-    // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L255
-    skewX = skewX * HB_PI;
-    skewY = skewY * HB_PI;
-    auto other = hb_transform_t{1.f,
-                                skewY ? tanf (skewY) : 0.f,
-                                skewX ? tanf (skewX) : 0.f,
-                                1.f,
-                                0.f, 0.f};
-    transform (other);
-  }
-
-  float xx = 1.f;
-  float yx = 0.f;
-  float xy = 0.f;
-  float yy = 1.f;
-  float x0 = 0.f;
-  float y0 = 0.f;
+    transform (rotation_around_center (radians, center_x, center_y), before);
+  }
+
+  static hb_transform_t skewing (Float skewX, Float skewY)
+  {
+    return {1, skewY ? tanf (skewY) : 0, skewX ? tanf (skewX) : 0, 1, 0, 0};
+  }
+  void skew (Float skewX, Float skewY)
+  {
+    if (skewX == 0 && skewY == 0)
+      return;
+
+    transform (skewing (skewX, skewY));
+  }
+  static hb_transform_t skewing_around_center (Float skewX, Float skewY, Float center_x, Float center_y)
+  {
+    skewX = skewX ? tanf (skewX) : 0;
+    skewY = skewY ? tanf (skewY) : 0;
+    return {
+            1, skewY, skewX, 1,
+            center_y ? -skewX * center_y : 0,
+            center_x ? -skewY * center_x : 0
+    };
+  }
+  void skew_around_center (Float skewX, Float skewY, Float center_x, Float center_y)
+  {
+    if (skewX == 0 && skewY == 0)
+            return;
+
+    transform (skewing_around_center (skewX, skewY, center_x, center_y));
+  }
+
+  Float xx = 1;
+  Float yx = 0;
+  Float xy = 0;
+  Float yy = 1;
+  Float x0 = 0;
+  Float y0 = 0;
 };
 
-#define HB_TRANSFORM_IDENTITY hb_transform_t{1.f, 0.f, 0.f, 1.f, 0.f, 0.f}
+#define HB_TRANSFORM_IDENTITY {1, 0, 0, 1, 0, 0}
 
+template 
 struct hb_bounds_t
 {
   enum status_t {
@@ -247,7 +315,7 @@
   };
 
   hb_bounds_t (status_t status = UNBOUNDED) : status (status) {}
-  hb_bounds_t (const hb_extents_t &extents) :
+  hb_bounds_t (const hb_extents_t &extents) :
     status (extents.is_empty () ? EMPTY : BOUNDED), extents (extents) {}
 
   void union_ (const hb_bounds_t &o)
@@ -281,20 +349,21 @@
   }
 
   status_t status;
-  hb_extents_t extents;
+  hb_extents_t extents;
 };
 
+template 
 struct hb_transform_decomposed_t
 {
-  float translateX = 0;
-  float translateY = 0;
-  float rotation = 0;  // in degrees, counter-clockwise
-  float scaleX = 1;
-  float scaleY = 1;
-  float skewX = 0;  // in degrees, counter-clockwise
-  float skewY = 0;  // in degrees, counter-clockwise
-  float tCenterX = 0;
-  float tCenterY = 0;
+  Float translateX = 0;
+  Float translateY = 0;
+  Float rotation = 0;  // in radians, counter-clockwise
+  Float scaleX = 1;
+  Float scaleY = 1;
+  Float skewX = 0;  // in radians, counter-clockwise
+  Float skewY = 0;  // in radians, counter-clockwise
+  Float tCenterX = 0;
+  Float tCenterY = 0;
 
   operator bool () const
   {
@@ -305,9 +374,9 @@
            tCenterX || tCenterY;
   }
 
-  hb_transform_t to_transform () const
+  hb_transform_t to_transform () const
   {
-    hb_transform_t t;
+    hb_transform_t t;
     t.translate (translateX + tCenterX, translateY + tCenterY);
     t.rotate (rotation);
     t.scale (scaleX, scaleY);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-iter.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-iter.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-iter.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-iter.hh	2026-04-17 19:09:35.000000000 +0000
@@ -772,8 +772,9 @@
   template 
   auto
   inc (hb_type_identity s, hb_priority<1>)
-    -> hb_void_t (s), hb_declval ()))>
-  { v = hb_invoke (std::forward (s), v); }
+    -> hb_void_t> (s),
+                                      hb_declval ()))>
+  { v = hb_invoke (std::forward> (s), v); }
 
   void
   inc (S s, hb_priority<0>)
@@ -972,7 +973,7 @@
                     Proj&& f = hb_identity) const
   {
     for (auto it = hb_iter (c); it; ++it)
-      if (!hb_match (std::forward (p), hb_get (std::forward (f), *it)))
+      if (!hb_match (p, hb_get (f, *it)))
         return false;
     return true;
   }
@@ -989,7 +990,7 @@
                     Proj&& f = hb_identity) const
   {
     for (auto it = hb_iter (c); it; ++it)
-      if (hb_match (std::forward (p), hb_get (std::forward (f), *it)))
+      if (hb_match (p, hb_get (f, *it)))
         return true;
     return false;
   }
@@ -1006,7 +1007,7 @@
                     Proj&& f = hb_identity) const
   {
     for (auto it = hb_iter (c); it; ++it)
-      if (hb_match (std::forward (p), hb_get (std::forward (f), *it)))
+      if (hb_match (p, hb_get (f, *it)))
         return false;
     return true;
   }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-kern.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-kern.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-kern.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-kern.hh	2026-04-17 19:09:35.000000000 +0000
@@ -70,7 +70,7 @@
         continue;
       }
 
-      skippy_iter.reset (idx);
+      skippy_iter.reset_fast (idx);
       unsigned unsafe_to;
       if (!skippy_iter.next (&unsafe_to))
       {
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-limits.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-limits.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-limits.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-limits.hh	2026-04-17 19:09:35.000000000 +0000
@@ -29,20 +29,20 @@
 
 
 #ifndef HB_BUFFER_MAX_LEN_FACTOR
-#define HB_BUFFER_MAX_LEN_FACTOR 64
+#define HB_BUFFER_MAX_LEN_FACTOR 256
 #endif
 #ifndef HB_BUFFER_MAX_LEN_MIN
-#define HB_BUFFER_MAX_LEN_MIN 16384
+#define HB_BUFFER_MAX_LEN_MIN 65536
 #endif
 #ifndef HB_BUFFER_MAX_LEN_DEFAULT
 #define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
 #endif
 
 #ifndef HB_BUFFER_MAX_OPS_FACTOR
-#define HB_BUFFER_MAX_OPS_FACTOR 1024
+#define HB_BUFFER_MAX_OPS_FACTOR 4096
 #endif
 #ifndef HB_BUFFER_MAX_OPS_MIN
-#define HB_BUFFER_MAX_OPS_MIN 16384
+#define HB_BUFFER_MAX_OPS_MIN 65536
 #endif
 #ifndef HB_BUFFER_MAX_OPS_DEFAULT
 #define HB_BUFFER_MAX_OPS_DEFAULT 0x1FFFFFFF /* Shaping more than a billion operations? Let us know! */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-machinery.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-machinery.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-machinery.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-machinery.hh	2026-04-17 19:09:35.000000000 +0000
@@ -66,13 +66,22 @@
 }
 
 /* StructAfter(X) returns the struct T& that is placed after X.
- * Works with X of variable size also.  X must implement get_size() */
-template
-static inline const Type& StructAfter(const TObject &X)
-{ return StructAtOffset(&X, X.get_size()); }
-template
-static inline Type& StructAfter(TObject &X)
-{ return StructAtOffset(&X, X.get_size()); }
+ * Works with X of variable size also.  X must implement get_size().
+ * Any extra arguments are forwarded to get_size, so for example
+ * it can work with UnsizedArrayOf<> as well. */
+template 
+static inline auto StructAfter(const TObject &X, Ts... args) HB_AUTO_RETURN((
+  StructAtOffset(&X, X.get_size(std::forward (args)...))
+))
+/* The is_const shenanigans is to avoid ambiguous overload with gcc-8.
+ * It disables this path when TObject is const.
+ * See: https://github.com/harfbuzz/harfbuzz/issues/5429 */
+template 
+static inline auto StructAfter(TObject &X, Ts... args) HB_AUTO_RETURN((
+  sizeof(int[std::is_const::value ? -1 : +1]) > 0 ?
+  StructAtOffset(&X, X.get_size(std::forward (args)...))
+  : *reinterpret_cast (0)
+))
 
 
 /*
@@ -132,7 +141,6 @@
   DEFINE_SIZE_ARRAY(size, array)
 
 
-
 /*
  * Lazy loaders.
  *
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-map.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-map.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-map.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-map.hh	2026-04-17 19:09:35.000000000 +0000
@@ -47,11 +47,11 @@
   hb_hashmap_t ()  { init (); }
   ~hb_hashmap_t () { fini (); }
 
-  hb_hashmap_t (const hb_hashmap_t& o) : hb_hashmap_t ()
+  void _copy (const hb_hashmap_t& o)
   {
     if (unlikely (!o.mask)) return;
 
-    if (item_t::is_trivial)
+    if (hb_is_trivially_copy_assignable (item_t))
     {
       items = (item_t *) hb_malloc (sizeof (item_t) * (o.mask + 1));
       if (unlikely (!items))
@@ -70,8 +70,16 @@
 
     alloc (o.population); hb_copy (o, *this);
   }
+
+  hb_hashmap_t (const hb_hashmap_t& o) : hb_hashmap_t () { _copy (o); }
+  hb_hashmap_t& operator= (const hb_hashmap_t& o)
+  {
+    reset ();
+    if (!items) { _copy (o); return *this; }
+    alloc (o.population); hb_copy (o, *this); return *this;
+  }
+
   hb_hashmap_t (hb_hashmap_t&& o)  noexcept : hb_hashmap_t () { hb_swap (*this, o); }
-  hb_hashmap_t& operator= (const hb_hashmap_t& o)  { reset (); alloc (o.population); hb_copy (o, *this); return *this; }
   hb_hashmap_t& operator= (hb_hashmap_t&& o)   noexcept { hb_swap (*this, o); return *this; }
 
   hb_hashmap_t (std::initializer_list> lst) : hb_hashmap_t ()
@@ -130,10 +138,7 @@
     uint32_t total_hash () const
     { return (hash * 31u) + hb_hash (value); }
 
-    static constexpr bool is_trivial = hb_is_trivially_constructible(K) &&
-                                       hb_is_trivially_destructible(K) &&
-                                       hb_is_trivially_constructible(V) &&
-                                       hb_is_trivially_destructible(V);
+    static constexpr bool is_trivially_constructible = (hb_is_trivially_constructible(K) && hb_is_trivially_constructible(V));
   };
 
   hb_object_header_t header;
@@ -174,19 +179,19 @@
     if (likely (items))
     {
       unsigned size = mask + 1;
-      if (!item_t::is_trivial)
-        for (unsigned i = 0; i < size; i++)
-          items[i].~item_t ();
+      for (unsigned i = 0; i < size; i++)
+        items[i].~item_t ();
       hb_free (items);
       items = nullptr;
     }
     population = occupancy = 0;
   }
 
-  void reset ()
+  hb_hashmap_t& reset ()
   {
     successful = true;
     clear ();
+    return *this;
   }
 
   bool in_error () const { return !successful; }
@@ -197,7 +202,7 @@
 
     if (new_population != 0 && (new_population + new_population / 2) < mask) return true;
 
-    unsigned int power = hb_bit_storage (hb_max ((unsigned) population, new_population) * 2 + 8);
+    unsigned int power = hb_bit_storage (hb_max (hb_max ((unsigned) population, new_population) * 2, 4u));
     unsigned int new_size = 1u << power;
     item_t *new_items = (item_t *) hb_malloc ((size_t) new_size * sizeof (item_t));
     if (unlikely (!new_items))
@@ -205,7 +210,7 @@
       successful = false;
       return false;
     }
-    if (!item_t::is_trivial)
+    if (!item_t::is_trivially_constructible)
       for (auto &_ : hb_iter (new_items, new_size))
         new (&_) item_t ();
     else
@@ -231,9 +236,8 @@
                        std::move (old_items[i].value));
       }
     }
-    if (!item_t::is_trivial)
-      for (unsigned int i = 0; i < old_size; i++)
-        old_items[i].~item_t ();
+    for (unsigned int i = 0; i < old_size; i++)
+      old_items[i].~item_t ();
 
     hb_free (old_items);
 
@@ -335,7 +339,13 @@
   bool has (const K &key, VV **vp = nullptr) const
   {
     if (!items) return false;
-    auto *item = fetch_item (key, hb_hash (key));
+    return has_with_hash (key, hb_hash (key), vp);
+  }
+  template 
+  bool has_with_hash (const K &key, uint32_t hash, VV **vp = nullptr) const
+  {
+    if (!items) return false;
+    auto *item = fetch_item (key, hash);
     if (item)
     {
       if (vp) *vp = std::addressof (item->value);
@@ -481,10 +491,17 @@
   /* Sink interface. */
   hb_hashmap_t& operator << (const hb_pair_t& v)
   { set (v.first, v.second); return *this; }
+  template 
   hb_hashmap_t& operator << (const hb_pair_t& v)
   { set (v.first, std::move (v.second)); return *this; }
+  template 
   hb_hashmap_t& operator << (const hb_pair_t& v)
   { set (std::move (v.first), v.second); return *this; }
+  template 
   hb_hashmap_t& operator << (const hb_pair_t& v)
   { set (std::move (v.first), std::move (v.second)); return *this; }
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-number-parser.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-number-parser.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-number-parser.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-number-parser.hh	2026-04-17 19:09:35.000000000 +0000
@@ -31,7 +31,7 @@
 #include "hb.hh"
 
 
-#line 35 "hb-number-parser.hh"
+#line 32 "hb-number-parser.hh"
 static const unsigned char _double_parser_trans_keys[] = {
         0u, 0u, 43u, 57u, 46u, 57u, 48u, 57u, 43u, 57u, 48u, 57u, 48u, 101u, 48u, 57u,
         46u, 101u, 0
@@ -135,12 +135,12 @@
 
   int cs;
 
-#line 139 "hb-number-parser.hh"
+#line 132 "hb-number-parser.hh"
         {
         cs = double_parser_start;
         }
 
-#line 144 "hb-number-parser.hh"
+#line 135 "hb-number-parser.hh"
         {
         int _slen;
         int _trans;
@@ -198,7 +198,7 @@
           exp_overflow = true;
 }
         break;
-#line 202 "hb-number-parser.hh"
+#line 187 "hb-number-parser.hh"
         }
 
 _again:
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-open-file.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-open-file.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-open-file.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-open-file.hh	2026-04-17 19:09:35.000000000 +0000
@@ -465,11 +465,11 @@
     Typ1Tag             = HB_TAG ('t','y','p','1')  /* Obsolete Apple Type1 font in SFNT container */
   };
 
-  hb_tag_t get_tag () const { return u.tag; }
+  hb_tag_t get_tag () const { return u.tag.v; }
 
   unsigned int get_face_count () const
   {
-    switch (u.tag) {
+    switch (u.tag.v) {
     case CFFTag:        /* All the non-collection tags */
     case TrueTag:
     case Typ1Tag:
@@ -483,7 +483,7 @@
   {
     if (base_offset)
       *base_offset = 0;
-    switch (u.tag) {
+    switch (u.tag.v) {
     /* Note: for non-collection SFNT data we ignore index.  This is because
      * Apple dfont container is a container of SFNT's.  So each SFNT is a
      * non-TTC, but the index is more than zero. */
@@ -512,9 +512,9 @@
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (unlikely (!u.tag.sanitize (c))) return_trace (false);
+    if (unlikely (!u.tag.v.sanitize (c))) return_trace (false);
     hb_barrier ();
-    switch (u.tag) {
+    switch (u.tag.v) {
     case CFFTag:        /* All the non-collection tags */
     case TrueTag:
     case Typ1Tag:
@@ -527,13 +527,13 @@
 
   protected:
   union {
-  Tag                   tag;            /* 4-byte identifier. */
+  struct { Tag v; }     tag;            /* 4-byte identifier. */
   OpenTypeFontFace      fontFace;
   TTCHeader             ttcHeader;
   ResourceForkHeader    rfHeader;
   } u;
   public:
-  DEFINE_SIZE_UNION (4, tag);
+  DEFINE_SIZE_UNION (4, tag.v);
 };
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-open-type.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-open-type.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-open-type.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-open-type.hh	2026-04-17 19:09:35.000000000 +0000
@@ -54,35 +54,41 @@
  */
 
 /* Integer types in big-endian order and no alignment requirement */
-template 
-struct IntType
+struct NumType
 {
   typedef Type type;
-
-  IntType () = default;
-  explicit constexpr IntType (Type V) : v {V} {}
-  IntType& operator = (Type i) { v = i; return *this; }
   /* For reason we define cast out operator for signed/unsigned, instead of Type, see:
    * https://github.com/harfbuzz/harfbuzz/pull/2875/commits/09836013995cab2b9f07577a179ad7b024130467 */
-  operator typename std::conditional::value, signed, unsigned>::type () const { return v; }
-
-  bool operator == (const IntType &o) const { return (Type) v == (Type) o.v; }
-  bool operator != (const IntType &o) const { return !(*this == o); }
-
-  IntType& operator += (unsigned count) { *this = *this + count; return *this; }
-  IntType& operator -= (unsigned count) { *this = *this - count; return *this; }
-  IntType& operator ++ () { *this += 1; return *this; }
-  IntType& operator -- () { *this -= 1; return *this; }
-  IntType operator ++ (int) { IntType c (*this); ++*this; return c; }
-  IntType operator -- (int) { IntType c (*this); --*this; return c; }
+  typedef typename std::conditional::value && sizeof (Type) <= sizeof(int),
+                                     typename std::conditional::value, signed, unsigned>::type,
+                                     Type>::type WideType;
+
+  NumType () = default;
+  explicit constexpr NumType (Type V) : v {V} {}
+  NumType& operator = (Type V) { v = V; return *this; }
+
+  operator WideType () const { return v; }
+
+  bool operator == (const NumType &o) const { return (Type) v == (Type) o.v; }
+  bool operator != (const NumType &o) const { return !(*this == o); }
+
+  NumType& operator += (WideType count) { *this = *this + count; return *this; }
+  NumType& operator -= (WideType count) { *this = *this - count; return *this; }
+  NumType& operator ++ () { *this += 1; return *this; }
+  NumType& operator -- () { *this -= 1; return *this; }
+  NumType operator ++ (int) { NumType c (*this); ++*this; return c; }
+  NumType operator -- (int) { NumType c (*this); --*this; return c; }
 
-  HB_INTERNAL static int cmp (const IntType *a, const IntType *b)
+  uint32_t hash () const { return hb_array ((const char *) &v, sizeof (v)).hash (); }
+  HB_INTERNAL static int cmp (const NumType *a, const NumType *b)
   { return b->cmp (*a); }
   HB_INTERNAL static int cmp (const void *a, const void *b)
   {
-    IntType *pa = (IntType *) a;
-    IntType *pb = (IntType *) b;
+    NumType *pa = (NumType *) a;
+    NumType *pb = (NumType *) b;
 
     return pb->cmp (*pa);
   }
@@ -99,20 +105,36 @@
     return_trace (c->check_struct (this));
   }
   protected:
-  BEInt v;
+  typename std::conditional::value,
+                            HBInt,
+                            HBFloat>::type v;
   public:
   DEFINE_SIZE_STATIC (Size);
 };
 
-typedef IntType  HBUINT8;      /* 8-bit unsigned integer. */
-typedef IntType   HBINT8;       /* 8-bit signed integer. */
-typedef IntType HBUINT16;     /* 16-bit unsigned integer. */
-typedef IntType  HBINT16;      /* 16-bit signed integer. */
-typedef IntType HBUINT32;     /* 32-bit unsigned integer. */
-typedef IntType  HBINT32;      /* 32-bit signed integer. */
+typedef NumType  HBUINT8;        /* 8-bit big-endian unsigned integer. */
+typedef NumType   HBINT8;         /* 8-bit big-endian signed integer. */
+typedef NumType HBUINT16;       /* 16-bit big-endian unsigned integer. */
+typedef NumType  HBINT16;        /* 16-bit big-endian signed integer. */
+typedef NumType HBUINT32;       /* 32-bit big-endian unsigned integer. */
+typedef NumType  HBINT32;        /* 32-bit big-endian signed integer. */
+typedef NumType HBUINT64;       /* 64-bit big-endian unsigned integer. */
+typedef NumType  HBINT64;        /* 64-bit big-endian signed integer. */
 /* Note: we cannot defined a signed HBINT24 because there's no corresponding C type.
  * Works for unsigned, but not signed, since we rely on compiler for sign-extension. */
-typedef IntType HBUINT24;  /* 24-bit unsigned integer. */
+typedef NumType HBUINT24;    /* 24-bit big-endian unsigned integer. */
+
+typedef NumType HBUINT16LE;    /* 16-bit little-endian unsigned integer. */
+typedef NumType  HBINT16LE;     /* 16-bit little-endian signed integer. */
+typedef NumType HBUINT32LE;    /* 32-bit little-endian unsigned integer. */
+typedef NumType  HBINT32LE;     /* 32-bit little-endian signed integer. */
+typedef NumType HBUINT64LE;    /* 64-bit little-endian unsigned integer. */
+typedef NumType  HBINT64LE;     /* 64-bit little-endian signed integer. */
+
+typedef NumType  HBFLOAT32BE;     /* 32-bit little-endian floating point number. */
+typedef NumType HBFLOAT64BE;     /* 64-bit little-endian floating point number. */
+typedef NumType  HBFLOAT32LE;     /* 32-bit little-endian floating point number. */
+typedef NumType HBFLOAT64LE;     /* 64-bit little-endian floating point number. */
 
 /* 15-bit unsigned number; top bit used for extension. */
 struct HBUINT15 : HBUINT16
@@ -218,7 +240,7 @@
 template 
 struct HBFixed : Type
 {
-  static constexpr float shift = (float) (1 << fraction_bits);
+  static constexpr float mult = 1.f / (1 << fraction_bits);
   static_assert (Type::static_size * 8 > fraction_bits, "");
 
   operator signed () const = delete;
@@ -226,8 +248,8 @@
   explicit operator float () const { return to_float (); }
   typename Type::type to_int () const { return Type::v; }
   void set_int (typename Type::type i ) { Type::v = i; }
-  float to_float (float offset = 0) const  { return ((int32_t) Type::v + offset) / shift; }
-  void set_float (float f) { Type::v = roundf (f * shift); }
+  float to_float (float offset = 0) const  { return ((int32_t) Type::v + offset) * mult; }
+  void set_float (float f) { Type::v = roundf (f / mult); }
   public:
   DEFINE_SIZE_STATIC (Type::static_size);
 };
@@ -504,16 +526,9 @@
     return_trace (sanitize_shallow (c, base) &&
                   hb_barrier () &&
                   (this->is_null () ||
-                   c->dispatch (StructAtOffset (base, *this), std::forward (ds)...) ||
-                   neuter (c)));
+                   c->dispatch (StructAtOffset (base, *this), std::forward (ds)...)));
   }
 
-  /* Set the offset to Null */
-  bool neuter (hb_sanitize_context_t *c) const
-  {
-    if (!has_null) return false;
-    return c->try_set (this, 0);
-  }
   DEFINE_SIZE_STATIC (sizeof (OffsetType));
 };
 /* Partial specializations. */
@@ -1481,8 +1496,8 @@
     VALUE_RUN_COUNT_MASK = 0x3F
   };
 
-  static unsigned compile (hb_array_t values, /* IN */
-                           hb_array_t encoded_bytes /* OUT */)
+  static unsigned compile_unsafe (hb_array_t values, /* IN */
+                                  unsigned char *encoded_bytes /* OUT */)
   {
     unsigned num_values = values.length;
     unsigned encoded_len = 0;
@@ -1491,24 +1506,23 @@
     {
       int val = values.arrayZ[i];
       if (val == 0)
-        encoded_len += encode_value_run_as_zeroes (i, encoded_bytes.sub_array (encoded_len), values);
-      else if (val >= -128 && val <= 127)
-        encoded_len += encode_value_run_as_bytes (i, encoded_bytes.sub_array (encoded_len), values);
-      else if (val >= -32768 && val <= 32767)
-        encoded_len += encode_value_run_as_words (i, encoded_bytes.sub_array (encoded_len), values);
+        encoded_len += encode_value_run_as_zeroes (i, encoded_bytes + encoded_len, values);
+      else if ((int8_t) val == val)
+        encoded_len += encode_value_run_as_bytes (i, encoded_bytes + encoded_len, values);
+      else if ((int16_t) val == val)
+        encoded_len += encode_value_run_as_words (i, encoded_bytes + encoded_len, values);
       else
-        encoded_len += encode_value_run_as_longs (i, encoded_bytes.sub_array (encoded_len), values);
+        encoded_len += encode_value_run_as_longs (i, encoded_bytes + encoded_len, values);
     }
     return encoded_len;
   }
 
   static unsigned encode_value_run_as_zeroes (unsigned& i,
-                                              hb_array_t encoded_bytes,
+                                              unsigned char *it,
                                               hb_array_t values)
   {
     unsigned num_values = values.length;
     unsigned run_length = 0;
-    auto it = encoded_bytes.iter ();
     unsigned encoded_len = 0;
     while (i < num_values && values.arrayZ[i] == 0)
     {
@@ -1532,7 +1546,7 @@
   }
 
   static unsigned encode_value_run_as_bytes (unsigned &i,
-                                             hb_array_t encoded_bytes,
+                                             unsigned char *it,
                                              hb_array_t values)
   {
     unsigned start = i;
@@ -1540,7 +1554,7 @@
     while (i < num_values)
     {
       int val = values.arrayZ[i];
-      if (val > 127 || val < -128)
+      if ((int8_t) val != val)
         break;
 
       /* from fonttools: if there're 2 or more zeros in a sequence,
@@ -1553,7 +1567,6 @@
     unsigned run_length = i - start;
 
     unsigned encoded_len = 0;
-    auto it = encoded_bytes.iter ();
 
     while (run_length >= 64)
     {
@@ -1561,10 +1574,9 @@
       encoded_len++;
 
       for (unsigned j = 0; j < 64; j++)
-      {
-        *it++ = static_cast (values.arrayZ[start + j]);
-        encoded_len++;
-      }
+        it[j] = static_cast (values.arrayZ[start + j]);
+      it += 64;
+      encoded_len += 64;
 
       start += 64;
       run_length -= 64;
@@ -1575,18 +1587,16 @@
       *it++ = (VALUES_ARE_BYTES | (run_length - 1));
       encoded_len++;
 
-      while (start < i)
-      {
-        *it++ = static_cast (values.arrayZ[start++]);
-        encoded_len++;
-      }
+      for (unsigned j = 0; j < run_length; j++)
+        it[j] = static_cast (values.arrayZ[start + j]);
+      encoded_len += run_length;
     }
 
     return encoded_len;
   }
 
   static unsigned encode_value_run_as_words (unsigned &i,
-                                             hb_array_t encoded_bytes,
+                                             unsigned char *it,
                                              hb_array_t values)
   {
     unsigned start = i;
@@ -1595,22 +1605,24 @@
     {
       int val = values.arrayZ[i];
 
-      /* start a new run for a single zero value*/
+      if ((int16_t) val != val)
+        break;
+
+      /* start a new run for a single zero value. */
       if (val == 0) break;
 
-      /* from fonttools: continue word-encoded run if there's only one
+      /* From fonttools: continue word-encoded run if there's only one
        * single value in the range [-128, 127] because it is more compact.
        * Only start a new run when there're 2 continuous such values. */
-      if (val >= -128 && val <= 127 &&
+      if ((int8_t) val == val &&
           i + 1 < num_values &&
-          values.arrayZ[i+1] >= -128 && values.arrayZ[i+1] <= 127)
+          (int8_t) values.arrayZ[i+1] == values.arrayZ[i+1])
         break;
 
       i++;
     }
 
     unsigned run_length = i - start;
-    auto it = encoded_bytes.iter ();
     unsigned encoded_len = 0;
     while (run_length >= 64)
     {
@@ -1647,7 +1659,7 @@
   }
 
   static unsigned encode_value_run_as_longs (unsigned &i,
-                                             hb_array_t encoded_bytes,
+                                             unsigned char *it,
                                              hb_array_t values)
   {
     unsigned start = i;
@@ -1656,14 +1668,13 @@
     {
       int val = values.arrayZ[i];
 
-      if (val >= -32768 && val <= 32767)
+      if ((int16_t) val == val)
         break;
 
       i++;
     }
 
     unsigned run_length = i - start;
-    auto it = encoded_bytes.iter ();
     unsigned encoded_len = 0;
     while (run_length >= 64)
     {
@@ -1704,10 +1715,14 @@
   }
 
   template 
+#ifndef HB_OPTIMIZE_SIZE
+  HB_ALWAYS_INLINE
+#endif
   static bool decompile (const HBUINT8 *&p /* IN/OUT */,
                          hb_vector_t &values /* IN/OUT */,
                          const HBUINT8 *end,
-                         bool consume_all = false)
+                         bool consume_all = false,
+                         unsigned start = 0)
   {
     unsigned i = 0;
     unsigned count = consume_all ? UINT_MAX : values.length;
@@ -1720,19 +1735,24 @@
       unsigned run_count = (control & VALUE_RUN_COUNT_MASK) + 1;
       if (consume_all)
       {
-        if (unlikely (!values.resize (values.length + run_count, false)))
+        if (unlikely (!values.resize_dirty  (values.length + run_count)))
           return false;
       }
       unsigned stop = i + run_count;
       if (unlikely (stop > count)) return false;
+
+      unsigned skip = i < start ? hb_min (start - i, run_count) : 0;
+      i += skip;
+
       if ((control & VALUES_SIZE_MASK) == VALUES_ARE_ZEROS)
       {
-        for (; i < stop; i++)
-          values.arrayZ[i] = 0;
+        hb_memset (&values.arrayZ[i], 0, (stop - i) * sizeof (T));
+        i = stop;
       }
       else if ((control & VALUES_SIZE_MASK) ==  VALUES_ARE_WORDS)
       {
         if (unlikely (p + run_count * HBINT16::static_size > end)) return false;
+        p += skip * HBINT16::static_size;
 #ifndef HB_OPTIMIZE_SIZE
         for (; i + 3 < stop; i += 4)
         {
@@ -1755,6 +1775,7 @@
       else if ((control & VALUES_SIZE_MASK) ==  VALUES_ARE_LONGS)
       {
         if (unlikely (p + run_count * HBINT32::static_size > end)) return false;
+        p += skip * HBINT32::static_size;
         for (; i < stop; i++)
         {
           values.arrayZ[i] = * (const HBINT32 *) p;
@@ -1764,6 +1785,7 @@
       else if ((control & VALUES_SIZE_MASK) ==  VALUES_ARE_BYTES)
       {
         if (unlikely (p + run_count > end)) return false;
+        p += skip * HBINT8::static_size;
 #ifndef HB_OPTIMIZE_SIZE
         for (; i + 3 < stop; i += 4)
         {
@@ -1784,7 +1806,7 @@
   {
     iter_t (const unsigned char *p_, unsigned len_)
             : p (p_), endp (p_ + len_)
-    { if (ensure_run ()) read_value (); }
+    { if (likely (ensure_run ())) read_value (); }
 
     private:
     const unsigned char *p;
@@ -1793,10 +1815,14 @@
     signed run_count = 0;
     unsigned width = 0;
 
+    HB_ALWAYS_INLINE
     bool ensure_run ()
     {
       if (likely (run_count > 0)) return true;
-
+      return _ensure_run ();
+    }
+    bool _ensure_run ()
+    {
       if (unlikely (p >= endp))
       {
         run_count = 0;
@@ -1886,10 +1912,15 @@
     signed run_count = 0;
     unsigned width = 0;
 
+    HB_ALWAYS_INLINE
     bool ensure_run ()
     {
-      if (run_count > 0) return true;
+      if (likely (run_count > 0)) return true;
+      return _ensure_run ();
+    }
 
+    bool _ensure_run ()
+    {
       if (unlikely (p >= end))
       {
         run_count = 0;
@@ -2013,7 +2044,10 @@
       }
 
 #ifndef HB_OPTIMIZE_SIZE
-      if (scale == 1.0f)
+      // The following branch is supposed to speed things up by avoiding
+      // the multiplication in _add_to<> if scale is 1.0f.
+      // But in practice it seems to bloat the code and slow things down.
+      if (false && scale == 1.0f)
         _add_to (out);
       else
 #endif
@@ -2038,6 +2072,23 @@
 };
 
 
+// Alignment
+
+template 
+struct Align
+{
+  unsigned get_size (const void *base) const
+  {
+    unsigned offset = (const char *) this - (const char *) base;
+    return (alignment - offset) & (alignment - 1);
+  }
+
+  public:
+  DEFINE_SIZE_MIN (0);
+};
+
+
+
 } /* namespace OT */
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-cff-common.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff-common.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-cff-common.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff-common.hh	2026-04-17 19:09:35.000000000 +0000
@@ -79,7 +79,7 @@
   {
     TRACE_SERIALIZE (this);
     for (unsigned int i = 0; i < dictval.get_count (); i++)
-      if (unlikely (!opszr.serialize (c, dictval[i], std::forward (ds)...)))
+      if (unlikely (!opszr.serialize (c, dictval[i], ds...)))
         return_trace (false);
 
     return_trace (true);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-std-str.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-std-str.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-std-str.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-std-str.hh	2026-04-17 19:09:35.000000000 +0000
@@ -30,396 +30,396 @@
 #include "hb.hh"
 #endif
 
-_S(".notdef")
-_S("space")
-_S("exclam")
-_S("quotedbl")
-_S("numbersign")
-_S("dollar")
-_S("percent")
-_S("ampersand")
-_S("quoteright")
-_S("parenleft")
-_S("parenright")
-_S("asterisk")
-_S("plus")
-_S("comma")
-_S("hyphen")
-_S("period")
-_S("slash")
-_S("zero")
-_S("one")
-_S("two")
-_S("three")
-_S("four")
-_S("five")
-_S("six")
-_S("seven")
-_S("eight")
-_S("nine")
-_S("colon")
-_S("semicolon")
-_S("less")
-_S("equal")
-_S("greater")
-_S("question")
-_S("at")
-_S("A")
-_S("B")
-_S("C")
-_S("D")
-_S("E")
-_S("F")
-_S("G")
-_S("H")
-_S("I")
-_S("J")
-_S("K")
-_S("L")
-_S("M")
-_S("N")
-_S("O")
-_S("P")
-_S("Q")
-_S("R")
-_S("S")
-_S("T")
-_S("U")
-_S("V")
-_S("W")
-_S("X")
-_S("Y")
-_S("Z")
-_S("bracketleft")
-_S("backslash")
-_S("bracketright")
-_S("asciicircum")
-_S("underscore")
-_S("quoteleft")
-_S("a")
-_S("b")
-_S("c")
-_S("d")
-_S("e")
-_S("f")
-_S("g")
-_S("h")
-_S("i")
-_S("j")
-_S("k")
-_S("l")
-_S("m")
-_S("n")
-_S("o")
-_S("p")
-_S("q")
-_S("r")
-_S("s")
-_S("t")
-_S("u")
-_S("v")
-_S("w")
-_S("x")
-_S("y")
-_S("z")
-_S("braceleft")
-_S("bar")
-_S("braceright")
-_S("asciitilde")
-_S("exclamdown")
-_S("cent")
-_S("sterling")
-_S("fraction")
-_S("yen")
-_S("florin")
-_S("section")
-_S("currency")
-_S("quotesingle")
-_S("quotedblleft")
-_S("guillemotleft")
-_S("guilsinglleft")
-_S("guilsinglright")
-_S("fi")
-_S("fl")
-_S("endash")
-_S("dagger")
-_S("daggerdbl")
-_S("periodcentered")
-_S("paragraph")
-_S("bullet")
-_S("quotesinglbase")
-_S("quotedblbase")
-_S("quotedblright")
-_S("guillemotright")
-_S("ellipsis")
-_S("perthousand")
-_S("questiondown")
-_S("grave")
-_S("acute")
-_S("circumflex")
-_S("tilde")
-_S("macron")
-_S("breve")
-_S("dotaccent")
-_S("dieresis")
-_S("ring")
-_S("cedilla")
-_S("hungarumlaut")
-_S("ogonek")
-_S("caron")
-_S("emdash")
-_S("AE")
-_S("ordfeminine")
-_S("Lslash")
-_S("Oslash")
-_S("OE")
-_S("ordmasculine")
-_S("ae")
-_S("dotlessi")
-_S("lslash")
-_S("oslash")
-_S("oe")
-_S("germandbls")
-_S("onesuperior")
-_S("logicalnot")
-_S("mu")
-_S("trademark")
-_S("Eth")
-_S("onehalf")
-_S("plusminus")
-_S("Thorn")
-_S("onequarter")
-_S("divide")
-_S("brokenbar")
-_S("degree")
-_S("thorn")
-_S("threequarters")
-_S("twosuperior")
-_S("registered")
-_S("minus")
-_S("eth")
-_S("multiply")
-_S("threesuperior")
-_S("copyright")
-_S("Aacute")
-_S("Acircumflex")
-_S("Adieresis")
-_S("Agrave")
-_S("Aring")
-_S("Atilde")
-_S("Ccedilla")
-_S("Eacute")
-_S("Ecircumflex")
-_S("Edieresis")
-_S("Egrave")
-_S("Iacute")
-_S("Icircumflex")
-_S("Idieresis")
-_S("Igrave")
-_S("Ntilde")
-_S("Oacute")
-_S("Ocircumflex")
-_S("Odieresis")
-_S("Ograve")
-_S("Otilde")
-_S("Scaron")
-_S("Uacute")
-_S("Ucircumflex")
-_S("Udieresis")
-_S("Ugrave")
-_S("Yacute")
-_S("Ydieresis")
-_S("Zcaron")
-_S("aacute")
-_S("acircumflex")
-_S("adieresis")
-_S("agrave")
-_S("aring")
-_S("atilde")
-_S("ccedilla")
-_S("eacute")
-_S("ecircumflex")
-_S("edieresis")
-_S("egrave")
-_S("iacute")
-_S("icircumflex")
-_S("idieresis")
-_S("igrave")
-_S("ntilde")
-_S("oacute")
-_S("ocircumflex")
-_S("odieresis")
-_S("ograve")
-_S("otilde")
-_S("scaron")
-_S("uacute")
-_S("ucircumflex")
-_S("udieresis")
-_S("ugrave")
-_S("yacute")
-_S("ydieresis")
-_S("zcaron")
-_S("exclamsmall")
-_S("Hungarumlautsmall")
-_S("dollaroldstyle")
-_S("dollarsuperior")
-_S("ampersandsmall")
-_S("Acutesmall")
-_S("parenleftsuperior")
-_S("parenrightsuperior")
-_S("twodotenleader")
-_S("onedotenleader")
-_S("zerooldstyle")
-_S("oneoldstyle")
-_S("twooldstyle")
-_S("threeoldstyle")
-_S("fouroldstyle")
-_S("fiveoldstyle")
-_S("sixoldstyle")
-_S("sevenoldstyle")
-_S("eightoldstyle")
-_S("nineoldstyle")
-_S("commasuperior")
-_S("threequartersemdash")
-_S("periodsuperior")
-_S("questionsmall")
-_S("asuperior")
-_S("bsuperior")
-_S("centsuperior")
-_S("dsuperior")
-_S("esuperior")
-_S("isuperior")
-_S("lsuperior")
-_S("msuperior")
-_S("nsuperior")
-_S("osuperior")
-_S("rsuperior")
-_S("ssuperior")
-_S("tsuperior")
-_S("ff")
-_S("ffi")
-_S("ffl")
-_S("parenleftinferior")
-_S("parenrightinferior")
-_S("Circumflexsmall")
-_S("hyphensuperior")
-_S("Gravesmall")
-_S("Asmall")
-_S("Bsmall")
-_S("Csmall")
-_S("Dsmall")
-_S("Esmall")
-_S("Fsmall")
-_S("Gsmall")
-_S("Hsmall")
-_S("Ismall")
-_S("Jsmall")
-_S("Ksmall")
-_S("Lsmall")
-_S("Msmall")
-_S("Nsmall")
-_S("Osmall")
-_S("Psmall")
-_S("Qsmall")
-_S("Rsmall")
-_S("Ssmall")
-_S("Tsmall")
-_S("Usmall")
-_S("Vsmall")
-_S("Wsmall")
-_S("Xsmall")
-_S("Ysmall")
-_S("Zsmall")
-_S("colonmonetary")
-_S("onefitted")
-_S("rupiah")
-_S("Tildesmall")
-_S("exclamdownsmall")
-_S("centoldstyle")
-_S("Lslashsmall")
-_S("Scaronsmall")
-_S("Zcaronsmall")
-_S("Dieresissmall")
-_S("Brevesmall")
-_S("Caronsmall")
-_S("Dotaccentsmall")
-_S("Macronsmall")
-_S("figuredash")
-_S("hypheninferior")
-_S("Ogoneksmall")
-_S("Ringsmall")
-_S("Cedillasmall")
-_S("questiondownsmall")
-_S("oneeighth")
-_S("threeeighths")
-_S("fiveeighths")
-_S("seveneighths")
-_S("onethird")
-_S("twothirds")
-_S("zerosuperior")
-_S("foursuperior")
-_S("fivesuperior")
-_S("sixsuperior")
-_S("sevensuperior")
-_S("eightsuperior")
-_S("ninesuperior")
-_S("zeroinferior")
-_S("oneinferior")
-_S("twoinferior")
-_S("threeinferior")
-_S("fourinferior")
-_S("fiveinferior")
-_S("sixinferior")
-_S("seveninferior")
-_S("eightinferior")
-_S("nineinferior")
-_S("centinferior")
-_S("dollarinferior")
-_S("periodinferior")
-_S("commainferior")
-_S("Agravesmall")
-_S("Aacutesmall")
-_S("Acircumflexsmall")
-_S("Atildesmall")
-_S("Adieresissmall")
-_S("Aringsmall")
-_S("AEsmall")
-_S("Ccedillasmall")
-_S("Egravesmall")
-_S("Eacutesmall")
-_S("Ecircumflexsmall")
-_S("Edieresissmall")
-_S("Igravesmall")
-_S("Iacutesmall")
-_S("Icircumflexsmall")
-_S("Idieresissmall")
-_S("Ethsmall")
-_S("Ntildesmall")
-_S("Ogravesmall")
-_S("Oacutesmall")
-_S("Ocircumflexsmall")
-_S("Otildesmall")
-_S("Odieresissmall")
-_S("OEsmall")
-_S("Oslashsmall")
-_S("Ugravesmall")
-_S("Uacutesmall")
-_S("Ucircumflexsmall")
-_S("Udieresissmall")
-_S("Yacutesmall")
-_S("Thornsmall")
-_S("Ydieresissmall")
-_S("001.000")
-_S("001.001")
-_S("001.002")
-_S("001.003")
-_S("Black")
-_S("Bold")
-_S("Book")
-_S("Light")
-_S("Medium")
-_S("Regular")
-_S("Roman")
-_S("Semibold")
+HB_STR(".notdef")
+HB_STR("space")
+HB_STR("exclam")
+HB_STR("quotedbl")
+HB_STR("numbersign")
+HB_STR("dollar")
+HB_STR("percent")
+HB_STR("ampersand")
+HB_STR("quoteright")
+HB_STR("parenleft")
+HB_STR("parenright")
+HB_STR("asterisk")
+HB_STR("plus")
+HB_STR("comma")
+HB_STR("hyphen")
+HB_STR("period")
+HB_STR("slash")
+HB_STR("zero")
+HB_STR("one")
+HB_STR("two")
+HB_STR("three")
+HB_STR("four")
+HB_STR("five")
+HB_STR("six")
+HB_STR("seven")
+HB_STR("eight")
+HB_STR("nine")
+HB_STR("colon")
+HB_STR("semicolon")
+HB_STR("less")
+HB_STR("equal")
+HB_STR("greater")
+HB_STR("question")
+HB_STR("at")
+HB_STR("A")
+HB_STR("B")
+HB_STR("C")
+HB_STR("D")
+HB_STR("E")
+HB_STR("F")
+HB_STR("G")
+HB_STR("H")
+HB_STR("I")
+HB_STR("J")
+HB_STR("K")
+HB_STR("L")
+HB_STR("M")
+HB_STR("N")
+HB_STR("O")
+HB_STR("P")
+HB_STR("Q")
+HB_STR("R")
+HB_STR("S")
+HB_STR("T")
+HB_STR("U")
+HB_STR("V")
+HB_STR("W")
+HB_STR("X")
+HB_STR("Y")
+HB_STR("Z")
+HB_STR("bracketleft")
+HB_STR("backslash")
+HB_STR("bracketright")
+HB_STR("asciicircum")
+HB_STR("underscore")
+HB_STR("quoteleft")
+HB_STR("a")
+HB_STR("b")
+HB_STR("c")
+HB_STR("d")
+HB_STR("e")
+HB_STR("f")
+HB_STR("g")
+HB_STR("h")
+HB_STR("i")
+HB_STR("j")
+HB_STR("k")
+HB_STR("l")
+HB_STR("m")
+HB_STR("n")
+HB_STR("o")
+HB_STR("p")
+HB_STR("q")
+HB_STR("r")
+HB_STR("s")
+HB_STR("t")
+HB_STR("u")
+HB_STR("v")
+HB_STR("w")
+HB_STR("x")
+HB_STR("y")
+HB_STR("z")
+HB_STR("braceleft")
+HB_STR("bar")
+HB_STR("braceright")
+HB_STR("asciitilde")
+HB_STR("exclamdown")
+HB_STR("cent")
+HB_STR("sterling")
+HB_STR("fraction")
+HB_STR("yen")
+HB_STR("florin")
+HB_STR("section")
+HB_STR("currency")
+HB_STR("quotesingle")
+HB_STR("quotedblleft")
+HB_STR("guillemotleft")
+HB_STR("guilsinglleft")
+HB_STR("guilsinglright")
+HB_STR("fi")
+HB_STR("fl")
+HB_STR("endash")
+HB_STR("dagger")
+HB_STR("daggerdbl")
+HB_STR("periodcentered")
+HB_STR("paragraph")
+HB_STR("bullet")
+HB_STR("quotesinglbase")
+HB_STR("quotedblbase")
+HB_STR("quotedblright")
+HB_STR("guillemotright")
+HB_STR("ellipsis")
+HB_STR("perthousand")
+HB_STR("questiondown")
+HB_STR("grave")
+HB_STR("acute")
+HB_STR("circumflex")
+HB_STR("tilde")
+HB_STR("macron")
+HB_STR("breve")
+HB_STR("dotaccent")
+HB_STR("dieresis")
+HB_STR("ring")
+HB_STR("cedilla")
+HB_STR("hungarumlaut")
+HB_STR("ogonek")
+HB_STR("caron")
+HB_STR("emdash")
+HB_STR("AE")
+HB_STR("ordfeminine")
+HB_STR("Lslash")
+HB_STR("Oslash")
+HB_STR("OE")
+HB_STR("ordmasculine")
+HB_STR("ae")
+HB_STR("dotlessi")
+HB_STR("lslash")
+HB_STR("oslash")
+HB_STR("oe")
+HB_STR("germandbls")
+HB_STR("onesuperior")
+HB_STR("logicalnot")
+HB_STR("mu")
+HB_STR("trademark")
+HB_STR("Eth")
+HB_STR("onehalf")
+HB_STR("plusminus")
+HB_STR("Thorn")
+HB_STR("onequarter")
+HB_STR("divide")
+HB_STR("brokenbar")
+HB_STR("degree")
+HB_STR("thorn")
+HB_STR("threequarters")
+HB_STR("twosuperior")
+HB_STR("registered")
+HB_STR("minus")
+HB_STR("eth")
+HB_STR("multiply")
+HB_STR("threesuperior")
+HB_STR("copyright")
+HB_STR("Aacute")
+HB_STR("Acircumflex")
+HB_STR("Adieresis")
+HB_STR("Agrave")
+HB_STR("Aring")
+HB_STR("Atilde")
+HB_STR("Ccedilla")
+HB_STR("Eacute")
+HB_STR("Ecircumflex")
+HB_STR("Edieresis")
+HB_STR("Egrave")
+HB_STR("Iacute")
+HB_STR("Icircumflex")
+HB_STR("Idieresis")
+HB_STR("Igrave")
+HB_STR("Ntilde")
+HB_STR("Oacute")
+HB_STR("Ocircumflex")
+HB_STR("Odieresis")
+HB_STR("Ograve")
+HB_STR("Otilde")
+HB_STR("Scaron")
+HB_STR("Uacute")
+HB_STR("Ucircumflex")
+HB_STR("Udieresis")
+HB_STR("Ugrave")
+HB_STR("Yacute")
+HB_STR("Ydieresis")
+HB_STR("Zcaron")
+HB_STR("aacute")
+HB_STR("acircumflex")
+HB_STR("adieresis")
+HB_STR("agrave")
+HB_STR("aring")
+HB_STR("atilde")
+HB_STR("ccedilla")
+HB_STR("eacute")
+HB_STR("ecircumflex")
+HB_STR("edieresis")
+HB_STR("egrave")
+HB_STR("iacute")
+HB_STR("icircumflex")
+HB_STR("idieresis")
+HB_STR("igrave")
+HB_STR("ntilde")
+HB_STR("oacute")
+HB_STR("ocircumflex")
+HB_STR("odieresis")
+HB_STR("ograve")
+HB_STR("otilde")
+HB_STR("scaron")
+HB_STR("uacute")
+HB_STR("ucircumflex")
+HB_STR("udieresis")
+HB_STR("ugrave")
+HB_STR("yacute")
+HB_STR("ydieresis")
+HB_STR("zcaron")
+HB_STR("exclamsmall")
+HB_STR("Hungarumlautsmall")
+HB_STR("dollaroldstyle")
+HB_STR("dollarsuperior")
+HB_STR("ampersandsmall")
+HB_STR("Acutesmall")
+HB_STR("parenleftsuperior")
+HB_STR("parenrightsuperior")
+HB_STR("twodotenleader")
+HB_STR("onedotenleader")
+HB_STR("zerooldstyle")
+HB_STR("oneoldstyle")
+HB_STR("twooldstyle")
+HB_STR("threeoldstyle")
+HB_STR("fouroldstyle")
+HB_STR("fiveoldstyle")
+HB_STR("sixoldstyle")
+HB_STR("sevenoldstyle")
+HB_STR("eightoldstyle")
+HB_STR("nineoldstyle")
+HB_STR("commasuperior")
+HB_STR("threequartersemdash")
+HB_STR("periodsuperior")
+HB_STR("questionsmall")
+HB_STR("asuperior")
+HB_STR("bsuperior")
+HB_STR("centsuperior")
+HB_STR("dsuperior")
+HB_STR("esuperior")
+HB_STR("isuperior")
+HB_STR("lsuperior")
+HB_STR("msuperior")
+HB_STR("nsuperior")
+HB_STR("osuperior")
+HB_STR("rsuperior")
+HB_STR("ssuperior")
+HB_STR("tsuperior")
+HB_STR("ff")
+HB_STR("ffi")
+HB_STR("ffl")
+HB_STR("parenleftinferior")
+HB_STR("parenrightinferior")
+HB_STR("Circumflexsmall")
+HB_STR("hyphensuperior")
+HB_STR("Gravesmall")
+HB_STR("Asmall")
+HB_STR("Bsmall")
+HB_STR("Csmall")
+HB_STR("Dsmall")
+HB_STR("Esmall")
+HB_STR("Fsmall")
+HB_STR("Gsmall")
+HB_STR("Hsmall")
+HB_STR("Ismall")
+HB_STR("Jsmall")
+HB_STR("Ksmall")
+HB_STR("Lsmall")
+HB_STR("Msmall")
+HB_STR("Nsmall")
+HB_STR("Osmall")
+HB_STR("Psmall")
+HB_STR("Qsmall")
+HB_STR("Rsmall")
+HB_STR("Ssmall")
+HB_STR("Tsmall")
+HB_STR("Usmall")
+HB_STR("Vsmall")
+HB_STR("Wsmall")
+HB_STR("Xsmall")
+HB_STR("Ysmall")
+HB_STR("Zsmall")
+HB_STR("colonmonetary")
+HB_STR("onefitted")
+HB_STR("rupiah")
+HB_STR("Tildesmall")
+HB_STR("exclamdownsmall")
+HB_STR("centoldstyle")
+HB_STR("Lslashsmall")
+HB_STR("Scaronsmall")
+HB_STR("Zcaronsmall")
+HB_STR("Dieresissmall")
+HB_STR("Brevesmall")
+HB_STR("Caronsmall")
+HB_STR("Dotaccentsmall")
+HB_STR("Macronsmall")
+HB_STR("figuredash")
+HB_STR("hypheninferior")
+HB_STR("Ogoneksmall")
+HB_STR("Ringsmall")
+HB_STR("Cedillasmall")
+HB_STR("questiondownsmall")
+HB_STR("oneeighth")
+HB_STR("threeeighths")
+HB_STR("fiveeighths")
+HB_STR("seveneighths")
+HB_STR("onethird")
+HB_STR("twothirds")
+HB_STR("zerosuperior")
+HB_STR("foursuperior")
+HB_STR("fivesuperior")
+HB_STR("sixsuperior")
+HB_STR("sevensuperior")
+HB_STR("eightsuperior")
+HB_STR("ninesuperior")
+HB_STR("zeroinferior")
+HB_STR("oneinferior")
+HB_STR("twoinferior")
+HB_STR("threeinferior")
+HB_STR("fourinferior")
+HB_STR("fiveinferior")
+HB_STR("sixinferior")
+HB_STR("seveninferior")
+HB_STR("eightinferior")
+HB_STR("nineinferior")
+HB_STR("centinferior")
+HB_STR("dollarinferior")
+HB_STR("periodinferior")
+HB_STR("commainferior")
+HB_STR("Agravesmall")
+HB_STR("Aacutesmall")
+HB_STR("Acircumflexsmall")
+HB_STR("Atildesmall")
+HB_STR("Adieresissmall")
+HB_STR("Aringsmall")
+HB_STR("AEsmall")
+HB_STR("Ccedillasmall")
+HB_STR("Egravesmall")
+HB_STR("Eacutesmall")
+HB_STR("Ecircumflexsmall")
+HB_STR("Edieresissmall")
+HB_STR("Igravesmall")
+HB_STR("Iacutesmall")
+HB_STR("Icircumflexsmall")
+HB_STR("Idieresissmall")
+HB_STR("Ethsmall")
+HB_STR("Ntildesmall")
+HB_STR("Ogravesmall")
+HB_STR("Oacutesmall")
+HB_STR("Ocircumflexsmall")
+HB_STR("Otildesmall")
+HB_STR("Odieresissmall")
+HB_STR("OEsmall")
+HB_STR("Oslashsmall")
+HB_STR("Ugravesmall")
+HB_STR("Uacutesmall")
+HB_STR("Ucircumflexsmall")
+HB_STR("Udieresissmall")
+HB_STR("Yacutesmall")
+HB_STR("Thornsmall")
+HB_STR("Ydieresissmall")
+HB_STR("001.000")
+HB_STR("001.001")
+HB_STR("001.002")
+HB_STR("001.003")
+HB_STR("Black")
+HB_STR("Bold")
+HB_STR("Book")
+HB_STR("Light")
+HB_STR("Medium")
+HB_STR("Regular")
+HB_STR("Roman")
+HB_STR("Semibold")
 
 #endif /* HB_OT_CFF1_STD_STR_HH */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff1-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -326,7 +326,7 @@
 
   void collect_glyph_to_sid_map (glyph_to_sid_map_t *mapping, unsigned int num_glyphs) const
   {
-    mapping->resize (num_glyphs, false);
+    mapping->resize_dirty  (num_glyphs);
     for (hb_codepoint_t gid = 1; gid < num_glyphs; gid++)
       mapping->arrayZ[gid] = {sids[gid - 1], gid};
   }
@@ -426,7 +426,7 @@
 
   void collect_glyph_to_sid_map (glyph_to_sid_map_t *mapping, unsigned int num_glyphs) const
   {
-    mapping->resize (num_glyphs, false);
+    mapping->resize_dirty  (num_glyphs);
     hb_codepoint_t gid = 1;
     if (gid >= num_glyphs)
       return;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-cff2-table.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff2-table.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-cff2-table.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cff2-table.cc	2026-04-17 19:09:35.000000000 +0000
@@ -202,7 +202,11 @@
 
 bool OT::cff2::accelerator_t::get_path (hb_font_t *font, hb_codepoint_t glyph, hb_draw_session_t &draw_session) const
 {
-  return get_path_at (font, glyph, draw_session, hb_array (font->coords, font->num_coords));
+  return get_path_at (font,
+                      glyph,
+                      draw_session,
+                      hb_array (font->coords,
+                                font->has_nonzero_coords ? font->num_coords : 0));
 }
 
 bool OT::cff2::accelerator_t::get_path_at (hb_font_t *font, hb_codepoint_t glyph, hb_draw_session_t &draw_session, hb_array_t coords) const
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-cmap-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cmap-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-cmap-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-cmap-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -501,10 +501,6 @@
     this->length = c->length () - table_initpos;
     if ((long long) this->length != (long long) c->length () - table_initpos)
     {
-      // Length overflowed. Discard the current object before setting the error condition, otherwise
-      // discard is a noop which prevents the higher level code from reverting the serializer to the
-      // pre-error state in cmap4 overflow handling code.
-      c->pop_discard ();
       c->err (HB_SERIALIZE_ERROR_INT_OVERFLOW);
       return;
     }
@@ -701,16 +697,7 @@
     hb_barrier ();
 
     if (unlikely (!c->check_range (this, length)))
-    {
-      /* Some broken fonts have too long of a "length" value.
-       * If that is the case, just change the value to truncate
-       * the subtable at the end of the blob. */
-      uint16_t new_length = (uint16_t) hb_min ((uintptr_t) 65535,
-                                               (uintptr_t) (c->end -
-                                                            (char *) this));
-      if (!c->try_set (&length, new_length))
-        return_trace (false);
-    }
+      return_trace (false);
 
     return_trace (16 + 4 * (unsigned int) segCountX2 <= length);
   }
@@ -1500,7 +1487,7 @@
   bool get_glyph (hb_codepoint_t codepoint,
                   hb_codepoint_t *glyph) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case  0: hb_barrier (); return u.format0 .get_glyph (codepoint, glyph);
     case  4: hb_barrier (); return u.format4 .get_glyph (codepoint, glyph);
     case  6: hb_barrier (); return u.format6 .get_glyph (codepoint, glyph);
@@ -1513,7 +1500,7 @@
   }
   void collect_unicodes (hb_set_t *out, unsigned int num_glyphs = UINT_MAX) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case  0: hb_barrier (); u.format0 .collect_unicodes (out); return;
     case  4: hb_barrier (); u.format4 .collect_unicodes (out); return;
     case  6: hb_barrier (); u.format6 .collect_unicodes (out); return;
@@ -1529,7 +1516,7 @@
                         hb_map_t *mapping, /* OUT */
                         unsigned num_glyphs = UINT_MAX) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case  0: hb_barrier (); u.format0 .collect_mapping (unicodes, mapping); return;
     case  4: hb_barrier (); u.format4 .collect_mapping (unicodes, mapping); return;
     case  6: hb_barrier (); u.format6 .collect_mapping (unicodes, mapping); return;
@@ -1543,7 +1530,7 @@
 
   unsigned get_language () const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case  0: hb_barrier (); return u.format0 .get_language ();
     case  4: hb_barrier (); return u.format4 .get_language ();
     case  6: hb_barrier (); return u.format6 .get_language ();
@@ -1574,9 +1561,9 @@
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return_trace (false);
+    if (!u.format.v.sanitize (c)) return_trace (false);
     hb_barrier ();
-    switch (u.format) {
+    switch (u.format.v) {
     case  0: hb_barrier (); return_trace (u.format0 .sanitize (c));
     case  4: hb_barrier (); return_trace (u.format4 .sanitize (c));
     case  6: hb_barrier (); return_trace (u.format6 .sanitize (c));
@@ -1590,7 +1577,7 @@
 
   public:
   union {
-  HBUINT16              format;         /* Format identifier */
+  struct { HBUINT16 v; }        format;         /* Format identifier */
   CmapSubtableFormat0   format0;
   CmapSubtableFormat4   format4;
   CmapSubtableFormat6   format6;
@@ -1600,7 +1587,7 @@
   CmapSubtableFormat14  format14;
   } u;
   public:
-  DEFINE_SIZE_UNION (2, format);
+  DEFINE_SIZE_UNION (2, format.v);
 };
 
 
@@ -1646,7 +1633,7 @@
       CmapSubtable *cmapsubtable = c->push ();
       unsigned origin_length = c->length ();
       cmapsubtable->serialize (c, it, format, plan, &(base+subtable));
-      if (c->length () - origin_length > 0) *objidx = c->pop_pack ();
+      if (c->length () - origin_length > 0 && !c->in_error()) *objidx = c->pop_pack ();
       else c->pop_discard ();
     }
 
@@ -1683,6 +1670,10 @@
   {
     SubtableUnicodesCache* cache =
         (SubtableUnicodesCache*) hb_malloc (sizeof(SubtableUnicodesCache));
+
+    if (unlikely (!cache))
+      return nullptr;
+
     new (cache) SubtableUnicodesCache (source_table);
     return cache;
   }
@@ -1776,6 +1767,10 @@
     ;
 
     SubtableUnicodesCache* cache = SubtableUnicodesCache::create(source_table);
+
+    if (unlikely (!cache))
+      return nullptr;
+
     for (const EncodingRecord& _ : it)
       cache->set_for(&_); // populate the cache for this encoding record.
 
@@ -1810,7 +1805,7 @@
       if (c->in_error ())
         return false;
 
-      unsigned format = (base+_.subtable).u.format;
+      unsigned format = (base+_.subtable).u.format.v;
       if (format != 4 && format != 12 && format != 14) continue;
 
       const hb_set_t* unicodes_set = unicodes_cache->set_for (&_, local_unicodes_cache);
@@ -1912,7 +1907,7 @@
     + hb_iter (encodingRecord)
     | hb_map (&EncodingRecord::subtable)
     | hb_map (hb_add (this))
-    | hb_filter ([&] (const CmapSubtable& _) { return _.u.format == 14; })
+    | hb_filter ([&] (const CmapSubtable& _) { return _.u.format.v == 14; })
     | hb_apply ([=] (const CmapSubtable& _) { _.u.format14.closure_glyphs (unicodes, glyphset); })
     ;
   }
@@ -1937,7 +1932,7 @@
 
     for (const EncodingRecord& _ : encodingrec_iter)
     {
-      unsigned format = (this + _.subtable).u.format;
+      unsigned format = (this + _.subtable).u.format.v;
       if (format == 12) has_format12 = true;
 
       const EncodingRecord *table = std::addressof (_);
@@ -2025,7 +2020,7 @@
       this->subtable_uvs = &Null (CmapSubtableFormat14);
       {
         const CmapSubtable *st = table->find_subtable (0, 5);
-        if (st && st->u.format == 14)
+        if (st && st->u.format.v == 14)
           subtable_uvs = &st->u.format14;
       }
 
@@ -2069,7 +2064,7 @@
       else
 #endif
       {
-        switch (subtable->u.format) {
+        switch (subtable->u.format.v) {
           /* Accelerate format 4 and format 12. */
           default:
             this->get_glyph_funcZ = get_glyph_from;
@@ -2276,7 +2271,7 @@
         (_.platformID == 0 && _.encodingID == 4) ||
         (_.platformID == 3 && _.encodingID == 1) ||
         (_.platformID == 3 && _.encodingID == 10) ||
-        (cmap + _.subtable).u.format == 14;
+        (cmap + _.subtable).u.format.v == 14;
   }
 
   protected:
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-font.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-font.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-font.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-font.cc	2026-04-17 19:09:35.000000000 +0000
@@ -37,6 +37,7 @@
 
 #include "hb-ot-cmap-table.hh"
 #include "hb-ot-glyf-table.hh"
+#include "hb-ot-var-gvar-table.hh"
 #include "hb-ot-cff2-table.hh"
 #include "hb-ot-cff1-table.hh"
 #include "hb-ot-hmtx-table.hh"
@@ -64,18 +65,22 @@
 using hb_ot_font_advance_cache_t = hb_cache_t<24, 16>;
 static_assert (sizeof (hb_ot_font_advance_cache_t) == 1024, "");
 
+using hb_ot_font_origin_cache_t = hb_cache_t<20, 20>;
+static_assert (sizeof (hb_ot_font_origin_cache_t) == 1024, "");
+
 struct hb_ot_font_t
 {
   const hb_ot_face_t *ot_face;
 
-  /* h_advance caching */
+  mutable hb_atomic_t cached_serial;
   mutable hb_atomic_t cached_coords_serial;
-  struct advance_cache_t
+
+  struct direction_cache_t
   {
     mutable hb_atomic_t advance_cache;
-    mutable hb_atomic_t varStore_cache;
+    mutable hb_atomic_t varStore_cache;
 
-    ~advance_cache_t ()
+    ~direction_cache_t ()
     {
       clear ();
     }
@@ -116,7 +121,7 @@
         goto retry;
     }
 
-    OT::ItemVariationStore::cache_t *acquire_varStore_cache (const OT::ItemVariationStore &varStore) const
+    OT::hb_scalar_cache_t *acquire_varStore_cache (const OT::ItemVariationStore &varStore) const
     {
     retry:
       auto *cache = varStore_cache.get_acquire ();
@@ -127,7 +132,7 @@
       else
         goto retry;
     }
-    void release_varStore_cache (OT::ItemVariationStore::cache_t *cache) const
+    void release_varStore_cache (OT::hb_scalar_cache_t *cache) const
     {
       if (!cache)
         return;
@@ -154,17 +159,157 @@
 
   } h, v;
 
+  struct origin_cache_t
+  {
+    mutable hb_atomic_t origin_cache;
+    mutable hb_atomic_t varStore_cache;
+
+    ~origin_cache_t ()
+    {
+      clear ();
+    }
+
+    hb_ot_font_origin_cache_t *acquire_origin_cache () const
+    {
+    retry:
+      auto *cache = origin_cache.get_acquire ();
+      if (!cache)
+      {
+        cache = (hb_ot_font_origin_cache_t *) hb_malloc (sizeof (hb_ot_font_origin_cache_t));
+        if (!cache)
+          return nullptr;
+        new (cache) hb_ot_font_origin_cache_t;
+        return cache;
+      }
+      if (origin_cache.cmpexch (cache, nullptr))
+        return cache;
+      else
+        goto retry;
+    }
+    void release_origin_cache (hb_ot_font_origin_cache_t *cache) const
+    {
+      if (!cache)
+        return;
+      if (!origin_cache.cmpexch (nullptr, cache))
+        hb_free (cache);
+    }
+    void clear_origin_cache () const
+    {
+    retry:
+      auto *cache = origin_cache.get_acquire ();
+      if (!cache)
+        return;
+      if (origin_cache.cmpexch (cache, nullptr))
+        hb_free (cache);
+      else
+        goto retry;
+    }
+
+    OT::hb_scalar_cache_t *acquire_varStore_cache (const OT::ItemVariationStore &varStore) const
+    {
+    retry:
+      auto *cache = varStore_cache.get_acquire ();
+      if (!cache)
+        return varStore.create_cache ();
+      if (varStore_cache.cmpexch (cache, nullptr))
+        return cache;
+      else
+        goto retry;
+    }
+    void release_varStore_cache (OT::hb_scalar_cache_t *cache) const
+    {
+      if (!cache)
+        return;
+      if (!varStore_cache.cmpexch (nullptr, cache))
+        OT::ItemVariationStore::destroy_cache (cache);
+    }
+    void clear_varStore_cache () const
+    {
+    retry:
+      auto *cache = varStore_cache.get_acquire ();
+      if (!cache)
+        return;
+      if (varStore_cache.cmpexch (cache, nullptr))
+        OT::ItemVariationStore::destroy_cache (cache);
+      else
+        goto retry;
+    }
+
+    void clear () const
+    {
+      clear_origin_cache ();
+      clear_varStore_cache ();
+    }
+  } v_origin;
+
+  struct draw_cache_t
+  {
+    mutable hb_atomic_t gvar_cache;
+
+    ~draw_cache_t ()
+    {
+      clear ();
+    }
+
+    OT::hb_scalar_cache_t *acquire_gvar_cache (const OT::gvar_accelerator_t &gvar) const
+    {
+    retry:
+      auto *cache = gvar_cache.get_acquire ();
+      if (!cache)
+        return gvar.create_cache ();
+      if (gvar_cache.cmpexch (cache, nullptr))
+        return cache;
+      else
+        goto retry;
+    }
+    void release_gvar_cache (OT::hb_scalar_cache_t *cache) const
+    {
+      if (!cache)
+        return;
+      if (!gvar_cache.cmpexch (nullptr, cache))
+        OT::gvar_accelerator_t::destroy_cache (cache);
+    }
+    void clear_gvar_cache () const
+    {
+    retry:
+      auto *cache = gvar_cache.get_acquire ();
+      if (!cache)
+        return;
+      if (gvar_cache.cmpexch (cache, nullptr))
+        OT::gvar_accelerator_t::destroy_cache (cache);
+      else
+        goto retry;
+    }
+
+    void clear () const
+    {
+      clear_gvar_cache ();
+    }
+  } draw;
+
   void check_serial (hb_font_t *font) const
   {
     int font_serial = font->serial_coords.get_acquire ();
+    if (cached_serial.get_acquire () != font_serial)
+    {
+      /* These caches are dependent on scale and synthetic settings.
+       * Any change to the font invalidates them. */
+      v_origin.clear ();
 
-    if (cached_coords_serial.get_acquire () == font_serial)
-      return;
+      cached_serial.set_release (font_serial);
+    }
 
-    h.clear ();
-    v.clear ();
+    int font_serial_coords = font->serial_coords.get_acquire ();
+    if (cached_coords_serial.get_acquire () != font_serial_coords)
+    {
+      /* These caches are independent of scale or synthetic settings.
+       * Just variation changes will invalidate them. */
+      h.clear ();
+      v.clear ();
+      draw.clear ();
 
-    cached_coords_serial.set_release (font_serial);
+      cached_coords_serial.set_release (font_serial_coords);
+    }
   }
 };
 
@@ -242,37 +387,92 @@
                             unsigned advance_stride,
                             void *user_data HB_UNUSED)
 {
+  // Duplicated in v_advances. Ugly. Keep in sync'ish.
 
   const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
   const hb_ot_face_t *ot_face = ot_font->ot_face;
   const OT::hmtx_accelerator_t &hmtx = *ot_face->hmtx;
 
-  ot_font->check_serial (font);
-  const OT::HVAR &HVAR = *hmtx.var_table;
-  const OT::ItemVariationStore &varStore = &HVAR + HVAR.varStore;
-  OT::ItemVariationStore::cache_t *varStore_cache = ot_font->h.acquire_varStore_cache (varStore);
+  if (unlikely (!hmtx.has_data ()))
+  {
+    hb_position_t advance = font->face->get_upem () / 2;
+    advance = font->em_scale_x (advance);
+    for (unsigned int i = 0; i < count; i++)
+    {
+      *first_advance = advance;
+      first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride);
+    }
+    return;
+  }
+
+#ifndef HB_NO_VAR
+  if (!font->has_nonzero_coords)
+  {
+  fallback:
+#else
+  {
+#endif
+    // Just plain htmx data. No need to cache.
+    for (unsigned int i = 0; i < count; i++)
+    {
+      *first_advance = font->em_scale_x (hmtx.get_advance_without_var_unscaled (*first_glyph));
+      first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride);
+      first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride);
+    }
+    return;
+  }
 
-  hb_ot_font_advance_cache_t *advance_cache = nullptr;
+#ifndef HB_NO_VAR
+  /* has_nonzero_coords. */
 
-  bool use_cache = font->num_coords;
-  if (use_cache)
+  ot_font->check_serial (font);
+  hb_ot_font_advance_cache_t *advance_cache = ot_font->h.acquire_advance_cache ();
+  if (!advance_cache)
   {
-    advance_cache = ot_font->h.acquire_advance_cache ();
-    if (!advance_cache)
-      use_cache = false;
+    // malloc failure. Just use the fallback non-variable path.
+    goto fallback;
   }
 
-  if (!use_cache)
+  /* If HVAR is present, use it.*/
+  const OT::HVAR &HVAR = *hmtx.var_table;
+  if (HVAR.has_data ())
   {
+    const OT::ItemVariationStore &varStore = &HVAR + HVAR.varStore;
+    OT::hb_scalar_cache_t *varStore_cache = ot_font->h.acquire_varStore_cache (varStore);
+
     for (unsigned int i = 0; i < count; i++)
     {
-      *first_advance = font->em_scale_x (hmtx.get_advance_with_var_unscaled (*first_glyph, font, varStore_cache));
+      hb_position_t v;
+      unsigned cv;
+      if (advance_cache->get (*first_glyph, &cv))
+        v = cv;
+      else
+      {
+        v = hmtx.get_advance_with_var_unscaled (*first_glyph, font, varStore_cache);
+        advance_cache->set (*first_glyph, v);
+      }
+      *first_advance = font->em_scale_x (v);
       first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride);
       first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride);
     }
+
+    ot_font->h.release_varStore_cache (varStore_cache);
+    ot_font->h.release_advance_cache (advance_cache);
+    return;
   }
-  else
-  { /* Use cache. */
+
+  const auto &gvar = *ot_face->gvar;
+  if (gvar.has_data ())
+  {
+    const auto &glyf = *ot_face->glyf;
+    auto *scratch = glyf.acquire_scratch ();
+    if (unlikely (!scratch))
+    {
+      ot_font->h.release_advance_cache (advance_cache);
+      goto fallback;
+    }
+    OT::hb_scalar_cache_t *gvar_cache = ot_font->draw.acquire_gvar_cache (gvar);
+
     for (unsigned int i = 0; i < count; i++)
     {
       hb_position_t v;
@@ -281,7 +481,7 @@
         v = cv;
       else
       {
-        v = hmtx.get_advance_with_var_unscaled (*first_glyph, font, varStore_cache);
+        v = glyf.get_advance_with_var_unscaled (*first_glyph, font, false, *scratch, gvar_cache);
         advance_cache->set (*first_glyph, v);
       }
       *first_advance = font->em_scale_x (v);
@@ -289,10 +489,16 @@
       first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride);
     }
 
+    ot_font->draw.release_gvar_cache (gvar_cache);
+    glyf.release_scratch (scratch);
     ot_font->h.release_advance_cache (advance_cache);
+    return;
   }
 
-  ot_font->h.release_varStore_cache (varStore_cache);
+  ot_font->h.release_advance_cache (advance_cache);
+  // No HVAR or GVAR.  Just use the fallback non-variable path.
+  goto fallback;
+#endif
 }
 
 #ifndef HB_NO_VERTICAL
@@ -305,99 +511,290 @@
                             unsigned advance_stride,
                             void *user_data HB_UNUSED)
 {
+  // Duplicated from h_advances. Ugly. Keep in sync'ish.
+
   const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
   const hb_ot_face_t *ot_face = ot_font->ot_face;
   const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx;
 
-  if (vmtx.has_data ())
+  if (unlikely (!vmtx.has_data ()))
+  {
+    hb_font_extents_t font_extents;
+    font->get_h_extents_with_fallback (&font_extents);
+    hb_position_t advance = font_extents.descender - font_extents.ascender;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      *first_advance = advance;
+      first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride);
+    }
+    return;
+  }
+
+#ifndef HB_NO_VAR
+  if (!font->has_nonzero_coords)
+  {
+  fallback:
+#else
+  {
+#endif
+    // Just plain vtmx data. No need to cache.
+    for (unsigned int i = 0; i < count; i++)
+    {
+      *first_advance = font->em_scale_y (- (int) vmtx.get_advance_without_var_unscaled (*first_glyph));
+      first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride);
+      first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride);
+    }
+    return;
+  }
+
+#ifndef HB_NO_VAR
+  /* has_nonzero_coords. */
+
+  ot_font->check_serial (font);
+  hb_ot_font_advance_cache_t *advance_cache = ot_font->v.acquire_advance_cache ();
+  if (!advance_cache)
+  {
+    // malloc failure. Just use the fallback non-variable path.
+    goto fallback;
+  }
+
+  /* If VVAR is present, use it.*/
+  const OT::VVAR &VVAR = *vmtx.var_table;
+  if (VVAR.has_data ())
   {
-    ot_font->check_serial (font);
-    const OT::VVAR &VVAR = *vmtx.var_table;
     const OT::ItemVariationStore &varStore = &VVAR + VVAR.varStore;
-    OT::ItemVariationStore::cache_t *varStore_cache = ot_font->v.acquire_varStore_cache (varStore);
-    // TODO Use advance_cache.
+    OT::hb_scalar_cache_t *varStore_cache = ot_font->v.acquire_varStore_cache (varStore);
 
     for (unsigned int i = 0; i < count; i++)
     {
-      *first_advance = font->em_scale_y (-(int) vmtx.get_advance_with_var_unscaled (*first_glyph, font, varStore_cache));
+      hb_position_t v;
+      unsigned cv;
+      if (advance_cache->get (*first_glyph, &cv))
+        v = cv;
+      else
+      {
+        v = vmtx.get_advance_with_var_unscaled (*first_glyph, font, varStore_cache);
+        advance_cache->set (*first_glyph, v);
+      }
+      *first_advance = font->em_scale_y (- (int) v);
       first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride);
       first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride);
     }
 
     ot_font->v.release_varStore_cache (varStore_cache);
+    ot_font->v.release_advance_cache (advance_cache);
+    return;
   }
-  else
+
+  const auto &gvar = *ot_face->gvar;
+  if (gvar.has_data ())
   {
-    hb_font_extents_t font_extents;
-    font->get_h_extents_with_fallback (&font_extents);
-    hb_position_t advance = -(font_extents.ascender - font_extents.descender);
+    const auto &glyf = *ot_face->glyf;
+    auto *scratch = glyf.acquire_scratch ();
+    if (unlikely (!scratch))
+    {
+      ot_font->v.release_advance_cache (advance_cache);
+      goto fallback;
+    }
+    OT::hb_scalar_cache_t *gvar_cache = ot_font->draw.acquire_gvar_cache (gvar);
 
     for (unsigned int i = 0; i < count; i++)
     {
-      *first_advance = advance;
+      hb_position_t v;
+      unsigned cv;
+      if (advance_cache->get (*first_glyph, &cv))
+        v = cv;
+      else
+      {
+        v = glyf.get_advance_with_var_unscaled (*first_glyph, font, true, *scratch, gvar_cache);
+        advance_cache->set (*first_glyph, v);
+      }
+      *first_advance = font->em_scale_y (- (int) v);
       first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride);
       first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride);
     }
+
+    ot_font->draw.release_gvar_cache (gvar_cache);
+    glyf.release_scratch (scratch);
+    ot_font->v.release_advance_cache (advance_cache);
+    return;
   }
+
+  ot_font->v.release_advance_cache (advance_cache);
+  // No VVAR or GVAR.  Just use the fallback non-variable path.
+  goto fallback;
+#endif
 }
 #endif
 
 #ifndef HB_NO_VERTICAL
+HB_HOT
 static hb_bool_t
-hb_ot_get_glyph_v_origin (hb_font_t *font,
-                          void *font_data,
-                          hb_codepoint_t glyph,
-                          hb_position_t *x,
-                          hb_position_t *y,
-                          void *user_data HB_UNUSED)
+hb_ot_get_glyph_v_origins (hb_font_t *font,
+                           void *font_data,
+                           unsigned int count,
+                           const hb_codepoint_t *first_glyph,
+                           unsigned glyph_stride,
+                           hb_position_t *first_x,
+                           unsigned x_stride,
+                           hb_position_t *first_y,
+                           unsigned y_stride,
+                           void *user_data HB_UNUSED)
 {
   const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
   const hb_ot_face_t *ot_face = ot_font->ot_face;
 
-  *x = font->get_glyph_h_advance (glyph) / 2;
+  /* First, set all the x values to half the advance width. */
+  font->get_glyph_h_advances (count,
+                              first_glyph, glyph_stride,
+                              first_x, x_stride);
+  for (unsigned i = 0; i < count; i++)
+  {
+    *first_x /= 2;
+    first_x = &StructAtOffsetUnaligned (first_x, x_stride);
+  }
+
+  /* The vertical origin business is messy...
+   *
+   * We allocate the cache, then have various code paths that use the cache.
+   * Each one is responsible to free it before returning.
+   */
+  hb_ot_font_origin_cache_t *origin_cache = ot_font->v_origin.acquire_origin_cache ();
 
+  /* If there is VORG, always use it. It uses VVAR for variations if necessary. */
   const OT::VORG &VORG = *ot_face->VORG;
-  if (VORG.has_data ())
+  if (origin_cache && VORG.has_data ())
   {
-    float delta = 0;
-
 #ifndef HB_NO_VAR
-    const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx;
-    const OT::VVAR &VVAR = *vmtx.var_table;
-    if (font->num_coords)
-      VVAR.get_vorg_delta_unscaled (glyph,
-                                    font->coords, font->num_coords,
-                                    &delta);
+    if (!font->has_nonzero_coords)
 #endif
+    {
+      for (unsigned i = 0; i < count; i++)
+      {
+        hb_position_t origin;
+        unsigned cv;
+        if (origin_cache->get (*first_glyph, &cv))
+          origin = font->y_scale < 0 ? -static_cast(cv) : static_cast(cv);
+        else
+        {
+          origin = font->em_scalef_y (VORG.get_y_origin (*first_glyph));
+          origin_cache->set (*first_glyph, font->y_scale < 0 ? -origin : origin);
+        }
+
+        *first_y = origin;
+
+        first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride);
+        first_y = &StructAtOffsetUnaligned (first_y, y_stride);
+      }
+    }
+#ifndef HB_NO_VAR
+    else
+    {
+      const OT::VVAR &VVAR = *ot_face->vmtx->var_table;
+      const auto &varStore = &VVAR + VVAR.varStore;
+      auto *varStore_cache = ot_font->v_origin.acquire_varStore_cache (varStore);
+      for (unsigned i = 0; i < count; i++)
+      {
+        hb_position_t origin;
+        unsigned cv;
+        if (origin_cache->get (*first_glyph, &cv))
+          origin = font->y_scale < 0 ? -static_cast(cv) : static_cast(cv);
+        else
+        {
+          origin = font->em_scalef_y (VORG.get_y_origin (*first_glyph) +
+                                      VVAR.get_vorg_delta_unscaled (*first_glyph,
+                                                                    font->coords, font->num_coords,
+                                                                    varStore_cache));
+          origin_cache->set (*first_glyph, font->y_scale < 0 ? -origin : origin);
+        }
 
-    *y = font->em_scalef_y (VORG.get_y_origin (glyph) + delta);
+        *first_y = origin;
+
+        first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride);
+        first_y = &StructAtOffsetUnaligned (first_y, y_stride);
+      }
+      ot_font->v_origin.release_varStore_cache (varStore_cache);
+    }
+#endif
+    ot_font->v_origin.release_origin_cache (origin_cache);
     return true;
   }
 
-  hb_glyph_extents_t extents = {0};
-
-  if (hb_font_get_glyph_extents (font, glyph, &extents))
+  /* If and only if `vmtx` is present and it's a `glyf` font,
+   * we use the top phantom point, deduced from vmtx,glyf[,gvar]. */
+  const auto &vmtx = *ot_face->vmtx;
+  const auto &glyf = *ot_face->glyf;
+  if (origin_cache && vmtx.has_data() && glyf.has_data ())
   {
-    const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx;
-    int tsb = 0;
-    if (vmtx.get_leading_bearing_with_var_unscaled (font, glyph, &tsb))
+    auto *scratch = glyf.acquire_scratch ();
+    if (unlikely (!scratch))
     {
-      *y = extents.y_bearing + font->em_scale_y (tsb);
-      return true;
+      ot_font->v_origin.release_origin_cache (origin_cache);
+      return false;
     }
+    OT::hb_scalar_cache_t *gvar_cache = font->has_nonzero_coords ?
+                                        ot_font->draw.acquire_gvar_cache (*ot_face->gvar) :
+                                        nullptr;
 
-    hb_font_extents_t font_extents;
-    font->get_h_extents_with_fallback (&font_extents);
-    hb_position_t advance = font_extents.ascender - font_extents.descender;
-    hb_position_t diff = advance - -extents.height;
-    *y = extents.y_bearing + (diff >> 1);
+    for (unsigned i = 0; i < count; i++)
+    {
+      hb_position_t origin;
+      unsigned cv;
+      if (origin_cache->get (*first_glyph, &cv))
+        origin = font->y_scale < 0 ? -static_cast(cv) : static_cast(cv);
+      else
+      {
+        origin = font->em_scalef_y (glyf.get_v_origin_with_var_unscaled (*first_glyph, font, *scratch, gvar_cache));
+        origin_cache->set (*first_glyph, font->y_scale < 0 ? -origin : origin);
+      }
+
+      *first_y = origin;
+
+      first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride);
+      first_y = &StructAtOffsetUnaligned (first_y, y_stride);
+    }
+
+    if (gvar_cache)
+      ot_font->draw.release_gvar_cache (gvar_cache);
+    glyf.release_scratch (scratch);
+    ot_font->v_origin.release_origin_cache (origin_cache);
     return true;
   }
 
-  hb_font_extents_t font_extents;
-  font->get_h_extents_with_fallback (&font_extents);
-  *y = font_extents.ascender;
+  /* Otherwise, use glyph extents to center the glyph vertically.
+   * If getting glyph extents failed, just use the font ascender. */
+  if (origin_cache && font->has_glyph_extents_func ())
+  {
+    hb_font_extents_t font_extents;
+    font->get_h_extents_with_fallback (&font_extents);
+    hb_position_t font_advance = font_extents.ascender - font_extents.descender;
+
+    for (unsigned i = 0; i < count; i++)
+    {
+      hb_position_t origin;
+      unsigned cv;
+
+      if (origin_cache->get (*first_glyph, &cv))
+        origin = font->y_scale < 0 ? -static_cast(cv) : static_cast(cv);
+      else
+      {
+        hb_glyph_extents_t extents = {0};
+        if (likely (font->get_glyph_extents (*first_glyph, &extents)))
+          origin = extents.y_bearing + ((font_advance - -extents.height) >> 1);
+        else
+          origin = font_extents.ascender;
+
+        origin_cache->set (*first_glyph, font->y_scale < 0 ? -origin : origin);
+      }
+
+      *first_y = origin;
+
+      first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride);
+      first_y = &StructAtOffsetUnaligned (first_y, y_stride);
+    }
+  }
 
+  ot_font->v_origin.release_origin_cache (origin_cache);
   return true;
 }
 #endif
@@ -498,17 +895,33 @@
                           hb_draw_funcs_t *draw_funcs, void *draw_data,
                           void *user_data)
 {
+  const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
   hb_draw_session_t draw_session {draw_funcs, draw_data};
+  bool ret = false;
+
+  OT::hb_scalar_cache_t *gvar_cache = nullptr;
+  if (font->num_coords)
+  {
+    ot_font->check_serial (font);
+    gvar_cache = ot_font->draw.acquire_gvar_cache (*ot_font->ot_face->gvar);
+  }
+
 #ifndef HB_NO_VAR_COMPOSITES
-  if (font->face->table.VARC->get_path (font, glyph, draw_session)) return true;
+  if (font->face->table.VARC->get_path (font, glyph, draw_session)) { ret = true; goto done; }
 #endif
   // Keep the following in synch with VARC::get_path_at()
-  if (font->face->table.glyf->get_path (font, glyph, draw_session)) return true;
+  if (font->face->table.glyf->get_path (font, glyph, draw_session, gvar_cache)) { ret = true; goto done; }
+
 #ifndef HB_NO_CFF
-  if (font->face->table.cff2->get_path (font, glyph, draw_session)) return true;
-  if (font->face->table.cff1->get_path (font, glyph, draw_session)) return true;
+  if (font->face->table.cff2->get_path (font, glyph, draw_session)) { ret = true; goto done; }
+  if (font->face->table.cff1->get_path (font, glyph, draw_session)) { ret = true; goto done; }
 #endif
-  return false;
+
+done:
+
+  ot_font->draw.release_gvar_cache (gvar_cache);
+
+  return ret;
 }
 #endif
 
@@ -548,12 +961,11 @@
 
     hb_font_funcs_set_font_h_extents_func (funcs, hb_ot_get_font_h_extents, nullptr, nullptr);
     hb_font_funcs_set_glyph_h_advances_func (funcs, hb_ot_get_glyph_h_advances, nullptr, nullptr);
-    //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ot_get_glyph_h_origin, nullptr, nullptr);
 
 #ifndef HB_NO_VERTICAL
     hb_font_funcs_set_font_v_extents_func (funcs, hb_ot_get_font_v_extents, nullptr, nullptr);
     hb_font_funcs_set_glyph_v_advances_func (funcs, hb_ot_get_glyph_v_advances, nullptr, nullptr);
-    hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ot_get_glyph_v_origin, nullptr, nullptr);
+    hb_font_funcs_set_glyph_v_origins_func (funcs, hb_ot_get_glyph_v_origins, nullptr, nullptr);
 #endif
 
 #ifndef HB_NO_DRAW
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-hmtx-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-hmtx-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-hmtx-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-hmtx-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -45,16 +45,6 @@
 #define HB_OT_TAG_vmtx HB_TAG('v','m','t','x')
 
 
-HB_INTERNAL bool
-_glyf_get_leading_bearing_with_var_unscaled (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical, int *lsb);
-
-HB_INTERNAL unsigned
-_glyf_get_advance_with_var_unscaled (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical);
-
-HB_INTERNAL bool
-_glyf_get_leading_bearing_without_var_unscaled (hb_face_t *face, hb_codepoint_t gid, bool is_vertical, int *lsb);
-
-
 namespace OT {
 
 
@@ -237,7 +227,7 @@
 
     auto it =
     + hb_iter (c->plan->new_to_old_gid_list)
-    | hb_map ([c, &_mtx, mtx_map] (hb_codepoint_pair_t _)
+    | hb_map ([&_mtx, mtx_map] (hb_codepoint_pair_t _)
               {
                 hb_codepoint_t new_gid = _.first;
                 hb_codepoint_t old_gid = _.second;
@@ -246,8 +236,7 @@
                 if (!mtx_map->has (new_gid, &v))
                 {
                   int lsb = 0;
-                  if (!_mtx.get_leading_bearing_without_var_unscaled (old_gid, &lsb))
-                    (void) _glyf_get_leading_bearing_without_var_unscaled (c->plan->source, old_gid, !T::is_horizontal, &lsb);
+                  _mtx.get_leading_bearing_without_var_unscaled (old_gid, &lsb);
                   return hb_pair (_mtx.get_advance_without_var_unscaled (old_gid), +lsb);
                 }
                 return *v;
@@ -326,49 +315,23 @@
 
     bool has_data () const { return (bool) num_bearings; }
 
-    bool get_leading_bearing_without_var_unscaled (hb_codepoint_t glyph,
+    void get_leading_bearing_without_var_unscaled (hb_codepoint_t glyph,
                                                    int *lsb) const
     {
       if (glyph < num_long_metrics)
       {
         *lsb = table->longMetricZ[glyph].sb;
-        return true;
+        return;
       }
 
       if (unlikely (glyph >= num_bearings))
-        return false;
-
-      const FWORD *bearings = (const FWORD *) &table->longMetricZ[num_long_metrics];
-      *lsb = bearings[glyph - num_long_metrics];
-      return true;
-    }
-
-    bool get_leading_bearing_with_var_unscaled (hb_font_t *font,
-                                                hb_codepoint_t glyph,
-                                                int *lsb) const
-    {
-      if (!font->num_coords)
-        return get_leading_bearing_without_var_unscaled (glyph, lsb);
-
-#ifndef HB_NO_VAR
-      float delta;
-      if (var_table->get_lsb_delta_unscaled (glyph, font->coords, font->num_coords, &delta) &&
-          get_leading_bearing_without_var_unscaled (glyph, lsb))
       {
-        *lsb += roundf (delta);
-        return true;
+        *lsb = 0;
+        return;
       }
 
-      // If there's no vmtx data, the phantom points from glyf table are not accurate,
-      // so we cannot take the next path.
-      bool is_vertical = T::tableTag == HB_OT_TAG_vmtx;
-      if (is_vertical && !has_data ())
-        return false;
-
-      return _glyf_get_leading_bearing_with_var_unscaled (font, glyph, is_vertical, lsb);
-#else
-      return false;
-#endif
+      const FWORD *bearings = (const FWORD *) &table->longMetricZ[num_long_metrics];
+      *lsb = bearings[glyph - num_long_metrics];
     }
 
     unsigned int get_advance_without_var_unscaled (hb_codepoint_t glyph) const
@@ -402,27 +365,17 @@
       return advances[hb_min (glyph - num_bearings, num_advances - num_bearings - 1)];
     }
 
-    unsigned get_advance_with_var_unscaled (hb_codepoint_t  glyph,
-                                            hb_font_t      *font,
-                                            ItemVariationStore::cache_t *store_cache = nullptr) const
+#ifndef HB_NO_VAR
+    unsigned get_advance_with_var_unscaled (hb_codepoint_t     glyph,
+                                            hb_font_t         *font,
+                                            hb_scalar_cache_t *store_cache = nullptr) const
     {
       unsigned int advance = get_advance_without_var_unscaled (glyph);
-
-#ifndef HB_NO_VAR
-      if (unlikely (glyph >= num_bearings) || !font->num_coords)
-        return advance;
-
-      if (var_table.get_length ())
-        return advance + roundf (var_table->get_advance_delta_unscaled (glyph,
-                                                                        font->coords, font->num_coords,
-                                                                        store_cache));
-
-      unsigned glyf_advance = _glyf_get_advance_with_var_unscaled (font, glyph, T::tableTag == HB_OT_TAG_vmtx);
-      return glyf_advance ? glyf_advance : advance;
-#else
-      return advance;
-#endif
+      return hb_max(0.0f, advance + roundf (var_table->get_advance_delta_unscaled (glyph,
+                                                                      font->coords, font->num_coords,
+                                                                      store_cache)));
     }
+#endif
 
     protected:
     // 0 <= num_long_metrics <= num_bearings <= num_advances <= num_glyphs
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-kern-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-kern-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-kern-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-kern-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -90,11 +90,11 @@
   template 
   void collect_glyphs (set_t &left_set, set_t &right_set, unsigned num_glyphs) const
   {
-    set_t set;
     if (likely (glyphCount))
-      set.add_range (0, glyphCount - 1);
-    left_set.union_ (set);
-    right_set.union_ (set);
+    {
+      left_set.add_range (0, num_glyphs - 1);
+      right_set.add_range (0, num_glyphs - 1);
+    }
   }
 
   protected:
@@ -306,8 +306,8 @@
 {
   static constexpr hb_tag_t tableTag = HB_OT_TAG_kern;
 
-  bool     has_data () const { return u.version32; }
-  unsigned get_type () const { return u.major; }
+  bool     has_data () const { return u.version32.v; }
+  unsigned get_type () const { return u.major.v; }
 
   bool has_state_machine () const
   {
@@ -363,7 +363,7 @@
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!u.version32.sanitize (c)) return_trace (false);
+    if (!u.version32.v.sanitize (c)) return_trace (false);
     hb_barrier ();
     return_trace (dispatch (c));
   }
@@ -406,15 +406,15 @@
 
   protected:
   union {
-  HBUINT32              version32;
-  HBUINT16              major;
+  struct { HBUINT32 v; }        version32;
+  struct { HBUINT16 v; }        major;
   KernOT                ot;
 #ifndef HB_NO_AAT_SHAPE
   KernAAT               aat;
 #endif
   } u;
   public:
-  DEFINE_SIZE_UNION (4, version32);
+  DEFINE_SIZE_UNION (4, version32.v);
 };
 
 struct kern_accelerator_t : kern::accelerator_t {
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-base-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-base-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-base-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-base-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -165,13 +165,13 @@
 
 struct BaseCoord
 {
-  bool has_data () const { return u.format; }
+  bool has_data () const { return u.format.v; }
 
   hb_position_t get_coord (hb_font_t            *font,
                            const ItemVariationStore &var_store,
                            hb_direction_t        direction) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.get_coord (font, direction);
     case 2: hb_barrier (); return u.format2.get_coord (font, direction);
     case 3: hb_barrier (); return u.format3.get_coord (font, var_store, direction);
@@ -181,7 +181,7 @@
 
   void collect_variation_indices (hb_set_t& varidx_set /* OUT */) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 3: hb_barrier (); u.format3.collect_variation_indices (varidx_set); return;
     default:return;
     }
@@ -190,9 +190,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: hb_barrier (); return_trace (c->dispatch (u.format1, std::forward (ds)...));
     case 2: hb_barrier (); return_trace (c->dispatch (u.format2, std::forward (ds)...));
     case 3: hb_barrier (); return_trace (c->dispatch (u.format3, std::forward (ds)...));
@@ -203,9 +203,9 @@
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (unlikely (!u.format.sanitize (c))) return_trace (false);
+    if (unlikely (!u.format.v.sanitize (c))) return_trace (false);
     hb_barrier ();
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return_trace (u.format1.sanitize (c));
     case 2: hb_barrier (); return_trace (u.format2.sanitize (c));
     case 3: hb_barrier (); return_trace (u.format3.sanitize (c));
@@ -215,13 +215,13 @@
 
   protected:
   union {
-  HBUINT16              format;
+  struct { HBUINT16 v; }        format;
   BaseCoordFormat1      format1;
   BaseCoordFormat2      format2;
   BaseCoordFormat3      format3;
   } u;
   public:
-  DEFINE_SIZE_UNION (2, format);
+  DEFINE_SIZE_UNION (2, format.v);
 };
 
 struct FeatMinMaxRecord
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-common.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-common.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-common.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-common.hh	2026-04-17 19:09:35.000000000 +0000
@@ -141,6 +141,7 @@
   const hb_map_t *lookup_index_map;
   const hb_hashmap_t> *script_langsys_map;
   const hb_map_t *feature_index_map;
+  const hb_map_t *feature_map_w_duplicates;
   const hb_hashmap_t *feature_substitutes_map;
   hb_hashmap_t> *feature_record_cond_idx_map;
   const hb_set_t *catch_all_record_feature_idxes;
@@ -165,6 +166,7 @@
       lookup_index_map = &c_->plan->gsub_lookups;
       script_langsys_map = &c_->plan->gsub_langsys;
       feature_index_map = &c_->plan->gsub_features;
+      feature_map_w_duplicates = &c_->plan->gsub_features_w_duplicates;
       feature_substitutes_map = &c_->plan->gsub_feature_substitutes_map;
       feature_record_cond_idx_map = c_->plan->user_axes_location.is_empty () ? nullptr : &c_->plan->gsub_feature_record_cond_idx_map;
       catch_all_record_feature_idxes = &c_->plan->gsub_old_features;
@@ -175,6 +177,7 @@
       lookup_index_map = &c_->plan->gpos_lookups;
       script_langsys_map = &c_->plan->gpos_langsys;
       feature_index_map = &c_->plan->gpos_features;
+      feature_map_w_duplicates = &c_->plan->gpos_features_w_duplicates;
       feature_substitutes_map = &c_->plan->gpos_feature_substitutes_map;
       feature_record_cond_idx_map = c_->plan->user_axes_location.is_empty () ? nullptr : &c_->plan->gpos_feature_record_cond_idx_map;
       catch_all_record_feature_idxes = &c_->plan->gpos_old_features;
@@ -825,46 +828,9 @@
                  const Record_sanitize_closure_t *closure = nullptr) const
   {
     TRACE_SANITIZE (this);
-    if (unlikely (!(c->check_struct (this) && lookupIndex.sanitize (c))))
-      return_trace (false);
-    hb_barrier ();
-
-    /* Some earlier versions of Adobe tools calculated the offset of the
-     * FeatureParams subtable from the beginning of the FeatureList table!
-     *
-     * If sanitizing "failed" for the FeatureParams subtable, try it with the
-     * alternative location.  We would know sanitize "failed" if old value
-     * of the offset was non-zero, but it's zeroed now.
-     *
-     * Only do this for the 'size' feature, since at the time of the faulty
-     * Adobe tools, only the 'size' feature had FeatureParams defined.
-     */
-
-    if (likely (featureParams.is_null ()))
-      return_trace (true);
-
-    unsigned int orig_offset = featureParams;
-    if (unlikely (!featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE)))
-      return_trace (false);
-    hb_barrier ();
-
-    if (featureParams == 0 && closure &&
-        closure->tag == HB_TAG ('s','i','z','e') &&
-        closure->list_base && closure->list_base < this)
-    {
-      unsigned int new_offset_int = orig_offset -
-                                    (((char *) this) - ((char *) closure->list_base));
-
-      Offset16To new_offset;
-      /* Check that it would not overflow. */
-      new_offset = new_offset_int;
-      if (new_offset == new_offset_int &&
-          c->try_set (&featureParams, new_offset_int) &&
-          !featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE))
-        return_trace (false);
-    }
-
-    return_trace (true);
+    return_trace (c->check_struct (this) &&
+                  featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE) &&
+                  lookupIndex.sanitize (c));
   }
 
   Offset16To
@@ -1082,15 +1048,15 @@
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
 
     const uint32_t *v;
-    out->reqFeatureIndex = l->feature_index_map->has (reqFeatureIndex, &v) ? *v : 0xFFFFu;
+    out->reqFeatureIndex = l->feature_map_w_duplicates->has (reqFeatureIndex, &v) ? *v : 0xFFFFu;
 
     if (!l->visitFeatureIndex (featureIndex.len))
       return_trace (false);
 
     auto it =
     + hb_iter (featureIndex)
-    | hb_filter (l->feature_index_map)
-    | hb_map (l->feature_index_map)
+    | hb_filter (l->feature_map_w_duplicates)
+    | hb_map (l->feature_map_w_duplicates)
     ;
 
     bool ret = bool (it);
@@ -1337,7 +1303,7 @@
     TRACE_DISPATCH (this, lookup_type);
     unsigned int count = get_subtable_count ();
     for (unsigned int i = 0; i < count; i++) {
-      typename context_t::return_t r = get_subtable (i).dispatch (c, lookup_type, std::forward (ds)...);
+      typename context_t::return_t r = get_subtable (i).dispatch (c, lookup_type, ds...);
       if (c->stop_sublookup_iteration (r))
         return_trace (r);
     }
@@ -1387,6 +1353,11 @@
       {
         unsigned new_flag = lookupFlag;
         new_flag &= ~LookupFlag::UseMarkFilteringSet;
+        // https://github.com/harfbuzz/harfbuzz/issues/5499
+        // If we remove UseMarkFilteringSet flag because the set is now empty,
+        // we need to add IgnoreMarks flag, otherwise the lookup will not
+        // ignore any marks, which changes the behavior.
+        new_flag |= LookupFlag::IgnoreMarks;
         out->lookupFlag = new_flag;
       }
       else
@@ -1425,7 +1396,7 @@
     if (unlikely (!get_subtables ().sanitize (c, this, get_type ())))
       return_trace (false);
 
-    if (unlikely (get_type () == TSubTable::Extension && !c->get_edit_count ()))
+    if (unlikely (get_type () == TSubTable::Extension))
     {
       hb_barrier ();
 
@@ -1433,11 +1404,6 @@
        * have the same type, which shall not be the Extension type
        * itself (but we already checked for that).
        * This is specially important if one has a reverse type!
-       *
-       * We only do this if sanitizer edit_count is zero.  Otherwise,
-       * some of the subtables might have become insane after they
-       * were sanity-checked by the edits of subsequent subtables.
-       * https://bugs.chromium.org/p/chromium/issues/detail?id=960331
        */
       unsigned int type = get_subtable (0).u.extension.get_type ();
       for (unsigned int i = 1; i < subtables; i++)
@@ -2067,7 +2033,7 @@
   unsigned int get (hb_codepoint_t k) const { return get_class (k); }
   unsigned int get_class (hb_codepoint_t glyph_id) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.get_class (glyph_id);
     case 2: hb_barrier (); return u.format2.get_class (glyph_id);
 #ifndef HB_NO_BEYOND_64K
@@ -2078,7 +2044,7 @@
     }
   }
   unsigned int get_class (hb_codepoint_t glyph_id,
-                          hb_ot_lookup_cache_t *cache) const
+                          hb_ot_layout_mapping_cache_t *cache) const
   {
     unsigned klass;
     if (cache && cache->get (glyph_id, &klass)) return klass;
@@ -2089,7 +2055,7 @@
 
   unsigned get_population () const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.get_population ();
     case 2: hb_barrier (); return u.format2.get_population ();
 #ifndef HB_NO_BEYOND_64K
@@ -2142,7 +2108,7 @@
 
 #ifndef HB_NO_BEYOND_64K
     if (glyph_max > 0xFFFFu)
-      u.format += 2;
+      u.format.v += 2;
     if (unlikely (glyph_max > 0xFFFFFFu))
 #else
     if (unlikely (glyph_max > 0xFFFFu))
@@ -2152,9 +2118,9 @@
       return_trace (false);
     }
 
-    u.format = format;
+    u.format.v = format;
 
-    switch (u.format)
+    switch (u.format.v)
     {
     case 1: hb_barrier (); return_trace (u.format1.serialize (c, it));
     case 2: hb_barrier (); return_trace (u.format2.serialize (c, it));
@@ -2173,7 +2139,7 @@
                const Coverage* glyph_filter = nullptr) const
   {
     TRACE_SUBSET (this);
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return_trace (u.format1.subset (c, klass_map, keep_empty_table, use_class_zero, glyph_filter));
     case 2: hb_barrier (); return_trace (u.format2.subset (c, klass_map, keep_empty_table, use_class_zero, glyph_filter));
 #ifndef HB_NO_BEYOND_64K
@@ -2187,9 +2153,9 @@
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return_trace (false);
+    if (!u.format.v.sanitize (c)) return_trace (false);
     hb_barrier ();
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return_trace (u.format1.sanitize (c));
     case 2: hb_barrier (); return_trace (u.format2.sanitize (c));
 #ifndef HB_NO_BEYOND_64K
@@ -2202,7 +2168,7 @@
 
   unsigned cost () const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.cost ();
     case 2: hb_barrier (); return u.format2.cost ();
 #ifndef HB_NO_BEYOND_64K
@@ -2218,7 +2184,7 @@
   template 
   bool collect_coverage (set_t *glyphs) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.collect_coverage (glyphs);
     case 2: hb_barrier (); return u.format2.collect_coverage (glyphs);
 #ifndef HB_NO_BEYOND_64K
@@ -2234,7 +2200,7 @@
   template 
   bool collect_class (set_t *glyphs, unsigned int klass) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.collect_class (glyphs, klass);
     case 2: hb_barrier (); return u.format2.collect_class (glyphs, klass);
 #ifndef HB_NO_BEYOND_64K
@@ -2247,7 +2213,7 @@
 
   bool intersects (const hb_set_t *glyphs) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.intersects (glyphs);
     case 2: hb_barrier (); return u.format2.intersects (glyphs);
 #ifndef HB_NO_BEYOND_64K
@@ -2259,7 +2225,7 @@
   }
   bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.intersects_class (glyphs, klass);
     case 2: hb_barrier (); return u.format2.intersects_class (glyphs, klass);
 #ifndef HB_NO_BEYOND_64K
@@ -2272,7 +2238,7 @@
 
   void intersected_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.intersected_class_glyphs (glyphs, klass, intersect_glyphs);
     case 2: hb_barrier (); return u.format2.intersected_class_glyphs (glyphs, klass, intersect_glyphs);
 #ifndef HB_NO_BEYOND_64K
@@ -2285,7 +2251,7 @@
 
   void intersected_classes (const hb_set_t *glyphs, hb_set_t *intersect_classes) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.intersected_classes (glyphs, intersect_classes);
     case 2: hb_barrier (); return u.format2.intersected_classes (glyphs, intersect_classes);
 #ifndef HB_NO_BEYOND_64K
@@ -2299,7 +2265,7 @@
 
   protected:
   union {
-  HBUINT16                      format;         /* Format identifier */
+  struct { HBUINT16 v; }        format;         /* Format identifier */
   ClassDefFormat1_3 format1;
   ClassDefFormat2_4 format2;
 #ifndef HB_NO_BEYOND_64K
@@ -2308,7 +2274,7 @@
 #endif
   } u;
   public:
-  DEFINE_SIZE_UNION (2, format);
+  DEFINE_SIZE_UNION (2, format.v);
 };
 
 template
@@ -2326,139 +2292,168 @@
 {
   /* each byte represents a region, value is one of 0/1/2/4, which means bytes
    * needed for this region */
-  hb_vector_t chars;
+  struct chars_t : hb_vector_t
+  {
+    int cmp (const chars_t& other) const
+    {
+      return as_array ().cmp (other.as_array ());
+    }
+
+    hb_pair_t get_width ()
+    {
+      unsigned width = 0;
+      unsigned columns = 0;
+      for (unsigned i = 0; i < length; i++)
+      {
+        unsigned v = arrayZ[i];
+        width += v;
+        columns += (v != 0);
+      }
+      return hb_pair (width, columns);
+    }
+
+    HB_HOT
+    hb_pair_t combine_width (const chars_t& other) const
+    {
+      unsigned combined_width = 0;
+      unsigned combined_columns = 0;
+      for (unsigned i = 0; i < length; i++)
+      {
+        unsigned v = hb_max (arrayZ[i], other.arrayZ[i]);
+        combined_width += v;
+        combined_columns += (v != 0);
+      }
+      return hb_pair (combined_width, combined_columns);
+    }
+  };
+
+  hb_pair_t combine_width (const delta_row_encoding_t& other_encoding) const { return chars.combine_width (other_encoding.chars); }
+
+  // Actual data
+
+  chars_t chars;
   unsigned width = 0;
-  hb_vector_t columns;
   unsigned overhead = 0;
   hb_vector_t*> items;
 
   delta_row_encoding_t () = default;
-  delta_row_encoding_t (hb_vector_t&& chars_,
-                        const hb_vector_t* row = nullptr) :
-                        delta_row_encoding_t ()
+  delta_row_encoding_t (hb_vector_t*> &&rows, unsigned num_cols)
+  {
+    assert (rows);
+
+    items = std::move (rows);
 
+    if (unlikely (!chars.resize (num_cols)))
+      return;
+
+    calculate_chars ();
+  }
+
+  void merge (const delta_row_encoding_t& other)
   {
-    chars = std::move (chars_);
-    width = get_width ();
-    columns = get_columns ();
-    overhead = get_chars_overhead (columns);
-    if (row) items.push (row);
+    items.alloc (items.length + other.items.length);
+    for (auto &row : other.items)
+      add_row (row);
+
+    // Merge chars
+    assert (chars.length == other.chars.length);
+    for (unsigned i = 0; i < chars.length; i++)
+      chars.arrayZ[i] = hb_max (chars.arrayZ[i], other.chars.arrayZ[i]);
+    chars_changed ();
   }
 
-  bool is_empty () const
-  { return !items; }
+  void chars_changed ()
+  {
+    auto _ = chars.get_width ();
+    width = _.first;
+    overhead = get_chars_overhead (_.second);
+  }
 
-  static hb_vector_t get_row_chars (const hb_vector_t& row)
+  void calculate_chars ()
   {
-    hb_vector_t ret;
-    if (!ret.alloc (row.length)) return ret;
+    assert (items);
 
     bool long_words = false;
 
-    /* 0/1/2 byte encoding */
-    for (int i = row.length - 1; i >= 0; i--)
+    for (auto &row : items)
     {
-      int v =  row.arrayZ[i];
-      if (v == 0)
-        ret.push (0);
-      else if (v > 32767 || v < -32768)
+      assert (row->length == chars.length);
+
+      /* 0/1/2 byte encoding */
+      for (unsigned i = 0; i < row->length; i++)
       {
-        long_words = true;
-        break;
+        int v =  row->arrayZ[i];
+        if (v == 0)
+          continue;
+        else if (v > 32767 || v < -32768)
+        {
+          long_words = true;
+          chars.arrayZ[i] = hb_max (chars.arrayZ[i], 4);
+        }
+        else if (v > 127 || v < -128)
+          chars.arrayZ[i] = hb_max (chars.arrayZ[i], 2);
+        else
+          chars.arrayZ[i] = hb_max (chars.arrayZ[i], 1);
       }
-      else if (v > 127 || v < -128)
-        ret.push (2);
-      else
-        ret.push (1);
     }
 
-    if (!long_words)
-      return ret;
-
-    /* redo, 0/2/4 bytes encoding */
-    ret.reset ();
-    for (int i = row.length - 1; i >= 0; i--)
+    if (long_words)
     {
-      int v =  row.arrayZ[i];
-      if (v == 0)
-        ret.push (0);
-      else if (v > 32767 || v < -32768)
-        ret.push (4);
-      else
-        ret.push (2);
+      // Convert 1s to 2s
+      for (auto &v : chars)
+        if (v == 1)
+          v = 2;
     }
-    return ret;
-  }
 
-  inline unsigned get_width ()
-  {
-    unsigned ret = + hb_iter (chars)
-                   | hb_reduce (hb_add, 0u)
-                   ;
-    return ret;
+    chars_changed ();
   }
 
-  hb_vector_t get_columns ()
-  {
-    hb_vector_t cols;
-    cols.alloc (chars.length);
-    for (auto v : chars)
-    {
-      uint8_t flag = v ? 1 : 0;
-      cols.push (flag);
-    }
-    return cols;
-  }
+  bool is_empty () const
+  { return !items; }
 
-  static inline unsigned get_chars_overhead (const hb_vector_t& cols)
+  static inline unsigned get_chars_overhead (unsigned num_columns)
   {
     unsigned c = 4 + 6; // 4 bytes for LOffset, 6 bytes for VarData header
-    unsigned cols_bit_count = 0;
-    for (auto v : cols)
-      if (v) cols_bit_count++;
-    return c + cols_bit_count * 2;
+    return c + num_columns * 2;
   }
 
-  unsigned get_gain () const
+  unsigned get_gain (unsigned additional_bytes_per_rows = 1) const
   {
     int count = items.length;
-    return hb_max (0, (int) overhead - count);
+    return hb_max (0, (int) overhead - count * (int) additional_bytes_per_rows);
   }
 
   int gain_from_merging (const delta_row_encoding_t& other_encoding) const
   {
-    int combined_width = 0;
-    for (unsigned i = 0; i < chars.length; i++)
-      combined_width += hb_max (chars.arrayZ[i], other_encoding.chars.arrayZ[i]);
+    // Back of the envelope calculations to reject early.
+    signed additional_bytes_per_rows = other_encoding.width - width;
+    if (additional_bytes_per_rows > 0)
+    {
+      if (get_gain (additional_bytes_per_rows) == 0)
+        return 0;
+    }
+    else
+    {
+      if (other_encoding.get_gain (-additional_bytes_per_rows) == 0)
+        return 0;
+    }
 
-    hb_vector_t combined_columns;
-    combined_columns.alloc (columns.length);
-    for (unsigned i = 0; i < columns.length; i++)
-      combined_columns.push (columns.arrayZ[i] | other_encoding.columns.arrayZ[i]);
-
-    int combined_overhead = get_chars_overhead (combined_columns);
-    int combined_gain = (int) overhead + (int) other_encoding.overhead - combined_overhead
-                        - (combined_width - (int) width) * items.length
-                        - (combined_width - (int) other_encoding.width) * other_encoding.items.length;
+    auto pair = combine_width (other_encoding);
+    unsigned combined_width = pair.first;
+    unsigned combined_columns = pair.second;
+
+    int combined_gain = (int) overhead + (int) other_encoding.overhead;
+    combined_gain -= (combined_width - (int) width) * items.length;
+    combined_gain -= (combined_width - (int) other_encoding.width) * other_encoding.items.length;
+    combined_gain -= get_chars_overhead (combined_columns);
 
     return combined_gain;
   }
 
-  static int cmp (const void *pa, const void *pb)
-  {
-    const delta_row_encoding_t *a = (const delta_row_encoding_t *)pa;
-    const delta_row_encoding_t *b = (const delta_row_encoding_t *)pb;
-
-    int gain_a = a->get_gain ();
-    int gain_b = b->get_gain ();
-
-    if (gain_a != gain_b)
-      return gain_a - gain_b;
-
-    return (b->chars).as_array ().cmp ((a->chars).as_array ());
-  }
+  bool add_row (const hb_vector_t* row)
+  { return items.push (row); }
 
-  static int cmp_width (const void *pa, const void *pb)
+  static int cmp (const void *pa, const void *pb)
   {
     const delta_row_encoding_t *a = (const delta_row_encoding_t *)pa;
     const delta_row_encoding_t *b = (const delta_row_encoding_t *)pb;
@@ -2466,11 +2461,8 @@
     if (a->width != b->width)
       return (int) a->width - (int) b->width;
 
-    return (b->chars).as_array ().cmp ((a->chars).as_array ());
+    return b->chars.cmp (a->chars);
   }
-
-  bool add_row (const hb_vector_t* row)
-  { return items.push (row); }
 };
 
 struct VarRegionAxis
@@ -2548,32 +2540,112 @@
   DEFINE_SIZE_STATIC (8);
 };
 
-#define REGION_CACHE_ITEM_CACHE_INVALID INT_MIN
-#define REGION_CACHE_ITEM_MULTIPLIER (float (1 << ((sizeof (int) * 8) - 2)))
-#define REGION_CACHE_ITEM_DIVISOR (1.f / float (1 << ((sizeof (int) * 8) - 2)))
-
-struct VarRegionList
+struct hb_scalar_cache_t
 {
-  using cache_t = hb_atomic_t;
+  private:
+  static constexpr unsigned STATIC_LENGTH = 16;
+  static constexpr int INVALID = INT_MIN;
+  static constexpr float MULTIPLIER = 1 << ((sizeof (int) * 8) - 2);
+  static constexpr float DIVISOR = 1.f / MULTIPLIER;
 
-  float evaluate (unsigned int region_index,
-                  const int *coords, unsigned int coord_len,
-                  cache_t *cache = nullptr) const
+  public:
+  hb_scalar_cache_t () : length (STATIC_LENGTH) { clear (); }
+
+  hb_scalar_cache_t (const hb_scalar_cache_t&) = delete;
+  hb_scalar_cache_t (hb_scalar_cache_t&&) = delete;
+  hb_scalar_cache_t& operator= (const hb_scalar_cache_t&) = delete;
+  hb_scalar_cache_t& operator= (hb_scalar_cache_t&&) = delete;
+
+  static hb_scalar_cache_t *create (unsigned int count,
+                                    hb_scalar_cache_t *scratch_cache = nullptr)
   {
-    if (unlikely (region_index >= regionCount))
-      return 0.;
+    if (!count) return (hb_scalar_cache_t *) &Null(hb_scalar_cache_t);
 
-    cache_t *cached_value = nullptr;
-    if (cache)
+    if (scratch_cache && count <= scratch_cache->length)
     {
-      cached_value = &(cache[region_index]);
-      if (*cached_value != REGION_CACHE_ITEM_CACHE_INVALID)
-        return *cached_value * REGION_CACHE_ITEM_DIVISOR;
+      scratch_cache->clear ();
+      return scratch_cache;
     }
 
+    auto *cache = (hb_scalar_cache_t *) hb_malloc (sizeof (hb_scalar_cache_t) - sizeof (static_values) + sizeof (static_values[0]) * count);
+    if (unlikely (!cache)) return (hb_scalar_cache_t *) &Null(hb_scalar_cache_t);
+
+    cache->length = count;
+    cache->clear ();
+
+    return cache;
+  }
+
+  static void destroy (hb_scalar_cache_t *cache,
+                       hb_scalar_cache_t *scratch_cache = nullptr)
+  {
+    if (cache != &Null(hb_scalar_cache_t) && cache != scratch_cache)
+      hb_free (cache);
+  }
+
+  void clear ()
+  {
+    auto *values = &static_values[0];
+    unsigned i = 0;
+#ifndef HB_OPTIMIZE_SIZE
+    for (; i + 3 < length; i += 4)
+    {
+      values[i + 0] = INVALID;
+      values[i + 1] = INVALID;
+      values[i + 2] = INVALID;
+      values[i + 3] = INVALID;
+    }
+#endif
+    for (; i < length; i++)
+      values[i] = INVALID;
+  }
+
+  HB_ALWAYS_INLINE
+  bool get (unsigned i, float *value) const
+  {
+    if (unlikely (i >= length))
+    {
+      *value = 0.f;
+      return true;
+    }
+    auto *values = &static_values[0];
+    auto *cached_value = &values[i];
+    // Super hot. Most common path is that we have a cached value of 0.
+    int v = *cached_value;
+    if (likely (!v))
+    {
+      *value = 0.f;
+      return true;
+    }
+    if (v == INVALID)
+      return false;
+    *value = v * DIVISOR;
+    return true;
+  }
+
+  HB_ALWAYS_INLINE
+  void set (unsigned i, float value)
+  {
+    if (unlikely (i >= length)) return;
+    auto *values = &static_values[0];
+    auto *cached_value = &values[i];
+    *cached_value = roundf(value * MULTIPLIER);
+  }
+
+  private:
+  unsigned length;
+  mutable hb_atomic_t static_values[STATIC_LENGTH];
+};
+
+struct VarRegionList
+{
+  private:
+  float evaluate_impl (unsigned int region_index,
+                       const int *coords, unsigned int coord_len) const
+  {
     const VarRegionAxis *axes = axesZ.arrayZ + (region_index * axisCount);
+    float v = 1.f;
 
-    float v = 1.;
     unsigned int count = axisCount;
     for (unsigned int i = 0; i < count; i++)
     {
@@ -2581,15 +2653,32 @@
       float factor = axes[i].evaluate (coord);
       if (factor == 0.f)
       {
-        if (cache)
-          *cached_value = 0.;
-        return 0.;
+        v = 0.f;
+        break;
       }
       v *= factor;
     }
 
+    return v;
+  }
+
+  public:
+  HB_ALWAYS_INLINE
+  float evaluate (unsigned int region_index,
+                  const int *coords, unsigned int coord_len,
+                  hb_scalar_cache_t *cache = nullptr) const
+  {
+    if (unlikely (region_index >= regionCount))
+      return 0.;
+
+    float v;
+    if (cache && cache->get (region_index, &v))
+      return v;
+
+    v = evaluate_impl (region_index, coords, coord_len);
+
     if (cache)
-      *cached_value = v * REGION_CACHE_ITEM_MULTIPLIER;
+      cache->set (region_index, v);
     return v;
   }
 
@@ -2732,29 +2821,24 @@
 
 struct SparseVarRegionList
 {
-  using cache_t = hb_atomic_t;
-
+  HB_ALWAYS_INLINE
   float evaluate (unsigned int region_index,
                   const int *coords, unsigned int coord_len,
-                  cache_t *cache = nullptr) const
+                  hb_scalar_cache_t *cache = nullptr) const
   {
     if (unlikely (region_index >= regions.len))
       return 0.;
 
-    cache_t *cached_value = nullptr;
-    if (cache)
-    {
-      cached_value = &(cache[region_index]);
-      if (*cached_value != REGION_CACHE_ITEM_CACHE_INVALID)
-        return *cached_value * REGION_CACHE_ITEM_DIVISOR;
-    }
+    float v;
+    if (cache && cache->get (region_index, &v))
+      return v;
 
     const SparseVariationRegion ®ion = this+regions[region_index];
 
-    float v = region.evaluate (coords, coord_len);
-
+    v = region.evaluate (coords, coord_len);
     if (cache)
-      *cached_value = v * REGION_CACHE_ITEM_MULTIPLIER;
+      cache->set (region_index, v);
+
     return v;
   }
 
@@ -2792,46 +2876,62 @@
          + itemCount * get_row_size ();
   }
 
-  float get_delta (unsigned int inner,
-                   const int *coords, unsigned int coord_count,
-                   const VarRegionList ®ions,
-                   VarRegionList::cache_t *cache = nullptr) const
+  float _get_delta (unsigned int inner,
+                    const int *coords, unsigned int coord_count,
+                    const VarRegionList ®ions,
+                    hb_scalar_cache_t *cache = nullptr) const
   {
     if (unlikely (inner >= itemCount))
       return 0.;
+    bool is_long = longWords ();
+    unsigned int count = regionIndices.len;
+    unsigned word_count = wordCount ();
+    unsigned int scount = is_long ? count : word_count;
+    unsigned int lcount = is_long ? word_count : 0;
 
-   unsigned int count = regionIndices.len;
-   bool is_long = longWords ();
-   unsigned word_count = wordCount ();
-   unsigned int scount = is_long ? count : word_count;
-   unsigned int lcount = is_long ? word_count : 0;
+    const HBUINT8 *bytes = get_delta_bytes ();
+    const HBUINT8 *row = bytes + inner * get_row_size ();
 
-   const HBUINT8 *bytes = get_delta_bytes ();
-   const HBUINT8 *row = bytes + inner * get_row_size ();
+    float delta = 0.;
+    unsigned int i = 0;
 
-   float delta = 0.;
-   unsigned int i = 0;
+    const HBINT32 *lcursor = reinterpret_cast (row);
+    for (; i < lcount; i++)
+    {
+      float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count, cache);
+      if (scalar)
+        delta += scalar * *lcursor;
+      lcursor++;
+    }
+    const HBINT16 *scursor = reinterpret_cast (lcursor);
+    for (; i < scount; i++)
+    {
+      float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count, cache);
+      if (scalar)
+       delta += scalar * *scursor;
+      scursor++;
+    }
+    const HBINT8 *bcursor = reinterpret_cast (scursor);
+    for (; i < count; i++)
+    {
+      float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count, cache);
+      if (scalar)
+        delta += scalar * *bcursor;
+      bcursor++;
+    }
 
-   const HBINT32 *lcursor = reinterpret_cast (row);
-   for (; i < lcount; i++)
-   {
-     float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count, cache);
-     delta += scalar * *lcursor++;
-   }
-   const HBINT16 *scursor = reinterpret_cast (lcursor);
-   for (; i < scount; i++)
-   {
-     float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count, cache);
-     delta += scalar * *scursor++;
-   }
-   const HBINT8 *bcursor = reinterpret_cast (scursor);
-   for (; i < count; i++)
-   {
-     float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count, cache);
-     delta += scalar * *bcursor++;
-   }
+    return delta;
+  }
 
-   return delta;
+  HB_ALWAYS_INLINE
+  float get_delta (unsigned int inner,
+                   const int *coords, unsigned int coord_count,
+                   const VarRegionList ®ions,
+                   hb_scalar_cache_t *cache = nullptr) const
+  {
+    unsigned int count = regionIndices.len;
+    if (!count) return 0.f; // This is quite common, so optimize it.
+    return _get_delta (inner, coords, coord_count, regions, cache);
   }
 
   void get_region_scalars (const int *coords, unsigned int coord_count,
@@ -3150,7 +3250,7 @@
                   const int *coords, unsigned int coord_count,
                   const SparseVarRegionList ®ions,
                   hb_array_t out,
-                  SparseVarRegionList::cache_t *cache = nullptr) const
+                  hb_scalar_cache_t *cache = nullptr) const
   {
     auto &deltaSets = StructAfter (regionIndices);
 
@@ -3187,31 +3287,24 @@
 struct ItemVariationStore
 {
   friend struct item_variations_t;
-  using cache_t = VarRegionList::cache_t;
 
-  cache_t *create_cache () const
+  hb_scalar_cache_t *create_cache () const
   {
 #ifdef HB_NO_VAR
-    return nullptr;
+    return hb_scalar_cache_t::create (0);
 #endif
-    unsigned count = (this+regions).regionCount;
-    if (!count) return nullptr;
-
-    cache_t *cache = (cache_t *) hb_malloc (sizeof (float) * count);
-    if (unlikely (!cache)) return nullptr;
-
-    for (unsigned i = 0; i < count; i++)
-      cache[i] = REGION_CACHE_ITEM_CACHE_INVALID;
-
-    return cache;
+    return hb_scalar_cache_t::create ((this+regions).regionCount);
   }
 
-  static void destroy_cache (cache_t *cache) { hb_free (cache); }
+  static void destroy_cache (hb_scalar_cache_t *cache)
+  {
+    hb_scalar_cache_t::destroy (cache);
+  }
 
   private:
   float get_delta (unsigned int outer, unsigned int inner,
                    const int *coords, unsigned int coord_count,
-                   VarRegionList::cache_t *cache = nullptr) const
+                   hb_scalar_cache_t *cache = nullptr) const
   {
 #ifdef HB_NO_VAR
     return 0.f;
@@ -3229,7 +3322,7 @@
   public:
   float get_delta (unsigned int index,
                    const int *coords, unsigned int coord_count,
-                   VarRegionList::cache_t *cache = nullptr) const
+                   hb_scalar_cache_t *cache = nullptr) const
   {
     unsigned int outer = index >> 16;
     unsigned int inner = index & 0xFFFF;
@@ -3237,7 +3330,7 @@
   }
   float get_delta (unsigned int index,
                    hb_array_t coords,
-                   VarRegionList::cache_t *cache = nullptr) const
+                   hb_scalar_cache_t *cache = nullptr) const
   {
     return get_delta (index,
                       coords.arrayZ, coords.length,
@@ -3356,7 +3449,7 @@
     for (unsigned i = 0; i < count; i++)
     {
       hb_inc_bimap_t *map = inner_maps.push ();
-      if (!c->propagate_error(inner_maps))
+      if (unlikely (!c->propagate_error(inner_maps)))
         return_trace(nullptr);
       auto &data = this+dataSets[i];
 
@@ -3445,43 +3538,28 @@
 
 struct MultiItemVariationStore
 {
-  using cache_t = SparseVarRegionList::cache_t;
-
-  cache_t *create_cache (hb_array_t static_cache = hb_array_t ()) const
+  hb_scalar_cache_t *create_cache (hb_scalar_cache_t *static_cache = nullptr) const
   {
 #ifdef HB_NO_VAR
-    return nullptr;
+    return hb_scalar_cache_t::create (0);
 #endif
     auto &r = this+regions;
     unsigned count = r.regions.len;
 
-    cache_t *cache;
-    if (count <= static_cache.length)
-      cache = static_cache.arrayZ;
-    else
-    {
-      cache = (cache_t *) hb_malloc (sizeof (float) * count);
-      if (unlikely (!cache)) return nullptr;
-    }
-
-    for (unsigned i = 0; i < count; i++)
-      cache[i] = REGION_CACHE_ITEM_CACHE_INVALID;
-
-    return cache;
+    return hb_scalar_cache_t::create (count, static_cache);
   }
 
-  static void destroy_cache (cache_t *cache,
-                             hb_array_t static_cache = hb_array_t ())
+  static void destroy_cache (hb_scalar_cache_t *cache,
+                             hb_scalar_cache_t *static_cache = nullptr)
   {
-    if (cache != static_cache.arrayZ)
-      hb_free (cache);
+    hb_scalar_cache_t::destroy (cache, static_cache);
   }
 
   private:
   void get_delta (unsigned int outer, unsigned int inner,
                   const int *coords, unsigned int coord_count,
                   hb_array_t out,
-                  VarRegionList::cache_t *cache = nullptr) const
+                  hb_scalar_cache_t *cache = nullptr) const
   {
 #ifdef HB_NO_VAR
     return;
@@ -3501,7 +3579,7 @@
   void get_delta (unsigned int index,
                   const int *coords, unsigned int coord_count,
                   hb_array_t out,
-                  VarRegionList::cache_t *cache = nullptr) const
+                  hb_scalar_cache_t *cache = nullptr) const
   {
     unsigned int outer = index >> 16;
     unsigned int inner = index & 0xFFFF;
@@ -3510,7 +3588,7 @@
   void get_delta (unsigned int index,
                   hb_array_t coords,
                   hb_array_t out,
-                  VarRegionList::cache_t *cache = nullptr) const
+                  hb_scalar_cache_t *cache = nullptr) const
   {
     return get_delta (index,
                       coords.arrayZ, coords.length,
@@ -3540,8 +3618,6 @@
   DEFINE_SIZE_ARRAY_SIZED (8, dataSets);
 };
 
-#undef REGION_CACHE_ITEM_CACHE_INVALID
-
 template 
 struct DeltaSetIndexMapFormat01
 {
@@ -3592,13 +3668,19 @@
     return_trace (true);
   }
 
+  HB_ALWAYS_INLINE
   uint32_t map (unsigned int v) const /* Returns 16.16 outer.inner. */
   {
     /* If count is zero, pass value unchanged.  This takes
      * care of direct mapping for advance map. */
     if (!mapCount)
       return v;
+    return _map (v);
+  }
 
+  HB_HOT
+  uint32_t _map (unsigned int v) const /* Returns 16.16 outer.inner. */
+  {
     if (v >= mapCount)
       v = mapCount - 1;
 
@@ -3654,8 +3736,8 @@
   {
     TRACE_SERIALIZE (this);
     unsigned length = plan.get_output_map ().length;
-    u.format = length <= 0xFFFF ? 0 : 1;
-    switch (u.format) {
+    u.format.v = length <= 0xFFFF ? 0 : 1;
+    switch (u.format.v) {
     case 0: hb_barrier (); return_trace (u.format0.serialize (c, plan));
     case 1: hb_barrier (); return_trace (u.format1.serialize (c, plan));
     default:return_trace (false);
@@ -3664,7 +3746,7 @@
 
   uint32_t map (unsigned v) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 0: hb_barrier (); return (u.format0.map (v));
     case 1: hb_barrier (); return (u.format1.map (v));
     default:return v;
@@ -3673,7 +3755,7 @@
 
   unsigned get_map_count () const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 0: hb_barrier (); return u.format0.get_map_count ();
     case 1: hb_barrier (); return u.format1.get_map_count ();
     default:return 0;
@@ -3682,7 +3764,7 @@
 
   unsigned get_width () const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 0: hb_barrier (); return u.format0.get_width ();
     case 1: hb_barrier (); return u.format1.get_width ();
     default:return 0;
@@ -3691,7 +3773,7 @@
 
   unsigned get_inner_bit_count () const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 0: hb_barrier (); return u.format0.get_inner_bit_count ();
     case 1: hb_barrier (); return u.format1.get_inner_bit_count ();
     default:return 0;
@@ -3701,9 +3783,9 @@
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return_trace (false);
+    if (!u.format.v.sanitize (c)) return_trace (false);
     hb_barrier ();
-    switch (u.format) {
+    switch (u.format.v) {
     case 0: hb_barrier (); return_trace (u.format0.sanitize (c));
     case 1: hb_barrier (); return_trace (u.format1.sanitize (c));
     default:return_trace (true);
@@ -3713,7 +3795,7 @@
   DeltaSetIndexMap* copy (hb_serialize_context_t *c) const
   {
     TRACE_SERIALIZE (this);
-    switch (u.format) {
+    switch (u.format.v) {
     case 0: hb_barrier (); return_trace (reinterpret_cast (u.format0.copy (c)));
     case 1: hb_barrier (); return_trace (reinterpret_cast (u.format1.copy (c)));
     default:return_trace (nullptr);
@@ -3722,12 +3804,12 @@
 
   protected:
   union {
-  HBUINT8                            format;         /* Format identifier */
+  struct { HBUINT8 v; }             format;         /* Format identifier */
   DeltaSetIndexMapFormat01 format0;
   DeltaSetIndexMapFormat01 format1;
   } u;
   public:
-  DEFINE_SIZE_UNION (1, format);
+  DEFINE_SIZE_UNION (1, format.v);
 };
 
 
@@ -3736,7 +3818,7 @@
   ItemVarStoreInstancer (const ItemVariationStore *varStore_,
                          const DeltaSetIndexMap *varIdxMap,
                          hb_array_t coords,
-                         VarRegionList::cache_t *cache = nullptr) :
+                         hb_scalar_cache_t *cache = nullptr) :
     varStore (varStore_), varIdxMap (varIdxMap), coords (coords), cache (cache)
   {
     if (!varStore)
@@ -3762,7 +3844,7 @@
   const ItemVariationStore *varStore;
   const DeltaSetIndexMap *varIdxMap;
   hb_array_t coords;
-  VarRegionList::cache_t *cache;
+  hb_scalar_cache_t *cache;
 };
 
 struct MultiItemVarStoreInstancer
@@ -3770,7 +3852,7 @@
   MultiItemVarStoreInstancer (const MultiItemVariationStore *varStore,
                               const DeltaSetIndexMap *varIdxMap,
                               hb_array_t coords,
-                              SparseVarRegionList::cache_t *cache = nullptr) :
+                              hb_scalar_cache_t *cache = nullptr) :
     varStore (varStore), varIdxMap (varIdxMap), coords (coords), cache (cache)
   {
     if (!varStore)
@@ -3803,7 +3885,7 @@
   const MultiItemVariationStore *varStore;
   const DeltaSetIndexMap *varIdxMap;
   hb_array_t coords;
-  SparseVarRegionList::cache_t *cache;
+  hb_scalar_cache_t *cache;
 };
 
 
@@ -4130,7 +4212,7 @@
   bool evaluate (const int *coords, unsigned int coord_len,
                  Instancer *instancer) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.evaluate (coords, coord_len, instancer);
     case 2: hb_barrier (); return u.format2.evaluate (coords, coord_len, instancer);
     case 3: hb_barrier (); return u.format3.evaluate (coords, coord_len, instancer);
@@ -4143,7 +4225,7 @@
   Cond_with_Var_flag_t keep_with_variations (hb_collect_feature_substitutes_with_var_context_t *c,
                                              hb_map_t *condition_map /* OUT */) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.keep_with_variations (c, condition_map);
     // TODO(subset)
     default: c->apply = false; return KEEP_COND_WITH_VAR;
@@ -4153,9 +4235,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: hb_barrier (); return_trace (c->dispatch (u.format1, std::forward (ds)...));
     case 2: hb_barrier (); return_trace (c->dispatch (u.format2, std::forward (ds)...));
     case 3: hb_barrier (); return_trace (c->dispatch (u.format3, std::forward (ds)...));
@@ -4168,9 +4250,9 @@
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return_trace (false);
+    if (!u.format.v.sanitize (c)) return_trace (false);
     hb_barrier ();
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return_trace (u.format1.sanitize (c));
     case 2: hb_barrier (); return_trace (u.format2.sanitize (c));
     case 3: hb_barrier (); return_trace (u.format3.sanitize (c));
@@ -4182,7 +4264,7 @@
 
   protected:
   union {
-  HBUINT16              format;         /* Format identifier */
+  struct { HBUINT16 v; }        format;         /* Format identifier */
   ConditionAxisRange    format1;
   ConditionValue        format2;
   ConditionAnd          format3;
@@ -4190,7 +4272,7 @@
   ConditionNegate       format5;
   } u;
   public:
-  DEFINE_SIZE_UNION (2, format);
+  DEFINE_SIZE_UNION (2, format.v);
 };
 
 template 
@@ -4353,7 +4435,7 @@
     if (unlikely (!s->extend_min (this))) return_trace (false);
 
     uint32_t *new_feature_idx;
-    if (!c->feature_index_map->has (feature_index, &new_feature_idx))
+    if (!c->feature_map_w_duplicates->has (feature_index, &new_feature_idx))
       return_trace (false);
 
     if (!s->check_assign (featureIndex, *new_feature_idx, HB_SERIALIZE_ERROR_INT_OVERFLOW))
@@ -4371,7 +4453,7 @@
   {
     TRACE_SUBSET (this);
     uint32_t *new_feature_index;
-    if (!c->feature_index_map->has (featureIndex, &new_feature_index))
+    if (!c->feature_map_w_duplicates->has (featureIndex, &new_feature_index))
       return_trace (false);
 
     auto *out = c->subset_context->serializer->embed (this);
@@ -4645,7 +4727,7 @@
 
     int keep_up_to = -1;
     for (int i = varRecords.len - 1; i >= 0; i--) {
-      if (varRecords[i].intersects_features (this, l->feature_index_map)) {
+      if (varRecords[i].intersects_features (this, l->feature_map_w_duplicates)) {
         keep_up_to = i;
         break;
       }
@@ -4783,13 +4865,13 @@
 
   hb_position_t get_x_delta (hb_font_t *font,
                              const ItemVariationStore &store,
-                             ItemVariationStore::cache_t *store_cache = nullptr) const
-  { return !font->num_coords ? 0 : font->em_scalef_x (get_delta (font, store, store_cache)); }
+                             hb_scalar_cache_t *store_cache = nullptr) const
+  { return !font->has_nonzero_coords ? 0 : font->em_scalef_x (get_delta (font, store, store_cache)); }
 
   hb_position_t get_y_delta (hb_font_t *font,
                              const ItemVariationStore &store,
-                             ItemVariationStore::cache_t *store_cache = nullptr) const
-  { return !font->num_coords ? 0 : font->em_scalef_y (get_delta (font, store, store_cache)); }
+                             hb_scalar_cache_t *store_cache = nullptr) const
+  { return !font->has_nonzero_coords ? 0 : font->em_scalef_y (get_delta (font, store, store_cache)); }
 
   VariationDevice* copy (hb_serialize_context_t *c,
                          const hb_hashmap_t> *layout_variation_idx_delta_map) const
@@ -4823,9 +4905,9 @@
 
   float get_delta (hb_font_t *font,
                    const ItemVariationStore &store,
-                   ItemVariationStore::cache_t *store_cache = nullptr) const
+                   hb_scalar_cache_t *store_cache = nullptr) const
   {
-    return store.get_delta (varIdx, font->coords, font->num_coords, (ItemVariationStore::cache_t *) store_cache);
+    return store.get_delta (varIdx, font->coords, font->num_coords, store_cache);
   }
 
   protected:
@@ -4850,7 +4932,7 @@
 {
   hb_position_t get_x_delta (hb_font_t *font,
                              const ItemVariationStore &store=Null (ItemVariationStore),
-                             ItemVariationStore::cache_t *store_cache = nullptr) const
+                             hb_scalar_cache_t *store_cache = nullptr) const
   {
     switch (u.b.format)
     {
@@ -4868,7 +4950,7 @@
   }
   hb_position_t get_y_delta (hb_font_t *font,
                              const ItemVariationStore &store=Null (ItemVariationStore),
-                             ItemVariationStore::cache_t *store_cache = nullptr) const
+                             hb_scalar_cache_t *store_cache = nullptr) const
   {
     switch (u.b.format)
     {
@@ -4954,6 +5036,18 @@
     }
   }
 
+  bool is_variation_device () const
+  {
+    switch (u.b.format) {
+#ifndef HB_NO_VAR
+    case 0x8000:
+      return true;
+#endif
+    default:
+      return false;
+    }
+  }
+
   protected:
   union {
   DeviceHeader          b;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gpos-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gpos-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gpos-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gpos-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -63,12 +63,20 @@
   c->set_lookup_index (lookup_index);
   c->set_lookup_props (l.get_props ());
 
+  uint32_t stack_match_positions[8];
+  hb_vector_t saved_match_positions;
+  saved_match_positions.set_storage (stack_match_positions);
+  hb_swap (c->match_positions, saved_match_positions);
+
   bool ret = false;
   auto *accel = gpos->get_accel (lookup_index);
-  ret = accel && accel->apply (c, l.get_subtable_count (), false);
+  ret = accel && accel->apply (c, false);
 
   c->set_lookup_index (saved_lookup_index);
   c->set_lookup_props (saved_lookup_props);
+
+  hb_swap (c->match_positions, saved_match_positions);
+
   return ret;
 }
 #endif
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gsub-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gsub-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gsub-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gsub-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -76,12 +76,20 @@
   c->set_lookup_index (lookup_index);
   c->set_lookup_props (l.get_props ());
 
+  uint32_t stack_match_positions[8];
+  hb_vector_t saved_match_positions;
+  saved_match_positions.set_storage (stack_match_positions);
+  hb_swap (c->match_positions, saved_match_positions);
+
   bool ret = false;
   auto *accel = gsub->get_accel (lookup_index);
-  ret = accel && accel->apply (c, l.get_subtable_count (), false);
+  ret = accel && accel->apply (c, false);
 
   c->set_lookup_index (saved_lookup_index);
   c->set_lookup_props (saved_lookup_props);
+
+  hb_swap (c->match_positions, saved_match_positions);
+
   return ret;
 }
 #endif
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gsubgpos.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gsubgpos.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gsubgpos.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout-gsubgpos.hh	2026-04-17 19:09:35.000000000 +0000
@@ -397,303 +397,311 @@
   set_t *set;
 };
 
-struct hb_ot_apply_context_t :
-       hb_dispatch_context_t
+struct matcher_t
 {
-  struct matcher_t
-  {
-    typedef bool (*match_func_t) (hb_glyph_info_t &info, unsigned value, const void *data);
+  typedef bool (*match_func_t) (hb_glyph_info_t &info, unsigned value, const void *data);
 
-    void set_ignore_zwnj (bool ignore_zwnj_) { ignore_zwnj = ignore_zwnj_; }
-    void set_ignore_zwj (bool ignore_zwj_) { ignore_zwj = ignore_zwj_; }
-    void set_ignore_hidden (bool ignore_hidden_) { ignore_hidden = ignore_hidden_; }
-    void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; }
-    void set_mask (hb_mask_t mask_) { mask = mask_; }
-    void set_per_syllable (bool per_syllable_) { per_syllable = per_syllable_; }
-    void set_syllable (uint8_t syllable_)  { syllable = per_syllable ? syllable_ : 0; }
-    void set_match_func (match_func_t match_func_,
-                         const void *match_data_)
-    { match_func = match_func_; match_data = match_data_; }
-
-    enum may_match_t {
-      MATCH_NO,
-      MATCH_YES,
-      MATCH_MAYBE
-    };
+  template 
+  void init (const context_t *c, bool context_match = false)
+  {
+    set_match_func (nullptr, nullptr);
+    lookup_props = c->lookup_props;
+    /* Ignore ZWNJ if we are matching GPOS, or matching GSUB context and asked to. */
+    ignore_zwnj = c->table_index == 1 || (context_match && c->auto_zwnj);
+    /* Ignore ZWJ if we are matching context, or asked to. */
+    ignore_zwj = context_match || c->auto_zwj;
+    /* Ignore hidden glyphs (like CGJ) during GPOS. */
+    ignore_hidden = c->table_index == 1;
+    mask = context_match ? -1 : c->lookup_mask;
+    /* Per syllable matching is only for GSUB. */
+    per_syllable = c->table_index == 0 && c->per_syllable;
+    syllable = 0;
+  }
+
+  void set_match_func (match_func_t match_func_,
+                       const void *match_data_)
+  { match_func = match_func_; match_data = match_data_; }
+
+  enum may_match_t {
+    MATCH_NO,
+    MATCH_YES,
+    MATCH_MAYBE
+  };
 
 #ifndef HB_OPTIMIZE_SIZE
-    HB_ALWAYS_INLINE
+  HB_ALWAYS_INLINE
 #endif
-    may_match_t may_match (hb_glyph_info_t &info,
-                           hb_codepoint_t glyph_data) const
-    {
-      if (!(info.mask & mask) ||
-          (syllable && syllable != info.syllable ()))
-        return MATCH_NO;
+  may_match_t may_match (hb_glyph_info_t &info,
+                         hb_codepoint_t glyph_data) const
+  {
+    if (!(info.mask & mask) ||
+        (per_syllable && syllable && syllable != info.syllable ()))
+      return MATCH_NO;
 
-      if (match_func)
-        return match_func (info, glyph_data, match_data) ? MATCH_YES : MATCH_NO;
+    if (match_func)
+      return match_func (info, glyph_data, match_data) ? MATCH_YES : MATCH_NO;
 
-      return MATCH_MAYBE;
-    }
+    return MATCH_MAYBE;
+  }
 
-    enum may_skip_t {
-      SKIP_NO,
-      SKIP_YES,
-      SKIP_MAYBE
-    };
+  enum may_skip_t {
+    SKIP_NO,
+    SKIP_YES,
+    SKIP_MAYBE
+  };
 
+  template 
 #ifndef HB_OPTIMIZE_SIZE
-    HB_ALWAYS_INLINE
+  HB_ALWAYS_INLINE
 #endif
-    may_skip_t may_skip (const hb_ot_apply_context_t *c,
-                         const hb_glyph_info_t       &info) const
-    {
-      if (!c->check_glyph_property (&info, lookup_props))
-        return SKIP_YES;
+  may_skip_t may_skip (const context_t *c,
+                       const hb_glyph_info_t &info) const
+  {
+    if (!c->check_glyph_property (&info, lookup_props))
+      return SKIP_YES;
 
-      if (unlikely (_hb_glyph_info_is_default_ignorable (&info) &&
-                    (ignore_zwnj || !_hb_glyph_info_is_zwnj (&info)) &&
-                    (ignore_zwj || !_hb_glyph_info_is_zwj (&info)) &&
-                    (ignore_hidden || !_hb_glyph_info_is_hidden (&info))))
-        return SKIP_MAYBE;
-
-      return SKIP_NO;
-    }
-
-    protected:
-    unsigned int lookup_props = 0;
-    hb_mask_t mask = -1;
-    bool ignore_zwnj = false;
-    bool ignore_zwj = false;
-    bool ignore_hidden = false;
-    bool per_syllable = false;
-    uint8_t syllable = 0;
-    match_func_t match_func = nullptr;
-    const void *match_data = nullptr;
-  };
+    if (unlikely (_hb_glyph_info_is_default_ignorable (&info) &&
+                  (ignore_zwnj || !_hb_glyph_info_is_zwnj (&info)) &&
+                  (ignore_zwj || !_hb_glyph_info_is_zwj (&info)) &&
+                  (ignore_hidden || !_hb_glyph_info_is_hidden (&info))))
+      return SKIP_MAYBE;
+
+    return SKIP_NO;
+  }
 
-  struct skipping_iterator_t
+  public:
+  unsigned int lookup_props = 0;
+  hb_mask_t mask = -1;
+  bool ignore_zwnj = false;
+  bool ignore_zwj = false;
+  bool ignore_hidden = false;
+  bool per_syllable = false;
+  uint8_t syllable = 0;
+  match_func_t match_func = nullptr;
+  const void *match_data = nullptr;
+};
+
+template 
+struct skipping_iterator_t
+{
+  void init (context_t *c_, bool context_match = false)
   {
-    void init (hb_ot_apply_context_t *c_, bool context_match = false)
-    {
-      c = c_;
-      end = c->buffer->len;
-      match_glyph_data16 = nullptr;
+    c = c_;
+    end = c->buffer->len;
+    match_glyph_data16 = nullptr;
 #ifndef HB_NO_BEYOND_64K
-      match_glyph_data24 = nullptr;
+    match_glyph_data24 = nullptr;
 #endif
-      matcher.set_match_func (nullptr, nullptr);
-      matcher.set_lookup_props (c->lookup_props);
-      /* Ignore ZWNJ if we are matching GPOS, or matching GSUB context and asked to. */
-      matcher.set_ignore_zwnj (c->table_index == 1 || (context_match && c->auto_zwnj));
-      /* Ignore ZWJ if we are matching context, or asked to. */
-      matcher.set_ignore_zwj  (context_match || c->auto_zwj);
-      /* Ignore hidden glyphs (like CGJ) during GPOS. */
-      matcher.set_ignore_hidden (c->table_index == 1);
-      matcher.set_mask (context_match ? -1 : c->lookup_mask);
-      /* Per syllable matching is only for GSUB. */
-      matcher.set_per_syllable (c->table_index == 0 && c->per_syllable);
-      matcher.set_syllable (0);
-    }
-    void set_lookup_props (unsigned int lookup_props)
-    {
-      matcher.set_lookup_props (lookup_props);
-    }
-    void set_match_func (matcher_t::match_func_t match_func_,
-                         const void *match_data_)
-    {
-      matcher.set_match_func (match_func_, match_data_);
-    }
-    void set_glyph_data (const HBUINT16 glyph_data[])
-    {
-      match_glyph_data16 = glyph_data;
+    matcher.init (c, context_match);
+  }
+  void set_lookup_props (unsigned int lookup_props)
+  {
+    matcher.lookup_props = lookup_props;
+  }
+  void set_match_func (matcher_t::match_func_t match_func_,
+                       const void *match_data_)
+  {
+    matcher.set_match_func (match_func_, match_data_);
+  }
+  void set_glyph_data (const HBUINT16 glyph_data[])
+  {
+    match_glyph_data16 = glyph_data;
 #ifndef HB_NO_BEYOND_64K
-      match_glyph_data24 = nullptr;
+    match_glyph_data24 = nullptr;
 #endif
-    }
+  }
 #ifndef HB_NO_BEYOND_64K
-    void set_glyph_data (const HBUINT24 glyph_data[])
-    {
-      match_glyph_data16 = nullptr;
-      match_glyph_data24 = glyph_data;
-    }
+  void set_glyph_data (const HBUINT24 glyph_data[])
+  {
+    match_glyph_data16 = nullptr;
+    match_glyph_data24 = glyph_data;
+  }
 #endif
 
 #ifndef HB_OPTIMIZE_SIZE
-    HB_ALWAYS_INLINE
+  HB_ALWAYS_INLINE
 #endif
-    void reset (unsigned int start_index_)
-    {
-      idx = start_index_;
-      end = c->buffer->len;
-      matcher.set_syllable (start_index_ == c->buffer->idx ? c->buffer->cur().syllable () : 0);
-    }
+  void reset (unsigned int start_index_)
+  {
+    // For GSUB forward iterator
+    idx = start_index_;
+    end = c->buffer->len;
+    matcher.syllable = c->buffer->cur().syllable();
+  }
+  void reset_back (unsigned int start_index_, bool from_out_buffer = false)
+  {
+    // For GSUB backward iterator
+    idx = start_index_;
+    matcher.syllable = c->buffer->cur().syllable();
+  }
 
 #ifndef HB_OPTIMIZE_SIZE
-    HB_ALWAYS_INLINE
+  HB_ALWAYS_INLINE
 #endif
-    void reset_fast (unsigned int start_index_)
-    {
-      // Doesn't set end or syllable. Used by GPOS which doesn't care / change.
-      idx = start_index_;
-    }
-
-    void reject ()
-    {
-      backup_glyph_data ();
-    }
+  void reset_fast (unsigned int start_index_)
+  {
+    // Doesn't set end or syllable. Used by GPOS which doesn't care / change.
+    idx = start_index_;
+  }
 
-    matcher_t::may_skip_t
 #ifndef HB_OPTIMIZE_SIZE
-    HB_ALWAYS_INLINE
+  HB_ALWAYS_INLINE
 #endif
-    may_skip (const hb_glyph_info_t &info) const
-    { return matcher.may_skip (c, info); }
+  matcher_t::may_skip_t may_skip (const hb_glyph_info_t &info) const
+  { return matcher.may_skip (c, info); }
 
-    enum match_t {
-      MATCH,
-      NOT_MATCH,
-      SKIP
-    };
+  enum match_t {
+    MATCH,
+    NOT_MATCH,
+    SKIP
+  };
 
 #ifndef HB_OPTIMIZE_SIZE
-    HB_ALWAYS_INLINE
+  HB_ALWAYS_INLINE
 #endif
-    match_t match (hb_glyph_info_t &info)
-    {
-      matcher_t::may_skip_t skip = matcher.may_skip (c, info);
-      if (unlikely (skip == matcher_t::SKIP_YES))
-        return SKIP;
-
-      matcher_t::may_match_t match = matcher.may_match (info, get_glyph_data ());
-      if (match == matcher_t::MATCH_YES ||
-          (match == matcher_t::MATCH_MAYBE &&
-           skip == matcher_t::SKIP_NO))
-        return MATCH;
+  match_t match (hb_glyph_info_t &info)
+  {
+    matcher_t::may_skip_t skip = matcher.may_skip (c, info);
+    if (unlikely (skip == matcher_t::SKIP_YES))
+      return SKIP;
 
-      if (skip == matcher_t::SKIP_NO)
-        return NOT_MATCH;
+    matcher_t::may_match_t match = matcher.may_match (info, get_glyph_data ());
+    if (match == matcher_t::MATCH_YES ||
+        (match == matcher_t::MATCH_MAYBE &&
+         skip == matcher_t::SKIP_NO))
+      return MATCH;
 
-      return SKIP;
+    if (skip == matcher_t::SKIP_NO)
+      return NOT_MATCH;
+
+    return SKIP;
   }
 
 #ifndef HB_OPTIMIZE_SIZE
-    HB_ALWAYS_INLINE
+  HB_ALWAYS_INLINE
 #endif
-    bool next (unsigned *unsafe_to = nullptr)
+  bool next (unsigned *unsafe_to = nullptr)
+  {
+    auto *info = c->buffer->info;
+    const signed stop = (signed) end - 1;
+    while ((signed) idx < stop)
     {
-      const signed stop = (signed) end - 1;
-      while ((signed) idx < stop)
+      idx++;
+      switch (match (info[idx]))
       {
-        idx++;
-        switch (match (c->buffer->info[idx]))
+        case MATCH:
         {
-          case MATCH:
-          {
-            advance_glyph_data ();
-            return true;
-          }
-          case NOT_MATCH:
-          {
-            if (unsafe_to)
-              *unsafe_to = idx + 1;
-            return false;
-          }
-          case SKIP:
-            continue;
+          advance_glyph_data ();
+          return true;
+        }
+        case NOT_MATCH:
+        {
+          if (unsafe_to)
+            *unsafe_to = idx + 1;
+          return false;
         }
+        case SKIP:
+          continue;
       }
-      if (unsafe_to)
-        *unsafe_to = end;
-      return false;
     }
+    if (unsafe_to)
+      *unsafe_to = end;
+    return false;
+  }
 #ifndef HB_OPTIMIZE_SIZE
-    HB_ALWAYS_INLINE
+  HB_ALWAYS_INLINE
 #endif
-    bool prev (unsigned *unsafe_from = nullptr)
+  bool prev (unsigned *unsafe_from = nullptr)
+  {
+    auto *out_info = c->buffer->out_info;
+    const unsigned stop = 0;
+    while (idx > stop)
     {
-      const unsigned stop = 0;
-      while (idx > stop)
+      idx--;
+      switch (match (out_info[idx]))
       {
-        idx--;
-        switch (match (c->buffer->out_info[idx]))
+        case MATCH:
         {
-          case MATCH:
-          {
-            advance_glyph_data ();
-            return true;
-          }
-          case NOT_MATCH:
-          {
-            if (unsafe_from)
-              *unsafe_from = hb_max (1u, idx) - 1u;
-            return false;
-          }
-          case SKIP:
-            continue;
+          advance_glyph_data ();
+          return true;
+        }
+        case NOT_MATCH:
+        {
+          if (unsafe_from)
+            *unsafe_from = hb_max (1u, idx) - 1u;
+          return false;
         }
+        case SKIP:
+          continue;
       }
-      if (unsafe_from)
-        *unsafe_from = 0;
-      return false;
     }
+    if (unsafe_from)
+      *unsafe_from = 0;
+    return false;
+  }
 
-    HB_ALWAYS_INLINE
-    hb_codepoint_t
-    get_glyph_data ()
-    {
-      if (match_glyph_data16) return *match_glyph_data16;
-#ifndef HB_NO_BEYOND_64K
-      else
-      if (match_glyph_data24) return *match_glyph_data24;
-#endif
-      return 0;
-    }
-    HB_ALWAYS_INLINE
-    void
-    advance_glyph_data ()
-    {
-      if (match_glyph_data16) match_glyph_data16++;
+  HB_ALWAYS_INLINE
+  hb_codepoint_t
+  get_glyph_data ()
+  {
+    if (match_glyph_data16) return *match_glyph_data16;
 #ifndef HB_NO_BEYOND_64K
-      else
-      if (match_glyph_data24) match_glyph_data24++;
+    else
+    if (match_glyph_data24) return *match_glyph_data24;
 #endif
-    }
-    void
-    backup_glyph_data ()
-    {
-      if (match_glyph_data16) match_glyph_data16--;
+    return 0;
+  }
+  HB_ALWAYS_INLINE
+  void
+  advance_glyph_data ()
+  {
+    if (match_glyph_data16) match_glyph_data16++;
 #ifndef HB_NO_BEYOND_64K
-      else
-      if (match_glyph_data24) match_glyph_data24--;
+    else
+    if (match_glyph_data24) match_glyph_data24++;
 #endif
-    }
+  }
 
-    unsigned int idx;
-    protected:
-    hb_ot_apply_context_t *c;
-    matcher_t matcher;
-    const HBUINT16 *match_glyph_data16;
+  unsigned int idx;
+  protected:
+  context_t *c;
+  matcher_t matcher;
+  const HBUINT16 *match_glyph_data16;
 #ifndef HB_NO_BEYOND_64K
-    const HBUINT24 *match_glyph_data24;
+  const HBUINT24 *match_glyph_data24;
 #endif
 
-    unsigned int end;
-  };
-
+  unsigned int end;
+};
 
+struct hb_ot_apply_context_t :
+       hb_dispatch_context_t
+{
   const char *get_name () { return "APPLY"; }
   typedef return_t (*recurse_func_t) (hb_ot_apply_context_t *c, unsigned int lookup_index);
+
+  template 
+  static inline auto apply_ (const T &obj, hb_ot_apply_context_t *c, hb_priority<1>) HB_RETURN (return_t, obj.apply (c, nullptr) )
+  template 
+  static inline auto apply_ (const T &obj, hb_ot_apply_context_t *c, hb_priority<0>) HB_RETURN (return_t, obj.apply (c) )
   template 
-  return_t dispatch (const T &obj) { return obj.apply (this); }
+  return_t dispatch (const T &obj) { return apply_(obj, this, hb_prioritize); }
+
   static return_t default_return_value () { return false; }
   bool stop_sublookup_iteration (return_t r) const { return r; }
   return_t recurse (unsigned int sub_lookup_index)
   {
-    if (unlikely (nesting_level_left == 0 || !recurse_func || buffer->max_ops-- <= 0))
+    assert (recurse_func);
+    if (unlikely (nesting_level_left == 0))
+    {
+      buffer->successful = false;
+      return default_return_value ();
+    }
+
+    buffer->max_ops--;
+    if (unlikely (buffer->max_ops < 0))
     {
-      buffer->shaping_failed = true;
+      buffer->successful = false;
       return default_return_value ();
     }
 
@@ -703,7 +711,7 @@
     return ret;
   }
 
-  skipping_iterator_t iter_input, iter_context;
+  skipping_iterator_t iter_input, iter_context;
 
   unsigned int table_index; /* GSUB/GPOS */
   hb_font_t *font;
@@ -715,8 +723,7 @@
   const GDEF::accelerator_t &gdef_accel;
   const hb_ot_layout_lookup_accelerator_t *lookup_accel = nullptr;
   const ItemVariationStore &var_store;
-  ItemVariationStore::cache_t *var_store_cache;
-  hb_set_digest_t digest;
+  hb_scalar_cache_t *var_store_cache;
 
   hb_direction_t direction;
   hb_mask_t lookup_mask = 1;
@@ -734,11 +741,14 @@
   signed last_base = -1; // GPOS uses
   unsigned last_base_until = 0; // GPOS uses
 
+  hb_vector_t match_positions;
+  uint32_t stack_match_positions[8];
+
   hb_ot_apply_context_t (unsigned int table_index_,
                          hb_font_t *font_,
                          hb_buffer_t *buffer_,
                          hb_blob_t *table_blob_,
-                         ItemVariationStore::cache_t *var_store_cache_ = nullptr) :
+                         hb_scalar_cache_t *var_store_cache_ = nullptr) :
                         table_index (table_index_),
                         font (font_), face (font->face), buffer (buffer_),
                         sanitizer (table_blob_),
@@ -762,7 +772,7 @@
                         has_glyph_classes (gdef.has_glyph_classes ())
   {
     init_iters ();
-    buffer->collect_codepoints (digest);
+    match_positions.set_storage (stack_match_positions);
   }
 
   void init_iters ()
@@ -778,7 +788,11 @@
   void set_random (bool random_) { random = random_; }
   void set_recurse_func (recurse_func_t func) { recurse_func = func; }
   void set_lookup_index (unsigned int lookup_index_) { lookup_index = lookup_index_; }
-  void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; init_iters (); }
+  void set_lookup_props (unsigned int lookup_props_)
+  {
+    lookup_props = gdef_accel.sanitize_lookup_props (lookup_props_);
+    init_iters ();
+  }
 
   uint32_t random_number ()
   {
@@ -787,7 +801,9 @@
     return buffer->random_state;
   }
 
-  bool match_properties_mark (hb_codepoint_t  glyph,
+  HB_ALWAYS_INLINE
+  HB_HOT
+  bool match_properties_mark (const hb_glyph_info_t *info,
                               unsigned int    glyph_props,
                               unsigned int    match_props) const
   {
@@ -795,7 +811,7 @@
      * match_props has the set index.
      */
     if (match_props & LookupFlag::UseMarkFilteringSet)
-      return gdef_accel.mark_set_covers (match_props >> 16, glyph);
+      return gdef_accel.mark_set_covers (match_props >> 16, info->codepoint);
 
     /* The second byte of match_props has the meaning
      * "ignore marks of attachment type different than
@@ -811,7 +827,7 @@
   HB_ALWAYS_INLINE
 #endif
   bool check_glyph_property (const hb_glyph_info_t *info,
-                             unsigned int  match_props) const
+                             unsigned match_props) const
   {
     unsigned int glyph_props = _hb_glyph_info_get_glyph_props (info);
 
@@ -821,8 +837,8 @@
     if (glyph_props & match_props & LookupFlag::IgnoreFlags)
       return false;
 
-    if (unlikely (glyph_props & HB_OT_LAYOUT_GLYPH_PROPS_MARK))
-      return match_properties_mark (info->codepoint, glyph_props, match_props);
+    if (glyph_props & HB_OT_LAYOUT_GLYPH_PROPS_MARK)
+      return match_properties_mark (info, glyph_props, match_props);
 
     return true;
   }
@@ -832,7 +848,7 @@
                           bool ligature = false,
                           bool component = false)
   {
-    digest.add (glyph_index);
+    buffer->digest.add (glyph_index);
 
     if (new_syllables != (unsigned) -1)
       buffer->cur().syllable() = new_syllables;
@@ -890,54 +906,58 @@
   }
 };
 
-enum class hb_ot_lookup_cache_op_t
+enum class hb_ot_subtable_cache_op_t
 {
-  CREATE,
   ENTER,
   LEAVE,
-  DESTROY,
 };
 
 struct hb_accelerate_subtables_context_t :
        hb_dispatch_context_t
 {
-  template 
-  static inline bool apply_to (const void *obj, hb_ot_apply_context_t *c)
+  template 
+  static inline auto apply_ (const T *obj, hb_ot_apply_context_t *c, void *external_cache, hb_priority<1>) HB_RETURN (bool, obj->apply (c, external_cache) )
+  template 
+  static inline auto apply_ (const T *obj, hb_ot_apply_context_t *c, void *external_cache, hb_priority<0>) HB_RETURN (bool, obj->apply (c) )
+  template 
+  static inline bool apply_to (const void *obj, hb_ot_apply_context_t *c, void *external_cache)
   {
-    const Type *typed_obj = (const Type *) obj;
-    return typed_obj->apply (c);
+    const T *typed_obj = (const T *) obj;
+    return apply_ (typed_obj, c, external_cache, hb_prioritize);
   }
 
 #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
   template 
-  static inline auto apply_cached_ (const T *obj, hb_ot_apply_context_t *c, hb_priority<1>) HB_RETURN (bool, obj->apply_cached (c) )
+  static inline auto apply_cached_ (const T *obj, hb_ot_apply_context_t *c, void *external_cache, hb_priority<2>) HB_RETURN (bool, obj->apply_cached (c, external_cache) )
   template 
-  static inline auto apply_cached_ (const T *obj, hb_ot_apply_context_t *c, hb_priority<0>) HB_RETURN (bool, obj->apply (c) )
-  template 
-  static inline bool apply_cached_to (const void *obj, hb_ot_apply_context_t *c)
+  static inline auto apply_cached_ (const T *obj, hb_ot_apply_context_t *c, void *external_cache, hb_priority<1>) HB_RETURN (bool, obj->apply (c, external_cache) )
+  template 
+  static inline auto apply_cached_ (const T *obj, hb_ot_apply_context_t *c, void *external_cache, hb_priority<0>) HB_RETURN (bool, obj->apply (c) )
+  template 
+  static inline bool apply_cached_to (const void *obj, hb_ot_apply_context_t *c, void *external_cache)
   {
-    const Type *typed_obj = (const Type *) obj;
-    return apply_cached_ (typed_obj, c, hb_prioritize);
+    const T *typed_obj = (const T *) obj;
+    return apply_cached_ (typed_obj, c, external_cache, hb_prioritize);
   }
 
   template 
-  static inline auto cache_func_ (void *p,
-                                  hb_ot_lookup_cache_op_t op,
-                                  hb_priority<1>) HB_RETURN (void *, T::cache_func (p, op) )
+  static inline auto cache_func_ (hb_ot_apply_context_t *c,
+                                  hb_ot_subtable_cache_op_t op,
+                                  hb_priority<1>) HB_RETURN (bool, T::cache_func (c, op) )
   template 
-  static inline void * cache_func_ (void *p,
-                                    hb_ot_lookup_cache_op_t op HB_UNUSED,
-                                    hb_priority<0>) { return (void *) false; }
+  static inline bool cache_func_ (hb_ot_apply_context_t *c,
+                                  hb_ot_subtable_cache_op_t op HB_UNUSED,
+                                  hb_priority<0>) { return false; }
   template 
-  static inline void * cache_func_to (void *p,
-                                      hb_ot_lookup_cache_op_t op)
+  static inline bool cache_func_to (hb_ot_apply_context_t *c,
+                                    hb_ot_subtable_cache_op_t op)
   {
-    return cache_func_ (p, op, hb_prioritize);
+    return cache_func_ (c, op, hb_prioritize);
   }
 #endif
 
-  typedef bool (*hb_apply_func_t) (const void *obj, hb_ot_apply_context_t *c);
-  typedef void * (*hb_cache_func_t) (void *p, hb_ot_lookup_cache_op_t op);
+  typedef bool (*hb_apply_func_t) (const void *obj, hb_ot_apply_context_t *c, void *external_cache);
+  typedef bool (*hb_cache_func_t) (hb_ot_apply_context_t *c, hb_ot_subtable_cache_op_t op);
 
   struct hb_applicable_t
   {
@@ -950,6 +970,7 @@
 #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
                , hb_apply_func_t apply_cached_func_
                , hb_cache_func_t cache_func_
+               , void *external_cache_
 #endif
                 )
     {
@@ -958,27 +979,34 @@
 #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
       apply_cached_func = apply_cached_func_;
       cache_func = cache_func_;
+      external_cache = external_cache_;
 #endif
       digest.init ();
       obj_.get_coverage ().collect_coverage (&digest);
     }
 
+#ifdef HB_NO_OT_LAYOUT_LOOKUP_CACHE
     bool apply (hb_ot_apply_context_t *c) const
     {
-      return digest.may_have (c->buffer->cur().codepoint) && apply_func (obj, c);
+      return digest.may_have (c->buffer->cur().codepoint) && apply_func (obj, c, nullptr);
+    }
+#else
+    bool apply (hb_ot_apply_context_t *c) const
+    {
+      return digest.may_have (c->buffer->cur().codepoint) && apply_func (obj, c, external_cache);
     }
-#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
     bool apply_cached (hb_ot_apply_context_t *c) const
     {
-      return digest.may_have (c->buffer->cur().codepoint) &&  apply_cached_func (obj, c);
+      return digest.may_have (c->buffer->cur().codepoint) &&  apply_cached_func (obj, c, external_cache);
     }
+
     bool cache_enter (hb_ot_apply_context_t *c) const
     {
-      return (bool) cache_func (c, hb_ot_lookup_cache_op_t::ENTER);
+      return cache_func (c, hb_ot_subtable_cache_op_t::ENTER);
     }
     void cache_leave (hb_ot_apply_context_t *c) const
     {
-      cache_func (c, hb_ot_lookup_cache_op_t::LEAVE);
+      cache_func (c, hb_ot_subtable_cache_op_t::LEAVE);
     }
 #endif
 
@@ -988,6 +1016,7 @@
 #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
     hb_apply_func_t apply_cached_func;
     hb_cache_func_t cache_func;
+    void *external_cache;
 #endif
     hb_set_digest_t digest;
   };
@@ -997,12 +1026,23 @@
   auto cache_cost (const T &obj, hb_priority<1>) HB_AUTO_RETURN ( obj.cache_cost () )
   template 
   auto cache_cost (const T &obj, hb_priority<0>) HB_AUTO_RETURN ( 0u )
+
+  template 
+  auto external_cache_create (const T &obj, hb_priority<1>) HB_AUTO_RETURN ( obj.external_cache_create () )
+  template 
+  auto external_cache_create (const T &obj, hb_priority<0>) HB_AUTO_RETURN ( nullptr )
 #endif
 
   /* Dispatch interface. */
   template 
   return_t dispatch (const T &obj)
   {
+#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
+    void *external_cache = nullptr;
+    if (i < 8)
+      external_cache = external_cache_create (obj, hb_prioritize);
+#endif
+
     hb_applicable_t *entry = &array[i++];
 
     entry->init (obj,
@@ -1010,6 +1050,7 @@
 #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
                  , apply_cached_to
                  , cache_func_to
+                 , external_cache
 #endif
                  );
 
@@ -1023,10 +1064,10 @@
      * and we allocate the cache opportunity to the costliest subtable.
      */
     unsigned cost = cache_cost (obj, hb_prioritize);
-    if (cost > cache_user_cost)
+    if (cost > subtable_cache_user_cost)
     {
-      cache_user_idx = i - 1;
-      cache_user_cost = cost;
+      subtable_cache_user_idx = i - 1;
+      subtable_cache_user_cost = cost;
     }
 #endif
 
@@ -1041,8 +1082,8 @@
   unsigned i = 0;
 
 #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
-  unsigned cache_user_idx = (unsigned) -1;
-  unsigned cache_user_cost = 0;
+  unsigned subtable_cache_user_idx = (unsigned) -1;
+  unsigned subtable_cache_user_cost = 0;
 #endif
 };
 
@@ -1191,38 +1232,50 @@
   const ClassDef &class_def = *reinterpret_cast(data);
   return class_def.get_class (info.codepoint) == value;
 }
-static inline bool match_class_cached (hb_glyph_info_t &info, unsigned value, const void *data)
+static inline unsigned get_class_cached (const ClassDef &class_def, hb_glyph_info_t &info)
 {
   unsigned klass = info.syllable();
   if (klass < 255)
-    return klass == value;
-  const ClassDef &class_def = *reinterpret_cast(data);
+    return klass;
   klass = class_def.get_class (info.codepoint);
   if (likely (klass < 255))
     info.syllable() = klass;
-  return klass == value;
+  return klass;
 }
-static inline bool match_class_cached1 (hb_glyph_info_t &info, unsigned value, const void *data)
+static inline bool match_class_cached (hb_glyph_info_t &info, unsigned value, const void *data)
+{
+  const ClassDef &class_def = *reinterpret_cast(data);
+  return get_class_cached (class_def, info) == value;
+}
+static inline unsigned get_class_cached1 (const ClassDef &class_def, hb_glyph_info_t &info)
 {
   unsigned klass = info.syllable() & 0x0F;
   if (klass < 15)
-    return klass == value;
-  const ClassDef &class_def = *reinterpret_cast(data);
+    return klass;
   klass = class_def.get_class (info.codepoint);
   if (likely (klass < 15))
     info.syllable() = (info.syllable() & 0xF0) | klass;
-  return klass == value;
+  return klass;
 }
-static inline bool match_class_cached2 (hb_glyph_info_t &info, unsigned value, const void *data)
+static inline bool match_class_cached1 (hb_glyph_info_t &info, unsigned value, const void *data)
+{
+  const ClassDef &class_def = *reinterpret_cast(data);
+  return get_class_cached1 (class_def, info) == value;
+}
+static inline unsigned get_class_cached2 (const ClassDef &class_def, hb_glyph_info_t &info)
 {
   unsigned klass = (info.syllable() & 0xF0) >> 4;
   if (klass < 15)
-    return klass == value;
-  const ClassDef &class_def = *reinterpret_cast(data);
+    return klass;
   klass = class_def.get_class (info.codepoint);
   if (likely (klass < 15))
     info.syllable() = (info.syllable() & 0x0F) | (klass << 4);
-  return klass == value;
+  return klass;
+}
+static inline bool match_class_cached2 (hb_glyph_info_t &info, unsigned value, const void *data)
+{
+  const ClassDef &class_def = *reinterpret_cast(data);
+  return get_class_cached2 (class_def, info) == value;
 }
 static inline bool match_coverage (hb_glyph_info_t &info, unsigned value, const void *data)
 {
@@ -1261,16 +1314,24 @@
                          match_func_t match_func,
                          const void *match_data,
                          unsigned int *end_position,
-                         unsigned int *match_positions,
                          unsigned int *p_total_component_count = nullptr)
 {
   TRACE_APPLY (nullptr);
 
-  if (unlikely (count > HB_MAX_CONTEXT_LENGTH)) return_trace (false);
-
   hb_buffer_t *buffer = c->buffer;
 
-  hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+  if (count == 1)
+  {
+    *end_position = buffer->idx + 1;
+    c->match_positions[0] = buffer->idx;
+    if (p_total_component_count)
+      *p_total_component_count = _hb_glyph_info_get_lig_num_comps (&buffer->cur());
+    return_trace (true);
+  }
+
+  if (unlikely (count > HB_MAX_CONTEXT_LENGTH)) return_trace (false);
+
+  auto &skippy_iter = c->iter_input;
   skippy_iter.reset (buffer->idx);
   skippy_iter.set_match_func (match_func, match_data);
   skippy_iter.set_glyph_data (input);
@@ -1319,7 +1380,10 @@
       return_trace (false);
     }
 
-    match_positions[i] = skippy_iter.idx;
+    if (unlikely (i + 1 > c->match_positions.length &&
+                  !c->match_positions.resize_dirty  (i + 1)))
+      return_trace (false);
+    c->match_positions.arrayZ[i] = skippy_iter.idx;
 
     unsigned int this_lig_id = _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx]);
     unsigned int this_lig_comp = _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]);
@@ -1349,7 +1413,7 @@
             j--;
           }
 
-          if (found && skippy_iter.may_skip (out[j]) == hb_ot_apply_context_t::matcher_t::SKIP_YES)
+          if (found && skippy_iter.may_skip (out[j]) == matcher_t::SKIP_YES)
             ligbase = LIGBASE_MAY_SKIP;
           else
             ligbase = LIGBASE_MAY_NOT_SKIP;
@@ -1379,13 +1443,12 @@
     *p_total_component_count = total_component_count;
   }
 
-  match_positions[0] = buffer->idx;
+  c->match_positions.arrayZ[0] = buffer->idx;
 
   return_trace (true);
 }
 static inline bool ligate_input (hb_ot_apply_context_t *c,
                                  unsigned int count, /* Including the first glyph */
-                                 const unsigned int *match_positions, /* Including the first glyph */
                                  unsigned int match_end,
                                  hb_codepoint_t lig_glyph,
                                  unsigned int total_component_count)
@@ -1428,10 +1491,10 @@
    *   https://bugzilla.gnome.org/show_bug.cgi?id=437633
    */
 
-  bool is_base_ligature = _hb_glyph_info_is_base_glyph (&buffer->info[match_positions[0]]);
-  bool is_mark_ligature = _hb_glyph_info_is_mark (&buffer->info[match_positions[0]]);
+  bool is_base_ligature = _hb_glyph_info_is_base_glyph (&buffer->info[c->match_positions.arrayZ[0]]);
+  bool is_mark_ligature = _hb_glyph_info_is_mark (&buffer->info[c->match_positions.arrayZ[0]]);
   for (unsigned int i = 1; i < count; i++)
-    if (!_hb_glyph_info_is_mark (&buffer->info[match_positions[i]]))
+    if (!_hb_glyph_info_is_mark (&buffer->info[c->match_positions.arrayZ[i]]))
     {
       is_base_ligature = false;
       is_mark_ligature = false;
@@ -1457,7 +1520,7 @@
 
   for (unsigned int i = 1; i < count; i++)
   {
-    while (buffer->idx < match_positions[i] && buffer->successful)
+    while (buffer->idx < c->match_positions.arrayZ[i] && buffer->successful)
     {
       if (is_ligature)
       {
@@ -1512,8 +1575,14 @@
 {
   TRACE_APPLY (nullptr);
 
-  hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
-  skippy_iter.reset (c->buffer->backtrack_len ());
+  if (!count)
+  {
+    *match_start = c->buffer->backtrack_len ();
+    return_trace (true);
+  }
+
+  auto &skippy_iter = c->iter_context;
+  skippy_iter.reset_back (c->buffer->backtrack_len ());
   skippy_iter.set_match_func (match_func, match_data);
   skippy_iter.set_glyph_data (backtrack);
 
@@ -1545,7 +1614,13 @@
 {
   TRACE_APPLY (nullptr);
 
-  hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context;
+  if (!count)
+  {
+    *end_index = start_index;
+    return_trace (true);
+  }
+
+  auto &skippy_iter = c->iter_context;
   assert (start_index >= 1);
   skippy_iter.reset (start_index - 1);
   skippy_iter.set_match_func (match_func, match_data);
@@ -1696,7 +1771,6 @@
 
 static inline void apply_lookup (hb_ot_apply_context_t *c,
                                  unsigned int count, /* Including the first glyph */
-                                 unsigned int *match_positions, /* Including the first glyph */
                                  unsigned int lookupCount,
                                  const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
                                  unsigned int match_end)
@@ -1704,9 +1778,6 @@
   hb_buffer_t *buffer = c->buffer;
   int end;
 
-  unsigned int *match_positions_input = match_positions;
-  unsigned int match_positions_count = count;
-
   /* All positions are distance from beginning of *output* buffer.
    * Adjust. */
   {
@@ -1716,7 +1787,7 @@
     int delta = bl - buffer->idx;
     /* Convert positions to new indexing. */
     for (unsigned int j = 0; j < count; j++)
-      match_positions[j] += delta;
+      c->match_positions.arrayZ[j] += delta;
   }
 
   for (unsigned int i = 0; i < lookupCount && buffer->successful; i++)
@@ -1728,10 +1799,10 @@
     unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len ();
 
     /* This can happen if earlier recursed lookups deleted many entries. */
-    if (unlikely (match_positions[idx] >= orig_len))
+    if (unlikely (c->match_positions.arrayZ[idx] >= orig_len))
       continue;
 
-    if (unlikely (!buffer->move_to (match_positions[idx])))
+    if (unlikely (!buffer->move_to (c->match_positions.arrayZ[idx])))
       break;
 
     if (unlikely (buffer->max_ops <= 0))
@@ -1790,9 +1861,9 @@
      */
 
     end += delta;
-    if (end < int (match_positions[idx]))
+    if (end < int (c->match_positions.arrayZ[idx]))
     {
-      /* End might end up being smaller than match_positions[idx] if the recursed
+      /* End might end up being smaller than match_positions.arrayZ[idx] if the recursed
        * lookup ended up removing many items.
        * Just never rewind end beyond start of current position, since that is
        * not possible in the recursed lookup.  Also adjust delta as such.
@@ -1800,8 +1871,8 @@
        * https://bugs.chromium.org/p/chromium/issues/detail?id=659496
        * https://github.com/harfbuzz/harfbuzz/issues/1611
        */
-      delta += match_positions[idx] - end;
-      end = match_positions[idx];
+      delta += c->match_positions.arrayZ[idx] - end;
+      end = c->match_positions.arrayZ[idx];
     }
 
     unsigned int next = idx + 1; /* next now is the position after the recursed lookup. */
@@ -1810,27 +1881,9 @@
     {
       if (unlikely (delta + count > HB_MAX_CONTEXT_LENGTH))
         break;
-      if (unlikely (delta + count > match_positions_count))
-      {
-        unsigned new_match_positions_count = hb_max (delta + count, hb_max(match_positions_count, 4u) * 1.5);
-        if (match_positions == match_positions_input)
-        {
-          match_positions = (unsigned int *) hb_malloc (new_match_positions_count * sizeof (match_positions[0]));
-          if (unlikely (!match_positions))
-            break;
-          memcpy (match_positions, match_positions_input, count * sizeof (match_positions[0]));
-          match_positions_count = new_match_positions_count;
-        }
-        else
-        {
-          unsigned int *new_match_positions = (unsigned int *) hb_realloc (match_positions, new_match_positions_count * sizeof (match_positions[0]));
-          if (unlikely (!new_match_positions))
-            break;
-          match_positions = new_match_positions;
-          match_positions_count = new_match_positions_count;
-        }
-      }
-
+      if (unlikely (count + delta > c->match_positions.length &&
+                    !c->match_positions.resize_dirty  (count + delta)))
+        return;
     }
     else
     {
@@ -1840,23 +1893,20 @@
     }
 
     /* Shift! */
-    memmove (match_positions + next + delta, match_positions + next,
-             (count - next) * sizeof (match_positions[0]));
+    memmove (c->match_positions + next + delta, c->match_positions + next,
+             (count - next) * sizeof (c->match_positions.arrayZ[0]));
     next += delta;
     count += delta;
 
     /* Fill in new entries. */
     for (unsigned int j = idx + 1; j < next; j++)
-      match_positions[j] = match_positions[j - 1] + 1;
+      c->match_positions.arrayZ[j] = c->match_positions.arrayZ[j - 1] + 1;
 
     /* And fixup the rest. */
     for (; next < count; next++)
-      match_positions[next] += delta;
+      c->match_positions.arrayZ[next] += delta;
   }
 
-  if (match_positions != match_positions_input)
-    hb_free (match_positions);
-
   assert (end >= 0);
   (void) buffer->move_to (end);
 }
@@ -1950,34 +2000,25 @@
 }
 
 template 
-HB_ALWAYS_INLINE
-static bool context_apply_lookup (hb_ot_apply_context_t *c,
-                                  unsigned int inputCount, /* Including the first glyph (not matched) */
-                                  const HBUINT input[], /* Array of input values--start with second glyph */
-                                  unsigned int lookupCount,
-                                  const LookupRecord lookupRecord[],
-                                  const ContextApplyLookupContext &lookup_context)
+static inline bool context_apply_lookup (hb_ot_apply_context_t *c,
+                                         unsigned int inputCount, /* Including the first glyph (not matched) */
+                                         const HBUINT input[], /* Array of input values--start with second glyph */
+                                         unsigned int lookupCount,
+                                         const LookupRecord lookupRecord[],
+                                         const ContextApplyLookupContext &lookup_context)
 {
   if (unlikely (inputCount > HB_MAX_CONTEXT_LENGTH)) return false;
-  unsigned match_positions_stack[4];
-  unsigned *match_positions = match_positions_stack;
-  if (unlikely (inputCount > ARRAY_LENGTH (match_positions_stack)))
-  {
-    match_positions = (unsigned *) hb_malloc (hb_max (inputCount, 1u) * sizeof (match_positions[0]));
-    if (unlikely (!match_positions))
-      return false;
-  }
 
   unsigned match_end = 0;
   bool ret = false;
   if (match_input (c,
                    inputCount, input,
                    lookup_context.funcs.match, lookup_context.match_data,
-                   &match_end, match_positions))
+                   &match_end))
   {
     c->buffer->unsafe_to_break (c->buffer->idx, match_end);
     apply_lookup (c,
-                  inputCount, match_positions,
+                  inputCount,
                   lookupCount, lookupRecord,
                   match_end);
     ret = true;
@@ -1988,12 +2029,34 @@
     ret = false;
   }
 
-  if (unlikely (match_positions != match_positions_stack))
-    hb_free (match_positions);
-
   return ret;
 }
 
+static inline bool context_cache_func (hb_ot_apply_context_t *c, hb_ot_subtable_cache_op_t op)
+{
+  switch (op)
+  {
+    case hb_ot_subtable_cache_op_t::ENTER:
+    {
+      if (!HB_BUFFER_TRY_ALLOCATE_VAR (c->buffer, syllable))
+        return false;
+      auto &info = c->buffer->info;
+      unsigned count = c->buffer->len;
+      for (unsigned i = 0; i < count; i++)
+        info[i].syllable() = 255;
+      c->new_syllables = 255;
+      return true;
+    }
+    case hb_ot_subtable_cache_op_t::LEAVE:
+    {
+      c->new_syllables = (unsigned) -1;
+      HB_BUFFER_DEALLOCATE_VAR (c->buffer, syllable);
+      break;
+    }
+  }
+  return false;
+}
+
 template 
 struct Rule
 {
@@ -2209,24 +2272,29 @@
      *
      * Replicated from LigatureSet::apply(). */
 
-    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    /* We use the iter_context instead of iter_input, to avoid skipping
+     * default-ignorables and such.
+     *
+     * Related: https://github.com/harfbuzz/harfbuzz/issues/4813
+     */
+    auto &skippy_iter = c->iter_context;
     skippy_iter.reset (c->buffer->idx);
     skippy_iter.set_match_func (match_always, nullptr);
     skippy_iter.set_glyph_data ((HBUINT16 *) nullptr);
-    unsigned unsafe_to = (unsigned) -1, unsafe_to1 = 0, unsafe_to2 = 0;
+    unsigned unsafe_to = (unsigned) -1, unsafe_to1, unsafe_to2 = 0;
     hb_glyph_info_t *first = nullptr, *second = nullptr;
     bool matched = skippy_iter.next ();
     if (likely (matched))
     {
-      first = &c->buffer->info[skippy_iter.idx];
-      unsafe_to = skippy_iter.idx + 1;
-
       if (skippy_iter.may_skip (c->buffer->info[skippy_iter.idx]))
       {
         /* Can't use the fast path if eg. the next char is a default-ignorable
          * or other skippable. */
         goto slow;
       }
+
+      first = &c->buffer->info[skippy_iter.idx];
+      unsafe_to1 = skippy_iter.idx + 1;
     }
     else
     {
@@ -2242,8 +2310,15 @@
       ;
     }
     matched = skippy_iter.next ();
-    if (likely (matched && !skippy_iter.may_skip (c->buffer->info[skippy_iter.idx])))
+    if (likely (matched))
     {
+      if (skippy_iter.may_skip (c->buffer->info[skippy_iter.idx]))
+      {
+        /* Can't use the fast path if eg. the next char is a default-ignorable
+         * or other skippable. */
+        goto slow;
+      }
+
       second = &c->buffer->info[skippy_iter.idx];
       unsafe_to2 = skippy_iter.idx + 1;
     }
@@ -2280,6 +2355,15 @@
       {
         if (unsafe_to == (unsigned) -1)
           unsafe_to = unsafe_to1;
+
+        // Skip ahead to next possible first glyph match.
+        for (; i + 1 < num_rules; i++)
+        {
+          const auto &r2 = this+rule.arrayZ[i + 1];
+          const auto &input2 = r2.inputZ;
+          if (r2.inputCount <= 1 || input2.arrayZ[0] != input.arrayZ[0])
+            break;
+        }
       }
     }
     if (likely (unsafe_to != (unsigned) -1))
@@ -2622,46 +2706,37 @@
 
   unsigned cache_cost () const
   {
-    unsigned c = (this+classDef).cost () * ruleSet.len;
-    return c >= 4 ? c : 0;
+    return (this+classDef).cost ();
+  }
+  static bool cache_func (hb_ot_apply_context_t *c, hb_ot_subtable_cache_op_t op)
+  {
+    return context_cache_func (c, op);
   }
-  static void * cache_func (void *p, hb_ot_lookup_cache_op_t op)
+
+  struct external_cache_t
+  {
+    hb_ot_layout_binary_cache_t coverage;
+  };
+  void *external_cache_create () const
   {
-    switch (op)
+    external_cache_t *cache = (external_cache_t *) hb_malloc (sizeof (external_cache_t));
+    if (likely (cache))
     {
-      case hb_ot_lookup_cache_op_t::CREATE:
-        return (void *) true;
-      case hb_ot_lookup_cache_op_t::ENTER:
-      {
-        hb_ot_apply_context_t *c = (hb_ot_apply_context_t *) p;
-        if (!HB_BUFFER_TRY_ALLOCATE_VAR (c->buffer, syllable))
-          return (void *) false;
-        auto &info = c->buffer->info;
-        unsigned count = c->buffer->len;
-        for (unsigned i = 0; i < count; i++)
-          info[i].syllable() = 255;
-        c->new_syllables = 255;
-        return (void *) true;
-      }
-      case hb_ot_lookup_cache_op_t::LEAVE:
-      {
-        hb_ot_apply_context_t *c = (hb_ot_apply_context_t *) p;
-        c->new_syllables = (unsigned) -1;
-        HB_BUFFER_DEALLOCATE_VAR (c->buffer, syllable);
-        return nullptr;
-      }
-      case hb_ot_lookup_cache_op_t::DESTROY:
-        return nullptr;
+      cache->coverage.clear ();
     }
-    return nullptr;
+    return cache;
   }
-
-  bool apply_cached (hb_ot_apply_context_t *c) const { return _apply (c, true); }
-  bool apply (hb_ot_apply_context_t *c) const { return _apply (c, false); }
-  bool _apply (hb_ot_apply_context_t *c, bool cached) const
+  bool apply_cached (hb_ot_apply_context_t *c, void *external_cache) const { return _apply (c, true, external_cache); }
+  bool apply (hb_ot_apply_context_t *c, void *external_cache) const { return _apply (c, false, external_cache); }
+  bool _apply (hb_ot_apply_context_t *c, bool cached, void *external_cache) const
   {
     TRACE_APPLY (this);
+#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
+    external_cache_t *cache = (external_cache_t *) external_cache;
+    unsigned int index = (this+coverage).get_coverage_binary (c->buffer->cur().codepoint, cache ? &cache->coverage : nullptr);
+#else
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+#endif
     if (index == NOT_COVERED) return_trace (false);
 
     const ClassDef &class_def = this+classDef;
@@ -2671,10 +2746,7 @@
       &class_def
     };
 
-    if (cached && c->buffer->cur().syllable() < 255)
-      index = c->buffer->cur().syllable ();
-    else
-      index = class_def.get_class (c->buffer->cur().codepoint);
+    index = cached ? get_class_cached (class_def, c->buffer->cur()) : class_def.get_class (c->buffer->cur().codepoint);
     const RuleSet &rule_set = this+ruleSet[index];
     return_trace (rule_set.apply (c, lookup_context));
   }
@@ -2919,9 +2991,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: hb_barrier (); return_trace (c->dispatch (u.format1, std::forward (ds)...));
     case 2: hb_barrier (); return_trace (c->dispatch (u.format2, std::forward (ds)...));
     case 3: hb_barrier (); return_trace (c->dispatch (u.format3, std::forward (ds)...));
@@ -2935,7 +3007,7 @@
 
   protected:
   union {
-  HBUINT16                      format;         /* Format identifier */
+  struct { HBUINT16 v; }        format;         /* Format identifier */
   ContextFormat1_4  format1;
   ContextFormat2_5  format2;
   ContextFormat3                format3;
@@ -3069,27 +3141,18 @@
 }
 
 template 
-HB_ALWAYS_INLINE
-static bool chain_context_apply_lookup (hb_ot_apply_context_t *c,
-                                        unsigned int backtrackCount,
-                                        const HBUINT backtrack[],
-                                        unsigned int inputCount, /* Including the first glyph (not matched) */
-                                        const HBUINT input[], /* Array of input values--start with second glyph */
-                                        unsigned int lookaheadCount,
-                                        const HBUINT lookahead[],
-                                        unsigned int lookupCount,
-                                        const LookupRecord lookupRecord[],
-                                        const ChainContextApplyLookupContext &lookup_context)
+static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c,
+                                               unsigned int backtrackCount,
+                                               const HBUINT backtrack[],
+                                               unsigned int inputCount, /* Including the first glyph (not matched) */
+                                               const HBUINT input[], /* Array of input values--start with second glyph */
+                                               unsigned int lookaheadCount,
+                                               const HBUINT lookahead[],
+                                               unsigned int lookupCount,
+                                               const LookupRecord lookupRecord[],
+                                               const ChainContextApplyLookupContext &lookup_context)
 {
   if (unlikely (inputCount > HB_MAX_CONTEXT_LENGTH)) return false;
-  unsigned match_positions_stack[4];
-  unsigned *match_positions = match_positions_stack;
-  if (unlikely (inputCount > ARRAY_LENGTH (match_positions_stack)))
-  {
-    match_positions = (unsigned *) hb_malloc (hb_max (inputCount, 1u) * sizeof (match_positions[0]));
-    if (unlikely (!match_positions))
-      return false;
-  }
 
   unsigned start_index = c->buffer->out_len;
   unsigned end_index = c->buffer->idx;
@@ -3098,15 +3161,14 @@
   if (!(match_input (c,
                      inputCount, input,
                      lookup_context.funcs.match[1], lookup_context.match_data[1],
-                     &match_end, match_positions) && (end_index = match_end)
+                     &match_end) && (end_index = match_end)
        && match_lookahead (c,
                            lookaheadCount, lookahead,
                            lookup_context.funcs.match[2], lookup_context.match_data[2],
                            match_end, &end_index)))
   {
     c->buffer->unsafe_to_concat (c->buffer->idx, end_index);
-    ret = false;
-    goto done;
+    return false;
   }
 
   if (!match_backtrack (c,
@@ -3115,19 +3177,14 @@
                         &start_index))
   {
     c->buffer->unsafe_to_concat_from_outbuffer (start_index, end_index);
-    ret = false;
-    goto done;
+    return false;
   }
 
   c->buffer->unsafe_to_break_from_outbuffer (start_index, end_index);
   apply_lookup (c,
-                inputCount, match_positions,
+                inputCount,
                 lookupCount, lookupRecord,
                 match_end);
-  done:
-
-  if (unlikely (match_positions != match_positions_stack))
-    hb_free (match_positions);
 
   return ret;
 }
@@ -3411,33 +3468,29 @@
      *
      * Replicated from LigatureSet::apply(). */
 
-    /* If the input skippy has non-auto joiners behavior (as in Indic shapers),
-     * skip this fast path, as we don't distinguish between input & lookahead
-     * matching in the fast path.
+    /* We use the iter_context instead of iter_input, to avoid skipping
+     * default-ignorables and such.
      *
-     * https://github.com/harfbuzz/harfbuzz/issues/4813
+     * Related: https://github.com/harfbuzz/harfbuzz/issues/4813
      */
-    if (!c->auto_zwnj || !c->auto_zwj)
-      goto slow;
-
-    hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    auto &skippy_iter = c->iter_context;
     skippy_iter.reset (c->buffer->idx);
     skippy_iter.set_match_func (match_always, nullptr);
     skippy_iter.set_glyph_data ((HBUINT16 *) nullptr);
-    unsigned unsafe_to = (unsigned) -1, unsafe_to1 = 0, unsafe_to2 = 0;
+    unsigned unsafe_to = (unsigned) -1, unsafe_to1, unsafe_to2 = 0;
     hb_glyph_info_t *first = nullptr, *second = nullptr;
     bool matched = skippy_iter.next ();
     if (likely (matched))
     {
-      first = &c->buffer->info[skippy_iter.idx];
-      unsafe_to1 = skippy_iter.idx + 1;
-
       if (skippy_iter.may_skip (c->buffer->info[skippy_iter.idx]))
       {
         /* Can't use the fast path if eg. the next char is a default-ignorable
          * or other skippable. */
         goto slow;
       }
+
+      first = &c->buffer->info[skippy_iter.idx];
+      unsafe_to1 = skippy_iter.idx + 1;
     }
     else
     {
@@ -3458,8 +3511,15 @@
       ;
     }
     matched = skippy_iter.next ();
-    if (likely (matched && !skippy_iter.may_skip (c->buffer->info[skippy_iter.idx])))
+    if (likely (matched))
     {
+      if (skippy_iter.may_skip (c->buffer->info[skippy_iter.idx]))
+      {
+        /* Can't use the fast path if eg. the next char is a default-ignorable
+         * or other skippable. */
+        goto slow;
+      }
+
       second = &c->buffer->info[skippy_iter.idx];
       unsafe_to2 = skippy_iter.idx + 1;
     }
@@ -3475,7 +3535,7 @@
       const auto &input = StructAfter (r.backtrack);
       const auto &lookahead = StructAfter (input);
 
-      unsigned lenP1 = hb_max ((unsigned) input.lenP1, 1u);
+      unsigned lenP1 = input.lenP1;
       if (lenP1 > 1 ?
            (!match_input ||
             match_input (*first, input.arrayZ[0], input_data))
@@ -3483,6 +3543,7 @@
            (!lookahead.len || !match_lookahead ||
             match_lookahead (*first, lookahead.arrayZ[0], lookahead_data)))
       {
+        lenP1 = hb_max (lenP1, 1u);
         if (!second ||
             (lenP1 > 2 ?
              (!match_input ||
@@ -3505,6 +3566,18 @@
       {
         if (unsafe_to == (unsigned) -1)
           unsafe_to = unsafe_to1;
+
+        if (lenP1 > 1)
+        {
+          // Skip ahead to next possible first glyph match.
+          for (; i + 1 < num_rules; i++)
+          {
+            const auto &r2 = this+rule.arrayZ[i + 1];
+            const auto &input2 = StructAfter (r2.backtrack);
+            if (input2.lenP1 <= 1 || input2.arrayZ[0] != input.arrayZ[0])
+              break;
+          }
+        }
       }
     }
     if (likely (unsafe_to != (unsigned) -1))
@@ -3873,45 +3946,37 @@
 
   unsigned cache_cost () const
   {
-    return (this+lookaheadClassDef).cost () * ruleSet.len;
+    return (this+inputClassDef).cost () + (this+lookaheadClassDef).cost ();
   }
-  static void * cache_func (void *p, hb_ot_lookup_cache_op_t op)
+  static bool cache_func (hb_ot_apply_context_t *c, hb_ot_subtable_cache_op_t op)
   {
-    switch (op)
+    return context_cache_func (c, op);
+  }
+
+  struct external_cache_t
+  {
+    hb_ot_layout_binary_cache_t coverage;
+  };
+  void *external_cache_create () const
+  {
+    external_cache_t *cache = (external_cache_t *) hb_malloc (sizeof (external_cache_t));
+    if (likely (cache))
     {
-      case hb_ot_lookup_cache_op_t::CREATE:
-        return (void *) true;
-      case hb_ot_lookup_cache_op_t::ENTER:
-      {
-        hb_ot_apply_context_t *c = (hb_ot_apply_context_t *) p;
-        if (!HB_BUFFER_TRY_ALLOCATE_VAR (c->buffer, syllable))
-          return (void *) false;
-        auto &info = c->buffer->info;
-        unsigned count = c->buffer->len;
-        for (unsigned i = 0; i < count; i++)
-          info[i].syllable() = 255;
-        c->new_syllables = 255;
-        return (void *) true;
-      }
-      case hb_ot_lookup_cache_op_t::LEAVE:
-      {
-        hb_ot_apply_context_t *c = (hb_ot_apply_context_t *) p;
-        c->new_syllables = (unsigned) -1;
-        HB_BUFFER_DEALLOCATE_VAR (c->buffer, syllable);
-        return nullptr;
-      }
-      case hb_ot_lookup_cache_op_t::DESTROY:
-        return nullptr;
+      cache->coverage.clear ();
     }
-    return nullptr;
+    return cache;
   }
-
-  bool apply_cached (hb_ot_apply_context_t *c) const { return _apply (c, true); }
-  bool apply (hb_ot_apply_context_t *c) const { return _apply (c, false); }
-  bool _apply (hb_ot_apply_context_t *c, bool cached) const
+  bool apply_cached (hb_ot_apply_context_t *c, void *external_cache) const { return _apply (c, true, external_cache); }
+  bool apply (hb_ot_apply_context_t *c, void *external_cache) const { return _apply (c, false, external_cache); }
+  bool _apply (hb_ot_apply_context_t *c, bool cached, void *external_cache) const
   {
     TRACE_APPLY (this);
+#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
+    external_cache_t *cache = (external_cache_t *) external_cache;
+    unsigned int index = (this+coverage).get_coverage_binary (c->buffer->cur().codepoint, cache ? &cache->coverage : nullptr);
+#else
     unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
+#endif
     if (index == NOT_COVERED) return_trace (false);
 
     const ClassDef &backtrack_class_def = this+backtrackClassDef;
@@ -3929,11 +3994,9 @@
        &lookahead_class_def}
     };
 
-    // Note: Corresponds to match_class_cached2
-    if (cached && ((c->buffer->cur().syllable() & 0xF0) >> 4) < 15)
-      index = (c->buffer->cur().syllable () & 0xF0) >> 4;
-    else
-      index = input_class_def.get_class (c->buffer->cur().codepoint);
+    index = cached
+         ? get_class_cached2 (input_class_def, c->buffer->cur())
+          : input_class_def.get_class (c->buffer->cur().codepoint);
     const ChainRuleSet &rule_set = this+ruleSet[index];
     return_trace (rule_set.apply (c, lookup_context));
   }
@@ -4261,9 +4324,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: hb_barrier (); return_trace (c->dispatch (u.format1, std::forward (ds)...));
     case 2: hb_barrier (); return_trace (c->dispatch (u.format2, std::forward (ds)...));
     case 3: hb_barrier (); return_trace (c->dispatch (u.format3, std::forward (ds)...));
@@ -4277,7 +4340,7 @@
 
   protected:
   union {
-  HBUINT16                              format; /* Format identifier */
+  struct { HBUINT16 v; }                format; /* Format identifier */
   ChainContextFormat1_4     format1;
   ChainContextFormat2_5     format2;
   ChainContextFormat3                   format3;
@@ -4352,7 +4415,7 @@
 {
   unsigned int get_type () const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.get_type ();
     default:return 0;
     }
@@ -4360,7 +4423,7 @@
   template 
   const X& get_subtable () const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.template get_subtable ();
     default:return Null (typename T::SubTable);
     }
@@ -4372,7 +4435,7 @@
   template 
   typename hb_subset_context_t::return_t dispatch (hb_subset_context_t *c, Ts&&... ds) const
   {
-    switch (u.format) {
+    switch (u.format.v) {
     case 1: hb_barrier (); return u.format1.subset (c);
     default: return c->default_return_value ();
     }
@@ -4381,9 +4444,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: hb_barrier (); return_trace (u.format1.dispatch (c, std::forward (ds)...));
     default:return_trace (c->default_return_value ());
     }
@@ -4391,7 +4454,7 @@
 
   protected:
   union {
-  HBUINT16              format;         /* Format identifier */
+  struct { HBUINT16 v; }        format;         /* Format identifier */
   ExtensionFormat1   format1;
   } u;
 };
@@ -4428,22 +4491,14 @@
     for (auto& subtable : hb_iter (thiz->subtables, count))
       thiz->digest.union_ (subtable.digest);
 
-#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
-    if (c_accelerate_subtables.cache_user_cost < 4)
-      c_accelerate_subtables.cache_user_idx = (unsigned) -1;
-
-    thiz->cache_user_idx = c_accelerate_subtables.cache_user_idx;
+    thiz->count = count;
 
-    if (thiz->cache_user_idx != (unsigned) -1)
-    {
-      thiz->cache = thiz->subtables[thiz->cache_user_idx].cache_func (nullptr, hb_ot_lookup_cache_op_t::CREATE);
-      if (!thiz->cache)
-        thiz->cache_user_idx = (unsigned) -1;
-    }
+#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
+    thiz->subtable_cache_user_idx = c_accelerate_subtables.subtable_cache_user_idx;
 
     for (unsigned i = 0; i < count; i++)
-      if (i != thiz->cache_user_idx)
-        thiz->subtables[i].apply_cached_func = thiz->subtables[i].apply_func;
+      if (i != thiz->subtable_cache_user_idx)
+       thiz->subtables[i].apply_cached_func = thiz->subtables[i].apply_func;
 #endif
 
     return thiz;
@@ -4452,11 +4507,8 @@
   void fini ()
   {
 #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
-    if (cache)
-    {
-      assert (cache_user_idx != (unsigned) -1);
-      subtables[cache_user_idx].cache_func (cache, hb_ot_lookup_cache_op_t::DESTROY);
-    }
+    for (unsigned i = 0; i < count; i++)
+      hb_free (subtables[i].external_cache);
 #endif
   }
 
@@ -4466,14 +4518,14 @@
 #ifndef HB_OPTIMIZE_SIZE
   HB_ALWAYS_INLINE
 #endif
-  bool apply (hb_ot_apply_context_t *c, unsigned subtables_count, bool use_cache) const
+  bool apply (hb_ot_apply_context_t *c, bool use_cache) const
   {
     c->lookup_accel = this;
 #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
     if (use_cache)
     {
       return
-      + hb_iter (hb_iter (subtables, subtables_count))
+      + hb_iter (hb_iter (subtables, count))
       | hb_map ([&c] (const hb_accelerate_subtables_context_t::hb_applicable_t &_) { return _.apply_cached (c); })
       | hb_any
       ;
@@ -4482,7 +4534,7 @@
 #endif
     {
       return
-      + hb_iter (hb_iter (subtables, subtables_count))
+      + hb_iter (hb_iter (subtables, count))
       | hb_map ([&c] (const hb_accelerate_subtables_context_t::hb_applicable_t &_) { return _.apply (c); })
       | hb_any
       ;
@@ -4493,8 +4545,8 @@
   bool cache_enter (hb_ot_apply_context_t *c) const
   {
 #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
-    return cache_user_idx != (unsigned) -1 &&
-           subtables[cache_user_idx].cache_enter (c);
+    return subtable_cache_user_idx != (unsigned) -1 &&
+           subtables[subtable_cache_user_idx].cache_enter (c);
 #else
     return false;
 #endif
@@ -4502,19 +4554,17 @@
   void cache_leave (hb_ot_apply_context_t *c) const
   {
 #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
-    subtables[cache_user_idx].cache_leave (c);
+    subtables[subtable_cache_user_idx].cache_leave (c);
 #endif
   }
 
 
   hb_set_digest_t digest;
-#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
-  public:
-  void *cache = nullptr;
   private:
-  unsigned cache_user_idx = (unsigned) -1;
+  unsigned count = 0; /* Number of subtables in the array. */
+#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
+  unsigned subtable_cache_user_idx = (unsigned) -1;
 #endif
-  private:
   hb_accelerate_subtables_context_t::hb_applicable_t subtables[HB_VAR_ARRAY];
 };
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.cc	2026-04-17 19:09:35.000000000 +0000
@@ -343,7 +343,7 @@
  * @face: The #hb_face_t to work on
  * @glyph: The #hb_codepoint_t code point to query
  * @start_offset: offset of the first attachment point to retrieve
- * @point_count: (inout) (optional): Input = the maximum number of attachment points to return;
+ * @point_count: (inout) (nullable): Input = the maximum number of attachment points to return;
  *               Output = the actual number of attachment points returned (may be zero)
  * @point_array: (out) (array length=point_count): The array of attachment points found for the query
  *
@@ -373,7 +373,7 @@
  * @direction: The #hb_direction_t text direction to use
  * @glyph: The #hb_codepoint_t code point to query
  * @start_offset: offset of the first caret position to retrieve
- * @caret_count: (inout) (optional): Input = the maximum number of caret positions to return;
+ * @caret_count: (inout) (nullable): Input = the maximum number of caret positions to return;
  *               Output = the actual number of caret positions returned (may be zero)
  * @caret_array: (out) (array length=caret_count): The array of caret positions found for the query
  *
@@ -444,7 +444,7 @@
  * @face: #hb_face_t to work upon
  * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @start_offset: offset of the first script tag to retrieve
- * @script_count: (inout) (optional): Input = the maximum number of script tags to return;
+ * @script_count: (inout) (nullable): Input = the maximum number of script tags to return;
  *                Output = the actual number of script tags returned (may be zero)
  * @script_tags: (out) (array length=script_count): The array of #hb_tag_t script tags found for the query
  *
@@ -541,8 +541,8 @@
  * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_count: Number of script tags in the array
  * @script_tags: Array of #hb_tag_t script tags
- * @script_index: (out) (optional): The index of the requested script
- * @chosen_script: (out) (optional): #hb_tag_t of the requested script
+ * @script_index: (out) (nullable): The index of the requested script
+ * @chosen_script: (out) (nullable): #hb_tag_t of the requested script
  *
  * Selects an OpenType script for @table_tag from the @script_tags array.
  *
@@ -613,7 +613,7 @@
  * @face: #hb_face_t to work upon
  * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @start_offset: offset of the first feature tag to retrieve
- * @feature_count: (inout) (optional): Input = the maximum number of feature tags to return;
+ * @feature_count: (inout) (nullable): Input = the maximum number of feature tags to return;
  *                 Output = the actual number of feature tags returned (may be zero)
  * @feature_tags: (out) (array length=feature_count): Array of feature tags found in the table
  *
@@ -683,7 +683,7 @@
  * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @start_offset: offset of the first language tag to retrieve
- * @language_count: (inout) (optional): Input = the maximum number of language tags to return;
+ * @language_count: (inout) (nullable): Input = the maximum number of language tags to return;
  *                  Output = the actual number of language tags returned (may be zero)
  * @language_tags: (out) (array length=language_count): Array of language tags found in the table
  *
@@ -911,7 +911,7 @@
  * @script_index: The index of the requested script tag
  * @language_index: The index of the requested language tag
  * @start_offset: offset of the first feature tag to retrieve
- * @feature_count: (inout) (optional): Input = the maximum number of feature tags to return;
+ * @feature_count: (inout) (nullable): Input = the maximum number of feature tags to return;
  *                 Output: the actual number of feature tags returned (may be zero)
  * @feature_indexes: (out) (array length=feature_count): The array of feature indexes found for the query
  *
@@ -947,7 +947,7 @@
  * @script_index: The index of the requested script tag
  * @language_index: The index of the requested language tag
  * @start_offset: offset of the first feature tag to retrieve
- * @feature_count: (inout) (optional): Input = the maximum number of feature tags to return;
+ * @feature_count: (inout) (nullable): Input = the maximum number of feature tags to return;
  *                 Output = the actual number of feature tags returned (may be zero)
  * @feature_tags: (out) (array length=feature_count): The array of #hb_tag_t feature tags found for the query
  *
@@ -1035,7 +1035,7 @@
  * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @feature_index: The index of the requested feature
  * @start_offset: offset of the first lookup to retrieve
- * @lookup_count: (inout) (optional): Input = the maximum number of lookups to return;
+ * @lookup_count: (inout) (nullable): Input = the maximum number of lookups to return;
  *                Output = the actual number of lookups returned (may be zero)
  * @lookup_indexes: (out) (array length=lookup_count): The array of lookup indexes found for the query
  *
@@ -1386,10 +1386,10 @@
  * @face: #hb_face_t to work upon
  * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @lookup_index: The index of the feature lookup to query
- * @glyphs_before: (out): Array of glyphs preceding the substitution range
- * @glyphs_input: (out): Array of input glyphs that would be substituted by the lookup
- * @glyphs_after: (out): Array of glyphs following the substitution range
- * @glyphs_output: (out): Array of glyphs that would be the substituted output of the lookup
+ * @glyphs_before: (out) (nullable): Array of glyphs preceding the substitution range
+ * @glyphs_input: (out) (nullable): Array of input glyphs that would be substituted by the lookup
+ * @glyphs_after: (out) (nullable): Array of glyphs following the substitution range
+ * @glyphs_output: (out) (nullable): Array of glyphs that would be the substituted output of the lookup
  *
  * Fetches a list of all glyphs affected by the specified lookup in the
  * specified face's GSUB table or GPOS table.
@@ -1473,7 +1473,7 @@
  * @feature_index: The index of the feature to query
  * @variations_index: The index of the feature variation to query
  * @start_offset: offset of the first lookup to retrieve
- * @lookup_count: (inout) (optional): Input = the maximum number of lookups to return;
+ * @lookup_count: (inout) (nullable): Input = the maximum number of lookups to return;
  *                Output = the actual number of lookups returned (may be zero)
  * @lookup_indexes: (out) (array length=lookup_count): The array of lookups found for the query
  *
@@ -1777,15 +1777,15 @@
  * @face: #hb_face_t to work upon
  * @table_tag: table tag to query, "GSUB" or "GPOS".
  * @feature_index: index of feature to query.
- * @label_id: (out) (optional): The ‘name’ table name ID that specifies a string
- *            for a user-interface label for this feature. (May be NULL.)
- * @tooltip_id: (out) (optional): The ‘name’ table name ID that specifies a string
+ * @label_id: (out) (nullable): The ‘name’ table name ID that specifies a string
+ *            for a user-interface label for this feature.
+ * @tooltip_id: (out) (nullable): The ‘name’ table name ID that specifies a string
  *              that an application can use for tooltip text for this
- *              feature. (May be NULL.)
- * @sample_id: (out) (optional): The ‘name’ table name ID that specifies sample text
- *             that illustrates the effect of this feature. (May be NULL.)
- * @num_named_parameters: (out) (optional):  Number of named parameters. (May be zero.)
- * @first_param_id: (out) (optional): The first ‘name’ table name ID used to specify
+ *              feature.
+ * @sample_id: (out) (nullable): The ‘name’ table name ID that specifies sample text
+ *             that illustrates the effect of this feature.
+ * @num_named_parameters: (out) (nullable):  Number of named parameters.
+ * @first_param_id: (out) (nullable): The first ‘name’ table name ID used to specify
  *                  strings for user-interface labels for the feature
  *                  parameters. (Must be zero if numParameters is zero.)
  *
@@ -1852,7 +1852,7 @@
  * @table_tag: table tag to query, "GSUB" or "GPOS".
  * @feature_index: index of feature to query.
  * @start_offset: offset of the first character to retrieve
- * @char_count: (inout) (optional): Input = the maximum number of characters to return;
+ * @char_count: (inout) (nullable): Input = the maximum number of characters to return;
  *              Output = the actual number of characters returned (may be zero)
  * @characters: (out caller-allocates) (array length=char_count): A buffer pointer.
  *              The Unicode codepoints of the characters for which this feature provides
@@ -1915,31 +1915,33 @@
 
 static inline bool
 apply_forward (OT::hb_ot_apply_context_t *c,
-               const OT::hb_ot_layout_lookup_accelerator_t &accel,
-               unsigned subtable_count)
+               const OT::hb_ot_layout_lookup_accelerator_t &accel)
 {
-  bool use_cache = accel.cache_enter (c);
+  bool use_hot_subtable_cache = accel.cache_enter (c);
 
   bool ret = false;
   hb_buffer_t *buffer = c->buffer;
-  while (buffer->idx < buffer->len && buffer->successful)
+  while (buffer->successful)
   {
-    bool applied = false;
-    auto &cur = buffer->cur();
-    if (accel.digest.may_have (cur.codepoint) &&
-        (cur.mask & c->lookup_mask) &&
-        c->check_glyph_property (&cur, c->lookup_props))
-     {
-       applied = accel.apply (c, subtable_count, use_cache);
-     }
+    hb_glyph_info_t *info = buffer->info;
+    unsigned j = buffer->idx;
+    while (j < buffer->len &&
+           !(accel.digest.may_have (info[j].codepoint) &&
+             (info[j].mask & c->lookup_mask) &&
+             c->check_glyph_property (&info[j], c->lookup_props)))
+      j++;
+    if (unlikely (j > buffer->idx && !buffer->next_glyphs (j - buffer->idx)))
+      break;
+    if (buffer->idx >= buffer->len)
+      break;
 
-    if (applied)
+    if (accel.apply (c, use_hot_subtable_cache))
       ret = true;
     else
       (void) buffer->next_glyph ();
   }
 
-  if (use_cache)
+  if (use_hot_subtable_cache)
     accel.cache_leave (c);
 
   return ret;
@@ -1947,8 +1949,7 @@
 
 static inline bool
 apply_backward (OT::hb_ot_apply_context_t *c,
-               const OT::hb_ot_layout_lookup_accelerator_t &accel,
-               unsigned subtable_count)
+               const OT::hb_ot_layout_lookup_accelerator_t &accel)
 {
   bool ret = false;
   hb_buffer_t *buffer = c->buffer;
@@ -1958,11 +1959,10 @@
     if (accel.digest.may_have (cur.codepoint) &&
         (cur.mask & c->lookup_mask) &&
         c->check_glyph_property (&cur, c->lookup_props))
-      ret |= accel.apply (c, subtable_count, false);
+      ret |= accel.apply (c, false);
 
     /* The reverse lookup doesn't "advance" cursor (for good reason). */
     buffer->idx--;
-
   }
   while ((int) buffer->idx >= 0);
   return ret;
@@ -1975,7 +1975,6 @@
               const OT::hb_ot_layout_lookup_accelerator_t &accel)
 {
   hb_buffer_t *buffer = c->buffer;
-  unsigned subtable_count = lookup.get_subtable_count ();
 
   if (unlikely (!buffer->len || !c->lookup_mask))
     return false;
@@ -1991,7 +1990,7 @@
       buffer->clear_output ();
 
     buffer->idx = 0;
-    ret = apply_forward (c, accel, subtable_count);
+    ret = apply_forward (c, accel);
 
     if (!Proxy::always_inplace)
       buffer->sync ();
@@ -2001,7 +2000,7 @@
     /* in-place backward substitution/positioning */
     assert (!buffer->have_output);
     buffer->idx = buffer->len - 1;
-    ret = apply_backward (c, accel, subtable_count);
+    ret = apply_backward (c, accel);
   }
 
   return ret;
@@ -2017,7 +2016,7 @@
   unsigned int i = 0;
 
   auto *font_data = font->data.ot.get ();
-  auto *var_store_cache = font_data == HB_SHAPER_DATA_SUCCEEDED ? nullptr : (OT::ItemVariationStore::cache_t *) font_data;
+  auto *var_store_cache = (OT::hb_scalar_cache_t *) font_data;
 
   OT::hb_ot_apply_context_t c (table_index, font, buffer, proxy.accel.get_blob (), var_store_cache);
   c.set_recurse_func (Proxy::Lookup::template dispatch_recurse_func);
@@ -2037,11 +2036,8 @@
       if (buffer->messaging () &&
           !buffer->message (font, "start lookup %u feature '%c%c%c%c'", lookup_index, HB_UNTAG (lookup.feature_tag))) continue;
 
-      /* c.digest is a digest of all the current glyphs in the buffer
-       * (plus some past glyphs).
-       *
-       * Only try applying the lookup if there is any overlap. */
-      if (accel->digest.may_intersect (c.digest))
+      /* Only try applying the lookup if there is any overlap. */
+      if (accel->digest.may_intersect (buffer->digest))
       {
         c.set_lookup_index (lookup_index);
         c.set_lookup_mask (lookup.mask, false);
@@ -2067,7 +2063,7 @@
       if (stage->pause_func (plan, font, buffer))
       {
         /* Refresh working buffer digest since buffer changed. */
-        buffer->collect_codepoints (c.digest);
+        buffer->update_digest ();
       }
     }
   }
@@ -2601,6 +2597,7 @@
 #endif
 
 
+#ifndef HB_NO_LAYOUT_RARELY_USED
 struct hb_get_glyph_alternates_dispatch_t :
        hb_dispatch_context_t
 {
@@ -2620,14 +2617,13 @@
   ( _dispatch (obj, hb_prioritize, std::forward (ds)...) )
 };
 
-#ifndef HB_NO_LAYOUT_RARELY_USED
 /**
  * hb_ot_layout_lookup_get_glyph_alternates:
  * @face: a face.
  * @lookup_index: index of the feature lookup to query.
  * @glyph: a glyph id.
  * @start_offset: starting offset.
- * @alternate_count: (inout) (optional): Input = the maximum number of alternate glyphs to return;
+ * @alternate_count: (inout) (nullable): Input = the maximum number of alternate glyphs to return;
  *                   Output = the actual number of alternate glyphs returned (may be zero).
  * @alternate_glyphs: (out caller-allocates) (array length=alternate_count): A glyphs buffer.
  *                    Alternate glyphs associated with the glyph id.
@@ -2654,6 +2650,64 @@
   return ret;
 }
 
+struct hb_collect_glyph_alternates_dispatch_t :
+       hb_dispatch_context_t
+{
+  static return_t default_return_value () { return false; }
+  bool stop_sublookup_iteration (return_t r) const { return false; }
+
+  private:
+  template  auto
+  _dispatch (const T &obj, hb_priority<1>, Ts&&... ds) HB_AUTO_RETURN
+  ( (obj.collect_glyph_alternates (std::forward (ds)...), true) )
+  template  auto
+  _dispatch (const T &obj, hb_priority<0>, Ts&&... ds) HB_AUTO_RETURN
+  ( default_return_value () )
+  public:
+  template  auto
+  dispatch (const T &obj, Ts&&... ds) HB_AUTO_RETURN
+  ( _dispatch (obj, hb_prioritize, std::forward (ds)...) )
+};
+
+/**
+ * hb_ot_layout_lookup_collect_glyph_alternates:
+ * @face: a face.
+ * @lookup_index: index of the feature lookup to query.
+ * @alternate_count: (inout): mapping from glyph index to number of alternates for that glyph.
+ * @alternate_glyphs: (inout): mapping from encoded glyph index and alternate index, to alternate glyph ids.
+ *
+ * Collects alternates of glyphs from a given GSUB lookup index.
+ *
+ * For one-to-one GSUB glyph substitutions, this function collects the
+ * substituted glyph.
+ *
+ * For lookups that assign multiple alternates to a glyph, all alternate glyphs are collected.
+ *
+ * For other lookup types, nothing is performed and `false` is returned.
+ *
+ * The `alternate_count` mapping will contain the number of alternates for each glyph id.
+ * Upon entry, this mapping should contain the glyph ids as keys, and the number of alternates
+ * currently known for each glyph id as values.
+ *
+ * The `alternate_glyphs` mapping will contain the alternate glyph ids for each glyph id.
+ * The mapping is encoded in the following way, upon entry and after processing:
+ * If G is the glyph id, and A0, A1, ..., A(n-1) are the alternate glyph ids,
+ * the mapping will contain the following entries: (G + (i << 24)) -> A(i)
+ * for i = 0, 1, ..., n-1 where n is the number of alternates for G as per `alternate_count`.
+ *
+ * Return value: `true` if alternates were collected, `false` otherwise.
+ * Since: 12.1.0
+ */
+HB_EXTERN hb_bool_t
+hb_ot_layout_lookup_collect_glyph_alternates (hb_face_t *face,
+                                              unsigned   lookup_index,
+                                              hb_map_t  *alternate_count /* IN/OUT */,
+                                              hb_map_t  *alternate_glyphs /* IN/OUT */)
+{
+  hb_collect_glyph_alternates_dispatch_t c;
+  const OT::SubstLookup &lookup = face->table.GSUB->table->get_lookup (lookup_index);
+  return lookup.dispatch (&c, alternate_count, alternate_glyphs);
+}
 
 struct hb_position_single_dispatch_t :
        hb_dispatch_context_t
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.h	2026-04-17 19:09:35.000000000 +0000
@@ -384,6 +384,12 @@
                                           hb_codepoint_t *alternate_glyphs /* OUT */);
 
 HB_EXTERN hb_bool_t
+hb_ot_layout_lookup_collect_glyph_alternates (hb_face_t *face,
+                                              unsigned   lookup_index,
+                                              hb_map_t  *alternate_count /* IN/OUT */,
+                                              hb_map_t  *alternate_glyphs /* IN/OUT */);
+
+HB_EXTERN hb_bool_t
 hb_ot_layout_lookup_would_substitute (hb_face_t            *face,
                                       unsigned int          lookup_index,
                                       const hb_codepoint_t *glyphs,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-layout.hh	2026-04-17 19:09:35.000000000 +0000
@@ -217,8 +217,6 @@
 
   if (u >= 0x80u)
   {
-    buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII;
-
     if (unlikely (unicode->is_default_ignorable (u)))
     {
       buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES;
@@ -247,6 +245,7 @@
 
     if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (gen_cat)))
     {
+      buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_CONTINUATIONS;
       props |= UPROPS_MASK_CONTINUATION;
       props |= unicode->modified_combining_class (u)<<8;
     }
@@ -361,8 +360,9 @@
 }
 
 static inline void
-_hb_glyph_info_set_continuation (hb_glyph_info_t *info)
+_hb_glyph_info_set_continuation (hb_glyph_info_t *info, hb_buffer_t *buffer)
 {
+  buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_CONTINUATIONS;
   info->unicode_props() |= UPROPS_MASK_CONTINUATION;
 }
 static inline void
@@ -410,18 +410,6 @@
   return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWJ);
 }
 static inline bool
-_hb_glyph_info_is_joiner (const hb_glyph_info_t *info)
-{
-  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & (UPROPS_MASK_Cf_ZWNJ|UPROPS_MASK_Cf_ZWJ));
-}
-static inline void
-_hb_glyph_info_flip_joiners (hb_glyph_info_t *info)
-{
-  if (!_hb_glyph_info_is_unicode_format (info))
-    return;
-  info->unicode_props() ^= UPROPS_MASK_Cf_ZWNJ | UPROPS_MASK_Cf_ZWJ;
-}
-static inline bool
 _hb_glyph_info_is_aat_deleted (const hb_glyph_info_t *info)
 {
   return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_AAT_DELETED);
@@ -657,4 +645,18 @@
 #undef lig_props
 #undef glyph_props
 
+static inline void
+_hb_collect_glyph_alternates_add (hb_codepoint_t from,
+                                  hb_codepoint_t to,
+                                  hb_map_t *alternate_count,
+                                  hb_map_t *alternate_glyphs)
+{
+  hb_codepoint_t zero = 0;
+  hb_codepoint_t *i = &zero;
+  alternate_count->has (from, &i);
+  alternate_glyphs->set (from | (*i << 24), to);
+  alternate_count->set (from, *i + 1);
+}
+
+
 #endif /* HB_OT_LAYOUT_HH */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-math-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-math-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-math-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-math-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -69,6 +69,8 @@
 
 struct MathConstants
 {
+  friend struct MATH;
+
   MathConstants* copy (hb_serialize_context_t *c) const
   {
     TRACE_SERIALIZE (this);
@@ -1109,8 +1111,8 @@
   {
 #ifndef HB_NO_MATH
     switch HB_CODEPOINT_ENCODE3 (font->face->table.MATH.get_blob ()->length,
-                                 get_constant (HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT, font),
-                                 get_constant (HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT, font))
+                                 (this+mathConstants).minHeight[1], // displayOperatorMinHeight
+                                 (this+mathConstants).minHeight[0]) // delimitedSubFormulaMinHeight
     {
       /* sha1sum:ab4a4fe054d23061f3c039493d6f665cfda2ecf5  cambria.ttc
        * sha1sum:086855301bff644f9d8827b88491fcf73a6d4cb9  cambria.ttc
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-post-macroman.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-post-macroman.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-post-macroman.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-post-macroman.hh	2026-04-17 19:09:35.000000000 +0000
@@ -31,264 +31,264 @@
 #endif
 
 
-_S(".notdef")
-_S(".null")
-_S("nonmarkingreturn")
-_S("space")
-_S("exclam")
-_S("quotedbl")
-_S("numbersign")
-_S("dollar")
-_S("percent")
-_S("ampersand")
-_S("quotesingle")
-_S("parenleft")
-_S("parenright")
-_S("asterisk")
-_S("plus")
-_S("comma")
-_S("hyphen")
-_S("period")
-_S("slash")
-_S("zero")
-_S("one")
-_S("two")
-_S("three")
-_S("four")
-_S("five")
-_S("six")
-_S("seven")
-_S("eight")
-_S("nine")
-_S("colon")
-_S("semicolon")
-_S("less")
-_S("equal")
-_S("greater")
-_S("question")
-_S("at")
-_S("A")
-_S("B")
-_S("C")
-_S("D")
-_S("E")
-_S("F")
-_S("G")
-_S("H")
-_S("I")
-_S("J")
-_S("K")
-_S("L")
-_S("M")
-_S("N")
-_S("O")
-_S("P")
-_S("Q")
-_S("R")
-_S("S")
-_S("T")
-_S("U")
-_S("V")
-_S("W")
-_S("X")
-_S("Y")
-_S("Z")
-_S("bracketleft")
-_S("backslash")
-_S("bracketright")
-_S("asciicircum")
-_S("underscore")
-_S("grave")
-_S("a")
-_S("b")
-_S("c")
-_S("d")
-_S("e")
-_S("f")
-_S("g")
-_S("h")
-_S("i")
-_S("j")
-_S("k")
-_S("l")
-_S("m")
-_S("n")
-_S("o")
-_S("p")
-_S("q")
-_S("r")
-_S("s")
-_S("t")
-_S("u")
-_S("v")
-_S("w")
-_S("x")
-_S("y")
-_S("z")
-_S("braceleft")
-_S("bar")
-_S("braceright")
-_S("asciitilde")
-_S("Adieresis")
-_S("Aring")
-_S("Ccedilla")
-_S("Eacute")
-_S("Ntilde")
-_S("Odieresis")
-_S("Udieresis")
-_S("aacute")
-_S("agrave")
-_S("acircumflex")
-_S("adieresis")
-_S("atilde")
-_S("aring")
-_S("ccedilla")
-_S("eacute")
-_S("egrave")
-_S("ecircumflex")
-_S("edieresis")
-_S("iacute")
-_S("igrave")
-_S("icircumflex")
-_S("idieresis")
-_S("ntilde")
-_S("oacute")
-_S("ograve")
-_S("ocircumflex")
-_S("odieresis")
-_S("otilde")
-_S("uacute")
-_S("ugrave")
-_S("ucircumflex")
-_S("udieresis")
-_S("dagger")
-_S("degree")
-_S("cent")
-_S("sterling")
-_S("section")
-_S("bullet")
-_S("paragraph")
-_S("germandbls")
-_S("registered")
-_S("copyright")
-_S("trademark")
-_S("acute")
-_S("dieresis")
-_S("notequal")
-_S("AE")
-_S("Oslash")
-_S("infinity")
-_S("plusminus")
-_S("lessequal")
-_S("greaterequal")
-_S("yen")
-_S("mu")
-_S("partialdiff")
-_S("summation")
-_S("product")
-_S("pi")
-_S("integral")
-_S("ordfeminine")
-_S("ordmasculine")
-_S("Omega")
-_S("ae")
-_S("oslash")
-_S("questiondown")
-_S("exclamdown")
-_S("logicalnot")
-_S("radical")
-_S("florin")
-_S("approxequal")
-_S("Delta")
-_S("guillemotleft")
-_S("guillemotright")
-_S("ellipsis")
-_S("nonbreakingspace")
-_S("Agrave")
-_S("Atilde")
-_S("Otilde")
-_S("OE")
-_S("oe")
-_S("endash")
-_S("emdash")
-_S("quotedblleft")
-_S("quotedblright")
-_S("quoteleft")
-_S("quoteright")
-_S("divide")
-_S("lozenge")
-_S("ydieresis")
-_S("Ydieresis")
-_S("fraction")
-_S("currency")
-_S("guilsinglleft")
-_S("guilsinglright")
-_S("fi")
-_S("fl")
-_S("daggerdbl")
-_S("periodcentered")
-_S("quotesinglbase")
-_S("quotedblbase")
-_S("perthousand")
-_S("Acircumflex")
-_S("Ecircumflex")
-_S("Aacute")
-_S("Edieresis")
-_S("Egrave")
-_S("Iacute")
-_S("Icircumflex")
-_S("Idieresis")
-_S("Igrave")
-_S("Oacute")
-_S("Ocircumflex")
-_S("apple")
-_S("Ograve")
-_S("Uacute")
-_S("Ucircumflex")
-_S("Ugrave")
-_S("dotlessi")
-_S("circumflex")
-_S("tilde")
-_S("macron")
-_S("breve")
-_S("dotaccent")
-_S("ring")
-_S("cedilla")
-_S("hungarumlaut")
-_S("ogonek")
-_S("caron")
-_S("Lslash")
-_S("lslash")
-_S("Scaron")
-_S("scaron")
-_S("Zcaron")
-_S("zcaron")
-_S("brokenbar")
-_S("Eth")
-_S("eth")
-_S("Yacute")
-_S("yacute")
-_S("Thorn")
-_S("thorn")
-_S("minus")
-_S("multiply")
-_S("onesuperior")
-_S("twosuperior")
-_S("threesuperior")
-_S("onehalf")
-_S("onequarter")
-_S("threequarters")
-_S("franc")
-_S("Gbreve")
-_S("gbreve")
-_S("Idotaccent")
-_S("Scedilla")
-_S("scedilla")
-_S("Cacute")
-_S("cacute")
-_S("Ccaron")
-_S("ccaron")
-_S("dcroat")
+HB_STR(".notdef")
+HB_STR(".null")
+HB_STR("nonmarkingreturn")
+HB_STR("space")
+HB_STR("exclam")
+HB_STR("quotedbl")
+HB_STR("numbersign")
+HB_STR("dollar")
+HB_STR("percent")
+HB_STR("ampersand")
+HB_STR("quotesingle")
+HB_STR("parenleft")
+HB_STR("parenright")
+HB_STR("asterisk")
+HB_STR("plus")
+HB_STR("comma")
+HB_STR("hyphen")
+HB_STR("period")
+HB_STR("slash")
+HB_STR("zero")
+HB_STR("one")
+HB_STR("two")
+HB_STR("three")
+HB_STR("four")
+HB_STR("five")
+HB_STR("six")
+HB_STR("seven")
+HB_STR("eight")
+HB_STR("nine")
+HB_STR("colon")
+HB_STR("semicolon")
+HB_STR("less")
+HB_STR("equal")
+HB_STR("greater")
+HB_STR("question")
+HB_STR("at")
+HB_STR("A")
+HB_STR("B")
+HB_STR("C")
+HB_STR("D")
+HB_STR("E")
+HB_STR("F")
+HB_STR("G")
+HB_STR("H")
+HB_STR("I")
+HB_STR("J")
+HB_STR("K")
+HB_STR("L")
+HB_STR("M")
+HB_STR("N")
+HB_STR("O")
+HB_STR("P")
+HB_STR("Q")
+HB_STR("R")
+HB_STR("S")
+HB_STR("T")
+HB_STR("U")
+HB_STR("V")
+HB_STR("W")
+HB_STR("X")
+HB_STR("Y")
+HB_STR("Z")
+HB_STR("bracketleft")
+HB_STR("backslash")
+HB_STR("bracketright")
+HB_STR("asciicircum")
+HB_STR("underscore")
+HB_STR("grave")
+HB_STR("a")
+HB_STR("b")
+HB_STR("c")
+HB_STR("d")
+HB_STR("e")
+HB_STR("f")
+HB_STR("g")
+HB_STR("h")
+HB_STR("i")
+HB_STR("j")
+HB_STR("k")
+HB_STR("l")
+HB_STR("m")
+HB_STR("n")
+HB_STR("o")
+HB_STR("p")
+HB_STR("q")
+HB_STR("r")
+HB_STR("s")
+HB_STR("t")
+HB_STR("u")
+HB_STR("v")
+HB_STR("w")
+HB_STR("x")
+HB_STR("y")
+HB_STR("z")
+HB_STR("braceleft")
+HB_STR("bar")
+HB_STR("braceright")
+HB_STR("asciitilde")
+HB_STR("Adieresis")
+HB_STR("Aring")
+HB_STR("Ccedilla")
+HB_STR("Eacute")
+HB_STR("Ntilde")
+HB_STR("Odieresis")
+HB_STR("Udieresis")
+HB_STR("aacute")
+HB_STR("agrave")
+HB_STR("acircumflex")
+HB_STR("adieresis")
+HB_STR("atilde")
+HB_STR("aring")
+HB_STR("ccedilla")
+HB_STR("eacute")
+HB_STR("egrave")
+HB_STR("ecircumflex")
+HB_STR("edieresis")
+HB_STR("iacute")
+HB_STR("igrave")
+HB_STR("icircumflex")
+HB_STR("idieresis")
+HB_STR("ntilde")
+HB_STR("oacute")
+HB_STR("ograve")
+HB_STR("ocircumflex")
+HB_STR("odieresis")
+HB_STR("otilde")
+HB_STR("uacute")
+HB_STR("ugrave")
+HB_STR("ucircumflex")
+HB_STR("udieresis")
+HB_STR("dagger")
+HB_STR("degree")
+HB_STR("cent")
+HB_STR("sterling")
+HB_STR("section")
+HB_STR("bullet")
+HB_STR("paragraph")
+HB_STR("germandbls")
+HB_STR("registered")
+HB_STR("copyright")
+HB_STR("trademark")
+HB_STR("acute")
+HB_STR("dieresis")
+HB_STR("notequal")
+HB_STR("AE")
+HB_STR("Oslash")
+HB_STR("infinity")
+HB_STR("plusminus")
+HB_STR("lessequal")
+HB_STR("greaterequal")
+HB_STR("yen")
+HB_STR("mu")
+HB_STR("partialdiff")
+HB_STR("summation")
+HB_STR("product")
+HB_STR("pi")
+HB_STR("integral")
+HB_STR("ordfeminine")
+HB_STR("ordmasculine")
+HB_STR("Omega")
+HB_STR("ae")
+HB_STR("oslash")
+HB_STR("questiondown")
+HB_STR("exclamdown")
+HB_STR("logicalnot")
+HB_STR("radical")
+HB_STR("florin")
+HB_STR("approxequal")
+HB_STR("Delta")
+HB_STR("guillemotleft")
+HB_STR("guillemotright")
+HB_STR("ellipsis")
+HB_STR("nonbreakingspace")
+HB_STR("Agrave")
+HB_STR("Atilde")
+HB_STR("Otilde")
+HB_STR("OE")
+HB_STR("oe")
+HB_STR("endash")
+HB_STR("emdash")
+HB_STR("quotedblleft")
+HB_STR("quotedblright")
+HB_STR("quoteleft")
+HB_STR("quoteright")
+HB_STR("divide")
+HB_STR("lozenge")
+HB_STR("ydieresis")
+HB_STR("Ydieresis")
+HB_STR("fraction")
+HB_STR("currency")
+HB_STR("guilsinglleft")
+HB_STR("guilsinglright")
+HB_STR("fi")
+HB_STR("fl")
+HB_STR("daggerdbl")
+HB_STR("periodcentered")
+HB_STR("quotesinglbase")
+HB_STR("quotedblbase")
+HB_STR("perthousand")
+HB_STR("Acircumflex")
+HB_STR("Ecircumflex")
+HB_STR("Aacute")
+HB_STR("Edieresis")
+HB_STR("Egrave")
+HB_STR("Iacute")
+HB_STR("Icircumflex")
+HB_STR("Idieresis")
+HB_STR("Igrave")
+HB_STR("Oacute")
+HB_STR("Ocircumflex")
+HB_STR("apple")
+HB_STR("Ograve")
+HB_STR("Uacute")
+HB_STR("Ucircumflex")
+HB_STR("Ugrave")
+HB_STR("dotlessi")
+HB_STR("circumflex")
+HB_STR("tilde")
+HB_STR("macron")
+HB_STR("breve")
+HB_STR("dotaccent")
+HB_STR("ring")
+HB_STR("cedilla")
+HB_STR("hungarumlaut")
+HB_STR("ogonek")
+HB_STR("caron")
+HB_STR("Lslash")
+HB_STR("lslash")
+HB_STR("Scaron")
+HB_STR("scaron")
+HB_STR("Zcaron")
+HB_STR("zcaron")
+HB_STR("brokenbar")
+HB_STR("Eth")
+HB_STR("eth")
+HB_STR("Yacute")
+HB_STR("yacute")
+HB_STR("Thorn")
+HB_STR("thorn")
+HB_STR("minus")
+HB_STR("multiply")
+HB_STR("onesuperior")
+HB_STR("twosuperior")
+HB_STR("threesuperior")
+HB_STR("onehalf")
+HB_STR("onequarter")
+HB_STR("threequarters")
+HB_STR("franc")
+HB_STR("Gbreve")
+HB_STR("gbreve")
+HB_STR("Idotaccent")
+HB_STR("Scedilla")
+HB_STR("scedilla")
+HB_STR("Cacute")
+HB_STR("cacute")
+HB_STR("Ccaron")
+HB_STR("ccaron")
+HB_STR("dcroat")
 
 
 #endif /* HB_OT_POST_MACROMAN_HH */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-fallback.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-fallback.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-fallback.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-fallback.cc	2026-04-17 19:09:35.000000000 +0000
@@ -409,16 +409,13 @@
 }
 
 static inline void
-position_cluster (const hb_ot_shape_plan_t *plan,
-                  hb_font_t *font,
-                  hb_buffer_t  *buffer,
-                  unsigned int start,
-                  unsigned int end,
-                  bool adjust_offsets_when_zeroing)
+position_cluster_impl (const hb_ot_shape_plan_t *plan,
+                       hb_font_t *font,
+                       hb_buffer_t  *buffer,
+                       unsigned int start,
+                       unsigned int end,
+                       bool adjust_offsets_when_zeroing)
 {
-  if (end - start < 2)
-    return;
-
   /* Find the base glyph */
   hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = start; i < end; i++)
@@ -441,6 +438,20 @@
     }
 }
 
+static HB_ALWAYS_INLINE void
+position_cluster (const hb_ot_shape_plan_t *plan,
+                  hb_font_t *font,
+                  hb_buffer_t  *buffer,
+                  unsigned int start,
+                  unsigned int end,
+                  bool adjust_offsets_when_zeroing)
+{
+  if (end - start < 2)
+    return;
+
+  position_cluster_impl (plan, font, buffer, start, end, adjust_offsets_when_zeroing);
+}
+
 void
 _hb_ot_shape_fallback_mark_position (const hb_ot_shape_plan_t *plan,
                                      hb_font_t *font,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-normalize.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-normalize.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-normalize.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-normalize.cc	2026-04-17 19:09:35.000000000 +0000
@@ -78,14 +78,14 @@
 static inline void
 set_glyph (hb_glyph_info_t &info, hb_font_t *font)
 {
-  (void) font->get_nominal_glyph (info.codepoint, &info.glyph_index());
+  (void) font->get_nominal_glyph (info.codepoint, &info.normalizer_glyph_index());
 }
 
 static inline void
 output_char (hb_buffer_t *buffer, hb_codepoint_t unichar, hb_codepoint_t glyph)
 {
   /* This is very confusing indeed. */
-  buffer->cur().glyph_index() = glyph;
+  buffer->cur().normalizer_glyph_index() = glyph;
   (void) buffer->output_glyph (unichar);
   _hb_glyph_info_set_unicode_props (&buffer->prev(), buffer);
 }
@@ -93,7 +93,7 @@
 static inline void
 next_char (hb_buffer_t *buffer, hb_codepoint_t glyph)
 {
-  buffer->cur().glyph_index() = glyph;
+  buffer->cur().normalizer_glyph_index() = glyph;
   (void) buffer->next_glyph ();
 }
 
@@ -210,7 +210,7 @@
   hb_font_t * const font = c->font;
   for (; buffer->idx < end - 1 && buffer->successful;) {
     if (unlikely (buffer->unicode->is_variation_selector (buffer->cur(+1).codepoint))) {
-      if (font->get_variation_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index()))
+      if (font->get_variation_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().normalizer_glyph_index()))
       {
         hb_codepoint_t unicode = buffer->cur().codepoint;
         (void) buffer->replace_glyphs (2, 1, &unicode);
@@ -342,7 +342,7 @@
         unsigned int done = font->get_nominal_glyphs (end - buffer->idx,
                                                       &buffer->cur().codepoint,
                                                       sizeof (buffer->info[0]),
-                                                      &buffer->cur().glyph_index(),
+                                                      &buffer->cur().normalizer_glyph_index(),
                                                       sizeof (buffer->info[0]));
         if (unlikely (!buffer->next_glyphs (done))) break;
       }
@@ -456,7 +456,7 @@
           buffer->out_len--; /* Remove the second composable. */
           /* Modify starter and carry on. */
           buffer->out_info[starter].codepoint = composed;
-          buffer->out_info[starter].glyph_index() = glyph;
+          buffer->out_info[starter].normalizer_glyph_index() = glyph;
           _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer);
 
           continue;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-normalize.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-normalize.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-normalize.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape-normalize.hh	2026-04-17 19:09:35.000000000 +0000
@@ -32,7 +32,7 @@
 
 
 /* buffer var allocations, used during the normalization process */
-#define glyph_index()   var1.u32
+#define normalizer_glyph_index()        var1.u32
 
 struct hb_ot_shape_plan_t;
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.cc	2026-04-17 19:09:35.000000000 +0000
@@ -44,6 +44,7 @@
 #include "hb-ot-face.hh"
 
 #include "hb-set.hh"
+#include "hb-unicode.hh"
 
 #include "hb-aat-layout.hh"
 #include "hb-ot-layout-gdef-table.hh"
@@ -92,7 +93,7 @@
   shaper = hb_ot_shaper_categorize (props.script, props.direction, map.chosen_script[0]);
 
   script_zero_marks = shaper->zero_width_marks != HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE;
-  script_fallback_mark_positioning = shaper->fallback_position;
+  script_fallback_position = shaper->fallback_position;
 
 #ifndef HB_NO_AAT_SHAPE
   /* https://github.com/harfbuzz/harfbuzz/issues/1528 */
@@ -178,12 +179,12 @@
 #endif
 #ifndef HB_NO_OT_KERN
     else if (hb_ot_layout_has_kerning (face))
-      plan.apply_kern = true;
+      plan.apply_kern = script_fallback_position; // Not all shapers apply legacy `kern`
 #endif
     else {}
   }
 
-  plan.apply_fallback_kern = !(plan.apply_gpos || plan.apply_kerx || plan.apply_kern);
+  plan.apply_fallback_kern = script_fallback_position && !(plan.apply_gpos || plan.apply_kerx || plan.apply_kern);
 
   plan.zero_marks = script_zero_marks &&
                     !plan.apply_kerx &&
@@ -203,7 +204,7 @@
                                               );
 
   plan.fallback_mark_positioning = plan.adjust_mark_positioning_when_zeroing &&
-                                   script_fallback_mark_positioning;
+                                   script_fallback_position;
 
 #ifndef HB_NO_AAT_SHAPE
   /* If we're using morx shaping, we cancel mark position adjustment because
@@ -425,25 +426,20 @@
  */
 
 struct hb_ot_font_data_t {
-  OT::ItemVariationStore::cache_t unused; // Just for alignment
+  OT::hb_scalar_cache_t unused; // Just for alignment
 };
 
 hb_ot_font_data_t *
 _hb_ot_shaper_font_data_create (hb_font_t *font)
 {
-  if (!font->num_coords)
-    return (hb_ot_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
-
   const OT::ItemVariationStore &var_store = font->face->table.GDEF->table->get_var_store ();
-  auto *cache = (hb_ot_font_data_t *) var_store.create_cache ();
-  return cache ? cache : (hb_ot_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
+  return (hb_ot_font_data_t *) var_store.create_cache ();
 }
 
 void
 _hb_ot_shaper_font_data_destroy (hb_ot_font_data_t *data)
 {
-  if (data == HB_SHAPER_DATA_SUCCEEDED) return;
-  OT::ItemVariationStore::destroy_cache ((OT::ItemVariationStore::cache_t *) data);
+  OT::ItemVariationStore::destroy_cache ((OT::hb_scalar_cache_t *) data);
 }
 
 
@@ -488,6 +484,9 @@
   {
     _hb_glyph_info_set_unicode_props (&info[i], buffer);
 
+    if (info[i].codepoint < 0x80)
+      continue;
+
     unsigned gen_cat = _hb_glyph_info_get_general_category (&info[i]);
     if (FLAG_UNSAFE (gen_cat) &
         (FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) |
@@ -502,7 +501,7 @@
     if (unlikely (gen_cat == HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL &&
                   hb_in_range (info[i].codepoint, 0x1F3FBu, 0x1F3FFu)))
     {
-      _hb_glyph_info_set_continuation (&info[i]);
+      _hb_glyph_info_set_continuation (&info[i], buffer);
     }
     /* Regional_Indicators are hairy as hell...
      * https://github.com/harfbuzz/harfbuzz/issues/2265 */
@@ -510,18 +509,18 @@
     {
       if (_hb_codepoint_is_regional_indicator (info[i - 1].codepoint) &&
           !_hb_glyph_info_is_continuation (&info[i - 1]))
-        _hb_glyph_info_set_continuation (&info[i]);
+        _hb_glyph_info_set_continuation (&info[i], buffer);
     }
 #ifndef HB_NO_EMOJI_SEQUENCES
     else if (unlikely (_hb_glyph_info_is_zwj (&info[i])))
     {
-      _hb_glyph_info_set_continuation (&info[i]);
+      _hb_glyph_info_set_continuation (&info[i], buffer);
       if (i + 1 < count &&
           _hb_unicode_is_emoji_Extended_Pictographic (info[i + 1].codepoint))
       {
         i++;
         _hb_glyph_info_set_unicode_props (&info[i], buffer);
-        _hb_glyph_info_set_continuation (&info[i]);
+        _hb_glyph_info_set_continuation (&info[i], buffer);
       }
     }
 #endif
@@ -540,7 +539,9 @@
      * https://github.com/harfbuzz/harfbuzz/issues/3844
      */
     else if (unlikely (hb_in_ranges (info[i].codepoint, 0xFF9Eu, 0xFF9Fu, 0xE0020u, 0xE007Fu)))
-      _hb_glyph_info_set_continuation (&info[i]);
+      _hb_glyph_info_set_continuation (&info[i], buffer);
+    else if (unlikely (info[i].codepoint == 0x2044u /* FRACTION SLASH */))
+      buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_FRACTION_SLASH;
   }
 }
 
@@ -576,7 +577,7 @@
 static void
 hb_form_clusters (hb_buffer_t *buffer)
 {
-  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII))
+  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_CONTINUATIONS))
     return;
 
   if (HB_BUFFER_CLUSTER_LEVEL_IS_GRAPHEMES (buffer->cluster_level))
@@ -618,14 +619,14 @@
     for (unsigned i = 0; i < count; i++)
     {
       auto gc = _hb_glyph_info_get_general_category (&info[i]);
-      if (gc == HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER)
-        found_number = true;
-      else if (HB_UNICODE_GENERAL_CATEGORY_IS_LETTER (gc))
+      if (HB_UNICODE_GENERAL_CATEGORY_IS_LETTER (gc))
       {
         found_letter = true;
         break;
       }
-      else if (_hb_codepoint_is_regional_indicator (info[i].codepoint))
+      else if (gc == HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER)
+        found_number = true;
+      else if (unlikely (_hb_codepoint_is_regional_indicator (info[i].codepoint)))
         found_ri = true;
     }
     if ((found_number || found_ri) && !found_letter)
@@ -651,59 +652,6 @@
  * Substitute
  */
 
-#ifndef HB_NO_VERTICAL
-static hb_codepoint_t
-hb_vert_char_for (hb_codepoint_t u)
-{
-  switch (u >> 8)
-  {
-    case 0x20: switch (u) {
-      case 0x2013u: return 0xfe32u; // EN DASH
-      case 0x2014u: return 0xfe31u; // EM DASH
-      case 0x2025u: return 0xfe30u; // TWO DOT LEADER
-      case 0x2026u: return 0xfe19u; // HORIZONTAL ELLIPSIS
-    } break;
-    case 0x30: switch (u) {
-      case 0x3001u: return 0xfe11u; // IDEOGRAPHIC COMMA
-      case 0x3002u: return 0xfe12u; // IDEOGRAPHIC FULL STOP
-      case 0x3008u: return 0xfe3fu; // LEFT ANGLE BRACKET
-      case 0x3009u: return 0xfe40u; // RIGHT ANGLE BRACKET
-      case 0x300au: return 0xfe3du; // LEFT DOUBLE ANGLE BRACKET
-      case 0x300bu: return 0xfe3eu; // RIGHT DOUBLE ANGLE BRACKET
-      case 0x300cu: return 0xfe41u; // LEFT CORNER BRACKET
-      case 0x300du: return 0xfe42u; // RIGHT CORNER BRACKET
-      case 0x300eu: return 0xfe43u; // LEFT WHITE CORNER BRACKET
-      case 0x300fu: return 0xfe44u; // RIGHT WHITE CORNER BRACKET
-      case 0x3010u: return 0xfe3bu; // LEFT BLACK LENTICULAR BRACKET
-      case 0x3011u: return 0xfe3cu; // RIGHT BLACK LENTICULAR BRACKET
-      case 0x3014u: return 0xfe39u; // LEFT TORTOISE SHELL BRACKET
-      case 0x3015u: return 0xfe3au; // RIGHT TORTOISE SHELL BRACKET
-      case 0x3016u: return 0xfe17u; // LEFT WHITE LENTICULAR BRACKET
-      case 0x3017u: return 0xfe18u; // RIGHT WHITE LENTICULAR BRACKET
-    } break;
-    case 0xfe: switch (u) {
-      case 0xfe4fu: return 0xfe34u; // WAVY LOW LINE
-    } break;
-    case 0xff: switch (u) {
-      case 0xff01u: return 0xfe15u; // FULLWIDTH EXCLAMATION MARK
-      case 0xff08u: return 0xfe35u; // FULLWIDTH LEFT PARENTHESIS
-      case 0xff09u: return 0xfe36u; // FULLWIDTH RIGHT PARENTHESIS
-      case 0xff0cu: return 0xfe10u; // FULLWIDTH COMMA
-      case 0xff1au: return 0xfe13u; // FULLWIDTH COLON
-      case 0xff1bu: return 0xfe14u; // FULLWIDTH SEMICOLON
-      case 0xff1fu: return 0xfe16u; // FULLWIDTH QUESTION MARK
-      case 0xff3bu: return 0xfe47u; // FULLWIDTH LEFT SQUARE BRACKET
-      case 0xff3du: return 0xfe48u; // FULLWIDTH RIGHT SQUARE BRACKET
-      case 0xff3fu: return 0xfe33u; // FULLWIDTH LOW LINE
-      case 0xff5bu: return 0xfe37u; // FULLWIDTH LEFT CURLY BRACKET
-      case 0xff5du: return 0xfe38u; // FULLWIDTH RIGHT CURLY BRACKET
-    } break;
-  }
-
-  return u;
-}
-#endif
-
 static inline void
 hb_ot_rotate_chars (const hb_ot_shape_context_t *c)
 {
@@ -729,7 +677,7 @@
   if (HB_DIRECTION_IS_VERTICAL (c->target_direction) && !c->plan->has_vert)
   {
     for (unsigned int i = 0; i < count; i++) {
-      hb_codepoint_t codepoint = hb_vert_char_for (info[i].codepoint);
+      hb_codepoint_t codepoint = hb_unicode_funcs_t::vertical_char_for (info[i].codepoint);
       if (unlikely (codepoint != info[i].codepoint && c->font->has_glyph (codepoint)))
         info[i].codepoint = codepoint;
     }
@@ -744,7 +692,7 @@
   return;
 #endif
 
-  if (!(c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII) ||
+  if (!(c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_FRACTION_SLASH) ||
       !c->plan->has_frac)
     return;
 
@@ -845,7 +793,13 @@
   unsigned int i = 0;
   for (i = 0; i < count; i++)
     if (unlikely (_hb_glyph_info_is_default_ignorable (&info[i])))
-      pos[i].x_advance = pos[i].y_advance = pos[i].x_offset = pos[i].y_offset = 0;
+    {
+      pos[i].x_advance = pos[i].y_advance = 0;
+      if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
+        pos[i].x_offset = 0;
+      else
+        pos[i].y_offset = 0;
+    }
 }
 
 static void
@@ -900,11 +854,11 @@
 static inline void
 hb_ot_map_glyphs_fast (hb_buffer_t  *buffer)
 {
-  /* Normalization process sets up glyph_index(), we just copy it. */
+  /* Normalization process sets up normalizer_glyph_index(), we just copy it. */
   unsigned int count = buffer->len;
   hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = 0; i < count; i++)
-    info[i].codepoint = info[i].glyph_index();
+    info[i].codepoint = info[i].normalizer_glyph_index();
 
   buffer->content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
 }
@@ -942,7 +896,7 @@
 
   hb_ot_rotate_chars (c);
 
-  HB_BUFFER_ALLOCATE_VAR (buffer, glyph_index);
+  HB_BUFFER_ALLOCATE_VAR (buffer, normalizer_glyph_index);
 
   _hb_ot_shape_normalize (c->plan, buffer, c->font);
 
@@ -954,7 +908,7 @@
 
   hb_ot_map_glyphs_fast (buffer);
 
-  HB_BUFFER_DEALLOCATE_VAR (buffer, glyph_index);
+  HB_BUFFER_DEALLOCATE_VAR (buffer, normalizer_glyph_index);
 }
 
 static inline void
@@ -969,11 +923,17 @@
 
 #ifndef HB_NO_AAT_SHAPE
   if (unlikely (c->plan->apply_morx))
+  {
     hb_aat_layout_substitute (c->plan, c->font, c->buffer,
                               c->user_features, c->num_user_features);
+    c->buffer->update_digest ();
+  }
   else
 #endif
+  {
+    c->buffer->update_digest ();
     c->plan->substitute (c->font, buffer);
+  }
 }
 
 static inline void
@@ -1054,23 +1014,16 @@
   {
     c->font->get_glyph_h_advances (count, &info[0].codepoint, sizeof(info[0]),
                                    &pos[0].x_advance, sizeof(pos[0]));
-    /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
-    if (c->font->has_glyph_h_origin_func ())
-      for (unsigned int i = 0; i < count; i++)
-        c->font->subtract_glyph_h_origin (info[i].codepoint,
-                                          &pos[i].x_offset,
-                                          &pos[i].y_offset);
+    // h_origin defaults to zero; only apply it if the font has it.
+    if (c->font->has_glyph_h_origin_func () || c->font->has_glyph_h_origins_func ())
+      c->font->subtract_glyph_h_origins (c->buffer);
   }
   else
   {
     c->font->get_glyph_v_advances (count, &info[0].codepoint, sizeof(info[0]),
                                    &pos[0].y_advance, sizeof(pos[0]));
-    for (unsigned int i = 0; i < count; i++)
-    {
-      c->font->subtract_glyph_v_origin (info[i].codepoint,
-                                        &pos[i].x_offset,
-                                        &pos[i].y_offset);
-    }
+    // v_origin defaults to non-zero; apply even if only fallback is there.
+    c->font->subtract_glyph_v_origins (c->buffer);
   }
   if (c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK)
     _hb_ot_shape_fallback_spaces (c->plan, c->font, c->buffer);
@@ -1079,10 +1032,6 @@
 static inline void
 hb_ot_position_plan (const hb_ot_shape_context_t *c)
 {
-  unsigned int count = c->buffer->len;
-  hb_glyph_info_t *info = c->buffer->info;
-  hb_glyph_position_t *pos = c->buffer->pos;
-
   /* If the font has no GPOS and direction is forward, then when
    * zeroing mark widths, we shift the mark with it, such that the
    * mark is positioned hanging over the previous glyph.  When
@@ -1097,12 +1046,9 @@
 
   /* We change glyph origin to what GPOS expects (horizontal), apply GPOS, change it back. */
 
-  /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
-  if (c->font->has_glyph_h_origin_func ())
-    for (unsigned int i = 0; i < count; i++)
-      c->font->add_glyph_h_origin (info[i].codepoint,
-                                   &pos[i].x_offset,
-                                   &pos[i].y_offset);
+  // h_origin defaults to zero; only apply it if the font has it.
+  if (c->font->has_glyph_h_origin_func () || c->font->has_glyph_h_origins_func ())
+    c->font->add_glyph_h_origins (c->buffer);
 
   hb_ot_layout_position_start (c->font, c->buffer);
 
@@ -1139,12 +1085,9 @@
   hb_ot_zero_width_default_ignorables (c->buffer);
   hb_ot_layout_position_finish_offsets (c->font, c->buffer);
 
-  /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
-  if (c->font->has_glyph_h_origin_func ())
-    for (unsigned int i = 0; i < count; i++)
-      c->font->subtract_glyph_h_origin (info[i].codepoint,
-                                        &pos[i].x_offset,
-                                        &pos[i].y_offset);
+  // h_origin defaults to zero; only apply it if the font has it.
+  if (c->font->has_glyph_h_origin_func () || c->font->has_glyph_h_origins_func ())
+    c->font->subtract_glyph_h_origins (c->buffer);
 
   if (c->plan->fallback_mark_positioning)
     _hb_ot_shape_fallback_mark_position (c->plan, c->font, c->buffer,
@@ -1172,8 +1115,33 @@
   /* Propagate cluster-level glyph flags to be the same on all cluster glyphs.
    * Simplifies using them. */
 
-  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS))
+  hb_mask_t and_mask = HB_GLYPH_FLAG_DEFINED;
+  if ((buffer->flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) == 0)
+    and_mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_CONCAT;
+
+  hb_glyph_info_t *info = buffer->info;
+
+  if ((buffer->flags & HB_BUFFER_FLAG_PRODUCE_SAFE_TO_INSERT_TATWEEL) == 0)
+  {
+    foreach_cluster (buffer, start, end)
+    {
+      if (end - start == 1)
+      {
+        info[start].mask &= and_mask;
+        continue;
+      }
+
+      unsigned int mask = 0;
+      for (unsigned int i = start; i < end; i++)
+        mask |= info[i].mask;
+
+      mask &= and_mask;
+
+      for (unsigned int i = start; i < end; i++)
+        info[i].mask = mask;
+    }
     return;
+  }
 
   /* If we are producing SAFE_TO_INSERT_TATWEEL, then do two things:
    *
@@ -1181,30 +1149,20 @@
    *   are UNSAFE_TO_BREAK, then clear the SAFE_TO_INSERT_TATWEEL,
    * - Any place that is SAFE_TO_INSERT_TATWEEL, is also now UNSAFE_TO_BREAK.
    *
-   * We couldn't make this interaction earlier. It has to be done here.
+   * We couldn't make this interaction earlier. It has to be done this way.
    */
-  bool flip_tatweel = buffer->flags & HB_BUFFER_FLAG_PRODUCE_SAFE_TO_INSERT_TATWEEL;
-
-  bool clear_concat = (buffer->flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) == 0;
-
-  hb_glyph_info_t *info = buffer->info;
-
   foreach_cluster (buffer, start, end)
   {
     unsigned int mask = 0;
     for (unsigned int i = start; i < end; i++)
-      mask |= info[i].mask & HB_GLYPH_FLAG_DEFINED;
+      mask |= info[i].mask;
 
-    if (flip_tatweel)
-    {
-      if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
-        mask &= ~HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL;
-      if (mask & HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL)
-        mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK | HB_GLYPH_FLAG_UNSAFE_TO_CONCAT;
-    }
+    if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
+      mask &= ~HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL;
+    if (mask & HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL)
+      mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK | HB_GLYPH_FLAG_UNSAFE_TO_CONCAT;
 
-    if (clear_concat)
-        mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_CONCAT;
+    mask &= and_mask;
 
     for (unsigned int i = start; i < end; i++)
       info[i].mask = mask;
@@ -1245,8 +1203,6 @@
   _hb_buffer_deallocate_unicode_vars (c->buffer);
 
   c->buffer->props.direction = c->target_direction;
-
-  c->buffer->leave ();
 }
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shape.hh	2026-04-17 19:09:35.000000000 +0000
@@ -150,7 +150,7 @@
   static constexpr bool apply_morx = false;
 #endif
   bool script_zero_marks : 1;
-  bool script_fallback_mark_positioning : 1;
+  bool script_fallback_position : 1;
   const struct hb_ot_shaper_t *shaper;
 
   HB_INTERNAL hb_ot_shape_planner_t (hb_face_t                     *face,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-joining-list.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-joining-list.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-joining-list.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-joining-list.hh	2026-04-17 19:09:35.000000000 +0000
@@ -6,10 +6,10 @@
  *
  * on files with these headers:
  *
- * # ArabicShaping-16.0.0.txt
- * # Date: 2024-07-30
- * # Scripts-16.0.0.txt
- * # Date: 2024-04-30, 21:48:40 GMT
+ * # ArabicShaping-17.0.0.txt
+ * # Date: 2025-08-14
+ * # Scripts-17.0.0.txt
+ * # Date: 2025-07-24, 13:28:55 GMT
  */
 
 #ifndef HB_OT_SHAPER_ARABIC_JOINING_LIST_HH
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -6,10 +6,10 @@
  *
  * on files with these headers:
  *
- * # ArabicShaping-16.0.0.txt
- * # Date: 2024-07-30
- * # Blocks-16.0.0.txt
- * # Date: 2024-02-02
+ * # ArabicShaping-17.0.0.txt
+ * # Date: 2025-08-14
+ * # Blocks-17.0.0.txt
+ * # Date: 2025-08-01
  * UnicodeData.txt does not have a header.
  */
 
@@ -80,7 +80,7 @@
   /* Arabic Extended-B */
 
   /* 0860 */                                 R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,R,
-  /* 0880 */ R,R,R,C,C,C,D,U,U,D,D,D,D,D,R,X,U,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+  /* 0880 */ R,R,R,C,C,C,D,U,U,D,D,D,D,D,R,D,U,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
 
   /* Arabic Extended-A */
 
@@ -140,9 +140,9 @@
 
   /* Arabic Extended-C */
 
-  /* 10EC0 */     R,D,D,
+  /* 10EC0 */     R,D,D,X,D,D,
 
-#define joining_offset_0x10f30u 1185
+#define joining_offset_0x10f30u 1188
 
   /* Sogdian */
 
@@ -161,14 +161,14 @@
   /* 10FA0 */                                 D,U,D,D,R,R,R,U,D,R,R,D,D,R,D,D,
   /* 10FC0 */ U,D,R,R,D,U,U,U,U,R,D,L,
 
-#define joining_offset_0x110bdu 1341
+#define joining_offset_0x110bdu 1344
 
   /* Kaithi */
 
   /* 110A0 */                                                           U,X,X,
   /* 110C0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,U,
 
-#define joining_offset_0x1e900u 1358
+#define joining_offset_0x1e900u 1361
 
   /* Adlam */
 
@@ -176,7 +176,7 @@
   /* 1E920 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
   /* 1E940 */ D,D,D,D,X,X,X,X,X,X,X,T,
 
-}; /* Table items: 1434; occupancy: 57% */
+}; /* Table items: 1437; occupancy: 58% */
 
 
 static unsigned int
@@ -204,7 +204,7 @@
       if (hb_in_range (u, 0x10AC0u, 0x10AEFu)) return joining_table[u - 0x10AC0u + joining_offset_0x10ac0u];
       if (hb_in_range (u, 0x10B80u, 0x10BAFu)) return joining_table[u - 0x10B80u + joining_offset_0x10b80u];
       if (hb_in_range (u, 0x10D00u, 0x10D23u)) return joining_table[u - 0x10D00u + joining_offset_0x10d00u];
-      if (hb_in_range (u, 0x10EC2u, 0x10EC4u)) return joining_table[u - 0x10EC2u + joining_offset_0x10ec2u];
+      if (hb_in_range (u, 0x10EC2u, 0x10EC7u)) return joining_table[u - 0x10EC2u + joining_offset_0x10ec2u];
       if (hb_in_range (u, 0x10F30u, 0x10FCBu)) return joining_table[u - 0x10F30u + joining_offset_0x10f30u];
       break;
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-arabic.cc	2026-04-17 19:09:35.000000000 +0000
@@ -654,7 +654,7 @@
 
 /* https://www.unicode.org/reports/tr53/ */
 
-static hb_codepoint_t
+static const hb_codepoint_t
 modifier_combining_marks[] =
 {
   0x0654u, /* ARABIC HAMZA ABOVE */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-hangul.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-hangul.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-hangul.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-hangul.cc	2026-04-17 19:09:35.000000000 +0000
@@ -427,7 +427,7 @@
   HB_TAG_NONE, /* gpos_tag */
   HB_OT_SHAPE_NORMALIZATION_MODE_NONE,
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
-  false, /* fallback_position */
+  true, /* fallback_position */
 };
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic-machine.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic-machine.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic-machine.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic-machine.hh	2026-04-17 19:09:35.000000000 +0000
@@ -53,7 +53,7 @@
 };
 
 
-#line 57 "hb-ot-shaper-indic-machine.hh"
+#line 54 "hb-ot-shaper-indic-machine.hh"
 #define indic_syllable_machine_ex_A 9u
 #define indic_syllable_machine_ex_C 1u
 #define indic_syllable_machine_ex_CM 16u
@@ -77,7 +77,7 @@
 #define indic_syllable_machine_ex_ZWNJ 5u
 
 
-#line 81 "hb-ot-shaper-indic-machine.hh"
+#line 76 "hb-ot-shaper-indic-machine.hh"
 static const unsigned char _indic_syllable_machine_trans_keys[] = {
         8u, 57u, 4u, 57u, 5u, 57u, 5u, 57u, 13u, 13u, 4u, 57u, 4u, 57u, 4u, 57u,
         8u, 57u, 5u, 57u, 5u, 57u, 13u, 13u, 4u, 57u, 4u, 57u, 4u, 57u, 4u, 57u,
@@ -1126,7 +1126,7 @@
   int cs;
   hb_glyph_info_t *info = buffer->info;
 
-#line 1130 "hb-ot-shaper-indic-machine.hh"
+#line 1119 "hb-ot-shaper-indic-machine.hh"
         {
         cs = indic_syllable_machine_start;
         ts = 0;
@@ -1142,7 +1142,7 @@
 
   unsigned int syllable_serial = 1;
 
-#line 1146 "hb-ot-shaper-indic-machine.hh"
+#line 1131 "hb-ot-shaper-indic-machine.hh"
         {
         int _slen;
         int _trans;
@@ -1156,7 +1156,7 @@
 #line 1 "NONE"
         {ts = p;}
         break;
-#line 1160 "hb-ot-shaper-indic-machine.hh"
+#line 1143 "hb-ot-shaper-indic-machine.hh"
         }
 
         _keys = _indic_syllable_machine_trans_keys + (cs<<1);
@@ -1268,7 +1268,7 @@
 #line 117 "hb-ot-shaper-indic-machine.rl"
         {act = 7;}
         break;
-#line 1272 "hb-ot-shaper-indic-machine.hh"
+#line 1232 "hb-ot-shaper-indic-machine.hh"
         }
 
 _again:
@@ -1277,7 +1277,7 @@
 #line 1 "NONE"
         {ts = 0;}
         break;
-#line 1281 "hb-ot-shaper-indic-machine.hh"
+#line 1239 "hb-ot-shaper-indic-machine.hh"
         }
 
         if ( ++p != pe )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic-table.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic-table.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic-table.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic-table.cc	2026-04-17 19:09:35.000000000 +0000
@@ -6,12 +6,12 @@
  *
  * on files with these headers:
  *
- * # IndicSyllabicCategory-16.0.0.txt
- * # Date: 2024-04-30, 21:48:21 GMT
- * # IndicPositionalCategory-16.0.0.txt
- * # Date: 2024-04-30, 21:48:21 GMT
- * # Blocks-16.0.0.txt
- * # Date: 2024-02-02
+ * # IndicSyllabicCategory-17.0.0.txt
+ * # Date: 2025-08-01, 04:02:23 GMT
+ * # IndicPositionalCategory-17.0.0.txt
+ * # Date: 2025-07-29, 13:35:52 GMT
+ * # Blocks-17.0.0.txt
+ * # Date: 2025-08-01
  */
 
 #include "hb.hh"
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-indic.cc	2026-04-17 19:09:35.000000000 +0000
@@ -296,11 +296,6 @@
   const indic_config_t *config;
 
   bool is_old_spec;
-#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE
-  bool uniscribe_bug_compatible;
-#else
-  static constexpr bool uniscribe_bug_compatible = false;
-#endif
   mutable hb_atomic_t virama_glyph;
 
   hb_indic_would_substitute_feature_t rphf;
@@ -327,9 +322,6 @@
     }
 
   indic_plan->is_old_spec = indic_plan->config->has_old_spec && ((plan->map.chosen_script[0] & 0x000000FFu) != '2');
-#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE
-  indic_plan->uniscribe_bug_compatible = hb_options ().uniscribe_bug_compatible;
-#endif
   indic_plan->virama_glyph = -1;
 
   /* Use zero-context would_substitute() matching for new-spec of the main
@@ -943,17 +935,7 @@
                                        unsigned int start, unsigned int end)
 {
   /* We treat placeholder/dotted-circle as if they are consonants, so we
-   * should just chain.  Only if not in compatibility mode that is... */
-
-  const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data;
-  if (indic_plan->uniscribe_bug_compatible)
-  {
-    /* For dotted-circle, this is what Uniscribe does:
-     * If dotted-circle is the last glyph, it just does nothing.
-     * Ie. It doesn't form Reph. */
-    if (buffer->info[end - 1].indic_category() == I_Cat(DOTTEDCIRCLE))
-      return;
-  }
+   * should just chain... */
 
   initial_reordering_consonant_syllable (plan, face, buffer, start, end);
 }
@@ -1347,8 +1329,7 @@
        * Uniscribe doesn't do this.
        * TEST: U+0930,U+094D,U+0915,U+094B,U+094D
        */
-      if (!indic_plan->uniscribe_bug_compatible &&
-          unlikely (is_halant (info[new_reph_pos])))
+      if (unlikely (is_halant (info[new_reph_pos])))
       {
         for (unsigned int i = base + 1; i < new_reph_pos; i++)
           if (FLAG_UNSAFE (info[i].indic_category()) & (FLAG (I_Cat(M)) | FLAG (I_Cat(MPst))))
@@ -1451,27 +1432,6 @@
     else
       buffer->unsafe_to_break (start - 1, start + 1);
   }
-
-
-  /*
-   * Finish off the clusters and go home!
-   */
-  if (indic_plan->uniscribe_bug_compatible)
-  {
-    switch ((hb_tag_t) plan->props.script)
-    {
-      case HB_SCRIPT_TAMIL:
-        break;
-
-      default:
-        /* Uniscribe merges the entire syllable into a single cluster... Except for Tamil.
-         * This means, half forms are submerged into the main consonant's cluster.
-         * This is unnecessary, and makes cursor positioning harder, but that's what
-         * Uniscribe does. */
-        buffer->merge_clusters (start, end);
-        break;
-    }
-  }
 }
 
 
@@ -1501,9 +1461,7 @@
                        hb_buffer_t              *buffer,
                        hb_font_t                *font)
 {
-  const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data;
-  if (!indic_plan->uniscribe_bug_compatible)
-    _hb_preprocess_text_vowel_constraints (plan, buffer, font);
+  _hb_preprocess_text_vowel_constraints (plan, buffer, font);
 }
 
 static bool
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-khmer-machine.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-khmer-machine.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-khmer-machine.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-khmer-machine.hh	2026-04-17 19:09:35.000000000 +0000
@@ -48,7 +48,7 @@
 };
 
 
-#line 52 "hb-ot-shaper-khmer-machine.hh"
+#line 49 "hb-ot-shaper-khmer-machine.hh"
 #define khmer_syllable_machine_ex_C 1u
 #define khmer_syllable_machine_ex_DOTTEDCIRCLE 11u
 #define khmer_syllable_machine_ex_H 4u
@@ -66,7 +66,7 @@
 #define khmer_syllable_machine_ex_ZWNJ 5u
 
 
-#line 70 "hb-ot-shaper-khmer-machine.hh"
+#line 65 "hb-ot-shaper-khmer-machine.hh"
 static const unsigned char _khmer_syllable_machine_trans_keys[] = {
         5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u,
         5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u,
@@ -294,7 +294,7 @@
   int cs;
   hb_glyph_info_t *info = buffer->info;
 
-#line 298 "hb-ot-shaper-khmer-machine.hh"
+#line 287 "hb-ot-shaper-khmer-machine.hh"
         {
         cs = khmer_syllable_machine_start;
         ts = 0;
@@ -310,7 +310,7 @@
 
   unsigned int syllable_serial = 1;
 
-#line 314 "hb-ot-shaper-khmer-machine.hh"
+#line 299 "hb-ot-shaper-khmer-machine.hh"
         {
         int _slen;
         int _trans;
@@ -324,7 +324,7 @@
 #line 1 "NONE"
         {ts = p;}
         break;
-#line 328 "hb-ot-shaper-khmer-machine.hh"
+#line 311 "hb-ot-shaper-khmer-machine.hh"
         }
 
         _keys = _khmer_syllable_machine_trans_keys + (cs<<1);
@@ -394,7 +394,7 @@
 #line 98 "hb-ot-shaper-khmer-machine.rl"
         {act = 3;}
         break;
-#line 398 "hb-ot-shaper-khmer-machine.hh"
+#line 368 "hb-ot-shaper-khmer-machine.hh"
         }
 
 _again:
@@ -403,7 +403,7 @@
 #line 1 "NONE"
         {ts = 0;}
         break;
-#line 407 "hb-ot-shaper-khmer-machine.hh"
+#line 375 "hb-ot-shaper-khmer-machine.hh"
         }
 
         if ( ++p != pe )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-khmer.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-khmer.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-khmer.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-khmer.cc	2026-04-17 19:09:35.000000000 +0000
@@ -141,12 +141,6 @@
    * typographical correctness.", hence in overrides... */
   map->enable_feature (HB_TAG('c','l','i','g'));
 
-  /* Uniscribe does not apply 'kern' in Khmer. */
-  if (hb_options ().uniscribe_bug_compatible)
-  {
-    map->disable_feature (HB_TAG('k','e','r','n'));
-  }
-
   map->disable_feature (HB_TAG('l','i','g','a'));
 }
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-myanmar-machine.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-myanmar-machine.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-myanmar-machine.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-myanmar-machine.hh	2026-04-17 19:09:35.000000000 +0000
@@ -50,7 +50,7 @@
 };
 
 
-#line 54 "hb-ot-shaper-myanmar-machine.hh"
+#line 51 "hb-ot-shaper-myanmar-machine.hh"
 #define myanmar_syllable_machine_ex_A 9u
 #define myanmar_syllable_machine_ex_As 32u
 #define myanmar_syllable_machine_ex_C 1u
@@ -78,7 +78,7 @@
 #define myanmar_syllable_machine_ex_ZWNJ 5u
 
 
-#line 82 "hb-ot-shaper-myanmar-machine.hh"
+#line 77 "hb-ot-shaper-myanmar-machine.hh"
 static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
         1u, 57u, 3u, 57u, 5u, 57u, 5u, 57u, 3u, 57u, 5u, 57u, 3u, 57u, 3u, 57u,
         3u, 57u, 3u, 57u, 3u, 57u, 5u, 57u, 1u, 15u, 3u, 57u, 3u, 57u, 3u, 57u,
@@ -549,7 +549,7 @@
   int cs;
   hb_glyph_info_t *info = buffer->info;
 
-#line 553 "hb-ot-shaper-myanmar-machine.hh"
+#line 542 "hb-ot-shaper-myanmar-machine.hh"
         {
         cs = myanmar_syllable_machine_start;
         ts = 0;
@@ -565,7 +565,7 @@
 
   unsigned int syllable_serial = 1;
 
-#line 569 "hb-ot-shaper-myanmar-machine.hh"
+#line 554 "hb-ot-shaper-myanmar-machine.hh"
         {
         int _slen;
         int _trans;
@@ -579,7 +579,7 @@
 #line 1 "NONE"
         {ts = p;}
         break;
-#line 583 "hb-ot-shaper-myanmar-machine.hh"
+#line 566 "hb-ot-shaper-myanmar-machine.hh"
         }
 
         _keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
@@ -649,7 +649,7 @@
 #line 113 "hb-ot-shaper-myanmar-machine.rl"
         {act = 3;}
         break;
-#line 653 "hb-ot-shaper-myanmar-machine.hh"
+#line 623 "hb-ot-shaper-myanmar-machine.hh"
         }
 
 _again:
@@ -658,7 +658,7 @@
 #line 1 "NONE"
         {ts = 0;}
         break;
-#line 662 "hb-ot-shaper-myanmar-machine.hh"
+#line 630 "hb-ot-shaper-myanmar-machine.hh"
         }
 
         if ( ++p != pe )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-thai.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-thai.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-thai.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-thai.cc	2026-04-17 19:09:35.000000000 +0000
@@ -163,7 +163,7 @@
 }
 
 
-static enum thai_above_state_t
+static const enum thai_above_state_t
 {     /* Cluster above looks like: */
   T0, /*  ⣤                      */
   T1, /*     ⣼                   */
@@ -191,7 +191,7 @@
 };
 
 
-static enum thai_below_state_t
+static const enum thai_below_state_t
 {
   B0, /* No descender */
   B1, /* Removable descender */
@@ -334,7 +334,7 @@
 
     /* Is SARA AM. Decompose and reorder. */
     (void) buffer->output_glyph (NIKHAHIT_FROM_SARA_AM (u));
-    _hb_glyph_info_set_continuation (&buffer->prev());
+    _hb_glyph_info_set_continuation (&buffer->prev(), buffer);
     if (unlikely (!buffer->replace_glyph (SARA_AA_FROM_SARA_AM (u)))) break;
 
     /* Make Nikhahit be recognized as a ccc=0 mark when zeroing widths. */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-use-machine.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-use-machine.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-use-machine.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-use-machine.hh	2026-04-17 19:09:35.000000000 +0000
@@ -53,7 +53,7 @@
 };
 
 
-#line 57 "hb-ot-shaper-use-machine.hh"
+#line 54 "hb-ot-shaper-use-machine.hh"
 #define use_syllable_machine_ex_B 1u
 #define use_syllable_machine_ex_CGJ 6u
 #define use_syllable_machine_ex_CMAbv 31u
@@ -100,7 +100,7 @@
 #define use_syllable_machine_ex_ZWNJ 14u
 
 
-#line 104 "hb-ot-shaper-use-machine.hh"
+#line 99 "hb-ot-shaper-use-machine.hh"
 static const unsigned char _use_syllable_machine_trans_keys[] = {
         49u, 51u, 0u, 56u, 11u, 56u, 11u, 56u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u,
         14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u,
@@ -929,7 +929,7 @@
   unsigned int act HB_UNUSED;
   int cs;
 
-#line 933 "hb-ot-shaper-use-machine.hh"
+#line 922 "hb-ot-shaper-use-machine.hh"
         {
         cs = use_syllable_machine_start;
         ts = 0;
@@ -942,7 +942,7 @@
 
   unsigned int syllable_serial = 1;
 
-#line 946 "hb-ot-shaper-use-machine.hh"
+#line 931 "hb-ot-shaper-use-machine.hh"
         {
         int _slen;
         int _trans;
@@ -956,7 +956,7 @@
 #line 1 "NONE"
         {ts = p;}
         break;
-#line 960 "hb-ot-shaper-use-machine.hh"
+#line 943 "hb-ot-shaper-use-machine.hh"
         }
 
         _keys = _use_syllable_machine_trans_keys + (cs<<1);
@@ -1078,7 +1078,7 @@
 #line 181 "hb-ot-shaper-use-machine.rl"
         {act = 9;}
         break;
-#line 1082 "hb-ot-shaper-use-machine.hh"
+#line 1039 "hb-ot-shaper-use-machine.hh"
         }
 
 _again:
@@ -1087,7 +1087,7 @@
 #line 1 "NONE"
         {ts = 0;}
         break;
-#line 1091 "hb-ot-shaper-use-machine.hh"
+#line 1046 "hb-ot-shaper-use-machine.hh"
         }
 
         if ( ++p != pe )
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-use-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-use-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-use-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-use-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -6,18 +6,18 @@
  *
  * on files with these headers:
  *
- * # IndicSyllabicCategory-16.0.0.txt
- * # Date: 2024-04-30, 21:48:21 GMT
- * # IndicPositionalCategory-16.0.0.txt
- * # Date: 2024-04-30, 21:48:21 GMT
- * # ArabicShaping-16.0.0.txt
- * # Date: 2024-07-30
- * # DerivedCoreProperties-16.0.0.txt
- * # Date: 2024-05-31, 18:09:32 GMT
- * # Blocks-16.0.0.txt
- * # Date: 2024-02-02
- * # Scripts-16.0.0.txt
- * # Date: 2024-04-30, 21:48:40 GMT
+ * # IndicSyllabicCategory-17.0.0.txt
+ * # Date: 2025-08-01, 04:02:23 GMT
+ * # IndicPositionalCategory-17.0.0.txt
+ * # Date: 2025-07-29, 13:35:52 GMT
+ * # ArabicShaping-17.0.0.txt
+ * # Date: 2025-08-14
+ * # DerivedCoreProperties-17.0.0.txt
+ * # Date: 2025-07-30, 23:55:08 GMT
+ * # Blocks-17.0.0.txt
+ * # Date: 2025-08-01
+ * # Scripts-17.0.0.txt
+ * # Date: 2025-07-24, 13:28:55 GMT
  * # Override values For Indic_Syllabic_Category
  * # Not derivable
  * # Initial version based on Unicode 7.0 by Andrew Glass 2014-03-17
@@ -101,8 +101,9 @@
 
 #ifndef HB_OPTIMIZE_SIZE
 
-static const uint8_t
-hb_use_u8[3345] =
+#include 
+
+static const uint8_t hb_use_u8[3343]=
 {
      16,   50,   51,   51,   51,   52,   51,   83,  118,  131,   57,   58,   59,  195,  211,   62,
      51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,
@@ -126,24 +127,24 @@
      49,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   50,   51,    2,    2,    2,
       2,    2,    2,    2,    2,   52,   53,    2,   54,    2,    2,   55,   56,    2,   57,   58,
      59,   60,   61,   62,   63,   64,   65,   66,   67,   68,   69,    2,   70,   71,   72,   73,
-      2,   74,    2,   75,   76,   77,   78,    2,    2,   79,   80,   81,   82,    2,   83,   84,
-      2,   85,   85,   85,   85,   85,   85,   85,   85,   86,   85,   85,   85,   85,   85,   85,
-     85,   85,   85,   85,   85,   85,   85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
-     85,   85,   85,   85,   85,   85,   85,   85,   87,    2,    2,    2,    2,    2,    2,    2,
+      2,   74,    2,   75,   76,   77,   78,   79,    2,   80,   81,   82,   83,    2,   84,   85,
+      2,   86,   86,   86,   86,   86,   86,   86,   86,   87,   86,   86,   86,   86,   86,   86,
+     86,   86,   86,   86,   86,   86,   86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
+     86,   86,   86,   86,   86,   86,   86,   86,   88,    2,    2,    2,    2,    2,    2,    2,
       2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,   88,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,   89,   90,    2,    2,    2,   91,    2,    2,    2,   92,
-     93,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,    2,   94,   94,   94,   95,    2,    2,    2,    2,    2,
+      2,    2,    2,   89,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    2,   90,   91,    2,    2,    2,   92,    2,    2,    2,   93,
+     94,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    2,    2,   95,   95,   95,   96,    2,    2,    2,    2,    2,
       2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,    2,    2,    2,   96,   97,    2,    2,    2,    2,    2,
-      2,    2,    2,   98,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    2,    2,    2,    2,   97,   98,    2,    2,    2,    2,    2,
+      2,    2,    2,   99,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
       2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,   99,    2,    2,  100,    2,    2,    2,  101,    2,  102,    2,    2,    2,
-      2,    2,    2,  103,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      2,  104,  104,  105,  106,  104,  104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
-    104,  104,  104,  104,  104,  104,  104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
-    104,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,
+      2,    2,    2,  100,    2,    2,  101,    2,    2,    2,  102,    2,  103,    2,    2,    2,
+      2,    2,    2,  104,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+      2,  105,  105,  106,  107,  105,  105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+    105,  105,  105,  105,  105,  105,  105,  105,  105,  105,  105,  105,  105,  105,  105,  105,
+    105,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,
       0,    2,    2,    2,    2,    2,    0,    0,    0,    0,    0,    0,    0,    0,    3,    4,
       0,    5,    0,    0,    0,    0,    0,    6,    0,    0,    7,    0,    0,    0,    0,    0,
       0,    0,    0,    0,    1,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -192,99 +193,99 @@
      48,   48,   48,   48,   15,   82,   83,   84,   85,   86,   87,    0,    0,    0,    0,   88,
       0,    9,    0,    0,   30,    0,   89,   81,   90,    2,    2,    2,    2,    9,    0,    0,
       0,   42,   42,   91,   92,    2,    2,    2,    2,    2,    2,    2,    2,   13,    9,    0,
-      0,   93,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-      9,   22,   80,   45,   22,   94,   61,    0,    0,   95,   96,   95,   95,   97,   98,    0,
-      0,    2,    2,    2,    2,    2,    2,    2,    0,    2,    2,    9,    0,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,    2,    0,    0,    2,    2,    2,    2,   29,    0,    0,
-      0,    2,    2,    2,    2,    2,    9,    0,    0,    2,    2,    2,   52,   99,   45,    0,
-      0,    2,    2,  100,  101,  102,  103,   61,   63,  104,   16,   45,   22,   59,   21,   80,
-     48,   48,   76,   11,   11,   11,  105,   46,   40,   11,  106,   74,    2,    2,    2,    2,
-      2,    2,    2,  107,   22,   20,   20,   22,   48,   48,   22,  108,    2,    2,    2,    9,
-      0,    0,    0,    0,    0,    0,  109,  110,  110,  110,  110,    0,    0,    0,    0,    0,
-      0,  106,   74,    2,    2,    2,    2,    2,    2,   60,   61,   59,   25,   22,  111,   61,
-      2,    2,    2,    2,  107,   22,   23,   45,   45,  102,  112,    0,    0,    0,    0,    0,
-      0,    2,    2,   61,   18,   48,   23,  113,  102,  102,  102,  114,  115,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,    0,   30,    2,   11,   46,  116,  116,  116,   11,  116,
-    116,   15,  116,  116,  116,   26,    0,   40,    0,    0,    0,  117,   51,   11,    5,    0,
-      0,    0,    0,    0,    0,    0,  118,    0,    0,    0,    0,    0,    0,    0,    6,  119,
-    120,   42,   42,    5,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  120,  120,
-    121,  120,  120,  120,  120,  120,  120,  120,  120,    0,    0,  122,    0,    0,    0,    0,
-      0,    0,    7,  122,    0,    0,    0,    0,    0,   46,    0,    0,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,    0,    9,    0,    0,    0,    0,  123,  123,    0,    0,
-      0,    2,    2,    2,    2,    0,    0,    0,   30,    0,    0,    0,    0,    0,    0,    0,
-    124,    0,  123,  123,    0,    0,    0,    0,    0,    2,   53,    2,  108,    2,   10,    2,
-      2,    2,   65,   19,   16,    0,    0,   31,    0,    2,    2,    0,    0,    0,    0,    0,
-      0,   29,    2,    2,    2,    2,    2,    2,    2,    2,    2,  125,   23,   23,   23,   23,
-     23,   23,   23,  126,    0,    0,    0,    0,    0,   11,   11,   11,   11,   11,   11,   11,
-     11,   11,    2,    0,    0,    0,    0,    0,   52,    2,    2,    2,   22,   22,  127,  116,
-      0,    2,    2,    2,  128,   20,   59,   20,  113,  102,  129,    0,    0,    0,    0,    0,
-      0,   11,  130,    2,    2,    2,    2,    2,    2,    2,  131,   23,   22,   20,   48,  132,
-    133,  134,    0,    0,    0,    0,    0,    0,    0,    2,    2,   52,   30,    2,    2,    2,
-      2,    2,    2,    2,    2,   10,   22,   59,   99,   76,  135,  136,  137,    0,    0,    0,
-      0,    2,  138,    2,    2,    2,    2,  139,    0,   30,    2,   42,    5,    0,   79,   15,
-      2,   53,   22,  140,   52,   53,    2,    2,  105,   10,    9,    0,    0,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,  141,   21,   25,    0,    0,  142,  143,    0,    0,    0,
-      0,    2,   65,   45,   23,   80,   47,  144,    0,   81,   81,   81,   81,   81,   81,   81,
-     81,    0,    0,    0,    0,    0,    0,    0,    6,  120,  120,  120,  120,  121,    0,    0,
-      0,    2,    2,    2,    2,    2,    9,    2,    2,    2,    9,    2,   30,    2,    2,    2,
-      2,    2,   30,    2,    2,    2,   30,    9,    0,  128,   20,   27,   31,    0,    0,  145,
-    146,    2,    2,   30,    2,   30,    2,    2,    2,    2,    2,    2,    0,   14,   37,    0,
-    147,    2,    2,   13,   37,    0,   30,    2,    2,    2,    0,    0,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,   30,    2,    2,    9,    2,    2,   11,   41,    0,    0,    0,
-      0,    2,    2,    2,    0,   27,   22,   22,   30,    2,    2,    2,    0,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,   27,   38,    0,    2,    2,    2,  116,  116,  116,  116,
-    116,  148,    2,    9,    0,    0,    0,    0,    0,    2,   14,   14,    0,    0,    0,    0,
-      0,    9,    2,    2,    9,    2,    2,    2,    2,   30,    2,    9,    0,   30,    2,    0,
-      0,  149,  150,  151,    2,    2,    2,    2,    2,    2,    2,    2,    2,   22,   22,   20,
-     20,   20,   22,   22,  134,    0,    0,    0,    0,    0,  152,  152,  152,  152,  152,  152,
-    152,  152,  152,  152,    2,    2,    2,    2,    2,   53,   52,   53,    0,    0,    0,    0,
-    153,   11,   74,    2,    2,    2,    2,    2,    2,   18,   19,   21,   16,   24,   37,    0,
-      0,    0,   31,    0,    0,    0,    0,    0,    0,   11,   49,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,  128,   20,   22,  154,   22,   21,  155,  156,    2,    2,    2,    2,
-      2,    0,    0,   65,  157,    0,    0,    0,    0,    2,   13,    0,    0,    0,    0,    0,
-      0,    2,   65,   25,   20,   20,   20,   22,   22,  108,  158,    0,    0,   56,  159,   31,
-    160,   30,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   23,
-     19,   22,   22,  161,   44,    0,    0,    0,   49,  128,    0,    0,    0,    0,    0,    0,
-      0,    2,    2,    2,    9,    9,    2,    2,   30,    2,    2,    2,    2,    2,    2,    2,
-     30,    2,    2,    2,    2,    2,    2,    2,   10,   18,   19,   21,   22,  162,   31,    0,
-      0,   11,   11,   30,    2,    2,    2,    9,   30,    9,    2,   30,    2,    2,   58,   17,
-     23,   16,   23,   47,   32,   33,   32,   34,    0,    0,    0,    0,   35,    0,    0,    0,
-      2,    2,   23,    0,   11,   11,   11,   46,    0,   11,   11,   46,    0,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,   30,    0,    9,    2,    2,    2,   30,   45,   59,   20,
-     20,   31,   33,   32,   32,   25,  163,   29,  164,  165,   37,    0,    0,    0,    0,    0,
-      0,   12,   26,    0,    0,    0,    0,    0,    0,    2,    2,   65,   25,   20,   20,   20,
-     22,   23,  126,   15,   17,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,    0,
-    166,  167,    0,    0,    0,    0,    0,    0,    0,   18,   19,   20,   20,   66,   99,   25,
-    160,   11,  168,    9,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,    2,
-     65,   25,   20,   20,    0,   48,   48,   11,  169,   37,    0,    0,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    2,    2,   20,    0,   23,   19,   20,   20,   21,   16,   82,
-    169,   38,    0,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,   10,  170,
-     25,   20,   22,   22,  168,    9,    0,    0,    0,    2,    2,    2,    2,    2,    9,   43,
-    136,   23,   22,   20,   76,   21,   22,    0,    0,    2,    2,    2,    9,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,    2,   18,   19,   20,   21,   22,  105,  169,   37,    0,
-      0,    2,    2,    2,    9,   30,    0,    2,    2,    2,    2,   30,    9,    2,    2,    2,
-      2,   23,   23,   18,   32,   33,   12,  171,  165,  172,  173,    0,    0,    0,    0,    0,
-      0,    2,    2,    2,    2,    0,    2,    2,    2,   65,   25,   20,   20,    0,   22,   23,
-     29,  108,    0,   33,    0,    0,    0,    0,    0,   52,   20,   22,   22,   22,  140,    2,
-      2,    2,  174,  175,   11,   15,  176,   61,  177,    0,    0,    1,  147,    0,    0,    0,
-      0,   52,   20,   22,   16,   19,   20,    2,    2,    2,    2,  158,  158,  158,  178,  178,
-    178,  178,  178,  178,   15,  179,    0,   30,    0,   22,   20,   20,   31,   22,   22,   11,
+      0,    2,    2,    2,    2,    2,    2,    2,    9,   22,   80,   45,   22,   93,   61,    0,
+      0,   94,   95,   94,   94,   96,   97,    0,    0,    2,    2,    2,    2,    2,    2,    2,
+      0,    2,    2,    9,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,    0,
+      0,    2,    2,    2,    2,   29,    0,    0,    0,    2,    2,    2,    2,    2,    9,    0,
+      0,    2,    2,    2,   52,   98,   45,    0,    0,    2,    2,   99,  100,  101,  102,   61,
+     63,  103,   16,   45,   22,   59,   21,   80,   48,   48,   76,   11,   11,   11,  104,   46,
+     40,   11,  105,   74,    2,    2,    2,    2,    2,    2,    2,  106,   22,   20,   20,   22,
+     48,   48,   22,  107,    2,    2,    2,    9,    0,    0,    0,    0,    0,    0,  108,  109,
+    109,  109,  109,    0,    0,    0,    0,    0,    0,  105,   74,    2,    2,    2,    2,    2,
+      2,   60,   61,   59,   25,   22,  110,   61,    2,    2,    2,    2,  106,   22,   23,   45,
+     45,  101,  111,    0,    0,    0,    0,    0,    0,    2,    2,   61,   18,   48,   23,  112,
+    101,  101,  101,  113,  114,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,   30,
+      2,   11,   46,  115,  115,  115,   11,  115,  115,   15,  115,  115,  115,   26,    0,   40,
+      0,    0,    0,  116,   51,   11,    5,    0,    0,    0,    0,    0,    0,    0,  117,    0,
+      0,    0,    0,    0,    0,    0,    6,  118,  119,   42,   42,    5,    0,    0,    0,    0,
+      0,    0,    0,    0,    0,    0,  119,  119,  120,  119,  119,  119,  119,  119,  119,  119,
+    119,    0,    0,  121,    0,    0,    0,    0,    0,    0,    7,  121,    0,    0,    0,    0,
+      0,   46,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    9,
+      0,    0,    0,    0,  122,  122,    0,    0,    0,    2,    2,    2,    2,    0,    0,    0,
+     30,    0,    0,    0,    0,    0,    0,    0,  123,    0,  122,  122,    0,    0,    0,    0,
+      0,    2,   53,    2,  107,    2,   10,    2,    2,    2,   65,   19,   16,    0,    0,   31,
+      0,    2,    2,    0,    0,    0,    0,    0,    0,   29,    2,    2,    2,    2,    2,    2,
+      2,    2,    2,  124,   23,   23,   23,   23,   23,   23,   23,  125,    0,    0,    0,    0,
+      0,   11,   11,   11,   11,   11,   11,   11,   11,   11,    2,    0,    0,    0,    0,    0,
+     52,    2,    2,    2,   22,   22,  126,  115,    0,    2,    2,    2,  127,   20,   59,   20,
+    112,  101,  128,    0,    0,    0,    0,    0,    0,   11,  129,    2,    2,    2,    2,    2,
+      2,    2,  130,   23,   22,   20,   48,  131,  132,  133,    0,    0,    0,    0,    0,    0,
+      0,    2,    2,   52,   30,    2,    2,    2,    2,    2,    2,    2,    2,   10,   22,   59,
+     98,   76,  134,  135,  136,    0,    0,    0,    0,    2,  137,    2,    2,    2,    2,  138,
+      0,   30,    2,   42,    5,    0,   79,   15,    2,  139,   20,   53,  127,  139,    2,    2,
+    140,   10,    9,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,  141,   21,
+     25,    0,    0,  142,  143,    0,    0,    0,    0,    2,   65,   45,   23,   80,   47,  144,
+      0,   81,   81,   81,   81,   81,   81,   81,   81,    0,    0,    0,    0,    0,    0,    0,
+      6,  119,  119,  119,  119,  120,    0,    0,    0,    2,    2,    2,    2,    2,    9,    2,
+      2,    2,    9,    2,   30,    2,    2,    2,    2,    2,   30,    2,    2,    2,   30,    9,
+      0,  127,   20,   27,   31,    0,    0,  145,  146,    2,    2,   30,    2,   30,    2,    2,
+      2,    2,    2,    2,    0,   14,   37,    0,  147,    2,    2,   13,   37,    0,   30,    2,
+      2,    2,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,   30,    2,    2,
+      9,    2,    2,   11,   41,    0,    0,    0,    0,    2,    2,    2,    0,   27,   22,   22,
+     30,    2,    2,    2,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,   27,   38,
+      0,    2,    2,    2,  115,  115,  115,  115,  115,  148,    2,    9,    0,    0,    0,    0,
+      0,    2,   14,   14,    0,    0,    0,    0,    0,    9,    2,    2,    9,    2,    2,    2,
+      2,   30,    2,    9,    0,   30,    2,    0,    0,  149,  150,  151,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,   22,   22,   20,   20,   20,   22,   22,  133,    0,    0,    0,
+      0,    0,  152,  152,  152,  152,  152,  152,  152,  152,  152,  152,    2,    2,    2,    2,
+      2,   53,   52,   53,    0,    0,    0,    0,  153,   11,   74,    2,    2,    2,    2,    2,
+      2,   18,   19,   21,   16,   24,   37,    0,    0,    0,   31,    0,    0,    0,    0,    0,
+      0,   11,   49,    2,    2,    2,    2,    2,    2,    2,    2,    2,  127,   20,   22,  154,
+     22,   21,  155,  156,    2,    2,    2,    2,    2,    0,    0,   65,  157,    0,    0,    0,
+      0,    2,   13,    0,    0,    0,    0,    0,    0,    2,   65,   25,   20,   20,   20,   22,
+     22,  107,  158,    0,    0,   56,  159,   31,  160,   30,    2,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    2,    2,   23,   19,   22,   22,  161,   44,    0,    0,    0,
+     49,  127,    0,    0,    0,    0,    0,    0,    0,    2,    2,    2,    9,    9,    2,    2,
+     30,    2,    2,    2,    2,    2,    2,    2,   30,    2,    2,    2,    2,    2,    2,    2,
+     10,   18,   19,   21,   22,  162,   31,    0,    0,   11,   11,   30,    2,    2,    2,    9,
+     30,    9,    2,   30,    2,    2,   58,   17,   23,   16,   23,   47,   32,   33,   32,   34,
+      0,    0,    0,    0,   35,    0,    0,    0,    2,    2,   23,    0,   11,   11,   11,   46,
+      0,   11,   11,   46,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,   30,    0,
+      9,    2,    2,    2,   30,   45,   59,   20,   20,   31,   33,   32,   32,   25,  163,   29,
+    164,  165,   37,    0,    0,    0,    0,    0,    0,   12,   26,    0,    0,    0,    0,    0,
+      0,    2,    2,   65,   25,   20,   20,   20,   22,   23,  125,   15,   17,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,    0,    0,  166,  167,    0,    0,    0,    0,    0,    0,
+      0,   18,   19,   20,   20,   66,   98,   25,  160,   11,  168,    9,    0,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,    2,    2,   65,   25,   20,   20,    0,   48,   48,   11,
+    169,   37,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    2,    2,   20,
+      0,   23,   19,   20,   20,   21,   16,   82,  169,   38,    0,    0,    0,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,   10,  170,   25,   20,   22,   22,  168,    9,    0,    0,
+      0,    2,    2,    2,    2,    2,    9,   43,  135,   23,   22,   20,   76,   21,   22,    0,
+      0,    2,    2,    2,    9,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,   18,
+     19,   20,   21,   22,  104,  169,   37,    0,    0,    2,    2,    2,    9,   30,    0,    2,
+      2,    2,    2,   30,    9,    2,    2,    2,    2,   23,   23,   18,   32,   33,   12,  171,
+    165,  172,  173,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    0,    2,    2,
+      2,   65,   25,   20,   20,    0,   22,   23,   29,  107,    0,   33,    0,    0,    0,    0,
+      0,   52,   20,   22,   22,   22,  139,    2,    2,    2,  174,  140,   11,   15,  175,   61,
+    176,    0,    0,    1,  147,    0,    0,    0,    0,   52,   20,   22,   16,   19,   20,    2,
+      2,    2,    2,  158,  158,  158,  177,  177,  177,  177,  177,  177,   15,  178,    0,   30,
+      0,   16,   20,   16,   16,    0,    0,    0,    0,   22,   20,   20,   31,   22,   22,   11,
     169,    0,   61,   61,   61,   61,   61,   61,   61,   66,   21,   82,   46,    0,    0,    0,
       0,    2,    2,    2,    9,    2,   30,    2,    2,   52,   22,   22,   31,    0,   38,   22,
-     27,   11,  159,  180,  181,    0,    0,    0,    0,    2,    2,    2,   30,    9,    2,    2,
+     27,   11,  159,  179,  180,    0,    0,    0,    0,    2,    2,    2,   30,    9,    2,    2,
       2,    2,    2,    2,    2,    2,   23,   23,   47,   22,   35,   82,   68,    0,    0,    0,
-      0,    2,  182,   66,   47,    0,    0,    0,    0,   11,  183,    2,    2,    2,    2,    2,
+      0,    2,  181,   66,   47,    0,    0,    0,    0,   11,  182,    2,    2,    2,    2,    2,
       2,    2,    2,   23,   22,   20,   31,    0,   48,   16,  143,    0,    0,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,  156,    0,    0,  184,  184,  184,  184,  184,  184,  184,
-    184,  185,  185,  185,  186,  187,  185,  184,  184,  188,  184,  184,  189,  190,  190,  190,
-    190,  190,  190,  190,    0,    0,    0,    0,    0,  184,  184,  184,  184,  184,  191,    0,
-      0,    2,    2,    2,    2,    2,    2,    2,   22,   22,   22,   22,   22,   22,  192,  193,
-    194,   11,   11,   11,   46,    0,    0,    0,    0,   29,   74,    2,    2,    2,    2,    2,
+      0,    2,    2,    2,    2,    2,  156,    0,    0,  183,  183,  183,  183,  183,  183,  183,
+    183,  184,  184,  184,  185,  186,  184,  183,  183,  187,  183,  183,  188,  189,  189,  189,
+    189,  189,  189,  189,    0,    0,    0,    0,    0,  183,  183,  183,  183,  183,  190,    0,
+      0,    2,    2,    2,    2,    2,    2,    2,   22,   22,   22,   22,   22,   22,  191,  192,
+    193,   11,   11,   11,   46,    0,    0,    0,    0,   29,   74,    2,    2,    2,    2,    2,
       2,    2,    2,    2,    2,    2,   65,   47,    0,    2,    2,    2,    2,    2,    9,    0,
-     58,  195,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
-     20,   20,   20,   20,   20,    0,    0,    0,   40,  116,   26,    0,    0,    0,    0,    0,
+     58,  194,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
+     20,   20,   20,   20,   20,    0,    0,    0,   40,  115,   26,    0,    0,    0,    0,    0,
       0,    0,    0,    9,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-     30,    2,    2,    2,    2,    2,    0,   58,   37,    0,    6,  120,  120,  120,  121,    0,
+     30,    2,    2,    2,    2,    2,    0,   58,   37,    0,    6,  119,  119,  119,  120,    0,
       0,   11,   11,   11,   49,    2,    2,    2,    0,    2,    2,    2,    2,    2,    0,    0,
       2,    2,    2,    2,    2,    2,    2,    2,   46,    2,    2,    2,    2,    2,    2,   11,
      11,    2,    2,    2,    2,    2,    2,   22,   22,    2,    2,    2,    2,    2,    2,    2,
@@ -300,23 +301,21 @@
   VMBlw,VMPst,   IS, VAbv, MPst, MPre, MBlw, MBlw,    B, MBlw, MBlw, VPst,VMPst,VMPst,    B, MBlw,
    VPst, VPre, VAbv, VAbv,VMPst,VMPst,VMBlw,    B,VMPst, VBlw, VPst,  CGJ,  CGJ, VPst,VMAbv,VMAbv,
   FMAbv, FAbv,CMAbv,FMAbv,VMAbv,FMAbv, VAbv,   IS,FMAbv,    B,FMAbv,    B,  CGJ,   WJ,  CGJ,   GB,
-  CMAbv,CMAbv,    B,   GB,    B, VAbv,  SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv,
-   VPre,    B, MPre, MBlw,  SUB, FAbv, FAbv, MAbv,  SUB,   Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv,
-   VPst,    H,    B,    O,SMAbv,SMAbv,SMAbv, VPst,   IS,   RK,   RK, VBlw, FAbv,VMPre,VMPre,FMAbv,
-  CMBlw,VMBlw,VMBlw,VMAbv,   CS,    O,FMAbv, ZWNJ,  CGJ,   WJ,   WJ,   WJ,    O,FMPst,    O,   SB,
-     SE,    O,    H, MPst, VPst,    H,VMAbv, VAbv,VMBlw,    B, VBlw, FPst, VPst, FAbv,VMPst,    B,
-  CMAbv, VAbv, MBlw, MPst, MBlw,    H,    O, VBlw, MPst, MPre, MAbv, MBlw,    O,    B, FAbv, FAbv,
-   FPst, VBlw,    B,    B, VPre,    O,VMPst,   IS,    O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv,    O,
+  CMAbv,CMAbv,    B, VAbv,  SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre,    B,
+   MPre, MBlw,  SUB, FAbv, FAbv, MAbv,  SUB,   Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst,    H,
+      B,    O,SMAbv,SMAbv,SMAbv, VPst,   IS,   RK,   RK, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,
+  VMBlw,VMAbv,   CS,    O,FMAbv, ZWNJ,  CGJ,   WJ,   WJ,   WJ,    O,FMPst,    O,   SB,   SE,    O,
+      H, MPst, VPst,    H,VMAbv, VAbv,VMBlw,    B, VBlw, FPst, VPst, FAbv,VMPst,    B,CMAbv, VAbv,
+   MBlw, MPst, MBlw,    H,    O, VBlw, MPst, MPre, MAbv, MBlw,    O,    B, FAbv, FAbv, FPst, VBlw,
+      B, VBlw,VMAbv,    B, VPre,    O,VMPst,   IS,    O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv,    O,
      IS,VMBlw,    B,VMPst,VMAbv,VMPst,   CS,   CS,    B,    N,    N,    O,   HN, VPre, VBlw, VAbv,
      IS,CMAbv,    O, VPst,    B,    R,    R,CMBlw, VAbv, VPre,VMAbv,VMAbv,    H, VAbv,CMBlw,VMPst,
       O,VMAbv,CMBlw,   IS,    R,FMAbv,    B,   CS,   CS,    H,CMBlw,VMPst,    H,VMPst, VAbv,VMAbv,
-   VPst, MPst,    R, MPst,CMBlw,    B,FMBlw, VBlw,VMAbv,   CS,  SUB,  SUB,   GB, FBlw, FBlw,CMAbv,
-     IS, VBlw,   IS,    R, MBlw,   GB, VAbv,    R,VMPst,    G,    G,    J,    J,    J,   SB,   SE,
-      J,   HR,    G,    G,   HM,   HM,   HM,    G,    O, MPre, MPre, MPst,VMAbv, MBlw, VBlw,    O,
-   VBlw,
+   VPst, MPst,    R, MPst,CMBlw,    B,FMBlw,   CS,  SUB,  SUB,   GB, FBlw, FBlw,CMAbv,   IS, VBlw,
+     IS,    R, MBlw,   GB, VAbv,    R,VMPst,    G,    G,    J,    J,    J,   SB,   SE,    J,   HR,
+      G,    G,   HM,   HM,   HM,    G,    O, MPre, MPre, MPst,VMAbv, MBlw, VBlw,    O, VBlw,
 };
-static const uint16_t
-hb_use_u16[856] =
+static const uint16_t hb_use_u16[864]=
 {
     0,  0,  1,  2,  0,  3,  0,  3,  0,  0,  4,  5,  0,  6,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  0,  0,  0,
@@ -330,66 +329,65 @@
    73, 74, 75, 76, 77,  0,  0,  0, 10, 10, 78, 79, 80, 81, 82, 83,
    84, 85,  0,  0,  0,  0,  0,  0, 10, 86, 10, 87, 10, 88, 89, 90,
    10, 10, 10, 91, 92, 93,  2,  0, 94,  0, 10, 10, 10, 10, 10, 95,
-   96, 10, 97,  0,  0,  0,  0,  0, 98, 99,100,101, 31, 10,102,103,
-   10, 10,104, 10,105,106,  0,  0, 10,107, 10, 10, 10,108,109,110,
-    2,  2,  0,  0,  0,  0,  0,  0,111, 10, 10,112,113,  2,114,115,
-  116, 10,117, 10, 10, 10,118,119, 10, 10,120,121,122,  0,  0,  0,
-    0,  0,  0,  0,  0,123,124,125,  0,  0,  0,  0,  0,  0,  0,126,
-  127,128,129,  0,  0,  0,130,131,132,  0,  0,  0,  0,  0,  0,133,
-    0,  0,  0,  0,134,  0,  0,  0,  0,  0,  0,  0,  0,  0,135,  0,
-    0,  0,  0, 10, 10, 10,136,137,  0,  0,138,  0,  0,  0,  0,  0,
-  139, 10,140,  0, 10, 10, 10,141,142, 10, 10,143,144,  2,145,146,
-   10, 10,147, 10,148,149,  0,  0,150, 10, 10,151,152,  2,153, 99,
-   10, 10,154,155,156,  2, 10,157, 10, 10, 10,158,159,  0,160,161,
-    0,  0,  0,  0, 10, 10,162,  2,163,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,164,  0,  0,  0,  0,  0,  0,  0,165,
-    0,  0,  0,  0,  0,  0,  0,166,166,167, 34,168,  0,  0,  0,  0,
-  169,170, 10,171, 95,  0,  0,  0,  0,  0,  0,  0, 70, 10,172,  0,
-   10,173,174,  0,  0,  0,  0,  0, 10, 10,175,  2,  9, 10,176, 10,
-  177,  0,  0,  0,  0,  0,  0,  0, 10, 10,178,173,  0,  0,  0,  0,
-    0,  0,  0, 10,179,180,  0, 10,181,  0,  0,182,183,  0,  0,  0,
-  184, 10, 10,185,186,187,188,189,190, 10, 10,191,192,  0,  0,  0,
-  193, 10,194,195,196, 10, 10,197,190, 10, 10,198,199,106,200,103,
-   10, 34,201,202,203,  0,  0,  0,204,205, 95, 10, 10,206,207,  2,
-  208, 21, 22,209,210,211,212,213,214, 10, 10,215,216,217,218,  0,
-   10, 10, 10,219,220,221,222,  0,200, 10, 10,223,224,  2,  0,  0,
-   10, 10,225,226,227,228,  0,  0, 10, 10, 10,229,230,  2,  0,  0,
-   10, 10,231,232,  2, 10,141,  0, 10,233,234,104,235,  0,  0,  0,
-   10, 10,236,237,  0,  0,  0,  0,238,239, 10,240,241,  2,  0,  0,
-    0,  0,242, 10, 10,243,244,  0,245, 10, 10,246,247,248, 10, 10,
-  249,250,  0,  0,  0,  0,  0,  0, 22, 10,225,251,  8, 10, 71, 19,
-   10,252, 74,253,  0,  0,  0,  0,254, 10, 10,255,256,  2,257, 10,
-  258,259,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,260,
-  261, 49, 10,262,263,264,  0,  0,265,265,265,265,265,265,265,265,
-  265,265,265,266,267,268,265,265,265,265,265,265,265,265,265,269,
-   10,270,271,  2,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,
-   10, 10, 10,272,  0,  0,  0,  0,  0,  0,  0,  0,273, 10,274,  2,
-   10, 10, 10, 10,275,276,277,277,278,279,  0,  0,  0,  0,280,  0,
-   10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,177,  0,281,
-   10, 10, 10, 10, 10, 10,106, 71, 95,282,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,283, 10, 10, 71,284,285,  0,  0,  0,
-    0, 10,286,  0, 10, 10,287,  2,  0,  0,  0,  0,  0, 10,288,  2,
-    0,  0,  0,  0,  0, 10,289,106, 10, 10, 10, 10,290,  2,  0,  0,
-  130,130,130,130,130,130,130,130,163,163,163,163,163,163,163,163,
-  163,163,163,163,163,163,163,130,
+   96, 10, 97,  0,  0,  0,  0,  0, 10, 98, 99,100, 31, 10,101,102,
+   10, 10,103, 10,104,105,  0,  0, 10,106, 10, 10, 10,107,108,109,
+    2,  2,  0,  0,  0,  0,  0,  0,110, 10, 10,111,112,  2,113,114,
+  115, 10,116, 10, 10, 10,117,118, 10, 10,119,120,121,  0,  0,  0,
+    0,  0,  0,  0,  0,122,123,124,  0,  0,  0,  0,  0,  0,  0,125,
+  126,127,128,  0,  0,  0,129,130,131,  0,  0,  0,  0,  0,  0,132,
+    0,  0,  0,  0,133,  0,  0,  0,  0,  0,  0,  0,  0,  0,134,  0,
+    0,  0,  0, 10, 10, 10,135,136,  0,  0,137,  0,  0,  0,  0,  0,
+  138, 10,139,  0, 10, 10, 10,140,141, 10, 10,142,143,  2,144,145,
+   10, 10,146, 10,147,148,  0,  0,149, 10, 10,150,151,  2,152, 98,
+   10, 10,153,154,155,  2, 10,156, 10, 10, 10,157,158,  0,159,160,
+    0,  0,  0,  0, 10, 10,161,  2,162,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,163,  0,  0,  0,  0,  0,  0,  0,164,
+    0,  0,  0,  0,  0,  0,  0,165,165,166, 34,167,  0,  0,  0,  0,
+  168,169, 10,170, 95,  0,  0,  0,  0,  0,  0,  0, 70, 10,171,  0,
+   10,172,173,  0,  0,  0,  0,  0, 10, 10,174,  2,  9, 10,175, 10,
+  176,  0,  0,  0,  0,  0,  0,  0, 10, 10,177,172,  0,  0,  0,  0,
+    0,  0,  0, 10,178,179,  0, 10,180,  0,  0,181,182,  0,  0,  0,
+  183, 10, 10,184,185,186,187,188,189, 10, 10,190,191,  0,  0,  0,
+  192, 10,193,194,195, 10, 10,196,189, 10, 10,197,198,105,199,102,
+   10, 34,200,201,202,  0,  0,  0,203,204, 95, 10, 10,205,206,  2,
+  207, 21, 22,208,209,210,211,212,213, 10, 10,214,215,216,217,  0,
+   10, 10, 10,218,219,220,221,  0,199, 10, 10,222,223,  2,  0,  0,
+   10, 10,224,225,226,227,  0,  0, 10, 10, 10,228,229,  2,  0,  0,
+   10, 10,230,231,  2, 10,140,  0, 10,232,233,103,234,  0,  0,  0,
+   10, 10,235,236,  0,  0,  0,  0,237,238, 10,239,240,  2,  0,  0,
+    0,  0,241, 10, 10,242,243,  0,244, 10, 10,245,246,247, 10, 10,
+  248,249,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,250,  0,
+   22, 10,224,251,  8, 10, 71, 19, 10,252, 74,253,  0,  0,  0,  0,
+  254, 10, 10,255,256,  2,257, 10,258,259,  2,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 10,260,261, 49, 10,262,263,264,  0,  0,
+  265,265,265,265,265,265,265,265,265,265,265,266,267,268,265,265,
+  265,265,265,265,265,265,265,269, 10,270,271,  2,  0,  0,  0,  0,
+    0,  0,  0,  0,  2,  0,  0,  0, 10, 10, 10,272,  0,  0,  0,  0,
+    0,  0,  0,  0,273, 10,274,  2, 10, 10, 10, 10,275,276,277,277,
+  278,279,  0,  0,  0,  0,280,  0, 10, 10, 10, 10, 10, 10, 10, 10,
+   10, 10, 10, 10, 10,176,  0,281, 10, 10, 10, 10, 10, 10,105, 71,
+   95,282,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,283,
+   10, 10, 71,284,285,  0,  0,  0,  0, 10,286,  0, 10, 10,287,  2,
+    0,  0,  0,  0,  0, 10,288,  2,  0,  0,  0,  0,  0, 10,289,105,
+   10, 10, 10, 10,290,  2,  0,  0,129,129,129,129,129,129,129,129,
+  162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,129,
 };
 
-static inline unsigned
-hb_use_b4 (const uint8_t* a, unsigned i)
+static inline uint8_t hb_use_b4 (const uint8_t* a, unsigned i)
 {
-  return (a[i>>1]>>((i&1u)<<2))&15u;
+  return (a[i>>1]>>((i&1)<<2))&15;
 }
-static inline uint_fast8_t
-hb_use_get_category (unsigned u)
+static inline uint8_t hb_use_get_category (unsigned u)
 {
-  return u<921600u?hb_use_u8[2953+(((hb_use_u8[625+(((hb_use_u16[((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>3>>5))<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O;
+  return u<921600 ? hb_use_u8[2953u+((hb_use_u8[625u+((hb_use_u16[((hb_use_u8[113u+((hb_use_b4(hb_use_u8,((((((((u)>>1))>>3))>>3))>>5)))<<5)+((((((((u)>>1))>>3))>>3))&31)])<<3)+((((((u)>>1))>>3))&7)])<<3)+((((u)>>1))&7)])<<1)+((u)&1)] : O;
 }
 
 
 #else
 
-static const uint8_t
-hb_use_u8[3657] =
+#include 
+
+static const uint8_t hb_use_u8[3663]=
 {
      16,   50,   51,   51,   51,   52,   51,   83,  118,  131,   57,   58,   59,  195,  211,   62,
      51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,   51,
@@ -405,16 +403,16 @@
       1,    1,    1,    1,    1,    1,    1,    1,    1,   25,   26,   27,   28,    1,    1,    1,
       1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,   29,
      30,    1,    1,    1,    1,    1,   31,    1,    1,    1,    1,   32,   33,    1,   34,   35,
-     36,   37,   38,   39,   40,   41,   42,   43,   44,   45,   46,   47,    1,   48,   49,   50,
-     51,   52,   52,   52,   52,   53,   52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
-     52,   52,   52,   52,   54,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-      1,    1,   55,    1,    1,    1,    1,    1,    1,    1,    1,   56,   57,    1,   58,    1,
-     59,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,   60,   61,    1,    1,
-      1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,   62,    1,    1,
-      1,    1,   63,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-      1,    1,   64,   65,    1,   66,   67,    1,    1,    1,   68,    1,    1,    1,    1,    1,
-      1,   69,   70,   69,   69,   69,   69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
-     69,    0,    1,    2,    2,    0,    3,    4,    0,    0,    0,    0,    0,    0,    0,    0,
+     36,   37,   38,   39,   40,   41,   42,   43,   44,   45,   46,   47,   48,   49,   50,   51,
+     52,   53,   53,   53,   53,   54,   53,   53,   53,   53,   53,   53,   53,   53,   53,   53,
+     53,   53,   53,   53,   55,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+      1,    1,   56,    1,    1,    1,    1,    1,    1,    1,    1,   57,   58,    1,   59,    1,
+     60,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,   61,   62,    1,    1,
+      1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,   63,    1,    1,
+      1,    1,   64,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+      1,    1,   65,   66,    1,   67,   68,    1,    1,    1,   69,    1,    1,    1,    1,    1,
+      1,   70,   71,   70,   70,   70,   70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
+     70,    0,    1,    2,    2,    0,    3,    4,    0,    0,    0,    0,    0,    0,    0,    0,
       0,    0,    0,    5,    0,    0,    0,    0,    0,    0,    0,    6,    0,    0,    0,    0,
       0,    0,    0,    0,    0,    0,    0,    7,    8,    0,    0,    9,    0,    0,    0,    0,
       0,   10,   11,   12,   13,   14,   15,   16,   17,   18,   19,   20,   21,   22,   23,   24,
@@ -438,120 +436,120 @@
       0,    0,    0,    0,    0,   56,  179,  180,    0,   56,  181,  182,    0,   56,  183,  184,
     185,  186,  187,  188,    0,    0,    0,    0,    0,   56,  189,    0,    0,    0,    0,    0,
       0,  190,  191,  192,    0,    0,  193,  194,  195,  196,  197,  198,   56,  199,    0,    0,
-      0,  200,  201,  202,  203,  204,  205,    0,    0,  206,  207,  208,  209,  210,   67,    0,
-      0,    0,    0,    0,    0,    0,    0,    0,  211,  212,  213,  214,    0,    0,    0,    0,
-      0,  215,  215,  215,  215,  215,  215,  215,  215,  215,  216,  217,  215,  215,  215,  215,
-    215,  215,  215,  215,  215,  215,  215,  215,  218,  219,  220,    0,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,    0,   67,    0,   56,  221,    0,    0,    0,    0,    0,
-      0,    0,    0,  222,  223,    0,    0,    0,    0,   56,   56,  224,  225,  226,    0,    0,
-    227,   56,   56,   56,   56,   56,   56,   56,   56,   56,   56,   56,   56,   56,   56,  228,
-    229,   56,   56,   56,  230,  231,    0,    0,    0,    0,    0,    0,  232,    0,    0,    0,
-      0,   56,  233,  234,    0,    0,    0,    0,    0,    0,    0,    0,    0,  101,  235,   56,
-    236,    0,    0,    0,    0,    0,    0,  101,  237,    0,    0,    0,    0,    0,    0,  101,
-    238,   56,   56,  239,    0,    0,    0,    0,    0,  240,  240,  240,  240,  240,  240,  240,
-    240,  241,  241,  241,  241,  241,  241,  241,  242,    0,    0,    0,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,    0,    1,    0,    2,    2,    2,    2,    2,    0,    0,
-      0,    0,    0,    0,    0,    0,    3,    4,    0,    5,    0,    0,    0,    0,    0,    6,
-      0,    0,    7,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,    0,    0,    8,    9,    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,   10,   11,   11,   11,   11,    0,    0,    0,    9,   12,
-      0,    2,    2,    2,    2,   13,   14,    0,    0,   11,   15,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,   16,   17,   18,   19,   20,   21,   22,   16,   23,   24,
-     25,   12,   26,   27,   20,    2,    2,    2,    2,    2,   20,    0,    2,    2,    2,    2,
-      2,    0,    2,    2,    2,    2,    2,    2,    2,   28,   29,   30,    2,    2,    2,    9,
-     30,    9,   30,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    9,    2,    2,
-      2,    9,    9,    0,    2,    2,    0,   17,   18,   19,   20,   31,   32,   33,   32,   34,
-      0,    0,    0,    0,   35,    0,    0,    2,   30,    2,    0,    0,    0,    0,    0,    9,
-     36,   12,   15,   30,    2,    2,    9,    0,   30,    9,    2,   30,    9,    2,    0,   37,
-     18,   19,   31,    0,   27,   38,   27,   39,    0,   40,    0,    0,    0,   30,    2,    9,
-      9,    0,    0,    0,    2,    2,    2,    2,    2,   41,   42,   43,    0,    0,    0,    0,
-      0,   12,   15,   30,    2,    2,    2,    2,   30,    2,   30,    2,    2,    2,    2,    2,
-      2,    9,    2,   30,    2,    2,    0,   17,   18,   19,   20,   21,   27,   22,   35,   24,
-      0,    0,    0,    0,    0,   30,   41,   41,   44,   12,   29,   30,    2,    2,    2,    9,
-     30,    9,    2,   30,    2,    2,    0,   17,   45,    0,    0,   27,   22,    0,    0,    2,
-     30,   30,    0,    0,    0,    0,    0,    0,    0,    0,   46,   30,    2,    2,    9,    0,
-      2,    9,    2,    2,    0,   30,    9,    9,    2,    0,   30,    9,    0,    2,    9,    0,
-      2,    2,    2,    2,    2,    2,    0,    0,   23,   16,   47,    0,   48,   33,   48,   34,
-      0,    0,    0,    0,   35,    0,    0,    0,    0,   15,   29,   49,    2,    2,    2,    9,
-      2,    9,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    0,   17,
-     22,   16,   23,   47,   22,   38,   22,   39,    0,    0,    0,   27,   31,    2,    9,    0,
-      0,   10,   29,   30,    2,    2,    2,    9,    2,    2,    2,   30,    2,    2,    0,   17,
-     45,    0,    0,   35,   47,    0,    0,    0,    9,   50,   51,    0,    0,    0,    0,    0,
-      0,   11,   29,    2,    2,    2,    2,    9,    2,    2,    2,    2,    2,    2,   52,   53,
-     23,   19,   20,   31,   48,   33,   48,   34,   54,    0,    0,    0,   35,    0,    0,    0,
-     30,   12,   29,   30,    2,    2,    2,    2,    2,    2,    2,    2,    9,    0,    2,    2,
-      2,    2,   30,    2,    2,    2,    2,   30,    0,    2,    2,    2,    9,    0,   55,    0,
-     35,   23,   22,   31,   31,   18,   48,   48,   25,    0,   23,    0,    0,    0,    0,    0,
-      0,    2,    0,    2,    9,    0,    0,    0,    0,    0,    0,    0,    0,   20,    0,    0,
-      0,    2,    2,   56,   56,   57,    0,    0,   18,    2,    2,    2,    2,   30,    2,    2,
-      2,    2,    2,    2,    2,    2,    2,    9,    0,   58,   21,   59,   22,   22,   20,   20,
-     46,   21,   11,   31,   11,    2,    2,   60,   61,   61,   61,   61,   61,   62,   61,   61,
-     61,   61,   61,   61,   61,   61,   61,   61,   61,   61,   61,   61,   61,   61,   61,   63,
-      0,    0,    0,    0,   64,    0,    0,    0,    0,    2,    2,    2,    2,    2,   65,   45,
-     59,   66,   22,   22,   67,   68,   69,   70,   71,    2,    2,    2,    2,    2,    1,    0,
-      5,    2,    2,    2,   23,   20,    2,    2,   72,   71,   73,   74,   65,   73,   29,   29,
-      2,   52,   22,   53,    2,    2,    2,    2,    2,    2,   75,   76,   77,   29,   29,   78,
-     79,    2,    2,    2,    2,    2,   29,   45,    0,    2,   59,   80,    0,    0,    0,    0,
-     30,    2,   59,   47,    0,    0,    0,    0,    0,    2,   59,    0,    0,    0,    0,    0,
-      0,    2,    2,    2,    2,    2,    2,    9,    2,    9,   59,    0,    0,    0,    0,    0,
-      0,    2,    2,   81,   45,   22,   59,   20,   48,   48,   48,   48,   15,   82,   83,   84,
-     85,   86,   87,    0,    0,    0,    0,   88,    0,    9,    0,    0,   30,    0,   89,   81,
-     90,    2,    2,    2,    2,    9,    0,    0,    0,   42,   42,   91,   92,    2,    2,    2,
-      2,    2,    2,    2,    2,   13,    9,    0,    0,   93,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,    2,    2,    2,    9,   22,   80,   45,   22,   94,   61,    0,
-      0,   95,   96,   95,   95,   97,   98,    0,    0,    2,    2,    2,    2,    2,    2,    2,
+      0,    0,    0,    0,  200,    0,    0,    0,    0,  201,  202,  203,  204,  205,  206,    0,
+      0,  207,  208,  209,  210,  211,   67,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    212,  213,  214,  215,    0,    0,    0,    0,    0,  216,  216,  216,  216,  216,  216,  216,
+    216,  216,  217,  218,  216,  216,  216,  216,  216,  216,  216,  216,  216,  216,  216,  216,
+    219,  220,  221,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,   67,
+      0,   56,  222,    0,    0,    0,    0,    0,    0,    0,    0,  223,  224,    0,    0,    0,
+      0,   56,   56,  225,  226,  227,    0,    0,  228,   56,   56,   56,   56,   56,   56,   56,
+     56,   56,   56,   56,   56,   56,   56,  229,  230,   56,   56,   56,  231,  232,    0,    0,
+      0,    0,    0,    0,  233,    0,    0,    0,    0,   56,  234,  235,    0,    0,    0,    0,
+      0,    0,    0,    0,    0,  101,  236,   56,  237,    0,    0,    0,    0,    0,    0,  101,
+    238,    0,    0,    0,    0,    0,    0,  101,  239,   56,   56,  240,    0,    0,    0,    0,
+      0,  241,  241,  241,  241,  241,  241,  241,  241,  242,  242,  242,  242,  242,  242,  242,
+    243,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,
+      0,    2,    2,    2,    2,    2,    0,    0,    0,    0,    0,    0,    0,    0,    3,    4,
+      0,    5,    0,    0,    0,    0,    0,    6,    0,    0,    7,    0,    0,    0,    0,    0,
+      0,    0,    0,    0,    1,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      8,    9,    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,   10,   11,
+     11,   11,   11,    0,    0,    0,    9,   12,    0,    2,    2,    2,    2,   13,   14,    0,
+      0,   11,   15,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   16,   17,
+     18,   19,   20,   21,   22,   16,   23,   24,   25,   12,   26,   27,   20,    2,    2,    2,
+      2,    2,   20,    0,    2,    2,    2,    2,    2,    0,    2,    2,    2,    2,    2,    2,
+      2,   28,   29,   30,    2,    2,    2,    9,   30,    9,   30,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    9,    2,    2,    2,    9,    9,    0,    2,    2,    0,   17,
+     18,   19,   20,   31,   32,   33,   32,   34,    0,    0,    0,    0,   35,    0,    0,    2,
+     30,    2,    0,    0,    0,    0,    0,    9,   36,   12,   15,   30,    2,    2,    9,    0,
+     30,    9,    2,   30,    9,    2,    0,   37,   18,   19,   31,    0,   27,   38,   27,   39,
+      0,   40,    0,    0,    0,   30,    2,    9,    9,    0,    0,    0,    2,    2,    2,    2,
+      2,   41,   42,   43,    0,    0,    0,    0,    0,   12,   15,   30,    2,    2,    2,    2,
+     30,    2,   30,    2,    2,    2,    2,    2,    2,    9,    2,   30,    2,    2,    0,   17,
+     18,   19,   20,   21,   27,   22,   35,   24,    0,    0,    0,    0,    0,   30,   41,   41,
+     44,   12,   29,   30,    2,    2,    2,    9,   30,    9,    2,   30,    2,    2,    0,   17,
+     45,    0,    0,   27,   22,    0,    0,    2,   30,   30,    0,    0,    0,    0,    0,    0,
+      0,    0,   46,   30,    2,    2,    9,    0,    2,    9,    2,    2,    0,   30,    9,    9,
+      2,    0,   30,    9,    0,    2,    9,    0,    2,    2,    2,    2,    2,    2,    0,    0,
+     23,   16,   47,    0,   48,   33,   48,   34,    0,    0,    0,    0,   35,    0,    0,    0,
+      0,   15,   29,   49,    2,    2,    2,    9,    2,    9,    2,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    2,    0,   17,   22,   16,   23,   47,   22,   38,   22,   39,
+      0,    0,    0,   27,   31,    2,    9,    0,    0,   10,   29,   30,    2,    2,    2,    9,
+      2,    2,    2,   30,    2,    2,    0,   17,   45,    0,    0,   35,   47,    0,    0,    0,
+      9,   50,   51,    0,    0,    0,    0,    0,    0,   11,   29,    2,    2,    2,    2,    9,
+      2,    2,    2,    2,    2,    2,   52,   53,   23,   19,   20,   31,   48,   33,   48,   34,
+     54,    0,    0,    0,   35,    0,    0,    0,   30,   12,   29,   30,    2,    2,    2,    2,
+      2,    2,    2,    2,    9,    0,    2,    2,    2,    2,   30,    2,    2,    2,    2,   30,
+      0,    2,    2,    2,    9,    0,   55,    0,   35,   23,   22,   31,   31,   18,   48,   48,
+     25,    0,   23,    0,    0,    0,    0,    0,    0,    2,    0,    2,    9,    0,    0,    0,
+      0,    0,    0,    0,    0,   20,    0,    0,    0,    2,    2,   56,   56,   57,    0,    0,
+     18,    2,    2,    2,    2,   30,    2,    2,    2,    2,    2,    2,    2,    2,    2,    9,
+      0,   58,   21,   59,   22,   22,   20,   20,   46,   21,   11,   31,   11,    2,    2,   60,
+     61,   61,   61,   61,   61,   62,   61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
+     61,   61,   61,   61,   61,   61,   61,   63,    0,    0,    0,    0,   64,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,   65,   45,   59,   66,   22,   22,   67,   68,   69,   70,
+     71,    2,    2,    2,    2,    2,    1,    0,    5,    2,    2,    2,   23,   20,    2,    2,
+     72,   71,   73,   74,   65,   73,   29,   29,    2,   52,   22,   53,    2,    2,    2,    2,
+      2,    2,   75,   76,   77,   29,   29,   78,   79,    2,    2,    2,    2,    2,   29,   45,
+      0,    2,   59,   80,    0,    0,    0,    0,   30,    2,   59,   47,    0,    0,    0,    0,
+      0,    2,   59,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,    9,
+      2,    9,   59,    0,    0,    0,    0,    0,    0,    2,    2,   81,   45,   22,   59,   20,
+     48,   48,   48,   48,   15,   82,   83,   84,   85,   86,   87,    0,    0,    0,    0,   88,
+      0,    9,    0,    0,   30,    0,   89,   81,   90,    2,    2,    2,    2,    9,    0,    0,
+      0,   42,   42,   91,   92,    2,    2,    2,    2,    2,    2,    2,    2,   13,    9,    0,
+      0,    2,    2,    2,    2,    2,    2,    2,    9,   22,   80,   45,   22,   93,   61,    0,
+      0,   94,   95,   94,   94,   96,   97,    0,    0,    2,    2,    2,    2,    2,    2,    2,
       0,    2,    2,    9,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,    0,
       0,    2,    2,    2,    2,   29,    0,    0,    0,    2,    2,    2,    2,    2,    9,    0,
-      0,    2,    2,    2,   52,   99,   45,    0,    0,    2,    2,  100,  101,  102,  103,   61,
-     63,  104,   16,   45,   22,   59,   21,   80,   48,   48,   76,   11,   11,   11,  105,   46,
-     40,   11,  106,   74,    2,    2,    2,    2,    2,    2,    2,  107,   22,   20,   20,   22,
-     48,   48,   22,  108,    2,    2,    2,    9,    0,    0,    0,    0,    0,    0,  109,  110,
-    110,  110,  110,    0,    0,    0,    0,    0,    0,  106,   74,    2,    2,    2,    2,    2,
-      2,   60,   61,   59,   25,   22,  111,   61,    2,    2,    2,    2,  107,   22,   23,   45,
-     45,  102,  112,    0,    0,    0,    0,    0,    0,    2,    2,   61,   18,   48,   23,  113,
-    102,  102,  102,  114,  115,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,   30,
-      2,   11,   46,  116,  116,  116,   11,  116,  116,   15,  116,  116,  116,   26,    0,   40,
-      0,    0,    0,  117,   51,   11,    5,    0,    0,    0,    0,    0,    0,    0,  118,    0,
-      0,    0,    0,    0,    0,    0,    6,  119,  120,   42,   42,    5,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,  120,  120,  121,  120,  120,  120,  120,  120,  120,  120,
-    120,    0,    0,  122,    0,    0,    0,    0,    0,    0,    7,  122,    0,    0,    0,    0,
+      0,    2,    2,    2,   52,   98,   45,    0,    0,    2,    2,   99,  100,  101,  102,   61,
+     63,  103,   16,   45,   22,   59,   21,   80,   48,   48,   76,   11,   11,   11,  104,   46,
+     40,   11,  105,   74,    2,    2,    2,    2,    2,    2,    2,  106,   22,   20,   20,   22,
+     48,   48,   22,  107,    2,    2,    2,    9,    0,    0,    0,    0,    0,    0,  108,  109,
+    109,  109,  109,    0,    0,    0,    0,    0,    0,  105,   74,    2,    2,    2,    2,    2,
+      2,   60,   61,   59,   25,   22,  110,   61,    2,    2,    2,    2,  106,   22,   23,   45,
+     45,  101,  111,    0,    0,    0,    0,    0,    0,    2,    2,   61,   18,   48,   23,  112,
+    101,  101,  101,  113,  114,    0,    0,    0,    0,    2,    2,    2,    2,    2,    0,   30,
+      2,   11,   46,  115,  115,  115,   11,  115,  115,   15,  115,  115,  115,   26,    0,   40,
+      0,    0,    0,  116,   51,   11,    5,    0,    0,    0,    0,    0,    0,    0,  117,    0,
+      0,    0,    0,    0,    0,    0,    6,  118,  119,   42,   42,    5,    0,    0,    0,    0,
+      0,    0,    0,    0,    0,    0,  119,  119,  120,  119,  119,  119,  119,  119,  119,  119,
+    119,    0,    0,  121,    0,    0,    0,    0,    0,    0,    7,  121,    0,    0,    0,    0,
       0,   46,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    9,
-      0,    0,    0,    0,  123,  123,    0,    0,    0,    2,    2,    2,    2,    0,    0,    0,
-     30,    0,    0,    0,    0,    0,    0,    0,  124,    0,  123,  123,    0,    0,    0,    0,
-      0,    2,   53,    2,  108,    2,   10,    2,    2,    2,   65,   19,   16,    0,    0,   31,
+      0,    0,    0,    0,  122,  122,    0,    0,    0,    2,    2,    2,    2,    0,    0,    0,
+     30,    0,    0,    0,    0,    0,    0,    0,  123,    0,  122,  122,    0,    0,    0,    0,
+      0,    2,   53,    2,  107,    2,   10,    2,    2,    2,   65,   19,   16,    0,    0,   31,
       0,    2,    2,    0,    0,    0,    0,    0,    0,   29,    2,    2,    2,    2,    2,    2,
-      2,    2,    2,  125,   23,   23,   23,   23,   23,   23,   23,  126,    0,    0,    0,    0,
+      2,    2,    2,  124,   23,   23,   23,   23,   23,   23,   23,  125,    0,    0,    0,    0,
       0,   11,   11,   11,   11,   11,   11,   11,   11,   11,    2,    0,    0,    0,    0,    0,
-     52,    2,    2,    2,   22,   22,  127,  116,    0,    2,    2,    2,  128,   20,   59,   20,
-    113,  102,  129,    0,    0,    0,    0,    0,    0,   11,  130,    2,    2,    2,    2,    2,
-      2,    2,  131,   23,   22,   20,   48,  132,  133,  134,    0,    0,    0,    0,    0,    0,
+     52,    2,    2,    2,   22,   22,  126,  115,    0,    2,    2,    2,  127,   20,   59,   20,
+    112,  101,  128,    0,    0,    0,    0,    0,    0,   11,  129,    2,    2,    2,    2,    2,
+      2,    2,  130,   23,   22,   20,   48,  131,  132,  133,    0,    0,    0,    0,    0,    0,
       0,    2,    2,   52,   30,    2,    2,    2,    2,    2,    2,    2,    2,   10,   22,   59,
-     99,   76,  135,  136,  137,    0,    0,    0,    0,    2,  138,    2,    2,    2,    2,  139,
-      0,   30,    2,   42,    5,    0,   79,   15,    2,   53,   22,  140,   52,   53,    2,    2,
-    105,   10,    9,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,  141,   21,
+     98,   76,  134,  135,  136,    0,    0,    0,    0,    2,  137,    2,    2,    2,    2,  138,
+      0,   30,    2,   42,    5,    0,   79,   15,    2,  139,   20,   53,  127,  139,    2,    2,
+    140,   10,    9,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,  141,   21,
      25,    0,    0,  142,  143,    0,    0,    0,    0,    2,   65,   45,   23,   80,   47,  144,
       0,   81,   81,   81,   81,   81,   81,   81,   81,    0,    0,    0,    0,    0,    0,    0,
-      6,  120,  120,  120,  120,  121,    0,    0,    0,    2,    2,    2,    2,    2,    9,    2,
+      6,  119,  119,  119,  119,  120,    0,    0,    0,    2,    2,    2,    2,    2,    9,    2,
       2,    2,    9,    2,   30,    2,    2,    2,    2,    2,   30,    2,    2,    2,   30,    9,
-      0,  128,   20,   27,   31,    0,    0,  145,  146,    2,    2,   30,    2,   30,    2,    2,
+      0,  127,   20,   27,   31,    0,    0,  145,  146,    2,    2,   30,    2,   30,    2,    2,
       2,    2,    2,    2,    0,   14,   37,    0,  147,    2,    2,   13,   37,    0,   30,    2,
       2,    2,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,   30,    2,    2,
       9,    2,    2,   11,   41,    0,    0,    0,    0,    2,    2,    2,    0,   27,   22,   22,
      30,    2,    2,    2,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,   27,   38,
-      0,    2,    2,    2,  116,  116,  116,  116,  116,  148,    2,    9,    0,    0,    0,    0,
+      0,    2,    2,    2,  115,  115,  115,  115,  115,  148,    2,    9,    0,    0,    0,    0,
       0,    2,   14,   14,    0,    0,    0,    0,    0,    9,    2,    2,    9,    2,    2,    2,
       2,   30,    2,    9,    0,   30,    2,    0,    0,  149,  150,  151,    2,    2,    2,    2,
-      2,    2,    2,    2,    2,   22,   22,   20,   20,   20,   22,   22,  134,    0,    0,    0,
+      2,    2,    2,    2,    2,   22,   22,   20,   20,   20,   22,   22,  133,    0,    0,    0,
       0,    0,  152,  152,  152,  152,  152,  152,  152,  152,  152,  152,    2,    2,    2,    2,
       2,   53,   52,   53,    0,    0,    0,    0,  153,   11,   74,    2,    2,    2,    2,    2,
       2,   18,   19,   21,   16,   24,   37,    0,    0,    0,   31,    0,    0,    0,    0,    0,
-      0,   11,   49,    2,    2,    2,    2,    2,    2,    2,    2,    2,  128,   20,   22,  154,
+      0,   11,   49,    2,    2,    2,    2,    2,    2,    2,    2,    2,  127,   20,   22,  154,
      22,   21,  155,  156,    2,    2,    2,    2,    2,    0,    0,   65,  157,    0,    0,    0,
       0,    2,   13,    0,    0,    0,    0,    0,    0,    2,   65,   25,   20,   20,   20,   22,
-     22,  108,  158,    0,    0,   56,  159,   31,  160,   30,    2,    2,    2,    2,    2,    2,
+     22,  107,  158,    0,    0,   56,  159,   31,  160,   30,    2,    2,    2,    2,    2,    2,
       2,    2,    2,    2,    2,    2,    2,   23,   19,   22,   22,  161,   44,    0,    0,    0,
-     49,  128,    0,    0,    0,    0,    0,    0,    0,    2,    2,    2,    9,    9,    2,    2,
+     49,  127,    0,    0,    0,    0,    0,    0,    0,    2,    2,    2,    9,    9,    2,    2,
      30,    2,    2,    2,    2,    2,    2,    2,   30,    2,    2,    2,    2,    2,    2,    2,
      10,   18,   19,   21,   22,  162,   31,    0,    0,   11,   11,   30,    2,    2,    2,    9,
      30,    9,    2,   30,    2,    2,   58,   17,   23,   16,   23,   47,   32,   33,   32,   34,
@@ -559,70 +557,69 @@
       0,   11,   11,   46,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,   30,    0,
       9,    2,    2,    2,   30,   45,   59,   20,   20,   31,   33,   32,   32,   25,  163,   29,
     164,  165,   37,    0,    0,    0,    0,    0,    0,   12,   26,    0,    0,    0,    0,    0,
-      0,    2,    2,   65,   25,   20,   20,   20,   22,   23,  126,   15,   17,    0,    0,    0,
+      0,    2,    2,   65,   25,   20,   20,   20,   22,   23,  125,   15,   17,    0,    0,    0,
       0,    2,    2,    2,    2,    2,    0,    0,  166,  167,    0,    0,    0,    0,    0,    0,
-      0,   18,   19,   20,   20,   66,   99,   25,  160,   11,  168,    9,    0,    0,    0,    0,
+      0,   18,   19,   20,   20,   66,   98,   25,  160,   11,  168,    9,    0,    0,    0,    0,
       0,    2,    2,    2,    2,    2,    2,    2,   65,   25,   20,   20,    0,   48,   48,   11,
     169,   37,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    2,    2,   20,
       0,   23,   19,   20,   20,   21,   16,   82,  169,   38,    0,    0,    0,    0,    0,    0,
       0,    2,    2,    2,    2,    2,   10,  170,   25,   20,   22,   22,  168,    9,    0,    0,
-      0,    2,    2,    2,    2,    2,    9,   43,  136,   23,   22,   20,   76,   21,   22,    0,
+      0,    2,    2,    2,    2,    2,    9,   43,  135,   23,   22,   20,   76,   21,   22,    0,
       0,    2,    2,    2,    9,    0,    0,    0,    0,    2,    2,    2,    2,    2,    2,   18,
-     19,   20,   21,   22,  105,  169,   37,    0,    0,    2,    2,    2,    9,   30,    0,    2,
+     19,   20,   21,   22,  104,  169,   37,    0,    0,    2,    2,    2,    9,   30,    0,    2,
       2,    2,    2,   30,    9,    2,    2,    2,    2,   23,   23,   18,   32,   33,   12,  171,
     165,  172,  173,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    0,    2,    2,
-      2,   65,   25,   20,   20,    0,   22,   23,   29,  108,    0,   33,    0,    0,    0,    0,
-      0,   52,   20,   22,   22,   22,  140,    2,    2,    2,  174,  175,   11,   15,  176,   61,
-    177,    0,    0,    1,  147,    0,    0,    0,    0,   52,   20,   22,   16,   19,   20,    2,
-      2,    2,    2,  158,  158,  158,  178,  178,  178,  178,  178,  178,   15,  179,    0,   30,
-      0,   22,   20,   20,   31,   22,   22,   11,  169,    0,   61,   61,   61,   61,   61,   61,
-     61,   66,   21,   82,   46,    0,    0,    0,    0,    2,    2,    2,    9,    2,   30,    2,
-      2,   52,   22,   22,   31,    0,   38,   22,   27,   11,  159,  180,  181,    0,    0,    0,
-      0,    2,    2,    2,   30,    9,    2,    2,    2,    2,    2,    2,    2,    2,   23,   23,
-     47,   22,   35,   82,   68,    0,    0,    0,    0,    2,  182,   66,   47,    0,    0,    0,
-      0,   11,  183,    2,    2,    2,    2,    2,    2,    2,    2,   23,   22,   20,   31,    0,
-     48,   16,  143,    0,    0,    0,    0,    0,    0,    2,    2,    2,    2,    2,  156,    0,
-      0,  184,  184,  184,  184,  184,  184,  184,  184,  185,  185,  185,  186,  187,  185,  184,
-    184,  188,  184,  184,  189,  190,  190,  190,  190,  190,  190,  190,    0,    0,    0,    0,
-      0,  184,  184,  184,  184,  184,  191,    0,    0,    2,    2,    2,    2,    2,    2,    2,
-     22,   22,   22,   22,   22,   22,  192,  193,  194,   11,   11,   11,   46,    0,    0,    0,
-      0,   29,   74,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,   65,   47,
-      0,    2,    2,    2,    2,    2,    9,    0,   58,  195,   20,   20,   20,   20,   20,   20,
-     20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,    0,    0,    0,
-     40,  116,   26,    0,    0,    0,    0,    0,    0,    0,    0,    9,    0,    0,    0,    0,
-      0,    0,    0,    0,    0,    0,    0,    0,   30,    2,    2,    2,    2,    2,    0,   58,
-     37,    0,    6,  120,  120,  120,  121,    0,    0,   11,   11,   11,   49,    2,    2,    2,
-      0,    2,    2,    2,    2,    2,    0,    0,    2,    2,    2,    2,    2,    2,    2,    2,
-     46,    2,    2,    2,    2,    2,    2,   11,   11,    2,    2,    2,    2,    2,    2,   22,
-     22,    2,    2,    2,    2,    2,    2,    2,   20,    2,    2,   44,   44,   44,   92,    0,
-      0,    O,    O,    O,   GB,    B,    B,    O,   SB,    O,   SE,   GB,    O,    O,   WJ,FMPst,
-  FMPst,    O,  CGJ,    B,    O,    B,VMAbv,VMAbv,VMAbv,    O,VMAbv,    B,CMBlw,CMBlw,CMBlw,VMAbv,
-  VMPst, VAbv, VPst,CMBlw,    B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VPst,
-   VPst, VPst,    H, VPre, VPst,VMBlw,    O,    O, VAbv,   GB,VMAbv,VMPst,VMPst,    O,    B, VBlw,
-      O,    O, VPre, VPre,    O, VPre,    H,    O, VPst,FMAbv,    O,CMBlw,    O, VAbv,    O, VAbv,
-      H,    O,VMBlw,VMAbv,CMAbv,   GB,   GB,    O, MBlw,CMAbv,CMAbv, VPst, VAbv,VMAbv,    O, VPst,
-      O, VPre, VPre,VMAbv,    B,    O,   CS,   CS,VMPst,    B, VAbv, VAbv,    B,    R,    O,  HVM,
-      O,    O,FMBlw,    O,CMAbv,    O,CMBlw, VAbv, VBlw,    B,  SUB,  SUB,  SUB,    O,  SUB,  SUB,
-      O,FMBlw,    O,    B, VPst, VBlw, VPre,VMAbv,VMBlw,VMPst,   IS, VAbv, MPst, MPre, MBlw, MBlw,
-      B, MBlw, MBlw, VPst,VMPst,VMPst,    B, MBlw, VPst, VPre, VAbv, VAbv,VMPst,VMPst,VMBlw,    B,
-  VMPst, VBlw, VPst,  CGJ,  CGJ, VPst,VMAbv,VMAbv,FMAbv, FAbv,CMAbv,FMAbv,VMAbv,FMAbv, VAbv,   IS,
-  FMAbv,    B,FMAbv,    B,  CGJ,   WJ,  CGJ,   GB,CMAbv,CMAbv,    B,   GB,    B, VAbv,  SUB, FPst,
-   FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre,    B, MPre, MBlw,  SUB, FAbv, FAbv, MAbv,
-    SUB,   Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst,    H,    B,    O,SMAbv,SMAbv,SMAbv, VPst,
-     IS,   RK,   RK, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv,   CS,    O,FMAbv, ZWNJ,
-    CGJ,   WJ,   WJ,   WJ,    O,FMPst,    O,   SB,   SE,    O,    H, MPst, VPst,    H,VMAbv, VAbv,
-  VMBlw,    B, VBlw, FPst, VPst, FAbv,VMPst,    B,CMAbv, VAbv, MBlw, MPst, MBlw,    H,    O, VBlw,
-   MPst, MPre, MAbv, MBlw,    O,    B, FAbv, FAbv, FPst, VBlw,    B,    B, VPre,    O,VMPst,   IS,
-      O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv,    O,   IS,VMBlw,    B,VMPst,VMAbv,VMPst,   CS,   CS,
-      B,    N,    N,    O,   HN, VPre, VBlw, VAbv,   IS,CMAbv,    O, VPst,    B,    R,    R,CMBlw,
-   VAbv, VPre,VMAbv,VMAbv,    H, VAbv,CMBlw,VMPst,    O,VMAbv,CMBlw,   IS,    R,FMAbv,    B,   CS,
-     CS,    H,CMBlw,VMPst,    H,VMPst, VAbv,VMAbv, VPst, MPst,    R, MPst,CMBlw,    B,FMBlw, VBlw,
-  VMAbv,   CS,  SUB,  SUB,   GB, FBlw, FBlw,CMAbv,   IS, VBlw,   IS,    R, MBlw,   GB, VAbv,    R,
-  VMPst,    G,    G,    J,    J,    J,   SB,   SE,    J,   HR,    G,    G,   HM,   HM,   HM,    G,
-      O, MPre, MPre, MPst,VMAbv, MBlw, VBlw,    O, VBlw,
+      2,   65,   25,   20,   20,    0,   22,   23,   29,  107,    0,   33,    0,    0,    0,    0,
+      0,   52,   20,   22,   22,   22,  139,    2,    2,    2,  174,  140,   11,   15,  175,   61,
+    176,    0,    0,    1,  147,    0,    0,    0,    0,   52,   20,   22,   16,   19,   20,    2,
+      2,    2,    2,  158,  158,  158,  177,  177,  177,  177,  177,  177,   15,  178,    0,   30,
+      0,   16,   20,   16,   16,    0,    0,    0,    0,   22,   20,   20,   31,   22,   22,   11,
+    169,    0,   61,   61,   61,   61,   61,   61,   61,   66,   21,   82,   46,    0,    0,    0,
+      0,    2,    2,    2,    9,    2,   30,    2,    2,   52,   22,   22,   31,    0,   38,   22,
+     27,   11,  159,  179,  180,    0,    0,    0,    0,    2,    2,    2,   30,    9,    2,    2,
+      2,    2,    2,    2,    2,    2,   23,   23,   47,   22,   35,   82,   68,    0,    0,    0,
+      0,    2,  181,   66,   47,    0,    0,    0,    0,   11,  182,    2,    2,    2,    2,    2,
+      2,    2,    2,   23,   22,   20,   31,    0,   48,   16,  143,    0,    0,    0,    0,    0,
+      0,    2,    2,    2,    2,    2,  156,    0,    0,  183,  183,  183,  183,  183,  183,  183,
+    183,  184,  184,  184,  185,  186,  184,  183,  183,  187,  183,  183,  188,  189,  189,  189,
+    189,  189,  189,  189,    0,    0,    0,    0,    0,  183,  183,  183,  183,  183,  190,    0,
+      0,    2,    2,    2,    2,    2,    2,    2,   22,   22,   22,   22,   22,   22,  191,  192,
+    193,   11,   11,   11,   46,    0,    0,    0,    0,   29,   74,    2,    2,    2,    2,    2,
+      2,    2,    2,    2,    2,    2,   65,   47,    0,    2,    2,    2,    2,    2,    9,    0,
+     58,  194,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
+     20,   20,   20,   20,   20,    0,    0,    0,   40,  115,   26,    0,    0,    0,    0,    0,
+      0,    0,    0,    9,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+     30,    2,    2,    2,    2,    2,    0,   58,   37,    0,    6,  119,  119,  119,  120,    0,
+      0,   11,   11,   11,   49,    2,    2,    2,    0,    2,    2,    2,    2,    2,    0,    0,
+      2,    2,    2,    2,    2,    2,    2,    2,   46,    2,    2,    2,    2,    2,    2,   11,
+     11,    2,    2,    2,    2,    2,    2,   22,   22,    2,    2,    2,    2,    2,    2,    2,
+     20,    2,    2,   44,   44,   44,   92,    0,    0,    O,    O,    O,   GB,    B,    B,    O,
+     SB,    O,   SE,   GB,    O,    O,   WJ,FMPst,FMPst,    O,  CGJ,    B,    O,    B,VMAbv,VMAbv,
+  VMAbv,    O,VMAbv,    B,CMBlw,CMBlw,CMBlw,VMAbv,VMPst, VAbv, VPst,CMBlw,    B, VPst, VPre, VPst,
+   VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VPst, VPst, VPst,    H, VPre, VPst,VMBlw,    O,    O,
+   VAbv,   GB,VMAbv,VMPst,VMPst,    O,    B, VBlw,    O,    O, VPre, VPre,    O, VPre,    H,    O,
+   VPst,FMAbv,    O,CMBlw,    O, VAbv,    O, VAbv,    H,    O,VMBlw,VMAbv,CMAbv,   GB,   GB,    O,
+   MBlw,CMAbv,CMAbv, VPst, VAbv,VMAbv,    O, VPst,    O, VPre, VPre,VMAbv,    B,    O,   CS,   CS,
+  VMPst,    B, VAbv, VAbv,    B,    R,    O,  HVM,    O,    O,FMBlw,    O,CMAbv,    O,CMBlw, VAbv,
+   VBlw,    B,  SUB,  SUB,  SUB,    O,  SUB,  SUB,    O,FMBlw,    O,    B, VPst, VBlw, VPre,VMAbv,
+  VMBlw,VMPst,   IS, VAbv, MPst, MPre, MBlw, MBlw,    B, MBlw, MBlw, VPst,VMPst,VMPst,    B, MBlw,
+   VPst, VPre, VAbv, VAbv,VMPst,VMPst,VMBlw,    B,VMPst, VBlw, VPst,  CGJ,  CGJ, VPst,VMAbv,VMAbv,
+  FMAbv, FAbv,CMAbv,FMAbv,VMAbv,FMAbv, VAbv,   IS,FMAbv,    B,FMAbv,    B,  CGJ,   WJ,  CGJ,   GB,
+  CMAbv,CMAbv,    B, VAbv,  SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre,    B,
+   MPre, MBlw,  SUB, FAbv, FAbv, MAbv,  SUB,   Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst,    H,
+      B,    O,SMAbv,SMAbv,SMAbv, VPst,   IS,   RK,   RK, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,
+  VMBlw,VMAbv,   CS,    O,FMAbv, ZWNJ,  CGJ,   WJ,   WJ,   WJ,    O,FMPst,    O,   SB,   SE,    O,
+      H, MPst, VPst,    H,VMAbv, VAbv,VMBlw,    B, VBlw, FPst, VPst, FAbv,VMPst,    B,CMAbv, VAbv,
+   MBlw, MPst, MBlw,    H,    O, VBlw, MPst, MPre, MAbv, MBlw,    O,    B, FAbv, FAbv, FPst, VBlw,
+      B, VBlw,VMAbv,    B, VPre,    O,VMPst,   IS,    O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv,    O,
+     IS,VMBlw,    B,VMPst,VMAbv,VMPst,   CS,   CS,    B,    N,    N,    O,   HN, VPre, VBlw, VAbv,
+     IS,CMAbv,    O, VPst,    B,    R,    R,CMBlw, VAbv, VPre,VMAbv,VMAbv,    H, VAbv,CMBlw,VMPst,
+      O,VMAbv,CMBlw,   IS,    R,FMAbv,    B,   CS,   CS,    H,CMBlw,VMPst,    H,VMPst, VAbv,VMAbv,
+   VPst, MPst,    R, MPst,CMBlw,    B,FMBlw,   CS,  SUB,  SUB,   GB, FBlw, FBlw,CMAbv,   IS, VBlw,
+     IS,    R, MBlw,   GB, VAbv,    R,VMPst,    G,    G,    J,    J,    J,   SB,   SE,    J,   HR,
+      G,    G,   HM,   HM,   HM,    G,    O, MPre, MPre, MPst,VMAbv, MBlw, VBlw,    O, VBlw,
 };
-static const uint16_t
-hb_use_u16[486] =
+static const uint16_t hb_use_u16[488]=
 {
     0,  0,  1,  2,  0,  3,  4,  5,  0,  6,  7,  0,  8,  0,  9, 10,
    11, 12, 10, 13, 14, 10, 10, 15, 16, 17, 18, 19, 20, 21, 22, 23,
@@ -633,43 +630,43 @@
    31, 66, 67, 68, 10, 69, 70, 10, 71, 72, 73, 74, 75, 76, 77,  0,
    10, 10, 78, 79, 80, 81, 82, 83, 84, 85, 10, 86, 10, 87, 10, 88,
    89, 90, 10, 91, 92, 93,  2,  0, 94,  0, 10, 95, 96, 10, 97,  0,
-   98, 99,100,101, 31, 10,102,103,104, 10,105,106, 10,107, 10,108,
-  109,110,  2,  2,111, 10, 10,112,113,  2,114,115,116, 10,117, 10,
-  118,119,120,121,122,  0,  0,123,124,125,  0,126,127,128,129,  0,
-  130,131,132,  0,  0,133,134,  0,135,  0,  0, 10,136,137,138,  0,
-  139, 10,140,  0, 10,141,142, 10, 10,143,144,  2,145,146,147, 10,
-  148,149,150, 10, 10,151,152,  2,153, 99,154,155,156,  2, 10,157,
-   10,158,159,  0,160,161,162,  2,163,  0,  0,164,  0,165,  0,166,
-  166,167, 34,168,169,170, 10,171, 95,  0,172,  0, 10,173,174,  0,
-  175,  2,176, 10,177,  0,178,173,179,180,181,  0,  0,182,183,  0,
-  184, 10, 10,185,186,187,188,189,190, 10, 10,191,192,  0,193, 10,
-  194,195,196, 10, 10,197, 10,198,199,106,200,103, 10, 34,201,202,
-  203,  0,204,205, 95, 10, 10,206,207,  2,208, 21, 22,209,210,211,
-  212,213,214, 10, 10,215,216,217,218,  0, 10,219,220,221,222,  0,
-  200, 10, 10,223,224,  2,225,226,227,228, 10,229,230,  2,231,232,
-    2, 10,141,  0, 10,233,234,104,235,  0,236,237,238,239, 10,240,
-  241,  2,242, 10, 10,243,244,  0,245, 10, 10,246,247,248,249,250,
-   22, 10,225,251,  8, 10, 71, 19, 10,252, 74,253,254, 10, 10,255,
-  256,  2,257, 10,258,259, 10,260,261, 49, 10,262,263,264,265,265,
-  265,266,267,268,265,269, 10,270,271,  2, 10,272,273, 10,274,  2,
-  275,276,277,277,278,279,280,  0, 10,177,  0,281,106, 71, 95,282,
-    0,283, 71,284,285,  0,286,  0,287,  2,288,  2,289,106,290,  2,
-  130,130,163,163,163,130,
+   10, 98, 99,100, 31, 10,101,102,103, 10,104,105, 10,106, 10,107,
+  108,109,  2,  2,110, 10, 10,111,112,  2,113,114,115, 10,116, 10,
+  117,118,119,120,121,  0,  0,122,123,124,  0,125,126,127,128,  0,
+  129,130,131,  0,  0,132,133,  0,134,  0,  0, 10,135,136,137,  0,
+  138, 10,139,  0, 10,140,141, 10, 10,142,143,  2,144,145,146, 10,
+  147,148,149, 10, 10,150,151,  2,152, 98,153,154,155,  2, 10,156,
+   10,157,158,  0,159,160,161,  2,162,  0,  0,163,  0,164,  0,165,
+  165,166, 34,167,168,169, 10,170, 95,  0,171,  0, 10,172,173,  0,
+  174,  2,175, 10,176,  0,177,172,178,179,180,  0,  0,181,182,  0,
+  183, 10, 10,184,185,186,187,188,189, 10, 10,190,191,  0,192, 10,
+  193,194,195, 10, 10,196, 10,197,198,105,199,102, 10, 34,200,201,
+  202,  0,203,204, 95, 10, 10,205,206,  2,207, 21, 22,208,209,210,
+  211,212,213, 10, 10,214,215,216,217,  0, 10,218,219,220,221,  0,
+  199, 10, 10,222,223,  2,224,225,226,227, 10,228,229,  2,230,231,
+    2, 10,140,  0, 10,232,233,103,234,  0,235,236,237,238, 10,239,
+  240,  2,241, 10, 10,242,243,  0,244, 10, 10,245,246,247,248,249,
+  250,  0, 22, 10,224,251,  8, 10, 71, 19, 10,252, 74,253,254, 10,
+   10,255,256,  2,257, 10,258,259, 10,260,261, 49, 10,262,263,264,
+  265,265,265,266,267,268,265,269, 10,270,271,  2, 10,272,273, 10,
+  274,  2,275,276,277,277,278,279,280,  0, 10,176,  0,281,105, 71,
+   95,282,  0,283, 71,284,285,  0,286,  0,287,  2,288,  2,289,105,
+  290,  2,129,129,162,162,162,129,
 };
 
-static inline unsigned
-hb_use_b4 (const uint8_t* a, unsigned i)
+static inline uint8_t hb_use_b4 (const uint8_t* a, unsigned i)
 {
-  return (a[i>>1]>>((i&1u)<<2))&15u;
+  return (a[i>>1]>>((i&1)<<2))&15;
 }
-static inline uint_fast8_t
-hb_use_get_category (unsigned u)
+static inline uint8_t hb_use_get_category (unsigned u)
 {
-  return u<921600u?hb_use_u8[3265+(((hb_use_u8[937+(((hb_use_u16[((hb_use_u8[369+(((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>1>>3>>4))<<4)+((u>>1>>3>>1>>3)&15u))])<<3)+((u>>1>>3>>1)&7u))])<<1)+((u>>1>>3)&1u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O;
+  return u<921600 ? hb_use_u8[3273u+((hb_use_u8[945u+((hb_use_u16[((hb_use_u8[369u+((hb_use_u8[113u+((hb_use_b4(hb_use_u8,((((((((((u)>>1))>>3))>>1))>>3))>>4)))<<4)+((((((((((u)>>1))>>3))>>1))>>3))&15)])<<3)+((((((((u)>>1))>>3))>>1))&7)])<<1)+((((((u)>>1))>>3))&1)])<<3)+((((u)>>1))&7)])<<1)+((u)&1)] : O;
 }
 
+
 #endif
 
+
 #undef B
 #undef CGJ
 #undef CS
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-vowel-constraints.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-vowel-constraints.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-vowel-constraints.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper-vowel-constraints.cc	2026-04-17 19:09:35.000000000 +0000
@@ -10,8 +10,8 @@
  * # Date: 2015-03-12, 21:17:00 GMT [AG]
  * # Date: 2019-11-08, 23:22:00 GMT [AG]
  *
- * # Scripts-16.0.0.txt
- * # Date: 2024-04-30, 21:48:40 GMT
+ * # Scripts-17.0.0.txt
+ * # Date: 2025-07-24, 13:28:55 GMT
  */
 
 #include "hb.hh"
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-shaper.hh	2026-04-17 19:09:35.000000000 +0000
@@ -396,6 +396,12 @@
     case HB_SCRIPT_TODHRI:
     case HB_SCRIPT_TULU_TIGALARI:
 
+    /* Unicode-17.0 additions */
+    case HB_SCRIPT_BERIA_ERFE:
+    case HB_SCRIPT_SIDETIC:
+    case HB_SCRIPT_TAI_YO:
+    case HB_SCRIPT_TOLONG_SIKI:
+
       /* If the designer designed the font for the 'DFLT' script,
        * (or we ended up arbitrarily pick 'latn'), use the default shaper.
        * Otherwise, use the specific shaper.
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-stat-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-stat-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-stat-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-stat-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -352,7 +352,7 @@
 {
   float get_value (unsigned int axis_index) const
   {
-    switch (u.format)
+    switch (u.format.v)
     {
     case 1: hb_barrier (); return u.format1.get_value ();
     case 2: hb_barrier (); return u.format2.get_value ();
@@ -364,7 +364,7 @@
 
   unsigned int get_axis_index () const
   {
-    switch (u.format)
+    switch (u.format.v)
     {
     case 1: hb_barrier (); return u.format1.get_axis_index ();
     case 2: hb_barrier (); return u.format2.get_axis_index ();
@@ -376,7 +376,7 @@
 
   hb_ot_name_id_t get_value_name_id () const
   {
-    switch (u.format)
+    switch (u.format.v)
     {
     case 1: hb_barrier (); return u.format1.get_value_name_id ();
     case 2: hb_barrier (); return u.format2.get_value_name_id ();
@@ -389,9 +389,9 @@
   template 
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
-    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
-    TRACE_DISPATCH (this, u.format);
-    switch (u.format) {
+    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
+    TRACE_DISPATCH (this, u.format.v);
+    switch (u.format.v) {
     case 1: hb_barrier (); return_trace (c->dispatch (u.format1, std::forward (ds)...));
     case 2: hb_barrier (); return_trace (c->dispatch (u.format2, std::forward (ds)...));
     case 3: hb_barrier (); return_trace (c->dispatch (u.format3, std::forward (ds)...));
@@ -403,7 +403,7 @@
   bool keep_axis_value (const hb_array_t axis_records,
                         hb_hashmap_t *user_axes_location) const
   {
-    switch (u.format)
+    switch (u.format.v)
     {
     case 1: hb_barrier (); return u.format1.keep_axis_value (axis_records, user_axes_location);
     case 2: hb_barrier (); return u.format2.keep_axis_value (axis_records, user_axes_location);
@@ -420,7 +420,7 @@
       return_trace (false);
     hb_barrier ();
 
-    switch (u.format)
+    switch (u.format.v)
     {
     case 1: hb_barrier (); return_trace (u.format1.sanitize (c));
     case 2: hb_barrier (); return_trace (u.format2.sanitize (c));
@@ -433,14 +433,14 @@
   protected:
   union
   {
-  HBUINT16              format;
+  struct { HBUINT16 v; }        format;
   AxisValueFormat1      format1;
   AxisValueFormat2      format2;
   AxisValueFormat3      format3;
   AxisValueFormat4      format4;
   } u;
   public:
-  DEFINE_SIZE_UNION (2, format);
+  DEFINE_SIZE_UNION (2, format.v);
 };
 
 struct AxisValueOffsetArray: UnsizedArrayOf>
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-tag-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-tag-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-tag-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-tag-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -6,8 +6,8 @@
  *
  * on files with these headers:
  *
- * 
- * File-Date: 2025-01-21
+ * 
+ * File-Date: 2025-08-25
  */
 
 #ifndef HB_OT_TAG_TABLE_HH
@@ -704,7 +704,7 @@
 /*{HB_TAG('g','u','z',' '),     HB_TAG('G','U','Z',' ')},*/     /* Gusii */
   {HB_TAG('g','w','i',' '),     HB_TAG('A','T','H',' ')},       /* Gwichʼin -> Athapaskan */
   {HB_TAG('g','y','n',' '),     HB_TAG('C','P','P',' ')},       /* Guyanese Creole English -> Creoles */
-  {HB_TAG('h','a','a',' '),     HB_TAG('A','T','H',' ')},       /* Han -> Athapaskan */
+  {HB_TAG('h','a','a',' '),     HB_TAG('A','T','H',' ')},       /* Hän -> Athapaskan */
   {HB_TAG('h','a','e',' '),     HB_TAG('O','R','O',' ')},       /* Eastern Oromo -> Oromo */
   {HB_TAG('h','a','i',' '),     HB_TAG('H','A','I','0')},       /* Haida [macrolanguage] */
   {HB_TAG('h','a','k',' '),     HB_TAG('Z','H','S',' ')},       /* Hakka Chinese -> Chinese, Simplified */
@@ -921,7 +921,7 @@
   {HB_TAG('k','v','t',' '),     HB_TAG('K','R','N',' ')},       /* Lahta Karen -> Karen */
   {HB_TAG('k','v','u',' '),     HB_TAG('K','R','N',' ')},       /* Yinbaw Karen -> Karen */
   {HB_TAG('k','v','y',' '),     HB_TAG('K','R','N',' ')},       /* Yintale Karen -> Karen */
-/*{HB_TAG('k','w','k',' '),     HB_TAG('K','W','K',' ')},*/     /* Kwakiutl -> Kwakʼwala */
+/*{HB_TAG('k','w','k',' '),     HB_TAG('K','W','K',' ')},*/     /* Kwakʼwala */
   {HB_TAG('k','w','w',' '),     HB_TAG('C','P','P',' ')},       /* Kwinti -> Creoles */
   {HB_TAG('k','w','y',' '),     HB_TAG('K','O','N','0')},       /* San Salvador Kongo -> Kongo */
   {HB_TAG('k','x','c',' '),     HB_TAG('K','M','S',' ')},       /* Konso -> Komso */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-var-avar-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var-avar-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-var-avar-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var-avar-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -143,10 +143,13 @@
 
 struct SegmentMaps : Array16Of
 {
-  int map (int value, unsigned int from_offset = 0, unsigned int to_offset = 1) const
+  float map_float (float value, unsigned int from_offset = 0, unsigned int to_offset = 1) const
   {
-#define fromCoord coords[from_offset].to_int ()
-#define toCoord coords[to_offset].to_int ()
+#define fromCoord coords[from_offset].to_float ()
+#define toCoord coords[to_offset].to_float ()
+
+    const auto *map = arrayZ;
+
     /* The following special-cases are not part of OpenType, which requires
      * that at least -1, 0, and +1 must be mapped. But we include these as
      * part of a better error recovery scheme. */
@@ -155,47 +158,98 @@
       if (!len)
         return value;
       else /* len == 1*/
-        return value - arrayZ[0].fromCoord + arrayZ[0].toCoord;
+        return value - map[0].fromCoord + map[0].toCoord;
+    }
+
+    // At least two mappings now.
+
+    /* CoreText is wild...
+     * PingFangUI avar needs all this special-casing...
+     * So we implement an extended version of the spec here,
+     * which is more robust and more likely to be compatible with
+     * the wild. */
+
+    unsigned start = 0;
+    unsigned end = len;
+    if (map[start].fromCoord == -1 && map[start].toCoord == -1 && map[start+1].fromCoord == -1)
+      start++;
+    if (map[end-1].fromCoord == +1 && map[end-1].toCoord == +1 && map[end-2].fromCoord == +1)
+      end--;
+
+    /* Look for exact match first, and do lots of special-casing. */
+    unsigned i;
+    for (i = start; i < end; i++)
+      if (value == map[i].fromCoord)
+        break;
+    if (i < end)
+    {
+      // There's at least one exact match. See if there are more.
+      unsigned j = i;
+      for (; j + 1 < end; j++)
+        if (value != map[j + 1].fromCoord)
+          break;
+
+      // [i,j] inclusive are all exact matches:
+
+      // If there's only one, return it. This is the only spec-compliant case.
+      if (i == j)
+        return map[i].toCoord;
+      // If there's exactly three, return the middle one.
+      if (i + 2 == j)
+        return map[i + 1].toCoord;
+
+      // Ignore the middle ones. Return the one mapping closer to 0.
+      if (value < 0) return map[j].toCoord;
+      if (value > 0) return map[i].toCoord;
+
+      // Mapping 0? CoreText seems confused. It seems to prefer 0 here...
+      // So we'll just return the smallest one. lol
+      return fabsf (map[i].toCoord) < fabsf (map[j].toCoord) ? map[i].toCoord : map[j].toCoord;
+
+      // Mapping 0? Return one not mapping to 0.
+      if (map[i].toCoord == 0)
+        return map[j].toCoord;
+      else
+        return map[i].toCoord;
     }
 
-    if (value <= arrayZ[0].fromCoord)
-      return value - arrayZ[0].fromCoord + arrayZ[0].toCoord;
+    /* There's at least two and we're not an exact match. Prepare to lerp. */
 
-    unsigned int i;
-    unsigned int count = len - 1;
-    for (i = 1; i < count && value > arrayZ[i].fromCoord; i++)
-      ;
+    // Find the segment we're in.
+    for (i = start; i < end; i++)
+      if (value < map[i].fromCoord)
+        break;
 
-    if (value >= arrayZ[i].fromCoord)
-      return value - arrayZ[i].fromCoord + arrayZ[i].toCoord;
+    if (i == 0)
+    {
+      // Value before all segments; Shift.
+      return value - map[0].fromCoord + map[0].toCoord;
+    }
+    if (i == end)
+    {
+      // Value after all segments; Shift.
+      return value - map[end - 1].fromCoord + map[end - 1].toCoord;
+    }
 
-    if (unlikely (arrayZ[i-1].fromCoord == arrayZ[i].fromCoord))
-      return arrayZ[i-1].toCoord;
+    // Actually interpolate.
+    auto &before = map[i-1];
+    auto &after = map[i];
+    float denom = after.fromCoord - before.fromCoord; // Can't be zero by now.
+    return before.toCoord + ((after.toCoord - before.toCoord) * (value - before.fromCoord)) / denom;
 
-    int denom = arrayZ[i].fromCoord - arrayZ[i-1].fromCoord;
-    return roundf (arrayZ[i-1].toCoord + ((float) (arrayZ[i].toCoord - arrayZ[i-1].toCoord) *
-                                          (value - arrayZ[i-1].fromCoord)) / denom);
 #undef toCoord
 #undef fromCoord
   }
 
-  int unmap (int value) const { return map (value, 1, 0); }
+  float unmap_float (float value) const { return map_float (value, 1, 0); }
 
+
+  // TODO Kill this.
   Triple unmap_axis_range (const Triple& axis_range) const
   {
-    F2DOT14 val, unmapped_val;
-
-    val.set_float (axis_range.minimum);
-    unmapped_val.set_int (unmap (val.to_int ()));
-    float unmapped_min = unmapped_val.to_float ();
-
-    val.set_float (axis_range.middle);
-    unmapped_val.set_int (unmap (val.to_int ()));
-    float unmapped_middle = unmapped_val.to_float ();
-
-    val.set_float (axis_range.maximum);
-    unmapped_val.set_int (unmap (val.to_int ()));
-    float unmapped_max = unmapped_val.to_float ();
+    float unmapped_min = unmap_float (axis_range.minimum);
+    float unmapped_middle = unmap_float (axis_range.middle);
+    float unmapped_max = unmap_float (axis_range.maximum);
 
     return Triple{(double) unmapped_min, (double) unmapped_middle, (double) unmapped_max};
   }
@@ -203,6 +257,11 @@
   bool subset (hb_subset_context_t *c, hb_tag_t axis_tag) const
   {
     TRACE_SUBSET (this);
+
+    /* This function cannot work on avar2 table (and currently doesn't).
+     * We should instead keep the design coords in the shape plan and use
+     * those. unmap_axis_range needs to be killed. */
+
     /* avar mapped normalized axis range*/
     Triple *axis_range;
     if (!c->plan->axes_location.has (axis_tag, &axis_range))
@@ -304,14 +363,14 @@
     return_trace (true);
   }
 
-  void map_coords (int *coords, unsigned int coords_length) const
+  void map_coords_16_16 (int *coords, unsigned int coords_length) const
   {
     unsigned int count = hb_min (coords_length, axisCount);
 
     const SegmentMaps *map = &firstAxisSegmentMaps;
     for (unsigned int i = 0; i < count; i++)
     {
-      coords[i] = map->map (coords[i]);
+      coords[i] = roundf (map->map_float (coords[i] / 65536.f) * 65536.f);
       map = &StructAfter (*map);
     }
 
@@ -329,15 +388,20 @@
     const auto &var_store = this+v2.varStore;
     auto *var_store_cache = var_store.create_cache ();
 
+    hb_vector_t coords_2_14;
+    coords_2_14.resize (coords_length);
+    for (unsigned i = 0; i < coords_length; i++)
+      coords_2_14[i] = roundf (coords[i] / 4.f); // 16.16 -> 2.14
+
     hb_vector_t out;
     out.alloc (coords_length);
     for (unsigned i = 0; i < coords_length; i++)
     {
       int v = coords[i];
       uint32_t varidx = varidx_map.map (i);
-      float delta = var_store.get_delta (varidx, coords, coords_length, var_store_cache);
-      v += roundf (delta);
-      v = hb_clamp (v, -(1<<14), +(1<<14));
+      float delta = var_store.get_delta (varidx, coords_2_14.arrayZ, coords_2_14.length, var_store_cache);
+      v += roundf (delta * 4); // 2.14 -> 16.16
+      v = hb_clamp (v, -(1<<16), +(1<<16));
       out.push (v);
     }
     for (unsigned i = 0; i < coords_length; i++)
@@ -347,16 +411,54 @@
 #endif
   }
 
-  void unmap_coords (int *coords, unsigned int coords_length) const
+  bool has_v2_data () const { return version.major > 1; }
+
+  // axis normalization is done in 2.14 here
+  // TODO: deprecate this API once fonttools is updated to use 16.16 normalization
+  bool map_coords_2_14 (float *coords, unsigned int coords_length) const
   {
+    hb_vector_t coords_2_14;
+    if (!coords_2_14.resize (coords_length)) return false;
     unsigned int count = hb_min (coords_length, axisCount);
 
     const SegmentMaps *map = &firstAxisSegmentMaps;
     for (unsigned int i = 0; i < count; i++)
     {
-      coords[i] = map->unmap (coords[i]);
+      int v = roundf (map->map_float (coords[i]) * 16384.f);
+      coords_2_14[i] = v;
+      coords[i] = v / 16384.f;
+      map = &StructAfter (*map);
+    }
+
+#ifndef HB_NO_AVAR2
+    if (version.major < 2)
+      return true;
+    hb_barrier ();
+
+    for (; count < axisCount; count++)
       map = &StructAfter (*map);
+
+    const auto &v2 = * (const avarV2Tail *) map;
+
+    const auto &varidx_map = this+v2.varIdxMap;
+    const auto &var_store = this+v2.varStore;
+    auto *var_store_cache = var_store.create_cache ();
+
+    for (unsigned i = 0; i < coords_length; i++)
+    {
+      int v = coords_2_14[i];
+      uint32_t varidx = varidx_map.map (i);
+      float delta = var_store.get_delta (varidx, coords_2_14.arrayZ, coords_2_14.length, var_store_cache);
+      v += roundf (delta);
+      v = hb_clamp (v, -(1<<16), +(1<<16));
+      coords[i] = v / 16384.f;
     }
+
+    OT::ItemVariationStore::destroy_cache (var_store_cache);
+    return true;
+#else
+    return version.major < 2;
+#endif
   }
 
   bool subset (hb_subset_context_t *c) const
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-var-common.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var-common.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-var-common.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var-common.hh	2026-04-17 19:09:35.000000000 +0000
@@ -27,24 +27,35 @@
 #define HB_OT_VAR_COMMON_HH
 
 #include "hb-ot-layout-common.hh"
+#include "hb-alloc-pool.hh"
 #include "hb-priority-queue.hh"
 #include "hb-subset-instancer-iup.hh"
 
 
 namespace OT {
 
+using rebase_tent_result_scratch_t = hb_pair_t;
 
 /* https://docs.microsoft.com/en-us/typography/opentype/spec/otvarcommonformats#tuplevariationheader */
 struct TupleVariationHeader
 {
   friend struct tuple_delta_t;
-  unsigned get_size (unsigned axis_count) const
-  { return min_size + get_all_tuples (axis_count).get_size (); }
+  unsigned get_size (unsigned axis_count_times_2) const
+  {
+    // This function is super hot in mega-var-fonts with hundreds of masters.
+    unsigned ti = tupleIndex;
+    if (unlikely ((ti & (TupleIndex::EmbeddedPeakTuple | TupleIndex::IntermediateRegion))))
+    {
+      unsigned count = ((ti & TupleIndex::EmbeddedPeakTuple) != 0) + ((ti & TupleIndex::IntermediateRegion) != 0) * 2;
+      return min_size + count * axis_count_times_2;
+    }
+    return min_size;
+  }
 
   unsigned get_data_size () const { return varDataSize; }
 
-  const TupleVariationHeader &get_next (unsigned axis_count) const
-  { return StructAtOffset (this, get_size (axis_count)); }
+  const TupleVariationHeader &get_next (unsigned axis_count_times_2) const
+  { return StructAtOffset (this, get_size (axis_count_times_2)); }
 
   bool unpack_axis_tuples (unsigned axis_count,
                            const hb_array_t shared_tuples,
@@ -53,7 +64,7 @@
   {
     const F2DOT14 *peak_tuple = nullptr;
     if (has_peak ())
-      peak_tuple = get_peak_tuple (axis_count).arrayZ;
+      peak_tuple = get_peak_tuple (axis_count);
     else
     {
       unsigned int index = get_index ();
@@ -68,8 +79,8 @@
 
     if (has_interm)
     {
-      start_tuple = get_start_tuple (axis_count).arrayZ;
-      end_tuple = get_end_tuple (axis_count).arrayZ;
+      start_tuple = get_start_tuple (axis_count);
+      end_tuple = get_end_tuple (axis_count);
     }
 
     for (unsigned i = 0; i < axis_count; i++)
@@ -98,88 +109,109 @@
     return true;
   }
 
+  HB_ALWAYS_INLINE
   double calculate_scalar (hb_array_t coords, unsigned int coord_count,
                            const hb_array_t shared_tuples,
-                           const hb_vector_t> *shared_tuple_active_idx = nullptr) const
+                           hb_scalar_cache_t *shared_tuple_scalar_cache = nullptr) const
   {
+    unsigned tuple_index = tupleIndex;
+
     const F2DOT14 *peak_tuple;
 
-    unsigned start_idx = 0;
-    unsigned end_idx = coord_count;
-    unsigned step = 1;
+    bool has_interm = tuple_index & TupleIndex::IntermediateRegion; // Inlined for performance
 
-    if (has_peak ())
-      peak_tuple = get_peak_tuple (coord_count).arrayZ;
+    if (unlikely (tuple_index & TupleIndex::EmbeddedPeakTuple)) // Inlined for performance
+    {
+      peak_tuple = get_peak_tuple (coord_count);
+      shared_tuple_scalar_cache = nullptr;
+    }
     else
     {
-      unsigned int index = get_index ();
-      if (unlikely ((index + 1) * coord_count > shared_tuples.length))
-        return 0.0;
-      peak_tuple = shared_tuples.sub_array (coord_count * index, coord_count).arrayZ;
+      unsigned int index = tuple_index & TupleIndex::TupleIndexMask; // Inlined for performance
 
-      if (shared_tuple_active_idx)
+      float scalar;
+      if (shared_tuple_scalar_cache &&
+          shared_tuple_scalar_cache->get (index, &scalar))
       {
-        if (unlikely (index >= shared_tuple_active_idx->length))
-          return 0.0;
-        auto _ = (*shared_tuple_active_idx).arrayZ[index];
-        if (_.second != -1)
-        {
-          start_idx = _.first;
-          end_idx = _.second + 1;
-          step = _.second - _.first;
-        }
-        else if (_.first != -1)
-        {
-          start_idx = _.first;
-          end_idx = start_idx + 1;
-        }
+        if (has_interm && (scalar != 0 && scalar != 1.f))
+          shared_tuple_scalar_cache = nullptr;
+        else
+          return (double) scalar;
       }
+
+      if (unlikely ((index + 1) * coord_count > shared_tuples.length))
+        return 0.0;
+      peak_tuple = shared_tuples.arrayZ + (coord_count * index);
+
     }
 
     const F2DOT14 *start_tuple = nullptr;
     const F2DOT14 *end_tuple = nullptr;
-    bool has_interm = has_intermediate ();
+
     if (has_interm)
     {
-      start_tuple = get_start_tuple (coord_count).arrayZ;
-      end_tuple = get_end_tuple (coord_count).arrayZ;
+      start_tuple = get_start_tuple (coord_count);
+      end_tuple = get_end_tuple (coord_count);
     }
 
     double scalar = 1.0;
-    for (unsigned int i = start_idx; i < end_idx; i += step)
-    {
+#ifndef HB_OPTIMIZE_SIZE
+#if HB_FAST_NUM_ACCESS
+    bool skip = coord_count >= 16;
+#endif
+#endif
+    for (unsigned int i = 0; i < coord_count; i++)
+    {
+#ifndef HB_OPTIMIZE_SIZE
+#if HB_FAST_NUM_ACCESS
+      if (skip)
+      {
+        while (i + 4 <= coord_count && * (HBUINT64LE *) &peak_tuple[i] == 0)
+          i += 4;
+        while (i < coord_count && peak_tuple[i].to_int () == 0)
+          i += 1;
+        if (i >= coord_count)
+          break;
+      }
+#endif
+#endif
+
       int peak = peak_tuple[i].to_int ();
       if (!peak) continue;
 
       int v = coords[i];
+      if (!v) { scalar = 0.0; break; }
       if (v == peak) continue;
 
       if (has_interm)
       {
+        shared_tuple_scalar_cache = nullptr;
         int start = start_tuple[i].to_int ();
         int end = end_tuple[i].to_int ();
         if (unlikely (start > peak || peak > end ||
                       (start < 0 && end > 0 && peak))) continue;
-        if (v < start || v > end) return 0.0;
+        if (v < start || v > end) { scalar = 0.0; break; }
         if (v < peak)
         { if (peak != start) scalar *= (double) (v - start) / (peak - start); }
         else
         { if (peak != end) scalar *= (double) (end - v) / (end - peak); }
       }
-      else if (!v || v < hb_min (0, peak) || v > hb_max (0, peak)) return 0.0;
+      else if (v < hb_min (0, peak) || v > hb_max (0, peak)) { scalar = 0.0; break; }
       else
         scalar *= (double) v / peak;
     }
+    if (shared_tuple_scalar_cache)
+      shared_tuple_scalar_cache->set (get_index (), scalar);
     return scalar;
   }
 
-  bool           has_peak () const { return tupleIndex & TuppleIndex::EmbeddedPeakTuple; }
-  bool   has_intermediate () const { return tupleIndex & TuppleIndex::IntermediateRegion; }
-  bool has_private_points () const { return tupleIndex & TuppleIndex::PrivatePointNumbers; }
-  unsigned      get_index () const { return tupleIndex & TuppleIndex::TupleIndexMask; }
+  bool           has_peak () const { return tupleIndex & TupleIndex::EmbeddedPeakTuple; }
+  bool   has_intermediate () const { return tupleIndex & TupleIndex::IntermediateRegion; }
+  bool has_private_points () const { return tupleIndex & TupleIndex::PrivatePointNumbers; }
+  unsigned      get_index () const { return tupleIndex & TupleIndex::TupleIndexMask; }
 
   protected:
-  struct TuppleIndex : HBUINT16
+  struct TupleIndex : HBUINT16
   {
     enum Flags {
       EmbeddedPeakTuple   = 0x8000u,
@@ -188,22 +220,24 @@
       TupleIndexMask      = 0x0FFFu
     };
 
-    TuppleIndex& operator = (uint16_t i) { HBUINT16::operator= (i); return *this; }
+    TupleIndex& operator = (uint16_t i) { HBUINT16::operator= (i); return *this; }
     DEFINE_SIZE_STATIC (2);
   };
 
   hb_array_t get_all_tuples (unsigned axis_count) const
   { return StructAfter> (tupleIndex).as_array ((has_peak () + has_intermediate () * 2) * axis_count); }
-  hb_array_t get_peak_tuple (unsigned axis_count) const
-  { return get_all_tuples (axis_count).sub_array (0, axis_count); }
-  hb_array_t get_start_tuple (unsigned axis_count) const
-  { return get_all_tuples (axis_count).sub_array (has_peak () * axis_count, axis_count); }
-  hb_array_t get_end_tuple (unsigned axis_count) const
-  { return get_all_tuples (axis_count).sub_array (has_peak () * axis_count + axis_count, axis_count); }
+  const F2DOT14* get_all_tuples_base (unsigned axis_count) const
+  { return StructAfter> (tupleIndex).arrayZ; }
+  const F2DOT14* get_peak_tuple (unsigned axis_count) const
+  { return get_all_tuples_base (axis_count); }
+  const F2DOT14* get_start_tuple (unsigned axis_count) const
+  { return get_all_tuples_base (axis_count) + has_peak () * axis_count; }
+  const F2DOT14* get_end_tuple (unsigned axis_count) const
+  { return get_all_tuples_base (axis_count) + has_peak () * axis_count + axis_count; }
 
   HBUINT16      varDataSize;    /* The size in bytes of the serialized
                                  * data for this tuple variation table. */
-  TuppleIndex   tupleIndex;     /* A packed field. The high 4 bits are flags (see below).
+  TupleIndex    tupleIndex;     /* A packed field. The high 4 bits are flags (see below).
                                    The low 12 bits are an index into a shared tuple
                                    records array. */
   /* UnsizedArrayOf peakTuple - optional */
@@ -221,6 +255,21 @@
   DEFINE_SIZE_MIN (4);
 };
 
+struct optimize_scratch_t
+{
+  iup_scratch_t iup;
+  hb_vector_t opt_indices;
+  hb_vector_t rounded_x_deltas;
+  hb_vector_t rounded_y_deltas;
+  hb_vector_t opt_deltas_x;
+  hb_vector_t opt_deltas_y;
+  hb_vector_t opt_point_data;
+  hb_vector_t opt_deltas_data;
+  hb_vector_t point_data;
+  hb_vector_t deltas_data;
+  hb_vector_t rounded_deltas;
+};
+
 struct tuple_delta_t
 {
   static constexpr bool realloc_move = true;  // Watch out when adding new members!
@@ -241,11 +290,12 @@
   hb_vector_t compiled_tuple_header;
   hb_vector_t compiled_deltas;
 
-  /* compiled peak coords, empty for non-gvar tuples */
-  hb_vector_t compiled_peak_coords;
+  hb_vector_t compiled_peak_coords;
+  hb_vector_t compiled_interm_coords;
 
-  tuple_delta_t () = default;
+  tuple_delta_t (hb_alloc_pool_t *pool = nullptr) {}
   tuple_delta_t (const tuple_delta_t& o) = default;
+  tuple_delta_t& operator = (const tuple_delta_t& o) = default;
 
   friend void swap (tuple_delta_t& a, tuple_delta_t& b) noexcept
   {
@@ -267,6 +317,18 @@
     return *this;
   }
 
+  void copy_from (const tuple_delta_t& o, hb_alloc_pool_t *pool = nullptr)
+  {
+    axis_tuples = o.axis_tuples;
+    indices.duplicate_vector_from_pool (pool, o.indices);
+    deltas_x.duplicate_vector_from_pool (pool, o.deltas_x);
+    deltas_y.duplicate_vector_from_pool (pool, o.deltas_y);
+    compiled_tuple_header.duplicate_vector_from_pool (pool, o.compiled_tuple_header);
+    compiled_deltas.duplicate_vector_from_pool (pool, o.compiled_deltas);
+    compiled_peak_coords.duplicate_vector_from_pool (pool, o.compiled_peak_coords);
+    compiled_interm_coords.duplicate_vector_from_pool (pool, o.compiled_interm_coords);
+  }
+
   void remove_axis (hb_tag_t axis_tag)
   { axis_tuples.del (axis_tag); }
 
@@ -321,31 +383,44 @@
     return *this;
   }
 
-  hb_vector_t change_tuple_var_axis_limit (hb_tag_t axis_tag, Triple axis_limit,
-                                                          TripleDistances axis_triple_distances) const
+  void change_tuple_var_axis_limit (hb_tag_t axis_tag, Triple axis_limit,
+                                    TripleDistances axis_triple_distances,
+                                    hb_vector_t& out,
+                                    rebase_tent_result_scratch_t &scratch,
+                                    hb_alloc_pool_t *pool = nullptr)
   {
-    hb_vector_t out;
+    // May move *this out.
+
+    out.reset ();
     Triple *tent;
     if (!axis_tuples.has (axis_tag, &tent))
     {
-      out.push (*this);
-      return out;
+      out.push (std::move (*this));
+      return;
     }
 
     if ((tent->minimum < 0.0 && tent->maximum > 0.0) ||
         !(tent->minimum <= tent->middle && tent->middle <= tent->maximum))
-      return out;
+      return;
 
     if (tent->middle == 0.0)
     {
-      out.push (*this);
-      return out;
+      out.push (std::move (*this));
+      return;
     }
 
-    rebase_tent_result_t solutions = rebase_tent (*tent, axis_limit, axis_triple_distances);
-    for (auto &t : solutions)
+    rebase_tent_result_t &solutions = scratch.first;
+    rebase_tent (*tent, axis_limit, axis_triple_distances, solutions, scratch.second);
+    for (unsigned i = 0; i < solutions.length; i++)
     {
-      tuple_delta_t new_var = *this;
+      auto &t = solutions.arrayZ[i];
+
+      tuple_delta_t new_var;
+      if (i < solutions.length - 1)
+        new_var.copy_from (*this, pool);
+      else
+        new_var = std::move (*this);
+
       if (t.second == Triple ())
         new_var.remove_axis (axis_tag);
       else
@@ -354,38 +429,76 @@
       new_var *= t.first;
       out.push (std::move (new_var));
     }
-
-    return out;
   }
 
-  bool compile_peak_coords (const hb_map_t& axes_index_map,
-                            const hb_map_t& axes_old_index_tag_map)
+  bool compile_coords (const hb_map_t& axes_index_map,
+                       const hb_map_t& axes_old_index_tag_map,
+                       hb_alloc_pool_t *pool= nullptr)
   {
-    unsigned axis_count = axes_index_map.get_population ();
-    if (unlikely (!compiled_peak_coords.alloc (axis_count * F2DOT14::static_size)))
+    unsigned cur_axis_count = axes_index_map.get_population ();
+    if (pool)
+    {
+      if (unlikely (!compiled_peak_coords.allocate_from_pool (pool, cur_axis_count)))
+        return false;
+    }
+    else if (unlikely (!compiled_peak_coords.resize (cur_axis_count)))
       return false;
 
+    hb_array_t start_coords, end_coords;
+
     unsigned orig_axis_count = axes_old_index_tag_map.get_population ();
+    unsigned j = 0;
     for (unsigned i = 0; i < orig_axis_count; i++)
     {
       if (!axes_index_map.has (i))
         continue;
 
       hb_tag_t axis_tag = axes_old_index_tag_map.get (i);
-      Triple *coords;
-      F2DOT14 peak_coord;
+      Triple *coords = nullptr;
       if (axis_tuples.has (axis_tag, &coords))
-        peak_coord.set_float (coords->middle);
-      else
-        peak_coord.set_int (0);
+      {
+        float min_val = coords->minimum;
+        float val = coords->middle;
+        float max_val = coords->maximum;
+
+        compiled_peak_coords.arrayZ[j].set_float (val);
+
+        if (min_val != hb_min (val, 0.f) || max_val != hb_max (val, 0.f))
+        {
+          if (!compiled_interm_coords)
+          {
+            if (pool)
+            {
+              if (unlikely (!compiled_interm_coords.allocate_from_pool (pool, 2 * cur_axis_count)))
+                return false;
+            }
+            else if (unlikely (!compiled_interm_coords.resize (2 * cur_axis_count)))
+              return false;
+            start_coords = compiled_interm_coords.as_array ().sub_array (0, cur_axis_count);
+            end_coords = compiled_interm_coords.as_array ().sub_array (cur_axis_count);
+
+            for (unsigned k = 0; k < j; k++)
+            {
+              signed peak = compiled_peak_coords.arrayZ[k].to_int ();
+              if (!peak) continue;
+              start_coords.arrayZ[k].set_int (hb_min (peak, 0));
+              end_coords.arrayZ[k].set_int (hb_max (peak, 0));
+            }
+          }
+
+        }
+
+        if (compiled_interm_coords)
+        {
+          start_coords.arrayZ[j].set_float (min_val);
+          end_coords.arrayZ[j].set_float (max_val);
+        }
+      }
 
-      /* push F2DOT14 value into char vector */
-      int16_t val = peak_coord.to_int ();
-      compiled_peak_coords.push (static_cast (val >> 8));
-      compiled_peak_coords.push (static_cast (val & 0xFF));
+      j++;
     }
 
-    return !compiled_peak_coords.in_error ();
+    return !compiled_peak_coords.in_error () && !compiled_interm_coords.in_error ();
   }
 
   /* deltas should be compiled already before we compile tuple
@@ -394,7 +507,8 @@
   bool compile_tuple_var_header (const hb_map_t& axes_index_map,
                                  unsigned points_data_length,
                                  const hb_map_t& axes_old_index_tag_map,
-                                 const hb_hashmap_t*, unsigned>* shared_tuples_idx_map)
+                                 const hb_hashmap_t*, unsigned>* shared_tuples_idx_map,
+                                 hb_alloc_pool_t *pool = nullptr)
   {
     /* compiled_deltas could be empty after iup delta optimization, we can skip
      * compiling this tuple and return true */
@@ -403,7 +517,7 @@
     unsigned cur_axis_count = axes_index_map.get_population ();
     /* allocate enough memory: 1 peak + 2 intermediate coords + fixed header size */
     unsigned alloc_len = 3 * cur_axis_count * (F2DOT14::static_size) + 4;
-    if (unlikely (!compiled_tuple_header.resize (alloc_len))) return false;
+    if (unlikely (!compiled_tuple_header.allocate_from_pool (pool, alloc_len, false))) return false;
 
     unsigned flag = 0;
     /* skip the first 4 header bytes: variationDataSize+tupleIndex */
@@ -411,6 +525,9 @@
     F2DOT14* end = reinterpret_cast (compiled_tuple_header.end ());
     hb_array_t coords (p, end - p);
 
+    if (!shared_tuples_idx_map)
+      compile_coords (axes_index_map, axes_old_index_tag_map); // non-gvar tuples do not have compiled coords yet
+
     /* encode peak coords */
     unsigned peak_count = 0;
     unsigned *shared_tuple_idx;
@@ -421,16 +538,16 @@
     }
     else
     {
-      peak_count = encode_peak_coords(coords, flag, axes_index_map, axes_old_index_tag_map);
+      peak_count = encode_peak_coords(coords, flag);
       if (!peak_count) return false;
     }
 
     /* encode interim coords, it's optional so returned num could be 0 */
-    unsigned interim_count = encode_interm_coords (coords.sub_array (peak_count), flag, axes_index_map, axes_old_index_tag_map);
+    unsigned interim_count = encode_interm_coords (coords.sub_array (peak_count), flag);
 
     /* pointdata length = 0 implies "use shared points" */
     if (points_data_length)
-      flag |= TupleVariationHeader::TuppleIndex::PrivatePointNumbers;
+      flag |= TupleVariationHeader::TupleIndex::PrivatePointNumbers;
 
     unsigned serialized_data_size = points_data_length + compiled_deltas.length;
     TupleVariationHeader *o = reinterpret_cast (compiled_tuple_header.begin ());
@@ -438,105 +555,63 @@
     o->tupleIndex = flag;
 
     unsigned total_header_len = 4 + (peak_count + interim_count) * (F2DOT14::static_size);
-    return compiled_tuple_header.resize (total_header_len);
+    compiled_tuple_header.shrink_back_to_pool (pool, total_header_len);
+    return true;
   }
 
   unsigned encode_peak_coords (hb_array_t peak_coords,
-                               unsigned& flag,
-                               const hb_map_t& axes_index_map,
-                               const hb_map_t& axes_old_index_tag_map) const
+                               unsigned& flag) const
   {
-    unsigned orig_axis_count = axes_old_index_tag_map.get_population ();
-    auto it = peak_coords.iter ();
-    unsigned count = 0;
-    for (unsigned i = 0; i < orig_axis_count; i++)
-    {
-      if (!axes_index_map.has (i)) /* axis pinned */
-        continue;
-      hb_tag_t axis_tag = axes_old_index_tag_map.get (i);
-      Triple *coords;
-      if (!axis_tuples.has (axis_tag, &coords))
-        (*it).set_int (0);
-      else
-        (*it).set_float (coords->middle);
-      it++;
-      count++;
-    }
-    flag |= TupleVariationHeader::TuppleIndex::EmbeddedPeakTuple;
-    return count;
+    hb_memcpy (&peak_coords[0], &compiled_peak_coords[0], compiled_peak_coords.length * sizeof (compiled_peak_coords[0]));
+    flag |= TupleVariationHeader::TupleIndex::EmbeddedPeakTuple;
+    return compiled_peak_coords.length;
   }
 
   /* if no need to encode intermediate coords, then just return p */
   unsigned encode_interm_coords (hb_array_t coords,
-                                 unsigned& flag,
-                                 const hb_map_t& axes_index_map,
-                                 const hb_map_t& axes_old_index_tag_map) const
+                                 unsigned& flag) const
   {
-    unsigned orig_axis_count = axes_old_index_tag_map.get_population ();
-    unsigned cur_axis_count = axes_index_map.get_population ();
-
-    auto start_coords_iter = coords.sub_array (0, cur_axis_count).iter ();
-    auto end_coords_iter = coords.sub_array (cur_axis_count).iter ();
-    bool encode_needed = false;
-    unsigned count = 0;
-    for (unsigned i = 0; i < orig_axis_count; i++)
+    if (compiled_interm_coords)
     {
-      if (!axes_index_map.has (i)) /* axis pinned */
-        continue;
-      hb_tag_t axis_tag = axes_old_index_tag_map.get (i);
-      Triple *coords;
-      float min_val = 0.f, val = 0.f, max_val = 0.f;
-      if (axis_tuples.has (axis_tag, &coords))
-      {
-        min_val = coords->minimum;
-        val = coords->middle;
-        max_val = coords->maximum;
-      }
-
-      (*start_coords_iter).set_float (min_val);
-      (*end_coords_iter).set_float (max_val);
-
-      start_coords_iter++;
-      end_coords_iter++;
-      count += 2;
-      if (min_val != hb_min (val, 0.f) || max_val != hb_max (val, 0.f))
-        encode_needed = true;
-    }
-
-    if (encode_needed)
-    {
-      flag |= TupleVariationHeader::TuppleIndex::IntermediateRegion;
-      return count;
+      hb_memcpy (&coords[0], &compiled_interm_coords[0], compiled_interm_coords.length * sizeof (compiled_interm_coords[0]));
+      flag |= TupleVariationHeader::TupleIndex::IntermediateRegion;
     }
-    return 0;
+    return compiled_interm_coords.length;
   }
 
-  bool compile_deltas ()
-  { return compile_deltas (indices, deltas_x, deltas_y, compiled_deltas); }
+  bool compile_deltas (hb_vector_t &rounded_deltas_scratch,
+                       hb_alloc_pool_t *pool = nullptr)
+  { return compile_deltas (indices, deltas_x, deltas_y, compiled_deltas, rounded_deltas_scratch, pool); }
 
   static bool compile_deltas (hb_array_t point_indices,
                               hb_array_t x_deltas,
                               hb_array_t y_deltas,
-                              hb_vector_t &compiled_deltas /* OUT */)
+                              hb_vector_t &compiled_deltas, /* OUT */
+                              hb_vector_t &rounded_deltas, /* scratch */
+                              hb_alloc_pool_t *pool = nullptr)
   {
-    hb_vector_t rounded_deltas;
-    if (unlikely (!rounded_deltas.alloc (point_indices.length)))
+    if (unlikely (!rounded_deltas.resize_dirty  (point_indices.length)))
       return false;
 
+    unsigned j = 0;
     for (unsigned i = 0; i < point_indices.length; i++)
     {
       if (!point_indices[i]) continue;
-      int rounded_delta = (int) roundf (x_deltas.arrayZ[i]);
-      rounded_deltas.push (rounded_delta);
+      rounded_deltas.arrayZ[j++] = (int) roundf (x_deltas.arrayZ[i]);
     }
+    rounded_deltas.resize (j);
 
     if (!rounded_deltas) return true;
-    /* allocate enough memories 5 * num_deltas */
-    unsigned alloc_len = 5 * rounded_deltas.length;
+    /* Allocate enough memory: this is the correct bound:
+     * Worst case scenario is that each delta has to be encoded in 4 bytes, and there
+     * are runs of 64 items each. Any delta encoded in less than 4 bytes (2, 1, or 0)
+     * is still smaller than the 4-byte encoding even with their control byte.
+     * The initial 2 is to handle length==0, for both x and y deltas. */
+    unsigned alloc_len = 2 + 4 * rounded_deltas.length + (rounded_deltas.length + 63) / 64;
     if (y_deltas)
       alloc_len *= 2;
 
-    if (unlikely (!compiled_deltas.resize (alloc_len))) return false;
+    if (unlikely (!compiled_deltas.allocate_from_pool (pool, alloc_len, false))) return false;
 
     unsigned encoded_len = compile_deltas (compiled_deltas, rounded_deltas);
 
@@ -557,28 +632,30 @@
       if (j != rounded_deltas.length) return false;
       encoded_len += compile_deltas (compiled_deltas.as_array ().sub_array (encoded_len), rounded_deltas);
     }
-    return compiled_deltas.resize (encoded_len);
+    compiled_deltas.shrink_back_to_pool (pool, encoded_len);
+    return true;
   }
 
   static unsigned compile_deltas (hb_array_t encoded_bytes,
                                   hb_array_t deltas)
   {
-    return TupleValues::compile (deltas, encoded_bytes);
+    return TupleValues::compile_unsafe (deltas, encoded_bytes);
   }
 
-  bool calc_inferred_deltas (const contour_point_vector_t& orig_points)
+  bool calc_inferred_deltas (const contour_point_vector_t& orig_points,
+                             hb_vector_t &scratch)
   {
     unsigned point_count = orig_points.length;
     if (point_count != indices.length)
       return false;
 
     unsigned ref_count = 0;
-    hb_vector_t end_points;
+
+    hb_vector_t &end_points = scratch.reset ();
 
     for (unsigned i = 0; i < point_count; i++)
     {
-      if (indices.arrayZ[i])
-        ref_count++;
+      ref_count += indices.arrayZ[i];
       if (orig_points.arrayZ[i].is_end_point)
         end_points.push (i);
     }
@@ -587,7 +664,7 @@
       return true;
     if (unlikely (end_points.in_error ())) return false;
 
-    hb_set_t inferred_idxes;
+    hb_bit_set_t inferred_idxes;
     unsigned start_point = 0;
     for (unsigned end_point : end_points)
     {
@@ -661,6 +738,7 @@
 
   bool optimize (const contour_point_vector_t& contour_points,
                  bool is_composite,
+                 optimize_scratch_t &scratch,
                  double tolerance = 0.5 + 1e-10)
   {
     unsigned count = contour_points.length;
@@ -668,22 +746,21 @@
         deltas_y.length != count)
       return false;
 
-    hb_vector_t opt_indices;
-    hb_vector_t rounded_x_deltas, rounded_y_deltas;
+    hb_vector_t &opt_indices = scratch.opt_indices.reset ();
+    hb_vector_t &rounded_x_deltas = scratch.rounded_x_deltas;
+    hb_vector_t &rounded_y_deltas = scratch.rounded_y_deltas;
 
-    if (unlikely (!rounded_x_deltas.alloc (count) ||
-                  !rounded_y_deltas.alloc (count)))
+    if (unlikely (!rounded_x_deltas.resize_dirty  (count) ||
+                  !rounded_y_deltas.resize_dirty  (count)))
       return false;
 
     for (unsigned i = 0; i < count; i++)
     {
-      int rounded_x_delta = (int) roundf (deltas_x.arrayZ[i]);
-      int rounded_y_delta = (int) roundf (deltas_y.arrayZ[i]);
-      rounded_x_deltas.push (rounded_x_delta);
-      rounded_y_deltas.push (rounded_y_delta);
+      rounded_x_deltas.arrayZ[i] = (int) roundf (deltas_x.arrayZ[i]);
+      rounded_y_deltas.arrayZ[i] = (int) roundf (deltas_y.arrayZ[i]);
     }
 
-    if (!iup_delta_optimize (contour_points, rounded_x_deltas, rounded_y_deltas, opt_indices, tolerance))
+    if (!iup_delta_optimize (contour_points, rounded_x_deltas, rounded_y_deltas, opt_indices, scratch.iup, tolerance))
       return false;
 
     unsigned ref_count = 0;
@@ -692,7 +769,8 @@
 
     if (ref_count == count) return true;
 
-    hb_vector_t opt_deltas_x, opt_deltas_y;
+    hb_vector_t &opt_deltas_x = scratch.opt_deltas_x.reset ();
+    hb_vector_t &opt_deltas_y = scratch.opt_deltas_y.reset ();
     bool is_comp_glyph_wo_deltas = (is_composite && ref_count == 0);
     if (is_comp_glyph_wo_deltas)
     {
@@ -705,34 +783,31 @@
         opt_indices.arrayZ[i] = false;
     }
 
-    hb_vector_t opt_point_data;
+    hb_vector_t &opt_point_data = scratch.opt_point_data.reset ();
     if (!compile_point_set (opt_indices, opt_point_data))
       return false;
-    hb_vector_t opt_deltas_data;
+    hb_vector_t &opt_deltas_data = scratch.opt_deltas_data.reset ();
     if (!compile_deltas (opt_indices,
                          is_comp_glyph_wo_deltas ? opt_deltas_x : deltas_x,
                          is_comp_glyph_wo_deltas ? opt_deltas_y : deltas_y,
-                         opt_deltas_data))
+                         opt_deltas_data,
+                         scratch.rounded_deltas))
       return false;
 
-    hb_vector_t point_data;
+    hb_vector_t &point_data = scratch.point_data.reset ();
     if (!compile_point_set (indices, point_data))
       return false;
-    hb_vector_t deltas_data;
-    if (!compile_deltas (indices, deltas_x, deltas_y, deltas_data))
+    hb_vector_t &deltas_data = scratch.deltas_data.reset ();
+    if (!compile_deltas (indices, deltas_x, deltas_y, deltas_data, scratch.rounded_deltas))
       return false;
 
     if (opt_point_data.length + opt_deltas_data.length < point_data.length + deltas_data.length)
     {
-      indices.fini ();
       indices = std::move (opt_indices);
 
       if (is_comp_glyph_wo_deltas)
       {
-        deltas_x.fini ();
         deltas_x = std::move (opt_deltas_x);
-
-        deltas_y.fini ();
         deltas_y = std::move (opt_deltas_y);
       }
     }
@@ -757,7 +832,7 @@
 
     /* allocate enough memories: 2 bytes for count + 3 bytes for each point */
     unsigned num_bytes = 2 + 3 *num_points;
-    if (unlikely (!compiled_points.resize (num_bytes, false)))
+    if (unlikely (!compiled_points.resize_dirty  (num_bytes)))
       return false;
 
     unsigned pos = 0;
@@ -821,7 +896,7 @@
       else
         compiled_points.arrayZ[header_pos] = (run_length - 1) | 0x80;
     }
-    return compiled_points.resize (pos, false);
+    return compiled_points.resize_dirty  (pos);
   }
 
   static double infer_delta (double target_val, double prev_val, double next_val, double prev_delta, double next_delta)
@@ -852,15 +927,15 @@
     return_trace (c->check_struct (this));
   }
 
-  unsigned get_size (unsigned axis_count) const
+  unsigned get_size (unsigned axis_count_times_2) const
   {
     unsigned total_size = min_size;
     unsigned count = tupleVarCount.get_count ();
     const TupleVariationHeader *tuple_var_header = &(get_tuple_var_header());
     for (unsigned i = 0; i < count; i++)
     {
-      total_size += tuple_var_header->get_size (axis_count) + tuple_var_header->get_data_size ();
-      tuple_var_header = &tuple_var_header->get_next (axis_count);
+      total_size += tuple_var_header->get_size (axis_count_times_2) + tuple_var_header->get_data_size ();
+      tuple_var_header = &tuple_var_header->get_next (axis_count_times_2);
     }
 
     return total_size;
@@ -925,8 +1000,12 @@
                                      const hb_map_t *axes_old_index_tag_map,
                                      const hb_vector_t &shared_indices,
                                      const hb_array_t shared_tuples,
-                                     bool is_composite_glyph)
+                                     hb_alloc_pool_t *pool = nullptr,
+                                     bool is_composite_glyph = false)
     {
+      hb_vector_t private_indices;
+      hb_vector_t deltas_x;
+      hb_vector_t deltas_y;
       do
       {
         const HBUINT8 *p = iterator.get_serialized_data ();
@@ -939,7 +1018,7 @@
             || axis_tuples.is_empty ())
           return false;
 
-        hb_vector_t private_indices;
+        private_indices.reset ();
         bool has_private_points = iterator.current_tuple->has_private_points ();
         const HBUINT8 *end = p + length;
         if (has_private_points &&
@@ -950,27 +1029,24 @@
         bool apply_to_all = (indices.length == 0);
         unsigned num_deltas = apply_to_all ? point_count : indices.length;
 
-        hb_vector_t deltas_x;
-
-        if (unlikely (!deltas_x.resize (num_deltas, false) ||
+        if (unlikely (!deltas_x.resize_dirty  (num_deltas) ||
                       !TupleVariationData::decompile_deltas (p, deltas_x, end)))
           return false;
 
-        hb_vector_t deltas_y;
         if (is_gvar)
         {
-          if (unlikely (!deltas_y.resize (num_deltas, false) ||
+          if (unlikely (!deltas_y.resize_dirty  (num_deltas) ||
                         !TupleVariationData::decompile_deltas (p, deltas_y, end)))
             return false;
         }
 
         tuple_delta_t var;
         var.axis_tuples = std::move (axis_tuples);
-        if (unlikely (!var.indices.resize (point_count) ||
-                      !var.deltas_x.resize (point_count, false)))
+        if (unlikely (!var.indices.allocate_from_pool (pool, point_count) ||
+                      !var.deltas_x.allocate_from_pool (pool, point_count, false)))
           return false;
 
-        if (is_gvar && unlikely (!var.deltas_y.resize (point_count, false)))
+        if (is_gvar && unlikely (!var.deltas_y.allocate_from_pool (pool, point_count, false)))
           return false;
 
         for (unsigned i = 0; i < num_deltas; i++)
@@ -1012,8 +1088,8 @@
         /* In VarData, deltas are organized in rows, convert them into
          * column(region) based tuples, resize deltas_x first */
         tuple_delta_t tuple;
-        if (!tuple.deltas_x.resize (item_count, false) ||
-            !tuple.indices.resize (item_count, false))
+        if (!tuple.deltas_x.resize_dirty  (item_count) ||
+            !tuple.indices.resize_dirty  (item_count))
           return false;
 
         for (unsigned i = 0; i < item_count; i++)
@@ -1041,7 +1117,8 @@
     }
 
     bool change_tuple_variations_axis_limits (const hb_hashmap_t& normalized_axes_location,
-                                              const hb_hashmap_t& axes_triple_distances)
+                                              const hb_hashmap_t& axes_triple_distances,
+                                              hb_alloc_pool_t *pool = nullptr)
     {
       /* sort axis_tag/axis_limits, make result deterministic */
       hb_vector_t axis_tags;
@@ -1050,6 +1127,10 @@
       for (auto t : normalized_axes_location.keys ())
         axis_tags.push (t);
 
+      // Reused vectors for reduced malloc pressure.
+      rebase_tent_result_scratch_t scratch;
+      hb_vector_t out;
+
       axis_tags.qsort (_cmp_axis_tag);
       for (auto axis_tag : axis_tags)
       {
@@ -1061,9 +1142,10 @@
           axis_triple_distances = axes_triple_distances.get (axis_tag);
 
         hb_vector_t new_vars;
-        for (const tuple_delta_t& var : tuple_vars)
+        for (tuple_delta_t& var : tuple_vars)
         {
-          hb_vector_t out = var.change_tuple_var_axis_limit (axis_tag, *axis_limit, axis_triple_distances);
+          // This may move var out.
+          var.change_tuple_var_axis_limit (axis_tag, *axis_limit, axis_triple_distances, out, scratch, pool);
           if (!out) continue;
 
           unsigned new_len = new_vars.length + out.length;
@@ -1074,7 +1156,6 @@
           for (unsigned i = 0; i < out.length; i++)
             new_vars.push (std::move (out[i]));
         }
-        tuple_vars.fini ();
         tuple_vars = std::move (new_vars);
       }
       return true;
@@ -1085,9 +1166,12 @@
     bool merge_tuple_variations (contour_point_vector_t* contour_points = nullptr)
     {
       hb_vector_t new_vars;
+      // The pre-allocation is essential for address stability of pointers
+      // we store in the hashmap.
+      if (unlikely (!new_vars.alloc (tuple_vars.length)))
+        return false;
       hb_hashmap_t*, unsigned> m;
-      unsigned i = 0;
-      for (const tuple_delta_t& var : tuple_vars)
+      for (tuple_delta_t& var : tuple_vars)
       {
         /* if all axes are pinned, drop the tuple variation */
         if (var.axis_tuples.is_empty ())
@@ -1107,13 +1191,17 @@
         }
         else
         {
-          new_vars.push (var);
-          if (!m.set (&(var.axis_tuples), i))
+          auto *new_var = new_vars.push ();
+          if (unlikely (new_vars.in_error ()))
+            return false;
+          hb_swap (*new_var, var);
+          if (unlikely (!m.set (&(new_var->axis_tuples), new_vars.length - 1)))
             return false;
-          i++;
         }
       }
-      tuple_vars.fini ();
+      m.fini (); // Just in case, since it points into new_vars data.
+                 // Shouldn't be necessary though, since we only move new_vars, not its
+                 // contents.
       tuple_vars = std::move (new_vars);
       return true;
     }
@@ -1173,20 +1261,22 @@
       }
     }
 
-    bool calc_inferred_deltas (const contour_point_vector_t& contour_points)
+    bool calc_inferred_deltas (const contour_point_vector_t& contour_points,
+                               hb_vector_t &scratch)
     {
       for (tuple_delta_t& var : tuple_vars)
-        if (!var.calc_inferred_deltas (contour_points))
+        if (!var.calc_inferred_deltas (contour_points, scratch))
           return false;
 
       return true;
     }
 
-    bool iup_optimize (const contour_point_vector_t& contour_points)
+    bool iup_optimize (const contour_point_vector_t& contour_points,
+                       optimize_scratch_t &scratch)
     {
       for (tuple_delta_t& var : tuple_vars)
       {
-        if (!var.optimize (contour_points, is_composite))
+        if (!var.optimize (contour_points, is_composite, scratch))
           return false;
       }
       return true;
@@ -1195,16 +1285,21 @@
     public:
     bool instantiate (const hb_hashmap_t& normalized_axes_location,
                       const hb_hashmap_t& axes_triple_distances,
+                      optimize_scratch_t &scratch,
+                      hb_alloc_pool_t *pool = nullptr,
                       contour_point_vector_t* contour_points = nullptr,
                       bool optimize = false)
     {
       if (!tuple_vars) return true;
-      if (!change_tuple_variations_axis_limits (normalized_axes_location, axes_triple_distances))
+      if (!change_tuple_variations_axis_limits (normalized_axes_location, axes_triple_distances, pool))
         return false;
       /* compute inferred deltas only for gvar */
       if (contour_points)
-        if (!calc_inferred_deltas (*contour_points))
+      {
+        hb_vector_t scratch;
+        if (!calc_inferred_deltas (*contour_points, scratch))
           return false;
+      }
 
       /* if iup delta opt is on, contour_points can't be null */
       if (optimize && !contour_points)
@@ -1213,7 +1308,7 @@
       if (!merge_tuple_variations (optimize ? contour_points : nullptr))
         return false;
 
-      if (optimize && !iup_optimize (*contour_points)) return false;
+      if (optimize && !iup_optimize (*contour_points, scratch)) return false;
       return !tuple_vars.in_error ();
     }
 
@@ -1221,7 +1316,8 @@
                         const hb_map_t& axes_old_index_tag_map,
                         bool use_shared_points,
                         bool is_gvar = false,
-                        const hb_hashmap_t*, unsigned>* shared_tuples_idx_map = nullptr)
+                        const hb_hashmap_t*, unsigned>* shared_tuples_idx_map = nullptr,
+                        hb_alloc_pool_t *pool = nullptr)
     {
       // return true for empty glyph
       if (!tuple_vars)
@@ -1241,6 +1337,7 @@
         if (shared_points_bytes)
           compiled_byte_size += shared_points_bytes->length;
       }
+      hb_vector_t rounded_deltas_scratch;
       // compile delta and tuple var header for each tuple variation
       for (auto& tuple: tuple_vars)
       {
@@ -1254,12 +1351,13 @@
          * this tuple */
         if (!points_data->length)
           continue;
-        if (!tuple.compile_deltas ())
+        if (!tuple.compile_deltas (rounded_deltas_scratch, pool))
           return false;
 
         unsigned points_data_length = (points_data != shared_points_bytes) ? points_data->length : 0;
         if (!tuple.compile_tuple_var_header (axes_index_map, points_data_length, axes_old_index_tag_map,
-                                             shared_tuples_idx_map))
+                                             shared_tuples_idx_map,
+                                             pool))
           return false;
         compiled_byte_size += tuple.compiled_tuple_header.length + points_data_length + tuple.compiled_deltas.length;
       }
@@ -1330,8 +1428,9 @@
     {
       var_data_bytes = var_data_bytes_;
       var_data = var_data_bytes_.as ();
-      index = 0;
+      tuples_left = var_data->tupleVarCount.get_count ();
       axis_count = axis_count_;
+      axis_count_times_2 = axis_count_ * 2;
       current_tuple = &var_data->get_tuple_var_header ();
       data_offset = 0;
       table_base = table_base_;
@@ -1349,30 +1448,42 @@
       return true;
     }
 
-    bool is_valid () const
+    bool is_valid ()
     {
-      return (index < var_data->tupleVarCount.get_count ()) &&
-             var_data_bytes.check_range (current_tuple, TupleVariationHeader::min_size) &&
-             var_data_bytes.check_range (current_tuple, hb_max (current_tuple->get_data_size (),
-                                                                current_tuple->get_size (axis_count)));
+      if (unlikely (tuples_left <= 0))
+        return false;
+
+      current_tuple_size = TupleVariationHeader::min_size;
+      if (unlikely (!var_data_bytes.check_end ((const char *) current_tuple + current_tuple_size)))
+        return false;
+
+      current_tuple_size = current_tuple->get_size (axis_count_times_2);
+      if (unlikely (!var_data_bytes.check_end ((const char *) current_tuple + current_tuple_size)))
+        return false;
+
+      return true;
     }
 
+    HB_ALWAYS_INLINE
     bool move_to_next ()
     {
       data_offset += current_tuple->get_data_size ();
-      current_tuple = ¤t_tuple->get_next (axis_count);
-      index++;
+      current_tuple = &StructAtOffset (current_tuple, current_tuple_size);
+      tuples_left--;
       return is_valid ();
     }
 
+    // TODO: Make it return (sanitized) hb_bytes_t
     const HBUINT8 *get_serialized_data () const
     { return &(table_base+var_data->data) + data_offset; }
 
     private:
+    signed tuples_left;
     const TupleVariationData *var_data;
-    unsigned int index;
     unsigned int axis_count;
+    unsigned int axis_count_times_2;
     unsigned int data_offset;
+    unsigned int current_tuple_size;
     const void *table_base;
 
     public:
@@ -1411,7 +1522,7 @@
       if (unlikely (p + 1 > end)) return false;
       count = ((count & POINT_RUN_COUNT_MASK) << 8) | *p++;
     }
-    if (unlikely (!points.resize (count, false))) return false;
+    if (unlikely (!points.resize_dirty  (count))) return false;
 
     unsigned n = 0;
     unsigned i = 0;
@@ -1446,12 +1557,14 @@
   }
 
   template 
+  HB_ALWAYS_INLINE
   static bool decompile_deltas (const HBUINT8 *&p /* IN/OUT */,
                                 hb_vector_t &deltas /* IN/OUT */,
                                 const HBUINT8 *end,
-                                bool consume_all = false)
+                                bool consume_all = false,
+                                unsigned start = 0)
   {
-    return TupleValues::decompile (p, deltas, end, consume_all);
+    return TupleValues::decompile (p, deltas, end, consume_all, start);
   }
 
   bool has_data () const { return tupleVarCount; }
@@ -1463,6 +1576,7 @@
                                    const hb_vector_t &shared_indices,
                                    const hb_array_t shared_tuples,
                                    tuple_variations_t& tuple_variations, /* OUT */
+                                   hb_alloc_pool_t *pool = nullptr,
                                    bool is_composite_glyph = false) const
   {
     return tuple_variations.create_from_tuple_var_data (iterator, tupleVarCount,
@@ -1470,6 +1584,7 @@
                                                         axes_old_index_tag_map,
                                                         shared_indices,
                                                         shared_tuples,
+                                                        pool,
                                                         is_composite_glyph);
   }
 
@@ -1634,8 +1749,9 @@
   bool instantiate_tuple_vars (const hb_hashmap_t& normalized_axes_location,
                                const hb_hashmap_t& axes_triple_distances)
   {
+    optimize_scratch_t scratch;
     for (tuple_variations_t& tuple_vars : vars)
-      if (!tuple_vars.instantiate (normalized_axes_location, axes_triple_distances))
+      if (!tuple_vars.instantiate (normalized_axes_location, axes_triple_distances, scratch))
         return false;
 
     if (!build_region_list ()) return false;
@@ -1720,30 +1836,28 @@
 
   struct combined_gain_idx_tuple_t
   {
-    int gain;
-    unsigned idx_1;
-    unsigned idx_2;
+    uint64_t encoded;
 
     combined_gain_idx_tuple_t () = default;
-    combined_gain_idx_tuple_t (int gain_, unsigned i, unsigned j)
-        :gain (gain_), idx_1 (i), idx_2 (j) {}
+    combined_gain_idx_tuple_t (unsigned gain, unsigned i, unsigned j)
+        : encoded ((uint64_t (0xFFFFFF - gain) << 40) | (uint64_t (i) << 20) | uint64_t (j))
+    {
+      assert (gain < 0xFFFFFF);
+      assert (i < 0xFFFFFFF && j < 0xFFFFFFF);
+    }
 
     bool operator < (const combined_gain_idx_tuple_t& o)
     {
-      if (gain != o.gain)
-        return gain < o.gain;
-
-      if (idx_1 != o.idx_1)
-        return idx_1 < o.idx_1;
-
-      return idx_2 < o.idx_2;
+      return encoded < o.encoded;
     }
 
     bool operator <= (const combined_gain_idx_tuple_t& o)
     {
-      if (*this < o) return true;
-      return gain == o.gain && idx_1 == o.idx_1 && idx_2 == o.idx_2;
+      return encoded <= o.encoded;
     }
+
+    unsigned idx_1 () const { return (encoded >> 20) & 0xFFFFF; };
+    unsigned idx_2 () const { return encoded & 0xFFFFF; };
   };
 
   bool as_item_varstore (bool optimize=true, bool use_no_variation_idx=true)
@@ -1765,9 +1879,9 @@
     hb_hashmap_t*> front_mapping;
     unsigned start_row = 0;
     hb_vector_t encoding_objs;
-    hb_hashmap_t, unsigned> chars_idx_map;
 
     /* delta_rows map, used for filtering out duplicate rows */
+    hb_vector_t *> major_rows;
     hb_hashmap_t*, unsigned> delta_rows_map;
     for (unsigned major = 0; major < vars.length; major++)
     {
@@ -1775,6 +1889,9 @@
        * (row based) delta */
       const tuple_variations_t& tuples = vars[major];
       unsigned num_rows = var_data_num_rows[major];
+
+      if (!num_rows) continue;
+
       for (const tuple_delta_t& tuple: tuples.tuple_vars)
       {
         if (tuple.deltas_x.length != num_rows)
@@ -1789,24 +1906,11 @@
         {
           int rounded_delta = roundf (tuple.deltas_x[i]);
           delta_rows[start_row + i][*col_idx] += rounded_delta;
-          if ((!has_long) && (rounded_delta < -65536 || rounded_delta > 65535))
-            has_long = true;
+          has_long |= rounded_delta < -65536 || rounded_delta > 65535;
         }
       }
 
-      if (!optimize)
-      {
-        /* assemble a delta_row_encoding_t for this subtable, skip optimization so
-         * chars is not initialized, we only need delta rows for serialization */
-        delta_row_encoding_t obj;
-        for (unsigned r = start_row; r < start_row + num_rows; r++)
-          obj.add_row (&(delta_rows.arrayZ[r]));
-
-        encodings.push (std::move (obj));
-        start_row += num_rows;
-        continue;
-      }
-
+      major_rows.reset ();
       for (unsigned minor = 0; minor < num_rows; minor++)
       {
         const hb_vector_t& row = delta_rows[start_row + minor];
@@ -1828,42 +1932,40 @@
         if (!front_mapping.set ((major<<16) + minor, &row))
           return false;
 
-        hb_vector_t chars = delta_row_encoding_t::get_row_chars (row);
-        if (!chars) return false;
-
         if (delta_rows_map.has (&row))
           continue;
 
         delta_rows_map.set (&row, 1);
-        unsigned *obj_idx;
-        if (chars_idx_map.has (chars, &obj_idx))
-        {
-          delta_row_encoding_t& obj = encoding_objs[*obj_idx];
-          if (!obj.add_row (&row))
-            return false;
-        }
-        else
-        {
-          if (!chars_idx_map.set (chars, encoding_objs.length))
-            return false;
-          delta_row_encoding_t obj (std::move (chars), &row);
-          encoding_objs.push (std::move (obj));
-        }
+
+        major_rows.push (&row);
       }
 
+      if (major_rows)
+        encoding_objs.push (delta_row_encoding_t (std::move (major_rows), num_cols));
+
       start_row += num_rows;
     }
 
     /* return directly if no optimization, maintain original VariationIndex so
      * varidx_map would be empty */
-    if (!optimize) return !encodings.in_error ();
+    if (!optimize)
+    {
+      encodings = std::move (encoding_objs);
+      return !encodings.in_error ();
+    }
+
+    /* NOTE: Fonttools instancer always optimizes VarStore from scratch. This
+     * is too costly for large fonts. So, instead, we retain the encodings of
+     * the original VarStore, and just try to combine them if possible. This
+     * is a compromise between optimization and performance and practically
+     * works very well. */
 
-    /* sort encoding_objs */
+    // This produces slightly smaller results in some cases.
     encoding_objs.qsort ();
 
-    /* main algorithm: repeatedly pick 2 best encodings to combine, and combine
-     * them */
-    hb_priority_queue_t queue;
+    /* main algorithm: repeatedly pick 2 best encodings to combine, and combine them */
+    using item_t = hb_priority_queue_t::item_t;
+    hb_vector_t queue_items;
     unsigned num_todos = encoding_objs.length;
     for (unsigned i = 0; i < num_todos; i++)
     {
@@ -1871,16 +1973,18 @@
       {
         int combining_gain = encoding_objs.arrayZ[i].gain_from_merging (encoding_objs.arrayZ[j]);
         if (combining_gain > 0)
-          queue.insert (combined_gain_idx_tuple_t (-combining_gain, i, j), 0);
+          queue_items.push (item_t (combined_gain_idx_tuple_t (combining_gain, i, j), 0));
       }
     }
 
-    hb_set_t removed_todo_idxes;
+    hb_priority_queue_t queue (std::move (queue_items));
+
+    hb_bit_set_t removed_todo_idxes;
     while (queue)
     {
       auto t = queue.pop_minimum ().first;
-      unsigned i = t.idx_1;
-      unsigned j = t.idx_2;
+      unsigned i = t.idx_1 ();
+      unsigned j = t.idx_2 ();
 
       if (removed_todo_idxes.has (i) || removed_todo_idxes.has (j))
         continue;
@@ -1891,40 +1995,36 @@
       removed_todo_idxes.add (i);
       removed_todo_idxes.add (j);
 
-      hb_vector_t combined_chars;
-      if (!combined_chars.alloc (encoding.chars.length))
-        return false;
-
-      for (unsigned idx = 0; idx < encoding.chars.length; idx++)
-      {
-        uint8_t v = hb_max (encoding.chars.arrayZ[idx], other_encoding.chars.arrayZ[idx]);
-        combined_chars.push (v);
-      }
-
-      delta_row_encoding_t combined_encoding_obj (std::move (combined_chars));
-      for (const auto& row : hb_concat (encoding.items, other_encoding.items))
-        combined_encoding_obj.add_row (row);
+      encoding.merge (other_encoding);
 
       for (unsigned idx = 0; idx < encoding_objs.length; idx++)
       {
         if (removed_todo_idxes.has (idx)) continue;
 
         const delta_row_encoding_t& obj = encoding_objs.arrayZ[idx];
-        if (obj.chars == combined_chars)
+        // In the unlikely event that the same encoding exists already, combine it.
+        if (obj.width == encoding.width && obj.chars == encoding.chars)
         {
+          // This is straight port from fonttools algorithm. I added this branch there
+          // because I thought it can happen. But looks like we never get in here in
+          // practice. I'm not confident enough to remove it though; in theory it can
+          // happen. I think it's just that our tests are not extensive enough to hit
+          // this path.
+
           for (const auto& row : obj.items)
-            combined_encoding_obj.add_row (row);
+            encoding.add_row (row);
 
           removed_todo_idxes.add (idx);
           continue;
         }
 
-        int combined_gain = combined_encoding_obj.gain_from_merging (obj);
+        int combined_gain = encoding.gain_from_merging (obj);
         if (combined_gain > 0)
-          queue.insert (combined_gain_idx_tuple_t (-combined_gain, idx, encoding_objs.length), 0);
+          queue.insert (combined_gain_idx_tuple_t (combined_gain, idx, encoding_objs.length), 0);
       }
 
-      encoding_objs.push (std::move (combined_encoding_obj));
+      auto moved_encoding = std::move (encoding);
+      encoding_objs.push (moved_encoding);
     }
 
     int num_final_encodings = (int) encoding_objs.length - (int) removed_todo_idxes.get_population ();
@@ -1937,9 +2037,6 @@
       encodings.push (std::move (encoding_objs.arrayZ[i]));
     }
 
-    /* sort again based on width, make result deterministic */
-    encodings.qsort (delta_row_encoding_t::cmp_width);
-
     return compile_varidx_map (front_mapping);
   }
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-var-cvar-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var-cvar-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-var-cvar-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var-cvar-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -84,7 +84,7 @@
     if (!coords) return true;
     hb_vector_t shared_indices;
     TupleVariationData<>::tuple_iterator_t iterator;
-    unsigned var_data_length = tuple_var_data->get_size (axis_count);
+    unsigned var_data_length = tuple_var_data->get_size (axis_count * 2);
     hb_bytes_t var_data_bytes = hb_bytes_t (reinterpret_cast (tuple_var_data), var_data_length);
     if (!TupleVariationData<>::get_tuple_iterator (var_data_bytes, axis_count, base,
                                                  shared_indices, &iterator))
@@ -113,7 +113,7 @@
 
       bool apply_to_all = (indices.length == 0);
       unsigned num_deltas = apply_to_all ? num_cvt_item : indices.length;
-      if (unlikely (!unpacked_deltas.resize (num_deltas, false))) return false;
+      if (unlikely (!unpacked_deltas.resize_dirty  (num_deltas))) return false;
       if (unlikely (!TupleVariationData<>::decompile_deltas (p, unpacked_deltas, end))) return false;
 
       for (unsigned int i = 0; i < num_deltas; i++)
@@ -158,7 +158,8 @@
                                      tuple_variations))
       return_trace (false);
 
-    if (!tuple_variations.instantiate (c->plan->axes_location, c->plan->axes_triple_distances))
+    optimize_scratch_t scratch;
+    if (!tuple_variations.instantiate (c->plan->axes_location, c->plan->axes_triple_distances, scratch))
       return_trace (false);
 
     if (!tuple_variations.compile_bytes (c->plan->axes_index_map, c->plan->axes_old_index_tag_map,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-var-fvar-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var-fvar-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-var-fvar-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var-fvar-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -179,7 +179,7 @@
 
   hb_tag_t get_axis_tag () const { return axisTag; }
 
-  int normalize_axis_value (float v) const
+  float normalize_axis_value (float v) const
   {
     float min_value, default_value, max_value;
     get_coordinates (min_value, default_value, max_value);
@@ -189,23 +189,9 @@
     if (v == default_value)
       return 0;
     else if (v < default_value)
-      v = (v - default_value) / (default_value - min_value);
+      return (v - default_value) / (default_value - min_value);
     else
-      v = (v - default_value) / (max_value - default_value);
-    return roundf (v * 16384.f);
-  }
-
-  float unnormalize_axis_value (int v) const
-  {
-    float min_value, default_value, max_value;
-    get_coordinates (min_value, default_value, max_value);
-
-    if (v == 0)
-      return default_value;
-    else if (v < 0)
-      return v * (default_value - min_value) / 16384.f + default_value;
-    else
-      return v * (max_value - default_value) / 16384.f + default_value;
+      return (v - default_value) / (max_value - default_value);
   }
 
   hb_ot_name_id_t get_name_id () const { return axisNameID; }
@@ -341,12 +327,9 @@
     return axes.lfind (tag, &i) && ((void) axes[i].get_axis_info (i, info), true);
   }
 
-  int normalize_axis_value (unsigned int axis_index, float v) const
+  float normalize_axis_value (unsigned int axis_index, float v) const
   { return get_axes ()[axis_index].normalize_axis_value (v); }
 
-  float unnormalize_axis_value (unsigned int axis_index, int v) const
-  { return get_axes ()[axis_index].unnormalize_axis_value (v); }
-
   unsigned int get_instance_count () const { return instanceCount; }
 
   hb_ot_name_id_t get_instance_subfamily_name_id (unsigned int instance_index) const
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-var-gvar-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var-gvar-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-var-gvar-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var-gvar-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -66,12 +66,14 @@
 
   hb_vector_t glyph_variations;
 
-  hb_vector_t compiled_shared_tuples;
+  hb_vector_t compiled_shared_tuples;
   private:
   unsigned shared_tuples_count = 0;
 
   /* shared coords-> index map after instantiation */
-  hb_hashmap_t*, unsigned> shared_tuples_idx_map;
+  hb_hashmap_t*, unsigned> shared_tuples_idx_map;
+
+  hb_alloc_pool_t pool;
 
   public:
   unsigned compiled_shared_tuples_count () const
@@ -128,6 +130,7 @@
                                           iterator, &(plan->axes_old_index_tag_map),
                                           shared_indices, shared_tuples,
                                           tuple_vars, /* OUT */
+                                          &pool,
                                           is_composite_glyph))
         return false;
       glyph_variations.push (std::move (tuple_vars));
@@ -139,6 +142,7 @@
   {
     unsigned count = plan->new_to_old_gid_list.length;
     bool iup_optimize = false;
+    optimize_scratch_t scratch;
     iup_optimize = plan->flags & HB_SUBSET_FLAGS_OPTIMIZE_IUP_DELTAS;
     for (unsigned i = 0; i < count; i++)
     {
@@ -146,7 +150,7 @@
       contour_point_vector_t *all_points;
       if (!plan->new_gid_contour_points_map.has (new_gid, &all_points))
         return false;
-      if (!glyph_variations[i].instantiate (plan->axes_location, plan->axes_triple_distances, all_points, iup_optimize))
+      if (!glyph_variations[i].instantiate (plan->axes_location, plan->axes_triple_distances, scratch, &pool, all_points, iup_optimize))
         return false;
     }
     return true;
@@ -161,7 +165,8 @@
       if (!vars.compile_bytes (axes_index_map, axes_old_index_tag_map,
                                true, /* use shared points*/
                                true,
-                               &shared_tuples_idx_map))
+                               &shared_tuples_idx_map,
+                               &pool))
         return false;
 
     return true;
@@ -172,20 +177,21 @@
   {
     /* key is pointer to compiled_peak_coords inside each tuple, hashing
      * function will always deref pointers first */
-    hb_hashmap_t*, unsigned> coords_count_map;
+    hb_hashmap_t*, unsigned> coords_count_map;
 
     /* count the num of shared coords */
     for (tuple_variations_t& vars: glyph_variations)
     {
       for (tuple_delta_t& var : vars.tuple_vars)
       {
-        if (!var.compile_peak_coords (axes_index_map, axes_old_index_tag_map))
+        if (!var.compile_coords (axes_index_map, axes_old_index_tag_map, &pool))
           return false;
-        unsigned* count;
-        if (coords_count_map.has (&(var.compiled_peak_coords), &count))
-          coords_count_map.set (&(var.compiled_peak_coords), *count + 1);
+        unsigned *count;
+        unsigned hash = hb_hash (&var.compiled_peak_coords);
+        if (coords_count_map.has_with_hash (&(var.compiled_peak_coords), hash, &count))
+          (*count)++;
         else
-          coords_count_map.set (&(var.compiled_peak_coords), 1);
+          coords_count_map.set_with_hash (&(var.compiled_peak_coords), hash, 1);
       }
     }
 
@@ -193,66 +199,45 @@
       return false;
 
     /* add only those coords that are used more than once into the vector and sort */
-    hb_vector_t*> shared_coords;
-    if (unlikely (!shared_coords.alloc (coords_count_map.get_population ())))
-      return false;
-
-    for (const auto _ : coords_count_map.iter ())
-    {
-      if (_.second == 1) continue;
-      shared_coords.push (_.first);
-    }
+    hb_vector_t*, unsigned>> shared_coords {
+      + hb_iter (coords_count_map)
+      | hb_filter ([] (const hb_pair_t*, unsigned>& p) { return p.second > 1; })
+    };
+    if (unlikely (shared_coords.in_error ())) return false;
 
     /* no shared tuples: no coords are used more than once */
     if (!shared_coords) return true;
     /* sorting based on the coords frequency first (high to low), then compare
      * the coords bytes */
-    hb_qsort (shared_coords.arrayZ, shared_coords.length, sizeof (hb_vector_t*), _cmp_coords, (void *) (&coords_count_map));
+    shared_coords.qsort (_cmp_coords);
 
     /* build shared_coords->idx map and shared tuples byte array */
 
     shared_tuples_count = hb_min (0xFFFu + 1, shared_coords.length);
-    unsigned len = shared_tuples_count * (shared_coords[0]->length);
+    unsigned len = shared_tuples_count * (shared_coords[0].first->length);
     if (unlikely (!compiled_shared_tuples.alloc (len)))
       return false;
 
     for (unsigned i = 0; i < shared_tuples_count; i++)
     {
-      shared_tuples_idx_map.set (shared_coords[i], i);
+      shared_tuples_idx_map.set (shared_coords[i].first, i);
       /* add a concat() in hb_vector_t? */
-      for (char c : shared_coords[i]->iter ())
+      for (auto c : shared_coords[i].first->iter ())
         compiled_shared_tuples.push (c);
     }
 
     return true;
   }
 
-  static int _cmp_coords (const void *pa, const void *pb, void *arg)
+  static int _cmp_coords (const void *pa, const void *pb)
   {
-    const hb_hashmap_t*, unsigned>* coords_count_map =
-        reinterpret_cast*, unsigned>*> (arg);
-
-    /* shared_coords is hb_vector_t*> so casting pa/pb
-     * to be a pointer to a pointer */
-    const hb_vector_t** a = reinterpret_cast**> (const_cast(pa));
-    const hb_vector_t** b = reinterpret_cast**> (const_cast(pb));
-
-    bool has_a = coords_count_map->has (*a);
-    bool has_b = coords_count_map->has (*b);
-
-    if (has_a && has_b)
-    {
-      unsigned a_num = coords_count_map->get (*a);
-      unsigned b_num = coords_count_map->get (*b);
+    const hb_pair_t *, unsigned> *a = (const hb_pair_t *, unsigned> *) pa;
+    const hb_pair_t *, unsigned> *b = (const hb_pair_t *, unsigned> *) pb;
 
-      if (a_num != b_num)
-        return b_num - a_num;
+    if (a->second != b->second)
+      return b->second - a->second; // high to low
 
-      return (*b)->as_array().cmp ((*a)->as_array ());
-    }
-    else if (has_a) return -1;
-    else if (has_b) return 1;
-    else return 0;
+    return b->first->as_array().cmp (a->first->as_array ());
   }
 
   templatesharedTuples = 0;
     else
     {
-      hb_array_t shared_tuples = glyph_vars.compiled_shared_tuples.as_array ().copy (c);
+      hb_array_t shared_tuples = glyph_vars.compiled_shared_tuples.as_array ().copy (c);
       if (!shared_tuples.arrayZ) return_trace (false);
-      out->sharedTuples = shared_tuples.arrayZ - (char *) out;
+      out->sharedTuples = (const char *) shared_tuples.arrayZ - (char *) out;
     }
 
     char *glyph_var_data = c->start_embed ();
@@ -463,10 +448,18 @@
     if (it->first == 0 && !(c->plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE))
       it++;
     unsigned int subset_data_size = 0;
+    unsigned padding_size = 0;
     for (auto &_ : it)
     {
       hb_codepoint_t old_gid = _.second;
-      subset_data_size += get_glyph_var_data_bytes (c->source_blob, glyph_count, old_gid).length;
+      unsigned glyph_data_size = get_glyph_var_data_bytes (c->source_blob, glyph_count, old_gid).length;
+      if (glyph_data_size % 2)
+      {
+        glyph_data_size++;
+        padding_size++;
+      }
+
+      subset_data_size += glyph_data_size;
     }
 
     /* According to the spec: If the short format (Offset16) is used for offsets,
@@ -495,6 +488,8 @@
 
     /* This ordering relative to the shared tuples array, which puts the glyphVariationData
        last in the table, is required when HB_SUBSET_FLAGS_IFTB_REQUIREMENTS is set */
+    if (long_offset)
+      subset_data_size -= padding_size;
     char *subset_data = c->serializer->allocate_size (subset_data_size, false);
     if (!subset_data) return_trace (false);
     out->dataZ = subset_data - (char *) out;
@@ -533,8 +528,16 @@
                                                             old_gid);
 
       hb_memcpy (subset_data, var_data_bytes.arrayZ, var_data_bytes.length);
-      subset_data += var_data_bytes.length;
-      glyph_offset += var_data_bytes.length;
+      unsigned glyph_data_size = var_data_bytes.length;
+      subset_data += glyph_data_size;
+      glyph_offset += glyph_data_size;
+
+      if (!long_offset && (glyph_data_size % 2))
+      {
+        *subset_data = 0;
+        subset_data++;
+        glyph_offset++;
+      }
 
       if (long_offset)
         ((HBUINT32 *) subset_offsets)[gid] = glyph_offset;
@@ -582,6 +585,17 @@
   public:
   struct accelerator_t
   {
+
+    hb_scalar_cache_t *create_cache () const
+    {
+      return hb_scalar_cache_t::create (table->sharedTupleCount);
+    }
+
+    static void destroy_cache (hb_scalar_cache_t *cache)
+    {
+      hb_scalar_cache_t::destroy (cache);
+    }
+
     bool has_data () const { return table->has_data (); }
 
     accelerator_t (hb_face_t *face)
@@ -589,36 +603,6 @@
       table = hb_sanitize_context_t ().reference_table (face);
       /* If sanitize failed, set glyphCount to 0. */
       glyphCount = table->version.to_int () ? face->get_num_glyphs () : 0;
-
-      /* For shared tuples that only have one or two axes active, shared the index
-       * of that axis as a cache. This will speed up caclulate_scalar() a lot
-       * for fonts with lots of axes and many "monovar" or "duovar" tuples. */
-      hb_array_t shared_tuples = (table+table->sharedTuples).as_array (table->sharedTupleCount * table->axisCount);
-      unsigned count = table->sharedTupleCount;
-      if (unlikely (!shared_tuple_active_idx.resize (count, false))) return;
-      unsigned axis_count = table->axisCount;
-      for (unsigned i = 0; i < count; i++)
-      {
-        hb_array_t tuple = shared_tuples.sub_array (axis_count * i, axis_count);
-        int idx1 = -1, idx2 = -1;
-        for (unsigned j = 0; j < axis_count; j++)
-        {
-          const F2DOT14 &peak = tuple.arrayZ[j];
-          if (peak.to_int () != 0)
-          {
-            if (idx1 == -1)
-              idx1 = j;
-            else if (idx2 == -1)
-              idx2 = j;
-            else
-            {
-              idx1 = idx2 = -1;
-              break;
-            }
-          }
-        }
-        shared_tuple_active_idx.arrayZ[i] = {idx1, idx2};
-      }
     }
     ~accelerator_t () { table.destroy (); }
 
@@ -655,6 +639,7 @@
                                  hb_array_t coords,
                                  const hb_array_t points,
                                  hb_glyf_scratch_t &scratch,
+                                 hb_scalar_cache_t *gvar_cache = nullptr,
                                  bool phantom_only = false) const
     {
       if (unlikely (glyph >= glyphCount)) return true;
@@ -690,10 +675,12 @@
 
       unsigned count = points.length;
       bool flush = false;
+
       do
       {
         float scalar = iterator.current_tuple->calculate_scalar (coords, num_coords, shared_tuples,
-                                                                 &shared_tuple_active_idx);
+                                                                 gvar_cache);
+
         if (scalar == 0.f) continue;
         const HBUINT8 *p = iterator.get_serialized_data ();
         unsigned int length = iterator.current_tuple->get_data_size ();
@@ -702,7 +689,7 @@
 
         if (!deltas)
         {
-          if (unlikely (!deltas_vec.resize (count, false))) return false;
+          if (unlikely (!deltas_vec.resize_dirty  (count))) return false;
           deltas = deltas_vec.as_array ();
           hb_memset (deltas.arrayZ + (phantom_only ? count - 4 : 0), 0,
                      (phantom_only ? 4 : count) * sizeof (deltas[0]));
@@ -717,11 +704,12 @@
         const hb_array_t &indices = has_private_points ? private_indices : shared_indices;
 
         bool apply_to_all = (indices.length == 0);
-        unsigned int num_deltas = apply_to_all ? points.length : indices.length;
-        if (unlikely (!x_deltas.resize (num_deltas, false))) return false;
-        if (unlikely (!GlyphVariationData::decompile_deltas (p, x_deltas, end))) return false;
-        if (unlikely (!y_deltas.resize (num_deltas, false))) return false;
-        if (unlikely (!GlyphVariationData::decompile_deltas (p, y_deltas, end))) return false;
+        unsigned num_deltas = apply_to_all ? points.length : indices.length;
+        unsigned start_deltas = (apply_to_all && phantom_only && num_deltas >= 4 ? num_deltas - 4 : 0);
+        if (unlikely (!x_deltas.resize_dirty  (num_deltas))) return false;
+        if (unlikely (!GlyphVariationData::decompile_deltas (p, x_deltas, end, false, start_deltas))) return false;
+        if (unlikely (!y_deltas.resize_dirty  (num_deltas))) return false;
+        if (unlikely (!GlyphVariationData::decompile_deltas (p, y_deltas, end, false, start_deltas))) return false;
 
         if (!apply_to_all)
         {
@@ -884,7 +872,6 @@
     private:
     hb_blob_ptr_t table;
     unsigned glyphCount;
-    hb_vector_t> shared_tuple_active_idx;
   };
 
   protected:
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-var-hvar-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var-hvar-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-var-hvar-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var-hvar-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -42,57 +42,62 @@
     VORG_INDEX
   };
 
-  void init (const DeltaSetIndexMap  &index_map,
+  void init (const DeltaSetIndexMap  *index_map,
              hb_inc_bimap_t          &outer_map,
              hb_vector_t &inner_sets,
              const hb_subset_plan_t  *plan,
              bool bypass_empty = true)
   {
     map_count = 0;
-    outer_bit_count = 0;
-    inner_bit_count = 1;
     max_inners.init ();
     output_map.init ();
 
-    if (bypass_empty && !index_map.get_map_count ()) return;
+    if (bypass_empty && (!index_map || !index_map->get_map_count ())) return;
 
     unsigned int        last_val = (unsigned int)-1;
     hb_codepoint_t      last_gid = HB_CODEPOINT_INVALID;
 
-    outer_bit_count = (index_map.get_width () * 8) - index_map.get_inner_bit_count ();
     max_inners.resize (inner_sets.length);
     for (unsigned i = 0; i < inner_sets.length; i++) max_inners[i] = 0;
 
     /* Search backwards for a map value different from the last map value */
     auto &new_to_old_gid_list = plan->new_to_old_gid_list;
     unsigned count = new_to_old_gid_list.length;
-    for (unsigned j = count; j; j--)
+    if (!index_map)
     {
-      hb_codepoint_t gid = new_to_old_gid_list.arrayZ[j - 1].first;
-      hb_codepoint_t old_gid = new_to_old_gid_list.arrayZ[j - 1].second;
-
-      unsigned int v = index_map.map (old_gid);
-      if (last_gid == HB_CODEPOINT_INVALID)
+      map_count = new_to_old_gid_list.tail ().first + 1;
+    }
+    else
+    {
+      for (unsigned j = count; j; j--)
       {
+        hb_codepoint_t gid = new_to_old_gid_list.arrayZ[j - 1].first;
+        hb_codepoint_t old_gid = new_to_old_gid_list.arrayZ[j - 1].second;
+
+        unsigned int v = index_map->map (old_gid);
+        if (last_gid == HB_CODEPOINT_INVALID)
+        {
         last_val = v;
         last_gid = gid;
         continue;
-      }
-      if (v != last_val)
+        }
+        if (v != last_val)
         break;
 
-      last_gid = gid;
+        last_gid = gid;
+      }
+
+      if (unlikely (last_gid == (hb_codepoint_t)-1)) return;
+      map_count = last_gid + 1;
     }
 
-    if (unlikely (last_gid == (hb_codepoint_t)-1)) return;
-    map_count = last_gid + 1;
     for (auto _ : plan->new_to_old_gid_list)
     {
       hb_codepoint_t gid = _.first;
       if (gid >= map_count) break;
 
       hb_codepoint_t old_gid = _.second;
-      unsigned int v = index_map.map (old_gid);
+      unsigned int v = index_map ? index_map->map (old_gid): old_gid;
       unsigned int outer = v >> 16;
       unsigned int inner = v & 0xFFFF;
       outer_map.add (outer);
@@ -113,6 +118,9 @@
               const hb_vector_t &inner_maps,
               const hb_subset_plan_t *plan)
   {
+    outer_bit_count = 1;
+    inner_bit_count = 1;
+
     for (unsigned int i = 0; i < max_inners.length; i++)
     {
       if (inner_maps[i].get_population () == 0) continue;
@@ -128,9 +136,13 @@
 
       if (unlikely (new_gid >= map_count)) break;
 
-      uint32_t v = input_map->map (old_gid);
-      unsigned int outer = v >> 16;
-      output_map.arrayZ[new_gid] = (outer_map[outer] << 16) | (inner_maps[outer][v & 0xFFFF]);
+      uint32_t v = input_map? input_map->map (old_gid) : old_gid;
+      unsigned outer = v >> 16;
+      unsigned new_outer = outer_map[outer];
+      unsigned bit_count = (new_outer == 0) ? 1 : hb_bit_storage (new_outer);
+      outer_bit_count = hb_max (bit_count, outer_bit_count);
+
+      output_map.arrayZ[new_gid] = (new_outer << 16) | (inner_maps[outer][v & 0xFFFF]);
     }
   }
 
@@ -204,8 +216,8 @@
     if (unlikely (!index_map_plans.length || !inner_sets.length || !inner_maps.length)) return;
 
     bool retain_adv_map = false;
-    index_map_plans[0].init (*index_maps[0], outer_map, inner_sets, plan, false);
-    if (index_maps[0] == &Null (DeltaSetIndexMap))
+    index_map_plans[0].init (index_maps[0], outer_map, inner_sets, plan, false);
+    if (!index_maps[0])
     {
       retain_adv_map = plan->flags & HB_SUBSET_FLAGS_RETAIN_GIDS;
       outer_map.add (0);
@@ -215,7 +227,7 @@
     }
 
     for (unsigned int i = 1; i < index_maps.length; i++)
-      index_map_plans[i].init (*index_maps[i], outer_map, inner_sets, plan);
+      index_map_plans[i].init (index_maps[i], outer_map, inner_sets, plan);
 
     outer_map.sort ();
 
@@ -284,6 +296,8 @@
   static constexpr hb_tag_t HVARTag = HB_OT_TAG_HVAR;
   static constexpr hb_tag_t VVARTag = HB_OT_TAG_VVAR;
 
+  bool has_data () const { return version.major != 0; }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -301,9 +315,14 @@
 
   void listup_index_maps (hb_vector_t &index_maps) const
   {
-    index_maps.push (&(this+advMap));
-    index_maps.push (&(this+lsbMap));
-    index_maps.push (&(this+rsbMap));
+    if (advMap) index_maps.push (&(this+advMap));
+    else index_maps.push (nullptr);
+
+    if (lsbMap) index_maps.push (&(this+lsbMap));
+    else index_maps.push (nullptr);
+
+    if (rsbMap) index_maps.push (&(this+rsbMap));
+    else index_maps.push (nullptr);
   }
 
   bool serialize_index_maps (hb_serialize_context_t *c,
@@ -382,9 +401,10 @@
                                                 hvar_plan.index_map_plans.as_array ()));
   }
 
+  HB_ALWAYS_INLINE
   float get_advance_delta_unscaled (hb_codepoint_t  glyph,
                                     const int *coords, unsigned int coord_count,
-                                    ItemVariationStore::cache_t *store_cache = nullptr) const
+                                    hb_scalar_cache_t *store_cache = nullptr) const
   {
     uint32_t varidx = (this+advMap).map (glyph);
     return (this+varStore).get_delta (varidx,
@@ -392,16 +412,6 @@
                                       store_cache);
   }
 
-  bool get_lsb_delta_unscaled (hb_codepoint_t glyph,
-                               const int *coords, unsigned int coord_count,
-                               float *lsb) const
-  {
-    if (!lsbMap) return false;
-    uint32_t varidx = (this+lsbMap).map (glyph);
-    *lsb = (this+varStore).get_delta (varidx, coords, coord_count);
-    return true;
-  }
-
   public:
   FixedVersion<>version;        /* Version of the metrics variation table
                                  * initially set to 0x00010000u */
@@ -435,7 +445,8 @@
   void listup_index_maps (hb_vector_t &index_maps) const
   {
     HVARVVAR::listup_index_maps (index_maps);
-    index_maps.push (&(this+vorgMap));
+    if (vorgMap) index_maps.push (&(this+vorgMap));
+    else index_maps.push (nullptr);
   }
 
   bool serialize_index_maps (hb_serialize_context_t *c,
@@ -454,14 +465,16 @@
 
   bool subset (hb_subset_context_t *c) const { return HVARVVAR::_subset (c); }
 
-  bool get_vorg_delta_unscaled (hb_codepoint_t glyph,
-                                const int *coords, unsigned int coord_count,
-                                float *delta) const
+  HB_ALWAYS_INLINE
+  float get_vorg_delta_unscaled (hb_codepoint_t glyph,
+                                 const int *coords, unsigned int coord_count,
+                                 hb_scalar_cache_t *store_cache = nullptr) const
   {
-    if (!vorgMap) return false;
+    if (!vorgMap) return 0.f;
     uint32_t varidx = (this+vorgMap).map (glyph);
-    *delta = (this+varStore).get_delta (varidx, coords, coord_count);
-    return true;
+    return (this+varStore).get_delta (varidx,
+                                      coords, coord_count,
+                                      store_cache);
   }
 
   protected:
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-var.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-var.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-var.cc	2026-04-17 19:09:35.000000000 +0000
@@ -286,10 +286,14 @@
     hb_ot_var_axis_info_t info;
     if (hb_ot_var_find_axis_info (face, variations[i].tag, &info) &&
         info.axis_index < coords_length)
-      coords[info.axis_index] = fvar.normalize_axis_value (info.axis_index, variations[i].value);
+      coords[info.axis_index] = roundf (fvar.normalize_axis_value (info.axis_index, variations[i].value) * 65536.0f);
   }
 
-  face->table.avar->map_coords (coords, coords_length);
+  face->table.avar->map_coords_16_16 (coords, coords_length);
+
+  // Round to 2.14
+  for (unsigned i = 0; i < coords_length; i++)
+    coords[i] = (coords[i] + 2) >> 2;
 }
 
 /**
@@ -309,6 +313,10 @@
  * Any additional scaling defined in the face's `avar` table is also
  * applied, as described at https://docs.microsoft.com/en-us/typography/opentype/spec/avar
  *
+ * Note: @coords_length must be the same as the number of axes in the face, as
+ * for example returned by hb_ot_var_get_axis_count().
+ * Otherwise, the behavior is undefined.
+ *
  * Since: 1.4.2
  **/
 void
@@ -319,9 +327,13 @@
 {
   const OT::fvar &fvar = *face->table.fvar;
   for (unsigned int i = 0; i < coords_length; i++)
-    normalized_coords[i] = fvar.normalize_axis_value (i, design_coords[i]);
+    normalized_coords[i] = roundf (fvar.normalize_axis_value (i, design_coords[i]) * 65536.0f);
+
+  face->table.avar->map_coords_16_16 (normalized_coords, coords_length);
 
-  face->table.avar->map_coords (normalized_coords, coords_length);
+  // Round to 2.14
+  for (unsigned i = 0; i < coords_length; i++)
+    normalized_coords[i] = (normalized_coords[i] + 2) >> 2;
 }
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-vorg-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-vorg-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ot-vorg-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ot-vorg-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -61,6 +61,7 @@
 
   bool has_data () const { return version.to_int (); }
 
+  HB_ALWAYS_INLINE
   int get_y_origin (hb_codepoint_t glyph) const
   {
     unsigned int i;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-outline.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-outline.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-outline.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-outline.cc	2026-04-17 19:09:35.000000000 +0000
@@ -84,6 +84,15 @@
   }
 }
 
+void hb_outline_t::translate (float dx, float dy)
+{
+  for (auto &p : points)
+  {
+    p.x += dx;
+    p.y += dy;
+  }
+}
+
 void hb_outline_t::slant (float slant_xy)
 {
   for (auto &p : points)
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-outline.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-outline.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-outline.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-outline.hh	2026-04-17 19:09:35.000000000 +0000
@@ -69,6 +69,7 @@
 
   HB_INTERNAL void replay (hb_draw_funcs_t *pen, void *pen_data) const;
   HB_INTERNAL float control_area () const;
+  HB_INTERNAL void translate (float dx, float dy);
   HB_INTERNAL void slant (float slant_xy);
   HB_INTERNAL void embolden (float x_strength, float y_strength,
                              float x_shift, float y_shift);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-paint-extents.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-paint-extents.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-paint-extents.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-paint-extents.cc	2026-04-17 19:09:35.000000000 +0000
@@ -49,7 +49,7 @@
 {
   hb_paint_extents_context_t *c = (hb_paint_extents_context_t *) paint_data;
 
-  c->push_transform (hb_transform_t {xx, yx, xy, yy, dx, dy});
+  c->push_transform (hb_transform_t<> {xx, yx, xy, yy, dx, dy});
 }
 
 static void
@@ -71,7 +71,7 @@
 {
   hb_paint_extents_context_t *c = (hb_paint_extents_context_t *) paint_data;
 
-  hb_extents_t extents;
+  hb_extents_t<> extents;
   hb_draw_funcs_t *draw_extent_funcs = hb_draw_extents_get_funcs ();
   hb_font_draw_glyph (font, glyph, draw_extent_funcs, &extents);
   c->push_clip (extents);
@@ -85,7 +85,7 @@
 {
   hb_paint_extents_context_t *c = (hb_paint_extents_context_t *) paint_data;
 
-  hb_extents_t extents = {xmin, ymin, xmax, ymax};
+  hb_extents_t<> extents = {xmin, ymin, xmax, ymax};
   c->push_clip (extents);
 }
 
@@ -136,10 +136,10 @@
   if (!glyph_extents)
     return false; // Happens with SVG images.
 
-  hb_extents_t extents = {(float) glyph_extents->x_bearing,
-                          (float) glyph_extents->y_bearing + glyph_extents->height,
-                          (float) glyph_extents->x_bearing + glyph_extents->width,
-                          (float) glyph_extents->y_bearing};
+  hb_extents_t<> extents = {(float) glyph_extents->x_bearing,
+                            (float) glyph_extents->y_bearing + glyph_extents->height,
+                            (float) glyph_extents->x_bearing + glyph_extents->width,
+                            (float) glyph_extents->y_bearing};
   c->push_clip (extents);
   c->paint ();
   c->pop_clip ();
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-paint-extents.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-paint-extents.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-paint-extents.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-paint-extents.hh	2026-04-17 19:09:35.000000000 +0000
@@ -41,9 +41,9 @@
     clips.clear ();
     groups.clear ();
 
-    transforms.push (hb_transform_t{});
-    clips.push (hb_bounds_t{hb_bounds_t::UNBOUNDED});
-    groups.push (hb_bounds_t{hb_bounds_t::EMPTY});
+    transforms.push (hb_transform_t<>{});
+    clips.push (hb_bounds_t<>{hb_bounds_t<>::UNBOUNDED});
+    groups.push (hb_bounds_t<>{hb_bounds_t<>::EMPTY});
   }
 
   hb_paint_extents_context_t ()
@@ -51,19 +51,19 @@
     clear ();
   }
 
-  hb_extents_t get_extents ()
+  hb_extents_t<> get_extents ()
   {
     return groups.tail().extents;
   }
 
   bool is_bounded ()
   {
-    return groups.tail().status != hb_bounds_t::UNBOUNDED;
+    return groups.tail().status != hb_bounds_t<>::UNBOUNDED;
   }
 
-  void push_transform (const hb_transform_t &trans)
+  void push_transform (const hb_transform_t<> &trans)
   {
-    hb_transform_t t = transforms.tail ();
+    hb_transform_t<> t = transforms.tail ();
     t.multiply (trans);
     transforms.push (t);
   }
@@ -73,13 +73,13 @@
     transforms.pop ();
   }
 
-  void push_clip (hb_extents_t extents)
+  void push_clip (hb_extents_t<> extents)
   {
     /* Transform extents and push a new clip. */
-    const hb_transform_t &t = transforms.tail ();
+    const hb_transform_t<> &t = transforms.tail ();
     t.transform_extents (extents);
 
-    auto bounds = hb_bounds_t {extents};
+    auto bounds = hb_bounds_t<> {extents};
     bounds.intersect (clips.tail ());
 
     clips.push (bounds);
@@ -92,19 +92,19 @@
 
   void push_group ()
   {
-    groups.push (hb_bounds_t {hb_bounds_t::EMPTY});
+    groups.push (hb_bounds_t<> {hb_bounds_t<>::EMPTY});
   }
 
   void pop_group (hb_paint_composite_mode_t mode)
   {
-    const hb_bounds_t src_bounds = groups.pop ();
-    hb_bounds_t &backdrop_bounds = groups.tail ();
+    const hb_bounds_t<> src_bounds = groups.pop ();
+    hb_bounds_t<> &backdrop_bounds = groups.tail ();
 
     // https://learn.microsoft.com/en-us/typography/opentype/spec/colr#format-32-paintcomposite
     switch ((int) mode)
     {
       case HB_PAINT_COMPOSITE_MODE_CLEAR:
-        backdrop_bounds.status = hb_bounds_t::EMPTY;
+        backdrop_bounds.status = hb_bounds_t<>::EMPTY;
         break;
       case HB_PAINT_COMPOSITE_MODE_SRC:
       case HB_PAINT_COMPOSITE_MODE_SRC_OUT:
@@ -125,16 +125,16 @@
 
   void paint ()
   {
-    const hb_bounds_t &clip = clips.tail ();
-    hb_bounds_t &group = groups.tail ();
+    const hb_bounds_t<> &clip = clips.tail ();
+    hb_bounds_t<> &group = groups.tail ();
 
     group.union_ (clip);
   }
 
   protected:
-  hb_vector_t transforms;
-  hb_vector_t clips;
-  hb_vector_t groups;
+  hb_vector_t> transforms;
+  hb_vector_t> clips;
+  hb_vector_t> groups;
 };
 
 HB_INTERNAL hb_paint_funcs_t *
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-paint.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-paint.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-paint.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-paint.hh	2026-04-17 19:09:35.000000000 +0000
@@ -28,6 +28,7 @@
 #include "hb.hh"
 #include "hb-face.hh"
 #include "hb-font.hh"
+#include "hb-geometry.hh"
 
 #define HB_PAINT_FUNCS_IMPLEMENT_CALLBACKS \
   HB_PAINT_FUNC_IMPLEMENT (push_transform) \
@@ -72,7 +73,11 @@
                        float xx, float yx,
                        float xy, float yy,
                        float dx, float dy)
-  { func.push_transform (this, paint_data,
+  {
+    // Handle -0.f to avoid -0.f == 0.f in the transform matrix.
+    if (dx == -0.f) dx = 0.f;
+    if (dy == -0.f) dy = 0.f;
+    func.push_transform (this, paint_data,
                          xx, yx, xy, yy, dx, dy,
                          !user_data ? nullptr : user_data->push_transform); }
   void pop_transform (void *paint_data)
@@ -182,54 +187,59 @@
                     0, 0);
   }
 
-  HB_NODISCARD
-  bool push_translate (void *paint_data,
-                       float dx, float dy)
+  void push_transform (void *paint_data, hb_transform_t t)
   {
-    if (!dx && !dy)
-      return false;
+    push_transform (paint_data, t.xx, t.yx, t.xy, t.yy, t.x0, t.y0);
+  }
 
+  void push_translate (void *paint_data,
+                       float dx, float dy)
+  {
     push_transform (paint_data,
-                    1.f, 0.f, 0.f, 1.f, dx, dy);
-    return true;
+                    hb_transform_t::translation (dx, dy));
   }
 
-  HB_NODISCARD
-  bool push_scale (void *paint_data,
+  void push_scale (void *paint_data,
                    float sx, float sy)
   {
-    if (sx == 1.f && sy == 1.f)
-      return false;
-
     push_transform (paint_data,
-                    sx, 0.f, 0.f, sy, 0.f, 0.f);
-    return true;
+                    hb_transform_t::scaling (sx, sy));
+  }
+  void push_scale_around_center (void *paint_data,
+                                 float sx, float sy,
+                                 float cx, float cy)
+  {
+    push_transform (paint_data,
+                    hb_transform_t::scaling_around_center (sx, sy, cx, cy));
   }
 
-  HB_NODISCARD
-  bool push_rotate (void *paint_data,
+  void push_rotate (void *paint_data,
                     float a)
   {
-    if (!a)
-      return false;
+    push_transform (paint_data,
+                    hb_transform_t::rotation (a * HB_PI));
+  }
 
-    float cc = cosf (a * HB_PI);
-    float ss = sinf (a * HB_PI);
-    push_transform (paint_data, cc, ss, -ss, cc, 0.f, 0.f);
-    return true;
+  void push_rotate_around_center (void *paint_data,
+                                  float a,
+                                  float cx, float cy)
+  {
+    push_transform (paint_data,
+                    hb_transform_t::rotation_around_center (a * HB_PI, cx, cy));
   }
 
-  HB_NODISCARD
-  bool push_skew (void *paint_data,
+  void push_skew (void *paint_data,
                   float sx, float sy)
   {
-    if (!sx && !sy)
-      return false;
-
-    float x = tanf (-sx * HB_PI);
-    float y = tanf (+sy * HB_PI);
-    push_transform (paint_data, 1.f, y, x, 1.f, 0.f, 0.f);
-    return true;
+    push_transform (paint_data,
+                    hb_transform_t::skewing (-sx * HB_PI, sy * HB_PI));
+  }
+  void push_skew_around_center (void *paint_data,
+                                float sx, float sy,
+                                float cx, float cy)
+  {
+    push_transform (paint_data,
+                    hb_transform_t::skewing_around_center (-sx * HB_PI, sy * HB_PI, cx, cy));
   }
 };
 DECLARE_NULL_INSTANCE (hb_paint_funcs_t);
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-pool.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-pool.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-pool.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-pool.hh	1970-01-01 00:00:00.000000000 +0000
@@ -1,107 +0,0 @@
-/*
- * Copyright © 2019  Facebook, Inc.
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Facebook Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_POOL_HH
-#define HB_POOL_HH
-
-#include "hb.hh"
-
-/* Memory pool for persistent allocation of small objects.
- *
- * Some AI musings on this, not necessarily true:
- *
- * This is a very simple implementation, but it's good enough for our
- * purposes.  It's not thread-safe.  It's not very fast.  It's not
- * very memory efficient.  It's not very cache efficient.  It's not
- * very anything efficient.  But it's simple and it works.  And it's
- * good enough for our purposes.  If you need something more
- * sophisticated, use a real allocator.  Or use a real language. */
-
-template 
-struct hb_pool_t
-{
-  hb_pool_t () : next (nullptr) {}
-  ~hb_pool_t ()
-  {
-    next = nullptr;
-
-    + hb_iter (chunks)
-    | hb_apply (hb_free)
-    ;
-  }
-
-  T* alloc ()
-  {
-    if (unlikely (!next))
-    {
-      if (unlikely (!chunks.alloc (chunks.length + 1))) return nullptr;
-      chunk_t *chunk = (chunk_t *) hb_malloc (sizeof (chunk_t));
-      if (unlikely (!chunk)) return nullptr;
-      chunks.push (chunk);
-      next = chunk->thread ();
-    }
-
-    T* obj = next;
-    next = * ((T**) next);
-
-    hb_memset (obj, 0, sizeof (T));
-
-    return obj;
-  }
-
-  void release (T* obj)
-  {
-    * (T**) obj = next;
-    next = obj;
-  }
-
-  private:
-
-  static_assert (ChunkLen > 1, "");
-  static_assert (sizeof (T) >= sizeof (void *), "");
-  static_assert (alignof (T) % alignof (void *) == 0, "");
-
-  struct chunk_t
-  {
-    T* thread ()
-    {
-      for (unsigned i = 0; i < ARRAY_LENGTH (arrayZ) - 1; i++)
-        * (T**) &arrayZ[i] = &arrayZ[i + 1];
-
-      * (T**) &arrayZ[ARRAY_LENGTH (arrayZ) - 1] = nullptr;
-
-      return arrayZ;
-    }
-
-    T arrayZ[ChunkLen];
-  };
-
-  T* next;
-  hb_vector_t chunks;
-};
-
-
-#endif /* HB_POOL_HH */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-priority-queue.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-priority-queue.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-priority-queue.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-priority-queue.hh	2026-04-17 19:09:35.000000000 +0000
@@ -45,12 +45,22 @@
 template 
 struct hb_priority_queue_t
 {
- private:
+ public:
   typedef hb_pair_t item_t;
+
+ private:
   hb_vector_t heap;
 
  public:
 
+  hb_priority_queue_t () = default;
+  hb_priority_queue_t (hb_vector_t&& other) : heap (std::move (other))
+  {
+    // Heapify the vector.
+    for (int i = (heap.length / 2) - 1; i >= 0; i--)
+      bubble_down (i);
+  }
+
   void reset () { heap.resize (0); }
 
   bool in_error () const { return heap.in_error (); }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-repacker.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-repacker.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-repacker.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-repacker.hh	2026-04-17 19:09:35.000000000 +0000
@@ -217,11 +217,17 @@
   unsigned maximum_to_move = hb_max ((sorted_graph.num_roots_for_space (space) / 2u), 1u);
   if (roots_to_isolate.get_population () > maximum_to_move) {
     // Only move at most half of the roots in a space at a time.
-    unsigned extra = roots_to_isolate.get_population () - maximum_to_move;
-    while (extra--) {
-      uint32_t root = HB_SET_VALUE_INVALID;
-      roots_to_isolate.previous (&root);
-      roots_to_isolate.del (root);
+    //
+    // Note: this was ported from non-stable ids to stable ids. So to retain the same behaviour
+    // with regards to which roots are removed from the set we need to remove them in the topological
+    // order, not the object id order.
+    int extra = roots_to_isolate.get_population () - maximum_to_move;
+    for (unsigned id : sorted_graph.ordering_) {
+      if (!extra) break;
+      if (roots_to_isolate.has(id)) {
+        roots_to_isolate.del(id);
+        extra--;
+      }
     }
   }
 
@@ -266,7 +272,7 @@
     result = sorted_graph.duplicate(&parents, r.child);
   }
 
-  if (result == (unsigned) -1) return result;
+  if (result == (unsigned) -1) return false;
 
   if (parents.get_population() > 1) {
     // If the duplicated node has more than one parent pre-emptively raise it's priority to the maximum.
@@ -283,7 +289,7 @@
     sorted_graph.vertices_[result].give_max_priority();
   }
 
-  return result;
+  return true;
 }
 
 static inline
@@ -302,8 +308,11 @@
     {
       // The child object is shared, we may be able to eliminate the overflow
       // by duplicating it.
-      if (!_resolve_shared_overflow(overflows, i, sorted_graph)) continue;
-      return true;
+      if (_resolve_shared_overflow(overflows, i, sorted_graph))
+        return true;
+
+      // Sometimes we can't duplicate a node which looks shared because it's not actually shared
+      // (eg. all links from the same parent) in this case continue on to other resolution options.
     }
 
     if (child.is_leaf () && !priority_bumped_parents.has (r.parent))
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-sanitize.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-sanitize.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-sanitize.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-sanitize.hh	2026-04-17 19:09:35.000000000 +0000
@@ -64,9 +64,6 @@
  *
  *   - Cast blob content to T*, call sanitize() method of it,
  *   - If sanitize succeeded, return blob.
- *   - Otherwise, if blob is not writable, try making it writable,
- *     or copy if cannot be made writable in-place,
- *   - Call sanitize() again.  Return blob if sanitize succeeded.
  *   - Return empty blob otherwise.
  *
  *
@@ -98,6 +95,12 @@
  * structure is so complicated that by checking all offsets at sanitize() time,
  * we make the code much simpler in other methods, as offsets and referenced
  * objects do not need to be validated at each use site.
+ *
+ * Note:
+ * Sanitize was named so because it used to try to recover from errors by
+ * modifying the data to make it valid.  This is no longer the case, as it
+ * could make HarfBuzz hallucinate new rules if there was aliasing in the
+ * data.  However, the name stuck.  See: https://behdad.github.io/harfbust/
  */
 
 /* This limits sanitizing time on really broken fonts. */
@@ -120,12 +123,12 @@
 struct hb_sanitize_context_t :
        hb_dispatch_context_t
 {
-  hb_sanitize_context_t () :
-        start (nullptr), end (nullptr),
+  hb_sanitize_context_t (const char *start_ = nullptr, const char *end_ = nullptr) :
+        start (start_), end (end_),
         length (0),
         max_ops (0), max_subtables (0),
         recursion_depth (0),
-        writable (false), edit_count (0),
+        writable (false),
         blob (nullptr),
         num_glyphs (65536),
         num_glyphs_set (false),
@@ -212,14 +215,22 @@
 
   void reset_object ()
   {
-    this->start = this->blob->data;
-    this->end = this->start + this->blob->length;
+    if (this->blob)
+    {
+      this->start = this->blob->data;
+      this->end = this->start + this->blob->length;
+    }
     this->length = this->end - this->start;
     assert (this->start <= this->end); /* Must not overflow. */
   }
 
-  void start_processing ()
+  void start_processing (const char *start_ = nullptr, const char *end_ = nullptr)
   {
+    if (start_)
+    {
+      this->start = start_;
+      this->end = end_;
+    }
     reset_object ();
     unsigned m;
     if (unlikely (hb_unsigned_mul_overflows (this->end - this->start, HB_SANITIZE_MAX_OPS_FACTOR, &m)))
@@ -228,7 +239,6 @@
       this->max_ops = hb_clamp (m,
                                 (unsigned) HB_SANITIZE_MAX_OPS_MIN,
                                 (unsigned) HB_SANITIZE_MAX_OPS_MAX);
-    this->edit_count = 0;
     this->debug_depth = 0;
     this->recursion_depth = 0;
 
@@ -241,8 +251,8 @@
   void end_processing ()
   {
     DEBUG_MSG_LEVEL (SANITIZE, this->start, 0, -1,
-                     "end [%p..%p] %u edit requests",
-                     this->start, this->end, this->edit_count);
+                     "end [%p..%p]",
+                     this->start, this->end);
 
     hb_blob_destroy (this->blob);
     this->blob = nullptr;
@@ -250,9 +260,6 @@
     this->length = 0;
   }
 
-  unsigned get_edit_count () { return edit_count; }
-
-
   bool check_ops(unsigned count)
   {
     /* Avoid underflow */
@@ -396,35 +403,6 @@
       return likely (this->check_point ((const char *) obj + obj->min_size));
   }
 
-  bool may_edit (const void *base, unsigned int len)
-  {
-    if (this->edit_count >= HB_SANITIZE_MAX_EDITS)
-      return false;
-
-    const char *p = (const char *) base;
-    this->edit_count++;
-
-    DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
-       "may_edit(%u) [%p..%p] (%u bytes) in [%p..%p] -> %s",
-       this->edit_count,
-       p, p + len, len,
-       this->start, this->end,
-       this->writable ? "GRANTED" : "DENIED");
-
-    return this->writable;
-  }
-
-  template 
-  bool try_set (const Type *obj, const ValueType &v)
-  {
-    if (this->may_edit (obj, hb_static_size (Type)))
-    {
-      * const_cast (obj) = v;
-      return true;
-    }
-    return false;
-  }
-
   template 
   hb_blob_t *sanitize_blob (hb_blob_t *blob)
   {
@@ -432,7 +410,6 @@
 
     init (blob);
 
-  retry:
     DEBUG_MSG_FUNC (SANITIZE, start, "start");
 
     start_processing ();
@@ -446,36 +423,6 @@
     Type *t = reinterpret_cast (const_cast (start));
 
     sane = t->sanitize (this);
-    if (sane)
-    {
-      if (edit_count)
-      {
-        DEBUG_MSG_FUNC (SANITIZE, start, "passed first round with %u edits; going for second round", edit_count);
-
-        /* sanitize again to ensure no toe-stepping */
-        edit_count = 0;
-        sane = t->sanitize (this);
-        if (edit_count) {
-          DEBUG_MSG_FUNC (SANITIZE, start, "requested %u edits in second round; FAILING", edit_count);
-          sane = false;
-        }
-      }
-    }
-    else
-    {
-      if (edit_count && !writable) {
-        start = hb_blob_get_data_writable (blob, nullptr);
-        end = start + blob->length;
-
-        if (start)
-        {
-          writable = true;
-          /* ok, we made it writable by relocating.  try again */
-          DEBUG_MSG_FUNC (SANITIZE, start, "retry");
-          goto retry;
-        }
-      }
-    }
 
     end_processing ();
 
@@ -506,7 +453,6 @@
   private:
   int recursion_depth;
   bool writable;
-  unsigned int edit_count;
   hb_blob_t *blob;
   unsigned int num_glyphs;
   bool  num_glyphs_set;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-script-list.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-script-list.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-script-list.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-script-list.h	2026-04-17 19:09:35.000000000 +0000
@@ -223,6 +223,10 @@
  * @HB_SCRIPT_SUNUWAR: `Sunu`, Since: 10.0.0
  * @HB_SCRIPT_TODHRI: `Todr`, Since: 10.0.0
  * @HB_SCRIPT_TULU_TIGALARI: `Tutg`, Since: 10.0.0
+ * @HB_SCRIPT_BERIA_ERFE: `Berf`, Since: 11.5.0
+ * @HB_SCRIPT_SIDETIC: `Sidt`, Since: 11.5.0
+ * @HB_SCRIPT_TAI_YO: `Tayo`, Since: 11.5.0
+ * @HB_SCRIPT_TOLONG_SIKI: `Tols`, Since: 11.5.0
  * @HB_SCRIPT_INVALID: No script set
  *
  * Data type for scripts. Each #hb_script_t's value is an #hb_tag_t corresponding
@@ -461,6 +465,14 @@
   HB_SCRIPT_TODHRI                      = HB_TAG ('T','o','d','r'), /*16.0*/
   HB_SCRIPT_TULU_TIGALARI               = HB_TAG ('T','u','t','g'), /*16.0*/
 
+  /*
+   * Since 11.5.0
+   */
+  HB_SCRIPT_BERIA_ERFE                  = HB_TAG ('B','e','r','f'), /*17.0*/
+  HB_SCRIPT_SIDETIC                     = HB_TAG ('S','i','d','t'), /*17.0*/
+  HB_SCRIPT_TAI_YO                      = HB_TAG ('T','a','y','o'), /*17.0*/
+  HB_SCRIPT_TOLONG_SIKI                 = HB_TAG ('T','o','l','s'), /*17.0*/
+
   /* No script set. */
   HB_SCRIPT_INVALID                     = HB_TAG_NONE,
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-serialize.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-serialize.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-serialize.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-serialize.hh	2026-04-17 19:09:35.000000000 +0000
@@ -34,7 +34,7 @@
 #include "hb.hh"
 #include "hb-blob.hh"
 #include "hb-map.hh"
-#include "hb-pool.hh"
+#include "hb-free-pool.hh"
 
 #include "hb-subset-serialize.h"
 
@@ -724,7 +724,7 @@
            hb_requires (hb_is_iterator (Iterator)),
            typename ...Ts>
   void copy_all (Iterator it, Ts&&... ds)
-  { for (decltype (*it) _ : it) copy (_, std::forward (ds)...); }
+  { for (decltype (*it) _ : it) copy (_, ds...); }
 
   template 
   hb_serialize_context_t& operator << (const Type &obj) & { embed (obj); return *this; }
@@ -794,7 +794,8 @@
   template 
   void assign_offset (const object_t* parent, const object_t::link_t &link, unsigned offset)
   {
-    auto &off = * ((BEInt *) (parent->head + link.position));
+    // XXX We should stop assuming big-endian!
+    auto &off = * ((HBInt *) (parent->head + link.position));
     assert (0 == off);
     check_assign (off, offset, HB_SERIALIZE_ERROR_OFFSET_OVERFLOW);
   }
@@ -814,7 +815,7 @@
   }
 
   /* Object memory pool. */
-  hb_pool_t object_pool;
+  hb_free_pool_t object_pool;
 
   /* Stack of currently under construction objects. */
   object_t *current;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-set-digest.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-set-digest.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-set-digest.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-set-digest.hh	2026-04-17 19:09:35.000000000 +0000
@@ -55,11 +55,11 @@
  *   - For each glyph, if it doesn't match the subtable digest,
  *     skip it.
  *
- * The main filter we use is a combination of four bits-pattern
+ * The filter we use is a combination of three bits-pattern
  * filters. A bits-pattern filter checks a number of bits (5 or 6)
- * of the input number (glyph-id in this case) and checks whether
+ * of the input number (glyph-id in most cases) and checks whether
  * its pattern is amongst the patterns of any of the accepted values.
- * The accepted patterns are represented as a "long" integer. The
+ * The accepted patterns are represented as a "long" integer. Each
  * check is done using four bitwise operations only.
  */
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-shape.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-shape.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-shape.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-shape.cc	2026-04-17 19:09:35.000000000 +0000
@@ -149,14 +149,11 @@
 
   hb_bool_t res = hb_shape_plan_execute (shape_plan, font, buffer, features, num_features);
 
-  if (buffer->max_ops <= 0)
-    buffer->shaping_failed = true;
-
   hb_shape_plan_destroy (shape_plan);
 
   if (text_buffer)
   {
-    if (res && buffer->successful && !buffer->shaping_failed
+    if (res && buffer->successful
             && text_buffer->successful
             && !buffer->verify (text_buffer,
                                 font,
@@ -199,6 +196,7 @@
 
 
 #ifdef HB_EXPERIMENTAL_API
+#ifndef HB_NO_VAR
 
 static float
 buffer_advance (hb_buffer_t *buffer)
@@ -440,7 +438,7 @@
 
   return true;
 }
-
+#endif
 #endif
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-shaper-list.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-shaper-list.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-shaper-list.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-shaper-list.hh	2026-04-17 19:09:35.000000000 +0000
@@ -57,6 +57,14 @@
 HB_SHAPER_IMPLEMENT (coretext)
 #endif
 
+#ifdef HAVE_HARFRUST
+HB_SHAPER_IMPLEMENT (harfrust)
+#endif
+
+#ifdef HAVE_KBTS
+HB_SHAPER_IMPLEMENT (kbts)
+#endif
+
 #ifndef HB_NO_FALLBACK_SHAPE
 HB_SHAPER_IMPLEMENT (fallback) /* <--- This should be last. */
 #endif
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-static.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-static.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-static.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-static.cc	2026-04-17 19:09:35.000000000 +0000
@@ -113,27 +113,4 @@
   return ret;
 }
 
-
-#ifndef HB_NO_VAR
-bool
-_glyf_get_leading_bearing_with_var_unscaled (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical,
-                                             int *lsb)
-{
-  return font->face->table.glyf->get_leading_bearing_with_var_unscaled (font, glyph, is_vertical, lsb);
-}
-
-unsigned
-_glyf_get_advance_with_var_unscaled (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical)
-{
-  return font->face->table.glyf->get_advance_with_var_unscaled (font, glyph, is_vertical);
-}
-#endif
-
-bool
-_glyf_get_leading_bearing_without_var_unscaled (hb_face_t *face, hb_codepoint_t gid, bool is_vertical, int *lsb)
-{
-  return face->table.glyf->get_leading_bearing_without_var_unscaled (gid, is_vertical, lsb);
-}
-
-
 #endif
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-string-array.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-string-array.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-string-array.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-string-array.hh	2026-04-17 19:09:35.000000000 +0000
@@ -45,25 +45,25 @@
  * but C++ does not allow that.
  * https://stackoverflow.com/q/28433862
  */
-#define _S(s) char HB_PASTE (str, __LINE__)[sizeof (s)];
+#define HB_STR(s) char HB_PASTE (str, __LINE__)[sizeof (s)];
 #include HB_STRING_ARRAY_LIST
-#undef _S
+#undef HB_STR
   } st;
   char str[HB_VAR_ARRAY];
 }
 HB_STRING_ARRAY_POOL_NAME =
 {
   {
-#define _S(s) s,
+#define HB_STR(s) s,
 #include HB_STRING_ARRAY_LIST
-#undef _S
+#undef HB_STR
   }
 };
 static const unsigned int HB_STRING_ARRAY_OFFS_NAME[] =
 {
-#define _S(s) offsetof (union HB_STRING_ARRAY_TYPE_NAME, st.HB_PASTE(str, __LINE__)),
+#define HB_STR(s) offsetof (union HB_STRING_ARRAY_TYPE_NAME, st.HB_PASTE(str, __LINE__)),
 #include HB_STRING_ARRAY_LIST
-#undef _S
+#undef HB_STR
   sizeof (HB_STRING_ARRAY_TYPE_NAME)
 };
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset-cff-common.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset-cff-common.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset-cff-common.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset-cff-common.hh	2026-04-17 19:09:35.000000000 +0000
@@ -861,8 +861,7 @@
         {
           // Hack to point vector to static string.
           auto &b = buffArray.arrayZ[last];
-          b.length = 1;
-          b.arrayZ = const_cast(endchar_str);
+          b.set_storage (const_cast(endchar_str), 1);
         }
 
       last++; // Skip over gid
@@ -877,8 +876,7 @@
       {
         // Hack to point vector to static string.
         auto &b = buffArray.arrayZ[last];
-        b.length = 1;
-        b.arrayZ = const_cast(endchar_str);
+        b.set_storage (const_cast(endchar_str), 1);
       }
 
     return true;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-iup.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-iup.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-iup.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-iup.hh	2026-04-17 19:09:35.000000000 +0000
@@ -26,12 +26,27 @@
 #define HB_SUBSET_INSTANCER_IUP_HH
 
 #include "hb-subset-plan.hh"
+
+struct iup_scratch_t
+{
+  hb_vector_t end_points;
+  hb_vector_t interp_x_deltas;
+  hb_vector_t interp_y_deltas;
+  hb_vector_t costs;
+  hb_vector_t chain;
+  hb_vector_t rot_indices;
+  hb_vector_t rot_x_deltas;
+  hb_vector_t rot_y_deltas;
+  contour_point_vector_t rot_points;
+};
+
 /* given contour points and deltas, optimize a set of referenced points within error
  * tolerance. Returns optimized referenced point indices */
 HB_INTERNAL bool iup_delta_optimize (const contour_point_vector_t& contour_points,
                                      const hb_vector_t& x_deltas,
                                      const hb_vector_t& y_deltas,
                                      hb_vector_t& opt_indices, /* OUT */
+                                     iup_scratch_t &scratch,
                                      double tolerance = 0.0);
 
 #endif /* HB_SUBSET_INSTANCER_IUP_HH */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-solver.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-solver.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-solver.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-solver.cc	2026-04-17 19:09:35.000000000 +0000
@@ -62,9 +62,10 @@
     return  (end - coord) / (end - peak);
 }
 
-static inline rebase_tent_result_t
-_solve (Triple tent, Triple axisLimit, bool negative = false)
+static inline void
+_solve (Triple tent, Triple axisLimit, rebase_tent_result_t &out, bool negative = false)
 {
+  out.reset();
   double axisMin = axisLimit.minimum;
   double axisDef = axisLimit.middle;
   double axisMax = axisLimit.maximum;
@@ -75,14 +76,12 @@
   // Mirror the problem such that axisDef <= peak
   if (axisDef > peak)
   {
-    rebase_tent_result_t vec = _solve (_reverse_negate (tent),
-                           _reverse_negate (axisLimit),
-                           !negative);
+    _solve (_reverse_negate (tent), _reverse_negate (axisLimit), out, !negative);
 
-    for (auto &p : vec)
+    for (auto &p : out)
       p = hb_pair (p.first, _reverse_negate (p.second));
 
-    return vec;
+    return;
   }
   // axisDef <= peak
 
@@ -98,7 +97,7 @@
    *    axisMin     axisDef    axisMax   lower     upper
    */
   if (axisMax <= lower && axisMax < peak)
-      return rebase_tent_result_t{};  // No overlap
+      return;  // No overlap
 
   /* case 2: Only the peak and outermost bound fall outside the new limit;
    * we keep the deltaset, update peak and outermost bound and scale deltas
@@ -133,18 +132,18 @@
     double mult = supportScalar (axisMax, tent);
     tent = Triple{lower, axisMax, axisMax};
 
-    rebase_tent_result_t vec = _solve (tent, axisLimit);
+    _solve (tent, axisLimit, out);
 
-    for (auto &p : vec)
+    for (auto &p : out)
       p = hb_pair (p.first * mult, p.second);
 
-    return vec;
+    return;
   }
 
   // lower <= axisDef <= peak <= axisMax
 
   double gain = supportScalar (axisDef, tent);
-  rebase_tent_result_t out {hb_pair (gain, Triple{})};
+  out.push(hb_pair (gain, Triple{}));
 
   // First, the positive side
 
@@ -362,8 +361,6 @@
     out.push (hb_pair (scalar1 - gain, loc1));
     out.push (hb_pair (scalar2 - gain, loc2));
   }
-
-  return out;
 }
 
 static inline TripleDistances _reverse_triple_distances (const TripleDistances &v)
@@ -405,18 +402,21 @@
   return (-v_distance) /total_distance;
 }
 
-rebase_tent_result_t
-rebase_tent (Triple tent, Triple axisLimit, TripleDistances axis_triple_distances)
+void
+rebase_tent (Triple tent, Triple axisLimit, TripleDistances axis_triple_distances,
+             rebase_tent_result_t &out,
+             rebase_tent_result_t &scratch)
 {
   assert (-1.0 <= axisLimit.minimum && axisLimit.minimum <= axisLimit.middle && axisLimit.middle <= axisLimit.maximum && axisLimit.maximum <= +1.0);
   assert (-2.0 <= tent.minimum && tent.minimum <= tent.middle && tent.middle <= tent.maximum && tent.maximum <= +2.0);
   assert (tent.middle != 0.0);
 
-  rebase_tent_result_t sols = _solve (tent, axisLimit);
+  rebase_tent_result_t &sols = scratch;
+  _solve (tent, axisLimit, sols);
 
   auto n = [&axisLimit, &axis_triple_distances] (double v) { return renormalizeValue (v, axisLimit, axis_triple_distances); };
 
-  rebase_tent_result_t out;
+  out.reset();
   for (auto &p : sols)
   {
     if (!p.first) continue;
@@ -429,6 +429,4 @@
     out.push (hb_pair (p.first,
                        Triple{n (t.minimum), n (t.middle), n (t.maximum)}));
   }
-
-  return out;
 }
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-solver.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-solver.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-solver.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset-instancer-solver.hh	2026-04-17 19:09:35.000000000 +0000
@@ -42,10 +42,9 @@
   double positive;
 };
 
-struct Triple {
-
-  Triple () :
-    minimum (0.0), middle (0.0), maximum (0.0) {}
+struct Triple
+{
+  Triple () = default;
 
   Triple (double minimum_, double middle_, double maximum_) :
     minimum (minimum_), middle (middle_), maximum (maximum_) {}
@@ -81,10 +80,9 @@
     return current;
   }
 
-
-  double minimum;
-  double middle;
-  double maximum;
+  double minimum = 0;
+  double middle = 0;
+  double maximum = 0;
 };
 
 using rebase_tent_result_item_t = hb_pair_t;
@@ -107,8 +105,10 @@
  * If tent value is Triple{}, that is a special deltaset that should
  * be always-enabled (called "gain").
  */
-HB_INTERNAL rebase_tent_result_t rebase_tent (Triple tent,
-                                              Triple axisLimit,
-                                              TripleDistances axis_triple_distances);
+HB_INTERNAL void rebase_tent (Triple tent,
+                              Triple axisLimit,
+                              TripleDistances axis_triple_distances,
+                              rebase_tent_result_t &out,
+                              rebase_tent_result_t &scratch);
 
 #endif /* HB_SUBSET_INSTANCER_SOLVER_HH */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset-plan-member-list.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset-plan-member-list.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset-plan-member-list.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset-plan-member-list.hh	2026-04-17 19:09:35.000000000 +0000
@@ -81,6 +81,10 @@
 HB_SUBSET_PLAN_MEMBER (hb_map_t, gsub_features)
 HB_SUBSET_PLAN_MEMBER (hb_map_t, gpos_features)
 
+//active features(with duplicates) old index -> new index mapping
+HB_SUBSET_PLAN_MEMBER (hb_map_t, gsub_features_w_duplicates)
+HB_SUBSET_PLAN_MEMBER (hb_map_t, gpos_features_w_duplicates)
+
 //active feature variation records/condition index with variations
 HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(>), gsub_feature_record_cond_idx_map)
 HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(>), gpos_feature_record_cond_idx_map)
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset-plan.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset-plan.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset-plan.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset-plan.cc	2026-04-17 19:09:35.000000000 +0000
@@ -418,7 +418,8 @@
                  hb_set_t* drop_tables)
 {
 #ifndef HB_NO_STYLE
-  plan->source->table.STAT->collect_name_ids (&plan->user_axes_location, &plan->name_ids);
+  if (!drop_tables->has (HB_OT_TAG_STAT))
+    plan->source->table.STAT->collect_name_ids (&plan->user_axes_location, &plan->name_ids);
 #endif
 #ifndef HB_NO_VAR
   if (!plan->all_axes_pinned)
@@ -676,7 +677,8 @@
     return;
 
 #ifndef HB_NO_VAR
-  normalize_axes_location (face, this);
+  if (!check_success (normalize_axes_location (face, this)))
+      return;
 #endif
 
   _populate_unicodes_to_retain (input->sets.unicodes, input->sets.glyphs, this);
@@ -697,6 +699,15 @@
     return;
   }
 
+#ifdef HB_EXPERIMENTAL_API
+  if ((input->flags & HB_SUBSET_FLAGS_RETAIN_GIDS) &&
+      (input->flags & HB_SUBSET_FLAGS_RETAIN_NUM_GLYPHS)) {
+    // We've been requested to maintain the num glyphs count from the
+    // input face.
+    _num_output_glyphs = source->get_num_glyphs ();
+  }
+#endif
+
   _create_glyph_map_gsub (
       &_glyphset_gsub,
       glyph_map,
@@ -710,10 +721,10 @@
         glyph_map->get(unicode_to_new_gid_list.arrayZ[i].second);
   }
 
-  bounds_width_vec.resize (_num_output_glyphs, false);
+  bounds_width_vec.resize_dirty  (_num_output_glyphs);
   for (auto &v : bounds_width_vec)
     v = 0xFFFFFFFF;
-  bounds_height_vec.resize (_num_output_glyphs, false);
+  bounds_height_vec.resize_dirty  (_num_output_glyphs);
   for (auto &v : bounds_height_vec)
     v = 0xFFFFFFFF;
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset-plan.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset-plan.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset-plan.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset-plan.hh	2026-04-17 19:09:35.000000000 +0000
@@ -300,6 +300,7 @@
 // compile times more reasonable:
 // - hb-subset-plan.cc
 // - hb-subset-plan-layout.cc
+// - hb-subset-plan-var.cc
 //
 // The functions below are those needed to connect the split files
 // above together.
@@ -332,7 +333,7 @@
                               unsigned subtable_count,
                               hb_vector_t &inner_maps /* OUT */);
 
-HB_INTERNAL void
+HB_INTERNAL bool
 normalize_axes_location (hb_face_t *face, hb_subset_plan_t *plan);
 
 HB_INTERNAL void
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset.cc openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset.cc
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset.cc	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset.cc	2026-04-17 19:09:35.000000000 +0000
@@ -25,65 +25,19 @@
  */
 
 #include "hb.hh"
+
 #include "hb-open-type.hh"
+#include "hb-open-file.hh"
 
 #include "hb-subset.hh"
+#include "hb-subset-table.hh"
+#include "hb-subset-accelerator.hh"
 
-#include "hb-open-file.hh"
 #include "hb-ot-cmap-table.hh"
-#include "hb-ot-glyf-table.hh"
-#include "hb-ot-hdmx-table.hh"
-#include "hb-ot-head-table.hh"
-#include "hb-ot-hhea-table.hh"
-#include "hb-ot-hmtx-table.hh"
-#include "hb-ot-maxp-table.hh"
-#include "OT/Color/CBDT/CBDT.hh"
-#include "OT/Color/COLR/COLR.hh"
-#include "OT/Color/CPAL/CPAL.hh"
-#include "OT/Color/sbix/sbix.hh"
-#include "hb-ot-os2-table.hh"
-#include "hb-ot-post-table.hh"
-#include "hb-ot-post-table-v2subset.hh"
-#include "hb-ot-cff1-table.hh"
-#include "hb-ot-cff2-table.hh"
-#include "hb-ot-vorg-table.hh"
-#include "hb-ot-name-table.hh"
-#include "hb-ot-layout-base-table.hh"
-#include "hb-ot-layout-gsub-table.hh"
-#include "hb-ot-layout-gpos-table.hh"
-#include "hb-ot-var-avar-table.hh"
 #include "hb-ot-var-cvar-table.hh"
-#include "hb-ot-var-fvar-table.hh"
-#include "hb-ot-var-gvar-table.hh"
-#include "hb-ot-var-hvar-table.hh"
-#include "hb-ot-var-mvar-table.hh"
-#include "hb-ot-math-table.hh"
+#include "hb-ot-head-table.hh"
 #include "hb-ot-stat-table.hh"
-#include "hb-repacker.hh"
-#include "hb-subset-accelerator.hh"
-
-using OT::Layout::GSUB;
-using OT::Layout::GPOS;
-
-
-#ifndef HB_NO_SUBSET_CFF
-template<>
-struct hb_subset_plan_t::source_table_loader
-{
-  auto operator () (hb_subset_plan_t *plan)
-  HB_AUTO_RETURN (plan->accelerator ? plan->accelerator->cff1_accel :
-                  plan->inprogress_accelerator ? plan->inprogress_accelerator->cff1_accel :
-                  plan->cff1_accel)
-};
-template<>
-struct hb_subset_plan_t::source_table_loader
-{
-  auto operator () (hb_subset_plan_t *plan)
-  HB_AUTO_RETURN (plan->accelerator ? plan->accelerator->cff2_accel :
-                  plan->inprogress_accelerator ? plan->inprogress_accelerator->cff2_accel :
-                  plan->cff2_accel)
-};
-#endif
+#include "hb-ot-post-table-v2subset.hh"
 
 
 /**
@@ -116,56 +70,56 @@
  * if we are unable to list the tables in a face.
  */
 static hb_tag_t known_tables[] {
-  HB_TAG ('a', 'v', 'a', 'r'),
-  HB_OT_TAG_BASE,
-  HB_OT_TAG_CBDT,
-  HB_OT_TAG_CBLC,
-  HB_OT_TAG_CFF1,
-  HB_OT_TAG_CFF2,
-  HB_OT_TAG_cmap,
-  HB_OT_TAG_COLR,
-  HB_OT_TAG_CPAL,
-  HB_TAG ('c', 'v', 'a', 'r'),
-  HB_TAG ('c', 'v', 't', ' '),
-  HB_TAG ('D', 'S', 'I', 'G'),
-  HB_TAG ('E', 'B', 'D', 'T'),
-  HB_TAG ('E', 'B', 'L', 'C'),
-  HB_TAG ('E', 'B', 'S', 'C'),
-  HB_TAG ('f', 'p', 'g', 'm'),
-  HB_TAG ('f', 'v', 'a', 'r'),
-  HB_TAG ('g', 'a', 's', 'p'),
-  HB_OT_TAG_GDEF,
-  HB_OT_TAG_glyf,
-  HB_OT_TAG_GPOS,
-  HB_OT_TAG_GSUB,
-  HB_OT_TAG_gvar,
-  HB_OT_TAG_hdmx,
-  HB_OT_TAG_head,
-  HB_OT_TAG_hhea,
-  HB_OT_TAG_hmtx,
-  HB_OT_TAG_HVAR,
-  HB_OT_TAG_JSTF,
-  HB_TAG ('k', 'e', 'r', 'n'),
-  HB_OT_TAG_loca,
-  HB_TAG ('L', 'T', 'S', 'H'),
-  HB_OT_TAG_MATH,
-  HB_OT_TAG_maxp,
-  HB_TAG ('M', 'E', 'R', 'G'),
-  HB_TAG ('m', 'e', 't', 'a'),
-  HB_TAG ('M', 'V', 'A', 'R'),
-  HB_TAG ('P', 'C', 'L', 'T'),
-  HB_OT_TAG_post,
-  HB_TAG ('p', 'r', 'e', 'p'),
-  HB_OT_TAG_sbix,
-  HB_TAG ('S', 'T', 'A', 'T'),
-  HB_TAG ('S', 'V', 'G', ' '),
-  HB_TAG ('V', 'D', 'M', 'X'),
-  HB_OT_TAG_vhea,
-  HB_OT_TAG_vmtx,
-  HB_OT_TAG_VORG,
-  HB_OT_TAG_VVAR,
-  HB_OT_TAG_name,
-  HB_OT_TAG_OS2
+  HB_TAG('a','v','a','r'),
+  HB_TAG('B','A','S','E'),
+  HB_TAG('C','B','D','T'),
+  HB_TAG('C','B','L','C'),
+  HB_TAG('C','F','F',' '),
+  HB_TAG('C','F','F','2'),
+  HB_TAG('c','m','a','p'),
+  HB_TAG('C','O','L','R'),
+  HB_TAG('C','P','A','L'),
+  HB_TAG('c','v','a','r'),
+  HB_TAG('c','v','t',' '),
+  HB_TAG('D','S','I','G'),
+  HB_TAG('E','B','D','T'),
+  HB_TAG('E','B','L','C'),
+  HB_TAG('E','B','S','C'),
+  HB_TAG('f','p','g','m'),
+  HB_TAG('f','v','a','r'),
+  HB_TAG('g','a','s','p'),
+  HB_TAG('G','D','E','F'),
+  HB_TAG('g','l','y','f'),
+  HB_TAG('G','P','O','S'),
+  HB_TAG('G','S','U','B'),
+  HB_TAG('g','v','a','r'),
+  HB_TAG('h','d','m','x'),
+  HB_TAG('h','e','a','d'),
+  HB_TAG('h','h','e','a'),
+  HB_TAG('h','m','t','x'),
+  HB_TAG('H','V','A','R'),
+  HB_TAG('J','S','T','F'),
+  HB_TAG('k','e','r','n'),
+  HB_TAG('l','o','c','a'),
+  HB_TAG('L','T','S','H'),
+  HB_TAG('M','A','T','H'),
+  HB_TAG('m','a','x','p'),
+  HB_TAG('M','E','R','G'),
+  HB_TAG('m','e','t','a'),
+  HB_TAG('M','V','A','R'),
+  HB_TAG('P','C','L','T'),
+  HB_TAG('p','o','s','t'),
+  HB_TAG('p','r','e','p'),
+  HB_TAG('s','b','i','x'),
+  HB_TAG('S','T','A','T'),
+  HB_TAG('S','V','G',' '),
+  HB_TAG('V','D','M','X'),
+  HB_TAG('v','h','e','a'),
+  HB_TAG('v','m','t','x'),
+  HB_TAG('V','O','R','G'),
+  HB_TAG('V','V','A','R'),
+  HB_TAG('n','a','m','e'),
+  HB_TAG('O','S','/','2')
 };
 
 static bool _table_is_empty (const hb_face_t *face, hb_tag_t tag)
@@ -213,169 +167,6 @@
 }
 
 
-static unsigned
-_plan_estimate_subset_table_size (hb_subset_plan_t *plan,
-                                  unsigned table_len,
-                                  hb_tag_t table_tag)
-{
-  unsigned src_glyphs = plan->source->get_num_glyphs ();
-  unsigned dst_glyphs = plan->glyphset ()->get_population ();
-
-  unsigned bulk = 8192;
-  /* Tables that we want to allocate same space as the source table. For GSUB/GPOS it's
-   * because those are expensive to subset, so giving them more room is fine. */
-  bool same_size = table_tag == HB_OT_TAG_GSUB ||
-                   table_tag == HB_OT_TAG_GPOS ||
-                   table_tag == HB_OT_TAG_name;
-
-  if (plan->flags & HB_SUBSET_FLAGS_RETAIN_GIDS)
-  {
-    if (table_tag == HB_OT_TAG_CFF1)
-    {
-      /* Add some extra room for the CFF charset. */
-      bulk += src_glyphs * 16;
-    }
-    else if (table_tag == HB_OT_TAG_CFF2)
-    {
-      /* Just extra CharString offsets. */
-      bulk += src_glyphs * 4;
-    }
-  }
-
-  if (unlikely (!src_glyphs) || same_size)
-    return bulk + table_len;
-
-  return bulk + (unsigned) (table_len * sqrt ((double) dst_glyphs / src_glyphs));
-}
-
-/*
- * Repack the serialization buffer if any offset overflows exist.
- */
-static hb_blob_t*
-_repack (hb_tag_t tag, const hb_serialize_context_t& c)
-{
-  if (!c.offset_overflow ())
-    return c.copy_blob ();
-
-  hb_blob_t* result = hb_resolve_overflows (c.object_graph (), tag);
-
-  if (unlikely (!result))
-  {
-    DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c offset overflow resolution failed.",
-               HB_UNTAG (tag));
-    return nullptr;
-  }
-
-  return result;
-}
-
-template
-static
-bool
-_try_subset (const TableType *table,
-             hb_vector_t* buf,
-             hb_subset_context_t* c /* OUT */)
-{
-  c->serializer->start_serialize ();
-  if (c->serializer->in_error ()) return false;
-
-  bool needed = table->subset (c);
-  if (!c->serializer->ran_out_of_room ())
-  {
-    c->serializer->end_serialize ();
-    return needed;
-  }
-
-  unsigned buf_size = buf->allocated;
-  buf_size = buf_size * 2 + 16;
-
-
-
-
-  DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c ran out of room; reallocating to %u bytes.",
-             HB_UNTAG (c->table_tag), buf_size);
-
-  if (unlikely (buf_size > c->source_blob->length * 256 ||
-                !buf->alloc_exact (buf_size)))
-  {
-    DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c failed to reallocate %u bytes.",
-               HB_UNTAG (c->table_tag), buf_size);
-    return needed;
-  }
-
-  c->serializer->reset (buf->arrayZ, buf->allocated);
-  return _try_subset (table, buf, c);
-}
-
-template 
-static auto _do_destroy (T &t, hb_priority<1>) HB_RETURN (void, t.destroy ())
-
-template 
-static void _do_destroy (T &t, hb_priority<0>) {}
-
-template
-static bool
-_subset (hb_subset_plan_t *plan, hb_vector_t &buf)
-{
-  auto &&source_blob = plan->source_table ();
-  auto *table = source_blob.get ();
-
-  hb_tag_t tag = TableType::tableTag;
-  hb_blob_t *blob = source_blob.get_blob();
-  if (unlikely (!blob || !blob->data))
-  {
-    DEBUG_MSG (SUBSET, nullptr,
-               "OT::%c%c%c%c::subset sanitize failed on source table.", HB_UNTAG (tag));
-    _do_destroy (source_blob, hb_prioritize);
-    return false;
-  }
-
-  unsigned buf_size = _plan_estimate_subset_table_size (plan, blob->length, TableType::tableTag);
-  DEBUG_MSG (SUBSET, nullptr,
-             "OT::%c%c%c%c initial estimated table size: %u bytes.", HB_UNTAG (tag), buf_size);
-  if (unlikely (!buf.alloc (buf_size)))
-  {
-    DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c failed to allocate %u bytes.", HB_UNTAG (tag), buf_size);
-    _do_destroy (source_blob, hb_prioritize);
-    return false;
-  }
-
-  bool needed = false;
-  hb_serialize_context_t serializer (buf.arrayZ, buf.allocated);
-  {
-    hb_subset_context_t c (blob, plan, &serializer, tag);
-    needed = _try_subset (table, &buf, &c);
-  }
-  _do_destroy (source_blob, hb_prioritize);
-
-  if (serializer.in_error () && !serializer.only_offset_overflow ())
-  {
-    DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c::subset FAILED!", HB_UNTAG (tag));
-    return false;
-  }
-
-  if (!needed)
-  {
-    DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c::subset table subsetted to empty.", HB_UNTAG (tag));
-    return true;
-  }
-
-  bool result = false;
-  hb_blob_t *dest_blob = _repack (tag, serializer);
-  if (dest_blob)
-  {
-    DEBUG_MSG (SUBSET, nullptr,
-               "OT::%c%c%c%c final subset table size: %u bytes.",
-               HB_UNTAG (tag), dest_blob->length);
-    result = plan->add_table (tag, dest_blob);
-    hb_blob_destroy (dest_blob);
-  }
-
-  DEBUG_MSG (SUBSET, nullptr, "OT::%c%c%c%c::subset %s",
-             HB_UNTAG (tag), result ? "success" : "FAILED!");
-  return result;
-}
-
 static bool
 _is_table_present (hb_face_t *source, hb_tag_t tag)
 {
@@ -407,34 +198,34 @@
 
   switch (tag)
   {
-  case HB_TAG ('c','v','a','r'): /* hint table, fallthrough */
+  case HB_TAG('c','v','a','r'): /* hint table, fallthrough */
     return plan->all_axes_pinned || (plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
 
-  case HB_TAG ('c','v','t',' '): /* hint table, fallthrough */
-  case HB_TAG ('f','p','g','m'): /* hint table, fallthrough */
-  case HB_TAG ('p','r','e','p'): /* hint table, fallthrough */
-  case HB_TAG ('h','d','m','x'): /* hint table, fallthrough */
-  case HB_TAG ('V','D','M','X'): /* hint table, fallthrough */
+  case HB_TAG('c','v','t',' '): /* hint table, fallthrough */
+  case HB_TAG('f','p','g','m'): /* hint table, fallthrough */
+  case HB_TAG('p','r','e','p'): /* hint table, fallthrough */
+  case HB_TAG('h','d','m','x'): /* hint table, fallthrough */
+  case HB_TAG('V','D','M','X'): /* hint table, fallthrough */
     return plan->flags & HB_SUBSET_FLAGS_NO_HINTING;
 
 #ifdef HB_NO_SUBSET_LAYOUT
     // Drop Layout Tables if requested.
-  case HB_OT_TAG_GDEF:
-  case HB_OT_TAG_GPOS:
-  case HB_OT_TAG_GSUB:
-  case HB_TAG ('m','o','r','x'):
-  case HB_TAG ('m','o','r','t'):
-  case HB_TAG ('k','e','r','x'):
-  case HB_TAG ('k','e','r','n'):
+  case HB_TAG('G','D','E','F'):
+  case HB_TAG('G','P','O','S'):
+  case HB_TAG('G','S','U','B'):
+  case HB_TAG('m','o','r','x'):
+  case HB_TAG('m','o','r','t'):
+  case HB_TAG('k','e','r','x'):
+  case HB_TAG('k','e','r','n'):
     return true;
 #endif
 
-  case HB_TAG ('a','v','a','r'):
-  case HB_TAG ('f','v','a','r'):
-  case HB_TAG ('g','v','a','r'):
-  case HB_OT_TAG_HVAR:
-  case HB_OT_TAG_VVAR:
-  case HB_TAG ('M','V','A','R'):
+  case HB_TAG('a','v','a','r'):
+  case HB_TAG('f','v','a','r'):
+  case HB_TAG('g','v','a','r'):
+  case HB_TAG('H','V','A','R'):
+  case HB_TAG('V','V','A','R'):
+  case HB_TAG('M','V','A','R'):
     return plan->all_axes_pinned;
 
   default:
@@ -443,28 +234,19 @@
 }
 
 static bool
-_passthrough (hb_subset_plan_t *plan, hb_tag_t tag)
-{
-  hb_blob_t *source_table = hb_face_reference_table (plan->source, tag);
-  bool result = plan->add_table (tag, source_table);
-  hb_blob_destroy (source_table);
-  return result;
-}
-
-static bool
 _dependencies_satisfied (hb_subset_plan_t *plan, hb_tag_t tag,
                          const hb_set_t &subsetted_tags,
                          const hb_set_t &pending_subset_tags)
 {
   switch (tag)
   {
-  case HB_OT_TAG_hmtx:
-  case HB_OT_TAG_vmtx:
-  case HB_OT_TAG_maxp:
-  case HB_OT_TAG_OS2:
-    return !plan->normalized_coords || !pending_subset_tags.has (HB_OT_TAG_glyf);
-  case HB_OT_TAG_GPOS:
-    return plan->all_axes_pinned || !pending_subset_tags.has (HB_OT_TAG_GDEF);
+  case HB_TAG('h','m','t','x'):
+  case HB_TAG('v','m','t','x'):
+  case HB_TAG('m','a','x','p'):
+  case HB_TAG('O','S','/','2'):
+    return !plan->normalized_coords || !pending_subset_tags.has (HB_TAG('g','l','y','f'));
+  case HB_TAG('G','P','O','S'):
+    return plan->all_axes_pinned || !pending_subset_tags.has (HB_TAG('G','D','E','F'));
   default:
     return true;
   }
@@ -476,88 +258,48 @@
                hb_tag_t tag)
 {
   if (plan->no_subset_tables.has (tag)) {
-    return _passthrough (plan, tag);
+    return _hb_subset_table_passthrough (plan, tag);
   }
 
   DEBUG_MSG (SUBSET, nullptr, "subset %c%c%c%c", HB_UNTAG (tag));
+
+  bool success;
+  if (_hb_subset_table_layout (plan, buf, tag, &success) ||
+      _hb_subset_table_var (plan, buf, tag, &success) ||
+      _hb_subset_table_cff (plan, buf, tag, &success) ||
+      _hb_subset_table_color (plan, buf, tag, &success) ||
+      _hb_subset_table_other (plan, buf, tag, &success))
+    return success;
+
+
   switch (tag)
   {
-  case HB_OT_TAG_glyf: return _subset (plan, buf);
-  case HB_OT_TAG_hdmx: return _subset (plan, buf);
-  case HB_OT_TAG_name: return _subset (plan, buf);
-  case HB_OT_TAG_head:
-    if (_is_table_present (plan->source, HB_OT_TAG_glyf) && !_should_drop_table (plan, HB_OT_TAG_glyf))
+  case HB_TAG('h','e','a','d'):
+    if (_is_table_present (plan->source, HB_TAG('g','l','y','f')) && !_should_drop_table (plan, HB_TAG('g','l','y','f')))
       return true; /* skip head, handled by glyf */
-    return _subset (plan, buf);
-  case HB_OT_TAG_hhea: return true; /* skip hhea, handled by hmtx */
-  case HB_OT_TAG_hmtx: return _subset (plan, buf);
-  case HB_OT_TAG_vhea: return true; /* skip vhea, handled by vmtx */
-  case HB_OT_TAG_vmtx: return _subset (plan, buf);
-  case HB_OT_TAG_maxp: return _subset (plan, buf);
-  case HB_OT_TAG_sbix: return _subset (plan, buf);
-  case HB_OT_TAG_loca: return true; /* skip loca, handled by glyf */
-  case HB_OT_TAG_cmap: return _subset (plan, buf);
-  case HB_OT_TAG_OS2 : return _subset (plan, buf);
-  case HB_OT_TAG_post: return _subset (plan, buf);
-  case HB_OT_TAG_COLR: return _subset (plan, buf);
-  case HB_OT_TAG_CPAL: return _subset (plan, buf);
-  case HB_OT_TAG_CBLC: return _subset (plan, buf);
-  case HB_OT_TAG_CBDT: return true; /* skip CBDT, handled by CBLC */
-  case HB_OT_TAG_MATH: return _subset (plan, buf);
-  case HB_OT_TAG_BASE: return _subset (plan, buf);
-
-#ifndef HB_NO_SUBSET_CFF
-  case HB_OT_TAG_CFF1: return _subset (plan, buf);
-  case HB_OT_TAG_CFF2: return _subset (plan, buf);
-  case HB_OT_TAG_VORG: return _subset (plan, buf);
-#endif
-
-#ifndef HB_NO_SUBSET_LAYOUT
-  case HB_OT_TAG_GDEF: return _subset (plan, buf);
-  case HB_OT_TAG_GSUB: return _subset (plan, buf);
-  case HB_OT_TAG_GPOS: return _subset (plan, buf);
-  case HB_OT_TAG_gvar: return _subset (plan, buf);
-  case HB_OT_TAG_HVAR: return _subset (plan, buf);
-  case HB_OT_TAG_VVAR: return _subset (plan, buf);
-#endif
-
-#ifndef HB_NO_VAR
-  case HB_OT_TAG_fvar:
-    if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag);
-    return _subset (plan, buf);
-  case HB_OT_TAG_avar:
-    if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag);
-    return _subset (plan, buf);
-  case HB_OT_TAG_cvar:
-    if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag);
-    return _subset (plan, buf);
-  case HB_OT_TAG_MVAR:
-    if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag);
-    return _subset (plan, buf);
-#endif
+    return _hb_subset_table (plan, buf);
 
-  case HB_OT_TAG_STAT:
-    if (!plan->user_axes_location.is_empty ()) return _subset (plan, buf);
-    else return _passthrough (plan, tag);
+  case HB_TAG('S','T','A','T'):
+    if (!plan->user_axes_location.is_empty ()) return _hb_subset_table (plan, buf);
+    else return _hb_subset_table_passthrough (plan, tag);
 
-  case HB_TAG ('c', 'v', 't', ' '):
+  case HB_TAG('c','v','t',' '):
 #ifndef HB_NO_VAR
-    if (_is_table_present (plan->source, HB_OT_TAG_cvar) &&
+    if (_is_table_present (plan->source, HB_TAG('c','v','a','r')) &&
         plan->normalized_coords && !plan->pinned_at_default)
     {
       auto &cvar = *plan->source->table.cvar;
       return OT::cvar::add_cvt_and_apply_deltas (plan, cvar.get_tuple_var_data (), &cvar);
     }
 #endif
-    return _passthrough (plan, tag);
+    return _hb_subset_table_passthrough (plan, tag);
+  }
 
-  default:
-    if (plan->flags & HB_SUBSET_FLAGS_PASSTHROUGH_UNRECOGNIZED)
-      return _passthrough (plan, tag);
+  if (plan->flags & HB_SUBSET_FLAGS_PASSTHROUGH_UNRECOGNIZED)
+    return _hb_subset_table_passthrough (plan, tag);
 
-    // Drop table
-    return true;
-  }
+  // Drop table
+  return true;
 }
 
 static void _attach_accelerator_data (hb_subset_plan_t* plan,
@@ -707,108 +449,4 @@
 
 end:
   return success ? hb_face_reference (plan->dest) : nullptr;
-}
-
-
-#ifdef HB_EXPERIMENTAL_API
-
-#include "hb-ot-cff1-table.hh"
-
-template
-static hb_blob_t* get_charstrings_data(accel_t& accel, hb_codepoint_t glyph_index) {
-  if (!accel.is_valid()) {
-    return hb_blob_get_empty ();
-  }
-
-  hb_ubytes_t bytes = (*accel.charStrings)[glyph_index];
-  if (!bytes) {
-    return hb_blob_get_empty ();
-  }
-
-  hb_blob_t* cff_blob = accel.get_blob();
-  uint32_t length;
-  const char* cff_data = hb_blob_get_data(cff_blob, &length) ;
-
-  long int offset = (const char*) bytes.arrayZ - cff_data;
-  if (offset < 0 || offset > INT32_MAX) {
-    return hb_blob_get_empty ();
-  }
-
-  return hb_blob_create_sub_blob(cff_blob, (uint32_t) offset, bytes.length);
-}
-
-template
-static hb_blob_t* get_charstrings_index(accel_t& accel) {
-  if (!accel.is_valid()) {
-    return hb_blob_get_empty ();
-  }
-
-  const char* charstrings_start = (const char*) accel.charStrings;
-  unsigned charstrings_length = accel.charStrings->get_size();
-
-  hb_blob_t* cff_blob = accel.get_blob();
-  uint32_t length;
-  const char* cff_data = hb_blob_get_data(cff_blob, &length) ;
-
-  long int offset = charstrings_start - cff_data;
-  if (offset < 0 || offset > INT32_MAX) {
-    return hb_blob_get_empty ();
-  }
-
-  return hb_blob_create_sub_blob(cff_blob, (uint32_t) offset, charstrings_length);
-}
-
-/**
- * hb_subset_cff_get_charstring_data:
- * @face: A face object
- * @glyph_index: Glyph index to get data for.
- *
- * Returns the raw outline data from the CFF/CFF2 table associated with the given glyph index.
- *
- * XSince: EXPERIMENTAL
- **/
-HB_EXTERN hb_blob_t*
-hb_subset_cff_get_charstring_data(hb_face_t* face, hb_codepoint_t glyph_index) {
-  return get_charstrings_data(*face->table.cff1, glyph_index);
-}
-
-/**
- * hb_subset_cff_get_charstrings_index:
- * @face: A face object
- *
- * Returns the raw CFF CharStrings INDEX from the CFF table.
- *
- * XSince: EXPERIMENTAL
- **/
-HB_EXTERN hb_blob_t*
-hb_subset_cff_get_charstrings_index (hb_face_t* face) {
-  return get_charstrings_index (*face->table.cff1);
-}
-
-/**
- * hb_subset_cff2_get_charstring_data:
- * @face: A face object
- * @glyph_index: Glyph index to get data for.
- *
- * Returns the raw outline data from the CFF/CFF2 table associated with the given glyph index.
- *
- * XSince: EXPERIMENTAL
- **/
-HB_EXTERN hb_blob_t*
-hb_subset_cff2_get_charstring_data(hb_face_t* face, hb_codepoint_t glyph_index) {
-  return get_charstrings_data(*face->table.cff2, glyph_index);
-}
-
-/**
- * hb_subset_cff2_get_charstrings_index:
- * @face: A face object
- *
- * Returns the raw CFF2 CharStrings INDEX from the CFF2 table.
- *
- * XSince: EXPERIMENTAL
- **/
-HB_EXTERN hb_blob_t*
-hb_subset_cff2_get_charstrings_index (hb_face_t* face) {
-  return get_charstrings_index (*face->table.cff2);
-}
-#endif
\ No newline at end of file
+}
\ No newline at end of file
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset.h	2026-04-17 19:09:35.000000000 +0000
@@ -80,6 +80,10 @@
  * @HB_SUBSET_FLAGS_IFTB_REQUIREMENTS: If set enforce requirements on the output subset
  * to allow it to be used with incremental font transfer IFTB patches. Primarily,
  * this forces all outline data to use long (32 bit) offsets. Since: EXPERIMENTAL
+ * @HB_SUBSET_FLAGS_RETAIN_NUM_GLYPHS: If this flag is set along side
+ * HB_SUBSET_FLAGS_RETAIN_GIDS then the number of glyphs in the font won't
+ * be reduced as a result of subsetting. If necessary empty glyphs will be
+ * included at the end of the font to keep the number of glyphs unchanged.
  *
  * List of boolean properties that can be configured on the subset input.
  *
@@ -101,6 +105,7 @@
   HB_SUBSET_FLAGS_NO_BIDI_CLOSURE         =  0x00000800u,
 #ifdef HB_EXPERIMENTAL_API
   HB_SUBSET_FLAGS_IFTB_REQUIREMENTS       =  0x00001000u,
+  HB_SUBSET_FLAGS_RETAIN_NUM_GLYPHS  =  0x00002000u,
 #endif
 } hb_subset_flags_t;
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-subset.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-subset.hh	2026-04-17 19:09:35.000000000 +0000
@@ -70,5 +70,4 @@
                         table_tag (table_tag_) {}
 };
 
-
 #endif /* HB_SUBSET_HH */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ucd-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ucd-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-ucd-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-ucd-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -2,9 +2,9 @@
 /*
  * The following table is generated by running:
  *
- *   ./gen-ucd-table.py ucd.nounihan.grouped.xml
+ *   ./gen-ucd-table.py ucd.nounihan.grouped.xml hb-script-list.h
  *
- * on file with this description: Unicode 16.0.0
+ * on file with this description: Unicode 17.0.0
  */
 
 #ifndef HB_UCD_TABLE_HH
@@ -12,8 +12,9 @@
 
 #include "hb.hh"
 
-static const hb_script_t
-_hb_ucd_sc_map[172] =
+#include 
+
+static const hb_script_t _hb_ucd_sc_map[176]=
 {
                    HB_SCRIPT_COMMON,              HB_SCRIPT_INHERITED,
                   HB_SCRIPT_UNKNOWN,                 HB_SCRIPT_ARABIC,
@@ -101,1040 +102,805 @@
              HB_SCRIPT_GURUNG_KHEMA,              HB_SCRIPT_KIRAT_RAI,
                   HB_SCRIPT_OL_ONAL,                HB_SCRIPT_SUNUWAR,
                    HB_SCRIPT_TODHRI,          HB_SCRIPT_TULU_TIGALARI,
+               HB_SCRIPT_BERIA_ERFE,                HB_SCRIPT_SIDETIC,
+                   HB_SCRIPT_TAI_YO,            HB_SCRIPT_TOLONG_SIKI,
 };
-static const uint16_t
-_hb_ucd_dm1_p0_map[825] =
+static const uint16_t _hb_ucd_dm1_p0_map[825]=
 {
-   0x003Bu, 0x004Bu, 0x0060u, 0x00B4u, 0x00B7u, 0x00C5u, 0x02B9u, 0x0300u,
-   0x0301u, 0x0313u, 0x0385u, 0x0386u, 0x0388u, 0x0389u, 0x038Au, 0x038Cu,
-   0x038Eu, 0x038Fu, 0x0390u, 0x03A9u, 0x03ACu, 0x03ADu, 0x03AEu, 0x03AFu,
-   0x03B0u, 0x03B9u, 0x03CCu, 0x03CDu, 0x03CEu, 0x2002u, 0x2003u, 0x3008u,
-   0x3009u, 0x349Eu, 0x34B9u, 0x34BBu, 0x34DFu, 0x3515u, 0x36EEu, 0x36FCu,
-   0x3781u, 0x382Fu, 0x3862u, 0x387Cu, 0x38C7u, 0x38E3u, 0x391Cu, 0x393Au,
-   0x3A2Eu, 0x3A6Cu, 0x3AE4u, 0x3B08u, 0x3B19u, 0x3B49u, 0x3B9Du, 0x3C18u,
-   0x3C4Eu, 0x3D33u, 0x3D96u, 0x3EACu, 0x3EB8u, 0x3F1Bu, 0x3FFCu, 0x4008u,
-   0x4018u, 0x4039u, 0x4046u, 0x4096u, 0x40E3u, 0x412Fu, 0x4202u, 0x4227u,
-   0x42A0u, 0x4301u, 0x4334u, 0x4359u, 0x43D5u, 0x43D9u, 0x440Bu, 0x446Bu,
-   0x452Bu, 0x455Du, 0x4561u, 0x456Bu, 0x45D7u, 0x45F9u, 0x4635u, 0x46BEu,
-   0x46C7u, 0x4995u, 0x49E6u, 0x4A6Eu, 0x4A76u, 0x4AB2u, 0x4B33u, 0x4BCEu,
-   0x4CCEu, 0x4CEDu, 0x4CF8u, 0x4D56u, 0x4E0Du, 0x4E26u, 0x4E32u, 0x4E38u,
-   0x4E39u, 0x4E3Du, 0x4E41u, 0x4E82u, 0x4E86u, 0x4EAEu, 0x4EC0u, 0x4ECCu,
-   0x4EE4u, 0x4F60u, 0x4F80u, 0x4F86u, 0x4F8Bu, 0x4FAEu, 0x4FBBu, 0x4FBFu,
-   0x5002u, 0x502Bu, 0x507Au, 0x5099u, 0x50CFu, 0x50DAu, 0x50E7u, 0x5140u,
-   0x5145u, 0x514Du, 0x5154u, 0x5164u, 0x5167u, 0x5168u, 0x5169u, 0x516Du,
-   0x5177u, 0x5180u, 0x518Du, 0x5192u, 0x5195u, 0x5197u, 0x51A4u, 0x51ACu,
-   0x51B5u, 0x51B7u, 0x51C9u, 0x51CCu, 0x51DCu, 0x51DEu, 0x51F5u, 0x5203u,
-   0x5207u, 0x5217u, 0x5229u, 0x523Au, 0x523Bu, 0x5246u, 0x5272u, 0x5277u,
-   0x5289u, 0x529Bu, 0x52A3u, 0x52B3u, 0x52C7u, 0x52C9u, 0x52D2u, 0x52DEu,
-   0x52E4u, 0x52F5u, 0x52FAu, 0x5305u, 0x5306u, 0x5317u, 0x533Fu, 0x5349u,
-   0x5351u, 0x535Au, 0x5373u, 0x5375u, 0x537Du, 0x537Fu, 0x53C3u, 0x53CAu,
-   0x53DFu, 0x53E5u, 0x53EBu, 0x53F1u, 0x5406u, 0x540Fu, 0x541Du, 0x5438u,
-   0x5442u, 0x5448u, 0x5468u, 0x549Eu, 0x54A2u, 0x54BDu, 0x54F6u, 0x5510u,
-   0x5553u, 0x5555u, 0x5563u, 0x5584u, 0x5587u, 0x5599u, 0x559Du, 0x55ABu,
-   0x55B3u, 0x55C0u, 0x55C2u, 0x55E2u, 0x5606u, 0x5651u, 0x5668u, 0x5674u,
-   0x56F9u, 0x5716u, 0x5717u, 0x578Bu, 0x57CEu, 0x57F4u, 0x580Du, 0x5831u,
-   0x5832u, 0x5840u, 0x585Au, 0x585Eu, 0x58A8u, 0x58ACu, 0x58B3u, 0x58D8u,
-   0x58DFu, 0x58EEu, 0x58F2u, 0x58F7u, 0x5906u, 0x591Au, 0x5922u, 0x5944u,
-   0x5948u, 0x5951u, 0x5954u, 0x5962u, 0x5973u, 0x59D8u, 0x59ECu, 0x5A1Bu,
-   0x5A27u, 0x5A62u, 0x5A66u, 0x5AB5u, 0x5B08u, 0x5B28u, 0x5B3Eu, 0x5B85u,
-   0x5BC3u, 0x5BD8u, 0x5BE7u, 0x5BEEu, 0x5BF3u, 0x5BFFu, 0x5C06u, 0x5C22u,
-   0x5C3Fu, 0x5C60u, 0x5C62u, 0x5C64u, 0x5C65u, 0x5C6Eu, 0x5C8Du, 0x5CC0u,
-   0x5D19u, 0x5D43u, 0x5D50u, 0x5D6Bu, 0x5D6Eu, 0x5D7Cu, 0x5DB2u, 0x5DBAu,
-   0x5DE1u, 0x5DE2u, 0x5DFDu, 0x5E28u, 0x5E3Du, 0x5E69u, 0x5E74u, 0x5EA6u,
-   0x5EB0u, 0x5EB3u, 0x5EB6u, 0x5EC9u, 0x5ECAu, 0x5ED2u, 0x5ED3u, 0x5ED9u,
-   0x5EECu, 0x5EFEu, 0x5F04u, 0x5F22u, 0x5F53u, 0x5F62u, 0x5F69u, 0x5F6Bu,
-   0x5F8Bu, 0x5F9Au, 0x5FA9u, 0x5FADu, 0x5FCDu, 0x5FD7u, 0x5FF5u, 0x5FF9u,
-   0x6012u, 0x601Cu, 0x6075u, 0x6081u, 0x6094u, 0x60C7u, 0x60D8u, 0x60E1u,
-   0x6108u, 0x6144u, 0x6148u, 0x614Cu, 0x614Eu, 0x6160u, 0x6168u, 0x617Au,
-   0x618Eu, 0x6190u, 0x61A4u, 0x61AFu, 0x61B2u, 0x61DEu, 0x61F2u, 0x61F6u,
-   0x6200u, 0x6210u, 0x621Bu, 0x622Eu, 0x6234u, 0x625Du, 0x62B1u, 0x62C9u,
-   0x62CFu, 0x62D3u, 0x62D4u, 0x62FCu, 0x62FEu, 0x633Du, 0x6350u, 0x6368u,
-   0x637Bu, 0x6383u, 0x63A0u, 0x63A9u, 0x63C4u, 0x63C5u, 0x63E4u, 0x641Cu,
-   0x6422u, 0x6452u, 0x6469u, 0x6477u, 0x647Eu, 0x649Au, 0x649Du, 0x64C4u,
-   0x654Fu, 0x6556u, 0x656Cu, 0x6578u, 0x6599u, 0x65C5u, 0x65E2u, 0x65E3u,
-   0x6613u, 0x6649u, 0x6674u, 0x6688u, 0x6691u, 0x669Cu, 0x66B4u, 0x66C6u,
-   0x66F4u, 0x66F8u, 0x6700u, 0x6717u, 0x671Bu, 0x6721u, 0x674Eu, 0x6753u,
-   0x6756u, 0x675Eu, 0x677Bu, 0x6785u, 0x6797u, 0x67F3u, 0x67FAu, 0x6817u,
-   0x681Fu, 0x6852u, 0x6881u, 0x6885u, 0x688Eu, 0x68A8u, 0x6914u, 0x6942u,
-   0x69A3u, 0x69EAu, 0x6A02u, 0x6A13u, 0x6AA8u, 0x6AD3u, 0x6ADBu, 0x6B04u,
-   0x6B21u, 0x6B54u, 0x6B72u, 0x6B77u, 0x6B79u, 0x6B9Fu, 0x6BAEu, 0x6BBAu,
-   0x6BBBu, 0x6C4Eu, 0x6C67u, 0x6C88u, 0x6CBFu, 0x6CCCu, 0x6CCDu, 0x6CE5u,
-   0x6D16u, 0x6D1Bu, 0x6D1Eu, 0x6D34u, 0x6D3Eu, 0x6D41u, 0x6D69u, 0x6D6Au,
-   0x6D77u, 0x6D78u, 0x6D85u, 0x6DCBu, 0x6DDAu, 0x6DEAu, 0x6DF9u, 0x6E1Au,
-   0x6E2Fu, 0x6E6Eu, 0x6E9Cu, 0x6EBAu, 0x6EC7u, 0x6ECBu, 0x6ED1u, 0x6EDBu,
-   0x6F0Fu, 0x6F22u, 0x6F23u, 0x6F6Eu, 0x6FC6u, 0x6FEBu, 0x6FFEu, 0x701Bu,
-   0x701Eu, 0x7039u, 0x704Au, 0x7070u, 0x7077u, 0x707Du, 0x7099u, 0x70ADu,
-   0x70C8u, 0x70D9u, 0x7145u, 0x7149u, 0x716Eu, 0x719Cu, 0x71CEu, 0x71D0u,
-   0x7210u, 0x721Bu, 0x7228u, 0x722Bu, 0x7235u, 0x7250u, 0x7262u, 0x7280u,
-   0x7295u, 0x72AFu, 0x72C0u, 0x72FCu, 0x732Au, 0x7375u, 0x737Au, 0x7387u,
-   0x738Bu, 0x73A5u, 0x73B2u, 0x73DEu, 0x7406u, 0x7409u, 0x7422u, 0x7447u,
-   0x745Cu, 0x7469u, 0x7471u, 0x7485u, 0x7489u, 0x7498u, 0x74CAu, 0x7506u,
-   0x7524u, 0x753Bu, 0x753Eu, 0x7559u, 0x7565u, 0x7570u, 0x75E2u, 0x7610u,
-   0x761Du, 0x761Fu, 0x7642u, 0x7669u, 0x76CAu, 0x76DBu, 0x76E7u, 0x76F4u,
-   0x7701u, 0x771Eu, 0x771Fu, 0x7740u, 0x774Au, 0x778Bu, 0x77A7u, 0x784Eu,
-   0x786Bu, 0x788Cu, 0x7891u, 0x78CAu, 0x78CCu, 0x78FBu, 0x792Au, 0x793Cu,
-   0x793Eu, 0x7948u, 0x7949u, 0x7950u, 0x7956u, 0x795Du, 0x795Eu, 0x7965u,
-   0x797Fu, 0x798Du, 0x798Eu, 0x798Fu, 0x79AEu, 0x79CAu, 0x79EBu, 0x7A1Cu,
-   0x7A40u, 0x7A4Au, 0x7A4Fu, 0x7A81u, 0x7AB1u, 0x7ACBu, 0x7AEEu, 0x7B20u,
-   0x7BC0u, 0x7BC6u, 0x7BC9u, 0x7C3Eu, 0x7C60u, 0x7C7Bu, 0x7C92u, 0x7CBEu,
-   0x7CD2u, 0x7CD6u, 0x7CE3u, 0x7CE7u, 0x7CE8u, 0x7D00u, 0x7D10u, 0x7D22u,
-   0x7D2Fu, 0x7D5Bu, 0x7D63u, 0x7DA0u, 0x7DBEu, 0x7DC7u, 0x7DF4u, 0x7E02u,
-   0x7E09u, 0x7E37u, 0x7E41u, 0x7E45u, 0x7F3Eu, 0x7F72u, 0x7F79u, 0x7F7Au,
-   0x7F85u, 0x7F95u, 0x7F9Au, 0x7FBDu, 0x7FFAu, 0x8001u, 0x8005u, 0x8046u,
-   0x8060u, 0x806Fu, 0x8070u, 0x807Eu, 0x808Bu, 0x80ADu, 0x80B2u, 0x8103u,
-   0x813Eu, 0x81D8u, 0x81E8u, 0x81EDu, 0x8201u, 0x8204u, 0x8218u, 0x826Fu,
-   0x8279u, 0x828Bu, 0x8291u, 0x829Du, 0x82B1u, 0x82B3u, 0x82BDu, 0x82E5u,
-   0x82E6u, 0x831Du, 0x8323u, 0x8336u, 0x8352u, 0x8353u, 0x8363u, 0x83ADu,
-   0x83BDu, 0x83C9u, 0x83CAu, 0x83CCu, 0x83DCu, 0x83E7u, 0x83EFu, 0x83F1u,
-   0x843Du, 0x8449u, 0x8457u, 0x84EEu, 0x84F1u, 0x84F3u, 0x84FCu, 0x8516u,
-   0x8564u, 0x85CDu, 0x85FAu, 0x8606u, 0x8612u, 0x862Du, 0x863Fu, 0x8650u,
-   0x865Cu, 0x8667u, 0x8669u, 0x8688u, 0x86A9u, 0x86E2u, 0x870Eu, 0x8728u,
-   0x876Bu, 0x8779u, 0x8786u, 0x87BAu, 0x87E1u, 0x8801u, 0x881Fu, 0x884Cu,
-   0x8860u, 0x8863u, 0x88C2u, 0x88CFu, 0x88D7u, 0x88DEu, 0x88E1u, 0x88F8u,
-   0x88FAu, 0x8910u, 0x8941u, 0x8964u, 0x8986u, 0x898Bu, 0x8996u, 0x8AA0u,
-   0x8AAAu, 0x8ABFu, 0x8ACBu, 0x8AD2u, 0x8AD6u, 0x8AEDu, 0x8AF8u, 0x8AFEu,
-   0x8B01u, 0x8B39u, 0x8B58u, 0x8B80u, 0x8B8Au, 0x8C48u, 0x8C55u, 0x8CABu,
-   0x8CC1u, 0x8CC2u, 0x8CC8u, 0x8CD3u, 0x8D08u, 0x8D1Bu, 0x8D77u, 0x8DBCu,
-   0x8DCBu, 0x8DEFu, 0x8DF0u, 0x8ECAu, 0x8ED4u, 0x8F26u, 0x8F2Au, 0x8F38u,
-   0x8F3Bu, 0x8F62u, 0x8F9Eu, 0x8FB0u, 0x8FB6u, 0x9023u, 0x9038u, 0x9072u,
-   0x907Cu, 0x908Fu, 0x9094u, 0x90CEu, 0x90DEu, 0x90F1u, 0x90FDu, 0x9111u,
-   0x911Bu, 0x916Au, 0x9199u, 0x91B4u, 0x91CCu, 0x91CFu, 0x91D1u, 0x9234u,
-   0x9238u, 0x9276u, 0x927Cu, 0x92D7u, 0x92D8u, 0x9304u, 0x934Au, 0x93F9u,
-   0x9415u, 0x958Bu, 0x95ADu, 0x95B7u, 0x962Eu, 0x964Bu, 0x964Du, 0x9675u,
-   0x9678u, 0x967Cu, 0x9686u, 0x96A3u, 0x96B7u, 0x96B8u, 0x96C3u, 0x96E2u,
-   0x96E3u, 0x96F6u, 0x96F7u, 0x9723u, 0x9732u, 0x9748u, 0x9756u, 0x97DBu,
-   0x97E0u, 0x97FFu, 0x980Bu, 0x9818u, 0x9829u, 0x983Bu, 0x985Eu, 0x98E2u,
-   0x98EFu, 0x98FCu, 0x9928u, 0x9929u, 0x99A7u, 0x99C2u, 0x99F1u, 0x99FEu,
-   0x9A6Au, 0x9B12u, 0x9B6Fu, 0x9C40u, 0x9C57u, 0x9CFDu, 0x9D67u, 0x9DB4u,
-   0x9DFAu, 0x9E1Eu, 0x9E7Fu, 0x9E97u, 0x9E9Fu, 0x9EBBu, 0x9ECEu, 0x9EF9u,
-   0x9EFEu, 0x9F05u, 0x9F0Fu, 0x9F16u, 0x9F3Bu, 0x9F43u, 0x9F8Du, 0x9F8Eu,
-   0x9F9Cu,
+   0x003B, 0x004B, 0x0060, 0x00B4, 0x00B7, 0x00C5, 0x02B9, 0x0300,
+   0x0301, 0x0313, 0x0385, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C,
+   0x038E, 0x038F, 0x0390, 0x03A9, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
+   0x03B0, 0x03B9, 0x03CC, 0x03CD, 0x03CE, 0x2002, 0x2003, 0x3008,
+   0x3009, 0x349E, 0x34B9, 0x34BB, 0x34DF, 0x3515, 0x36EE, 0x36FC,
+   0x3781, 0x382F, 0x3862, 0x387C, 0x38C7, 0x38E3, 0x391C, 0x393A,
+   0x3A2E, 0x3A6C, 0x3AE4, 0x3B08, 0x3B19, 0x3B49, 0x3B9D, 0x3C18,
+   0x3C4E, 0x3D33, 0x3D96, 0x3EAC, 0x3EB8, 0x3F1B, 0x3FFC, 0x4008,
+   0x4018, 0x4039, 0x4046, 0x4096, 0x40E3, 0x412F, 0x4202, 0x4227,
+   0x42A0, 0x4301, 0x4334, 0x4359, 0x43D5, 0x43D9, 0x440B, 0x446B,
+   0x452B, 0x455D, 0x4561, 0x456B, 0x45D7, 0x45F9, 0x4635, 0x46BE,
+   0x46C7, 0x4995, 0x49E6, 0x4A6E, 0x4A76, 0x4AB2, 0x4B33, 0x4BCE,
+   0x4CCE, 0x4CED, 0x4CF8, 0x4D56, 0x4E0D, 0x4E26, 0x4E32, 0x4E38,
+   0x4E39, 0x4E3D, 0x4E41, 0x4E82, 0x4E86, 0x4EAE, 0x4EC0, 0x4ECC,
+   0x4EE4, 0x4F60, 0x4F80, 0x4F86, 0x4F8B, 0x4FAE, 0x4FBB, 0x4FBF,
+   0x5002, 0x502B, 0x507A, 0x5099, 0x50CF, 0x50DA, 0x50E7, 0x5140,
+   0x5145, 0x514D, 0x5154, 0x5164, 0x5167, 0x5168, 0x5169, 0x516D,
+   0x5177, 0x5180, 0x518D, 0x5192, 0x5195, 0x5197, 0x51A4, 0x51AC,
+   0x51B5, 0x51B7, 0x51C9, 0x51CC, 0x51DC, 0x51DE, 0x51F5, 0x5203,
+   0x5207, 0x5217, 0x5229, 0x523A, 0x523B, 0x5246, 0x5272, 0x5277,
+   0x5289, 0x529B, 0x52A3, 0x52B3, 0x52C7, 0x52C9, 0x52D2, 0x52DE,
+   0x52E4, 0x52F5, 0x52FA, 0x5305, 0x5306, 0x5317, 0x533F, 0x5349,
+   0x5351, 0x535A, 0x5373, 0x5375, 0x537D, 0x537F, 0x53C3, 0x53CA,
+   0x53DF, 0x53E5, 0x53EB, 0x53F1, 0x5406, 0x540F, 0x541D, 0x5438,
+   0x5442, 0x5448, 0x5468, 0x549E, 0x54A2, 0x54BD, 0x54F6, 0x5510,
+   0x5553, 0x5555, 0x5563, 0x5584, 0x5587, 0x5599, 0x559D, 0x55AB,
+   0x55B3, 0x55C0, 0x55C2, 0x55E2, 0x5606, 0x5651, 0x5668, 0x5674,
+   0x56F9, 0x5716, 0x5717, 0x578B, 0x57CE, 0x57F4, 0x580D, 0x5831,
+   0x5832, 0x5840, 0x585A, 0x585E, 0x58A8, 0x58AC, 0x58B3, 0x58D8,
+   0x58DF, 0x58EE, 0x58F2, 0x58F7, 0x5906, 0x591A, 0x5922, 0x5944,
+   0x5948, 0x5951, 0x5954, 0x5962, 0x5973, 0x59D8, 0x59EC, 0x5A1B,
+   0x5A27, 0x5A62, 0x5A66, 0x5AB5, 0x5B08, 0x5B28, 0x5B3E, 0x5B85,
+   0x5BC3, 0x5BD8, 0x5BE7, 0x5BEE, 0x5BF3, 0x5BFF, 0x5C06, 0x5C22,
+   0x5C3F, 0x5C60, 0x5C62, 0x5C64, 0x5C65, 0x5C6E, 0x5C8D, 0x5CC0,
+   0x5D19, 0x5D43, 0x5D50, 0x5D6B, 0x5D6E, 0x5D7C, 0x5DB2, 0x5DBA,
+   0x5DE1, 0x5DE2, 0x5DFD, 0x5E28, 0x5E3D, 0x5E69, 0x5E74, 0x5EA6,
+   0x5EB0, 0x5EB3, 0x5EB6, 0x5EC9, 0x5ECA, 0x5ED2, 0x5ED3, 0x5ED9,
+   0x5EEC, 0x5EFE, 0x5F04, 0x5F22, 0x5F53, 0x5F62, 0x5F69, 0x5F6B,
+   0x5F8B, 0x5F9A, 0x5FA9, 0x5FAD, 0x5FCD, 0x5FD7, 0x5FF5, 0x5FF9,
+   0x6012, 0x601C, 0x6075, 0x6081, 0x6094, 0x60C7, 0x60D8, 0x60E1,
+   0x6108, 0x6144, 0x6148, 0x614C, 0x614E, 0x6160, 0x6168, 0x617A,
+   0x618E, 0x6190, 0x61A4, 0x61AF, 0x61B2, 0x61DE, 0x61F2, 0x61F6,
+   0x6200, 0x6210, 0x621B, 0x622E, 0x6234, 0x625D, 0x62B1, 0x62C9,
+   0x62CF, 0x62D3, 0x62D4, 0x62FC, 0x62FE, 0x633D, 0x6350, 0x6368,
+   0x637B, 0x6383, 0x63A0, 0x63A9, 0x63C4, 0x63C5, 0x63E4, 0x641C,
+   0x6422, 0x6452, 0x6469, 0x6477, 0x647E, 0x649A, 0x649D, 0x64C4,
+   0x654F, 0x6556, 0x656C, 0x6578, 0x6599, 0x65C5, 0x65E2, 0x65E3,
+   0x6613, 0x6649, 0x6674, 0x6688, 0x6691, 0x669C, 0x66B4, 0x66C6,
+   0x66F4, 0x66F8, 0x6700, 0x6717, 0x671B, 0x6721, 0x674E, 0x6753,
+   0x6756, 0x675E, 0x677B, 0x6785, 0x6797, 0x67F3, 0x67FA, 0x6817,
+   0x681F, 0x6852, 0x6881, 0x6885, 0x688E, 0x68A8, 0x6914, 0x6942,
+   0x69A3, 0x69EA, 0x6A02, 0x6A13, 0x6AA8, 0x6AD3, 0x6ADB, 0x6B04,
+   0x6B21, 0x6B54, 0x6B72, 0x6B77, 0x6B79, 0x6B9F, 0x6BAE, 0x6BBA,
+   0x6BBB, 0x6C4E, 0x6C67, 0x6C88, 0x6CBF, 0x6CCC, 0x6CCD, 0x6CE5,
+   0x6D16, 0x6D1B, 0x6D1E, 0x6D34, 0x6D3E, 0x6D41, 0x6D69, 0x6D6A,
+   0x6D77, 0x6D78, 0x6D85, 0x6DCB, 0x6DDA, 0x6DEA, 0x6DF9, 0x6E1A,
+   0x6E2F, 0x6E6E, 0x6E9C, 0x6EBA, 0x6EC7, 0x6ECB, 0x6ED1, 0x6EDB,
+   0x6F0F, 0x6F22, 0x6F23, 0x6F6E, 0x6FC6, 0x6FEB, 0x6FFE, 0x701B,
+   0x701E, 0x7039, 0x704A, 0x7070, 0x7077, 0x707D, 0x7099, 0x70AD,
+   0x70C8, 0x70D9, 0x7145, 0x7149, 0x716E, 0x719C, 0x71CE, 0x71D0,
+   0x7210, 0x721B, 0x7228, 0x722B, 0x7235, 0x7250, 0x7262, 0x7280,
+   0x7295, 0x72AF, 0x72C0, 0x72FC, 0x732A, 0x7375, 0x737A, 0x7387,
+   0x738B, 0x73A5, 0x73B2, 0x73DE, 0x7406, 0x7409, 0x7422, 0x7447,
+   0x745C, 0x7469, 0x7471, 0x7485, 0x7489, 0x7498, 0x74CA, 0x7506,
+   0x7524, 0x753B, 0x753E, 0x7559, 0x7565, 0x7570, 0x75E2, 0x7610,
+   0x761D, 0x761F, 0x7642, 0x7669, 0x76CA, 0x76DB, 0x76E7, 0x76F4,
+   0x7701, 0x771E, 0x771F, 0x7740, 0x774A, 0x778B, 0x77A7, 0x784E,
+   0x786B, 0x788C, 0x7891, 0x78CA, 0x78CC, 0x78FB, 0x792A, 0x793C,
+   0x793E, 0x7948, 0x7949, 0x7950, 0x7956, 0x795D, 0x795E, 0x7965,
+   0x797F, 0x798D, 0x798E, 0x798F, 0x79AE, 0x79CA, 0x79EB, 0x7A1C,
+   0x7A40, 0x7A4A, 0x7A4F, 0x7A81, 0x7AB1, 0x7ACB, 0x7AEE, 0x7B20,
+   0x7BC0, 0x7BC6, 0x7BC9, 0x7C3E, 0x7C60, 0x7C7B, 0x7C92, 0x7CBE,
+   0x7CD2, 0x7CD6, 0x7CE3, 0x7CE7, 0x7CE8, 0x7D00, 0x7D10, 0x7D22,
+   0x7D2F, 0x7D5B, 0x7D63, 0x7DA0, 0x7DBE, 0x7DC7, 0x7DF4, 0x7E02,
+   0x7E09, 0x7E37, 0x7E41, 0x7E45, 0x7F3E, 0x7F72, 0x7F79, 0x7F7A,
+   0x7F85, 0x7F95, 0x7F9A, 0x7FBD, 0x7FFA, 0x8001, 0x8005, 0x8046,
+   0x8060, 0x806F, 0x8070, 0x807E, 0x808B, 0x80AD, 0x80B2, 0x8103,
+   0x813E, 0x81D8, 0x81E8, 0x81ED, 0x8201, 0x8204, 0x8218, 0x826F,
+   0x8279, 0x828B, 0x8291, 0x829D, 0x82B1, 0x82B3, 0x82BD, 0x82E5,
+   0x82E6, 0x831D, 0x8323, 0x8336, 0x8352, 0x8353, 0x8363, 0x83AD,
+   0x83BD, 0x83C9, 0x83CA, 0x83CC, 0x83DC, 0x83E7, 0x83EF, 0x83F1,
+   0x843D, 0x8449, 0x8457, 0x84EE, 0x84F1, 0x84F3, 0x84FC, 0x8516,
+   0x8564, 0x85CD, 0x85FA, 0x8606, 0x8612, 0x862D, 0x863F, 0x8650,
+   0x865C, 0x8667, 0x8669, 0x8688, 0x86A9, 0x86E2, 0x870E, 0x8728,
+   0x876B, 0x8779, 0x8786, 0x87BA, 0x87E1, 0x8801, 0x881F, 0x884C,
+   0x8860, 0x8863, 0x88C2, 0x88CF, 0x88D7, 0x88DE, 0x88E1, 0x88F8,
+   0x88FA, 0x8910, 0x8941, 0x8964, 0x8986, 0x898B, 0x8996, 0x8AA0,
+   0x8AAA, 0x8ABF, 0x8ACB, 0x8AD2, 0x8AD6, 0x8AED, 0x8AF8, 0x8AFE,
+   0x8B01, 0x8B39, 0x8B58, 0x8B80, 0x8B8A, 0x8C48, 0x8C55, 0x8CAB,
+   0x8CC1, 0x8CC2, 0x8CC8, 0x8CD3, 0x8D08, 0x8D1B, 0x8D77, 0x8DBC,
+   0x8DCB, 0x8DEF, 0x8DF0, 0x8ECA, 0x8ED4, 0x8F26, 0x8F2A, 0x8F38,
+   0x8F3B, 0x8F62, 0x8F9E, 0x8FB0, 0x8FB6, 0x9023, 0x9038, 0x9072,
+   0x907C, 0x908F, 0x9094, 0x90CE, 0x90DE, 0x90F1, 0x90FD, 0x9111,
+   0x911B, 0x916A, 0x9199, 0x91B4, 0x91CC, 0x91CF, 0x91D1, 0x9234,
+   0x9238, 0x9276, 0x927C, 0x92D7, 0x92D8, 0x9304, 0x934A, 0x93F9,
+   0x9415, 0x958B, 0x95AD, 0x95B7, 0x962E, 0x964B, 0x964D, 0x9675,
+   0x9678, 0x967C, 0x9686, 0x96A3, 0x96B7, 0x96B8, 0x96C3, 0x96E2,
+   0x96E3, 0x96F6, 0x96F7, 0x9723, 0x9732, 0x9748, 0x9756, 0x97DB,
+   0x97E0, 0x97FF, 0x980B, 0x9818, 0x9829, 0x983B, 0x985E, 0x98E2,
+   0x98EF, 0x98FC, 0x9928, 0x9929, 0x99A7, 0x99C2, 0x99F1, 0x99FE,
+   0x9A6A, 0x9B12, 0x9B6F, 0x9C40, 0x9C57, 0x9CFD, 0x9D67, 0x9DB4,
+   0x9DFA, 0x9E1E, 0x9E7F, 0x9E97, 0x9E9F, 0x9EBB, 0x9ECE, 0x9EF9,
+   0x9EFE, 0x9F05, 0x9F0F, 0x9F16, 0x9F3B, 0x9F43, 0x9F8D, 0x9F8E,
+   0x9F9C,
 };
-static const uint16_t
-_hb_ucd_dm1_p2_map[110] =
+static const uint16_t _hb_ucd_dm1_p2_map[110]=
 {
-   0x0122u, 0x051Cu, 0x0525u, 0x054Bu, 0x063Au, 0x0804u, 0x08DEu, 0x0A2Cu,
-   0x0B63u, 0x14E4u, 0x16A8u, 0x16EAu, 0x19C8u, 0x1B18u, 0x1D0Bu, 0x1DE4u,
-   0x1DE6u, 0x2183u, 0x219Fu, 0x2331u, 0x26D4u, 0x2844u, 0x284Au, 0x2B0Cu,
-   0x2BF1u, 0x300Au, 0x32B8u, 0x335Fu, 0x3393u, 0x339Cu, 0x33C3u, 0x33D5u,
-   0x346Du, 0x36A3u, 0x38A7u, 0x3A8Du, 0x3AFAu, 0x3CBCu, 0x3D1Eu, 0x3ED1u,
-   0x3F5Eu, 0x3F8Eu, 0x4263u, 0x42EEu, 0x43ABu, 0x4608u, 0x4735u, 0x4814u,
-   0x4C36u, 0x4C92u, 0x4FA1u, 0x4FB8u, 0x5044u, 0x50F2u, 0x50F3u, 0x5119u,
-   0x5133u, 0x5249u, 0x541Du, 0x5626u, 0x569Au, 0x56C5u, 0x597Cu, 0x5AA7u,
-   0x5BABu, 0x5C80u, 0x5CD0u, 0x5F86u, 0x61DAu, 0x6228u, 0x6247u, 0x62D9u,
-   0x633Eu, 0x64DAu, 0x6523u, 0x65A8u, 0x67A7u, 0x67B5u, 0x6B3Cu, 0x6C36u,
-   0x6CD5u, 0x6D6Bu, 0x6F2Cu, 0x6FB1u, 0x70D2u, 0x73CAu, 0x7667u, 0x78AEu,
-   0x7966u, 0x7CA8u, 0x7ED3u, 0x7F2Fu, 0x85D2u, 0x85EDu, 0x872Eu, 0x8BFAu,
-   0x8D77u, 0x9145u, 0x91DFu, 0x921Au, 0x940Au, 0x9496u, 0x95B6u, 0x9B30u,
-   0xA0CEu, 0xA105u, 0xA20Eu, 0xA291u, 0xA392u, 0xA600u,
+   0x0122, 0x051C, 0x0525, 0x054B, 0x063A, 0x0804, 0x08DE, 0x0A2C,
+   0x0B63, 0x14E4, 0x16A8, 0x16EA, 0x19C8, 0x1B18, 0x1D0B, 0x1DE4,
+   0x1DE6, 0x2183, 0x219F, 0x2331, 0x26D4, 0x2844, 0x284A, 0x2B0C,
+   0x2BF1, 0x300A, 0x32B8, 0x335F, 0x3393, 0x339C, 0x33C3, 0x33D5,
+   0x346D, 0x36A3, 0x38A7, 0x3A8D, 0x3AFA, 0x3CBC, 0x3D1E, 0x3ED1,
+   0x3F5E, 0x3F8E, 0x4263, 0x42EE, 0x43AB, 0x4608, 0x4735, 0x4814,
+   0x4C36, 0x4C92, 0x4FA1, 0x4FB8, 0x5044, 0x50F2, 0x50F3, 0x5119,
+   0x5133, 0x5249, 0x541D, 0x5626, 0x569A, 0x56C5, 0x597C, 0x5AA7,
+   0x5BAB, 0x5C80, 0x5CD0, 0x5F86, 0x61DA, 0x6228, 0x6247, 0x62D9,
+   0x633E, 0x64DA, 0x6523, 0x65A8, 0x67A7, 0x67B5, 0x6B3C, 0x6C36,
+   0x6CD5, 0x6D6B, 0x6F2C, 0x6FB1, 0x70D2, 0x73CA, 0x7667, 0x78AE,
+   0x7966, 0x7CA8, 0x7ED3, 0x7F2F, 0x85D2, 0x85ED, 0x872E, 0x8BFA,
+   0x8D77, 0x9145, 0x91DF, 0x921A, 0x940A, 0x9496, 0x95B6, 0x9B30,
+   0xA0CE, 0xA105, 0xA20E, 0xA291, 0xA392, 0xA600,
 };
-static const uint32_t
-_hb_ucd_dm2_u32_map[638] =
+static const uint32_t _hb_ucd_dm2_u32_map[638]=
 {
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x003Cu, 0x0338u, 0x226Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x003Du, 0x0338u, 0x2260u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x003Eu, 0x0338u, 0x226Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0300u, 0x00C0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0301u, 0x00C1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0302u, 0x00C2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0303u, 0x00C3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0304u, 0x0100u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0306u, 0x0102u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0307u, 0x0226u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0308u, 0x00C4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0309u, 0x1EA2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x030Au, 0x00C5u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x030Cu, 0x01CDu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x030Fu, 0x0200u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0311u, 0x0202u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0323u, 0x1EA0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0325u, 0x1E00u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0041u, 0x0328u, 0x0104u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0042u, 0x0307u, 0x1E02u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0042u, 0x0323u, 0x1E04u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0042u, 0x0331u, 0x1E06u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0043u, 0x0301u, 0x0106u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0043u, 0x0302u, 0x0108u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0043u, 0x0307u, 0x010Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0043u, 0x030Cu, 0x010Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0043u, 0x0327u, 0x00C7u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x0307u, 0x1E0Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x030Cu, 0x010Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x0323u, 0x1E0Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x0327u, 0x1E10u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x032Du, 0x1E12u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0044u, 0x0331u, 0x1E0Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0300u, 0x00C8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0301u, 0x00C9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0302u, 0x00CAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0303u, 0x1EBCu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0304u, 0x0112u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0306u, 0x0114u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0307u, 0x0116u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0308u, 0x00CBu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0309u, 0x1EBAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x030Cu, 0x011Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x030Fu, 0x0204u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0311u, 0x0206u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0323u, 0x1EB8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0327u, 0x0228u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0328u, 0x0118u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x032Du, 0x1E18u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0045u, 0x0330u, 0x1E1Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0046u, 0x0307u, 0x1E1Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0301u, 0x01F4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0302u, 0x011Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0304u, 0x1E20u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0306u, 0x011Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0307u, 0x0120u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x030Cu, 0x01E6u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0047u, 0x0327u, 0x0122u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x0302u, 0x0124u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x0307u, 0x1E22u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x0308u, 0x1E26u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x030Cu, 0x021Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x0323u, 0x1E24u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x0327u, 0x1E28u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0048u, 0x032Eu, 0x1E2Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0300u, 0x00CCu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0301u, 0x00CDu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0302u, 0x00CEu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0303u, 0x0128u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0304u, 0x012Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0306u, 0x012Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0307u, 0x0130u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0308u, 0x00CFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0309u, 0x1EC8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x030Cu, 0x01CFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x030Fu, 0x0208u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0311u, 0x020Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0323u, 0x1ECAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0328u, 0x012Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0049u, 0x0330u, 0x1E2Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Au, 0x0302u, 0x0134u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Bu, 0x0301u, 0x1E30u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Bu, 0x030Cu, 0x01E8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Bu, 0x0323u, 0x1E32u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Bu, 0x0327u, 0x0136u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Bu, 0x0331u, 0x1E34u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x0301u, 0x0139u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x030Cu, 0x013Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x0323u, 0x1E36u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x0327u, 0x013Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x032Du, 0x1E3Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Cu, 0x0331u, 0x1E3Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Du, 0x0301u, 0x1E3Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Du, 0x0307u, 0x1E40u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Du, 0x0323u, 0x1E42u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0300u, 0x01F8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0301u, 0x0143u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0303u, 0x00D1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0307u, 0x1E44u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x030Cu, 0x0147u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0323u, 0x1E46u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0327u, 0x0145u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x032Du, 0x1E4Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Eu, 0x0331u, 0x1E48u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0300u, 0x00D2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0301u, 0x00D3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0302u, 0x00D4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0303u, 0x00D5u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0304u, 0x014Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0306u, 0x014Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0307u, 0x022Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0308u, 0x00D6u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0309u, 0x1ECEu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x030Bu, 0x0150u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x030Cu, 0x01D1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x030Fu, 0x020Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0311u, 0x020Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x031Bu, 0x01A0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0323u, 0x1ECCu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x004Fu, 0x0328u, 0x01EAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0050u, 0x0301u, 0x1E54u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0050u, 0x0307u, 0x1E56u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0301u, 0x0154u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0307u, 0x1E58u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x030Cu, 0x0158u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x030Fu, 0x0210u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0311u, 0x0212u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0323u, 0x1E5Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0327u, 0x0156u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0052u, 0x0331u, 0x1E5Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0301u, 0x015Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0302u, 0x015Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0307u, 0x1E60u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x030Cu, 0x0160u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0323u, 0x1E62u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0326u, 0x0218u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0053u, 0x0327u, 0x015Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x0307u, 0x1E6Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x030Cu, 0x0164u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x0323u, 0x1E6Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x0326u, 0x021Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x0327u, 0x0162u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x032Du, 0x1E70u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0054u, 0x0331u, 0x1E6Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0300u, 0x00D9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0301u, 0x00DAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0302u, 0x00DBu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0303u, 0x0168u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0304u, 0x016Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0306u, 0x016Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0308u, 0x00DCu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0309u, 0x1EE6u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x030Au, 0x016Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x030Bu, 0x0170u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x030Cu, 0x01D3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x030Fu, 0x0214u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0311u, 0x0216u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x031Bu, 0x01AFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0323u, 0x1EE4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0324u, 0x1E72u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0328u, 0x0172u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x032Du, 0x1E76u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0055u, 0x0330u, 0x1E74u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0056u, 0x0303u, 0x1E7Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0056u, 0x0323u, 0x1E7Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0300u, 0x1E80u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0301u, 0x1E82u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0302u, 0x0174u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0307u, 0x1E86u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0308u, 0x1E84u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0057u, 0x0323u, 0x1E88u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0058u, 0x0307u, 0x1E8Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0058u, 0x0308u, 0x1E8Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0300u, 0x1EF2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0301u, 0x00DDu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0302u, 0x0176u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0303u, 0x1EF8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0304u, 0x0232u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0307u, 0x1E8Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0308u, 0x0178u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0309u, 0x1EF6u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0059u, 0x0323u, 0x1EF4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x0301u, 0x0179u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x0302u, 0x1E90u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x0307u, 0x017Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x030Cu, 0x017Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x0323u, 0x1E92u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x005Au, 0x0331u, 0x1E94u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0300u, 0x00E0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0301u, 0x00E1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0302u, 0x00E2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0303u, 0x00E3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0304u, 0x0101u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0306u, 0x0103u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0307u, 0x0227u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0308u, 0x00E4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0309u, 0x1EA3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x030Au, 0x00E5u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x030Cu, 0x01CEu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x030Fu, 0x0201u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0311u, 0x0203u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0323u, 0x1EA1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0325u, 0x1E01u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0061u, 0x0328u, 0x0105u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0062u, 0x0307u, 0x1E03u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0062u, 0x0323u, 0x1E05u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0062u, 0x0331u, 0x1E07u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0063u, 0x0301u, 0x0107u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0063u, 0x0302u, 0x0109u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0063u, 0x0307u, 0x010Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0063u, 0x030Cu, 0x010Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0063u, 0x0327u, 0x00E7u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x0307u, 0x1E0Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x030Cu, 0x010Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x0323u, 0x1E0Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x0327u, 0x1E11u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x032Du, 0x1E13u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0064u, 0x0331u, 0x1E0Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0300u, 0x00E8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0301u, 0x00E9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0302u, 0x00EAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0303u, 0x1EBDu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0304u, 0x0113u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0306u, 0x0115u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0307u, 0x0117u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0308u, 0x00EBu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0309u, 0x1EBBu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x030Cu, 0x011Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x030Fu, 0x0205u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0311u, 0x0207u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0323u, 0x1EB9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0327u, 0x0229u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0328u, 0x0119u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x032Du, 0x1E19u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0065u, 0x0330u, 0x1E1Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0066u, 0x0307u, 0x1E1Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0301u, 0x01F5u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0302u, 0x011Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0304u, 0x1E21u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0306u, 0x011Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0307u, 0x0121u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x030Cu, 0x01E7u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0067u, 0x0327u, 0x0123u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0302u, 0x0125u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0307u, 0x1E23u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0308u, 0x1E27u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x030Cu, 0x021Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0323u, 0x1E25u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0327u, 0x1E29u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x032Eu, 0x1E2Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0068u, 0x0331u, 0x1E96u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0300u, 0x00ECu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0301u, 0x00EDu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0302u, 0x00EEu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0303u, 0x0129u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0304u, 0x012Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0306u, 0x012Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0308u, 0x00EFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0309u, 0x1EC9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x030Cu, 0x01D0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x030Fu, 0x0209u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0311u, 0x020Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0323u, 0x1ECBu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0328u, 0x012Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0069u, 0x0330u, 0x1E2Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Au, 0x0302u, 0x0135u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Au, 0x030Cu, 0x01F0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Bu, 0x0301u, 0x1E31u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Bu, 0x030Cu, 0x01E9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Bu, 0x0323u, 0x1E33u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Bu, 0x0327u, 0x0137u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Bu, 0x0331u, 0x1E35u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x0301u, 0x013Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x030Cu, 0x013Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x0323u, 0x1E37u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x0327u, 0x013Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x032Du, 0x1E3Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Cu, 0x0331u, 0x1E3Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Du, 0x0301u, 0x1E3Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Du, 0x0307u, 0x1E41u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Du, 0x0323u, 0x1E43u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0300u, 0x01F9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0301u, 0x0144u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0303u, 0x00F1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0307u, 0x1E45u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x030Cu, 0x0148u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0323u, 0x1E47u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0327u, 0x0146u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x032Du, 0x1E4Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Eu, 0x0331u, 0x1E49u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0300u, 0x00F2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0301u, 0x00F3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0302u, 0x00F4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0303u, 0x00F5u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0304u, 0x014Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0306u, 0x014Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0307u, 0x022Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0308u, 0x00F6u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0309u, 0x1ECFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x030Bu, 0x0151u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x030Cu, 0x01D2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x030Fu, 0x020Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0311u, 0x020Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x031Bu, 0x01A1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0323u, 0x1ECDu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x006Fu, 0x0328u, 0x01EBu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0070u, 0x0301u, 0x1E55u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0070u, 0x0307u, 0x1E57u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0301u, 0x0155u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0307u, 0x1E59u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x030Cu, 0x0159u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x030Fu, 0x0211u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0311u, 0x0213u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0323u, 0x1E5Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0327u, 0x0157u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0072u, 0x0331u, 0x1E5Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0301u, 0x015Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0302u, 0x015Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0307u, 0x1E61u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x030Cu, 0x0161u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0323u, 0x1E63u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0326u, 0x0219u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0073u, 0x0327u, 0x015Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0307u, 0x1E6Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0308u, 0x1E97u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x030Cu, 0x0165u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0323u, 0x1E6Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0326u, 0x021Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0327u, 0x0163u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x032Du, 0x1E71u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0074u, 0x0331u, 0x1E6Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0300u, 0x00F9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0301u, 0x00FAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0302u, 0x00FBu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0303u, 0x0169u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0304u, 0x016Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0306u, 0x016Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0308u, 0x00FCu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0309u, 0x1EE7u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x030Au, 0x016Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x030Bu, 0x0171u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x030Cu, 0x01D4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x030Fu, 0x0215u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0311u, 0x0217u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x031Bu, 0x01B0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0323u, 0x1EE5u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0324u, 0x1E73u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0328u, 0x0173u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x032Du, 0x1E77u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0075u, 0x0330u, 0x1E75u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0076u, 0x0303u, 0x1E7Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0076u, 0x0323u, 0x1E7Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0300u, 0x1E81u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0301u, 0x1E83u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0302u, 0x0175u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0307u, 0x1E87u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0308u, 0x1E85u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x030Au, 0x1E98u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0077u, 0x0323u, 0x1E89u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0078u, 0x0307u, 0x1E8Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0078u, 0x0308u, 0x1E8Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0300u, 0x1EF3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0301u, 0x00FDu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0302u, 0x0177u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0303u, 0x1EF9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0304u, 0x0233u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0307u, 0x1E8Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0308u, 0x00FFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0309u, 0x1EF7u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x030Au, 0x1E99u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0079u, 0x0323u, 0x1EF5u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x0301u, 0x017Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x0302u, 0x1E91u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x0307u, 0x017Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x030Cu, 0x017Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x0323u, 0x1E93u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x007Au, 0x0331u, 0x1E95u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00A8u, 0x0300u, 0x1FEDu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00A8u, 0x0301u, 0x0385u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00A8u, 0x0342u, 0x1FC1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2u, 0x0300u, 0x1EA6u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2u, 0x0301u, 0x1EA4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2u, 0x0303u, 0x1EAAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2u, 0x0309u, 0x1EA8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00C4u, 0x0304u, 0x01DEu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00C5u, 0x0301u, 0x01FAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00C6u, 0x0301u, 0x01FCu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00C6u, 0x0304u, 0x01E2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00C7u, 0x0301u, 0x1E08u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00CAu, 0x0300u, 0x1EC0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00CAu, 0x0301u, 0x1EBEu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00CAu, 0x0303u, 0x1EC4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00CAu, 0x0309u, 0x1EC2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00CFu, 0x0301u, 0x1E2Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4u, 0x0300u, 0x1ED2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4u, 0x0301u, 0x1ED0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4u, 0x0303u, 0x1ED6u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4u, 0x0309u, 0x1ED4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00D5u, 0x0301u, 0x1E4Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00D5u, 0x0304u, 0x022Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00D5u, 0x0308u, 0x1E4Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00D6u, 0x0304u, 0x022Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00D8u, 0x0301u, 0x01FEu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00DCu, 0x0300u, 0x01DBu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00DCu, 0x0301u, 0x01D7u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00DCu, 0x0304u, 0x01D5u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00DCu, 0x030Cu, 0x01D9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2u, 0x0300u, 0x1EA7u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2u, 0x0301u, 0x1EA5u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2u, 0x0303u, 0x1EABu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2u, 0x0309u, 0x1EA9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00E4u, 0x0304u, 0x01DFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00E5u, 0x0301u, 0x01FBu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00E6u, 0x0301u, 0x01FDu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00E6u, 0x0304u, 0x01E3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00E7u, 0x0301u, 0x1E09u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00EAu, 0x0300u, 0x1EC1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00EAu, 0x0301u, 0x1EBFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00EAu, 0x0303u, 0x1EC5u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00EAu, 0x0309u, 0x1EC3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00EFu, 0x0301u, 0x1E2Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4u, 0x0300u, 0x1ED3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4u, 0x0301u, 0x1ED1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4u, 0x0303u, 0x1ED7u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4u, 0x0309u, 0x1ED5u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00F5u, 0x0301u, 0x1E4Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00F5u, 0x0304u, 0x022Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00F5u, 0x0308u, 0x1E4Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00F6u, 0x0304u, 0x022Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00F8u, 0x0301u, 0x01FFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00FCu, 0x0300u, 0x01DCu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00FCu, 0x0301u, 0x01D8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00FCu, 0x0304u, 0x01D6u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x00FCu, 0x030Cu, 0x01DAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0102u, 0x0300u, 0x1EB0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0102u, 0x0301u, 0x1EAEu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0102u, 0x0303u, 0x1EB4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0102u, 0x0309u, 0x1EB2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0103u, 0x0300u, 0x1EB1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0103u, 0x0301u, 0x1EAFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0103u, 0x0303u, 0x1EB5u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0103u, 0x0309u, 0x1EB3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0112u, 0x0300u, 0x1E14u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0112u, 0x0301u, 0x1E16u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0113u, 0x0300u, 0x1E15u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0113u, 0x0301u, 0x1E17u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x014Cu, 0x0300u, 0x1E50u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x014Cu, 0x0301u, 0x1E52u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x014Du, 0x0300u, 0x1E51u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x014Du, 0x0301u, 0x1E53u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x015Au, 0x0307u, 0x1E64u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x015Bu, 0x0307u, 0x1E65u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0160u, 0x0307u, 0x1E66u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0161u, 0x0307u, 0x1E67u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0168u, 0x0301u, 0x1E78u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0169u, 0x0301u, 0x1E79u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x016Au, 0x0308u, 0x1E7Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x016Bu, 0x0308u, 0x1E7Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x017Fu, 0x0307u, 0x1E9Bu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0u, 0x0300u, 0x1EDCu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0u, 0x0301u, 0x1EDAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0u, 0x0303u, 0x1EE0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0u, 0x0309u, 0x1EDEu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0u, 0x0323u, 0x1EE2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1u, 0x0300u, 0x1EDDu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1u, 0x0301u, 0x1EDBu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1u, 0x0303u, 0x1EE1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1u, 0x0309u, 0x1EDFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1u, 0x0323u, 0x1EE3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01AFu, 0x0300u, 0x1EEAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01AFu, 0x0301u, 0x1EE8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01AFu, 0x0303u, 0x1EEEu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01AFu, 0x0309u, 0x1EECu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01AFu, 0x0323u, 0x1EF0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0u, 0x0300u, 0x1EEBu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0u, 0x0301u, 0x1EE9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0u, 0x0303u, 0x1EEFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0u, 0x0309u, 0x1EEDu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0u, 0x0323u, 0x1EF1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01B7u, 0x030Cu, 0x01EEu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01EAu, 0x0304u, 0x01ECu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x01EBu, 0x0304u, 0x01EDu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0226u, 0x0304u, 0x01E0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0227u, 0x0304u, 0x01E1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0228u, 0x0306u, 0x1E1Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0229u, 0x0306u, 0x1E1Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x022Eu, 0x0304u, 0x0230u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x022Fu, 0x0304u, 0x0231u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0292u, 0x030Cu, 0x01EFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0308u, 0x0301u, 0x0000u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0300u, 0x1FBAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0301u, 0x0386u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0304u, 0x1FB9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0306u, 0x1FB8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0313u, 0x1F08u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0314u, 0x1F09u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0391u, 0x0345u, 0x1FBCu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0395u, 0x0300u, 0x1FC8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0395u, 0x0301u, 0x0388u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0395u, 0x0313u, 0x1F18u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0395u, 0x0314u, 0x1F19u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0397u, 0x0300u, 0x1FCAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0397u, 0x0301u, 0x0389u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0397u, 0x0313u, 0x1F28u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0397u, 0x0314u, 0x1F29u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0397u, 0x0345u, 0x1FCCu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0300u, 0x1FDAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0301u, 0x038Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0304u, 0x1FD9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0306u, 0x1FD8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0308u, 0x03AAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0313u, 0x1F38u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0399u, 0x0314u, 0x1F39u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x039Fu, 0x0300u, 0x1FF8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x039Fu, 0x0301u, 0x038Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x039Fu, 0x0313u, 0x1F48u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x039Fu, 0x0314u, 0x1F49u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03A1u, 0x0314u, 0x1FECu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0300u, 0x1FEAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0301u, 0x038Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0304u, 0x1FE9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0306u, 0x1FE8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0308u, 0x03ABu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5u, 0x0314u, 0x1F59u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9u, 0x0300u, 0x1FFAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9u, 0x0301u, 0x038Fu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9u, 0x0313u, 0x1F68u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9u, 0x0314u, 0x1F69u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9u, 0x0345u, 0x1FFCu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03ACu, 0x0345u, 0x1FB4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03AEu, 0x0345u, 0x1FC4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0300u, 0x1F70u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0301u, 0x03ACu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0304u, 0x1FB1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0306u, 0x1FB0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0313u, 0x1F00u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0314u, 0x1F01u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0342u, 0x1FB6u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1u, 0x0345u, 0x1FB3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5u, 0x0300u, 0x1F72u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5u, 0x0301u, 0x03ADu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5u, 0x0313u, 0x1F10u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5u, 0x0314u, 0x1F11u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0300u, 0x1F74u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0301u, 0x03AEu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0313u, 0x1F20u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0314u, 0x1F21u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0342u, 0x1FC6u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7u, 0x0345u, 0x1FC3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0300u, 0x1F76u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0301u, 0x03AFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0304u, 0x1FD1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0306u, 0x1FD0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0308u, 0x03CAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0313u, 0x1F30u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0314u, 0x1F31u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9u, 0x0342u, 0x1FD6u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03BFu, 0x0300u, 0x1F78u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03BFu, 0x0301u, 0x03CCu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03BFu, 0x0313u, 0x1F40u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03BFu, 0x0314u, 0x1F41u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C1u, 0x0313u, 0x1FE4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C1u, 0x0314u, 0x1FE5u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0300u, 0x1F7Au),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0301u, 0x03CDu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0304u, 0x1FE1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0306u, 0x1FE0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0308u, 0x03CBu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0313u, 0x1F50u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0314u, 0x1F51u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5u, 0x0342u, 0x1FE6u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0300u, 0x1F7Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0301u, 0x03CEu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0313u, 0x1F60u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0314u, 0x1F61u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0342u, 0x1FF6u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9u, 0x0345u, 0x1FF3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03CAu, 0x0300u, 0x1FD2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03CAu, 0x0301u, 0x0390u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03CAu, 0x0342u, 0x1FD7u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03CBu, 0x0300u, 0x1FE2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03CBu, 0x0301u, 0x03B0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03CBu, 0x0342u, 0x1FE7u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03CEu, 0x0345u, 0x1FF4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03D2u, 0x0301u, 0x03D3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x03D2u, 0x0308u, 0x03D4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0406u, 0x0308u, 0x0407u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0410u, 0x0306u, 0x04D0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0410u, 0x0308u, 0x04D2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0413u, 0x0301u, 0x0403u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0415u, 0x0300u, 0x0400u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0415u, 0x0306u, 0x04D6u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0415u, 0x0308u, 0x0401u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0416u, 0x0306u, 0x04C1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0416u, 0x0308u, 0x04DCu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0417u, 0x0308u, 0x04DEu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0418u, 0x0300u, 0x040Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0418u, 0x0304u, 0x04E2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0418u, 0x0306u, 0x0419u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0418u, 0x0308u, 0x04E4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x041Au, 0x0301u, 0x040Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x041Eu, 0x0308u, 0x04E6u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0423u, 0x0304u, 0x04EEu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0423u, 0x0306u, 0x040Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0423u, 0x0308u, 0x04F0u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0423u, 0x030Bu, 0x04F2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0427u, 0x0308u, 0x04F4u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x042Bu, 0x0308u, 0x04F8u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x042Du, 0x0308u, 0x04ECu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0430u, 0x0306u, 0x04D1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0430u, 0x0308u, 0x04D3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0433u, 0x0301u, 0x0453u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0435u, 0x0300u, 0x0450u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0435u, 0x0306u, 0x04D7u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0435u, 0x0308u, 0x0451u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0436u, 0x0306u, 0x04C2u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0436u, 0x0308u, 0x04DDu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0437u, 0x0308u, 0x04DFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0438u, 0x0300u, 0x045Du),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0438u, 0x0304u, 0x04E3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0438u, 0x0306u, 0x0439u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0438u, 0x0308u, 0x04E5u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x043Au, 0x0301u, 0x045Cu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x043Eu, 0x0308u, 0x04E7u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0443u, 0x0304u, 0x04EFu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0443u, 0x0306u, 0x045Eu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0443u, 0x0308u, 0x04F1u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0443u, 0x030Bu, 0x04F3u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0447u, 0x0308u, 0x04F5u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x044Bu, 0x0308u, 0x04F9u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x044Du, 0x0308u, 0x04EDu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0456u, 0x0308u, 0x0457u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0474u, 0x030Fu, 0x0476u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x0475u, 0x030Fu, 0x0477u),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x04D8u, 0x0308u, 0x04DAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x04D9u, 0x0308u, 0x04DBu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x04E8u, 0x0308u, 0x04EAu),
-   HB_CODEPOINT_ENCODE3_11_7_14 (0x04E9u, 0x0308u, 0x04EBu),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x003C, 0x0338, 0x226E),HB_CODEPOINT_ENCODE3_11_7_14 (0x003D, 0x0338, 0x2260),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x003E, 0x0338, 0x226F),HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x0300, 0x00C0),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x0301, 0x00C1),HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x0302, 0x00C2),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x0303, 0x00C3),HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x0304, 0x0100),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x0306, 0x0102),HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x0307, 0x0226),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x0308, 0x00C4),HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x0309, 0x1EA2),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x030A, 0x00C5),HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x030C, 0x01CD),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x030F, 0x0200),HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x0311, 0x0202),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x0323, 0x1EA0),HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x0325, 0x1E00),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0041, 0x0328, 0x0104),HB_CODEPOINT_ENCODE3_11_7_14 (0x0042, 0x0307, 0x1E02),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0042, 0x0323, 0x1E04),HB_CODEPOINT_ENCODE3_11_7_14 (0x0042, 0x0331, 0x1E06),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0043, 0x0301, 0x0106),HB_CODEPOINT_ENCODE3_11_7_14 (0x0043, 0x0302, 0x0108),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0043, 0x0307, 0x010A),HB_CODEPOINT_ENCODE3_11_7_14 (0x0043, 0x030C, 0x010C),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0043, 0x0327, 0x00C7),HB_CODEPOINT_ENCODE3_11_7_14 (0x0044, 0x0307, 0x1E0A),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0044, 0x030C, 0x010E),HB_CODEPOINT_ENCODE3_11_7_14 (0x0044, 0x0323, 0x1E0C),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0044, 0x0327, 0x1E10),HB_CODEPOINT_ENCODE3_11_7_14 (0x0044, 0x032D, 0x1E12),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0044, 0x0331, 0x1E0E),HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x0300, 0x00C8),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x0301, 0x00C9),HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x0302, 0x00CA),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x0303, 0x1EBC),HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x0304, 0x0112),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x0306, 0x0114),HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x0307, 0x0116),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x0308, 0x00CB),HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x0309, 0x1EBA),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x030C, 0x011A),HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x030F, 0x0204),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x0311, 0x0206),HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x0323, 0x1EB8),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x0327, 0x0228),HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x0328, 0x0118),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x032D, 0x1E18),HB_CODEPOINT_ENCODE3_11_7_14 (0x0045, 0x0330, 0x1E1A),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0046, 0x0307, 0x1E1E),HB_CODEPOINT_ENCODE3_11_7_14 (0x0047, 0x0301, 0x01F4),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0047, 0x0302, 0x011C),HB_CODEPOINT_ENCODE3_11_7_14 (0x0047, 0x0304, 0x1E20),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0047, 0x0306, 0x011E),HB_CODEPOINT_ENCODE3_11_7_14 (0x0047, 0x0307, 0x0120),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0047, 0x030C, 0x01E6),HB_CODEPOINT_ENCODE3_11_7_14 (0x0047, 0x0327, 0x0122),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0048, 0x0302, 0x0124),HB_CODEPOINT_ENCODE3_11_7_14 (0x0048, 0x0307, 0x1E22),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0048, 0x0308, 0x1E26),HB_CODEPOINT_ENCODE3_11_7_14 (0x0048, 0x030C, 0x021E),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0048, 0x0323, 0x1E24),HB_CODEPOINT_ENCODE3_11_7_14 (0x0048, 0x0327, 0x1E28),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0048, 0x032E, 0x1E2A),HB_CODEPOINT_ENCODE3_11_7_14 (0x0049, 0x0300, 0x00CC),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0049, 0x0301, 0x00CD),HB_CODEPOINT_ENCODE3_11_7_14 (0x0049, 0x0302, 0x00CE),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0049, 0x0303, 0x0128),HB_CODEPOINT_ENCODE3_11_7_14 (0x0049, 0x0304, 0x012A),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0049, 0x0306, 0x012C),HB_CODEPOINT_ENCODE3_11_7_14 (0x0049, 0x0307, 0x0130),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0049, 0x0308, 0x00CF),HB_CODEPOINT_ENCODE3_11_7_14 (0x0049, 0x0309, 0x1EC8),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0049, 0x030C, 0x01CF),HB_CODEPOINT_ENCODE3_11_7_14 (0x0049, 0x030F, 0x0208),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0049, 0x0311, 0x020A),HB_CODEPOINT_ENCODE3_11_7_14 (0x0049, 0x0323, 0x1ECA),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0049, 0x0328, 0x012E),HB_CODEPOINT_ENCODE3_11_7_14 (0x0049, 0x0330, 0x1E2C),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004A, 0x0302, 0x0134),HB_CODEPOINT_ENCODE3_11_7_14 (0x004B, 0x0301, 0x1E30),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004B, 0x030C, 0x01E8),HB_CODEPOINT_ENCODE3_11_7_14 (0x004B, 0x0323, 0x1E32),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004B, 0x0327, 0x0136),HB_CODEPOINT_ENCODE3_11_7_14 (0x004B, 0x0331, 0x1E34),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004C, 0x0301, 0x0139),HB_CODEPOINT_ENCODE3_11_7_14 (0x004C, 0x030C, 0x013D),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004C, 0x0323, 0x1E36),HB_CODEPOINT_ENCODE3_11_7_14 (0x004C, 0x0327, 0x013B),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004C, 0x032D, 0x1E3C),HB_CODEPOINT_ENCODE3_11_7_14 (0x004C, 0x0331, 0x1E3A),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004D, 0x0301, 0x1E3E),HB_CODEPOINT_ENCODE3_11_7_14 (0x004D, 0x0307, 0x1E40),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004D, 0x0323, 0x1E42),HB_CODEPOINT_ENCODE3_11_7_14 (0x004E, 0x0300, 0x01F8),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004E, 0x0301, 0x0143),HB_CODEPOINT_ENCODE3_11_7_14 (0x004E, 0x0303, 0x00D1),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004E, 0x0307, 0x1E44),HB_CODEPOINT_ENCODE3_11_7_14 (0x004E, 0x030C, 0x0147),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004E, 0x0323, 0x1E46),HB_CODEPOINT_ENCODE3_11_7_14 (0x004E, 0x0327, 0x0145),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004E, 0x032D, 0x1E4A),HB_CODEPOINT_ENCODE3_11_7_14 (0x004E, 0x0331, 0x1E48),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x0300, 0x00D2),HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x0301, 0x00D3),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x0302, 0x00D4),HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x0303, 0x00D5),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x0304, 0x014C),HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x0306, 0x014E),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x0307, 0x022E),HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x0308, 0x00D6),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x0309, 0x1ECE),HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x030B, 0x0150),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x030C, 0x01D1),HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x030F, 0x020C),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x0311, 0x020E),HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x031B, 0x01A0),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x0323, 0x1ECC),HB_CODEPOINT_ENCODE3_11_7_14 (0x004F, 0x0328, 0x01EA),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0050, 0x0301, 0x1E54),HB_CODEPOINT_ENCODE3_11_7_14 (0x0050, 0x0307, 0x1E56),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0052, 0x0301, 0x0154),HB_CODEPOINT_ENCODE3_11_7_14 (0x0052, 0x0307, 0x1E58),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0052, 0x030C, 0x0158),HB_CODEPOINT_ENCODE3_11_7_14 (0x0052, 0x030F, 0x0210),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0052, 0x0311, 0x0212),HB_CODEPOINT_ENCODE3_11_7_14 (0x0052, 0x0323, 0x1E5A),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0052, 0x0327, 0x0156),HB_CODEPOINT_ENCODE3_11_7_14 (0x0052, 0x0331, 0x1E5E),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0053, 0x0301, 0x015A),HB_CODEPOINT_ENCODE3_11_7_14 (0x0053, 0x0302, 0x015C),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0053, 0x0307, 0x1E60),HB_CODEPOINT_ENCODE3_11_7_14 (0x0053, 0x030C, 0x0160),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0053, 0x0323, 0x1E62),HB_CODEPOINT_ENCODE3_11_7_14 (0x0053, 0x0326, 0x0218),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0053, 0x0327, 0x015E),HB_CODEPOINT_ENCODE3_11_7_14 (0x0054, 0x0307, 0x1E6A),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0054, 0x030C, 0x0164),HB_CODEPOINT_ENCODE3_11_7_14 (0x0054, 0x0323, 0x1E6C),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0054, 0x0326, 0x021A),HB_CODEPOINT_ENCODE3_11_7_14 (0x0054, 0x0327, 0x0162),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0054, 0x032D, 0x1E70),HB_CODEPOINT_ENCODE3_11_7_14 (0x0054, 0x0331, 0x1E6E),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x0300, 0x00D9),HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x0301, 0x00DA),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x0302, 0x00DB),HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x0303, 0x0168),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x0304, 0x016A),HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x0306, 0x016C),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x0308, 0x00DC),HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x0309, 0x1EE6),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x030A, 0x016E),HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x030B, 0x0170),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x030C, 0x01D3),HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x030F, 0x0214),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x0311, 0x0216),HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x031B, 0x01AF),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x0323, 0x1EE4),HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x0324, 0x1E72),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x0328, 0x0172),HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x032D, 0x1E76),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0055, 0x0330, 0x1E74),HB_CODEPOINT_ENCODE3_11_7_14 (0x0056, 0x0303, 0x1E7C),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0056, 0x0323, 0x1E7E),HB_CODEPOINT_ENCODE3_11_7_14 (0x0057, 0x0300, 0x1E80),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0057, 0x0301, 0x1E82),HB_CODEPOINT_ENCODE3_11_7_14 (0x0057, 0x0302, 0x0174),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0057, 0x0307, 0x1E86),HB_CODEPOINT_ENCODE3_11_7_14 (0x0057, 0x0308, 0x1E84),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0057, 0x0323, 0x1E88),HB_CODEPOINT_ENCODE3_11_7_14 (0x0058, 0x0307, 0x1E8A),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0058, 0x0308, 0x1E8C),HB_CODEPOINT_ENCODE3_11_7_14 (0x0059, 0x0300, 0x1EF2),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0059, 0x0301, 0x00DD),HB_CODEPOINT_ENCODE3_11_7_14 (0x0059, 0x0302, 0x0176),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0059, 0x0303, 0x1EF8),HB_CODEPOINT_ENCODE3_11_7_14 (0x0059, 0x0304, 0x0232),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0059, 0x0307, 0x1E8E),HB_CODEPOINT_ENCODE3_11_7_14 (0x0059, 0x0308, 0x0178),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0059, 0x0309, 0x1EF6),HB_CODEPOINT_ENCODE3_11_7_14 (0x0059, 0x0323, 0x1EF4),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x005A, 0x0301, 0x0179),HB_CODEPOINT_ENCODE3_11_7_14 (0x005A, 0x0302, 0x1E90),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x005A, 0x0307, 0x017B),HB_CODEPOINT_ENCODE3_11_7_14 (0x005A, 0x030C, 0x017D),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x005A, 0x0323, 0x1E92),HB_CODEPOINT_ENCODE3_11_7_14 (0x005A, 0x0331, 0x1E94),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x0300, 0x00E0),HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x0301, 0x00E1),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x0302, 0x00E2),HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x0303, 0x00E3),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x0304, 0x0101),HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x0306, 0x0103),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x0307, 0x0227),HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x0308, 0x00E4),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x0309, 0x1EA3),HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x030A, 0x00E5),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x030C, 0x01CE),HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x030F, 0x0201),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x0311, 0x0203),HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x0323, 0x1EA1),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x0325, 0x1E01),HB_CODEPOINT_ENCODE3_11_7_14 (0x0061, 0x0328, 0x0105),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0062, 0x0307, 0x1E03),HB_CODEPOINT_ENCODE3_11_7_14 (0x0062, 0x0323, 0x1E05),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0062, 0x0331, 0x1E07),HB_CODEPOINT_ENCODE3_11_7_14 (0x0063, 0x0301, 0x0107),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0063, 0x0302, 0x0109),HB_CODEPOINT_ENCODE3_11_7_14 (0x0063, 0x0307, 0x010B),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0063, 0x030C, 0x010D),HB_CODEPOINT_ENCODE3_11_7_14 (0x0063, 0x0327, 0x00E7),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0064, 0x0307, 0x1E0B),HB_CODEPOINT_ENCODE3_11_7_14 (0x0064, 0x030C, 0x010F),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0064, 0x0323, 0x1E0D),HB_CODEPOINT_ENCODE3_11_7_14 (0x0064, 0x0327, 0x1E11),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0064, 0x032D, 0x1E13),HB_CODEPOINT_ENCODE3_11_7_14 (0x0064, 0x0331, 0x1E0F),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x0300, 0x00E8),HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x0301, 0x00E9),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x0302, 0x00EA),HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x0303, 0x1EBD),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x0304, 0x0113),HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x0306, 0x0115),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x0307, 0x0117),HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x0308, 0x00EB),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x0309, 0x1EBB),HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x030C, 0x011B),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x030F, 0x0205),HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x0311, 0x0207),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x0323, 0x1EB9),HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x0327, 0x0229),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x0328, 0x0119),HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x032D, 0x1E19),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0065, 0x0330, 0x1E1B),HB_CODEPOINT_ENCODE3_11_7_14 (0x0066, 0x0307, 0x1E1F),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0067, 0x0301, 0x01F5),HB_CODEPOINT_ENCODE3_11_7_14 (0x0067, 0x0302, 0x011D),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0067, 0x0304, 0x1E21),HB_CODEPOINT_ENCODE3_11_7_14 (0x0067, 0x0306, 0x011F),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0067, 0x0307, 0x0121),HB_CODEPOINT_ENCODE3_11_7_14 (0x0067, 0x030C, 0x01E7),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0067, 0x0327, 0x0123),HB_CODEPOINT_ENCODE3_11_7_14 (0x0068, 0x0302, 0x0125),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0068, 0x0307, 0x1E23),HB_CODEPOINT_ENCODE3_11_7_14 (0x0068, 0x0308, 0x1E27),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0068, 0x030C, 0x021F),HB_CODEPOINT_ENCODE3_11_7_14 (0x0068, 0x0323, 0x1E25),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0068, 0x0327, 0x1E29),HB_CODEPOINT_ENCODE3_11_7_14 (0x0068, 0x032E, 0x1E2B),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0068, 0x0331, 0x1E96),HB_CODEPOINT_ENCODE3_11_7_14 (0x0069, 0x0300, 0x00EC),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0069, 0x0301, 0x00ED),HB_CODEPOINT_ENCODE3_11_7_14 (0x0069, 0x0302, 0x00EE),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0069, 0x0303, 0x0129),HB_CODEPOINT_ENCODE3_11_7_14 (0x0069, 0x0304, 0x012B),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0069, 0x0306, 0x012D),HB_CODEPOINT_ENCODE3_11_7_14 (0x0069, 0x0308, 0x00EF),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0069, 0x0309, 0x1EC9),HB_CODEPOINT_ENCODE3_11_7_14 (0x0069, 0x030C, 0x01D0),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0069, 0x030F, 0x0209),HB_CODEPOINT_ENCODE3_11_7_14 (0x0069, 0x0311, 0x020B),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0069, 0x0323, 0x1ECB),HB_CODEPOINT_ENCODE3_11_7_14 (0x0069, 0x0328, 0x012F),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0069, 0x0330, 0x1E2D),HB_CODEPOINT_ENCODE3_11_7_14 (0x006A, 0x0302, 0x0135),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006A, 0x030C, 0x01F0),HB_CODEPOINT_ENCODE3_11_7_14 (0x006B, 0x0301, 0x1E31),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006B, 0x030C, 0x01E9),HB_CODEPOINT_ENCODE3_11_7_14 (0x006B, 0x0323, 0x1E33),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006B, 0x0327, 0x0137),HB_CODEPOINT_ENCODE3_11_7_14 (0x006B, 0x0331, 0x1E35),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006C, 0x0301, 0x013A),HB_CODEPOINT_ENCODE3_11_7_14 (0x006C, 0x030C, 0x013E),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006C, 0x0323, 0x1E37),HB_CODEPOINT_ENCODE3_11_7_14 (0x006C, 0x0327, 0x013C),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006C, 0x032D, 0x1E3D),HB_CODEPOINT_ENCODE3_11_7_14 (0x006C, 0x0331, 0x1E3B),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006D, 0x0301, 0x1E3F),HB_CODEPOINT_ENCODE3_11_7_14 (0x006D, 0x0307, 0x1E41),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006D, 0x0323, 0x1E43),HB_CODEPOINT_ENCODE3_11_7_14 (0x006E, 0x0300, 0x01F9),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006E, 0x0301, 0x0144),HB_CODEPOINT_ENCODE3_11_7_14 (0x006E, 0x0303, 0x00F1),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006E, 0x0307, 0x1E45),HB_CODEPOINT_ENCODE3_11_7_14 (0x006E, 0x030C, 0x0148),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006E, 0x0323, 0x1E47),HB_CODEPOINT_ENCODE3_11_7_14 (0x006E, 0x0327, 0x0146),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006E, 0x032D, 0x1E4B),HB_CODEPOINT_ENCODE3_11_7_14 (0x006E, 0x0331, 0x1E49),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x0300, 0x00F2),HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x0301, 0x00F3),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x0302, 0x00F4),HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x0303, 0x00F5),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x0304, 0x014D),HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x0306, 0x014F),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x0307, 0x022F),HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x0308, 0x00F6),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x0309, 0x1ECF),HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x030B, 0x0151),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x030C, 0x01D2),HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x030F, 0x020D),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x0311, 0x020F),HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x031B, 0x01A1),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x0323, 0x1ECD),HB_CODEPOINT_ENCODE3_11_7_14 (0x006F, 0x0328, 0x01EB),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0070, 0x0301, 0x1E55),HB_CODEPOINT_ENCODE3_11_7_14 (0x0070, 0x0307, 0x1E57),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0072, 0x0301, 0x0155),HB_CODEPOINT_ENCODE3_11_7_14 (0x0072, 0x0307, 0x1E59),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0072, 0x030C, 0x0159),HB_CODEPOINT_ENCODE3_11_7_14 (0x0072, 0x030F, 0x0211),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0072, 0x0311, 0x0213),HB_CODEPOINT_ENCODE3_11_7_14 (0x0072, 0x0323, 0x1E5B),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0072, 0x0327, 0x0157),HB_CODEPOINT_ENCODE3_11_7_14 (0x0072, 0x0331, 0x1E5F),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0073, 0x0301, 0x015B),HB_CODEPOINT_ENCODE3_11_7_14 (0x0073, 0x0302, 0x015D),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0073, 0x0307, 0x1E61),HB_CODEPOINT_ENCODE3_11_7_14 (0x0073, 0x030C, 0x0161),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0073, 0x0323, 0x1E63),HB_CODEPOINT_ENCODE3_11_7_14 (0x0073, 0x0326, 0x0219),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0073, 0x0327, 0x015F),HB_CODEPOINT_ENCODE3_11_7_14 (0x0074, 0x0307, 0x1E6B),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0074, 0x0308, 0x1E97),HB_CODEPOINT_ENCODE3_11_7_14 (0x0074, 0x030C, 0x0165),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0074, 0x0323, 0x1E6D),HB_CODEPOINT_ENCODE3_11_7_14 (0x0074, 0x0326, 0x021B),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0074, 0x0327, 0x0163),HB_CODEPOINT_ENCODE3_11_7_14 (0x0074, 0x032D, 0x1E71),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0074, 0x0331, 0x1E6F),HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x0300, 0x00F9),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x0301, 0x00FA),HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x0302, 0x00FB),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x0303, 0x0169),HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x0304, 0x016B),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x0306, 0x016D),HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x0308, 0x00FC),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x0309, 0x1EE7),HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x030A, 0x016F),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x030B, 0x0171),HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x030C, 0x01D4),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x030F, 0x0215),HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x0311, 0x0217),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x031B, 0x01B0),HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x0323, 0x1EE5),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x0324, 0x1E73),HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x0328, 0x0173),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x032D, 0x1E77),HB_CODEPOINT_ENCODE3_11_7_14 (0x0075, 0x0330, 0x1E75),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0076, 0x0303, 0x1E7D),HB_CODEPOINT_ENCODE3_11_7_14 (0x0076, 0x0323, 0x1E7F),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0077, 0x0300, 0x1E81),HB_CODEPOINT_ENCODE3_11_7_14 (0x0077, 0x0301, 0x1E83),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0077, 0x0302, 0x0175),HB_CODEPOINT_ENCODE3_11_7_14 (0x0077, 0x0307, 0x1E87),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0077, 0x0308, 0x1E85),HB_CODEPOINT_ENCODE3_11_7_14 (0x0077, 0x030A, 0x1E98),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0077, 0x0323, 0x1E89),HB_CODEPOINT_ENCODE3_11_7_14 (0x0078, 0x0307, 0x1E8B),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0078, 0x0308, 0x1E8D),HB_CODEPOINT_ENCODE3_11_7_14 (0x0079, 0x0300, 0x1EF3),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0079, 0x0301, 0x00FD),HB_CODEPOINT_ENCODE3_11_7_14 (0x0079, 0x0302, 0x0177),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0079, 0x0303, 0x1EF9),HB_CODEPOINT_ENCODE3_11_7_14 (0x0079, 0x0304, 0x0233),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0079, 0x0307, 0x1E8F),HB_CODEPOINT_ENCODE3_11_7_14 (0x0079, 0x0308, 0x00FF),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0079, 0x0309, 0x1EF7),HB_CODEPOINT_ENCODE3_11_7_14 (0x0079, 0x030A, 0x1E99),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0079, 0x0323, 0x1EF5),HB_CODEPOINT_ENCODE3_11_7_14 (0x007A, 0x0301, 0x017A),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x007A, 0x0302, 0x1E91),HB_CODEPOINT_ENCODE3_11_7_14 (0x007A, 0x0307, 0x017C),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x007A, 0x030C, 0x017E),HB_CODEPOINT_ENCODE3_11_7_14 (0x007A, 0x0323, 0x1E93),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x007A, 0x0331, 0x1E95),HB_CODEPOINT_ENCODE3_11_7_14 (0x00A8, 0x0300, 0x1FED),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00A8, 0x0301, 0x0385),HB_CODEPOINT_ENCODE3_11_7_14 (0x00A8, 0x0342, 0x1FC1),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2, 0x0300, 0x1EA6),HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2, 0x0301, 0x1EA4),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2, 0x0303, 0x1EAA),HB_CODEPOINT_ENCODE3_11_7_14 (0x00C2, 0x0309, 0x1EA8),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00C4, 0x0304, 0x01DE),HB_CODEPOINT_ENCODE3_11_7_14 (0x00C5, 0x0301, 0x01FA),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00C6, 0x0301, 0x01FC),HB_CODEPOINT_ENCODE3_11_7_14 (0x00C6, 0x0304, 0x01E2),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00C7, 0x0301, 0x1E08),HB_CODEPOINT_ENCODE3_11_7_14 (0x00CA, 0x0300, 0x1EC0),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00CA, 0x0301, 0x1EBE),HB_CODEPOINT_ENCODE3_11_7_14 (0x00CA, 0x0303, 0x1EC4),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00CA, 0x0309, 0x1EC2),HB_CODEPOINT_ENCODE3_11_7_14 (0x00CF, 0x0301, 0x1E2E),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4, 0x0300, 0x1ED2),HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4, 0x0301, 0x1ED0),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4, 0x0303, 0x1ED6),HB_CODEPOINT_ENCODE3_11_7_14 (0x00D4, 0x0309, 0x1ED4),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00D5, 0x0301, 0x1E4C),HB_CODEPOINT_ENCODE3_11_7_14 (0x00D5, 0x0304, 0x022C),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00D5, 0x0308, 0x1E4E),HB_CODEPOINT_ENCODE3_11_7_14 (0x00D6, 0x0304, 0x022A),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00D8, 0x0301, 0x01FE),HB_CODEPOINT_ENCODE3_11_7_14 (0x00DC, 0x0300, 0x01DB),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00DC, 0x0301, 0x01D7),HB_CODEPOINT_ENCODE3_11_7_14 (0x00DC, 0x0304, 0x01D5),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00DC, 0x030C, 0x01D9),HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2, 0x0300, 0x1EA7),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2, 0x0301, 0x1EA5),HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2, 0x0303, 0x1EAB),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00E2, 0x0309, 0x1EA9),HB_CODEPOINT_ENCODE3_11_7_14 (0x00E4, 0x0304, 0x01DF),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00E5, 0x0301, 0x01FB),HB_CODEPOINT_ENCODE3_11_7_14 (0x00E6, 0x0301, 0x01FD),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00E6, 0x0304, 0x01E3),HB_CODEPOINT_ENCODE3_11_7_14 (0x00E7, 0x0301, 0x1E09),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00EA, 0x0300, 0x1EC1),HB_CODEPOINT_ENCODE3_11_7_14 (0x00EA, 0x0301, 0x1EBF),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00EA, 0x0303, 0x1EC5),HB_CODEPOINT_ENCODE3_11_7_14 (0x00EA, 0x0309, 0x1EC3),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00EF, 0x0301, 0x1E2F),HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4, 0x0300, 0x1ED3),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4, 0x0301, 0x1ED1),HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4, 0x0303, 0x1ED7),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00F4, 0x0309, 0x1ED5),HB_CODEPOINT_ENCODE3_11_7_14 (0x00F5, 0x0301, 0x1E4D),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00F5, 0x0304, 0x022D),HB_CODEPOINT_ENCODE3_11_7_14 (0x00F5, 0x0308, 0x1E4F),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00F6, 0x0304, 0x022B),HB_CODEPOINT_ENCODE3_11_7_14 (0x00F8, 0x0301, 0x01FF),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00FC, 0x0300, 0x01DC),HB_CODEPOINT_ENCODE3_11_7_14 (0x00FC, 0x0301, 0x01D8),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x00FC, 0x0304, 0x01D6),HB_CODEPOINT_ENCODE3_11_7_14 (0x00FC, 0x030C, 0x01DA),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0102, 0x0300, 0x1EB0),HB_CODEPOINT_ENCODE3_11_7_14 (0x0102, 0x0301, 0x1EAE),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0102, 0x0303, 0x1EB4),HB_CODEPOINT_ENCODE3_11_7_14 (0x0102, 0x0309, 0x1EB2),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0103, 0x0300, 0x1EB1),HB_CODEPOINT_ENCODE3_11_7_14 (0x0103, 0x0301, 0x1EAF),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0103, 0x0303, 0x1EB5),HB_CODEPOINT_ENCODE3_11_7_14 (0x0103, 0x0309, 0x1EB3),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0112, 0x0300, 0x1E14),HB_CODEPOINT_ENCODE3_11_7_14 (0x0112, 0x0301, 0x1E16),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0113, 0x0300, 0x1E15),HB_CODEPOINT_ENCODE3_11_7_14 (0x0113, 0x0301, 0x1E17),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x014C, 0x0300, 0x1E50),HB_CODEPOINT_ENCODE3_11_7_14 (0x014C, 0x0301, 0x1E52),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x014D, 0x0300, 0x1E51),HB_CODEPOINT_ENCODE3_11_7_14 (0x014D, 0x0301, 0x1E53),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x015A, 0x0307, 0x1E64),HB_CODEPOINT_ENCODE3_11_7_14 (0x015B, 0x0307, 0x1E65),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0160, 0x0307, 0x1E66),HB_CODEPOINT_ENCODE3_11_7_14 (0x0161, 0x0307, 0x1E67),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0168, 0x0301, 0x1E78),HB_CODEPOINT_ENCODE3_11_7_14 (0x0169, 0x0301, 0x1E79),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x016A, 0x0308, 0x1E7A),HB_CODEPOINT_ENCODE3_11_7_14 (0x016B, 0x0308, 0x1E7B),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x017F, 0x0307, 0x1E9B),HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0, 0x0300, 0x1EDC),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0, 0x0301, 0x1EDA),HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0, 0x0303, 0x1EE0),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0, 0x0309, 0x1EDE),HB_CODEPOINT_ENCODE3_11_7_14 (0x01A0, 0x0323, 0x1EE2),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1, 0x0300, 0x1EDD),HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1, 0x0301, 0x1EDB),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1, 0x0303, 0x1EE1),HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1, 0x0309, 0x1EDF),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x01A1, 0x0323, 0x1EE3),HB_CODEPOINT_ENCODE3_11_7_14 (0x01AF, 0x0300, 0x1EEA),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x01AF, 0x0301, 0x1EE8),HB_CODEPOINT_ENCODE3_11_7_14 (0x01AF, 0x0303, 0x1EEE),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x01AF, 0x0309, 0x1EEC),HB_CODEPOINT_ENCODE3_11_7_14 (0x01AF, 0x0323, 0x1EF0),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0, 0x0300, 0x1EEB),HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0, 0x0301, 0x1EE9),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0, 0x0303, 0x1EEF),HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0, 0x0309, 0x1EED),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x01B0, 0x0323, 0x1EF1),HB_CODEPOINT_ENCODE3_11_7_14 (0x01B7, 0x030C, 0x01EE),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x01EA, 0x0304, 0x01EC),HB_CODEPOINT_ENCODE3_11_7_14 (0x01EB, 0x0304, 0x01ED),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0226, 0x0304, 0x01E0),HB_CODEPOINT_ENCODE3_11_7_14 (0x0227, 0x0304, 0x01E1),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0228, 0x0306, 0x1E1C),HB_CODEPOINT_ENCODE3_11_7_14 (0x0229, 0x0306, 0x1E1D),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x022E, 0x0304, 0x0230),HB_CODEPOINT_ENCODE3_11_7_14 (0x022F, 0x0304, 0x0231),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0292, 0x030C, 0x01EF),HB_CODEPOINT_ENCODE3_11_7_14 (0x0308, 0x0301, 0x0000),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0391, 0x0300, 0x1FBA),HB_CODEPOINT_ENCODE3_11_7_14 (0x0391, 0x0301, 0x0386),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0391, 0x0304, 0x1FB9),HB_CODEPOINT_ENCODE3_11_7_14 (0x0391, 0x0306, 0x1FB8),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0391, 0x0313, 0x1F08),HB_CODEPOINT_ENCODE3_11_7_14 (0x0391, 0x0314, 0x1F09),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0391, 0x0345, 0x1FBC),HB_CODEPOINT_ENCODE3_11_7_14 (0x0395, 0x0300, 0x1FC8),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0395, 0x0301, 0x0388),HB_CODEPOINT_ENCODE3_11_7_14 (0x0395, 0x0313, 0x1F18),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0395, 0x0314, 0x1F19),HB_CODEPOINT_ENCODE3_11_7_14 (0x0397, 0x0300, 0x1FCA),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0397, 0x0301, 0x0389),HB_CODEPOINT_ENCODE3_11_7_14 (0x0397, 0x0313, 0x1F28),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0397, 0x0314, 0x1F29),HB_CODEPOINT_ENCODE3_11_7_14 (0x0397, 0x0345, 0x1FCC),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0399, 0x0300, 0x1FDA),HB_CODEPOINT_ENCODE3_11_7_14 (0x0399, 0x0301, 0x038A),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0399, 0x0304, 0x1FD9),HB_CODEPOINT_ENCODE3_11_7_14 (0x0399, 0x0306, 0x1FD8),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0399, 0x0308, 0x03AA),HB_CODEPOINT_ENCODE3_11_7_14 (0x0399, 0x0313, 0x1F38),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0399, 0x0314, 0x1F39),HB_CODEPOINT_ENCODE3_11_7_14 (0x039F, 0x0300, 0x1FF8),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x039F, 0x0301, 0x038C),HB_CODEPOINT_ENCODE3_11_7_14 (0x039F, 0x0313, 0x1F48),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x039F, 0x0314, 0x1F49),HB_CODEPOINT_ENCODE3_11_7_14 (0x03A1, 0x0314, 0x1FEC),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5, 0x0300, 0x1FEA),HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5, 0x0301, 0x038E),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5, 0x0304, 0x1FE9),HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5, 0x0306, 0x1FE8),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5, 0x0308, 0x03AB),HB_CODEPOINT_ENCODE3_11_7_14 (0x03A5, 0x0314, 0x1F59),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9, 0x0300, 0x1FFA),HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9, 0x0301, 0x038F),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9, 0x0313, 0x1F68),HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9, 0x0314, 0x1F69),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03A9, 0x0345, 0x1FFC),HB_CODEPOINT_ENCODE3_11_7_14 (0x03AC, 0x0345, 0x1FB4),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03AE, 0x0345, 0x1FC4),HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1, 0x0300, 0x1F70),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1, 0x0301, 0x03AC),HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1, 0x0304, 0x1FB1),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1, 0x0306, 0x1FB0),HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1, 0x0313, 0x1F00),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1, 0x0314, 0x1F01),HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1, 0x0342, 0x1FB6),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03B1, 0x0345, 0x1FB3),HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5, 0x0300, 0x1F72),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5, 0x0301, 0x03AD),HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5, 0x0313, 0x1F10),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03B5, 0x0314, 0x1F11),HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7, 0x0300, 0x1F74),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7, 0x0301, 0x03AE),HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7, 0x0313, 0x1F20),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7, 0x0314, 0x1F21),HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7, 0x0342, 0x1FC6),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03B7, 0x0345, 0x1FC3),HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9, 0x0300, 0x1F76),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9, 0x0301, 0x03AF),HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9, 0x0304, 0x1FD1),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9, 0x0306, 0x1FD0),HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9, 0x0308, 0x03CA),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9, 0x0313, 0x1F30),HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9, 0x0314, 0x1F31),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03B9, 0x0342, 0x1FD6),HB_CODEPOINT_ENCODE3_11_7_14 (0x03BF, 0x0300, 0x1F78),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03BF, 0x0301, 0x03CC),HB_CODEPOINT_ENCODE3_11_7_14 (0x03BF, 0x0313, 0x1F40),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03BF, 0x0314, 0x1F41),HB_CODEPOINT_ENCODE3_11_7_14 (0x03C1, 0x0313, 0x1FE4),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03C1, 0x0314, 0x1FE5),HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5, 0x0300, 0x1F7A),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5, 0x0301, 0x03CD),HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5, 0x0304, 0x1FE1),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5, 0x0306, 0x1FE0),HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5, 0x0308, 0x03CB),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5, 0x0313, 0x1F50),HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5, 0x0314, 0x1F51),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03C5, 0x0342, 0x1FE6),HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9, 0x0300, 0x1F7C),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9, 0x0301, 0x03CE),HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9, 0x0313, 0x1F60),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9, 0x0314, 0x1F61),HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9, 0x0342, 0x1FF6),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03C9, 0x0345, 0x1FF3),HB_CODEPOINT_ENCODE3_11_7_14 (0x03CA, 0x0300, 0x1FD2),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03CA, 0x0301, 0x0390),HB_CODEPOINT_ENCODE3_11_7_14 (0x03CA, 0x0342, 0x1FD7),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03CB, 0x0300, 0x1FE2),HB_CODEPOINT_ENCODE3_11_7_14 (0x03CB, 0x0301, 0x03B0),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03CB, 0x0342, 0x1FE7),HB_CODEPOINT_ENCODE3_11_7_14 (0x03CE, 0x0345, 0x1FF4),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x03D2, 0x0301, 0x03D3),HB_CODEPOINT_ENCODE3_11_7_14 (0x03D2, 0x0308, 0x03D4),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0406, 0x0308, 0x0407),HB_CODEPOINT_ENCODE3_11_7_14 (0x0410, 0x0306, 0x04D0),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0410, 0x0308, 0x04D2),HB_CODEPOINT_ENCODE3_11_7_14 (0x0413, 0x0301, 0x0403),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0415, 0x0300, 0x0400),HB_CODEPOINT_ENCODE3_11_7_14 (0x0415, 0x0306, 0x04D6),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0415, 0x0308, 0x0401),HB_CODEPOINT_ENCODE3_11_7_14 (0x0416, 0x0306, 0x04C1),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0416, 0x0308, 0x04DC),HB_CODEPOINT_ENCODE3_11_7_14 (0x0417, 0x0308, 0x04DE),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0418, 0x0300, 0x040D),HB_CODEPOINT_ENCODE3_11_7_14 (0x0418, 0x0304, 0x04E2),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0418, 0x0306, 0x0419),HB_CODEPOINT_ENCODE3_11_7_14 (0x0418, 0x0308, 0x04E4),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x041A, 0x0301, 0x040C),HB_CODEPOINT_ENCODE3_11_7_14 (0x041E, 0x0308, 0x04E6),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0423, 0x0304, 0x04EE),HB_CODEPOINT_ENCODE3_11_7_14 (0x0423, 0x0306, 0x040E),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0423, 0x0308, 0x04F0),HB_CODEPOINT_ENCODE3_11_7_14 (0x0423, 0x030B, 0x04F2),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0427, 0x0308, 0x04F4),HB_CODEPOINT_ENCODE3_11_7_14 (0x042B, 0x0308, 0x04F8),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x042D, 0x0308, 0x04EC),HB_CODEPOINT_ENCODE3_11_7_14 (0x0430, 0x0306, 0x04D1),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0430, 0x0308, 0x04D3),HB_CODEPOINT_ENCODE3_11_7_14 (0x0433, 0x0301, 0x0453),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0435, 0x0300, 0x0450),HB_CODEPOINT_ENCODE3_11_7_14 (0x0435, 0x0306, 0x04D7),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0435, 0x0308, 0x0451),HB_CODEPOINT_ENCODE3_11_7_14 (0x0436, 0x0306, 0x04C2),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0436, 0x0308, 0x04DD),HB_CODEPOINT_ENCODE3_11_7_14 (0x0437, 0x0308, 0x04DF),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0438, 0x0300, 0x045D),HB_CODEPOINT_ENCODE3_11_7_14 (0x0438, 0x0304, 0x04E3),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0438, 0x0306, 0x0439),HB_CODEPOINT_ENCODE3_11_7_14 (0x0438, 0x0308, 0x04E5),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x043A, 0x0301, 0x045C),HB_CODEPOINT_ENCODE3_11_7_14 (0x043E, 0x0308, 0x04E7),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0443, 0x0304, 0x04EF),HB_CODEPOINT_ENCODE3_11_7_14 (0x0443, 0x0306, 0x045E),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0443, 0x0308, 0x04F1),HB_CODEPOINT_ENCODE3_11_7_14 (0x0443, 0x030B, 0x04F3),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0447, 0x0308, 0x04F5),HB_CODEPOINT_ENCODE3_11_7_14 (0x044B, 0x0308, 0x04F9),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x044D, 0x0308, 0x04ED),HB_CODEPOINT_ENCODE3_11_7_14 (0x0456, 0x0308, 0x0457),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x0474, 0x030F, 0x0476),HB_CODEPOINT_ENCODE3_11_7_14 (0x0475, 0x030F, 0x0477),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x04D8, 0x0308, 0x04DA),HB_CODEPOINT_ENCODE3_11_7_14 (0x04D9, 0x0308, 0x04DB),
+  HB_CODEPOINT_ENCODE3_11_7_14 (0x04E8, 0x0308, 0x04EA),HB_CODEPOINT_ENCODE3_11_7_14 (0x04E9, 0x0308, 0x04EB),
 };
-static const uint64_t
-_hb_ucd_dm2_u64_map[408] =
+static const uint64_t _hb_ucd_dm2_u64_map[408]=
 {
-     HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05B7u, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05B8u, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05BCu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05D1u, 0x05BCu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x05D1u, 0x05BFu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05D2u, 0x05BCu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x05D3u, 0x05BCu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05D4u, 0x05BCu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x05D5u, 0x05B9u, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05D5u, 0x05BCu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x05D6u, 0x05BCu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05D8u, 0x05BCu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x05D9u, 0x05B4u, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05D9u, 0x05BCu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x05DAu, 0x05BCu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05DBu, 0x05BCu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x05DBu, 0x05BFu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05DCu, 0x05BCu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x05DEu, 0x05BCu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05E0u, 0x05BCu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x05E1u, 0x05BCu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05E3u, 0x05BCu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x05E4u, 0x05BCu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05E4u, 0x05BFu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x05E6u, 0x05BCu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05E7u, 0x05BCu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x05E8u, 0x05BCu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05E9u, 0x05BCu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x05E9u, 0x05C1u, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05E9u, 0x05C2u, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x05EAu, 0x05BCu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x05F2u, 0x05B7u, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0627u, 0x0653u, 0x0622u),   HB_CODEPOINT_ENCODE3 (0x0627u, 0x0654u, 0x0623u),
-     HB_CODEPOINT_ENCODE3 (0x0627u, 0x0655u, 0x0625u),   HB_CODEPOINT_ENCODE3 (0x0648u, 0x0654u, 0x0624u),
-     HB_CODEPOINT_ENCODE3 (0x064Au, 0x0654u, 0x0626u),   HB_CODEPOINT_ENCODE3 (0x06C1u, 0x0654u, 0x06C2u),
-     HB_CODEPOINT_ENCODE3 (0x06D2u, 0x0654u, 0x06D3u),   HB_CODEPOINT_ENCODE3 (0x06D5u, 0x0654u, 0x06C0u),
-     HB_CODEPOINT_ENCODE3 (0x0915u, 0x093Cu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x0916u, 0x093Cu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0917u, 0x093Cu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x091Cu, 0x093Cu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0921u, 0x093Cu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x0922u, 0x093Cu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0928u, 0x093Cu, 0x0929u),   HB_CODEPOINT_ENCODE3 (0x092Bu, 0x093Cu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x092Fu, 0x093Cu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x0930u, 0x093Cu, 0x0931u),
-     HB_CODEPOINT_ENCODE3 (0x0933u, 0x093Cu, 0x0934u),   HB_CODEPOINT_ENCODE3 (0x09A1u, 0x09BCu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x09A2u, 0x09BCu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x09AFu, 0x09BCu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x09C7u, 0x09BEu, 0x09CBu),   HB_CODEPOINT_ENCODE3 (0x09C7u, 0x09D7u, 0x09CCu),
-     HB_CODEPOINT_ENCODE3 (0x0A16u, 0x0A3Cu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x0A17u, 0x0A3Cu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0A1Cu, 0x0A3Cu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x0A2Bu, 0x0A3Cu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0A32u, 0x0A3Cu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x0A38u, 0x0A3Cu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0B21u, 0x0B3Cu, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x0B22u, 0x0B3Cu, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0B47u, 0x0B3Eu, 0x0B4Bu),   HB_CODEPOINT_ENCODE3 (0x0B47u, 0x0B56u, 0x0B48u),
-     HB_CODEPOINT_ENCODE3 (0x0B47u, 0x0B57u, 0x0B4Cu),   HB_CODEPOINT_ENCODE3 (0x0B92u, 0x0BD7u, 0x0B94u),
-     HB_CODEPOINT_ENCODE3 (0x0BC6u, 0x0BBEu, 0x0BCAu),   HB_CODEPOINT_ENCODE3 (0x0BC6u, 0x0BD7u, 0x0BCCu),
-     HB_CODEPOINT_ENCODE3 (0x0BC7u, 0x0BBEu, 0x0BCBu),   HB_CODEPOINT_ENCODE3 (0x0C46u, 0x0C56u, 0x0C48u),
-     HB_CODEPOINT_ENCODE3 (0x0CBFu, 0x0CD5u, 0x0CC0u),   HB_CODEPOINT_ENCODE3 (0x0CC6u, 0x0CC2u, 0x0CCAu),
-     HB_CODEPOINT_ENCODE3 (0x0CC6u, 0x0CD5u, 0x0CC7u),   HB_CODEPOINT_ENCODE3 (0x0CC6u, 0x0CD6u, 0x0CC8u),
-     HB_CODEPOINT_ENCODE3 (0x0CCAu, 0x0CD5u, 0x0CCBu),   HB_CODEPOINT_ENCODE3 (0x0D46u, 0x0D3Eu, 0x0D4Au),
-     HB_CODEPOINT_ENCODE3 (0x0D46u, 0x0D57u, 0x0D4Cu),   HB_CODEPOINT_ENCODE3 (0x0D47u, 0x0D3Eu, 0x0D4Bu),
-     HB_CODEPOINT_ENCODE3 (0x0DD9u, 0x0DCAu, 0x0DDAu),   HB_CODEPOINT_ENCODE3 (0x0DD9u, 0x0DCFu, 0x0DDCu),
-     HB_CODEPOINT_ENCODE3 (0x0DD9u, 0x0DDFu, 0x0DDEu),   HB_CODEPOINT_ENCODE3 (0x0DDCu, 0x0DCAu, 0x0DDDu),
-     HB_CODEPOINT_ENCODE3 (0x0F40u, 0x0FB5u, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x0F42u, 0x0FB7u, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0F4Cu, 0x0FB7u, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x0F51u, 0x0FB7u, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0F56u, 0x0FB7u, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x0F5Bu, 0x0FB7u, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0F71u, 0x0F72u, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x0F71u, 0x0F74u, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0F71u, 0x0F80u, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x0F90u, 0x0FB5u, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0F92u, 0x0FB7u, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x0F9Cu, 0x0FB7u, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0FA1u, 0x0FB7u, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x0FA6u, 0x0FB7u, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0FABu, 0x0FB7u, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x0FB2u, 0x0F80u, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x0FB3u, 0x0F80u, 0x0000u),   HB_CODEPOINT_ENCODE3 (0x1025u, 0x102Eu, 0x1026u),
-     HB_CODEPOINT_ENCODE3 (0x1B05u, 0x1B35u, 0x1B06u),   HB_CODEPOINT_ENCODE3 (0x1B07u, 0x1B35u, 0x1B08u),
-     HB_CODEPOINT_ENCODE3 (0x1B09u, 0x1B35u, 0x1B0Au),   HB_CODEPOINT_ENCODE3 (0x1B0Bu, 0x1B35u, 0x1B0Cu),
-     HB_CODEPOINT_ENCODE3 (0x1B0Du, 0x1B35u, 0x1B0Eu),   HB_CODEPOINT_ENCODE3 (0x1B11u, 0x1B35u, 0x1B12u),
-     HB_CODEPOINT_ENCODE3 (0x1B3Au, 0x1B35u, 0x1B3Bu),   HB_CODEPOINT_ENCODE3 (0x1B3Cu, 0x1B35u, 0x1B3Du),
-     HB_CODEPOINT_ENCODE3 (0x1B3Eu, 0x1B35u, 0x1B40u),   HB_CODEPOINT_ENCODE3 (0x1B3Fu, 0x1B35u, 0x1B41u),
-     HB_CODEPOINT_ENCODE3 (0x1B42u, 0x1B35u, 0x1B43u),   HB_CODEPOINT_ENCODE3 (0x1E36u, 0x0304u, 0x1E38u),
-     HB_CODEPOINT_ENCODE3 (0x1E37u, 0x0304u, 0x1E39u),   HB_CODEPOINT_ENCODE3 (0x1E5Au, 0x0304u, 0x1E5Cu),
-     HB_CODEPOINT_ENCODE3 (0x1E5Bu, 0x0304u, 0x1E5Du),   HB_CODEPOINT_ENCODE3 (0x1E62u, 0x0307u, 0x1E68u),
-     HB_CODEPOINT_ENCODE3 (0x1E63u, 0x0307u, 0x1E69u),   HB_CODEPOINT_ENCODE3 (0x1EA0u, 0x0302u, 0x1EACu),
-     HB_CODEPOINT_ENCODE3 (0x1EA0u, 0x0306u, 0x1EB6u),   HB_CODEPOINT_ENCODE3 (0x1EA1u, 0x0302u, 0x1EADu),
-     HB_CODEPOINT_ENCODE3 (0x1EA1u, 0x0306u, 0x1EB7u),   HB_CODEPOINT_ENCODE3 (0x1EB8u, 0x0302u, 0x1EC6u),
-     HB_CODEPOINT_ENCODE3 (0x1EB9u, 0x0302u, 0x1EC7u),   HB_CODEPOINT_ENCODE3 (0x1ECCu, 0x0302u, 0x1ED8u),
-     HB_CODEPOINT_ENCODE3 (0x1ECDu, 0x0302u, 0x1ED9u),   HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0300u, 0x1F02u),
-     HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0301u, 0x1F04u),   HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0342u, 0x1F06u),
-     HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0345u, 0x1F80u),   HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0300u, 0x1F03u),
-     HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0301u, 0x1F05u),   HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0342u, 0x1F07u),
-     HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0345u, 0x1F81u),   HB_CODEPOINT_ENCODE3 (0x1F02u, 0x0345u, 0x1F82u),
-     HB_CODEPOINT_ENCODE3 (0x1F03u, 0x0345u, 0x1F83u),   HB_CODEPOINT_ENCODE3 (0x1F04u, 0x0345u, 0x1F84u),
-     HB_CODEPOINT_ENCODE3 (0x1F05u, 0x0345u, 0x1F85u),   HB_CODEPOINT_ENCODE3 (0x1F06u, 0x0345u, 0x1F86u),
-     HB_CODEPOINT_ENCODE3 (0x1F07u, 0x0345u, 0x1F87u),   HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0300u, 0x1F0Au),
-     HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0301u, 0x1F0Cu),   HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0342u, 0x1F0Eu),
-     HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0345u, 0x1F88u),   HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0300u, 0x1F0Bu),
-     HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0301u, 0x1F0Du),   HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0342u, 0x1F0Fu),
-     HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0345u, 0x1F89u),   HB_CODEPOINT_ENCODE3 (0x1F0Au, 0x0345u, 0x1F8Au),
-     HB_CODEPOINT_ENCODE3 (0x1F0Bu, 0x0345u, 0x1F8Bu),   HB_CODEPOINT_ENCODE3 (0x1F0Cu, 0x0345u, 0x1F8Cu),
-     HB_CODEPOINT_ENCODE3 (0x1F0Du, 0x0345u, 0x1F8Du),   HB_CODEPOINT_ENCODE3 (0x1F0Eu, 0x0345u, 0x1F8Eu),
-     HB_CODEPOINT_ENCODE3 (0x1F0Fu, 0x0345u, 0x1F8Fu),   HB_CODEPOINT_ENCODE3 (0x1F10u, 0x0300u, 0x1F12u),
-     HB_CODEPOINT_ENCODE3 (0x1F10u, 0x0301u, 0x1F14u),   HB_CODEPOINT_ENCODE3 (0x1F11u, 0x0300u, 0x1F13u),
-     HB_CODEPOINT_ENCODE3 (0x1F11u, 0x0301u, 0x1F15u),   HB_CODEPOINT_ENCODE3 (0x1F18u, 0x0300u, 0x1F1Au),
-     HB_CODEPOINT_ENCODE3 (0x1F18u, 0x0301u, 0x1F1Cu),   HB_CODEPOINT_ENCODE3 (0x1F19u, 0x0300u, 0x1F1Bu),
-     HB_CODEPOINT_ENCODE3 (0x1F19u, 0x0301u, 0x1F1Du),   HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0300u, 0x1F22u),
-     HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0301u, 0x1F24u),   HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0342u, 0x1F26u),
-     HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0345u, 0x1F90u),   HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0300u, 0x1F23u),
-     HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0301u, 0x1F25u),   HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0342u, 0x1F27u),
-     HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0345u, 0x1F91u),   HB_CODEPOINT_ENCODE3 (0x1F22u, 0x0345u, 0x1F92u),
-     HB_CODEPOINT_ENCODE3 (0x1F23u, 0x0345u, 0x1F93u),   HB_CODEPOINT_ENCODE3 (0x1F24u, 0x0345u, 0x1F94u),
-     HB_CODEPOINT_ENCODE3 (0x1F25u, 0x0345u, 0x1F95u),   HB_CODEPOINT_ENCODE3 (0x1F26u, 0x0345u, 0x1F96u),
-     HB_CODEPOINT_ENCODE3 (0x1F27u, 0x0345u, 0x1F97u),   HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0300u, 0x1F2Au),
-     HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0301u, 0x1F2Cu),   HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0342u, 0x1F2Eu),
-     HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0345u, 0x1F98u),   HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0300u, 0x1F2Bu),
-     HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0301u, 0x1F2Du),   HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0342u, 0x1F2Fu),
-     HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0345u, 0x1F99u),   HB_CODEPOINT_ENCODE3 (0x1F2Au, 0x0345u, 0x1F9Au),
-     HB_CODEPOINT_ENCODE3 (0x1F2Bu, 0x0345u, 0x1F9Bu),   HB_CODEPOINT_ENCODE3 (0x1F2Cu, 0x0345u, 0x1F9Cu),
-     HB_CODEPOINT_ENCODE3 (0x1F2Du, 0x0345u, 0x1F9Du),   HB_CODEPOINT_ENCODE3 (0x1F2Eu, 0x0345u, 0x1F9Eu),
-     HB_CODEPOINT_ENCODE3 (0x1F2Fu, 0x0345u, 0x1F9Fu),   HB_CODEPOINT_ENCODE3 (0x1F30u, 0x0300u, 0x1F32u),
-     HB_CODEPOINT_ENCODE3 (0x1F30u, 0x0301u, 0x1F34u),   HB_CODEPOINT_ENCODE3 (0x1F30u, 0x0342u, 0x1F36u),
-     HB_CODEPOINT_ENCODE3 (0x1F31u, 0x0300u, 0x1F33u),   HB_CODEPOINT_ENCODE3 (0x1F31u, 0x0301u, 0x1F35u),
-     HB_CODEPOINT_ENCODE3 (0x1F31u, 0x0342u, 0x1F37u),   HB_CODEPOINT_ENCODE3 (0x1F38u, 0x0300u, 0x1F3Au),
-     HB_CODEPOINT_ENCODE3 (0x1F38u, 0x0301u, 0x1F3Cu),   HB_CODEPOINT_ENCODE3 (0x1F38u, 0x0342u, 0x1F3Eu),
-     HB_CODEPOINT_ENCODE3 (0x1F39u, 0x0300u, 0x1F3Bu),   HB_CODEPOINT_ENCODE3 (0x1F39u, 0x0301u, 0x1F3Du),
-     HB_CODEPOINT_ENCODE3 (0x1F39u, 0x0342u, 0x1F3Fu),   HB_CODEPOINT_ENCODE3 (0x1F40u, 0x0300u, 0x1F42u),
-     HB_CODEPOINT_ENCODE3 (0x1F40u, 0x0301u, 0x1F44u),   HB_CODEPOINT_ENCODE3 (0x1F41u, 0x0300u, 0x1F43u),
-     HB_CODEPOINT_ENCODE3 (0x1F41u, 0x0301u, 0x1F45u),   HB_CODEPOINT_ENCODE3 (0x1F48u, 0x0300u, 0x1F4Au),
-     HB_CODEPOINT_ENCODE3 (0x1F48u, 0x0301u, 0x1F4Cu),   HB_CODEPOINT_ENCODE3 (0x1F49u, 0x0300u, 0x1F4Bu),
-     HB_CODEPOINT_ENCODE3 (0x1F49u, 0x0301u, 0x1F4Du),   HB_CODEPOINT_ENCODE3 (0x1F50u, 0x0300u, 0x1F52u),
-     HB_CODEPOINT_ENCODE3 (0x1F50u, 0x0301u, 0x1F54u),   HB_CODEPOINT_ENCODE3 (0x1F50u, 0x0342u, 0x1F56u),
-     HB_CODEPOINT_ENCODE3 (0x1F51u, 0x0300u, 0x1F53u),   HB_CODEPOINT_ENCODE3 (0x1F51u, 0x0301u, 0x1F55u),
-     HB_CODEPOINT_ENCODE3 (0x1F51u, 0x0342u, 0x1F57u),   HB_CODEPOINT_ENCODE3 (0x1F59u, 0x0300u, 0x1F5Bu),
-     HB_CODEPOINT_ENCODE3 (0x1F59u, 0x0301u, 0x1F5Du),   HB_CODEPOINT_ENCODE3 (0x1F59u, 0x0342u, 0x1F5Fu),
-     HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0300u, 0x1F62u),   HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0301u, 0x1F64u),
-     HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0342u, 0x1F66u),   HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0345u, 0x1FA0u),
-     HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0300u, 0x1F63u),   HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0301u, 0x1F65u),
-     HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0342u, 0x1F67u),   HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0345u, 0x1FA1u),
-     HB_CODEPOINT_ENCODE3 (0x1F62u, 0x0345u, 0x1FA2u),   HB_CODEPOINT_ENCODE3 (0x1F63u, 0x0345u, 0x1FA3u),
-     HB_CODEPOINT_ENCODE3 (0x1F64u, 0x0345u, 0x1FA4u),   HB_CODEPOINT_ENCODE3 (0x1F65u, 0x0345u, 0x1FA5u),
-     HB_CODEPOINT_ENCODE3 (0x1F66u, 0x0345u, 0x1FA6u),   HB_CODEPOINT_ENCODE3 (0x1F67u, 0x0345u, 0x1FA7u),
-     HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0300u, 0x1F6Au),   HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0301u, 0x1F6Cu),
-     HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0342u, 0x1F6Eu),   HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0345u, 0x1FA8u),
-     HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0300u, 0x1F6Bu),   HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0301u, 0x1F6Du),
-     HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0342u, 0x1F6Fu),   HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0345u, 0x1FA9u),
-     HB_CODEPOINT_ENCODE3 (0x1F6Au, 0x0345u, 0x1FAAu),   HB_CODEPOINT_ENCODE3 (0x1F6Bu, 0x0345u, 0x1FABu),
-     HB_CODEPOINT_ENCODE3 (0x1F6Cu, 0x0345u, 0x1FACu),   HB_CODEPOINT_ENCODE3 (0x1F6Du, 0x0345u, 0x1FADu),
-     HB_CODEPOINT_ENCODE3 (0x1F6Eu, 0x0345u, 0x1FAEu),   HB_CODEPOINT_ENCODE3 (0x1F6Fu, 0x0345u, 0x1FAFu),
-     HB_CODEPOINT_ENCODE3 (0x1F70u, 0x0345u, 0x1FB2u),   HB_CODEPOINT_ENCODE3 (0x1F74u, 0x0345u, 0x1FC2u),
-     HB_CODEPOINT_ENCODE3 (0x1F7Cu, 0x0345u, 0x1FF2u),   HB_CODEPOINT_ENCODE3 (0x1FB6u, 0x0345u, 0x1FB7u),
-     HB_CODEPOINT_ENCODE3 (0x1FBFu, 0x0300u, 0x1FCDu),   HB_CODEPOINT_ENCODE3 (0x1FBFu, 0x0301u, 0x1FCEu),
-     HB_CODEPOINT_ENCODE3 (0x1FBFu, 0x0342u, 0x1FCFu),   HB_CODEPOINT_ENCODE3 (0x1FC6u, 0x0345u, 0x1FC7u),
-     HB_CODEPOINT_ENCODE3 (0x1FF6u, 0x0345u, 0x1FF7u),   HB_CODEPOINT_ENCODE3 (0x1FFEu, 0x0300u, 0x1FDDu),
-     HB_CODEPOINT_ENCODE3 (0x1FFEu, 0x0301u, 0x1FDEu),   HB_CODEPOINT_ENCODE3 (0x1FFEu, 0x0342u, 0x1FDFu),
-     HB_CODEPOINT_ENCODE3 (0x2190u, 0x0338u, 0x219Au),   HB_CODEPOINT_ENCODE3 (0x2192u, 0x0338u, 0x219Bu),
-     HB_CODEPOINT_ENCODE3 (0x2194u, 0x0338u, 0x21AEu),   HB_CODEPOINT_ENCODE3 (0x21D0u, 0x0338u, 0x21CDu),
-     HB_CODEPOINT_ENCODE3 (0x21D2u, 0x0338u, 0x21CFu),   HB_CODEPOINT_ENCODE3 (0x21D4u, 0x0338u, 0x21CEu),
-     HB_CODEPOINT_ENCODE3 (0x2203u, 0x0338u, 0x2204u),   HB_CODEPOINT_ENCODE3 (0x2208u, 0x0338u, 0x2209u),
-     HB_CODEPOINT_ENCODE3 (0x220Bu, 0x0338u, 0x220Cu),   HB_CODEPOINT_ENCODE3 (0x2223u, 0x0338u, 0x2224u),
-     HB_CODEPOINT_ENCODE3 (0x2225u, 0x0338u, 0x2226u),   HB_CODEPOINT_ENCODE3 (0x223Cu, 0x0338u, 0x2241u),
-     HB_CODEPOINT_ENCODE3 (0x2243u, 0x0338u, 0x2244u),   HB_CODEPOINT_ENCODE3 (0x2245u, 0x0338u, 0x2247u),
-     HB_CODEPOINT_ENCODE3 (0x2248u, 0x0338u, 0x2249u),   HB_CODEPOINT_ENCODE3 (0x224Du, 0x0338u, 0x226Du),
-     HB_CODEPOINT_ENCODE3 (0x2261u, 0x0338u, 0x2262u),   HB_CODEPOINT_ENCODE3 (0x2264u, 0x0338u, 0x2270u),
-     HB_CODEPOINT_ENCODE3 (0x2265u, 0x0338u, 0x2271u),   HB_CODEPOINT_ENCODE3 (0x2272u, 0x0338u, 0x2274u),
-     HB_CODEPOINT_ENCODE3 (0x2273u, 0x0338u, 0x2275u),   HB_CODEPOINT_ENCODE3 (0x2276u, 0x0338u, 0x2278u),
-     HB_CODEPOINT_ENCODE3 (0x2277u, 0x0338u, 0x2279u),   HB_CODEPOINT_ENCODE3 (0x227Au, 0x0338u, 0x2280u),
-     HB_CODEPOINT_ENCODE3 (0x227Bu, 0x0338u, 0x2281u),   HB_CODEPOINT_ENCODE3 (0x227Cu, 0x0338u, 0x22E0u),
-     HB_CODEPOINT_ENCODE3 (0x227Du, 0x0338u, 0x22E1u),   HB_CODEPOINT_ENCODE3 (0x2282u, 0x0338u, 0x2284u),
-     HB_CODEPOINT_ENCODE3 (0x2283u, 0x0338u, 0x2285u),   HB_CODEPOINT_ENCODE3 (0x2286u, 0x0338u, 0x2288u),
-     HB_CODEPOINT_ENCODE3 (0x2287u, 0x0338u, 0x2289u),   HB_CODEPOINT_ENCODE3 (0x2291u, 0x0338u, 0x22E2u),
-     HB_CODEPOINT_ENCODE3 (0x2292u, 0x0338u, 0x22E3u),   HB_CODEPOINT_ENCODE3 (0x22A2u, 0x0338u, 0x22ACu),
-     HB_CODEPOINT_ENCODE3 (0x22A8u, 0x0338u, 0x22ADu),   HB_CODEPOINT_ENCODE3 (0x22A9u, 0x0338u, 0x22AEu),
-     HB_CODEPOINT_ENCODE3 (0x22ABu, 0x0338u, 0x22AFu),   HB_CODEPOINT_ENCODE3 (0x22B2u, 0x0338u, 0x22EAu),
-     HB_CODEPOINT_ENCODE3 (0x22B3u, 0x0338u, 0x22EBu),   HB_CODEPOINT_ENCODE3 (0x22B4u, 0x0338u, 0x22ECu),
-     HB_CODEPOINT_ENCODE3 (0x22B5u, 0x0338u, 0x22EDu),   HB_CODEPOINT_ENCODE3 (0x2ADDu, 0x0338u, 0x0000u),
-     HB_CODEPOINT_ENCODE3 (0x3046u, 0x3099u, 0x3094u),   HB_CODEPOINT_ENCODE3 (0x304Bu, 0x3099u, 0x304Cu),
-     HB_CODEPOINT_ENCODE3 (0x304Du, 0x3099u, 0x304Eu),   HB_CODEPOINT_ENCODE3 (0x304Fu, 0x3099u, 0x3050u),
-     HB_CODEPOINT_ENCODE3 (0x3051u, 0x3099u, 0x3052u),   HB_CODEPOINT_ENCODE3 (0x3053u, 0x3099u, 0x3054u),
-     HB_CODEPOINT_ENCODE3 (0x3055u, 0x3099u, 0x3056u),   HB_CODEPOINT_ENCODE3 (0x3057u, 0x3099u, 0x3058u),
-     HB_CODEPOINT_ENCODE3 (0x3059u, 0x3099u, 0x305Au),   HB_CODEPOINT_ENCODE3 (0x305Bu, 0x3099u, 0x305Cu),
-     HB_CODEPOINT_ENCODE3 (0x305Du, 0x3099u, 0x305Eu),   HB_CODEPOINT_ENCODE3 (0x305Fu, 0x3099u, 0x3060u),
-     HB_CODEPOINT_ENCODE3 (0x3061u, 0x3099u, 0x3062u),   HB_CODEPOINT_ENCODE3 (0x3064u, 0x3099u, 0x3065u),
-     HB_CODEPOINT_ENCODE3 (0x3066u, 0x3099u, 0x3067u),   HB_CODEPOINT_ENCODE3 (0x3068u, 0x3099u, 0x3069u),
-     HB_CODEPOINT_ENCODE3 (0x306Fu, 0x3099u, 0x3070u),   HB_CODEPOINT_ENCODE3 (0x306Fu, 0x309Au, 0x3071u),
-     HB_CODEPOINT_ENCODE3 (0x3072u, 0x3099u, 0x3073u),   HB_CODEPOINT_ENCODE3 (0x3072u, 0x309Au, 0x3074u),
-     HB_CODEPOINT_ENCODE3 (0x3075u, 0x3099u, 0x3076u),   HB_CODEPOINT_ENCODE3 (0x3075u, 0x309Au, 0x3077u),
-     HB_CODEPOINT_ENCODE3 (0x3078u, 0x3099u, 0x3079u),   HB_CODEPOINT_ENCODE3 (0x3078u, 0x309Au, 0x307Au),
-     HB_CODEPOINT_ENCODE3 (0x307Bu, 0x3099u, 0x307Cu),   HB_CODEPOINT_ENCODE3 (0x307Bu, 0x309Au, 0x307Du),
-     HB_CODEPOINT_ENCODE3 (0x309Du, 0x3099u, 0x309Eu),   HB_CODEPOINT_ENCODE3 (0x30A6u, 0x3099u, 0x30F4u),
-     HB_CODEPOINT_ENCODE3 (0x30ABu, 0x3099u, 0x30ACu),   HB_CODEPOINT_ENCODE3 (0x30ADu, 0x3099u, 0x30AEu),
-     HB_CODEPOINT_ENCODE3 (0x30AFu, 0x3099u, 0x30B0u),   HB_CODEPOINT_ENCODE3 (0x30B1u, 0x3099u, 0x30B2u),
-     HB_CODEPOINT_ENCODE3 (0x30B3u, 0x3099u, 0x30B4u),   HB_CODEPOINT_ENCODE3 (0x30B5u, 0x3099u, 0x30B6u),
-     HB_CODEPOINT_ENCODE3 (0x30B7u, 0x3099u, 0x30B8u),   HB_CODEPOINT_ENCODE3 (0x30B9u, 0x3099u, 0x30BAu),
-     HB_CODEPOINT_ENCODE3 (0x30BBu, 0x3099u, 0x30BCu),   HB_CODEPOINT_ENCODE3 (0x30BDu, 0x3099u, 0x30BEu),
-     HB_CODEPOINT_ENCODE3 (0x30BFu, 0x3099u, 0x30C0u),   HB_CODEPOINT_ENCODE3 (0x30C1u, 0x3099u, 0x30C2u),
-     HB_CODEPOINT_ENCODE3 (0x30C4u, 0x3099u, 0x30C5u),   HB_CODEPOINT_ENCODE3 (0x30C6u, 0x3099u, 0x30C7u),
-     HB_CODEPOINT_ENCODE3 (0x30C8u, 0x3099u, 0x30C9u),   HB_CODEPOINT_ENCODE3 (0x30CFu, 0x3099u, 0x30D0u),
-     HB_CODEPOINT_ENCODE3 (0x30CFu, 0x309Au, 0x30D1u),   HB_CODEPOINT_ENCODE3 (0x30D2u, 0x3099u, 0x30D3u),
-     HB_CODEPOINT_ENCODE3 (0x30D2u, 0x309Au, 0x30D4u),   HB_CODEPOINT_ENCODE3 (0x30D5u, 0x3099u, 0x30D6u),
-     HB_CODEPOINT_ENCODE3 (0x30D5u, 0x309Au, 0x30D7u),   HB_CODEPOINT_ENCODE3 (0x30D8u, 0x3099u, 0x30D9u),
-     HB_CODEPOINT_ENCODE3 (0x30D8u, 0x309Au, 0x30DAu),   HB_CODEPOINT_ENCODE3 (0x30DBu, 0x3099u, 0x30DCu),
-     HB_CODEPOINT_ENCODE3 (0x30DBu, 0x309Au, 0x30DDu),   HB_CODEPOINT_ENCODE3 (0x30EFu, 0x3099u, 0x30F7u),
-     HB_CODEPOINT_ENCODE3 (0x30F0u, 0x3099u, 0x30F8u),   HB_CODEPOINT_ENCODE3 (0x30F1u, 0x3099u, 0x30F9u),
-     HB_CODEPOINT_ENCODE3 (0x30F2u, 0x3099u, 0x30FAu),   HB_CODEPOINT_ENCODE3 (0x30FDu, 0x3099u, 0x30FEu),
-     HB_CODEPOINT_ENCODE3 (0xFB49u, 0x05C1u, 0x0000u),   HB_CODEPOINT_ENCODE3 (0xFB49u, 0x05C2u, 0x0000u),
-   HB_CODEPOINT_ENCODE3 (0x105D2u, 0x0307u, 0x105C9u), HB_CODEPOINT_ENCODE3 (0x105DAu, 0x0307u, 0x105E4u),
-  HB_CODEPOINT_ENCODE3 (0x11099u, 0x110BAu, 0x1109Au),HB_CODEPOINT_ENCODE3 (0x1109Bu, 0x110BAu, 0x1109Cu),
-  HB_CODEPOINT_ENCODE3 (0x110A5u, 0x110BAu, 0x110ABu),HB_CODEPOINT_ENCODE3 (0x11131u, 0x11127u, 0x1112Eu),
-  HB_CODEPOINT_ENCODE3 (0x11132u, 0x11127u, 0x1112Fu),HB_CODEPOINT_ENCODE3 (0x11347u, 0x1133Eu, 0x1134Bu),
-  HB_CODEPOINT_ENCODE3 (0x11347u, 0x11357u, 0x1134Cu),HB_CODEPOINT_ENCODE3 (0x11382u, 0x113C9u, 0x11383u),
-  HB_CODEPOINT_ENCODE3 (0x11384u, 0x113BBu, 0x11385u),HB_CODEPOINT_ENCODE3 (0x1138Bu, 0x113C2u, 0x1138Eu),
-  HB_CODEPOINT_ENCODE3 (0x11390u, 0x113C9u, 0x11391u),HB_CODEPOINT_ENCODE3 (0x113C2u, 0x113B8u, 0x113C7u),
-  HB_CODEPOINT_ENCODE3 (0x113C2u, 0x113C2u, 0x113C5u),HB_CODEPOINT_ENCODE3 (0x113C2u, 0x113C9u, 0x113C8u),
-  HB_CODEPOINT_ENCODE3 (0x114B9u, 0x114B0u, 0x114BCu),HB_CODEPOINT_ENCODE3 (0x114B9u, 0x114BAu, 0x114BBu),
-  HB_CODEPOINT_ENCODE3 (0x114B9u, 0x114BDu, 0x114BEu),HB_CODEPOINT_ENCODE3 (0x115B8u, 0x115AFu, 0x115BAu),
-  HB_CODEPOINT_ENCODE3 (0x115B9u, 0x115AFu, 0x115BBu),HB_CODEPOINT_ENCODE3 (0x11935u, 0x11930u, 0x11938u),
-  HB_CODEPOINT_ENCODE3 (0x1611Eu, 0x1611Eu, 0x16121u),HB_CODEPOINT_ENCODE3 (0x1611Eu, 0x1611Fu, 0x16123u),
-  HB_CODEPOINT_ENCODE3 (0x1611Eu, 0x16120u, 0x16125u),HB_CODEPOINT_ENCODE3 (0x1611Eu, 0x16129u, 0x16122u),
-  HB_CODEPOINT_ENCODE3 (0x16121u, 0x1611Fu, 0x16126u),HB_CODEPOINT_ENCODE3 (0x16121u, 0x16120u, 0x16128u),
-  HB_CODEPOINT_ENCODE3 (0x16122u, 0x1611Fu, 0x16127u),HB_CODEPOINT_ENCODE3 (0x16129u, 0x1611Fu, 0x16124u),
-  HB_CODEPOINT_ENCODE3 (0x16D63u, 0x16D67u, 0x16D69u),HB_CODEPOINT_ENCODE3 (0x16D67u, 0x16D67u, 0x16D68u),
-  HB_CODEPOINT_ENCODE3 (0x16D69u, 0x16D67u, 0x16D6Au), HB_CODEPOINT_ENCODE3 (0x1D157u, 0x1D165u, 0x0000u),
-   HB_CODEPOINT_ENCODE3 (0x1D158u, 0x1D165u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D16Eu, 0x0000u),
-   HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D16Fu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D170u, 0x0000u),
-   HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D171u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D172u, 0x0000u),
-   HB_CODEPOINT_ENCODE3 (0x1D1B9u, 0x1D165u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1BAu, 0x1D165u, 0x0000u),
-   HB_CODEPOINT_ENCODE3 (0x1D1BBu, 0x1D16Eu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1BBu, 0x1D16Fu, 0x0000u),
-   HB_CODEPOINT_ENCODE3 (0x1D1BCu, 0x1D16Eu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1BCu, 0x1D16Fu, 0x0000u),
+     HB_CODEPOINT_ENCODE3 (0x05D0, 0x05B7, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05D0, 0x05B8, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x05D0, 0x05BC, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05D1, 0x05BC, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x05D1, 0x05BF, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05D2, 0x05BC, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x05D3, 0x05BC, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05D4, 0x05BC, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x05D5, 0x05B9, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05D5, 0x05BC, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x05D6, 0x05BC, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05D8, 0x05BC, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x05D9, 0x05B4, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05D9, 0x05BC, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x05DA, 0x05BC, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05DB, 0x05BC, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x05DB, 0x05BF, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05DC, 0x05BC, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x05DE, 0x05BC, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05E0, 0x05BC, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x05E1, 0x05BC, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05E3, 0x05BC, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x05E4, 0x05BC, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05E4, 0x05BF, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x05E6, 0x05BC, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05E7, 0x05BC, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x05E8, 0x05BC, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05E9, 0x05BC, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x05E9, 0x05C1, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05E9, 0x05C2, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x05EA, 0x05BC, 0x0000),   HB_CODEPOINT_ENCODE3 (0x05F2, 0x05B7, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0627, 0x0653, 0x0622),   HB_CODEPOINT_ENCODE3 (0x0627, 0x0654, 0x0623),
+     HB_CODEPOINT_ENCODE3 (0x0627, 0x0655, 0x0625),   HB_CODEPOINT_ENCODE3 (0x0648, 0x0654, 0x0624),
+     HB_CODEPOINT_ENCODE3 (0x064A, 0x0654, 0x0626),   HB_CODEPOINT_ENCODE3 (0x06C1, 0x0654, 0x06C2),
+     HB_CODEPOINT_ENCODE3 (0x06D2, 0x0654, 0x06D3),   HB_CODEPOINT_ENCODE3 (0x06D5, 0x0654, 0x06C0),
+     HB_CODEPOINT_ENCODE3 (0x0915, 0x093C, 0x0000),   HB_CODEPOINT_ENCODE3 (0x0916, 0x093C, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0917, 0x093C, 0x0000),   HB_CODEPOINT_ENCODE3 (0x091C, 0x093C, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0921, 0x093C, 0x0000),   HB_CODEPOINT_ENCODE3 (0x0922, 0x093C, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0928, 0x093C, 0x0929),   HB_CODEPOINT_ENCODE3 (0x092B, 0x093C, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x092F, 0x093C, 0x0000),   HB_CODEPOINT_ENCODE3 (0x0930, 0x093C, 0x0931),
+     HB_CODEPOINT_ENCODE3 (0x0933, 0x093C, 0x0934),   HB_CODEPOINT_ENCODE3 (0x09A1, 0x09BC, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x09A2, 0x09BC, 0x0000),   HB_CODEPOINT_ENCODE3 (0x09AF, 0x09BC, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x09C7, 0x09BE, 0x09CB),   HB_CODEPOINT_ENCODE3 (0x09C7, 0x09D7, 0x09CC),
+     HB_CODEPOINT_ENCODE3 (0x0A16, 0x0A3C, 0x0000),   HB_CODEPOINT_ENCODE3 (0x0A17, 0x0A3C, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0A1C, 0x0A3C, 0x0000),   HB_CODEPOINT_ENCODE3 (0x0A2B, 0x0A3C, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0A32, 0x0A3C, 0x0000),   HB_CODEPOINT_ENCODE3 (0x0A38, 0x0A3C, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0B21, 0x0B3C, 0x0000),   HB_CODEPOINT_ENCODE3 (0x0B22, 0x0B3C, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0B47, 0x0B3E, 0x0B4B),   HB_CODEPOINT_ENCODE3 (0x0B47, 0x0B56, 0x0B48),
+     HB_CODEPOINT_ENCODE3 (0x0B47, 0x0B57, 0x0B4C),   HB_CODEPOINT_ENCODE3 (0x0B92, 0x0BD7, 0x0B94),
+     HB_CODEPOINT_ENCODE3 (0x0BC6, 0x0BBE, 0x0BCA),   HB_CODEPOINT_ENCODE3 (0x0BC6, 0x0BD7, 0x0BCC),
+     HB_CODEPOINT_ENCODE3 (0x0BC7, 0x0BBE, 0x0BCB),   HB_CODEPOINT_ENCODE3 (0x0C46, 0x0C56, 0x0C48),
+     HB_CODEPOINT_ENCODE3 (0x0CBF, 0x0CD5, 0x0CC0),   HB_CODEPOINT_ENCODE3 (0x0CC6, 0x0CC2, 0x0CCA),
+     HB_CODEPOINT_ENCODE3 (0x0CC6, 0x0CD5, 0x0CC7),   HB_CODEPOINT_ENCODE3 (0x0CC6, 0x0CD6, 0x0CC8),
+     HB_CODEPOINT_ENCODE3 (0x0CCA, 0x0CD5, 0x0CCB),   HB_CODEPOINT_ENCODE3 (0x0D46, 0x0D3E, 0x0D4A),
+     HB_CODEPOINT_ENCODE3 (0x0D46, 0x0D57, 0x0D4C),   HB_CODEPOINT_ENCODE3 (0x0D47, 0x0D3E, 0x0D4B),
+     HB_CODEPOINT_ENCODE3 (0x0DD9, 0x0DCA, 0x0DDA),   HB_CODEPOINT_ENCODE3 (0x0DD9, 0x0DCF, 0x0DDC),
+     HB_CODEPOINT_ENCODE3 (0x0DD9, 0x0DDF, 0x0DDE),   HB_CODEPOINT_ENCODE3 (0x0DDC, 0x0DCA, 0x0DDD),
+     HB_CODEPOINT_ENCODE3 (0x0F40, 0x0FB5, 0x0000),   HB_CODEPOINT_ENCODE3 (0x0F42, 0x0FB7, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0F4C, 0x0FB7, 0x0000),   HB_CODEPOINT_ENCODE3 (0x0F51, 0x0FB7, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0F56, 0x0FB7, 0x0000),   HB_CODEPOINT_ENCODE3 (0x0F5B, 0x0FB7, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0F71, 0x0F72, 0x0000),   HB_CODEPOINT_ENCODE3 (0x0F71, 0x0F74, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0F71, 0x0F80, 0x0000),   HB_CODEPOINT_ENCODE3 (0x0F90, 0x0FB5, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0F92, 0x0FB7, 0x0000),   HB_CODEPOINT_ENCODE3 (0x0F9C, 0x0FB7, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0FA1, 0x0FB7, 0x0000),   HB_CODEPOINT_ENCODE3 (0x0FA6, 0x0FB7, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0FAB, 0x0FB7, 0x0000),   HB_CODEPOINT_ENCODE3 (0x0FB2, 0x0F80, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x0FB3, 0x0F80, 0x0000),   HB_CODEPOINT_ENCODE3 (0x1025, 0x102E, 0x1026),
+     HB_CODEPOINT_ENCODE3 (0x1B05, 0x1B35, 0x1B06),   HB_CODEPOINT_ENCODE3 (0x1B07, 0x1B35, 0x1B08),
+     HB_CODEPOINT_ENCODE3 (0x1B09, 0x1B35, 0x1B0A),   HB_CODEPOINT_ENCODE3 (0x1B0B, 0x1B35, 0x1B0C),
+     HB_CODEPOINT_ENCODE3 (0x1B0D, 0x1B35, 0x1B0E),   HB_CODEPOINT_ENCODE3 (0x1B11, 0x1B35, 0x1B12),
+     HB_CODEPOINT_ENCODE3 (0x1B3A, 0x1B35, 0x1B3B),   HB_CODEPOINT_ENCODE3 (0x1B3C, 0x1B35, 0x1B3D),
+     HB_CODEPOINT_ENCODE3 (0x1B3E, 0x1B35, 0x1B40),   HB_CODEPOINT_ENCODE3 (0x1B3F, 0x1B35, 0x1B41),
+     HB_CODEPOINT_ENCODE3 (0x1B42, 0x1B35, 0x1B43),   HB_CODEPOINT_ENCODE3 (0x1E36, 0x0304, 0x1E38),
+     HB_CODEPOINT_ENCODE3 (0x1E37, 0x0304, 0x1E39),   HB_CODEPOINT_ENCODE3 (0x1E5A, 0x0304, 0x1E5C),
+     HB_CODEPOINT_ENCODE3 (0x1E5B, 0x0304, 0x1E5D),   HB_CODEPOINT_ENCODE3 (0x1E62, 0x0307, 0x1E68),
+     HB_CODEPOINT_ENCODE3 (0x1E63, 0x0307, 0x1E69),   HB_CODEPOINT_ENCODE3 (0x1EA0, 0x0302, 0x1EAC),
+     HB_CODEPOINT_ENCODE3 (0x1EA0, 0x0306, 0x1EB6),   HB_CODEPOINT_ENCODE3 (0x1EA1, 0x0302, 0x1EAD),
+     HB_CODEPOINT_ENCODE3 (0x1EA1, 0x0306, 0x1EB7),   HB_CODEPOINT_ENCODE3 (0x1EB8, 0x0302, 0x1EC6),
+     HB_CODEPOINT_ENCODE3 (0x1EB9, 0x0302, 0x1EC7),   HB_CODEPOINT_ENCODE3 (0x1ECC, 0x0302, 0x1ED8),
+     HB_CODEPOINT_ENCODE3 (0x1ECD, 0x0302, 0x1ED9),   HB_CODEPOINT_ENCODE3 (0x1F00, 0x0300, 0x1F02),
+     HB_CODEPOINT_ENCODE3 (0x1F00, 0x0301, 0x1F04),   HB_CODEPOINT_ENCODE3 (0x1F00, 0x0342, 0x1F06),
+     HB_CODEPOINT_ENCODE3 (0x1F00, 0x0345, 0x1F80),   HB_CODEPOINT_ENCODE3 (0x1F01, 0x0300, 0x1F03),
+     HB_CODEPOINT_ENCODE3 (0x1F01, 0x0301, 0x1F05),   HB_CODEPOINT_ENCODE3 (0x1F01, 0x0342, 0x1F07),
+     HB_CODEPOINT_ENCODE3 (0x1F01, 0x0345, 0x1F81),   HB_CODEPOINT_ENCODE3 (0x1F02, 0x0345, 0x1F82),
+     HB_CODEPOINT_ENCODE3 (0x1F03, 0x0345, 0x1F83),   HB_CODEPOINT_ENCODE3 (0x1F04, 0x0345, 0x1F84),
+     HB_CODEPOINT_ENCODE3 (0x1F05, 0x0345, 0x1F85),   HB_CODEPOINT_ENCODE3 (0x1F06, 0x0345, 0x1F86),
+     HB_CODEPOINT_ENCODE3 (0x1F07, 0x0345, 0x1F87),   HB_CODEPOINT_ENCODE3 (0x1F08, 0x0300, 0x1F0A),
+     HB_CODEPOINT_ENCODE3 (0x1F08, 0x0301, 0x1F0C),   HB_CODEPOINT_ENCODE3 (0x1F08, 0x0342, 0x1F0E),
+     HB_CODEPOINT_ENCODE3 (0x1F08, 0x0345, 0x1F88),   HB_CODEPOINT_ENCODE3 (0x1F09, 0x0300, 0x1F0B),
+     HB_CODEPOINT_ENCODE3 (0x1F09, 0x0301, 0x1F0D),   HB_CODEPOINT_ENCODE3 (0x1F09, 0x0342, 0x1F0F),
+     HB_CODEPOINT_ENCODE3 (0x1F09, 0x0345, 0x1F89),   HB_CODEPOINT_ENCODE3 (0x1F0A, 0x0345, 0x1F8A),
+     HB_CODEPOINT_ENCODE3 (0x1F0B, 0x0345, 0x1F8B),   HB_CODEPOINT_ENCODE3 (0x1F0C, 0x0345, 0x1F8C),
+     HB_CODEPOINT_ENCODE3 (0x1F0D, 0x0345, 0x1F8D),   HB_CODEPOINT_ENCODE3 (0x1F0E, 0x0345, 0x1F8E),
+     HB_CODEPOINT_ENCODE3 (0x1F0F, 0x0345, 0x1F8F),   HB_CODEPOINT_ENCODE3 (0x1F10, 0x0300, 0x1F12),
+     HB_CODEPOINT_ENCODE3 (0x1F10, 0x0301, 0x1F14),   HB_CODEPOINT_ENCODE3 (0x1F11, 0x0300, 0x1F13),
+     HB_CODEPOINT_ENCODE3 (0x1F11, 0x0301, 0x1F15),   HB_CODEPOINT_ENCODE3 (0x1F18, 0x0300, 0x1F1A),
+     HB_CODEPOINT_ENCODE3 (0x1F18, 0x0301, 0x1F1C),   HB_CODEPOINT_ENCODE3 (0x1F19, 0x0300, 0x1F1B),
+     HB_CODEPOINT_ENCODE3 (0x1F19, 0x0301, 0x1F1D),   HB_CODEPOINT_ENCODE3 (0x1F20, 0x0300, 0x1F22),
+     HB_CODEPOINT_ENCODE3 (0x1F20, 0x0301, 0x1F24),   HB_CODEPOINT_ENCODE3 (0x1F20, 0x0342, 0x1F26),
+     HB_CODEPOINT_ENCODE3 (0x1F20, 0x0345, 0x1F90),   HB_CODEPOINT_ENCODE3 (0x1F21, 0x0300, 0x1F23),
+     HB_CODEPOINT_ENCODE3 (0x1F21, 0x0301, 0x1F25),   HB_CODEPOINT_ENCODE3 (0x1F21, 0x0342, 0x1F27),
+     HB_CODEPOINT_ENCODE3 (0x1F21, 0x0345, 0x1F91),   HB_CODEPOINT_ENCODE3 (0x1F22, 0x0345, 0x1F92),
+     HB_CODEPOINT_ENCODE3 (0x1F23, 0x0345, 0x1F93),   HB_CODEPOINT_ENCODE3 (0x1F24, 0x0345, 0x1F94),
+     HB_CODEPOINT_ENCODE3 (0x1F25, 0x0345, 0x1F95),   HB_CODEPOINT_ENCODE3 (0x1F26, 0x0345, 0x1F96),
+     HB_CODEPOINT_ENCODE3 (0x1F27, 0x0345, 0x1F97),   HB_CODEPOINT_ENCODE3 (0x1F28, 0x0300, 0x1F2A),
+     HB_CODEPOINT_ENCODE3 (0x1F28, 0x0301, 0x1F2C),   HB_CODEPOINT_ENCODE3 (0x1F28, 0x0342, 0x1F2E),
+     HB_CODEPOINT_ENCODE3 (0x1F28, 0x0345, 0x1F98),   HB_CODEPOINT_ENCODE3 (0x1F29, 0x0300, 0x1F2B),
+     HB_CODEPOINT_ENCODE3 (0x1F29, 0x0301, 0x1F2D),   HB_CODEPOINT_ENCODE3 (0x1F29, 0x0342, 0x1F2F),
+     HB_CODEPOINT_ENCODE3 (0x1F29, 0x0345, 0x1F99),   HB_CODEPOINT_ENCODE3 (0x1F2A, 0x0345, 0x1F9A),
+     HB_CODEPOINT_ENCODE3 (0x1F2B, 0x0345, 0x1F9B),   HB_CODEPOINT_ENCODE3 (0x1F2C, 0x0345, 0x1F9C),
+     HB_CODEPOINT_ENCODE3 (0x1F2D, 0x0345, 0x1F9D),   HB_CODEPOINT_ENCODE3 (0x1F2E, 0x0345, 0x1F9E),
+     HB_CODEPOINT_ENCODE3 (0x1F2F, 0x0345, 0x1F9F),   HB_CODEPOINT_ENCODE3 (0x1F30, 0x0300, 0x1F32),
+     HB_CODEPOINT_ENCODE3 (0x1F30, 0x0301, 0x1F34),   HB_CODEPOINT_ENCODE3 (0x1F30, 0x0342, 0x1F36),
+     HB_CODEPOINT_ENCODE3 (0x1F31, 0x0300, 0x1F33),   HB_CODEPOINT_ENCODE3 (0x1F31, 0x0301, 0x1F35),
+     HB_CODEPOINT_ENCODE3 (0x1F31, 0x0342, 0x1F37),   HB_CODEPOINT_ENCODE3 (0x1F38, 0x0300, 0x1F3A),
+     HB_CODEPOINT_ENCODE3 (0x1F38, 0x0301, 0x1F3C),   HB_CODEPOINT_ENCODE3 (0x1F38, 0x0342, 0x1F3E),
+     HB_CODEPOINT_ENCODE3 (0x1F39, 0x0300, 0x1F3B),   HB_CODEPOINT_ENCODE3 (0x1F39, 0x0301, 0x1F3D),
+     HB_CODEPOINT_ENCODE3 (0x1F39, 0x0342, 0x1F3F),   HB_CODEPOINT_ENCODE3 (0x1F40, 0x0300, 0x1F42),
+     HB_CODEPOINT_ENCODE3 (0x1F40, 0x0301, 0x1F44),   HB_CODEPOINT_ENCODE3 (0x1F41, 0x0300, 0x1F43),
+     HB_CODEPOINT_ENCODE3 (0x1F41, 0x0301, 0x1F45),   HB_CODEPOINT_ENCODE3 (0x1F48, 0x0300, 0x1F4A),
+     HB_CODEPOINT_ENCODE3 (0x1F48, 0x0301, 0x1F4C),   HB_CODEPOINT_ENCODE3 (0x1F49, 0x0300, 0x1F4B),
+     HB_CODEPOINT_ENCODE3 (0x1F49, 0x0301, 0x1F4D),   HB_CODEPOINT_ENCODE3 (0x1F50, 0x0300, 0x1F52),
+     HB_CODEPOINT_ENCODE3 (0x1F50, 0x0301, 0x1F54),   HB_CODEPOINT_ENCODE3 (0x1F50, 0x0342, 0x1F56),
+     HB_CODEPOINT_ENCODE3 (0x1F51, 0x0300, 0x1F53),   HB_CODEPOINT_ENCODE3 (0x1F51, 0x0301, 0x1F55),
+     HB_CODEPOINT_ENCODE3 (0x1F51, 0x0342, 0x1F57),   HB_CODEPOINT_ENCODE3 (0x1F59, 0x0300, 0x1F5B),
+     HB_CODEPOINT_ENCODE3 (0x1F59, 0x0301, 0x1F5D),   HB_CODEPOINT_ENCODE3 (0x1F59, 0x0342, 0x1F5F),
+     HB_CODEPOINT_ENCODE3 (0x1F60, 0x0300, 0x1F62),   HB_CODEPOINT_ENCODE3 (0x1F60, 0x0301, 0x1F64),
+     HB_CODEPOINT_ENCODE3 (0x1F60, 0x0342, 0x1F66),   HB_CODEPOINT_ENCODE3 (0x1F60, 0x0345, 0x1FA0),
+     HB_CODEPOINT_ENCODE3 (0x1F61, 0x0300, 0x1F63),   HB_CODEPOINT_ENCODE3 (0x1F61, 0x0301, 0x1F65),
+     HB_CODEPOINT_ENCODE3 (0x1F61, 0x0342, 0x1F67),   HB_CODEPOINT_ENCODE3 (0x1F61, 0x0345, 0x1FA1),
+     HB_CODEPOINT_ENCODE3 (0x1F62, 0x0345, 0x1FA2),   HB_CODEPOINT_ENCODE3 (0x1F63, 0x0345, 0x1FA3),
+     HB_CODEPOINT_ENCODE3 (0x1F64, 0x0345, 0x1FA4),   HB_CODEPOINT_ENCODE3 (0x1F65, 0x0345, 0x1FA5),
+     HB_CODEPOINT_ENCODE3 (0x1F66, 0x0345, 0x1FA6),   HB_CODEPOINT_ENCODE3 (0x1F67, 0x0345, 0x1FA7),
+     HB_CODEPOINT_ENCODE3 (0x1F68, 0x0300, 0x1F6A),   HB_CODEPOINT_ENCODE3 (0x1F68, 0x0301, 0x1F6C),
+     HB_CODEPOINT_ENCODE3 (0x1F68, 0x0342, 0x1F6E),   HB_CODEPOINT_ENCODE3 (0x1F68, 0x0345, 0x1FA8),
+     HB_CODEPOINT_ENCODE3 (0x1F69, 0x0300, 0x1F6B),   HB_CODEPOINT_ENCODE3 (0x1F69, 0x0301, 0x1F6D),
+     HB_CODEPOINT_ENCODE3 (0x1F69, 0x0342, 0x1F6F),   HB_CODEPOINT_ENCODE3 (0x1F69, 0x0345, 0x1FA9),
+     HB_CODEPOINT_ENCODE3 (0x1F6A, 0x0345, 0x1FAA),   HB_CODEPOINT_ENCODE3 (0x1F6B, 0x0345, 0x1FAB),
+     HB_CODEPOINT_ENCODE3 (0x1F6C, 0x0345, 0x1FAC),   HB_CODEPOINT_ENCODE3 (0x1F6D, 0x0345, 0x1FAD),
+     HB_CODEPOINT_ENCODE3 (0x1F6E, 0x0345, 0x1FAE),   HB_CODEPOINT_ENCODE3 (0x1F6F, 0x0345, 0x1FAF),
+     HB_CODEPOINT_ENCODE3 (0x1F70, 0x0345, 0x1FB2),   HB_CODEPOINT_ENCODE3 (0x1F74, 0x0345, 0x1FC2),
+     HB_CODEPOINT_ENCODE3 (0x1F7C, 0x0345, 0x1FF2),   HB_CODEPOINT_ENCODE3 (0x1FB6, 0x0345, 0x1FB7),
+     HB_CODEPOINT_ENCODE3 (0x1FBF, 0x0300, 0x1FCD),   HB_CODEPOINT_ENCODE3 (0x1FBF, 0x0301, 0x1FCE),
+     HB_CODEPOINT_ENCODE3 (0x1FBF, 0x0342, 0x1FCF),   HB_CODEPOINT_ENCODE3 (0x1FC6, 0x0345, 0x1FC7),
+     HB_CODEPOINT_ENCODE3 (0x1FF6, 0x0345, 0x1FF7),   HB_CODEPOINT_ENCODE3 (0x1FFE, 0x0300, 0x1FDD),
+     HB_CODEPOINT_ENCODE3 (0x1FFE, 0x0301, 0x1FDE),   HB_CODEPOINT_ENCODE3 (0x1FFE, 0x0342, 0x1FDF),
+     HB_CODEPOINT_ENCODE3 (0x2190, 0x0338, 0x219A),   HB_CODEPOINT_ENCODE3 (0x2192, 0x0338, 0x219B),
+     HB_CODEPOINT_ENCODE3 (0x2194, 0x0338, 0x21AE),   HB_CODEPOINT_ENCODE3 (0x21D0, 0x0338, 0x21CD),
+     HB_CODEPOINT_ENCODE3 (0x21D2, 0x0338, 0x21CF),   HB_CODEPOINT_ENCODE3 (0x21D4, 0x0338, 0x21CE),
+     HB_CODEPOINT_ENCODE3 (0x2203, 0x0338, 0x2204),   HB_CODEPOINT_ENCODE3 (0x2208, 0x0338, 0x2209),
+     HB_CODEPOINT_ENCODE3 (0x220B, 0x0338, 0x220C),   HB_CODEPOINT_ENCODE3 (0x2223, 0x0338, 0x2224),
+     HB_CODEPOINT_ENCODE3 (0x2225, 0x0338, 0x2226),   HB_CODEPOINT_ENCODE3 (0x223C, 0x0338, 0x2241),
+     HB_CODEPOINT_ENCODE3 (0x2243, 0x0338, 0x2244),   HB_CODEPOINT_ENCODE3 (0x2245, 0x0338, 0x2247),
+     HB_CODEPOINT_ENCODE3 (0x2248, 0x0338, 0x2249),   HB_CODEPOINT_ENCODE3 (0x224D, 0x0338, 0x226D),
+     HB_CODEPOINT_ENCODE3 (0x2261, 0x0338, 0x2262),   HB_CODEPOINT_ENCODE3 (0x2264, 0x0338, 0x2270),
+     HB_CODEPOINT_ENCODE3 (0x2265, 0x0338, 0x2271),   HB_CODEPOINT_ENCODE3 (0x2272, 0x0338, 0x2274),
+     HB_CODEPOINT_ENCODE3 (0x2273, 0x0338, 0x2275),   HB_CODEPOINT_ENCODE3 (0x2276, 0x0338, 0x2278),
+     HB_CODEPOINT_ENCODE3 (0x2277, 0x0338, 0x2279),   HB_CODEPOINT_ENCODE3 (0x227A, 0x0338, 0x2280),
+     HB_CODEPOINT_ENCODE3 (0x227B, 0x0338, 0x2281),   HB_CODEPOINT_ENCODE3 (0x227C, 0x0338, 0x22E0),
+     HB_CODEPOINT_ENCODE3 (0x227D, 0x0338, 0x22E1),   HB_CODEPOINT_ENCODE3 (0x2282, 0x0338, 0x2284),
+     HB_CODEPOINT_ENCODE3 (0x2283, 0x0338, 0x2285),   HB_CODEPOINT_ENCODE3 (0x2286, 0x0338, 0x2288),
+     HB_CODEPOINT_ENCODE3 (0x2287, 0x0338, 0x2289),   HB_CODEPOINT_ENCODE3 (0x2291, 0x0338, 0x22E2),
+     HB_CODEPOINT_ENCODE3 (0x2292, 0x0338, 0x22E3),   HB_CODEPOINT_ENCODE3 (0x22A2, 0x0338, 0x22AC),
+     HB_CODEPOINT_ENCODE3 (0x22A8, 0x0338, 0x22AD),   HB_CODEPOINT_ENCODE3 (0x22A9, 0x0338, 0x22AE),
+     HB_CODEPOINT_ENCODE3 (0x22AB, 0x0338, 0x22AF),   HB_CODEPOINT_ENCODE3 (0x22B2, 0x0338, 0x22EA),
+     HB_CODEPOINT_ENCODE3 (0x22B3, 0x0338, 0x22EB),   HB_CODEPOINT_ENCODE3 (0x22B4, 0x0338, 0x22EC),
+     HB_CODEPOINT_ENCODE3 (0x22B5, 0x0338, 0x22ED),   HB_CODEPOINT_ENCODE3 (0x2ADD, 0x0338, 0x0000),
+     HB_CODEPOINT_ENCODE3 (0x3046, 0x3099, 0x3094),   HB_CODEPOINT_ENCODE3 (0x304B, 0x3099, 0x304C),
+     HB_CODEPOINT_ENCODE3 (0x304D, 0x3099, 0x304E),   HB_CODEPOINT_ENCODE3 (0x304F, 0x3099, 0x3050),
+     HB_CODEPOINT_ENCODE3 (0x3051, 0x3099, 0x3052),   HB_CODEPOINT_ENCODE3 (0x3053, 0x3099, 0x3054),
+     HB_CODEPOINT_ENCODE3 (0x3055, 0x3099, 0x3056),   HB_CODEPOINT_ENCODE3 (0x3057, 0x3099, 0x3058),
+     HB_CODEPOINT_ENCODE3 (0x3059, 0x3099, 0x305A),   HB_CODEPOINT_ENCODE3 (0x305B, 0x3099, 0x305C),
+     HB_CODEPOINT_ENCODE3 (0x305D, 0x3099, 0x305E),   HB_CODEPOINT_ENCODE3 (0x305F, 0x3099, 0x3060),
+     HB_CODEPOINT_ENCODE3 (0x3061, 0x3099, 0x3062),   HB_CODEPOINT_ENCODE3 (0x3064, 0x3099, 0x3065),
+     HB_CODEPOINT_ENCODE3 (0x3066, 0x3099, 0x3067),   HB_CODEPOINT_ENCODE3 (0x3068, 0x3099, 0x3069),
+     HB_CODEPOINT_ENCODE3 (0x306F, 0x3099, 0x3070),   HB_CODEPOINT_ENCODE3 (0x306F, 0x309A, 0x3071),
+     HB_CODEPOINT_ENCODE3 (0x3072, 0x3099, 0x3073),   HB_CODEPOINT_ENCODE3 (0x3072, 0x309A, 0x3074),
+     HB_CODEPOINT_ENCODE3 (0x3075, 0x3099, 0x3076),   HB_CODEPOINT_ENCODE3 (0x3075, 0x309A, 0x3077),
+     HB_CODEPOINT_ENCODE3 (0x3078, 0x3099, 0x3079),   HB_CODEPOINT_ENCODE3 (0x3078, 0x309A, 0x307A),
+     HB_CODEPOINT_ENCODE3 (0x307B, 0x3099, 0x307C),   HB_CODEPOINT_ENCODE3 (0x307B, 0x309A, 0x307D),
+     HB_CODEPOINT_ENCODE3 (0x309D, 0x3099, 0x309E),   HB_CODEPOINT_ENCODE3 (0x30A6, 0x3099, 0x30F4),
+     HB_CODEPOINT_ENCODE3 (0x30AB, 0x3099, 0x30AC),   HB_CODEPOINT_ENCODE3 (0x30AD, 0x3099, 0x30AE),
+     HB_CODEPOINT_ENCODE3 (0x30AF, 0x3099, 0x30B0),   HB_CODEPOINT_ENCODE3 (0x30B1, 0x3099, 0x30B2),
+     HB_CODEPOINT_ENCODE3 (0x30B3, 0x3099, 0x30B4),   HB_CODEPOINT_ENCODE3 (0x30B5, 0x3099, 0x30B6),
+     HB_CODEPOINT_ENCODE3 (0x30B7, 0x3099, 0x30B8),   HB_CODEPOINT_ENCODE3 (0x30B9, 0x3099, 0x30BA),
+     HB_CODEPOINT_ENCODE3 (0x30BB, 0x3099, 0x30BC),   HB_CODEPOINT_ENCODE3 (0x30BD, 0x3099, 0x30BE),
+     HB_CODEPOINT_ENCODE3 (0x30BF, 0x3099, 0x30C0),   HB_CODEPOINT_ENCODE3 (0x30C1, 0x3099, 0x30C2),
+     HB_CODEPOINT_ENCODE3 (0x30C4, 0x3099, 0x30C5),   HB_CODEPOINT_ENCODE3 (0x30C6, 0x3099, 0x30C7),
+     HB_CODEPOINT_ENCODE3 (0x30C8, 0x3099, 0x30C9),   HB_CODEPOINT_ENCODE3 (0x30CF, 0x3099, 0x30D0),
+     HB_CODEPOINT_ENCODE3 (0x30CF, 0x309A, 0x30D1),   HB_CODEPOINT_ENCODE3 (0x30D2, 0x3099, 0x30D3),
+     HB_CODEPOINT_ENCODE3 (0x30D2, 0x309A, 0x30D4),   HB_CODEPOINT_ENCODE3 (0x30D5, 0x3099, 0x30D6),
+     HB_CODEPOINT_ENCODE3 (0x30D5, 0x309A, 0x30D7),   HB_CODEPOINT_ENCODE3 (0x30D8, 0x3099, 0x30D9),
+     HB_CODEPOINT_ENCODE3 (0x30D8, 0x309A, 0x30DA),   HB_CODEPOINT_ENCODE3 (0x30DB, 0x3099, 0x30DC),
+     HB_CODEPOINT_ENCODE3 (0x30DB, 0x309A, 0x30DD),   HB_CODEPOINT_ENCODE3 (0x30EF, 0x3099, 0x30F7),
+     HB_CODEPOINT_ENCODE3 (0x30F0, 0x3099, 0x30F8),   HB_CODEPOINT_ENCODE3 (0x30F1, 0x3099, 0x30F9),
+     HB_CODEPOINT_ENCODE3 (0x30F2, 0x3099, 0x30FA),   HB_CODEPOINT_ENCODE3 (0x30FD, 0x3099, 0x30FE),
+     HB_CODEPOINT_ENCODE3 (0xFB49, 0x05C1, 0x0000),   HB_CODEPOINT_ENCODE3 (0xFB49, 0x05C2, 0x0000),
+   HB_CODEPOINT_ENCODE3 (0x105D2, 0x0307, 0x105C9), HB_CODEPOINT_ENCODE3 (0x105DA, 0x0307, 0x105E4),
+  HB_CODEPOINT_ENCODE3 (0x11099, 0x110BA, 0x1109A),HB_CODEPOINT_ENCODE3 (0x1109B, 0x110BA, 0x1109C),
+  HB_CODEPOINT_ENCODE3 (0x110A5, 0x110BA, 0x110AB),HB_CODEPOINT_ENCODE3 (0x11131, 0x11127, 0x1112E),
+  HB_CODEPOINT_ENCODE3 (0x11132, 0x11127, 0x1112F),HB_CODEPOINT_ENCODE3 (0x11347, 0x1133E, 0x1134B),
+  HB_CODEPOINT_ENCODE3 (0x11347, 0x11357, 0x1134C),HB_CODEPOINT_ENCODE3 (0x11382, 0x113C9, 0x11383),
+  HB_CODEPOINT_ENCODE3 (0x11384, 0x113BB, 0x11385),HB_CODEPOINT_ENCODE3 (0x1138B, 0x113C2, 0x1138E),
+  HB_CODEPOINT_ENCODE3 (0x11390, 0x113C9, 0x11391),HB_CODEPOINT_ENCODE3 (0x113C2, 0x113B8, 0x113C7),
+  HB_CODEPOINT_ENCODE3 (0x113C2, 0x113C2, 0x113C5),HB_CODEPOINT_ENCODE3 (0x113C2, 0x113C9, 0x113C8),
+  HB_CODEPOINT_ENCODE3 (0x114B9, 0x114B0, 0x114BC),HB_CODEPOINT_ENCODE3 (0x114B9, 0x114BA, 0x114BB),
+  HB_CODEPOINT_ENCODE3 (0x114B9, 0x114BD, 0x114BE),HB_CODEPOINT_ENCODE3 (0x115B8, 0x115AF, 0x115BA),
+  HB_CODEPOINT_ENCODE3 (0x115B9, 0x115AF, 0x115BB),HB_CODEPOINT_ENCODE3 (0x11935, 0x11930, 0x11938),
+  HB_CODEPOINT_ENCODE3 (0x1611E, 0x1611E, 0x16121),HB_CODEPOINT_ENCODE3 (0x1611E, 0x1611F, 0x16123),
+  HB_CODEPOINT_ENCODE3 (0x1611E, 0x16120, 0x16125),HB_CODEPOINT_ENCODE3 (0x1611E, 0x16129, 0x16122),
+  HB_CODEPOINT_ENCODE3 (0x16121, 0x1611F, 0x16126),HB_CODEPOINT_ENCODE3 (0x16121, 0x16120, 0x16128),
+  HB_CODEPOINT_ENCODE3 (0x16122, 0x1611F, 0x16127),HB_CODEPOINT_ENCODE3 (0x16129, 0x1611F, 0x16124),
+  HB_CODEPOINT_ENCODE3 (0x16D63, 0x16D67, 0x16D69),HB_CODEPOINT_ENCODE3 (0x16D67, 0x16D67, 0x16D68),
+  HB_CODEPOINT_ENCODE3 (0x16D69, 0x16D67, 0x16D6A), HB_CODEPOINT_ENCODE3 (0x1D157, 0x1D165, 0x0000),
+   HB_CODEPOINT_ENCODE3 (0x1D158, 0x1D165, 0x0000), HB_CODEPOINT_ENCODE3 (0x1D15F, 0x1D16E, 0x0000),
+   HB_CODEPOINT_ENCODE3 (0x1D15F, 0x1D16F, 0x0000), HB_CODEPOINT_ENCODE3 (0x1D15F, 0x1D170, 0x0000),
+   HB_CODEPOINT_ENCODE3 (0x1D15F, 0x1D171, 0x0000), HB_CODEPOINT_ENCODE3 (0x1D15F, 0x1D172, 0x0000),
+   HB_CODEPOINT_ENCODE3 (0x1D1B9, 0x1D165, 0x0000), HB_CODEPOINT_ENCODE3 (0x1D1BA, 0x1D165, 0x0000),
+   HB_CODEPOINT_ENCODE3 (0x1D1BB, 0x1D16E, 0x0000), HB_CODEPOINT_ENCODE3 (0x1D1BB, 0x1D16F, 0x0000),
+   HB_CODEPOINT_ENCODE3 (0x1D1BC, 0x1D16E, 0x0000), HB_CODEPOINT_ENCODE3 (0x1D1BC, 0x1D16F, 0x0000),
 };
 
 #ifndef HB_OPTIMIZE_SIZE
 
-static const uint8_t
-_hb_ucd_u8[17612] =
+#include 
+
+static const uint8_t _hb_ucd_u8[19868]=
 {
-    0,  1,  2,  3,  4,  5,  5,  5,  5,  5,  6,  5,  5,  7,  8,  9,
-   10, 11, 12, 13, 14, 15, 16,  5, 17, 15, 18, 19, 20, 21, 22, 23,
-    5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 24, 25, 26,  5, 27, 28,
-    5, 29, 30, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   31, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-    8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 32,
-    8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8, 33,
     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
-   16, 17, 18, 19, 20, 17, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
-   31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 33, 41, 42, 43, 44, 45,
-   46, 47, 48, 39, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 49, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   50, 17, 17, 17, 51, 17, 52, 53, 54, 55, 56, 57, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 58, 59, 59, 59, 59, 59, 59, 59, 59,
-   60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
-   60, 60, 60, 60, 60, 60, 60, 60, 60, 17, 61, 62, 17, 63, 64, 65,
-   66, 67, 68, 69, 70, 71, 17, 72, 73, 74, 75, 76, 77, 78, 79, 80,
-   81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
-   17, 17, 17, 97, 98, 99,100,100,100,100,100,100,100,100,100,101,
-   17, 17, 17, 17,102, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17,103, 17, 17,104,100,100,100,100,100,100,100,100,100,
-  100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
-  100,105,100,100,100,100,100,100, 17, 17,106,107,100,108,109,110,
-   17, 17, 17, 17, 17, 17, 17,111, 17, 17, 17, 17,112,113,100,100,
-  100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,114,
-   17,115,116,100,100,100,100,100,100,100,100,100,117,100,100,100,
-  100,100,100,100,100,100,100,100,100,100,100,100,118, 39,119,120,
-  121,122,123,124,125,126,127,128, 39, 39,129,100,100,100,100,130,
-  131,132,133,100,134,135,100,136,137,138,100,100,139,140,141,100,
-  142,143,144,145, 39, 39,146,147,148, 39,149,150,100,100,100,100,
-   17, 17, 17, 17, 17, 17,151, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17,152,153, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,154, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,155, 17, 17,156,100,
-  100,100,100,100,100,100,100,100, 17, 17,157,100,100,100,100,100,
-   17, 17, 17,158, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17,159,100,100,100,100,100,100,100,100,100,100,100,100,
-  160,161,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
-   60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,162,
-   60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,163,
+   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+   28, 26, 29, 30, 31, 32, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 33, 34, 34, 34, 34,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 37, 38, 39,
+   40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
+   26, 56, 57, 58, 58, 58, 58, 59, 26, 26, 60, 26, 26, 26, 26, 26,
+   26, 61, 26, 62, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   63, 58, 58, 58, 26, 64, 65, 66, 26, 26, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 26, 26, 26, 67, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 68, 69, 70, 58, 58, 58, 58, 71, 58,
+   58, 58, 58, 58, 58, 58, 72, 73, 74, 75, 76, 77, 78, 79, 58, 80,
+   81, 82, 83, 84, 85, 58, 86, 87, 88, 89, 78, 90, 91, 92, 58, 58,
+   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 93, 26, 26, 26, 26, 26, 26, 26, 26, 94, 26, 26, 26,
+   26, 26, 26, 26, 26, 26, 26, 95, 26, 26, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 26, 26, 96, 26, 97, 58, 58, 58, 58, 26, 98, 58, 58,
+   26, 26, 26, 26, 26, 26, 26, 26, 26, 99, 26, 26, 26, 26, 26, 26,
+   26, 26, 26, 26, 26, 26, 26, 26, 26, 26,100, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+  101, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,102,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+   35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,103,
     0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  2,  4,  5,  6,  2,
     7,  7,  7,  7,  7,  2,  8,  9, 10, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16,
@@ -1148,496 +914,529 @@
    34, 11, 34, 34, 32, 35, 32, 16, 36, 36, 37, 34, 38, 37, 34, 34,
    34, 34, 34, 34, 34, 34, 16, 32, 34, 38, 32, 11, 32, 32, 32, 32,
    32, 32, 16, 16, 16, 11, 34, 32, 34, 34, 11, 32, 32, 32, 32, 32,
-   16, 16, 39, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 40,
-   40, 41, 41, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41,
-   40, 40, 42, 41, 41, 41, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41,
-   43, 43, 43, 43, 43, 43, 43, 43, 32, 32, 42, 32, 44, 45, 16, 10,
-   44, 44, 41, 46, 11, 47, 47, 11, 34, 11, 11, 11, 11, 11, 11, 11,
-   11, 48, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34,
-   16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 49, 34, 32, 34, 11,
-   32, 50, 43, 43, 51, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16,
-   48, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 47, 52,  2,  2,  2,
-   16, 16, 16, 16, 53, 54, 55, 56, 57, 43, 43, 43, 43, 43, 43, 43,
-   43, 43, 43, 43, 43, 43, 43, 58, 59, 60, 43, 59, 44, 44, 44, 44,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 62,
-   36, 63, 64, 44, 44, 44, 44, 44, 65, 65, 65,  8,  9, 66,  2, 67,
-   43, 43, 43, 43, 43, 60, 68,  2, 69, 36, 36, 36, 36, 70, 43, 43,
-    7,  7,  7,  7,  7,  2,  2, 36, 71, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 72, 43, 43, 43, 73, 50, 43, 43, 74, 75, 76, 43, 43, 36,
-    7,  7,  7,  7,  7, 36, 77, 78,  2,  2,  2,  2,  2,  2,  2, 79,
-   70, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 80, 62, 36,
-   36, 36, 36, 43, 43, 43, 43, 43, 71, 44, 44, 44, 44, 44, 44, 44,
-    7,  7,  7,  7,  7, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43,
-   43, 43, 40, 21,  2, 81, 57, 20, 36, 36, 36, 43, 43, 75, 43, 43,
-   43, 43, 75, 43, 75, 43, 43, 44,  2,  2,  2,  2,  2,  2,  2, 64,
-   36, 36, 36, 36, 70, 43, 44, 64, 36, 36, 36, 36, 36, 61, 44, 44,
-   36, 36, 36, 36, 82, 36, 36, 61, 65, 44, 44, 57, 43, 43, 43, 43,
-   36, 36, 36, 36, 83, 43, 43, 43, 43, 84, 43, 43, 43, 43, 43, 43,
-   43, 85, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 85, 71, 86,
-   87, 43, 43, 43, 85, 86, 87, 86, 70, 43, 43, 43, 36, 36, 36, 36,
-   36, 43,  2,  7,  7,  7,  7,  7, 88, 36, 36, 36, 36, 36, 36, 36,
-   70, 86, 62, 36, 36, 36, 61, 62, 61, 62, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 61, 36, 36, 36, 61, 61, 44, 36, 36, 44, 71, 86,
-   87, 43, 80, 89, 90, 89, 87, 61, 44, 44, 44, 89, 44, 44, 36, 62,
-   36, 43, 44,  7,  7,  7,  7,  7, 36, 20, 27, 27, 27, 56, 63, 80,
-   57, 85, 62, 36, 36, 61, 44, 62, 61, 36, 62, 61, 36, 44, 80, 86,
-   87, 80, 44, 57, 80, 57, 43, 44, 57, 44, 44, 44, 62, 36, 61, 61,
-   44, 44, 44,  7,  7,  7,  7,  7, 43, 36, 70, 64, 44, 44, 44, 44,
-   57, 85, 62, 36, 36, 36, 36, 62, 36, 62, 36, 36, 36, 36, 36, 36,
-   61, 36, 62, 36, 36, 44, 71, 86, 87, 43, 43, 57, 85, 89, 87, 44,
-   61, 44, 44, 44, 44, 44, 44, 44, 66, 44, 44, 44, 62, 43, 43, 43,
-   57, 86, 62, 36, 36, 36, 61, 62, 61, 36, 62, 36, 36, 44, 71, 87,
-   87, 43, 80, 89, 90, 89, 87, 44, 44, 44, 57, 85, 44, 44, 36, 62,
-   78, 27, 27, 27, 44, 44, 44, 44, 44, 71, 62, 36, 36, 61, 44, 36,
-   61, 36, 36, 44, 62, 61, 61, 36, 44, 62, 61, 44, 36, 61, 44, 36,
-   36, 36, 36, 36, 36, 44, 44, 86, 85, 90, 44, 86, 90, 86, 87, 44,
-   61, 44, 44, 89, 44, 44, 44, 44, 27, 91, 67, 67, 56, 92, 44, 44,
-   85, 86, 71, 36, 36, 36, 61, 36, 61, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 44, 71, 43, 85, 86, 90, 43, 80, 43, 43, 44,
-   44, 44, 57, 80, 36, 61, 62, 44, 44, 44, 44, 93, 27, 27, 27, 91,
-   70, 86, 72, 36, 36, 36, 61, 36, 36, 36, 62, 36, 36, 44, 71, 87,
-   86, 86, 90, 85, 90, 86, 43, 44, 44, 44, 89, 90, 44, 44, 62, 61,
-   62, 94, 44, 44, 44, 44, 44, 44, 43, 86, 36, 36, 36, 36, 61, 36,
-   36, 36, 36, 36, 36, 70, 71, 86, 87, 43, 80, 86, 90, 86, 87, 77,
-   44, 44, 36, 94, 27, 27, 27, 95, 27, 27, 27, 27, 91, 36, 36, 36,
-   57, 86, 62, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 36, 36, 36,
-   36, 62, 36, 36, 36, 36, 62, 44, 36, 36, 36, 61, 44, 80, 44, 89,
-   86, 43, 80, 80, 86, 86, 86, 86, 44, 86, 64, 44, 44, 44, 44, 44,
-   62, 36, 36, 36, 36, 36, 36, 36, 70, 36, 43, 43, 43, 80, 44, 96,
-   36, 36, 36, 75, 43, 43, 43, 60,  7,  7,  7,  7,  7,  2, 44, 44,
-   44, 44, 44, 44, 44, 44, 44, 44, 62, 61, 61, 36, 36, 61, 36, 36,
-   36, 36, 62, 62, 36, 36, 36, 36, 70, 36, 43, 43, 43, 43, 71, 44,
-   36, 36, 61, 81, 43, 43, 43, 80,  7,  7,  7,  7,  7, 44, 36, 36,
-   77, 67,  2,  2,  2,  2,  2,  2,  2, 97, 97, 67, 43, 67, 67, 67,
-    7,  7,  7,  7,  7, 27, 27, 27, 27, 27, 50, 50, 50,  4,  4, 86,
-   36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44,
-   57, 43, 43, 43, 43, 43, 43, 85, 43, 43, 60, 43, 36, 36, 70, 43,
-   43, 43, 43, 43, 57, 43, 43, 43, 43, 43, 43, 43, 43, 43, 80, 67,
-   67, 67, 67, 76, 67, 67, 92, 67,  2,  2, 97, 67, 21, 64, 44, 44,
-   36, 36, 36, 36, 36, 94, 87, 43, 85, 43, 43, 43, 87, 85, 87, 71,
-    7,  7,  7,  7,  7,  2,  2,  2, 36, 36, 36, 86, 43, 36, 36, 43,
-   71, 86, 98, 94, 86, 86, 86, 36, 70, 43, 71, 36, 36, 36, 36, 36,
-   36, 85, 87, 85, 86, 86, 87, 94,  7,  7,  7,  7,  7, 86, 87, 67,
-   11, 11, 11, 48, 44, 44, 48, 44, 16, 16, 16, 16, 16, 53, 45, 16,
-   36, 36, 36, 36, 61, 36, 36, 44, 36, 36, 36, 61, 61, 36, 36, 44,
-   61, 36, 36, 44, 36, 36, 36, 61, 61, 36, 36, 44, 36, 36, 36, 36,
-   36, 36, 36, 61, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 57, 43,
-    2,  2,  2,  2, 99, 27, 27, 27, 27, 27, 27, 27, 27, 27,100, 44,
-   67, 67, 67, 67, 67, 44, 44, 44, 11, 11, 11, 44, 16, 16, 16, 44,
-  101, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 77, 72,
-  102, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,103,104, 44,
-   36, 36, 36, 36, 36, 63,  2,105,106, 36, 36, 36, 61, 44, 44, 44,
-   36, 43, 85, 44, 44, 44, 44, 62, 36, 43,107, 64, 44, 44, 44, 44,
-   36, 43, 44, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 61, 36,
-   61, 43, 44, 44, 44, 44, 44, 44, 36, 36, 43, 87, 43, 43, 43, 86,
-   86, 86, 86, 85, 87, 43, 43, 43, 43, 43,  2, 88,  2, 66, 70, 44,
-    7,  7,  7,  7,  7, 44, 44, 44, 27, 27, 27, 27, 27, 44, 44, 44,
-    2,  2,  2,108,  2, 59, 43, 84, 36, 83, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 61, 44, 44, 44, 36, 36, 70, 71, 36, 36, 36, 36,
-   36, 36, 36, 36, 70, 61, 44, 44, 36, 36, 36, 44, 44, 44, 44, 44,
-   36, 36, 36, 36, 36, 36, 36, 61, 43, 85, 86, 87, 85, 86, 44, 44,
-   86, 85, 86, 86, 87, 43, 44, 44, 92, 44,  2,  7,  7,  7,  7,  7,
-   36, 36, 36, 36, 36, 36, 36, 44, 36, 36, 61, 44, 44, 44, 44, 44,
-   36, 36, 36, 36, 36, 36, 44, 44, 36, 36, 36, 36, 36, 44, 44, 44,
-    7,  7,  7,  7,  7,100, 44, 67, 67, 67, 67, 67, 67, 67, 67, 67,
-   36, 36, 36, 70, 85, 87, 44,  2, 36, 36, 94, 85, 43, 43, 43, 80,
-   85, 85, 87, 43, 43, 43, 85, 86, 86, 87, 43, 43, 43, 43, 80, 57,
-    2,  2,  2, 88,  2,  2,  2, 44, 43, 43, 43, 43, 43, 43, 43,109,
-   43, 43, 43, 43, 43, 43, 43, 80, 43, 43, 98, 36, 36, 36, 36, 36,
-   36, 36, 85, 43, 43, 85, 85, 86, 86, 85, 98, 36, 36, 36, 61,  2,
-   97, 67, 67, 67, 67, 50, 43, 43, 43, 43, 67, 67, 67, 67, 21,  2,
-   43, 98, 36, 36, 36, 36, 36, 36, 94, 43, 43, 86, 43, 87, 43, 36,
-   36, 36, 36, 85, 43, 86, 87, 87, 43, 86, 44, 44, 44, 44,  2,  2,
-   36, 36, 86, 86, 86, 86, 43, 43, 43, 43, 86, 43, 44, 93,  2,  2,
-    7,  7,  7,  7,  7, 44, 62, 36, 36, 36, 36, 36, 40, 40, 40,  2,
-   16, 16, 16, 16, 34,110, 44, 44, 11, 11, 11, 11, 11, 47, 48, 11,
-    2,  2,  2,  2, 44, 44, 44, 44, 43, 60, 43, 43, 43, 43, 43, 43,
-   85, 43, 43, 43, 71, 36, 70, 36, 36, 36, 71, 94, 43, 61, 44, 44,
-   16, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 45, 16, 16,
-   16, 16, 16, 16, 45, 16, 16, 16, 16, 16, 16, 16, 16,111, 40, 40,
-   32, 32, 32, 16, 16, 16, 16, 32, 16, 16, 16, 16, 11, 11, 11, 11,
-   16, 16, 16, 44, 11, 11, 11, 44, 16, 16, 16, 16, 48, 48, 48, 48,
-   16, 16, 16, 16, 16, 16, 16, 44, 16, 16, 16, 16,112,112,112,112,
-   16, 16,110, 16, 11, 11,113,114, 41, 16,110, 16, 11, 11,113, 41,
-   16, 16, 44, 16, 11, 11,115, 41, 16, 16, 16, 16, 11, 11,116, 41,
-   44, 16,110, 16, 11, 11,113,117,118,118,118,118,118,119, 65, 65,
-  120,120,120,  2,121,122,121,122,  2,  2,  2,  2,123, 65, 65,124,
-    2,  2,  2,  2,125,126,  2,127,128,  2,129,130,  2,  2,  2,  2,
-    2,  9,128,  2,  2,  2,  2,131, 65, 65,132, 65, 65, 65, 65, 65,
-  133, 44, 27, 27, 27,  8,129,134, 27, 27, 27, 27, 27,  8,129,104,
-   40, 40, 40, 40, 40, 40, 81, 44, 20, 20, 20, 20, 20, 20, 20, 20,
-  135, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 43,136, 51,
-  109, 51,109, 43, 43, 43, 43, 43, 80, 44, 44, 44, 44, 44, 44, 44,
-   67,137, 67,138, 67, 34, 11, 16, 11, 32,138, 67, 49, 11, 11, 67,
-   67, 67,137,137,137, 11, 11,139, 11, 11, 35, 36, 39, 67, 16, 11,
-    8,  8, 49, 16, 16, 26, 67,140, 27, 27, 27, 27, 27, 27, 27, 27,
-  105,105,105,105,105,105,105,105,105,141,142,105,143, 67, 44, 44,
-    8,  8,144, 67, 67,  8, 67, 67,144, 26, 67,144, 67, 67, 67,144,
-   67, 67, 67, 67, 67, 67, 67,  8, 67,144,144, 67, 67, 67, 67, 67,
-   67, 67,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-   67, 67, 67, 67,  4,  4, 67, 67,  8, 67, 67, 67,145,146, 67, 67,
-   67, 67, 67, 67, 67, 67,144, 67, 67, 67, 67, 67, 67, 26,  8,  8,
-    8,  8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,  8,  8,
-    8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 92, 44, 44,
-   27, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27,
-   67, 67, 67, 26, 67, 67, 67, 67, 26, 67, 67, 67, 67, 67, 67, 67,
-   67, 67, 67, 67,  8,  8,  8,  8, 67, 67, 67, 67, 67, 67, 67, 26,
-   67, 67, 67, 67,  4,  4,  4,  4,  4,  4,  4, 27, 27, 27, 27, 27,
-   27, 27, 67, 67, 67, 67, 67, 67,  8,  8,129,147,  8,  8,  8,  8,
-    8,  8,  8,  4,  4,  4,  4,  4,  8,129,148,148,148,148,148,148,
-  148,148,148,148,147,  8,  8,  8,  8,  8,  8,  8,  4,  4,  8,  8,
-    8,  8,  8,  8,  8,  8,  4,  8,  8,  8,144, 26,  8,  8,144, 67,
-   67, 67, 44, 67, 67, 67, 67, 67, 67, 67, 67, 55, 67, 67, 67, 67,
-   32, 11, 32, 34, 34, 34, 34, 11, 32, 32, 34, 16, 16, 16, 40, 11,
-   32, 32,140, 67, 67,138, 34,149, 43, 32, 44, 44, 93,  2, 99,  2,
-   16, 16, 16,150, 44, 44,150, 44, 36, 36, 36, 36, 44, 44, 44, 52,
-   64, 44, 44, 44, 44, 44, 44, 57, 36, 36, 36, 61, 44, 44, 44, 44,
-   36, 36, 36, 61, 36, 36, 36, 61,  2,121,121,  2,125,126,121,  2,
-    2,  2,  2,  6,  2,108,121,  2,121,  4,  4,  4,  4,  2,  2, 88,
-    2,  2,  2,  2,  2,120,  2,  2,108,151,  2,  2,  2,  2,  2,  2,
-   67,  2,152,148,148,148,153, 44, 67, 67, 67, 67, 67, 55, 67, 67,
-   67, 67, 44, 44, 44, 44, 44, 44, 67, 67, 67, 44, 44, 44, 44, 44,
-    1,  2,154,155,  4,  4,  4,  4,  4, 67,  4,  4,  4,  4,156,157,
-  158,105,105,105,105, 43, 43, 86,159, 40, 40, 67,105,160, 63, 67,
-   36, 36, 36, 61, 57,161,162, 69, 36, 36, 36, 36, 36, 63, 40, 69,
-   44, 44, 62, 36, 36, 36, 36, 36, 67, 27, 27, 67, 67, 67, 67, 67,
-   67, 67, 67, 44, 44, 44, 44, 55, 67, 67, 67, 67, 67, 67, 67, 92,
-   27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27,
-  163, 27, 27, 27, 27, 27, 27, 27, 36, 36, 83, 36, 36, 36, 36, 36,
-   67, 67, 67, 92, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36,164,  2,
-    7,  7,  7,  7,  7, 36, 44, 44, 32, 32, 32, 32, 32, 32, 32, 70,
-   51,165, 43, 43, 43, 43, 43, 88, 32, 32, 32, 32, 32, 32, 40, 43,
-   36, 36, 36,105,105,105,105,105, 43,  2,  2,  2, 44, 44, 44, 44,
-   41, 41, 41,162, 40, 40, 40, 40, 41, 32, 32, 32, 32, 32, 32, 32,
-   16, 32, 32, 32, 32, 32, 32, 32, 45, 16, 16, 16, 34, 34, 34, 32,
-   32, 32, 32, 32, 42,166, 34, 35, 32, 32, 16, 32, 32, 32, 32, 32,
+   16, 16, 36, 16, 16, 16, 16, 16, 39, 39, 39, 39, 39, 39, 39, 39,
+   39, 40, 40, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40,
+   39, 39, 41, 40, 40, 40, 41, 41, 40, 40, 40, 40, 40, 40, 40, 40,
+   42, 42, 42, 42, 42, 42, 42, 42, 32, 32, 41, 32, 43, 44, 16, 10,
+   43, 43, 40, 45, 11, 46, 46, 11, 34, 11, 11, 11, 11, 11, 11, 11,
+   11, 47, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34,
+   16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 48, 34, 32, 34, 11,
+   32, 49, 42, 42, 50, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16,
+   47, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 46, 51,  2,  2,  2,
+   16, 16, 16, 16, 52, 53, 54, 55, 56, 42, 42, 42, 42, 42, 42, 42,
+   42, 42, 42, 42, 42, 42, 42, 57, 58, 59, 42, 58, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 60, 43, 61,
+   36, 62, 63, 43, 43, 43, 43, 43, 64, 64, 64,  8,  9, 65,  2, 66,
+   42, 42, 42, 42, 42, 59, 67,  2, 68, 36, 36, 36, 36, 69, 42, 42,
+    7,  7,  7,  7,  7,  2,  2, 36, 70, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 71, 42, 42, 42, 72, 49, 42, 42, 73, 74, 75, 42, 42, 36,
+    7,  7,  7,  7,  7, 36, 76, 77,  2,  2,  2,  2,  2,  2,  2, 78,
+   69, 36, 36, 36, 36, 36, 36, 36, 42, 42, 42, 42, 42, 79, 61, 36,
+   36, 36, 36, 42, 42, 42, 42, 42, 70, 43, 43, 43, 43, 43, 43, 43,
+    7,  7,  7,  7,  7, 36, 36, 36, 36, 36, 36, 36, 36, 69, 42, 42,
+   42, 42, 39, 21,  2, 80, 56, 20, 36, 36, 36, 42, 42, 74, 42, 42,
+   42, 42, 74, 42, 74, 42, 42, 43,  2,  2,  2,  2,  2,  2,  2, 63,
+   36, 36, 36, 36, 69, 42, 43, 63, 36, 36, 36, 36, 36, 60, 43, 43,
+   36, 36, 36, 36, 81, 36, 36, 36, 64, 43, 43, 56, 42, 42, 42, 42,
+   36, 36, 36, 36, 82, 42, 42, 42, 42, 83, 42, 42, 42, 42, 42, 42,
+   42, 84, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 84, 70, 85,
+   86, 42, 42, 42, 84, 85, 86, 85, 69, 42, 42, 42, 36, 36, 36, 36,
+   36, 42,  2,  7,  7,  7,  7,  7, 87, 36, 36, 36, 36, 36, 36, 36,
+   69, 85, 61, 36, 36, 36, 60, 61, 60, 61, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 60, 36, 36, 36, 60, 60, 43, 36, 36, 43, 70, 85,
+   86, 42, 79, 88, 89, 88, 86, 60, 43, 43, 43, 88, 43, 43, 36, 61,
+   36, 42, 43,  7,  7,  7,  7,  7, 36, 20, 27, 27, 27, 55, 62, 79,
+   56, 84, 61, 36, 36, 60, 43, 61, 60, 36, 61, 60, 36, 43, 79, 85,
+   86, 79, 43, 56, 79, 56, 42, 43, 56, 43, 43, 43, 61, 36, 60, 60,
+   43, 43, 43,  7,  7,  7,  7,  7, 42, 36, 69, 63, 43, 43, 43, 43,
+   56, 84, 61, 36, 36, 36, 36, 61, 36, 61, 36, 36, 36, 36, 36, 36,
+   60, 36, 61, 36, 36, 43, 70, 85, 86, 42, 42, 56, 84, 88, 86, 43,
+   60, 43, 43, 43, 43, 43, 43, 43, 65, 43, 43, 43, 61, 42, 42, 42,
+   56, 85, 61, 36, 36, 36, 60, 61, 60, 36, 61, 36, 36, 43, 70, 86,
+   86, 42, 79, 88, 89, 88, 86, 43, 43, 43, 56, 84, 43, 43, 36, 61,
+   77, 27, 27, 27, 43, 43, 43, 43, 43, 70, 61, 36, 36, 60, 43, 36,
+   60, 36, 36, 43, 61, 60, 60, 36, 43, 61, 60, 43, 36, 60, 43, 36,
+   36, 36, 36, 36, 36, 43, 43, 85, 84, 89, 43, 85, 89, 85, 86, 43,
+   60, 43, 43, 88, 43, 43, 43, 43, 27, 90, 66, 66, 55, 91, 43, 43,
+   84, 85, 70, 36, 36, 36, 60, 36, 60, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 43, 70, 42, 84, 85, 89, 42, 79, 42, 42, 43,
+   43, 43, 56, 79, 36, 60, 36, 43, 43, 43, 43, 92, 27, 27, 27, 90,
+   69, 85, 71, 36, 36, 36, 60, 36, 36, 36, 61, 36, 36, 43, 70, 86,
+   85, 85, 89, 84, 89, 85, 42, 43, 43, 43, 88, 89, 43, 43, 36, 60,
+   61, 93, 43, 43, 43, 43, 43, 43, 42, 85, 36, 36, 36, 36, 60, 36,
+   36, 36, 36, 36, 36, 69, 70, 85, 86, 42, 79, 85, 89, 85, 86, 76,
+   43, 43, 36, 93, 27, 27, 27, 94, 27, 27, 27, 27, 90, 36, 36, 36,
+   56, 85, 61, 36, 36, 36, 36, 36, 36, 36, 36, 60, 43, 36, 36, 36,
+   36, 61, 36, 36, 36, 36, 61, 43, 36, 36, 36, 60, 43, 79, 43, 88,
+   85, 42, 79, 79, 85, 85, 85, 85, 43, 85, 63, 43, 43, 43, 43, 43,
+   61, 36, 36, 36, 36, 36, 36, 36, 69, 36, 42, 42, 42, 79, 43, 95,
+   36, 36, 36, 74, 42, 42, 42, 59,  7,  7,  7,  7,  7,  2, 43, 43,
+   43, 43, 43, 43, 43, 43, 43, 43, 61, 60, 60, 36, 36, 60, 36, 36,
+   36, 36, 61, 61, 36, 36, 36, 36, 69, 36, 42, 42, 42, 42, 70, 43,
+   36, 36, 60, 80, 42, 42, 42, 79,  7,  7,  7,  7,  7, 43, 36, 36,
+   76, 66,  2,  2,  2,  2,  2,  2,  2, 96, 96, 66, 42, 66, 66, 66,
+    7,  7,  7,  7,  7, 27, 27, 27, 27, 27, 49, 49, 49,  4,  4, 85,
+   36, 36, 36, 36, 61, 36, 36, 36, 36, 36, 36, 36, 36, 36, 60, 43,
+   56, 42, 42, 42, 42, 42, 42, 84, 42, 42, 59, 42, 36, 36, 69, 42,
+   42, 42, 42, 42, 56, 42, 42, 42, 42, 42, 42, 42, 42, 42, 79, 66,
+   66, 66, 66, 75, 66, 66, 91, 66,  2,  2, 96, 66, 21, 63, 43, 43,
+   36, 36, 36, 36, 36, 93, 86, 42, 84, 42, 42, 42, 86, 84, 86, 70,
+    7,  7,  7,  7,  7,  2,  2,  2, 36, 36, 36, 85, 42, 36, 36, 42,
+   70, 85, 97, 93, 85, 85, 85, 36, 69, 42, 70, 36, 36, 36, 36, 36,
+   36, 84, 86, 84, 85, 85, 86, 93,  7,  7,  7,  7,  7, 85, 86, 66,
+   11, 11, 11, 47, 43, 43, 47, 43, 16, 16, 16, 16, 16, 52, 44, 16,
+   36, 36, 36, 36, 60, 36, 36, 43, 36, 36, 36, 60, 60, 36, 36, 43,
+   60, 36, 36, 43, 36, 36, 36, 60, 60, 36, 36, 43, 36, 36, 36, 36,
+   36, 36, 36, 60, 36, 36, 36, 36, 36, 36, 36, 36, 36, 60, 56, 42,
+    2,  2,  2,  2, 98, 27, 27, 27, 27, 27, 27, 27, 27, 27, 99, 43,
+   66, 66, 66, 66, 66, 43, 43, 43, 11, 11, 11, 43, 16, 16, 16, 43,
+  100, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 76, 71,
+  101, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,102,103, 43,
+   36, 36, 36, 36, 36, 62,  2,104,105, 36, 36, 36, 60, 43, 43, 43,
+   36, 42, 84, 43, 43, 43, 43, 61, 36, 42,106, 63, 43, 43, 43, 43,
+   36, 42, 43, 43, 43, 43, 43, 43, 36, 36, 36, 36, 36, 36, 60, 36,
+   60, 42, 43, 43, 43, 43, 43, 43, 36, 36, 42, 86, 42, 42, 42, 85,
+   85, 85, 85, 84, 86, 42, 42, 42, 42, 42,  2, 87,  2, 65, 69, 43,
+    7,  7,  7,  7,  7, 43, 43, 43, 27, 27, 27, 27, 27, 43, 43, 43,
+    2,  2,  2,107,  2, 58, 42, 83, 36, 82, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 60, 43, 43, 43, 36, 36, 69, 70, 36, 36, 36, 36,
+   36, 36, 36, 36, 69, 60, 43, 43, 36, 36, 36, 43, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 36, 36, 60, 42, 84, 85, 86, 84, 85, 43, 43,
+   85, 84, 85, 85, 86, 42, 43, 43, 91, 43,  2,  7,  7,  7,  7,  7,
+   36, 36, 36, 36, 36, 36, 36, 43, 36, 36, 60, 43, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 36, 43, 43, 36, 36, 36, 36, 36, 43, 43, 43,
+    7,  7,  7,  7,  7, 99, 43, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+   36, 36, 36, 69, 84, 86, 43,  2, 36, 36, 93, 84, 42, 42, 42, 79,
+   84, 84, 86, 42, 42, 42, 84, 85, 85, 86, 42, 42, 42, 42, 79, 56,
+    2,  2,  2, 87,  2,  2,  2, 43, 42, 42, 42, 42, 42, 42, 42,108,
+   42, 42, 42, 42, 42, 42, 42, 43, 42, 42, 42, 42, 42, 42, 43, 43,
+   42, 42, 97, 36, 36, 36, 36, 36, 36, 36, 84, 42, 42, 84, 84, 85,
+   85, 84, 97, 36, 36, 36, 60,  2, 96, 66, 66, 66, 66, 49, 42, 42,
+   42, 42, 66, 66, 66, 66, 21,  2, 42, 97, 36, 36, 36, 36, 36, 36,
+   93, 42, 42, 85, 42, 86, 42, 36, 36, 36, 36, 84, 42, 85, 86, 86,
+   42, 85, 43, 43, 43, 43,  2,  2, 36, 36, 85, 85, 85, 85, 42, 42,
+   42, 42, 85, 42, 43, 92,  2,  2,  7,  7,  7,  7,  7, 43, 61, 36,
+   36, 36, 36, 36, 39, 39, 39,  2, 16, 16, 16, 16, 34,109, 43, 43,
+   11, 11, 11, 11, 11, 46, 47, 11,  2,  2,  2,  2, 43, 43, 43, 43,
+   42, 59, 42, 42, 42, 42, 42, 42, 84, 42, 42, 42, 70, 36, 69, 36,
+   36, 36, 70, 93, 42, 60, 43, 43, 16, 16, 16, 16, 16, 16, 39, 39,
+   39, 39, 39, 39, 39, 44, 16, 16, 16, 16, 16, 16, 44, 16, 16, 16,
+   16, 16, 16, 16, 16,110, 39, 39, 32, 32, 32, 16, 16, 16, 16, 32,
+   16, 16, 16, 16, 11, 11, 11, 11, 16, 16, 16, 43, 11, 11, 11, 43,
+   16, 16, 16, 16, 47, 47, 47, 47, 16, 16, 16, 16, 16, 16, 16, 43,
+   16, 16, 16, 16,111,111,111,111, 16, 16,109, 16, 11, 11,112,113,
+   40, 16,109, 16, 11, 11,112, 40, 16, 16, 43, 16, 11, 11,114, 40,
+   16, 16, 16, 16, 11, 11,115, 40, 43, 16,109, 16, 11, 11,112,116,
+  117,117,117,117,117,118, 64, 64,119,119,119,  2,120,121,120,121,
+    2,  2,  2,  2,122, 64, 64,123,  2,  2,  2,  2,124,125,  2,126,
+  127,  2,128,129,  2,  2,  2,  2,  2,  9,127,  2,  2,  2,  2,130,
+   64, 64,131, 64, 64, 64, 64, 64,132, 43, 27, 27, 27,  8,128,133,
+   27, 27, 27, 27, 27,  8,128,103, 39, 39, 39, 39, 39, 39, 80, 43,
+   20, 20, 20, 20, 20, 20, 20, 20, 20, 43, 43, 43, 43, 43, 43, 43,
+   42, 42, 42, 42, 42, 42,134, 50,108, 50,108, 42, 42, 42, 42, 42,
+   79, 43, 43, 43, 43, 43, 43, 43, 66,135, 66,136, 66, 34, 11, 16,
+   11, 32,136, 66, 48, 11, 11, 66, 66, 66,135,135,135, 11, 11,137,
+   11, 11, 35, 36,138, 66, 16, 11,  8,  8, 48, 16, 16, 26, 66,139,
+   27, 27, 27, 27, 27, 27, 27, 27,104,104,104,104,104,104,104,104,
+  104,140,141,104,142, 66, 43, 43,  8,  8,143, 66, 66,  8, 66, 66,
+  143, 26, 66,143, 66, 66, 66,143, 66, 66, 66, 66, 66, 66, 66,  8,
+   66,143,143, 66, 66, 66, 66, 66, 66, 66,  8,  8,  8,  8,  8,  8,
+    8,  8,  8,  8,  8,  8,  8,  8, 66, 66, 66, 66,  4,  4, 66, 66,
+    8, 66, 66, 66,144,145, 66, 66, 66, 66, 66, 66, 66, 66,143, 66,
+   66, 66, 66, 66, 66, 26,  8,  8,  8,  8, 66, 66, 66, 66, 66, 66,
+   66, 66, 66, 66, 66, 66,  8,  8,  8, 66, 66, 66, 66, 66, 66, 66,
+   66, 66, 66, 66, 66, 91, 43, 43, 27, 27, 27, 27, 27, 27, 66, 66,
+   66, 66, 66, 66, 66, 27, 27, 27, 66, 66, 66, 26, 66, 66, 66, 66,
+   26, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,  8,  8,  8,  8,
+   66, 66, 66, 66, 66, 66, 66, 26, 66, 66, 66, 66,  4,  4,  4,  4,
+    4,  4,  4, 27, 27, 27, 27, 27, 27, 27, 66, 66, 66, 66, 66, 66,
+    8,  8,128,146,  8,  8,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,
+    8,128,147,147,147,147,147,147,147,147,147,147,146,  8,  8,  8,
+    8,  8,  8,  8,  4,  4,  8,  8,  8,  8,  8,  8,  8,  8,  4,  8,
+    8,  8,143, 26,  8,  8,143, 66, 66, 66, 43, 66, 66, 66, 66, 66,
+   32, 11, 32, 34, 34, 34, 34, 11, 32, 32, 34, 16, 16, 16, 39, 11,
+   32, 32,139, 66, 66,136, 34,148, 42, 32, 43, 43, 92,  2, 98,  2,
+   16, 16, 16,149, 43, 43,149, 43, 36, 36, 36, 36, 43, 43, 43, 51,
+   63, 43, 43, 43, 43, 43, 43, 56, 36, 36, 36, 60, 43, 43, 43, 43,
+   36, 36, 36, 60, 36, 36, 36, 60,  2,120,120,  2,124,125,120,  2,
+    2,  2,  2,  6,  2,107,120,  2,120,  4,  4,  4,  4,  2,  2, 87,
+    2,  2,  2,  2,  2,119,  2,  2,107,150,  2,  2,  2,  2,  2,  2,
+   66,  2,151,147,147,147,152, 43, 66, 66, 66, 66, 66, 54, 66, 66,
+   66, 66, 43, 43, 43, 43, 43, 43, 66, 66, 66, 43, 43, 43, 43, 43,
+    1,  2,153,154,  4,  4,  4,  4,  4, 66,  4,  4,  4,  4,155,156,
+  157,104,104,104,104, 42, 42, 85,158, 39, 39, 66,104,159, 62, 66,
+   36, 36, 36, 60, 56,160,161, 68, 36, 36, 36, 36, 36, 62, 39, 68,
+   43, 43, 61, 36, 36, 36, 36, 36, 66, 27, 27, 66, 66, 66, 66, 66,
+   66, 66, 66, 43, 43, 43, 43, 54, 66, 66, 66, 66, 66, 66, 66, 91,
+   27, 27, 27, 27, 27, 66, 66, 66, 66, 66, 66, 66, 27, 27, 27, 27,
+  162, 27, 27, 27, 27, 27, 27, 27, 36, 36, 82, 36, 36, 36, 36, 36,
+   66, 66, 66, 91, 43, 43, 43, 43, 36, 36, 36, 36, 36, 36,163,  2,
+    7,  7,  7,  7,  7, 36, 43, 43, 32, 32, 32, 32, 32, 32, 32, 69,
+   50,164, 42, 42, 42, 42, 42, 87, 32, 32, 32, 32, 32, 32, 39, 42,
+   36, 36, 36,104,104,104,104,104, 42,  2,  2,  2, 43, 43, 43, 43,
+   40, 40, 40,161, 39, 39, 39, 39, 40, 32, 32, 32, 32, 32, 32, 32,
+   16, 32, 32, 32, 32, 32, 32, 32, 44, 16, 16, 16, 34, 34, 34, 32,
+   32, 32, 32, 32, 41,165, 34, 35, 32, 32, 16, 32, 32, 32, 32, 32,
    32, 32, 32, 32, 32, 11, 11, 32, 11, 11, 32, 32, 32, 32, 32, 32,
-   32, 32, 11, 11, 34, 34, 32, 44, 32,150,150, 32, 32, 32, 47, 44,
-   44, 40,167, 35, 40, 35, 36, 36, 36, 71, 36, 71, 36, 70, 36, 36,
-   36, 94, 87, 85, 67, 67, 80, 44, 27, 27, 27, 67,168, 44, 44, 44,
-   36, 36,  2,  2, 44, 44, 44, 44, 86, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 86, 86, 86, 86, 86, 86, 86, 86, 43, 44, 44, 44, 44,  2,
-   43, 36, 36, 36,  2, 72, 72, 70, 36, 36, 36, 43, 43, 43, 43,  2,
-   36, 36, 36, 70, 43, 43, 43, 43, 43, 86, 44, 44, 44, 44, 44, 93,
-   36, 70, 86, 43, 43, 86, 43, 86,107,  2,  2,  2,  2,  2,  2, 52,
-    7,  7,  7,  7,  7, 44, 44,  2, 36, 36, 70, 69, 36, 36, 36, 36,
-    7,  7,  7,  7,  7, 36, 36, 61, 36, 36, 36, 36, 70, 43, 43, 85,
-   87, 85, 87, 80, 44, 44, 44, 44, 36, 70, 36, 36, 36, 36, 85, 44,
-    7,  7,  7,  7,  7, 44,  2,  2, 69, 36, 36, 77, 67, 94, 85, 36,
-   71, 43, 71, 70, 71, 36, 36, 43, 70, 61, 44, 44, 44, 44, 44, 44,
-   44, 44, 44, 44, 44, 62, 83,  2, 36, 36, 36, 36, 36, 94, 43, 86,
-    2, 83,169, 80, 44, 44, 44, 44, 62, 36, 36, 61, 62, 36, 36, 61,
-   62, 36, 36, 61, 44, 44, 44, 44, 16, 16, 16, 16, 16,114, 40, 40,
-   16, 16, 16, 16,111, 41, 44, 44, 36, 94, 87, 86, 85,107, 87, 44,
-   36, 36, 44, 44, 44, 44, 44, 44, 36, 36, 36, 61, 44, 62, 36, 36,
-  170,170,170,170,170,170,170,170,171,171,171,171,171,171,171,171,
-   16, 16, 16,110, 44, 44, 44, 44, 44,150, 16, 16, 44, 44, 62, 71,
-   36, 36, 36, 36,172, 36, 36, 36, 36, 36, 36, 61, 36, 36, 61, 61,
-   36, 62, 61, 36, 36, 36, 36, 36, 36, 41, 41, 41, 41, 41, 41, 41,
-   41,117, 44, 44, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36,148, 44, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 44, 44, 44, 55, 36, 36, 36, 36, 36, 36,168, 67,
-    2,  2,  2,152,130, 44, 44, 44,  6,173,174,148,148,148,148,148,
-  148,148,130,152,130,  2,127,175,  2, 64,  2,  2,156,148,148,130,
-    2,176,  8,177, 66,  2, 44, 44, 36, 36, 61, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 61, 79, 93,  2,  3,  2,  4,  5,  6,  2,
-   16, 16, 16, 16, 16, 17, 18,129,130,  4,  2, 36, 36, 36, 36, 36,
-   69, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 40,
-   44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 61, 44,
-   20,178, 56,135, 26,  8,144, 92, 44, 44, 44, 44, 79, 65, 67, 44,
-   36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 61, 36, 62,
-    2, 64, 44,179, 27, 27, 27, 27, 27, 27, 44, 55, 67, 67, 67, 67,
-  105,105,143, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 27, 67, 92,
-   67, 67, 67, 67, 67, 67, 92, 44, 92, 44, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 67, 67, 67, 50, 44,180, 27, 27, 27, 27, 27, 27, 27,
-   27, 27, 27, 27, 27, 27, 44, 44, 27, 27, 44, 44, 44, 44, 62, 36,
-  155, 36, 36, 36, 36,181, 44, 44, 36, 36, 36, 43, 43, 80, 44, 44,
-   36, 36, 36, 36, 36, 36, 36, 93, 36, 36, 44, 44, 36, 36, 36, 36,
-  182,105,105, 44, 44, 44, 44, 44, 11, 11, 11, 11, 16, 16, 16, 16,
-   11, 11, 44, 44, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 44, 44,
-   36, 36, 36, 36, 44, 44, 44, 44, 36, 36, 44, 44, 44, 44, 44, 93,
-   11, 11, 11, 11, 11, 47, 11, 11, 11, 47, 11,150, 16, 16, 16, 16,
-   16,150, 16, 16, 16, 16, 16, 16, 16,150, 16, 16, 16,150,110, 44,
-   40, 40, 40, 52, 40, 40, 40, 40, 81, 40, 40, 40, 40, 81, 44, 44,
-   36, 36, 36, 44, 61, 36, 36, 36, 36, 36, 36, 62, 61, 44, 61, 62,
-   36, 36, 36, 93, 27, 27, 27, 27, 36, 36, 36, 77,163, 27, 27, 27,
-   44, 44, 44,179, 27, 27, 27, 27, 36, 61, 36, 44, 44,179, 27, 27,
-   36, 36, 36, 27, 27, 27, 44, 93, 36, 36, 36, 36, 36, 44, 44, 93,
-   36, 36, 36, 36, 44, 44, 27, 36, 44, 27, 27, 27, 27, 27, 27, 27,
-   70, 43, 57, 80, 44, 44, 43, 43, 36, 36, 62, 36, 62, 36, 36, 36,
-   36, 36, 36, 44, 43, 80, 44, 57, 27, 27, 27, 27,100, 44, 44, 44,
-    2,  2,  2,  2, 64, 44, 44, 44, 36, 36, 36, 36, 36, 36,183, 30,
-   36, 36, 36, 36, 36, 36,183, 27, 36, 36, 36, 36, 78, 36, 36, 36,
-   36, 36, 70, 80, 44,179, 27, 27,  2,  2,  2, 64, 44, 44, 44, 44,
-   36, 36, 36, 44, 93,  2,  2,  2, 36, 36, 36, 44, 27, 27, 27, 27,
-   36, 61, 44, 44, 27, 27, 27, 27, 36, 44, 44, 44, 93,  2, 64, 44,
-   44, 44, 44, 44,179, 27, 27, 27, 11, 47, 44, 44, 44, 44, 44, 44,
-   16,110, 44, 44, 44, 27, 27, 27, 36, 36, 43, 43, 44, 44, 44, 44,
-    7,  7,  7,  7,  7, 36, 36, 69, 11, 11, 11, 44, 57, 43, 43,159,
-   16, 16, 16, 44, 44, 44, 44,  8, 27, 27, 27, 27, 27, 27, 27,100,
-   36, 36, 36, 36, 36, 57,184, 44, 36, 44, 44, 44, 44, 44, 44, 44,
-   44, 36, 61, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 43, 43,
-   27, 27, 27, 95, 44, 44, 44, 44,180, 27, 30,  2,  2, 44, 44, 44,
-   36, 43, 43,  2,  2, 44, 44, 44, 36, 36,183, 27, 27, 27, 44, 44,
-   87, 98, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43,
-   43, 43, 43, 60,  2,  2,  2, 44, 27, 27, 27,  7,  7,  7,  7,  7,
-   71, 70, 71, 44, 44, 44, 44, 57, 86, 87, 43, 85, 87, 60,185,  2,
-    2, 80, 44, 44, 44, 44, 79, 44, 43, 71, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 70, 43, 43, 87, 43, 43, 43, 80,  7,  7,  7,  7,  7,
-    2,  2, 94, 98, 44, 44, 44, 44, 36, 70,  2, 61, 44, 44, 44, 44,
-   36, 94, 86, 43, 43, 43, 43, 85, 98, 36, 63,  2, 59, 43, 60, 87,
-    7,  7,  7,  7,  7, 63, 63,  2,179, 27, 27, 27, 27, 27, 27, 27,
-   27, 27,100, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 86, 87,
-   43, 86, 85, 43,  2,  2,  2, 71, 70, 44, 44, 44, 44, 44, 44, 44,
-   36, 36, 36, 61, 61, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 62,
-   36, 36, 36, 36, 63, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 70,
-   86, 87, 43, 43, 43, 80, 44, 44, 43, 86, 62, 36, 36, 36, 61, 62,
-   61, 36, 62, 36, 36, 57, 71, 86, 85, 86, 90, 89, 90, 89, 86, 44,
-   61, 44, 44, 89, 44, 44, 62, 36, 36, 86, 44, 43, 43, 43, 80, 44,
-   43, 43, 80, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 62, 44, 61,
-   36, 36, 36, 62, 86, 87, 43, 43, 80, 90, 89, 89, 86, 90, 86, 85,
-   71, 71,  2, 93, 64, 44, 44, 44, 57, 80, 44, 44, 44, 44, 44, 44,
-   36, 36, 94, 86, 43, 43, 43, 43, 86, 43, 85, 71, 36, 63,  2,  2,
-    7,  7,  7,  7,  7,  2, 93, 71, 86, 87, 43, 43, 85, 85, 86, 87,
-   85, 43, 36, 72, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 94,
-   86, 43, 43, 44, 86, 86, 43, 87, 60,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2, 36, 36, 43, 44, 86, 87, 43, 43, 43, 85, 87, 87,
-   60,  2, 61, 44, 44, 44, 44, 44,  2,  2,  2,  2,  2,  2, 64, 44,
-   36, 36, 36, 36, 36, 70, 87, 86, 43, 43, 43, 87, 63, 44, 44, 44,
-    7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 44, 44, 44, 44, 44, 44,
-   36, 36, 36, 36, 36, 61, 57, 87, 86, 43, 43, 87, 43, 43, 44, 44,
-    7,  7,  7,  7,  7, 27,  2, 97, 43, 43, 43, 43, 87, 60, 44, 44,
-   27,100, 44, 44, 44, 44, 44, 62, 36, 36, 36, 61, 62, 44, 36, 36,
-   36, 36, 62, 61, 36, 36, 36, 36, 86, 86, 86, 89, 90, 57, 85, 71,
-   98, 87,  2, 64, 44, 44, 44, 44, 36, 36, 36, 36, 44, 36, 36, 36,
-   94, 86, 43, 43, 44, 43, 86, 86, 71, 72, 90, 44, 44, 44, 44, 44,
-   70, 43, 43, 43, 43, 71, 36, 36, 36, 70, 43, 43, 85, 70, 43, 60,
-    2,  2,  2, 59, 44, 44, 44, 44, 70, 43, 43, 85, 87, 43, 36, 36,
-   36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 85, 43,  2, 72,  2,
-    2, 64, 44, 44, 44, 44, 44, 44,  2,  2,  2,  2,  2, 44, 44, 44,
-   63, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43, 80, 43, 43, 43, 87,
-   63,  2,  2, 44, 44, 44, 44, 44,  2, 36, 36, 36, 36, 36, 36, 36,
-   44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 89, 43, 43, 43,
-   85, 43, 87, 80, 44, 44, 44, 44, 36, 36, 36, 61, 36, 62, 36, 36,
-   70, 43, 43, 80, 44, 80, 43, 57, 43, 43, 43, 70, 44, 44, 44, 44,
-   36, 36, 36, 62, 61, 36, 36, 36, 36, 36, 36, 36, 36, 86, 86, 90,
-   43, 89, 87, 87, 61, 44, 44, 44, 36, 70, 85,107, 64, 44, 44, 44,
-   43, 94, 36, 36, 36, 36, 36, 36, 36, 36, 86, 43, 43, 80, 44, 86,
-   85, 60,  2,  2,  2,  2,  2,  2,  7,  7,  7,  7,  7, 80, 44, 44,
-   27, 27, 91, 67, 67, 67, 56, 20,168, 67, 67, 67, 67, 67, 67, 67,
-   67, 44, 44, 44, 44, 44, 44, 93,105,105,105,105,105,105,105,181,
-    2,  2, 64, 44, 44, 44, 44, 44, 63, 64, 44, 44, 44, 44, 44, 44,
-   65, 65, 65, 65, 65, 65, 65, 65, 71, 36, 36, 70, 43, 43, 43, 43,
-   43, 43, 43, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 43,
-   43, 43, 43, 43, 43, 86, 87, 43, 43, 43, 60, 44, 44, 44, 44, 44,
-   43, 43, 43, 60,  2,  2, 67, 67, 40, 40, 97, 44, 44, 44, 44, 44,
-    7,  7,  7,  7,  7,179, 27, 27, 27, 62, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 44, 44, 62, 36, 40, 69, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 83,164,  2, 27, 27, 27, 30,  2, 64, 44, 44,
-   36, 36, 36, 36, 36, 61, 44, 57, 94, 86, 86, 86, 86, 86, 86, 86,
-   86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 44, 44, 44, 57,
-   43, 74, 40, 40, 40, 40, 40, 40, 40, 88, 80, 44, 44, 44, 44, 44,
-   86, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 62,
-   40, 40, 52, 40, 40, 40, 52, 81, 36, 61, 44, 44, 44, 44, 44, 44,
-   44, 61, 44, 44, 44, 44, 44, 44, 36, 61, 62, 44, 44, 44, 44, 44,
-   44, 44, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 44, 50, 60,
-   65, 65, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 43, 43, 44,
-   43, 43, 43, 80, 44, 44, 44, 44, 67, 67, 67, 92, 55, 67, 67, 67,
-   67, 67,186, 87, 43, 67,186, 86, 86,187, 65, 65, 65, 84, 43, 43,
-   43, 76, 50, 43, 43, 43, 67, 67, 67, 67, 67, 67, 67, 43, 43, 67,
-   67, 43, 76, 44, 44, 44, 44, 44, 27, 27, 44, 44, 44, 44, 44, 44,
-   11, 11, 11, 11, 11, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 11,
-   11, 11, 11, 11, 11, 11, 11, 16, 16, 16,110, 16, 16, 16, 16, 16,
-   11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 47, 11,
-   44, 47, 48, 47, 48, 11, 47, 11, 11, 11, 11, 16, 16,150,150, 16,
-   16, 16,150, 16, 16, 16, 16, 16, 16, 16, 11, 48, 11, 47, 48, 11,
-   11, 11, 47, 11, 11, 11, 47, 16, 16, 16, 16, 16, 11, 48, 11, 47,
-   11, 11, 47, 47, 44, 11, 11, 11, 47, 16, 16, 16, 16, 16, 16, 16,
-   16, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 16, 16, 16, 16, 16,
-   16, 16, 16, 44, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16, 16, 16,
-   16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11, 11, 11,
-   11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11,
-   11, 11, 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33,
-   16, 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31,
-   16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16,
-   16, 33, 16, 16, 16, 32, 44,  7, 43, 43, 43, 76, 67, 50, 43, 43,
-   43, 43, 43, 43, 43, 43, 76, 67, 67, 67, 50, 67, 67, 67, 67, 67,
-   67, 67, 76, 21,  2,  2, 44, 44, 44, 44, 44, 44, 44, 57, 43, 43,
-   16, 16, 16, 16, 16, 39, 16, 16, 16, 16, 16, 16, 16, 16, 16,110,
-   44, 44,150, 16, 16,110, 44, 44, 43, 43, 43, 80, 43, 43, 43, 43,
-   43, 43, 43, 43, 80, 57, 43, 43, 43, 57, 80, 43, 43, 80, 44, 44,
-   40, 40, 40, 40, 40, 40, 40, 44, 44, 44, 44, 44, 44, 44, 44, 57,
-   43, 43, 43, 74, 40, 40, 40, 44,  7,  7,  7,  7,  7, 44, 44, 77,
-   36, 36, 36, 36, 36, 36, 36, 80, 36, 36, 36, 36, 36, 36, 43, 43,
-    7,  7,  7,  7,  7, 44, 44, 96, 36, 36, 36, 36, 36, 83, 43, 43,
-  188,  7,  7,  7,  7,189, 44, 93, 36, 36, 36, 61, 36, 36, 62, 61,
-   36, 36, 61,179, 27, 27, 27, 27, 16, 16, 43, 43, 43, 74, 44, 44,
-   27, 27, 27, 27, 27, 27,163, 27,190, 27,100, 44, 44, 44, 44, 44,
-   27, 27, 27, 27, 27, 27, 27,163, 27, 27, 27, 27, 27, 27, 27, 44,
-   36, 36, 62, 36, 36, 36, 36, 36, 62, 61, 61, 62, 62, 36, 36, 36,
-   36, 61, 36, 36, 62, 62, 44, 44, 44, 61, 44, 62, 62, 62, 62, 36,
-   62, 61, 61, 62, 62, 62, 62, 62, 62, 61, 61, 62, 36, 61, 36, 36,
-   36, 61, 36, 36, 62, 36, 61, 61, 36, 36, 36, 36, 36, 62, 36, 36,
-   62, 36, 62, 36, 36, 62, 36, 36,  8, 44, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 67, 67, 67, 44, 44, 55, 67, 67, 67, 67, 67, 67, 67,
-   27, 27, 27, 27, 27, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 44,
-   44, 44, 44, 67, 67, 67, 67, 67, 67, 92, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 67, 92, 44, 44, 44, 67, 44, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 67, 67,
-   67, 67, 67, 92, 44, 55, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44,
-   67, 67, 67, 67, 67, 44, 44, 55, 67, 67, 67, 92, 44, 44, 44, 67,
-   67, 67, 67, 67, 67, 67, 92, 55, 67, 92, 67, 67, 67, 67, 67, 67,
-   79, 44, 44, 44, 44, 44, 44, 44,171,171,171,171,171,171,171, 44,
-  171,171,171,171,171,171,171,  0,  0,  0, 29, 21, 21, 21, 23, 21,
-   22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21,  9,  9,  9,
-    9, 22, 21, 18, 24, 16, 24,  5,  5,  5,  5, 22, 25, 18, 25,  0,
-   23, 23, 26, 21, 24, 26,  7, 20, 25,  1, 26, 24, 26, 25, 15, 15,
-   24, 15,  7, 19, 15, 21,  9, 25,  9,  5,  5, 25,  5,  9,  5,  7,
-    7,  7,  9,  8,  8,  5,  7,  5,  6,  6, 24, 24,  6, 24, 12, 12,
-    2,  2,  6,  5,  9, 21,  9,  2,  2,  9, 25,  9, 26, 12, 11, 11,
-    2,  6,  5, 21, 17,  2,  2, 26, 26, 23,  2, 12, 17, 12, 21, 12,
-   12, 21,  7,  2,  2,  7,  7, 21, 21,  2,  1,  1, 21, 23, 26, 26,
-    1, 21,  6,  7,  7, 12, 12,  7, 21,  7, 12,  1, 12,  6,  6, 12,
-   12, 26,  7, 26, 26,  7,  2,  1, 12,  2,  6,  2, 24,  7,  7,  6,
-    1, 12, 12, 10, 10, 10, 10, 12, 21,  6,  2, 10, 10,  2, 15, 26,
-   26,  2,  2, 21,  7, 10, 15,  7,  2, 23, 21, 26, 10,  7, 21, 15,
-   15,  2, 17,  7, 29,  7,  7, 22, 18,  2, 14, 14, 14,  7, 10, 21,
-   17, 21, 11, 12,  5,  2,  5,  6,  8,  8,  8, 24,  5, 24,  2, 24,
-    9, 24, 24,  2, 29, 29, 29,  1, 17, 17, 20, 19, 22, 20, 27, 28,
-    1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29,
-    1,  2, 15,  6, 18,  6, 23,  2, 12, 11,  9, 26, 26,  9, 26,  5,
-    5, 26, 14,  9,  5, 14, 14, 15, 25, 26, 26, 22, 18, 26, 18, 25,
-   18, 22,  5, 12,  2,  5, 22, 21, 21, 22, 18, 17, 26,  6,  7, 14,
-   17, 22, 18, 18, 26, 14, 17,  6, 14,  6, 12, 24, 24,  6, 26, 15,
-    6, 21, 11, 21, 24,  9,  6,  9, 23, 26,  6, 10,  4,  4,  3,  3,
-    7, 25, 17, 16, 16, 22, 16, 16, 25, 17, 25,  2, 25, 24,  2, 15,
-   12, 15, 14,  2, 21, 14,  7, 15, 12, 17, 21,  1, 26, 10, 10,  1,
-    7, 13, 13,  2, 23, 15,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
-    0, 10, 11, 12, 13,  0, 14,  0,  0,  0,  0,  0, 15,  0, 16,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0, 17, 18, 19,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0, 20,  0, 21, 22, 23,  0,  0,  0, 24, 25, 26, 27, 28,
-   29, 30, 31, 32, 33, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 35,  0,  0,  0,  0, 36,  0, 37,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39, 40,
-    0,  0,  0,  0,  0,  0, 41, 42, 43,  0, 44,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  0,  0,  0,  0,  3,  0,
-    0,  0,  4,  5,  6,  7,  0,  8,  9, 10,  0, 11, 12, 13, 14, 15,
-   16, 17, 16, 18, 16, 19, 16, 19, 16, 19,  0, 19, 16, 20, 16, 19,
-   21, 19,  0, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,  0, 32,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0, 33,  0,  0,  0,  0,  0,  0,
-   34,  0,  0, 35,  0,  0, 36,  0, 37,  0,  0,  0, 38, 39, 40, 41,
-   42, 43, 44, 45, 46,  0,  0, 47,  0,  0,  0, 48,  0,  0,  0, 49,
-    0,  0,  0,  0,  0,  0,  0, 50,  0, 51,  0, 52, 53,  0, 54,  0,
-    0,  0,  0,  0,  0, 55, 56, 57,  0,  0,  0,  0, 58,  0,  0, 59,
-   60, 61, 62, 63,  0,  0, 64, 65,  0,  0,  0, 66,  0,  0,  0,  0,
-   67,  0,  0,  0, 68,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0, 69,  0,  0,  0, 70,  0, 71,  0,  0, 72,  0,  0, 73,
-    0,  0,  0,  0,  0,  0,  0,  0, 74, 75,  0,  0,  0,  0, 76, 77,
-    0, 78, 79,  0,  0, 80, 81,  0, 82, 62,  0, 83, 84,  0,  0, 85,
-   86, 87,  0, 88,  0, 89,  0, 90,  0,  0, 51, 91, 51,  0, 92,  0,
-   93,  0,  0,  0, 81,  0,  0,  0, 94, 95,  0, 96, 97, 98, 99,  0,
-    0,  0,  0,  0, 51,  0,  0,  0,  0,100,101,  0,  0,  0,  0,  0,
-    0,102,  0,  0,  0,  0,  0,  0,103,  0,  0,  0,  0,  0,  0,104,
-  105,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,106,  0,  0,107,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,108,109,  0,  0,110,  0,  0,
-    0,  0,  0,  0,111,  0,112,  0,105,  0,  0,  0,  0,  0,113,114,
-    0,  0,  0,  0,  0,  0,  0,115,  0,  0,  0,116,  0,  0,  0,117,
-    0,118,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  0,
-    8,  0,  0,  0,  0,  9, 10, 11, 12,  0,  0,  0,  0, 13,  0,  0,
-   14, 15,  0, 16,  0, 17, 18,  0,  0, 19,  0, 20, 21,  0,  0,  0,
-    0,  0, 22, 23,  0, 24, 25,  0,  0, 26,  0,  0,  0, 27,  0,  0,
-   28, 29, 30, 31,  0,  0,  0, 32, 33, 34,  0,  0, 33,  0,  0, 35,
-   33,  0,  0,  0, 33, 36,  0,  0,  0,  0,  0, 37, 38,  0,  0,  0,
-    0,  0,  0, 39, 40,  0,  0,  0,  0,  0,  0, 41, 42,  0,  0,  0,
-    0, 43,  0, 44,  0,  0,  0, 45, 46,  0,  0,  0, 47,  0,  0,  0,
-    0,  0,  0, 48, 49,  0,  0,  0,  0, 50,  0,  0,  0, 51,  0, 52,
-    0, 53,  0,  0,  0,  0, 54,  0,  0,  0,  0, 55,  0, 56,  0,  0,
-    0,  0, 57, 58,  0,  0,  0, 59, 60,  0,  0,  0,  0,  0,  0, 61,
-   52,  0, 62, 63,  0,  0, 64,  0,  0,  0, 65, 66,  0,  0,  0, 67,
-    0, 68, 69, 70, 71, 72,  1, 73,  0, 74, 75, 76,  0,  0, 77, 78,
-    0,  0,  0, 79,  0,  0,  1,  1,  0,  0, 80,  0,  0, 81,  0,  0,
-    0,  0, 77, 82,  0, 83,  0,  0,  0,  0,  0, 78, 84,  0, 85,  0,
-   52,  0,  1, 78,  0,  0, 86,  0,  0, 87,  0,  0,  0,  0,  0, 88,
-   57,  0,  0,  0,  0,  0,  0, 89, 90,  0,  0, 84,  0,  0, 33,  0,
-    0, 91,  0,  0,  0,  0, 92,  0,  0,  0,  0, 49,  0,  0, 93,  0,
-    0,  0,  0, 94, 95,  0,  0, 96,  0,  0, 97,  0,  0,  0, 98,  0,
-    0,  0, 99,  0,  0,  0,100,  0,  0,  0,  0,101,102, 93,  0,  0,
-  103,  0,  0,  0, 84,  0,  0,104,  0,  0,  0,105,106,  0,  0,107,
-  108,  0,  0,  0,  0,  0,  0,109,  0,  0,110,  0,  0,  0,  0,111,
-   33,  0,112,113,114, 57,  0,  0,115, 35,  0,  0,116,  0,  0,  0,
-  117,  0,  0,  0,  0,  0,  0,118,  0,  0,119,  0,  0,  0,  0,120,
-   88,  0,  0,  0,  0,  0, 57,  0,  0,  0,  0, 52,121,  0,  0,  0,
-    0,122,  0,  0,123,  0,  0,  0,  0,121,  0,  0,124,  0,  0,  0,
-    0,  0, 79,  0,  0,  0,  0,125,  0,  0,  0,126,  0,  0,  0,127,
-    0,128,  0,  0,  0,  0,129,130,131,  0,132,  0,133,  0,  0,  0,
-  134,135,136,  0, 77,  0,  0,  0,  0,  0, 35,  0,  0,  0,137,  0,
-    0,  0,138,  0,  0,  0,139,  0,  0,140,  0,  0,141,  0,  0,  0,
-    0,  0,  0,  0,  1,  1,  1,  1,  1,  2,  3,  4,  5,  6,  7,  4,
-    4,  8,  9, 10,  1, 11, 12, 13, 14, 15, 16, 17, 18,  1,  1,  1,
-   19,  1,  0,  0, 20, 21, 22,  1, 23,  4, 21, 24, 25, 26, 27, 28,
-   29, 30,  0,  0,  1,  1, 31,  0,  0,  0, 32, 33, 34, 35,  1, 36,
-   37,  0,  0,  0,  0, 38,  1, 39, 14, 39, 40, 41, 42,  0,  0,  0,
-   43, 36, 44, 45, 21, 45, 46,  0,  0,  0, 19,  1, 21,  0,  0, 47,
-    0, 38, 48,  1,  1, 49, 49, 50,  0,  0, 51,  0,  0, 19, 52,  1,
-    0,  0, 38, 14,  4,  1,  1,  1, 53, 21, 43, 52, 54, 21, 35,  1,
-    0,  0,  0, 55,  0,  0,  0, 56, 57, 58,  0,  0,  0,  0,  0, 59,
-    0, 60,  0,  0,  0,  0, 61, 62,  0,  0, 63,  0,  0,  0, 64,  0,
-    0,  0, 65,  0,  0,  0, 66,  0,  0,  0, 67,  0,  0,  0, 68,  0,
-    0, 69, 70,  0, 71, 72, 73, 74, 75, 76,  0,  0,  0, 77,  0,  0,
-    0, 78, 79,  0,  0,  0,  0, 47,  0,  0,  0, 49,  0, 80,  0,  0,
-    0, 62,  0,  0, 63,  0,  0, 81,  0,  0, 82,  0,  0,  0, 83,  0,
-    0, 19, 84,  0, 62,  0,  0,  0,  0, 49,  1, 85,  1, 52, 15, 86,
-   36, 10, 21, 87,  0, 55,  0,  0,  0,  0, 19, 10,  1,  0,  0,  0,
-    0,  0, 88,  0,  0, 89,  0,  0, 88,  0,  0,  0,  0, 78,  0,  0,
-   87,  9, 12,  4, 90,  8, 91, 47,  0, 58, 50,  0, 21,  1, 21, 92,
-   93,  1,  1,  1,  1, 94, 95, 96, 97,  1, 98, 58, 81, 99,100,  4,
-   58,  0,  0,  0,  0,  0,  0, 19, 50,  0,  0,  0,  0,  0,  0, 61,
-    0,  0,101,102,  0,  0,103,  0,  0,  1,  1, 50,  0,  0,  0, 38,
-    0, 63,  0,  0,  0,  0,  0, 62,  0,  0,104, 68, 61,  0,  0,  0,
-   78,  0,  0,  0,105,106, 58, 38, 81,  0,  0,  0,  0,  0,  0,107,
-    1, 14,  4, 12, 84,  0,  0,  0,  0, 38, 87,  0,  0,  0,  0,108,
-    0,  0,109, 61,  0,110,  0,  0,  0,  1,  0,  0,  0,  0, 49, 50,
-    0,  0, 19, 58,  0,  0,  0, 51,  0,111, 14, 52,112, 41,  0,  0,
-   62,  0,  0, 61,  0,  0,113,  0, 87,  0,  0,  0, 61, 62,  0,  0,
-   62,  0, 89,  0,  0,113,  0,  0,  0,  0,114,  0,  0,  0, 78, 55,
-    0, 38,  1, 58,  1, 58,  0,  0,  0,  0,  0, 88, 63, 89,  0,  0,
-  115,  0,  0,  0, 55,  0,  0,  0,  0,115,  0,  0,  0,  0, 61,  0,
-    0,  0,  0, 79,  0, 61,  0,  0,  0,  0, 56,  0, 89, 80,  0,  0,
-   79,  0,  0,  0,  8, 91,  0,  0,  1, 87,  0,  0,116,  0,  0,  0,
-    0,  0,  0,117,  0,118,119,120,121,  0,104,  4,122, 49, 23,  0,
-    0,  0, 38, 50, 38, 58,  0,  0,  1, 87,  1,  1,  1,  1, 39,  1,
-   48,105, 87,  0,  0,  0,  0,  1,  0,  0,  0,123,  0,  0,  0,112,
-    4,122,  0,  0,  0,  1,124,  0,  0,  0,  0,  0,230,230,230,230,
-  230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220,
-  220,220,220,202,202,220,220,220,  1,  1,  1,  1,  1,220,220,220,
-  220,230,230,230,230,240,230,220,220,220,230,230,230,220,220,  0,
-  230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233,
-  234,234,233,230,  0,  0,  0,230,  0,220,230,230,230,230,220,230,
-  230,230,222,220,230,230,220,220,230,222,228,230, 10, 11, 12, 13,
-   14, 15, 16, 17, 18, 19, 19, 20, 21, 22,  0, 23,  0, 24, 25,  0,
-  230,220,  0, 18, 30, 31, 32,  0,  0,  0,  0, 27, 28, 29, 30, 31,
-   32, 33, 34,230,230,220,220,230,220,230,230,220, 35,  0,  0,  0,
-    0,  0,230,230,230,  0,  0,230,230,  0,220,230,230,220,  0,  0,
-    0, 36,  0,  0,230,220,230,230,220,220,230,220,220,230,220,230,
-  220,230,230,  0,  0,220,  0,  0,230,230,  0,230,  0,230,230,230,
-  230,230,  0,  0,  0,220,220,220,230,220,220,220,230,230,  0,220,
-   27, 28, 29,230,  7,  0,  0,  0,  0,  9,  0,  0,  0,230,220,230,
-  230,  0,  0,  0,  0,  0,230,  0,  0, 84, 91,  0,  0,  0,  0,  9,
-    9,  0,  0,  0,  0,  0,  9,  0,103,103,  9,  0,107,107,107,107,
-  118,118,  9,  0,122,122,122,122,220,220,  0,  0,  0,220,  0,220,
-    0,216,  0,  0,  0,129,130,  0,132,  0,  0,  0,  0,  0,130,130,
-  130,130,  0,  0,130,  0,230,230,  9,  0,230,230,  0,  0,220,  0,
-    0,  0,  0,  7,  0,  9,  9,  0,  9,  9,  0,  0,  0,230,  0,  0,
-    0,228,  0,  0,  0,222,230,220,220,  0,  0,  0,230,  0,  0,220,
-  230,220,  0,220,230,230,230,  0,  0,  0,  9,  9,  0,  0,  7,  0,
+   32, 32, 11, 11, 34, 34, 32, 32, 32, 32, 32, 32, 32, 32, 46, 43,
+   51, 39,166, 35, 39, 35, 36, 36, 36, 70, 36, 70, 36, 69, 36, 36,
+   36, 93, 86, 84, 66, 66, 79, 43, 27, 27, 27, 66,167, 43, 43, 43,
+   36, 36,  2,  2, 43, 43, 43, 43, 85, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 85, 85, 85, 85, 85, 85, 85, 85, 42, 43, 43, 43, 43,  2,
+   42, 36, 36, 36,  2, 71, 71, 69, 36, 36, 36, 42, 42, 42, 42,  2,
+   36, 36, 36, 69, 42, 42, 42, 42, 42, 85, 43, 43, 43, 43, 43, 92,
+   36, 69, 85, 42, 42, 85, 42, 85,106,  2,  2,  2,  2,  2,  2, 51,
+    7,  7,  7,  7,  7, 43, 43,  2, 36, 36, 69, 68, 36, 36, 36, 36,
+    7,  7,  7,  7,  7, 36, 36, 60, 36, 36, 36, 36, 69, 42, 42, 84,
+   86, 84, 86, 79, 43, 43, 43, 43, 36, 69, 36, 36, 36, 36, 84, 43,
+    7,  7,  7,  7,  7, 43,  2,  2, 68, 36, 36, 76, 66, 93, 84, 36,
+   70, 42, 70, 69, 70, 36, 36, 42, 69, 60, 43, 43, 43, 43, 43, 43,
+   43, 43, 43, 43, 43, 61, 82,  2, 36, 36, 36, 36, 36, 93, 42, 85,
+    2, 82,168, 79, 43, 43, 43, 43, 61, 36, 36, 60, 61, 36, 36, 60,
+   61, 36, 36, 60, 43, 43, 43, 43, 16, 16, 16, 16, 16,113, 39, 39,
+   16, 16, 16, 16,110, 40, 43, 43, 36, 93, 86, 85, 84,106, 86, 43,
+   36, 36, 43, 43, 43, 43, 43, 43, 36, 36, 36, 60, 43, 61, 36, 36,
+  169,169,169,169,169,169,169,169,170,170,170,170,170,170,170,170,
+   16, 16, 16,109, 43, 43, 43, 43, 43,149, 16, 16, 43, 43, 61, 70,
+   36, 36, 36, 36,171, 36, 36, 36, 36, 36, 36, 60, 36, 36, 60, 60,
+   36, 61, 60, 36, 36, 36, 36, 36, 36, 40, 40, 40, 40, 40, 40, 40,
+   40, 22, 66, 66, 66, 66, 66, 66, 66, 77, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 36,147, 66, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 66, 66, 66, 66, 36, 36, 36, 36, 36, 36,167, 66,
+    2,  2,  2,151,129, 43, 43, 43,  6,172,173,147,147,147,147,147,
+  147,147,129,151,129,  2,126,174,  2, 63,  2,  2,155,147,147,129,
+    2,175,  8,176, 65,  2, 43, 43, 36, 36, 60, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 60, 78, 92,  2,  3,  2,  4,  5,  6,  2,
+   16, 16, 16, 16, 16, 17, 18,128,129,  4,  2, 36, 36, 36, 36, 36,
+   68, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 39,
+   43, 36, 36, 36, 43, 36, 36, 36, 43, 36, 36, 36, 43, 36, 60, 43,
+   20,177, 55,178, 26,  8,143, 91, 43, 43, 43, 43, 78, 64, 66, 43,
+   36, 36, 36, 36, 36, 36, 61, 36, 36, 36, 36, 36, 36, 60, 36, 61,
+    2, 63, 43,179, 27, 27, 27, 27, 27, 27, 43, 54, 66, 66, 66, 66,
+  104,104,142, 27, 90, 66, 66, 66, 66, 66, 66, 66, 66, 27, 66, 91,
+   66, 66, 66, 66, 66, 66, 91, 43, 91, 43, 43, 43, 43, 43, 43, 43,
+   66, 66, 66, 66, 66, 66, 49, 43,180, 27, 27, 27, 27, 27, 27, 27,
+   27, 27, 27, 27, 27, 27, 43, 43, 27, 27, 43, 43, 43, 43, 61, 36,
+  154, 36, 36, 36, 36,181, 43, 43, 36, 36, 36, 42, 42, 79, 43, 43,
+   36, 36, 36, 36, 36, 36, 36, 92, 36, 36, 43, 43, 36, 36, 36, 36,
+  182,104,104, 43, 43, 43, 43, 43, 11, 11, 11, 11, 16, 16, 16, 16,
+   11, 11, 43, 43, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 43, 43,
+   36, 36, 36, 36, 43, 43, 43, 43, 36, 36, 43, 43, 43, 43, 43, 92,
+   11, 11, 11, 11, 11, 46, 11, 11, 11, 46, 11,149, 16, 16, 16, 16,
+   16,149, 16, 16, 16, 16, 16, 16, 16,149, 16, 16, 16,149,109, 43,
+   39, 39, 39, 51, 39, 39, 39, 39, 80, 39, 39, 39, 39, 80, 43, 43,
+   36, 36, 36, 43, 60, 36, 36, 36, 36, 36, 36, 61, 60, 43, 60, 61,
+   36, 36, 36, 92, 27, 27, 27, 27, 36, 36, 36, 76,162, 27, 27, 27,
+   43, 43, 43,179, 27, 27, 27, 27, 36, 60, 36, 43, 43,179, 27, 27,
+   36, 36, 36, 27, 27, 27, 43, 92, 36, 36, 36, 36, 36, 43, 43, 92,
+   36, 36, 36, 36, 43, 43, 27, 36, 43, 27, 27, 27, 27, 27, 27, 27,
+   69, 42, 56, 79, 43, 43, 42, 42, 36, 36, 61, 36, 61, 36, 36, 36,
+   36, 36, 36, 43, 42, 79, 43, 56, 27, 27, 27, 27, 99, 43, 43, 43,
+    2,  2,  2,  2, 63, 43, 43, 43, 36, 36, 36, 36, 36, 36,183, 30,
+   36, 36, 36, 36, 36, 36,183, 27, 36, 36, 36, 36, 77, 36, 36, 36,
+   36, 36, 69, 79, 43,179, 27, 27,  2,  2,  2, 63, 43, 43, 43, 43,
+   36, 36, 36, 43, 92,  2,  2,  2, 36, 36, 36, 43, 27, 27, 27, 27,
+   36, 60, 43, 43, 27, 27, 27, 27, 36, 43, 43, 43, 92,  2, 63, 43,
+   43, 43, 43, 43,179, 27, 27, 27, 11, 46, 43, 43, 43, 43, 43, 43,
+   16,109, 43, 43, 43, 27, 27, 27, 36, 36, 42, 42, 43, 43, 43, 43,
+    7,  7,  7,  7,  7, 36, 36, 68, 11, 11, 11, 43, 56, 42, 42,158,
+   16, 16, 16, 43, 43, 43, 43,  8, 27, 27, 27, 27, 27, 27, 27, 99,
+   36, 36, 36, 36, 36, 56,184, 43, 36, 43, 43, 43, 43, 43, 43, 43,
+   43, 36, 82, 36, 43, 43, 43, 43, 96, 66, 66, 66, 91, 43, 43, 43,
+   43, 43, 43, 43, 43, 42, 42, 42, 27, 27, 27, 94, 43, 43, 43, 43,
+  180, 27, 30,  2,  2, 43, 43, 43, 36, 42, 42,  2,  2, 43, 43, 43,
+   36, 36,183, 27, 27, 27, 43, 43, 86, 97, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 42, 42, 42, 42, 42, 42, 42, 59,  2,  2,  2, 43,
+   27, 27, 27,  7,  7,  7,  7,  7, 70, 69, 70, 43, 43, 43, 43, 56,
+   85, 86, 42, 84, 86, 59,185,  2,  2, 79, 43, 43, 43, 43, 78, 43,
+   42, 70, 36, 36, 36, 36, 36, 36, 36, 36, 36, 69, 42, 42, 86, 42,
+   42, 42, 79,  7,  7,  7,  7,  7,  2,  2, 93, 97, 43, 43, 43, 43,
+   36, 69,  2, 60, 43, 43, 43, 43, 36, 93, 85, 42, 42, 42, 42, 84,
+   97, 36, 62,  2, 58, 42, 59, 86,  7,  7,  7,  7,  7, 62, 62,  2,
+  179, 27, 27, 27, 27, 27, 27, 27, 27, 27, 99, 43, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 36, 85, 86, 42, 85, 84, 42,  2,  2,  2, 70,
+   69, 43, 43, 43, 43, 43, 43, 43, 36, 36, 36, 60, 60, 36, 36, 61,
+   36, 36, 36, 36, 36, 36, 36, 61, 36, 36, 36, 36, 62, 43, 43, 43,
+   36, 36, 36, 36, 36, 36, 36, 69, 85, 86, 42, 42, 42, 79, 43, 43,
+   42, 85, 61, 36, 36, 36, 60, 61, 60, 36, 61, 36, 36, 56, 70, 85,
+   84, 85, 89, 88, 89, 88, 85, 43, 60, 43, 43, 88, 43, 43, 61, 36,
+   36, 85, 43, 42, 42, 42, 79, 43, 42, 42, 79, 43, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 61, 43, 60, 36, 36, 36, 61, 85, 86, 42, 42,
+   79, 89, 88, 88, 85, 89, 85, 84, 70, 70,  2, 92, 63, 43, 43, 43,
+   56, 79, 43, 43, 43, 43, 43, 43, 36, 36, 93, 85, 42, 42, 42, 42,
+   85, 42, 84, 70, 36, 62,  2,  2,  7,  7,  7,  7,  7,  2, 92, 70,
+   85, 86, 42, 42, 84, 84, 85, 86, 84, 42, 36, 71, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 36, 36, 93, 85, 42, 42, 43, 85, 85, 42, 86,
+   59,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 36, 36, 42, 43,
+   85, 86, 42, 42, 42, 84, 86, 86, 59,  2, 60, 43, 43, 43, 43, 43,
+    2,  2,  2,  2,  2,  2, 63, 43, 36, 36, 36, 36, 36, 69, 86, 85,
+   42, 42, 42, 86, 62, 43, 43, 43,  7,  7,  7,  7,  7,  7,  7,  7,
+    7,  7, 43, 43, 43, 43, 43, 43, 36, 36, 36, 36, 36, 60, 56, 86,
+   85, 42, 42, 86, 42, 42, 43, 43,  7,  7,  7,  7,  7, 27,  2, 96,
+   42, 42, 42, 42, 86, 59, 43, 43, 27, 99, 43, 43, 43, 43, 43, 61,
+   36, 36, 36, 60, 61, 43, 36, 36, 36, 36, 61, 60, 36, 36, 36, 36,
+   85, 85, 85, 88, 89, 56, 84, 70, 97, 86,  2, 63, 43, 43, 43, 43,
+   36, 36, 36, 36, 43, 36, 36, 36, 93, 85, 42, 42, 43, 42, 85, 85,
+   70, 71, 89, 43, 43, 43, 43, 43, 69, 42, 42, 42, 42, 70, 36, 36,
+   36, 69, 42, 42, 84, 69, 42, 59,  2,  2,  2, 58, 43, 43, 43, 43,
+   69, 42, 42, 84, 86, 42, 36, 36, 36, 36, 36, 36, 36, 42, 42, 42,
+   42, 42, 42, 84, 42,  2, 71,  2,  2, 63, 43, 43, 43, 43, 43, 43,
+    2,  2,  2,  2,  2, 43, 43, 43, 84, 42, 84, 84, 43, 43, 43, 43,
+   62, 43, 43, 43, 43, 43, 43, 43, 42, 42, 42, 79, 42, 42, 42, 86,
+   62,  2,  2, 43, 43, 43, 43, 43,  2, 36, 36, 36, 36, 36, 36, 36,
+   43, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 88, 42, 42, 42,
+   84, 42, 86, 79, 43, 43, 43, 43, 36, 36, 36, 60, 36, 61, 36, 36,
+   69, 42, 42, 79, 43, 79, 42, 56, 42, 42, 42, 69, 43, 43, 43, 43,
+   36, 36, 36, 61, 60, 36, 36, 36, 36, 36, 36, 36, 36, 85, 85, 89,
+   42, 88, 86, 86, 60, 43, 43, 43, 36, 36, 36, 36, 82, 36, 43, 43,
+   36, 69, 84,106, 63, 43, 43, 43, 42, 93, 36, 36, 36, 36, 36, 36,
+   36, 36, 85, 42, 42, 79, 43, 85, 84, 59,  2,  2,  2,  2,  2,  2,
+    7,  7,  7,  7,  7, 79, 43, 43, 27, 27, 90, 66, 66, 66, 55, 20,
+  167, 66, 66, 66, 66, 66, 66, 66, 66, 43, 43, 43, 43, 43, 43, 92,
+  104,104,104,104,104,104,104,181,  2,  2, 63, 43, 43, 43, 43, 43,
+   62, 63, 43, 43, 43, 43, 43, 43, 64, 64, 64, 64, 64, 64, 64, 64,
+   70, 36, 36, 69, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 36, 36, 42, 42, 42, 42, 42, 42, 85, 86, 42,
+   42, 42, 59, 43, 43, 43, 43, 43, 42, 42, 42, 59,  2,  2, 66, 66,
+   39, 39, 96, 43, 43, 43, 43, 43,  7,  7,  7,  7,  7,179, 27, 27,
+   27, 61, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 61, 36,
+   39, 68, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 82,163,  2,
+   27, 27, 27, 30,  2, 63, 43, 43, 11, 11, 11, 11, 46,149, 16, 16,
+   16, 16, 43, 43, 43, 43, 43, 43, 36, 36, 36, 36, 36, 60, 43, 56,
+   93, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+   85, 85, 85, 85, 43, 43, 43, 56, 42, 73, 39, 39, 39, 39, 39, 39,
+   39, 87, 79, 43, 43, 43, 43, 43, 85, 39,104,181, 43, 43, 43, 43,
+   43, 43, 43, 43, 43, 43, 43, 61, 36, 60, 43, 43, 43, 43, 43, 43,
+   39, 39, 51, 39, 39, 39, 51, 80, 43, 60, 43, 43, 43, 43, 43, 43,
+   36, 60, 61, 43, 43, 43, 43, 43, 43, 43, 36, 36, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 43, 49, 59, 64, 64, 43, 43, 43, 43, 43, 43,
+    7,  7,  7,  7,  7, 66, 91, 43, 66, 66, 43, 43, 43, 66, 66, 66,
+  176, 43, 43, 43, 43, 43, 43, 43, 42, 42, 42, 79, 43, 43, 43, 43,
+   66, 66, 66, 91, 54, 66, 66, 66, 66, 66,186, 86, 42, 66,186, 85,
+   85,187, 64, 64, 64, 83, 42, 42, 42, 75, 49, 42, 42, 42, 66, 66,
+   66, 66, 66, 66, 66, 42, 42, 66, 66, 42, 75, 43, 43, 43, 43, 43,
+   27, 27, 43, 43, 43, 43, 43, 43, 11, 11, 11, 11, 11, 16, 16, 16,
+   16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16,
+   16, 16,109, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16,
+   16, 16, 16, 16, 16, 16, 46, 11, 43, 46, 47, 46, 47, 11, 46, 11,
+   11, 11, 11, 16, 16,149,149, 16, 16, 16,149, 16, 16, 16, 16, 16,
+   16, 16, 11, 47, 11, 46, 47, 11, 11, 11, 46, 11, 11, 11, 46, 16,
+   16, 16, 16, 16, 11, 47, 11, 46, 11, 11, 46, 46, 43, 11, 11, 11,
+   46, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, 11,
+   11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 43, 11, 11, 11, 11,
+   31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16,
+   16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16,
+   16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16,
+   16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11,
+   11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16,
+   11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 32, 43,  7,
+   42, 42, 42, 75, 66, 49, 42, 42, 42, 42, 42, 42, 42, 42, 75, 66,
+   66, 66, 49, 66, 66, 66, 66, 66, 66, 66, 75, 21,  2,  2, 43, 43,
+   43, 43, 43, 43, 43, 56, 42, 42, 16, 16, 16, 16, 16,138, 16, 16,
+   16, 16, 16, 16, 16, 16, 16,109, 43, 43,149, 16, 16,109, 43, 43,
+   42, 42, 42, 79, 42, 42, 42, 42, 42, 42, 42, 42, 79, 56, 42, 42,
+   42, 56, 79, 42, 42, 79, 43, 43, 39, 39, 39, 39, 39, 39, 39, 43,
+   43, 43, 43, 43, 43, 43, 43, 56, 42, 42, 42, 73, 39, 39, 39, 43,
+    7,  7,  7,  7,  7, 43, 43, 76, 36, 36, 36, 36, 36, 36, 36, 79,
+   36, 36, 36, 36, 36, 36, 42, 42,  7,  7,  7,  7,  7, 43, 43, 95,
+   36, 36, 36, 36, 36, 82, 42, 42,188,  7,  7,  7,  7,189, 43, 92,
+   36, 69, 36, 70, 36, 36, 36, 42, 36, 36, 69, 43, 43, 43, 43, 82,
+   36, 36, 36, 60, 36, 36, 61, 60, 36, 36, 60,179, 27, 27, 27, 27,
+   16, 16, 42, 42, 42, 73, 43, 43, 27, 27, 27, 27, 27, 27,162, 27,
+  190, 27, 99, 43, 43, 43, 43, 43, 27, 27, 27, 27, 27, 27, 27,162,
+   27, 27, 27, 27, 27, 27, 27, 43, 36, 36, 61, 36, 36, 36, 36, 36,
+   61, 60, 60, 61, 61, 36, 36, 36, 36, 60, 36, 36, 61, 61, 43, 43,
+   43, 60, 43, 61, 61, 61, 61, 36, 61, 60, 60, 61, 61, 61, 61, 61,
+   61, 60, 60, 61, 36, 60, 36, 36, 36, 60, 36, 36, 61, 36, 60, 60,
+   36, 36, 36, 36, 36, 61, 36, 36, 61, 36, 61, 36, 36, 61, 36, 36,
+    8, 43, 43, 43, 43, 43, 43, 43, 66, 66, 66, 66, 66, 66, 43, 43,
+   54, 66, 66, 66, 66, 66, 66, 66, 27, 27, 27, 27, 27, 27, 90, 66,
+   66, 66, 66, 66, 66, 66, 66, 43, 43, 43, 43, 66, 66, 66, 66, 66,
+   66, 91, 43, 43, 43, 43, 43, 43, 66, 66, 66, 66, 91, 43, 43, 43,
+   66, 43, 43, 43, 43, 43, 43, 43, 66, 66, 66, 66, 66, 25, 40, 40,
+   66, 66, 66, 66, 91, 43, 66, 66, 66, 66, 66, 66, 43, 43, 43, 43,
+    8,  8,  8,  8,176, 43, 43, 43, 66, 66, 66, 66, 66, 91, 43, 66,
+   66, 66, 66, 91, 91, 43, 54, 66, 66, 66, 66, 66, 66, 66, 91, 54,
+   66, 66, 66, 66, 66, 91, 43, 54, 66, 91, 66, 66, 66, 66, 66, 66,
+    7,  7,  7,  7,  7, 91, 43, 43, 78, 43, 43, 43, 43, 43, 43, 43,
+  170,170,170,170,170,170,170, 43,170,170,170,170,170,170,170,  0,
+    0,  0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13,
+   25, 25, 25, 21, 21,  9,  9,  9,  9, 22, 21, 18, 24, 16, 24,  5,
+    5,  5,  5, 22, 25, 18, 25,  0, 23, 23, 26, 21, 24, 26,  7, 20,
+   25,  1, 26, 24, 26, 25, 15, 15, 24, 15,  7, 19, 15, 21,  9, 25,
+    9,  5,  5, 25,  5,  9,  5,  7,  7,  7,  9,  8,  8,  5,  6,  6,
+   24, 24,  6, 24, 12, 12,  2,  2,  6,  5,  9, 21,  9,  2,  2,  9,
+   25,  9, 26, 12, 11, 11,  2,  6,  5, 21, 17,  2,  2, 26, 26, 23,
+    2, 12, 17, 12, 21, 12, 12, 21,  7,  2,  2,  7,  7, 21, 21,  2,
+    1,  1, 21, 23, 26, 26,  1, 21,  6,  7,  7, 12, 12,  7, 21,  7,
+   12,  1, 12,  6,  6, 12, 12, 26,  7, 26, 26,  7,  2,  1, 12,  2,
+    6,  2, 24,  7,  7,  6,  1, 12, 12, 10, 10, 10, 10, 12, 21,  6,
+    2, 10, 10,  2, 15, 26, 26,  2,  2, 21,  7, 10, 15,  7,  2, 23,
+   21, 26, 10,  7, 21, 15, 15,  2, 17,  7, 29,  7,  7, 22, 18,  2,
+   14, 14, 14,  7, 10, 21, 17, 21, 11, 12,  5,  2,  5,  6,  8,  8,
+    8, 24,  5, 24,  2, 24,  9, 24, 24,  2, 29, 29, 29,  1, 17, 17,
+   20, 19, 22, 20, 27, 28,  1, 29, 21, 20, 19, 21, 21, 16, 16, 21,
+   25, 22, 18, 21, 21, 29,  1,  2, 15,  6, 18,  6, 12, 11,  9, 26,
+   26,  9, 26,  5,  7,  5,  5, 26, 14,  9,  5, 14, 14, 15, 25, 26,
+   26, 22, 18, 26, 18, 25, 18, 22,  5, 12,  2,  5, 22, 21, 21, 22,
+   18, 17, 26,  6,  7, 14, 17, 22, 18, 18, 26, 14, 17,  6, 14,  6,
+   12, 24, 24,  6, 26, 15,  6, 21, 11, 21, 24,  9,  6,  9, 23, 26,
+    6, 10,  4,  4,  3,  3,  7, 25, 17, 16, 16, 22, 16, 16, 25, 17,
+   25,  2, 25, 24, 23,  2,  2, 15, 12, 15, 14,  2, 21, 14,  7, 15,
+   12, 17, 21,  1, 26, 10, 10,  1,  7, 13, 13,  2, 23, 15,  0,  1,
+    2,  3,  4,  5,  6,  7,  8,  9,  0, 10, 11, 12, 13,  0, 14,  0,
+    0,  0,  0,  0, 15,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0, 17, 18, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 20,  0, 21, 22, 23,
+    0,  0,  0, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 35,  0,
+    0,  0,  0, 36,  0, 37,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 39, 40,  0,  0,  0,  0,  0,  0, 41, 42,
+   43, 44, 45,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,
+    0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,  0,  0,
+    6,  7,  8,  0,  9,  0, 10, 11,  0,  0, 12, 13, 14, 15, 16,  0,
+    0,  0,  0, 17, 18, 19, 20,  0, 21,  0, 22, 23,  0, 24, 25,  0,
+    0, 24, 26, 27,  0, 24, 26,  0,  0, 24, 26,  0,  0, 24, 26,  0,
+    0,  0, 26,  0,  0, 24, 28,  0,  0, 24, 26,  0,  0, 29, 26,  0,
+    0,  0, 30,  0,  0, 31, 32,  0,  0, 33, 34,  0, 35, 36,  0, 37,
+   38,  0, 39,  0,  0, 40,  0,  0, 41,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 42,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 43, 44,  0,  0,
+    0,  0, 45,  0,  0,  0,  0,  0,  0, 46,  0,  0,  0, 47,  0,  0,
+    0,  0,  0,  0, 48,  0,  0, 49,  0, 50, 51, 52,  0, 53, 54, 55,
+    0, 56,  0, 57,  0, 58,  0,  0,  0,  0, 59, 60,  0,  0,  0,  0,
+    0,  0, 61, 62,  0,  0,  0,  0,  0,  0, 63, 64,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0,  0,  0, 66,
+    0,  0,  0, 67,  0, 68,  0,  0, 69,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 70, 71,  0,  0, 72,  0,  0,  0,  0,
+    0,  0,  0,  0, 73, 74,  0,  0,  0,  0, 54, 75,  0, 76, 77,  0,
+    0, 78, 79,  0,  0,  0,  0,  0,  0, 80, 81, 82,  0,  0,  0,  0,
+    0,  0,  0, 26,  0,  0,  0,  0,  0,  0,  0,  0, 83,  0,  0,  0,
+    0,  0,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0, 86,  0,  0,  0, 87,
+    0,  0,  0,  0, 88, 89,  0,  0,  0,  0,  0, 90,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 92,
+    0,  0,  0,  0,  0,  0,  0,  0,  0, 93,  0, 94,  0,  0, 95,  0,
+   96,  0,  0,  0,  0,  0, 73, 97,  0, 98,  0,  0, 99,100,  0, 78,
+    0,  0,101,  0,  0,102,  0,  0,  0,  0,  0,103,  0,104, 26,105,
+    0,  0,106,  0,  0,  0,107,  0,  0,  0,108,  0,  0,  0,  0,  0,
+    0, 66,109,  0,  0, 66,  0,  0,  0,110,  0,  0,  0,111,  0,  0,
+    0,  0,  0,  0,  0, 98,  0,  0,  0,  0,  0,  0,  0,112,113,  0,
+    0,  0,  0, 79,  0, 44,114,  0,115,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,116,  0,
+  117,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,118,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,119,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,  0,121,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,122,  0,  0,  0,  0,123,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,
+  125,126,  0,  0,  0,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,128,129,  0,  0,130,  0,  0,  0,  0,121,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,131,  0,132,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,133,  0,  0,  0,  0,
+    0,  0,  0,134,  0,  0,  0,  0,  0,  0,  0,135,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,136,  0,  0,  0,137,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
+    1,  2,  3,  4,  5,  6,  7,  4,  4,  8,  9, 10,  1, 11, 12, 13,
+   14, 15, 16, 17, 18,  1,  1,  1,  0,  0,  0,  0, 19,  1,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0, 20, 21, 22,  1, 23,  4, 21, 24,
+   25, 26, 27, 28, 29, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    1,  1, 31,  0,  0,  0, 32, 33, 34, 35,  1, 36,  0,  0,  0,  0,
+   37,  0,  0,  0,  0,  0,  0,  0,  0, 38,  1, 39, 14, 39, 40, 41,
+    0,  0,  0,  0,  0,  0,  0,  0, 42,  0,  0,  0,  0,  0,  0,  0,
+   43, 36, 44, 45, 21, 45, 46,  0,  0,  0,  0,  0,  0,  0, 19,  1,
+   21,  0,  0, 47,  0,  0,  0,  0,  0, 38, 48,  1,  1, 49, 49, 50,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 51,  0,  0,  0,  0,  0,
+    0, 19, 52,  1,  0,  0, 38, 14,  4,  1,  1,  1, 53, 21, 43, 52,
+   54, 21, 35,  1,  0,  0,  0,  0,  0,  0,  0, 55,  0,  0,  0, 56,
+   57, 58,  0,  0,  0,  0,  0, 56,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0, 59,  0,  0,  0, 56,  0, 60,  0,  0,  0,  0,  0,  0,
+    0,  0, 61, 62,  0,  0, 63,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 64,  0,  0,  0, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 66,  0,  0,  0, 67,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 68,  0,  0,  0,  0,  0,  0, 69, 70,  0,  0,  0,  0,  0,
+   71, 72, 73, 74, 75, 76,  0,  0,  0,  0,  0,  0,  0, 77,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0, 78, 79,  0,  0,  0,  0, 47,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 49,  0,  0,  0,  0,
+    0, 80,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,
+   63,  0,  0, 81,  0,  0, 82,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 83,  0,  0,  0,  0,  0,  0, 19, 84,  0, 62,  0,  0,  0,
+    0, 49,  1, 85,  0,  0,  0,  0,  1, 52, 15, 86, 36, 10, 21,  1,
+    1,  1,  1, 41,  1, 21, 87,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0, 55,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0, 19, 10,
+    1,  0,  0,  0,  0,  0, 88,  0,  0,  0,  0,  0,  0, 89,  0,  0,
+   88,  0,  0,  0,  0,  0,  0,  0,  0, 78,  0,  0,  0,  0,  0,  0,
+   90,  9, 12,  4, 91,  8, 92, 47,  0, 58, 50,  0, 21,  1, 21, 93,
+   94,  1,  1,  1,  1,  1,  1,  1,  1, 95, 96, 97,  0,  0,  0,  0,
+   98,  1, 99, 58, 81,100,101,  4, 58,  0,  0,  0,  0,  0,  0, 19,
+   50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 61,  1,  1,  1,  1,
+    1,  1,  1,  1,  0,  0,102,103,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,104,  0,  0,  0,  0, 19,  0,  1,  1, 50,  0,  0,  0,  0,
+    0,  0,  0, 38,  0,  0,  0,  0, 50,  0,  0,  0,  0, 63,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,  1,  1,  1,  1,
+   50,  0,  0,  0,  0,  0,105, 68,  0,  0,  0,  0,  0,  0,  0,  0,
+   61,  0,  0,  0,  0,  0,  0,  0, 78,  0,  0,  0, 62,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,106,107, 58, 38, 81,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0, 63,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,108,  1, 14,  4, 12,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0, 47, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0, 38, 90,  0,  0,  0,  0,109,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,110, 61,  0,111,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,
+    0,  0,  0,  0,  0,  0, 49, 50,  0,  0,  0,  0,  0,  0, 19, 58,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,112, 51,  0,112, 14, 52,
+   84,  0,  0,  0,113, 41,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   62,  0,  0, 61,  0,  0,  0,  0,  0,  0,114,  0, 90,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0, 61, 62,  0,  0, 62,  0, 89,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,114,  0,  0,  0,  0,115,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 78, 55,  0, 38,  1, 58,
+    1, 58,  0,  0,  0,  0,  0, 88, 62,  0,  0,  0, 63, 89,  0,  0,
+    0,  0,  0, 59,116,  0,  0,  0,  0,  0,  0,  0, 55,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,116,  0,  0,  0,  0, 61,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 79, 78,  0,  0,  0,
+    0,  0,  0,  0,  0, 61,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 56,  0, 89, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0, 61,  0,  0, 79,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 61,
+    0,  0,  0,  0,  0,  0,  0,  0,  8, 92,  0,  0,  0,  0,  0,  0,
+    1, 90,  0,  0,  0,  0,  0,  0,117,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,118,  0,119,120,121,122,  0,105,  4,123, 49, 23,  0,
+    0,  0,  0,  0,  0,  0, 38, 50,  0,  0,  0,  0, 38, 58,  0,  0,
+    0,  0,  0,  0,  1, 90,  1,  1,  1,  1, 39,  1, 48,106, 90,  0,
+    0,  0,  0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0,  0,  0, 59,
+    0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,124,
+    0,  0,  0,  0,  0,  0,  0,113,  0,  0,  0,  0, 19, 59,  0, 38,
+    0, 81,  0,  0,  0,  0,  0,  0,  4,123,  0,  0,  0,  1,125,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,230,230,230,230,230,232,220,220,
+  220,220,232,216,220,220,220,220,220,202,202,220,220,220,220,202,
+  202,220,220,220,  1,  1,  1,  1,  1,220,220,220,220,230,230,230,
+  230,240,230,220,220,220,230,230,230,220,220,  0,230,230,230,220,
+  220,220,220,230,232,220,220,230,233,234,234,233,234,234,233,230,
+    0,  0,  0,230,  0,220,230,230,230,230,220,230,230,230,222,220,
+  230,230,220,220,230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17,
+   18, 19, 19, 20, 21, 22,  0, 23,  0, 24, 25,  0,230,220,  0, 18,
+   30, 31, 32,  0,  0,  0,  0, 27, 28, 29, 30, 31, 32, 33, 34,230,
+  230,220,220,230,220,230,230,220, 35,  0,  0,  0,  0,  0,230,230,
+  230,  0,  0,230,230,  0,220,230,230,220,  0,  0,  0, 36,  0,  0,
+  230,220,230,230,220,220,230,220,220,230,220,230,220,230,230,  0,
+    0,220,  0,  0,230,230,  0,230,  0,230,230,230,230,230,  0,  0,
+    0,220,220,220,230,220,220,220,230,230,  0,220, 27, 28, 29,230,
+    7,  0,  0,  0,  0,  9,  0,  0,  0,230,220,230,230,  0,  0,  0,
+    0,  0,230,  0,  0, 84, 91,  0,  0,  0,  0,  9,  9,  0,  0,  0,
+    0,  0,  9,  0,103,103,  9,  0,107,107,107,107,118,118,  9,  0,
+  122,122,122,122,220,220,  0,  0,  0,220,  0,220,  0,216,  0,  0,
+    0,129,130,  0,132,  0,  0,  0,  0,  0,130,130,130,130,  0,  0,
+  130,  0,230,230,  9,  0,230,230,  0,  0,220,  0,  0,  0,  0,  7,
+    0,  9,  9,  0,  9,  9,  0,  0,  0,230,  0,  0,  0,228,  0,  0,
+    0,222,230,220,220,  0,  0,  0,230,  0,  0,220,230,220,  0,220,
+  230,230,230,234,  0,  0,  9,  9,  0,  0,  7,  0,230,230,230,  0,
   230,  0,  1,  1,  1,  0,  0,  0,230,234,214,220,202,230,230,230,
   230,230,232,228,228,220,218,230,233,220,230,220,230,230,  1,  1,
     1,  1,  1,230,  0,  1,  1,230,220,230,  1,  1,  0,  0,218,228,
@@ -1683,63 +1482,81 @@
     0,  0,  0,  0,  0,  0,  0,  0,  0, 26, 34,  9,  0,  0, 20, 20,
     1, 20, 20,  0,  0,  0,  0,  0,  0,  0, 26, 21,  0,  1,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3, 47, 48,  0,  0,  0,
-    0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,
-   12, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13,
-   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18,
-   18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 20, 20, 20, 20, 20,
-   20, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 20, 33,
-   34, 35, 34, 34, 36, 37, 20, 20, 20, 20, 20, 20, 38, 20, 39, 40,
-   41, 41, 41, 41, 41, 42, 43, 44, 20, 20, 20, 20, 20, 20, 20, 45,
-   46, 20, 20, 47, 20, 20, 20, 48, 49, 50, 51, 52, 53, 54, 55, 56,
-   57, 58, 59, 20, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 60, 13, 13,
-   13, 61, 62, 13, 13, 13, 13, 63, 13, 13, 13, 13, 13, 13, 64, 65,
-   20, 20, 66, 20, 13, 13, 13, 13, 67, 13, 13, 13, 68, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20, 20, 69,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 19,
+    0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,
+    7,  7,  7,  7,  7,  7,  7,  7,  9, 10, 11, 11, 11, 11, 12, 13,
+   13, 13, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 13, 13, 13,
+   24, 25, 26, 26, 26, 27, 13, 13, 13, 28, 29, 30, 13, 31, 32, 33,
+   34, 35, 36, 37,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+    7,  7,  7,  7,  7,  7,  7,  7, 38,  7,  7, 39,  7, 40,  7,  7,
+    7, 41, 13, 42,  7,  7, 43,  7,  7,  7, 44, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 45,  0,  0,  1,  2,  2,  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, 32, 33, 34, 35, 36, 37, 37,
+   37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+   51, 52,  2,  2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59,
+   59, 59, 59, 59, 59, 59, 61, 61, 59, 59, 59, 59, 62, 59, 63, 64,
+   65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 59, 69, 69,
+   69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+   69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+   69, 78, 69, 69, 69, 69, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80,
+   81, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 32, 32,
+   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+   32, 32, 32, 32, 32, 94, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+   95, 95, 95, 95, 95, 95, 95, 95, 69, 69, 96, 97, 98, 99, 99, 99,
+  100,101,102,103,104,105,106,107,108,109, 95,110,111,112,113,114,
+  115,116,117,117,118,119,120,121,122,123,124,125,126,127,128,129,
+  130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,
+   95,146,147,148,149, 95,150,151,152,153,154,155,156,157,158,159,
+  160,161, 95,162,163,164,165,165,165,165,165,165,165,166,167,165,
+  168, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+   95, 95, 95, 95, 95,169,170,170,170,170,170,170,170,170,171,170,
+  170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+  170,170,170,170,170,170,170,170,170,170,170,170,170,172,173,173,
+  173,173,174, 95, 95, 95, 95, 95,175, 95, 95, 95, 95, 95, 95, 95,
+   95, 95, 95, 95, 95, 95,176,176,176,176,177,178,179,180, 95, 95,
+  181, 95,182,183,184,185,186,186,186,186,186,186,186,186,186,186,
+  186,186,186,186,186,186,186,186,186,186,186,186,187,187,187,188,
+  189,190, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+   95, 95, 95, 95, 95,191,192,193,194,195,195,196, 95, 95, 95, 95,
+   95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,197,198,
+   95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 59,199,
+   59, 59, 59,200,201,202, 59,203,204,205,206,207,208, 95,209,210,
+  211, 59, 59,212, 59,213,214,214,214,214,214,215, 95, 95, 95, 95,
+   95, 95, 95, 95,216, 95,217,218,219, 95, 95,220, 95, 95, 95,221,
+   95,222, 95,223, 95,224,225,226,227, 95, 95, 95, 95, 95,228,229,
+  230, 95,231,232, 95, 95,233,234, 59,235,236, 95, 59, 59, 59, 59,
+   59, 59, 59,237, 59,238,239,240, 59, 59,241,242, 59,243, 95, 95,
+   95, 95, 95, 95, 95, 95, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+   69, 69, 69,244, 69, 69,245, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+   69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+   69, 69, 69,246, 69, 69, 69, 69, 69, 69, 69, 69, 69,247, 69, 69,
+   69, 69,248, 95, 95, 95, 69, 69, 69, 69,249, 95, 95, 95, 95, 95,
+   95, 95, 95, 95, 95, 95, 69, 69, 69, 69, 69, 69,250, 69, 69, 69,
+   69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,251, 95,
+   95, 95, 95, 95, 95, 95,252, 95,253,254,  0,  1,  2,  2,  0,  1,
+    2,  2,  2,  3,  4,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0, 19,
    19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
    19,  0,  0,  0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0, 19, 19,
    19, 19, 19, 19, 19,  0, 19,  0,  0,  0,  0,  0,  0,  0, 19, 19,
@@ -1764,46 +1581,46 @@
    64,  2,  2, 64, 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
    90, 90, 90, 90,  2,  2, 90, 90, 90, 90, 90, 90, 90,  2, 95, 95,
    95, 95, 95, 95, 95, 95, 95, 95, 95, 95,  2,  2, 95,  2, 37, 37,
-   37,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  2,  3,  3,
-    2,  2,  2,  2,  2,  3,  3,  3,  0,  3,  3,  3,  3,  3,  7,  7,
-    7,  7,  7,  7,  7,  7,  7,  1,  1,  1,  1,  7,  7,  7,  7,  7,
-    7,  7,  0,  0,  7,  7,  5,  5,  5,  5,  2,  5,  5,  5,  5,  5,
-    5,  5,  5,  2,  2,  5,  5,  2,  2,  5,  5,  5,  5,  5,  5,  5,
-    5,  5,  5,  5,  5,  5,  5,  2,  5,  5,  5,  5,  5,  5,  5,  2,
-    5,  2,  2,  2,  5,  5,  5,  5,  2,  2,  5,  5,  5,  5,  5,  2,
-    2,  5,  5,  5,  5,  2,  2,  2,  2,  2,  2,  2,  2,  5,  2,  2,
-    2,  2,  5,  5,  2,  5,  5,  5,  5,  5,  2,  2,  5,  5,  5,  5,
-    5,  5,  5,  5,  5,  2,  2, 11, 11, 11,  2, 11, 11, 11, 11, 11,
-   11,  2,  2,  2,  2, 11, 11,  2,  2, 11, 11, 11, 11, 11, 11, 11,
-   11, 11, 11, 11, 11, 11, 11,  2, 11, 11, 11, 11, 11, 11, 11,  2,
-   11, 11,  2, 11, 11,  2, 11, 11,  2,  2, 11,  2, 11, 11, 11,  2,
-    2, 11, 11, 11,  2,  2,  2, 11,  2,  2,  2,  2,  2,  2,  2, 11,
-   11, 11, 11,  2, 11,  2,  2,  2,  2,  2,  2,  2, 11, 11, 11, 11,
-   11, 11, 11, 11, 11,  2,  2, 10, 10, 10,  2, 10, 10, 10, 10, 10,
-   10, 10, 10, 10,  2, 10, 10, 10,  2, 10, 10, 10, 10, 10, 10, 10,
-   10, 10, 10, 10, 10, 10, 10,  2, 10, 10, 10, 10, 10, 10, 10,  2,
-   10, 10,  2, 10, 10, 10, 10, 10,  2,  2, 10, 10, 10, 10, 10, 10,
-    2, 10, 10, 10,  2,  2, 10,  2,  2,  2,  2,  2,  2,  2, 10, 10,
-   10, 10,  2,  2, 10, 10, 10, 10,  2,  2,  2,  2,  2,  2,  2, 10,
-   10, 10, 10, 10, 10, 10,  2, 21, 21, 21,  2, 21, 21, 21, 21, 21,
-   21, 21, 21,  2,  2, 21, 21,  2,  2, 21, 21, 21, 21, 21, 21, 21,
-   21, 21, 21, 21, 21, 21, 21,  2, 21, 21, 21, 21, 21, 21, 21,  2,
-   21, 21,  2, 21, 21, 21, 21, 21,  2,  2, 21, 21, 21, 21, 21,  2,
-    2, 21, 21, 21,  2,  2,  2,  2,  2,  2,  2, 21, 21, 21,  2,  2,
-    2,  2, 21, 21,  2, 21, 21, 21, 21, 21,  2,  2, 21, 21,  2,  2,
-   22, 22,  2, 22, 22, 22, 22, 22, 22,  2,  2,  2, 22, 22, 22,  2,
-   22, 22, 22, 22,  2,  2,  2, 22, 22,  2, 22,  2, 22, 22,  2,  2,
-    2, 22, 22,  2,  2,  2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-    2,  2,  2,  2, 22, 22, 22,  2,  2,  2,  2,  2,  2, 22,  2,  2,
-    2,  2,  2,  2, 22, 22, 22, 22, 22,  2,  2,  2,  2,  2, 23, 23,
-   23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,  2, 23, 23, 23,  2,
-   23, 23, 23, 23, 23, 23, 23, 23,  2,  2, 23, 23, 23, 23, 23,  2,
-   23, 23, 23, 23,  2,  2,  2,  2,  2,  2,  2, 23, 23,  2, 23, 23,
-   23,  2,  2, 23,  2,  2, 23, 23, 23, 23,  2,  2, 23, 23,  2,  2,
-    2,  2,  2,  2,  2, 23, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-   16, 16, 16,  2, 16, 16, 16,  2, 16, 16, 16, 16, 16, 16, 16, 16,
-   16, 16,  2, 16, 16, 16, 16, 16,  2,  2, 16, 16, 16, 16, 16,  2,
-   16, 16, 16, 16,  2,  2,  2,  2,  2,  2,  2, 16, 16,  2, 16, 16,
+   37,  2,  2,  2,  2,  2,  3,  3,  2,  2,  2,  2,  2,  3,  3,  3,
+    0,  3,  3,  3,  3,  3,  7,  7,  7,  7,  7,  7,  7,  7,  7,  1,
+    1,  1,  1,  7,  7,  7,  7,  7,  7,  7,  0,  0,  7,  7,  5,  5,
+    5,  5,  2,  5,  5,  5,  5,  5,  5,  5,  5,  2,  2,  5,  5,  2,
+    2,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,
+    5,  5,  5,  5,  5,  5,  5,  2,  5,  2,  2,  2,  5,  5,  5,  5,
+    2,  2,  5,  5,  5,  5,  5,  2,  2,  5,  5,  5,  5,  2,  2,  2,
+    2,  2,  2,  2,  2,  5,  2,  2,  2,  2,  5,  5,  2,  5,  5,  5,
+    5,  5,  2,  2,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,  2, 11,
+   11, 11,  2, 11, 11, 11, 11, 11, 11,  2,  2,  2,  2, 11, 11,  2,
+    2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  2,
+   11, 11, 11, 11, 11, 11, 11,  2, 11, 11,  2, 11, 11,  2, 11, 11,
+    2,  2, 11,  2, 11, 11, 11,  2,  2, 11, 11, 11,  2,  2,  2, 11,
+    2,  2,  2,  2,  2,  2,  2, 11, 11, 11, 11,  2, 11,  2,  2,  2,
+    2,  2,  2,  2, 11, 11, 11, 11, 11, 11, 11, 11, 11,  2,  2, 10,
+   10, 10,  2, 10, 10, 10, 10, 10, 10, 10, 10, 10,  2, 10, 10, 10,
+    2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  2,
+   10, 10, 10, 10, 10, 10, 10,  2, 10, 10,  2, 10, 10, 10, 10, 10,
+    2,  2, 10, 10, 10, 10, 10, 10,  2, 10, 10, 10,  2,  2, 10,  2,
+    2,  2,  2,  2,  2,  2, 10, 10, 10, 10,  2,  2, 10, 10, 10, 10,
+    2,  2,  2,  2,  2,  2,  2, 10, 10, 10, 10, 10, 10, 10,  2, 21,
+   21, 21,  2, 21, 21, 21, 21, 21, 21, 21, 21,  2,  2, 21, 21,  2,
+    2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  2,
+   21, 21, 21, 21, 21, 21, 21,  2, 21, 21,  2, 21, 21, 21, 21, 21,
+    2,  2, 21, 21, 21, 21, 21,  2,  2, 21, 21, 21,  2,  2,  2,  2,
+    2,  2,  2, 21, 21, 21,  2,  2,  2,  2, 21, 21,  2, 21, 21, 21,
+   21, 21,  2,  2, 21, 21,  2,  2, 22, 22,  2, 22, 22, 22, 22, 22,
+   22,  2,  2,  2, 22, 22, 22,  2, 22, 22, 22, 22,  2,  2,  2, 22,
+   22,  2, 22,  2, 22, 22,  2,  2,  2, 22, 22,  2,  2,  2, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22,  2,  2,  2,  2, 22, 22, 22,  2,
+    2,  2,  2,  2,  2, 22,  2,  2,  2,  2,  2,  2, 22, 22, 22, 22,
+   22,  2,  2,  2,  2,  2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+   23, 23, 23,  2, 23, 23, 23,  2, 23, 23, 23, 23, 23, 23, 23, 23,
+    2,  2, 23, 23, 23, 23, 23,  2, 23, 23, 23, 23,  2,  2,  2,  2,
+    2,  2,  2, 23, 23,  2, 23, 23, 23,  2, 23, 23,  2,  2, 23, 23,
+   23, 23,  2,  2, 23, 23,  2,  2,  2,  2,  2,  2,  2, 23, 16, 16,
+   16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,  2, 16, 16, 16,  2,
+   16, 16, 16, 16, 16, 16, 16, 16, 16, 16,  2, 16, 16, 16, 16, 16,
+    2,  2, 16, 16, 16, 16, 16,  2, 16, 16, 16, 16,  2,  2,  2,  2,
+    2,  2,  2, 16, 16,  2,  2,  2,  2,  2, 16, 16, 16,  2, 16, 16,
    16, 16,  2,  2, 16, 16,  2, 16, 16, 16,  2,  2,  2,  2, 20, 20,
    20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,  2, 20, 20, 20,  2,
    20, 20, 20, 20, 20, 20,  2,  2,  2,  2, 20, 20, 20, 20, 20, 20,
@@ -1850,137 +1667,135 @@
    54, 54,  2,  2, 54, 54, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
    91, 91, 91, 91, 91,  2, 91, 91, 91, 91, 91,  2,  2, 91, 91, 91,
     2,  2,  2,  2,  2,  2, 91, 91, 91, 91, 91, 91,  2,  2,  1,  1,
-    1,  1,  1,  1,  1,  2, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
-   62, 62, 62,  2, 62, 62, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93,
-   93, 93, 93, 93, 93, 93, 93, 93, 93, 93,  2,  2,  2,  2,  2,  2,
-    2,  2, 93, 93, 93, 93, 70, 70, 70, 70, 70, 70, 70, 70,  2,  2,
-    2, 70, 70, 70, 70, 70, 70, 70,  2,  2,  2, 70, 70, 70, 73, 73,
-   73, 73, 73, 73, 73, 73,  6,  6,  6,  2,  2,  2,  2,  2,  8,  8,
-    8,  2,  2,  8,  8,  8,  1,  1,  1,  0,  1,  1,  1,  1,  1,  0,
-    1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,
-    0,  0,  1,  0,  0,  0,  1,  1,  0,  2,  2,  2,  2,  2, 19, 19,
-   19, 19, 19, 19,  9,  9,  9,  9,  9,  6, 19, 19, 19, 19, 19, 19,
-   19, 19, 19,  9,  9,  9,  9,  9, 19, 19, 19, 19,  9,  9,  9,  9,
-    9, 19, 19, 19, 19, 19,  6, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-   19, 19, 19, 19, 19,  9,  9,  9,  9,  9,  9,  9,  2,  2,  2,  9,
-    2,  9,  2,  9,  2,  9,  9,  9,  9,  9,  9,  2,  9,  9,  9,  9,
-    9,  9,  2,  2,  9,  9,  9,  9,  9,  9,  2,  9,  9,  9,  2,  2,
-    9,  9,  9,  2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  2,  0,  0,
-    0,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0, 19,
-    2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 19,  0,  0,
-    0,  0,  0,  0,  0,  2, 19, 19, 19, 19, 19,  2,  2,  2,  0,  2,
-    2,  2,  2,  2,  2,  2,  1,  2,  2,  2,  2,  2,  2,  2,  0,  0,
-    0,  0,  0,  0,  9,  0,  0,  0, 19, 19,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 19,  0, 19,  0,  0,  0,  2,  2,  2,  2,  0,  0,
-    2,  2,  2,  2,  2,  2,  0,  0,  0,  2,  2,  2,  2,  2, 27, 27,
-   27, 27, 27, 27, 27, 27,  0,  0,  0,  0,  2,  2,  0,  0,  0,  0,
-    0,  0,  0,  0,  2,  0, 56, 56, 56, 56, 56, 56, 56, 56, 55, 55,
-   55, 55,  2,  2,  2,  2,  2, 55, 55, 55, 55, 55, 55, 55, 61, 61,
-   61, 61, 61, 61, 61, 61,  2,  2,  2,  2,  2,  2,  2, 61, 61,  2,
-    2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  2,  2, 13, 13,
-   13, 13, 13, 13, 13, 13, 13, 13,  2, 13, 13, 13, 13, 13, 13, 13,
-   13, 13,  2,  2,  2,  2, 13, 13, 13, 13, 13, 13,  2,  2,  0,  0,
-    0,  0,  0, 13,  0, 13,  0, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    1,  1,  1,  1, 12, 12, 13, 13, 13, 13,  0,  0,  0,  0,  2, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15,  2,  2,  1,  1,  0,  0, 15, 15, 15,  0, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17,  0,  0, 17, 17, 17,  2,  2,  2,  2,  2, 26, 26, 26, 26, 26,
-   26, 26, 26, 26, 26, 26,  2, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-   12, 12, 12, 12, 12,  2,  2,  2,  2,  2,  2,  2,  2,  0, 12, 12,
-   12, 12, 12, 12, 12,  0, 17, 17, 17, 17, 17, 17, 17,  0, 39, 39,
-   39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,  2,  2,  2, 39, 39,
-   39, 39, 39, 39, 39,  2, 86, 86, 86, 86, 86, 86, 86, 86, 77, 77,
-   77, 77, 77, 77, 77, 77, 77, 77, 77, 77,  2,  2,  2,  2, 79, 79,
-   79, 79, 79, 79, 79, 79,  0,  0, 19, 19, 19, 19, 19, 19,  0,  0,
-    0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  2,  2, 19, 19,
-    2, 19,  2, 19, 19, 19,  2,  2, 19, 19, 19, 19, 19, 19, 60, 60,
-   60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,  2,  2,  2, 65, 65,
-   65, 65, 65, 65, 65, 65, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
-   75, 75, 75, 75,  2,  2,  2,  2,  2,  2,  2,  2, 75, 75, 75, 75,
-    2,  2,  2,  2,  2,  2, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
-   69, 69, 69, 69,  0, 69, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
-   74, 74,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 74, 12, 12,
-   12, 12, 12,  2,  2,  2, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
-   84, 84, 84, 84,  2,  0, 84, 84,  2,  2,  2,  2, 84, 84, 33, 33,
-   33, 33, 33, 33, 33,  2, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
-   68, 68, 68, 68, 68,  2, 68, 68, 68, 68, 68, 68,  2,  2, 68, 68,
-    2,  2, 68, 68, 68, 68, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
-   92,  2,  2,  2,  2,  2,  2,  2,  2, 92, 92, 92, 92, 92, 87, 87,
-   87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,  2,  2, 30,
-   30, 30, 30, 30, 30,  2, 19, 19, 19,  0, 19, 19, 19, 19, 19, 19,
-   19, 19, 19,  9, 19, 19, 19, 19,  0,  0,  2,  2,  2,  2, 87, 87,
-   87, 87, 87, 87,  2,  2, 87, 87,  2,  2,  2,  2,  2,  2, 12, 12,
-   12, 12,  2,  2,  2,  2,  2,  2,  2, 12, 12, 12, 12, 12, 13, 13,
-    2,  2,  2,  2,  2,  2, 19, 19, 19, 19, 19, 19, 19,  2,  2,  2,
-    2,  4,  4,  4,  4,  4,  2,  2,  2,  2,  2, 14, 14, 14, 14, 14,
-   14, 14, 14, 14, 14,  2, 14, 14, 14, 14, 14,  2, 14,  2, 14, 14,
-    2, 14, 14,  2, 14, 14,  3,  3,  3,  2,  2,  2,  2,  2,  2,  2,
-    2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0,  0,  2,  2,
-    3,  3,  3,  3,  3,  3,  2,  2,  2,  2,  2,  2,  2,  3,  1,  1,
-    1,  1,  1,  1,  6,  6,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,
-    0,  0,  2,  2,  2,  2,  3,  3,  3,  3,  3,  2,  3,  3,  3,  3,
-    3,  3,  3,  2,  2,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0,  2,  2,
-   12, 12, 12, 12, 12, 12,  2,  2, 12, 12, 12,  2,  2,  2,  2,  0,
-    0,  0,  0,  0,  2,  2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
-   49, 49,  2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,  2, 49, 49,
-   49,  2, 49, 49,  2, 49, 49, 49, 49, 49, 49, 49,  2,  2, 49, 49,
-   49,  2,  2,  2,  2,  2,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,
-    0,  0,  2,  2,  2,  0,  0,  0,  0,  0,  0,  2,  2,  2,  9,  2,
-    2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  1,  2,  2, 71, 71,
-   71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,  2,  2,  2, 67, 67,
-   67, 67, 67, 67, 67, 67, 67,  2,  2,  2,  2,  2,  2,  2,  1,  0,
-    0,  0,  0,  0,  0,  0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
-   42, 42,  2,  2,  2,  2,  2,  2,  2,  2,  2, 42, 42, 42, 41, 41,
-   41, 41, 41, 41, 41, 41, 41, 41, 41,  2,  2,  2,  2,  2,118,118,
-  118,118,118,118,118,118,118,118,118,  2,  2,  2,  2,  2, 53, 53,
-   53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,  2, 53, 59, 59,
-   59, 59, 59, 59, 59, 59, 59, 59, 59, 59,  2,  2,  2,  2, 59, 59,
-   59, 59, 59, 59,  2,  2, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51,
-   51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
-   50, 50, 50, 50,  2,  2, 50, 50,  2,  2,  2,  2,  2,  2,135,135,
-  135,135,135,135,135,135,135,135,135,135,  2,  2,  2,  2,106,106,
-  106,106,106,106,106,106,104,104,104,104,104,104,104,104,104,104,
-  104,104,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,104,161,161,
-  161,161,161,161,161,161,161,161,161,  2,161,161,161,161,161,161,
-  161,  2,161,161,  2,161,161,161,  2,161,161,161,161,161,161,161,
-    2,161,161,  2,  2,  2,170,170,170,170,170,170,170,170,170,170,
-  170,170,  2,  2,  2,  2,110,110,110,110,110,110,110,110,110,110,
-  110,110,110,110,110,  2,110,110,110,110,110,110,  2,  2, 19, 19,
-   19, 19, 19, 19,  2, 19, 19,  2, 19, 19, 19, 19, 19, 19, 19, 19,
-   19,  2,  2,  2,  2,  2, 47, 47, 47, 47, 47, 47,  2,  2, 47,  2,
-   47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-   47, 47, 47, 47,  2, 47, 47,  2,  2,  2, 47,  2,  2, 47, 81, 81,
-   81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,  2, 81,120,120,
-  120,120,120,120,120,120,116,116,116,116,116,116,116,116,116,116,
-  116,116,116,116,116,  2,  2,  2,  2,  2,  2,  2,  2,116,128,128,
-  128,128,128,128,128,128,128,128,128,  2,128,128,  2,  2,  2,  2,
-    2,128,128,128,128,128, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
-   66, 66,  2,  2,  2, 66, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
-    2,  2,  2,  2,  2, 72, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97,
-   97, 97, 97, 97, 97, 97,  2,  2,  2,  2, 97, 97, 97, 97,  2,  2,
-   97, 97, 97, 97, 97, 97, 57, 57, 57, 57,  2, 57, 57,  2,  2,  2,
-    2,  2, 57, 57, 57, 57, 57, 57, 57, 57,  2, 57, 57, 57,  2, 57,
-   57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
-   57, 57, 57, 57,  2,  2, 57, 57, 57,  2,  2,  2,  2, 57, 57,  2,
-    2,  2,  2,  2,  2,  2, 88, 88, 88, 88, 88, 88, 88, 88,117,117,
-  117,117,117,117,117,117,112,112,112,112,112,112,112,112,112,112,
-  112,112,112,112,112,  2,  2,  2,  2,112,112,112,112,112, 78, 78,
-   78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,  2,  2,  2, 78,
-   78, 78, 78, 78, 78, 78, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
-   83, 83, 83, 83,  2,  2, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
-   82,  2,  2,  2,  2,  2,122,122,122,122,122,122,122,122,122,122,
-    2,  2,  2,  2,  2,  2,  2,122,122,122,122,  2,  2,  2,  2,122,
-  122,122,122,122,122,122, 89, 89, 89, 89, 89, 89, 89, 89, 89,  2,
-    2,  2,  2,  2,  2,  2,130,130,130,130,130,130,130,130,130,130,
-  130,  2,  2,  2,  2,  2,  2,  2,130,130,130,130,130,130,144,144,
-  144,144,144,144,144,144,144,144,  2,  2,  2,  2,  2,  2,165,165,
-  165,165,165,165,165,165,165,165,165,165,165,165,  2,  2,  2,165,
-  165,165,165,165,165,165,  2,  2,  2,  2,  2,  2,165,165,156,156,
+    1,  1,  1,  1,  2,  2,  1,  1,  1,  1,  2,  2,  2,  2, 62, 62,
+   62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,  2, 62, 62, 76, 76,
+   76, 76, 76, 76, 76, 76, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
+   93, 93,  2,  2,  2,  2,  2,  2,  2,  2, 93, 93, 93, 93, 70, 70,
+   70, 70, 70, 70, 70, 70,  2,  2,  2, 70, 70, 70, 70, 70, 70, 70,
+    2,  2,  2, 70, 70, 70, 73, 73, 73, 73, 73, 73, 73, 73,  6,  6,
+    6,  2,  2,  2,  2,  2,  8,  8,  8,  2,  2,  8,  8,  8,  1,  1,
+    1,  0,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  0,
+    0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  1,
+    0,  2,  2,  2,  2,  2, 19, 19, 19, 19, 19, 19,  9,  9,  9,  9,
+    9,  6, 19, 19, 19, 19, 19, 19, 19, 19, 19,  9,  9,  9,  9,  9,
+   19, 19, 19, 19,  9,  9,  9,  9,  9, 19, 19, 19, 19, 19,  6, 19,
+   19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  9,  9,  9,
+    9,  9,  9,  9,  2,  2,  2,  9,  2,  9,  2,  9,  2,  9,  9,  9,
+    9,  9,  9,  2,  9,  9,  9,  9,  9,  9,  2,  2,  9,  9,  9,  9,
+    9,  9,  2,  9,  9,  9,  2,  2,  9,  9,  9,  2,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  2,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,
+    0,  0,  0,  2,  0,  0,  0, 19,  2,  2,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0,  0,  0,  2, 19, 19,
+   19, 19, 19,  2,  2,  2,  0,  0,  2,  2,  2,  2,  2,  2,  1,  2,
+    2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,
+   19, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 19,  0, 19,  0,
+    0,  0,  2,  2,  2,  2,  0,  0,  0,  2,  2,  2,  2,  2, 27, 27,
+   27, 27, 27, 27, 27, 27,  0,  0,  0,  0,  2,  2,  0,  0, 56, 56,
+   56, 56, 56, 56, 56, 56, 55, 55, 55, 55,  2,  2,  2,  2,  2, 55,
+   55, 55, 55, 55, 55, 55, 61, 61, 61, 61, 61, 61, 61, 61,  2,  2,
+    2,  2,  2,  2,  2, 61, 61,  2,  2,  2,  2,  2,  2,  2,  0,  0,
+    0,  0,  0,  0,  2,  2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+    2, 13, 13, 13, 13, 13, 13, 13, 13, 13,  2,  2,  2,  2, 13, 13,
+   13, 13, 13, 13,  2,  2,  0,  0,  0,  0,  0, 13,  0, 13,  0, 13,
+   13, 13, 13, 13, 13, 13, 13, 13,  1,  1,  1,  1, 12, 12, 13, 13,
+   13, 13,  0,  0,  0,  0,  2, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  2,  2,  1,
+    1,  0,  0, 15, 15, 15,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+   17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0, 17, 17, 17,  2,  2,
+    2,  2,  2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,  2, 12,
+   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  2,  2,  2,
+    2,  2,  2,  2,  2,  0, 12, 12, 12, 12, 12, 12, 12,  0, 17, 17,
+   17, 17, 17, 17, 17,  0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+   39, 39, 39,  2,  2,  2, 39, 39, 39, 39, 39, 39, 39,  2, 86, 86,
+   86, 86, 86, 86, 86, 86, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+   77, 77,  2,  2,  2,  2, 79, 79, 79, 79, 79, 79, 79, 79,  0,  0,
+   19, 19, 19, 19, 19, 19,  0,  0,  0, 19, 19, 19, 19, 19,  2, 19,
+   19, 19, 19, 19, 19, 19, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+   60, 60, 60,  2,  2,  2, 65, 65, 65, 65, 65, 65, 65, 65, 75, 75,
+   75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,  2,  2,  2,  2,
+    2,  2,  2,  2, 75, 75, 75, 75,  2,  2,  2,  2,  2,  2, 69, 69,
+   69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,  0, 69, 74, 74,
+   74, 74, 74, 74, 74, 74, 74, 74, 74, 74,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2, 74, 12, 12, 12, 12, 12,  2,  2,  2, 84, 84,
+   84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,  2,  0, 84, 84,
+    2,  2,  2,  2, 84, 84, 33, 33, 33, 33, 33, 33, 33,  2, 68, 68,
+   68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,  2, 68, 68,
+   68, 68, 68, 68,  2,  2, 68, 68,  2,  2, 68, 68, 68, 68, 92, 92,
+   92, 92, 92, 92, 92, 92, 92, 92, 92,  2,  2,  2,  2,  2,  2,  2,
+    2, 92, 92, 92, 92, 92, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+   87, 87, 87, 87, 87,  2,  2, 30, 30, 30, 30, 30, 30,  2, 19, 19,
+   19,  0, 19, 19, 19, 19, 19, 19, 19, 19, 19,  9, 19, 19, 19, 19,
+    0,  0,  2,  2,  2,  2, 87, 87, 87, 87, 87, 87,  2,  2, 87, 87,
+    2,  2,  2,  2,  2,  2, 12, 12, 12, 12,  2,  2,  2,  2,  2,  2,
+    2, 12, 12, 12, 12, 12, 13, 13,  2,  2,  2,  2,  2,  2, 19, 19,
+   19, 19, 19, 19, 19,  2,  2,  2,  2,  4,  4,  4,  4,  4,  2,  2,
+    2,  2,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  2, 14, 14,
+   14, 14, 14,  2, 14,  2, 14, 14,  2, 14, 14,  2, 14, 14,  3,  3,
+    3,  3,  3,  3,  0,  0,  1,  1,  1,  1,  1,  1,  6,  6,  0,  0,
+    0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  3,  3,
+    3,  3,  3,  2,  3,  3,  3,  3,  3,  3,  3,  2,  2,  0,  2,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17, 17, 17, 17,
+   17, 17, 17, 17,  0,  0,  2,  2, 12, 12, 12, 12, 12, 12,  2,  2,
+   12, 12, 12,  2,  2,  2,  2,  0,  0,  0,  0,  0,  2,  2, 49, 49,
+   49, 49, 49, 49, 49, 49, 49, 49, 49, 49,  2, 49, 49, 49, 49, 49,
+   49, 49, 49, 49, 49,  2, 49, 49, 49,  2, 49, 49,  2, 49, 49, 49,
+   49, 49, 49, 49,  2,  2, 49, 49, 49,  2,  2,  2,  2,  2,  0,  0,
+    0,  2,  2,  2,  2,  0,  0,  0,  0,  0,  2,  2,  2,  0,  0,  0,
+    0,  0,  0,  2,  2,  2,  9,  2,  2,  2,  2,  2,  2,  2,  0,  0,
+    0,  0,  0,  1,  2,  2, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+   71, 71, 71,  2,  2,  2, 67, 67, 67, 67, 67, 67, 67, 67, 67,  2,
+    2,  2,  2,  2,  2,  2,  1,  0,  0,  0,  0,  0,  0,  0, 42, 42,
+   42, 42, 42, 42, 42, 42, 42, 42, 42, 42,  2,  2,  2,  2,  2,  2,
+    2,  2,  2, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+   41,  2,  2,  2,  2,  2,118,118,118,118,118,118,118,118,118,118,
+  118,  2,  2,  2,  2,  2, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+   53, 53, 53, 53,  2, 53, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+   59, 59,  2,  2,  2,  2, 59, 59, 59, 59, 59, 59,  2,  2, 40, 40,
+   40, 40, 40, 40, 40, 40, 51, 51, 51, 51, 51, 51, 51, 51, 50, 50,
+   50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,  2,  2, 50, 50,
+    2,  2,  2,  2,  2,  2,135,135,135,135,135,135,135,135,135,135,
+  135,135,  2,  2,  2,  2,106,106,106,106,106,106,106,106,104,104,
+  104,104,104,104,104,104,104,104,104,104,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2,104,161,161,161,161,161,161,161,161,161,161,
+  161,  2,161,161,161,161,161,161,161,  2,161,161,  2,161,161,161,
+    2,161,161,161,161,161,161,161,  2,161,161,  2,  2,  2,170,170,
+  170,170,170,170,170,170,170,170,170,170,  2,  2,  2,  2,110,110,
+  110,110,110,110,110,110,110,110,110,110,110,110,110,  2,110,110,
+  110,110,110,110,  2,  2, 19, 19, 19, 19, 19, 19,  2, 19, 19,  2,
+   19, 19, 19, 19, 19, 19, 19, 19, 19,  2,  2,  2,  2,  2, 47, 47,
+   47, 47, 47, 47,  2,  2, 47,  2, 47, 47, 47, 47, 47, 47, 47, 47,
+   47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,  2, 47, 47,  2,
+    2,  2, 47,  2,  2, 47, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+   81, 81, 81, 81,  2, 81,120,120,120,120,120,120,120,120,116,116,
+  116,116,116,116,116,116,116,116,116,116,116,116,116,  2,  2,  2,
+    2,  2,  2,  2,  2,116,128,128,128,128,128,128,128,128,128,128,
+  128,  2,128,128,  2,  2,  2,  2,  2,128,128,128,128,128, 66, 66,
+   66, 66, 66, 66, 66, 66, 66, 66, 66, 66,  2,  2,  2, 66, 72, 72,
+   72, 72, 72, 72, 72, 72, 72, 72,  2,  2,  2,  2,  2, 72,173,173,
+  173,173,173,173,173,173,173,173,  2,  2,  2,  2,  2,  2, 98, 98,
+   98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97,  2,  2,
+    2,  2, 97, 97, 97, 97,  2,  2, 97, 97, 97, 97, 97, 97, 57, 57,
+   57, 57,  2, 57, 57,  2,  2,  2,  2,  2, 57, 57, 57, 57, 57, 57,
+   57, 57,  2, 57, 57, 57,  2, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+   57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,  2,  2, 57, 57,
+   57,  2,  2,  2,  2, 57, 57,  2,  2,  2,  2,  2,  2,  2, 88, 88,
+   88, 88, 88, 88, 88, 88,117,117,117,117,117,117,117,117,112,112,
+  112,112,112,112,112,112,112,112,112,112,112,112,112,  2,  2,  2,
+    2,112,112,112,112,112, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+   78, 78, 78, 78,  2,  2,  2, 78, 78, 78, 78, 78, 78, 78, 83, 83,
+   83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,  2,  2, 82, 82,
+   82, 82, 82, 82, 82, 82, 82, 82, 82,  2,  2,  2,  2,  2,122,122,
+  122,122,122,122,122,122,122,122,  2,  2,  2,  2,  2,  2,  2,122,
+  122,122,122,  2,  2,  2,  2,122,122,122,122,122,122,122, 89, 89,
+   89, 89, 89, 89, 89, 89, 89,  2,  2,  2,  2,  2,  2,  2,130,130,
+  130,130,130,130,130,130,130,130,130,  2,  2,  2,  2,  2,  2,  2,
+  130,130,130,130,130,130,144,144,144,144,144,144,144,144,144,144,
+    2,  2,  2,  2,  2,  2,165,165,165,165,165,165,165,165,165,165,
+  165,165,165,165,  2,  2,  2,165,165,165,165,165,165,165,  2,  2,
+    2,  2,  2,  2,165,165,  3,  3,  3,  3,  3,  3,  3,  2,156,156,
   156,156,156,156,156,156,156,156,  2,156,156,156,  2,  2,156,156,
-    2,  2,  2,  2,  2,  2,  2,  2,  3,  3,  3,  2,  2,  2,  2,  2,
-    2,  2,  3,  3,  3,  3,147,147,147,147,147,147,147,147,148,148,
+    2,  2,  2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  2,
+    2,  2,  2,  2,  2,  2,147,147,147,147,147,147,147,147,148,148,
   148,148,148,148,148,148,148,148,  2,  2,  2,  2,  2,  2,158,158,
   158,158,158,158,158,158,158,158,  2,  2,  2,  2,  2,  2,153,153,
   153,153,153,153,153,153,153,153,153,153,  2,  2,  2,  2,149,149,
@@ -2039,46 +1854,51 @@
   143,143,143,143,  2,143,143,  2,143,143,143,143,143,143,143,143,
   143,143,143,143,143,143,143,143,143,143,143,143,143,  2,143,143,
     2,143,143,143,143,143,143,  2,  2,  2,  2,  2,  2,  2,143,143,
-    2,  2,  2,  2,  2,  2,145,145,145,145,145,145,145,145,145,  2,
-    2,  2,  2,  2,  2,  2,163,163,163,163,163,163,163,163,163,  2,
-  163,163,163,163,163,163,163,163,163,  2,  2,  2,163,163,163,163,
-  163,  2,  2,  2,  2,  2, 86,  2,  2,  2,  2,  2,  2,  2, 22, 22,
-    2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 22, 63, 63,
-   63, 63, 63, 63, 63, 63, 63, 63,  2,  2,  2,  2,  2,  2, 63, 63,
-   63, 63, 63, 63, 63,  2, 63, 63, 63, 63, 63,  2,  2,  2, 63, 63,
-   63, 63,  2,  2,  2,  2,157,157,157,157,157,157,157,157,157,157,
-  157,  2,  2,  2,  2,  2, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
-   80, 80, 80, 80,  2,  2, 80, 80, 80,  2,  2,  2,  2,  2,127,127,
-  127,127,127,127,127,127,127,127,127,127,127,127,127,  2,166,166,
-  166,166,166,166,166,166,166,166,  2,  2,  2,  2,  2,  2, 79,  2,
-    2,  2,  2,  2,  2,  2,115,115,115,115,115,115,115,115,115,115,
-  115,115,115,115,115,  2,115,115,  2,  2,  2,  2,115,115,159,159,
-  159,159,159,159,159,159,159,159,159,159,159,159,159,  2,159,159,
-    2,  2,  2,  2,  2,  2,103,103,103,103,103,103,103,103,103,103,
-  103,103,103,103,  2,  2,119,119,119,119,119,119,119,119,119,119,
-  119,119,119,119,  2,  2,119,119,  2,119,119,119,119,119,  2,  2,
-    2,  2,  2,119,119,119,167,167,167,167,167,167,167,167,167,167,
-    2,  2,  2,  2,  2,  2,146,146,146,146,146,146,146,146,146,146,
-  146,  2,  2,  2,  2,  2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+    2,  2,  2,  2,  2,  2,175,175,175,175,175,175,175,175,175,175,
+  175,175,  2,  2,  2,  2,175,175,  2,  2,  2,  2,  2,  2,145,145,
+  145,145,145,145,145,145,145,  2,  2,  2,  2,  2,  2,  2,163,163,
+  163,163,163,163,163,163,163,  2,163,163,163,163,163,163,163,163,
+  163,  2,  2,  2,163,163,163,163,163,  2,  2,  2,  2,  2, 86,  2,
+    2,  2,  2,  2,  2,  2, 22, 22,  2,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  2,  2, 22, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+    2,  2,  2,  2,  2,  2, 63, 63, 63, 63, 63, 63, 63,  2, 63, 63,
+   63, 63, 63,  2,  2,  2, 63, 63, 63, 63,  2,  2,  2,  2,157,157,
+  157,157,157,157,157,157,157,157,157,  2,  2,  2,  2,  2, 80, 80,
+   80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,  2,  2, 80, 80,
+   80,  2,  2,  2,  2,  2,127,127,127,127,127,127,127,127,127,127,
+  127,127,127,127,127,  2,166,166,166,166,166,166,166,166,166,166,
+    2,  2,  2,  2,  2,  2, 79,  2,  2,  2,  2,  2,  2,  2,115,115,
+  115,115,115,115,115,115,115,115,115,115,115,115,115,  2,115,115,
+    2,  2,  2,  2,115,115,159,159,159,159,159,159,159,159,159,159,
+  159,159,159,159,159,  2,159,159,  2,  2,  2,  2,  2,  2,103,103,
+  103,103,103,103,103,103,103,103,103,103,103,103,  2,  2,119,119,
+  119,119,119,119,119,119,119,119,119,119,119,119,  2,  2,119,119,
+    2,119,119,119,119,119,  2,  2,  2,  2,  2,119,119,119,167,167,
+  167,167,167,167,167,167,167,167,  2,  2,  2,  2,  2,  2,146,146,
+  146,146,146,146,146,146,146,146,146,  2,  2,  2,  2,  2,172,172,
+  172,172,172,172,172,172,172,  2,  2,172,172,172,172,172,172,172,
+  172,172,  2,  2,  2,  2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
    99,  2,  2,  2,  2, 99,  2,  2,  2,  2,  2,  2,  2, 99,136,139,
-   13, 13,155,  2,  2,  2,136,136,136,136,136,136,136,136,155,155,
-  155,155,155,155,155,155,155,155,155,155,155,155,  2,  2,  2,  2,
-    2,  2,  2,  2,  2,155,136,  2,  2,  2,  2,  2,  2,  2, 17, 17,
+   13, 13,155,  2,  2,  2, 13, 13, 13, 13, 13, 13, 13,  2,136,136,
+  136,136,136,136,136,136,155,155,155,155,155,155,155,155,155,155,
+  155,155,155,155,  2,  2,  2,  2,  2,  2,  2,  2,  2,155,136,136,
+  136,136,136,136,136,  2,136,136,136,  2,  2,  2,  2,  2, 17, 17,
    17, 17,  2, 17, 17, 17, 17, 17, 17, 17,  2, 17, 17,  2, 17, 15,
    15, 15, 15, 15, 15, 15, 17, 17, 17,  2,  2,  2,  2,  2,  2,  2,
    15,  2,  2,  2,  2,  2, 15, 15, 15,  2,  2, 17,  2,  2,  2,  2,
     2,  2, 17, 17, 17, 17,139,139,139,139,139,139,139,139,139,139,
   139,139,  2,  2,  2,  2,105,105,105,105,105,105,105,105,105,105,
   105,  2,  2,  2,  2,  2,105,105,105,105,105,  2,  2,  2,105,  2,
-    2,  2,  2,  2,  2,  2,105,105,  2,  2,105,105,105,105,  1,  1,
-    1,  1,  1,  1,  2,  2,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,
+    2,  2,  2,  2,  2,  2,105,105,  2,  2,105,105,105,105,  2,  2,
+    0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  2,  2,  1,  1,
+    1,  1,  1,  1,  1,  2,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,
     1,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,
     1,  1,  1,  1,  0,  0,  2,  2,  0,  2,  2,  0,  0,  2,  2,  0,
     0,  0,  0,  2,  0,  0,  0,  0,  2,  0,  2,  0,  0,  0,  0,  0,
-    0,  0,  2,  0,  0,  0,  0,  0,  0,  2,  2,  0,  0,  0,  0,  0,
-    2,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  2,  0,  2,  2,  2,
-    0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,  0,131,131,
+    0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,
+    0,  2,  2,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  2,  0,  0,
+    0,  0,  0,  2,  0,  2,  0,  2,  0,  0,  0,  0,  0,  0,131,131,
   131,131,131,131,131,131,131,131,131,131,  2,  2,  2,  2,  2,  2,
     2,131,131,131,131,131,  2,131,131,131,131,131,131,131,  2,  2,
     2,  2,  2, 19, 19, 19, 56, 56, 56, 56, 56, 56, 56,  2, 56,  2,
@@ -2090,7 +1910,9 @@
   160,160,160,160,160,  2,152,152,152,152,152,152,152,152,152,152,
     2,  2,  2,  2,  2,152,164,164,164,164,164,164,164,164,164,164,
     2,  2,  2,  2,  2,  2,168,168,168,168,168,168,168,168,168,168,
-  168,  2,  2,  2,  2,168, 30, 30, 30, 30,  2, 30, 30,  2,113,113,
+  168,  2,  2,  2,  2,168,174,174,174,174,174,174,174,174,174,174,
+  174,174,174,174,174,  2,174,174,174,174,174,174,  2,  2,  2,  2,
+    2,  2,  2,  2,174,174, 30, 30, 30, 30,  2, 30, 30,  2,113,113,
   113,113,113,113,113,113,113,113,113,113,113,  2,  2,113,113,113,
   113,113,113,113,113,  2,132,132,132,132,132,132,132,132,132,132,
   132,132,  2,  2,  2,  2,132,132,  2,  2,  2,  2,132,132,  3,  3,
@@ -2101,8 +1923,8 @@
     3,  3,  3,  2,  3,  2,  3,  3,  2,  3,  3,  3,  3,  3,  3,  3,
     3,  3,  2,  2,  2,  2,  2,  3,  3,  3,  2,  3,  3,  3,  3,  3,
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0, 15,  0,
-    0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  2,  2,
-    2,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  2,  0,  0,  0,
+    0,  2,  2,  2,  2,  2,  0,  2,  2,  2,  0,  0,  0,  0,  0,  0,
+    0,  2,  2,  2,  0,  0,  0,  2,  2,  2,  2,  0,  0,  0,  0,  0,
     0,  0,  0,  2,  2,  0, 13,  2,  2,  2,  2,  2,  2,  2, 13, 13,
    13,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  0,  1,
     2,  3,  4,  5,  6,  7,  8,  9,  9,  9,  9, 10,  9, 11, 12, 13,
@@ -2186,8 +2008,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,  1,  2,  3,  4,
 };
-static const uint16_t
-_hb_ucd_u16[10400] =
+static const uint16_t _hb_ucd_u16[10832]=
 {
      0,   0,   1,   2,   3,   4,   5,   6,   0,   0,   7,   8,   9,  10,  11,  12,
     13,  13,  13,  14,  15,  13,  13,  16,  17,  18,  19,  20,  21,  22,  13,  23,
@@ -2210,27 +2031,29 @@
     48,  48,  48,  48, 168, 169,  48,  48, 168,  48,  48, 170, 171, 172,  48,  48,
     48, 171,  48,  48,  48, 173, 174, 175,  48, 176,   9,   9,   9,   9,   9, 177,
    178,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48, 179,  48, 180, 181,  48,  48,  48,  48, 182, 183,
     48, 184,  48, 185,  48, 186, 187, 188,  48,  48,  48, 189, 190, 191, 192, 193,
    194, 192,  48,  48, 195,  48,  48, 196, 197,  48, 198,  48,  48,  48,  48, 199,
     48, 200, 201, 202, 203,  48, 204, 205,  48,  48, 206,  48, 207, 208, 209, 209,
-    48, 210,  48,  48,  48, 211, 212, 213, 192, 192, 214, 215, 216, 140, 140, 140,
-   217,  48,  48, 218, 219, 160, 220, 221, 222,  48, 223,  64,  48,  48, 224, 225,
-    48,  48, 226, 227, 228,  64,  48, 229, 230,   9,   9, 231, 232, 233, 234, 235,
-    11,  11, 236,  27,  27,  27, 237, 238,  11, 239,  27,  27,  32,  32,  32,  32,
-    13,  13,  13,  13,  13,  13,  13,  13,  13, 240,  13,  13,  13,  13,  13,  13,
-   241, 242, 241, 241, 242, 243, 241, 244, 245, 245, 245, 246, 247, 248, 249, 250,
-   251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 261, 262, 263, 264, 265,
-   266, 267, 268, 269, 270, 271, 272, 272, 273, 274, 275, 209, 276, 277, 209, 278,
-   279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
-   280, 209, 281, 209, 209, 209, 209, 282, 209, 283, 279, 284, 209, 285, 286, 209,
-   209, 209, 176, 140, 287, 140, 271, 271, 271, 288, 209, 209, 209, 209, 289, 271,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 290, 291, 209, 209, 292,
-   209, 209, 209, 209, 209, 209, 293, 209, 209, 209, 209, 209, 209, 209, 209, 209,
-   209, 209, 209, 209, 209, 209, 294, 295, 271, 296, 209, 209, 297, 279, 298, 279,
+    48, 210,  48,  48,  48, 211, 212, 213, 192, 192, 214, 215,  32, 216, 217, 140,
+   218,  48,  48, 219, 220, 160, 221, 222, 223,  48, 224,  64,  48,  48, 225, 226,
+    48,  48, 227, 228, 229,  64,  48, 230, 231,   9,   9, 232, 233, 234, 235, 236,
+    11,  11, 237,  27,  27,  27, 238, 239,  11, 240,  27,  27,  32,  32,  32,  32,
+    13,  13,  13,  13,  13,  13,  13,  13,  13, 241,  13,  13,  13,  13,  13,  13,
+   242, 243, 242, 242, 243, 244, 242, 245, 246, 246, 246, 247, 248, 249, 250, 251,
+   252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 262, 263, 264, 265, 266,
+   267, 268, 269, 270, 271, 272, 273, 273, 274, 275, 276, 209, 277, 278, 209, 279,
+   280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
+   281, 209, 282, 209, 209, 209, 209, 283, 209, 284, 280, 285, 209, 286, 287, 209,
+   209, 209, 176, 140, 288, 140, 272, 272, 272, 289, 209, 209, 209, 209, 290, 272,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 291, 292, 209, 209, 293,
+   209, 209, 209, 209, 209, 209, 294, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+   209, 209, 209, 209, 209, 209, 295, 296, 272, 297, 209, 209, 298, 280, 299, 280,
    209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
-   279, 279, 279, 279, 279, 279, 279, 279, 299, 300, 279, 279, 279, 301, 279, 302,
-   209, 209, 209, 279, 303, 209, 209, 304, 209, 305, 209, 209, 209, 209, 209, 209,
+   280, 280, 280, 280, 280, 280, 280, 280, 300, 301, 280, 280, 280, 302, 280, 303,
+   280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
+   209, 209, 209, 280, 304, 209, 209, 305, 209, 209, 209, 209, 209, 209, 209, 209,
      9,   9,   9,  11,  11,  11, 306, 307,  13,  13,  13,  13,  13,  13, 308, 309,
     11,  11, 310,  48,  48,  48, 311, 312,  48, 313, 314, 314, 314, 314,  32,  32,
    315, 316, 317, 318, 319, 320, 140, 140, 209, 321, 209, 209, 209, 209, 209, 322,
@@ -2238,226 +2061,201 @@
    324, 325, 326, 327, 136,  48,  48,  48,  48, 328, 178,  48,  48,  48,  48, 329,
    330,  48,  48, 136,  48,  48,  48,  48, 200, 331,  48,  48, 209, 209, 332,  48,
    209, 333, 334, 209, 335, 336, 209, 209, 334, 209, 209, 336, 209, 209, 209, 209,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 209, 209, 209, 209,
     48, 337,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48,  48,  48, 151, 209, 209, 209, 338,  48,  48, 229,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+    48,  48,  48,  48,  48,  48,  48,  48, 151, 209, 209, 209, 338,  48,  48, 230,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
    339,  48, 340, 140,  13,  13, 341, 342,  13, 343,  48,  48,  48,  48, 344, 345,
     31, 346, 347, 348,  13,  13,  13, 349, 350, 351, 352, 353, 354, 355, 140, 356,
    357,  48, 358, 359,  48,  48,  48, 360, 361,  48,  48, 362, 363, 192,  32, 364,
     64,  48, 365,  48, 366, 367,  48, 151,  76,  48,  48, 368, 369, 370, 371, 372,
     48,  48, 373, 374, 375, 376,  48, 377,  48,  48,  48, 378, 379, 380, 381, 382,
    383, 384, 314,  11,  11, 385, 386,  11,  11,  11,  11,  11,  48,  48, 387, 192,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 388,  48, 389,  48,  48, 206,
    390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390,
+   390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390,
+   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391,
+   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391,
    391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48, 204,  48,  48,  48,  48,  48,  48, 207, 140, 140,
    392, 393, 394, 395, 396,  48,  48,  48,  48,  48,  48, 397, 398, 399,  48,  48,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48, 400, 209,  48,  48,  48,  48, 401,  48,  48, 402, 140, 140, 403,
     32, 404,  32, 405, 406, 407, 408, 409,  48,  48,  48,  48,  48,  48,  48, 410,
    411,   2,   3,   4,   5, 412, 413, 414,  48, 415,  48, 200, 416, 417, 418, 419,
    420,  48, 172, 421, 204, 204, 140, 140,  48,  48,  48,  48,  48,  48,  48,  71,
-   422, 271, 271, 423, 272, 272, 272, 424, 425, 426, 427, 140, 140, 209, 209, 428,
+   422, 272, 272, 423, 273, 273, 273, 424, 425, 426, 427, 140, 140, 209, 209, 428,
    140, 140, 140, 140, 140, 140, 140, 140,  48, 151,  48,  48,  48, 100, 429, 430,
     48,  48, 431,  48, 432,  48,  48, 433,  48, 434,  48,  48, 435, 436, 140, 140,
      9,   9, 437,  11,  11,  48,  48,  48,  48, 204, 192,   9,   9, 438,  11, 439,
     48,  48, 440,  48,  48,  48, 441, 442, 442, 443, 444, 445,  48,  48,  48, 388,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48, 313,  48, 199, 440, 140, 446,  27,  27, 447, 140, 140, 140, 140,
    448,  48,  48, 449,  48, 450,  48, 451,  48, 200, 452, 140, 140, 140,  48, 453,
-    48, 454,  48, 455, 140, 140, 140, 140,  48,  48,  48, 456, 271, 457, 271, 271,
+    48, 454,  48, 455,  48, 207, 140, 140,  48,  48,  48, 456, 272, 457, 272, 272,
    458, 459,  48, 460, 461, 462,  48, 463,  48, 464, 140, 140, 465,  48, 466, 467,
     48,  48,  48, 468,  48, 469,  48, 470,  48, 471, 472, 140, 140, 140, 140, 140,
     48,  48,  48,  48, 196, 140, 140, 140,   9,   9,   9, 473,  11,  11,  11, 474,
     48,  48, 475, 192, 476,   9, 477,  11, 478, 140, 140, 140, 140, 140, 140, 140,
-   140, 140, 140, 140, 140, 140, 271, 479,  48,  48, 480, 481, 482, 140, 140, 483,
-    48, 464, 484,  48,  62, 485, 140,  48, 486, 140, 140,  48, 487, 140,  48, 313,
-   488,  48,  48, 489, 490, 457, 491, 492, 222,  48,  48, 493, 494,  48, 196, 192,
-   495,  48, 496, 497, 498,  48,  48, 499, 222,  48,  48, 500, 501, 502, 503, 504,
-    48,  97, 505, 506, 507, 140, 140, 140, 508, 509, 510,  48,  48, 511, 512, 192,
-   513,  83,  84, 514, 515, 516, 517, 518, 519,  48,  48, 520, 521, 522, 523, 140,
-    48,  48,  48, 524, 525, 526, 481, 140,  48,  48,  48, 527, 528, 192, 140, 140,
-   140, 140, 140, 140, 140, 140, 140, 140,  48,  48, 529, 530, 531, 532, 140, 140,
-    48,  48,  48, 533, 534, 192, 535, 140,  48,  48, 536, 537, 192, 538, 539, 140,
-    48, 540, 541, 542, 313, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    48,  48, 505, 543, 140, 140, 140, 140, 140, 140,   9,   9,  11,  11, 148, 544,
-   545, 546,  48, 547, 548, 192, 140, 140, 140, 140, 549,  48,  48, 550, 551, 140,
-   552,  48,  48, 553, 554, 555,  48,  48, 556, 557, 558,  48,  48,  48,  48, 196,
-   559, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48,  48, 560, 192,
-    84,  48, 529, 561, 562, 148, 175, 563,  48, 564, 565, 566, 140, 140, 140, 140,
-   567,  48,  48, 568, 569, 192, 570,  48, 571, 572, 192, 140, 140, 140, 140, 140,
-   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 573,
-   574, 115,  48, 575, 576, 577, 140, 140, 140, 140, 140, 100, 271, 578, 579, 580,
+   140, 140, 140, 140, 140, 140, 272, 479,  48,  48, 480, 481, 482, 483, 140, 484,
+    48, 464, 485,  48,  62, 486, 140,  48, 487, 140, 140,  48, 488, 140,  48, 313,
+   489,  48,  48, 490, 491, 457, 492, 493, 223,  48,  48, 494, 495,  48, 196, 192,
+   496,  48, 497, 498, 499,  48,  48, 500, 223,  48,  48, 501, 502, 503, 504, 505,
+    48,  97, 506, 507, 508, 140, 140, 140, 509, 510, 511,  48,  48, 512, 513, 192,
+   514,  83,  84, 515, 516, 517, 518, 519, 520,  48,  48, 521, 522, 523, 524, 140,
+    48,  48,  48, 525, 526, 527, 481, 140,  48,  48,  48, 528, 529, 192, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140,  48,  48, 530, 531, 532, 533, 140, 140,
+    48,  48,  48, 534, 535, 192, 536, 140,  48,  48, 537, 538, 192, 539, 540, 140,
+    48, 541, 542, 543, 313, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    48,  48, 506, 544, 140, 140, 140, 140, 140, 140,   9,   9,  11,  11, 148, 545,
+   546, 547,  48, 548, 549, 192, 140, 140, 140, 140, 550,  48,  48, 551, 552, 140,
+   553,  48,  48, 554, 555, 556,  48,  48, 557, 558, 559,  48,  48,  48,  48, 196,
+   560, 140, 140, 140, 140, 140, 561, 140, 140, 140, 140, 140,  48,  48, 562, 192,
+    84,  48, 530, 563, 564, 148, 175, 565,  48, 566, 567, 568, 140, 140, 140, 140,
+   569,  48,  48, 570, 571, 192, 572,  48, 573, 574, 192,  48,  48, 575, 192, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 576,
+   577, 115,  48, 578, 579, 580, 140, 140, 140, 140, 140, 100, 272, 581, 582, 583,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48, 207, 140, 140, 140, 140, 140, 140,
-   272, 272, 272, 272, 272, 272, 581, 582,  48,  48,  48,  48,  48,  48,  48,  48,
+   273, 273, 273, 273, 273, 273, 584, 585,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48, 388, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-   140, 140, 140, 140, 140, 140, 140, 140, 140,  48,  48,  48,  48,  48,  48, 583,
-    48,  48,  48, 584, 585, 586,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140,  48,  48,  48,  48,  48,  48, 586,
+    48,  48,  48, 587, 588, 589,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  71,
     48,  48,  48,  48, 313, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    48, 587, 588, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    48,  48,  48, 196,  48, 200, 370,  48,  48,  48,  48, 200, 192,  48, 204, 589,
-    48,  48,  48, 590, 591, 592, 593, 594,  48, 140, 140, 140, 140, 140, 140, 140,
-   140, 140, 140, 140, 595,  48, 596, 192, 140, 140, 140, 140, 140, 140, 140, 140,
-   140, 140, 140, 140,   9,   9,  11,  11, 271, 597, 140, 140, 140, 140, 140, 140,
-    48,  48,  48,  48, 598, 599, 600, 600, 601, 602, 140, 140, 140, 140, 603, 604,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 440,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 199, 140, 605,
-   196, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 606,
-    48,  48, 607, 608, 140, 609, 610,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    48, 590, 591, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    48,  48,  48, 196,  48, 200, 370,  48,  48,  48,  48, 200, 192,  48, 204, 592,
+    48,  48,  48, 593, 594, 595, 596, 597,  48, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 598,  48, 599, 192, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140,   9,   9,  11,  11, 272, 600,   9, 601,  11, 602, 140, 140,
+    48,  48,  48,  48, 603, 604, 605, 605, 606, 607, 140, 140, 140, 140, 608, 609,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 199, 140, 610,
+    48, 200, 140, 140, 140, 140, 140, 140,  48,  48,  48,  48,  48,  48,  48, 611,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 612,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+    48,  48, 611, 613, 140, 614, 615,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 206,
-    48,  48,  48,  48,  48,  48,  71, 151, 196, 611, 612, 140, 140, 140, 140, 140,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 192,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 322, 140, 140, 140, 140,
-    32,  32, 613,  32, 614, 209, 209, 209, 209, 209, 209, 209, 322, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    48,  48,  48,  48,  48,  48,  71, 151, 196, 616, 617, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 618,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 619, 209, 427, 209, 620,
+    32,  32, 216,  32, 621, 209, 209, 209, 209, 209, 209, 209, 322, 140, 140, 140,
    209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 323,
-   209, 209, 615, 209, 209, 209, 616, 617, 618, 209, 619, 209, 209, 209, 287, 140,
-   209, 209, 209, 209, 620, 140, 140, 140, 140, 140, 140, 140, 271, 621, 271, 621,
-   209, 209, 209, 209, 209, 338, 271, 461, 140, 140, 140, 140, 140, 140, 140, 140,
-     9, 622,  11, 623, 624, 625, 241,   9, 626, 627, 628, 629, 630,   9, 622,  11,
-   631, 632,  11, 633, 634, 635, 636,   9, 637,  11,   9, 622,  11, 623, 624,  11,
-   241,   9, 626, 636,   9, 637,  11,   9, 622,  11, 638,   9, 639, 640, 641, 642,
-    11, 643,   9, 644, 645, 646, 647,  11, 648,   9, 649,  11, 650, 538, 538, 538,
-    32,  32,  32, 651,  32,  32, 652, 653, 654, 655,  45, 140, 140, 140, 140, 140,
-   656, 657, 658, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-   659, 660, 661,  27,  27,  27, 662, 140, 663, 140, 140, 140, 140, 140, 140, 140,
-    48,  48, 151, 664, 665, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-   140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 666, 140,  48,  48, 667, 668,
-   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 669, 192,
-   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 587, 670,
-   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 671, 200,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 672, 614, 140, 140,
-     9,   9, 626,  11, 673, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-   140, 140, 140, 140, 140, 140, 140, 503, 271, 271, 674, 675, 140, 140, 140, 140,
-   503, 271, 676, 677, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-   678,  48, 679, 680, 681, 682, 683, 684, 685, 206, 686, 206, 140, 140, 140, 687,
-   209, 209, 688, 209, 209, 209, 209, 209, 209, 322, 333, 689, 689, 689, 209, 323,
-   690, 209, 209, 209, 209, 209, 209, 209, 209, 209, 691, 140, 140, 140, 692, 209,
-   693, 209, 209, 688, 694, 695, 323, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 696,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 697, 426, 426,
-   209, 209, 209, 209, 209, 209, 209, 698, 209, 209, 209, 209, 209, 176, 688, 427,
-   688, 209, 209, 209, 699, 176, 209, 209, 699, 209, 691, 688, 695, 140, 140, 140,
-   209, 209, 209, 209, 209, 322, 691, 426, 700, 209, 209, 209, 701, 702, 176, 694,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 703, 209, 209, 209, 209, 209, 192,
+   209, 209, 622, 209, 209, 209, 623, 624, 625, 209, 626, 209, 209, 209, 288, 140,
+   209, 209, 209, 209, 627, 140, 140, 140, 140, 140, 140, 140, 272, 628, 272, 628,
+   209, 209, 209, 209, 209, 338, 272, 461, 140, 140, 140, 140, 140, 140, 140, 140,
+     9, 629,  11, 630, 631, 632, 242,   9, 633, 634, 635, 636, 637,   9, 629,  11,
+   638, 639,  11, 640, 641, 642, 643,   9, 644,  11,   9, 629,  11, 630, 631,  11,
+   242,   9, 633, 643,   9, 644,  11,   9, 629,  11, 645,   9, 646, 647, 648, 649,
+    11, 650,   9, 651, 652, 653, 654,  11, 655,   9, 656,  11, 657, 539, 539, 539,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+    32,  32,  32, 658,  32,  32, 659, 660, 661, 662,  45, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   663, 664, 665, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   666, 667, 668,  27,  27,  27, 669, 140, 670, 140, 140, 140, 140, 140, 140, 140,
+    48,  48, 151, 671, 672, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 673, 140,  48,  48, 674, 675,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 676, 192,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 590, 677,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 200, 678, 679,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 680, 200,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 681, 621, 140, 140,
+     9,   9, 633,  11, 682, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 504, 272, 272, 683, 684, 140, 140, 140, 140,
+   504, 272, 685, 686, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   687,  48, 688, 689, 690, 691, 692, 693, 694, 206, 695, 206, 140, 140, 140, 696,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   209, 209, 697, 209, 209, 209, 209, 209, 209, 322, 333, 698, 698, 698, 209, 323,
+   699, 209, 209, 209, 209, 209, 209, 209, 209, 209, 700, 140, 140, 140, 701, 209,
+   702, 209, 209, 697, 703, 704, 323, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 705,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 706, 426, 426,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 176, 697, 427,
+   697, 209, 209, 209, 707, 176, 209, 209, 707, 209, 700, 697, 704, 708, 140, 140,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+   209, 209, 209, 209, 209, 707, 700, 426, 709, 209, 209, 209, 710, 711, 712, 703,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 713, 209, 209, 209, 209, 209, 714,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 140, 140,
-    48,  48,  48, 207,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48, 204,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 481,  48,  48,  48,  48,  48,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 204,  48,  48,  48,  48,  48,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 100,  48,
     48,  48,  48,  48,  48, 204, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
     48, 204, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  71,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 140, 140, 140, 140, 140,
-   704, 140, 584, 584, 584, 584, 584, 584, 140, 140, 140, 140, 140, 140, 140, 140,
-    32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 140,
-   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 705,
-   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 706,
-     0,   1,   2,   3,   4,   4,   4,   4,   4,   4,   5,   6,   7,   8,   9,  10,
-    11,  11,  12,  11,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,
-    25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,
-    41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,
-    57,  57,  58,  59,  60,  60,  60,  60,  61,  62,  63,  64,  65,  66,  67,  68,
-    69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  70,  71,  72,  73,  74,  75,
-    76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,
-    92,  93,  94,  95,  96,  97,  98,   7,   4,   4,   4,   4,  99, 100, 101, 102,
-   103, 104, 105, 106, 107, 108, 109,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-   110, 111,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-   112, 112, 112, 112,   0,   0,   0,   0,   0,   0,   0,   0,   0, 113, 114,   0,
-   115, 116, 117, 118, 119, 120, 121, 122,   0, 123, 124, 125, 126, 126, 126, 127,
-   128, 129, 130, 131, 132,  60, 133, 134, 135, 136,   0, 137, 138, 139,   0,   0,
-   126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-   126, 126, 126, 126, 126, 126, 126,   0, 126, 126, 126, 126, 126, 126, 126, 126,
+    48,  48,  48,  48,  48,  48,  48, 207, 140, 140, 140, 140, 140, 140, 140, 140,
    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-   140, 140, 141, 142, 143, 143, 143, 143, 144,  11, 145, 146, 147,   4, 148, 149,
-   150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165,
-    60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,
-    60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60,  60, 166, 167,
-   168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-   168, 168, 168, 168, 126, 126, 126, 126, 126, 169, 126, 170, 171, 172,  19, 173,
-    19,  19,  19,  19, 174,  19, 175, 176, 177, 178,  19, 179, 180, 181, 182, 183,
-   184, 185, 186, 187, 188, 189, 190, 191, 168, 168, 192, 193, 194, 195, 196, 197,
-   198, 199, 200, 201, 202, 203, 204, 205, 206, 206, 206, 206, 207, 208, 209, 168,
-   210, 211, 212, 213, 214, 168, 215, 216, 217, 218, 219, 220, 221, 222, 223, 168,
-   224, 225, 226, 227, 228, 229, 230, 168, 168, 231, 232, 233, 234, 235, 236, 237,
-   238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253,
-   254, 255, 256, 257, 168, 168, 258, 259, 260, 261, 262, 263, 264, 265, 168, 168,
-   266, 168, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 168, 168, 278,
-   279, 280, 281, 168, 282, 283, 284, 168, 168, 168, 168, 285, 286, 287, 288, 289,
-   290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 291, 168,
-   290, 292, 290, 290, 290, 293, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-   168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 294, 295,
-   296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296,
-   296, 297, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296,
-   296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 298,
-   299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 168, 168, 168, 168, 168, 168,
-   168, 168, 168, 168, 301, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-   302, 302, 302, 302, 302, 302, 302, 302, 303, 304, 305, 306, 307, 308, 309, 168,
-   168, 168, 168, 168, 168, 310, 168, 168, 168, 311, 312, 168, 313, 314, 315, 316,
-   317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
-   317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 318,
-   317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 319, 319, 319, 319,
-   319, 319, 319, 320, 321, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-   168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 322,
-   323, 324, 324, 324, 325, 326, 327, 327, 327, 327, 327, 328, 168, 168, 168, 168,
-   329, 330, 331, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-     0,   0,   0, 332,   0,   0,   0,   0,   0,   0, 333, 168, 334, 335,   0, 336,
-     0,   0,   0, 337, 338, 339, 340, 341, 189, 342, 168, 343,   0, 344, 168, 168,
-     0, 345, 346, 347, 348, 349,   0,   0,   0,   0, 350,   0,   0,   0,   0, 351,
-   352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 353, 168, 168, 168, 168, 168,
-   168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 354, 168, 168, 168,
-   355, 356, 357, 168, 358, 359, 168, 168, 168, 168, 360, 361, 168, 168, 168, 168,
-   168, 168, 168, 362, 168, 168, 168, 363, 168, 168, 168, 168, 168, 168, 168, 364,
-   365, 365, 365, 366, 367, 368, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-   168, 369, 370, 168, 371, 168, 168, 168, 372, 373, 374, 375, 168, 168, 168, 168,
-   376,   0, 377, 378,   0,   0, 379, 380, 381, 382, 168, 168,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 383,   0, 384,   0, 385,
-   386, 387, 388, 389,   0,   0,   0,   0,   0, 390, 391, 392,   0,   0, 393, 332,
-   126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 394, 126, 126, 126, 126,
-   126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 395, 126, 126, 126,
-   396, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-   126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 397, 126, 126, 126, 126, 126,
-   126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 398,
-   126, 126, 126, 126, 126, 126, 126, 126, 126, 399, 168, 168, 168, 168, 168, 168,
-   126, 126, 126, 126, 126, 126, 126, 126, 399, 168, 168, 168, 168, 168, 168, 168,
-   126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 400, 126, 126,
-   126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 401, 168,
-   402,   0, 168, 168,   7,   7,   7, 403,   0,   1,   2,   3,   4,   4,   4,   4,
+   715, 140, 587, 587, 587, 587, 587, 587, 140, 140, 140, 140, 140, 140, 140, 140,
+    32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 140,
+   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391,
+   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 716,
+   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391,
+   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 717,
      0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   2,   3,   1,   2,   2,   3,
      0,   0,   0,   0,   0,   4,   0,   4,   2,   2,   5,   2,   2,   2,   5,   2,
-     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   6,
-     0,   0,   0,   0,   7,   8,   0,   0,   9,   9,   9,   9,   9,   9,   9,   9,
-     9,   9,   9,   9,   9,   9,  10,  11,  12,  13,  14,  14,  15,  14,  14,  14,
-    14,  14,  14,  14,  16,  17,  14,  14,  18,  18,  18,  18,  18,  18,  18,  18,
-    19,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  20,  21,
-    21,  21,  22,  20,  21,  21,  21,  21,  21,  23,  24,  25,  25,  25,  25,  25,
-    25,  26,  25,  25,  25,  27,  28,  26,  29,  30,  31,  32,  31,  31,  31,  31,
-    33,  34,  35,  31,  31,  31,  36,  31,  31,  31,  31,  31,  31,  31,  31,  31,
-    31,  31,  31,  29,  31,  31,  31,  31,  37,  38,  37,  37,  37,  37,  37,  37,
-    37,  39,  31,  31,  31,  31,  31,  31,  40,  40,  40,  40,  40,  40,  41,  26,
-    42,  42,  42,  42,  42,  42,  42,  43,  44,  44,  44,  44,  44,  45,  44,  46,
-    47,  47,  47,  48,  37,  49,  31,  31,  31,  50,  51,  31,  31,  31,  31,  31,
-    31,  31,  31,  31,  52,  31,  31,  31,  53,  53,  53,  53,  53,  53,  53,  53,
-    53,  53,  54,  53,  55,  53,  53,  53,  56,  57,  58,  59,  59,  60,  61,  62,
-    57,  63,  64,  65,  66,  59,  59,  67,  68,  69,  70,  71,  71,  72,  73,  74,
-    69,  75,  76,  77,  78,  71,  79,  26,  80,  81,  82,  83,  83,  84,  85,  86,
-    81,  87,  88,  26,  89,  83,  90,  91,  92,  93,  94,  95,  95,  96,  97,  98,
-    93,  99, 100, 101, 102,  95,  95,  26, 103, 104, 105, 106, 107, 104, 108, 109,
-   104, 105, 110,  26, 111, 108, 108, 112, 113, 114, 115, 113, 113, 115, 113, 116,
-   114, 117, 118, 119, 120, 113, 121, 113, 122, 123, 124, 122, 122, 124, 125, 126,
-   123, 127, 128, 128, 129, 122, 130,  26, 131, 132, 133, 131, 131, 131, 131, 131,
-   132, 133, 134, 131, 135, 131, 131, 131, 136, 137, 138, 139, 137, 137, 140, 141,
-   138, 142, 143, 137, 144, 137, 145,  26, 146, 147, 147, 147, 147, 147, 147, 148,
-   147, 147, 147, 149,  26,  26,  26,  26, 150, 151, 152, 152, 153, 152, 152, 154,
-   155, 156, 152, 157,  26,  26,  26,  26, 158, 158, 158, 158, 158, 158, 158, 158,
-   158, 159, 158, 158, 158, 160, 159, 158, 158, 158, 158, 159, 158, 158, 158, 161,
-   158, 161, 162, 163,  26,  26,  26,  26, 164, 164, 164, 164, 164, 164, 164, 164,
+     2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+     2,   2,   2,   2,   2,   2,   2,   6,   0,   0,   0,   0,   7,   8,   0,   0,
+     9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,  10,  11,
+    12,  13,  14,  14,  15,  14,  14,  14,  14,  14,  14,  14,  16,  17,  14,  14,
+    18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+    19,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,  18,
+    18,  18,  18,  18,  18,  18,  20,  21,  21,  21,  22,  20,  21,  21,  21,  21,
+    21,  23,  24,  25,  25,  25,  25,  25,  25,  26,  25,  25,  25,  27,  28,  26,
+    29,  30,  31,  32,  31,  31,  31,  31,  33,  34,  35,  31,  31,  31,  36,  31,
+    31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  29,  31,  31,  31,  31,
+    37,  38,  37,  37,  37,  37,  37,  37,  37,  39,  31,  31,  31,  31,  31,  31,
+    40,  40,  40,  40,  40,  40,  41,  26,  42,  42,  42,  42,  42,  42,  42,  43,
+    44,  44,  44,  44,  44,  45,  44,  46,  47,  47,  47,  48,  37,  49,  31,  31,
+    31,  31,  50,  31,  31,  31,  31,  31,  31,  31,  31,  31,  51,  31,  31,  31,
+    52,  52,  52,  52,  52,  52,  52,  52,  52,  52,  53,  52,  54,  52,  52,  52,
+    55,  56,  57,  58,  58,  59,  60,  61,  56,  62,  63,  64,  65,  58,  58,  66,
+    67,  68,  69,  70,  70,  71,  72,  73,  68,  74,  75,  76,  77,  70,  78,  26,
+    79,  80,  81,  82,  82,  83,  84,  85,  80,  86,  87,  26,  88,  82,  89,  90,
+    91,  92,  93,  94,  94,  95,  96,  97,  92,  98,  99, 100, 101,  94,  94,  26,
+   102, 103, 104, 105, 106, 103, 107, 108, 103, 104, 109,  26, 110, 107, 107, 111,
+   112, 113, 114, 112, 112, 114, 112, 115, 113, 116, 117, 118, 119, 112, 120, 112,
+   121, 122, 123, 121, 121, 123, 124, 125, 122, 126, 127, 128, 129, 121, 130,  26,
+   131, 132, 133, 131, 131, 131, 131, 131, 132, 133, 134, 131, 135, 131, 131, 131,
+   136, 137, 138, 139, 137, 137, 140, 141, 138, 142, 143, 137, 144, 137, 145,  26,
+   146, 147, 147, 147, 147, 147, 147, 148, 147, 147, 147, 149,  26,  26,  26,  26,
+   150, 151, 152, 152, 153, 152, 152, 154, 155, 156, 152, 157,  26,  26,  26,  26,
+   158, 158, 158, 158, 158, 158, 158, 158, 158, 159, 158, 158, 158, 160, 159, 158,
+   158, 158, 158, 159, 158, 158, 158, 161, 158, 161, 162, 163,  26,  26,  26,  26,
+   164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
    164, 164, 164, 164, 165, 165, 165, 165, 166, 167, 165, 165, 165, 165, 165, 168,
-   169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170, 170, 170,
-   170, 171, 172, 171, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 171, 172,
-   171, 170, 172, 170, 170, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 170,
-   170, 170, 170, 173, 170, 170, 170, 174, 170, 170, 170, 175, 176, 176, 176, 176,
-   176, 176, 176, 176, 176, 176, 177, 177, 178, 178, 178, 178, 178, 178, 178, 178,
+   169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+   170, 170, 170, 170, 170, 170, 170, 170, 170, 171, 172, 171, 170, 170, 170, 170,
+   170, 171, 170, 170, 170, 170, 171, 172, 171, 170, 172, 170, 170, 170, 170, 170,
+   170, 170, 171, 170, 170, 170, 170, 170, 170, 170, 170, 173, 170, 170, 170, 174,
+   170, 170, 170, 175, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 177, 177,
+   178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
    179, 179, 179, 180, 181, 181, 181, 181, 181, 181, 181, 181, 181, 182, 181, 183,
    184, 184, 185, 186, 187, 187, 188,  26, 189, 189, 190,  26, 191, 192, 193,  26,
    194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 195, 194, 196, 194, 196,
@@ -2466,165 +2264,215 @@
    203, 203, 203, 204, 203, 205, 203, 205, 206, 203, 207, 207, 207, 208, 209,  26,
    210, 210, 210, 210, 210, 211, 210, 210, 210, 212, 210, 213, 194, 194, 194, 194,
    214, 214, 214, 215, 216, 216, 216, 216, 216, 216, 216, 217, 216, 216, 216, 218,
-   216, 219, 216, 219, 216, 220,   9,   9,   9, 221,  26,  26,  26,  26,  26,  26,
-   222, 222, 222, 222, 222, 222, 222, 222, 222, 223, 222, 222, 222, 222, 222, 222,
-   224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, 225, 225, 225, 226, 227,
-   228, 228, 228, 228, 228, 228, 228, 229, 228, 230, 231, 231, 231, 231, 231, 231,
-    18, 232, 165, 165, 165, 165, 165, 233, 224,  26, 234,   9, 235, 236, 237, 238,
-     2,   2,   2,   2, 239, 240,   2,   2,   2,   2,   2, 241, 242, 243,   2, 244,
-     2,   2,   2,   2,   2,   2,   2, 245,  14,  14, 246, 246,  14,  14,  14,  14,
-   246, 246,  14, 247,  14,  14,  14, 246,  14,  14,  14,  14,  14,  14, 248,  14,
-   248,  14, 249, 250,  14,  14, 251, 252,   0, 253,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0, 254,   0, 255, 256,   0, 257,   2, 258,   0,   0,   0,   0,
-   259,  26,   9,   9,   9,   9, 260,  26,   0,   0,   0,   0, 261, 262,   4,   0,
-     0, 263,   0,   0,   2,   2,   2,   2,   2, 264,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0, 265,  26,  26,   0, 266,  26,  26,   0,   0,   0,   0,
-   267, 267, 267, 267, 267, 267, 267, 267,   0,   0,   0,   0,   0,   0, 268,   0,
-     0,   0, 269,   0,   0,   0,   0,   0, 270, 270, 270, 270, 270, 270, 270, 270,
-   270, 270, 270, 270,   2,   2,   2,   2,  17,  17,  17,  17,  17,  17,  17,  17,
-    17,  17,  17,  17,  17,  17, 271, 272, 165, 165, 165, 165, 166, 167, 273, 273,
-   273, 273, 273, 273, 273, 274, 275, 274, 170, 170, 172,  26, 172, 172, 172, 172,
-   172, 172, 172, 172,  18,  18,  18,  18,   0,   0,   0, 276,  26,  26,  26,  26,
-   277, 277, 277, 278, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 279,  26,
-   277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280,  26,  26,  26,   0,   0,
-   281,   0,   0,   0, 282, 283,   0, 284, 285, 286, 286, 286, 286, 286, 286, 286,
-   286, 286, 287, 288, 289, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 291,
-   292, 293, 293, 293, 293, 293, 294, 169, 169, 295,   0,   0, 293, 293, 293, 293,
-     0,   0,   0,   0, 276, 296, 290, 290, 169, 169, 169, 295,   0,   0,   0,   0,
-     0,   0,   0,   0, 169, 169, 169, 297,   0,   0, 290, 290, 290, 290, 290, 298,
-   290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290,   0,   0,   0,   0,   0,
-   299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 299, 299, 299, 299, 299, 299,
-   301,  26, 302, 302, 302, 302, 302, 302, 303, 303, 303, 303, 303, 303, 303, 303,
-   303, 303, 303, 303, 303, 304,  26,  26,  18,  18,  18,  18, 305, 305, 305, 305,
-   305, 305, 305, 305, 305, 305, 305,  26,   0,   0,   0,   0, 306,   2,   2,   2,
-     2, 307,   2,   2,   2,   2,   2,   2,   2, 308, 309, 258,  26,  26, 310,   2,
-   311, 311, 311, 311, 311, 312,   0, 265, 313, 313, 313, 313, 313, 313, 313,  26,
-   314, 314, 314, 314, 314, 314, 314, 314, 315, 316, 314, 317,  53,  53,  53,  53,
-   318, 318, 318, 318, 318, 319, 320, 320, 320, 320, 321, 322, 169, 169, 169, 323,
-   324, 324, 324, 324, 324, 324, 324, 324, 324, 325, 324, 326, 164, 164, 164, 327,
-   328, 328, 328, 328, 328, 328, 329,  26, 328, 330, 328, 331, 164, 164, 164, 164,
-   332, 332, 332, 332, 332, 332, 332, 332, 333,  26,  26, 334, 335, 335, 336,  26,
-   337, 337, 337,  26, 172, 172,   2,   2,   2,   2,   2, 338, 339, 340, 176, 176,
-   176, 176, 176, 176, 176, 176, 176, 176, 335, 335, 335, 335, 335, 341, 335, 342,
-   169, 169, 169, 169, 343,  26, 169, 169, 295, 344, 169, 169, 169, 169, 169, 343,
-    26,  26,  26,  26,  26,  26,  26,  26, 277, 277, 277, 277, 277, 280, 277, 277,
-   277, 277, 277, 345,  26,  26,  26,  26, 346,  26, 347, 348,  25,  25, 349, 350,
-   351,  25,  31,  31,  31,  31,  31,  31, 352,  26, 353,  31,  31,  31,  31,  31,
-    31,  31,  31,  31,  31,  31,  31, 354,  31,  31, 355,  31,  31,  31,  31,  31,
-    31, 356,  26,  26,  26,  26,  31,  31,   9,   9,   0, 265,   9, 357,   0,   0,
-     0,   0, 358,   0, 257, 359, 360,  31,  31,  31,  31,  31,  31,  31,  31, 361,
-   362,   0,   0,   0,   1,   2,   2,   3,   1,   2,   2,   3, 363, 290, 289, 290,
-   290, 290, 290, 364, 169, 169, 169, 295, 365, 365, 365, 366, 257, 257,  26, 367,
-   368, 369, 368, 368, 370, 368, 368, 371, 368, 372, 368, 372,  26,  26,  26,  26,
-   368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 373,
-   374,   0,   0,   0,   0,   0, 375,   0,  14,  14,  14,  14,  14,  14,  14,  14,
-    14, 252,   0, 376, 377,  26,  26,  26,  26,  26,   0,   0,   0,   0,   0, 378,
-   379, 379, 379, 380, 381, 381, 381, 381, 381, 381, 382,  26, 383,   0,   0, 359,
-   384, 384, 384, 384, 385, 386, 387, 387, 387, 388, 389, 389, 389, 389, 389, 390,
-   391, 391, 391, 392, 393, 393, 393, 393, 394, 393, 395,  26,  26,  26,  26,  26,
-   396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397, 397,
-   398, 398, 398, 399, 398, 400, 401, 401, 401, 401, 402, 401, 401, 401, 401, 402,
-   403, 403, 403, 403, 403,  26, 404, 404, 404, 404, 404, 404, 405, 406, 407, 408,
-   407, 408, 409, 407, 410, 407, 410, 411, 412, 412, 412, 412, 412, 412, 413,  26,
-   414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 415,  26,
-   414, 414, 416,  26, 414,  26,  26,  26, 417,   2,   2,   2,   2,   2, 418, 419,
-   420, 421, 422, 422, 422, 422, 423, 424, 425, 425, 426, 425, 427, 427, 427, 427,
-   428, 428, 428, 429, 430, 428,  26,  26,  26,  26,  26,  26, 431, 431, 432, 433,
-   434, 434, 434, 435, 436, 436, 436, 437, 438, 438, 438, 438, 439, 439, 439, 440,
-   439, 439, 441, 439, 439, 439, 439, 439, 442, 443, 444, 445, 446, 446, 447, 448,
-   446, 449, 446, 449, 450, 450, 450, 450, 451, 451, 451, 451,  26,  26,  26,  26,
-   452, 452, 452, 452, 453, 454, 453,  26, 455, 455, 455, 455, 455, 455, 456, 457,
-   458, 458, 459, 458, 460, 460, 461, 460, 462, 462, 463, 464,  26, 465,  26,  26,
-   466, 466, 466, 466, 466, 466, 466, 466, 466, 467,  26,  26,  26,  26,  26,  26,
-   468, 468, 468, 468, 468, 468, 469,  26, 468, 468, 468, 468, 468, 468, 469, 470,
-   471, 471, 471, 471, 471,  26, 471, 472, 473, 473, 473, 473, 474, 475, 473, 473,
-   474, 476,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  31,  31,  50,
-   477, 477, 477, 477, 477, 478, 479,  26, 480,  26,  26,  26,  26,  26,  26, 481,
-   482, 482, 482, 482, 482,  26, 483, 483, 483, 483, 483, 484,  26,  26, 485, 485,
-   485, 486,  26,  26,  26,  26, 487, 487, 487, 488,  26,  26, 489, 489, 490,  26,
-   491, 491, 491, 491, 491, 491, 491, 491, 491, 492, 493, 491, 491, 491, 492, 494,
-   495, 495, 495, 495, 495, 495, 495, 495, 496, 497, 498, 498, 498, 499, 498, 500,
-   501, 501, 501, 501, 501, 501, 502, 501, 501,  26, 503, 503, 503, 503, 504,  26,
-   505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 506, 137, 507,  26,
-   508, 508, 509, 508, 508, 508, 508, 508, 510,  26,  26,  26,  26,  26,  26,  26,
-   511, 512, 513, 514, 513, 515, 516, 516, 516, 516, 516, 516, 516, 517, 516, 518,
-   519, 520, 521, 522, 522, 523, 524, 525, 520, 526, 527, 528, 529, 530, 530,  26,
-   531, 532, 531, 531, 531, 531, 533, 531, 534, 535, 533, 536, 537,  26,  26,  26,
-   538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 539, 540,  26,  26,  26,
-   541, 541, 541, 541, 541, 541, 541, 541, 541,  26, 541, 542,  26,  26,  26,  26,
-   543, 543, 543, 543, 543, 543, 544, 543, 543, 543, 543, 544,  26,  26,  26,  26,
-   545, 545, 545, 545, 545, 545, 545, 545, 546,  26, 545, 547, 198, 548,  26,  26,
-   549, 549, 549, 549, 549, 549, 549, 550, 549, 550, 164, 164, 551,  26,  26,  26,
-   552, 552, 552, 553, 552, 554, 552, 552, 555,  26,  26,  26,  26,  26,  26,  26,
-   556, 556, 556, 556, 556, 556, 556, 557,  26,  26,  26,  26, 558, 558, 558, 558,
-   558, 558, 558, 558, 558, 558, 559, 560, 561, 562, 563, 564, 564, 564, 565, 566,
-   561,  26, 564, 567,  26,  26,  26,  26,  26,  26,  26,  26, 568, 569, 568, 568,
-   568, 568, 568, 569, 570,  26,  26,  26, 571, 571, 571, 571, 571, 571, 571, 571,
-   571,  26, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 573,  26, 178, 178,
-   574, 574, 574, 574, 574, 574, 574, 575,  53, 576,  26,  26,  26,  26,  26,  26,
-   577, 577, 577, 577, 578,  26, 577, 578, 579, 580, 579, 579, 579, 579, 581, 579,
-   582,  26, 579, 579, 579, 583, 584, 584, 584, 584, 585, 584, 584, 586, 587,  26,
-   588, 589, 590, 590, 590, 590, 588, 591, 590,  26, 590, 592, 593, 594, 595, 595,
-   595, 596, 597, 598, 595, 599,  26,  26,  26,  26,  26,  26, 600, 600, 600, 601,
-   602, 602, 603, 602, 602, 602, 602, 604, 602, 602, 602, 605,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26, 606,  26, 108, 108, 108, 108, 108, 108, 607, 608,
-   609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 610,  26,  26,  26,  26,
-   609, 609, 609, 609, 609, 611, 612,  26, 613,  26,  26,  26,  26,  26,  26,  26,
-    26,  26, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 615,  26,
-   616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 617,  26, 616, 616, 616, 616,
-   616, 616, 616, 616, 616, 616, 616, 618, 619, 619, 619, 619, 619, 619, 619, 619,
-   620,  26,  26,  26,  26,  26,  26,  26, 621, 621, 621, 621, 621, 621, 621, 622,
-   305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 623,
-   624, 624, 624, 625, 624, 626, 627, 627, 627, 627, 627, 627, 627, 627, 627, 628,
-   627, 629, 630, 630, 630, 631, 631,  26, 632, 632, 632, 632, 632, 632, 632, 632,
-   633,  26, 632, 634, 634, 632, 632, 635, 632, 632,  26,  26,  26,  26,  26,  26,
-   636, 636, 636, 636, 636, 636, 636, 637, 638, 638, 638, 638, 638, 638, 638, 638,
-   638, 638, 638, 639,  26,  26,  26,  26, 640, 640, 640, 640, 640, 640, 640, 640,
-   640, 641, 640, 640, 640, 640, 640, 640, 640, 642, 640, 640,  26,  26,  26,  26,
-    26,  26,  26,  26, 643,  26, 345,  26, 644, 644, 644, 644, 644, 644, 644, 644,
-   644, 644, 644, 644, 644, 644, 644,  26, 645, 645, 645, 645, 645, 645, 645, 645,
-   645, 645, 646,  26,  26,  26,  26, 647, 644, 648,  26,  26,  26,  26,  26,  26,
-    26,  26,  26,  26,  26,  26, 649, 650, 651, 286, 286, 286, 286, 286, 286, 286,
-   286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 652,  26, 653,  26,
-    26,  26, 654,  26, 655,  26, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656,
-   656, 656, 656, 656, 656, 656, 656, 657, 658, 658, 658, 658, 658, 658, 658, 658,
-   658, 658, 658, 658, 658, 659, 658, 660, 658, 661, 658, 662, 359,  26,  26,  26,
-     0,   0,   0,   0,   0,   0,   0, 265,   0,   0,   0,   0,   0,   0, 359,  26,
-     9,   9,   9,   9,   9, 663,   9,   9, 221,  26,   0,   0,   0,   0,   0,   0,
-   359,  26,  26,  26,  26,  26,  26,  26,   0,   0,   0,   0,   0,   0, 276,  26,
-     0,   0,   0,   0, 257, 362,   0,   0,   0,   0,   0,   0, 664, 665,   0, 666,
-   667, 668,   0,   0,   0, 669,   0,   0,   0,   0,   0,   0,   0, 266,  26,  26,
-   246,  26,  26,  26,  26,  26,  26,  26,   0,   0, 359,  26,   0,   0, 359,  26,
-     0,   0, 257,  26,   0,   0,   0, 259,   0,   0, 254,   0,   0,   0,   0,   0,
-     0,   0,   0, 254, 670, 671,   0, 672, 673,   0,   0,   0,   0,   0,   0,   0,
-   269, 674, 254, 254,   0,   0,   0, 675, 676, 677, 678,   0,   0,   0,   0,   0,
-     0,   0,   0,   0, 276,   0,   0,   0,   0, 268,   0,   0,   0,   0,   0,   0,
-   679, 679, 679, 679, 679, 679, 679, 679, 679, 680,  26, 681, 682, 679,  26,  26,
-     2,   2,   2, 346, 683, 419,  26,  26, 684, 270, 270, 685, 686, 687,  18,  18,
-    18,  18,  18,  18,  18, 688,  26,  26,  26, 689,  26,  26,  26,  26,  26,  26,
-   690, 690, 690, 690, 690, 691, 690, 692, 690, 693,  26,  26,  26,  26,  26,  26,
-    26,  26, 694, 694, 694, 695,  26,  26, 696, 696, 696, 696, 696, 696, 696, 697,
-    26,  26, 698, 698, 698, 698, 698, 699,  26,  26, 700, 700, 700, 700, 700, 701,
-    26,  26,  26,  26, 172, 702, 170, 172, 703, 703, 703, 703, 703, 703, 703, 703,
-   704, 703, 705,  26,  26,  26,  26,  26, 706, 706, 706, 706, 706, 706, 706, 706,
-   706, 707, 706, 708,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 362,   0,
-     0,   0,   0,   0,   0,   0, 376,  26, 362,   0,   0,   0,   0,   0,   0, 276,
-   709,  31,  31,  31, 710, 711, 712, 713, 714, 715, 710, 716, 710, 712, 712, 717,
-    31, 718,  31, 719, 720, 718,  31, 719,  26,  26,  26,  26,  26,  26, 721,  26,
-     0,   0,   0,   0,   0, 359,   0,   0,   0,   0, 359,  26,   0, 257, 362,   0,
-   362,   0, 362,   0,   0,   0, 276,  26,   0,   0,   0,   0,   0, 276,  26,  26,
-    26,  26,  26,  26, 722,   0,   0,   0, 723,  26,   0,   0,   0,   0,   0, 359,
-     0, 259, 265,  26, 276,  26,  26,  26,   0,   0,   0, 724,   0, 376,   0, 376,
-     0,   0,   0,   0,   0,   0, 257, 725,   0,   0,   0, 265,   0, 359, 259,  26,
-     0, 359,   0,   0,   0,   0,   0,   0,   0,  26,   0, 265,   0,   0,   0,   0,
-     0,  26,   0,   0,   0, 276,   0, 359, 265,  26,  26,  26,  26,  26,  26,  26,
-     0,   0, 359,  26,   0, 276,   0, 376,   0, 726,   0,   0,   0,   0,   0,   0,
-   257, 722,   0, 727,   0, 265,   0, 259,   0,   0, 358,   0,   0,   0,   0,   0,
-   277, 277, 277, 277,  26,  26,  26,  26, 277, 277, 277, 277, 277, 277, 277, 345,
-   277, 277, 277, 280, 277, 277, 277, 277, 277, 277, 277, 277, 345,  26, 277, 277,
-   277, 277, 277, 277, 728,  26, 277, 277, 277, 277, 277, 280,  26,  26,  26,  26,
-   277, 729, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,  26,  26,
-   730,  26,  26,  26,   0,   0,   0,   0,   9,   9,   9,   9,   9,   9,   0,   0,
+   216, 219, 216, 219, 216, 220,   9,   9,   9,   9,   9, 221,   9, 222,  26,  26,
+   223, 223, 223, 223, 223, 223, 223, 223, 223, 224, 223, 223, 223, 223, 223, 223,
+   225, 225, 225, 225, 225, 225, 225, 225, 226, 226, 226, 226, 226, 226, 227, 228,
+   229, 229, 229, 229, 229, 229, 229, 230, 229, 231, 232, 232, 232, 232, 232, 232,
+    18, 233, 165, 165, 165, 165, 165, 234, 225,  26, 235,   9, 236, 237, 238, 239,
+     2,   2,   2,   2, 240, 241,   2,   2,   2,   2,   2, 242, 243, 244,   2, 245,
+     2,   2,   2,   2,   2,   2,   2, 246,   9,   9,   9,   9,   9,   9,   9,   9,
+    14,  14, 247, 247,  14,  14,  14,  14, 247, 247,  14, 248,  14,  14,  14, 247,
+    14,  14,  14,  14,  14,  14, 249,  14, 249,  14, 250, 251,  14,  14, 252, 253,
+     0, 254,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255,   0, 256, 257,
+     0, 258,   2, 259,   0,   0,   0,   0, 260,  26,   9,   9,   9,   9, 261,  26,
+     0,   0,   0,   0, 262, 263,   4,   0,   0, 264,   0,   0,   2,   2,   2,   2,
+     2, 265,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0, 260,  26,  26,   0, 266,  26,  26,   0,   0,   0,   0,
+   267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 268,   0,
+   269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,   2,   2,   2,   2,
+    17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17,  17, 270, 271,
+   165, 165, 165, 165, 166, 167, 272, 272, 272, 272, 272, 272, 272, 273, 274, 273,
+   170, 170, 172,  26, 172, 172, 172, 172, 172, 172, 172, 172,  18,  18,  18,  18,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 275,  26,  26,  26,  26,
+   276, 276, 276, 277, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 278,  26,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 279,  26,  26,  26,   0,   0,
+   280,   0,   0,   0, 281, 282,   0, 283, 284, 285, 285, 285, 285, 285, 285, 285,
+   285, 285, 286, 287, 288, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 290,
+   291, 292, 292, 292, 292, 292, 293, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+   169, 294,   0,   0, 292, 292, 292, 292,   0,   0,   0,   0, 275, 295, 289, 289,
+   169, 169, 169, 294,   0,   0,   0,   0,   0,   0,   0,   0, 169, 169, 169, 296,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 289, 289, 289, 289, 289, 297,
+   289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289,   0,   0,   0,   0,   0,
+   276, 276, 276, 276, 276, 276, 276, 276,   0,   0,   0,   0,   0,   0,   0,   0,
+   298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
+   298, 299, 298, 298, 298, 298, 298, 298, 300,  26, 301, 301, 301, 301, 301, 301,
+   302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+   302, 302, 302, 302, 302, 303,  26,  26,  18,  18,  18,  18,  18,  18,  18,  18,
+    18,  18,  18,  18, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304,  26,
+     0,   0,   0,   0, 305,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
+     2, 306,   2,   2,   2,   2,   2,   2,   2,   2,   2, 259,  26,  26, 307,   2,
+   308, 308, 308, 308, 308, 309,   0, 260, 310, 310, 310, 310, 310, 310, 310,  26,
+   311, 311, 311, 311, 311, 311, 311, 311, 312, 313, 311, 314,  52,  52,  52,  52,
+   315, 315, 315, 315, 315, 316, 317, 317, 317, 317, 318, 319, 169, 169, 169, 320,
+   321, 321, 321, 321, 321, 321, 321, 321, 321, 322, 321, 323, 164, 164, 164, 324,
+   325, 325, 325, 325, 325, 325, 326,  26, 325, 327, 325, 328, 164, 164, 164, 164,
+   329, 329, 329, 329, 329, 329, 329, 329, 330,  26,  26, 331, 332, 332, 333,  26,
+   334, 334, 334,  26, 172, 172,   2,   2,   2,   2,   2, 335, 336, 337, 176, 176,
+   176, 176, 176, 176, 176, 176, 176, 176, 332, 332, 332, 332, 332, 338, 332, 339,
+   169, 169, 169, 169, 340,  26, 169, 169, 294, 341, 169, 169, 169, 169, 169, 340,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 279, 276, 276,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 342,  26,  26,  26,  26,
+   343,  26, 344, 345,  25,  25, 346, 347, 348,  25,  31,  31,  31,  31,  31,  31,
+    31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,
+    31,  31,  31,  31,  31,  31,  31, 349,  31,  31,  31,  31,  31,  31,  31,  31,
+    31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  26,  26,  26,  26,  31,  31,
+     9,   9,   0, 260,   9, 350,   0,   0,   0,   0, 351,   0, 258, 352, 353,  31,
+    31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31,  31, 354,
+   355,   0,   0,   0,   1,   2,   2,   3,   1,   2,   2,   3, 356, 289, 288, 289,
+   289, 289, 289, 357, 169, 169, 169, 294, 358, 358, 358, 359, 258, 258,  26, 360,
+   361, 362, 361, 361, 363, 361, 361, 364, 361, 365, 361, 365,  26,  26,  26,  26,
+   361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 366,
+   367,   0,   0,   0,   0,   0, 368,   0,  14,  14,  14,  14,  14,  14,  14,  14,
+    14, 253,   0, 369, 370,  26,  26,  26,  26,  26,   0,   0,   0,   0,   0, 371,
+   372, 372, 372, 373, 374, 374, 374, 374, 374, 374, 375,  26, 376,   0,   0, 352,
+   377, 377, 377, 377, 378, 379, 380, 380, 380, 381, 382, 382, 382, 382, 382, 383,
+   384, 384, 384, 385, 386, 386, 386, 386, 387, 386, 388,  26,  26,  26,  26,  26,
+   389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 390, 390, 390, 390, 390, 390,
+   391, 391, 391, 392, 391, 393, 394, 394, 394, 394, 395, 394, 394, 394, 394, 395,
+   396, 396, 396, 396, 396,  26, 397, 397, 397, 397, 397, 397, 398, 399, 400, 401,
+   400, 401, 402, 400, 403, 400, 403, 404, 405, 405, 405, 405, 405, 405, 406,  26,
+   407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407,
+   407, 407, 407, 407, 407, 407, 408,  26, 407, 407, 409,  26, 407,  26,  26,  26,
+   410,   2,   2,   2,   2,   2, 411, 412,  26,  26,  26,  26,  26,  26,  26,  26,
+   413, 414, 415, 415, 415, 415, 416, 417, 418, 418, 419, 418, 420, 420, 420, 420,
+   421, 421, 421, 422, 423, 421,  26,  26,  26,  26,  26,  26, 424, 424, 425, 426,
+   427, 427, 427, 428, 429, 429, 429, 430, 431, 431, 431, 432,  26,  26,  26,  26,
+   433, 433, 433, 433, 434, 434, 434, 435, 434, 434, 436, 434, 434, 434, 434, 434,
+   437, 438, 439, 440, 441, 441, 442, 443, 441, 444, 441, 444, 445, 445, 445, 445,
+   446, 446, 446, 446,  26,  26,  26,  26, 447, 447, 447, 447, 448, 449, 448,  26,
+   450, 450, 450, 450, 450, 450, 451, 452, 453, 453, 454, 453, 455, 455, 456, 455,
+   457, 457, 458, 459,  26, 460,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   461, 461, 461, 461, 461, 461, 461, 461, 461, 462,  26,  26,  26,  26,  26,  26,
+   463, 463, 463, 463, 463, 463, 464,  26, 463, 463, 463, 463, 463, 463, 464, 465,
+   466, 466, 466, 466, 466,  26, 466, 467, 468, 468, 468, 468, 469, 470, 468, 468,
+   469, 471,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  31,  31,  31, 472,
+   473, 473, 473, 473, 473, 474, 475,  26, 476,  26,  31, 477,  26,  26,  26, 476,
+   478, 478, 478, 478, 478,  26, 479, 479, 479, 479, 479, 480,  26,  26, 481, 481,
+   481, 482,  26,  26,  26,  26, 483, 483, 483, 484,  26,  26, 485, 485, 486,  26,
+   487, 487, 487, 487, 487, 487, 487, 487, 487, 488, 489, 487, 487, 487, 488, 490,
+   491, 491, 491, 491, 491, 491, 491, 491, 492, 493, 494, 494, 494, 495, 494, 496,
+   497, 497, 497, 497, 497, 497, 498, 497, 497,  26, 499, 499, 499, 499, 500,  26,
+   501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 502, 137, 503,  26,
+   504, 504, 505, 504, 504, 504, 504, 504, 506,  26,  26,  26,  26,  26,  26,  26,
+   507, 508, 509, 510, 509, 511, 512, 512, 512, 512, 512, 512, 512, 513, 512, 514,
+   515, 516, 517, 518, 518, 519, 520, 521, 516, 522, 523, 524, 525, 526, 526,  26,
+   527, 528, 527, 527, 527, 527, 529, 527, 530, 531, 529, 532, 533,  26,  26,  26,
+   534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 535, 536,  26,  26,  26,
+   537, 537, 537, 537, 537, 537, 537, 537, 537,  26, 537, 538,  26,  26,  26,  26,
+   539, 539, 539, 539, 539, 539, 540, 539, 539, 539, 539, 540,  26,  26,  26,  26,
+   541, 541, 541, 541, 541, 541, 541, 541, 542,  26, 541, 543, 198, 544,  26,  26,
+   545, 545, 545, 545, 545, 545, 545, 546, 545, 546, 164, 164, 547,  26,  26,  26,
+   548, 548, 548, 549, 548, 550, 548, 548, 551,  26,  26,  26,  26,  26,  26,  26,
+   552, 552, 552, 552, 552, 552, 552, 553,  26,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 555, 556,
+   557, 558, 559, 560, 560, 560, 561, 562, 557,  26, 560, 563,  26,  26,  26,  26,
+    26,  26,  26,  26, 564, 565, 564, 564, 564, 564, 564, 565, 566,  26,  26,  26,
+   567, 567, 567, 567, 567, 567, 567, 567, 567,  26, 568, 568, 568, 568, 568, 568,
+   568, 568, 568, 568, 569,  26, 178, 178, 570, 570, 570, 570, 570, 570, 570, 571,
+    52, 572,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 501,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26, 573, 573, 573, 573, 574,  26, 573, 574,
+   575, 576, 575, 575, 575, 575, 577, 575, 578,  26, 575, 575, 575, 579, 580, 580,
+   580, 580, 581, 580, 580, 582, 583,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   584, 585, 586, 586, 586, 586, 584, 587, 586,  26, 586, 588, 589, 590, 591, 591,
+   591, 592, 593, 594, 591, 595, 596, 596, 596, 596, 596, 597, 596, 598,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 599, 599, 599, 600,
+   601, 601, 602, 601, 601, 601, 601, 603, 601, 601, 601, 604,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26, 605,  26, 107, 107, 107, 107, 107, 107, 606, 607,
+   608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608,
+   608, 608, 608, 609,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 610, 611,  26,
+   608, 608, 608, 608, 608, 608, 608, 608, 612,  26,  26,  26,  26,  26,  26,  26,
+    26,  26, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 614,  26,
+   615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615,
+   615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 616,  26, 615, 615, 615, 615,
+   615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 617,
+   618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618,
+   618, 618, 618, 618, 618, 618, 618, 618, 619,  26,  26,  26,  26,  26,  26,  26,
+   620, 620, 620, 620, 620, 620, 620, 621,  26,  26,  26,  26,  26,  26,  26,  26,
+   304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304,
+   304, 304, 304, 304, 304, 304, 304, 622, 623, 623, 623, 624, 623, 625, 626, 626,
+   626, 626, 626, 626, 626, 626, 626, 627, 626, 628, 629, 629, 629, 630, 630,  26,
+   631, 631, 631, 631, 631, 631, 631, 631, 632,  26, 631, 633, 633, 631, 631, 634,
+   631, 631,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26, 635, 635, 635, 635, 635, 635, 635, 636,
+    26,  26,  26,  26,  26,  26,  26,  26, 637, 637, 637, 637, 637, 637, 637, 637,
+   637, 637, 637, 638, 639, 639, 639, 640, 639, 639, 641,  26,  26,  26,  26,  26,
+   642, 642, 642, 642, 642, 642, 642, 642, 642, 643, 642, 642, 642, 642, 642, 642,
+   642, 644, 642, 642,  26,  26,  26,  26,  26,  26,  26,  26, 645,  26, 646,  26,
+   647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647,
+   648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648,
+   648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 649,  26,  26,  26,  26, 650,
+   647, 647, 647, 651,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 652,  26,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 653, 654,
+   655, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285,
+   285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285,
+   285, 285, 285, 285, 656,  26, 657,  26,  26,  26, 658,  26, 659,  26, 660, 660,
+   660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660,
+   660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 661,
+   662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 663, 662, 664,
+   662, 665, 662, 666, 352,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 369,
+     0,   0,   0,   0,   0,   0, 352, 667,   0,   0, 668,  26,   0,   0, 668,  26,
+     9,   9,   9,   9,   9, 221,   9,   9, 669,  26,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0, 352,  26,  26,  26,  26,  26,  26,  26,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 275,  26,
+     0,   0,   0,   0, 258, 355,   0,   0,   0,   0,   0,   0, 670, 671,   0, 672,
+   673, 674,   0,   0,   0, 675,   0,   0,   0,   0,   0,   0,   0, 266,  26,  26,
+    14,  14,  14,  14,  14,  14,  14,  14, 247,  26,  26,  26,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26,   0,   0, 352,  26,   0,   0, 352,  26,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 258,  26,   0,   0,   0, 668,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 255,   0,   0,   0,   0,   0,
+     0,   0,   0, 255, 676, 677,   0, 678, 679,   0,   0,   0,   0,   0,   0,   0,
+   680, 681, 255, 255,   0,   0,   0, 682, 683, 667, 684,   0,   0,   0,   0,   0,
+     0,   0,   0,   0, 275,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0, 268,   0,   0,   0,   0,   0,   0,
+   685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685, 685,
+   685, 686,  26, 687, 688, 685,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+     2,   2,   2, 343, 689, 412,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   690, 269, 269, 691, 692, 693,  18,  18,  18,  18,  18,  18,  18, 694,  26,  26,
+    26, 695,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   696, 696, 696, 696, 696, 697, 696, 698, 696, 699,  26,  26,  26,  26,  26,  26,
+    26,  26, 700, 700, 700, 701,  26,  26, 702, 702, 702, 702, 702, 702, 702, 703,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 704, 704, 704, 704, 704, 705,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 706, 706, 706, 706, 706, 707,
+    26,  26,  26,  26,  26,  26,  26,  26, 708, 708, 708, 709, 708, 708, 710, 711,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 172, 712, 170, 172,
+   713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
+   713, 713, 713, 713, 713, 713, 713, 713, 714, 713, 715,  26,  26,  26,  26,  26,
+   716, 716, 716, 716, 716, 716, 716, 716, 716, 717, 716, 718,  26,  26,  26,  26,
+    26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 355,   0,
+     0,   0,   0,   0,   0,   0, 369,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   355,   0,   0,   0,   0,   0,   0, 275,  26,  26,  26,  26,  26,  26,  26,  26,
+   719,  31,  31,  31, 720, 721, 722, 723, 724, 725, 720, 726, 720, 722, 722, 727,
+    31, 728,  31, 729, 730, 728,  31, 729,  26,  26,  26,  26,  26,  26, 731,  26,
+     0,   0,   0,   0,   0, 352,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0, 352,  26,   0, 258, 355,   0, 355,   0, 355,   0,   0,   0, 275,  26,
+     0,   0,   0,   0,   0, 275,  26,  26,  26,  26,  26,  26, 732,   0,   0,   0,
+   733,  26,   0,   0,   0,   0,   0, 352,   0, 668, 260,  26, 275,  26,  26,  26,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 734,   0, 369,   0, 369,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 260,   0, 352, 668,  26,
+     0, 352,   0,   0,   0,   0,   0,   0,   0,  26,   0, 260,   0,   0,   0,   0,
+     0,  26,   0,   0,   0, 275,   0, 352, 260,  26,   0, 668,  26,  26,  26,  26,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  26,   0, 275,   0, 369,
+     0, 735,   0,   0,   0,   0,   0,   0, 258, 736,   0, 737,   0, 367,   0, 668,
+     0,   0, 351,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 266,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,  26,  26,  26,  26,
+   276, 276, 276, 279, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+   276, 276, 276, 276, 276, 279, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 738,  26, 276, 276,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 279,  26,  26,  26,  26,
+   276, 276, 276, 279,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 739, 276, 276, 276, 276, 276, 276,
+   276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 342,
+   740,  26,  26,  26,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,
+     9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    939, 940, 941, 942, 946, 948,   0, 962, 969, 970, 971, 976,1001,1002,1003,1008,
      0,1033,1040,1041,1042,1043,1047,   0,   0,1080,1081,1082,1086,1110,   0,   0,
@@ -2840,8 +2688,7 @@
    789, 928, 792,  95, 796, 797, 798, 800,  96, 929, 802, 804, 806,  97,  98, 807,
    930,  99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935,   0,   0,
 };
-static const int16_t
-_hb_ucd_i16[196] =
+static const int16_t _hb_ucd_i16[196]=
 {
       0,    0,    0,    0,    1,   -1,    0,    0,    2,    0,   -2,    0,    0,    0,    0,    2,
       0,   -2,    0,    0,    0,    0,    0,   16,    0,    0,    0,  -16,    0,    0,    1,   -1,
@@ -2858,47 +2705,42 @@
      -1,    0,    1,   -1,
 };
 
-static inline uint_fast8_t
-_hb_ucd_gc (unsigned u)
+static inline uint8_t _hb_ucd_gc (unsigned u)
 {
-  return u<1114110u?_hb_ucd_u8[6472+(((_hb_ucd_u8[816+(((_hb_ucd_u16[((_hb_ucd_u8[272+(((_hb_ucd_u8[u>>1>>3>>4>>4])<<4)+((u>>1>>3>>4)&15u))])<<4)+((u>>1>>3)&15u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
+  return u<1114110 ? _hb_ucd_u8[7920u+((_hb_ucd_u8[2176u+((_hb_ucd_u16[((_hb_ucd_u8[((((((u)>>1))>>3))>>5)])<<5)+((((((u)>>1))>>3))&31)])<<3)+((((u)>>1))&7)])<<1)+((u)&1)] : 2;
 }
-static inline uint_fast8_t
-_hb_ucd_ccc (unsigned u)
+static inline uint8_t _hb_ucd_ccc (unsigned u)
 {
-  return u<125259u?_hb_ucd_u8[8504+(((_hb_ucd_u8[7936+(((_hb_ucd_u8[7460+(((_hb_ucd_u8[7100+(((_hb_ucd_u8[6854+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0;
+  return u<125259 ? _hb_ucd_u8[10388u+((_hb_ucd_u8[9284u+((_hb_ucd_u8[8548u+((_hb_ucd_u8[8302u+((((((u)>>2))>>3))>>4)])<<4)+((((((u)>>2))>>3))&15)])<<3)+((((u)>>2))&7)])<<2)+((u)&3)] : 0;
 }
-static inline unsigned
-_hb_ucd_b4 (const uint8_t* a, unsigned i)
+static inline uint8_t _hb_ucd_b4 (const uint8_t* a, unsigned i)
 {
-  return (a[i>>1]>>((i&1u)<<2))&15u;
+  return (a[i>>1]>>((i&1)<<2))&15;
 }
-static inline int_fast16_t
-_hb_ucd_bmg (unsigned u)
+static inline int16_t _hb_ucd_bmg (unsigned u)
 {
-  return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9252+(((_hb_ucd_u8[9132+(((_hb_ucd_b4(9004+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0;
+  return u<65380 ? _hb_ucd_i16[((_hb_ucd_u8[11140u+((_hb_ucd_u8[11020u+((_hb_ucd_b4(_hb_ucd_u8+10892u,((((((u)>>2))>>3))>>3)))<<3)+((((((u)>>2))>>3))&7)])<<3)+((((u)>>2))&7)])<<2)+((u)&3)] : 0;
 }
-static inline uint_fast8_t
-_hb_ucd_sc (unsigned u)
+static inline uint8_t _hb_ucd_sc (unsigned u)
 {
-  return u<918000u?_hb_ucd_u8[10486+(((_hb_ucd_u16[3744+(((_hb_ucd_u16[2624+(((_hb_ucd_u8[9588+(u>>3>>3>>4)])<<4)+((u>>3>>3)&15u))])<<3)+((u>>3)&7u))])<<3)+((u)&7u))]:2;
+  return u<918000 ? _hb_ucd_u8[12662u+((_hb_ucd_u16[3328u+((_hb_ucd_u8[11926u+((_hb_ucd_u8[11476u+((((((u)>>3))>>4))>>4)])<<4)+((((((u)>>3))>>4))&15)])<<4)+((((u)>>3))&15)])<<3)+((u)&7)] : 2;
 }
-static inline uint_fast16_t
-_hb_ucd_dm (unsigned u)
+static inline uint16_t _hb_ucd_dm (unsigned u)
 {
-  return u<195102u?_hb_ucd_u16[6976+(((_hb_ucd_u8[16716+(((_hb_ucd_u8[16334+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
+  return u<195102 ? _hb_ucd_u16[7408u+((_hb_ucd_u8[18972u+((_hb_ucd_u8[18590u+((((u)>>4))>>5)])<<5)+((((u)>>4))&31)])<<4)+((u)&15)] : 0;
 }
 
 
 #elif !defined(HB_NO_UCD_UNASSIGNED)
 
-static const uint8_t
-_hb_ucd_u8[17524] =
+#include 
+
+static const uint8_t _hb_ucd_u8[14800]=
 {
     0,  1,  2,  3,  4,  5,  5,  5,  5,  5,  6,  5,  5,  7,  8,  9,
    10, 11, 12, 13, 14, 15, 16,  5, 17, 15, 18, 19, 20, 21, 22, 23,
     5,  5,  5,  5,  5,  5,  5,  5,  5,  5, 24, 25, 26,  5, 27, 28,
-    5, 29, 30, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+    5, 29,  5, 30, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
@@ -2929,23 +2771,23 @@
    17, 17, 17,103, 17, 17,104,100,100,100,100,100,100,100,100,100,
   100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
   100,105,100,100,100,100,100,100, 17, 17,106,107,100,108,109,110,
-   17, 17, 17, 17, 17, 17, 17,111, 17, 17, 17, 17,112,113,100,100,
-  100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,114,
-   17,115,116,100,100,100,100,100,100,100,100,100,117,100,100,100,
-  100,100,100,100,100,100,100,100,100,100,100,100,118, 39,119,120,
-  121,122,123,124,125,126,127,128, 39, 39,129,100,100,100,100,130,
-  131,132,133,100,134,135,100,136,137,138,100,100,139,140,141,100,
+   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,111,112,100,100,
+  100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,113,
+   17,114,115,100,100,100,100,100,100,100,100,100,116,100,100,100,
+  100,100,100,100,100,100,100,100,100,100,100,100,117, 39,118,119,
+  120,121,122,123,124,125,126,127, 39, 39,128,100,100,100,100,129,
+  130,131,132,100,133,134,135,136,137,138,100,100,139,140,141,100,
   142,143,144,145, 39, 39,146,147,148, 39,149,150,100,100,100,100,
    17, 17, 17, 17, 17, 17,151, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17,152,153, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,154, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,155, 17, 17,156,100,
-  100,100,100,100,100,100,100,100, 17, 17,157,100,100,100,100,100,
-   17, 17, 17,158, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17,159,100,100,100,100,100,100,100,100,100,100,100,100,
-  160,161,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+   17, 17, 17, 17, 17, 17, 17, 17,152, 17, 17, 17, 17, 17, 17, 17,
+   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,153, 17,
+   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,154, 17, 17,155,100,
+  100,100,100,100,100,100,100,100, 17, 17,156,100,100,100,100,100,
+   17, 17, 17,157, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+   17, 17, 17, 17,158,100,100,100,100,100,100,100,100,100,100,100,
+  159,160,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+   60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,161,
    60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,162,
-   60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,163,
     0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  2,  4,  5,  6,  2,
     7,  7,  7,  7,  7,  2,  8,  9, 10, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16,
@@ -2959,409 +2801,415 @@
    34, 11, 34, 34, 32, 35, 32, 16, 36, 36, 37, 34, 38, 37, 34, 34,
    34, 34, 34, 34, 34, 34, 16, 32, 34, 38, 32, 11, 32, 32, 32, 32,
    32, 32, 16, 16, 16, 11, 34, 32, 34, 34, 11, 32, 32, 32, 32, 32,
-   16, 16, 39, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 40,
-   40, 41, 41, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41,
-   40, 40, 42, 41, 41, 41, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41,
-   43, 43, 43, 43, 43, 43, 43, 43, 32, 32, 42, 32, 44, 45, 16, 10,
-   44, 44, 41, 46, 11, 47, 47, 11, 34, 11, 11, 11, 11, 11, 11, 11,
-   11, 48, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34,
-   16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 49, 34, 32, 34, 11,
-   32, 50, 43, 43, 51, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16,
-   48, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 47, 52,  2,  2,  2,
-   16, 16, 16, 16, 53, 54, 55, 56, 57, 43, 43, 43, 43, 43, 43, 43,
-   43, 43, 43, 43, 43, 43, 43, 58, 59, 60, 43, 59, 44, 44, 44, 44,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 62,
-   36, 63, 64, 44, 44, 44, 44, 44, 65, 65, 65,  8,  9, 66,  2, 67,
-   43, 43, 43, 43, 43, 60, 68,  2, 69, 36, 36, 36, 36, 70, 43, 43,
-    7,  7,  7,  7,  7,  2,  2, 36, 71, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 72, 43, 43, 43, 73, 50, 43, 43, 74, 75, 76, 43, 43, 36,
-    7,  7,  7,  7,  7, 36, 77, 78,  2,  2,  2,  2,  2,  2,  2, 79,
-   70, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 80, 62, 36,
-   36, 36, 36, 43, 43, 43, 43, 43, 71, 44, 44, 44, 44, 44, 44, 44,
-    7,  7,  7,  7,  7, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43,
-   43, 43, 40, 21,  2, 81, 57, 20, 36, 36, 36, 43, 43, 75, 43, 43,
-   43, 43, 75, 43, 75, 43, 43, 44,  2,  2,  2,  2,  2,  2,  2, 64,
-   36, 36, 36, 36, 70, 43, 44, 64, 36, 36, 36, 36, 36, 61, 44, 44,
-   36, 36, 36, 36, 82, 36, 36, 61, 65, 44, 44, 57, 43, 43, 43, 43,
-   36, 36, 36, 36, 83, 43, 43, 43, 43, 84, 43, 43, 43, 43, 43, 43,
-   43, 85, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 85, 71, 86,
-   87, 43, 43, 43, 85, 86, 87, 86, 70, 43, 43, 43, 36, 36, 36, 36,
-   36, 43,  2,  7,  7,  7,  7,  7, 88, 36, 36, 36, 36, 36, 36, 36,
-   70, 86, 62, 36, 36, 36, 61, 62, 61, 62, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 61, 36, 36, 36, 61, 61, 44, 36, 36, 44, 71, 86,
-   87, 43, 80, 89, 90, 89, 87, 61, 44, 44, 44, 89, 44, 44, 36, 62,
-   36, 43, 44,  7,  7,  7,  7,  7, 36, 20, 27, 27, 27, 56, 63, 80,
-   57, 85, 62, 36, 36, 61, 44, 62, 61, 36, 62, 61, 36, 44, 80, 86,
-   87, 80, 44, 57, 80, 57, 43, 44, 57, 44, 44, 44, 62, 36, 61, 61,
-   44, 44, 44,  7,  7,  7,  7,  7, 43, 36, 70, 64, 44, 44, 44, 44,
-   57, 85, 62, 36, 36, 36, 36, 62, 36, 62, 36, 36, 36, 36, 36, 36,
-   61, 36, 62, 36, 36, 44, 71, 86, 87, 43, 43, 57, 85, 89, 87, 44,
-   61, 44, 44, 44, 44, 44, 44, 44, 66, 44, 44, 44, 62, 43, 43, 43,
-   57, 86, 62, 36, 36, 36, 61, 62, 61, 36, 62, 36, 36, 44, 71, 87,
-   87, 43, 80, 89, 90, 89, 87, 44, 44, 44, 57, 85, 44, 44, 36, 62,
-   78, 27, 27, 27, 44, 44, 44, 44, 44, 71, 62, 36, 36, 61, 44, 36,
-   61, 36, 36, 44, 62, 61, 61, 36, 44, 62, 61, 44, 36, 61, 44, 36,
-   36, 36, 36, 36, 36, 44, 44, 86, 85, 90, 44, 86, 90, 86, 87, 44,
-   61, 44, 44, 89, 44, 44, 44, 44, 27, 91, 67, 67, 56, 92, 44, 44,
-   85, 86, 71, 36, 36, 36, 61, 36, 61, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 44, 71, 43, 85, 86, 90, 43, 80, 43, 43, 44,
-   44, 44, 57, 80, 36, 61, 62, 44, 44, 44, 44, 93, 27, 27, 27, 91,
-   70, 86, 72, 36, 36, 36, 61, 36, 36, 36, 62, 36, 36, 44, 71, 87,
-   86, 86, 90, 85, 90, 86, 43, 44, 44, 44, 89, 90, 44, 44, 62, 61,
-   62, 94, 44, 44, 44, 44, 44, 44, 43, 86, 36, 36, 36, 36, 61, 36,
-   36, 36, 36, 36, 36, 70, 71, 86, 87, 43, 80, 86, 90, 86, 87, 77,
-   44, 44, 36, 94, 27, 27, 27, 95, 27, 27, 27, 27, 91, 36, 36, 36,
-   57, 86, 62, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 36, 36, 36,
-   36, 62, 36, 36, 36, 36, 62, 44, 36, 36, 36, 61, 44, 80, 44, 89,
-   86, 43, 80, 80, 86, 86, 86, 86, 44, 86, 64, 44, 44, 44, 44, 44,
-   62, 36, 36, 36, 36, 36, 36, 36, 70, 36, 43, 43, 43, 80, 44, 96,
-   36, 36, 36, 75, 43, 43, 43, 60,  7,  7,  7,  7,  7,  2, 44, 44,
-   44, 44, 44, 44, 44, 44, 44, 44, 62, 61, 61, 36, 36, 61, 36, 36,
-   36, 36, 62, 62, 36, 36, 36, 36, 70, 36, 43, 43, 43, 43, 71, 44,
-   36, 36, 61, 81, 43, 43, 43, 80,  7,  7,  7,  7,  7, 44, 36, 36,
-   77, 67,  2,  2,  2,  2,  2,  2,  2, 97, 97, 67, 43, 67, 67, 67,
-    7,  7,  7,  7,  7, 27, 27, 27, 27, 27, 50, 50, 50,  4,  4, 86,
-   36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44,
-   57, 43, 43, 43, 43, 43, 43, 85, 43, 43, 60, 43, 36, 36, 70, 43,
-   43, 43, 43, 43, 57, 43, 43, 43, 43, 43, 43, 43, 43, 43, 80, 67,
-   67, 67, 67, 76, 67, 67, 92, 67,  2,  2, 97, 67, 21, 64, 44, 44,
-   36, 36, 36, 36, 36, 94, 87, 43, 85, 43, 43, 43, 87, 85, 87, 71,
-    7,  7,  7,  7,  7,  2,  2,  2, 36, 36, 36, 86, 43, 36, 36, 43,
-   71, 86, 98, 94, 86, 86, 86, 36, 70, 43, 71, 36, 36, 36, 36, 36,
-   36, 85, 87, 85, 86, 86, 87, 94,  7,  7,  7,  7,  7, 86, 87, 67,
-   11, 11, 11, 48, 44, 44, 48, 44, 16, 16, 16, 16, 16, 53, 45, 16,
-   36, 36, 36, 36, 61, 36, 36, 44, 36, 36, 36, 61, 61, 36, 36, 44,
-   61, 36, 36, 44, 36, 36, 36, 61, 61, 36, 36, 44, 36, 36, 36, 36,
-   36, 36, 36, 61, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 57, 43,
-    2,  2,  2,  2, 99, 27, 27, 27, 27, 27, 27, 27, 27, 27,100, 44,
-   67, 67, 67, 67, 67, 44, 44, 44, 11, 11, 11, 44, 16, 16, 16, 44,
-  101, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 77, 72,
-  102, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,103,104, 44,
-   36, 36, 36, 36, 36, 63,  2,105,106, 36, 36, 36, 61, 44, 44, 44,
-   36, 43, 85, 44, 44, 44, 44, 62, 36, 43,107, 64, 44, 44, 44, 44,
-   36, 43, 44, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 61, 36,
-   61, 43, 44, 44, 44, 44, 44, 44, 36, 36, 43, 87, 43, 43, 43, 86,
-   86, 86, 86, 85, 87, 43, 43, 43, 43, 43,  2, 88,  2, 66, 70, 44,
-    7,  7,  7,  7,  7, 44, 44, 44, 27, 27, 27, 27, 27, 44, 44, 44,
-    2,  2,  2,108,  2, 59, 43, 84, 36, 83, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 61, 44, 44, 44, 36, 36, 70, 71, 36, 36, 36, 36,
-   36, 36, 36, 36, 70, 61, 44, 44, 36, 36, 36, 44, 44, 44, 44, 44,
-   36, 36, 36, 36, 36, 36, 36, 61, 43, 85, 86, 87, 85, 86, 44, 44,
-   86, 85, 86, 86, 87, 43, 44, 44, 92, 44,  2,  7,  7,  7,  7,  7,
-   36, 36, 36, 36, 36, 36, 36, 44, 36, 36, 61, 44, 44, 44, 44, 44,
-   36, 36, 36, 36, 36, 36, 44, 44, 36, 36, 36, 36, 36, 44, 44, 44,
-    7,  7,  7,  7,  7,100, 44, 67, 67, 67, 67, 67, 67, 67, 67, 67,
-   36, 36, 36, 70, 85, 87, 44,  2, 36, 36, 94, 85, 43, 43, 43, 80,
-   85, 85, 87, 43, 43, 43, 85, 86, 86, 87, 43, 43, 43, 43, 80, 57,
-    2,  2,  2, 88,  2,  2,  2, 44, 43, 43, 43, 43, 43, 43, 43,109,
-   43, 43, 43, 43, 43, 43, 43, 80, 43, 43, 98, 36, 36, 36, 36, 36,
-   36, 36, 85, 43, 43, 85, 85, 86, 86, 85, 98, 36, 36, 36, 61,  2,
-   97, 67, 67, 67, 67, 50, 43, 43, 43, 43, 67, 67, 67, 67, 21,  2,
-   43, 98, 36, 36, 36, 36, 36, 36, 94, 43, 43, 86, 43, 87, 43, 36,
-   36, 36, 36, 85, 43, 86, 87, 87, 43, 86, 44, 44, 44, 44,  2,  2,
-   36, 36, 86, 86, 86, 86, 43, 43, 43, 43, 86, 43, 44, 93,  2,  2,
-    7,  7,  7,  7,  7, 44, 62, 36, 36, 36, 36, 36, 40, 40, 40,  2,
-   16, 16, 16, 16, 34,110, 44, 44, 11, 11, 11, 11, 11, 47, 48, 11,
-    2,  2,  2,  2, 44, 44, 44, 44, 43, 60, 43, 43, 43, 43, 43, 43,
-   85, 43, 43, 43, 71, 36, 70, 36, 36, 36, 71, 94, 43, 61, 44, 44,
-   16, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 45, 16, 16,
-   16, 16, 16, 16, 45, 16, 16, 16, 16, 16, 16, 16, 16,111, 40, 40,
-   32, 32, 32, 16, 16, 16, 16, 32, 16, 16, 16, 16, 11, 11, 11, 11,
-   16, 16, 16, 44, 11, 11, 11, 44, 16, 16, 16, 16, 48, 48, 48, 48,
-   16, 16, 16, 16, 16, 16, 16, 44, 16, 16, 16, 16,112,112,112,112,
-   16, 16,110, 16, 11, 11,113,114, 41, 16,110, 16, 11, 11,113, 41,
-   16, 16, 44, 16, 11, 11,115, 41, 16, 16, 16, 16, 11, 11,116, 41,
-   44, 16,110, 16, 11, 11,113,117,118,118,118,118,118,119, 65, 65,
-  120,120,120,  2,121,122,121,122,  2,  2,  2,  2,123, 65, 65,124,
-    2,  2,  2,  2,125,126,  2,127,128,  2,129,130,  2,  2,  2,  2,
-    2,  9,128,  2,  2,  2,  2,131, 65, 65,132, 65, 65, 65, 65, 65,
-  133, 44, 27, 27, 27,  8,129,134, 27, 27, 27, 27, 27,  8,129,104,
-   40, 40, 40, 40, 40, 40, 81, 44, 20, 20, 20, 20, 20, 20, 20, 20,
-  135, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 43,136, 51,
-  109, 51,109, 43, 43, 43, 43, 43, 80, 44, 44, 44, 44, 44, 44, 44,
-   67,137, 67,138, 67, 34, 11, 16, 11, 32,138, 67, 49, 11, 11, 67,
-   67, 67,137,137,137, 11, 11,139, 11, 11, 35, 36, 39, 67, 16, 11,
-    8,  8, 49, 16, 16, 26, 67,140, 27, 27, 27, 27, 27, 27, 27, 27,
-  105,105,105,105,105,105,105,105,105,141,142,105,143, 67, 44, 44,
-    8,  8,144, 67, 67,  8, 67, 67,144, 26, 67,144, 67, 67, 67,144,
-   67, 67, 67, 67, 67, 67, 67,  8, 67,144,144, 67, 67, 67, 67, 67,
-   67, 67,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-   67, 67, 67, 67,  4,  4, 67, 67,  8, 67, 67, 67,145,146, 67, 67,
-   67, 67, 67, 67, 67, 67,144, 67, 67, 67, 67, 67, 67, 26,  8,  8,
-    8,  8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,  8,  8,
-    8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 92, 44, 44,
-   27, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27,
-   67, 67, 67, 26, 67, 67, 67, 67, 26, 67, 67, 67, 67, 67, 67, 67,
-   67, 67, 67, 67,  8,  8,  8,  8, 67, 67, 67, 67, 67, 67, 67, 26,
-   67, 67, 67, 67,  4,  4,  4,  4,  4,  4,  4, 27, 27, 27, 27, 27,
-   27, 27, 67, 67, 67, 67, 67, 67,  8,  8,129,147,  8,  8,  8,  8,
-    8,  8,  8,  4,  4,  4,  4,  4,  8,129,148,148,148,148,148,148,
-  148,148,148,148,147,  8,  8,  8,  8,  8,  8,  8,  4,  4,  8,  8,
-    8,  8,  8,  8,  8,  8,  4,  8,  8,  8,144, 26,  8,  8,144, 67,
-   67, 67, 44, 67, 67, 67, 67, 67, 67, 67, 67, 55, 67, 67, 67, 67,
-   32, 11, 32, 34, 34, 34, 34, 11, 32, 32, 34, 16, 16, 16, 40, 11,
-   32, 32,140, 67, 67,138, 34,149, 43, 32, 44, 44, 93,  2, 99,  2,
-   16, 16, 16,150, 44, 44,150, 44, 36, 36, 36, 36, 44, 44, 44, 52,
-   64, 44, 44, 44, 44, 44, 44, 57, 36, 36, 36, 61, 44, 44, 44, 44,
-   36, 36, 36, 61, 36, 36, 36, 61,  2,121,121,  2,125,126,121,  2,
-    2,  2,  2,  6,  2,108,121,  2,121,  4,  4,  4,  4,  2,  2, 88,
-    2,  2,  2,  2,  2,120,  2,  2,108,151,  2,  2,  2,  2,  2,  2,
-   67,  2,152,148,148,148,153, 44, 67, 67, 67, 67, 67, 55, 67, 67,
-   67, 67, 44, 44, 44, 44, 44, 44, 67, 67, 67, 44, 44, 44, 44, 44,
-    1,  2,154,155,  4,  4,  4,  4,  4, 67,  4,  4,  4,  4,156,157,
-  158,105,105,105,105, 43, 43, 86,159, 40, 40, 67,105,160, 63, 67,
-   36, 36, 36, 61, 57,161,162, 69, 36, 36, 36, 36, 36, 63, 40, 69,
-   44, 44, 62, 36, 36, 36, 36, 36, 67, 27, 27, 67, 67, 67, 67, 67,
-   67, 67, 67, 44, 44, 44, 44, 55, 67, 67, 67, 67, 67, 67, 67, 92,
-   27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27,
-  163, 27, 27, 27, 27, 27, 27, 27, 36, 36, 83, 36, 36, 36, 36, 36,
-   67, 67, 67, 92, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36,164,  2,
-    7,  7,  7,  7,  7, 36, 44, 44, 32, 32, 32, 32, 32, 32, 32, 70,
-   51,165, 43, 43, 43, 43, 43, 88, 32, 32, 32, 32, 32, 32, 40, 43,
-   36, 36, 36,105,105,105,105,105, 43,  2,  2,  2, 44, 44, 44, 44,
-   41, 41, 41,162, 40, 40, 40, 40, 41, 32, 32, 32, 32, 32, 32, 32,
-   16, 32, 32, 32, 32, 32, 32, 32, 45, 16, 16, 16, 34, 34, 34, 32,
-   32, 32, 32, 32, 42,166, 34, 35, 32, 32, 16, 32, 32, 32, 32, 32,
+   16, 16, 36, 16, 16, 16, 16, 16, 39, 39, 39, 39, 39, 39, 39, 39,
+   39, 40, 40, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40,
+   39, 39, 41, 40, 40, 40, 41, 41, 40, 40, 40, 40, 40, 40, 40, 40,
+   42, 42, 42, 42, 42, 42, 42, 42, 32, 32, 41, 32, 43, 44, 16, 10,
+   43, 43, 40, 45, 11, 46, 46, 11, 34, 11, 11, 11, 11, 11, 11, 11,
+   11, 47, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34,
+   16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 48, 34, 32, 34, 11,
+   32, 49, 42, 42, 50, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16,
+   47, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 46, 51,  2,  2,  2,
+   16, 16, 16, 16, 52, 53, 54, 55, 56, 42, 42, 42, 42, 42, 42, 42,
+   42, 42, 42, 42, 42, 42, 42, 57, 58, 59, 42, 58, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 60, 43, 61,
+   36, 62, 63, 43, 43, 43, 43, 43, 64, 64, 64,  8,  9, 65,  2, 66,
+   42, 42, 42, 42, 42, 59, 67,  2, 68, 36, 36, 36, 36, 69, 42, 42,
+    7,  7,  7,  7,  7,  2,  2, 36, 70, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 71, 42, 42, 42, 72, 49, 42, 42, 73, 74, 75, 42, 42, 36,
+    7,  7,  7,  7,  7, 36, 76, 77,  2,  2,  2,  2,  2,  2,  2, 78,
+   69, 36, 36, 36, 36, 36, 36, 36, 42, 42, 42, 42, 42, 79, 61, 36,
+   36, 36, 36, 42, 42, 42, 42, 42, 70, 43, 43, 43, 43, 43, 43, 43,
+    7,  7,  7,  7,  7, 36, 36, 36, 36, 36, 36, 36, 36, 69, 42, 42,
+   42, 42, 39, 21,  2, 80, 56, 20, 36, 36, 36, 42, 42, 74, 42, 42,
+   42, 42, 74, 42, 74, 42, 42, 43,  2,  2,  2,  2,  2,  2,  2, 63,
+   36, 36, 36, 36, 69, 42, 43, 63, 36, 36, 36, 36, 36, 60, 43, 43,
+   36, 36, 36, 36, 81, 36, 36, 36, 64, 43, 43, 56, 42, 42, 42, 42,
+   36, 36, 36, 36, 82, 42, 42, 42, 42, 83, 42, 42, 42, 42, 42, 42,
+   42, 84, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 84, 70, 85,
+   86, 42, 42, 42, 84, 85, 86, 85, 69, 42, 42, 42, 36, 36, 36, 36,
+   36, 42,  2,  7,  7,  7,  7,  7, 87, 36, 36, 36, 36, 36, 36, 36,
+   69, 85, 61, 36, 36, 36, 60, 61, 60, 61, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 60, 36, 36, 36, 60, 60, 43, 36, 36, 43, 70, 85,
+   86, 42, 79, 88, 89, 88, 86, 60, 43, 43, 43, 88, 43, 43, 36, 61,
+   36, 42, 43,  7,  7,  7,  7,  7, 36, 20, 27, 27, 27, 55, 62, 79,
+   56, 84, 61, 36, 36, 60, 43, 61, 60, 36, 61, 60, 36, 43, 79, 85,
+   86, 79, 43, 56, 79, 56, 42, 43, 56, 43, 43, 43, 61, 36, 60, 60,
+   43, 43, 43,  7,  7,  7,  7,  7, 42, 36, 69, 63, 43, 43, 43, 43,
+   56, 84, 61, 36, 36, 36, 36, 61, 36, 61, 36, 36, 36, 36, 36, 36,
+   60, 36, 61, 36, 36, 43, 70, 85, 86, 42, 42, 56, 84, 88, 86, 43,
+   60, 43, 43, 43, 43, 43, 43, 43, 65, 43, 43, 43, 61, 42, 42, 42,
+   56, 85, 61, 36, 36, 36, 60, 61, 60, 36, 61, 36, 36, 43, 70, 86,
+   86, 42, 79, 88, 89, 88, 86, 43, 43, 43, 56, 84, 43, 43, 36, 61,
+   77, 27, 27, 27, 43, 43, 43, 43, 43, 70, 61, 36, 36, 60, 43, 36,
+   60, 36, 36, 43, 61, 60, 60, 36, 43, 61, 60, 43, 36, 60, 43, 36,
+   36, 36, 36, 36, 36, 43, 43, 85, 84, 89, 43, 85, 89, 85, 86, 43,
+   60, 43, 43, 88, 43, 43, 43, 43, 27, 90, 66, 66, 55, 91, 43, 43,
+   84, 85, 70, 36, 36, 36, 60, 36, 60, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 43, 70, 42, 84, 85, 89, 42, 79, 42, 42, 43,
+   43, 43, 56, 79, 36, 60, 36, 43, 43, 43, 43, 92, 27, 27, 27, 90,
+   69, 85, 71, 36, 36, 36, 60, 36, 36, 36, 61, 36, 36, 43, 70, 86,
+   85, 85, 89, 84, 89, 85, 42, 43, 43, 43, 88, 89, 43, 43, 36, 60,
+   61, 93, 43, 43, 43, 43, 43, 43, 42, 85, 36, 36, 36, 36, 60, 36,
+   36, 36, 36, 36, 36, 69, 70, 85, 86, 42, 79, 85, 89, 85, 86, 76,
+   43, 43, 36, 93, 27, 27, 27, 94, 27, 27, 27, 27, 90, 36, 36, 36,
+   56, 85, 61, 36, 36, 36, 36, 36, 36, 36, 36, 60, 43, 36, 36, 36,
+   36, 61, 36, 36, 36, 36, 61, 43, 36, 36, 36, 60, 43, 79, 43, 88,
+   85, 42, 79, 79, 85, 85, 85, 85, 43, 85, 63, 43, 43, 43, 43, 43,
+   61, 36, 36, 36, 36, 36, 36, 36, 69, 36, 42, 42, 42, 79, 43, 95,
+   36, 36, 36, 74, 42, 42, 42, 59,  7,  7,  7,  7,  7,  2, 43, 43,
+   43, 43, 43, 43, 43, 43, 43, 43, 61, 60, 60, 36, 36, 60, 36, 36,
+   36, 36, 61, 61, 36, 36, 36, 36, 69, 36, 42, 42, 42, 42, 70, 43,
+   36, 36, 60, 80, 42, 42, 42, 79,  7,  7,  7,  7,  7, 43, 36, 36,
+   76, 66,  2,  2,  2,  2,  2,  2,  2, 96, 96, 66, 42, 66, 66, 66,
+    7,  7,  7,  7,  7, 27, 27, 27, 27, 27, 49, 49, 49,  4,  4, 85,
+   36, 36, 36, 36, 61, 36, 36, 36, 36, 36, 36, 36, 36, 36, 60, 43,
+   56, 42, 42, 42, 42, 42, 42, 84, 42, 42, 59, 42, 36, 36, 69, 42,
+   42, 42, 42, 42, 56, 42, 42, 42, 42, 42, 42, 42, 42, 42, 79, 66,
+   66, 66, 66, 75, 66, 66, 91, 66,  2,  2, 96, 66, 21, 63, 43, 43,
+   36, 36, 36, 36, 36, 93, 86, 42, 84, 42, 42, 42, 86, 84, 86, 70,
+    7,  7,  7,  7,  7,  2,  2,  2, 36, 36, 36, 85, 42, 36, 36, 42,
+   70, 85, 97, 93, 85, 85, 85, 36, 69, 42, 70, 36, 36, 36, 36, 36,
+   36, 84, 86, 84, 85, 85, 86, 93,  7,  7,  7,  7,  7, 85, 86, 66,
+   11, 11, 11, 47, 43, 43, 47, 43, 16, 16, 16, 16, 16, 52, 44, 16,
+   36, 36, 36, 36, 60, 36, 36, 43, 36, 36, 36, 60, 60, 36, 36, 43,
+   60, 36, 36, 43, 36, 36, 36, 60, 60, 36, 36, 43, 36, 36, 36, 36,
+   36, 36, 36, 60, 36, 36, 36, 36, 36, 36, 36, 36, 36, 60, 56, 42,
+    2,  2,  2,  2, 98, 27, 27, 27, 27, 27, 27, 27, 27, 27, 99, 43,
+   66, 66, 66, 66, 66, 43, 43, 43, 11, 11, 11, 43, 16, 16, 16, 43,
+  100, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 76, 71,
+  101, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,102,103, 43,
+   36, 36, 36, 36, 36, 62,  2,104,105, 36, 36, 36, 60, 43, 43, 43,
+   36, 42, 84, 43, 43, 43, 43, 61, 36, 42,106, 63, 43, 43, 43, 43,
+   36, 42, 43, 43, 43, 43, 43, 43, 36, 36, 36, 36, 36, 36, 60, 36,
+   60, 42, 43, 43, 43, 43, 43, 43, 36, 36, 42, 86, 42, 42, 42, 85,
+   85, 85, 85, 84, 86, 42, 42, 42, 42, 42,  2, 87,  2, 65, 69, 43,
+    7,  7,  7,  7,  7, 43, 43, 43, 27, 27, 27, 27, 27, 43, 43, 43,
+    2,  2,  2,107,  2, 58, 42, 83, 36, 82, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 60, 43, 43, 43, 36, 36, 69, 70, 36, 36, 36, 36,
+   36, 36, 36, 36, 69, 60, 43, 43, 36, 36, 36, 43, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 36, 36, 60, 42, 84, 85, 86, 84, 85, 43, 43,
+   85, 84, 85, 85, 86, 42, 43, 43, 91, 43,  2,  7,  7,  7,  7,  7,
+   36, 36, 36, 36, 36, 36, 36, 43, 36, 36, 60, 43, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 36, 43, 43, 36, 36, 36, 36, 36, 43, 43, 43,
+    7,  7,  7,  7,  7, 99, 43, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+   36, 36, 36, 69, 84, 86, 43,  2, 36, 36, 93, 84, 42, 42, 42, 79,
+   84, 84, 86, 42, 42, 42, 84, 85, 85, 86, 42, 42, 42, 42, 79, 56,
+    2,  2,  2, 87,  2,  2,  2, 43, 42, 42, 42, 42, 42, 42, 42,108,
+   42, 42, 42, 42, 42, 42, 42, 43, 42, 42, 42, 42, 42, 42, 43, 43,
+   42, 42, 97, 36, 36, 36, 36, 36, 36, 36, 84, 42, 42, 84, 84, 85,
+   85, 84, 97, 36, 36, 36, 60,  2, 96, 66, 66, 66, 66, 49, 42, 42,
+   42, 42, 66, 66, 66, 66, 21,  2, 42, 97, 36, 36, 36, 36, 36, 36,
+   93, 42, 42, 85, 42, 86, 42, 36, 36, 36, 36, 84, 42, 85, 86, 86,
+   42, 85, 43, 43, 43, 43,  2,  2, 36, 36, 85, 85, 85, 85, 42, 42,
+   42, 42, 85, 42, 43, 92,  2,  2,  7,  7,  7,  7,  7, 43, 61, 36,
+   36, 36, 36, 36, 39, 39, 39,  2, 16, 16, 16, 16, 34,109, 43, 43,
+   11, 11, 11, 11, 11, 46, 47, 11,  2,  2,  2,  2, 43, 43, 43, 43,
+   42, 59, 42, 42, 42, 42, 42, 42, 84, 42, 42, 42, 70, 36, 69, 36,
+   36, 36, 70, 93, 42, 60, 43, 43, 16, 16, 16, 16, 16, 16, 39, 39,
+   39, 39, 39, 39, 39, 44, 16, 16, 16, 16, 16, 16, 44, 16, 16, 16,
+   16, 16, 16, 16, 16,110, 39, 39, 32, 32, 32, 16, 16, 16, 16, 32,
+   16, 16, 16, 16, 11, 11, 11, 11, 16, 16, 16, 43, 11, 11, 11, 43,
+   16, 16, 16, 16, 47, 47, 47, 47, 16, 16, 16, 16, 16, 16, 16, 43,
+   16, 16, 16, 16,111,111,111,111, 16, 16,109, 16, 11, 11,112,113,
+   40, 16,109, 16, 11, 11,112, 40, 16, 16, 43, 16, 11, 11,114, 40,
+   16, 16, 16, 16, 11, 11,115, 40, 43, 16,109, 16, 11, 11,112,116,
+  117,117,117,117,117,118, 64, 64,119,119,119,  2,120,121,120,121,
+    2,  2,  2,  2,122, 64, 64,123,  2,  2,  2,  2,124,125,  2,126,
+  127,  2,128,129,  2,  2,  2,  2,  2,  9,127,  2,  2,  2,  2,130,
+   64, 64,131, 64, 64, 64, 64, 64,132, 43, 27, 27, 27,  8,128,133,
+   27, 27, 27, 27, 27,  8,128,103, 39, 39, 39, 39, 39, 39, 80, 43,
+   20, 20, 20, 20, 20, 20, 20, 20, 20, 43, 43, 43, 43, 43, 43, 43,
+   42, 42, 42, 42, 42, 42,134, 50,108, 50,108, 42, 42, 42, 42, 42,
+   79, 43, 43, 43, 43, 43, 43, 43, 66,135, 66,136, 66, 34, 11, 16,
+   11, 32,136, 66, 48, 11, 11, 66, 66, 66,135,135,135, 11, 11,137,
+   11, 11, 35, 36,138, 66, 16, 11,  8,  8, 48, 16, 16, 26, 66,139,
+   27, 27, 27, 27, 27, 27, 27, 27,104,104,104,104,104,104,104,104,
+  104,140,141,104,142, 66, 43, 43,  8,  8,143, 66, 66,  8, 66, 66,
+  143, 26, 66,143, 66, 66, 66,143, 66, 66, 66, 66, 66, 66, 66,  8,
+   66,143,143, 66, 66, 66, 66, 66, 66, 66,  8,  8,  8,  8,  8,  8,
+    8,  8,  8,  8,  8,  8,  8,  8, 66, 66, 66, 66,  4,  4, 66, 66,
+    8, 66, 66, 66,144,145, 66, 66, 66, 66, 66, 66, 66, 66,143, 66,
+   66, 66, 66, 66, 66, 26,  8,  8,  8,  8, 66, 66, 66, 66, 66, 66,
+   66, 66, 66, 66, 66, 66,  8,  8,  8, 66, 66, 66, 66, 66, 66, 66,
+   66, 66, 66, 66, 66, 91, 43, 43, 27, 27, 27, 27, 27, 27, 66, 66,
+   66, 66, 66, 66, 66, 27, 27, 27, 66, 66, 66, 26, 66, 66, 66, 66,
+   26, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,  8,  8,  8,  8,
+   66, 66, 66, 66, 66, 66, 66, 26, 66, 66, 66, 66,  4,  4,  4,  4,
+    4,  4,  4, 27, 27, 27, 27, 27, 27, 27, 66, 66, 66, 66, 66, 66,
+    8,  8,128,146,  8,  8,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,
+    8,128,147,147,147,147,147,147,147,147,147,147,146,  8,  8,  8,
+    8,  8,  8,  8,  4,  4,  8,  8,  8,  8,  8,  8,  8,  8,  4,  8,
+    8,  8,143, 26,  8,  8,143, 66, 66, 66, 43, 66, 66, 66, 66, 66,
+   32, 11, 32, 34, 34, 34, 34, 11, 32, 32, 34, 16, 16, 16, 39, 11,
+   32, 32,139, 66, 66,136, 34,148, 42, 32, 43, 43, 92,  2, 98,  2,
+   16, 16, 16,149, 43, 43,149, 43, 36, 36, 36, 36, 43, 43, 43, 51,
+   63, 43, 43, 43, 43, 43, 43, 56, 36, 36, 36, 60, 43, 43, 43, 43,
+   36, 36, 36, 60, 36, 36, 36, 60,  2,120,120,  2,124,125,120,  2,
+    2,  2,  2,  6,  2,107,120,  2,120,  4,  4,  4,  4,  2,  2, 87,
+    2,  2,  2,  2,  2,119,  2,  2,107,150,  2,  2,  2,  2,  2,  2,
+   66,  2,151,147,147,147,152, 43, 66, 66, 66, 66, 66, 54, 66, 66,
+   66, 66, 43, 43, 43, 43, 43, 43, 66, 66, 66, 43, 43, 43, 43, 43,
+    1,  2,153,154,  4,  4,  4,  4,  4, 66,  4,  4,  4,  4,155,156,
+  157,104,104,104,104, 42, 42, 85,158, 39, 39, 66,104,159, 62, 66,
+   36, 36, 36, 60, 56,160,161, 68, 36, 36, 36, 36, 36, 62, 39, 68,
+   43, 43, 61, 36, 36, 36, 36, 36, 66, 27, 27, 66, 66, 66, 66, 66,
+   66, 66, 66, 43, 43, 43, 43, 54, 66, 66, 66, 66, 66, 66, 66, 91,
+   27, 27, 27, 27, 27, 66, 66, 66, 66, 66, 66, 66, 27, 27, 27, 27,
+  162, 27, 27, 27, 27, 27, 27, 27, 36, 36, 82, 36, 36, 36, 36, 36,
+   66, 66, 66, 91, 43, 43, 43, 43, 36, 36, 36, 36, 36, 36,163,  2,
+    7,  7,  7,  7,  7, 36, 43, 43, 32, 32, 32, 32, 32, 32, 32, 69,
+   50,164, 42, 42, 42, 42, 42, 87, 32, 32, 32, 32, 32, 32, 39, 42,
+   36, 36, 36,104,104,104,104,104, 42,  2,  2,  2, 43, 43, 43, 43,
+   40, 40, 40,161, 39, 39, 39, 39, 40, 32, 32, 32, 32, 32, 32, 32,
+   16, 32, 32, 32, 32, 32, 32, 32, 44, 16, 16, 16, 34, 34, 34, 32,
+   32, 32, 32, 32, 41,165, 34, 35, 32, 32, 16, 32, 32, 32, 32, 32,
    32, 32, 32, 32, 32, 11, 11, 32, 11, 11, 32, 32, 32, 32, 32, 32,
-   32, 32, 11, 11, 34, 34, 32, 44, 32,150,150, 32, 32, 32, 47, 44,
-   44, 40,167, 35, 40, 35, 36, 36, 36, 71, 36, 71, 36, 70, 36, 36,
-   36, 94, 87, 85, 67, 67, 80, 44, 27, 27, 27, 67,168, 44, 44, 44,
-   36, 36,  2,  2, 44, 44, 44, 44, 86, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 86, 86, 86, 86, 86, 86, 86, 86, 43, 44, 44, 44, 44,  2,
-   43, 36, 36, 36,  2, 72, 72, 70, 36, 36, 36, 43, 43, 43, 43,  2,
-   36, 36, 36, 70, 43, 43, 43, 43, 43, 86, 44, 44, 44, 44, 44, 93,
-   36, 70, 86, 43, 43, 86, 43, 86,107,  2,  2,  2,  2,  2,  2, 52,
-    7,  7,  7,  7,  7, 44, 44,  2, 36, 36, 70, 69, 36, 36, 36, 36,
-    7,  7,  7,  7,  7, 36, 36, 61, 36, 36, 36, 36, 70, 43, 43, 85,
-   87, 85, 87, 80, 44, 44, 44, 44, 36, 70, 36, 36, 36, 36, 85, 44,
-    7,  7,  7,  7,  7, 44,  2,  2, 69, 36, 36, 77, 67, 94, 85, 36,
-   71, 43, 71, 70, 71, 36, 36, 43, 70, 61, 44, 44, 44, 44, 44, 44,
-   44, 44, 44, 44, 44, 62, 83,  2, 36, 36, 36, 36, 36, 94, 43, 86,
-    2, 83,169, 80, 44, 44, 44, 44, 62, 36, 36, 61, 62, 36, 36, 61,
-   62, 36, 36, 61, 44, 44, 44, 44, 16, 16, 16, 16, 16,114, 40, 40,
-   16, 16, 16, 16,111, 41, 44, 44, 36, 94, 87, 86, 85,107, 87, 44,
-   36, 36, 44, 44, 44, 44, 44, 44, 36, 36, 36, 61, 44, 62, 36, 36,
-  170,170,170,170,170,170,170,170,171,171,171,171,171,171,171,171,
-   16, 16, 16,110, 44, 44, 44, 44, 44,150, 16, 16, 44, 44, 62, 71,
-   36, 36, 36, 36,172, 36, 36, 36, 36, 36, 36, 61, 36, 36, 61, 61,
-   36, 62, 61, 36, 36, 36, 36, 36, 36, 41, 41, 41, 41, 41, 41, 41,
-   41,117, 44, 44, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36,148, 44, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 44, 44, 44, 55, 36, 36, 36, 36, 36, 36,168, 67,
-    2,  2,  2,152,130, 44, 44, 44,  6,173,174,148,148,148,148,148,
-  148,148,130,152,130,  2,127,175,  2, 64,  2,  2,156,148,148,130,
-    2,176,  8,177, 66,  2, 44, 44, 36, 36, 61, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 61, 79, 93,  2,  3,  2,  4,  5,  6,  2,
-   16, 16, 16, 16, 16, 17, 18,129,130,  4,  2, 36, 36, 36, 36, 36,
-   69, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 40,
-   44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 61, 44,
-   20,178, 56,135, 26,  8,144, 92, 44, 44, 44, 44, 79, 65, 67, 44,
-   36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 61, 36, 62,
-    2, 64, 44,179, 27, 27, 27, 27, 27, 27, 44, 55, 67, 67, 67, 67,
-  105,105,143, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 27, 67, 92,
-   67, 67, 67, 67, 67, 67, 92, 44, 92, 44, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 67, 67, 67, 50, 44,180, 27, 27, 27, 27, 27, 27, 27,
-   27, 27, 27, 27, 27, 27, 44, 44, 27, 27, 44, 44, 44, 44, 62, 36,
-  155, 36, 36, 36, 36,181, 44, 44, 36, 36, 36, 43, 43, 80, 44, 44,
-   36, 36, 36, 36, 36, 36, 36, 93, 36, 36, 44, 44, 36, 36, 36, 36,
-  182,105,105, 44, 44, 44, 44, 44, 11, 11, 11, 11, 16, 16, 16, 16,
-   11, 11, 44, 44, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 44, 44,
-   36, 36, 36, 36, 44, 44, 44, 44, 36, 36, 44, 44, 44, 44, 44, 93,
-   11, 11, 11, 11, 11, 47, 11, 11, 11, 47, 11,150, 16, 16, 16, 16,
-   16,150, 16, 16, 16, 16, 16, 16, 16,150, 16, 16, 16,150,110, 44,
-   40, 40, 40, 52, 40, 40, 40, 40, 81, 40, 40, 40, 40, 81, 44, 44,
-   36, 36, 36, 44, 61, 36, 36, 36, 36, 36, 36, 62, 61, 44, 61, 62,
-   36, 36, 36, 93, 27, 27, 27, 27, 36, 36, 36, 77,163, 27, 27, 27,
-   44, 44, 44,179, 27, 27, 27, 27, 36, 61, 36, 44, 44,179, 27, 27,
-   36, 36, 36, 27, 27, 27, 44, 93, 36, 36, 36, 36, 36, 44, 44, 93,
-   36, 36, 36, 36, 44, 44, 27, 36, 44, 27, 27, 27, 27, 27, 27, 27,
-   70, 43, 57, 80, 44, 44, 43, 43, 36, 36, 62, 36, 62, 36, 36, 36,
-   36, 36, 36, 44, 43, 80, 44, 57, 27, 27, 27, 27,100, 44, 44, 44,
-    2,  2,  2,  2, 64, 44, 44, 44, 36, 36, 36, 36, 36, 36,183, 30,
-   36, 36, 36, 36, 36, 36,183, 27, 36, 36, 36, 36, 78, 36, 36, 36,
-   36, 36, 70, 80, 44,179, 27, 27,  2,  2,  2, 64, 44, 44, 44, 44,
-   36, 36, 36, 44, 93,  2,  2,  2, 36, 36, 36, 44, 27, 27, 27, 27,
-   36, 61, 44, 44, 27, 27, 27, 27, 36, 44, 44, 44, 93,  2, 64, 44,
-   44, 44, 44, 44,179, 27, 27, 27, 11, 47, 44, 44, 44, 44, 44, 44,
-   16,110, 44, 44, 44, 27, 27, 27, 36, 36, 43, 43, 44, 44, 44, 44,
-    7,  7,  7,  7,  7, 36, 36, 69, 11, 11, 11, 44, 57, 43, 43,159,
-   16, 16, 16, 44, 44, 44, 44,  8, 27, 27, 27, 27, 27, 27, 27,100,
-   36, 36, 36, 36, 36, 57,184, 44, 36, 44, 44, 44, 44, 44, 44, 44,
-   44, 36, 61, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 43, 43,
-   27, 27, 27, 95, 44, 44, 44, 44,180, 27, 30,  2,  2, 44, 44, 44,
-   36, 43, 43,  2,  2, 44, 44, 44, 36, 36,183, 27, 27, 27, 44, 44,
-   87, 98, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43,
-   43, 43, 43, 60,  2,  2,  2, 44, 27, 27, 27,  7,  7,  7,  7,  7,
-   71, 70, 71, 44, 44, 44, 44, 57, 86, 87, 43, 85, 87, 60,185,  2,
-    2, 80, 44, 44, 44, 44, 79, 44, 43, 71, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 70, 43, 43, 87, 43, 43, 43, 80,  7,  7,  7,  7,  7,
-    2,  2, 94, 98, 44, 44, 44, 44, 36, 70,  2, 61, 44, 44, 44, 44,
-   36, 94, 86, 43, 43, 43, 43, 85, 98, 36, 63,  2, 59, 43, 60, 87,
-    7,  7,  7,  7,  7, 63, 63,  2,179, 27, 27, 27, 27, 27, 27, 27,
-   27, 27,100, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 86, 87,
-   43, 86, 85, 43,  2,  2,  2, 71, 70, 44, 44, 44, 44, 44, 44, 44,
-   36, 36, 36, 61, 61, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 62,
-   36, 36, 36, 36, 63, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 70,
-   86, 87, 43, 43, 43, 80, 44, 44, 43, 86, 62, 36, 36, 36, 61, 62,
-   61, 36, 62, 36, 36, 57, 71, 86, 85, 86, 90, 89, 90, 89, 86, 44,
-   61, 44, 44, 89, 44, 44, 62, 36, 36, 86, 44, 43, 43, 43, 80, 44,
-   43, 43, 80, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 62, 44, 61,
-   36, 36, 36, 62, 86, 87, 43, 43, 80, 90, 89, 89, 86, 90, 86, 85,
-   71, 71,  2, 93, 64, 44, 44, 44, 57, 80, 44, 44, 44, 44, 44, 44,
-   36, 36, 94, 86, 43, 43, 43, 43, 86, 43, 85, 71, 36, 63,  2,  2,
-    7,  7,  7,  7,  7,  2, 93, 71, 86, 87, 43, 43, 85, 85, 86, 87,
-   85, 43, 36, 72, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 94,
-   86, 43, 43, 44, 86, 86, 43, 87, 60,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2, 36, 36, 43, 44, 86, 87, 43, 43, 43, 85, 87, 87,
-   60,  2, 61, 44, 44, 44, 44, 44,  2,  2,  2,  2,  2,  2, 64, 44,
-   36, 36, 36, 36, 36, 70, 87, 86, 43, 43, 43, 87, 63, 44, 44, 44,
-    7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 44, 44, 44, 44, 44, 44,
-   36, 36, 36, 36, 36, 61, 57, 87, 86, 43, 43, 87, 43, 43, 44, 44,
-    7,  7,  7,  7,  7, 27,  2, 97, 43, 43, 43, 43, 87, 60, 44, 44,
-   27,100, 44, 44, 44, 44, 44, 62, 36, 36, 36, 61, 62, 44, 36, 36,
-   36, 36, 62, 61, 36, 36, 36, 36, 86, 86, 86, 89, 90, 57, 85, 71,
-   98, 87,  2, 64, 44, 44, 44, 44, 36, 36, 36, 36, 44, 36, 36, 36,
-   94, 86, 43, 43, 44, 43, 86, 86, 71, 72, 90, 44, 44, 44, 44, 44,
-   70, 43, 43, 43, 43, 71, 36, 36, 36, 70, 43, 43, 85, 70, 43, 60,
-    2,  2,  2, 59, 44, 44, 44, 44, 70, 43, 43, 85, 87, 43, 36, 36,
-   36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 85, 43,  2, 72,  2,
-    2, 64, 44, 44, 44, 44, 44, 44,  2,  2,  2,  2,  2, 44, 44, 44,
-   63, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43, 80, 43, 43, 43, 87,
-   63,  2,  2, 44, 44, 44, 44, 44,  2, 36, 36, 36, 36, 36, 36, 36,
-   44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 89, 43, 43, 43,
-   85, 43, 87, 80, 44, 44, 44, 44, 36, 36, 36, 61, 36, 62, 36, 36,
-   70, 43, 43, 80, 44, 80, 43, 57, 43, 43, 43, 70, 44, 44, 44, 44,
-   36, 36, 36, 62, 61, 36, 36, 36, 36, 36, 36, 36, 36, 86, 86, 90,
-   43, 89, 87, 87, 61, 44, 44, 44, 36, 70, 85,107, 64, 44, 44, 44,
-   43, 94, 36, 36, 36, 36, 36, 36, 36, 36, 86, 43, 43, 80, 44, 86,
-   85, 60,  2,  2,  2,  2,  2,  2,  7,  7,  7,  7,  7, 80, 44, 44,
-   27, 27, 91, 67, 67, 67, 56, 20,168, 67, 67, 67, 67, 67, 67, 67,
-   67, 44, 44, 44, 44, 44, 44, 93,105,105,105,105,105,105,105,181,
-    2,  2, 64, 44, 44, 44, 44, 44, 63, 64, 44, 44, 44, 44, 44, 44,
-   65, 65, 65, 65, 65, 65, 65, 65, 71, 36, 36, 70, 43, 43, 43, 43,
-   43, 43, 43, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 43,
-   43, 43, 43, 43, 43, 86, 87, 43, 43, 43, 60, 44, 44, 44, 44, 44,
-   43, 43, 43, 60,  2,  2, 67, 67, 40, 40, 97, 44, 44, 44, 44, 44,
-    7,  7,  7,  7,  7,179, 27, 27, 27, 62, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 44, 44, 62, 36, 40, 69, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 83,164,  2, 27, 27, 27, 30,  2, 64, 44, 44,
-   36, 36, 36, 36, 36, 61, 44, 57, 94, 86, 86, 86, 86, 86, 86, 86,
-   86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 44, 44, 44, 57,
-   43, 74, 40, 40, 40, 40, 40, 40, 40, 88, 80, 44, 44, 44, 44, 44,
-   86, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 62,
-   40, 40, 52, 40, 40, 40, 52, 81, 36, 61, 44, 44, 44, 44, 44, 44,
-   44, 61, 44, 44, 44, 44, 44, 44, 36, 61, 62, 44, 44, 44, 44, 44,
-   44, 44, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 44, 50, 60,
-   65, 65, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 43, 43, 44,
-   43, 43, 43, 80, 44, 44, 44, 44, 67, 67, 67, 92, 55, 67, 67, 67,
-   67, 67,186, 87, 43, 67,186, 86, 86,187, 65, 65, 65, 84, 43, 43,
-   43, 76, 50, 43, 43, 43, 67, 67, 67, 67, 67, 67, 67, 43, 43, 67,
-   67, 43, 76, 44, 44, 44, 44, 44, 27, 27, 44, 44, 44, 44, 44, 44,
-   11, 11, 11, 11, 11, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 11,
-   11, 11, 11, 11, 11, 11, 11, 16, 16, 16,110, 16, 16, 16, 16, 16,
-   11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 47, 11,
-   44, 47, 48, 47, 48, 11, 47, 11, 11, 11, 11, 16, 16,150,150, 16,
-   16, 16,150, 16, 16, 16, 16, 16, 16, 16, 11, 48, 11, 47, 48, 11,
-   11, 11, 47, 11, 11, 11, 47, 16, 16, 16, 16, 16, 11, 48, 11, 47,
-   11, 11, 47, 47, 44, 11, 11, 11, 47, 16, 16, 16, 16, 16, 16, 16,
-   16, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 16, 16, 16, 16, 16,
-   16, 16, 16, 44, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16, 16, 16,
-   16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11, 11, 11,
-   11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11,
-   11, 11, 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33,
-   16, 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31,
-   16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16,
-   16, 33, 16, 16, 16, 32, 44,  7, 43, 43, 43, 76, 67, 50, 43, 43,
-   43, 43, 43, 43, 43, 43, 76, 67, 67, 67, 50, 67, 67, 67, 67, 67,
-   67, 67, 76, 21,  2,  2, 44, 44, 44, 44, 44, 44, 44, 57, 43, 43,
-   16, 16, 16, 16, 16, 39, 16, 16, 16, 16, 16, 16, 16, 16, 16,110,
-   44, 44,150, 16, 16,110, 44, 44, 43, 43, 43, 80, 43, 43, 43, 43,
-   43, 43, 43, 43, 80, 57, 43, 43, 43, 57, 80, 43, 43, 80, 44, 44,
-   40, 40, 40, 40, 40, 40, 40, 44, 44, 44, 44, 44, 44, 44, 44, 57,
-   43, 43, 43, 74, 40, 40, 40, 44,  7,  7,  7,  7,  7, 44, 44, 77,
-   36, 36, 36, 36, 36, 36, 36, 80, 36, 36, 36, 36, 36, 36, 43, 43,
-    7,  7,  7,  7,  7, 44, 44, 96, 36, 36, 36, 36, 36, 83, 43, 43,
-  188,  7,  7,  7,  7,189, 44, 93, 36, 36, 36, 61, 36, 36, 62, 61,
-   36, 36, 61,179, 27, 27, 27, 27, 16, 16, 43, 43, 43, 74, 44, 44,
-   27, 27, 27, 27, 27, 27,163, 27,190, 27,100, 44, 44, 44, 44, 44,
-   27, 27, 27, 27, 27, 27, 27,163, 27, 27, 27, 27, 27, 27, 27, 44,
-   36, 36, 62, 36, 36, 36, 36, 36, 62, 61, 61, 62, 62, 36, 36, 36,
-   36, 61, 36, 36, 62, 62, 44, 44, 44, 61, 44, 62, 62, 62, 62, 36,
-   62, 61, 61, 62, 62, 62, 62, 62, 62, 61, 61, 62, 36, 61, 36, 36,
-   36, 61, 36, 36, 62, 36, 61, 61, 36, 36, 36, 36, 36, 62, 36, 36,
-   62, 36, 62, 36, 36, 62, 36, 36,  8, 44, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 67, 67, 67, 44, 44, 55, 67, 67, 67, 67, 67, 67, 67,
-   27, 27, 27, 27, 27, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 44,
-   44, 44, 44, 67, 67, 67, 67, 67, 67, 92, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 67, 92, 44, 44, 44, 67, 44, 44, 44, 44, 44, 44, 44,
-   67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 67, 67,
-   67, 67, 67, 92, 44, 55, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44,
-   67, 67, 67, 67, 67, 44, 44, 55, 67, 67, 67, 92, 44, 44, 44, 67,
-   67, 67, 67, 67, 67, 67, 92, 55, 67, 92, 67, 67, 67, 67, 67, 67,
-   79, 44, 44, 44, 44, 44, 44, 44,171,171,171,171,171,171,171, 44,
-  171,171,171,171,171,171,171,  0,  0,  0, 29, 21, 21, 21, 23, 21,
-   22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21,  9,  9,  9,
-    9, 22, 21, 18, 24, 16, 24,  5,  5,  5,  5, 22, 25, 18, 25,  0,
-   23, 23, 26, 21, 24, 26,  7, 20, 25,  1, 26, 24, 26, 25, 15, 15,
-   24, 15,  7, 19, 15, 21,  9, 25,  9,  5,  5, 25,  5,  9,  5,  7,
-    7,  7,  9,  8,  8,  5,  7,  5,  6,  6, 24, 24,  6, 24, 12, 12,
-    2,  2,  6,  5,  9, 21,  9,  2,  2,  9, 25,  9, 26, 12, 11, 11,
-    2,  6,  5, 21, 17,  2,  2, 26, 26, 23,  2, 12, 17, 12, 21, 12,
-   12, 21,  7,  2,  2,  7,  7, 21, 21,  2,  1,  1, 21, 23, 26, 26,
-    1, 21,  6,  7,  7, 12, 12,  7, 21,  7, 12,  1, 12,  6,  6, 12,
-   12, 26,  7, 26, 26,  7,  2,  1, 12,  2,  6,  2, 24,  7,  7,  6,
-    1, 12, 12, 10, 10, 10, 10, 12, 21,  6,  2, 10, 10,  2, 15, 26,
-   26,  2,  2, 21,  7, 10, 15,  7,  2, 23, 21, 26, 10,  7, 21, 15,
-   15,  2, 17,  7, 29,  7,  7, 22, 18,  2, 14, 14, 14,  7, 10, 21,
-   17, 21, 11, 12,  5,  2,  5,  6,  8,  8,  8, 24,  5, 24,  2, 24,
-    9, 24, 24,  2, 29, 29, 29,  1, 17, 17, 20, 19, 22, 20, 27, 28,
-    1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29,
-    1,  2, 15,  6, 18,  6, 23,  2, 12, 11,  9, 26, 26,  9, 26,  5,
-    5, 26, 14,  9,  5, 14, 14, 15, 25, 26, 26, 22, 18, 26, 18, 25,
-   18, 22,  5, 12,  2,  5, 22, 21, 21, 22, 18, 17, 26,  6,  7, 14,
-   17, 22, 18, 18, 26, 14, 17,  6, 14,  6, 12, 24, 24,  6, 26, 15,
-    6, 21, 11, 21, 24,  9,  6,  9, 23, 26,  6, 10,  4,  4,  3,  3,
-    7, 25, 17, 16, 16, 22, 16, 16, 25, 17, 25,  2, 25, 24,  2, 15,
-   12, 15, 14,  2, 21, 14,  7, 15, 12, 17, 21,  1, 26, 10, 10,  1,
-    7, 13, 13,  2, 23, 15,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
-    0, 10, 11, 12, 13,  0, 14,  0,  0,  0,  0,  0, 15,  0, 16,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0, 17, 18, 19,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0, 20,  0, 21, 22, 23,  0,  0,  0, 24, 25, 26, 27, 28,
-   29, 30, 31, 32, 33, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 35,  0,  0,  0,  0, 36,  0, 37,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39, 40,
-    0,  0,  0,  0,  0,  0, 41, 42, 43,  0, 44,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  0,  0,  0,  0,  3,  0,
-    0,  0,  4,  5,  6,  7,  0,  8,  9, 10,  0, 11, 12, 13, 14, 15,
-   16, 17, 16, 18, 16, 19, 16, 19, 16, 19,  0, 19, 16, 20, 16, 19,
-   21, 19,  0, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,  0, 32,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0, 33,  0,  0,  0,  0,  0,  0,
-   34,  0,  0, 35,  0,  0, 36,  0, 37,  0,  0,  0, 38, 39, 40, 41,
-   42, 43, 44, 45, 46,  0,  0, 47,  0,  0,  0, 48,  0,  0,  0, 49,
-    0,  0,  0,  0,  0,  0,  0, 50,  0, 51,  0, 52, 53,  0, 54,  0,
-    0,  0,  0,  0,  0, 55, 56, 57,  0,  0,  0,  0, 58,  0,  0, 59,
-   60, 61, 62, 63,  0,  0, 64, 65,  0,  0,  0, 66,  0,  0,  0,  0,
-   67,  0,  0,  0, 68,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0, 69,  0,  0,  0, 70,  0, 71,  0,  0, 72,  0,  0, 73,
-    0,  0,  0,  0,  0,  0,  0,  0, 74, 75,  0,  0,  0,  0, 76, 77,
-    0, 78, 79,  0,  0, 80, 81,  0, 82, 62,  0, 83, 84,  0,  0, 85,
-   86, 87,  0, 88,  0, 89,  0, 90,  0,  0, 51, 91, 51,  0, 92,  0,
-   93,  0,  0,  0, 81,  0,  0,  0, 94, 95,  0, 96, 97, 98, 99,  0,
-    0,  0,  0,  0, 51,  0,  0,  0,  0,100,101,  0,  0,  0,  0,  0,
-    0,102,  0,  0,  0,  0,  0,  0,103,  0,  0,  0,  0,  0,  0,104,
-  105,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,106,  0,  0,107,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,108,109,  0,  0,110,  0,  0,
-    0,  0,  0,  0,111,  0,112,  0,105,  0,  0,  0,  0,  0,113,114,
-    0,  0,  0,  0,  0,  0,  0,115,  0,  0,  0,116,  0,  0,  0,117,
-    0,118,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  0,
+   32, 32, 11, 11, 34, 34, 32, 32, 32, 32, 32, 32, 32, 32, 46, 43,
+   51, 39,166, 35, 39, 35, 36, 36, 36, 70, 36, 70, 36, 69, 36, 36,
+   36, 93, 86, 84, 66, 66, 79, 43, 27, 27, 27, 66,167, 43, 43, 43,
+   36, 36,  2,  2, 43, 43, 43, 43, 85, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 85, 85, 85, 85, 85, 85, 85, 85, 42, 43, 43, 43, 43,  2,
+   42, 36, 36, 36,  2, 71, 71, 69, 36, 36, 36, 42, 42, 42, 42,  2,
+   36, 36, 36, 69, 42, 42, 42, 42, 42, 85, 43, 43, 43, 43, 43, 92,
+   36, 69, 85, 42, 42, 85, 42, 85,106,  2,  2,  2,  2,  2,  2, 51,
+    7,  7,  7,  7,  7, 43, 43,  2, 36, 36, 69, 68, 36, 36, 36, 36,
+    7,  7,  7,  7,  7, 36, 36, 60, 36, 36, 36, 36, 69, 42, 42, 84,
+   86, 84, 86, 79, 43, 43, 43, 43, 36, 69, 36, 36, 36, 36, 84, 43,
+    7,  7,  7,  7,  7, 43,  2,  2, 68, 36, 36, 76, 66, 93, 84, 36,
+   70, 42, 70, 69, 70, 36, 36, 42, 69, 60, 43, 43, 43, 43, 43, 43,
+   43, 43, 43, 43, 43, 61, 82,  2, 36, 36, 36, 36, 36, 93, 42, 85,
+    2, 82,168, 79, 43, 43, 43, 43, 61, 36, 36, 60, 61, 36, 36, 60,
+   61, 36, 36, 60, 43, 43, 43, 43, 16, 16, 16, 16, 16,113, 39, 39,
+   16, 16, 16, 16,110, 40, 43, 43, 36, 93, 86, 85, 84,106, 86, 43,
+   36, 36, 43, 43, 43, 43, 43, 43, 36, 36, 36, 60, 43, 61, 36, 36,
+  169,169,169,169,169,169,169,169,170,170,170,170,170,170,170,170,
+   16, 16, 16,109, 43, 43, 43, 43, 43,149, 16, 16, 43, 43, 61, 70,
+   36, 36, 36, 36,171, 36, 36, 36, 36, 36, 36, 60, 36, 36, 60, 60,
+   36, 61, 60, 36, 36, 36, 36, 36, 36, 40, 40, 40, 40, 40, 40, 40,
+   40, 22, 66, 66, 66, 66, 66, 66, 66, 77, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 36,147, 66, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 66, 66, 66, 66, 36, 36, 36, 36, 36, 36,167, 66,
+    2,  2,  2,151,129, 43, 43, 43,  6,172,173,147,147,147,147,147,
+  147,147,129,151,129,  2,126,174,  2, 63,  2,  2,155,147,147,129,
+    2,175,  8,176, 65,  2, 43, 43, 36, 36, 60, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 60, 78, 92,  2,  3,  2,  4,  5,  6,  2,
+   16, 16, 16, 16, 16, 17, 18,128,129,  4,  2, 36, 36, 36, 36, 36,
+   68, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 39,
+   43, 36, 36, 36, 43, 36, 36, 36, 43, 36, 36, 36, 43, 36, 60, 43,
+   20,177, 55,178, 26,  8,143, 91, 43, 43, 43, 43, 78, 64, 66, 43,
+   36, 36, 36, 36, 36, 36, 61, 36, 36, 36, 36, 36, 36, 60, 36, 61,
+    2, 63, 43,179, 27, 27, 27, 27, 27, 27, 43, 54, 66, 66, 66, 66,
+  104,104,142, 27, 90, 66, 66, 66, 66, 66, 66, 66, 66, 27, 66, 91,
+   66, 66, 66, 66, 66, 66, 91, 43, 91, 43, 43, 43, 43, 43, 43, 43,
+   66, 66, 66, 66, 66, 66, 49, 43,180, 27, 27, 27, 27, 27, 27, 27,
+   27, 27, 27, 27, 27, 27, 43, 43, 27, 27, 43, 43, 43, 43, 61, 36,
+  154, 36, 36, 36, 36,181, 43, 43, 36, 36, 36, 42, 42, 79, 43, 43,
+   36, 36, 36, 36, 36, 36, 36, 92, 36, 36, 43, 43, 36, 36, 36, 36,
+  182,104,104, 43, 43, 43, 43, 43, 11, 11, 11, 11, 16, 16, 16, 16,
+   11, 11, 43, 43, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 43, 43,
+   36, 36, 36, 36, 43, 43, 43, 43, 36, 36, 43, 43, 43, 43, 43, 92,
+   11, 11, 11, 11, 11, 46, 11, 11, 11, 46, 11,149, 16, 16, 16, 16,
+   16,149, 16, 16, 16, 16, 16, 16, 16,149, 16, 16, 16,149,109, 43,
+   39, 39, 39, 51, 39, 39, 39, 39, 80, 39, 39, 39, 39, 80, 43, 43,
+   36, 36, 36, 43, 60, 36, 36, 36, 36, 36, 36, 61, 60, 43, 60, 61,
+   36, 36, 36, 92, 27, 27, 27, 27, 36, 36, 36, 76,162, 27, 27, 27,
+   43, 43, 43,179, 27, 27, 27, 27, 36, 60, 36, 43, 43,179, 27, 27,
+   36, 36, 36, 27, 27, 27, 43, 92, 36, 36, 36, 36, 36, 43, 43, 92,
+   36, 36, 36, 36, 43, 43, 27, 36, 43, 27, 27, 27, 27, 27, 27, 27,
+   69, 42, 56, 79, 43, 43, 42, 42, 36, 36, 61, 36, 61, 36, 36, 36,
+   36, 36, 36, 43, 42, 79, 43, 56, 27, 27, 27, 27, 99, 43, 43, 43,
+    2,  2,  2,  2, 63, 43, 43, 43, 36, 36, 36, 36, 36, 36,183, 30,
+   36, 36, 36, 36, 36, 36,183, 27, 36, 36, 36, 36, 77, 36, 36, 36,
+   36, 36, 69, 79, 43,179, 27, 27,  2,  2,  2, 63, 43, 43, 43, 43,
+   36, 36, 36, 43, 92,  2,  2,  2, 36, 36, 36, 43, 27, 27, 27, 27,
+   36, 60, 43, 43, 27, 27, 27, 27, 36, 43, 43, 43, 92,  2, 63, 43,
+   43, 43, 43, 43,179, 27, 27, 27, 11, 46, 43, 43, 43, 43, 43, 43,
+   16,109, 43, 43, 43, 27, 27, 27, 36, 36, 42, 42, 43, 43, 43, 43,
+    7,  7,  7,  7,  7, 36, 36, 68, 11, 11, 11, 43, 56, 42, 42,158,
+   16, 16, 16, 43, 43, 43, 43,  8, 27, 27, 27, 27, 27, 27, 27, 99,
+   36, 36, 36, 36, 36, 56,184, 43, 36, 43, 43, 43, 43, 43, 43, 43,
+   43, 36, 82, 36, 43, 43, 43, 43, 96, 66, 66, 66, 91, 43, 43, 43,
+   43, 43, 43, 43, 43, 42, 42, 42, 27, 27, 27, 94, 43, 43, 43, 43,
+  180, 27, 30,  2,  2, 43, 43, 43, 36, 42, 42,  2,  2, 43, 43, 43,
+   36, 36,183, 27, 27, 27, 43, 43, 86, 97, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 42, 42, 42, 42, 42, 42, 42, 59,  2,  2,  2, 43,
+   27, 27, 27,  7,  7,  7,  7,  7, 70, 69, 70, 43, 43, 43, 43, 56,
+   85, 86, 42, 84, 86, 59,185,  2,  2, 79, 43, 43, 43, 43, 78, 43,
+   42, 70, 36, 36, 36, 36, 36, 36, 36, 36, 36, 69, 42, 42, 86, 42,
+   42, 42, 79,  7,  7,  7,  7,  7,  2,  2, 93, 97, 43, 43, 43, 43,
+   36, 69,  2, 60, 43, 43, 43, 43, 36, 93, 85, 42, 42, 42, 42, 84,
+   97, 36, 62,  2, 58, 42, 59, 86,  7,  7,  7,  7,  7, 62, 62,  2,
+  179, 27, 27, 27, 27, 27, 27, 27, 27, 27, 99, 43, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 36, 85, 86, 42, 85, 84, 42,  2,  2,  2, 70,
+   69, 43, 43, 43, 43, 43, 43, 43, 36, 36, 36, 60, 60, 36, 36, 61,
+   36, 36, 36, 36, 36, 36, 36, 61, 36, 36, 36, 36, 62, 43, 43, 43,
+   36, 36, 36, 36, 36, 36, 36, 69, 85, 86, 42, 42, 42, 79, 43, 43,
+   42, 85, 61, 36, 36, 36, 60, 61, 60, 36, 61, 36, 36, 56, 70, 85,
+   84, 85, 89, 88, 89, 88, 85, 43, 60, 43, 43, 88, 43, 43, 61, 36,
+   36, 85, 43, 42, 42, 42, 79, 43, 42, 42, 79, 43, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 61, 43, 60, 36, 36, 36, 61, 85, 86, 42, 42,
+   79, 89, 88, 88, 85, 89, 85, 84, 70, 70,  2, 92, 63, 43, 43, 43,
+   56, 79, 43, 43, 43, 43, 43, 43, 36, 36, 93, 85, 42, 42, 42, 42,
+   85, 42, 84, 70, 36, 62,  2,  2,  7,  7,  7,  7,  7,  2, 92, 70,
+   85, 86, 42, 42, 84, 84, 85, 86, 84, 42, 36, 71, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 36, 36, 93, 85, 42, 42, 43, 85, 85, 42, 86,
+   59,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 36, 36, 42, 43,
+   85, 86, 42, 42, 42, 84, 86, 86, 59,  2, 60, 43, 43, 43, 43, 43,
+    2,  2,  2,  2,  2,  2, 63, 43, 36, 36, 36, 36, 36, 69, 86, 85,
+   42, 42, 42, 86, 62, 43, 43, 43,  7,  7,  7,  7,  7,  7,  7,  7,
+    7,  7, 43, 43, 43, 43, 43, 43, 36, 36, 36, 36, 36, 60, 56, 86,
+   85, 42, 42, 86, 42, 42, 43, 43,  7,  7,  7,  7,  7, 27,  2, 96,
+   42, 42, 42, 42, 86, 59, 43, 43, 27, 99, 43, 43, 43, 43, 43, 61,
+   36, 36, 36, 60, 61, 43, 36, 36, 36, 36, 61, 60, 36, 36, 36, 36,
+   85, 85, 85, 88, 89, 56, 84, 70, 97, 86,  2, 63, 43, 43, 43, 43,
+   36, 36, 36, 36, 43, 36, 36, 36, 93, 85, 42, 42, 43, 42, 85, 85,
+   70, 71, 89, 43, 43, 43, 43, 43, 69, 42, 42, 42, 42, 70, 36, 36,
+   36, 69, 42, 42, 84, 69, 42, 59,  2,  2,  2, 58, 43, 43, 43, 43,
+   69, 42, 42, 84, 86, 42, 36, 36, 36, 36, 36, 36, 36, 42, 42, 42,
+   42, 42, 42, 84, 42,  2, 71,  2,  2, 63, 43, 43, 43, 43, 43, 43,
+    2,  2,  2,  2,  2, 43, 43, 43, 84, 42, 84, 84, 43, 43, 43, 43,
+   62, 43, 43, 43, 43, 43, 43, 43, 42, 42, 42, 79, 42, 42, 42, 86,
+   62,  2,  2, 43, 43, 43, 43, 43,  2, 36, 36, 36, 36, 36, 36, 36,
+   43, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 88, 42, 42, 42,
+   84, 42, 86, 79, 43, 43, 43, 43, 36, 36, 36, 60, 36, 61, 36, 36,
+   69, 42, 42, 79, 43, 79, 42, 56, 42, 42, 42, 69, 43, 43, 43, 43,
+   36, 36, 36, 61, 60, 36, 36, 36, 36, 36, 36, 36, 36, 85, 85, 89,
+   42, 88, 86, 86, 60, 43, 43, 43, 36, 36, 36, 36, 82, 36, 43, 43,
+   36, 69, 84,106, 63, 43, 43, 43, 42, 93, 36, 36, 36, 36, 36, 36,
+   36, 36, 85, 42, 42, 79, 43, 85, 84, 59,  2,  2,  2,  2,  2,  2,
+    7,  7,  7,  7,  7, 79, 43, 43, 27, 27, 90, 66, 66, 66, 55, 20,
+  167, 66, 66, 66, 66, 66, 66, 66, 66, 43, 43, 43, 43, 43, 43, 92,
+  104,104,104,104,104,104,104,181,  2,  2, 63, 43, 43, 43, 43, 43,
+   62, 63, 43, 43, 43, 43, 43, 43, 64, 64, 64, 64, 64, 64, 64, 64,
+   70, 36, 36, 69, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 36, 36, 42, 42, 42, 42, 42, 42, 85, 86, 42,
+   42, 42, 59, 43, 43, 43, 43, 43, 42, 42, 42, 59,  2,  2, 66, 66,
+   39, 39, 96, 43, 43, 43, 43, 43,  7,  7,  7,  7,  7,179, 27, 27,
+   27, 61, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 61, 36,
+   39, 68, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 82,163,  2,
+   27, 27, 27, 30,  2, 63, 43, 43, 11, 11, 11, 11, 46,149, 16, 16,
+   16, 16, 43, 43, 43, 43, 43, 43, 36, 36, 36, 36, 36, 60, 43, 56,
+   93, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+   85, 85, 85, 85, 43, 43, 43, 56, 42, 73, 39, 39, 39, 39, 39, 39,
+   39, 87, 79, 43, 43, 43, 43, 43, 85, 39,104,181, 43, 43, 43, 43,
+   43, 43, 43, 43, 43, 43, 43, 61, 36, 60, 43, 43, 43, 43, 43, 43,
+   39, 39, 51, 39, 39, 39, 51, 80, 43, 60, 43, 43, 43, 43, 43, 43,
+   36, 60, 61, 43, 43, 43, 43, 43, 43, 43, 36, 36, 43, 43, 43, 43,
+   36, 36, 36, 36, 36, 43, 49, 59, 64, 64, 43, 43, 43, 43, 43, 43,
+    7,  7,  7,  7,  7, 66, 91, 43, 66, 66, 43, 43, 43, 66, 66, 66,
+  176, 43, 43, 43, 43, 43, 43, 43, 42, 42, 42, 79, 43, 43, 43, 43,
+   66, 66, 66, 91, 54, 66, 66, 66, 66, 66,186, 86, 42, 66,186, 85,
+   85,187, 64, 64, 64, 83, 42, 42, 42, 75, 49, 42, 42, 42, 66, 66,
+   66, 66, 66, 66, 66, 42, 42, 66, 66, 42, 75, 43, 43, 43, 43, 43,
+   27, 27, 43, 43, 43, 43, 43, 43, 11, 11, 11, 11, 11, 16, 16, 16,
+   16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16,
+   16, 16,109, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16,
+   16, 16, 16, 16, 16, 16, 46, 11, 43, 46, 47, 46, 47, 11, 46, 11,
+   11, 11, 11, 16, 16,149,149, 16, 16, 16,149, 16, 16, 16, 16, 16,
+   16, 16, 11, 47, 11, 46, 47, 11, 11, 11, 46, 11, 11, 11, 46, 16,
+   16, 16, 16, 16, 11, 47, 11, 46, 11, 11, 46, 46, 43, 11, 11, 11,
+   46, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, 11,
+   11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 43, 11, 11, 11, 11,
+   31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16,
+   16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16,
+   16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16,
+   16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11,
+   11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16,
+   11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 32, 43,  7,
+   42, 42, 42, 75, 66, 49, 42, 42, 42, 42, 42, 42, 42, 42, 75, 66,
+   66, 66, 49, 66, 66, 66, 66, 66, 66, 66, 75, 21,  2,  2, 43, 43,
+   43, 43, 43, 43, 43, 56, 42, 42, 16, 16, 16, 16, 16,138, 16, 16,
+   16, 16, 16, 16, 16, 16, 16,109, 43, 43,149, 16, 16,109, 43, 43,
+   42, 42, 42, 79, 42, 42, 42, 42, 42, 42, 42, 42, 79, 56, 42, 42,
+   42, 56, 79, 42, 42, 79, 43, 43, 39, 39, 39, 39, 39, 39, 39, 43,
+   43, 43, 43, 43, 43, 43, 43, 56, 42, 42, 42, 73, 39, 39, 39, 43,
+    7,  7,  7,  7,  7, 43, 43, 76, 36, 36, 36, 36, 36, 36, 36, 79,
+   36, 36, 36, 36, 36, 36, 42, 42,  7,  7,  7,  7,  7, 43, 43, 95,
+   36, 36, 36, 36, 36, 82, 42, 42,188,  7,  7,  7,  7,189, 43, 92,
+   36, 69, 36, 70, 36, 36, 36, 42, 36, 36, 69, 43, 43, 43, 43, 82,
+   36, 36, 36, 60, 36, 36, 61, 60, 36, 36, 60,179, 27, 27, 27, 27,
+   16, 16, 42, 42, 42, 73, 43, 43, 27, 27, 27, 27, 27, 27,162, 27,
+  190, 27, 99, 43, 43, 43, 43, 43, 27, 27, 27, 27, 27, 27, 27,162,
+   27, 27, 27, 27, 27, 27, 27, 43, 36, 36, 61, 36, 36, 36, 36, 36,
+   61, 60, 60, 61, 61, 36, 36, 36, 36, 60, 36, 36, 61, 61, 43, 43,
+   43, 60, 43, 61, 61, 61, 61, 36, 61, 60, 60, 61, 61, 61, 61, 61,
+   61, 60, 60, 61, 36, 60, 36, 36, 36, 60, 36, 36, 61, 36, 60, 60,
+   36, 36, 36, 36, 36, 61, 36, 36, 61, 36, 61, 36, 36, 61, 36, 36,
+    8, 43, 43, 43, 43, 43, 43, 43, 66, 66, 66, 66, 66, 66, 43, 43,
+   54, 66, 66, 66, 66, 66, 66, 66, 27, 27, 27, 27, 27, 27, 90, 66,
+   66, 66, 66, 66, 66, 66, 66, 43, 43, 43, 43, 66, 66, 66, 66, 66,
+   66, 91, 43, 43, 43, 43, 43, 43, 66, 66, 66, 66, 91, 43, 43, 43,
+   66, 43, 43, 43, 43, 43, 43, 43, 66, 66, 66, 66, 66, 25, 40, 40,
+   66, 66, 66, 66, 91, 43, 66, 66, 66, 66, 66, 66, 43, 43, 43, 43,
+    8,  8,  8,  8,176, 43, 43, 43, 66, 66, 66, 66, 66, 91, 43, 66,
+   66, 66, 66, 91, 91, 43, 54, 66, 66, 66, 66, 66, 66, 66, 91, 54,
+   66, 66, 66, 66, 66, 91, 43, 54, 66, 91, 66, 66, 66, 66, 66, 66,
+    7,  7,  7,  7,  7, 91, 43, 43, 78, 43, 43, 43, 43, 43, 43, 43,
+  170,170,170,170,170,170,170, 43,170,170,170,170,170,170,170,  0,
+    0,  0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13,
+   25, 25, 25, 21, 21,  9,  9,  9,  9, 22, 21, 18, 24, 16, 24,  5,
+    5,  5,  5, 22, 25, 18, 25,  0, 23, 23, 26, 21, 24, 26,  7, 20,
+   25,  1, 26, 24, 26, 25, 15, 15, 24, 15,  7, 19, 15, 21,  9, 25,
+    9,  5,  5, 25,  5,  9,  5,  7,  7,  7,  9,  8,  8,  5,  6,  6,
+   24, 24,  6, 24, 12, 12,  2,  2,  6,  5,  9, 21,  9,  2,  2,  9,
+   25,  9, 26, 12, 11, 11,  2,  6,  5, 21, 17,  2,  2, 26, 26, 23,
+    2, 12, 17, 12, 21, 12, 12, 21,  7,  2,  2,  7,  7, 21, 21,  2,
+    1,  1, 21, 23, 26, 26,  1, 21,  6,  7,  7, 12, 12,  7, 21,  7,
+   12,  1, 12,  6,  6, 12, 12, 26,  7, 26, 26,  7,  2,  1, 12,  2,
+    6,  2, 24,  7,  7,  6,  1, 12, 12, 10, 10, 10, 10, 12, 21,  6,
+    2, 10, 10,  2, 15, 26, 26,  2,  2, 21,  7, 10, 15,  7,  2, 23,
+   21, 26, 10,  7, 21, 15, 15,  2, 17,  7, 29,  7,  7, 22, 18,  2,
+   14, 14, 14,  7, 10, 21, 17, 21, 11, 12,  5,  2,  5,  6,  8,  8,
+    8, 24,  5, 24,  2, 24,  9, 24, 24,  2, 29, 29, 29,  1, 17, 17,
+   20, 19, 22, 20, 27, 28,  1, 29, 21, 20, 19, 21, 21, 16, 16, 21,
+   25, 22, 18, 21, 21, 29,  1,  2, 15,  6, 18,  6, 12, 11,  9, 26,
+   26,  9, 26,  5,  7,  5,  5, 26, 14,  9,  5, 14, 14, 15, 25, 26,
+   26, 22, 18, 26, 18, 25, 18, 22,  5, 12,  2,  5, 22, 21, 21, 22,
+   18, 17, 26,  6,  7, 14, 17, 22, 18, 18, 26, 14, 17,  6, 14,  6,
+   12, 24, 24,  6, 26, 15,  6, 21, 11, 21, 24,  9,  6,  9, 23, 26,
+    6, 10,  4,  4,  3,  3,  7, 25, 17, 16, 16, 22, 16, 16, 25, 17,
+   25,  2, 25, 24, 23,  2,  2, 15, 12, 15, 14,  2, 21, 14,  7, 15,
+   12, 17, 21,  1, 26, 10, 10,  1,  7, 13, 13,  2, 23, 15,  0,  1,
+    2,  3,  4,  5,  6,  7,  8,  9,  0, 10, 11, 12, 13,  0, 14,  0,
+    0,  0,  0,  0, 15,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0, 17, 18, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 20,  0, 21, 22, 23,
+    0,  0,  0, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 35,  0,
+    0,  0,  0, 36,  0, 37,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,
+    0,  0,  0,  0,  0,  0, 39, 40,  0,  0,  0,  0,  0,  0, 41, 42,
+   43, 44, 45,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    1,  2,  0,  0,  0,  0,  3,  0,  0,  0,  4,  5,  6,  7,  0,  8,
+    9, 10,  0, 11, 12, 13, 14, 15, 16, 17, 16, 18, 16, 19, 16, 19,
+   16, 19,  0, 19, 16, 20, 16, 19, 21, 19,  0, 22, 23, 24, 25, 26,
+   27, 28, 29, 30, 31,  0, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0, 33,  0,  0,  0,  0,  0,  0, 34,  0,  0, 35,  0,  0, 36,  0,
+   37,  0,  0,  0, 38, 39, 40, 41, 42, 43, 44, 45, 46,  0,  0, 47,
+    0,  0,  0, 48,  0,  0,  0, 49,  0,  0,  0,  0,  0,  0,  0, 50,
+    0, 51,  0, 52, 53,  0, 54,  0,  0,  0,  0,  0,  0, 55, 56, 57,
+    0,  0,  0,  0, 58,  0,  0, 59, 60, 61, 62, 63,  0,  0, 64, 65,
+    0,  0,  0, 66,  0,  0,  0,  0, 67,  0,  0,  0, 68,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 69,  0,  0,  0, 70,
+    0, 71,  0,  0, 72,  0,  0, 73,  0,  0,  0,  0,  0,  0,  0,  0,
+   74, 75,  0,  0,  0,  0, 76, 77,  0, 78, 79,  0,  0, 80, 81,  0,
+   82, 62,  0, 83, 84,  0,  0, 85, 86, 87,  0, 88,  0, 89,  0, 90,
+    0,  0, 51, 91, 51,  0, 92,  0, 93,  0,  0,  0, 81,  0,  0,  0,
+   94, 95,  0, 96, 97, 98, 99,  0,  0,  0,  0,  0, 51,  0,  0,  0,
+    0,100,101,  0,  0,  0,  0,  0,  0,102,  0,  0,  0,  0,  0,  0,
+  103,  0,  0,  0,  0,  0,  0,104,105,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,106,  0,  0,107,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,108,109,  0,  0,110,  0,  0,  0,  0,  0,  0,111,  0,112,  0,
+  105,  0,  0,  0,  0,  0,113,114,  0,  0,  0,  0,  0,  0,  0,115,
+    0,  0,  0,116,  0,  0,  0,117,  0,  0,  0,  0,  0,  0,  0,118,
+    0,119,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  0,
     8,  0,  0,  0,  0,  9, 10, 11, 12,  0,  0,  0,  0, 13,  0,  0,
    14, 15,  0, 16,  0, 17, 18,  0,  0, 19,  0, 20, 21,  0,  0,  0,
     0,  0, 22, 23,  0, 24, 25,  0,  0, 26,  0,  0,  0, 27,  0,  0,
@@ -3371,561 +3219,384 @@
     0, 43,  0, 44,  0,  0,  0, 45, 46,  0,  0,  0, 47,  0,  0,  0,
     0,  0,  0, 48, 49,  0,  0,  0,  0, 50,  0,  0,  0, 51,  0, 52,
     0, 53,  0,  0,  0,  0, 54,  0,  0,  0,  0, 55,  0, 56,  0,  0,
-    0,  0, 57, 58,  0,  0,  0, 59, 60,  0,  0,  0,  0,  0,  0, 61,
-   52,  0, 62, 63,  0,  0, 64,  0,  0,  0, 65, 66,  0,  0,  0, 67,
-    0, 68, 69, 70, 71, 72,  1, 73,  0, 74, 75, 76,  0,  0, 77, 78,
-    0,  0,  0, 79,  0,  0,  1,  1,  0,  0, 80,  0,  0, 81,  0,  0,
-    0,  0, 77, 82,  0, 83,  0,  0,  0,  0,  0, 78, 84,  0, 85,  0,
-   52,  0,  1, 78,  0,  0, 86,  0,  0, 87,  0,  0,  0,  0,  0, 88,
-   57,  0,  0,  0,  0,  0,  0, 89, 90,  0,  0, 84,  0,  0, 33,  0,
-    0, 91,  0,  0,  0,  0, 92,  0,  0,  0,  0, 49,  0,  0, 93,  0,
-    0,  0,  0, 94, 95,  0,  0, 96,  0,  0, 97,  0,  0,  0, 98,  0,
-    0,  0, 99,  0,  0,  0,100,  0,  0,  0,  0,101,102, 93,  0,  0,
-  103,  0,  0,  0, 84,  0,  0,104,  0,  0,  0,105,106,  0,  0,107,
-  108,  0,  0,  0,  0,  0,  0,109,  0,  0,110,  0,  0,  0,  0,111,
-   33,  0,112,113,114, 57,  0,  0,115, 35,  0,  0,116,  0,  0,  0,
-  117,  0,  0,  0,  0,  0,  0,118,  0,  0,119,  0,  0,  0,  0,120,
-   88,  0,  0,  0,  0,  0, 57,  0,  0,  0,  0, 52,121,  0,  0,  0,
-    0,122,  0,  0,123,  0,  0,  0,  0,121,  0,  0,124,  0,  0,  0,
-    0,  0, 79,  0,  0,  0,  0,125,  0,  0,  0,126,  0,  0,  0,127,
-    0,128,  0,  0,  0,  0,129,130,131,  0,132,  0,133,  0,  0,  0,
-  134,135,136,  0, 77,  0,  0,  0,  0,  0, 35,  0,  0,  0,137,  0,
-    0,  0,138,  0,  0,  0,139,  0,  0,140,  0,  0,141,  0,  0,  0,
-    0,  0,  0,  0,  1,  1,  1,  1,  1,  2,  3,  4,  5,  6,  7,  4,
-    4,  8,  9, 10,  1, 11, 12, 13, 14, 15, 16, 17, 18,  1,  1,  1,
-   19,  1,  0,  0, 20, 21, 22,  1, 23,  4, 21, 24, 25, 26, 27, 28,
-   29, 30,  0,  0,  1,  1, 31,  0,  0,  0, 32, 33, 34, 35,  1, 36,
-   37,  0,  0,  0,  0, 38,  1, 39, 14, 39, 40, 41, 42,  0,  0,  0,
-   43, 36, 44, 45, 21, 45, 46,  0,  0,  0, 19,  1, 21,  0,  0, 47,
-    0, 38, 48,  1,  1, 49, 49, 50,  0,  0, 51,  0,  0, 19, 52,  1,
-    0,  0, 38, 14,  4,  1,  1,  1, 53, 21, 43, 52, 54, 21, 35,  1,
-    0,  0,  0, 55,  0,  0,  0, 56, 57, 58,  0,  0,  0,  0,  0, 59,
-    0, 60,  0,  0,  0,  0, 61, 62,  0,  0, 63,  0,  0,  0, 64,  0,
-    0,  0, 65,  0,  0,  0, 66,  0,  0,  0, 67,  0,  0,  0, 68,  0,
-    0, 69, 70,  0, 71, 72, 73, 74, 75, 76,  0,  0,  0, 77,  0,  0,
-    0, 78, 79,  0,  0,  0,  0, 47,  0,  0,  0, 49,  0, 80,  0,  0,
-    0, 62,  0,  0, 63,  0,  0, 81,  0,  0, 82,  0,  0,  0, 83,  0,
-    0, 19, 84,  0, 62,  0,  0,  0,  0, 49,  1, 85,  1, 52, 15, 86,
-   36, 10, 21, 87,  0, 55,  0,  0,  0,  0, 19, 10,  1,  0,  0,  0,
-    0,  0, 88,  0,  0, 89,  0,  0, 88,  0,  0,  0,  0, 78,  0,  0,
-   87,  9, 12,  4, 90,  8, 91, 47,  0, 58, 50,  0, 21,  1, 21, 92,
-   93,  1,  1,  1,  1, 94, 95, 96, 97,  1, 98, 58, 81, 99,100,  4,
-   58,  0,  0,  0,  0,  0,  0, 19, 50,  0,  0,  0,  0,  0,  0, 61,
-    0,  0,101,102,  0,  0,103,  0,  0,  1,  1, 50,  0,  0,  0, 38,
-    0, 63,  0,  0,  0,  0,  0, 62,  0,  0,104, 68, 61,  0,  0,  0,
-   78,  0,  0,  0,105,106, 58, 38, 81,  0,  0,  0,  0,  0,  0,107,
-    1, 14,  4, 12, 84,  0,  0,  0,  0, 38, 87,  0,  0,  0,  0,108,
-    0,  0,109, 61,  0,110,  0,  0,  0,  1,  0,  0,  0,  0, 49, 50,
-    0,  0, 19, 58,  0,  0,  0, 51,  0,111, 14, 52,112, 41,  0,  0,
-   62,  0,  0, 61,  0,  0,113,  0, 87,  0,  0,  0, 61, 62,  0,  0,
-   62,  0, 89,  0,  0,113,  0,  0,  0,  0,114,  0,  0,  0, 78, 55,
-    0, 38,  1, 58,  1, 58,  0,  0,  0,  0,  0, 88, 63, 89,  0,  0,
-  115,  0,  0,  0, 55,  0,  0,  0,  0,115,  0,  0,  0,  0, 61,  0,
-    0,  0,  0, 79,  0, 61,  0,  0,  0,  0, 56,  0, 89, 80,  0,  0,
-   79,  0,  0,  0,  8, 91,  0,  0,  1, 87,  0,  0,116,  0,  0,  0,
-    0,  0,  0,117,  0,118,119,120,121,  0,104,  4,122, 49, 23,  0,
-    0,  0, 38, 50, 38, 58,  0,  0,  1, 87,  1,  1,  1,  1, 39,  1,
-   48,105, 87,  0,  0,  0,  0,  1,  0,  0,  0,123,  0,  0,  0,112,
-    4,122,  0,  0,  0,  1,124,  0,  0,  0,  0,  0,230,230,230,230,
-  230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220,
-  220,220,220,202,202,220,220,220,  1,  1,  1,  1,  1,220,220,220,
-  220,230,230,230,230,240,230,220,220,220,230,230,230,220,220,  0,
-  230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233,
-  234,234,233,230,  0,  0,  0,230,  0,220,230,230,230,230,220,230,
-  230,230,222,220,230,230,220,220,230,222,228,230, 10, 11, 12, 13,
-   14, 15, 16, 17, 18, 19, 19, 20, 21, 22,  0, 23,  0, 24, 25,  0,
-  230,220,  0, 18, 30, 31, 32,  0,  0,  0,  0, 27, 28, 29, 30, 31,
-   32, 33, 34,230,230,220,220,230,220,230,230,220, 35,  0,  0,  0,
-    0,  0,230,230,230,  0,  0,230,230,  0,220,230,230,220,  0,  0,
-    0, 36,  0,  0,230,220,230,230,220,220,230,220,220,230,220,230,
-  220,230,230,  0,  0,220,  0,  0,230,230,  0,230,  0,230,230,230,
-  230,230,  0,  0,  0,220,220,220,230,220,220,220,230,230,  0,220,
-   27, 28, 29,230,  7,  0,  0,  0,  0,  9,  0,  0,  0,230,220,230,
-  230,  0,  0,  0,  0,  0,230,  0,  0, 84, 91,  0,  0,  0,  0,  9,
-    9,  0,  0,  0,  0,  0,  9,  0,103,103,  9,  0,107,107,107,107,
-  118,118,  9,  0,122,122,122,122,220,220,  0,  0,  0,220,  0,220,
-    0,216,  0,  0,  0,129,130,  0,132,  0,  0,  0,  0,  0,130,130,
-  130,130,  0,  0,130,  0,230,230,  9,  0,230,230,  0,  0,220,  0,
-    0,  0,  0,  7,  0,  9,  9,  0,  9,  9,  0,  0,  0,230,  0,  0,
-    0,228,  0,  0,  0,222,230,220,220,  0,  0,  0,230,  0,  0,220,
-  230,220,  0,220,230,230,230,  0,  0,  0,  9,  9,  0,  0,  7,  0,
-  230,  0,  1,  1,  1,  0,  0,  0,230,234,214,220,202,230,230,230,
-  230,230,232,228,228,220,218,230,233,220,230,220,230,230,  1,  1,
-    1,  1,  1,230,  0,  1,  1,230,220,230,  1,  1,  0,  0,218,228,
-  232,222,224,224,  0,  8,  8,  0,  0,  0,  0,220,230,  0,230,230,
-  220,  0,  0,230,  0,  0, 26,  0,  0,220,  0,230,230,  1,220,  0,
-    0,230,220,  0,  0,  0,220,220,  0,  0,230,220,  0,  9,  7,  0,
-    0,  7,  9,  0,  0,  0,  9,  7,  6,  6,  0,  0,  0,  0,  1,  0,
-    0,216,216,  1,  1,  1,  0,  0,  0,226,216,216,216,216,216,  0,
-  220,220,220,  0,232,232,220,230,230,230,  7,  0, 16, 17, 17, 33,
-   17, 49, 17, 17, 84, 97,135,145, 26, 17, 17, 17, 17, 17, 17, 17,
+    0,  0, 57, 58,  0,  0,  0, 59, 60, 61, 62,  0,  0,  0,  0, 63,
+   52,  0, 64, 65,  0,  0, 66,  0,  0,  0, 67, 68,  0,  0,  0, 69,
+    0, 70, 71, 72, 73, 74,  1, 75,  0, 76, 77, 78,  0,  0, 79, 80,
+    0,  0,  0, 81,  0,  0,  1,  1,  0,  0, 82,  0,  0, 83,  0,  0,
+    0,  0, 79, 84,  0, 85,  0,  0,  0,  0,  0, 80, 86,  0, 87,  0,
+   52,  0,  1, 80,  0,  0, 88,  0,  0, 89,  0,  0,  0,  0,  0, 90,
+   57,  0,  0,  0,  0,  0,  0, 91, 92,  0,  0, 86,  0,  0, 33,  0,
+    0, 93,  0,  0,  0,  0, 94,  0,  0,  0,  0, 49,  0,  0, 95,  0,
+    0,  0,  0, 96, 97,  0,  0, 98,  0,  0, 99,  0,  0,  0,100,  0,
+    0,  0,101,  0,  0,  0,102,  0,  0,  0,  0,103,104, 95,  0,  0,
+  105,  0,  0,  0, 86,  0,  0,106,  0,  0,  0,107,108,  0,  0,109,
+  110,  0,  0,  0,  0,  0,  0,111,  0,  0,112,  0,  0,  0,  0,113,
+   33,  0,114,115,116, 57,  0,  0,117, 35,  0,  0,118,  0,  0,  0,
+  119,  0,  0,  0,  0,  0,  0,120,  0,  0,121,  0,  0,  0,  0,122,
+   90,  0,  0,  0,  0,  0, 57,  0,  0,  0,  0, 52,123,  0,  0,  0,
+    0,124,  0,  0,125,  0,  0,  0,  0,123,  0,  0,126,  0,  0,  0,
+    0,  0, 81,  0,  0,  0,  0,127,  0,  0,  0,128,  0,  0,  0,129,
+    0,130,  0,  0,  0,  0,131,132,133,  0,134,  0,135,  0,  0,  0,
+  136,137,138,  0, 79,  0,  0,  0,  0,  0, 35,  0,  0,  0,139,  0,
+    0,  0,140,  0,  0,  0,141,  0,  0,  0,142,143,  0,144,  0,  0,
+  145,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  2,  3,  4,
+    5,  6,  7,  4,  4,  8,  9, 10,  1, 11, 12, 13, 14, 15, 16, 17,
+   18,  1,  1,  1, 19,  1,  0,  0, 20, 21, 22,  1, 23,  4, 21, 24,
+   25, 26, 27, 28, 29, 30,  0,  0,  1,  1, 31,  0,  0,  0, 32, 33,
+   34, 35,  1, 36, 37,  0,  0,  0,  0, 38,  1, 39, 14, 39, 40, 41,
+   42,  0,  0,  0, 43, 36, 44, 45, 21, 45, 46,  0,  0,  0, 19,  1,
+   21,  0,  0, 47,  0, 38, 48,  1,  1, 49, 49, 50,  0,  0, 51,  0,
+    0, 19, 52,  1,  0,  0, 38, 14,  4,  1,  1,  1, 53, 21, 43, 52,
+   54, 21, 35,  1,  0,  0,  0, 55,  0,  0,  0, 56, 57, 58,  0,  0,
+    0,  0,  0, 59,  0, 60,  0,  0,  0,  0, 61, 62,  0,  0, 63,  0,
+    0,  0, 64,  0,  0,  0, 65,  0,  0,  0, 66,  0,  0,  0, 67,  0,
+    0,  0, 68,  0,  0, 69, 70,  0, 71, 72, 73, 74, 75, 76,  0,  0,
+    0, 77,  0,  0,  0, 78, 79,  0,  0,  0,  0, 47,  0,  0,  0, 49,
+    0, 80,  0,  0,  0, 62,  0,  0, 63,  0,  0, 81,  0,  0, 82,  0,
+    0,  0, 83,  0,  0, 19, 84,  0, 62,  0,  0,  0,  0, 49,  1, 85,
+    1, 52, 15, 86, 36, 10, 21,  1,  1,  1,  1, 41,  1, 21, 87,  0,
+    0, 55,  0,  0,  0,  0, 19, 10,  1,  0,  0,  0,  0,  0, 88,  0,
+    0, 89,  0,  0, 88,  0,  0,  0,  0, 78,  0,  0, 90,  9, 12,  4,
+   91,  8, 92, 47,  0, 58, 50,  0, 21,  1, 21, 93, 94,  1,  1,  1,
+    1, 95, 96, 97, 98,  1, 99, 58, 81,100,101,  4, 58,  0,  0,  0,
+    0,  0,  0, 19, 50,  0,  0,  0,  0,  0,  0, 61,  0,  0,102,103,
+    0,  0,104,  0,  0,  1,  1, 50,  0,  0,  0, 38,  0, 63,  0,  0,
+    0,  0,  0, 62,  0,  0,105, 68, 61,  0,  0,  0, 78,  0,  0,  0,
+  106,107, 58, 38, 81,  0,  0,  0,  0,  0,  0,108,  1, 14,  4, 12,
+   84,  0,  0,  0,  0, 38, 90,  0,  0,  0,  0,109,  0,  0,110, 61,
+    0,111,  0,  0,  0,  1,  0,  0,  0,  0, 49, 50,  0,  0, 19, 58,
+    0,  0,112, 51,  0,112, 14, 52,113, 41,  0,  0, 62,  0,  0, 61,
+    0,  0,114,  0, 90,  0,  0,  0, 61, 62,  0,  0, 62,  0, 89,  0,
+    0,114,  0,  0,  0,  0,115,  0,  0,  0, 78, 55,  0, 38,  1, 58,
+    1, 58,  0,  0,  0,  0,  0, 88, 63, 89,  0,  0,116,  0,  0,  0,
+   55,  0,  0,  0,  0,116,  0,  0,  0,  0, 61,  0,  0,  0,  0, 79,
+    0, 61,  0,  0,  0,  0, 56,  0, 89, 80,  0,  0, 79,  0,  0,  0,
+    8, 92,  0,  0,  1, 90,  0,  0,117,  0,  0,  0,  0,  0,  0,118,
+    0,119,120,121,122,  0,105,  4,123, 49, 23,  0,  0,  0, 38, 50,
+   38, 58,  0,  0,  1, 90,  1,  1,  1,  1, 39,  1, 48,106, 90,  0,
+    0,  0,  0,  1,  0,  0,  0,124,  0,  0,  0,113, 19, 59,  0, 38,
+    0, 81,  0,  0,  4,123,  0,  0,  0,  1,125,  0,  0,  0,  0,  0,
+  230,230,230,230,230,232,220,220,220,220,232,216,220,220,220,220,
+  220,202,202,220,220,220,220,202,202,220,220,220,  1,  1,  1,  1,
+    1,220,220,220,220,230,230,230,230,240,230,220,220,220,230,230,
+  230,220,220,  0,230,230,230,220,220,220,220,230,232,220,220,230,
+  233,234,234,233,234,234,233,230,  0,  0,  0,230,  0,220,230,230,
+  230,230,220,230,230,230,222,220,230,230,220,220,230,222,228,230,
+   10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22,  0, 23,
+    0, 24, 25,  0,230,220,  0, 18, 30, 31, 32,  0,  0,  0,  0, 27,
+   28, 29, 30, 31, 32, 33, 34,230,230,220,220,230,220,230,230,220,
+   35,  0,  0,  0,  0,  0,230,230,230,  0,  0,230,230,  0,220,230,
+  230,220,  0,  0,  0, 36,  0,  0,230,220,230,230,220,220,230,220,
+  220,230,220,230,220,230,230,  0,  0,220,  0,  0,230,230,  0,230,
+    0,230,230,230,230,230,  0,  0,  0,220,220,220,230,220,220,220,
+  230,230,  0,220, 27, 28, 29,230,  7,  0,  0,  0,  0,  9,  0,  0,
+    0,230,220,230,230,  0,  0,  0,  0,  0,230,  0,  0, 84, 91,  0,
+    0,  0,  0,  9,  9,  0,  0,  0,  0,  0,  9,  0,103,103,  9,  0,
+  107,107,107,107,118,118,  9,  0,122,122,122,122,220,220,  0,  0,
+    0,220,  0,220,  0,216,  0,  0,  0,129,130,  0,132,  0,  0,  0,
+    0,  0,130,130,130,130,  0,  0,130,  0,230,230,  9,  0,230,230,
+    0,  0,220,  0,  0,  0,  0,  7,  0,  9,  9,  0,  9,  9,  0,  0,
+    0,230,  0,  0,  0,228,  0,  0,  0,222,230,220,220,  0,  0,  0,
+  230,  0,  0,220,230,220,  0,220,230,230,230,234,  0,  0,  9,  9,
+    0,  0,  7,  0,230,230,230,  0,230,  0,  1,  1,  1,  0,  0,  0,
+  230,234,214,220,202,230,230,230,230,230,232,228,228,220,218,230,
+  233,220,230,220,230,230,  1,  1,  1,  1,  1,230,  0,  1,  1,230,
+  220,230,  1,  1,  0,  0,218,228,232,222,224,224,  0,  8,  8,  0,
+    0,  0,  0,220,230,  0,230,230,220,  0,  0,230,  0,  0, 26,  0,
+    0,220,  0,230,230,  1,220,  0,  0,230,220,  0,  0,  0,220,220,
+    0,  0,230,220,  0,  9,  7,  0,  0,  7,  9,  0,  0,  0,  9,  7,
+    6,  6,  0,  0,  0,  0,  1,  0,  0,216,216,  1,  1,  1,  0,  0,
+    0,226,216,216,216,216,216,  0,220,220,220,  0,232,232,220,230,
+  230,230,  7,  0, 16, 17, 17, 33, 17, 49, 17, 17, 84, 97,135,145,
+   26, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,177,  0,  1,  2,  3,
-    3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-    4,  3,  3,  3,  3,  3,  5,  3,  3,  3,  3,  3,  6,  7,  8,  3,
-    3,  3,  3,  3,  9, 10, 11, 12, 13,  3,  3,  3,  3,  3,  3,  3,
-    3, 14,  3, 15,  3,  3,  3,  3,  3,  3, 16, 17, 18, 19, 20, 21,
-    3,  3,  3, 22, 23, 24,  3,  3,  3,  3,  3,  3, 25,  3,  3,  3,
-    3,  3,  3,  3,  3, 26,  3,  3, 27, 28,  0,  1,  0,  0,  0,  0,
-    0,  1,  0,  2,  0,  0,  0,  3,  0,  0,  0,  3,  0,  0,  0,  0,
-    0,  4,  0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  6,  0,  0,  0,  7,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  8,  9,  0,  0,  0,  0,  0,  0,  9,  0,  9,  0,  0,
-    0,  0,  0,  0,  0, 10, 11, 12, 13,  0,  0, 14, 15, 16,  6,  0,
-   17, 18, 19, 19, 19, 20, 21, 22, 23, 24, 19, 25,  0, 26, 27, 19,
-   19, 28, 29, 30,  0, 31,  0,  0,  0,  8,  0,  0,  0,  0,  0,  0,
-    0, 19, 28,  0, 32, 33,  9, 34, 35, 19,  0,  0, 36, 37, 38, 39,
-   40, 19,  0, 41, 42, 43, 44, 31,  0,  1, 45, 42,  0,  0,  0,  0,
-    0, 32, 14, 14,  0,  0,  0,  0, 14,  0,  0, 46, 47, 47, 47, 47,
-   48, 49, 47, 47, 47, 47, 50, 51, 52, 53, 43, 21,  0,  0,  0,  0,
-    0,  0,  0, 54,  6, 55,  0, 14, 19,  1,  0,  0,  0,  0, 56, 57,
-    0,  0,  0,  0,  0, 19, 58, 31,  0,  0,  0,  0,  0,  0,  0, 59,
-   14,  0,  0,  0,  0,  1,  0,  2,  0,  0,  0,  3,  0,  0,  0, 60,
-   61,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  2,  3,
-    0,  4,  5,  0,  0,  6,  0,  0,  0,  7,  0,  0,  0,  1,  1,  0,
-    0,  8,  9,  0,  8,  9,  0,  0,  0,  0,  8,  9, 10, 11, 12,  0,
-    0,  0, 13,  0,  0,  0,  0, 14, 15, 16, 17,  0,  0,  0,  1,  0,
-    0, 18, 19,  0,  0,  0, 20,  0,  0,  0,  1,  1,  1,  1,  0,  1,
-    1,  1,  1,  1,  1,  1,  0,  8, 21,  9,  0,  0, 22,  0,  0,  0,
-    0,  1,  0, 23, 24, 25,  0,  0, 26,  0,  0,  0,  8, 21, 27,  0,
-    1,  0,  0,  1,  1,  1,  1,  0,  1, 28, 29, 30,  0, 31, 32, 20,
-    1,  1,  0,  0,  0,  8, 21,  9,  1,  4,  5,  0,  0,  0, 33,  9,
-    0,  1,  1,  1,  0,  8, 21, 21, 21, 21, 34,  1, 35, 21, 21, 21,
-    9, 36,  0,  0, 37, 38,  1,  0, 39,  0,  0,  0,  1,  0,  1,  0,
-    0,  0,  0,  8, 21,  9,  1,  0,  0,  0, 40,  0,  8, 21, 21, 21,
-   21, 21, 21, 21, 21,  9,  0,  1,  1,  1,  1,  8, 21, 21, 21,  9,
-    0,  0,  0, 41,  0, 42, 43,  0,  0,  0,  1, 44,  0,  0,  0, 45,
-    8,  9,  1,  0,  0,  0,  8, 21, 21, 21,  9,  0,  1,  0,  1,  1,
-    8, 21, 21,  9,  0,  4,  5,  8,  9,  1,  0,  0,  0,  1,  2,  3,
-    4,  5,  5,  5,  5,  5,  6,  7,  7,  8,  9, 10, 11, 12, 13, 14,
-   15,  9, 16, 17, 18,  9, 19, 20, 21, 22, 23, 24,  5,  5,  5,  5,
-    5,  5,  5,  5,  5,  5, 25, 26, 27,  5, 28, 29,  5, 30, 31,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 32,  0,  0,  1,
-    2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
-   18, 19, 20, 20, 21, 22, 23, 24, 25, 26, 27, 28,  1, 29, 30, 31,
-   32, 32, 33, 32, 32, 32, 34, 32, 32, 35, 36, 37, 38, 39, 40, 41,
-   42, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
-   44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 44, 44, 44, 44,
-   44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 46, 46,
-   46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
-   56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
-   56, 56, 56, 56, 56, 56, 56, 44, 57, 58, 59, 60, 61, 62, 63, 64,
-   65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
-   81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 95,
-   95, 96, 97, 98, 56, 56, 56, 56, 56, 56, 56, 56, 56, 99,100,100,
-  100,100,101,100,100,100,100,100,100,100,100,100,100,100,100,100,
-  100,102,103,103,104, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,105,
-   56, 56, 56, 56, 56, 56,106,106,107,108, 56,109,110,111,112,112,
-  112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,
-  112,112,112,112,112,113,112,112,112,114,115,116, 56, 56, 56, 56,
-   56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,117,118,119,
-  120, 56, 56, 56, 56, 56, 56, 56, 56, 56,121, 56, 56, 56, 56, 56,
-   56, 56, 56, 56, 56, 56, 56, 56, 56, 56,122, 32,123,124,125,126,
-  127,128,129,130,131,132,133,133,134, 56, 56, 56, 56,135,136,137,
-  138, 56,139,140, 56,141,142,143, 56, 56,144,145,146, 56,147,148,
-  149, 32, 32, 32,150,151,152, 32,153,154, 56, 56, 56, 56, 44, 44,
-   44, 44, 44, 44,155, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
-   44, 44, 44, 44, 44,156,157, 44, 44, 44, 44, 44, 44, 44, 44, 44,
-   44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,158, 44, 44, 44,
-   44, 44, 44, 44, 44, 44, 44, 44, 44,159, 44, 44,160, 56, 56, 56,
-   56, 56, 56, 56, 56, 56, 44, 44,161, 56, 56, 56, 56, 56, 44, 44,
-   44,162, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
-   44,163, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,164,165,
-    0,  1,  0,  1,  2,  3,  0,  1,  2,  3,  4,  5,  6,  7,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-   19, 19, 19, 19, 19, 19, 19, 19, 19,  0,  0,  0,  0,  0,  0,  0,
-   19,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19, 19, 19,  0, 19,  0,
-    0,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19,  0,  0,  0,  0,  0,
-   26, 26,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  9,  9,
-    9,  9,  0,  9,  9,  9,  2,  2,  9,  9,  9,  9,  0,  9,  2,  2,
-    2,  2,  9,  0,  9,  0,  9,  9,  9,  2,  9,  2,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  2,  9,  9,  9,  9,  9,  9,  9,
-   55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,  6,  6,
-    6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  1,  1,  6,  2,  4,
-    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-    4,  4,  4,  4,  4,  2,  4,  4,  4,  2,  2,  4,  4,  4,  2, 14,
-   14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  2,  2,
-    2,  2,  2,  2,  2,  2, 14, 14, 14,  2,  2,  2,  2, 14, 14, 14,
-   14, 14, 14,  2,  2,  2,  3,  3,  3,  3,  3,  0,  3,  3,  3,  3,
-    3,  3,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-    3,  0,  3,  3,  3,  0,  0,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-    3,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  3,  3,  1,  3,
-    3,  3,  3,  3,  3,  3, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
-   37, 37, 37, 37,  2, 37, 37, 37, 37,  2,  2, 37, 37, 37, 38, 38,
-   38, 38, 38, 38, 38, 38, 38, 38,  2,  2,  2,  2,  2,  2, 64, 64,
-   64, 64, 64, 64, 64, 64, 64, 64, 64,  2,  2, 64, 64, 64, 90, 90,
-   90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,  2,  2, 90, 90,
-   90, 90, 90, 90, 90,  2, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
-   95, 95,  2,  2, 95,  2, 37, 37, 37,  2,  2,  2,  2,  2,  3,  3,
-    3,  3,  3,  3,  3,  2,  3,  3,  2,  2,  2,  2,  2,  3,  3,  3,
-    0,  3,  3,  3,  3,  3,  7,  7,  7,  7,  7,  7,  7,  7,  7,  1,
-    1,  1,  1,  7,  7,  7,  7,  7,  7,  7,  0,  0,  7,  7,  5,  5,
-    5,  5,  2,  5,  5,  5,  5,  5,  5,  5,  5,  2,  2,  5,  5,  2,
-    2,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,
-    5,  5,  5,  5,  5,  5,  5,  2,  5,  2,  2,  2,  5,  5,  5,  5,
-    2,  2,  5,  5,  5,  5,  5,  2,  2,  5,  5,  5,  5,  2,  2,  2,
-    2,  2,  2,  2,  2,  5,  2,  2,  2,  2,  5,  5,  2,  5,  5,  5,
-    5,  5,  2,  2,  5,  5,  5,  5,  5,  5,  5,  5,  5,  2,  2, 11,
-   11, 11,  2, 11, 11, 11, 11, 11, 11,  2,  2,  2,  2, 11, 11,  2,
-    2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  2,
-   11, 11, 11, 11, 11, 11, 11,  2, 11, 11,  2, 11, 11,  2, 11, 11,
-    2,  2, 11,  2, 11, 11, 11,  2,  2, 11, 11, 11,  2,  2,  2, 11,
-    2,  2,  2,  2,  2,  2,  2, 11, 11, 11, 11,  2, 11,  2,  2,  2,
-    2,  2,  2,  2, 11, 11, 11, 11, 11, 11, 11, 11, 11,  2,  2, 10,
-   10, 10,  2, 10, 10, 10, 10, 10, 10, 10, 10, 10,  2, 10, 10, 10,
-    2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  2,
-   10, 10, 10, 10, 10, 10, 10,  2, 10, 10,  2, 10, 10, 10, 10, 10,
-    2,  2, 10, 10, 10, 10, 10, 10,  2, 10, 10, 10,  2,  2, 10,  2,
-    2,  2,  2,  2,  2,  2, 10, 10, 10, 10,  2,  2, 10, 10, 10, 10,
-    2,  2,  2,  2,  2,  2,  2, 10, 10, 10, 10, 10, 10, 10,  2, 21,
-   21, 21,  2, 21, 21, 21, 21, 21, 21, 21, 21,  2,  2, 21, 21,  2,
-    2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,  2,
-   21, 21, 21, 21, 21, 21, 21,  2, 21, 21,  2, 21, 21, 21, 21, 21,
-    2,  2, 21, 21, 21, 21, 21,  2,  2, 21, 21, 21,  2,  2,  2,  2,
-    2,  2,  2, 21, 21, 21,  2,  2,  2,  2, 21, 21,  2, 21, 21, 21,
-   21, 21,  2,  2, 21, 21,  2,  2, 22, 22,  2, 22, 22, 22, 22, 22,
-   22,  2,  2,  2, 22, 22, 22,  2, 22, 22, 22, 22,  2,  2,  2, 22,
-   22,  2, 22,  2, 22, 22,  2,  2,  2, 22, 22,  2,  2,  2, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22,  2,  2,  2,  2, 22, 22, 22,  2,
-    2,  2,  2,  2,  2, 22,  2,  2,  2,  2,  2,  2, 22, 22, 22, 22,
-   22,  2,  2,  2,  2,  2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
-   23, 23, 23,  2, 23, 23, 23,  2, 23, 23, 23, 23, 23, 23, 23, 23,
-    2,  2, 23, 23, 23, 23, 23,  2, 23, 23, 23, 23,  2,  2,  2,  2,
-    2,  2,  2, 23, 23,  2, 23, 23, 23,  2,  2, 23,  2,  2, 23, 23,
-   23, 23,  2,  2, 23, 23,  2,  2,  2,  2,  2,  2,  2, 23, 16, 16,
-   16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,  2, 16, 16, 16,  2,
-   16, 16, 16, 16, 16, 16, 16, 16, 16, 16,  2, 16, 16, 16, 16, 16,
-    2,  2, 16, 16, 16, 16, 16,  2, 16, 16, 16, 16,  2,  2,  2,  2,
-    2,  2,  2, 16, 16,  2, 16, 16, 16, 16,  2,  2, 16, 16,  2, 16,
-   16, 16,  2,  2,  2,  2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-   20, 20, 20,  2, 20, 20, 20,  2, 20, 20, 20, 20, 20, 20,  2,  2,
-    2,  2, 20, 20, 20, 20, 20, 20, 20, 20,  2,  2, 20, 20,  2, 36,
-   36, 36,  2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36,  2,  2,  2, 36, 36, 36, 36, 36, 36, 36, 36,
-    2, 36, 36, 36, 36, 36, 36, 36, 36, 36,  2, 36,  2,  2,  2,  2,
-   36,  2,  2,  2,  2, 36, 36, 36, 36, 36, 36,  2, 36,  2,  2,  2,
-    2,  2,  2,  2, 36, 36,  2,  2, 36, 36, 36,  2,  2,  2,  2, 24,
-   24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-   24,  2,  2,  2,  2,  0, 24, 24, 24, 24,  2,  2,  2,  2,  2, 18,
-   18,  2, 18,  2, 18, 18, 18, 18, 18,  2, 18, 18, 18, 18, 18, 18,
-   18, 18, 18, 18, 18, 18, 18, 18, 18, 18,  2, 18,  2, 18, 18, 18,
-   18, 18, 18, 18,  2,  2, 18, 18, 18, 18, 18,  2, 18,  2, 18, 18,
-   18, 18, 18, 18, 18,  2, 18, 18,  2,  2, 18, 18, 18, 18, 25, 25,
-   25, 25, 25, 25, 25, 25,  2, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-   25, 25, 25,  2,  2,  2, 25, 25, 25, 25, 25,  2, 25, 25, 25, 25,
-   25, 25, 25,  0,  0,  0,  0, 25, 25,  2,  2,  2,  2,  2, 33, 33,
-   33, 33, 33, 33, 33, 33,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-    8,  8,  8,  8,  2,  8,  2,  2,  2,  2,  2,  8,  2,  2,  8,  8,
-    8,  0,  8,  8,  8,  8, 12, 12, 12, 12, 12, 12, 12, 12, 30, 30,
-   30, 30, 30, 30, 30, 30, 30,  2, 30, 30, 30, 30,  2,  2, 30, 30,
-   30, 30, 30, 30, 30,  2, 30, 30, 30,  2,  2, 30, 30, 30, 30, 30,
-   30, 30, 30,  2,  2,  2, 30, 30,  2,  2,  2,  2,  2,  2, 29, 29,
-   29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,  2,  2, 28, 28,
-   28, 28, 28, 28, 28, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
-   34, 34, 34,  2,  2,  2, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
-   35,  0,  0,  0, 35, 35, 35,  2,  2,  2,  2,  2,  2,  2, 45, 45,
-   45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,  2,  2,  2,  2,
-    2,  2,  2,  2,  2, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
-   44, 44, 44,  0,  0,  2, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
-   43, 43,  2,  2,  2,  2, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
-   46, 46, 46,  2, 46, 46, 46,  2, 46, 46,  2,  2,  2,  2, 31, 31,
-   31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,  2,  2, 31, 31,
-    2,  2,  2,  2,  2,  2, 32, 32,  0,  0, 32,  0, 32, 32, 32, 32,
-   32, 32, 32, 32, 32, 32, 32, 32,  2,  2,  2,  2,  2,  2, 32,  2,
-    2,  2,  2,  2,  2,  2, 32, 32, 32,  2,  2,  2,  2,  2, 28, 28,
-   28, 28, 28, 28,  2,  2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
-   48, 48, 48, 48, 48,  2, 48, 48, 48, 48,  2,  2,  2,  2, 48,  2,
-    2,  2, 48, 48, 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
-   52, 52, 52, 52,  2,  2, 52, 52, 52, 52, 52,  2,  2,  2, 58, 58,
-   58, 58, 58, 58, 58, 58, 58, 58, 58, 58,  2,  2,  2,  2, 58, 58,
-    2,  2,  2,  2,  2,  2, 58, 58, 58,  2,  2,  2, 58, 58, 54, 54,
-   54, 54, 54, 54, 54, 54, 54, 54, 54, 54,  2,  2, 54, 54, 91, 91,
-   91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,  2, 91, 91,
-   91, 91, 91,  2,  2, 91, 91, 91,  2,  2,  2,  2,  2,  2, 91, 91,
-   91, 91, 91, 91,  2,  2,  1,  1,  1,  1,  1,  1,  1,  2, 62, 62,
-   62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,  2, 62, 62, 76, 76,
-   76, 76, 76, 76, 76, 76, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
-   93, 93,  2,  2,  2,  2,  2,  2,  2,  2, 93, 93, 93, 93, 70, 70,
-   70, 70, 70, 70, 70, 70,  2,  2,  2, 70, 70, 70, 70, 70, 70, 70,
-    2,  2,  2, 70, 70, 70, 73, 73, 73, 73, 73, 73, 73, 73,  6,  6,
-    6,  2,  2,  2,  2,  2,  8,  8,  8,  2,  2,  8,  8,  8,  1,  1,
-    1,  0,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  0,
-    0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  1,
-    0,  2,  2,  2,  2,  2, 19, 19, 19, 19, 19, 19,  9,  9,  9,  9,
-    9,  6, 19, 19, 19, 19, 19, 19, 19, 19, 19,  9,  9,  9,  9,  9,
-   19, 19, 19, 19,  9,  9,  9,  9,  9, 19, 19, 19, 19, 19,  6, 19,
-   19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  9,  9,  9,
-    9,  9,  9,  9,  2,  2,  2,  9,  2,  9,  2,  9,  2,  9,  9,  9,
-    9,  9,  9,  2,  9,  9,  9,  9,  9,  9,  2,  2,  9,  9,  9,  9,
-    9,  9,  2,  9,  9,  9,  2,  2,  9,  9,  9,  2,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  2,  0,  0,  0,  0,  1,  1,  0,  0,  0,  0,
-    0,  0,  0,  2,  0,  0,  0, 19,  2,  2,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0, 19,  0,  0,  0,  0,  0,  0,  0,  2, 19, 19,
-   19, 19, 19,  2,  2,  2,  0,  2,  2,  2,  2,  2,  2,  2,  1,  2,
-    2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  9,  0,  0,  0,
-   19, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 19,  0, 19,  0,
-    0,  0,  2,  2,  2,  2,  0,  0,  2,  2,  2,  2,  2,  2,  0,  0,
-    0,  2,  2,  2,  2,  2, 27, 27, 27, 27, 27, 27, 27, 27,  0,  0,
-    0,  0,  2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0, 56, 56,
-   56, 56, 56, 56, 56, 56, 55, 55, 55, 55,  2,  2,  2,  2,  2, 55,
-   55, 55, 55, 55, 55, 55, 61, 61, 61, 61, 61, 61, 61, 61,  2,  2,
-    2,  2,  2,  2,  2, 61, 61,  2,  2,  2,  2,  2,  2,  2,  0,  0,
-    0,  0,  0,  0,  2,  2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-    2, 13, 13, 13, 13, 13, 13, 13, 13, 13,  2,  2,  2,  2, 13, 13,
-   13, 13, 13, 13,  2,  2,  0,  0,  0,  0,  0, 13,  0, 13,  0, 13,
-   13, 13, 13, 13, 13, 13, 13, 13,  1,  1,  1,  1, 12, 12, 13, 13,
-   13, 13,  0,  0,  0,  0,  2, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-   15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  2,  2,  1,
+   17, 17, 17,177,  0,  1,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+    3,  3,  3,  3,  3,  3,  3,  3,  4,  3,  3,  3,  3,  3,  5,  3,
+    3,  3,  3,  3,  6,  7,  8,  3,  3,  3,  3,  3,  9, 10, 11, 12,
+   13,  3,  3,  3,  3,  3,  3,  3,  3, 14,  3, 15,  3,  3,  3,  3,
+    3,  3, 16, 17, 18, 19, 20, 21,  3,  3,  3, 22, 23, 24,  3,  3,
+    3,  3,  3,  3, 25,  3,  3,  3,  3,  3,  3,  3,  3, 26,  3,  3,
+   27, 28,  0,  1,  0,  0,  0,  0,  0,  1,  0,  2,  0,  0,  0,  3,
+    0,  0,  0,  3,  0,  0,  0,  0,  0,  4,  0,  5,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,  0,  7,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  9,  0,  0,  0,
+    0,  0,  0,  9,  0,  9,  0,  0,  0,  0,  0,  0,  0, 10, 11, 12,
+   13,  0,  0, 14, 15, 16,  6,  0, 17, 18, 19, 19, 19, 20, 21, 22,
+   23, 24, 19, 25,  0, 26, 27, 19, 19, 28, 29, 30,  0, 31,  0,  0,
+    0,  8,  0,  0,  0,  0,  0,  0,  0, 19, 28,  0, 32, 33,  9, 34,
+   35, 19,  0,  0, 36, 37, 38, 39, 40, 19,  0, 41, 42, 43, 44, 31,
+    0,  1, 45, 42,  0,  0,  0,  0,  0, 32, 14, 14,  0,  0,  0,  0,
+   14,  0,  0, 46, 47, 47, 47, 47, 48, 49, 47, 47, 47, 47, 50, 51,
+   52, 53, 43, 21,  0,  0,  0,  0,  0,  0,  0, 54,  6, 55,  0, 14,
+   19,  1,  0,  0,  0,  0, 56, 57,  0,  0,  0,  0,  0, 19, 58, 31,
+    0,  0,  0,  0,  0,  0,  0, 59, 14,  0,  0,  0,  0,  1,  0,  2,
+    0,  0,  0,  3,  0,  0,  0, 60, 61,  0,  0,  0,  0,  0,  0,  0,
+    1,  0,  0,  0,  0,  0,  2,  3,  0,  4,  5,  0,  0,  6,  0,  0,
+    0,  7,  0,  0,  0,  1,  1,  0,  0,  8,  9,  0,  8,  9,  0,  0,
+    0,  0,  8,  9, 10, 11, 12,  0,  0,  0, 13,  0,  0,  0,  0, 14,
+   15, 16, 17,  0,  0,  0,  1,  0,  0, 18, 19,  0,  0,  0, 20,  0,
+    0,  0,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  0,  8,
+   21,  9,  0,  0, 22,  0,  0,  0,  0,  1,  0, 23, 24, 25,  0,  0,
+   26,  0,  0,  0,  8, 21, 27,  0,  1,  0,  0,  1,  1,  1,  1,  0,
+    1, 28, 29, 30,  0, 31, 32, 20,  1,  1,  0,  0,  0,  8, 21,  9,
+    1,  4,  5,  0,  0,  0, 33,  9,  0,  1,  1,  1,  0,  8, 21, 21,
+   21, 21, 34,  1, 35, 21, 21, 21,  9, 36,  0,  0, 37, 38,  1,  0,
+   39,  0,  0,  0,  1,  0,  1,  0,  0,  0,  0,  8, 21,  9,  1,  0,
+    0,  0, 40,  0,  8, 21, 21, 21, 21, 21, 21, 21, 21,  9,  0,  1,
+    1,  1,  1,  8, 21, 21, 21,  9,  0,  0,  0, 41,  0, 42, 43,  0,
+    0,  0,  1, 44,  0,  0,  0, 45,  8,  9,  1,  0,  0,  0,  8, 21,
+   21, 21,  9,  0,  1,  0,  1,  1,  8, 21, 21,  9,  0,  4,  5,  8,
+    9,  1,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,
+    7,  7,  7,  7,  7,  7,  7,  7,  9, 10, 11, 11, 11, 11, 12, 13,
+   13, 13, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 13, 13, 13,
+   24, 25, 26, 26, 26, 27, 13, 13, 13, 28, 29, 30, 13, 31, 32, 33,
+   34, 35, 36, 37,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+    7,  7,  7,  7,  7,  7,  7,  7, 38,  7,  7, 39,  7, 40,  7,  7,
+    7, 41, 13, 42,  7,  7, 43,  7,  7,  7, 44, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 45,  0,  0,  1,  2,  2,  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, 32, 33, 34, 35, 36, 37, 37,
+   37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+   51, 52,  2,  2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59,
+   59, 59, 59, 59, 59, 59, 61, 61, 59, 59, 59, 59, 62, 59, 63, 64,
+   65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 59, 69, 69,
+   69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+   69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+   69, 78, 69, 69, 69, 69, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80,
+   81, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 32, 32,
+   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+   32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+   32, 32, 32, 32, 32, 94, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+   95, 95, 95, 95, 95, 95, 95, 95, 69, 69, 96, 97, 98, 99, 99, 99,
+  100,101,102,103,104,105,106,107,108,109, 95,110,111,112,113,114,
+  115,116,117,117,118,119,120,121,122,123,124,125,126,127,128,129,
+  130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,
+   95,146,147,148,149, 95,150,151,152,153,154,155,156,157,158,159,
+  160,161, 95,162,163,164,165,165,165,165,165,165,165,166,167,165,
+  168, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+   95, 95, 95, 95, 95,169,170,170,170,170,170,170,170,170,171,170,
+  170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+  170,170,170,170,170,170,170,170,170,170,170,170,170,172,173,173,
+  173,173,174, 95, 95, 95, 95, 95,175, 95, 95, 95, 95, 95, 95, 95,
+   95, 95, 95, 95, 95, 95,176,176,176,176,177,178,179,180, 95, 95,
+  181, 95,182,183,184,185,186,186,186,186,186,186,186,186,186,186,
+  186,186,186,186,186,186,186,186,186,186,186,186,187,187,187,188,
+  189,190, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+   95, 95, 95, 95, 95,191,192,193,194,195,195,196, 95, 95, 95, 95,
+   95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,197,198,
+   95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 59,199,
+   59, 59, 59,200,201,202, 59,203,204,205,206,207,208, 95,209,210,
+  211, 59, 59,212, 59,213,214,214,214,214,214,215, 95, 95, 95, 95,
+   95, 95, 95, 95,216, 95,217,218,219, 95, 95,220, 95, 95, 95,221,
+   95,222, 95,223, 95,224,225,226,227, 95, 95, 95, 95, 95,228,229,
+  230, 95,231,232, 95, 95,233,234, 59,235,236, 95, 59, 59, 59, 59,
+   59, 59, 59,237, 59,238,239,240, 59, 59,241,242, 59,243, 95, 95,
+   95, 95, 95, 95, 95, 95, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+   69, 69, 69,244, 69, 69,245, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+   69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+   69, 69, 69,246, 69, 69, 69, 69, 69, 69, 69, 69, 69,247, 69, 69,
+   69, 69,248, 95, 95, 95, 69, 69, 69, 69,249, 95, 95, 95, 95, 95,
+   95, 95, 95, 95, 95, 95, 69, 69, 69, 69, 69, 69,250, 69, 69, 69,
+   69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,251, 95,
+   95, 95, 95, 95, 95, 95,252, 95,253,254,  0,  1,  2,  2,  0,  1,
+    2,  2,  2,  3,  4,  5,  0,  0,  0,  0,  0, 19, 19, 19, 19, 19,
+   19, 19, 19, 19, 19,  0,  0,  0, 19,  0, 19,  0,  0,  0,  0,  0,
+   26, 26,  1,  1,  1,  1,  9,  9,  9,  9,  0,  9,  9,  9,  2,  2,
+    9,  9,  9,  9,  0,  9,  2,  2,  2,  2,  9,  0,  9,  0,  9,  9,
+    9,  2,  9,  2,  9,  9,  9,  9,  2,  9,  9,  9, 55, 55, 55, 55,
+   55, 55,  6,  6,  6,  6,  6,  1,  1,  6,  2,  4,  4,  4,  4,  4,
+    4,  4,  4,  4,  4,  2,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+   14,  2,  2,  2,  2, 14, 14,  2,  2,  2,  3,  3,  3,  3,  3,  0,
+    3,  3,  0,  3,  3,  3,  3,  3,  3,  0,  3,  3,  3,  1,  1,  1,
+    3,  3,  1,  3,  3,  3, 37, 37, 37, 37, 37, 37,  2, 37, 37, 37,
+   37,  2,  2, 37, 37, 37, 38, 38, 38, 38, 38, 38,  2,  2, 64, 64,
+   64, 64, 64, 64, 64,  2,  2, 64, 64, 64, 90, 90, 90, 90, 90, 90,
+    2,  2, 90, 90, 90,  2, 95, 95, 95, 95,  2,  2, 95,  2,  3,  3,
+    2,  2,  2,  2,  2,  3,  3,  3,  0,  3,  7,  7,  7,  7,  7,  1,
+    1,  1,  1,  7,  7,  7,  0,  0,  7,  7,  5,  5,  5,  5,  2,  5,
+    5,  5,  5,  2,  2,  5,  5,  2,  5,  5,  5,  2,  5,  2,  2,  2,
+    5,  5,  5,  5,  2,  2,  5,  5,  5,  2,  2,  2,  2,  5,  5,  5,
+    2,  5,  2, 11, 11, 11, 11, 11, 11,  2,  2,  2,  2, 11, 11,  2,
+    2, 11, 11, 11, 11, 11, 11,  2, 11, 11,  2, 11, 11,  2, 11, 11,
+    2,  2,  2, 11,  2,  2, 11,  2, 11,  2,  2,  2, 11, 11,  2, 10,
+   10, 10, 10, 10, 10, 10, 10, 10,  2, 10, 10,  2, 10, 10, 10, 10,
+    2,  2, 10,  2,  2,  2,  2,  2, 10, 10,  2, 21, 21, 21, 21, 21,
+   21, 21, 21,  2,  2, 21, 21,  2, 21, 21, 21, 21,  2,  2, 21, 21,
+    2, 21,  2,  2, 21, 21,  2,  2, 22, 22,  2, 22, 22, 22, 22, 22,
+   22,  2, 22,  2, 22, 22, 22, 22,  2,  2,  2, 22, 22,  2,  2,  2,
+    2, 22, 22,  2,  2,  2, 22, 22, 22, 22, 23, 23, 23, 23, 23,  2,
+   23, 23, 23, 23,  2,  2,  2, 23, 23,  2, 23, 23, 23,  2,  2,  2,
+   23, 23,  2,  2,  2, 23, 16, 16, 16, 16, 16,  2, 16, 16,  2, 16,
+   16, 16, 16, 16,  2,  2,  2, 16, 16,  2, 16, 16, 16,  2,  2,  2,
+   16, 16, 20, 20, 20, 20, 20,  2, 20, 20,  2,  2, 20, 20,  2, 36,
+   36, 36, 36, 36, 36, 36, 36, 36, 36,  2,  2,  2, 36, 36, 36, 36,
+    2, 36,  2, 36,  2,  2,  2,  2, 36,  2,  2,  2,  2, 36, 36,  2,
+   36,  2, 36,  2,  2,  2,  2, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+   24,  2,  2,  2,  2,  0,  2, 18, 18,  2, 18,  2, 18, 18, 18, 18,
+   18,  2, 18, 18, 18, 18,  2, 18,  2, 18, 18, 18,  2,  2, 18,  2,
+   18,  2, 25, 25, 25, 25,  2, 25, 25, 25, 25,  2,  2,  2, 25,  2,
+   25, 25, 25,  0,  0,  0,  0, 25, 25,  2, 33, 33, 33, 33,  8,  8,
+    8,  8,  8,  8,  2,  8,  2,  8,  2,  2,  8,  8,  8,  0, 12, 12,
+   12, 12, 30, 30, 30, 30, 30,  2, 30, 30, 30, 30,  2,  2, 30, 30,
+   30,  2,  2, 30, 30, 30, 30,  2,  2,  2, 29, 29, 29, 29, 29, 29,
+    2,  2, 28, 28, 28, 28, 34, 34, 34, 34, 34,  2,  2,  2, 35, 35,
+   35, 35, 35, 35, 35,  0,  0,  0, 35, 35, 35,  2,  2,  2, 45, 45,
+   45, 45, 45, 45,  2,  2,  2,  2,  2, 45, 44, 44, 44, 44, 44,  0,
+    0,  2, 43, 43, 43, 43, 46, 46, 46, 46, 46,  2, 46, 46, 31, 31,
+   31, 31, 31, 31,  2,  2, 32, 32,  0,  0, 32,  0, 32, 32, 32, 32,
+   32, 32, 32, 32,  2,  2, 32,  2,  2,  2, 32, 32, 32,  2, 28, 28,
+    2,  2, 48, 48, 48, 48, 48, 48, 48,  2, 48,  2,  2,  2, 52, 52,
+   52, 52, 52, 52,  2,  2, 52,  2,  2,  2, 58, 58, 58, 58, 58, 58,
+    2,  2, 58, 58, 58,  2,  2,  2, 58, 58, 54, 54, 54, 54,  2,  2,
+   54, 54, 91, 91, 91, 91, 91, 91, 91,  2, 91,  2,  2, 91, 91, 91,
+    2,  2,  1,  1,  2,  2, 62, 62, 62, 62, 62,  2, 62, 62, 76, 76,
+   76, 76, 93, 93, 93, 93, 70, 70, 70, 70,  2,  2,  2, 70, 70, 70,
+    2,  2,  2, 70, 70, 70, 73, 73, 73, 73,  6,  6,  6,  2,  8,  8,
+    8,  2,  2,  8,  8,  8,  1,  1,  1,  0,  1,  0,  1,  1,  1,  0,
+    0,  0,  0,  1,  0,  0,  1,  1,  0,  2, 19, 19,  9,  9,  9,  9,
+    9,  6, 19,  9,  9,  9,  9,  9, 19, 19,  9,  9,  9, 19,  6, 19,
+   19, 19, 19, 19, 19,  9,  9,  9,  2,  2,  2,  9,  2,  9,  2,  9,
+    9,  9,  1,  1,  0,  0,  0,  2,  0,  0,  0, 19,  2,  2,  0,  0,
+    0, 19,  0,  0,  0,  2, 19,  2,  2,  2,  0,  0,  2,  2,  1,  2,
+    2,  2,  0,  0,  9,  0,  0,  0, 19, 19, 27, 27, 27, 27,  2,  2,
+    0,  0, 56, 56, 56, 56,  2, 55, 55, 55, 61, 61, 61, 61,  2,  2,
+    2, 61, 61,  2,  2,  2, 13, 13, 13, 13, 13, 13,  2, 13, 13, 13,
+    2,  2,  0, 13,  0, 13,  0, 13, 13, 13, 13, 13,  1,  1,  1,  1,
+   12, 12,  2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  2,  2,  1,
     1,  0,  0, 15, 15, 15,  0, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17,  0,  0, 17, 17, 17,  2,  2,
-    2,  2,  2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,  2, 12,
-   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  2,  2,  2,
-    2,  2,  2,  2,  2,  0, 12, 12, 12, 12, 12, 12, 12,  0, 17, 17,
-   17, 17, 17, 17, 17,  0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
-   39, 39, 39,  2,  2,  2, 39, 39, 39, 39, 39, 39, 39,  2, 86, 86,
-   86, 86, 86, 86, 86, 86, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
-   77, 77,  2,  2,  2,  2, 79, 79, 79, 79, 79, 79, 79, 79,  0,  0,
-   19, 19, 19, 19, 19, 19,  0,  0,  0, 19, 19, 19, 19, 19, 19, 19,
-   19, 19, 19, 19,  2,  2, 19, 19,  2, 19,  2, 19, 19, 19,  2,  2,
-   19, 19, 19, 19, 19, 19, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
-   60, 60, 60,  2,  2,  2, 65, 65, 65, 65, 65, 65, 65, 65, 75, 75,
-   75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,  2,  2,  2,  2,
-    2,  2,  2,  2, 75, 75, 75, 75,  2,  2,  2,  2,  2,  2, 69, 69,
-   69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,  0, 69, 74, 74,
-   74, 74, 74, 74, 74, 74, 74, 74, 74, 74,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2, 74, 12, 12, 12, 12, 12,  2,  2,  2, 84, 84,
-   84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,  2,  0, 84, 84,
-    2,  2,  2,  2, 84, 84, 33, 33, 33, 33, 33, 33, 33,  2, 68, 68,
-   68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,  2, 68, 68,
-   68, 68, 68, 68,  2,  2, 68, 68,  2,  2, 68, 68, 68, 68, 92, 92,
-   92, 92, 92, 92, 92, 92, 92, 92, 92,  2,  2,  2,  2,  2,  2,  2,
-    2, 92, 92, 92, 92, 92, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
-   87, 87, 87, 87, 87,  2,  2, 30, 30, 30, 30, 30, 30,  2, 19, 19,
-   19,  0, 19, 19, 19, 19, 19, 19, 19, 19, 19,  9, 19, 19, 19, 19,
-    0,  0,  2,  2,  2,  2, 87, 87, 87, 87, 87, 87,  2,  2, 87, 87,
-    2,  2,  2,  2,  2,  2, 12, 12, 12, 12,  2,  2,  2,  2,  2,  2,
-    2, 12, 12, 12, 12, 12, 13, 13,  2,  2,  2,  2,  2,  2, 19, 19,
-   19, 19, 19, 19, 19,  2,  2,  2,  2,  4,  4,  4,  4,  4,  2,  2,
-    2,  2,  2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,  2, 14, 14,
-   14, 14, 14,  2, 14,  2, 14, 14,  2, 14, 14,  2, 14, 14,  3,  3,
-    3,  2,  2,  2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,
-    3,  3,  3,  3,  0,  0,  2,  2,  3,  3,  3,  3,  3,  3,  2,  2,
-    2,  2,  2,  2,  2,  3,  1,  1,  1,  1,  1,  1,  6,  6,  0,  0,
-    0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  2,  2,  2,  2,  3,  3,
-    3,  3,  3,  2,  3,  3,  3,  3,  3,  3,  3,  2,  2,  0,  2,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17, 17, 17, 17,
-   17, 17, 17, 17,  0,  0,  2,  2, 12, 12, 12, 12, 12, 12,  2,  2,
-   12, 12, 12,  2,  2,  2,  2,  0,  0,  0,  0,  0,  2,  2, 49, 49,
-   49, 49, 49, 49, 49, 49, 49, 49, 49, 49,  2, 49, 49, 49, 49, 49,
-   49, 49, 49, 49, 49,  2, 49, 49, 49,  2, 49, 49,  2, 49, 49, 49,
-   49, 49, 49, 49,  2,  2, 49, 49, 49,  2,  2,  2,  2,  2,  0,  0,
-    0,  2,  2,  2,  2,  0,  0,  0,  0,  0,  2,  2,  2,  0,  0,  0,
-    0,  0,  0,  2,  2,  2,  9,  2,  2,  2,  2,  2,  2,  2,  0,  0,
-    0,  0,  0,  1,  2,  2, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
-   71, 71, 71,  2,  2,  2, 67, 67, 67, 67, 67, 67, 67, 67, 67,  2,
-    2,  2,  2,  2,  2,  2,  1,  0,  0,  0,  0,  0,  0,  0, 42, 42,
-   42, 42, 42, 42, 42, 42, 42, 42, 42, 42,  2,  2,  2,  2,  2,  2,
-    2,  2,  2, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
-   41,  2,  2,  2,  2,  2,118,118,118,118,118,118,118,118,118,118,
-  118,  2,  2,  2,  2,  2, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
-   53, 53, 53, 53,  2, 53, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-   59, 59,  2,  2,  2,  2, 59, 59, 59, 59, 59, 59,  2,  2, 40, 40,
-   40, 40, 40, 40, 40, 40, 51, 51, 51, 51, 51, 51, 51, 51, 50, 50,
-   50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,  2,  2, 50, 50,
-    2,  2,  2,  2,  2,  2,135,135,135,135,135,135,135,135,135,135,
-  135,135,  2,  2,  2,  2,106,106,106,106,106,106,106,106,104,104,
-  104,104,104,104,104,104,104,104,104,104,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2,104,161,161,161,161,161,161,161,161,161,161,
-  161,  2,161,161,161,161,161,161,161,  2,161,161,  2,161,161,161,
-    2,161,161,161,161,161,161,161,  2,161,161,  2,  2,  2,170,170,
-  170,170,170,170,170,170,170,170,170,170,  2,  2,  2,  2,110,110,
-  110,110,110,110,110,110,110,110,110,110,110,110,110,  2,110,110,
-  110,110,110,110,  2,  2, 19, 19, 19, 19, 19, 19,  2, 19, 19,  2,
-   19, 19, 19, 19, 19, 19, 19, 19, 19,  2,  2,  2,  2,  2, 47, 47,
-   47, 47, 47, 47,  2,  2, 47,  2, 47, 47, 47, 47, 47, 47, 47, 47,
-   47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,  2, 47, 47,  2,
-    2,  2, 47,  2,  2, 47, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
-   81, 81, 81, 81,  2, 81,120,120,120,120,120,120,120,120,116,116,
-  116,116,116,116,116,116,116,116,116,116,116,116,116,  2,  2,  2,
-    2,  2,  2,  2,  2,116,128,128,128,128,128,128,128,128,128,128,
-  128,  2,128,128,  2,  2,  2,  2,  2,128,128,128,128,128, 66, 66,
-   66, 66, 66, 66, 66, 66, 66, 66, 66, 66,  2,  2,  2, 66, 72, 72,
-   72, 72, 72, 72, 72, 72, 72, 72,  2,  2,  2,  2,  2, 72, 98, 98,
-   98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97,  2,  2,
-    2,  2, 97, 97, 97, 97,  2,  2, 97, 97, 97, 97, 97, 97, 57, 57,
-   57, 57,  2, 57, 57,  2,  2,  2,  2,  2, 57, 57, 57, 57, 57, 57,
-   57, 57,  2, 57, 57, 57,  2, 57, 57, 57, 57, 57, 57, 57, 57, 57,
-   57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,  2,  2, 57, 57,
-   57,  2,  2,  2,  2, 57, 57,  2,  2,  2,  2,  2,  2,  2, 88, 88,
-   88, 88, 88, 88, 88, 88,117,117,117,117,117,117,117,117,112,112,
-  112,112,112,112,112,112,112,112,112,112,112,112,112,  2,  2,  2,
-    2,112,112,112,112,112, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
-   78, 78, 78, 78,  2,  2,  2, 78, 78, 78, 78, 78, 78, 78, 83, 83,
-   83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,  2,  2, 82, 82,
-   82, 82, 82, 82, 82, 82, 82, 82, 82,  2,  2,  2,  2,  2,122,122,
-  122,122,122,122,122,122,122,122,  2,  2,  2,  2,  2,  2,  2,122,
-  122,122,122,  2,  2,  2,  2,122,122,122,122,122,122,122, 89, 89,
-   89, 89, 89, 89, 89, 89, 89,  2,  2,  2,  2,  2,  2,  2,130,130,
-  130,130,130,130,130,130,130,130,130,  2,  2,  2,  2,  2,  2,  2,
-  130,130,130,130,130,130,144,144,144,144,144,144,144,144,144,144,
-    2,  2,  2,  2,  2,  2,165,165,165,165,165,165,165,165,165,165,
-  165,165,165,165,  2,  2,  2,165,165,165,165,165,165,165,  2,  2,
-    2,  2,  2,  2,165,165,156,156,156,156,156,156,156,156,156,156,
-    2,156,156,156,  2,  2,156,156,  2,  2,  2,  2,  2,  2,  2,  2,
-    3,  3,  3,  2,  2,  2,  2,  2,  2,  2,  3,  3,  3,  3,147,147,
-  147,147,147,147,147,147,148,148,148,148,148,148,148,148,148,148,
-    2,  2,  2,  2,  2,  2,158,158,158,158,158,158,158,158,158,158,
-    2,  2,  2,  2,  2,  2,153,153,153,153,153,153,153,153,153,153,
-  153,153,  2,  2,  2,  2,149,149,149,149,149,149,149,149,149,149,
-  149,149,149,149,149,  2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-   94, 94, 94, 94,  2,  2,  2,  2, 94, 94, 94, 94, 94, 94,  2,  2,
-    2,  2,  2,  2,  2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-   85,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 85,  2,  2,101,101,
-  101,101,101,101,101,101,101,  2,  2,  2,  2,  2,  2,  2,101,101,
-    2,  2,  2,  2,  2,  2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
-   96, 96, 96,  2, 96, 96,111,111,111,111,111,111,111,111,111,111,
-  111,111,111,111,111,  2,100,100,100,100,100,100,100,100,  2, 36,
-   36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,  2,  2,  2,108,108,
-  108,108,108,108,108,108,108,108,  2,108,108,108,108,108,108,108,
-    2,  2,  2,  2,  2,  2,129,129,129,129,129,129,129,  2,129,  2,
-  129,129,129,129,  2,129,129,129,129,129,129,129,129,129,129,129,
-  129,129,129,129,  2,129,129,129,  2,  2,  2,  2,  2,  2,109,109,
-  109,109,109,109,109,109,109,109,109,  2,  2,  2,  2,  2,109,109,
-    2,  2,  2,  2,  2,  2,107,107,107,107,  2,107,107,107,107,107,
-  107,107,107,  2,  2,107,107,  2,  2,107,107,107,107,107,107,107,
-  107,107,107,107,107,107,107,  2,107,107,107,107,107,107,107,  2,
-  107,107,  2,107,107,107,107,107,  2,  1,107,107,107,107,107,  2,
-    2,107,107,107,  2,  2,107,  2,  2,  2,  2,  2,  2,107,  2,  2,
-    2,  2,  2,107,107,107,107,107,107,107,  2,  2,107,107,107,107,
-  107,107,107,  2,  2,  2,171,171,171,171,171,171,171,171,171,171,
-    2,171,  2,  2,171,  2,171,171,171,171,171,171,  2,171,171,  2,
-  171,  2,  2,171,  2,171,171,171,171,  2,171,171,171,171,171,  2,
-    2,  2,  2,  2,  2,  2,  2,171,171,  2,  2,  2,  2,  2,137,137,
-  137,137,137,137,137,137,137,137,137,137,  2,137,137,137,137,137,
-    2,  2,  2,  2,  2,  2,124,124,124,124,124,124,124,124,124,124,
-    2,  2,  2,  2,  2,  2,123,123,123,123,123,123,123,123,123,123,
-  123,123,123,123,  2,  2,114,114,114,114,114,114,114,114,114,114,
-  114,114,114,  2,  2,  2,114,114,  2,  2,  2,  2,  2,  2, 32, 32,
-   32, 32, 32,  2,  2,  2,102,102,102,102,102,102,102,102,102,102,
-    2,  2,  2,  2,  2,  2, 33, 33, 33, 33,  2,  2,  2,  2,126,126,
-  126,126,126,126,126,126,126,126,126,  2,  2,126,126,126,126,126,
-  126,126,  2,  2,  2,  2,126,126,126,126,126,126,126,  2,142,142,
-  142,142,142,142,142,142,142,142,142,142,  2,  2,  2,  2,125,125,
-  125,125,125,125,125,125,125,125,125,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2,125,154,154,154,154,154,154,154,  2,  2,154,
-    2,  2,154,154,154,154,154,154,154,154,  2,154,154,  2,154,154,
-  154,154,154,154,154,154,154,154,154,154,154,154,  2,154,154,  2,
-    2,154,154,154,154,154,154,154,  2,  2,  2,  2,  2,  2,150,150,
-  150,150,150,150,150,150,  2,  2,150,150,150,150,150,150,150,150,
-  150,150,150,  2,  2,  2,141,141,141,141,141,141,141,141,140,140,
-  140,140,140,140,140,140,140,140,140,  2,  2,  2,  2,  2,121,121,
-  121,121,121,121,121,121,121,  2,  2,  2,  2,  2,  2,  2,  7,  7,
-    2,  2,  2,  2,  2,  2,169,169,169,169,169,169,169,169,169,169,
-    2,  2,  2,  2,  2,  2,133,133,133,133,133,133,133,133,133,  2,
-  133,133,133,133,133,133,133,133,133,133,133,133,133,  2,133,133,
-  133,133,133,133,  2,  2,133,133,133,133,133,  2,  2,  2,134,134,
-  134,134,134,134,134,134,  2,  2,134,134,134,134,134,134,  2,134,
-  134,134,134,134,134,134,134,134,134,134,134,134,134,  2,138,138,
-  138,138,138,138,138,  2,138,138,  2,138,138,138,138,138,138,138,
-  138,138,138,138,138,138,  2,  2,138,  2,138,138,  2,138,138,138,
-    2,  2,  2,  2,  2,  2,143,143,143,143,143,143,  2,143,143,  2,
-  143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
-  143,143,143,143,143,  2,143,143,  2,143,143,143,143,143,143,  2,
-    2,  2,  2,  2,  2,  2,143,143,  2,  2,  2,  2,  2,  2,145,145,
-  145,145,145,145,145,145,145,  2,  2,  2,  2,  2,  2,  2,163,163,
-  163,163,163,163,163,163,163,  2,163,163,163,163,163,163,163,163,
-  163,  2,  2,  2,163,163,163,163,163,  2,  2,  2,  2,  2, 86,  2,
-    2,  2,  2,  2,  2,  2, 22, 22,  2,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  2, 22, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
-    2,  2,  2,  2,  2,  2, 63, 63, 63, 63, 63, 63, 63,  2, 63, 63,
-   63, 63, 63,  2,  2,  2, 63, 63, 63, 63,  2,  2,  2,  2,157,157,
-  157,157,157,157,157,157,157,157,157,  2,  2,  2,  2,  2, 80, 80,
-   80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,  2,  2, 80, 80,
-   80,  2,  2,  2,  2,  2,127,127,127,127,127,127,127,127,127,127,
-  127,127,127,127,127,  2,166,166,166,166,166,166,166,166,166,166,
-    2,  2,  2,  2,  2,  2, 79,  2,  2,  2,  2,  2,  2,  2,115,115,
-  115,115,115,115,115,115,115,115,115,115,115,115,115,  2,115,115,
-    2,  2,  2,  2,115,115,159,159,159,159,159,159,159,159,159,159,
-  159,159,159,159,159,  2,159,159,  2,  2,  2,  2,  2,  2,103,103,
-  103,103,103,103,103,103,103,103,103,103,103,103,  2,  2,119,119,
-  119,119,119,119,119,119,119,119,119,119,119,119,  2,  2,119,119,
-    2,119,119,119,119,119,  2,  2,  2,  2,  2,119,119,119,167,167,
-  167,167,167,167,167,167,167,167,  2,  2,  2,  2,  2,  2,146,146,
-  146,146,146,146,146,146,146,146,146,  2,  2,  2,  2,  2, 99, 99,
-   99, 99, 99, 99, 99, 99, 99, 99, 99,  2,  2,  2,  2, 99,  2,  2,
-    2,  2,  2,  2,  2, 99,136,139, 13, 13,155,  2,  2,  2,136,136,
-  136,136,136,136,136,136,155,155,155,155,155,155,155,155,155,155,
-  155,155,155,155,  2,  2,  2,  2,  2,  2,  2,  2,  2,155,136,  2,
-    2,  2,  2,  2,  2,  2, 17, 17, 17, 17,  2, 17, 17, 17, 17, 17,
-   17, 17,  2, 17, 17,  2, 17, 15, 15, 15, 15, 15, 15, 15, 17, 17,
-   17,  2,  2,  2,  2,  2,  2,  2, 15,  2,  2,  2,  2,  2, 15, 15,
-   15,  2,  2, 17,  2,  2,  2,  2,  2,  2, 17, 17, 17, 17,139,139,
-  139,139,139,139,139,139,139,139,139,139,  2,  2,  2,  2,105,105,
-  105,105,105,105,105,105,105,105,105,  2,  2,  2,  2,  2,105,105,
-  105,105,105,  2,  2,  2,105,  2,  2,  2,  2,  2,  2,  2,105,105,
-    2,  2,105,105,105,105,  1,  1,  1,  1,  1,  1,  2,  2,  0,  0,
-    0,  0,  0,  0,  0,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  1,  1,  1,  1,  1,
-    1,  1,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  0,  0,  2,  2,
-    0,  2,  2,  0,  0,  2,  2,  0,  0,  0,  0,  2,  0,  0,  0,  0,
-    2,  0,  2,  0,  0,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  0,
-    0,  2,  2,  0,  0,  0,  0,  0,  2,  0,  0,  0,  0,  2,  0,  0,
-    0,  0,  0,  2,  0,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,  2,
-    0,  0,  0,  0,  0,  0,131,131,131,131,131,131,131,131,131,131,
-  131,131,  2,  2,  2,  2,  2,  2,  2,131,131,131,131,131,  2,131,
-  131,131,131,131,131,131,  2,  2,  2,  2,  2, 19, 19, 19, 56, 56,
-   56, 56, 56, 56, 56,  2, 56,  2,  2, 56, 56, 56, 56, 56, 56, 56,
-    2, 56, 56,  2, 56, 56, 56, 56, 56,  2,  2,  2,  2,  2,  6,  6,
-    6,  6,  6,  6,  2,  2,  2,  2,  2,  2,  2,  2,  2,  6,151,151,
-  151,151,151,151,151,151,151,151,151,151,151,  2,  2,  2,151,151,
-  151,151,151,151,  2,  2,151,151,  2,  2,  2,  2,151,151,160,160,
-  160,160,160,160,160,160,160,160,160,160,160,160,160,  2,152,152,
-  152,152,152,152,152,152,152,152,  2,  2,  2,  2,  2,152,164,164,
-  164,164,164,164,164,164,164,164,  2,  2,  2,  2,  2,  2,168,168,
-  168,168,168,168,168,168,168,168,168,  2,  2,  2,  2,168, 30, 30,
-   30, 30,  2, 30, 30,  2,113,113,113,113,113,113,113,113,113,113,
-  113,113,113,  2,  2,113,113,113,113,113,113,113,113,  2,132,132,
-  132,132,132,132,132,132,132,132,132,132,  2,  2,  2,  2,132,132,
-    2,  2,  2,  2,132,132,  3,  3,  3,  3,  2,  3,  3,  3,  2,  3,
-    3,  2,  3,  2,  2,  3,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,
-    3,  2,  3,  3,  3,  3,  2,  3,  2,  3,  2,  2,  2,  2,  2,  2,
-    3,  2,  2,  2,  2,  3,  2,  3,  2,  3,  2,  3,  3,  3,  2,  3,
-    2,  3,  2,  3,  2,  3,  2,  3,  3,  3,  3,  2,  3,  2,  3,  3,
-    2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  2,  2,  2,  2,  2,  3,
-    3,  3,  2,  3,  3,  3,  3,  3,  2,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2,  0,  0, 15,  0,  0,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  0,  0,  0,  0,  2,  2,  2,  0,  0,  0,  0,  0,  0,  0,
-    2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0,  2,  2,  0, 13,  2,
-    2,  2,  2,  2,  2,  2, 13, 13, 13,  2,  2,  2,  2,  2,  2,  0,
-    2,  2,  2,  2,  2,  2,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
-    9,  9,  9, 10,  9, 11, 12, 13,  9,  9,  9, 14,  9,  9, 15,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   17,  0,  2, 26, 26, 26, 26, 26, 26, 26,  2, 12, 12, 12, 12, 12,
+   12,  2, 12, 12, 12,  0, 39, 39, 39, 39, 39,  2,  2,  2, 39, 39,
+   39,  2, 86, 86, 86, 86, 77, 77, 77, 77, 79, 79, 79, 79,  2, 19,
+   19, 19, 60, 60, 60, 60, 60,  2,  2,  2, 65, 65, 65, 65, 75, 75,
+   75, 75, 75, 75,  2,  2,  2,  2, 75, 75, 69, 69, 69, 69, 69, 69,
+    0, 69, 74, 74, 74, 74,  2,  2,  2, 74, 12,  2,  2,  2, 84, 84,
+   84, 84, 84, 84,  2,  0, 84, 84,  2,  2,  2,  2, 84, 84, 33, 33,
+   33,  2, 68, 68, 68, 68, 68, 68, 68,  2, 68, 68,  2,  2, 92, 92,
+   92, 92, 92, 92, 92,  2,  2,  2,  2, 92, 87, 87, 87, 87, 87, 87,
+   87,  2, 19,  9, 19, 19, 19, 19,  0,  0, 87, 87,  2,  2,  2,  2,
+    2, 12, 19, 19, 19,  2,  2,  2,  2,  4, 14,  2, 14,  2, 14, 14,
+    2, 14, 14,  2, 14, 14,  3,  3,  0,  0,  1,  1,  6,  6,  3,  2,
+    3,  3,  3,  2,  2,  0,  2,  0,  0,  0,  0,  0, 17, 17, 17, 17,
+    0,  0,  2,  2, 12, 12, 49, 49, 49, 49,  2, 49, 49, 49, 49, 49,
+   49,  2, 49, 49,  2, 49, 49, 49,  2,  2,  0,  2,  2,  2,  9,  2,
+    2,  2,  0,  1,  2,  2, 71, 71, 71, 71, 71,  2,  2,  2, 67, 67,
+   67, 67, 67,  2,  2,  2, 42, 42, 42, 42,  2, 42, 42, 42, 41, 41,
+   41, 41, 41, 41, 41,  2,118,118,118,118,118,118,118,  2, 53, 53,
+   53, 53, 53, 53,  2, 53, 59, 59, 59, 59, 59, 59,  2,  2, 40, 40,
+   40, 40, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50,  2,  2,135,135,
+  135,135,106,106,106,106,104,104,104,104,  2,  2,  2,104,161,161,
+  161,161,161,161,161,  2,161,161,  2,161,161,  2,  2,  2,170,170,
+  170,170,110,110,110,110,110,110,110,  2,110,110,  2,  2, 19, 19,
+    2, 19, 19,  2, 19, 19, 47, 47, 47, 47, 47, 47,  2,  2, 47,  2,
+   47, 47, 47, 47,  2, 47, 47,  2,  2,  2, 47,  2,  2, 47, 81, 81,
+   81, 81, 81, 81,  2, 81,120,120,120,120,116,116,116,116,116,116,
+  116,  2,  2,  2,  2,116,128,128,128,128,128,128,128,  2,128,128,
+    2,  2,  2,  2,  2,128, 66, 66, 66, 66,  2,  2,  2, 66, 72, 72,
+   72, 72, 72, 72,  2,  2,  2,  2,  2, 72,173,173,173,173,173,173,
+    2,  2, 98, 98, 98, 98, 97, 97, 97, 97,  2,  2, 97, 97, 57, 57,
+   57, 57,  2, 57, 57,  2,  2, 57, 57, 57, 57, 57,  2,  2, 57, 57,
+   57,  2,  2,  2,  2, 57, 57,  2,  2,  2, 88, 88, 88, 88,117,117,
+  117,117,112,112,112,112,112,112,112,  2,  2,  2,  2,112, 78, 78,
+   78, 78, 78, 78,  2,  2,  2, 78, 78, 78, 83, 83, 83, 83, 83, 83,
+    2,  2, 82, 82, 82, 82, 82, 82, 82,  2,122,122,122,122,122,122,
+    2,  2,  2,122,122,122,122,  2,  2,  2, 89, 89, 89, 89, 89,  2,
+    2,  2,130,130,130,130,130,130,130,  2,  2,  2,130,130,144,144,
+  144,144,144,144,  2,  2,165,165,165,165,165,165,  2,  2,  2,165,
+  165,165,  2,  2,165,165,  3,  3,  3,  2,156,156,156,156,156,156,
+    2,156,156,156,  2,  2,  2,  2,  3,  3,  3,  2,  2,  2,147,147,
+  147,147,148,148,148,148,148,148,  2,  2,158,158,158,158,158,158,
+    2,  2,153,153,153,153,149,149,149,149,149,149,149,  2, 94, 94,
+   94, 94, 94, 94,  2,  2,  2,  2, 94, 94,  2,  2,  2, 94, 85, 85,
+   85, 85, 85, 85, 85,  2,  2, 85,  2,  2,101,101,101,101,101,  2,
+    2,  2,101,101,  2,  2, 96, 96, 96, 96, 96,  2, 96, 96,111,111,
+  111,111,111,111,111,  2,100,100,100,100,108,108,108,108,108,108,
+    2,108,108,108,  2,  2,129,129,129,129,129,129,129,  2,129,  2,
+  129,129,129,129,  2,129,129,129,  2,  2,109,109,109,109,109,109,
+  109,  2,109,109,  2,  2,107,107,107,107,  2,107,107,107,107,  2,
+    2,107,107,  2,107,107,107,107,  2,  1,107,107,  2,  2,107,  2,
+    2,  2,  2,  2,  2,107,  2,  2,107,107,171,171,171,171,171,171,
+    2,171,  2,  2,171,  2,171,  2,171,  2,  2,171,  2,171,171,171,
+  171,  2,171,  2,  2,  2,  2,171,171,  2,137,137,137,137,  2,137,
+  137,137,137,137,  2,  2,124,124,124,124,124,124,  2,  2,123,123,
+  123,123,123,123,  2,  2,114,114,114,114,114,  2,  2,  2,114,114,
+    2,  2,102,102,102,102,102,102,  2,  2,126,126,126,126,126,126,
+  126,  2,  2,126,126,126,142,142,142,142,125,125,125,125,125,125,
+  125,  2,  2,  2,  2,125,154,154,154,154,154,154,154,  2,  2,154,
+    2,  2,  2,154,154,  2,154,154,  2,154,154,  2,  2,154,154,154,
+    2,  2,150,150,150,150,  2,  2,150,150,150,  2,  2,  2,141,141,
+  141,141,140,140,140,140,140,140,140,  2,121,121,121,121,121,  2,
+    2,  2,  7,  7,  2,  2,169,169,169,169,169,169,  2,  2,133,133,
+  133,133,133,  2,133,133,133,133,133,  2,133,133,  2,  2,133,  2,
+    2,  2,134,134,134,134,  2,  2,134,134,  2,134,134,134,134,134,
+  134,  2,138,138,138,138,138,138,138,  2,138,138,  2,138,  2,  2,
+  138,  2,138,138,  2,  2,143,143,143,143,143,143,  2,143,143,  2,
+  143,143,143,143,143,  2,143,  2,  2,  2,143,143,  2,  2,175,175,
+  175,175,175,175,  2,  2,145,145,145,145,145,  2,  2,  2,163,163,
+  163,163,163,  2,163,163,163,163,163,  2,  2,  2,163,163, 86,  2,
+    2,  2, 63, 63, 63, 63, 63, 63,  2,  2, 63, 63, 63,  2, 63,  2,
+    2,  2,157,157,157,157,157,157,157,  2, 80, 80, 80, 80, 80, 80,
+    2,  2, 80, 80, 80,  2,127,127,127,127,127,127,127,  2,166,166,
+  166,166,166,166,  2,  2, 79,  2,  2,  2,115,115,115,115,115,115,
+  115,  2,115,115,  2,  2,  2,  2,115,115,159,159,159,159,159,159,
+  159,  2,159,159,  2,  2,103,103,103,103,103,103,  2,  2,119,119,
+  119,119,119,119,  2,  2,119,119,  2,119,  2,119,119,119,167,167,
+  167,167,167,167,  2,  2,146,146,146,146,146,146,146,  2,172,172,
+  172,172,172,  2,  2,172, 99, 99, 99, 99, 99, 99, 99,  2,  2,  2,
+    2, 99,136,139, 13, 13,155,  2,  2,  2, 13, 13, 13,  2,136,136,
+  136,136,155,155,155,155,155,155,  2,  2,  2,  2,  2,155,136,136,
+  136,  2,  2, 17, 17, 17,  2, 17, 17,  2, 17, 15, 15, 15, 17, 17,
+   17,  2,  2,  2, 15,  2,  2, 17,  2,  2,139,139,139,139,105,105,
+  105,105,105,105,105,  2,105,  2,  2,  2,105,105,  2,  2,  1,  1,
+    1,  2,  0,  0,  0,  1,  0,  1,  1,  1,  0,  0,  1,  1,  2,  2,
+    0,  2,  2,  0,  0,  2,  0,  0,  2,  0,  0,  2,  0,  2,131,131,
+  131,131,  2,  2,  2,131,  2,131,131,131, 56, 56, 56,  2, 56,  2,
+    2, 56, 56, 56,  2, 56, 56,  2, 56, 56,  6,  6,  2,  2,  2,  2,
+    2,  6,151,151,151,151,151,  2,  2,  2,151,151,  2,  2,  2,  2,
+  151,151,160,160,160,160,160,160,160,  2,152,152,152,152,152,152,
+    2,  2,  2,  2,  2,152,164,164,164,164,164,164,  2,  2,168,168,
+  168,168,168,168,168,  2,  2,  2,  2,168,174,174,174,174,174,174,
+  174,  2,174,174,  2,  2,  2,  2,174,174,  2, 30, 30,  2,113,113,
+  113,113,113,  2,  2,113,113,113,113,  2,132,132,132,132,132,132,
+    2,  2,  2,  2,132,132,  2,  3,  3,  3,  2,  3,  3,  2,  3,  2,
+    2,  3,  2,  3,  2,  3,  2,  2,  3,  2,  3,  2,  3,  2,  3,  3,
+    2,  3, 15,  0,  0,  2,  0,  2,  2,  0, 13,  2,  2,  2,  2,  0,
+    2,  2,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9,  9,  9, 10,
+    9, 11, 12, 13,  9,  9,  9, 14,  9,  9, 15,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9, 16, 17,  9,  9,  9,  9, 18,  9,  9,  9,  9,  9, 19, 20,
-   21,  9, 22,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9, 23,  9,  9,  9,  9,  9, 24,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 25,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 16, 17,
+    9,  9,  9,  9, 18,  9,  9,  9,  9,  9, 19, 20, 21,  9, 22,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9, 23,  9,  9,  9,  9,  9, 24,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 25,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
@@ -3934,66 +3605,65 @@
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
     9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9, 26, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,  0,  0, 13, 14,
-   15, 16, 17, 18, 19, 20, 21, 22,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 23,  0,  0, 24, 25, 26, 27, 28,
-   29, 30,  0,  0, 31, 32,  0, 33,  0, 34,  0, 35,  0,  0,  0,  0,
-   36, 37, 38, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 40,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-   41, 42,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 43, 44,  0, 45,  0,  0,  0,  0,  0,  0,
-   46, 47,  0,  0,  0,  0,  0, 48,  0, 49,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 50, 51,  0,  0,  0, 52,  0,  0,
-   53,  0,  0,  0,  0,  0,  0,  0, 54,  0,  0,  0,  0,  0,  0,  0,
-   55,  0,  0,  0,  0,  0,  0,  0, 56,  0,  0,  0,  0,  0,  0,  0,
-    0, 57,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0, 58, 59, 60, 61, 62, 63, 64, 65,
-    0,  0,  0,  0,  0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 67, 68,  0, 69, 70,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
-   83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,
-   99,100,101,102,103,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,104,  0,  0,  0,  0,  0,  0,105,106,  0,
-  107,  0,  0,  0,108,  0,109,  0,110,  0,111,112,113,  0,114,  0,
-    0,  0,115,  0,  0,  0,116,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,117,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,118,119,120,121,  0,122,123,124,
-  125,126,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,128,129,130,131,132,133,134,135,136,137,138,139,
-  140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,
-  156,157,  0,  0,  0,158,159,160,161,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  162,  0,163,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,164,165,  0,
-    0,  0,  0,  0,  0,  0,166,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,167,  0,  0,  0,168,169,  0,  0,
-  170,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,171,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,172,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,173,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,174,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,175,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,176,177,  0,  0,  0,  0,178,
-  179,  0,  0,  0,180,181,182,183,184,185,186,187,188,189,190,191,
-  192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
-  208,209,210,211,212,213,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    1,  2,  3,  4,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 26, 27,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,
+    5,  6,  7,  8,  9, 10, 11, 12,  0,  0, 13, 14, 15, 16, 17, 18,
+   19, 20, 21, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 23,  0,  0, 24, 25, 26, 27, 28, 29, 30,  0,  0,
+   31, 32,  0, 33,  0, 34,  0, 35,  0,  0,  0,  0, 36, 37, 38, 39,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 40,  0,  0,  0,  0,  0,  0,  0,  0,  0, 41, 42,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0, 43, 44,  0, 45,  0,  0,  0,  0,  0,  0, 46, 47,  0,  0,
+    0,  0,  0, 48,  0, 49,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 50, 51,  0,  0,  0, 52,  0,  0, 53,  0,  0,  0,
+    0,  0,  0,  0, 54,  0,  0,  0,  0,  0,  0,  0, 55,  0,  0,  0,
+    0,  0,  0,  0, 56,  0,  0,  0,  0,  0,  0,  0,  0, 57,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 58, 59, 60, 61, 62, 63, 64, 65,  0,  0,  0,  0,
+    0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   67, 68,  0, 69, 70,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
+   87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,
+  103,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,104,  0,  0,  0,  0,  0,  0,105,106,  0,107,  0,  0,  0,
+  108,  0,109,  0,110,  0,111,112,113,  0,114,  0,  0,  0,115,  0,
+    0,  0,116,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,117,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,118,119,120,121,  0,122,123,124,125,126,  0,127,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+  128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
+  144,145,146,147,148,149,150,151,152,153,154,155,156,157,  0,  0,
+    0,158,159,160,161,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,162,  0,163,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,164,165,  0,  0,  0,  0,  0,
+    0,  0,166,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,167,  0,  0,  0,168,169,  0,  0,170,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,171,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,172,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,173,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,174,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,175,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,176,177,  0,  0,  0,  0,178,179,  0,  0,  0,
+  180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,
+  196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,
+  212,213,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,
 };
-static const uint16_t
-_hb_ucd_u16[9668] =
+static const uint16_t _hb_ucd_u16[10904]=
 {
      0,   0,   1,   2,   3,   4,   5,   6,   0,   0,   7,   8,   9,  10,  11,  12,
     13,  13,  13,  14,  15,  13,  13,  16,  17,  18,  19,  20,  21,  22,  13,  23,
@@ -4020,23 +3690,23 @@
     48, 184,  48, 185,  48, 186, 187, 188,  48,  48,  48, 189, 190, 191, 192, 193,
    194, 192,  48,  48, 195,  48,  48, 196, 197,  48, 198,  48,  48,  48,  48, 199,
     48, 200, 201, 202, 203,  48, 204, 205,  48,  48, 206,  48, 207, 208, 209, 209,
-    48, 210,  48,  48,  48, 211, 212, 213, 192, 192, 214, 215, 216, 140, 140, 140,
-   217,  48,  48, 218, 219, 160, 220, 221, 222,  48, 223,  64,  48,  48, 224, 225,
-    48,  48, 226, 227, 228,  64,  48, 229, 230,   9,   9, 231, 232, 233, 234, 235,
-    11,  11, 236,  27,  27,  27, 237, 238,  11, 239,  27,  27,  32,  32,  32,  32,
-    13,  13,  13,  13,  13,  13,  13,  13,  13, 240,  13,  13,  13,  13,  13,  13,
-   241, 242, 241, 241, 242, 243, 241, 244, 245, 245, 245, 246, 247, 248, 249, 250,
-   251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 261, 262, 263, 264, 265,
-   266, 267, 268, 269, 270, 271, 272, 272, 273, 274, 275, 209, 276, 277, 209, 278,
-   279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
-   280, 209, 281, 209, 209, 209, 209, 282, 209, 283, 279, 284, 209, 285, 286, 209,
-   209, 209, 176, 140, 287, 140, 271, 271, 271, 288, 209, 209, 209, 209, 289, 271,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 290, 291, 209, 209, 292,
-   209, 209, 209, 209, 209, 209, 293, 209, 209, 209, 209, 209, 209, 209, 209, 209,
-   209, 209, 209, 209, 209, 209, 294, 295, 271, 296, 209, 209, 297, 279, 298, 279,
+    48, 210,  48,  48,  48, 211, 212, 213, 192, 192, 214, 215,  32, 216, 217, 140,
+   218,  48,  48, 219, 220, 160, 221, 222, 223,  48, 224,  64,  48,  48, 225, 226,
+    48,  48, 227, 228, 229,  64,  48, 230, 231,   9,   9, 232, 233, 234, 235, 236,
+    11,  11, 237,  27,  27,  27, 238, 239,  11, 240,  27,  27,  32,  32,  32,  32,
+    13,  13,  13,  13,  13,  13,  13,  13,  13, 241,  13,  13,  13,  13,  13,  13,
+   242, 243, 242, 242, 243, 244, 242, 245, 246, 246, 246, 247, 248, 249, 250, 251,
+   252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 262, 263, 264, 265, 266,
+   267, 268, 269, 270, 271, 272, 273, 273, 274, 275, 276, 209, 277, 278, 209, 279,
+   280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
+   281, 209, 282, 209, 209, 209, 209, 283, 209, 284, 280, 285, 209, 286, 287, 209,
+   209, 209, 176, 140, 288, 140, 272, 272, 272, 289, 209, 209, 209, 209, 290, 272,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 291, 292, 209, 209, 293,
+   209, 209, 209, 209, 209, 209, 294, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+   209, 209, 209, 209, 209, 209, 295, 296, 272, 297, 209, 209, 298, 280, 299, 280,
    209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
-   279, 279, 279, 279, 279, 279, 279, 279, 299, 300, 279, 279, 279, 301, 279, 302,
-   209, 209, 209, 279, 303, 209, 209, 304, 209, 305, 209, 209, 209, 209, 209, 209,
+   280, 280, 280, 280, 280, 280, 280, 280, 300, 301, 280, 280, 280, 302, 280, 303,
+   209, 209, 209, 280, 304, 209, 209, 305, 209, 209, 209, 209, 209, 209, 209, 209,
      9,   9,   9,  11,  11,  11, 306, 307,  13,  13,  13,  13,  13,  13, 308, 309,
     11,  11, 310,  48,  48,  48, 311, 312,  48, 313, 314, 314, 314, 314,  32,  32,
    315, 316, 317, 318, 319, 320, 140, 140, 209, 321, 209, 209, 209, 209, 209, 322,
@@ -4046,7 +3716,7 @@
    209, 333, 334, 209, 335, 336, 209, 209, 334, 209, 209, 336, 209, 209, 209, 209,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 209, 209, 209, 209,
     48, 337,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48,  48,  48, 151, 209, 209, 209, 338,  48,  48, 229,
+    48,  48,  48,  48,  48,  48,  48,  48, 151, 209, 209, 209, 338,  48,  48, 230,
    339,  48, 340, 140,  13,  13, 341, 342,  13, 343,  48,  48,  48,  48, 344, 345,
     31, 346, 347, 348,  13,  13,  13, 349, 350, 351, 352, 353, 354, 355, 140, 356,
    357,  48, 358, 359,  48,  48,  48, 360, 361,  48,  48, 362, 363, 192,  32, 364,
@@ -4062,1560 +3732,407 @@
     32, 404,  32, 405, 406, 407, 408, 409,  48,  48,  48,  48,  48,  48,  48, 410,
    411,   2,   3,   4,   5, 412, 413, 414,  48, 415,  48, 200, 416, 417, 418, 419,
    420,  48, 172, 421, 204, 204, 140, 140,  48,  48,  48,  48,  48,  48,  48,  71,
-   422, 271, 271, 423, 272, 272, 272, 424, 425, 426, 427, 140, 140, 209, 209, 428,
+   422, 272, 272, 423, 273, 273, 273, 424, 425, 426, 427, 140, 140, 209, 209, 428,
    140, 140, 140, 140, 140, 140, 140, 140,  48, 151,  48,  48,  48, 100, 429, 430,
     48,  48, 431,  48, 432,  48,  48, 433,  48, 434,  48,  48, 435, 436, 140, 140,
      9,   9, 437,  11,  11,  48,  48,  48,  48, 204, 192,   9,   9, 438,  11, 439,
     48,  48, 440,  48,  48,  48, 441, 442, 442, 443, 444, 445,  48,  48,  48, 388,
     48,  48,  48, 313,  48, 199, 440, 140, 446,  27,  27, 447, 140, 140, 140, 140,
    448,  48,  48, 449,  48, 450,  48, 451,  48, 200, 452, 140, 140, 140,  48, 453,
-    48, 454,  48, 455, 140, 140, 140, 140,  48,  48,  48, 456, 271, 457, 271, 271,
+    48, 454,  48, 455,  48, 207, 140, 140,  48,  48,  48, 456, 272, 457, 272, 272,
    458, 459,  48, 460, 461, 462,  48, 463,  48, 464, 140, 140, 465,  48, 466, 467,
     48,  48,  48, 468,  48, 469,  48, 470,  48, 471, 472, 140, 140, 140, 140, 140,
     48,  48,  48,  48, 196, 140, 140, 140,   9,   9,   9, 473,  11,  11,  11, 474,
     48,  48, 475, 192, 476,   9, 477,  11, 478, 140, 140, 140, 140, 140, 140, 140,
-   140, 140, 140, 140, 140, 140, 271, 479,  48,  48, 480, 481, 482, 140, 140, 483,
-    48, 464, 484,  48,  62, 485, 140,  48, 486, 140, 140,  48, 487, 140,  48, 313,
-   488,  48,  48, 489, 490, 457, 491, 492, 222,  48,  48, 493, 494,  48, 196, 192,
-   495,  48, 496, 497, 498,  48,  48, 499, 222,  48,  48, 500, 501, 502, 503, 504,
-    48,  97, 505, 506, 507, 140, 140, 140, 508, 509, 510,  48,  48, 511, 512, 192,
-   513,  83,  84, 514, 515, 516, 517, 518, 519,  48,  48, 520, 521, 522, 523, 140,
-    48,  48,  48, 524, 525, 526, 481, 140,  48,  48,  48, 527, 528, 192, 140, 140,
-   140, 140, 140, 140, 140, 140, 140, 140,  48,  48, 529, 530, 531, 532, 140, 140,
-    48,  48,  48, 533, 534, 192, 535, 140,  48,  48, 536, 537, 192, 538, 539, 140,
-    48, 540, 541, 542, 313, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    48,  48, 505, 543, 140, 140, 140, 140, 140, 140,   9,   9,  11,  11, 148, 544,
-   545, 546,  48, 547, 548, 192, 140, 140, 140, 140, 549,  48,  48, 550, 551, 140,
-   552,  48,  48, 553, 554, 555,  48,  48, 556, 557, 558,  48,  48,  48,  48, 196,
-   559, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48,  48, 560, 192,
-    84,  48, 529, 561, 562, 148, 175, 563,  48, 564, 565, 566, 140, 140, 140, 140,
-   567,  48,  48, 568, 569, 192, 570,  48, 571, 572, 192, 140, 140, 140, 140, 140,
-   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 573,
-   574, 115,  48, 575, 576, 577, 140, 140, 140, 140, 140, 100, 271, 578, 579, 580,
+   140, 140, 140, 140, 140, 140, 272, 479,  48,  48, 480, 481, 482, 483, 140, 484,
+    48, 464, 485,  48,  62, 486, 140,  48, 487, 140, 140,  48, 488, 140,  48, 313,
+   489,  48,  48, 490, 491, 457, 492, 493, 223,  48,  48, 494, 495,  48, 196, 192,
+   496,  48, 497, 498, 499,  48,  48, 500, 223,  48,  48, 501, 502, 503, 504, 505,
+    48,  97, 506, 507, 508, 140, 140, 140, 509, 510, 511,  48,  48, 512, 513, 192,
+   514,  83,  84, 515, 516, 517, 518, 519, 520,  48,  48, 521, 522, 523, 524, 140,
+    48,  48,  48, 525, 526, 527, 481, 140,  48,  48,  48, 528, 529, 192, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140,  48,  48, 530, 531, 532, 533, 140, 140,
+    48,  48,  48, 534, 535, 192, 536, 140,  48,  48, 537, 538, 192, 539, 540, 140,
+    48, 541, 542, 543, 313, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    48,  48, 506, 544, 140, 140, 140, 140, 140, 140,   9,   9,  11,  11, 148, 545,
+   546, 547,  48, 548, 549, 192, 140, 140, 140, 140, 550,  48,  48, 551, 552, 140,
+   553,  48,  48, 554, 555, 556,  48,  48, 557, 558, 559,  48,  48,  48,  48, 196,
+   560, 140, 140, 140, 140, 140, 561, 140, 140, 140, 140, 140,  48,  48, 562, 192,
+    84,  48, 530, 563, 564, 148, 175, 565,  48, 566, 567, 568, 140, 140, 140, 140,
+   569,  48,  48, 570, 571, 192, 572,  48, 573, 574, 192,  48,  48, 575, 192, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 576,
+   577, 115,  48, 578, 579, 580, 140, 140, 140, 140, 140, 100, 272, 581, 582, 583,
     48,  48,  48,  48,  48,  48,  48,  48,  48, 207, 140, 140, 140, 140, 140, 140,
-   272, 272, 272, 272, 272, 272, 581, 582,  48,  48,  48,  48,  48,  48,  48,  48,
+   273, 273, 273, 273, 273, 273, 584, 585,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48, 388, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
    140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-   140, 140, 140, 140, 140, 140, 140, 140, 140,  48,  48,  48,  48,  48,  48, 583,
-    48,  48,  48, 584, 585, 586,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+   140, 140, 140, 140, 140, 140, 140, 140, 140,  48,  48,  48,  48,  48,  48, 586,
+    48,  48,  48, 587, 588, 589,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  71,
     48,  48,  48,  48, 313, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    48, 587, 588, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-    48,  48,  48, 196,  48, 200, 370,  48,  48,  48,  48, 200, 192,  48, 204, 589,
-    48,  48,  48, 590, 591, 592, 593, 594,  48, 140, 140, 140, 140, 140, 140, 140,
-   140, 140, 140, 140, 595,  48, 596, 192, 140, 140, 140, 140, 140, 140, 140, 140,
-   140, 140, 140, 140,   9,   9,  11,  11, 271, 597, 140, 140, 140, 140, 140, 140,
-    48,  48,  48,  48, 598, 599, 600, 600, 601, 602, 140, 140, 140, 140, 603, 604,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 440,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 199, 140, 605,
-   196, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 606,
-    48,  48, 607, 608, 140, 609, 610,  48,  48,  48,  48,  48,  48,  48,  48,  48,
+    48, 590, 591, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+    48,  48,  48, 196,  48, 200, 370,  48,  48,  48,  48, 200, 192,  48, 204, 592,
+    48,  48,  48, 593, 594, 595, 596, 597,  48, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 598,  48, 599, 192, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140,   9,   9,  11,  11, 272, 600,   9, 601,  11, 602, 140, 140,
+    48,  48,  48,  48, 603, 604, 605, 605, 606, 607, 140, 140, 140, 140, 608, 609,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 199, 140, 610,
+    48, 200, 140, 140, 140, 140, 140, 140,  48,  48,  48,  48,  48,  48,  48, 611,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 612,
+    48,  48, 611, 613, 140, 614, 615,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 206,
-    48,  48,  48,  48,  48,  48,  71, 151, 196, 611, 612, 140, 140, 140, 140, 140,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 192,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 322, 140, 140, 140, 140,
-    32,  32, 613,  32, 614, 209, 209, 209, 209, 209, 209, 209, 322, 140, 140, 140,
+    48,  48,  48,  48,  48,  48,  71, 151, 196, 616, 617, 140, 140, 140, 140, 140,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 618,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 619, 209, 427, 209, 620,
+    32,  32, 216,  32, 621, 209, 209, 209, 209, 209, 209, 209, 322, 140, 140, 140,
    209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 323,
-   209, 209, 615, 209, 209, 209, 616, 617, 618, 209, 619, 209, 209, 209, 287, 140,
-   209, 209, 209, 209, 620, 140, 140, 140, 140, 140, 140, 140, 271, 621, 271, 621,
-   209, 209, 209, 209, 209, 338, 271, 461, 140, 140, 140, 140, 140, 140, 140, 140,
-     9, 622,  11, 623, 624, 625, 241,   9, 626, 627, 628, 629, 630,   9, 622,  11,
-   631, 632,  11, 633, 634, 635, 636,   9, 637,  11,   9, 622,  11, 623, 624,  11,
-   241,   9, 626, 636,   9, 637,  11,   9, 622,  11, 638,   9, 639, 640, 641, 642,
-    11, 643,   9, 644, 645, 646, 647,  11, 648,   9, 649,  11, 650, 538, 538, 538,
-    32,  32,  32, 651,  32,  32, 652, 653, 654, 655,  45, 140, 140, 140, 140, 140,
-   656, 657, 658, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-   659, 660, 661,  27,  27,  27, 662, 140, 663, 140, 140, 140, 140, 140, 140, 140,
-    48,  48, 151, 664, 665, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-   140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 666, 140,  48,  48, 667, 668,
-   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 669, 192,
-   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 587, 670,
-   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 671, 200,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 672, 614, 140, 140,
-     9,   9, 626,  11, 673, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-   140, 140, 140, 140, 140, 140, 140, 503, 271, 271, 674, 675, 140, 140, 140, 140,
-   503, 271, 676, 677, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-   678,  48, 679, 680, 681, 682, 683, 684, 685, 206, 686, 206, 140, 140, 140, 687,
-   209, 209, 688, 209, 209, 209, 209, 209, 209, 322, 333, 689, 689, 689, 209, 323,
-   690, 209, 209, 209, 209, 209, 209, 209, 209, 209, 691, 140, 140, 140, 692, 209,
-   693, 209, 209, 688, 694, 695, 323, 140, 140, 140, 140, 140, 140, 140, 140, 140,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 696,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 697, 426, 426,
-   209, 209, 209, 209, 209, 209, 209, 698, 209, 209, 209, 209, 209, 176, 688, 427,
-   688, 209, 209, 209, 699, 176, 209, 209, 699, 209, 691, 688, 695, 140, 140, 140,
-   209, 209, 209, 209, 209, 322, 691, 426, 700, 209, 209, 209, 701, 702, 176, 694,
-   209, 209, 209, 209, 209, 209, 209, 209, 209, 703, 209, 209, 209, 209, 209, 192,
+   209, 209, 622, 209, 209, 209, 623, 624, 625, 209, 626, 209, 209, 209, 288, 140,
+   209, 209, 209, 209, 627, 140, 140, 140, 140, 140, 140, 140, 272, 628, 272, 628,
+   209, 209, 209, 209, 209, 338, 272, 461, 140, 140, 140, 140, 140, 140, 140, 140,
+     9, 629,  11, 630, 631, 632, 242,   9, 633, 634, 635, 636, 637,   9, 629,  11,
+   638, 639,  11, 640, 641, 642, 643,   9, 644,  11,   9, 629,  11, 630, 631,  11,
+   242,   9, 633, 643,   9, 644,  11,   9, 629,  11, 645,   9, 646, 647, 648, 649,
+    11, 650,   9, 651, 652, 653, 654,  11, 655,   9, 656,  11, 657, 539, 539, 539,
+    32,  32,  32, 658,  32,  32, 659, 660, 661, 662,  45, 140, 140, 140, 140, 140,
+   663, 664, 665, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   666, 667, 668,  27,  27,  27, 669, 140, 670, 140, 140, 140, 140, 140, 140, 140,
+    48,  48, 151, 671, 672, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 673, 140,  48,  48, 674, 675,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 676, 192,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 590, 677,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,  48, 200, 678, 679,
+   140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 680, 200,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 681, 621, 140, 140,
+     9,   9, 633,  11, 682, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   140, 140, 140, 140, 140, 140, 140, 504, 272, 272, 683, 684, 140, 140, 140, 140,
+   504, 272, 685, 686, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   687,  48, 688, 689, 690, 691, 692, 693, 694, 206, 695, 206, 140, 140, 140, 696,
+   209, 209, 697, 209, 209, 209, 209, 209, 209, 322, 333, 698, 698, 698, 209, 323,
+   699, 209, 209, 209, 209, 209, 209, 209, 209, 209, 700, 140, 140, 140, 701, 209,
+   702, 209, 209, 697, 703, 704, 323, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 705,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 706, 426, 426,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 176, 697, 427,
+   697, 209, 209, 209, 707, 176, 209, 209, 707, 209, 700, 697, 704, 708, 140, 140,
+   209, 209, 209, 209, 209, 707, 700, 426, 709, 209, 209, 209, 710, 711, 712, 703,
+   209, 209, 209, 209, 209, 209, 209, 209, 209, 713, 209, 209, 209, 209, 209, 714,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 140, 140,
-    48,  48,  48, 207,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
     48, 204,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 481,  48,  48,  48,  48,  48,
+    48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 204,  48,  48,  48,  48,  48,
     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 100,  48,
     48,  48,  48,  48,  48, 204, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
     48, 204, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
     48,  48,  48,  48,  71,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
-    48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48, 140, 140, 140, 140, 140,
-   704, 140, 584, 584, 584, 584, 584, 584, 140, 140, 140, 140, 140, 140, 140, 140,
+    48,  48,  48,  48,  48,  48,  48, 207, 140, 140, 140, 140, 140, 140, 140, 140,
+   715, 140, 587, 587, 587, 587, 587, 587, 140, 140, 140, 140, 140, 140, 140, 140,
     32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 140,
-   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 705,
-   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 706,
-     0,   0,   1,   1,   0,   2,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
-     4,   4,   4,   4,   4,   5,   0,   6,   7,   7,   7,   8,   9,  10,  11,  12,
-    13,  13,  13,  13,  14,  13,  13,  13,  13,  15,  16,  17,  18,  19,  20,  21,
-    22,  23,  24,  25,  23,  23,  26,  23,  27,  28,  29,  23,  30,  31,  32,  33,
-    34,  35,  36,  37,  38,  23,  23,  39,  40,  40,  41,  42,  43,  44,  45,  46,
-    47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,
-    63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,
-    79,  80,  81,  82,  83,  84,  85,  82,  86,  86,  87,  88,  89,  90,  91,  82,
-    92,  92,  92,  92,  92,  93,  94,  95,  96,  96,  96,  96,  96,  96,  96,  96,
-    97,  97,  98,  97,  99, 100, 101,  97, 102,  97, 103, 104, 105, 106, 106, 107,
-   108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109, 110, 110, 111,
-   112, 113, 114, 115, 116, 116, 117, 118, 119, 120, 120, 121, 120, 122, 108, 123,
-   124, 125, 126, 127, 128, 129, 130, 116, 131, 132, 133, 134, 135, 136, 137,  82,
-   138, 138, 139, 138, 140, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
-     4, 151, 152, 153,   4, 154,   7,   7, 155,  11, 156, 157,  11, 158, 159, 160,
-   161,   0,   0, 162, 163,   0, 164, 165,   0, 166, 167,   4, 168,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0, 169, 170,   0,   0,   0,   0,   0,
-   171, 171, 171, 171, 171, 171, 171, 171,   0,   0,   0, 172, 173,   0,   0,   0,
-   174, 174, 174,   4, 175, 175, 175, 176,  93, 177, 178, 179, 180, 181, 181,  13,
-     0,   0, 182,  82, 183, 184, 184, 185, 184, 184, 184, 184, 184, 184, 186, 187,
-   188, 189, 190, 191, 192, 193, 194, 195, 196, 197,  96,  96, 198, 199,   0, 200,
-   201,   0,   0, 202,   0,   0, 203, 204, 194, 194, 205,   0,   0,   0,   0,   0,
-   184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184,   0,   0,
-   206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 207, 206, 208, 209,
-   210, 210, 210, 210, 210, 210, 210, 210, 210, 211,  13,  13,  13, 212, 212, 213,
-     0, 214,   4,   4, 215,   4, 216, 217, 218, 219, 220, 221, 222, 222, 223,  40,
-   224, 225, 226, 227, 228, 228, 229, 230, 231, 232, 233,  92, 234, 234, 235, 236,
-   237, 238, 239, 240, 106, 106, 241, 242,  96,  96,  96,  96,  96, 243, 244, 245,
-    82,  82,  82,  82,  82,  82,  82,  82, 184, 184, 184, 246, 184, 184, 247,  82,
-   248, 249, 250,  23,  23,  23, 251,  23,  23,  23,  23,  23,  23,  23,  23,  23,
-    23, 252,  23,  23, 253,  23, 254, 255, 256, 257, 258, 259,  23,  23,  23, 260,
-   261,   1,   1, 262, 263, 201, 264, 265, 266, 267, 268,  82, 269, 269, 269, 270,
-   271, 272,  11,  11, 273, 274, 187, 275,  82,  82,  82,  82, 276, 277, 278, 279,
-   280, 281, 282, 283, 284, 285, 286,  82, 287, 287, 288, 289, 290, 291, 292, 293,
-   294, 295, 296, 297, 298, 299, 300, 301, 302, 302, 302, 302, 302, 302, 302, 302,
-   302, 303, 304, 305, 306, 307,  82,  82, 308, 309, 310, 311, 312, 313,  82, 314,
-   315, 316,  82,  82, 317, 318, 319, 320, 321, 322, 323, 324, 325,  82, 326, 327,
-   328, 329, 330, 331, 332, 333,  82,  82, 334, 334, 335,  82, 336, 337, 336, 338,
-   339, 340, 341, 342, 343,  82,  82,  82,  82,  82,  82, 344, 345, 346, 347, 348,
-   349, 350, 351, 352, 353, 354, 355, 356, 357, 357, 358, 359, 360, 360, 361, 362,
-   363, 364, 365, 366, 367, 367, 367, 368, 369, 370, 371,  82, 372, 373, 374, 375,
-   376, 377, 378, 379, 380, 381, 382, 383, 384, 384, 385, 386, 387, 387, 388,  82,
-    82,  82,  82,  82, 389, 390, 391,  82, 392, 392, 393, 394, 395, 396, 397, 398,
-   399, 400, 401,  82,  82,  82,  82,  82, 402, 403,  82,  82,  82, 404, 404, 405,
-   406, 407, 408,  82,  82, 409, 410, 411, 412, 412, 413, 414, 414, 415, 416, 417,
-   418,  82,  82,  82,  82,  82, 419, 420, 421, 422, 423, 424, 425, 426,  82,  82,
-   427, 428, 429, 430, 431, 432,  82,  82,  82,  82,  82,  82,  82,  82,  82, 433,
-   434, 435, 436,  82,  82, 437, 438, 439, 440, 440, 440, 440, 440, 440, 440, 440,
-   440, 440, 440, 440, 441,  82,  82,  82, 440, 440, 440, 442, 440, 440, 440, 440,
-   440, 440, 443,  82,  82,  82,  82,  82,  82,  82,  82,  82, 444, 445, 445, 446,
-   447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 448, 447, 447, 447, 447, 447,
-   447, 447, 447, 447, 447, 447, 447, 449, 450, 450, 450, 450, 450, 450, 450, 450,
-   450, 450, 451,  82,  82,  82,  82,  82, 452, 453,  82,  82,  82,  82,  82,  82,
-   212, 212, 212, 212, 212, 212, 212, 212, 212, 454, 455, 456, 457, 458, 459, 460,
-   461, 461, 462, 463, 464,  82,  82,  82,  82,  82, 465, 466,  82,  82,  82,  82,
-    82,  82, 467, 467, 468,  82,  82,  82, 469, 469, 470, 469, 471,  82,  82, 472,
-   473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 474,
-   475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 476, 477,
-   478,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82,  82, 479,
-   480, 191, 191, 191, 191, 191, 191, 191, 191, 481, 482, 483, 484, 484, 484, 484,
-   484, 484, 484, 484, 484, 484, 484, 485, 486, 486, 486, 487, 488, 489,  82,  82,
-     0,   0,   0,   0,   0,   0,   0, 490,   0,   0,   0,   0,   0, 491,  82,  82,
-     7, 492, 493,   0,   0,   0, 489,  82,   0,   0,   0,   0,   0,   0,   0, 494,
-     0, 495,   0, 496, 497, 498,   0, 170,  11,  11, 499,  82,  82,  82, 491, 491,
-     0,   0, 500, 501,  82,  82,  82,  82,   0,   0, 502,   0, 503, 504, 505,   0,
-   506, 507, 508,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 509,   0,   0,
-     0,   0,   0,   0,   0,   0, 510,   0, 511, 511, 511, 511, 511, 511, 511, 511,
-   511, 511, 511, 511, 512, 513,  82,  82, 514, 515,  82,  82,  82,  82,  82,  82,
-   516, 517,  13, 518, 519,  82,  82,  82, 520, 521, 522,  82,  82,  82,  82,  82,
-    82,  82,  82,  82, 523, 524, 525, 526,  82,  82,  82,  82,  82,  82, 527, 528,
-    82,  82,  82,  82,  82,  82, 529, 530,  82,  82,  82,  82,  82,  82,  82, 531,
-   532, 532, 532, 532, 532, 532, 533,  82, 534, 534, 535,  82,  82,  82,  82,  82,
-    82,  82,  82, 536,   0, 537,  82,  82, 261, 182,  82,  82,  82,  82,  82,  82,
-   538, 539, 540, 541, 542, 543,  82, 544,   0, 545,   0,   0, 491, 546, 547, 494,
-     0,   0,   0,   0,   0, 548,  82, 549, 550, 551, 552, 553,  82,  82,  82,  82,
-     0,   0,   0,   0,   0,   0, 554, 555,   0,   0,   0, 556,   0,   0, 490, 557,
-   545,   0, 558,   0, 559, 560, 561,  82,   0,   0, 491, 562, 563,   0, 564, 565,
-     0,   0,   0,   0, 258,   0,   0, 490, 184, 184, 184, 184, 184, 184, 184,  82,
-   184, 247, 184, 184, 184, 184, 184, 184, 566, 184, 184, 184, 184, 184, 184, 184,
-   184, 184, 184, 184, 184, 567, 184, 184, 184, 184, 184, 184, 184, 184, 184, 568,
-   184, 184, 566,  82,  82,  82,  82,  82, 566,  82,  82,  82,  82,  82,  82,  82,
-   184, 184, 569, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 570,  82,  82,
-   571,   0,   0,   0,  82,  82,  82,  82,   7,   7,   7,   7,   7,   7,   7, 572,
-     0,   0,   0,   0,   1,   2,   2,   3,   0,   4,   0,   4,   2,   2,   5,   2,
-     2,   2,   2,   2,   2,   2,   2,   6,   7,   8,   0,   0,   9,   9,   9,   9,
-     9,   9,  10,  11,  12,  13,  14,  14,  15,  14,  14,  14,  14,  14,  14,  14,
-    16,  17,  14,  14,  18,  18,  18,  18,  19,  18,  18,  18,  18,  18,  20,  21,
-    21,  21,  22,  20,  21,  21,  21,  21,  21,  23,  24,  25,  25,  25,  25,  25,
-    25,  26,  25,  25,  25,  27,  28,  26,  29,  30,  31,  32,  31,  31,  31,  31,
-    33,  34,  35,  31,  31,  31,  36,  31,  31,  31,  31,  29,  37,  38,  37,  37,
-    37,  37,  37,  37,  37,  39,  31,  31,  40,  40,  40,  40,  40,  40,  41,  26,
-    42,  42,  42,  42,  42,  42,  42,  43,  44,  44,  44,  44,  44,  45,  44,  46,
-    47,  47,  47,  48,  37,  49,  31,  31,  31,  50,  51,  31,  52,  31,  31,  31,
-    53,  53,  53,  53,  53,  53,  54,  53,  55,  53,  53,  53,  56,  57,  58,  59,
-    59,  60,  61,  62,  57,  63,  64,  65,  66,  59,  59,  67,  68,  69,  70,  71,
-    71,  72,  73,  74,  69,  75,  76,  77,  78,  71,  79,  26,  80,  81,  82,  83,
-    83,  84,  85,  86,  81,  87,  88,  26,  89,  83,  90,  91,  92,  93,  94,  95,
-    95,  96,  97,  98,  93,  99, 100, 101, 102,  95,  95,  26, 103, 104, 105, 106,
-   107, 104, 108, 109, 104, 105, 110,  26, 111, 108, 108, 112, 113, 114, 115, 113,
-   113, 115, 113, 116, 114, 117, 118, 119, 120, 113, 121, 113, 122, 123, 124, 122,
-   122, 124, 125, 126, 123, 127, 128, 128, 129, 122, 130,  26, 131, 132, 133, 131,
-   131, 131, 131, 131, 132, 133, 134, 131, 135, 131, 131, 131, 136, 137, 138, 139,
-   137, 137, 140, 141, 138, 142, 143, 137, 144, 137, 145,  26, 146, 147, 147, 147,
-   147, 147, 147, 148, 147, 147, 147, 149,  26,  26,  26,  26, 150, 151, 152, 152,
-   153, 152, 152, 154, 155, 156, 152, 157, 158, 158, 158, 158, 158, 159, 158, 158,
-   158, 160, 159, 158, 158, 158, 158, 159, 158, 158, 158, 161, 158, 161, 162, 163,
-   164, 164, 164, 164, 165, 165, 165, 165, 166, 167, 165, 165, 165, 165, 165, 168,
-   169, 169, 169, 169, 170, 170, 170, 170, 170, 171, 172, 171, 170, 171, 170, 170,
-   170, 170, 171, 172, 171, 170, 172, 170, 170, 170, 171, 170, 170, 170, 170, 173,
-   170, 170, 170, 174, 170, 170, 170, 175, 176, 176, 176, 176, 176, 176, 177, 177,
-   178, 178, 178, 178, 179, 179, 179, 180, 181, 181, 181, 181, 181, 182, 181, 183,
-   184, 184, 185, 186, 187, 187, 188,  26, 189, 189, 190,  26, 191, 192, 193,  26,
-   194, 194, 194, 194, 194, 194, 194, 195, 194, 196, 194, 196, 197, 198, 198, 199,
-   198, 198, 198, 198, 198, 198, 198, 200, 198, 201, 178, 178, 178, 178, 202,  26,
-   203, 203, 203, 204, 203, 205, 203, 205, 206, 203, 207, 207, 207, 208, 209,  26,
-   210, 210, 210, 210, 210, 211, 210, 210, 210, 212, 210, 213, 214, 214, 214, 215,
-   216, 216, 216, 216, 216, 216, 216, 217, 216, 216, 216, 218, 216, 219, 216, 219,
-   216, 220,   9,   9,   9, 221,  26,  26, 222, 222, 222, 222, 222, 223, 222, 222,
-   224, 224, 224, 224, 225, 225, 225, 225, 225, 225, 226, 227, 228, 228, 228, 228,
-   228, 228, 228, 229, 228, 230, 231, 231, 231, 231, 231, 231,  18, 232, 165, 165,
-   165, 165, 165, 233, 224,  26, 234,   9, 235, 236, 237, 238, 239, 240,   2,   2,
-     2,   2,   2, 241, 242, 243,   2, 244,   2,   2,   2, 245,  14,  14, 246, 246,
-   246, 246,  14, 247,  14,  14,  14, 246,  14,  14, 248,  14, 248,  14, 249, 250,
-    14,  14, 251, 252,   0, 253,   0,   0, 254,   0, 255, 256,   0, 257,   2, 258,
-   259,  26,   9,   9,   9,   9, 260,  26, 261, 262,   4,   0,   0, 263,   0,   0,
-     2, 264,   0,   0,   0, 265,  26,  26,   0, 266,  26,  26, 267, 267, 267, 267,
-     0,   0, 268,   0,   0,   0, 269,   0, 270, 270, 270, 270,  17,  17,  17,  17,
-    17,  17, 271, 272, 166, 167, 273, 273, 273, 273, 273, 273, 273, 274, 275, 274,
-   170, 170, 172,  26, 172, 172, 172, 172,   0,   0,   0, 276, 277, 277, 277, 278,
-   277, 277, 277, 277, 277, 277, 279,  26, 277, 277, 280,  26,  26,  26,   0,   0,
-   281,   0,   0,   0, 282, 283,   0, 284, 285, 286, 286, 286, 286, 286, 286, 286,
-   286, 286, 287, 288, 289, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 291,
-   292, 293, 293, 293, 293, 293, 294, 169, 169, 295,   0,   0, 293, 293, 293, 293,
-   276, 296, 290, 290, 169, 169, 169, 295, 169, 169, 169, 297,   0,   0, 290, 290,
-   290, 290, 290, 298, 290, 290, 290,   0, 299, 299, 299, 299, 299, 300, 299, 299,
-   301,  26, 302, 302, 302, 302, 302, 302, 303, 303, 303, 303, 303, 304,  26,  26,
-   305, 305, 305, 305, 305, 305, 305,  26, 306,   2,   2,   2,   2, 307,   2,   2,
-     2, 308, 309, 258,  26,  26, 310,   2, 311, 311, 311, 311, 311, 312,   0, 265,
-   313, 313, 313, 313, 313, 313, 313,  26, 314, 314, 314, 314, 315, 316, 314, 317,
-   318, 318, 318, 318, 318, 319, 320, 320, 320, 320, 321, 322, 169, 169, 169, 323,
-   324, 324, 324, 324, 324, 325, 324, 326, 164, 164, 164, 327, 328, 328, 328, 328,
-   328, 328, 329,  26, 328, 330, 328, 331, 332, 332, 332, 332, 333,  26,  26, 334,
-   335, 335, 336,  26, 337, 337, 337,  26, 172, 172,   2,   2,   2,   2,   2, 338,
-   339, 340, 176, 176, 335, 335, 335, 335, 335, 341, 335, 342, 343,  26, 169, 169,
-   295, 344, 169, 169, 169, 169, 169, 343, 277, 280, 277, 277, 277, 277, 277, 345,
-   346,  26, 347, 348,  25,  25, 349, 350, 351,  25,  31,  31, 352,  26, 353,  31,
-    31,  31,  31, 354,  31,  31, 355,  31,  31, 356,  26,  26,  26,  26,  31,  31,
-     9,   9,   0, 265,   9, 357,   0,   0,   0,   0, 358,   0, 257, 359, 360,  31,
-    31,  31,  31, 361, 362,   0,   0,   0, 363, 290, 289, 290, 290, 290, 290, 364,
-   365, 365, 365, 366, 257, 257,  26, 367, 368, 369, 368, 368, 370, 368, 368, 371,
-   368, 372, 368, 372, 368, 368, 368, 368, 368, 368, 368, 373, 374,   0,   0,   0,
-     0,   0, 375,   0,  14, 252,   0, 376, 377,  26,  26,  26,   0,   0,   0, 378,
-   379, 379, 379, 380, 381, 381, 381, 381, 381, 381, 382,  26, 383,   0,   0, 359,
-   384, 384, 384, 384, 385, 386, 387, 387, 387, 388, 389, 389, 389, 389, 389, 390,
-   391, 391, 391, 392, 393, 393, 393, 393, 394, 393, 395,  26, 396, 396, 396, 396,
-   396, 396, 397, 397, 397, 397, 397, 397, 398, 398, 398, 399, 398, 400, 401, 401,
-   401, 401, 402, 401, 401, 401, 401, 402, 403, 403, 403, 403, 403,  26, 404, 404,
-   404, 404, 404, 404, 405, 406, 407, 408, 407, 408, 409, 407, 410, 407, 410, 411,
-   412, 412, 412, 412, 412, 412, 413,  26, 414, 414, 414, 414, 414, 414, 415,  26,
-   414, 414, 416,  26, 414,  26,  26,  26, 417,   2,   2,   2,   2,   2, 418, 419,
-   420, 421, 422, 422, 422, 422, 423, 424, 425, 425, 426, 425, 427, 427, 427, 427,
-   428, 428, 428, 429, 430, 428,  26,  26, 431, 431, 432, 433, 434, 434, 434, 435,
-   436, 436, 436, 437, 438, 438, 438, 438, 439, 439, 439, 440, 439, 439, 441, 439,
-   439, 439, 439, 439, 442, 443, 444, 445, 446, 446, 447, 448, 446, 449, 446, 449,
-   450, 450, 450, 450, 451, 451, 451, 451, 452, 452, 452, 452, 453, 454, 453,  26,
-   455, 455, 455, 455, 455, 455, 456, 457, 458, 458, 459, 458, 460, 460, 461, 460,
-   462, 462, 463, 464,  26, 465,  26,  26, 466, 466, 466, 466, 466, 467,  26,  26,
-   468, 468, 468, 468, 468, 468, 469,  26, 468, 468, 469, 470, 471, 471, 471, 471,
-   471,  26, 471, 472, 473, 473, 473, 473, 474, 475, 473, 473, 474, 476,  26,  26,
-    31,  31,  31,  50, 477, 477, 477, 477, 477, 478, 479,  26, 480,  26,  26,  26,
-    26,  26,  26, 481, 482, 482, 482, 482, 482,  26, 483, 483, 483, 483, 483, 484,
-    26,  26, 485, 485, 485, 486,  26,  26,  26,  26, 487, 487, 487, 488,  26,  26,
-   489, 489, 490,  26, 491, 491, 491, 491, 491, 492, 493, 491, 491, 491, 492, 494,
-   495, 495, 495, 495, 496, 497, 498, 498, 498, 499, 498, 500, 501, 501, 501, 501,
-   501, 501, 502, 501, 501,  26, 503, 503, 503, 503, 504,  26, 505, 505, 505, 505,
-   506, 137, 507,  26, 508, 508, 509, 508, 508, 508, 508, 508, 510,  26,  26,  26,
-   511, 512, 513, 514, 513, 515, 516, 516, 516, 516, 516, 516, 516, 517, 516, 518,
-   519, 520, 521, 522, 522, 523, 524, 525, 520, 526, 527, 528, 529, 530, 530,  26,
-   531, 532, 531, 531, 531, 531, 533, 531, 534, 535, 533, 536, 537,  26,  26,  26,
-   538, 538, 538, 538, 538, 538, 538, 539, 540,  26,  26,  26, 541, 541, 541, 541,
-   541,  26, 541, 542, 543, 543, 543, 543, 543, 543, 544, 543, 543, 543, 543, 544,
-   545, 545, 545, 545, 546,  26, 545, 547, 198, 548,  26,  26, 549, 549, 549, 549,
-   549, 549, 549, 550, 549, 550, 164, 164, 551,  26,  26,  26, 552, 552, 552, 553,
-   552, 554, 552, 552, 555,  26,  26,  26, 556, 556, 556, 556, 556, 556, 556, 557,
-   558, 558, 558, 558, 558, 558, 559, 560, 561, 562, 563, 564, 564, 564, 565, 566,
-   561,  26, 564, 567, 568, 569, 568, 568, 568, 568, 568, 569, 570,  26,  26,  26,
-   571, 571, 571, 571, 571,  26, 572, 572, 572, 572, 572, 572, 573,  26, 178, 178,
-   574, 574, 574, 574, 574, 574, 574, 575,  53, 576,  26,  26, 577, 577, 577, 577,
-   578,  26, 577, 578, 579, 580, 579, 579, 579, 579, 581, 579, 582,  26, 579, 579,
-   579, 583, 584, 584, 584, 584, 585, 584, 584, 586, 587,  26, 588, 589, 590, 590,
-   590, 590, 588, 591, 590,  26, 590, 592, 593, 594, 595, 595, 595, 596, 597, 598,
-   595, 599,  26,  26, 600, 600, 600, 601, 602, 602, 603, 602, 602, 602, 602, 604,
-   602, 602, 602, 605,  26,  26, 606,  26, 108, 108, 108, 108, 108, 108, 607, 608,
-   609, 609, 609, 609, 609, 609, 609, 610, 609, 611, 612,  26, 613,  26,  26,  26,
-    26,  26, 614, 614, 614, 614, 614, 614, 614, 614, 615,  26, 616, 616, 616, 616,
-   616, 616, 617,  26, 616, 616, 616, 618, 619, 619, 619, 619, 620,  26,  26,  26,
-   621, 621, 621, 621, 621, 621, 621, 622, 305, 305, 305, 623, 624, 624, 624, 625,
-   624, 626, 627, 627, 627, 627, 627, 627, 627, 627, 627, 628, 627, 629, 630, 630,
-   630, 631, 631,  26, 632, 632, 632, 632, 633,  26, 632, 634, 634, 632, 632, 635,
-   632, 632,  26,  26, 636, 636, 636, 636, 636, 636, 636, 637, 638, 638, 638, 638,
-   638, 638, 638, 639, 640, 640, 640, 640, 640, 641, 640, 640, 640, 642, 640, 640,
-   643,  26, 345,  26, 644, 644, 644, 644, 644, 644, 644,  26, 645, 645, 645, 645,
-   645, 645, 646,  26,  26,  26,  26, 647, 644, 648,  26,  26,  26,  26, 649, 650,
-   651, 286, 286, 286, 652,  26, 653,  26,  26,  26, 654,  26, 655,  26, 656, 656,
-   656, 656, 656, 656, 656, 656, 656, 657, 658, 658, 658, 658, 658, 659, 658, 660,
-   658, 661, 658, 662, 359,  26,  26,  26,   0,   0,   0, 265,   0,   0, 359,  26,
-     9, 663,   9,   9, 221,  26,   0,   0,   0,   0, 276,  26, 257, 362,   0,   0,
-   664, 665,   0, 666, 667, 668,   0,   0,   0, 669,   0,   0, 246,  26,  26,  26,
-     0,   0, 257,  26,   0,   0,   0, 259,   0,   0, 254,   0,   0,   0,   0, 254,
-   670, 671,   0, 672, 673,   0,   0,   0, 269, 674, 254, 254,   0,   0,   0, 675,
-   676, 677, 678,   0, 276,   0,   0,   0,   0, 268,   0,   0, 679, 679, 679, 679,
-   679, 680,  26, 681, 682, 679,  26,  26,   2,   2,   2, 346, 683, 419,  26,  26,
-   684, 270, 270, 685, 686, 687,  18,  18,  18, 688,  26,  26,  26, 689,  26,  26,
-   690, 690, 690, 690, 690, 691, 690, 692, 690, 693,  26,  26,  26,  26, 694, 694,
-   694, 695,  26,  26, 696, 696, 696, 696, 696, 696, 696, 697,  26,  26, 698, 698,
-   698, 698, 698, 699,  26,  26, 700, 700, 700, 700, 700, 701, 172, 702, 170, 172,
-   703, 703, 703, 703, 704, 703, 705,  26, 706, 706, 706, 706, 706, 707, 706, 708,
-    26,  26, 362,   0,   0,   0, 376,  26, 709,  31,  31,  31, 710, 711, 712, 713,
-   714, 715, 710, 716, 710, 712, 712, 717,  31, 718,  31, 719, 720, 718,  31, 719,
-    26,  26, 721,  26,   0, 359,   0,   0,   0, 257, 362,   0, 362,   0, 362,   0,
-     0, 276,  26,  26, 722,   0,   0,   0, 723,  26,   0,   0,   0,   0,   0, 359,
-     0, 259, 265,  26, 276,  26,  26,  26,   0,   0,   0, 724,   0, 376,   0, 376,
-     0,   0, 257, 725,   0, 359, 259,  26,   0,  26,   0, 265,   0,  26,   0,   0,
-     0, 276,   0, 359, 265,  26,  26,  26,   0, 276,   0, 376,   0, 726,   0,   0,
-   257, 722,   0, 727,   0, 265,   0, 259, 277, 277, 277, 280, 345,  26, 277, 277,
-   728,  26, 277, 277, 277, 729, 277, 277, 277, 277,  26,  26, 730,  26,  26,  26,
-     9,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0, 939, 940, 941, 942, 946, 948,   0, 962, 969, 970, 971, 976,
-  1001,1002,1003,1008,   0,1033,1040,1041,1042,1043,1047,   0,   0,1080,1081,1082,
-  1086,1110,   0,   0,1124,1125,1126,1127,1131,1133,   0,1147,1154,1155,1156,1161,
-  1187,1188,1189,1193,   0,1219,1226,1227,1228,1229,1233,   0,   0,1267,1268,1269,
-  1273,1298,   0,1303, 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145,
-   961,1146, 964,1149,   0,   0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163,
-   988,1173, 990,1175, 991,1176, 993,1178, 994,1179,   0,   0,1004,1190,1005,1191,
-  1006,1192,1014,1199,1007,   0,   0,   0,1016,1201,1020,1206,   0,1022,1208,1025,
-  1211,1023,1209,   0,   0,   0,   0,1032,1218,1037,1223,1035,1221,   0,   0,   0,
-  1044,1230,1045,1231,1049,1235,   0,   0,1058,1244,1064,1250,1060,1246,1066,1252,
-  1067,1253,1072,1258,1069,1255,1077,1264,1074,1261,   0,   0,1083,1270,1084,1271,
-  1085,1272,1088,1275,1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,
-  1309,1121,1310,   0,1053,1239,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,1093,1280,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0, 949,1134,1010,1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,
-  1366,   0,1320,1347,1418,1419,1323,1350,   0,   0, 992,1177,1018,1204,1055,1241,
-  1416,1417,1415,1424,1202,   0,   0,   0, 987,1172,   0,   0,1031,1217,1321,1348,
-  1322,1349,1338,1365, 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,
-  1051,1237,1052,1238,1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263,
-     0,   0, 997,1182,   0,   0,   0,   0,   0,   0, 945,1130, 982,1167,1337,1364,
-  1335,1362,1046,1232,1422,1423,1113,1301,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   8,   9,   0,  10,1425,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   7,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   1,   0,   0,   0,   0,   0,   0,1314,1427,   5,1434,1438,1443,   0,
-  1450,   0,1455,1461,1514,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1446,1458,
-  1468,1476,1480,1486,1517,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1489,1503,
-  1494,1500,1508,   0,   0,   0,   0,1520,1521,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1526,1528,   0,1525,   0,   0,   0,1522,   0,   0,   0,   0,
-  1536,1532,1539,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1534,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1556,   0,   0,
-     0,   0,   0,   0,1548,1550,   0,1547,   0,   0,   0,1567,   0,   0,   0,   0,
-  1558,1554,1561,   0,   0,   0,   0,   0,   0,   0,1568,1569,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1529,1551,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1523,1545,1524,1546,   0,   0,1527,1549,   0,   0,1570,1571,
-  1530,1552,1531,1553,   0,   0,1533,1555,1535,1557,1537,1559,   0,   0,1572,1573,
-  1544,1566,1538,1560,1540,1562,1541,1563,1542,1564,   0,   0,1543,1565,   0,   0,
-     0,   0,   0,   0,   0,   0,1606,1607,1609,1608,1610,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,1613,   0,1611,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,1612,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1620,   0,   0,
-     0,   0,   0,   0,   0,1623,   0,   0,1624,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1614,1615,1616,1617,
-  1618,1619,1621,1622,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1628,
-  1629,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1625,1626,   0,1627,   0,   0,   0,1634,   0,   0,1635,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1630,1631,1632,
-     0,   0,1633,   0,   0,   0,   0,   0,   0,   0,   0,   0,1639,   0,   0,1638,
-  1640,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1636,1637,   0,   0,   0,   0,   0,   0,1641,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1642,1644,
-  1643,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1645,   0,   0,   0,
-     0,   0,   0,   0,1646,   0,   0,   0,   0,   0,   0,1648,1649,   0,1647,1650,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1651,1653,
-  1652,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1654,   0,
-  1655,1657,1656,   0,   0,   0,   0,1659,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1660,   0,   0,   0,   0,1661,   0,   0,   0,   0,1662,   0,   0,   0,   0,
-  1663,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1658,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,1664,   0,1665,1673,   0,1674,   0,   0,   0,
-     0,   0,   0,   0,   0,1666,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,1668,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1669,   0,   0,   0,   0,1670,   0,   0,   0,   0,1671,   0,   0,   0,   0,
-  1672,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1667,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1675,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1676,   0,1677,   0,1678,   0,
-  1679,   0,1680,   0,   0,   0,1681,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1682,
-     0,1683,   0,   0,1684,1685,   0,1686,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0, 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148,
-   965,1150, 968,1153, 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,
-  1420,1421, 986,1171, 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,
-  1015,1200,1329,1356,1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,
-  1026,1212,1028,1214,1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,
-  1334,1361,1336,1363,1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,
-  1689,1690,1065,1251,1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,
-  1075,1262,1079,1266,1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,
-  1099,1286,1100,1287,1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,
-  1108,1296,1114,1302,1119,1308,1122,1311,1123,1312,1186,1260,1293,1305,   0,1394,
-     0,   0,   0,   0, 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,
-  1693,1695,1371,1375,1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162,
-   972,1157,1326,1353,1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,
-  1054,1240,1048,1234,1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,
-  1395,1400,1398,1403,1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,
-  1408,1413,1407,1412,1409,1414,1109,1297,1117,1306,1116,1304,1112,1300,   0,   0,
-     0,   0,   0,   0,1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,
-  1716,1720,1717,1721,1477,1478,1729,1731,1730,1732,   0,   0,1435,1436,1733,1735,
-  1734,1736,   0,   0,1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,
-  1752,1756,1753,1757,1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,
-  1772,1775,1773,1776,1495,1496,1777,1779,1778,1780,   0,   0,1451,1452,1781,1783,
-  1782,1784,   0,   0,1504,1505,1785,1788,1786,1789,1787,1790,   0,1459,   0,1791,
-     0,1792,   0,1793,1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,
-  1809,1813,1810,1814,1467,  21,1475,  22,1479,  23,1485,  24,1493,  27,1499,  28,
-  1507,  29,   0,   0,1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,
-  1725,1726,1727,1728,1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,
-  1761,1762,1763,1764,1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,
-  1818,1819,1820,1821,1470,1469,1822,1474,1465,   0,1473,1825,1429,1428,1426,  12,
-  1432,   0,  26,   0,   0,1315,1823,1484,1466,   0,1483,1829,1433,  13,1437,  14,
-  1441,1826,1827,1828,1488,1487,1513,  19,   0,   0,1492,1515,1445,1444,1442,  15,
-     0,1831,1832,1833,1502,1501,1516,  25,1497,1498,1506,1518,1457,1456,1454,  17,
-  1453,1313,  11,   3,   0,   0,1824,1512,1519,   0,1511,1830,1449,  16,1460,  18,
-  1464,   4,   0,   0,  30,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  20,   0,   0,   0,   2,   6,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1834,1835,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1836,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1837,1839,1838,   0,   0,   0,   0,1840,   0,   0,   0,   0,1841,   0,   0,
-  1842,   0,   0,   0,   0,   0,   0,   0,1843,   0,1844,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,1845,   0,   0,1846,   0,   0,1847,   0,1848,   0,   0,
-     0,   0,   0,   0, 937,   0,1850,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1849, 936, 938,1851,1852,   0,   0,1853,1854,   0,   0,1855,1856,   0,   0,
-     0,   0,   0,   0,1857,1858,   0,   0,1861,1862,   0,   0,1863,1864,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1867,1868,1869,1870,1859,1860,1865,1866,   0,   0,   0,   0,   0,   0,1871,1872,
-  1873,1874,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  32,  33,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1875,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1877,   0,1878,   0,1879,   0,1880,   0,1881,   0,1882,   0,1883,   0,1884,   0,
-  1885,   0,1886,   0,1887,   0,1888,   0,   0,1889,   0,1890,   0,1891,   0,   0,
-     0,   0,   0,   0,1892,1893,   0,1894,1895,   0,1896,1897,   0,1898,1899,   0,
-  1900,1901,   0,   0,   0,   0,   0,   0,1876,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1902,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-  1904,   0,1905,   0,1906,   0,1907,   0,1908,   0,1909,   0,1910,   0,1911,   0,
-  1912,   0,1913,   0,1914,   0,1915,   0,   0,1916,   0,1917,   0,1918,   0,   0,
-     0,   0,   0,   0,1919,1920,   0,1921,1922,   0,1923,1924,   0,1925,1926,   0,
-  1927,1928,   0,   0,   0,   0,   0,   0,1903,   0,   0,1929,1930,1931,1932,   0,
-     0,   0,1933,   0, 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205,
-   241, 336, 524, 601, 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108,
-   180, 416, 482, 662, 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492,
-   740, 116, 146, 168, 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538,
-   553, 588, 642, 758, 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267,
-   412, 445, 457, 585, 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345,
-   411, 704, 105, 259, 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183,
-   228, 529, 650, 697, 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580,
-   624, 700, 750, 170, 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384,
-   420, 730, 287, 330, 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759,
-   154, 163, 198, 473, 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280,
-   314, 499, 506, 603, 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126,
-   260, 265, 373, 411, 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451,
-   502, 516, 537, 583, 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496,
-   771, 155, 190, 269, 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175,
-   452, 191, 480, 510, 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471,
-   707, 111, 636, 156, 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295,
-   128, 210,   0,   0, 227,   0, 379,   0,   0, 150, 493, 525, 544, 551, 552, 556,
-   783, 576, 604,   0, 661,   0, 703,   0,   0, 735, 743,   0,   0,   0, 793, 794,
-   795, 808, 741, 773, 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268,
-   270, 317, 327, 329, 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539,
-   545, 547, 546, 548, 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607,
-   620, 625, 625, 651, 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315,
-   869, 623,   0,   0, 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212,
-   227, 231, 240, 243, 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335,
-   341, 357, 360, 362, 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465,
-   477, 535, 485, 490, 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541,
-   565, 569, 574, 586, 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699,
-   705, 704, 702, 706, 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787,
-   790, 802, 825, 848, 847, 857,  55,  65,  66, 883, 892, 916, 822, 824,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,1586,   0,1605,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1602,1603,
-  1934,1935,1574,1575,1576,1577,1579,1580,1581,1583,1584,   0,1585,1587,1588,1589,
-  1591,   0,1592,   0,1593,1594,   0,1595,1596,   0,1598,1599,1600,1601,1604,1582,
-  1578,1590,1597,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1936,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,1937,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1938,   0,
-  1939,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1940,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1941,1942,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1943,
-  1944,   0,   0,   0,   0,   0,   0,1945,   0,1946,   0,   0,   0,   0,   0,   0,
-     0,   0,1947,   0,   0,1948,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,1950,   0,1949,1951,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1953,
-  1952,   0,1954,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1955,1956,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1957,   0,   0,   0,
-     0,   0,   0,   0,   0,1958,1961,1959,1965,1960,1962,1964,1963,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1967,1966,1968,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,1969,1970,1971,1972,1973,1974,1975,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1976,
-  1977,1978,1980,1979,1981,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-     0,   0,   0,   0, 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125,
-    34, 830, 130, 131, 132, 137, 827,  35, 133, 139, 829, 142, 143, 112, 144, 145,
-   924, 151, 152,  37, 157, 158, 159, 160,  38, 165, 166, 169, 171, 172, 173, 174,
-   176, 177, 178, 179, 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189,
-   196, 192, 194, 195, 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218,
-   213, 219, 214, 216, 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236,
-   237, 238, 239, 244, 836, 837, 247, 248, 249, 246, 251,  39,  40, 253, 255, 255,
-   838, 257, 258, 259, 261, 839, 262, 263, 301, 264,  41, 266, 270, 272, 271, 841,
-   274, 842, 277, 276, 278, 281, 282,  42, 283, 284, 285, 286,  43, 843,  44, 289,
-   290, 291, 293, 934, 298, 845, 845, 621, 300, 300,  45, 852, 894, 302, 304,  46,
-   306, 309, 310, 312, 316,  48,  47, 317, 846, 318, 323, 324, 325, 324, 328, 329,
-   333, 331, 332, 334, 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352,
-   354, 359, 850, 361, 358, 356,  49, 363, 365, 367, 364,  50, 369, 371, 851, 376,
-   386, 378,  53, 381,  52,  51, 140, 141, 387, 382, 614,  78, 388, 389, 390, 394,
-   392, 856,  54, 399, 396, 402, 404, 858, 405, 401, 407,  55, 408, 409, 410, 413,
-   859, 415,  56, 417, 860, 418,  57, 419, 422, 424, 425, 861, 840, 862, 426, 863,
-   429, 431, 427, 433, 437, 441, 438, 439, 442, 443, 864, 436, 449, 450,  58, 454,
-   453, 865, 447, 460, 866, 867, 461, 466, 465, 464,  59, 467, 470, 469, 472, 828,
-   475, 868, 478, 870, 483, 485, 486, 871, 488, 489, 872, 873, 495, 497,  60, 498,
-    61,  61, 504, 505, 507, 508, 511,  62, 513, 874, 515, 875, 518, 844, 520, 876,
-   877, 878,  63,  64, 528, 880, 879, 881, 882, 530, 531, 531, 533,  66, 534,  67,
-    68, 884, 536, 538, 541,  69, 885, 549, 886, 887, 556, 559,  70, 561, 562, 563,
-   888, 889, 889, 567,  71, 890, 570, 571,  72, 891, 577,  73, 581, 579, 582, 893,
-   587,  74, 590, 592, 596,  75, 895, 896,  76, 897, 600, 898, 602, 605, 607, 899,
-   900, 609, 901, 611, 853,  77, 615, 616,  79, 617, 252, 902, 903, 854, 855, 621,
-   622, 731,  80, 627, 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640,
-   635, 641, 646, 651, 638, 643, 644, 645, 905, 907, 906,  81, 653, 654, 656, 911,
-   657, 908,  82,  83, 909, 910,  84, 664, 665, 666, 667, 669, 668, 671, 670, 674,
-   672, 673, 675,  85, 677, 678,  86, 681, 682, 912, 685, 686,  87, 689,  36, 913,
-   914,  88,  89, 696, 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720,
-   723, 832, 725, 728, 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760,
-   761, 921, 762,  90, 764, 922,  91, 775, 279, 780, 923, 925,  92,  93, 785, 926,
-    94, 927, 787, 787, 789, 928, 792,  95, 796, 797, 798, 800,  96, 929, 802, 804,
-   806,  97,  98, 807, 930,  99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820,
-   821, 935,   0,   0,
-};
-static const int16_t
-_hb_ucd_i16[92] =
-{
-      0,    0,    1,   -1,    2,    0,   -2,    0,    0,    2,    0,   -2,    0,   16,    0,  -16,
-      0,    1,   -1,    0,    3,    3,    3,   -3,   -3,   -3,    0, 2016,    0, 2527, 1923, 1914,
-   1918,    0, 2250,    0,    0,  138,    0,    7,   -7,    0,   -1,    1, 1824,    0, 2104,    0,
-   2108, 2106,    0, 2106, 1316,    0,   -1, -138,    8,    8,    8,    0,    7,    7,   -8,   -8,
-     -8,   -7,-1316,    1,   -1,    3,   -3,    1,    0,-1914,-1918,    0,    0,-1923,-1824,    0,
-      0,-2016,-2104,    0,    0,-2106,-2108,-2106,-2250,    0,-2527,    0,
-};
-
-static inline uint_fast8_t
-_hb_ucd_gc (unsigned u)
-{
-  return u<1114110u?_hb_ucd_u8[6472+(((_hb_ucd_u8[816+(((_hb_ucd_u16[((_hb_ucd_u8[272+(((_hb_ucd_u8[u>>1>>3>>4>>4])<<4)+((u>>1>>3>>4)&15u))])<<4)+((u>>1>>3)&15u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
-}
-static inline uint_fast8_t
-_hb_ucd_ccc (unsigned u)
-{
-  return u<125259u?_hb_ucd_u8[8504+(((_hb_ucd_u8[7936+(((_hb_ucd_u8[7460+(((_hb_ucd_u8[7100+(((_hb_ucd_u8[6854+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0;
-}
-static inline unsigned
-_hb_ucd_b4 (const uint8_t* a, unsigned i)
-{
-  return (a[i>>1]>>((i&1u)<<2))&15u;
-}
-static inline int_fast16_t
-_hb_ucd_bmg (unsigned u)
-{
-  return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9396+(((_hb_ucd_u8[9164+(((_hb_ucd_u8[9068+(((_hb_ucd_b4(9004+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0;
-}
-static inline uint_fast8_t
-_hb_ucd_sc (unsigned u)
-{
-  return u<918000u?_hb_ucd_u8[10398+(((_hb_ucd_u16[3952+(((_hb_ucd_u16[2624+(((_hb_ucd_u8[9870+(((_hb_ucd_u8[9644+(u>>3>>2>>3>>4)])<<4)+((u>>3>>2>>3)&15u))])<<3)+((u>>3>>2)&7u))])<<2)+((u>>3)&3u))])<<3)+((u)&7u))]:2;
-}
-static inline uint_fast16_t
-_hb_ucd_dm (unsigned u)
-{
-  return u<195102u?_hb_ucd_u16[6244+(((_hb_ucd_u8[16628+(((_hb_ucd_u8[16246+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
-}
-
-
-#else
-
-static const uint8_t
-_hb_ucd_u8[13730] =
-{
-    0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
-    7,  7,  7,  7,  9, 10,  7,  7,  7,  7,  7, 11, 12, 12, 12, 13,
-   14, 15, 16, 17, 18, 19, 20,  7, 21, 22, 22, 22, 23, 24,  7,  7,
-    7, 25, 22, 22, 22, 26, 27, 28, 22, 29, 30, 31, 32, 33, 34, 35,
-    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
-    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 21, 22, 36,
-    7,  7,  7,  7, 37, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   38, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
-   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
-   32, 33, 34, 34, 34, 34, 35, 36, 37, 34, 34, 34, 38, 39, 40, 41,
-   42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
-   58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 67, 68, 69, 67, 70, 71,
-   67, 67, 62, 72, 62, 62, 73, 67, 74, 75, 76, 77, 78, 67, 67, 67,
-   79, 80, 34, 81, 82, 83, 67, 67, 34, 34, 34, 34, 34, 34, 34, 34,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 84, 34, 34, 34, 34,
-   85, 34, 34, 34, 34, 34, 34, 34, 34, 86, 34, 34, 87, 88, 89, 90,
-   91, 92, 93, 94, 95, 96, 97, 98, 34, 34, 34, 34, 34, 34, 34, 34,
-   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
-  100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
-  100,100, 34, 34, 34, 34,101,102, 34, 34,103,104,105,106,107,108,
-   34, 34,109,110,111,112,113,114,115,116,117,118, 34, 34, 34,119,
-  120,121,122,123,124,125,126,127, 34,128,129,130,131,132,133,134,
-  135,136,137,138,139,140,141,142,143,144,111,145,146,147,148,111,
-  149,150,151,152,153,154,155,156,157,158,159,160,111,161,162,163,
-   34, 34, 34, 34, 34, 34, 34, 34,164, 34, 34,111,111,111,111,111,
-  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,165,
-   34, 34, 34, 34, 34, 34, 34, 34,166, 34, 34, 34, 34, 34, 34, 34,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,
-  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
-  111,111,167,111,111,111,111,111,111,111,111,111,111,111,111,111,
-   34, 34, 34, 34,168,169,170, 34,111,111,171,111,172,173,174,175,
-   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,
-  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,119,
-   34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111,
-  111,111,111,111,111,111,111,111, 34,176,111,111,111,111,111,111,
-  111,111,111,111,111,111,111,111, 67,177, 67, 67, 67, 67,178, 67,
-   67, 67,179,180,181,131, 65,111,182,183,184,185,186,187,188,189,
-   67, 67, 67, 67,190,191,111,111,111,111,111,111,111,111,192,111,
-  193,194,195,111,111,196,111,111,111,197,111,198,111,111,111, 34,
-   34,199,200,111,111,111,111,111,131,201,202,111, 34,203,111,111,
-   67, 67,204, 67, 67,111, 67,205, 67, 67, 67, 67, 67, 67, 67, 67,
-   67, 67, 67, 67, 67, 67, 67,177,111,111,111,111,111,111,111,111,
-   34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111,111,
-   34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,
-  206,111,194,194,111,111,111,111,111,111,111,111,111,111,111,111,
-    0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  2,  4,  5,  6,  2,
-    7,  7,  7,  7,  7,  2,  8,  9, 10, 11, 11, 11, 11, 11, 11, 11,
-   11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16,
-   16, 16, 16, 16, 16, 17, 18, 19,  1, 20, 20, 21, 22, 23, 24, 25,
-   26, 27, 15,  2, 28, 29, 27, 30, 11, 11, 11, 11, 11, 11, 11, 11,
-   11, 11, 11, 31, 11, 11, 11, 32, 16, 16, 16, 16, 16, 16, 16, 16,
-   16, 16, 16, 33, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, 32,
-   32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 16, 32, 32, 32,
-   32, 32, 32, 32, 11, 34, 34, 16, 34, 32, 32, 11, 34, 11, 16, 11,
-   11, 34, 32, 11, 32, 16, 11, 34, 32, 32, 32, 11, 34, 16, 32, 11,
-   34, 11, 34, 34, 32, 35, 32, 16, 36, 36, 37, 34, 38, 37, 34, 34,
-   34, 34, 34, 34, 34, 34, 16, 32, 34, 38, 32, 11, 32, 32, 32, 32,
-   32, 32, 16, 16, 16, 11, 34, 32, 34, 34, 11, 32, 32, 32, 32, 32,
-   16, 16, 39, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 40,
-   40, 41, 41, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41,
-   40, 40, 42, 41, 41, 41, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41,
-   43, 43, 43, 43, 43, 43, 43, 43, 32, 32, 42, 32, 16, 44, 16, 10,
-   41, 41, 41, 45, 11, 11, 11, 11, 34, 11, 11, 11, 11, 11, 11, 11,
-   11, 11, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34,
-   16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 46, 34, 32, 34, 11,
-   32, 47, 43, 43, 48, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16,
-   11, 11, 11, 11, 49,  2,  2,  2, 16, 16, 16, 16, 50, 51, 52, 53,
-   54, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 55,
-   56, 57, 43, 56, 43, 43, 43, 43, 36, 36, 36, 36, 36, 36, 36, 36,
-   36, 58,  2,  2,  2,  2,  2,  2, 59, 59, 59,  8,  9, 60,  2, 61,
-   43, 43, 43, 43, 43, 57, 62,  2, 63, 36, 36, 36, 36, 64, 43, 43,
-    7,  7,  7,  7,  7,  2,  2, 36, 65, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 66, 43, 43, 43, 67, 47, 43, 43, 68, 69, 70, 43, 43, 36,
-    7,  7,  7,  7,  7, 36, 71, 72,  2,  2,  2,  2,  2,  2,  2, 73,
-   64, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 65, 36,
-   36, 36, 36, 43, 43, 43, 43, 43,  7,  7,  7,  7,  7, 36, 36, 36,
-   36, 36, 36, 36, 36, 64, 43, 43, 43, 43, 40, 21,  2, 40, 69, 20,
-   36, 36, 36, 43, 43, 69, 43, 43, 43, 43, 69, 43, 69, 43, 43, 43,
-    2,  2,  2,  2,  2,  2,  2,  2, 36, 36, 36, 36, 64, 43, 43,  2,
-   36, 36, 36, 36, 74, 36, 36, 36, 59, 59, 59, 75, 43, 43, 43, 43,
-   36, 36, 36, 36, 76, 43, 43, 43, 43, 75, 43, 43, 43, 43, 43, 43,
-   43, 77, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 77, 65, 78,
-   79, 43, 43, 43, 77, 78, 79, 78, 64, 43, 43, 43, 36, 36, 36, 36,
-   36, 43,  2,  7,  7,  7,  7,  7, 80, 36, 36, 36, 36, 36, 36, 36,
-   64, 78, 81, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 65, 78,
-   79, 43, 43, 77, 78, 78, 79, 36, 36, 36, 36, 82, 78, 78, 36, 36,
-   36, 43, 43,  7,  7,  7,  7,  7, 36, 20, 27, 27, 27, 53, 58, 43,
-   43, 77, 81, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 43, 78,
-   79, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 65, 36, 36, 36,
-   36, 36, 36,  7,  7,  7,  7,  7, 43, 36, 64,  2,  2,  2,  2,  2,
-   79, 43, 43, 43, 77, 78, 79, 43, 60, 20, 20, 20, 83, 43, 43, 43,
-   43, 78, 81, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 65, 79,
-   79, 43, 43, 77, 78, 78, 79, 43, 43, 43, 43, 77, 78, 78, 36, 36,
-   72, 27, 27, 27, 27, 27, 27, 27, 43, 65, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36, 78, 77, 78, 78, 78, 78, 78, 79, 43,
-   36, 36, 36, 82, 78, 78, 78, 78, 78, 78, 78,  7,  7,  7,  7,  7,
-   27, 84, 61, 61, 53, 61, 61, 61, 77, 78, 65, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 65, 43, 77, 78, 78, 43, 43, 43, 43, 43,
-   43, 43, 43, 43, 36, 36, 36, 36,  7,  7,  7, 85, 27, 27, 27, 84,
-   64, 78, 66, 36, 36, 36, 36, 36, 78, 78, 78, 77, 78, 78, 43, 43,
-   43, 43, 77, 78, 78, 78, 81, 36, 86, 82, 78, 78, 78, 78, 78, 78,
-   43, 78, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 64, 65, 78,
-   79, 43, 43, 78, 78, 78, 79, 71, 61, 61, 36, 82, 27, 27, 27, 87,
-   27, 27, 27, 27, 84, 36, 36, 36, 36, 36, 36, 36, 36, 43, 43, 77,
-   78, 43, 43, 43, 78, 78, 78, 78,  7, 78,  2,  2,  2,  2,  2,  2,
-   64, 36, 43, 43, 43, 43, 43, 88, 36, 36, 36, 69, 43, 43, 43, 57,
-    7,  7,  7,  7,  7,  2,  2,  2, 64, 36, 43, 43, 43, 43, 65, 36,
-   36, 36, 36, 40, 43, 43, 43, 43,  7,  7,  7,  7,  7,  7, 36, 36,
-   71, 61,  2,  2,  2,  2,  2,  2,  2, 89, 89, 61, 43, 61, 61, 61,
-    7,  7,  7,  7,  7, 27, 27, 27, 27, 27, 47, 47, 47,  4,  4, 78,
-   64, 43, 43, 43, 43, 43, 43, 77, 43, 43, 57, 43, 36, 36, 64, 43,
-   43, 43, 43, 43, 43, 43, 43, 61, 61, 61, 61, 70, 61, 61, 61, 61,
-    2,  2, 89, 61, 21,  2,  2,  2, 36, 36, 36, 36, 36, 82, 79, 43,
-   77, 43, 43, 43, 79, 77, 79, 65, 36, 36, 36, 78, 43, 36, 36, 43,
-   65, 78, 81, 82, 78, 78, 78, 36, 64, 43, 65, 36, 36, 36, 36, 36,
-   36, 77, 79, 77, 78, 78, 79, 82,  7,  7,  7,  7,  7, 78, 79, 61,
-   16, 16, 16, 16, 16, 50, 44, 16, 36, 36, 36, 36, 36, 36, 64, 43,
-    2,  2,  2,  2, 90, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
-   61, 61, 61, 61, 61, 61, 61, 61, 11, 11, 11, 11, 16, 16, 16, 16,
-   91, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 71, 66,
-   92, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 93, 94, 94,
-   36, 36, 36, 36, 36, 58,  2, 95, 96, 36, 36, 36, 36, 36, 36, 36,
-   36, 43, 77, 78, 78, 78, 78, 81, 36, 43, 97,  2,  2,  2,  2,  2,
-   36, 43, 43, 43, 43, 43, 43, 43, 36, 36, 43, 79, 43, 43, 43, 78,
-   78, 78, 78, 77, 79, 43, 43, 43, 43, 43,  2, 80,  2, 60, 64, 43,
-    7,  7,  7,  7,  7,  7,  7,  7,  2,  2,  2, 98,  2, 56, 43, 75,
-   36, 76, 36, 36, 36, 36, 36, 36, 36, 36, 64, 65, 36, 36, 36, 36,
-   36, 36, 36, 36, 64, 36, 36, 36, 43, 77, 78, 79, 77, 78, 78, 78,
-   78, 77, 78, 78, 79, 43, 43, 43, 61, 61,  2,  7,  7,  7,  7,  7,
-    7,  7,  7,  7,  7, 27, 27, 61, 36, 36, 36, 64, 77, 79, 43,  2,
-   36, 36, 82, 77, 43, 43, 43, 43, 77, 77, 79, 43, 43, 43, 77, 78,
-   78, 79, 43, 43, 43, 43, 43, 43,  2,  2,  2, 80,  2,  2,  2,  2,
-   43, 43, 43, 43, 43, 43, 43, 99, 43, 43, 81, 36, 36, 36, 36, 36,
-   36, 36, 77, 43, 43, 77, 77, 78, 78, 77, 81, 36, 36, 36, 36,  2,
-   89, 61, 61, 61, 61, 47, 43, 43, 43, 43, 61, 61, 61, 61, 21,  2,
-   43, 81, 36, 36, 36, 36, 36, 36, 82, 43, 43, 78, 43, 79, 43, 36,
-   36, 36, 36, 77, 43, 78, 79, 79, 43, 78, 78, 78, 78, 78,  2,  2,
-   36, 36, 78, 78, 78, 78, 43, 43, 43, 43, 78, 43, 43, 57,  2,  2,
-    7,  7,  7,  7,  7,  7, 86, 36, 36, 36, 36, 36, 40, 40, 40,  2,
-   16, 16, 16, 16, 34, 16, 16, 16, 43, 57, 43, 43, 43, 43, 43, 43,
-   77, 43, 43, 43, 65, 36, 64, 36, 36, 36, 65, 82, 43, 36, 36, 36,
-   16, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 44, 16, 16,
-   16, 16, 16, 16, 44, 16, 16, 16, 16, 16, 16, 16, 16,100, 40, 40,
-   32, 32, 32, 16, 16, 16, 16, 32, 16, 16, 16, 16, 11, 11, 11, 11,
-   16, 16, 16, 16, 34, 11, 11, 11, 16, 16, 16, 16,101,101,101,101,
-   16, 16, 16, 16, 11, 11,102,103, 41, 16, 16, 16, 11, 11,102, 41,
-   16, 16, 16, 16, 11, 11,104, 41,105,105,105,105,105,106, 59, 59,
-   51, 51, 51,  2,107,108,107,108,  2,  2,  2,  2,109, 59, 59,110,
-    2,  2,  2,  2,111,112,  2,113,114,  2,115,116,  2,  2,  2,  2,
-    2,  9,114,  2,  2,  2,  2,117, 59, 59, 59, 59, 59, 59, 59, 59,
-  118, 40, 27, 27, 27,  8,115,119, 27, 27, 27, 27, 27,  8,115, 94,
-   20, 20, 20, 20, 20, 20, 20, 20, 43, 43, 43, 43, 43, 43,120, 48,
-   99, 48, 99, 43, 43, 43, 43, 43, 61,121, 61,122, 61, 34, 11, 16,
-   11, 32,122, 61, 46, 11, 11, 61, 61, 61,121,121,121, 11, 11,123,
-   11, 11, 35, 36, 39, 61, 16, 11,  8,  8, 46, 16, 16, 26, 61,124,
-   95, 95, 95, 95, 95, 95, 95, 95, 95,125,126, 95,127, 61, 61, 61,
-    8,  8,128, 61, 61,  8, 61, 61,128, 26, 61,128, 61, 61, 61,128,
-   61, 61, 61, 61, 61, 61, 61,  8, 61,128,128, 61, 61, 61, 61, 61,
-   61, 61,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-   61, 61, 61, 61,  4,  4, 61, 61,  8, 61, 61, 61,129,130, 61, 61,
-   61, 61, 61, 61, 61, 61,128, 61, 61, 61, 61, 61, 61, 26,  8,  8,
-    8,  8, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,  8,  8,
-    8, 61, 61, 61, 61, 61, 61, 61, 27, 27, 27, 27, 27, 27, 61, 61,
-   61, 61, 61, 61, 61, 27, 27, 27, 61, 61, 61, 26, 61, 61, 61, 61,
-   26, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,  8,  8,  8,  8,
-   61, 61, 61, 61, 61, 61, 61, 26, 61, 61, 61, 61,  4,  4,  4,  4,
-    4,  4,  4, 27, 27, 27, 27, 27, 27, 27, 61, 61, 61, 61, 61, 61,
-    8,  8,115,131,  8,  8,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,
-    8,115,132,132,132,132,132,132,132,132,132,132,131,  8,  8,  8,
-    8,  8,  8,  8,  4,  4,  8,  8,  8,  8,  8,  8,  8,  8,  4,  8,
-    8,  8,128, 26,  8,  8,128, 61, 32, 11, 32, 34, 34, 34, 34, 11,
-   32, 32, 34, 16, 16, 16, 40, 11, 32, 32,124, 61, 61,122, 34,133,
-   43, 32, 16, 16, 50,  2, 90,  2, 36, 36, 36, 36, 36, 36, 36, 76,
-    2,  2,  2,  2,  2,  2,  2, 56,  2,107,107,  2,111,112,107,  2,
-    2,  2,  2,  6,  2, 98,107,  2,107,  4,  4,  4,  4,  2,  2, 80,
-    2,  2,  2,  2,  2, 51,  2,  2, 98,134,  2,  2,  2,  2,  2,  2,
-   61,  2,135,132,132,132,136, 51, 51, 51, 51, 51, 51, 51, 51, 51,
-    1,  2,137,138,  4,  4,  4,  4,  4, 61,  4,  4,  4,  4,139, 94,
-  140, 95, 95, 95, 95, 43, 43, 78,141, 40, 40, 61, 95,142, 58, 61,
-   72, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 64,143,144, 63,
-   36, 36, 36, 36, 36, 58, 40, 63, 61, 27, 27, 61, 61, 61, 61, 61,
-   27, 27, 27, 27, 27, 61, 61, 61, 61, 61, 61, 61, 27, 27, 27, 27,
-  145, 27, 27, 27, 27, 27, 27, 27, 36, 36, 76, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36,146,  2, 32, 32, 32, 32, 32, 32, 32, 64,
-   48,147, 43, 43, 43, 43, 43, 80, 32, 32, 32, 32, 32, 32, 40, 43,
-   36, 36, 36, 95, 95, 95, 95, 95, 43,  2,  2,  2,  2,  2,  2,  2,
-   41, 41, 41,144, 40, 40, 40, 40, 41, 32, 32, 32, 32, 32, 32, 32,
-   16, 32, 32, 32, 32, 32, 32, 32, 44, 16, 16, 16, 34, 34, 34, 32,
-   32, 32, 32, 32, 42,148, 34, 35, 32, 32, 16, 32, 32, 32, 32, 32,
-   32, 32, 32, 32, 32, 11, 11, 32, 11, 11, 32, 32, 32, 32, 32, 32,
-   32, 32, 11, 11, 34, 34, 32, 16, 32, 16, 16, 32, 32, 32, 11, 11,
-   11, 40,149, 35, 40, 35, 36, 36, 36, 65, 36, 65, 36, 64, 36, 36,
-   36, 82, 79, 77, 61, 61, 43, 43, 27, 27, 27, 61,150, 61, 61, 61,
-   36, 36,  2,  2,  2,  2,  2,  2, 78, 36, 36, 36, 36, 36, 36, 36,
-   36, 36, 78, 78, 78, 78, 78, 78, 78, 78, 43, 43, 43, 43, 43,  2,
-   43, 36, 36, 36,  2, 66, 66, 64, 36, 36, 36, 43, 43, 43, 43,  2,
-   36, 36, 36, 64, 43, 43, 43, 43, 43, 78, 78, 78, 78, 78, 78, 97,
-   36, 64, 78, 43, 43, 78, 43, 78, 97,  2,  2,  2,  2,  2,  2, 80,
-    7,  7,  7,  7,  7,  7,  7,  2, 36, 36, 64, 63, 36, 36, 36, 36,
-   36, 36, 36, 36, 64, 43, 43, 77, 79, 77, 79, 43, 43, 43, 43, 43,
-   36, 64, 36, 36, 36, 36, 77, 78,  7,  7,  7,  7,  7,  7,  2,  2,
-   63, 36, 36, 71, 61, 82, 77, 36, 65, 43, 65, 64, 65, 36, 36, 43,
-   36, 36, 36, 36, 36, 36, 76,  2, 36, 36, 36, 36, 36, 82, 43, 78,
-    2, 76,151, 43, 43, 43, 43, 43, 16, 16, 16, 16, 16,103, 40, 40,
-   16, 16, 16, 16,100, 41, 41, 41, 36, 82, 79, 78, 77, 97, 79, 43,
-  152,152,152,152,152,152,152,152,153,153,153,153,153,153,153,153,
-   16, 16, 16, 16, 16, 16, 35, 65, 36, 36, 36, 36,154, 36, 36, 36,
-   36, 41, 41, 41, 41, 41, 41, 41, 41, 74, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 36, 36,132, 36, 36, 36, 36, 36, 36, 36, 71,
-   36, 36, 36, 36, 36, 36,150, 61,  2,  2,  2,135,116,  2,  2,  2,
-    6,155,156,132,132,132,132,132,132,132,116,135,116,  2,113,157,
-    2,  2,  2,  2,139,132,132,116,  2,158,  8,  8, 60,  2,  2,  2,
-   36, 36, 36, 36, 36, 36, 36,159,  2,  2,  3,  2,  4,  5,  6,  2,
-   16, 16, 16, 16, 16, 17, 18,115,116,  4,  2, 36, 36, 36, 36, 36,
-   63, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 40,
-   20,160, 53, 20, 26,  8,128, 61, 61, 61, 61, 61,161, 59, 61, 61,
-    2,  2,  2, 90, 27, 27, 27, 27, 27, 27, 27, 84, 61, 61, 61, 61,
-   95, 95,127, 27, 84, 61, 61, 61, 61, 61, 61, 61, 61, 27, 61, 61,
-   61, 61, 61, 61, 61, 61, 47, 43,162,162,162,162,162,162,162,162,
-  163, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 87, 36,
-  138, 36, 36, 36, 36, 95, 95, 95, 36, 36, 36, 36, 36, 36, 36, 58,
-  164, 95, 95, 95, 95, 95, 95, 95, 11, 11, 11, 32, 16, 16, 16, 16,
-   36, 36, 36, 58, 27, 27, 27, 27, 36, 36, 36, 71,145, 27, 27, 27,
-   36, 36, 36,165, 27, 27, 27, 27, 36, 36, 36, 36, 36,165, 27, 27,
-   36, 36, 36, 27, 27, 27, 27, 30, 36, 36, 36, 36, 36, 36, 27, 36,
-   64, 43, 43, 43, 43, 43, 43, 43, 36, 36, 36, 36, 43, 43, 43, 43,
-   36, 36, 36, 36, 36, 36,165, 30, 36, 36, 36, 36, 36, 36,165, 27,
-   36, 36, 36, 36, 72, 36, 36, 36, 36, 36, 64, 43, 43,163, 27, 27,
-   36, 36, 36, 36, 58,  2,  2,  2, 36, 36, 36, 36, 27, 27, 27, 27,
-   16, 16, 16, 16, 16, 27, 27, 27, 36, 36, 43, 43, 43, 43, 43, 43,
-    7,  7,  7,  7,  7, 36, 36, 63, 11, 11, 11, 11,166, 43, 43,141,
-   16, 16, 16, 16, 16, 16, 16,  8, 36, 36, 36, 36, 36, 64,167, 51,
-   36, 36, 36, 36, 36, 36, 43, 43, 27, 27, 27, 87, 36, 36, 36, 36,
-  163, 27, 30,  2,  2,  2,  2,  2, 36, 43, 43,  2,  2,  2,  2,  2,
-   36, 36,165, 27, 27, 27, 27, 27, 79, 81, 36, 36, 36, 36, 36, 36,
-   43, 43, 43, 57,  2,  2,  2,  2,  2, 27, 27, 27, 27, 27, 27, 27,
-   27, 27, 27,  7,  7,  7,  7,  7, 65, 64, 65, 36, 36, 36, 36, 64,
-   78, 79, 43, 77, 79, 57, 73,  2,  2, 43, 43, 43, 43, 43, 67, 59,
-   36, 36, 36, 64, 43, 43, 79, 43, 43, 43, 43,  7,  7,  7,  7,  7,
-    2,  2, 82, 81, 36, 36, 36, 36, 36, 64,  2, 36, 36, 36, 36, 36,
-   36, 82, 78, 43, 43, 43, 43, 77, 81, 36, 58,  2, 56, 43, 57, 79,
-    7,  7,  7,  7,  7, 58, 58,  2, 90, 27, 27, 27, 27, 27, 27, 27,
-   36, 36, 36, 36, 36, 36, 78, 79, 43, 78, 77, 43,  2,  2,  2, 65,
-   36, 36, 36, 36, 36, 36, 36, 64, 77, 78, 78, 78, 78, 78, 78, 78,
-   36, 36, 36, 82, 78, 78, 81, 36, 36, 78, 78, 43, 43, 43, 43, 43,
-   36, 36, 36, 36, 78, 79, 43, 43, 43, 78, 78, 78, 78, 78, 78, 77,
-   65, 65,  2,  2,  2,  2,  2,  2, 56, 43, 43, 43, 43, 43, 43, 43,
-   36, 36, 82, 78, 43, 43, 43, 43, 78, 43, 77, 65, 36, 58,  2,  2,
-    7,  7,  7,  7,  7,  2,  2, 65, 78, 79, 43, 43, 77, 77, 78, 79,
-   77, 43, 36, 66, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 82,
-   78, 43, 43, 43, 78, 78, 43, 79, 57,  2,  2,  2,  2,  2,  2,  2,
-    2,  2,  2,  2, 36, 36, 43, 43, 78, 79, 43, 43, 43, 77, 79, 79,
-   57,  2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 64, 79, 78,
-   43, 43, 43, 79, 58,  2,  2,  2, 36, 36, 36, 36, 36, 36, 64, 79,
-   78, 43, 43, 79, 43, 43, 43, 43,  7,  7,  7,  7,  7, 27,  2, 89,
-   43, 43, 43, 43, 79, 57,  2,  2, 27, 27, 27, 27, 27, 27, 27, 87,
-   78, 78, 78, 78, 78, 79, 77, 65, 81, 79,  2,  2,  2,  2,  2,  2,
-   82, 78, 43, 43, 43, 43, 78, 78, 65, 66, 78, 78, 78, 78, 78, 78,
-   78, 78, 78, 78, 78, 78, 78, 78, 64, 43, 43, 43, 43, 65, 36, 36,
-   36, 64, 43, 43, 77, 64, 43, 57,  2,  2,  2, 56, 43, 43, 43, 43,
-   64, 43, 43, 77, 79, 43, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43,
-   43, 43, 43, 77, 43,  2, 66,  2, 58,  2,  2,  2,  2,  2,  2,  2,
-   43, 43, 43, 43, 43, 43, 43, 79,  2, 36, 36, 36, 36, 36, 36, 36,
-   43, 43, 43, 43, 77, 43, 43, 43, 77, 43, 79, 43, 43, 43, 43, 43,
-   43, 43, 43, 64, 43, 43, 43, 43, 36, 36, 36, 36, 36, 78, 78, 78,
-   43, 77, 79, 79, 36, 36, 36, 36, 36, 64, 77, 97,  2,  2,  2,  2,
-   43, 82, 36, 36, 36, 36, 36, 36, 36, 36, 78, 43, 43, 43, 43, 78,
-   77, 57,  2,  2,  2,  2,  2,  2,  7,  7,  7,  7,  7, 43, 43, 43,
-   27, 27, 84, 61, 61, 61, 53, 20,150, 61, 61, 61, 61, 61, 61, 61,
-   61, 61, 61, 61, 61, 61, 61, 21, 65, 36, 36, 64, 43, 43, 43, 43,
-   36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 78, 79, 43,
-   43, 43, 57,  2,  2,  2,  2,  2, 43, 43, 43, 57,  2,  2, 61, 61,
-   40, 40, 89, 61, 61, 61, 61, 61,  7,  7,  7,  7,  7,168, 27, 27,
-   27, 87, 36, 36, 36, 36, 36, 36, 40, 63, 36, 36, 36, 36, 36, 36,
-   36, 36, 36, 36, 36, 76,146,  2, 27, 27, 27, 30,  2,  2,  2,  2,
-   82, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 79,
-   43, 68, 40, 40, 40, 40, 40, 40, 40, 80, 43, 43, 43, 43, 43, 43,
-   36, 36, 36, 36, 36, 36, 47, 57, 61, 61,169, 79, 43, 61,169, 78,
-   78,170, 59, 59, 59, 75, 43, 43, 43, 70, 47, 43, 43, 43, 61, 61,
-   61, 61, 61, 61, 61, 43, 43, 61, 61, 43, 70, 61, 61, 61, 61, 61,
-   11, 11, 11, 11, 11, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 11,
-   11, 11, 11, 11, 11, 11, 11, 16, 11, 16, 16, 16, 16, 16, 16, 16,
-   16, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 16, 16, 16, 16, 16,
-   31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16,
-   16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16,
-   16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16,
-   16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11,
-   11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16,
-   11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 32, 16,  7,
-   43, 43, 43, 70, 61, 47, 43, 43, 43, 43, 43, 43, 43, 43, 70, 61,
-   61, 61, 47, 61, 61, 61, 61, 61, 61, 61, 70, 21,  2,  2,  2,  2,
-    2,  2,  2,  2,  2, 56, 43, 43, 16, 16, 16, 16, 16, 39, 16, 16,
-   43, 43, 43, 68, 40, 40, 40, 40,  7,  7,  7,  7,  7,  7,  7, 71,
-    7,  7,  7,  7,  7,  7,  7,171, 36, 36, 36, 36, 36, 76, 43, 43,
-  172,  7,  7,  7,  7,  7,  7, 85, 16, 16, 43, 43, 43, 68, 40, 40,
-   27, 27, 27, 27, 27, 27,145, 27,173, 27, 27, 27, 27, 27, 27, 27,
-   27, 27, 27, 27, 27, 27, 27,145, 27, 27, 27, 27, 27, 27, 84, 61,
-   61, 61, 61, 61, 61, 25, 41, 41,  0,  0, 29, 21, 21, 21, 23, 21,
-   22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21,  9,  9,  9,
-    9, 22, 21, 18, 24, 16, 24,  5,  5,  5,  5, 22, 25, 18, 25,  0,
-   23, 23, 26, 21, 24, 26,  7, 20, 25,  1, 26, 24, 26, 25, 15, 15,
-   24, 15,  7, 19, 15, 21,  9, 25,  9,  5,  5, 25,  5,  9,  5,  7,
-    7,  7,  9,  8,  8,  5,  7,  5,  6,  6, 24, 24,  6, 24, 12, 12,
-    6,  5,  9, 21, 25,  9, 26, 12, 11, 11,  9,  6,  5, 21, 17, 17,
-   17, 26, 26, 23, 23, 12, 17, 12, 21, 12, 12, 21,  7, 21,  1,  1,
-   21, 23, 26, 26,  1, 21,  6,  7,  7, 12, 12,  7, 21,  7, 12,  1,
-   12,  6,  6, 12, 12, 26,  7, 26, 26,  7, 21,  1, 24,  7,  1, 12,
-    7,  6, 12, 10, 10, 10, 10, 12, 21,  6, 10,  7,  7, 10, 23,  7,
-   15, 26, 13, 21, 13,  7, 15,  7, 12, 23, 21, 26, 21, 15, 17,  7,
-   29,  7,  7, 22, 18, 18, 14, 14, 14,  7, 10, 21, 17, 21, 11, 12,
-    5,  6,  8,  8,  8, 24,  5, 24,  9, 24, 29, 29, 29,  1, 20, 19,
-   22, 20, 27, 28,  1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22,
-   18, 21, 21, 29, 15,  6, 18,  6, 12, 11,  9, 26, 26,  9, 26,  5,
-    5, 26, 14,  9,  5, 14, 14, 15, 25, 26, 26, 22, 18, 26, 18, 25,
-   18, 22,  5, 12, 22, 21, 21, 22, 18, 17, 26,  6,  7, 14, 17, 22,
-   26, 14, 17,  6, 14,  6, 12, 24, 24,  6, 26, 15,  6, 21, 11, 21,
-   24,  9,  6,  9, 23, 26,  6, 10,  4,  4,  3,  3,  7, 25, 17, 16,
-   16, 22, 16, 16, 25, 17,  7,  1, 25, 24, 26,  1,  2,  2, 12, 15,
-   21, 14,  7, 15,  9, 12, 12, 17, 13, 15, 26, 10, 10,  1, 13, 23,
-    7, 13, 23, 15,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  0, 10,
-   11, 12, 13,  0, 14,  0,  0,  0,  0,  0, 15,  0, 16,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 17, 18, 19,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0, 20,  0, 21, 22, 23,  0,  0,  0, 24, 25, 26, 27, 28, 29, 30,
-   31, 32, 33, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 35,  0,  0,  0,  0, 36,  0, 37,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0, 39, 40,  0,  0,
-    0,  0,  0,  0, 41, 42, 43,  0, 44,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  1,  2,  0,  0,  0,  0,  3,  0,  0,  0,
-    4,  5,  6,  7,  0,  8,  9, 10,  0, 11, 12, 13, 14, 15, 16, 17,
-   16, 18, 16, 19, 16, 19, 16, 19,  0, 19, 16, 20, 16, 19, 21, 19,
-    0, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,  0, 32,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0, 33,  0,  0,  0,  0,  0,  0, 34,  0,
-    0, 35,  0,  0, 36,  0, 37,  0,  0,  0, 38, 39, 40, 41, 42, 43,
-   44, 45, 46,  0,  0, 47,  0,  0,  0, 48,  0,  0,  0, 49,  0,  0,
-    0,  0,  0,  0,  0, 50,  0, 51,  0, 52, 53,  0, 54,  0,  0,  0,
-    0,  0,  0, 55, 56, 57,  0,  0,  0,  0, 58,  0,  0, 59, 60, 61,
-   62, 63,  0,  0, 64, 65,  0,  0,  0, 66,  0,  0,  0,  0, 67,  0,
-    0,  0, 68,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0, 69,  0,  0,  0, 70,  0, 71,  0,  0, 72,  0,  0, 73,  0,  0,
-    0,  0,  0,  0,  0,  0, 74, 75,  0,  0,  0,  0, 76, 77,  0, 78,
-   79,  0,  0, 80, 81,  0, 82, 62,  0, 83, 84,  0,  0, 85, 86, 87,
-    0, 88,  0, 89,  0, 90,  0,  0, 51, 91, 51,  0, 92,  0, 93,  0,
-    0,  0, 81,  0,  0,  0, 94, 95,  0, 96, 97, 98, 99,  0,  0,  0,
-    0,  0, 51,  0,  0,  0,  0,100,101,  0,  0,  0,  0,  0,  0,102,
-    0,  0,  0,  0,  0,  0,103,  0,  0,  0,  0,  0,  0,104,105,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,106,  0,  0,107,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,108,109,  0,  0,110,  0,  0,  0,  0,
-    0,  0,111,  0,112,  0,105,  0,  0,  0,  0,  0,113,114,  0,  0,
-    0,  0,  0,  0,  0,115,  0,  0,  0,116,  0,  0,  0,117,  0,118,
-    0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  0,  8,  0,
-    0,  0,  0,  9, 10, 11, 12,  0,  0,  0,  0, 13,  0,  0, 14, 15,
-    0, 16,  0, 17, 18,  0,  0, 19,  0, 20, 21,  0,  0,  0,  0,  0,
-   22, 23,  0, 24, 25,  0,  0, 26,  0,  0,  0, 27,  0,  0, 28, 29,
-   30, 31,  0,  0,  0, 32, 33, 34,  0,  0, 33,  0,  0, 35, 33,  0,
-    0,  0, 33, 36,  0,  0,  0,  0,  0, 37, 38,  0,  0,  0,  0,  0,
-    0, 39, 40,  0,  0,  0,  0,  0,  0, 41, 42,  0,  0,  0,  0, 43,
-    0, 44,  0,  0,  0, 45, 46,  0,  0,  0, 47,  0,  0,  0,  0,  0,
-    0, 48, 49,  0,  0,  0,  0, 50,  0,  0,  0, 51,  0, 52,  0, 53,
-    0,  0,  0,  0, 54,  0,  0,  0,  0, 55,  0, 56,  0,  0,  0,  0,
-   57, 58,  0,  0,  0, 59, 60,  0,  0,  0,  0,  0,  0, 61, 52,  0,
-   62, 63,  0,  0, 64,  0,  0,  0, 65, 66,  0,  0,  0, 67,  0, 68,
-   69, 70, 71, 72,  1, 73,  0, 74, 75, 76,  0,  0, 77, 78,  0,  0,
-    0, 79,  0,  0,  1,  1,  0,  0, 80,  0,  0, 81,  0,  0,  0,  0,
-   77, 82,  0, 83,  0,  0,  0,  0,  0, 78, 84,  0, 85,  0, 52,  0,
-    1, 78,  0,  0, 86,  0,  0, 87,  0,  0,  0,  0,  0, 88, 57,  0,
-    0,  0,  0,  0,  0, 89, 90,  0,  0, 84,  0,  0, 33,  0,  0, 91,
-    0,  0,  0,  0, 92,  0,  0,  0,  0, 49,  0,  0, 93,  0,  0,  0,
-    0, 94, 95,  0,  0, 96,  0,  0, 97,  0,  0,  0, 98,  0,  0,  0,
-   99,  0,  0,  0,100,  0,  0,  0,  0,101,102, 93,  0,  0,103,  0,
-    0,  0, 84,  0,  0,104,  0,  0,  0,105,106,  0,  0,107,108,  0,
-    0,  0,  0,  0,  0,109,  0,  0,110,  0,  0,  0,  0,111, 33,  0,
-  112,113,114, 57,  0,  0,115, 35,  0,  0,116,  0,  0,  0,117,  0,
-    0,  0,  0,  0,  0,118,  0,  0,119,  0,  0,  0,  0,120, 88,  0,
-    0,  0,  0,  0, 57,  0,  0,  0,  0, 52,121,  0,  0,  0,  0,122,
-    0,  0,123,  0,  0,  0,  0,121,  0,  0,124,  0,  0,  0,  0,  0,
-   79,  0,  0,  0,  0,125,  0,  0,  0,126,  0,  0,  0,127,  0,128,
-    0,  0,  0,  0,129,130,131,  0,132,  0,133,  0,  0,  0,134,135,
-  136,  0, 77,  0,  0,  0,  0,  0, 35,  0,  0,  0,137,  0,  0,  0,
-  138,  0,  0,  0,139,  0,  0,140,  0,  0,141,  0,  0,  0,  0,  0,
-    0,  0,  1,  1,  1,  1,  1,  2,  3,  4,  5,  6,  7,  4,  4,  8,
-    9, 10,  1, 11, 12, 13, 14, 15, 16, 17, 18,  1,  1,  1, 19,  1,
-    0,  0, 20, 21, 22,  1, 23,  4, 21, 24, 25, 26, 27, 28, 29, 30,
-    0,  0,  1,  1, 31,  0,  0,  0, 32, 33, 34, 35,  1, 36, 37,  0,
-    0,  0,  0, 38,  1, 39, 14, 39, 40, 41, 42,  0,  0,  0, 43, 36,
-   44, 45, 21, 45, 46,  0,  0,  0, 19,  1, 21,  0,  0, 47,  0, 38,
-   48,  1,  1, 49, 49, 50,  0,  0, 51,  0,  0, 19, 52,  1,  0,  0,
-   38, 14,  4,  1,  1,  1, 53, 21, 43, 52, 54, 21, 35,  1,  0,  0,
-    0, 55,  0,  0,  0, 56, 57, 58,  0,  0,  0,  0,  0, 59,  0, 60,
-    0,  0,  0,  0, 61, 62,  0,  0, 63,  0,  0,  0, 64,  0,  0,  0,
-   65,  0,  0,  0, 66,  0,  0,  0, 67,  0,  0,  0, 68,  0,  0, 69,
-   70,  0, 71, 72, 73, 74, 75, 76,  0,  0,  0, 77,  0,  0,  0, 78,
-   79,  0,  0,  0,  0, 47,  0,  0,  0, 49,  0, 80,  0,  0,  0, 62,
-    0,  0, 63,  0,  0, 81,  0,  0, 82,  0,  0,  0, 83,  0,  0, 19,
-   84,  0, 62,  0,  0,  0,  0, 49,  1, 85,  1, 52, 15, 86, 36, 10,
-   21, 87,  0, 55,  0,  0,  0,  0, 19, 10,  1,  0,  0,  0,  0,  0,
-   88,  0,  0, 89,  0,  0, 88,  0,  0,  0,  0, 78,  0,  0, 87,  9,
-   12,  4, 90,  8, 91, 47,  0, 58, 50,  0, 21,  1, 21, 92, 93,  1,
-    1,  1,  1, 94, 95, 96, 97,  1, 98, 58, 81, 99,100,  4, 58,  0,
-    0,  0,  0,  0,  0, 19, 50,  0,  0,  0,  0,  0,  0, 61,  0,  0,
-  101,102,  0,  0,103,  0,  0,  1,  1, 50,  0,  0,  0, 38,  0, 63,
-    0,  0,  0,  0,  0, 62,  0,  0,104, 68, 61,  0,  0,  0, 78,  0,
-    0,  0,105,106, 58, 38, 81,  0,  0,  0,  0,  0,  0,107,  1, 14,
-    4, 12, 84,  0,  0,  0,  0, 38, 87,  0,  0,  0,  0,108,  0,  0,
-  109, 61,  0,110,  0,  0,  0,  1,  0,  0,  0,  0, 49, 50,  0,  0,
-   19, 58,  0,  0,  0, 51,  0,111, 14, 52,112, 41,  0,  0, 62,  0,
-    0, 61,  0,  0,113,  0, 87,  0,  0,  0, 61, 62,  0,  0, 62,  0,
-   89,  0,  0,113,  0,  0,  0,  0,114,  0,  0,  0, 78, 55,  0, 38,
-    1, 58,  1, 58,  0,  0,  0,  0,  0, 88, 63, 89,  0,  0,115,  0,
-    0,  0, 55,  0,  0,  0,  0,115,  0,  0,  0,  0, 61,  0,  0,  0,
-    0, 79,  0, 61,  0,  0,  0,  0, 56,  0, 89, 80,  0,  0, 79,  0,
-    0,  0,  8, 91,  0,  0,  1, 87,  0,  0,116,  0,  0,  0,  0,  0,
-    0,117,  0,118,119,120,121,  0,104,  4,122, 49, 23,  0,  0,  0,
-   38, 50, 38, 58,  0,  0,  1, 87,  1,  1,  1,  1, 39,  1, 48,105,
-   87,  0,  0,  0,  0,  1,  0,  0,  0,123,  0,  0,  0,112,  4,122,
-    0,  0,  0,  1,124,  0,  0,  0,  0,  0,230,230,230,230,230,232,
-  220,220,220,220,232,216,220,220,220,220,220,202,202,220,220,220,
-  220,202,202,220,220,220,  1,  1,  1,  1,  1,220,220,220,220,230,
-  230,230,230,240,230,220,220,220,230,230,230,220,220,  0,230,230,
-  230,220,220,220,220,230,232,220,220,230,233,234,234,233,234,234,
-  233,230,  0,  0,  0,230,  0,220,230,230,230,230,220,230,230,230,
-  222,220,230,230,220,220,230,222,228,230, 10, 11, 12, 13, 14, 15,
-   16, 17, 18, 19, 19, 20, 21, 22,  0, 23,  0, 24, 25,  0,230,220,
-    0, 18, 30, 31, 32,  0,  0,  0,  0, 27, 28, 29, 30, 31, 32, 33,
-   34,230,230,220,220,230,220,230,230,220, 35,  0,  0,  0,  0,  0,
-  230,230,230,  0,  0,230,230,  0,220,230,230,220,  0,  0,  0, 36,
-    0,  0,230,220,230,230,220,220,230,220,220,230,220,230,220,230,
-  230,  0,  0,220,  0,  0,230,230,  0,230,  0,230,230,230,230,230,
-    0,  0,  0,220,220,220,230,220,220,220,230,230,  0,220, 27, 28,
-   29,230,  7,  0,  0,  0,  0,  9,  0,  0,  0,230,220,230,230,  0,
-    0,  0,  0,  0,230,  0,  0, 84, 91,  0,  0,  0,  0,  9,  9,  0,
-    0,  0,  0,  0,  9,  0,103,103,  9,  0,107,107,107,107,118,118,
-    9,  0,122,122,122,122,220,220,  0,  0,  0,220,  0,220,  0,216,
-    0,  0,  0,129,130,  0,132,  0,  0,  0,  0,  0,130,130,130,130,
-    0,  0,130,  0,230,230,  9,  0,230,230,  0,  0,220,  0,  0,  0,
-    0,  7,  0,  9,  9,  0,  9,  9,  0,  0,  0,230,  0,  0,  0,228,
-    0,  0,  0,222,230,220,220,  0,  0,  0,230,  0,  0,220,230,220,
-    0,220,230,230,230,  0,  0,  0,  9,  9,  0,  0,  7,  0,230,  0,
-    1,  1,  1,  0,  0,  0,230,234,214,220,202,230,230,230,230,230,
-  232,228,228,220,218,230,233,220,230,220,230,230,  1,  1,  1,  1,
-    1,230,  0,  1,  1,230,220,230,  1,  1,  0,  0,218,228,232,222,
-  224,224,  0,  8,  8,  0,  0,  0,  0,220,230,  0,230,230,220,  0,
-    0,230,  0,  0, 26,  0,  0,220,  0,230,230,  1,220,  0,  0,230,
-  220,  0,  0,  0,220,220,  0,  0,230,220,  0,  9,  7,  0,  0,  7,
-    9,  0,  0,  0,  9,  7,  6,  6,  0,  0,  0,  0,  1,  0,  0,216,
-  216,  1,  1,  1,  0,  0,  0,226,216,216,216,216,216,  0,220,220,
-  220,  0,232,232,220,230,230,230,  7,  0, 16, 17, 17, 33, 17, 49,
-   17, 17, 84, 97,135,145, 26, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17,177,  0,  1,  2,  3,  3,  3,
-    3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  4,  3,
-    3,  3,  3,  3,  5,  3,  3,  3,  3,  3,  6,  7,  8,  3,  3,  3,
-    3,  3,  9, 10, 11, 12, 13,  3,  3,  3,  3,  3,  3,  3,  3, 14,
-    3, 15,  3,  3,  3,  3,  3,  3, 16, 17, 18, 19, 20, 21,  3,  3,
-    3, 22, 23, 24,  3,  3,  3,  3,  3,  3, 25,  3,  3,  3,  3,  3,
-    3,  3,  3, 26,  3,  3, 27, 28,  0,  1,  0,  0,  0,  0,  0,  1,
-    0,  2,  0,  0,  0,  3,  0,  0,  0,  3,  0,  0,  0,  0,  0,  4,
-    0,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  6,  0,  0,  0,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  8,  9,  0,  0,  0,  0,  0,  0,  9,  0,  9,  0,  0,  0,  0,
-    0,  0,  0, 10, 11, 12, 13,  0,  0, 14, 15, 16,  6,  0, 17, 18,
-   19, 19, 19, 20, 21, 22, 23, 24, 19, 25,  0, 26, 27, 19, 19, 28,
-   29, 30,  0, 31,  0,  0,  0,  8,  0,  0,  0,  0,  0,  0,  0, 19,
-   28,  0, 32, 33,  9, 34, 35, 19,  0,  0, 36, 37, 38, 39, 40, 19,
-    0, 41, 42, 43, 44, 31,  0,  1, 45, 42,  0,  0,  0,  0,  0, 32,
-   14, 14,  0,  0,  0,  0, 14,  0,  0, 46, 47, 47, 47, 47, 48, 49,
-   47, 47, 47, 47, 50, 51, 52, 53, 43, 21,  0,  0,  0,  0,  0,  0,
-    0, 54,  6, 55,  0, 14, 19,  1,  0,  0,  0,  0, 56, 57,  0,  0,
-    0,  0,  0, 19, 58, 31,  0,  0,  0,  0,  0,  0,  0, 59, 14,  0,
-    0,  0,  0,  1,  0,  2,  0,  0,  0,  3,  0,  0,  0, 60, 61,  0,
-    0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  2,  3,  0,  4,
-    5,  0,  0,  6,  0,  0,  0,  7,  0,  0,  0,  1,  1,  0,  0,  8,
-    9,  0,  8,  9,  0,  0,  0,  0,  8,  9, 10, 11, 12,  0,  0,  0,
-   13,  0,  0,  0,  0, 14, 15, 16, 17,  0,  0,  0,  1,  0,  0, 18,
-   19,  0,  0,  0, 20,  0,  0,  0,  1,  1,  1,  1,  0,  1,  1,  1,
-    1,  1,  1,  1,  0,  8, 21,  9,  0,  0, 22,  0,  0,  0,  0,  1,
-    0, 23, 24, 25,  0,  0, 26,  0,  0,  0,  8, 21, 27,  0,  1,  0,
-    0,  1,  1,  1,  1,  0,  1, 28, 29, 30,  0, 31, 32, 20,  1,  1,
-    0,  0,  0,  8, 21,  9,  1,  4,  5,  0,  0,  0, 33,  9,  0,  1,
-    1,  1,  0,  8, 21, 21, 21, 21, 34,  1, 35, 21, 21, 21,  9, 36,
-    0,  0, 37, 38,  1,  0, 39,  0,  0,  0,  1,  0,  1,  0,  0,  0,
-    0,  8, 21,  9,  1,  0,  0,  0, 40,  0,  8, 21, 21, 21, 21, 21,
-   21, 21, 21,  9,  0,  1,  1,  1,  1,  8, 21, 21, 21,  9,  0,  0,
-    0, 41,  0, 42, 43,  0,  0,  0,  1, 44,  0,  0,  0, 45,  8,  9,
-    1,  0,  0,  0,  8, 21, 21, 21,  9,  0,  1,  0,  1,  1,  8, 21,
-   21,  9,  0,  4,  5,  8,  9,  1,  0,  0,  0,  1,  2,  3,  3,  4,
-    5,  6,  7,  8,  9, 10, 11, 12, 13, 14,  3,  3,  3,  3,  3,  3,
-    3, 15,  3, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18,  0,  0,  1,  2,  3,
-    4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 17,
-   18, 17, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
-   23, 23, 24, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
-   23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 25, 25, 26, 27,
-   28, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-   30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31,
-   31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 34, 35, 36, 37, 38, 39,
-   40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53, 31,
-   31, 31, 31, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 57,
-   31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 58, 31, 31, 31,
-   59, 60, 61, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
-   63, 64, 65, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
-   31, 31, 31, 66, 67, 68, 31, 31, 31, 31, 69, 31, 31, 31, 31, 31,
-   31, 31, 17, 70, 71, 72, 17, 17, 73, 74, 31, 75, 76, 77, 78, 79,
-   80, 31, 81, 82, 17, 83, 17, 17, 17, 17, 31, 31, 23, 23, 23, 23,
-   23, 23, 23, 84, 31, 31, 31, 31, 23, 84, 31, 31, 23, 23, 31, 31,
-   31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
-   31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 85,  0,  0,  1,
-    0,  1,  2,  3,  0,  1,  2,  3,  4,  5,  6,  7,  0,  1,  2,  3,
-    4,  4,  4,  4,  4,  4,  5,  6,  7,  8,  9, 10, 11, 11, 12, 11,
-   13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 19, 27,
-   28, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36,
-   37, 37, 38, 38, 39, 40, 41, 41, 42, 42, 42, 43, 44, 44, 45, 46,
-   47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 49, 50, 51, 51, 51, 51,
-   51, 51, 51, 51, 51, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 51,
-   60, 61, 62, 63, 64, 65, 66,  7, 67, 67, 68, 69, 70, 71, 72, 73,
-   74, 75, 76,  7,  4,  4,  4,  4, 77, 77, 77, 77, 78, 79, 80, 81,
-   82, 83, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 85, 85,
-    0,  0,  0,  0, 86, 87, 88, 88, 89, 90, 48, 91,  0,  0, 92, 92,
-   92, 92, 92, 93, 94, 95, 96, 97, 98, 47, 99,100,101,102,  0,103,
-  104,105,  0,  0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
-   92, 92, 92,  0,106,106,106,106,106,106,106,106,106,106,106,107,
-  108,108,108,108,108, 11,109,110,111,  4,112,  4,113,114,115,116,
-  117,118,119,120,121,122,123,124,125,126, 50,127, 47, 47, 47, 47,
-   47, 47, 47, 47,128,128,128,128,128,128,128,128,128,128,128,128,
-   92, 92, 92, 92, 92, 92, 92, 92,129,130, 19, 19, 19, 19, 19, 19,
-  131, 19, 19, 19,132,133, 19,134,135,136,137,101,138,138,138,138,
-    0, 77,139,140,128,128,141,142,143,144,145,146,147,148,149,150,
-  151,152,153,154,155,155,155,155,155,155,  4,  4,156,157,158,159,
-  160,161,162,163,164,165,166,167,168,169,170,170,171,171,172,172,
-  173,174,174,174, 19, 19,175,176,177,178,179,180,181,181,182,183,
-  184,185,186,187,188,188,189,190,191,192,193,193,194,194,195,195,
-  128,128,196,196,197,198,199,200,201,201,128,128,202,202,203,203,
-  204,204,205,205,206,207,208,209, 28, 28,210,210,211,212,213,213,
-  214,215,216,216,128,128,217,217,218,218,219, 34,220,220,220,220,
-  220,220,220,220,220,220,220,220,220,220,128,128,128,128,128,128,
-  128,128,221,221,222,222,222,222,222,222,222,222,223,223,223,223,
-  223,223,223,223,223,223,128,128,128,128,128,128,128,128,128,128,
-  224,224,128,128,110,110,110,110,110,110,110,110,110,225,226,227,
-  228,228,228,228,128,128,128,128,229,229,128,128,230,230,230,230,
-  231,231,231,232,233,233,233,233,233,233,233,233,233,233,233,233,
-  234,234,234,234,234,234,234,234,233,233,128,128,128,128,128,128,
-  128,128,104,104,235,236,236,236,237,238,239,239,239,239,239,239,
-  128,128,128,128,240,240,241,  0,128,128,128,128,  0,  0,  0,  0,
-    7,242,  0,  0,  0,  0,  0,  0,  0,243,244,  0, 77, 77,  0,  0,
-    0,  0,128,128,245,245,245,245,245,245,245,245,245,245,245,245,
-  128,128,128,128,128,128,128,128,  4,  4,128,128,246, 11, 11, 11,
-  247,247,128,128,128,128,248,249,128,128,128,128,128,128,250,250,
-  128,128,251,251,128,128,128,128,128,128, 48, 48,252,252,252,252,
-  253,253,128,128,  0,  0,  0,  0,  0,  0,128,128, 19, 19, 19, 19,
-  128,128,128,128,254,  0,128,128,  0,  0,  0,  0, 92, 92,128,128,
-  128,128,128,128,  0,  0,128,128,  7,  7,  7,  7,  0,  0,  0,  0,
-    1,  2,  1,  2,  0,  0,  3,  3,  4,  5,  4,  5,  4,  4,  4,  4,
-    4,  4,  4,  6,  0,  0,  7,  0,  8,  8,  8,  8,  8,  8,  8,  9,
-   10, 11, 11, 11, 11, 11, 12, 11, 13, 13, 13, 13, 14, 13, 13, 13,
-   13, 13, 13, 15, 16, 16, 16, 16, 16, 17, 18, 18, 18, 18, 18, 18,
-   19, 20, 21, 21, 22, 23, 21, 24, 21, 21, 21, 21, 21, 25, 21, 21,
-   26, 26, 26, 26, 26, 21, 21, 21, 27, 27, 27, 27, 28, 28, 28, 28,
-   29, 29, 29, 29, 30, 30, 26, 21, 21, 21, 31, 21, 32, 32, 32, 32,
-   32, 33, 34, 32, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37,
-   38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41,
-   42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 45, 44, 44, 44, 44,
-   46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 47, 47, 49, 49, 49, 49,
-   49, 49, 50, 50, 50, 50, 50, 51, 52, 52, 52, 52, 53, 53, 53, 53,
-   53, 53, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 57, 57,
-   57, 57, 58, 57, 59, 59, 60, 61, 62, 62, 63, 63, 64, 64, 64, 64,
-   65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 55, 67, 67, 67, 67,
-   67, 68, 68, 68, 69, 69, 69, 69, 69, 69, 64, 64, 70, 70, 71, 71,
-   71, 71, 71, 71, 71, 71, 71,  8, 72, 72, 72, 72, 73, 73, 73, 73,
-   74, 74, 74, 74, 75, 75, 75, 75, 75, 76, 76, 76, 13, 50, 50, 50,
-   73, 77, 78, 79,  4,  4, 80,  4,  4, 81, 82, 83,  4,  4,  4, 84,
-   11, 11, 11, 11, 85,  0,  0,  0,  0,  0,  0, 86,  0,  4,  0,  0,
-    0,  8,  8,  8,  0,  0, 87, 88, 89,  0,  4,  4,  6,  0,  0,  0,
-   90, 90, 90, 90, 91, 91, 91, 91, 91, 91,  4,  4, 92, 92, 92, 92,
-   50, 50, 50, 93, 93, 93, 93, 93, 53, 53, 13, 13, 94, 94, 94, 94,
-   94, 94, 94,  0, 95,  0, 96, 97, 98, 99, 99, 99, 99,100,101,102,
-  102,102,102,103,104,104,104,105, 52,  0,104,104,  0,  0,  0,102,
-   52, 52,  0,  0,  0,  0, 52,106,  0,102,102,107,102,102,102,102,
-  102,108,  0,  0,109,109,109,109,109,110,110,110,111,111,111,111,
-   13, 13,112,112,112,112,112,112,  0,  0,113,  4,114,  4,  4,  4,
-  115,115,115,  0,116,116,116,116,117,117,117,117,117,117, 32, 32,
-  118,118,119,120,120,120, 52, 52,121,121,121,121,122,121, 49, 49,
-  123,123,123,123,123,123, 49, 49,124,124,124,124,124,124,125,125,
-   53, 53, 53,  4,  4,126,127, 54,125,125,125,125,128,128,128,128,
-    4,129, 18, 18, 18, 21, 21, 21, 21, 21, 21,130,  8,  0,131,  0,
-    0,  0,  0, 21, 21, 21, 21,132,  0,  0,  1,  2,  1,  2,133,101,
-  102,134, 52, 52,135,135,135,135, 11,  0, 11, 11, 11,  0,  0,136,
-  137,137,138,138,138,138,139,  0,140,140,140,141,141,142,142,142,
-  143,143,144,144,144,144,144,144,145,145,145,145,145,146,146,146,
-  147,147,147,148,148,148,148,148,149,149,149,150,150,150,150,151,
-  151,151,151,151,152,152,152,152,153,153,153,153,154,154,154,154,
-  155,155,156,156,157,157,157,157,157,157,158,158,159,159,160,160,
-  160,160,160,160,161,161,162,162,162,162,162,162,163,163,163,163,
-  163,163,164,164,165,165,165,165,166,166,166,166,167,167,167,167,
-  168,168,169,169,170,170,170,170,171,171,171,171,172,172,172,172,
-  173,173,173,173,174,174,174,174,175,175,175,175,176, 21, 21, 21,
-  177,177,177,178,178,178,178,179,179,179,179,180,180,180,181,181,
-  182,182,182,182,183,183,183,183,183,184,184,184,185,185,185,185,
-  185,186,186,186,187,187,187,187,187,187,188, 43,189,189,189,189,
-  190,190,190,191,191,191,191,191,192,192,192,193,192,192,192,192,
-  194,194,194,194,195,195,195,195,196,196,196,196,197,197,197,197,
-  198,198,198,198,198,198, 66, 66,199,199,199,199,199, 49, 49, 49,
-  200,200,200,200,201,201,201,201,202,202,202,202,203,203,203,203,
-  204,204,204,204,205,205,205,205,205,206,206,206,206,206,206, 55,
-  207,207,207,207,208,208,208,208,209,209,209,209,209,209,209,210,
-  210,210,210,210,211,211,211,211,211,211,212,212,212,212,212,212,
-  213,213,213,213,214,214,214,214,110,110,110,110,215,215,215,215,
-  216,216,216,216,217,217,217,217,218,218,218,218,219,219,219,219,
-  220,220,220,221,221,221,221,221,221,222,222,222,223,223,223,223,
-  224,224,224,224,225,225,225,225,226,226,226,226,226,226,227, 94,
-  228,228,228,228,229,229,229,229,230, 99, 99, 99, 99, 99, 99, 99,
-   99, 99,102,231, 99,232,102,233,233,233,233,233,234,234,234,234,
-  234,234,  0,  0,  8,  0,  0,  0,  0,  0,235,236,237,  0,238,  0,
-  239,239,239,239, 91, 91, 91, 13,240,240,240,240,241,241,241,241,
-  242,242,242,242,243,243,243,243,244,244,244,244,245,245,245,245,
-  246,246,246,246,247,  0,  0,  0,  0,  0,  0,  0,  1,  2,  2,  2,
-    2,  2,  3,  0,  0,  0,  4,  0,  2,  2,  2,  2,  2,  3,  2,  2,
-    2,  2,  5,  0,  2,  5,  6,  0,  7,  7,  7,  7,  8,  9,  8, 10,
-    8, 11,  8,  8,  8,  8,  8,  8, 12, 13, 13, 13, 14, 14, 14, 14,
-   14, 15, 14, 14, 16, 17, 17, 17, 17, 17, 17, 17, 18, 19, 19, 19,
-   19, 19, 19, 19, 20, 21, 20, 22, 20, 20, 23, 23, 20, 20, 20, 20,
-   22, 20, 24,  7,  7, 25, 20, 20, 26, 20, 20, 20, 20, 20, 20, 21,
-   27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30,
-   31, 31, 31, 31, 32, 20, 20, 20, 33, 33, 33, 33, 34, 35, 33, 33,
-   33, 36, 33, 33, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39,
-   40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43,
-   44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47,
-   48, 48, 48, 48, 49, 49, 49, 49, 49, 50, 51, 49, 52, 52, 52, 52,
-   53, 53, 53, 53, 53, 53, 54, 53, 55, 55, 55, 55, 56, 56, 56, 56,
-   57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60,
-   60, 60, 61, 62, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65,  0,  0,
-   66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 69, 70, 71, 71,
-   71, 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74,
-   75, 75, 75, 75, 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78,
-   79, 79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, 82,  7,  7,  7,
-   83,  7, 84, 85,  0, 84, 86,  0,  2, 87, 88,  2,  2,  2,  2, 89,
-   90, 87, 91,  2,  2,  2, 92,  2,  2,  2,  2, 93,  0,  0,  0, 86,
-    1,  0,  0, 94,  0, 95, 96,  0,  4,  0,  0,  0,  0,  0,  0,  4,
-   97, 97, 97, 97, 98, 98, 98, 98, 13, 13, 13, 13, 99, 99, 99, 99,
-  100,100,100,100,  0,101,  0,  0,102,100,103,104,  0,  0,100,  0,
-  105,106,106,106,106,106,106,106,106,106,107,105,108,109,109,109,
-  109,109,109,109,109,109,110,108,111,111,111,111,112, 55, 55, 55,
-   55, 55, 55,113,109,109,109,110,109,109,  0,  0,114,114,114,114,
-  115,115,115,115,116,116,116,116,117,117,117,117, 96,  2,  2,  2,
-    2,  2, 94,  2,118,118,118,118,119,119,119,119,120,120,120,120,
-  121,121,121,121,121,121,121,122,123,123,123,123,124,124,124,124,
-  124,124,124,125,126,126,126,126,127,127,127,127,128,128,128,128,
-    2,  2,  3,  2,  2,129,130,  0,131,131,131,131,132, 17, 17, 18,
-   20, 20, 20,133,  7,  7,  7,134, 20, 20, 20, 23,  0,135,109,109,
-  109,109,109,136,137,137,137,137,  0,  0,  0,138,139,139,139,139,
-  140,140,140,140, 84,  0,  0,  0,141,141,141,141,142,142,142,142,
-  143,143,143,143,144,144,144,144,145,145,145,145,146,146,146,146,
-  147,147,147,147,148,148,148,148,149,149,149,149,150,150,150,150,
-  151,151,151,151,152,152,152,152,153,153,153,153,154,154,154,154,
-  155,155,155,155,156,156,156,156,157,157,157,157,158,158,158,158,
-  159,159,159,159,160,160,160,160,161,161,161,161,162,162,162,162,
-  163,163,163,163,164,164,164,164,165,165,165,165,166,166,166,166,
-  167,167,167,167,168,168,168,168,169,169,169,169,170,170,170,170,
-  171,171,171,171,172,172,172,172,173,173,173,173,174,174,174,174,
-  175,175,175,175,176,176,176,176,177, 20, 20, 20,178,178,178,178,
-  179,179,179,179,180,180,180,180,181,181,181,181,182,182,182,182,
-  183,183,183,183,184,184,184,184,185,185,185,185,186,186,186,186,
-  187,187,187,187,188,188,188,188,189, 45, 45, 45,190,190,190,190,
-  191,191,191,191,192,192,192,192,193,193,193,193,193,193,194,193,
-  195,195,195,195,196,196,196,196,197,197,197,197,198,198,198,198,
-  199,199,199,199,200,200,200,200,201,201,201,201,202,202,202,202,
-  203,203,203,203,204,204,204,204,205,205,205,205,206,206,206,206,
-  207,207,207,207,208,208,208,208,209,209,209,209,210,210,210,210,
-  211,211,211,211,212,212,212,212,213,213,213,213,214,214,214,214,
-  215,215,215,215,216,216,216,216,217,217,217,217,218,218,218,218,
-  219,219,219,219,220,220,220,220,221,221,221,221,222,222,222,222,
-  223,223,223,223,224,224,224,224,225,225,225,225,226,226,226,226,
-  227,227,227,227,228,229,229,229,230,230,230,230,229,229,229,229,
-  231,106,106,106,232,106,106,106,106,233,109,109,234,234,234,234,
-  235,235,235,235,  0,236, 86,  0,  0,  0,236,  7, 82,138,  7,  0,
-    0,  0,237, 86,238,238,238,238,239,239,239,239,240,240,240,240,
-  241,241,241,241,242,242,242,242,243,243,243,243,244,244,244,244,
-  245,245,245,245,246,  0,  0,  0,  0,  0,  0,  0,  0, 19, 19, 19,
-   19, 19, 19, 19, 19, 19, 19,  0,  0,  0, 19,  0, 19,  0,  0,  0,
-    0,  0, 26, 26,  1,  1,  1,  1,  9,  9,  9,  9,  0,  9,  9,  9,
-    9,  9,  0,  9,  9,  0,  9,  0,  9,  9, 55, 55, 55, 55, 55, 55,
-    6,  6,  6,  6,  6,  1,  1,  6,  6,  4,  4,  4,  4,  4,  4,  4,
-    4, 14, 14, 14, 14, 14, 14, 14,  3,  3,  3,  3,  3,  0,  3,  3,
-    0,  3,  3,  3,  3,  3,  3,  0,  3,  3,  3,  1,  1,  1,  3,  3,
-    1,  3,  3,  3, 37, 37, 37, 37, 38, 38, 38, 38, 64, 64, 64, 64,
-   90, 90, 90, 90, 95, 95, 95, 95,  3,  3,  0,  3,  7,  7,  7,  7,
-    7,  1,  1,  1,  1,  7,  7,  7,  0,  0,  7,  7,  5,  5,  5,  5,
-   11, 11, 11, 11, 10, 10, 10, 10, 21, 21, 21, 21, 22, 22, 22, 22,
-   23, 23, 23, 23, 16, 16, 16, 16, 20, 20, 20, 20, 36, 36, 36, 36,
-   24, 24, 24, 24, 24, 24, 24,  0, 18, 18, 18, 18, 25, 25, 25, 25,
-   25,  0,  0,  0,  0, 25, 25, 25, 33, 33, 33, 33,  8,  8,  8,  8,
-    8,  8,  8,  0, 12, 12, 12, 12, 30, 30, 30, 30, 29, 29, 29, 29,
-   28, 28, 28, 28, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35,  0,
-    0,  0, 35, 35, 45, 45, 45, 45, 44, 44, 44, 44, 44,  0,  0,  0,
-   43, 43, 43, 43, 46, 46, 46, 46, 31, 31, 31, 31, 32, 32,  0,  0,
-   32,  0, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 52, 52, 52, 52,
-   58, 58, 58, 58, 54, 54, 54, 54, 91, 91, 91, 91, 62, 62, 62, 62,
-   76, 76, 76, 76, 93, 93, 93, 93, 70, 70, 70, 70, 73, 73, 73, 73,
-    1,  1,  1,  0,  1,  0,  1,  1,  1,  0,  0,  0,  0,  1,  0,  0,
-    1,  1,  0,  0, 19, 19,  9,  9,  9,  9,  9,  6, 19,  9,  9,  9,
-    9,  9, 19, 19,  9,  9,  9, 19,  6, 19, 19, 19, 19, 19, 19,  9,
-    0,  0,  0, 19,  0,  0,  9,  0,  0,  0, 19, 19, 27, 27, 27, 27,
-   56, 56, 56, 56, 61, 61, 61, 61, 13, 13, 13, 13,  0, 13,  0, 13,
-    0, 13, 13, 13, 13, 13,  1,  1,  1,  1, 12, 12,  0, 15, 15, 15,
-   15, 15, 15, 15, 15,  1,  1,  0,  0, 17, 17, 17, 17, 17, 17, 17,
-   17, 17, 17,  0, 26, 26, 26, 26, 26, 12, 12, 12, 12, 12, 12,  0,
-   39, 39, 39, 39, 86, 86, 86, 86, 77, 77, 77, 77, 79, 79, 79, 79,
-   60, 60, 60, 60, 65, 65, 65, 65, 75, 75, 75, 75, 69, 69, 69, 69,
-   69, 69,  0, 69, 74, 74, 74, 74, 84, 84, 84, 84, 84, 84, 84,  0,
-   68, 68, 68, 68, 92, 92, 92, 92, 87, 87, 87, 87, 19,  9, 19, 19,
-   19, 19,  0,  0,  2,  2,  2,  2, 19, 19, 19,  4,  3,  3,  0,  0,
-    1,  1,  6,  6,  0,  0, 17, 17, 17, 17,  0,  0, 49, 49, 49, 49,
-    0,  1,  1,  1, 71, 71, 71, 71, 67, 67, 67, 67, 42, 42, 42, 42,
-   41, 41, 41, 41,118,118,118,118, 53, 53, 53, 53, 59, 59, 59, 59,
-   40, 40, 40, 40, 51, 51, 51, 51, 50, 50, 50, 50,135,135,135,135,
-  106,106,106,106,104,104,104,104,161,161,161,161,170,170,170,170,
-  110,110,110,110, 47, 47, 47, 47, 81, 81, 81, 81,120,120,120,120,
-  116,116,116,116,128,128,128,128, 66, 66, 66, 66, 72, 72, 72, 72,
-   98, 98, 98, 98, 97, 97, 97, 97, 57, 57, 57, 57, 88, 88, 88, 88,
-  117,117,117,117,112,112,112,112, 78, 78, 78, 78, 83, 83, 83, 83,
-   82, 82, 82, 82,122,122,122,122, 89, 89, 89, 89,130,130,130,130,
-  144,144,144,144,165,165,165,165,156,156,156,156,156,156,  3,  3,
-  147,147,147,147,148,148,148,148,158,158,158,158,153,153,153,153,
-  149,149,149,149, 94, 94, 94, 94, 85, 85, 85, 85,101,101,101,101,
-   96, 96, 96, 96,111,111,111,111,100,100,100,100,100, 36, 36, 36,
-  108,108,108,108,129,129,129,129,109,109,109,109,107,107,107,107,
-  107,107,107,  1,171,171,171,171,137,137,137,137,124,124,124,124,
-  123,123,123,123,114,114,114,114,102,102,102,102,126,126,126,126,
-  142,142,142,142,125,125,125,125,154,154,154,154,150,150,150,150,
-  141,141,141,141,140,140,140,140,121,121,121,121,169,169,169,169,
-  133,133,133,133,134,134,134,134,138,138,138,138,143,143,143,143,
-  145,145,145,145,163,163,163,163, 63, 63, 63, 63,157,157,157,157,
-   80, 80, 80, 80,127,127,127,127,166,166,166,166,115,115,115,115,
-  159,159,159,159,103,103,103,103,119,119,119,119,167,167,167,167,
-  146,146,146,146, 99, 99, 99, 99,136,139, 13, 13,155,155,155,155,
-  136,136,136,136, 17, 15, 15, 15, 17, 17, 15, 15, 15, 17, 17, 17,
-  139,139,139,139,105,105,105,105,  0,  0,  0,  1,  0,  0,  1,  1,
-  131,131,131,131,151,151,151,151,160,160,160,160,152,152,152,152,
-  164,164,164,164,168,168,168,168,113,113,113,113,132,132,132,132,
-   15,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9,  9,
-    9, 10,  9, 11, 12, 13,  9,  9,  9, 14,  9,  9, 15,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   16, 17,  9,  9,  9,  9, 18,  9,  9,  9,  9,  9, 19, 20, 21,  9,
-   22,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9, 23,  9,  9,  9,  9,  9, 24,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 25,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
-   26, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,
-    3,  4,  5,  6,  7,  8,  9, 10, 11, 12,  0,  0, 13, 14, 15, 16,
-   17, 18, 19, 20, 21, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 23,  0,  0, 24, 25, 26, 27, 28, 29, 30,
-    0,  0, 31, 32,  0, 33,  0, 34,  0, 35,  0,  0,  0,  0, 36, 37,
-   38, 39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 40,  0,  0,  0,  0,  0,  0,  0,  0,  0, 41, 42,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0, 43, 44,  0, 45,  0,  0,  0,  0,  0,  0, 46, 47,
-    0,  0,  0,  0,  0, 48,  0, 49,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 50, 51,  0,  0,  0, 52,  0,  0, 53,  0,
-    0,  0,  0,  0,  0,  0, 54,  0,  0,  0,  0,  0,  0,  0, 55,  0,
-    0,  0,  0,  0,  0,  0, 56,  0,  0,  0,  0,  0,  0,  0,  0, 57,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0, 58, 59, 60, 61, 62, 63, 64, 65,  0,  0,
-    0,  0,  0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 67, 68,  0, 69, 70,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
-   85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,
-  101,102,103,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,104,  0,  0,  0,  0,  0,  0,105,106,  0,107,  0,
-    0,  0,108,  0,109,  0,110,  0,111,112,113,  0,114,  0,  0,  0,
-  115,  0,  0,  0,116,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,117,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,118,119,120,121,  0,122,123,124,125,126,
-    0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,128,129,130,131,132,133,134,135,136,137,138,139,140,141,
-  142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,
-    0,  0,  0,158,159,160,161,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,162,  0,
-  163,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,164,165,  0,  0,  0,
-    0,  0,  0,  0,166,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,167,  0,  0,  0,168,169,  0,  0,170,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,171,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,172,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,173,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,174,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,175,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,176,177,  0,  0,  0,  0,178,179,  0,
-    0,  0,180,181,182,183,184,185,186,187,188,189,190,191,192,193,
-  194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,
-  210,211,212,213,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,
-    3,  4,
-};
-static const uint16_t
-_hb_ucd_u16[5080] =
-{
-     0,   0,   1,   2,   3,   4,   5,   6,   0,   0,   7,   8,   9,  10,  11,  12,
-    13,  13,  13,  14,  15,  13,  13,  16,  17,  18,  19,  20,  21,  22,  13,  23,
-    13,  13,  13,  24,  25,  11,  11,  11,  11,  26,  11,  27,  28,  29,  30,  31,
-    32,  32,  32,  32,  32,  32,  32,  33,  34,  35,  36,  11,  37,  38,  13,  39,
-     9,   9,   9,  11,  11,  11,  13,  13,  40,  13,  13,  13,  41,  13,  13,  13,
-    13,  13,  13,  35,   9,  42,  11,  11,  43,  44,  32,  45,  46,  47,  47,  48,
-    49,  50,  47,  47,  51,  32,  52,  53,  47,  47,  47,  47,  47,  54,  55,  56,
-    57,  58,  47,  32,  59,  47,  47,  47,  47,  47,  60,  53,  61,  47,  62,  63,
-    47,  64,  65,  66,  47,  67,  47,  47,  68,  69,  47,  47,  70,  32,  71,  32,
-    72,  47,  47,  73,  74,  75,  76,  77,  78,  47,  47,  79,  80,  81,  82,  83,
-    84,  47,  47,  85,  86,  87,  88,  89,  84,  47,  47,  79,  90,  47,  82,  91,
-    92,  47,  47,  93,  94,  95,  82,  96,  97,  47,  47,  98,  99, 100, 101, 102,
-   103,  47,  47, 104, 105, 106,  82, 107, 108,  47,  47,  93, 109, 110,  82, 111,
-   112,  47,  47, 113, 114, 115,  82, 116,  92,  47,  47,  47, 117, 118, 101, 119,
-    47,  47,  47, 120, 121, 122,  66,  66,  47,  47,  47, 123, 124, 125,  47,  47,
-   126, 127, 128, 129,  47,  47,  47, 130, 131,  32,  32, 132, 133, 134,  66,  66,
-    47,  47, 135, 136, 122, 137, 138, 139, 140, 141,   9,   9,   9,  11,  11, 142,
-    47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47, 143, 144, 145,
-    47, 146,   9,   9,   9,   9,   9, 147, 148,  47,  47,  47,  47,  47,  47,  47,
-    47,  47,  47,  47,  47,  47, 149,  47, 150, 151,  47,  47,  47,  47, 152, 153,
-    47, 154,  47, 155,  47, 156,  47, 156,  47,  47,  47, 157, 158, 159, 160, 145,
-   161, 160,  47,  47, 162,  47,  47,  47, 163,  47, 164,  47,  47,  47,  47,  47,
-    47,  47, 165, 166, 167,  47,  47,  47,  47,  47,  47,  47,  47, 168, 146, 146,
-    47, 169,  47,  47,  47, 170, 171, 172, 160, 160, 173, 174,  32,  32,  32,  32,
-   175,  47,  47, 176, 177, 122, 178, 179, 180,  47, 181,  61,  47,  47, 182, 183,
-    47,  47, 184, 185, 186,  61,  47, 187, 188,   9,   9,   9,  66, 189, 190, 191,
-    11,  11, 192,  27,  27,  27, 193, 194,  11, 195,  27,  27,  32,  32,  32,  32,
-    13,  13,  13,  13,  13,  13,  13,  13,  13, 196,  13,  13,  13,  13,  13,  13,
-   197, 197, 197, 197, 197, 198, 197,  11, 199, 199, 199, 200, 201, 202, 202, 201,
-   203, 204, 205, 206, 207, 208, 209, 210, 211,  27, 212, 212, 212, 213, 214,  32,
-   215, 216, 217, 218, 219, 145, 220, 220, 221, 222, 223, 146, 224, 225, 146, 226,
-   227, 227, 227, 227, 227, 227, 227, 227, 228, 146, 229, 146, 146, 146, 146, 230,
-   146, 231, 227, 232, 146, 233, 234, 146, 146, 146, 146, 146, 146, 146, 145, 145,
-   145, 235, 146, 146, 146, 146, 236, 145, 146, 146, 146, 146, 146, 146, 146, 146,
-   146, 146, 146, 237, 238, 146, 146, 239, 146, 146, 146, 146, 146, 146, 240, 146,
-   146, 146, 146, 146, 146, 146, 241, 242, 145, 243, 146, 146, 244, 227, 245, 227,
-   246, 247, 227, 227, 227, 248, 227, 249, 146, 146, 146, 227, 250, 146, 146, 146,
-     9,   9,   9,  11,  11,  11, 251, 252,  13,  13,  13,  13,  13,  13, 253, 254,
-    11,  11,  11,  47,  47,  47, 255, 256,  47,  47,  47,  47,  47,  47,  32,  32,
-   257, 258, 259, 260, 261, 262, 263, 263, 264, 265, 266, 267, 268,  47,  47,  47,
-    47, 269, 148,  47,  47,  47,  47, 270,  47, 271,  47,  47, 146, 146, 146,  47,
-   146, 146, 272, 146, 273, 274, 146, 146, 272, 146, 146, 274, 146, 146, 146, 146,
-    47,  47,  47,  47, 146, 146, 146, 146,  47, 275,  47,  47,  47,  47,  47,  47,
-    47, 146, 146, 146, 146,  47,  47, 187, 276,  47,  61,  47,  13,  13, 277, 278,
-    13, 279,  47,  47,  47,  47, 280, 281,  31, 282, 283, 284,  13,  13,  13, 285,
-   286, 287, 288, 289, 290, 291,   9, 292, 293,  47, 294, 295,  47,  47,  47, 296,
-   297,  47,  47, 298, 299, 160,  32, 300,  61,  47, 301,  47, 302, 303,  47,  47,
-    72,  47,  47, 304, 305, 306, 307,  61,  47,  47, 308, 309, 310, 311,  47, 312,
-    47,  47,  47, 313,  58, 314, 315, 316,  47,  47,  47,  11,  11, 317, 318,  11,
-    11,  11,  11,  11,  47,  47, 319, 160, 320, 320, 320, 320, 320, 320, 320, 320,
-   321, 321, 321, 321, 321, 321, 321, 321,  11, 322, 323,  47,  47,  47,  47,  47,
-    47,  47,  47, 324,  31, 325,  47,  47,  47,  47,  47, 326, 146,  47,  47,  47,
-    47,  47,  47,  47, 327, 146, 146, 328,  32, 329,  32, 330, 331, 332, 333,  47,
-    47,  47,  47,  47,  47,  47,  47, 334, 335,   2,   3,   4,   5, 336, 337, 338,
-    47, 339,  47,  47,  47,  47, 340, 341, 342, 145, 145, 343, 220, 220, 220, 344,
-   345, 146, 146, 146, 146, 146, 146, 346, 347, 347, 347, 347, 347, 347, 347, 347,
-    47,  47,  47,  47,  47,  47, 348, 145,  47,  47, 349,  47, 350,  47,  47,  60,
-    47, 351,  47,  47,  47, 352, 220, 220,   9,   9, 147,  11,  11,  47,  47,  47,
-    47,  47, 160,   9,   9, 147,  11,  11,  47,  47,  47,  47,  47,  47, 351,   9,
-     9, 353,  11,  11,  47,  47,  47,  47,  27,  27,  27,  27,  27,  27,  27,  27,
-    47,  47,  47,  47,  47, 354,  47, 355,  47,  47, 356, 145, 145, 145,  47, 357,
-    47, 358,  47, 351,  66,  66,  66,  66,  47,  47,  47, 359, 145, 145, 145, 145,
-   360,  47,  47, 361, 145,  66,  47, 362,  47, 363, 145, 145, 364,  47, 365,  66,
-    47,  47,  47, 366,  47, 367,  47, 367,  47, 366, 144, 145, 145, 145, 145, 145,
-     9,   9,   9,   9,  11,  11,  11, 368,  47,  47, 369, 160, 370,   9, 371,  11,
-   372, 227, 227, 227, 227, 227, 227, 227, 145, 145, 145, 145, 145, 145, 145, 145,
-    47,  47, 373,  47,  47,  47,  47, 374,  47, 363, 375,  47,  60, 376,  66,  47,
-   377,  66,  66,  47, 378, 145,  47,  47, 379,  47,  47, 361, 380, 381, 382, 383,
-   180,  47,  47, 384, 385,  47,  47, 160,  97,  47, 386, 387, 388,  47,  47, 389,
-   180,  47,  47, 390, 391, 392, 393, 145,  47,  47, 394, 395, 360,  32,  32,  32,
-    47,  47, 366,  47,  47, 396, 172, 160,  92,  47,  47, 113, 397, 398, 399,  32,
-    47,  47,  47, 400, 401, 402, 403,  32,  47,  47,  47, 404, 405, 406,  47,  47,
-    47,  47,  47, 407, 408, 160, 160, 160,  47,  47, 409, 410, 411, 412,  32,  32,
-    47,  47,  47, 413, 414, 160,  66,  66,  47,  47, 415, 416, 160, 160, 160, 160,
-    47, 417, 418, 419,  47,  47,  47,  47,  47,  47, 394, 420,  66,  66,  66,  66,
-     9,   9,   9,   9,  11,  11, 128, 421,  47,  47,  47, 422, 423, 160, 160, 160,
-    47,  47,  47,  47,  47, 424, 425, 426, 427,  47,  47, 428, 429, 430,  47,  47,
-   431, 432,  66,  47,  47,  47,  47,  47,  66,  66,  66,  66,  66,  66,  66,  66,
-    47,  47,  47,  47,  47,  47, 433, 160,  47,  47, 409, 434, 433, 128, 145, 435,
-    47, 156, 436, 437,  32,  32,  32,  32,  47,  47,  47, 360, 438, 160,  47,  47,
-   439, 440, 160, 160, 160, 160, 160, 160,  47,  47,  47,  47,  47,  47,  47, 441,
-   442,  47,  47, 443, 444, 445,  32,  32,  47,  47,  47,  47, 145, 446, 447, 448,
-   220, 220, 220, 220, 220, 220, 220,  66,  47,  47,  47,  47,  47,  47,  47, 433,
-    47,  47,  47, 209, 449,  32,  47,  47,  47, 450, 451, 160, 160, 160, 160, 160,
-    47,  47,  47,  47,  47,  47, 306,  47,  47,  47,  47,  47, 160,  47,  47, 452,
-    47,  47,  47, 453, 454, 455, 456,  47,  27,  27,  27,  27, 457,  47, 458, 160,
-     9,   9,   9,   9,   9,   9,  11,  11, 145, 459,  66,  66,  66,  66,  66,  66,
-    47,  47,  47,  47, 396, 460, 426, 426, 461, 462,  27,  27,  27,  27, 463, 426,
-    47, 464, 209, 209, 209, 209, 209, 209, 146, 146, 146, 146, 146, 146, 146, 160,
-    32,  32,  32,  32,  32, 146, 146, 146, 146, 146, 146, 146, 146, 146, 465, 466,
-   467, 146, 468, 146, 146, 146, 146, 146, 146, 146, 146, 146, 469, 146, 146, 146,
-     9, 470,  11, 471, 472,  11, 197,   9, 473, 474,   9, 475,  11,   9, 470,  11,
-   471, 472,  11, 197,   9, 473, 474,   9, 475,  11,   9, 470,  11, 471, 472,  11,
-   197,   9, 473, 474,   9, 475,  11,   9, 470,  11, 197,   9, 476, 477, 478, 479,
-    11, 480,   9, 481, 482, 483, 484,  11, 485,   9, 486,  11, 487, 160, 160, 160,
-    32,  32,  32, 488,  32,  32, 489, 490, 491, 492,  32,  32,  32,  32,  32,  32,
-   493,  11,  11,  11,  11,  11,  11,  11,  32,  32,  32,  27,  27,  27,  27,  27,
-    32,  32,  32,  32,  32,  32,  32,  32,  47,  47,  47, 494, 495, 146, 146, 146,
-    47,  47, 450,  32,  47,  47, 374, 496,  47,  47,  47,  47,  47,  47, 497, 160,
-    47,  47,  47,  47,  47,  47, 450, 498,  47,  47,  47,  47, 356,  32,  32,  32,
-     9,   9, 473,  11, 499, 306,  66,  66, 145, 145, 500, 501, 145, 145, 145, 145,
-   145, 145, 502, 145, 145, 145, 145, 145,  47,  47,  47,  47,  47,  47,  47, 227,
-   503, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 504,
-   209, 209, 209, 209, 209, 209, 209, 209,   0,   0,   0,   0,   0,   0,   0,   0,
+   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 716,
+   391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 717,
+     0,   0,   0,   0,   1,   2,   1,   2,   0,   0,   3,   3,   4,   5,   4,   5,
+     4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   6,   0,   0,   7,   0,
+     8,   8,   8,   8,   8,   8,   8,   9,  10,  11,  12,  11,  11,  11,  13,  11,
+    14,  14,  14,  14,  14,  14,  14,  14,  15,  14,  14,  14,  14,  14,  14,  14,
+    14,  14,  14,  16,  17,  18,  17,  17,  19,  20,  21,  21,  22,  21,  23,  24,
+    25,  26,  27,  27,  28,  29,  27,  30,  27,  27,  27,  27,  27,  31,  27,  27,
+    32,  33,  33,  33,  34,  27,  27,  27,  35,  35,  35,  36,  37,  37,  37,  38,
+    39,  39,  40,  41,  42,  43,  44,  27,  27,  45,  27,  27,  27,  27,  46,  27,
+    47,  47,  47,  47,  47,  48,  49,  47,  50,  51,  52,  53,  54,  55,  56,  57,
+    58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,
+    74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,
+    90,  91,  92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102, 103, 104, 105,
+   106, 107, 108, 108, 109, 110, 111, 108, 112, 113, 114, 115, 116, 117, 118, 119,
+   120, 121, 121, 122, 121, 123, 124, 124, 125, 126, 127, 128, 129, 130, 124, 124,
+   131, 131, 131, 131, 132, 131, 133, 134, 131, 132, 131, 135, 135, 136, 124, 124,
+   137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 138, 138, 139, 138, 138, 140,
+   141, 141, 141, 141, 141, 141, 141, 141, 142, 142, 142, 142, 143, 144, 142, 142,
+   143, 142, 142, 145, 146, 147, 142, 142, 142, 146, 142, 142, 142, 148, 142, 149,
+   142, 150, 151, 151, 151, 151, 151, 152, 153, 153, 153, 153, 153, 153, 153, 153,
+   154, 155, 156, 156, 156, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,
+   167, 167, 167, 167, 167, 168, 169, 169, 170, 171, 172, 172, 172, 172, 172, 173,
+   172, 172, 174, 153, 153, 153, 153, 175, 176, 177, 178, 178, 179, 180, 181, 182,
+   183, 183, 184, 183, 185, 186, 167, 167, 187, 188, 189, 189, 189, 190, 189, 191,
+   192, 192, 193,   8,   8, 194, 195, 124, 196, 196, 196, 196, 197, 196, 196, 196,
+   198, 198, 198, 198, 199, 199, 199, 200, 201, 201, 201, 202, 203, 204, 204, 204,
+   205, 138, 138, 206, 207, 208, 209, 210,   4,   4, 211,   4,   4, 212, 213, 214,
+     4,   4,   4, 215,   8,   8,   8,   8,  11, 216,  11,  11, 216, 217,  11, 218,
+    11,  11,  11, 219, 219, 220,  11, 221, 222,   0,   0,   0,   0,   0, 223, 224,
+   225, 226,   0,   0, 227,   8,   8, 228,   0,   0, 229, 230, 231,   0,   4,   4,
+   232,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0, 233, 124, 234, 124,   0,   0, 235, 235, 235, 235, 235, 235, 235, 235,
+     0,   0,   0,   0,   0,   0,   0, 236, 237, 237, 237, 237, 237, 237,   4,   4,
+   238, 238, 238, 238, 238, 238, 238, 239, 138, 138, 139, 240, 240, 240, 241, 242,
+   142, 243, 244, 244, 244, 244,  14,  14,   0,   0,   0,   0,   0, 245, 124, 124,
+   246, 247, 246, 246, 246, 246, 246, 248, 246, 246, 246, 246, 246, 246, 246, 246,
+   246, 246, 246, 246, 246, 249, 124,   0, 250,   0, 251, 252, 253, 254, 254, 254,
+   254, 255, 256, 257, 257, 257, 257, 258, 259, 260, 260, 261, 141, 141, 141, 141,
+   262,   0, 260, 260,   0,   0, 263, 257, 141, 262,   0,   0,   0,   0, 141, 264,
+     0,   0,   0,   0,   0, 257, 257, 265, 257, 257, 257, 257, 257, 266,   0,   0,
+   246, 246, 246, 246,   0,   0,   0,   0, 267, 267, 267, 267, 267, 267, 267, 267,
+   268, 267, 267, 267, 269, 270, 270, 270, 271, 271, 271, 271, 271, 271, 271, 271,
+   271, 271, 272, 124,  14,  14,  14,  14,  14,  14, 273, 273, 273, 273, 273, 274,
+     0,   0, 275,   4,   4,   4,   4,   4, 276,   4,   4,   4,   4, 226, 124, 277,
+   278, 278, 279, 233, 280, 280, 280, 281, 282, 282, 282, 282, 283, 284,  47,  47,
+   285, 285, 286, 287, 287, 288, 141, 289, 290, 290, 290, 290, 291, 292, 137, 293,
+   294, 294, 294, 295, 296, 297, 137, 137, 298, 298, 298, 298, 299, 300, 301, 302,
+   303, 304, 244,   4,   4, 305, 306, 151, 151, 151, 151, 151, 301, 301, 307, 308,
+   141, 141, 309, 141, 310, 141, 141, 311, 124, 124, 124, 124, 124, 124, 124, 124,
+   246, 246, 246, 246, 246, 246, 312, 246, 246, 246, 246, 246, 246, 313, 124, 124,
+   314, 315,  21, 316, 317,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,  27,
+    27,  27,  27, 318,  27,  27,  27,  27,  27,  27,  27,  27,  27, 124, 124,  27,
+     8, 233, 319,   0,   0, 320, 321, 322,  27,  27,  27,  27,  27,  27,  27, 323,
+   324,   0,   1,   2,   1,   2, 325, 256, 257, 326, 141, 262, 327, 328, 329, 330,
+   331, 332, 333, 334, 335, 335, 124, 124, 332, 332, 332, 332, 332, 332, 332, 336,
+   337,   0,   0, 338,  11,  11,  11,  11, 339, 340, 341, 124, 124,   0,   0, 342,
+   343, 344, 345, 345, 345, 346, 347, 348, 349, 349, 350, 351, 352, 353, 353, 354,
+   355, 356, 357, 357, 358, 359, 124, 124, 360, 360, 360, 360, 360, 361, 361, 361,
+   362, 363, 364, 365, 365, 366, 365, 367, 368, 368, 369, 370, 370, 370, 371, 372,
+   372, 373, 374, 375, 376, 376, 376, 377, 378, 378, 378, 378, 378, 378, 378, 378,
+   378, 378, 378, 379, 378, 380, 381, 124, 382,   4,   4, 383, 124, 124, 124, 124,
+   384, 385, 385, 386, 387, 388, 389, 389, 390, 391, 392, 124, 124, 124, 393, 394,
+   395, 396, 397, 398, 399, 400, 124, 124, 401, 401, 402, 403, 402, 404, 402, 402,
+   405, 406, 407, 408, 409, 409, 410, 410, 411, 411, 124, 124, 412, 412, 413, 414,
+   415, 415, 415, 416, 417, 418, 419, 420, 421, 422, 423, 124, 124, 124, 124, 124,
+   424, 424, 424, 424, 425, 124, 124, 124, 426, 426, 426, 427, 426, 426, 426, 428,
+   429, 429, 430, 431, 432, 432, 433, 432, 434, 124, 124, 124, 124, 124, 124, 124,
+   124, 124, 124, 124, 124, 124,  27, 435, 436, 436, 437, 438, 439, 440, 124, 441,
+   442, 442, 443, 444, 444, 445, 124, 446, 447, 124, 124, 448, 449, 124, 450, 451,
+   452, 452, 452, 452, 453, 454, 452, 455, 456, 456, 456, 456, 457, 458, 459, 460,
+   461, 461, 461, 462, 463, 464, 464, 465, 466, 466, 466, 466, 466, 466, 467, 468,
+   469, 470, 469, 469, 471, 124, 124, 124, 472, 473, 474, 475, 475, 475, 476, 477,
+   478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 487, 488, 489, 490, 491, 124,
+   492, 492, 492, 492, 492, 493, 494, 124, 495, 495, 495, 495, 496, 497, 124, 124,
+   498, 498, 498, 499, 498, 500, 124, 124, 501, 501, 501, 501, 502, 503, 504, 124,
+   505, 505, 505, 506, 506, 137, 507, 124, 508, 509, 510, 508, 511, 124, 124, 124,
+   512, 512, 512, 513, 124, 124, 124, 124, 124, 124, 514, 514, 514, 514, 514, 515,
+   516, 517, 518, 519, 520, 521, 124, 124, 124, 124, 522, 523, 523, 522, 524, 124,
+   525, 525, 525, 525, 526, 527, 527, 527, 527, 527, 528, 153, 529, 529, 529, 530,
+   531, 124, 124, 124, 124, 124, 532, 124, 124, 124, 124, 124, 533, 533, 534, 535,
+   536, 537, 537, 538, 539, 537, 540, 541, 541, 542, 543, 544, 124, 124, 124, 124,
+   545, 546, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 555, 556, 557, 124,
+   124, 124, 124, 124, 124, 124, 558, 559, 560, 561, 560, 562, 560, 563, 124, 124,
+   124, 124, 124, 564, 565, 565, 565, 566, 567, 567, 567, 567, 567, 567, 567, 567,
+   567, 568, 124, 124, 124, 124, 124, 124, 567, 567, 567, 567, 567, 567, 569, 570,
+   567, 567, 567, 567, 571, 124, 124, 124, 124, 572, 572, 572, 572, 572, 572, 573,
+   574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 575, 574, 574,
+   574, 574, 574, 574, 574, 574, 574, 576, 577, 577, 577, 577, 577, 577, 577, 577,
+   577, 577, 577, 577, 578, 124, 124, 124, 579, 579, 579, 580, 124, 124, 124, 124,
+   273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 581, 582, 583, 584, 585,
+   585, 585, 585, 586, 587, 588, 589, 590, 591, 591, 591, 591, 592, 593, 594, 595,
+   591, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 596, 596, 596, 597,
+   124, 124, 124, 124, 598, 598, 598, 598, 598, 599, 600, 601, 600, 602, 124, 124,
+   603, 603, 603, 603, 604, 603, 603, 603, 605, 603, 124, 124, 124, 124, 606, 607,
+   608, 608, 608, 608, 608, 608, 608, 608, 609, 609, 609, 609, 609, 609, 609, 609,
+   609, 609, 609, 609, 609, 610, 124, 611, 608, 612, 124, 124, 124, 124, 124, 124,
+   608, 608, 608, 608, 608, 608, 608, 613, 124, 124, 124, 124, 124, 124, 124, 614,
+   615, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
+   254, 254, 616, 617, 124, 618, 619, 620, 620, 620, 620, 620, 620, 620, 620, 620,
+   620, 620, 620, 620, 620, 620, 620, 621, 622, 622, 622, 622, 622, 622, 623, 624,
+   625, 626, 627, 124, 124, 124, 124, 124,   0,   0,   0,   0,   0,   0,   0, 340,
+     0,   0,   0, 628,   0, 629,   0, 629,   8,   8, 194,   8, 630,   0,   0,   0,
+     0,   0,   0,   0, 627, 124, 124, 124,   0,   0,   0,   0,   0,   0,   0, 631,
+     0,   0, 632,   0,   0,   0, 633, 634, 635,   0, 636,   0,   0,   0, 234, 124,
+    11,  11,  11,  11, 637, 124, 124, 124, 124, 124, 124, 124,   0, 627,   0, 627,
+     0,   0,   0,   0,   0, 638,   0, 639,   0,   0,   0,   0,   0, 223,   0,   0,
+     0, 640, 641, 642, 643,   0,   0,   0, 644, 645,   0, 646, 647, 648,   0,   0,
+     0,   0, 649,   0,   0,   0,   0,   0,   0,   0,   0,   0, 650,   0,   0,   0,
+   651, 651, 651, 651, 651, 651, 651, 651, 652, 653, 654, 124, 124, 124, 124, 124,
+     4, 655, 656, 124, 124, 124, 124, 124, 657, 658, 659,  14,  14,  14, 660, 124,
+   661, 124, 124, 124, 124, 124, 124, 124, 662, 662, 663, 664, 665, 124, 124, 124,
+   124, 666, 667, 124, 668, 668, 668, 669, 124, 124, 124, 124, 124, 670, 670, 671,
+   124, 124, 124, 124, 124, 672, 672, 673, 124, 124, 124, 124, 674, 675, 674, 676,
+   124, 124, 124, 124, 124, 124, 677, 678, 679, 679, 679, 679, 679, 679, 679, 679,
+   679, 679, 679, 679, 680, 681, 124, 124, 682, 682, 682, 682, 683, 684, 124, 124,
+   124, 124, 124, 124, 124, 124, 124, 324,   0,   0,   0, 685, 124, 124, 124, 124,
+   324,   0,   0, 245, 124, 124, 124, 124, 686,  27, 687, 688, 689, 690, 691, 692,
+   693, 694, 695, 694, 124, 124, 124, 696,   0,   0, 348,   0,   0,   0,   0,   0,
+     0, 627, 225, 324, 324, 324,   0, 631,   0,   0, 245, 124, 124, 124, 697,   0,
+   698,   0,   0, 348, 639, 227, 631, 124,   0,   0,   0,   0,   0, 699, 340, 340,
+     0,   0,   0,   0,   0, 233, 348, 629, 348,   0,   0,   0, 700, 233,   0,   0,
+   700,   0, 245, 348, 227, 639, 124, 124,   0,   0,   0,   0,   0, 700, 245, 340,
+   701,   0,   0,   0, 702, 703, 704, 639,   0, 320,   0,   0,   0,   0,   0, 234,
+   246, 246, 246, 246, 246, 246, 124, 124, 246, 312, 246, 246, 246, 246, 246, 246,
+   246, 246, 312, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 705, 246,
+   246, 246, 246, 246, 246, 312, 124, 124, 246, 312, 124, 124, 124, 124, 124, 124,
+   246, 246, 246, 246, 706, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 313,
+   707, 124,   0,   0,   0,   0,   0,   0,   8,   8,   8,   8,   8,   8,   8,   8,
+     8,   8,   8,   8,   8,   8,   8,   0,   0,   0,   0,   0,   1,   2,   2,   2,
+     2,   2,   3,   0,   0,   0,   4,   0,   2,   2,   2,   2,   2,   3,   2,   2,
+     2,   2,   5,   0,   2,   5,   6,   0,   7,   7,   7,   7,   8,   9,  10,  11,
+    12,  13,  14,  15,   8,   8,   8,   8,  16,   8,   8,   8,  17,  18,  18,  18,
+    19,  19,  19,  19,  19,  20,  19,  19,  21,  22,  22,  22,  22,  22,  22,  22,
+    22,  23,  21,  22,  22,  22,  23,  21,  24,  25,  25,  25,  25,  25,  25,  25,
+    25,  25,  12,  12,  25,  25,  26,  27,  25,  28,  12,  12,  29,  30,  29,  31,
+    29,  29,  32,  32,  29,  29,  29,  29,  31,  29,  33,   7,   7,  34,  29,  29,
+    35,  29,  29,  29,  29,  29,  29,  30,  36,  36,  36,  37,  36,  36,  36,  36,
+    36,  36,  38,  39,  40,  40,  40,  40,  41,  12,  12,  12,  42,  42,  42,  42,
+    42,  42,  43,  44,  45,  45,  45,  45,  45,  45,  45,  46,  45,  45,  45,  47,
+    48,  48,  48,  48,  48,  48,  48,  49,  36,  36,  38,  12,  50,  51,  29,  29,
+    52,  29,  29,  29,  53,  53,  53,  53,  54,  55,  53,  53,  53,  56,  53,  53,
+    57,  58,  57,  59,  59,  57,  57,  57,  57,  57,  60,  57,  61,  62,  63,  57,
+    57,  59,  59,  64,  12,  65,  12,  66,  57,  62,  57,  57,  57,  57,  57,  64,
+    67,  67,  68,  69,  70,  71,  71,  71,  71,  71,  72,  71,  72,  73,  74,  72,
+    68,  69,  70,  74,  75,  12,  67,  76,  12,  77,  71,  71,  71,  68,  12,  12,
+    78,  78,  79,  80,  80,  79,  79,  79,  79,  79,  81,  79,  81,  78,  82,  79,
+    79,  80,  80,  82,  83,  12,  12,  12,  79,  84,  79,  79,  82,  12,  78,  79,
+    85,  85,  86,  87,  87,  86,  86,  86,  86,  86,  88,  86,  88,  85,  89,  86,
+    86,  87,  87,  89,  12,  85,  12,  90,  86,  91,  86,  86,  86,  86,  12,  12,
+    92,  93,  94,  92,  95,  96,  97,  95,  98,  99,  94,  92, 100, 100,  96,  92,
+    94,  92,  95,  96,  99,  98,  12,  12,  12,  92, 100, 100, 100, 100,  94,  12,
+   101, 101, 101, 102, 102, 101, 101, 101, 101, 101, 102, 101, 101, 101, 103, 101,
+   101, 102, 102, 103,  12, 104, 105, 103, 101, 106, 101, 101,  12, 107, 101, 101,
+   108, 108, 108, 109, 109, 108, 108, 108, 108, 108, 109, 108, 108, 110, 111, 108,
+   108, 109, 109, 111,  12, 112,  12, 113, 108, 114, 108, 108, 110,  12,  12,  12,
+   115, 115, 115, 116, 116, 115, 115, 115, 115, 115, 115, 115, 115, 116, 116, 115,
+    12, 115, 115, 115, 115, 117, 115, 115, 118, 118, 119, 119, 119, 120, 121, 119,
+   119, 119, 119, 119, 122, 119, 119, 123, 119, 120, 124, 125, 119, 126, 119, 119,
+    12, 121, 119, 119, 121, 127,  12,  12, 128, 129, 129, 129, 129, 129, 129, 129,
+   129, 129, 130, 131, 129, 129, 129,  12,  12,  12,  12,  12, 132, 133, 134, 135,
+   135, 135, 135, 135, 135, 136, 135, 135, 135, 135, 135, 137, 135, 138, 135, 134,
+   135, 135, 137, 135, 139, 139, 139, 139, 139, 139, 140, 139, 139, 139, 139, 141,
+   140, 139, 139, 139, 139, 139, 139, 142, 139, 143, 144,  12, 145, 145, 145, 145,
+   146, 146, 146, 146, 146, 147,  12, 148, 146, 146, 149, 146, 150, 150, 150, 150,
+   151, 151, 151, 151, 151, 151, 152, 153, 151, 154, 152, 153, 152, 153, 151, 154,
+   152, 153, 151, 151, 151, 154, 151, 151, 151, 151, 154, 155, 151, 151, 151, 156,
+   151, 151, 153,  12, 157, 157, 157, 157, 157, 158, 157, 158, 159, 159, 159, 159,
+   160, 160, 160, 160, 160, 160, 160, 161, 162, 162, 162, 162, 162, 162, 163, 164,
+   162, 162, 165,  12, 166, 166, 166, 166, 166, 167,  12, 168, 169, 169, 169, 169,
+   169, 170,  12,  12, 171, 171, 171, 171, 171,  12,  12,  12, 172, 172, 172, 173,
+   173,  12,  12,  12, 174, 174, 174, 174, 174, 174, 174, 175, 174, 174, 175,  12,
+   176, 177, 178, 178, 178, 178, 179,  12, 178, 178, 178, 178, 178, 178, 180,  12,
+   178, 178, 181,  12, 159, 182,  12,  12, 183, 183, 183, 183, 183, 183, 183, 184,
+   183, 183, 183,  12, 185, 183, 183, 183, 186, 186, 186, 186, 186, 186, 186, 187,
+   186, 188,  12,  12, 189, 189, 189, 189, 189, 189, 189,  12, 189, 189, 190,  12,
+   189, 189, 191, 192, 193, 193, 193, 193, 193, 193, 193, 194, 195, 195, 195, 195,
+   195, 195, 195, 196, 195, 195, 195, 197, 195, 195, 198,  12, 195, 195, 195, 198,
+     7,   7,   7, 199,   7,   7,   7,  12, 200, 200, 200, 200, 200, 200, 200, 201,
+   202, 202, 202, 202, 203, 203, 203, 203, 203,  12,  12, 203, 204, 204, 204, 204,
+   204, 204, 205, 204, 204, 204, 206, 207, 208, 208, 208, 208,  19,  19, 209,  12,
+   146, 146, 210, 211, 202, 202,  12,  12, 212,   7,   7,   7, 213,   7, 214, 215,
+     0, 214, 216,  12,   2, 217, 218,   2,   2,   2,   2, 219, 220, 217, 221,   2,
+     2,   2, 222,   2,   2,   2,   2, 223,   8, 224,   8, 224,   8,   8, 225, 225,
+     8,   8,   8, 224,   8,  15,   8,   8,   8,  10,   8, 226,  10,  15,   8,  14,
+     0,   0,   0, 227,   0, 228,   0,   0, 229,   0,   0, 230,   0,   0,   0, 231,
+     2,   2,   2, 232, 233,  12,  12,  12, 234,  12,  12,  12,   0, 235, 236,   0,
+     4,   0,   0,   0,   0,   0,   0,   4,   2,   2,   5,  12,   0,   0, 233,  12,
+     0,   0, 231,  12, 237, 237, 237, 237,   0, 238,   0,   0, 239, 239, 239, 239,
+    18,  18,  18,  18,  18,  12, 240,  18, 241, 241, 241, 241, 241, 241,  12, 242,
+   243,  12,  12, 242, 151, 154,  12,  12, 151, 154, 151, 154,   0,   0,   0, 233,
+   244, 244, 244, 244, 244, 244, 245, 244, 244,  12,  12,  12, 244, 246,  12,  12,
+     0, 247,   0,   0, 248, 244, 249, 250,   0,   0, 244,   0, 251, 252, 252, 252,
+   252, 252, 252, 252, 252, 253, 254, 255, 256, 257, 257, 257, 257, 257, 257, 257,
+   257, 257, 258, 256,  12, 259, 260, 260, 260, 260, 260, 260, 261, 150, 150, 150,
+   150, 150, 150, 262,   0, 233,  12, 131, 150, 150, 150, 263, 257, 257, 257, 258,
+   257, 257,   0,   0, 264, 264, 264, 264, 264, 264, 264, 265, 264, 266,  12,  12,
+   267, 267, 267, 267, 268, 268, 268, 268, 268, 268, 268,  12, 269, 269, 269, 269,
+   269, 269,  12,  12, 236,   2,   2,   2,   2,   2, 230,   2, 270,   2,   2,   2,
+   271, 271, 271, 271, 271, 271, 271, 272, 273, 273, 273, 273, 273, 273,  12,  12,
+   274, 274, 274, 274, 274, 275,  12, 276, 274, 274, 275,  12, 277, 277, 277, 277,
+   277, 277, 277, 278, 279, 279, 279, 279, 279,  12,  12, 280, 150, 150, 150, 281,
+   282, 282, 282, 282, 282, 282, 282, 283, 282, 282, 284, 285, 145, 145, 145, 286,
+   287, 287, 287, 287, 287, 288,  12,  12, 287, 287, 287, 289, 287, 287, 289, 287,
+   290, 290, 290, 290, 291,  12,  12,  12,  12,  12, 292, 290, 293, 293, 293, 293,
+   293, 294,  12,  12, 155, 154, 155, 154, 155, 154,  12,  12,   2,   2,   3,   2,
+     2, 295, 296,  12, 293, 293, 293, 297, 293, 293, 297,  12, 150,  12,  12,  12,
+   150, 262, 298, 150, 150, 150, 150,  12, 244, 244, 244, 246, 244, 244, 246,  12,
+     2, 299,  12,  12, 300,  22,  12,  24,  25,  26,  25, 301, 302, 303,  25,  25,
+    29,  29,  29, 304,   7,   7,   7, 305, 231,   0,   0,   0,   0, 231,   0,  12,
+    29, 306,  29,  29,  29,  29,  29, 307, 308,   0,   0,   0,   0, 309, 257, 257,
+   257, 257, 257, 310, 311, 150, 311, 150, 311, 150, 311, 281,   0, 231,   0, 231,
+    12,  12, 308, 233, 312, 312, 312, 313, 312, 312, 312, 312, 312, 314, 312, 312,
+   312, 312, 314, 315, 312, 312, 312, 316, 312, 312, 314,  12, 231, 131,   0,   0,
+     0, 131,   0,   0,   8,   8,   8,  14,   0,   0,   0, 317, 318,  12,  12,  12,
+     0,   0,   0, 319, 320, 320, 320, 320, 320, 320, 320, 321, 322, 322, 322, 322,
+   323,  12,  12,  12, 214,   0,   0,   0,   0,   0,   0,  12, 324, 324, 324, 324,
+   324,  12,  12, 325, 326, 326, 326, 326, 326, 326, 327,  12, 328, 328, 328, 328,
+   328, 328, 329,  12, 330, 330, 330, 330, 330, 330, 330, 331, 332, 332, 332, 332,
+   332,  12, 332, 332, 332, 333,  12,  12, 334, 334, 334, 334, 335, 335, 335, 335,
+   336, 336, 336, 336, 336, 336, 336, 337, 336, 336, 337,  12, 338, 338, 338, 338,
+   338,  12, 338, 338, 338, 338, 338,  12, 339, 339, 339, 339, 339, 339,  12,  12,
+   340, 340, 340, 340, 340,  12,  12, 341, 342, 342, 343, 342, 343, 344, 342, 342,
+   344, 342, 342, 342, 344, 342, 344, 345, 346, 346, 346, 346, 346,  12,  12,  12,
+   347, 347, 347, 347, 347, 348,  12,  12, 347, 349,  12,  12, 347, 347,  12,  12,
+     2, 350,   2,   2, 351,   2, 299,  12, 352, 353, 354, 352, 352, 352, 352, 352,
+   352, 355, 356, 357, 358, 358, 358, 358, 358, 359, 358, 358, 360, 360, 360, 360,
+   361, 361, 361, 361, 361, 361, 361, 362,  12, 363, 361, 361, 364, 364, 364, 364,
+   365, 366, 367, 364, 368, 368, 368, 368, 368, 368, 368, 369, 370, 370, 370, 370,
+   370, 370, 371, 372, 373, 373, 373, 373, 373, 373, 374,  12, 375, 375, 375, 375,
+   376, 376, 376, 376, 376, 376,  12, 376, 377, 376, 376, 376, 378, 379,  12, 378,
+   378, 380, 380, 378, 378, 378, 378, 378, 378, 381, 382, 383, 378, 378, 384,  12,
+   385, 385, 385, 385, 386, 386, 386, 386, 387, 387, 387, 387, 387, 388, 389, 387,
+   387, 388,  12,  12, 390, 390, 390, 390, 390, 391, 392, 390, 393, 393, 393, 393,
+   393, 394, 393, 393, 395, 395, 395, 395, 396,  12, 395, 395, 397, 397, 397, 397,
+   398,  12, 399, 400,  12,  12, 399, 397, 401, 401, 401, 401, 401, 401, 402,  12,
+   403, 403, 403, 403, 404,  12,  12,  12, 404,  12, 405, 403, 406, 406, 406, 406,
+   406, 406,  12,  12, 406, 406, 407,  12, 408, 408, 408, 408, 408, 409, 410, 408,
+   408, 409,  12, 411,  29,  29,  29, 412, 413, 413, 413, 413, 413, 413, 414, 415,
+   415,  12,  12,  12, 416,  29,  12,  12,  29,  29, 417,  12,  12,  12, 416,  29,
+   418, 418, 418, 418, 418, 418,  12,  12, 419, 419, 419, 419, 419, 419, 420,  12,
+   421, 421, 421, 421, 421, 421, 422,  12, 423, 423, 423, 423, 423, 423, 423,  12,
+   424, 424, 424, 424, 424, 425,  12,  12, 426, 426, 426, 426, 426, 426, 426, 427,
+   428, 426, 426, 426, 426, 427,  12, 429, 430, 430, 430, 430, 431,  12,  12, 432,
+   433, 433, 433, 433, 433, 433, 434,  12, 433, 433, 435,  12, 436, 436, 436, 436,
+   436, 437, 436, 436, 436, 436,  12,  12, 438, 438, 438, 438, 438, 439,  12,  12,
+   440, 440, 440, 440, 118, 119, 119, 119, 119, 127,  12,  12, 441, 441, 441, 441,
+   442, 441, 441, 441, 443,  12,  12,  12, 444, 445, 446, 447, 444, 444, 444, 447,
+   444, 444, 448,  12, 449, 449, 449, 449, 449, 449, 450,  12, 449, 449, 451,  12,
+   452, 453, 452, 454, 454, 452, 452, 452, 452, 452, 455, 452, 455, 453, 456, 452,
+   452, 454, 454, 457, 458, 459,  12, 453, 452, 460, 452, 458, 452, 458,  12,  12,
+   461, 461, 462, 463, 461, 461, 461, 461, 461, 462, 461, 461, 464, 465, 466, 461,
+   461, 462, 467,  12, 468,  12,  12,  12, 469, 469, 469, 469, 469, 469, 469, 470,
+   471,  12,  12,  12, 472, 472, 472, 472, 472, 472,  12,  12, 472, 472, 473,  12,
+   474, 474, 474, 474, 474, 475, 474, 474, 474, 474, 474, 475, 476, 476, 476, 476,
+   476, 477,  12,  12, 476, 476, 478,  12, 178, 178, 178, 180, 479, 479, 479, 479,
+   479, 479, 480,  12, 145,  12,  12,  12, 481, 481, 481, 481, 481, 481, 482, 483,
+   481, 481, 481,  12, 481, 482,  12,  12, 484, 484, 484, 484, 484, 484, 484,  12,
+   485, 485, 485, 485, 486,  12,  12, 487, 488, 489, 490, 488, 488, 491, 488, 488,
+   488, 488, 488, 488, 488, 492, 493, 488, 488, 489,  12,  12, 488, 488, 494,  12,
+   495, 495, 496, 495, 495, 495, 495, 495, 495, 497,  12,  12, 498, 498, 498, 498,
+   498, 498,  12,  12, 499, 499, 499, 499, 500,  12,  12,  12, 501, 501, 501, 501,
+   501, 501, 502,  12,  53,  53, 503,  12, 440, 440,  12,  12, 504, 504, 504, 504,
+   505,  12,  12,  12, 504, 504, 505,  12, 506, 506, 507, 506, 506, 506, 506, 506,
+   506, 508, 506, 506, 506, 509,  12,  12, 506, 506, 506, 510, 511, 511, 511, 511,
+   512, 511, 511, 511, 511, 511, 513, 511, 511, 514,  12,  12, 515, 516, 517, 515,
+   515, 515, 515, 515, 515, 516, 518, 517, 515, 515,  12,  12, 515, 515, 519,  12,
+   520, 521, 522, 520, 520, 520, 520, 520, 520, 520, 520, 523, 521, 520, 524,  12,
+   520, 520, 525,  12, 526, 526, 526, 526, 526, 526, 526,  12, 526, 526, 527,  12,
+   528, 528, 528, 528, 528, 528, 529,  12, 530, 530, 530, 530, 531, 530, 530, 530,
+   530, 530, 532, 533, 530, 530, 532,  12, 534,  12,  12,  12, 100, 100, 100, 100,
+    96,  12,  12,  98, 535, 535, 535, 535, 535, 535, 536,  12, 535, 535, 535, 537,
+   535, 538,  12,  12, 535,  12,  12,  12, 539, 539, 539, 539, 540,  12,  12,  12,
+   541, 541, 541, 541, 541, 542,  12,  12, 541, 541, 543,  12, 544, 544, 544, 544,
+   544, 545,  12,  12, 546, 546, 546, 546, 546, 546, 547,  12, 269, 269, 548,  12,
+   549, 549, 549, 549, 549, 549, 549, 550, 549, 549, 551, 552, 553, 553, 553, 553,
+   553, 553, 553, 554, 553, 553, 555,  12, 556, 556, 556, 556, 556, 556, 556, 557,
+   556, 557,  12,  12, 558, 558, 558, 558, 558, 559,  12,  12, 558, 558, 560, 558,
+   560, 558, 558, 558, 558, 558,  12, 561, 562, 562, 562, 562, 562, 562, 563,  12,
+   564, 564, 564, 564, 564, 564, 565,  12, 566, 566, 566, 566, 566, 566, 567, 566,
+   566,  12,  12,  12, 568, 568, 568, 568, 568, 568, 569, 570, 568, 568,  12, 570,
+   571, 572,  12,  12, 244, 573,  12,  12, 574, 574, 574, 574, 575, 575, 575, 575,
+   575, 576,  12,  12,  12,  12,  12, 577, 574, 574, 574, 578, 578,  12,  12,  12,
+   257, 579, 257, 580, 581, 252, 252, 252, 582,  12,  12,  12, 583,  12,  12,  12,
+   253, 584,  12,  12,  12, 257,  12,  12, 585, 585, 585, 585, 585, 585, 585,  12,
+   586, 586, 586, 586, 586, 586, 587,  12, 586, 586, 586, 588, 586, 586, 588,  12,
+   586, 586, 589, 586,   0,  12,  12,  12,   0,  12, 238,   0, 317,  12,  12,  12,
+     7, 590,  12,  12,   0, 233,  12,  12,   0, 231, 308,   0,   0, 591, 227,   0,
+     0,   0, 591,   7, 212, 592,   7,   0,   0,   0, 593, 227,   8, 224,  12,  12,
+     0, 231,  12,  12,   0,   0, 317,  12,   0,   0,   0, 228, 594, 595, 308, 228,
+     0,   0, 596, 308,   0, 308,   0,   0,   0, 596, 231, 308,   0, 228,   0, 228,
+     0,   0, 596, 231,   0, 597, 238,   0, 228,   0,   0,   0,   0, 233,   0,   0,
+     0,   0,   0, 238, 598, 598, 598, 598, 598, 598, 598,  12,  12,  12, 599, 598,
+   600, 598, 598, 598,   2,   2,   2, 299,  12, 270, 299,  12, 239, 601, 239, 239,
+   239, 239, 602, 239, 603, 604, 601,  12,  19,  19,  19, 605,  12,  12,  12, 606,
+   607, 607, 607, 607, 607, 607, 607, 608, 607, 607, 607, 609, 607, 607, 609, 610,
+   611, 611, 611, 611, 611, 611, 611, 612, 613, 613, 613, 613, 613, 613, 614, 615,
+   616, 616, 616, 616, 616, 616, 617,  12, 618, 618, 618, 618, 618, 618, 619, 620,
+   621, 621, 621, 621, 621, 621, 621, 622, 621, 623,  12, 624, 151, 154, 151, 625,
+   151, 151, 151, 154, 626, 626, 626, 626, 626, 627, 626, 626, 626, 628,  12,  12,
+   629, 629, 629, 629, 629, 629, 629,  12, 629, 629, 630, 631,   0, 317,  12,  12,
+    29, 632,  29,  29, 633, 634, 632,  29, 412,  29, 635,  12, 636,  51, 635, 632,
+   633, 634, 635, 635, 633, 634, 412,  29, 412,  29, 632, 637,  29,  29, 638,  29,
+    29,  29,  29,  12, 632, 632, 638,  29,  50,  12,  12,  12,  12, 238,   0,   0,
+   639,  12,  12,  12,   0,   0, 317,   0,   0,   0,  12,  12,   0,   0, 231, 238,
+     0, 231, 317, 308,   0,   0,   0, 640,   0,   0, 231, 131, 641,  12,  12,  12,
+   244, 244, 573,  12, 642,  12,  12,  12,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0, 939, 940, 941, 942, 946, 948,   0, 962,
    969, 970, 971, 976,1001,1002,1003,1008,   0,1033,1040,1041,1042,1043,1047,   0,
      0,1080,1081,1082,1086,1110,   0,   0,1124,1125,1126,1127,1131,1133,   0,1147,
@@ -5831,8 +4348,7 @@
     96, 929, 802, 804, 806,  97,  98, 807, 930,  99, 931, 932, 933, 814, 100, 816,
    817, 818, 819, 820, 821, 935,   0,   0,
 };
-static const int16_t
-_hb_ucd_i16[92] =
+static const int16_t _hb_ucd_i16[92]=
 {
       0,    0,    1,   -1,    2,    0,   -2,    0,    0,    2,    0,   -2,    0,   16,    0,  -16,
       0,    1,   -1,    0,    3,    3,    3,   -3,   -3,   -3,    0, 2016,    0, 2527, 1923, 1914,
@@ -5842,39 +4358,1270 @@
       0,-2016,-2104,    0,    0,-2106,-2108,-2106,-2250,    0,-2527,    0,
 };
 
-static inline uint_fast8_t
-_hb_ucd_gc (unsigned u)
+static inline uint8_t _hb_ucd_gc (unsigned u)
 {
-  return u<1114112u?_hb_ucd_u8[5208+(((_hb_ucd_u8[1168+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
+  return u<1114110 ? _hb_ucd_u8[6560u+((_hb_ucd_u8[816u+((_hb_ucd_u16[((_hb_ucd_u8[272u+((_hb_ucd_u8[((((((((u)>>1))>>3))>>4))>>4)])<<4)+((((((((u)>>1))>>3))>>4))&15)])<<4)+((((((u)>>1))>>3))&15)])<<3)+((((u)>>1))&7)])<<1)+((u)&1)] : 2;
 }
-static inline uint_fast8_t
-_hb_ucd_ccc (unsigned u)
+static inline uint8_t _hb_ucd_ccc (unsigned u)
 {
-  return u<125259u?_hb_ucd_u8[7206+(((_hb_ucd_u8[6638+(((_hb_ucd_u8[6162+(((_hb_ucd_u8[5802+(((_hb_ucd_u8[5556+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0;
+  return u<125259 ? _hb_ucd_u8[8620u+((_hb_ucd_u8[8036u+((_hb_ucd_u8[7556u+((_hb_ucd_u8[7188u+((_hb_ucd_u8[6942u+((((((((u)>>2))>>2))>>2))>>3)])<<3)+((((((((u)>>2))>>2))>>2))&7)])<<2)+((((((u)>>2))>>2))&3)])<<2)+((((u)>>2))&3)])<<2)+((u)&3)] : 0;
 }
-static inline unsigned
-_hb_ucd_b4 (const uint8_t* a, unsigned i)
+static inline uint8_t _hb_ucd_b4 (const uint8_t* a, unsigned i)
 {
-  return (a[i>>1]>>((i&1u)<<2))&15u;
+  return (a[i>>1]>>((i&1)<<2))&15;
 }
-static inline int_fast16_t
-_hb_ucd_bmg (unsigned u)
+static inline int16_t _hb_ucd_bmg (unsigned u)
 {
-  return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[8098+(((_hb_ucd_u8[7866+(((_hb_ucd_u8[7770+(((_hb_ucd_b4(7706+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0;
+  return u<65380 ? _hb_ucd_i16[((_hb_ucd_u8[9516u+((_hb_ucd_u8[9284u+((_hb_ucd_u8[9188u+((_hb_ucd_b4(_hb_ucd_u8+9124u,((((((((u)>>1))>>2))>>3))>>3)))<<3)+((((((((u)>>1))>>2))>>3))&7)])<<3)+((((((u)>>1))>>2))&7)])<<2)+((((u)>>1))&3)])<<1)+((u)&1)] : 0;
 }
-static inline uint_fast8_t
-_hb_ucd_sc (unsigned u)
+static inline uint8_t _hb_ucd_sc (unsigned u)
 {
-  return u<918016u?_hb_ucd_u8[11464+(((_hb_ucd_u8[10472+(((_hb_ucd_u8[9452+(((_hb_ucd_u8[8764+(((_hb_ucd_u8[8460+(((_hb_ucd_u8[8346+(u>>2>>2>>2>>3>>4)])<<4)+((u>>2>>2>>2>>3)&15u))])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2;
+  return u<918000 ? _hb_ucd_u8[10950u+((_hb_ucd_u16[4648u+((_hb_ucd_u16[2608u+((_hb_ucd_u8[10214u+((_hb_ucd_u8[9764u+((((((((u)>>2))>>2))>>3))>>4)])<<4)+((((((((u)>>2))>>2))>>3))&15)])<<3)+((((((u)>>2))>>2))&7)])<<2)+((((u)>>2))&3)])<<2)+((u)&3)] : 2;
 }
-static inline uint_fast16_t
-_hb_ucd_dm (unsigned u)
+static inline uint16_t _hb_ucd_dm (unsigned u)
 {
-  return u<195102u?_hb_ucd_u16[1656+(((_hb_ucd_u8[12834+(((_hb_ucd_u8[12452+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
+  return u<195102 ? _hb_ucd_u16[7480u+((_hb_ucd_u8[13904u+((_hb_ucd_u8[13522u+((((u)>>4))>>5)])<<5)+((((u)>>4))&31)])<<4)+((u)&15)] : 0;
 }
 
-#endif
 
+#else
+
+#include 
+
+static const uint8_t _hb_ucd_u8[13937]=
+{
+    0,  1,  2,  3,  4,  5,  6,  7,  7,  8,  7,  7,  7,  7,  7,  7,
+    7,  7,  7,  7,  9, 10,  7,  7,  7,  7,  7, 11, 12, 12, 12, 13,
+   14, 15, 16, 17, 18, 19, 20,  7, 21, 22, 22, 22, 23, 24,  7,  7,
+    7, 25, 22, 22, 22, 26, 27, 28, 22, 29, 30, 31, 32, 33, 34, 35,
+    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+    7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7, 21, 22, 36,
+    7,  7,  7,  7,  7,  7, 37, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   38, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+   12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
+   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+   32, 33, 34, 34, 34, 34, 35, 36, 37, 34, 34, 34, 38, 39, 40, 41,
+   42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+   58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 67, 68, 69, 67, 70, 71,
+   67, 67, 62, 72, 62, 62, 73, 67, 74, 75, 76, 77, 78, 67, 67, 67,
+   79, 80, 34, 81, 82, 83, 67, 67, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 84, 34, 34, 34, 34,
+   85, 34, 34, 34, 34, 34, 34, 34, 34, 86, 34, 34, 87, 88, 89, 90,
+   91, 92, 93, 94, 95, 96, 97, 98, 34, 34, 34, 34, 34, 34, 34, 34,
+   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+  100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+  100,100, 34, 34, 34, 34,101,102, 34, 34,103,104,105,106,107,108,
+   34, 34,109,110,111,112,113,114,115,116,117,118, 34, 34, 34,119,
+  120,121,122,123,124,125,126,127, 34,128,129,130,131,132,133,134,
+  135,136,137,138,139,140,141,142,143,144,111,145,146,147,148,111,
+  149,150,151,152,153,154,155,156,157,158,159,160,111,161,162,163,
+   34, 34, 34, 34, 34, 34, 34, 34,164, 34, 34,111,111,111,111,111,
+  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,165,
+   34, 34, 34, 34, 34, 34, 34, 34,166, 34, 34, 34, 34, 34, 34, 34,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,
+  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
+  111,111,167,111,111,111,111,111,111,111,111,111,111,111,111,111,
+   34, 34, 34, 34,168,169,170, 34,111,111,171,111,172,173,174,175,
+   34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,
+  111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,119,
+   34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111,
+  111,111,111,111,111,111,111,111, 34,176,111,111,111,111,111,111,
+  111,111,111,111,111,111,111,111, 67,177, 67, 67, 67,178,179, 67,
+   67, 67,180,181,182,131, 65,111,183,184,185,186,187,188,189,190,
+   67, 67, 67, 67,191,192,111,111,111,111,111,111,111,111,193,111,
+  194,195,196,111,111,197,111,111,111,198,111,199,111,200,111, 34,
+   34,201,202,111,111,111,111,111,131,203,204,111, 34,205,111,111,
+   67, 67,206, 67, 67,111, 67,207, 67, 67, 67, 67, 67, 67, 67, 67,
+   67,208, 67, 67, 67, 67, 67,177,111,111,111,111,111,111,111,111,
+   34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111,111,
+   34, 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,
+  209,111,195,195,111,111,111,111,111,111,111,111,111,111,111,111,
+    0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  2,  4,  5,  6,  2,
+    7,  7,  7,  7,  7,  2,  8,  9, 10, 11, 11, 11, 11, 11, 11, 11,
+   11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16,
+   16, 16, 16, 16, 16, 17, 18, 19,  1, 20, 20, 21, 22, 23, 24, 25,
+   26, 27, 15,  2, 28, 29, 27, 30, 11, 11, 11, 11, 11, 11, 11, 11,
+   11, 11, 11, 31, 11, 11, 11, 32, 16, 16, 16, 16, 16, 16, 16, 16,
+   16, 16, 16, 33, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, 32,
+   32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 16, 32, 32, 32,
+   32, 32, 32, 32, 11, 34, 34, 16, 34, 32, 32, 11, 34, 11, 16, 11,
+   11, 34, 32, 11, 32, 16, 11, 34, 32, 32, 32, 11, 34, 16, 32, 11,
+   34, 11, 34, 34, 32, 35, 32, 16, 36, 36, 37, 34, 38, 37, 34, 34,
+   34, 34, 34, 34, 34, 34, 16, 32, 34, 38, 32, 11, 32, 32, 32, 32,
+   32, 32, 16, 16, 16, 11, 34, 32, 34, 34, 11, 32, 32, 32, 32, 32,
+   16, 16, 36, 16, 16, 16, 16, 16, 39, 39, 39, 39, 39, 39, 39, 39,
+   39, 40, 40, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40,
+   39, 39, 41, 40, 40, 40, 41, 41, 40, 40, 40, 40, 40, 40, 40, 40,
+   42, 42, 42, 42, 42, 42, 42, 42, 32, 32, 41, 32, 16, 43, 16, 10,
+   40, 40, 40, 44, 11, 11, 11, 11, 34, 11, 11, 11, 11, 11, 11, 11,
+   11, 11, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34,
+   16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 45, 34, 32, 34, 11,
+   32, 46, 42, 42, 47, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16,
+   11, 11, 11, 11, 48,  2,  2,  2, 16, 16, 16, 16, 49, 50, 51, 52,
+   53, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 54,
+   55, 56, 42, 55, 42, 42, 42, 42, 36, 36, 36, 36, 36, 36, 36, 36,
+   36, 57,  2,  2,  2,  2,  2,  2, 58, 58, 58,  8,  9, 59,  2, 60,
+   42, 42, 42, 42, 42, 56, 61,  2, 62, 36, 36, 36, 36, 63, 42, 42,
+    7,  7,  7,  7,  7,  2,  2, 36, 64, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 65, 42, 42, 42, 66, 46, 42, 42, 67, 68, 69, 42, 42, 36,
+    7,  7,  7,  7,  7, 36, 70, 71,  2,  2,  2,  2,  2,  2,  2, 72,
+   63, 36, 36, 36, 36, 36, 36, 36, 42, 42, 42, 42, 42, 42, 64, 36,
+   36, 36, 36, 42, 42, 42, 42, 42,  7,  7,  7,  7,  7, 36, 36, 36,
+   36, 36, 36, 36, 36, 63, 42, 42, 42, 42, 39, 21,  2, 39, 68, 20,
+   36, 36, 36, 42, 42, 68, 42, 42, 42, 42, 68, 42, 68, 42, 42, 42,
+    2,  2,  2,  2,  2,  2,  2,  2, 36, 36, 36, 36, 63, 42, 42,  2,
+   36, 36, 36, 36, 73, 36, 36, 36, 58, 58, 58, 74, 42, 42, 42, 42,
+   36, 36, 36, 36, 75, 42, 42, 42, 42, 74, 42, 42, 42, 42, 42, 42,
+   42, 76, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 76, 64, 77,
+   78, 42, 42, 42, 76, 77, 78, 77, 63, 42, 42, 42, 36, 36, 36, 36,
+   36, 42,  2,  7,  7,  7,  7,  7, 79, 36, 36, 36, 36, 36, 36, 36,
+   63, 77, 80, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 64, 77,
+   78, 42, 42, 76, 77, 77, 78, 36, 36, 36, 36, 81, 77, 77, 36, 36,
+   36, 42, 42,  7,  7,  7,  7,  7, 36, 20, 27, 27, 27, 52, 57, 42,
+   42, 76, 80, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 42, 77,
+   78, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 64, 36, 36, 36,
+   36, 36, 36,  7,  7,  7,  7,  7, 42, 36, 63,  2,  2,  2,  2,  2,
+   78, 42, 42, 42, 76, 77, 78, 42, 59, 20, 20, 20, 82, 42, 42, 42,
+   42, 77, 80, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 64, 78,
+   78, 42, 42, 76, 77, 77, 78, 42, 42, 42, 42, 76, 77, 77, 36, 36,
+   71, 27, 27, 27, 27, 27, 27, 27, 42, 64, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 36, 77, 76, 77, 77, 77, 77, 77, 78, 42,
+   36, 36, 36, 81, 77, 77, 77, 77, 77, 77, 77,  7,  7,  7,  7,  7,
+   27, 83, 60, 60, 52, 60, 60, 60, 76, 77, 64, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 64, 42, 76, 77, 77, 42, 42, 42, 42, 42,
+   42, 42, 42, 42, 36, 36, 36, 36,  7,  7,  7, 84, 27, 27, 27, 83,
+   63, 77, 65, 36, 36, 36, 36, 36, 77, 77, 77, 76, 77, 77, 42, 42,
+   42, 42, 76, 77, 77, 77, 36, 36, 85, 81, 77, 77, 77, 77, 77, 77,
+   42, 77, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 63, 64, 77,
+   78, 42, 42, 77, 77, 77, 78, 70, 60, 60, 36, 81, 27, 27, 27, 86,
+   27, 27, 27, 27, 83, 36, 36, 36, 36, 36, 36, 36, 36, 42, 42, 76,
+   77, 42, 42, 42, 77, 77, 77, 77,  7, 77,  2,  2,  2,  2,  2,  2,
+   63, 36, 42, 42, 42, 42, 42, 87, 36, 36, 36, 68, 42, 42, 42, 56,
+    7,  7,  7,  7,  7,  2,  2,  2, 63, 36, 42, 42, 42, 42, 64, 36,
+   36, 36, 36, 39, 42, 42, 42, 42,  7,  7,  7,  7,  7,  7, 36, 36,
+   70, 60,  2,  2,  2,  2,  2,  2,  2, 88, 88, 60, 42, 60, 60, 60,
+    7,  7,  7,  7,  7, 27, 27, 27, 27, 27, 46, 46, 46,  4,  4, 77,
+   63, 42, 42, 42, 42, 42, 42, 76, 42, 42, 56, 42, 36, 36, 63, 42,
+   42, 42, 42, 42, 42, 42, 42, 60, 60, 60, 60, 69, 60, 60, 60, 60,
+    2,  2, 88, 60, 21,  2,  2,  2, 36, 36, 36, 36, 36, 81, 78, 42,
+   76, 42, 42, 42, 78, 76, 78, 64, 36, 36, 36, 77, 42, 36, 36, 42,
+   64, 77, 80, 81, 77, 77, 77, 36, 63, 42, 64, 36, 36, 36, 36, 36,
+   36, 76, 78, 76, 77, 77, 78, 81,  7,  7,  7,  7,  7, 77, 78, 60,
+   16, 16, 16, 16, 16, 49, 43, 16, 36, 36, 36, 36, 36, 36, 63, 42,
+    2,  2,  2,  2, 89, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+   60, 60, 60, 60, 60, 60, 60, 60, 11, 11, 11, 11, 16, 16, 16, 16,
+   90, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 65,
+   91, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 92, 93, 93,
+   36, 36, 36, 36, 36, 57,  2, 94, 95, 36, 36, 36, 36, 36, 36, 36,
+   36, 42, 76, 77, 77, 77, 77, 80, 36, 42, 96,  2,  2,  2,  2,  2,
+   36, 42, 42, 42, 42, 42, 42, 42, 36, 36, 42, 78, 42, 42, 42, 77,
+   77, 77, 77, 76, 78, 42, 42, 42, 42, 42,  2, 79,  2, 59, 63, 42,
+    7,  7,  7,  7,  7,  7,  7,  7,  2,  2,  2, 97,  2, 55, 42, 74,
+   36, 75, 36, 36, 36, 36, 36, 36, 36, 36, 63, 64, 36, 36, 36, 36,
+   36, 36, 36, 36, 63, 36, 36, 36, 42, 76, 77, 78, 76, 77, 77, 77,
+   77, 76, 77, 77, 78, 42, 42, 42, 60, 60,  2,  7,  7,  7,  7,  7,
+    7,  7,  7,  7,  7, 27, 27, 60, 36, 36, 36, 63, 76, 78, 42,  2,
+   36, 36, 81, 76, 42, 42, 42, 42, 76, 76, 78, 42, 42, 42, 76, 77,
+   77, 78, 42, 42, 42, 42, 42, 42,  2,  2,  2, 79,  2,  2,  2,  2,
+   42, 42, 42, 42, 42, 42, 42, 98, 42, 42, 80, 36, 36, 36, 36, 36,
+   36, 36, 76, 42, 42, 76, 76, 77, 77, 76, 80, 36, 36, 36, 36,  2,
+   88, 60, 60, 60, 60, 46, 42, 42, 42, 42, 60, 60, 60, 60, 21,  2,
+   42, 80, 36, 36, 36, 36, 36, 36, 81, 42, 42, 77, 42, 78, 42, 36,
+   36, 36, 36, 76, 42, 77, 78, 78, 42, 77, 77, 77, 77, 77,  2,  2,
+   36, 36, 77, 77, 77, 77, 42, 42, 42, 42, 77, 42, 42, 56,  2,  2,
+    7,  7,  7,  7,  7,  7, 85, 36, 36, 36, 36, 36, 39, 39, 39,  2,
+   16, 16, 16, 16, 34, 16, 16, 16, 42, 56, 42, 42, 42, 42, 42, 42,
+   76, 42, 42, 42, 64, 36, 63, 36, 36, 36, 64, 81, 42, 36, 36, 36,
+   16, 16, 16, 16, 16, 16, 39, 39, 39, 39, 39, 39, 39, 43, 16, 16,
+   16, 16, 16, 16, 43, 16, 16, 16, 16, 16, 16, 16, 16, 99, 39, 39,
+   32, 32, 32, 16, 16, 16, 16, 32, 16, 16, 16, 16, 11, 11, 11, 11,
+   16, 16, 16, 16, 34, 11, 11, 11, 16, 16, 16, 16,100,100,100,100,
+   16, 16, 16, 16, 11, 11,101,102, 40, 16, 16, 16, 11, 11,101, 40,
+   16, 16, 16, 16, 11, 11,103, 40,104,104,104,104,104,105, 58, 58,
+   50, 50, 50,  2,106,107,106,107,  2,  2,  2,  2,108, 58, 58,109,
+    2,  2,  2,  2,110,111,  2,112,113,  2,114,115,  2,  2,  2,  2,
+    2,  9,113,  2,  2,  2,  2,116, 58, 58, 58, 58, 58, 58, 58, 58,
+  117, 39, 27, 27, 27,  8,114,118, 27, 27, 27, 27, 27,  8,114, 93,
+   20, 20, 20, 20, 20, 20, 20, 20, 42, 42, 42, 42, 42, 42,119, 47,
+   98, 47, 98, 42, 42, 42, 42, 42, 60,120, 60,121, 60, 34, 11, 16,
+   11, 32,121, 60, 45, 11, 11, 60, 60, 60,120,120,120, 11, 11,122,
+   11, 11, 35, 36,123, 60, 16, 11,  8,  8, 45, 16, 16, 26, 60,124,
+   94, 94, 94, 94, 94, 94, 94, 94, 94,125,126, 94,127, 60, 60, 60,
+    8,  8,128, 60, 60,  8, 60, 60,128, 26, 60,128, 60, 60, 60,128,
+   60, 60, 60, 60, 60, 60, 60,  8, 60,128,128, 60, 60, 60, 60, 60,
+   60, 60,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+   60, 60, 60, 60,  4,  4, 60, 60,  8, 60, 60, 60,129,130, 60, 60,
+   60, 60, 60, 60, 60, 60,128, 60, 60, 60, 60, 60, 60, 26,  8,  8,
+    8,  8, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,  8,  8,
+    8, 60, 60, 60, 60, 60, 60, 60, 27, 27, 27, 27, 27, 27, 60, 60,
+   60, 60, 60, 60, 60, 27, 27, 27, 60, 60, 60, 26, 60, 60, 60, 60,
+   26, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,  8,  8,  8,  8,
+   60, 60, 60, 60, 60, 60, 60, 26, 60, 60, 60, 60,  4,  4,  4,  4,
+    4,  4,  4, 27, 27, 27, 27, 27, 27, 27, 60, 60, 60, 60, 60, 60,
+    8,  8,114,131,  8,  8,  8,  8,  8,  8,  8,  4,  4,  4,  4,  4,
+    8,114,132,132,132,132,132,132,132,132,132,132,131,  8,  8,  8,
+    8,  8,  8,  8,  4,  4,  8,  8,  8,  8,  8,  8,  8,  8,  4,  8,
+    8,  8,128, 26,  8,  8,128, 60, 32, 11, 32, 34, 34, 34, 34, 11,
+   32, 32, 34, 16, 16, 16, 39, 11, 32, 32,124, 60, 60,121, 34,133,
+   42, 32, 16, 16, 49,  2, 89,  2, 36, 36, 36, 36, 36, 36, 36, 75,
+    2,  2,  2,  2,  2,  2,  2, 55,  2,106,106,  2,110,111,106,  2,
+    2,  2,  2,  6,  2, 97,106,  2,106,  4,  4,  4,  4,  2,  2, 79,
+    2,  2,  2,  2,  2, 50,  2,  2, 97,134,  2,  2,  2,  2,  2,  2,
+   60,  2,135,132,132,132,136, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+    1,  2,137,138,  4,  4,  4,  4,  4, 60,  4,  4,  4,  4,139, 93,
+  140, 94, 94, 94, 94, 42, 42, 77,141, 39, 39, 60, 94,142, 57, 60,
+   71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 63,143,144, 62,
+   36, 36, 36, 36, 36, 57, 39, 62, 60, 27, 27, 60, 60, 60, 60, 60,
+   27, 27, 27, 27, 27, 60, 60, 60, 60, 60, 60, 60, 27, 27, 27, 27,
+  145, 27, 27, 27, 27, 27, 27, 27, 36, 36, 75, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36,146,  2, 32, 32, 32, 32, 32, 32, 32, 63,
+   47,147, 42, 42, 42, 42, 42, 79, 32, 32, 32, 32, 32, 32, 39, 42,
+   36, 36, 36, 94, 94, 94, 94, 94, 42,  2,  2,  2,  2,  2,  2,  2,
+   40, 40, 40,144, 39, 39, 39, 39, 40, 32, 32, 32, 32, 32, 32, 32,
+   16, 32, 32, 32, 32, 32, 32, 32, 43, 16, 16, 16, 34, 34, 34, 32,
+   32, 32, 32, 32, 41,148, 34, 35, 32, 32, 16, 32, 32, 32, 32, 32,
+   32, 32, 32, 32, 32, 11, 11, 32, 11, 11, 32, 32, 32, 32, 32, 32,
+   32, 32, 11, 11, 34, 34, 32, 32, 32, 32, 32, 32, 32, 32, 11, 11,
+   48, 39,149, 35, 39, 35, 36, 36, 36, 64, 36, 64, 36, 63, 36, 36,
+   36, 81, 78, 76, 60, 60, 42, 42, 27, 27, 27, 60,150, 60, 60, 60,
+   36, 36,  2,  2,  2,  2,  2,  2, 77, 36, 36, 36, 36, 36, 36, 36,
+   36, 36, 77, 77, 77, 77, 77, 77, 77, 77, 42, 42, 42, 42, 42,  2,
+   42, 36, 36, 36,  2, 65, 65, 63, 36, 36, 36, 42, 42, 42, 42,  2,
+   36, 36, 36, 63, 42, 42, 42, 42, 42, 77, 77, 77, 77, 77, 77, 96,
+   36, 63, 77, 42, 42, 77, 42, 77, 96,  2,  2,  2,  2,  2,  2, 79,
+    7,  7,  7,  7,  7,  7,  7,  2, 36, 36, 63, 62, 36, 36, 36, 36,
+   36, 36, 36, 36, 63, 42, 42, 76, 78, 76, 78, 42, 42, 42, 42, 42,
+   36, 63, 36, 36, 36, 36, 76, 77,  7,  7,  7,  7,  7,  7,  2,  2,
+   62, 36, 36, 70, 60, 81, 76, 36, 64, 42, 64, 63, 64, 36, 36, 42,
+   36, 36, 36, 36, 36, 36, 75,  2, 36, 36, 36, 36, 36, 81, 42, 77,
+    2, 75,151, 42, 42, 42, 42, 42, 16, 16, 16, 16, 16,102, 39, 39,
+   16, 16, 16, 16, 99, 40, 40, 40, 36, 81, 78, 77, 76, 96, 78, 42,
+  152,152,152,152,152,152,152,152,153,153,153,153,153,153,153,153,
+   16, 16, 16, 16, 16, 16, 35, 64, 36, 36, 36, 36,154, 36, 36, 36,
+   36, 40, 40, 40, 40, 40, 40, 40, 40, 22, 60, 60, 60, 60, 60, 60,
+   60, 71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,132,
+   60, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 60, 60, 60, 60,
+   36, 36, 36, 36, 36, 36,150, 60,  2,  2,  2,135,115,  2,  2,  2,
+    6,155,156,132,132,132,132,132,132,132,115,135,115,  2,112,157,
+    2,  2,  2,  2,139,132,132,115,  2,158,  8,  8, 59,  2,  2,  2,
+   36, 36, 36, 36, 36, 36, 36,159,  2,  2,  3,  2,  4,  5,  6,  2,
+   16, 16, 16, 16, 16, 17, 18,114,115,  4,  2, 36, 36, 36, 36, 36,
+   62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 39,
+   20,160, 52, 20, 26,  8,128, 60, 60, 60, 60, 60,161, 58, 60, 60,
+    2,  2,  2, 89, 27, 27, 27, 27, 27, 27, 27, 83, 60, 60, 60, 60,
+   94, 94,127, 27, 83, 60, 60, 60, 60, 60, 60, 60, 60, 27, 60, 60,
+   60, 60, 60, 60, 60, 60, 46, 42,162,162,162,162,162,162,162,162,
+  163, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 86, 36,
+  138, 36, 36, 36, 36, 94, 94, 94, 36, 36, 36, 36, 36, 36, 36, 57,
+  164, 94, 94, 94, 94, 94, 94, 94, 11, 11, 11, 32, 16, 16, 16, 16,
+   36, 36, 36, 57, 27, 27, 27, 27, 36, 36, 36, 70,145, 27, 27, 27,
+   36, 36, 36,165, 27, 27, 27, 27, 36, 36, 36, 36, 36,165, 27, 27,
+   36, 36, 36, 27, 27, 27, 27, 30, 36, 36, 36, 36, 36, 36, 27, 36,
+   63, 42, 42, 42, 42, 42, 42, 42, 36, 36, 36, 36, 42, 42, 42, 42,
+   36, 36, 36, 36, 36, 36,165, 30, 36, 36, 36, 36, 36, 36,165, 27,
+   36, 36, 36, 36, 71, 36, 36, 36, 36, 36, 63, 42, 42,163, 27, 27,
+   36, 36, 36, 36, 57,  2,  2,  2, 36, 36, 36, 36, 27, 27, 27, 27,
+   16, 16, 16, 16, 16, 27, 27, 27, 36, 36, 42, 42, 42, 42, 42, 42,
+    7,  7,  7,  7,  7, 36, 36, 62, 11, 11, 11, 11,166, 42, 42,141,
+   16, 16, 16, 16, 16, 16, 16,  8, 36, 36, 36, 36, 36, 63,167, 50,
+   88, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 42, 42, 42,
+   27, 27, 27, 86, 36, 36, 36, 36,163, 27, 30,  2,  2,  2,  2,  2,
+   36, 42, 42,  2,  2,  2,  2,  2, 36, 36,165, 27, 27, 27, 27, 27,
+   78, 80, 36, 36, 36, 36, 36, 36, 42, 42, 42, 56,  2,  2,  2,  2,
+    2, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,  7,  7,  7,  7,  7,
+   64, 63, 64, 36, 36, 36, 36, 63, 77, 78, 42, 76, 78, 56, 72,  2,
+    2, 42, 42, 42, 42, 42, 66, 58, 36, 36, 36, 63, 42, 42, 78, 42,
+   42, 42, 42,  7,  7,  7,  7,  7,  2,  2, 81, 80, 36, 36, 36, 36,
+   36, 63,  2, 36, 36, 36, 36, 36, 36, 81, 77, 42, 42, 42, 42, 76,
+   80, 36, 57,  2, 55, 42, 56, 78,  7,  7,  7,  7,  7, 57, 57,  2,
+   89, 27, 27, 27, 27, 27, 27, 27, 36, 36, 36, 36, 36, 36, 77, 78,
+   42, 77, 76, 42,  2,  2,  2, 64, 36, 36, 36, 36, 36, 36, 36, 63,
+   76, 77, 77, 77, 77, 77, 77, 77, 36, 36, 36, 81, 77, 77, 80, 36,
+   36, 77, 77, 42, 42, 42, 42, 42, 36, 36, 36, 36, 77, 78, 42, 42,
+   42, 77, 77, 77, 77, 77, 77, 76, 64, 64,  2,  2,  2,  2,  2,  2,
+   55, 42, 42, 42, 42, 42, 42, 42, 36, 36, 81, 77, 42, 42, 42, 42,
+   77, 42, 76, 64, 36, 57,  2,  2,  7,  7,  7,  7,  7,  2,  2, 64,
+   77, 78, 42, 42, 76, 76, 77, 78, 76, 42, 36, 65, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 36, 36, 81, 77, 42, 42, 42, 77, 77, 42, 78,
+   56,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 36, 36, 42, 42,
+   77, 78, 42, 42, 42, 76, 78, 78, 56,  2, 36, 36, 36, 36, 36, 36,
+   36, 36, 36, 36, 36, 63, 78, 77, 42, 42, 42, 78, 57,  2,  2,  2,
+   36, 36, 36, 36, 36, 36, 63, 78, 77, 42, 42, 78, 42, 42, 42, 42,
+    7,  7,  7,  7,  7, 27,  2, 88, 42, 42, 42, 42, 78, 56,  2,  2,
+   27, 27, 27, 27, 27, 27, 27, 86, 77, 77, 77, 77, 77, 78, 76, 64,
+   80, 78,  2,  2,  2,  2,  2,  2, 81, 77, 42, 42, 42, 42, 77, 77,
+   64, 65, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+   63, 42, 42, 42, 42, 64, 36, 36, 36, 63, 42, 42, 76, 63, 42, 56,
+    2,  2,  2, 55, 42, 42, 42, 42, 63, 42, 42, 76, 78, 42, 36, 36,
+   36, 36, 36, 36, 36, 42, 42, 42, 42, 42, 42, 76, 42,  2, 65,  2,
+   76, 42, 76, 76, 77, 77, 77, 77, 57,  2,  2,  2,  2,  2,  2,  2,
+   42, 42, 42, 42, 42, 42, 42, 78,  2, 36, 36, 36, 36, 36, 36, 36,
+   42, 42, 42, 42, 76, 42, 42, 42, 76, 42, 78, 42, 42, 42, 42, 42,
+   42, 42, 42, 63, 42, 42, 42, 42, 36, 36, 36, 36, 36, 77, 77, 77,
+   42, 76, 78, 78, 36, 36, 36, 36, 36, 36, 36, 36, 75, 36, 36, 36,
+   36, 63, 76, 96,  2,  2,  2,  2, 42, 81, 36, 36, 36, 36, 36, 36,
+   36, 36, 77, 42, 42, 42, 42, 77, 76, 56,  2,  2,  2,  2,  2,  2,
+    7,  7,  7,  7,  7, 42, 42, 42, 27, 27, 83, 60, 60, 60, 52, 20,
+  150, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 21,
+   64, 36, 36, 63, 42, 42, 42, 42, 36, 36, 36, 36, 36, 36, 36, 42,
+   42, 42, 42, 42, 42, 77, 78, 42, 42, 42, 56,  2,  2,  2,  2,  2,
+   42, 42, 42, 56,  2,  2, 60, 60, 39, 39, 88, 60, 60, 60, 60, 60,
+    7,  7,  7,  7,  7,168, 27, 27, 27, 86, 36, 36, 36, 36, 36, 36,
+   39, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 75,146,  2,
+   27, 27, 27, 30,  2,  2,  2,  2, 11, 11, 11, 11, 11, 32, 16, 16,
+   81, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 78,
+   42, 67, 39, 39, 39, 39, 39, 39, 39, 79, 42, 42, 42, 42, 42, 42,
+   77, 39, 94, 94, 94, 94, 94, 94, 36, 36, 36, 36, 36, 36, 46, 56,
+    7,  7,  7,  7,  7, 60, 60, 60, 60, 60,169, 78, 42, 60,169, 77,
+   77,170, 58, 58, 58, 74, 42, 42, 42, 69, 46, 42, 42, 42, 60, 60,
+   60, 60, 60, 60, 60, 42, 42, 60, 60, 42, 69, 60, 60, 60, 60, 60,
+   11, 11, 11, 11, 11, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 11,
+   11, 11, 11, 11, 11, 11, 11, 16, 11, 16, 16, 16, 16, 16, 16, 16,
+   16, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 16, 16, 16, 16, 16,
+   31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16,
+   16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16,
+   16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16,
+   16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11,
+   11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16,
+   11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 32, 16,  7,
+   42, 42, 42, 69, 60, 46, 42, 42, 42, 42, 42, 42, 42, 42, 69, 60,
+   60, 60, 46, 60, 60, 60, 60, 60, 60, 60, 69, 21,  2,  2,  2,  2,
+    2,  2,  2,  2,  2, 55, 42, 42, 16, 16, 16, 16, 16,123, 16, 16,
+   42, 42, 42, 67, 39, 39, 39, 39,  7,  7,  7,  7,  7,  7,  7, 70,
+   36, 36, 36, 36, 36, 36, 42, 42,  7,  7,  7,  7,  7,  7,  7,171,
+   36, 36, 36, 36, 36, 75, 42, 42,172,  7,  7,  7,  7,  7,  7, 84,
+   36, 63, 36, 64, 36, 36, 36, 42, 36, 36, 63, 42, 42, 42, 42, 75,
+   16, 16, 42, 42, 42, 67, 39, 39, 27, 27, 27, 27, 27, 27,145, 27,
+  173, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,145,
+   27, 27, 27, 27, 27, 27, 83, 60, 60, 60, 60, 60, 60, 25, 40, 40,
+    0,  0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13,
+   25, 25, 25, 21, 21,  9,  9,  9,  9, 22, 21, 18, 24, 16, 24,  5,
+    5,  5,  5, 22, 25, 18, 25,  0, 23, 23, 26, 21, 24, 26,  7, 20,
+   25,  1, 26, 24, 26, 25, 15, 15, 24, 15,  7, 19, 15, 21,  9, 25,
+    9,  5,  5, 25,  5,  9,  5,  7,  7,  7,  9,  8,  8,  5,  6,  6,
+   24, 24,  6, 24, 12, 12,  6,  5,  9, 21, 25,  9, 26, 12, 11, 11,
+    9,  6,  5, 21, 17, 17, 17, 26, 26, 23, 23, 12, 17, 12, 21, 12,
+   12, 21,  7, 21,  1,  1, 21, 23, 26, 26,  1, 21,  6,  7,  7, 12,
+   12,  7, 21,  7, 12,  1, 12,  6,  6, 12, 12, 26,  7, 26, 26,  7,
+   21,  1, 24,  7,  1, 12,  7,  6, 12, 10, 10, 10, 10, 12, 21,  6,
+   10,  7,  7, 10, 23,  7, 15, 26, 13, 21, 13,  7, 15,  7, 12, 23,
+   21, 26, 21, 15, 17,  7, 29,  7,  7, 22, 18, 18, 14, 14, 14,  7,
+   10, 21, 17, 21, 11, 12,  5,  6,  8,  8,  8, 24,  5, 24,  9, 24,
+   29, 29, 29,  1, 20, 19, 22, 20, 27, 28,  1, 29, 21, 20, 19, 21,
+   21, 16, 16, 21, 25, 22, 18, 21, 21, 29, 15,  6, 18,  6, 12, 11,
+    9, 26, 26,  9, 26,  5,  7,  5,  5, 26, 14,  9,  5, 14, 14, 15,
+   25, 26, 26, 22, 18, 26, 18, 25, 18, 22,  5, 12, 22, 21, 21, 22,
+   18, 17, 26,  6,  7, 14, 17, 22, 26, 14, 17,  6, 14,  6, 12, 24,
+   24,  6, 26, 15,  6, 21, 11, 21, 24,  9,  6,  9, 23, 26,  6, 10,
+    4,  4,  3,  3,  7, 25, 17, 16, 16, 22, 16, 16, 25, 17,  7,  1,
+   25, 24, 26,  1,  2,  2, 12, 15, 21, 14,  7, 15,  9, 12, 12, 17,
+   13, 15, 26, 10, 10,  1, 13, 23,  7, 13, 23, 15,  0,  1,  2,  3,
+    4,  5,  6,  7,  8,  9,  0, 10, 11, 12, 13,  0, 14,  0,  0,  0,
+    0,  0, 15,  0, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17,
+   18, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0, 20,  0, 21, 22, 23,  0,  0,
+    0, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 35,  0,  0,  0,
+    0, 36,  0, 37,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 38,  0,  0,  0,  0,  0,
+    0,  0,  0,  0, 39, 40,  0,  0,  0,  0,  0,  0, 41, 42, 43, 44,
+   45,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,
+    0,  0,  0,  0,  3,  0,  0,  0,  4,  5,  6,  7,  0,  8,  9, 10,
+    0, 11, 12, 13, 14, 15, 16, 17, 16, 18, 16, 19, 16, 19, 16, 19,
+    0, 19, 16, 20, 16, 19, 21, 19,  0, 22, 23, 24, 25, 26, 27, 28,
+   29, 30, 31,  0, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 33,
+    0,  0,  0,  0,  0,  0, 34,  0,  0, 35,  0,  0, 36,  0, 37,  0,
+    0,  0, 38, 39, 40, 41, 42, 43, 44, 45, 46,  0,  0, 47,  0,  0,
+    0, 48,  0,  0,  0, 49,  0,  0,  0,  0,  0,  0,  0, 50,  0, 51,
+    0, 52, 53,  0, 54,  0,  0,  0,  0,  0,  0, 55, 56, 57,  0,  0,
+    0,  0, 58,  0,  0, 59, 60, 61, 62, 63,  0,  0, 64, 65,  0,  0,
+    0, 66,  0,  0,  0,  0, 67,  0,  0,  0, 68,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0, 69,  0,  0,  0, 70,  0, 71,
+    0,  0, 72,  0,  0, 73,  0,  0,  0,  0,  0,  0,  0,  0, 74, 75,
+    0,  0,  0,  0, 76, 77,  0, 78, 79,  0,  0, 80, 81,  0, 82, 62,
+    0, 83, 84,  0,  0, 85, 86, 87,  0, 88,  0, 89,  0, 90,  0,  0,
+   51, 91, 51,  0, 92,  0, 93,  0,  0,  0, 81,  0,  0,  0, 94, 95,
+    0, 96, 97, 98, 99,  0,  0,  0,  0,  0, 51,  0,  0,  0,  0,100,
+  101,  0,  0,  0,  0,  0,  0,102,  0,  0,  0,  0,  0,  0,103,  0,
+    0,  0,  0,  0,  0,104,105,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,106,  0,  0,107,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,108,
+  109,  0,  0,110,  0,  0,  0,  0,  0,  0,111,  0,112,  0,105,  0,
+    0,  0,  0,  0,113,114,  0,  0,  0,  0,  0,  0,  0,115,  0,  0,
+    0,116,  0,  0,  0,117,  0,  0,  0,  0,  0,  0,  0,118,  0,119,
+    0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  0,  8,  0,
+    0,  0,  0,  9, 10, 11, 12,  0,  0,  0,  0, 13,  0,  0, 14, 15,
+    0, 16,  0, 17, 18,  0,  0, 19,  0, 20, 21,  0,  0,  0,  0,  0,
+   22, 23,  0, 24, 25,  0,  0, 26,  0,  0,  0, 27,  0,  0, 28, 29,
+   30, 31,  0,  0,  0, 32, 33, 34,  0,  0, 33,  0,  0, 35, 33,  0,
+    0,  0, 33, 36,  0,  0,  0,  0,  0, 37, 38,  0,  0,  0,  0,  0,
+    0, 39, 40,  0,  0,  0,  0,  0,  0, 41, 42,  0,  0,  0,  0, 43,
+    0, 44,  0,  0,  0, 45, 46,  0,  0,  0, 47,  0,  0,  0,  0,  0,
+    0, 48, 49,  0,  0,  0,  0, 50,  0,  0,  0, 51,  0, 52,  0, 53,
+    0,  0,  0,  0, 54,  0,  0,  0,  0, 55,  0, 56,  0,  0,  0,  0,
+   57, 58,  0,  0,  0, 59, 60, 61, 62,  0,  0,  0,  0, 63, 52,  0,
+   64, 65,  0,  0, 66,  0,  0,  0, 67, 68,  0,  0,  0, 69,  0, 70,
+   71, 72, 73, 74,  1, 75,  0, 76, 77, 78,  0,  0, 79, 80,  0,  0,
+    0, 81,  0,  0,  1,  1,  0,  0, 82,  0,  0, 83,  0,  0,  0,  0,
+   79, 84,  0, 85,  0,  0,  0,  0,  0, 80, 86,  0, 87,  0, 52,  0,
+    1, 80,  0,  0, 88,  0,  0, 89,  0,  0,  0,  0,  0, 90, 57,  0,
+    0,  0,  0,  0,  0, 91, 92,  0,  0, 86,  0,  0, 33,  0,  0, 93,
+    0,  0,  0,  0, 94,  0,  0,  0,  0, 49,  0,  0, 95,  0,  0,  0,
+    0, 96, 97,  0,  0, 98,  0,  0, 99,  0,  0,  0,100,  0,  0,  0,
+  101,  0,  0,  0,102,  0,  0,  0,  0,103,104, 95,  0,  0,105,  0,
+    0,  0, 86,  0,  0,106,  0,  0,  0,107,108,  0,  0,109,110,  0,
+    0,  0,  0,  0,  0,111,  0,  0,112,  0,  0,  0,  0,113, 33,  0,
+  114,115,116, 57,  0,  0,117, 35,  0,  0,118,  0,  0,  0,119,  0,
+    0,  0,  0,  0,  0,120,  0,  0,121,  0,  0,  0,  0,122, 90,  0,
+    0,  0,  0,  0, 57,  0,  0,  0,  0, 52,123,  0,  0,  0,  0,124,
+    0,  0,125,  0,  0,  0,  0,123,  0,  0,126,  0,  0,  0,  0,  0,
+   81,  0,  0,  0,  0,127,  0,  0,  0,128,  0,  0,  0,129,  0,130,
+    0,  0,  0,  0,131,132,133,  0,134,  0,135,  0,  0,  0,136,137,
+  138,  0, 79,  0,  0,  0,  0,  0, 35,  0,  0,  0,139,  0,  0,  0,
+  140,  0,  0,  0,141,  0,  0,  0,142,143,  0,144,  0,  0,145,  0,
+    0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  2,  3,  4,  5,  6,
+    7,  4,  4,  8,  9, 10,  1, 11, 12, 13, 14, 15, 16, 17, 18,  1,
+    1,  1, 19,  1,  0,  0, 20, 21, 22,  1, 23,  4, 21, 24, 25, 26,
+   27, 28, 29, 30,  0,  0,  1,  1, 31,  0,  0,  0, 32, 33, 34, 35,
+    1, 36, 37,  0,  0,  0,  0, 38,  1, 39, 14, 39, 40, 41, 42,  0,
+    0,  0, 43, 36, 44, 45, 21, 45, 46,  0,  0,  0, 19,  1, 21,  0,
+    0, 47,  0, 38, 48,  1,  1, 49, 49, 50,  0,  0, 51,  0,  0, 19,
+   52,  1,  0,  0, 38, 14,  4,  1,  1,  1, 53, 21, 43, 52, 54, 21,
+   35,  1,  0,  0,  0, 55,  0,  0,  0, 56, 57, 58,  0,  0,  0,  0,
+    0, 59,  0, 60,  0,  0,  0,  0, 61, 62,  0,  0, 63,  0,  0,  0,
+   64,  0,  0,  0, 65,  0,  0,  0, 66,  0,  0,  0, 67,  0,  0,  0,
+   68,  0,  0, 69, 70,  0, 71, 72, 73, 74, 75, 76,  0,  0,  0, 77,
+    0,  0,  0, 78, 79,  0,  0,  0,  0, 47,  0,  0,  0, 49,  0, 80,
+    0,  0,  0, 62,  0,  0, 63,  0,  0, 81,  0,  0, 82,  0,  0,  0,
+   83,  0,  0, 19, 84,  0, 62,  0,  0,  0,  0, 49,  1, 85,  1, 52,
+   15, 86, 36, 10, 21,  1,  1,  1,  1, 41,  1, 21, 87,  0,  0, 55,
+    0,  0,  0,  0, 19, 10,  1,  0,  0,  0,  0,  0, 88,  0,  0, 89,
+    0,  0, 88,  0,  0,  0,  0, 78,  0,  0, 90,  9, 12,  4, 91,  8,
+   92, 47,  0, 58, 50,  0, 21,  1, 21, 93, 94,  1,  1,  1,  1, 95,
+   96, 97, 98,  1, 99, 58, 81,100,101,  4, 58,  0,  0,  0,  0,  0,
+    0, 19, 50,  0,  0,  0,  0,  0,  0, 61,  0,  0,102,103,  0,  0,
+  104,  0,  0,  1,  1, 50,  0,  0,  0, 38,  0, 63,  0,  0,  0,  0,
+    0, 62,  0,  0,105, 68, 61,  0,  0,  0, 78,  0,  0,  0,106,107,
+   58, 38, 81,  0,  0,  0,  0,  0,  0,108,  1, 14,  4, 12, 84,  0,
+    0,  0,  0, 38, 90,  0,  0,  0,  0,109,  0,  0,110, 61,  0,111,
+    0,  0,  0,  1,  0,  0,  0,  0, 49, 50,  0,  0, 19, 58,  0,  0,
+  112, 51,  0,112, 14, 52,113, 41,  0,  0, 62,  0,  0, 61,  0,  0,
+  114,  0, 90,  0,  0,  0, 61, 62,  0,  0, 62,  0, 89,  0,  0,114,
+    0,  0,  0,  0,115,  0,  0,  0, 78, 55,  0, 38,  1, 58,  1, 58,
+    0,  0,  0,  0,  0, 88, 63, 89,  0,  0,116,  0,  0,  0, 55,  0,
+    0,  0,  0,116,  0,  0,  0,  0, 61,  0,  0,  0,  0, 79,  0, 61,
+    0,  0,  0,  0, 56,  0, 89, 80,  0,  0, 79,  0,  0,  0,  8, 92,
+    0,  0,  1, 90,  0,  0,117,  0,  0,  0,  0,  0,  0,118,  0,119,
+  120,121,122,  0,105,  4,123, 49, 23,  0,  0,  0, 38, 50, 38, 58,
+    0,  0,  1, 90,  1,  1,  1,  1, 39,  1, 48,106, 90,  0,  0,  0,
+    0,  1,  0,  0,  0,124,  0,  0,  0,113, 19, 59,  0, 38,  0, 81,
+    0,  0,  4,123,  0,  0,  0,  1,125,  0,  0,  0,  0,  0,230,230,
+  230,230,230,232,220,220,220,220,232,216,220,220,220,220,220,202,
+  202,220,220,220,220,202,202,220,220,220,  1,  1,  1,  1,  1,220,
+  220,220,220,230,230,230,230,240,230,220,220,220,230,230,230,220,
+  220,  0,230,230,230,220,220,220,220,230,232,220,220,230,233,234,
+  234,233,234,234,233,230,  0,  0,  0,230,  0,220,230,230,230,230,
+  220,230,230,230,222,220,230,230,220,220,230,222,228,230, 10, 11,
+   12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22,  0, 23,  0, 24,
+   25,  0,230,220,  0, 18, 30, 31, 32,  0,  0,  0,  0, 27, 28, 29,
+   30, 31, 32, 33, 34,230,230,220,220,230,220,230,230,220, 35,  0,
+    0,  0,  0,  0,230,230,230,  0,  0,230,230,  0,220,230,230,220,
+    0,  0,  0, 36,  0,  0,230,220,230,230,220,220,230,220,220,230,
+  220,230,220,230,230,  0,  0,220,  0,  0,230,230,  0,230,  0,230,
+  230,230,230,230,  0,  0,  0,220,220,220,230,220,220,220,230,230,
+    0,220, 27, 28, 29,230,  7,  0,  0,  0,  0,  9,  0,  0,  0,230,
+  220,230,230,  0,  0,  0,  0,  0,230,  0,  0, 84, 91,  0,  0,  0,
+    0,  9,  9,  0,  0,  0,  0,  0,  9,  0,103,103,  9,  0,107,107,
+  107,107,118,118,  9,  0,122,122,122,122,220,220,  0,  0,  0,220,
+    0,220,  0,216,  0,  0,  0,129,130,  0,132,  0,  0,  0,  0,  0,
+  130,130,130,130,  0,  0,130,  0,230,230,  9,  0,230,230,  0,  0,
+  220,  0,  0,  0,  0,  7,  0,  9,  9,  0,  9,  9,  0,  0,  0,230,
+    0,  0,  0,228,  0,  0,  0,222,230,220,220,  0,  0,  0,230,  0,
+    0,220,230,220,  0,220,230,230,230,234,  0,  0,  9,  9,  0,  0,
+    7,  0,230,230,230,  0,230,  0,  1,  1,  1,  0,  0,  0,230,234,
+  214,220,202,230,230,230,230,230,232,228,228,220,218,230,233,220,
+  230,220,230,230,  1,  1,  1,  1,  1,230,  0,  1,  1,230,220,230,
+    1,  1,  0,  0,218,228,232,222,224,224,  0,  8,  8,  0,  0,  0,
+    0,220,230,  0,230,230,220,  0,  0,230,  0,  0, 26,  0,  0,220,
+    0,230,230,  1,220,  0,  0,230,220,  0,  0,  0,220,220,  0,  0,
+  230,220,  0,  9,  7,  0,  0,  7,  9,  0,  0,  0,  9,  7,  6,  6,
+    0,  0,  0,  0,  1,  0,  0,216,216,  1,  1,  1,  0,  0,  0,226,
+  216,216,216,216,216,  0,220,220,220,  0,232,232,220,230,230,230,
+    7,  0, 16, 17, 17, 33, 17, 49, 17, 17, 84, 97,135,145, 26, 17,
+   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+   17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+   17,177,  0,  1,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+    3,  3,  3,  3,  3,  3,  4,  3,  3,  3,  3,  3,  5,  3,  3,  3,
+    3,  3,  6,  7,  8,  3,  3,  3,  3,  3,  9, 10, 11, 12, 13,  3,
+    3,  3,  3,  3,  3,  3,  3, 14,  3, 15,  3,  3,  3,  3,  3,  3,
+   16, 17, 18, 19, 20, 21,  3,  3,  3, 22, 23, 24,  3,  3,  3,  3,
+    3,  3, 25,  3,  3,  3,  3,  3,  3,  3,  3, 26,  3,  3, 27, 28,
+    0,  1,  0,  0,  0,  0,  0,  1,  0,  2,  0,  0,  0,  3,  0,  0,
+    0,  3,  0,  0,  0,  0,  0,  4,  0,  5,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  0,  0,  7,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  9,  0,  0,  0,  0,  0,
+    0,  9,  0,  9,  0,  0,  0,  0,  0,  0,  0, 10, 11, 12, 13,  0,
+    0, 14, 15, 16,  6,  0, 17, 18, 19, 19, 19, 20, 21, 22, 23, 24,
+   19, 25,  0, 26, 27, 19, 19, 28, 29, 30,  0, 31,  0,  0,  0,  8,
+    0,  0,  0,  0,  0,  0,  0, 19, 28,  0, 32, 33,  9, 34, 35, 19,
+    0,  0, 36, 37, 38, 39, 40, 19,  0, 41, 42, 43, 44, 31,  0,  1,
+   45, 42,  0,  0,  0,  0,  0, 32, 14, 14,  0,  0,  0,  0, 14,  0,
+    0, 46, 47, 47, 47, 47, 48, 49, 47, 47, 47, 47, 50, 51, 52, 53,
+   43, 21,  0,  0,  0,  0,  0,  0,  0, 54,  6, 55,  0, 14, 19,  1,
+    0,  0,  0,  0, 56, 57,  0,  0,  0,  0,  0, 19, 58, 31,  0,  0,
+    0,  0,  0,  0,  0, 59, 14,  0,  0,  0,  0,  1,  0,  2,  0,  0,
+    0,  3,  0,  0,  0, 60, 61,  0,  0,  0,  0,  0,  0,  0,  1,  0,
+    0,  0,  0,  0,  2,  3,  0,  4,  5,  0,  0,  6,  0,  0,  0,  7,
+    0,  0,  0,  1,  1,  0,  0,  8,  9,  0,  8,  9,  0,  0,  0,  0,
+    8,  9, 10, 11, 12,  0,  0,  0, 13,  0,  0,  0,  0, 14, 15, 16,
+   17,  0,  0,  0,  1,  0,  0, 18, 19,  0,  0,  0, 20,  0,  0,  0,
+    1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  0,  8, 21,  9,
+    0,  0, 22,  0,  0,  0,  0,  1,  0, 23, 24, 25,  0,  0, 26,  0,
+    0,  0,  8, 21, 27,  0,  1,  0,  0,  1,  1,  1,  1,  0,  1, 28,
+   29, 30,  0, 31, 32, 20,  1,  1,  0,  0,  0,  8, 21,  9,  1,  4,
+    5,  0,  0,  0, 33,  9,  0,  1,  1,  1,  0,  8, 21, 21, 21, 21,
+   34,  1, 35, 21, 21, 21,  9, 36,  0,  0, 37, 38,  1,  0, 39,  0,
+    0,  0,  1,  0,  1,  0,  0,  0,  0,  8, 21,  9,  1,  0,  0,  0,
+   40,  0,  8, 21, 21, 21, 21, 21, 21, 21, 21,  9,  0,  1,  1,  1,
+    1,  8, 21, 21, 21,  9,  0,  0,  0, 41,  0, 42, 43,  0,  0,  0,
+    1, 44,  0,  0,  0, 45,  8,  9,  1,  0,  0,  0,  8, 21, 21, 21,
+    9,  0,  1,  0,  1,  1,  8, 21, 21,  9,  0,  4,  5,  8,  9,  1,
+    0,  0, 16, 50, 84,118,136,152,186,187,187,187,187,187,187,187,
+  187,187,187,187,187,187,187,187,187,187,187,187,187,187, 12,  0,
+    1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 13, 13, 13,
+   13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 15, 16, 17, 18, 18, 18, 18, 18, 18,
+   18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 21, 22,
+   23, 24, 25, 26, 27, 28, 29, 30, 31, 19, 32, 33, 33, 33, 33, 33,
+   34, 19, 19, 19, 19, 19, 19, 35, 19, 36, 37, 38, 38, 38, 38, 38,
+   38, 39, 40, 19, 19, 19, 19, 19, 19, 19, 41, 42, 19, 19, 43, 19,
+   19, 19, 44, 45,  9, 46, 47, 48, 49, 50, 51, 52,  9,  9, 19, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 53, 19, 19, 53, 19, 13,
+   13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 54, 19, 19, 19,
+   19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 55,
+    0,  0,  1,  0,  1,  2,  3,  0,  1,  2,  3,  4,  5,  6,  7,  0,
+    1,  2,  2,  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, 32, 33, 33, 33, 34, 35, 35, 35, 35, 35, 36, 37, 38, 39,
+   40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,  2,  2, 51, 51, 52,
+   53, 54, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57,
+   57, 56, 56, 56, 56, 56, 56, 58, 59, 60, 61, 56, 62, 62, 63, 64,
+   65, 66, 67, 68, 69, 70, 56, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+   62, 62, 71, 62, 62, 62, 62, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+   73, 74, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 32,
+   32, 32, 32, 32, 32, 32, 32, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+   87, 62, 62, 62, 62, 88, 89, 89, 89, 90, 89, 91, 92, 93, 94, 95,
+   95, 96, 97, 87, 98, 99,100,101,102,103,104,105,105,105,  2,106,
+  107,108,109,110,111,112,113,114,115,116,117, 89,118,119,120,121,
+  122,123,124,125,126,127,128,129,130, 87,131,132,133,134, 87,135,
+  136,137,138,139,140,141,142,143,144,145,146, 87,147,148,149,150,
+  150,150,150,150,150,150,150,150,150,150, 87, 87, 87, 87, 87, 87,
+   87, 87, 87, 87, 87, 87,151,152,152,152,152,152,152,152,152,153,
+  153,153,153,153, 87, 87, 87, 87, 87,154, 87, 87, 87, 87, 87,155,
+  155,155,155,156,157,158,158, 87, 87,159, 87,160,161,162,163,164,
+  164,164,164,164,164,164,164,164,164,164,164,164,164,165,165,165,
+  165,164,164, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,166,167,
+  168,169,170,170,170, 87, 87,171,172, 87, 87, 87, 87, 87, 87, 56,
+   56, 56, 56, 56, 56,173, 56, 56, 56,174,175, 51, 56, 56, 87,176,
+  176,176,176,176,176, 87, 87, 87, 87, 87, 87, 87, 87,  2, 87,177,
+    6,178, 87, 87,179, 87, 87, 87,180, 87,181, 87,182, 87, 33,183,
+  183,184, 87, 87, 87, 87, 87, 56, 56, 56, 87, 89, 89, 87, 87, 56,
+   56, 56, 56,185, 87, 56, 56, 62, 62, 62, 62, 62, 87, 87, 87, 62,
+   87, 87, 87, 87, 87, 87, 87, 56, 87,186,186,  0,  1,  2,  2,  0,
+    0,  0,  0,  1,  2,  1,  2,  0,  0,  3,  3,  4,  5,  4,  5,  4,
+    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,  0,  0,  7,  0,  8,
+    8,  8,  8,  8,  8,  8,  9, 10, 11, 11, 11, 11, 11, 12, 11, 13,
+   13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13,
+   13, 13, 15, 16, 16, 16, 16, 16, 17, 18, 18, 18, 18, 18, 18, 19,
+   20, 21, 21, 22, 23, 21, 24, 21, 21, 21, 21, 21, 25, 21, 21, 26,
+   26, 26, 26, 26, 21, 21, 21, 27, 27, 27, 27, 28, 28, 28, 28, 29,
+   29, 29, 29, 30, 30, 26, 21, 21, 21, 21, 21, 21, 21, 31, 21, 32,
+   32, 32, 32, 32, 33, 34, 32, 35, 35, 35, 35, 35, 35, 35, 35, 36,
+   36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 38,
+   38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 40,
+   40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 42,
+   42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 44,
+   44, 44, 45, 44, 44, 44, 44, 46, 46, 46, 46, 46, 46, 46, 46, 47,
+   47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 47, 47, 49,
+   49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 52,
+   52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+   53, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 56,
+   56, 57, 57, 57, 57, 58, 57, 59, 59, 60, 61, 62, 62, 63, 63, 64,
+   64, 64, 64, 64, 64, 64, 64, 65, 66, 66, 66, 66, 66, 66, 66, 66,
+   66, 66, 55, 55, 55, 55, 55, 67, 67, 67, 67, 67, 68, 68, 68, 69,
+   69, 69, 69, 69, 69, 64, 64, 70, 70, 71, 71, 71, 71, 71, 71, 71,
+   71, 71,  8,  8,  8,  8,  8, 72, 72, 72, 72, 72, 72, 72, 72, 73,
+   73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 75, 76, 76, 76, 13,
+   50, 50, 50, 73, 77, 78, 79,  4,  4, 80,  4,  4, 81, 82, 83,  4,
+    4,  4, 84,  8,  8,  8,  8, 11, 11, 11, 11, 11, 11, 11, 11, 85,
+    0,  0,  0,  0,  0,  0, 86,  0,  4,  0,  0,  0,  8,  8,  8,  0,
+    0, 87, 88, 89,  0,  4,  4,  6,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 90, 90, 90, 90, 90, 90, 90, 90, 91,
+   91, 91, 91, 91, 91,  4,  4, 92, 92, 92, 92, 92, 92, 92, 92, 50,
+   50, 50, 93, 93, 93, 93, 93, 53, 53, 53, 53, 53, 53, 13, 13, 94,
+   94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,  0, 95,
+    0, 96, 97, 98, 99, 99, 99, 99,100,101,102,102,102,102,103,104,
+  104,104,105, 52, 52, 52, 52, 52,  0,104,104,  0,  0,  0,102, 52,
+   52,  0,  0,  0,  0, 52,106,  0,  0,  0,  0,  0,102,102,107,102,
+  102,102,102,102,108,  0,  0, 94, 94, 94, 94,  0,  0,  0,  0,109,
+  109,109,109,109,109,109,109,109,109,109,109,109,110,110,110,111,
+  111,111,111,111,111,111,111,111,111,111,111, 13, 13, 13, 13, 13,
+   13,112,112,112,112,112,112,  0,  0,113,  4,  4,  4,  4,  4,114,
+    4,  4,  4,  4,  4,  4,  4,115,115,115,  0,116,116,116,116,117,
+  117,117,117,117,117, 32, 32,118,118,119,120,120,120, 52, 52,121,
+  121,121,121,122,121, 49, 49,123,123,123,123,123,123, 49, 49,124,
+  124,124,124,124,124,125,125, 53, 53, 53,  4,  4,126,127, 54, 54,
+   54, 54, 54,125,125,125,125,128,128,128,128,128,128,128,128,  4,
+  129, 18, 18, 18, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+   21, 21,130, 21, 21, 21, 21,  8,  0,131,  0,  0,  0,  0, 21, 21,
+   21, 21, 21, 21, 21, 21,132,  0,  0,  1,  2,  1,  2,133,101,102,
+  134, 52, 52, 52, 52,  0,  0,135,135,135,135,135,135,135,135,  0,
+    0,  0,  0, 11, 11, 11, 11, 11,  0, 11, 11, 11,  0,  0,136,137,
+  137,138,138,138,138,139,  0,140,140,140,141,141,142,142,142,143,
+  143,144,144,144,144,144,144,145,145,145,145,145,146,146,146,147,
+  147,147,148,148,148,148,148,149,149,149,150,150,150,150,151,151,
+  151,151,151,152,152,152,152,153,153,153,153,153,153,153,153,154,
+  154,154,154,155,155,156,156,157,157,157,157,157,157,158,158,159,
+  159,160,160,161,161,161,161,162,162,163,163,163,163,163,163,164,
+  164,164,164,164,164,165,165,166,166,166,166,167,167,167,167,168,
+  168,168,168,169,169,170,170,171,171,171,171,171,171,171,171,172,
+  172,172,172,172,172,172,172,173,173,173,173,173,173,173,173,174,
+  174,174,174,175,175,175,175,175,175,175,175,175,175,175,175,176,
+  176,176,176,177, 21, 21, 21,178,178,178,179,179,179,179,180,180,
+  180,180,181,181,181,182,182,183,183,183,183,183,183,183,183,184,
+  184,184,184,184,185,185,185,186,186,186,186,186,187,187,187,188,
+  188,188,188,188,188,189, 43,190,190,190,190,190,190,190,190,191,
+  191,191,192,192,192,192,192,193,193,193,194,193,193,193,193,195,
+  195,195,195,195,195,195,195,196,196,196,196,196,196,196,196,197,
+  197,197,197,197,197,197,197,198,198,198,198,198,198,198,198,199,
+  199,199,199,199,199, 66, 66,200,200,200,200,200, 49, 49, 49,201,
+  201,201,201,201,201,201,201,202,202,202,202,202,202,202,202,203,
+  203,203,203,203,203,203,203,204,204,204,204,204,204,204,204,205,
+  205,205,205,205,205,205,205,206,206,206,206,206,207,207,207,207,
+  207,207, 55,208,208,208,208, 32, 32, 32, 32, 32, 32,188,188,209,
+  209,209,209,209,209,209,209,210,210,210,210,210,210,210,211,211,
+  211,211,211,211,211,211,211,212,212,212,212,212,212,213,213,213,
+  213,213,214,214,214,214,214,215,215,215,215,215,215,215,215,216,
+  216,216,216,216,216,216,216,110,110,110,110, 39, 39, 39, 39,217,
+  217,217,217,217,217,217,217,218,218,218,218,218,218,218,218,219,
+  219,219,219,219,219,219,219,220,220,220,220,220,220,220,220,221,
+  221,221,221,221,221,221,221,112,112,112,112,112,112,112,112,112,
+  112,112,112,222,222,222,223,223,223,223,223,223,224,224,224,225,
+  225,225,225,225,225,225,225,226,226,226,226,226,226,226,226,227,
+  227,227,227,227,227,227,227,227,227,228,228,228,228,228,228,229,
+  229,229,229,229,229,229,229,229,229,229,229,229,229,230, 94,231,
+  231,231,231,231,231,231,231,232,232,232,232,232,232,232,232,102,
+  102,102,102,102,102,102,102,233, 99, 99, 99, 99, 99, 99, 99, 99,
+   99, 99, 99, 99, 99, 99, 99, 99, 99,102,234, 99,235,102,236,236,
+  236,236,236,236,236,236,236,237,237,237,237,237,237,237,237,237,
+  237,  0,  0,  0,  0,  0,  0,  8,  8,  8,  8,  8,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,238,239,240,  0,241,  0,  0,  0,  0,  0,242,
+  242,242,242,242,242,242,242, 91, 91, 91, 13, 13, 13, 13, 13,243,
+  243,243,243,243,243,243,243,244,244,244,244,245,245,245,245,246,
+  246,246,246,246,246,246,246,247,247,247,247,247,247,247,247,248,
+  248,248,248,248,248,248,248,249,249,249,249,249,249,249,249,250,
+  250,250,250,250,250,250,250,251,  0,  0,  0,  0,  0,  0,  0,  8,
+    8,  8,  8,  8,  8,  8,  8,  0,  0,  0,  0,  1,  2,  2,  2,  2,
+    2,  3,  0,  0,  0,  4,  0,  2,  2,  2,  2,  2,  3,  2,  2,  2,
+    2,  5,  0,  2,  5,  6,  0,  7,  7,  7,  7,  8,  9,  8, 10,  8,
+   11,  8,  8,  8,  8,  8,  8, 12, 13, 13, 13, 14, 14, 14, 14, 14,
+   15, 14, 14, 16, 17, 17, 17, 17, 17, 17, 17, 18, 19, 19, 19, 19,
+   19, 19, 19, 20, 21, 20, 22, 20, 20, 23, 23, 20, 20, 20, 20, 22,
+   20, 24,  7,  7, 25, 20, 20, 26, 20, 20, 20, 20, 20, 20, 21, 27,
+   27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31,
+   31, 31, 31, 32, 20, 20, 20, 33, 33, 33, 33, 34, 35, 33, 33, 33,
+   36, 33, 33, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40,
+   40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44,
+   44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, 48,
+   48, 48, 48, 49, 49, 49, 49, 49, 50, 51, 49, 52, 52, 52, 52, 53,
+   53, 53, 53, 53, 53, 54, 53, 55, 55, 55, 55, 56, 56, 56, 56, 57,
+   57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 60,
+   60, 61, 62, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65,  0,  0, 66,
+   66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 69, 70, 71, 71, 71,
+   71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75,
+   75, 75, 75, 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 79,
+   79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, 82,  7,  7,  7, 83,
+    7, 84, 85,  0, 84, 86,  0,  2, 87, 88,  2,  2,  2,  2, 89, 90,
+   87, 91,  2,  2,  2, 92,  2,  2,  2,  2, 93,  0,  0,  0, 86,  1,
+    0,  0, 94,  0, 95, 96,  0,  4,  0,  0,  0,  0,  0,  0,  4, 97,
+   97, 97, 97, 98, 98, 98, 98, 13, 13, 13, 13, 99, 99, 99, 99,100,
+  100,100,100,  0,101,  0,  0,102,100,103,104,  0,  0,100,  0,105,
+  106,106,106,106,106,106,106,106,106,107,105,108,109,109,109,109,
+  109,109,109,109,109,110,108,111,111,111,111,112, 55, 55, 55, 55,
+   55, 55,113,109,109,109,110,109,109,  0,  0,114,114,114,114,115,
+  115,115,115,116,116,116,116,117,117,117,117, 96,  2,  2,  2,  2,
+    2, 94,  2,118,118,118,118,119,119,119,119,120,120,120,120,121,
+  121,121,121,121,121,121,122,123,123,123,123,124,124,124,124,124,
+  124,124,125,126,126,126,126,127,127,127,127,128,128,128,128,  2,
+    2,  3,  2,  2,129,130,  0,131,131,131,131,132, 17, 17, 18, 20,
+   20, 20,133,  7,  7,  7,134, 20, 20, 20, 23,  0,135,109,109,109,
+  109,109,136,137,137,137,137,  0,  0,  0,138,139,139,139,139,140,
+  140,140,140, 84,  0,  0,  0,141,141,141,141,142,142,142,142,143,
+  143,143,143,144,144,144,144,145,145,145,145,146,146,146,146,147,
+  147,147,147,148,148,148,148,149,149,149,149,150,150,150,150,151,
+  151,151,151,152,152,152,152,153,153,153,153,154,154,154,154,155,
+  155,155,155,156,156,156,156,157,157,157,157,158,158,158,158,159,
+  159,159,159,160,160,160,160,161,161,161,161,162,162,162,162,163,
+  163,163,163,164,164,164,164,165,165,165,165,166,166,166,166,167,
+  167,167,167,168,168,168,168,169,169,169,169,170,170,170,170,171,
+  171,171,171,172,172,172,172,173,173,173,173,174,174,174,174,175,
+  175,175,175,176,176,176,176,177,177,177,177,178, 20, 20, 20,179,
+  179,179,179,180,180,180,180,181,181,181,181,182,182,182,182,183,
+  183,183,183,184,184,184,184,185,185,185,185,186,186,186,186,187,
+  187,187,187,188,188,188,188,189,189,189,189,190, 45, 45, 45,191,
+  191,191,191,192,192,192,192,193,193,193,193,194,194,194,194,194,
+  194,195,194,196,196,196,196,197,197,197,197,198,198,198,198,199,
+  199,199,199,200,200,200,200,201,201,201,201,202,202,202,202,203,
+  203,203,203,204,204,204,204,205,205,205,205,206,206,206,206,207,
+  207,207,207,208,208,208,208,209,209,209,209,210,210,210,210,211,
+  211,211,211,212,212,212,212,213,213,213,213,214,214,214,214,215,
+  215,215,215,216,216,216,216,217,217,217,217,218,218,218,218,219,
+  219,219,219,220,220,220,220,221,221,221,221,222,222,222,222,223,
+  223,223,223,224,224,224,224,225,225,225,225,226,226,226,226,227,
+  227,227,227,228,228,228,228,229,229,229,229,230,230,230,230,231,
+  232,232,232,233,233,233,233,232,232,232,232,234,106,106,106,235,
+  106,106,106,106,236,109,109,237,237,237,237,238,238,238,238,  0,
+  239, 86,  0,  0,  0,239,  7, 82,138,  7,  0,  0,  0,240, 86,241,
+  241,241,241,242,242,242,242,243,243,243,243,244,244,244,244,245,
+  245,245,245,246,246,246,246,247,247,247,247,248,248,248,248,249,
+  249,249,249,250,  0,  0,  0,  0,  0,  0,  0,  0, 19, 19, 19, 19,
+   19, 19, 19, 19, 19, 19,  0,  0,  0, 19,  0, 19,  0,  0,  0,  0,
+    0, 26, 26,  1,  1,  1,  1,  9,  9,  9,  9,  0,  9,  9,  9,  9,
+    9,  0,  9,  9,  0,  9,  0,  9,  9, 55, 55, 55, 55, 55, 55,  6,
+    6,  6,  6,  6,  1,  1,  6,  6,  4,  4,  4,  4,  4,  4,  4,  4,
+   14, 14, 14, 14, 14, 14, 14,  3,  3,  3,  3,  3,  0,  3,  3,  0,
+    3,  3,  3,  3,  3,  3,  0,  3,  3,  3,  1,  1,  1,  3,  3,  1,
+    3,  3,  3, 37, 37, 37, 37, 38, 38, 38, 38, 64, 64, 64, 64, 90,
+   90, 90, 90, 95, 95, 95, 95,  3,  3,  0,  3,  7,  7,  7,  7,  7,
+    1,  1,  1,  1,  7,  7,  7,  0,  0,  7,  7,  5,  5,  5,  5, 11,
+   11, 11, 11, 10, 10, 10, 10, 21, 21, 21, 21, 22, 22, 22, 22, 23,
+   23, 23, 23, 16, 16, 16, 16, 20, 20, 20, 20, 36, 36, 36, 36, 24,
+   24, 24, 24, 24, 24, 24,  0, 18, 18, 18, 18, 25, 25, 25, 25, 25,
+    0,  0,  0,  0, 25, 25, 25, 33, 33, 33, 33,  8,  8,  8,  8,  8,
+    8,  8,  0, 12, 12, 12, 12, 30, 30, 30, 30, 29, 29, 29, 29, 28,
+   28, 28, 28, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35,  0,  0,
+    0, 35, 35, 45, 45, 45, 45, 44, 44, 44, 44, 44,  0,  0,  0, 43,
+   43, 43, 43, 46, 46, 46, 46, 31, 31, 31, 31, 32, 32,  0,  0, 32,
+    0, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 52, 52, 52, 52, 58,
+   58, 58, 58, 54, 54, 54, 54, 91, 91, 91, 91, 62, 62, 62, 62, 76,
+   76, 76, 76, 93, 93, 93, 93, 70, 70, 70, 70, 73, 73, 73, 73,  1,
+    1,  1,  0,  1,  0,  1,  1,  1,  0,  0,  0,  0,  1,  0,  0,  1,
+    1,  0,  0, 19, 19,  9,  9,  9,  9,  9,  6, 19,  9,  9,  9,  9,
+    9, 19, 19,  9,  9,  9, 19,  6, 19, 19, 19, 19, 19, 19,  9,  0,
+    0,  0, 19,  0,  0,  9,  0,  0,  0, 19, 19, 27, 27, 27, 27, 56,
+   56, 56, 56, 61, 61, 61, 61, 13, 13, 13, 13,  0, 13,  0, 13,  0,
+   13, 13, 13, 13, 13,  1,  1,  1,  1, 12, 12,  0, 15, 15, 15, 15,
+   15, 15, 15, 15,  1,  1,  0,  0, 17, 17, 17, 17, 17, 17, 17, 17,
+   17, 17,  0, 26, 26, 26, 26, 26, 12, 12, 12, 12, 12, 12,  0, 39,
+   39, 39, 39, 86, 86, 86, 86, 77, 77, 77, 77, 79, 79, 79, 79, 60,
+   60, 60, 60, 65, 65, 65, 65, 75, 75, 75, 75, 69, 69, 69, 69, 69,
+   69,  0, 69, 74, 74, 74, 74, 84, 84, 84, 84, 84, 84, 84,  0, 68,
+   68, 68, 68, 92, 92, 92, 92, 87, 87, 87, 87, 19,  9, 19, 19, 19,
+   19,  0,  0,  2,  2,  2,  2, 19, 19, 19,  4,  3,  3,  0,  0,  1,
+    1,  6,  6,  0,  0, 17, 17, 17, 17,  0,  0, 49, 49, 49, 49,  0,
+    1,  1,  1, 71, 71, 71, 71, 67, 67, 67, 67, 42, 42, 42, 42, 41,
+   41, 41, 41,118,118,118,118, 53, 53, 53, 53, 59, 59, 59, 59, 40,
+   40, 40, 40, 51, 51, 51, 51, 50, 50, 50, 50,135,135,135,135,106,
+  106,106,106,104,104,104,104,161,161,161,161,170,170,170,170,110,
+  110,110,110, 47, 47, 47, 47, 81, 81, 81, 81,120,120,120,120,116,
+  116,116,116,128,128,128,128, 66, 66, 66, 66, 72, 72, 72, 72,173,
+  173,173,173, 98, 98, 98, 98, 97, 97, 97, 97, 57, 57, 57, 57, 88,
+   88, 88, 88,117,117,117,117,112,112,112,112, 78, 78, 78, 78, 83,
+   83, 83, 83, 82, 82, 82, 82,122,122,122,122, 89, 89, 89, 89,130,
+  130,130,130,144,144,144,144,165,165,165,165,156,156,156,156,156,
+  156,  3,  3,147,147,147,147,148,148,148,148,158,158,158,158,153,
+  153,153,153,149,149,149,149, 94, 94, 94, 94, 85, 85, 85, 85,101,
+  101,101,101, 96, 96, 96, 96,111,111,111,111,100,100,100,100,100,
+   36, 36, 36,108,108,108,108,129,129,129,129,109,109,109,109,107,
+  107,107,107,107,107,107,  1,171,171,171,171,137,137,137,137,124,
+  124,124,124,123,123,123,123,114,114,114,114,102,102,102,102,126,
+  126,126,126,142,142,142,142,125,125,125,125,154,154,154,154,150,
+  150,150,150,141,141,141,141,140,140,140,140,121,121,121,121,169,
+  169,169,169,133,133,133,133,134,134,134,134,138,138,138,138,143,
+  143,143,143,175,175,175,175,145,145,145,145,163,163,163,163, 63,
+   63, 63, 63,157,157,157,157, 80, 80, 80, 80,127,127,127,127,166,
+  166,166,166,115,115,115,115,159,159,159,159,103,103,103,103,119,
+  119,119,119,167,167,167,167,146,146,146,146,172,172,172,172, 99,
+   99, 99, 99,136,139, 13, 13,155,155,155,155,136,136,136,136, 17,
+   15, 15, 15, 17, 17, 15, 15, 15, 17, 17, 17,139,139,139,139,105,
+  105,105,105,  0,  0,  0,  1,  0,  0,  1,  1,131,131,131,131,151,
+  151,151,151,160,160,160,160,152,152,152,152,164,164,164,164,168,
+  168,168,168,174,174,174,174,113,113,113,113,132,132,132,132, 15,
+    0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9,  9,  9,
+   10,  9, 11, 12, 13,  9,  9,  9, 14,  9,  9, 15,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 16,
+   17,  9,  9,  9,  9, 18,  9,  9,  9,  9,  9, 19, 20, 21,  9, 22,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9, 23,  9,  9,  9,  9,  9, 24,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 25,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+    9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 26,
+   27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,
+    4,  5,  6,  7,  8,  9, 10, 11, 12,  0,  0, 13, 14, 15, 16, 17,
+   18, 19, 20, 21, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 23,  0,  0, 24, 25, 26, 27, 28, 29, 30,  0,
+    0, 31, 32,  0, 33,  0, 34,  0, 35,  0,  0,  0,  0, 36, 37, 38,
+   39,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0, 40,  0,  0,  0,  0,  0,  0,  0,  0,  0, 41, 42,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0, 43, 44,  0, 45,  0,  0,  0,  0,  0,  0, 46, 47,  0,
+    0,  0,  0,  0, 48,  0, 49,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 50, 51,  0,  0,  0, 52,  0,  0, 53,  0,  0,
+    0,  0,  0,  0,  0, 54,  0,  0,  0,  0,  0,  0,  0, 55,  0,  0,
+    0,  0,  0,  0,  0, 56,  0,  0,  0,  0,  0,  0,  0,  0, 57,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0, 58, 59, 60, 61, 62, 63, 64, 65,  0,  0,  0,
+    0,  0,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0, 67, 68,  0, 69, 70,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
+   86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,
+  102,103,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,104,  0,  0,  0,  0,  0,  0,105,106,  0,107,  0,  0,
+    0,108,  0,109,  0,110,  0,111,112,113,  0,114,  0,  0,  0,115,
+    0,  0,  0,116,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,117,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,118,119,120,121,  0,122,123,124,125,126,  0,
+  127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,
+  143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,  0,
+    0,  0,158,159,160,161,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,162,  0,163,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,164,165,  0,  0,  0,  0,
+    0,  0,  0,166,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,167,  0,  0,  0,168,169,  0,  0,170,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,171,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,172,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,173,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,174,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,175,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,176,177,  0,  0,  0,  0,178,179,  0,  0,
+    0,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,
+  195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,
+  211,212,213,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,
+    4,
+};
+static const uint16_t _hb_ucd_u16[5104]=
+{
+     0,   0,   1,   2,   3,   4,   5,   6,   0,   0,   7,   8,   9,  10,  11,  12,
+    13,  13,  13,  14,  15,  13,  13,  16,  17,  18,  19,  20,  21,  22,  13,  23,
+    13,  13,  13,  24,  25,  11,  11,  11,  11,  26,  11,  27,  28,  29,  30,  31,
+    32,  32,  32,  32,  32,  32,  32,  33,  34,  35,  36,  11,  37,  38,  13,  39,
+     9,   9,   9,  11,  11,  11,  13,  13,  40,  13,  13,  13,  41,  13,  13,  13,
+    13,  13,  13,  35,   9,  42,  11,  11,  43,  44,  32,  45,  46,  47,  47,  48,
+    49,  50,  47,  47,  51,  32,  52,  53,  47,  47,  47,  47,  47,  54,  55,  56,
+    57,  58,  47,  32,  59,  47,  47,  47,  47,  47,  60,  53,  61,  47,  62,  63,
+    47,  64,  65,  66,  47,  67,  47,  47,  68,  69,  47,  47,  70,  32,  71,  32,
+    72,  47,  47,  73,  74,  75,  76,  77,  78,  47,  47,  79,  80,  81,  82,  83,
+    84,  47,  47,  85,  86,  87,  88,  89,  84,  47,  47,  79,  90,  47,  82,  91,
+    92,  47,  47,  93,  94,  95,  82,  96,  97,  47,  47,  98,  99, 100, 101, 102,
+   103,  47,  47, 104, 105, 106,  82, 107, 108,  47,  47,  93, 109, 110,  82, 111,
+   112,  47,  47, 113, 114, 115,  82, 116,  92,  47,  47,  47, 117, 118, 101, 119,
+    47,  47,  47, 120, 121, 122,  66,  66,  47,  47,  47, 123, 124, 125,  47,  47,
+   126, 127, 128, 129,  47,  47,  47, 130, 131,  32,  32, 132, 133, 134,  66,  66,
+    47,  47, 135, 136, 122, 137, 138, 139, 140, 141,   9,   9,   9,  11,  11, 142,
+    47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47, 143, 144, 145,
+    47, 146,   9,   9,   9,   9,   9, 147, 148,  47,  47,  47,  47,  47,  47,  47,
+    47,  47,  47,  47,  47,  47, 149,  47, 150, 151,  47,  47,  47,  47, 152, 153,
+    47, 154,  47, 155,  47, 156,  47, 156,  47,  47,  47, 157, 158, 159, 160, 145,
+   161, 160,  47,  47, 162,  47,  47,  47, 163,  47, 164,  47,  47,  47,  47,  47,
+    47,  47, 165, 166, 167,  47,  47,  47,  47,  47,  47,  47,  47, 168, 146, 146,
+    47, 169,  47,  47,  47, 170, 171, 172, 160, 160, 173, 174,  32,  32,  32,  32,
+   175,  47,  47, 176, 177, 122, 178, 179, 180,  47, 181,  61,  47,  47, 182, 183,
+    47,  47, 184, 185, 186,  61,  47, 187, 188,   9,   9,   9,  66, 189, 190, 191,
+    11,  11, 192,  27,  27,  27, 193, 194,  11, 195,  27,  27,  32,  32,  32,  32,
+    13,  13,  13,  13,  13,  13,  13,  13,  13, 196,  13,  13,  13,  13,  13,  13,
+   197, 197, 197, 197, 197, 198, 197,  11, 199, 199, 199, 200, 201, 202, 202, 201,
+   203, 204, 205, 206, 207, 208, 209, 210, 211,  27, 212, 212, 212, 213, 214,  32,
+   215, 216, 217, 218, 219, 145, 220, 220, 221, 222, 223, 146, 224, 225, 146, 226,
+   227, 227, 227, 227, 227, 227, 227, 227, 228, 146, 229, 146, 146, 146, 146, 230,
+   146, 231, 227, 232, 146, 233, 234, 146, 146, 146, 146, 146, 146, 146, 145, 145,
+   145, 235, 146, 146, 146, 146, 236, 145, 146, 146, 146, 146, 146, 146, 146, 146,
+   146, 146, 146, 237, 238, 146, 146, 239, 146, 146, 146, 146, 146, 146, 240, 146,
+   146, 146, 146, 146, 146, 146, 241, 242, 145, 243, 146, 146, 244, 227, 245, 227,
+   246, 247, 227, 227, 227, 248, 227, 249, 146, 146, 146, 227, 250, 146, 146, 146,
+     9,   9,   9,  11,  11,  11, 251, 252,  13,  13,  13,  13,  13,  13, 253, 254,
+    11,  11,  11,  47,  47,  47, 255, 256,  47,  47,  47,  47,  47,  47,  32,  32,
+   257, 258, 259, 260, 261, 262, 263, 263, 264, 265, 266, 267, 268,  47,  47,  47,
+    47, 269, 148,  47,  47,  47,  47, 270,  47, 271,  47,  47, 146, 146, 146,  47,
+   146, 146, 272, 146, 273, 274, 146, 146, 272, 146, 146, 274, 146, 146, 146, 146,
+    47,  47,  47,  47, 146, 146, 146, 146,  47, 275,  47,  47,  47,  47,  47,  47,
+    47, 146, 146, 146, 146,  47,  47, 187, 276,  47,  61,  47,  13,  13, 277, 278,
+    13, 279,  47,  47,  47,  47, 280, 281,  31, 282, 283, 284,  13,  13,  13, 285,
+   286, 287, 288, 289, 290, 291,   9, 292, 293,  47, 294, 295,  47,  47,  47, 296,
+   297,  47,  47, 298, 299, 160,  32, 300,  61,  47, 301,  47, 302, 303,  47,  47,
+    72,  47,  47, 304, 305, 306, 307,  61,  47,  47, 308, 309, 310, 311,  47, 312,
+    47,  47,  47, 313,  58, 314, 315, 316,  47,  47,  47,  11,  11, 317, 318,  11,
+    11,  11,  11,  11,  47,  47, 319, 160, 320, 320, 320, 320, 320, 320, 320, 320,
+   321, 321, 321, 321, 321, 321, 321, 321,  11, 322, 323,  47,  47,  47,  47,  47,
+    47,  47,  47, 324, 325, 326,  47,  47,  47,  47,  47, 327, 146,  47,  47,  47,
+    47, 328,  47,  47, 329, 146, 146, 330,  32, 331,  32, 332, 333, 334, 335,  47,
+    47,  47,  47,  47,  47,  47,  47, 336, 337,   2,   3,   4,   5, 338, 339, 340,
+    47, 341,  47,  47,  47,  47, 342, 343, 344, 145, 145, 345, 220, 220, 220, 346,
+   347, 146, 146, 146, 146, 146, 146, 348, 349, 349, 349, 349, 349, 349, 349, 349,
+    47,  47,  47,  47,  47,  47, 350, 145,  47,  47, 351,  47, 352,  47,  47,  60,
+    47, 353,  47,  47,  47, 354, 220, 220,   9,   9, 147,  11,  11,  47,  47,  47,
+    47,  47, 160,   9,   9, 147,  11,  11,  47,  47,  47,  47,  47,  47, 353,   9,
+     9, 355,  11,  11,  47,  47,  47,  47,  27,  27,  27,  27,  27,  27,  27,  27,
+    47,  47,  47,  47,  47, 356,  47, 357,  47,  47, 358, 145, 145, 145,  47, 359,
+    47, 360,  47, 353,  47,  47,  47,  47,  47,  47,  47, 361, 145, 145, 145, 145,
+   362,  47,  47, 363, 145,  66,  47, 364,  47, 365, 145, 145, 366,  47, 367,  66,
+    47,  47,  47, 368,  47, 369,  47, 369,  47, 368, 144, 145, 145, 145, 145, 145,
+     9,   9,   9,   9,  11,  11,  11, 370,  47,  47, 371, 160, 372,   9, 373,  11,
+   374, 227, 227, 227, 227, 227, 227, 227, 145, 145, 145, 145, 145, 145, 145, 145,
+    47,  47, 375,  47, 275, 376, 146, 377,  47, 365, 378,  47,  60, 379,  66,  47,
+   380,  66,  66,  47, 381, 145,  47,  47, 382,  47,  47, 363, 383, 384, 385, 386,
+   180,  47,  47, 387, 388,  47,  47, 160,  97,  47, 389, 390, 391,  47,  47, 392,
+   180,  47,  47, 393, 394, 395, 396, 145,  47,  47, 397, 398, 362,  32,  32,  32,
+    47,  47, 368,  47,  47, 399, 172, 160,  92,  47,  47, 113, 400, 401, 402,  32,
+    47,  47,  47, 403, 404, 405, 406,  32,  47,  47,  47, 407, 408, 409,  47,  47,
+    47,  47,  47, 410, 411, 160, 160, 160,  47,  47, 412, 413, 414, 415,  32,  32,
+    47,  47,  47, 416, 417, 160,  66,  66,  47,  47, 418, 419, 160, 160, 160, 160,
+    47, 420, 421, 422,  47,  47,  47,  47,  47,  47, 397, 423,  66,  66,  66,  66,
+     9,   9,   9,   9,  11,  11, 128, 424,  47,  47,  47, 425, 426, 160, 160, 160,
+    47,  47,  47,  47,  47, 427, 428, 429, 430,  47,  47, 431, 432, 433,  47,  47,
+   434, 435,  66,  47,  47,  47,  47,  47,  66,  66,  66,  66,  66,  66, 436, 429,
+    47,  47,  47,  47,  47,  47, 437, 160,  47,  47, 412, 438, 437, 128, 145, 439,
+    47, 156, 440, 441,  32,  32,  32,  32,  47,  47,  47, 362, 442, 160,  47,  47,
+   443, 444, 160,  47,  47, 445, 160, 160,  47,  47,  47,  47,  47,  47,  47, 446,
+   447,  47,  47, 448, 449, 450,  32,  32,  47,  47,  47,  47, 145, 451, 452, 453,
+   220, 220, 220, 220, 220, 220, 220,  66,  47,  47,  47,  47,  47,  47,  47, 437,
+    47,  47,  47, 209, 454,  32,  47,  47,  47, 455, 456, 160, 160, 160, 160, 160,
+    47,  47,  47,  47,  47,  47, 306,  47,  47,  47,  47,  47, 160,  47,  47, 457,
+    47,  47,  47, 458, 459, 460, 461,  47,  27,  27,  27,  27, 462,  47, 463, 160,
+     9,   9,   9,   9,   9,   9,  11,  11, 145, 464,   9, 465,  11,  11,  11,  11,
+    47,  47,  47,  47, 399, 466, 429, 429, 467, 468,  27,  27,  27,  27, 469, 470,
+    47, 471, 209, 209, 209, 209, 209, 209, 146, 146, 146, 146, 146, 146, 146, 472,
+   146, 146, 146, 146, 146, 146, 146, 227,  32,  32,  32,  32,  32, 146, 146, 146,
+   146, 146, 146, 146, 146, 146, 473, 474, 475, 146, 476, 146, 146, 146, 146, 146,
+   146, 146, 146, 146, 477, 146, 146, 146,   9, 478,  11, 479, 480,  11, 197,   9,
+   481, 482,   9, 483,  11,   9, 478,  11, 479, 480,  11, 197,   9, 481, 482,   9,
+   483,  11,   9, 478,  11, 479, 480,  11, 197,   9, 481, 482,   9, 483,  11,   9,
+   478,  11, 197,   9, 484, 485, 486, 487,  11, 488,   9, 489, 490, 491, 492,  11,
+   493,   9, 494,  11, 495, 160, 160, 160,  32,  32,  32, 496,  32,  32, 497, 498,
+   499, 500,  32,  32,  32,  32,  32,  32, 501,  11,  11,  11,  11,  11,  11,  11,
+    32,  32,  32,  27,  27,  27,  27,  27,  32,  32,  32,  32,  32,  32,  32,  32,
+    47,  47,  47, 502, 503, 146, 146, 146,  47,  47, 455,  32,  47,  47, 504, 505,
+    47,  47,  47,  47,  47,  47, 506, 160,  47,  47,  47,  47,  47,  47, 455, 507,
+    47,  47,  47,  47,  47,  47, 508, 509,  47,  47,  47,  47, 358,  32,  32,  32,
+     9,   9, 481,  11, 510, 306,  66,  66, 145, 145, 511, 512, 145, 145, 145, 145,
+   145, 145, 513, 145, 145, 145, 145, 145,  47,  47,  47,  47,  47,  47,  47, 227,
+   514, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 515,
+   146, 146, 146, 146, 146, 227, 227, 227, 209, 209, 209, 209, 209, 209, 209, 209,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+   939, 940, 941, 942, 946, 948,   0, 962, 969, 970, 971, 976,1001,1002,1003,1008,
+     0,1033,1040,1041,1042,1043,1047,   0,   0,1080,1081,1082,1086,1110,   0,   0,
+  1124,1125,1126,1127,1131,1133,   0,1147,1154,1155,1156,1161,1187,1188,1189,1193,
+     0,1219,1226,1227,1228,1229,1233,   0,   0,1267,1268,1269,1273,1298,   0,1303,
+   943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149,
+     0,   0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175,
+   991,1176, 993,1178, 994,1179,   0,   0,1004,1190,1005,1191,1006,1192,1014,1199,
+  1007,   0,   0,   0,1016,1201,1020,1206,   0,1022,1208,1025,1211,1023,1209,   0,
+     0,   0,   0,1032,1218,1037,1223,1035,1221,   0,   0,   0,1044,1230,1045,1231,
+  1049,1235,   0,   0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258,
+  1069,1255,1077,1264,1074,1261,   0,   0,1083,1270,1084,1271,1085,1272,1088,1275,
+  1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310,   0,
+  1053,1239,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1093,
+  1280,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 949,1134,1010,
+  1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366,   0,1320,1347,
+  1418,1419,1323,1350,   0,   0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424,
+  1202,   0,   0,   0, 987,1172,   0,   0,1031,1217,1321,1348,1322,1349,1338,1365,
+   950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238,
+  1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263,   0,   0, 997,1182,
+     0,   0,   0,   0,   0,   0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232,
+  1422,1423,1113,1301,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     8,   9,   0,  10,1425,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   7,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
+     0,   0,   0,   0,   0,1314,1427,   5,1434,1438,1443,   0,1450,   0,1455,1461,
+  1514,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1446,1458,1468,1476,1480,1486,
+  1517,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1489,1503,1494,1500,1508,   0,
+     0,   0,   0,1520,1521,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+  1526,1528,   0,1525,   0,   0,   0,1522,   0,   0,   0,   0,1536,1532,1539,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1534,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1556,   0,   0,   0,   0,   0,   0,
+  1548,1550,   0,1547,   0,   0,   0,1567,   0,   0,   0,   0,1558,1554,1561,   0,
+     0,   0,   0,   0,   0,   0,1568,1569,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,1529,1551,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+  1523,1545,1524,1546,   0,   0,1527,1549,   0,   0,1570,1571,1530,1552,1531,1553,
+     0,   0,1533,1555,1535,1557,1537,1559,   0,   0,1572,1573,1544,1566,1538,1560,
+  1540,1562,1541,1563,1542,1564,   0,   0,1543,1565,   0,   0,   0,   0,   0,   0,
+     0,   0,1606,1607,1609,1608,1610,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+  1613,   0,1611,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,1612,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1620,   0,   0,   0,   0,   0,   0,
+     0,1623,   0,   0,1624,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1614,1615,1616,1617,1618,1619,1621,1622,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1628,1629,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1625,1626,   0,1627,
+     0,   0,   0,1634,   0,   0,1635,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1630,1631,1632,   0,   0,1633,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1639,   0,   0,1638,1640,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1636,1637,   0,   0,
+     0,   0,   0,   0,1641,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1642,1644,1643,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1645,   0,   0,   0,   0,   0,   0,   0,
+  1646,   0,   0,   0,   0,   0,   0,1648,1649,   0,1647,1650,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1651,1653,1652,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1654,   0,1655,1657,1656,   0,
+     0,   0,   0,1659,   0,   0,   0,   0,   0,   0,   0,   0,   0,1660,   0,   0,
+     0,   0,1661,   0,   0,   0,   0,1662,   0,   0,   0,   0,1663,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1658,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,1664,   0,1665,1673,   0,1674,   0,   0,   0,   0,   0,   0,   0,
+     0,1666,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,1668,   0,   0,   0,   0,   0,   0,   0,   0,   0,1669,   0,   0,
+     0,   0,1670,   0,   0,   0,   0,1671,   0,   0,   0,   0,1672,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1667,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1675,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,1676,   0,1677,   0,1678,   0,1679,   0,1680,   0,
+     0,   0,1681,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1682,   0,1683,   0,   0,
+  1684,1685,   0,1686,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+   953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153,
+   966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171,
+   989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356,
+  1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214,
+  1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363,
+  1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251,
+  1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266,
+  1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287,
+  1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302,
+  1119,1308,1122,1311,1123,1312,1186,1260,1293,1305,   0,1394,   0,   0,   0,   0,
+   952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375,
+  1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353,
+  1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234,
+  1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403,
+  1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412,
+  1409,1414,1109,1297,1117,1306,1116,1304,1112,1300,   0,   0,   0,   0,   0,   0,
+  1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721,
+  1477,1478,1729,1731,1730,1732,   0,   0,1435,1436,1733,1735,1734,1736,   0,   0,
+  1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757,
+  1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776,
+  1495,1496,1777,1779,1778,1780,   0,   0,1451,1452,1781,1783,1782,1784,   0,   0,
+  1504,1505,1785,1788,1786,1789,1787,1790,   0,1459,   0,1791,   0,1792,   0,1793,
+  1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814,
+  1467,  21,1475,  22,1479,  23,1485,  24,1493,  27,1499,  28,1507,  29,   0,   0,
+  1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728,
+  1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764,
+  1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821,
+  1470,1469,1822,1474,1465,   0,1473,1825,1429,1428,1426,  12,1432,   0,  26,   0,
+     0,1315,1823,1484,1466,   0,1483,1829,1433,  13,1437,  14,1441,1826,1827,1828,
+  1488,1487,1513,  19,   0,   0,1492,1515,1445,1444,1442,  15,   0,1831,1832,1833,
+  1502,1501,1516,  25,1497,1498,1506,1518,1457,1456,1454,  17,1453,1313,  11,   3,
+     0,   0,1824,1512,1519,   0,1511,1830,1449,  16,1460,  18,1464,   4,   0,   0,
+    30,  31,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,  20,   0,   0,   0,   2,   6,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1834,1835,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1836,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1837,1839,1838,
+     0,   0,   0,   0,1840,   0,   0,   0,   0,1841,   0,   0,1842,   0,   0,   0,
+     0,   0,   0,   0,1843,   0,1844,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,1845,   0,   0,1846,   0,   0,1847,   0,1848,   0,   0,   0,   0,   0,   0,
+   937,   0,1850,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1849, 936, 938,
+  1851,1852,   0,   0,1853,1854,   0,   0,1855,1856,   0,   0,   0,   0,   0,   0,
+  1857,1858,   0,   0,1861,1862,   0,   0,1863,1864,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1867,1868,1869,1870,
+  1859,1860,1865,1866,   0,   0,   0,   0,   0,   0,1871,1872,1873,1874,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,  32,  33,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1875,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1877,   0,1878,   0,
+  1879,   0,1880,   0,1881,   0,1882,   0,1883,   0,1884,   0,1885,   0,1886,   0,
+  1887,   0,1888,   0,   0,1889,   0,1890,   0,1891,   0,   0,   0,   0,   0,   0,
+  1892,1893,   0,1894,1895,   0,1896,1897,   0,1898,1899,   0,1900,1901,   0,   0,
+     0,   0,   0,   0,1876,   0,   0,   0,   0,   0,   0,   0,   0,   0,1902,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1904,   0,1905,   0,
+  1906,   0,1907,   0,1908,   0,1909,   0,1910,   0,1911,   0,1912,   0,1913,   0,
+  1914,   0,1915,   0,   0,1916,   0,1917,   0,1918,   0,   0,   0,   0,   0,   0,
+  1919,1920,   0,1921,1922,   0,1923,1924,   0,1925,1926,   0,1927,1928,   0,   0,
+     0,   0,   0,   0,1903,   0,   0,1929,1930,1931,1932,   0,   0,   0,1933,   0,
+   710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601,
+   663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662,
+   810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168,
+   368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758,
+   811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585,
+   594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259,
+   313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697,
+   424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170,
+   193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330,
+   337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473,
+   683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603,
+   608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411,
+   479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583,
+   791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269,
+   377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510,
+   659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156,
+   153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210,   0,   0,
+   227,   0, 379,   0,   0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604,   0,
+   661,   0, 703,   0,   0, 735, 743,   0,   0,   0, 793, 794, 795, 808, 741, 773,
+   118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329,
+   335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548,
+   549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651,
+   690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623,   0,   0,
+   102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243,
+   250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362,
+   370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490,
+   493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586,
+   591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706,
+   709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848,
+   847, 857,  55,  65,  66, 883, 892, 916, 822, 824,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1586,   0,1605,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1602,1603,1934,1935,1574,1575,
+  1576,1577,1579,1580,1581,1583,1584,   0,1585,1587,1588,1589,1591,   0,1592,   0,
+  1593,1594,   0,1595,1596,   0,1598,1599,1600,1601,1604,1582,1578,1590,1597,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,1936,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,1937,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1938,   0,1939,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1940,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1941,1942,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1943,1944,   0,   0,   0,
+     0,   0,   0,1945,   0,1946,   0,   0,   0,   0,   0,   0,   0,   0,1947,   0,
+     0,1948,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,1950,   0,1949,1951,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1953,1952,   0,1954,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1955,1956,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1957,   0,   0,   0,   0,   0,   0,   0,
+     0,1958,1961,1959,1965,1960,1962,1964,1963,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,1967,1966,1968,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1969,1970,
+  1971,1972,1973,1974,1975,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,1976,1977,1978,1980,1979,
+  1981,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+   106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125,  34, 830, 130, 131,
+   132, 137, 827,  35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152,  37,
+   157, 158, 159, 160,  38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179,
+   181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195,
+   197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216,
+   153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244,
+   836, 837, 247, 248, 249, 246, 251,  39,  40, 253, 255, 255, 838, 257, 258, 259,
+   261, 839, 262, 263, 301, 264,  41, 266, 270, 272, 271, 841, 274, 842, 277, 276,
+   278, 281, 282,  42, 283, 284, 285, 286,  43, 843,  44, 289, 290, 291, 293, 934,
+   298, 845, 845, 621, 300, 300,  45, 852, 894, 302, 304,  46, 306, 309, 310, 312,
+   316,  48,  47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334,
+   335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361,
+   358, 356,  49, 363, 365, 367, 364,  50, 369, 371, 851, 376, 386, 378,  53, 381,
+    52,  51, 140, 141, 387, 382, 614,  78, 388, 389, 390, 394, 392, 856,  54, 399,
+   396, 402, 404, 858, 405, 401, 407,  55, 408, 409, 410, 413, 859, 415,  56, 417,
+   860, 418,  57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433,
+   437, 441, 438, 439, 442, 443, 864, 436, 449, 450,  58, 454, 453, 865, 447, 460,
+   866, 867, 461, 466, 465, 464,  59, 467, 470, 469, 472, 828, 475, 868, 478, 870,
+   483, 485, 486, 871, 488, 489, 872, 873, 495, 497,  60, 498,  61,  61, 504, 505,
+   507, 508, 511,  62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878,  63,  64,
+   528, 880, 879, 881, 882, 530, 531, 531, 533,  66, 534,  67,  68, 884, 536, 538,
+   541,  69, 885, 549, 886, 887, 556, 559,  70, 561, 562, 563, 888, 889, 889, 567,
+    71, 890, 570, 571,  72, 891, 577,  73, 581, 579, 582, 893, 587,  74, 590, 592,
+   596,  75, 895, 896,  76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611,
+   853,  77, 615, 616,  79, 617, 252, 902, 903, 854, 855, 621, 622, 731,  80, 627,
+   626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651,
+   638, 643, 644, 645, 905, 907, 906,  81, 653, 654, 656, 911, 657, 908,  82,  83,
+   909, 910,  84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675,  85,
+   677, 678,  86, 681, 682, 912, 685, 686,  87, 689,  36, 913, 914,  88,  89, 696,
+   702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728,
+   918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762,  90,
+   764, 922,  91, 775, 279, 780, 923, 925,  92,  93, 785, 926,  94, 927, 787, 787,
+   789, 928, 792,  95, 796, 797, 798, 800,  96, 929, 802, 804, 806,  97,  98, 807,
+   930,  99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935,   0,   0,
+};
+static const int16_t _hb_ucd_i16[92]=
+{
+      0,    0,    1,   -1,    2,    0,   -2,    0,    0,    2,    0,   -2,    0,   16,    0,  -16,
+      0,    1,   -1,    0,    3,    3,    3,   -3,   -3,   -3,    0, 2016,    0, 2527, 1923, 1914,
+   1918,    0, 2250,    0,    0,  138,    0,    7,   -7,    0,   -1,    1, 1824,    0, 2104,    0,
+   2108, 2106,    0, 2106, 1316,    0,   -1, -138,    8,    8,    8,    0,    7,    7,   -8,   -8,
+     -8,   -7,-1316,    1,   -1,    3,   -3,    1,    0,-1914,-1918,    0,    0,-1923,-1824,    0,
+      0,-2016,-2104,    0,    0,-2106,-2108,-2106,-2250,    0,-2527,    0,
+};
+
+static inline uint8_t _hb_ucd_gc (unsigned u)
+{
+  return u<1114112 ? _hb_ucd_u8[5296u+((_hb_ucd_u8[1168u+((_hb_ucd_u16[((_hb_ucd_u8[544u+((_hb_ucd_u8[((((((((u)>>1))>>3))>>3))>>4)])<<4)+((((((((u)>>1))>>3))>>3))&15)])<<3)+((((((u)>>1))>>3))&7)])<<3)+((((u)>>1))&7)])<<1)+((u)&1)] : 2;
+}
+static inline uint8_t _hb_ucd_ccc (unsigned u)
+{
+  return u<125259 ? _hb_ucd_u8[7322u+((_hb_ucd_u8[6738u+((_hb_ucd_u8[6258u+((_hb_ucd_u8[5890u+((_hb_ucd_u8[5644u+((((((((u)>>2))>>2))>>2))>>3)])<<3)+((((((((u)>>2))>>2))>>2))&7)])<<2)+((((((u)>>2))>>2))&3)])<<2)+((((u)>>2))&3)])<<2)+((u)&3)] : 0;
+}
+static inline uint8_t _hb_ucd_b4 (const uint8_t* a, unsigned i)
+{
+  return (a[i>>1]>>((i&1)<<2))&15;
+}
+static inline int16_t _hb_ucd_bmg (unsigned u)
+{
+  return u<65380 ? _hb_ucd_i16[((_hb_ucd_u8[8218u+((_hb_ucd_u8[7986u+((_hb_ucd_u8[7890u+((_hb_ucd_b4(_hb_ucd_u8+7826u,((((((((u)>>1))>>2))>>3))>>3)))<<3)+((((((((u)>>1))>>2))>>3))&7)])<<3)+((((((u)>>1))>>2))&7)])<<2)+((((u)>>1))&3)])<<1)+((u)&1)] : 0;
+}
+static inline uint8_t _hb_ucd_sc (unsigned u)
+{
+  return u<918016 ? _hb_ucd_u8[11655u+((_hb_ucd_u8[10647u+((_hb_ucd_u8[9151u+((_hb_ucd_u8[8703u+((_hb_ucd_u8[8495u+((_hb_ucd_b4(_hb_ucd_u8+8466u,((((((((((u)>>2))>>2))>>3))>>3))>>4)))<<4)+((((((((((u)>>2))>>2))>>3))>>3))&15)])<<3)+((((((((u)>>2))>>2))>>3))&7)])<<3)+((((((u)>>2))>>2))&7)])<<2)+((((u)>>2))&3)])<<2)+((u)&3)] : 2;
+}
+static inline uint16_t _hb_ucd_dm (unsigned u)
+{
+  return u<195102 ? _hb_ucd_u16[1680u+((_hb_ucd_u8[13041u+((_hb_ucd_u8[12659u+((((u)>>4))>>5)])<<5)+((((u)>>4))&31)])<<4)+((u)&15)] : 0;
+}
+
+
+#endif
 
 #endif /* HB_UCD_TABLE_HH */
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-unicode-emoji-table.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-unicode-emoji-table.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-unicode-emoji-table.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-unicode-emoji-table.hh	2026-04-17 19:09:35.000000000 +0000
@@ -7,13 +7,13 @@
  * on file with this header:
  *
  * # emoji-data.txt
- * # Date: 2024-05-01, 21:25:24 GMT
- * # © 2024 Unicode®, Inc.
+ * # Date: 2025-07-25, 17:54:31 GMT
+ * # © 2025 Unicode®, Inc.
  * # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
  * # For terms of use and license, see https://www.unicode.org/terms_of_use.html
  * #
  * # Emoji Data for UTS #51
- * # Used with Emoji Version 16.0 and subsequent minor revisions (if any)
+ * # Version: 17.0
  * #
  * # For documentation and usage, see https://www.unicode.org/reports/tr51
  */
@@ -23,54 +23,62 @@
 
 #include "hb-unicode.hh"
 
-static const uint8_t
-_hb_emoji_u8[464] =
+#include 
+
+static const uint8_t _hb_emoji_u8[624]=
 {
    16, 17, 17, 17, 50, 20, 21, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,118,152,
-    0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    2,  0,  3,  4,  0,  0,  5,  6,  0,  7,  0,  8,  9, 10, 11, 12,
-    0,  0, 13,  0,  0,  0, 14,  0, 15,  0,  0,  0,  0, 16,  0,  0,
-   17, 17, 18, 19, 20, 17, 17, 21, 17, 17, 22, 17, 23, 17, 24, 25,
-   26, 27, 28, 17, 17, 17,  0,  0, 17, 17, 17, 17, 17, 17, 17, 29,
-    0,  0,  0,  0,  0,  1,  0,  0,  0,  2,  3,  0,  0,  4,  0,  0,
-    5,  6,  0,  0,  7,  8,  0,  0,  8,  0,  9, 10,  0,  0, 11,  0,
-    0, 12, 13, 14, 15, 16, 16, 16, 17, 16, 16, 16, 18, 19, 20, 21,
-   22, 23,  0,  0,  0, 24,  0,  0, 25,  0, 26,  0,  0, 27,  0,  0,
-   28,  0,  0,  0, 16, 16, 16, 16, 29,  9,  0, 30, 31, 32, 16, 33,
-   34, 35, 36, 16, 16, 16, 16, 37, 16, 38, 39, 16, 16, 16, 40,  0,
-    0,  0,  0, 41,  0,  0, 42, 16, 43,  0, 44,  0, 45, 46, 16, 16,
-   47, 48, 49, 16, 16, 16, 16, 38,  0,  0,  0,  0,  0, 66,  0,  0,
-    0,  0,  0, 16,  0,  2,  0,  0,  4,  0,  0,  2,  0,  0,240,  3,
-    0,  6,  0,  0,  0,  0,  0, 12,  0,  1,  0,  0,  0,128,  0,  0,
-    0,254, 15,  7,  4,  0,  0,  0,  0, 12, 64,  0,  1,  0,  0,  0,
-    0,  0,  0,120,191,255,247,255,255,255,255,255, 63,  0,255,255,
-   63,255, 87, 32,  2,  1, 24,  0,144, 80,184,  0,248,  0,  0,  0,
-    0,  0,224,  0,  2,  0,  1,128,  0,  0, 48,  0,224,  0,  0, 24,
-    0,  0, 33,  0,  0,  0,  1, 32,  0,  0,128,  2,  0,224,  0,  0,
-    0,240,  3,192,  0, 64,254,  7,  0,224,255,255, 63,  0,  0,  0,
-  254,255,  0,  4,  0,128,252,247,  0,254,255,255,255,255,255,  7,
-  255,255,255, 63,192,255,255,255,255,255,  0,  0,  0,  0,240,255,
-    0,  0,224,255,  0,240,  0,  0,  0,255,  0,252,  0,255,  0,  0,
-    0,192,255,255,  0,240,255,255,255,255,255,247,191,255,255,255,
+    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,
+    2,  3,  0,  0,  4,  0,  5,  0,  0,  0,  0,  0,  6,  0,  0,  7,
+    0,  0,  0,  8,  0,  0,  9, 10, 11, 12, 13, 14, 15, 16, 17,  0,
+    0,  0,  0,  0, 18,  0,  0,  0,  0,  0,  0,  0, 19, 20,  0,  0,
+   21,  0,  0,  0,  0,  0,  0,  0,  0,  0, 22,  0,  0,  0,  0,  0,
+   23,  0, 24, 25,  0, 26, 27, 28, 29, 30, 31, 31, 32, 31, 33, 34,
+   31, 31, 31, 35, 36, 37, 38, 39, 31, 40, 31, 41,  0,  0,  0, 42,
+   43, 44, 45, 46, 47, 48, 31, 31,  0, 49, 31, 31,  0,  0,  0,  0,
+   31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 36,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 66,  0,  0,
+    0,  0,  0,  0,  0,  0,  0, 16,  0,  2,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  4,  0,  0,  2,  0,  0,240,  3,  0,  6,  0,  0,
+    0,  0,  0, 12,  0,  1,  0,  0,  0,128,  0,  0,  0,254, 15,  7,
+    4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 64,  0,
+    1,  0,  0,  0,  0,  0,  0,120, 31, 64, 50, 33, 77,196,  0,  7,
+    5,255, 15,128,105,  1,  0,200,  0,  0,252, 26,131, 12,  3, 96,
+   48,193, 26,  0,  0,  6,191, 39, 36,191, 84, 32,  2,  1, 24,  0,
+  144, 80,184,  0, 24,  0,  0,  0,  0,  0,224,  0,  2,  0,  1,128,
+    0,  0,  0,  0,  0,  0, 48,  0,224,  0,  0, 24,  0,  0,  0,  0,
+    0,  0, 33,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1, 32,
+    0,  0,128,  2,  0,  0,  0,  0, 16,  0,  0,  0,  0,240,  0,  0,
+    0,  0,240,255,  0,128,  1,  0,  1,128,  1,  0,  0,  0,192,255,
+    0,  0,  0,  0,  0,  0,  3,192,  0, 64,254,  7,  0,192,255,255,
+  255,255,255,255, 63,  0,  0,  0,254,255,  0,  4,  0,128,252,247,
+    0,254,255,255,192,255,255,255,255,255,255,255,255,255,255,255,
+  255,255,255,255,243,255,255,255,255,255,207,206,255,255,255,255,
+  255,255,255,255,255,255,185,  7,255,255,255,255,255,255,255,191,
+  255,255,255,255,255,255,255, 63,  0,126,255,255,255,128,249,  7,
+  128, 60, 97,  0, 48,  1,  6, 16, 28,  0, 14,112, 10,129,  8,252,
+  255,255,  0,  0,  0,  0,  0,  0, 63,248,231,255, 63,250,249,255,
+    0,  0,  0,252,255,255,255,255,  0,240,  0,  0,  0,  0,  0,  0,
+    0,255,  0,252,  0,  0,  0,  0,  0,255,  0,  0,  0,192,  0,240,
+  252,255,  0,254,255,255,255,255,  0,240,255,255,255,255,255,247,
+  191,255,255,255,255,255,255,255,  0,  0,  0,255,  0,192,255,255,
 };
 
-static inline unsigned
-_hb_emoji_b4 (const uint8_t* a, unsigned i)
+static inline uint8_t _hb_emoji_b4 (const uint8_t* a, unsigned i)
 {
-  return (a[i>>1]>>((i&1u)<<2))&15u;
+  return (a[i>>1]>>((i&1)<<2))&15;
 }
-static inline unsigned
-_hb_emoji_b1 (const uint8_t* a, unsigned i)
+static inline uint8_t _hb_emoji_b1 (const uint8_t* a, unsigned i)
 {
-  return (a[i>>3]>>((i&7u)<<0))&1u;
+  return (a[i>>3]>>((i&7)<<0))&1;
 }
-static inline uint_fast8_t
-_hb_emoji_is_Extended_Pictographic (unsigned u)
+static inline uint8_t _hb_emoji_is_Extended_Pictographic (unsigned u)
 {
-  return u<131070u?_hb_emoji_b1(264+_hb_emoji_u8,((_hb_emoji_u8[144+(((_hb_emoji_u8[64+(((_hb_emoji_b4(_hb_emoji_u8,u>>5>>2>>3))<<3)+((u>>5>>2)&7u))])<<2)+((u>>5)&3u))])<<5)+((u)&31u)):0;
+  return u<131070 ? _hb_emoji_b1(_hb_emoji_u8+224u,((_hb_emoji_u8[64u+((_hb_emoji_b4(_hb_emoji_u8,((((u)>>6))>>4)))<<4)+((((u)>>6))&15)])<<6)+((u)&63)) : 0;
 }
 
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-unicode.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-unicode.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-unicode.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-unicode.hh	2026-04-17 19:09:35.000000000 +0000
@@ -241,6 +241,57 @@
     }
   }
 
+  static hb_codepoint_t
+  vertical_char_for (hb_codepoint_t u)
+  {
+    switch (u >> 8)
+    {
+      case 0x20: switch (u) {
+        case 0x2013u: return 0xfe32u; // EN DASH
+        case 0x2014u: return 0xfe31u; // EM DASH
+        case 0x2025u: return 0xfe30u; // TWO DOT LEADER
+        case 0x2026u: return 0xfe19u; // HORIZONTAL ELLIPSIS
+      } break;
+      case 0x30: switch (u) {
+        case 0x3001u: return 0xfe11u; // IDEOGRAPHIC COMMA
+        case 0x3002u: return 0xfe12u; // IDEOGRAPHIC FULL STOP
+        case 0x3008u: return 0xfe3fu; // LEFT ANGLE BRACKET
+        case 0x3009u: return 0xfe40u; // RIGHT ANGLE BRACKET
+        case 0x300au: return 0xfe3du; // LEFT DOUBLE ANGLE BRACKET
+        case 0x300bu: return 0xfe3eu; // RIGHT DOUBLE ANGLE BRACKET
+        case 0x300cu: return 0xfe41u; // LEFT CORNER BRACKET
+        case 0x300du: return 0xfe42u; // RIGHT CORNER BRACKET
+        case 0x300eu: return 0xfe43u; // LEFT WHITE CORNER BRACKET
+        case 0x300fu: return 0xfe44u; // RIGHT WHITE CORNER BRACKET
+        case 0x3010u: return 0xfe3bu; // LEFT BLACK LENTICULAR BRACKET
+        case 0x3011u: return 0xfe3cu; // RIGHT BLACK LENTICULAR BRACKET
+        case 0x3014u: return 0xfe39u; // LEFT TORTOISE SHELL BRACKET
+        case 0x3015u: return 0xfe3au; // RIGHT TORTOISE SHELL BRACKET
+        case 0x3016u: return 0xfe17u; // LEFT WHITE LENTICULAR BRACKET
+        case 0x3017u: return 0xfe18u; // RIGHT WHITE LENTICULAR BRACKET
+      } break;
+      case 0xfe: switch (u) {
+        case 0xfe4fu: return 0xfe34u; // WAVY LOW LINE
+      } break;
+      case 0xff: switch (u) {
+        case 0xff01u: return 0xfe15u; // FULLWIDTH EXCLAMATION MARK
+        case 0xff08u: return 0xfe35u; // FULLWIDTH LEFT PARENTHESIS
+        case 0xff09u: return 0xfe36u; // FULLWIDTH RIGHT PARENTHESIS
+        case 0xff0cu: return 0xfe10u; // FULLWIDTH COMMA
+        case 0xff1au: return 0xfe13u; // FULLWIDTH COLON
+        case 0xff1bu: return 0xfe14u; // FULLWIDTH SEMICOLON
+        case 0xff1fu: return 0xfe16u; // FULLWIDTH QUESTION MARK
+        case 0xff3bu: return 0xfe47u; // FULLWIDTH LEFT SQUARE BRACKET
+        case 0xff3du: return 0xfe48u; // FULLWIDTH RIGHT SQUARE BRACKET
+        case 0xff3fu: return 0xfe33u; // FULLWIDTH LOW LINE
+        case 0xff5bu: return 0xfe37u; // FULLWIDTH LEFT CURLY BRACKET
+        case 0xff5du: return 0xfe38u; // FULLWIDTH RIGHT CURLY BRACKET
+      } break;
+    }
+
+    return u;
+  }
+
   struct {
 #define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_func_t name;
     HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-utf.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-utf.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-utf.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-utf.hh	2026-04-17 19:09:35.000000000 +0000
@@ -37,7 +37,7 @@
   typedef uint8_t codepoint_t;
   static constexpr unsigned max_len = 4;
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   next (const codepoint_t *text,
         const codepoint_t *end,
         hb_codepoint_t *unicode,
@@ -106,7 +106,7 @@
     return text;
   }
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   prev (const codepoint_t *text,
         const codepoint_t *start,
         hb_codepoint_t *unicode,
@@ -185,7 +185,7 @@
   typedef TCodepoint codepoint_t;
   static constexpr unsigned max_len = 2;
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   next (const codepoint_t *text,
         const codepoint_t *end,
         hb_codepoint_t *unicode,
@@ -217,7 +217,7 @@
     return text;
   }
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   prev (const codepoint_t *text,
         const codepoint_t *start,
         hb_codepoint_t *unicode,
@@ -294,7 +294,7 @@
   typedef TCodepoint codepoint_t;
   static constexpr unsigned max_len = 1;
 
-  static const TCodepoint *
+  static inline const TCodepoint *
   next (const TCodepoint *text,
         const TCodepoint *end HB_UNUSED,
         hb_codepoint_t *unicode,
@@ -306,7 +306,7 @@
     return text;
   }
 
-  static const TCodepoint *
+  static inline const TCodepoint *
   prev (const TCodepoint *text,
         const TCodepoint *start HB_UNUSED,
         hb_codepoint_t *unicode,
@@ -353,7 +353,7 @@
   typedef uint8_t codepoint_t;
   static constexpr unsigned max_len = 1;
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   next (const codepoint_t *text,
         const codepoint_t *end HB_UNUSED,
         hb_codepoint_t *unicode,
@@ -363,7 +363,7 @@
     return text;
   }
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   prev (const codepoint_t *text,
         const codepoint_t *start HB_UNUSED,
         hb_codepoint_t *unicode,
@@ -405,7 +405,7 @@
   typedef uint8_t codepoint_t;
   static constexpr unsigned max_len = 1;
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   next (const codepoint_t *text,
         const codepoint_t *end HB_UNUSED,
         hb_codepoint_t *unicode,
@@ -417,7 +417,7 @@
     return text;
   }
 
-  static const codepoint_t *
+  static inline const codepoint_t *
   prev (const codepoint_t *text,
         const codepoint_t *start HB_UNUSED,
         hb_codepoint_t *unicode,
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-vector.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-vector.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-vector.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-vector.hh	2026-04-17 19:09:35.000000000 +0000
@@ -32,6 +32,12 @@
 #include "hb-meta.hh"
 #include "hb-null.hh"
 
+// Change to 1 to force inline vector allocs, to see callsite in malloc-stats tool.
+#if 0
+#define HB_ALWAYS_INLINE_VECTOR_ALLOCS HB_ALWAYS_INLINE
+#else
+#define HB_ALWAYS_INLINE_VECTOR_ALLOCS
+#endif
 
 template 
@@ -45,6 +51,7 @@
   using c_array_t = typename std::conditional, hb_array_t>::type;
 
   hb_vector_t () = default;
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
   hb_vector_t (std::initializer_list lst) : hb_vector_t ()
   {
     alloc (lst.size (), true);
@@ -57,18 +64,21 @@
   {
     extend (o);
   }
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
   hb_vector_t (const hb_vector_t &o) : hb_vector_t ()
   {
     alloc_exact (o.length);
     if (unlikely (in_error ())) return;
     copy_array (o.as_array ());
   }
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
   hb_vector_t (array_t o) : hb_vector_t ()
   {
     alloc_exact (o.length);
     if (unlikely (in_error ())) return;
     copy_array (o);
   }
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
   hb_vector_t (c_array_t o) : hb_vector_t ()
   {
     alloc_exact (o.length);
@@ -84,8 +94,29 @@
   }
   ~hb_vector_t () { fini (); }
 
+  template 
+  void
+  set_storage (Type (&array)[n])
+  { set_storage (array, n); }
+  void
+  set_storage (hb_array_t array)
+  { set_storage (array.arrayZ, array.length); }
+  template 
+  void
+  set_storage (Type *array, unsigned n)
+  {
+    assert (allocated == 0);
+    assert (length == 0);
+
+    arrayZ = array;
+    length = n;
+  }
+
   template 
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
   void extend (const Iterable &o)
   {
     auto iter = hb_iter (o);
@@ -106,12 +137,14 @@
         push_has_room (*iter++);
     }
   }
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
   void extend (array_t o)
   {
     alloc (length + o.length);
     if (unlikely (in_error ())) return;
     copy_array (o);
   }
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
   void extend (c_array_t o)
   {
     alloc (length + o.length);
@@ -136,10 +169,7 @@
 
   void fini ()
   {
-    /* We allow a hack to make the vector point to a foreign array
-     * by the user. In that case length/arrayZ are non-zero but
-     * allocated is zero. Don't free anything. */
-    if (allocated)
+    if (is_owned ())
     {
       shrink_vector (0);
       hb_free (arrayZ);
@@ -147,11 +177,13 @@
     init ();
   }
 
-  void reset ()
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
+  hb_vector_t &reset ()
   {
     if (unlikely (in_error ()))
       reset_error ();
     resize (0);
+    return *this;
   }
 
   friend void swap (hb_vector_t& a, hb_vector_t& b) noexcept
@@ -237,13 +269,16 @@
   Type * operator  + (unsigned int i) { return arrayZ + i; }
   const Type * operator  + (unsigned int i) const { return arrayZ + i; }
 
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
   Type *push ()
   {
     if (unlikely (!resize (length + 1)))
       return std::addressof (Crap (Type));
     return std::addressof (arrayZ[length - 1]);
   }
-  template  Type *push (Args&&... args)
+  template 
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
+  Type *push (Args&&... args)
   {
     if (unlikely ((int) length >= allocated && !alloc (length + 1)))
       // If push failed to allocate then don't copy v, since this may cause
@@ -253,13 +288,20 @@
 
     return push_has_room (std::forward (args)...);
   }
-  template  Type *push_has_room (Args&&... args)
+  template 
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
+  Type *push_has_room (Args&&... args)
   {
     /* Emplace. */
     Type *p = std::addressof (arrayZ[length++]);
     return new (p) Type (std::forward (args)...);
   }
 
+  bool is_owned () const
+  {
+    return allocated != 0 && allocated != -1;
+  }
+
   bool in_error () const { return allocated < 0; }
   void set_error ()
   {
@@ -271,27 +313,40 @@
     assert (allocated < 0);
     allocated = -(allocated + 1);
   }
+  void ensure_error ()
+  {
+    if (!in_error ())
+      set_error ();
+  }
 
-  template 
   Type *
-  realloc_vector (unsigned new_allocated, hb_priority<0>)
+  _realloc (unsigned new_allocated)
   {
     if (!new_allocated)
     {
-      hb_free (arrayZ);
+      if (is_owned ())
+        hb_free (arrayZ);
       return nullptr;
     }
+    if (!allocated && arrayZ)
+    {
+      /* If we have a non-null arrayZ but allocated is 0, then we are
+       * reallocating from a foreign array. */
+      Type *new_array = (Type *) hb_malloc (new_allocated * sizeof (Type));
+      if (unlikely (!new_array))
+        return nullptr;
+      hb_memcpy ((void *) new_array, (const void *) arrayZ, length * sizeof (Type));
+      return new_array;
+    }
     return (Type *) hb_realloc (arrayZ, new_allocated * sizeof (Type));
   }
-  template 
   Type *
-  realloc_vector (unsigned new_allocated, hb_priority<0>)
+  _malloc_move (unsigned new_allocated)
   {
     if (!new_allocated)
     {
-      hb_free (arrayZ);
+      if (is_owned ())
+        hb_free (arrayZ);
       return nullptr;
     }
     Type *new_array = (Type *) hb_malloc (new_allocated * sizeof (Type));
@@ -303,22 +358,33 @@
         new_array[i] = std::move (arrayZ[i]);
         arrayZ[i].~Type ();
       }
-      hb_free (arrayZ);
+      if (is_owned ())
+        hb_free (arrayZ);
     }
     return new_array;
   }
+
+  template 
+  Type *
+  realloc_vector (unsigned new_allocated, hb_priority<0>)
+  {
+    return _realloc (new_allocated);
+  }
+  template 
+  Type *
+  realloc_vector (unsigned new_allocated, hb_priority<0>)
+  {
+    return _malloc_move (new_allocated);
+  }
   /* Specialization for types that can be moved using realloc(). */
   template 
   Type *
   realloc_vector (unsigned new_allocated, hb_priority<1>)
   {
-    if (!new_allocated)
-    {
-      hb_free (arrayZ);
-      return nullptr;
-    }
-    return (Type *) hb_realloc (arrayZ, new_allocated * sizeof (Type));
+    return _realloc (new_allocated);
   }
 
   template  other)
   {
-    assert ((int) (length + other.length) <= allocated);
     hb_memcpy ((void *) (arrayZ + length), (const void *) other.arrayZ, other.length * item_size);
     length += other.length;
   }
@@ -362,7 +427,6 @@
   void
   copy_array (hb_array_t other)
   {
-    assert ((int) (length + other.length) <= allocated);
     hb_memcpy ((void *) (arrayZ + length), (const void *) other.arrayZ, other.length * item_size);
     length += other.length;
   }
@@ -372,7 +436,6 @@
   void
   copy_array (hb_array_t other)
   {
-    assert ((int) (length + other.length) <= allocated);
     for (unsigned i = 0; i < other.length; i++)
       new (std::addressof (arrayZ[length + i])) Type (other.arrayZ[i]);
     length += other.length;
@@ -385,7 +448,6 @@
   void
   copy_array (hb_array_t other)
   {
-    assert ((int) (length + other.length) <= allocated);
     for (unsigned i = 0; i < other.length; i++)
     {
       new (std::addressof (arrayZ[length + i])) Type ();
@@ -398,12 +460,12 @@
   shrink_vector (unsigned size)
   {
     assert (size <= length);
-    if (!std::is_trivially_destructible::value)
+    if (!hb_is_trivially_destructible(Type))
     {
       unsigned count = length - size;
-      Type *p = arrayZ + length - 1;
+      Type *p = arrayZ + length;
       while (count--)
-        p--->~Type ();
+        (--p)->~Type ();
     }
     length = size;
   }
@@ -416,6 +478,7 @@
   }
 
   /* Allocate for size but don't adjust length. */
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
   bool alloc (unsigned int size, bool exact=false)
   {
     if (unlikely (in_error ()))
@@ -471,17 +534,64 @@
 
     return true;
   }
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
   bool alloc_exact (unsigned int size)
   {
     return alloc (size, true);
   }
 
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
   void clear ()
   {
     resize (0);
   }
 
-  bool resize (int size_, bool initialize = true, bool exact = false)
+  template 
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
+  bool allocate_from_pool (allocator_t *allocator, unsigned size, unsigned int initialize = true)
+  {
+    if (allocator)
+    {
+      assert (!length && !allocated);
+      arrayZ = (Type *) allocator->alloc (size * sizeof (Type), alignof (Type));
+      if (unlikely (!arrayZ))
+      {
+        set_error ();
+        return false;
+      }
+      if (initialize)
+        grow_vector (size, hb_prioritize);
+      else
+        length = size;
+      return true;
+    }
+    return resize_full ((int) size, initialize, true);
+  }
+
+  template 
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
+  bool duplicate_vector_from_pool (allocator_t *allocator, const hb_vector_t &other)
+  {
+    if (unlikely (!allocate_from_pool (allocator, other.length, false)))
+      return false;
+    length = 0;
+    copy_array (other.as_array ());
+    return true;
+  }
+
+  template 
+  void shrink_back_to_pool (allocator_t *allocator, int size)
+  {
+    unsigned orig_length = length;
+
+    shrink (size, false);
+
+    if (allocator && !is_owned ())
+      allocator->discard (arrayZ + length, (orig_length - length) * sizeof (Type));
+  }
+
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
+  bool resize_full (int size_, bool initialize, bool exact)
   {
     unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
     if (!alloc (size, exact))
@@ -501,9 +611,20 @@
     length = size;
     return true;
   }
-  bool resize_exact (int size_, bool initialize = true)
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
+  bool resize (int size_)
+  {
+    return resize_full (size_, true, false);
+  }
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
+  bool resize_dirty (int size_)
+  {
+    return resize_full (size_, false, false);
+  }
+  HB_ALWAYS_INLINE_VECTOR_ALLOCS
+  bool resize_exact (int size_)
   {
-    return resize (size_, initialize, true);
+    return resize_full (size_, true, true);
   }
 
   Type pop ()
@@ -544,7 +665,7 @@
 
     shrink_vector (size);
 
-    if (shrink_memory)
+    if (is_owned () && shrink_memory)
       alloc_exact (size); /* To force shrinking memory if needed. */
   }
 
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-version.h openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-version.h
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb-version.h	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb-version.h	2026-04-17 19:09:35.000000000 +0000
@@ -41,26 +41,26 @@
  *
  * The major component of the library version available at compile-time.
  */
-#define HB_VERSION_MAJOR 11
+#define HB_VERSION_MAJOR 12
 /**
  * HB_VERSION_MINOR:
  *
  * The minor component of the library version available at compile-time.
  */
-#define HB_VERSION_MINOR 2
+#define HB_VERSION_MINOR 3
 /**
  * HB_VERSION_MICRO:
  *
  * The micro component of the library version available at compile-time.
  */
-#define HB_VERSION_MICRO 0
+#define HB_VERSION_MICRO 2
 
 /**
  * HB_VERSION_STRING:
  *
  * A string literal containing the library version available at compile-time.
  */
-#define HB_VERSION_STRING "11.2.0"
+#define HB_VERSION_STRING "12.3.2"
 
 /**
  * HB_VERSION_ATLEAST:
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb.hh openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb.hh
--- openjdk-21-21.0.10+7/src/java.desktop/share/native/libharfbuzz/hb.hh	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/share/native/libharfbuzz/hb.hh	2026-04-17 19:09:35.000000000 +0000
@@ -89,7 +89,6 @@
 #pragma GCC diagnostic error   "-Wstring-conversion"
 #pragma GCC diagnostic error   "-Wswitch-enum"
 #pragma GCC diagnostic error   "-Wtautological-overlap-compare"
-#pragma GCC diagnostic error   "-Wuninitialized"
 #pragma GCC diagnostic error   "-Wunneeded-internal-declaration"
 #pragma GCC diagnostic error   "-Wunused"
 #pragma GCC diagnostic error   "-Wunused-local-typedefs"
@@ -110,11 +109,21 @@
 #pragma GCC diagnostic warning "-Wformat-signedness"
 #pragma GCC diagnostic warning "-Wignored-pragma-optimize"
 #pragma GCC diagnostic warning "-Wlogical-op"
-#pragma GCC diagnostic warning "-Wmaybe-uninitialized"
 #pragma GCC diagnostic warning "-Wmissing-format-attribute"
+#pragma GCC diagnostic warning "-Wpessimizing-move"
 #pragma GCC diagnostic warning "-Wundef"
 #pragma GCC diagnostic warning "-Wunsafe-loop-optimizations"
 #pragma GCC diagnostic warning "-Wunused-but-set-variable"
+#ifdef __clang__
+// The following are too buggy on gcc
+// https://github.com/harfbuzz/harfbuzz/issues/5589
+// https://github.com/harfbuzz/harfbuzz/pull/5367
+#pragma GCC diagnostic warning "-Wmaybe-uninitialized"
+#pragma GCC diagnostic warning "-Wuninitialized"
+#else
+#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
+#pragma GCC diagnostic ignored "-Wuninitialized"
+#endif
 #endif
 
 /* Ignored currently, but should be fixed at some point. */
@@ -136,6 +145,7 @@
 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
 #pragma GCC diagnostic ignored "-Wformat-zero-length"
 #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+#pragma GCC diagnostic ignored "-Wold-style-cast"
 #pragma GCC diagnostic ignored "-Wpacked" // Erratic impl in clang
 #pragma GCC diagnostic ignored "-Wrange-loop-analysis" // https://github.com/harfbuzz/harfbuzz/issues/2834
 #pragma GCC diagnostic ignored "-Wstrict-aliasing"
@@ -239,6 +249,8 @@
 // clang defines it so no need.
 #ifdef __has_builtin
 #define hb_has_builtin __has_builtin
+#elif defined(_MSC_VER)
+#define hb_has_builtin(x) 0
 #else
 #define hb_has_builtin(x) ((defined(__GNUC__) && __GNUC__ >= 5))
 #endif
@@ -314,6 +326,10 @@
 #endif
 #endif
 
+#ifndef HB_HOT
+#define HB_HOT __attribute__((hot))
+#endif
+
 /*
  * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411
  * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch
@@ -553,4 +569,13 @@
 #include "hb-vector.hh" // Requires: hb-array hb-null
 #include "hb-object.hh" // Requires: hb-atomic hb-mutex hb-vector
 
+
+/* Our src/test-*.cc use hb_assert(), such that it's not compiled out under NDEBUG.
+ * https://github.com/harfbuzz/harfbuzz/issues/5418 */
+#define hb_always_assert(x) \
+        HB_STMT_START { \
+          if (!(x)) { fprintf(stderr, "Assertion failed: %s, at %s:%d\n", #x, __FILE__, __LINE__); abort(); } \
+        } HB_STMT_END
+
+
 #endif /* HB_HH */
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java openjdk-21-21.0.11+10/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java
--- openjdk-21-21.0.10+7/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java	2026-04-17 19:09:35.000000000 +0000
@@ -142,8 +142,6 @@
 import sun.awt.X11GraphicsEnvironment;
 import sun.awt.XSettings;
 import sun.awt.datatransfer.DataTransferer;
-import sun.awt.screencast.ScreencastHelper;
-import sun.awt.screencast.XdgDesktopPortal;
 import sun.awt.util.PerformanceLogger;
 import sun.awt.util.ThreadGroupUtils;
 import sun.font.FontConfigManager;
@@ -1567,21 +1565,16 @@
         awtLock();
         try {
             if (numberOfButtons == 0) {
-                if (XdgDesktopPortal.isRemoteDesktop()
-                        && ScreencastHelper.isAvailable()) {
+                numberOfButtons = getNumberOfButtonsImpl();
+                numberOfButtons = (numberOfButtons > MAX_BUTTONS_SUPPORTED) ? MAX_BUTTONS_SUPPORTED : numberOfButtons;
+                //4th and 5th buttons are for wheel and shouldn't be reported as buttons.
+                //If we have more than 3 physical buttons and a wheel, we report N-2 buttons.
+                //If we have 3 physical buttons and a wheel, we report 3 buttons.
+                //If we have 1,2,3 physical buttons, we report it as is i.e. 1,2 or 3 respectively.
+                if (numberOfButtons >= 5) {
+                    numberOfButtons -= 2;
+                } else if (numberOfButtons == 4 || numberOfButtons == 5) {
                     numberOfButtons = 3;
-                } else {
-                    numberOfButtons = getNumberOfButtonsImpl();
-                    numberOfButtons = (numberOfButtons > MAX_BUTTONS_SUPPORTED) ? MAX_BUTTONS_SUPPORTED : numberOfButtons;
-                    //4th and 5th buttons are for wheel and shouldn't be reported as buttons.
-                    //If we have more than 3 physical buttons and a wheel, we report N-2 buttons.
-                    //If we have 3 physical buttons and a wheel, we report 3 buttons.
-                    //If we have 1,2,3 physical buttons, we report it as is i.e. 1,2 or 3 respectively.
-                    if (numberOfButtons >= 5) {
-                        numberOfButtons -= 2;
-                    } else if (numberOfButtons == 4 || numberOfButtons == 5) {
-                        numberOfButtons = 3;
-                    }
                 }
             }
             //Assume don't have to re-query the number again and again.
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/unix/classes/sun/awt/screencast/ScreencastHelper.java openjdk-21-21.0.11+10/src/java.desktop/unix/classes/sun/awt/screencast/ScreencastHelper.java
--- openjdk-21-21.0.10+7/src/java.desktop/unix/classes/sun/awt/screencast/ScreencastHelper.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/unix/classes/sun/awt/screencast/ScreencastHelper.java	2026-04-17 19:09:35.000000000 +0000
@@ -66,9 +66,11 @@
     private static final int DELAY_BEFORE_SESSION_CLOSE = 2000;
 
     private static volatile TimerTask timerTask = null;
-    private static final Timer timerCloseSession
-            = new Timer("auto-close screencast session", true);
 
+    private static class TimerHolder {
+        private static final Timer timerCloseSession =
+                new Timer("auto-close screencast session", true);
+    }
 
     private ScreencastHelper() {}
 
@@ -152,7 +154,7 @@
             }
         };
 
-        timerCloseSession.schedule(timerTask, DELAY_BEFORE_SESSION_CLOSE);
+        TimerHolder.timerCloseSession.schedule(timerTask, DELAY_BEFORE_SESSION_CLOSE);
     }
 
     public static synchronized void getRGBPixels(
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/unix/classes/sun/awt/screencast/TokenStorage.java openjdk-21-21.0.11+10/src/java.desktop/unix/classes/sun/awt/screencast/TokenStorage.java
--- openjdk-21-21.0.10+7/src/java.desktop/unix/classes/sun/awt/screencast/TokenStorage.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/unix/classes/sun/awt/screencast/TokenStorage.java	2026-04-17 19:09:35.000000000 +0000
@@ -252,6 +252,7 @@
     }
 
     private static WatchService watchService;
+    private static volatile boolean isWatcherThreadStarted = false;
 
     private static void setupWatch() {
         doPrivilegedRunnable(() -> {
@@ -273,10 +274,6 @@
                 }
             }
         });
-
-        if (watchService != null) {
-            new WatcherThread(watchService).start();
-        }
     }
 
     // called from native
@@ -353,7 +350,27 @@
         return true;
     }
 
+    private static void startWatcherThreadIfNeeded() {
+        if (!isWatcherThreadStarted) {
+            // not sure if the double-checked locking is actually needed here
+            // the getTokens is only called from ScreencastHelper#getRGBPixels
+            // and ScreencastHelper#remoteDesktop* methods (which are synchronized),
+            // but it may change later.
+            synchronized (TokenStorage.class) {
+                if (!isWatcherThreadStarted) {
+                    readTokens(PROPS_PATH);
+                    if (watchService != null) {
+                        new WatcherThread(watchService).start();
+                    }
+                    isWatcherThreadStarted = true;
+                }
+            }
+        }
+    }
+
     static Set getTokens(List affectedScreenBounds) {
+        startWatcherThreadIfNeeded();
+
         // We need an ordered set to store tokens
         // with exact matches at the beginning.
         LinkedHashSet result = new LinkedHashSet<>();
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c openjdk-21-21.0.11+10/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c
--- openjdk-21-21.0.10+7/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c	2026-04-17 19:09:35.000000000 +0000
@@ -42,7 +42,6 @@
 #include "debug_assert.h"
 
 static void *gtk3_libhandle = NULL;
-static void *gthread_libhandle = NULL;
 
 static void transform_detail_string (const gchar *detail,
                                      GtkStyleContext *context);
@@ -79,15 +78,6 @@
     return result;
 }
 
-static void* dl_symbol_gthread(const char* name)
-{
-    void* result = dlsym(gthread_libhandle, name);
-    if (!result)
-        longjmp(j, NO_SYMBOL_EXCEPTION);
-
-    return result;
-}
-
 gboolean gtk3_check(const char* lib_name, gboolean load)
 {
     if (gtk3_libhandle != NULL) {
@@ -264,13 +254,6 @@
         return FALSE;
     }
 
-    gthread_libhandle = dlopen(GTHREAD_LIB_VERSIONED, RTLD_LAZY | RTLD_LOCAL);
-    if (gthread_libhandle == NULL) {
-        gthread_libhandle = dlopen(GTHREAD_LIB, RTLD_LAZY | RTLD_LOCAL);
-        if (gthread_libhandle == NULL)
-            return FALSE;
-    }
-
     if (setjmp(j) == 0)
     {
         fp_gtk_check_version = dl_symbol("gtk_check_version");
@@ -637,9 +620,6 @@
         dlclose(gtk3_libhandle);
         gtk3_libhandle = NULL;
 
-        dlclose(gthread_libhandle);
-        gthread_libhandle = NULL;
-
         return NULL;
     }
 
@@ -738,7 +718,6 @@
 
     dlerror();
     dlclose(gtk3_libhandle);
-    dlclose(gthread_libhandle);
     if ((gtk3_error = dlerror()) != NULL)
     {
         return FALSE;
diff -Nru openjdk-21-21.0.10+7/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp openjdk-21-21.0.11+10/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp
--- openjdk-21-21.0.10+7/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp	2026-04-17 19:09:35.000000000 +0000
@@ -2036,28 +2036,13 @@
 
 BOOL AwtToolkit::GetScreenInsets(int screenNum, RECT * rect)
 {
-    /* if primary display */
-    if (screenNum == 0) {
-        RECT rRW;
-        if (::SystemParametersInfo(SPI_GETWORKAREA,0,(void *) &rRW,0) == TRUE) {
-            rect->top = rRW.top;
-            rect->left = rRW.left;
-            rect->bottom = ::GetSystemMetrics(SM_CYSCREEN) - rRW.bottom;
-            rect->right = ::GetSystemMetrics(SM_CXSCREEN) - rRW.right;
-            return TRUE;
-        }
-    }
-    /* if additional display */
-    else {
-        MONITORINFO *miInfo;
-        miInfo = AwtWin32GraphicsDevice::GetMonitorInfo(screenNum);
-        if (miInfo) {
-            rect->top = miInfo->rcWork.top    - miInfo->rcMonitor.top;
-            rect->left = miInfo->rcWork.left   - miInfo->rcMonitor.left;
-            rect->bottom = miInfo->rcMonitor.bottom - miInfo->rcWork.bottom;
-            rect->right = miInfo->rcMonitor.right - miInfo->rcWork.right;
-            return TRUE;
-        }
+    MONITORINFO *miInfo = AwtWin32GraphicsDevice::GetMonitorInfo(screenNum);
+    if (miInfo) {
+        rect->top = miInfo->rcWork.top - miInfo->rcMonitor.top;
+        rect->left = miInfo->rcWork.left - miInfo->rcMonitor.left;
+        rect->bottom = miInfo->rcMonitor.bottom - miInfo->rcWork.bottom;
+        rect->right = miInfo->rcMonitor.right - miInfo->rcWork.right;
+        return TRUE;
     }
     return FALSE;
 }
diff -Nru openjdk-21-21.0.10+7/src/java.net.http/share/classes/jdk/internal/net/http/common/SSLFlowDelegate.java openjdk-21-21.0.11+10/src/java.net.http/share/classes/jdk/internal/net/http/common/SSLFlowDelegate.java
--- openjdk-21-21.0.10+7/src/java.net.http/share/classes/jdk/internal/net/http/common/SSLFlowDelegate.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.net.http/share/classes/jdk/internal/net/http/common/SSLFlowDelegate.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2026, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -273,7 +273,7 @@
 
         final SequentialScheduler scheduler;
         volatile ByteBuffer readBuf;
-        volatile boolean completing;
+        boolean completing;
         final ReentrantLock readBufferLock = new ReentrantLock();
         final Logger debugr = Utils.getDebugLogger(this::dbgString, Utils.DEBUG);
 
@@ -301,6 +301,11 @@
             return enterReadScheduling();
         }
 
+        @Override
+        public boolean closing() {
+            return closeNotifyReceived();
+        }
+
         public final String dbgString() {
             return "SSL Reader(" + tubeName + ")";
         }
@@ -505,7 +510,7 @@
                         if (result.handshaking()) {
                             handshaking = true;
                             if (debugr.on()) debugr.log("handshaking");
-                            if (doHandshake(result, READER)) continue; // need unwrap
+                            if (doHandshake(result.handshakeStatus(), READER)) continue; // need unwrap
                             else break; // doHandshake will have triggered the write scheduler if necessary
                         } else {
                             if (trySetALPN()) {
@@ -550,6 +555,7 @@
 
         private volatile Status lastUnwrapStatus;
         EngineResult unwrapBuffer(ByteBuffer src) throws IOException {
+            assert readBufferLock.isHeldByCurrentThread();
             ByteBuffer dst = getAppBuffer();
             int len = src.remaining();
             while (true) {
@@ -573,6 +579,8 @@
                         break;
                     case CLOSED:
                         assert dst.position() == 0;
+                        src.position(src.limit());
+                        completing = true;
                         return doClosure(new EngineResult(sslResult));
                     case BUFFER_UNDERFLOW:
                         // handled implicitly by compaction/reallocation of readBuf
@@ -834,7 +842,7 @@
                     boolean handshaking = false;
                     if (result.handshaking()) {
                         if (debugw.on()) debugw.log("handshaking");
-                        doHandshake(result, WRITER);  // ok to ignore return
+                        doHandshake(result.handshakeStatus(), WRITER);  // ok to ignore return
                         handshaking = true;
                     } else {
                         if (trySetALPN()) {
@@ -1090,14 +1098,14 @@
         return (current & HANDSHAKING);
     };
 
-    private boolean doHandshake(EngineResult r, int caller) {
+    private boolean doHandshake(HandshakeStatus handshakeStatus, int caller) {
         // unconditionally sets the HANDSHAKING bit, while preserving task bits
         handshakeState.getAndAccumulate(0, (current, unused) -> HANDSHAKING | (current & TASK_BITS));
         if (stateList != null && debug.on()) {
-            stateList.add(r.handshakeStatus().toString());
+            stateList.add(handshakeStatus.toString());
             stateList.add(Integer.toString(caller));
         }
-        switch (r.handshakeStatus()) {
+        switch (handshakeStatus) {
             case NEED_TASK:
                 int s = handshakeState.accumulateAndGet(0, REQUEST_OR_DO_TASKS);
                 if ((s & REQUESTING_TASKS) > 0) { // someone else is or will do tasks
@@ -1125,7 +1133,7 @@
                 break;
             default:
                 throw new InternalError("Unexpected handshake status:"
-                                        + r.handshakeStatus());
+                                        + handshakeStatus);
         }
         return true;
     }
@@ -1182,34 +1190,20 @@
         return false;
     }
 
-    // FIXME: acknowledge a received CLOSE request from peer
     EngineResult doClosure(EngineResult r) throws IOException {
         if (debug.on())
             debug.log("doClosure(%s): %s [isOutboundDone: %s, isInboundDone: %s]",
                       r.result, engine.getHandshakeStatus(),
                       engine.isOutboundDone(), engine.isInboundDone());
+        if (debug.on()) debug.log("doClosure: close_notify received");
+        close_notify_received = true;
+        engine.closeOutbound();
         if (engine.getHandshakeStatus() == HandshakeStatus.NEED_WRAP) {
             // we have received TLS close_notify and need to send
             // an acknowledgement back. We're calling doHandshake
             // to finish the close handshake.
-            if (engine.isInboundDone() && !engine.isOutboundDone()) {
-                if (debug.on()) debug.log("doClosure: close_notify received");
-                close_notify_received = true;
-                if (!writer.scheduler.isStopped()) {
-                    doHandshake(r, READER);
-                } else {
-                    // We have received closed notify, but we
-                    // won't be able to send the acknowledgement.
-                    // Nothing more will come from the socket either,
-                    // so mark the reader as completed.
-                    var readerLock = reader.readBufferLock;
-                    readerLock.lock();
-                    try {
-                        reader.completing = true;
-                    } finally {
-                        readerLock.unlock();
-                    }
-                }
+            if (!writer.scheduler.isStopped()) {
+                doHandshake(HandshakeStatus.NEED_WRAP, READER);
             }
         }
         return r;
diff -Nru openjdk-21-21.0.10+7/src/java.net.http/share/classes/jdk/internal/net/http/common/SubscriberWrapper.java openjdk-21-21.0.11+10/src/java.net.http/share/classes/jdk/internal/net/http/common/SubscriberWrapper.java
--- openjdk-21-21.0.10+7/src/java.net.http/share/classes/jdk/internal/net/http/common/SubscriberWrapper.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.net.http/share/classes/jdk/internal/net/http/common/SubscriberWrapper.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2026, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -459,7 +459,7 @@
     }
 
     void checkCompletion() {
-        if (downstreamCompleted || !upstreamCompleted) {
+        if (downstreamCompleted || (!upstreamCompleted && !completionAcknowledged)) {
             return;
         }
         if (!outputQ.isEmpty()) {
diff -Nru openjdk-21-21.0.10+7/src/java.rmi/share/classes/javax/rmi/ssl/SslRMIClientSocketFactory.java openjdk-21-21.0.11+10/src/java.rmi/share/classes/javax/rmi/ssl/SslRMIClientSocketFactory.java
--- openjdk-21-21.0.10+7/src/java.rmi/share/classes/javax/rmi/ssl/SslRMIClientSocketFactory.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.rmi/share/classes/javax/rmi/ssl/SslRMIClientSocketFactory.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2026, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,6 +29,8 @@
 import java.io.Serializable;
 import java.net.Socket;
 import java.rmi.server.RMIClientSocketFactory;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.StringTokenizer;
 import javax.net.SocketFactory;
 import javax.net.ssl.SSLParameters;
@@ -121,8 +123,12 @@
         final SSLSocket sslSocket = (SSLSocket)
             sslSocketFactory.createSocket(host, port);
 
-        if (Boolean.parseBoolean(
-                System.getProperty("jdk.rmi.ssl.client.enableEndpointIdentification", "true"))) {
+        @SuppressWarnings("removal")
+        final String enableEndpointIdentification =
+            AccessController.doPrivileged((PrivilegedAction) () ->
+                    System.getProperty("jdk.rmi.ssl.client.enableEndpointIdentification", "true"));
+
+        if (Boolean.parseBoolean(enableEndpointIdentification)) {
             SSLParameters params = sslSocket.getSSLParameters();
             if (params == null) {
                 params = new SSLParameters();
@@ -132,8 +138,10 @@
         }
         // Set the SSLSocket Enabled Cipher Suites
         //
+        @SuppressWarnings("removal")
         final String enabledCipherSuites =
-            System.getProperty("javax.rmi.ssl.client.enabledCipherSuites");
+            AccessController.doPrivileged((PrivilegedAction) () ->
+                System.getProperty("javax.rmi.ssl.client.enabledCipherSuites"));
         if (enabledCipherSuites != null) {
             StringTokenizer st = new StringTokenizer(enabledCipherSuites, ",");
             int tokens = st.countTokens();
@@ -149,8 +157,10 @@
         }
         // Set the SSLSocket Enabled Protocols
         //
+        @SuppressWarnings("removal")
         final String enabledProtocols =
-            System.getProperty("javax.rmi.ssl.client.enabledProtocols");
+            AccessController.doPrivileged((PrivilegedAction) () ->
+                System.getProperty("javax.rmi.ssl.client.enabledProtocols"));
         if (enabledProtocols != null) {
             StringTokenizer st = new StringTokenizer(enabledProtocols, ",");
             int tokens = st.countTokens();
diff -Nru openjdk-21-21.0.10+7/src/java.security.jgss/share/classes/javax/security/auth/kerberos/KeyImpl.java openjdk-21-21.0.11+10/src/java.security.jgss/share/classes/javax/security/auth/kerberos/KeyImpl.java
--- openjdk-21-21.0.10+7/src/java.security.jgss/share/classes/javax/security/auth/kerberos/KeyImpl.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.security.jgss/share/classes/javax/security/auth/kerberos/KeyImpl.java	2026-04-17 19:09:35.000000000 +0000
@@ -96,7 +96,7 @@
             this.keyBytes = key.getBytes();
             this.keyType = key.getEType();
         } catch (KrbException e) {
-            throw new IllegalArgumentException(e.getMessage());
+            throw new IllegalArgumentException("key creation error", e);
         }
     }
 
diff -Nru openjdk-21-21.0.10+7/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/AesDkCrypto.java openjdk-21-21.0.11+10/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/AesDkCrypto.java
--- openjdk-21-21.0.10+7/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/AesDkCrypto.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/AesDkCrypto.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -108,8 +108,6 @@
         try {
             saltUtf8 = salt.getBytes(UTF_8);
             return stringToKey(password, saltUtf8, s2kparams);
-        } catch (Exception e) {
-            return null;
         } finally {
             if (saltUtf8 != null) {
                 Arrays.fill(saltUtf8, (byte)0);
@@ -120,14 +118,7 @@
     private byte[] stringToKey(char[] secret, byte[] salt, byte[] params)
         throws GeneralSecurityException {
 
-        int iter_count = DEFAULT_ITERATION_COUNT;
-        if (params != null) {
-            if (params.length != 4) {
-                throw new RuntimeException("Invalid parameter to stringToKey");
-            }
-            iter_count = readBigEndian(params, 0, 4);
-        }
-
+        int iter_count = DkCrypto.iterationCount(params, DEFAULT_ITERATION_COUNT);
         byte[] tmpKey = randomToKey(PBKDF2(secret, salt, iter_count,
                                         getKeySeedLength()));
         byte[] result = dk(tmpKey, KERBEROS_CONSTANT);
@@ -487,17 +478,4 @@
 
         return result;
     }
-
-    public static final int readBigEndian(byte[] data, int pos, int size) {
-        int retVal = 0;
-        int shifter = (size-1)*8;
-        while (size > 0) {
-            retVal += (data[pos] & 0xff) << shifter;
-            shifter -= 8;
-            pos++;
-            size--;
-        }
-        return retVal;
-    }
-
 }
diff -Nru openjdk-21-21.0.10+7/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/AesSha2DkCrypto.java openjdk-21-21.0.11+10/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/AesSha2DkCrypto.java
--- openjdk-21-21.0.10+7/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/AesSha2DkCrypto.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/AesSha2DkCrypto.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -111,8 +111,6 @@
         try {
             saltUtf8 = salt.getBytes(UTF_8);
             return stringToKey(password, saltUtf8, s2kparams);
-        } catch (Exception e) {
-            return null;
         } finally {
             if (saltUtf8 != null) {
                 Arrays.fill(saltUtf8, (byte)0);
@@ -124,14 +122,7 @@
     private byte[] stringToKey(char[] secret, byte[] salt, byte[] params)
         throws GeneralSecurityException {
 
-        int iter_count = DEFAULT_ITERATION_COUNT;
-        if (params != null) {
-            if (params.length != 4) {
-                throw new RuntimeException("Invalid parameter to stringToKey");
-            }
-            iter_count = readBigEndian(params, 0, 4);
-        }
-
+        int iter_count = DkCrypto.iterationCount(params, DEFAULT_ITERATION_COUNT);
         byte[] saltp = new byte[26 + 1 + salt.length];
         if (keyLength == 128) {
             System.arraycopy(ETYPE_NAME_128, 0, saltp, 0, 26);
@@ -527,17 +518,4 @@
 
         return result;
     }
-
-    public static final int readBigEndian(byte[] data, int pos, int size) {
-        int retVal = 0;
-        int shifter = (size-1)*8;
-        while (size > 0) {
-            retVal += (data[pos] & 0xff) << shifter;
-            shifter -= 8;
-            pos++;
-            size--;
-        }
-        return retVal;
-    }
-
 }
diff -Nru openjdk-21-21.0.10+7/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/ArcFourCrypto.java openjdk-21-21.0.11+10/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/ArcFourCrypto.java
--- openjdk-21-21.0.10+7/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/ArcFourCrypto.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/ArcFourCrypto.java	2026-04-17 19:09:35.000000000 +0000
@@ -89,8 +89,6 @@
             MessageDigest md = sun.security.provider.MD4.getInstance();
             md.update(passwd);
             digest = md.digest();
-        } catch (Exception e) {
-            return null;
         } finally {
             if (passwd != null) {
                 Arrays.fill(passwd, (byte)0);
diff -Nru openjdk-21-21.0.10+7/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java openjdk-21-21.0.11+10/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java
--- openjdk-21-21.0.10+7/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
  */
 
 /*
@@ -31,8 +31,8 @@
 package sun.security.krb5.internal.crypto.dk;
 
 import javax.crypto.Cipher;
-import javax.crypto.Mac;
 import java.security.GeneralSecurityException;
+import java.security.InvalidAlgorithmParameterException;
 import java.util.Arrays;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -692,4 +692,41 @@
         bb.get(answer, 0, len);
         return answer;
     }
+
+    static int iterationCount(byte[] params, int defaultValue)
+            throws InvalidAlgorithmParameterException {
+        if (params == null) {
+            return defaultValue;
+        }
+        if (params.length != 4) {
+            throw new InvalidAlgorithmParameterException("Invalid params");
+        }
+        if (params[0] != 0 || ((params[1] & 0xff) >= 80)) {
+            // IC should be less than 80 * 2^16. This is roughly
+            // the same as PKCS12KeyStore's 5_000_000 limit.
+            throw new InvalidAlgorithmParameterException(
+                    "Incoming iteration count is too big");
+        }
+        int iter_count = readBigEndian(params, 0, 4);
+        if (!ALLOW_WEAK_PBKDF2_ITERATION_COUNT && iter_count < defaultValue) {
+            throw new InvalidAlgorithmParameterException(
+                    "Incoming iteration count is too small");
+        }
+        return iter_count;
+    }
+
+    public static final int readBigEndian(byte[] data, int pos, int size) {
+        int retVal = 0;
+        int shifter = (size-1)*8;
+        while (size > 0) {
+            retVal += (data[pos] & 0xff) << shifter;
+            shifter -= 8;
+            pos++;
+            size--;
+        }
+        return retVal;
+    }
+
+    // Only used by test
+    public static boolean ALLOW_WEAK_PBKDF2_ITERATION_COUNT = false;
 }
diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/Const.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/Const.java
--- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/Const.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/Const.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
  */
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
@@ -26,12 +26,12 @@
  * Constants for the project, mostly defined in the JVM specification.
  *
  * @since 6.0 (intended to replace the Constants interface)
- * @LastModified: Feb 2023
+ * @LastModified: Sept 2025
  */
 public final class Const {
 
     /**
-     * Java class file format Magic number (0xCAFEBABE)
+     * Java class file format Magic number: {@value}.
      *
      * @see  The ClassFile Structure
      *      in The Java Virtual Machine Specification
@@ -39,201 +39,201 @@
     public static final int JVM_CLASSFILE_MAGIC = 0xCAFEBABE;
 
     /**
-     * Major version number of class files for Java 1.1.
+     * Major version number of class files for Java 1.1: {@value}.
      *
      * @see #MINOR_1_1
      */
     public static final short MAJOR_1_1 = 45;
 
     /**
-     * Minor version number of class files for Java 1.1.
+     * Minor version number of class files for Java 1.1: {@value}.
      *
      * @see #MAJOR_1_1
      */
     public static final short MINOR_1_1 = 3;
 
     /**
-     * Major version number of class files for Java 1.2.
+     * Major version number of class files for Java 1.2: {@value}.
      *
      * @see #MINOR_1_2
      */
     public static final short MAJOR_1_2 = 46;
 
     /**
-     * Minor version number of class files for Java 1.2.
+     * Minor version number of class files for Java 1.2: {@value}.
      *
      * @see #MAJOR_1_2
      */
     public static final short MINOR_1_2 = 0;
 
     /**
-     * Major version number of class files for Java 1.2.
+     * Major version number of class files for Java 1.2: {@value}.
      *
      * @see #MINOR_1_2
      */
     public static final short MAJOR_1_3 = 47;
 
     /**
-     * Minor version number of class files for Java 1.3.
+     * Minor version number of class files for Java 1.3: {@value}.
      *
      * @see #MAJOR_1_3
      */
     public static final short MINOR_1_3 = 0;
 
     /**
-     * Major version number of class files for Java 1.3.
+     * Major version number of class files for Java 1.3: {@value}.
      *
      * @see #MINOR_1_3
      */
     public static final short MAJOR_1_4 = 48;
 
     /**
-     * Minor version number of class files for Java 1.4.
+     * Minor version number of class files for Java 1.4: {@value}.
      *
      * @see #MAJOR_1_4
      */
     public static final short MINOR_1_4 = 0;
 
     /**
-     * Major version number of class files for Java 1.4.
+     * Major version number of class files for Java 1.4: {@value}.
      *
      * @see #MINOR_1_4
      */
     public static final short MAJOR_1_5 = 49;
 
     /**
-     * Minor version number of class files for Java 1.5.
+     * Minor version number of class files for Java 1.5: {@value}.
      *
      * @see #MAJOR_1_5
      */
     public static final short MINOR_1_5 = 0;
 
     /**
-     * Major version number of class files for Java 1.6.
+     * Major version number of class files for Java 1.6: {@value}.
      *
      * @see #MINOR_1_6
      */
     public static final short MAJOR_1_6 = 50;
 
     /**
-     * Minor version number of class files for Java 1.6.
+     * Minor version number of class files for Java 1.6: {@value}.
      *
      * @see #MAJOR_1_6
      */
     public static final short MINOR_1_6 = 0;
 
     /**
-     * Major version number of class files for Java 1.7.
+     * Major version number of class files for Java 1.7: {@value}.
      *
      * @see #MINOR_1_7
      */
     public static final short MAJOR_1_7 = 51;
 
     /**
-     * Minor version number of class files for Java 1.7.
+     * Minor version number of class files for Java 1.7: {@value}.
      *
      * @see #MAJOR_1_7
      */
     public static final short MINOR_1_7 = 0;
 
     /**
-     * Major version number of class files for Java 1.8.
+     * Major version number of class files for Java 1.8: {@value}.
      *
      * @see #MINOR_1_8
      */
     public static final short MAJOR_1_8 = 52;
 
     /**
-     * Minor version number of class files for Java 1.8.
+     * Minor version number of class files for Java 1.8: {@value}.
      *
      * @see #MAJOR_1_8
      */
     public static final short MINOR_1_8 = 0;
 
     /**
-     * Major version number of class files for Java 9.
+     * Major version number of class files for Java 9: {@value}.
      *
      * @see #MINOR_9
      */
     public static final short MAJOR_9 = 53;
 
     /**
-     * Minor version number of class files for Java 9.
+     * Minor version number of class files for Java 9: {@value}.
      *
      * @see #MAJOR_9
      */
     public static final short MINOR_9 = 0;
 
     /**
-     * @deprecated Use {@link #MAJOR_9} instead
+     * @deprecated Use {@link #MAJOR_9} ({@value}) instead.
      */
     @Deprecated
     public static final short MAJOR_1_9 = MAJOR_9;
 
     /**
-     * @deprecated Use {@link #MINOR_9} instead
+     * @deprecated Use {@link #MINOR_9} ({@value}) instead.
      */
     @Deprecated
     public static final short MINOR_1_9 = MINOR_9;
 
     /**
-     * Major version number of class files for Java 10.
+     * Major version number of class files for Java 10: {@value}.
      *
      * @see #MINOR_10
      */
     public static final short MAJOR_10 = 54;
 
     /**
-     * Minor version number of class files for Java 10.
+     * Minor version number of class files for Java 10: {@value}.
      *
      * @see #MAJOR_10
      */
     public static final short MINOR_10 = 0;
 
     /**
-     * Major version number of class files for Java 11.
+     * Major version number of class files for Java 11: {@value}.
      *
      * @see #MINOR_11
      */
     public static final short MAJOR_11 = 55;
 
     /**
-     * Minor version number of class files for Java 11.
+     * Minor version number of class files for Java 11: {@value}.
      *
      * @see #MAJOR_11
      */
     public static final short MINOR_11 = 0;
 
     /**
-     * Major version number of class files for Java 12.
+     * Major version number of class files for Java 12: {@value}.
      *
      * @see #MINOR_12
      */
     public static final short MAJOR_12 = 56;
 
     /**
-     * Minor version number of class files for Java 12.
+     * Minor version number of class files for Java 12: {@value}.
      *
      * @see #MAJOR_12
      */
     public static final short MINOR_12 = 0;
 
     /**
-     * Major version number of class files for Java 13.
+     * Major version number of class files for Java 13: {@value}.
      *
      * @see #MINOR_13
      */
     public static final short MAJOR_13 = 57;
 
     /**
-     * Minor version number of class files for Java 13.
+     * Minor version number of class files for Java 13: {@value}.
      *
      * @see #MAJOR_13
      */
     public static final short MINOR_13 = 0;
 
     /**
-     * Minor version number of class files for Java 14.
+     * Minor version number of class files for Java 14: {@value}.
      *
      * @see #MAJOR_14
      * @since 6.4.0
@@ -241,7 +241,7 @@
     public static final short MINOR_14 = 0;
 
     /**
-     * Minor version number of class files for Java 15.
+     * Minor version number of class files for Java 15: {@value}.
      *
      * @see #MAJOR_15
      * @since 6.6.0
@@ -249,7 +249,7 @@
     public static final short MINOR_15 = 0;
 
     /**
-     * Minor version number of class files for Java 16.
+     * Minor version number of class files for Java 16: {@value}.
      *
      * @see #MAJOR_16
      * @since 6.6.0
@@ -257,7 +257,7 @@
     public static final short MINOR_16 = 0;
 
     /**
-     * Minor version number of class files for Java 17.
+     * Minor version number of class files for Java 17: {@value}.
      *
      * @see #MAJOR_17
      * @since 6.6.0
@@ -265,7 +265,7 @@
     public static final short MINOR_17 = 0;
 
     /**
-     * Minor version number of class files for Java 18.
+     * Minor version number of class files for Java 18: {@value}.
      *
      * @see #MAJOR_18
      * @since 6.6.0
@@ -273,7 +273,7 @@
     public static final short MINOR_18 = 0;
 
     /**
-     * Minor version number of class files for Java 19.
+     * Minor version number of class files for Java 19: {@value}.
      *
      * @see #MAJOR_19
      * @since 6.6.0
@@ -281,7 +281,47 @@
     public static final short MINOR_19 = 0;
 
     /**
-     * Major version number of class files for Java 14.
+     * Minor version number of class files for Java 20: {@value}.
+     *
+     * @see #MAJOR_20
+     * @since 6.8.0
+     */
+    public static final short MINOR_20 = 0;
+
+    /**
+     * Minor version number of class files for Java 21: {@value}.
+     *
+     * @see #MAJOR_21
+     * @since 6.8.0
+     */
+    public static final short MINOR_21 = 0;
+
+    /**
+     * Minor version number of class files for Java 22: {@value}.
+     *
+     * @see #MAJOR_22
+     * @since 6.10.0
+     */
+    public static final short MINOR_22 = 0;
+
+    /**
+     * Minor version number of class files for Java 23: {@value}.
+     *
+     * @see #MAJOR_23
+     * @since 6.10.0
+     */
+    public static final short MINOR_23 = 0;
+
+    /**
+     * Minor version number of class files for Java 24: {@value}.
+     *
+     * @see #MAJOR_24
+     * @since 6.10.0
+     */
+    public static final short MINOR_24 = 0;
+
+    /**
+     * Major version number of class files for Java 14: {@value}.
      *
      * @see #MINOR_14
      * @since 6.4.0
@@ -289,7 +329,7 @@
     public static final short MAJOR_14 = 58;
 
     /**
-     * Major version number of class files for Java 15.
+     * Major version number of class files for Java 15: {@value}.
      *
      * @see #MINOR_15
      * @since 6.6.0
@@ -297,7 +337,7 @@
     public static final short MAJOR_15 = 59;
 
     /**
-     * Major version number of class files for Java 16.
+     * Major version number of class files for Java 16: {@value}.
      *
      * @see #MINOR_16
      * @since 6.6.0
@@ -305,7 +345,7 @@
     public static final short MAJOR_16 = 60;
 
     /**
-     * Major version number of class files for Java 17.
+     * Major version number of class files for Java 17: {@value}.
      *
      * @see #MINOR_17
      * @since 6.6.0
@@ -313,7 +353,7 @@
     public static final short MAJOR_17 = 61;
 
     /**
-     * Major version number of class files for Java 18.
+     * Major version number of class files for Java 18: {@value}.
      *
      * @see #MINOR_18
      * @since 6.6.0
@@ -321,7 +361,7 @@
     public static final short MAJOR_18 = 62;
 
     /**
-     * Major version number of class files for Java 19.
+     * Major version number of class files for Java 19: {@value}.
      *
      * @see #MINOR_19
      * @since 6.6.0
@@ -329,31 +369,71 @@
     public static final short MAJOR_19 = 63;
 
     /**
-     * Default major version number. Class file is for Java 1.1.
+     * Major version number of class files for Java 20: {@value}.
+     *
+     * @see #MINOR_20
+     * @since 6.8.0
+     */
+    public static final short MAJOR_20 = 64;
+
+    /**
+     * Major version number of class files for Java 21: {@value}.
+     *
+     * @see #MINOR_21
+     * @since 6.8.0
+     */
+    public static final short MAJOR_21 = 65;
+
+    /**
+     * Major version number of class files for Java 22: {@value}.
+     *
+     * @see #MINOR_22
+     * @since 6.10.0
+     */
+    public static final short MAJOR_22 = 66;
+
+    /**
+     * Major version number of class files for Java 23: {@value}.
+     *
+     * @see #MINOR_23
+     * @since 6.10.0
+     */
+    public static final short MAJOR_23 = 67;
+
+    /**
+     * Major version number of class files for Java 24: {@value}.
+     *
+     * @see #MINOR_24
+     * @since 6.10.0
+     */
+    public static final short MAJOR_24 = 68;
+
+    /**
+     * Default major version number. Class file is for Java 1.1: {@value}.
      *
      * @see #MAJOR_1_1
      */
     public static final short MAJOR = MAJOR_1_1;
 
     /**
-     * Default major version number. Class file is for Java 1.1.
+     * Default major version number. Class file is for Java 1.1: {@value}.
      *
      * @see #MAJOR_1_1
      */
     public static final short MINOR = MINOR_1_1;
 
     /**
-     * Maximum value for an unsigned short.
+     * Maximum value for an unsigned short: {@value}.
      */
     public static final int MAX_SHORT = 65535; // 2^16 - 1
 
     /**
-     * Maximum value for an unsigned byte.
+     * Maximum value for an unsigned byte: {@value}.
      */
     public static final int MAX_BYTE = 255; // 2^8 - 1
 
     /**
-     * One of the access flags for fields, methods, or classes.
+     * One of the access flags for fields, methods, or classes: {@value}.
      *
      * @see  Flag definitions for
      *      Classes in the Java Virtual Machine Specification (Java SE 9 Edition).
@@ -367,140 +447,140 @@
     public static final short ACC_PUBLIC = 0x0001;
 
     /**
-     * One of the access flags for fields, methods, or classes.
+     * One of the access flags for fields, methods, or classes: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_PRIVATE = 0x0002;
 
     /**
-     * One of the access flags for fields, methods, or classes.
+     * One of the access flags for fields, methods, or classes: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_PROTECTED = 0x0004;
 
     /**
-     * One of the access flags for fields, methods, or classes.
+     * One of the access flags for fields, methods, or classes: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_STATIC = 0x0008;
 
     /**
-     * One of the access flags for fields, methods, or classes.
+     * One of the access flags for fields, methods, or classes: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_FINAL = 0x0010;
 
     /**
-     * One of the access flags for the Module attribute.
+     * One of the access flags for the Module attribute: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_OPEN = 0x0020;
 
     /**
-     * One of the access flags for classes.
+     * One of the access flags for classes: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_SUPER = 0x0020;
 
     /**
-     * One of the access flags for methods.
+     * One of the access flags for methods: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_SYNCHRONIZED = 0x0020;
 
     /**
-     * One of the access flags for the Module attribute.
+     * One of the access flags for the Module attribute: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_TRANSITIVE = 0x0020;
 
     /**
-     * One of the access flags for methods.
+     * One of the access flags for methods: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_BRIDGE = 0x0040;
 
     /**
-     * One of the access flags for the Module attribute.
+     * One of the access flags for the Module attribute: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_STATIC_PHASE = 0x0040;
 
     /**
-     * One of the access flags for fields.
+     * One of the access flags for fields: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_VOLATILE = 0x0040;
 
     /**
-     * One of the access flags for fields.
+     * One of the access flags for fields: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_TRANSIENT = 0x0080;
 
     /**
-     * One of the access flags for methods.
+     * One of the access flags for methods: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_VARARGS = 0x0080;
 
     /**
-     * One of the access flags for methods.
+     * One of the access flags for methods: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_NATIVE = 0x0100;
 
     /**
-     * One of the access flags for classes.
+     * One of the access flags for classes: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_INTERFACE = 0x0200;
 
     /**
-     * One of the access flags for methods or classes.
+     * One of the access flags for methods or classes: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_ABSTRACT = 0x0400;
 
     /**
-     * One of the access flags for methods.
+     * One of the access flags for methods: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_STRICT = 0x0800;
 
     /**
-     * One of the access flags for fields, methods, classes, MethodParameter attribute, or Module attribute.
+     * One of the access flags for fields, methods, classes, MethodParameter attribute, or Module attribute: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_SYNTHETIC = 0x1000;
 
     /**
-     * One of the access flags for classes.
+     * One of the access flags for classes: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_ANNOTATION = 0x2000;
 
     /**
-     * One of the access flags for fields or classes.
+     * One of the access flags for fields or classes: {@value}.
      *
      * @see #ACC_PUBLIC
      */
@@ -508,21 +588,21 @@
 
     // Applies to classes compiled by new compilers only
     /**
-     * One of the access flags for MethodParameter or Module attributes.
+     * One of the access flags for MethodParameter or Module attributes: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_MANDATED = (short) 0x8000;
 
     /**
-     * One of the access flags for classes.
+     * One of the access flags for classes: {@value}.
      *
      * @see #ACC_PUBLIC
      */
     public static final short ACC_MODULE = (short) 0x8000;
 
     /**
-     * One of the access flags for fields, methods, or classes.
+     * One of the access flags for fields, methods, or classes: {@value}.
      *
      * @see #ACC_PUBLIC
      * @deprecated Use {@link #MAX_ACC_FLAG_I}
@@ -531,7 +611,7 @@
     public static final short MAX_ACC_FLAG = ACC_ENUM;
 
     /**
-     * One of the access flags for fields, methods, or classes. ACC_MODULE is negative as a short.
+     * One of the access flags for fields, methods, or classes. ACC_MODULE is negative as a short: {@value}.
      *
      * @see #ACC_PUBLIC
      * @since 6.4.0
@@ -553,7 +633,7 @@
     public static final int ACCESS_NAMES_LENGTH = ACCESS_NAMES.length;
 
     /**
-     * Marks a constant pool entry as type UTF-8.
+     * Marks a constant pool entry as type UTF-8: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -566,7 +646,7 @@
      */
 
     /**
-     * Marks a constant pool entry as type Integer.
+     * Marks a constant pool entry as type Integer: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -574,7 +654,7 @@
     public static final byte CONSTANT_Integer = 3;
 
     /**
-     * Marks a constant pool entry as type Float.
+     * Marks a constant pool entry as type Float: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -582,7 +662,7 @@
     public static final byte CONSTANT_Float = 4;
 
     /**
-     * Marks a constant pool entry as type Long.
+     * Marks a constant pool entry as type Long: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -590,7 +670,7 @@
     public static final byte CONSTANT_Long = 5;
 
     /**
-     * Marks a constant pool entry as type Double.
+     * Marks a constant pool entry as type Double: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -598,7 +678,7 @@
     public static final byte CONSTANT_Double = 6;
 
     /**
-     * Marks a constant pool entry as a Class
+     * Marks a constant pool entry as a Class: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -606,7 +686,7 @@
     public static final byte CONSTANT_Class = 7;
 
     /**
-     * Marks a constant pool entry as a Field Reference.
+     * Marks a constant pool entry as a Field Reference: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -614,7 +694,7 @@
     public static final byte CONSTANT_Fieldref = 9;
 
     /**
-     * Marks a constant pool entry as type String
+     * Marks a constant pool entry as type String: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -622,7 +702,7 @@
     public static final byte CONSTANT_String = 8;
 
     /**
-     * Marks a constant pool entry as a Method Reference.
+     * Marks a constant pool entry as a Method Reference: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -630,7 +710,7 @@
     public static final byte CONSTANT_Methodref = 10;
 
     /**
-     * Marks a constant pool entry as an Interface Method Reference.
+     * Marks a constant pool entry as an Interface Method Reference: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -638,7 +718,7 @@
     public static final byte CONSTANT_InterfaceMethodref = 11;
 
     /**
-     * Marks a constant pool entry as a name and type.
+     * Marks a constant pool entry as a name and type: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -646,7 +726,7 @@
     public static final byte CONSTANT_NameAndType = 12;
 
     /**
-     * Marks a constant pool entry as a Method Handle.
+     * Marks a constant pool entry as a Method Handle: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -654,7 +734,7 @@
     public static final byte CONSTANT_MethodHandle = 15;
 
     /**
-     * Marks a constant pool entry as a Method Type.
+     * Marks a constant pool entry as a Method Type: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -662,16 +742,16 @@
     public static final byte CONSTANT_MethodType = 16;
 
     /**
-     * Marks a constant pool entry as dynamically computed.
+     * Marks a constant pool entry as dynamically computed: {@value}.
      *
-     * @see  Change request for JEP
-     *      309
+     * @see  The Constant Pool in The
+     *      Java Virtual Machine Specification
      * @since 6.3
      */
     public static final byte CONSTANT_Dynamic = 17;
 
     /**
-     * Marks a constant pool entry as an Invoke Dynamic
+     * Marks a constant pool entry as an Invoke Dynamic: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -679,7 +759,7 @@
     public static final byte CONSTANT_InvokeDynamic = 18;
 
     /**
-     * Marks a constant pool entry as a Module Reference.
+     * Marks a constant pool entry as a Module Reference: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -688,7 +768,7 @@
     public static final byte CONSTANT_Module = 19;
 
     /**
-     * Marks a constant pool entry as a Package Reference.
+     * Marks a constant pool entry as a Package Reference: {@value}.
      *
      * @see  The Constant Pool in The
      *      Java Virtual Machine Specification
@@ -705,23 +785,23 @@
 
     /**
      * The name of the static initializer, also called "class initialization method" or "interface
-     * initialization method". This is "<clinit>".
+     * initialization method". This is {@value}.
      */
     public static final String STATIC_INITIALIZER_NAME = "";
 
     /**
      * The name of every constructor method in a class, also called "instance initialization method". This is
-     * "<init>".
+     * {@value}.
      */
     public static final String CONSTRUCTOR_NAME = "";
 
     /**
-     * The names of the interfaces implemented by arrays
+     * The names of the interfaces implemented by arrays.
      */
     private static final String[] INTERFACES_IMPLEMENTED_BY_ARRAYS = {"java.lang.Cloneable", "java.io.Serializable"};
 
     /**
-     * Maximum Constant Pool entries. One of the limitations of the Java Virtual Machine.
+     * Maximum Constant Pool entries: {@value}. One of the limitations of the Java Virtual Machine.
      *
      * @see  The Java Virtual
      *      Machine Specification, Java SE 8 Edition, page 330, chapter 4.11.
@@ -729,21 +809,25 @@
     public static final int MAX_CP_ENTRIES = 65535;
 
     /**
-     * Maximum code size (plus one; the code size must be LESS than this) One of the limitations of the Java Virtual
-     * Machine. Note vmspec2 page 152 ("Limitations") says: "The amount of code per non-native, non-abstract method is
-     * limited to 65536 bytes by the sizes of the indices in the exception_table of the Code attribute (4.7.3), in the
-     * LineNumberTable attribute (4.7.8), and in the LocalVariableTable attribute (4.7.9)." However this should be taken
-     * as an upper limit rather than the defined maximum. On page 134 (4.8.1 Static Constants) of the same spec, it says:
-     * "The value of the code_length item must be less than 65536." The entry in the Limitations section has been removed
-     * from later versions of the spec; it is not present in the Java SE 8 edition.
+     * Maximum code size (plus one; the code size must be LESS than this): {@value}.
+     * 

+ * One of the limitations of the Java Virtual Machine. Note vmspec2 page 152 ("Limitations") says: + *

+ *
"The amount of code per non-native, non-abstract method is limited to 65536 bytes by the sizes of the indices in the exception_table of the Code
+     * attribute (4.7.3), in the LineNumberTable attribute (4.7.8), and in the LocalVariableTable attribute (4.7.9)." However this should be taken as an
+     * upper limit rather than the defined maximum. On page 134 (4.8.1 Static Constants) of the same spec, it says: "The value of the code_length item must be
+     * less than 65536."
+ *

+ * The entry in the Limitations section has been removed from later versions of the specification; it is not present in the Java SE 8 edition. + *

* - * @see The Java Virtual - * Machine Specification, Java SE 8 Edition, page 104, chapter 4.7. + * @see The Java Virtual Machine Specification, Java SE 8 + * Edition, page 104, chapter 4.7. */ public static final int MAX_CODE_SIZE = 65536; // bytes /** - * The maximum number of dimensions in an array ({@value}). One of the limitations of the Java Virtual Machine. + * The maximum number of dimensions in an array: {@value}. One of the limitations of the Java Virtual Machine. * * @see Field Descriptors in * The Java Virtual Machine Specification @@ -751,7 +835,7 @@ public static final int MAX_ARRAY_DIMENSIONS = 255; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -759,7 +843,7 @@ public static final short NOP = 0; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -767,7 +851,7 @@ public static final short ACONST_NULL = 1; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -775,7 +859,7 @@ public static final short ICONST_M1 = 2; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -783,7 +867,7 @@ public static final short ICONST_0 = 3; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -791,7 +875,7 @@ public static final short ICONST_1 = 4; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -799,7 +883,7 @@ public static final short ICONST_2 = 5; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -807,7 +891,7 @@ public static final short ICONST_3 = 6; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -815,7 +899,7 @@ public static final short ICONST_4 = 7; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -823,7 +907,7 @@ public static final short ICONST_5 = 8; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -831,7 +915,7 @@ public static final short LCONST_0 = 9; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -839,7 +923,7 @@ public static final short LCONST_1 = 10; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -847,7 +931,7 @@ public static final short FCONST_0 = 11; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -855,7 +939,7 @@ public static final short FCONST_1 = 12; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -863,7 +947,7 @@ public static final short FCONST_2 = 13; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -871,7 +955,7 @@ public static final short DCONST_0 = 14; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -879,7 +963,7 @@ public static final short DCONST_1 = 15; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -887,7 +971,7 @@ public static final short BIPUSH = 16; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -895,7 +979,7 @@ public static final short SIPUSH = 17; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -903,7 +987,7 @@ public static final short LDC = 18; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -911,7 +995,7 @@ public static final short LDC_W = 19; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -919,7 +1003,7 @@ public static final short LDC2_W = 20; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -927,7 +1011,7 @@ public static final short ILOAD = 21; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -935,7 +1019,7 @@ public static final short LLOAD = 22; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -943,7 +1027,7 @@ public static final short FLOAD = 23; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -951,7 +1035,7 @@ public static final short DLOAD = 24; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -959,7 +1043,7 @@ public static final short ALOAD = 25; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -967,7 +1051,7 @@ public static final short ILOAD_0 = 26; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -975,7 +1059,7 @@ public static final short ILOAD_1 = 27; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -983,7 +1067,7 @@ public static final short ILOAD_2 = 28; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -991,7 +1075,7 @@ public static final short ILOAD_3 = 29; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -999,7 +1083,7 @@ public static final short LLOAD_0 = 30; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1007,7 +1091,7 @@ public static final short LLOAD_1 = 31; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1015,7 +1099,7 @@ public static final short LLOAD_2 = 32; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1023,7 +1107,7 @@ public static final short LLOAD_3 = 33; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1031,7 +1115,7 @@ public static final short FLOAD_0 = 34; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1039,7 +1123,7 @@ public static final short FLOAD_1 = 35; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1047,7 +1131,7 @@ public static final short FLOAD_2 = 36; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1055,7 +1139,7 @@ public static final short FLOAD_3 = 37; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1063,7 +1147,7 @@ public static final short DLOAD_0 = 38; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1071,7 +1155,7 @@ public static final short DLOAD_1 = 39; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1079,7 +1163,7 @@ public static final short DLOAD_2 = 40; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1087,7 +1171,7 @@ public static final short DLOAD_3 = 41; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1095,7 +1179,7 @@ public static final short ALOAD_0 = 42; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1103,7 +1187,7 @@ public static final short ALOAD_1 = 43; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1111,7 +1195,7 @@ public static final short ALOAD_2 = 44; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1119,7 +1203,7 @@ public static final short ALOAD_3 = 45; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1127,7 +1211,7 @@ public static final short IALOAD = 46; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1135,7 +1219,7 @@ public static final short LALOAD = 47; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1143,7 +1227,7 @@ public static final short FALOAD = 48; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1151,7 +1235,7 @@ public static final short DALOAD = 49; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1159,7 +1243,7 @@ public static final short AALOAD = 50; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1167,7 +1251,7 @@ public static final short BALOAD = 51; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1175,7 +1259,7 @@ public static final short CALOAD = 52; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1183,7 +1267,7 @@ public static final short SALOAD = 53; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1191,7 +1275,7 @@ public static final short ISTORE = 54; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1199,7 +1283,7 @@ public static final short LSTORE = 55; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1207,7 +1291,7 @@ public static final short FSTORE = 56; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1215,7 +1299,7 @@ public static final short DSTORE = 57; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1223,7 +1307,7 @@ public static final short ASTORE = 58; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1231,7 +1315,7 @@ public static final short ISTORE_0 = 59; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1239,7 +1323,7 @@ public static final short ISTORE_1 = 60; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1247,7 +1331,7 @@ public static final short ISTORE_2 = 61; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1255,7 +1339,7 @@ public static final short ISTORE_3 = 62; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1263,7 +1347,7 @@ public static final short LSTORE_0 = 63; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1271,7 +1355,7 @@ public static final short LSTORE_1 = 64; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1279,7 +1363,7 @@ public static final short LSTORE_2 = 65; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1287,7 +1371,7 @@ public static final short LSTORE_3 = 66; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1295,7 +1379,7 @@ public static final short FSTORE_0 = 67; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1303,7 +1387,7 @@ public static final short FSTORE_1 = 68; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1311,7 +1395,7 @@ public static final short FSTORE_2 = 69; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1319,7 +1403,7 @@ public static final short FSTORE_3 = 70; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1327,7 +1411,7 @@ public static final short DSTORE_0 = 71; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1335,7 +1419,7 @@ public static final short DSTORE_1 = 72; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1343,7 +1427,7 @@ public static final short DSTORE_2 = 73; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1351,7 +1435,7 @@ public static final short DSTORE_3 = 74; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1359,7 +1443,7 @@ public static final short ASTORE_0 = 75; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1367,7 +1451,7 @@ public static final short ASTORE_1 = 76; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1375,7 +1459,7 @@ public static final short ASTORE_2 = 77; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -1383,7 +1467,7 @@ public static final short ASTORE_3 = 78; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1391,7 +1475,7 @@ public static final short IASTORE = 79; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1399,7 +1483,7 @@ public static final short LASTORE = 80; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1407,7 +1491,7 @@ public static final short FASTORE = 81; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1415,7 +1499,7 @@ public static final short DASTORE = 82; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1423,7 +1507,7 @@ public static final short AASTORE = 83; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1431,7 +1515,7 @@ public static final short BASTORE = 84; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1439,7 +1523,7 @@ public static final short CASTORE = 85; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1447,7 +1531,7 @@ public static final short SASTORE = 86; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1455,7 +1539,7 @@ public static final short POP = 87; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1463,7 +1547,7 @@ public static final short POP2 = 88; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1471,7 +1555,7 @@ public static final short DUP = 89; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1479,7 +1563,7 @@ public static final short DUP_X1 = 90; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1487,7 +1571,7 @@ public static final short DUP_X2 = 91; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1495,7 +1579,7 @@ public static final short DUP2 = 92; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1503,7 +1587,7 @@ public static final short DUP2_X1 = 93; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1511,7 +1595,7 @@ public static final short DUP2_X2 = 94; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1519,7 +1603,7 @@ public static final short SWAP = 95; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1527,7 +1611,7 @@ public static final short IADD = 96; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1535,7 +1619,7 @@ public static final short LADD = 97; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1543,7 +1627,7 @@ public static final short FADD = 98; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1551,7 +1635,7 @@ public static final short DADD = 99; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1559,7 +1643,7 @@ public static final short ISUB = 100; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1567,7 +1651,7 @@ public static final short LSUB = 101; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1575,7 +1659,7 @@ public static final short FSUB = 102; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1583,7 +1667,7 @@ public static final short DSUB = 103; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1591,7 +1675,7 @@ public static final short IMUL = 104; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1599,7 +1683,7 @@ public static final short LMUL = 105; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1607,7 +1691,7 @@ public static final short FMUL = 106; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1615,7 +1699,7 @@ public static final short DMUL = 107; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1623,7 +1707,7 @@ public static final short IDIV = 108; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1631,7 +1715,7 @@ public static final short LDIV = 109; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1639,7 +1723,7 @@ public static final short FDIV = 110; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1647,7 +1731,7 @@ public static final short DDIV = 111; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1655,7 +1739,7 @@ public static final short IREM = 112; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1663,7 +1747,7 @@ public static final short LREM = 113; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1671,7 +1755,7 @@ public static final short FREM = 114; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1679,7 +1763,7 @@ public static final short DREM = 115; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1687,7 +1771,7 @@ public static final short INEG = 116; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1695,7 +1779,7 @@ public static final short LNEG = 117; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1703,7 +1787,7 @@ public static final short FNEG = 118; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1711,7 +1795,7 @@ public static final short DNEG = 119; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1719,7 +1803,7 @@ public static final short ISHL = 120; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1727,7 +1811,7 @@ public static final short LSHL = 121; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1735,7 +1819,7 @@ public static final short ISHR = 122; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1743,7 +1827,7 @@ public static final short LSHR = 123; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1751,7 +1835,7 @@ public static final short IUSHR = 124; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1759,7 +1843,7 @@ public static final short LUSHR = 125; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1767,7 +1851,7 @@ public static final short IAND = 126; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1775,7 +1859,7 @@ public static final short LAND = 127; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1783,7 +1867,7 @@ public static final short IOR = 128; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1791,7 +1875,7 @@ public static final short LOR = 129; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1799,7 +1883,7 @@ public static final short IXOR = 130; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1807,7 +1891,7 @@ public static final short LXOR = 131; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1815,7 +1899,7 @@ public static final short IINC = 132; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1823,7 +1907,7 @@ public static final short I2L = 133; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1831,7 +1915,7 @@ public static final short I2F = 134; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1839,7 +1923,7 @@ public static final short I2D = 135; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1847,7 +1931,7 @@ public static final short L2I = 136; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1855,7 +1939,7 @@ public static final short L2F = 137; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1863,7 +1947,7 @@ public static final short L2D = 138; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1871,7 +1955,7 @@ public static final short F2I = 139; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1879,7 +1963,7 @@ public static final short F2L = 140; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1887,7 +1971,7 @@ public static final short F2D = 141; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1895,7 +1979,7 @@ public static final short D2I = 142; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1903,7 +1987,7 @@ public static final short D2L = 143; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1911,7 +1995,7 @@ public static final short D2F = 144; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1919,7 +2003,7 @@ public static final short I2B = 145; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1927,7 +2011,7 @@ public static final short INT2BYTE = 145; // Old notation /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1935,7 +2019,7 @@ public static final short I2C = 146; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1943,7 +2027,7 @@ public static final short INT2CHAR = 146; // Old notation /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1951,7 +2035,7 @@ public static final short I2S = 147; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -1959,7 +2043,7 @@ public static final short INT2SHORT = 147; // Old notation /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1967,7 +2051,7 @@ public static final short LCMP = 148; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1975,7 +2059,7 @@ public static final short FCMPL = 149; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1983,7 +2067,7 @@ public static final short FCMPG = 150; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1991,7 +2075,7 @@ public static final short DCMPL = 151; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -1999,7 +2083,7 @@ public static final short DCMPG = 152; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2007,7 +2091,7 @@ public static final short IFEQ = 153; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2015,7 +2099,7 @@ public static final short IFNE = 154; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2023,7 +2107,7 @@ public static final short IFLT = 155; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2031,7 +2115,7 @@ public static final short IFGE = 156; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2039,7 +2123,7 @@ public static final short IFGT = 157; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2047,7 +2131,7 @@ public static final short IFLE = 158; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2055,7 +2139,7 @@ public static final short IF_ICMPEQ = 159; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2063,7 +2147,7 @@ public static final short IF_ICMPNE = 160; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2071,7 +2155,7 @@ public static final short IF_ICMPLT = 161; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2079,7 +2163,7 @@ public static final short IF_ICMPGE = 162; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2087,7 +2171,7 @@ public static final short IF_ICMPGT = 163; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2095,7 +2179,7 @@ public static final short IF_ICMPLE = 164; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2103,7 +2187,7 @@ public static final short IF_ACMPEQ = 165; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2111,7 +2195,7 @@ public static final short IF_ACMPNE = 166; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2119,7 +2203,7 @@ public static final short GOTO = 167; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -2127,7 +2211,7 @@ public static final short JSR = 168; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -2135,7 +2219,7 @@ public static final short RET = 169; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2143,7 +2227,7 @@ public static final short TABLESWITCH = 170; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2151,7 +2235,7 @@ public static final short LOOKUPSWITCH = 171; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2159,7 +2243,7 @@ public static final short IRETURN = 172; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2167,7 +2251,7 @@ public static final short LRETURN = 173; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2175,7 +2259,7 @@ public static final short FRETURN = 174; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2183,7 +2267,7 @@ public static final short DRETURN = 175; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2191,7 +2275,7 @@ public static final short ARETURN = 176; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2199,7 +2283,7 @@ public static final short RETURN = 177; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -2207,7 +2291,7 @@ public static final short GETSTATIC = 178; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -2215,7 +2299,7 @@ public static final short PUTSTATIC = 179; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -2223,7 +2307,7 @@ public static final short GETFIELD = 180; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -2231,7 +2315,7 @@ public static final short PUTFIELD = 181; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2239,7 +2323,7 @@ public static final short INVOKEVIRTUAL = 182; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2247,7 +2331,7 @@ public static final short INVOKESPECIAL = 183; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -2255,7 +2339,7 @@ public static final short INVOKENONVIRTUAL = 183; // Old name in JDK 1.0 /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2263,7 +2347,7 @@ public static final short INVOKESTATIC = 184; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2271,7 +2355,7 @@ public static final short INVOKEINTERFACE = 185; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2279,7 +2363,7 @@ public static final short INVOKEDYNAMIC = 186; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in The * Java Virtual Machine Specification @@ -2287,7 +2371,7 @@ public static final short NEW = 187; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -2295,7 +2379,7 @@ public static final short NEWARRAY = 188; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -2303,7 +2387,7 @@ public static final short ANEWARRAY = 189; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2311,7 +2395,7 @@ public static final short ARRAYLENGTH = 190; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2319,7 +2403,7 @@ public static final short ATHROW = 191; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -2327,7 +2411,7 @@ public static final short CHECKCAST = 192; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -2335,7 +2419,7 @@ public static final short INSTANCEOF = 193; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2343,7 +2427,7 @@ public static final short MONITORENTER = 194; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2351,7 +2435,7 @@ public static final short MONITOREXIT = 195; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2359,7 +2443,7 @@ public static final short WIDE = 196; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode * definitions in The Java Virtual Machine Specification @@ -2367,7 +2451,7 @@ public static final short MULTIANEWARRAY = 197; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2375,7 +2459,7 @@ public static final short IFNULL = 198; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions * in The Java Virtual Machine Specification @@ -2383,7 +2467,7 @@ public static final short IFNONNULL = 199; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2391,7 +2475,7 @@ public static final short GOTO_W = 200; /** - * Java VM opcode. + * Java VM opcode {@value}. * * @see Opcode definitions in * The Java Virtual Machine Specification @@ -2399,7 +2483,7 @@ public static final short JSR_W = 201; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see Reserved opcodes in the Java * Virtual Machine Specification @@ -2407,7 +2491,7 @@ public static final short BREAKPOINT = 202; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2418,7 +2502,7 @@ public static final short LDC_QUICK = 203; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2429,7 +2513,7 @@ public static final short LDC_W_QUICK = 204; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2440,7 +2524,7 @@ public static final short LDC2_W_QUICK = 205; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2451,7 +2535,7 @@ public static final short GETFIELD_QUICK = 206; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2462,7 +2546,7 @@ public static final short PUTFIELD_QUICK = 207; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2473,7 +2557,7 @@ public static final short GETFIELD2_QUICK = 208; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2484,7 +2568,7 @@ public static final short PUTFIELD2_QUICK = 209; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2495,7 +2579,7 @@ public static final short GETSTATIC_QUICK = 210; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2506,7 +2590,7 @@ public static final short PUTSTATIC_QUICK = 211; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2517,7 +2601,7 @@ public static final short GETSTATIC2_QUICK = 212; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2528,7 +2612,7 @@ public static final short PUTSTATIC2_QUICK = 213; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2539,7 +2623,7 @@ public static final short INVOKEVIRTUAL_QUICK = 214; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2550,7 +2634,7 @@ public static final short INVOKENONVIRTUAL_QUICK = 215; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2561,7 +2645,7 @@ public static final short INVOKESUPER_QUICK = 216; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2572,7 +2656,7 @@ public static final short INVOKESTATIC_QUICK = 217; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2583,7 +2667,7 @@ public static final short INVOKEINTERFACE_QUICK = 218; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2594,7 +2678,7 @@ public static final short INVOKEVIRTUALOBJECT_QUICK = 219; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2605,7 +2689,7 @@ public static final short NEW_QUICK = 221; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2616,7 +2700,7 @@ public static final short ANEWARRAY_QUICK = 222; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2627,7 +2711,7 @@ public static final short MULTIANEWARRAY_QUICK = 223; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2638,7 +2722,7 @@ public static final short CHECKCAST_QUICK = 224; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2649,7 +2733,7 @@ public static final short INSTANCEOF_QUICK = 225; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2660,7 +2744,7 @@ public static final short INVOKEVIRTUAL_QUICK_W = 226; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2671,7 +2755,7 @@ public static final short GETFIELD_QUICK_W = 227; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see @@ -2682,7 +2766,7 @@ public static final short PUTFIELD_QUICK_W = 228; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see Reserved opcodes in the Java * Virtual Machine Specification @@ -2690,7 +2774,7 @@ public static final short IMPDEP1 = 254; /** - * JVM internal opcode. + * JVM internal opcode {@value}. * * @see Reserved opcodes in the Java * Virtual Machine Specification @@ -2698,34 +2782,44 @@ public static final short IMPDEP2 = 255; /** - * BCEL virtual instruction for pushing an arbitrary data type onto the stack. Will be converted to the appropriate JVM + * BCEL virtual instruction for pushing an arbitrary data type onto the stack: {@value}. Will be converted to the appropriate JVM * opcode when the class is dumped. */ public static final short PUSH = 4711; /** - * BCEL virtual instruction for either LOOKUPSWITCH or TABLESWITCH. Will be converted to the appropriate JVM opcode when + * BCEL virtual instruction for either LOOKUPSWITCH or TABLESWITCH: {@value}. Will be converted to the appropriate JVM opcode when * the class is dumped. */ public static final short SWITCH = 4712; - /** Illegal opcode. */ + /** + * Illegal opcode: {@value}. + */ public static final short UNDEFINED = -1; - /** Illegal opcode. */ + /** + * Illegal opcode: {@value}. + */ public static final short UNPREDICTABLE = -2; - /** Illegal opcode. */ + /** + * Illegal opcode: {@value}. + */ public static final short RESERVED = -3; - /** Mnemonic for an illegal opcode. */ + /** + * Mnemonic for an illegal opcode: {@value}. + */ public static final String ILLEGAL_OPCODE = ""; - /** Mnemonic for an illegal type. */ + /** + * Mnemonic for an illegal type: {@value}. + */ public static final String ILLEGAL_TYPE = ""; /** - * Boolean data type. + * Boolean data type: {@value}. * * @see Static Constraints in * the Java Virtual Machine Specification @@ -2733,7 +2827,7 @@ public static final byte T_BOOLEAN = 4; /** - * Char data type. + * Char data type: {@value}. * * @see Static Constraints in * the Java Virtual Machine Specification @@ -2741,7 +2835,7 @@ public static final byte T_CHAR = 5; /** - * Float data type. + * Float data type: {@value}. * * @see Static Constraints in * the Java Virtual Machine Specification @@ -2749,7 +2843,7 @@ public static final byte T_FLOAT = 6; /** - * Double data type. + * Double data type: {@value}. * * @see Static Constraints in * the Java Virtual Machine Specification @@ -2757,7 +2851,7 @@ public static final byte T_DOUBLE = 7; /** - * Byte data type. + * Byte data type: {@value}. * * @see Static Constraints in * the Java Virtual Machine Specification @@ -2765,7 +2859,7 @@ public static final byte T_BYTE = 8; /** - * Short data type. + * Short data type: {@value}. * * @see Static Constraints in * the Java Virtual Machine Specification @@ -2773,7 +2867,7 @@ public static final byte T_SHORT = 9; /** - * Int data type. + * Int data type: {@value}. * * @see Static Constraints in * the Java Virtual Machine Specification @@ -2781,7 +2875,7 @@ public static final byte T_INT = 10; /** - * Long data type. + * Long data type: {@value}. * * @see Static Constraints in * the Java Virtual Machine Specification @@ -2827,7 +2921,7 @@ /** * The signature characters corresponding to primitive types, e.g., SHORT_TYPE_NAMES[T_INT] = "I" */ - private static final String[] SHORT_TYPE_NAMES = {ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, "Z", "C", "F", "D", "B", "S", "I", "J", "V", + public static final String[] SHORT_TYPE_NAMES = {ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, "Z", "C", "F", "D", "B", "S", "I", "J", "V", ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE}; /** @@ -3036,11 +3130,13 @@ public static final byte ATTR_MODULE_MAIN_CLASS = 24; public static final byte ATTR_NEST_HOST = 25; public static final byte ATTR_NEST_MEMBERS = 26; - public static final short KNOWN_ATTRIBUTES = 27; // count of attributes + public static final byte ATTR_RECORD = 27; + + public static final short KNOWN_ATTRIBUTES = 28; // count of attributes private static final String[] ATTRIBUTE_NAMES = {"SourceFile", "ConstantValue", "Code", "Exceptions", "LineNumberTable", "LocalVariableTable", "InnerClasses", "Synthetic", "Deprecated", "PMGClass", "Signature", "StackMap", "RuntimeVisibleAnnotations", "RuntimeInvisibleAnnotations", "RuntimeVisibleParameterAnnotations", "RuntimeInvisibleParameterAnnotations", "AnnotationDefault", "LocalVariableTypeTable", "EnclosingMethod", - "StackMapTable", "BootstrapMethods", "MethodParameters", "Module", "ModulePackages", "ModuleMainClass", "NestHost", "NestMembers"}; + "StackMapTable", "BootstrapMethods", "MethodParameters", "Module", "ModulePackages", "ModuleMainClass", "NestHost", "NestMembers", "Record"}; /** * Constants used in the StackMap attribute. */ @@ -3070,6 +3166,7 @@ public static final int SAME_FRAME_EXTENDED = 251; public static final int APPEND_FRAME = 252; public static final int FULL_FRAME = 255; + /** * Constants that define the maximum value of those constants which store ranges. */ @@ -3090,6 +3187,7 @@ public static final byte REF_invokeSpecial = 7; public static final byte REF_newInvokeSpecial = 8; public static final byte REF_invokeInterface = 9; + /** * The names of the reference_kinds of a CONSTANT_MethodHandle_info. */ @@ -3097,7 +3195,7 @@ "newInvokeSpecial", "invokeInterface"}; /** - * @param index + * @param index index into {@code ACCESS_NAMES}. * @return the ACCESS_NAMES entry at the given index * @since 6.0 */ @@ -3107,7 +3205,7 @@ /** * - * @param index + * @param index index into {@code ACCESS_NAMES}. * @return the attribute name * @since 6.0 */ @@ -3118,7 +3216,7 @@ /** * The primitive class names corresponding to the T_XX constants, e.g., CLASS_TYPE_NAMES[T_INT] = "java.lang.Integer" * - * @param index + * @param index index into {@code CLASS_TYPE_NAMES}. * @return the class name * @since 6.0 */ @@ -3128,7 +3226,7 @@ /** * - * @param index + * @param index index into {@code CONSTANT_NAMES}. * @return the CONSTANT_NAMES entry at the given index * @since 6.0 */ @@ -3140,7 +3238,7 @@ /** * - * @param index + * @param index index into {@code CONSUME_STACK}. * @return Number of words consumed on operand stack * @since 6.0 */ @@ -3157,7 +3255,7 @@ /** * - * @param index + * @param index index into {@code ITEM_NAMES}. * @return the item name * @since 6.0 */ @@ -3167,7 +3265,7 @@ /** * - * @param index + * @param index index into {@code METHODHANDLE_NAMES}. * @return the method handle name * @since 6.0 */ @@ -3177,7 +3275,7 @@ /** * - * @param index + * @param index index into {@code NO_OF_OPERANDS}. * @return Number of byte code operands * @since 6.0 */ diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/ExceptionConst.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/ExceptionConst.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/ExceptionConst.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/ExceptionConst.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -26,7 +26,7 @@ * Exception constants. * * @since 6.0 (intended to replace the InstructionConstant interface) - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public final class ExceptionConst { @@ -52,7 +52,6 @@ * Super class of any linking exception (aka Linkage Error) */ public static final Class LINKING_EXCEPTION = LinkageError.class; - /** * Linking Exceptions */ @@ -67,10 +66,10 @@ public static final Class NO_SUCH_METHOD_ERROR = NoSuchMethodError.class; public static final Class NO_CLASS_DEF_FOUND_ERROR = NoClassDefFoundError.class; public static final Class UNSATISFIED_LINK_ERROR = UnsatisfiedLinkError.class; + public static final Class VERIFY_ERROR = VerifyError.class; /* UnsupportedClassVersionError is new in JDK 1.2 */ // public static final Class UnsupportedClassVersionError = UnsupportedClassVersionError.class; - /** * Run-Time Exceptions */ diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/Repository.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/Repository.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/Repository.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/Repository.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -30,7 +30,7 @@ * @see com.sun.org.apache.bcel.internal.util.Repository * @see SyntheticRepository * - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public abstract class Repository { @@ -174,7 +174,7 @@ } /** - * Lookups class somewhere found on your CLASSPATH, or wherever the repository instance looks for it. + * Lookups class somewhere found on your CLASSPATH, or whereever the repository instance looks for it. * * @return class object for given fully qualified class name * @throws ClassNotFoundException if the class could not be found or parsed correctly diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/AccessFlags.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/AccessFlags.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/AccessFlags.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/AccessFlags.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -25,27 +25,36 @@ * Super class for all objects that have modifiers like private, final, ... I.e. * classes, fields, and methods. * - * @LastModified: Jan 2020 + * @LastModified: Sept 2025 */ public abstract class AccessFlags { /** - * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter + * Access flags. + * + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter. */ @java.lang.Deprecated protected int access_flags; // TODO not used externally at present + /** + * Constructs a new instance. + */ public AccessFlags() { } /** - * @param a initial access flags + * Constructs a new instance. + * + * @param accessFlags initial access flags. */ - public AccessFlags(final int a) { - access_flags = a; + public AccessFlags(final int accessFlags) { + access_flags = accessFlags; } /** + * Gets access flags. + * * @return Access flags of the object aka. "modifiers". */ public final int getAccessFlags() { @@ -53,142 +62,303 @@ } /** - * @return Access flags of the object aka. "modifiers". + * Gets access flags. + * + * @return Access flags of the object also known as modifiers. */ public final int getModifiers() { return access_flags; } + /** + * Tests whether the abstract bit is on. + * + * @return whether the abstract bit is on. + */ public final boolean isAbstract() { - return (access_flags & Const.ACC_ABSTRACT) != 0; + return test(Const.ACC_ABSTRACT); } + /** + * Sets the abstract bit. + * + * @param flag The new value. + */ public final void isAbstract(final boolean flag) { setFlag(Const.ACC_ABSTRACT, flag); } + /** + * Tests whether the annotation bit is on. + * + * @return whether the annotation bit is on. + */ public final boolean isAnnotation() { - return (access_flags & Const.ACC_ANNOTATION) != 0; + return test(Const.ACC_ANNOTATION); } + /** + * Sets the annotation bit. + * + * @param flag The new value. + */ public final void isAnnotation(final boolean flag) { setFlag(Const.ACC_ANNOTATION, flag); } - + /** + * Tests whether the enum bit is on. + * + * @return whether the enum bit is on. + */ public final boolean isEnum() { - return (access_flags & Const.ACC_ENUM) != 0; + return test(Const.ACC_ENUM); } + /** + * Sets the enum bit. + * + * @param flag The new value. + */ public final void isEnum(final boolean flag) { setFlag(Const.ACC_ENUM, flag); } + /** + * Tests whether the final bit is on. + * + * @return whether the final bit is on. + */ public final boolean isFinal() { - return (access_flags & Const.ACC_FINAL) != 0; + return test(Const.ACC_FINAL); } + /** + * Sets the final bit. + * + * @param flag The new value. + */ public final void isFinal(final boolean flag) { setFlag(Const.ACC_FINAL, flag); } + /** + * Tests whether the interface bit is on. + * + * @return whether the interface bit is on. + */ public final boolean isInterface() { - return (access_flags & Const.ACC_INTERFACE) != 0; + return test(Const.ACC_INTERFACE); } + /** + * Sets the interface bit. + * + * @param flag The new value. + */ public final void isInterface(final boolean flag) { setFlag(Const.ACC_INTERFACE, flag); } + /** + * Tests whether the native bit is on. + * + * @return whether the native bit is on. + */ public final boolean isNative() { - return (access_flags & Const.ACC_NATIVE) != 0; + return test(Const.ACC_NATIVE); } + /** + * Sets the native bit. + * + * @param flag The new value. + */ public final void isNative(final boolean flag) { setFlag(Const.ACC_NATIVE, flag); } + /** + * Tests whether the private bit is on. + * + * @return whether the private bit is on. + */ public final boolean isPrivate() { - return (access_flags & Const.ACC_PRIVATE) != 0; + return test(Const.ACC_PRIVATE); } + /** + * Sets the private bit. + * + * @param flag The new value. + */ public final void isPrivate(final boolean flag) { setFlag(Const.ACC_PRIVATE, flag); } + /** + * Tests whether the protected bit is on. + * + * @return whether the protected bit is on. + */ public final boolean isProtected() { - return (access_flags & Const.ACC_PROTECTED) != 0; + return test(Const.ACC_PROTECTED); } + /** + * Sets the protected bit. + * + * @param flag The new value. + */ public final void isProtected(final boolean flag) { setFlag(Const.ACC_PROTECTED, flag); } + /** + * Tests whether the public bit is on. + * + * @return whether the public bit is on. + */ public final boolean isPublic() { - return (access_flags & Const.ACC_PUBLIC) != 0; + return test(Const.ACC_PUBLIC); } + /** + * Sets the public bit. + * + * @param flag The new value. + */ public final void isPublic(final boolean flag) { setFlag(Const.ACC_PUBLIC, flag); } + /** + * Tests whether the static bit is on. + * + * @return whether the static bit is on. + */ public final boolean isStatic() { - return (access_flags & Const.ACC_STATIC) != 0; + return test(Const.ACC_STATIC); } + /** + * Sets the static bit. + * + * @param flag The new value. + */ public final void isStatic(final boolean flag) { setFlag(Const.ACC_STATIC, flag); } + /** + * Tests whether the strict bit is on. + * + * @return whether the strict bit is on. + */ public final boolean isStrictfp() { - return (access_flags & Const.ACC_STRICT) != 0; + return test(Const.ACC_STRICT); } + /** + * Sets the strict bit. + * + * @param flag The new value. + */ public final void isStrictfp(final boolean flag) { setFlag(Const.ACC_STRICT, flag); } + /** + * Tests whether the synchronized bit is on. + * + * @return whether the synchronized bit is on. + */ public final boolean isSynchronized() { - return (access_flags & Const.ACC_SYNCHRONIZED) != 0; + return test(Const.ACC_SYNCHRONIZED); } + /** + * Sets the synchronized bit. + * + * @param flag The new value. + */ public final void isSynchronized(final boolean flag) { setFlag(Const.ACC_SYNCHRONIZED, flag); } + /** + * Tests whether the synthetic bit is on. + * + * @return whether the synthetic bit is on. + */ public final boolean isSynthetic() { - return (access_flags & Const.ACC_SYNTHETIC) != 0; + return test(Const.ACC_SYNTHETIC); } + /** + * Sets the synthetic bit. + * + * @param flag The new value. + */ public final void isSynthetic(final boolean flag) { setFlag(Const.ACC_SYNTHETIC, flag); } + /** + * Tests whether the transient bit is on. + * + * @return whether the varargs bit is on. + */ public final boolean isTransient() { - return (access_flags & Const.ACC_TRANSIENT) != 0; + return test(Const.ACC_TRANSIENT); } + /** + * Sets the varargs bit. + * + * @param flag The new value. + */ public final void isTransient(final boolean flag) { setFlag(Const.ACC_TRANSIENT, flag); } + /** + * Tests whether the varargs bit is on. + * + * @return whether the varargs bit is on. + */ public final boolean isVarArgs() { - return (access_flags & Const.ACC_VARARGS) != 0; + return test(Const.ACC_VARARGS); } + /** + * Sets the varargs bit. + * + * @param flag The new value. + */ public final void isVarArgs(final boolean flag) { setFlag(Const.ACC_VARARGS, flag); } + /** + * Tests whether the volatile bit is on. + * + * @return whether the volatile bit is on. + */ public final boolean isVolatile() { - return (access_flags & Const.ACC_VOLATILE) != 0; + return test(Const.ACC_VOLATILE); } + /** + * Sets the volatile bit. + * + * @param flag The new value. + */ public final void isVolatile(final boolean flag) { setFlag(Const.ACC_VOLATILE, flag); } /** - * Set access flags aka "modifiers". + * Sets access flags also known as modifiers. * * @param accessFlags Access flags of the object. */ @@ -207,11 +377,21 @@ } /** - * Set access flags aka "modifiers". + * Sets access flags aka "modifiers". * * @param accessFlags Access flags of the object. */ public final void setModifiers(final int accessFlags) { setAccessFlags(accessFlags); } + + /** + * Tests whether the bit is on. + * + * @param test the bit to test. + * @return whether the bit is on. + */ + private boolean test(final short test) { + return (access_flags & test) != 0; + } } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/AnnotationEntry.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/AnnotationEntry.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/AnnotationEntry.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/AnnotationEntry.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,6 +1,5 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -27,20 +26,22 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; +import jdk.xml.internal.Utils; /** * Represents one annotation in the annotation table * * @since 6.0 + * @LastModified: Sept 2025 */ public class AnnotationEntry implements Node { public static final AnnotationEntry[] EMPTY_ARRAY = {}; - public static AnnotationEntry[] createAnnotationEntries(final Attribute[] attrs) { + public static AnnotationEntry[] createAnnotationEntries(final Attribute[] attributes) { // Find attributes that contain annotation data - return Stream.of(attrs).filter(Annotations.class::isInstance).flatMap(e -> Stream.of(((Annotations) e).getAnnotationEntries())) - .toArray(AnnotationEntry[]::new); + return Utils.streamOfIfNonNull(attributes).filter(Annotations.class::isInstance).flatMap(e -> Stream.of(((Annotations) e).getAnnotationEntries())) + .toArray(AnnotationEntry[]::new); } /** @@ -55,7 +56,6 @@ public static AnnotationEntry read(final DataInput input, final ConstantPool constantPool, final boolean isRuntimeVisible) throws IOException { final AnnotationEntry annotationEntry = new AnnotationEntry(input.readUnsignedShort(), constantPool, isRuntimeVisible); final int numElementValuePairs = input.readUnsignedShort(); - annotationEntry.elementValuePairs = new ArrayList<>(); for (int i = 0; i < numElementValuePairs; i++) { annotationEntry.elementValuePairs .add(new ElementValuePair(input.readUnsignedShort(), ElementValue.readElementValue(input, constantPool), constantPool)); @@ -69,12 +69,13 @@ private final boolean isRuntimeVisible; - private List elementValuePairs; + private final List elementValuePairs; public AnnotationEntry(final int typeIndex, final ConstantPool constantPool, final boolean isRuntimeVisible) { this.typeIndex = typeIndex; this.constantPool = constantPool; this.isRuntimeVisible = isRuntimeVisible; + this.elementValuePairs = new ArrayList<>(); } /** diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Annotations.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Annotations.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Annotations.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Annotations.java 2026-04-17 19:09:35.000000000 +0000 @@ -52,7 +52,7 @@ public Annotations(final byte annotationType, final int nameIndex, final int length, final AnnotationEntry[] annotationTable, final ConstantPool constantPool, final boolean isRuntimeVisible) { super(annotationType, nameIndex, length, constantPool); - this.annotationTable = annotationTable; + setAnnotationTable(annotationTable); this.isRuntimeVisible = isRuntimeVisible; } @@ -108,9 +108,6 @@ * @return the number of annotation entries in this annotation */ public final int getNumAnnotations() { - if (annotationTable == null) { - return 0; - } return annotationTable.length; } @@ -129,7 +126,7 @@ * @param annotationTable the entries to set in this annotation */ public final void setAnnotationTable(final AnnotationEntry[] annotationTable) { - this.annotationTable = annotationTable; + this.annotationTable = annotationTable != null ? annotationTable : AnnotationEntry.EMPTY_ARRAY; } /** @@ -151,9 +148,6 @@ } protected void writeAnnotations(final DataOutputStream dos) throws IOException { - if (annotationTable == null) { - return; - } dos.writeShort(annotationTable.length); for (final AnnotationEntry element : annotationTable) { element.dump(dos); diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ArrayElementValue.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ArrayElementValue.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ArrayElementValue.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ArrayElementValue.java 2026-04-17 19:09:35.000000000 +0000 @@ -31,12 +31,12 @@ // For array types, this is the array private final ElementValue[] elementValues; - public ArrayElementValue(final int type, final ElementValue[] datums, final ConstantPool cpool) { + public ArrayElementValue(final int type, final ElementValue[] elementValues, final ConstantPool cpool) { super(type, cpool); if (type != ARRAY) { throw new ClassFormatException("Only element values of type array can be built with this ctor - type specified: " + type); } - this.elementValues = datums; + this.elementValues = elementValues != null ? elementValues : EMPTY_ARRAY; } @Override diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Attribute.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Attribute.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Attribute.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Attribute.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -53,7 +53,7 @@ * @see Synthetic * @see Deprecated * @see Signature - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public abstract class Attribute implements Cloneable, Node { private static final boolean debug = false; @@ -181,6 +181,8 @@ return new NestHost(nameIndex, length, dataInput, constantPool); case Const.ATTR_NEST_MEMBERS: return new NestMembers(nameIndex, length, dataInput, constantPool); + case Const.ATTR_RECORD: + return new Record(nameIndex, length, dataInput, constantPool); default: // Never reached throw new IllegalStateException("Unrecognized attribute type tag parsed: " + tag); @@ -279,7 +281,7 @@ try { attr = (Attribute) super.clone(); } catch (final CloneNotSupportedException e) { - throw new Error("Clone Not Supported"); // never happens + throw new UnsupportedOperationException("Clone Not Supported", e); // never happens } return attr; } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/BootstrapMethod.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/BootstrapMethod.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/BootstrapMethod.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/BootstrapMethod.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,6 +1,5 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -27,6 +26,7 @@ import java.util.Arrays; import com.sun.org.apache.bcel.internal.Const; +import jdk.xml.internal.Utils; /** * This class represents a bootstrap method attribute, i.e., the bootstrap method ref, the number of bootstrap arguments @@ -35,9 +35,12 @@ * @see The class File Format : * The BootstrapMethods Attribute * @since 6.0 + * @LastModified: Sept 2025 */ public class BootstrapMethod implements Cloneable { + static final BootstrapMethod[] EMPTY_ARRAY = {}; + /** Index of the CONSTANT_MethodHandle_info structure in the constant_pool table */ private int bootstrapMethodRef; @@ -54,7 +57,7 @@ } /** - * Construct object from input stream. + * Constructs object from input stream. * * @param input Input stream * @throws IOException if an I/O error occurs. @@ -78,7 +81,7 @@ */ public BootstrapMethod(final int bootstrapMethodRef, final int[] bootstrapArguments) { this.bootstrapMethodRef = bootstrapMethodRef; - this.bootstrapArguments = bootstrapArguments; + setBootstrapArguments(bootstrapArguments); } /** @@ -87,7 +90,7 @@ public BootstrapMethod copy() { try { return (BootstrapMethod) clone(); - } catch (final CloneNotSupportedException e) { + } catch (final CloneNotSupportedException ignore) { // TODO should this throw? } return null; @@ -132,7 +135,7 @@ * @param bootstrapArguments int[] indices into constant_pool of CONSTANT_[type]_info */ public void setBootstrapArguments(final int[] bootstrapArguments) { - this.bootstrapArguments = bootstrapArguments; + this.bootstrapArguments = Utils.createEmptyArrayIfNull(bootstrapArguments); } /** diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/BootstrapMethods.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/BootstrapMethods.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/BootstrapMethods.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/BootstrapMethods.java 2026-04-17 19:09:35.000000000 +0000 @@ -58,11 +58,11 @@ */ public BootstrapMethods(final int nameIndex, final int length, final BootstrapMethod[] bootstrapMethods, final ConstantPool constantPool) { super(Const.ATTR_BOOTSTRAP_METHODS, nameIndex, length, constantPool); - this.bootstrapMethods = bootstrapMethods; + setBootstrapMethods(bootstrapMethods); } /** - * Construct object from Input stream. + * Constructs object from Input stream. * * @param nameIndex Index in constant pool to CONSTANT_Utf8 * @param length Content length in bytes @@ -135,7 +135,7 @@ * @param bootstrapMethods the array of bootstrap methods */ public final void setBootstrapMethods(final BootstrapMethod[] bootstrapMethods) { - this.bootstrapMethods = bootstrapMethods; + this.bootstrapMethods = bootstrapMethods != null ? bootstrapMethods : BootstrapMethod.EMPTY_ARRAY; } /** diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ClassFormatException.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ClassFormatException.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ClassFormatException.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ClassFormatException.java 2026-04-17 19:09:35.000000000 +0000 @@ -47,12 +47,10 @@ /** * Constructs a new instance with the specified detail message and cause. - *

- * Note that the detail message associated with {@code cause} is not automatically incorporated in this runtime exception's detail message. * * @param message the detail message (which is saved for later retrieval by the {@link #getMessage()} method). - * @param cause the cause (which is saved for later retrieval by the {@link #getCause()} method). (A {@code null} value is permitted, and indicates that - * the cause is nonexistent or unknown.) + * @param cause the cause (which is saved for later retrieval by the {@link #getCause()} method). A {@code null} value is permitted, and indicates that + * the cause is nonexistent or unknown. * @since 6.0 */ public ClassFormatException(final String message, final Throwable cause) { @@ -63,8 +61,8 @@ * Constructs a new instance with the specified cause and a detail message of {@code (cause==null ? null : cause.toString())} (which typically contains the * class and detail message of {@code cause}). This constructor is useful for runtime exceptions that are little more than wrappers for other throwables. * - * @param cause the cause (which is saved for later retrieval by the {@link #getCause()} method). (A {@code null} value is permitted, and indicates that the - * cause is nonexistent or unknown.) + * @param cause the cause (which is saved for later retrieval by the {@link #getCause()} method). A {@code null} value is permitted, and indicates that the + * cause is nonexistent or unknown. * @since 6.7.0 */ public ClassFormatException(final Throwable cause) { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ClassParser.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ClassParser.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ClassParser.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ClassParser.java 2026-04-17 19:09:35.000000000 +0000 @@ -37,7 +37,7 @@ * appropriate exception is propagated back to the caller. * * The structure and the names comply, except for a few conveniences, exactly with the - * JVM specification 1.0. See this paper for further details about + * JVM specification 1.0. See this paper for further details about * the structure of a bytecode file. */ public final class ClassParser { @@ -57,7 +57,7 @@ private Field[] fields; // class fields, i.e., its variables private Method[] methods; // methods defined in the class private Attribute[] attributes; // attributes defined in the class - private final boolean isZip; // Loaded from zip file + private final boolean isZip; // Loaded from ZIP file /** * Parses class from the given stream. @@ -91,7 +91,7 @@ /** * Parses class from given .class file in a ZIP-archive * - * @param zipFile zip file name + * @param zipFile ZIP file name * @param fileName file name */ public ClassParser(final String zipFile, final String fileName) { @@ -104,7 +104,7 @@ /** * Parses the given Java class file and return an object that represents the contained data, i.e., constants, methods, * fields and commands. A ClassFormatException is raised, if the file is not a valid .class file. (This does - * not include verification of the byte code as it is performed by the java interpreter). + * not include verification of the byte code as it is performed by the Java interpreter). * * @return Class object representing the parsed class file * @throws IOException if an I/O error occurs. @@ -151,11 +151,11 @@ // for (int i=0; i < u.length; i++) // System.err.println("WARNING: " + u[i]); // Everything should have been read now - // if(file.available() > 0) { + // if (file.available() > 0) { // int bytes = file.available(); // byte[] buf = new byte[bytes]; // file.read(buf); - // if(!(isZip && (buf.length == 1))) { + // if (!(isZip && (buf.length == 1))) { // System.err.println("WARNING: Trailing garbage at end of " + fileName); // System.err.println(bytes + " extra bytes: " + Utility.toHexString(buf)); // } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Code.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Code.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Code.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Code.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -27,6 +27,7 @@ import com.sun.org.apache.bcel.internal.Const; import com.sun.org.apache.bcel.internal.util.Args; +import jdk.xml.internal.Utils; /** * This class represents a chunk of Java byte code contained in a method. It is instantiated by the @@ -59,7 +60,7 @@ * @see CodeException * @see LineNumberTable * @see LocalVariableTable - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public final class Code extends Attribute { @@ -93,7 +94,7 @@ code = new byte[codeLength]; // Read byte code file.readFully(code); /* - * Read exception table that contains all regions where an exception handler is active, i.e., a try { ... } catch() + * Read exception table that contains all regions where an exception handler is active, i.e., a try { ... } catch () * block. */ final int exceptionTableLength = file.readUnsignedShort(); @@ -107,7 +108,7 @@ final int attributesCount = file.readUnsignedShort(); attributes = new Attribute[attributesCount]; for (int i = 0; i < attributesCount; i++) { - attributes[i] = Attribute.readAttribute(file, constantPool); + attributes[i] = readAttribute(file, constantPool); } /* * Adjust length, because of setAttributes in this(), s.b. length is incorrect, because it didn't take the internal @@ -131,8 +132,8 @@ super(Const.ATTR_CODE, nameIndex, length, constantPool); this.maxStack = Args.requireU2(maxStack, "maxStack"); this.maxLocals = Args.requireU2(maxLocals, "maxLocals"); - this.code = code != null ? code : Const.EMPTY_BYTE_ARRAY; - this.exceptionTable = exceptionTable != null ? exceptionTable : CodeException.EMPTY_CODE_EXCEPTION_ARRAY; + this.code = Utils.createEmptyArrayIfNull(code); + this.exceptionTable = Utils.createEmptyArrayIfNull(exceptionTable, CodeException[].class); Args.requireU2(this.exceptionTable.length, "exceptionTable.length"); this.attributes = attributes != null ? attributes : EMPTY_ARRAY; super.setLength(calculateLength()); // Adjust length @@ -264,6 +265,20 @@ } /** + * Gets the local variable type table attribute {@link LocalVariableTypeTable}. + * @return LocalVariableTypeTable of Code, if it has one, null otherwise. + * @since 6.10.0 + */ + public LocalVariableTypeTable getLocalVariableTypeTable() { + for (final Attribute attribute : attributes) { + if (attribute instanceof LocalVariableTypeTable) { + return (LocalVariableTypeTable) attribute; + } + } + return null; + } + + /** * @return Number of local variables. */ public int getMaxLocals() { @@ -278,6 +293,20 @@ } /** + * Finds the attribute of {@link StackMap} instance. + * @return StackMap of Code, if it has one, else null. + * @since 6.8.0 + */ + public StackMap getStackMap() { + for (final Attribute attribute : attributes) { + if (attribute instanceof StackMap) { + return (StackMap) attribute; + } + } + return null; + } + + /** * @param attributes the attributes to set for this Code */ public void setAttributes(final Attribute[] attributes) { @@ -289,7 +318,7 @@ * @param code byte code */ public void setCode(final byte[] code) { - this.code = code != null ? code : Const.EMPTY_BYTE_ARRAY; + this.code = Utils.createEmptyArrayIfNull(code); super.setLength(calculateLength()); // Adjust length } @@ -297,7 +326,7 @@ * @param exceptionTable exception table */ public void setExceptionTable(final CodeException[] exceptionTable) { - this.exceptionTable = exceptionTable != null ? exceptionTable : CodeException.EMPTY_CODE_EXCEPTION_ARRAY; + this.exceptionTable = exceptionTable != null ? exceptionTable : CodeException.EMPTY_ARRAY; super.setLength(calculateLength()); // Adjust length } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/CodeException.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/CodeException.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/CodeException.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/CodeException.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -52,19 +52,19 @@ *

* * @see Code - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public final class CodeException implements Cloneable, Node { /** * Empty array. */ - static final CodeException[] EMPTY_CODE_EXCEPTION_ARRAY = {}; + static final CodeException[] EMPTY_ARRAY = {}; /** Range in the code the exception handler. */ private int startPc; - /** active. startPc is inclusive, endPc exclusive. */ + /** Active. startPc is inclusive, endPc exclusive. */ private int endPc; /** diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Constant.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Constant.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Constant.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Constant.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -32,30 +32,29 @@ * in the constant pool of a class file. The classes keep closely to * the JVM specification. * - * @LastModified: May 2021 + * @LastModified: Sept 2025 */ public abstract class Constant implements Cloneable, Node { - private static BCELComparator bcelComparator = new BCELComparator() { + static final Constant[] EMPTY_ARRAY = {}; + + private static BCELComparator bcelComparator = new BCELComparator() { @Override - public boolean equals(final Object o1, final Object o2) { - final Constant THIS = (Constant) o1; - final Constant THAT = (Constant) o2; - return Objects.equals(THIS.toString(), THAT.toString()); + public boolean equals(final Constant a, final Constant b) { + return a == b || a != null && b != null && Objects.equals(a.toString(), b.toString()); } @Override - public int hashCode(final Object o) { - final Constant THIS = (Constant) o; - return THIS.toString().hashCode(); + public int hashCode(final Constant o) { + return o != null ? Objects.hashCode(o.toString()) : 0; } }; /** - * @return Comparison strategy object + * @return Comparison strategy object. */ - public static BCELComparator getComparator() { + public static BCELComparator getComparator() { return bcelComparator; } @@ -113,7 +112,7 @@ /** * @param comparator Comparison strategy object */ - public static void setComparator(final BCELComparator comparator) { + public static void setComparator(final BCELComparator comparator) { bcelComparator = comparator; } @@ -148,7 +147,7 @@ try { return super.clone(); } catch (final CloneNotSupportedException e) { - throw new Error("Clone Not Supported"); // never happens + throw new UnsupportedOperationException("Clone Not Supported", e); // never happens } } @@ -174,7 +173,7 @@ */ @Override public boolean equals(final Object obj) { - return bcelComparator.equals(this, obj); + return obj instanceof Constant && bcelComparator.equals(this, (Constant) obj); } /** @@ -185,7 +184,7 @@ } /** - * Returns value as defined by given BCELComparator strategy. By default return the hashcode of the result of + * Returns value as defined by given BCELComparator strategy. By default return the hash code of the result of * toString(). * * @see Object#hashCode() diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantCP.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantCP.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantCP.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantCP.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -28,11 +28,11 @@ /** * Abstract super class for Fieldref, Methodref, InterfaceMethodref and InvokeDynamic constants. * - * @see ConstantFieldref - * @see ConstantMethodref - * @see ConstantInterfaceMethodref - * @see ConstantInvokeDynamic - * @LastModified: Jun 2019 + * @see ConstantFieldref + * @see ConstantMethodref + * @see ConstantInterfaceMethodref + * @see ConstantInvokeDynamic + * @LastModified: Sept 2025 */ public abstract class ConstantCP extends Constant { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantDouble.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantDouble.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantDouble.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantDouble.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -29,8 +29,8 @@ /** * This class is derived from the abstract {@link Constant} and represents a reference to a Double object. * - * @see Constant - * @LastModified: Jun 2019 + * @see Constant + * @LastModified: Sept 2025 */ public final class ConstantDouble extends Constant implements ConstantObject { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantFloat.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantFloat.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantFloat.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantFloat.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -29,8 +29,8 @@ /** * This class is derived from the abstract {@link Constant} and represents a reference to a float object. * - * @see Constant - * @LastModified: Jun 2019 + * @see Constant + * @LastModified: Sept 2025 */ public final class ConstantFloat extends Constant implements ConstantObject { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantInteger.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantInteger.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantInteger.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantInteger.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -29,8 +29,8 @@ /** * This class is derived from the abstract {@link Constant} and represents a reference to an int object. * - * @see Constant - * @LastModified: Jun 2019 + * @see Constant + * @LastModified: Sept 2025 */ public final class ConstantInteger extends Constant implements ConstantObject { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantLong.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantLong.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantLong.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantLong.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -29,8 +29,8 @@ /** * This class is derived from the abstract {@link Constant} and represents a reference to a long object. * - * @see Constant - * @LastModified: Jan 2020 + * @see Constant + * @LastModified: Sept 2025 */ public final class ConstantLong extends Constant implements ConstantObject { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantObject.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantObject.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantObject.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantObject.java 2026-04-17 19:09:35.000000000 +0000 @@ -29,7 +29,10 @@ public interface ConstantObject { /** - * @return object representing the constant, e.g., Long for ConstantLong + * Gets the object representing the constant, e.g., Long for ConstantLong. + * + * @param constantPool the constant. + * @return object representing the constant, e.g., Long for ConstantLong. */ - Object getConstantValue(ConstantPool cp); + Object getConstantValue(ConstantPool constantPool); } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantPool.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantPool.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantPool.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantPool.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -35,7 +35,7 @@ * * @see Constant * @see com.sun.org.apache.bcel.internal.generic.ConstantPoolGen - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public class ConstantPool implements Cloneable, Node, Iterable { @@ -73,7 +73,7 @@ * @param constantPool Array of constants */ public ConstantPool(final Constant[] constantPool) { - this.constantPool = constantPool; + setConstantPool(constantPool); } /** @@ -88,6 +88,7 @@ constantPool = new Constant[constantPoolCount]; /* * constantPool[0] is unused by the compiler and may be used freely by the implementation. + * constantPool[0] is currently unused by the implementation. */ for (int i = 1; i < constantPoolCount; i++) { constantPool[i] = Constant.readConstant(input); @@ -288,7 +289,7 @@ */ public T getConstant(final int index, final byte tag, final Class castTo) throws ClassFormatException { final T c = getConstant(index); - if (c.getTag() != tag) { + if (c == null || c.getTag() != tag) { throw new ClassFormatException("Expected class '" + Const.getConstantName(tag) + "' at index " + index + " and got " + c); } return c; @@ -313,16 +314,18 @@ throw new ClassFormatException("Invalid constant pool reference at index: " + index + ". Expected " + castTo + " but was " + constantPool[index].getClass()); } - // Previous check ensures this won't throw a ClassCastException - final T c = castTo.cast(constantPool[index]); - if (c == null - // the 0th element is always null - && index != 0) { + if (index > 1) { final Constant prev = constantPool[index - 1]; - if (prev == null || prev.getTag() != Const.CONSTANT_Double && prev.getTag() != Const.CONSTANT_Long) { - throw new ClassFormatException("Constant pool at index " + index + " is null."); + if (prev != null && (prev.getTag() == Const.CONSTANT_Double || prev.getTag() == Const.CONSTANT_Long)) { + throw new ClassFormatException("Constant pool at index " + index + " is invalid. The index is unused due to the preceeding " + + Const.getConstantName(prev.getTag()) + "."); } } + // Previous check ensures this won't throw a ClassCastException + final T c = castTo.cast(constantPool[index]); + if (c == null) { + throw new ClassFormatException("Constant pool at index " + index + " is null."); + } return c; } @@ -402,7 +405,7 @@ * @return Length of constant pool. */ public int getLength() { - return constantPool == null ? 0 : constantPool.length; + return constantPool.length; } @Override @@ -421,7 +424,7 @@ * @param constantPool */ public void setConstantPool(final Constant[] constantPool) { - this.constantPool = constantPool; + this.constantPool = constantPool != null ? constantPool : Constant.EMPTY_ARRAY; } /** diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantUtf8.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantUtf8.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantUtf8.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantUtf8.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -36,11 +36,11 @@ * The following system properties govern caching this class performs. *

*
    - *
  • {@value #SYS_PROP_CACHE_MAX_ENTRIES} (since 6.4): The size of the cache, by default 0, meaning caching is + *
  • {@link #SYS_PROP_CACHE_MAX_ENTRIES} (since 6.4): The size of the cache, by default 0, meaning caching is * disabled.
  • - *
  • {@value #SYS_PROP_CACHE_MAX_ENTRY_SIZE} (since 6.0): The maximum size of the values to cache, by default 200, 0 + *
  • {@link #SYS_PROP_CACHE_MAX_ENTRY_SIZE} (since 6.0): The maximum size of the values to cache, by default 200, 0 * disables caching. Values larger than this are not cached.
  • - *
  • {@value #SYS_PROP_STATISTICS} (since 6.0): Prints statistics on the console when the JVM exits.
  • + *
  • {@link #SYS_PROP_STATISTICS} (since 6.0): Prints statistics on the console when the JVM exits.
  • *
*

* Here is a sample Maven invocation with caching disabled: @@ -58,11 +58,11 @@ *

* * @see Constant - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public final class ConstantUtf8 extends Constant { - private static class Cache { + private static final class Cache { private static final boolean BCEL_STATISTICS = false; private static final int MAX_ENTRIES = 20000; @@ -82,7 +82,7 @@ private static final int MAX_ENTRY_SIZE = 200; static boolean isEnabled() { - return Cache.MAX_ENTRIES > 0 && MAX_ENTRY_SIZE > 0; + return MAX_ENTRIES > 0 && MAX_ENTRY_SIZE > 0; } } @@ -117,6 +117,11 @@ hits = considered = skipped = created = 0; } + // Avoid Spotbugs complaint about Write to static field + private static void countCreated() { + created++; + } + /** * Gets a new or cached instance of the given value. *

@@ -203,7 +208,7 @@ ConstantUtf8(final DataInput dataInput) throws IOException { super(Const.CONSTANT_Utf8); value = dataInput.readUTF(); - created++; + countCreated(); } /** @@ -212,7 +217,7 @@ public ConstantUtf8(final String value) { super(Const.CONSTANT_Utf8); this.value = Objects.requireNonNull(value, "value"); - created++; + countCreated(); } /** diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantValue.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantValue.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantValue.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ConstantValue.java 2026-04-17 19:09:35.000000000 +0000 @@ -56,7 +56,7 @@ } /** - * Construct object from input stream. + * Constructs object from input stream. * * @param nameIndex Name index in constant pool * @param length Content length in bytes diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Deprecated.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Deprecated.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Deprecated.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Deprecated.java 2026-04-17 19:09:35.000000000 +0000 @@ -59,7 +59,7 @@ } /** - * Construct object from input stream. + * Constructs object from input stream. * * @param nameIndex Index in constant pool to CONSTANT_Utf8 * @param length Content length in bytes diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/DescendingVisitor.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/DescendingVisitor.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/DescendingVisitor.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/DescendingVisitor.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -22,12 +22,13 @@ import java.util.Objects; import java.util.Stack; import java.util.stream.Stream; +import jdk.xml.internal.Utils; /** - * Traverses a JavaClass with another Visitor object 'piggy-backed' that is - * applied to all components of a JavaClass object. I.e. this class supplies the - * traversal strategy, other classes can make use of it. + * Traverses a JavaClass with another Visitor object 'piggy-backed' that is applied to all components of a JavaClass + * object. I.e. this class supplies the traversal strategy, other classes can make use of it. * + * @LastModified: Sept 2025 */ public class DescendingVisitor implements Visitor { private final JavaClass clazz; @@ -46,7 +47,7 @@ } private void accept(final E[] node) { - Stream.of(node).forEach(e -> e.accept(this)); + Utils.streamOfIfNonNull(node).forEach(e -> e.accept(this)); } /** @@ -508,6 +509,21 @@ } @Override + public void visitRecord(final Record record) { + stack.push(record); + record.accept(visitor); + accept(record.getComponents()); + stack.pop(); + } + + @Override + public void visitRecordComponent(final RecordComponentInfo recordComponentInfo) { + stack.push(recordComponentInfo); + recordComponentInfo.accept(visitor); + stack.pop(); + } + + @Override public void visitSignature(final Signature attribute) { stack.push(attribute); attribute.accept(visitor); @@ -533,6 +549,20 @@ public void visitStackMapEntry(final StackMapEntry var) { stack.push(var); var.accept(visitor); + accept(var.getTypesOfLocals()); + accept(var.getTypesOfStackItems()); + stack.pop(); + } + + /** + * Visits a {@link StackMapType} object. + * @param var object to visit + * @since 6.8.0 + */ + @Override + public void visitStackMapType(final StackMapType var) { + stack.push(var); + var.accept(visitor); stack.pop(); } @@ -549,4 +579,5 @@ attribute.accept(visitor); stack.pop(); } + } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ElementValue.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ElementValue.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ElementValue.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ElementValue.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -50,7 +50,7 @@ *} * * @since 6.0 - * @LastModified: May 2021 + * @LastModified: Sept 2025 */ public abstract class ElementValue { @@ -67,6 +67,7 @@ public static final byte PRIMITIVE_LONG = 'J'; public static final byte PRIMITIVE_SHORT = 'S'; public static final byte PRIMITIVE_BOOLEAN = 'Z'; + static final ElementValue[] EMPTY_ARRAY = {}; /** * Reads an {@code element_value} as an {@code ElementValue}. @@ -124,7 +125,7 @@ final int numArrayVals = input.readUnsignedShort(); final ElementValue[] evalues = new ElementValue[numArrayVals]; for (int j = 0; j < numArrayVals; j++) { - evalues[j] = ElementValue.readElementValue(input, cpool, arrayNesting); + evalues[j] = readElementValue(input, cpool, arrayNesting); } return new ArrayElementValue(ARRAY, evalues, cpool); diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/EmptyVisitor.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/EmptyVisitor.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/EmptyVisitor.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/EmptyVisitor.java 2026-04-17 19:09:35.000000000 +0000 @@ -315,6 +315,15 @@ public void visitStackMapEntry(final StackMapEntry obj) { } + /** + * Visits a {@link StackMapType} object. + * @param obj object to visit + * @since 6.8.0 + */ + @Override + public void visitStackMapType(final StackMapType obj) { + } + @Override public void visitSynthetic(final Synthetic obj) { } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ExceptionTable.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ExceptionTable.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ExceptionTable.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ExceptionTable.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -27,6 +27,7 @@ import com.sun.org.apache.bcel.internal.Const; import com.sun.org.apache.bcel.internal.util.Args; +import jdk.xml.internal.Utils; /** * This class represents the table of exceptions that are thrown by a method. This attribute may be used once per @@ -43,7 +44,7 @@ * } * * @see Code - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public final class ExceptionTable extends Attribute { @@ -60,7 +61,7 @@ } /** - * Construct object from input stream. + * Constructs object from input stream. * * @param nameIndex Index in constant pool * @param length Content length in bytes @@ -85,7 +86,7 @@ */ public ExceptionTable(final int nameIndex, final int length, final int[] exceptionIndexTable, final ConstantPool constantPool) { super(Const.ATTR_EXCEPTIONS, nameIndex, length, constantPool); - this.exceptionIndexTable = exceptionIndexTable != null ? exceptionIndexTable : Const.EMPTY_INT_ARRAY; + this.exceptionIndexTable = Utils.createEmptyArrayIfNull(exceptionIndexTable); Args.requireU2(this.exceptionIndexTable.length, "exceptionIndexTable.length"); } @@ -156,7 +157,7 @@ * length. */ public void setExceptionIndexTable(final int[] exceptionIndexTable) { - this.exceptionIndexTable = exceptionIndexTable != null ? exceptionIndexTable : Const.EMPTY_INT_ARRAY; + this.exceptionIndexTable = Utils.createEmptyArrayIfNull(exceptionIndexTable); } /** diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Field.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Field.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Field.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Field.java 2026-04-17 19:09:35.000000000 +0000 @@ -42,45 +42,37 @@ */ public static final Field[] EMPTY_ARRAY = {}; - private static BCELComparator bcelComparator = new BCELComparator() { + private static BCELComparator bcelComparator = new BCELComparator() { @Override - public boolean equals(final Object o1, final Object o2) { - final Field THIS = (Field) o1; - final Field THAT = (Field) o2; - return Objects.equals(THIS.getName(), THAT.getName()) && Objects.equals(THIS.getSignature(), THAT.getSignature()); + public boolean equals(final Field a, final Field b) { + return a == b || a != null && b != null && Objects.equals(a.getName(), b.getName()) && Objects.equals(a.getSignature(), b.getSignature()); } @Override - public int hashCode(final Object o) { - final Field THIS = (Field) o; - return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); + public int hashCode(final Field o) { + return o != null ? Objects.hash(o.getSignature(), o.getName()) : 0; } }; /** - * Empty array. + * @return Comparison strategy object. */ - static final Field[] EMPTY_FIELD_ARRAY = {}; - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { + public static BCELComparator getComparator() { return bcelComparator; } /** - * @param comparator Comparison strategy object + * @param comparator Comparison strategy object. */ - public static void setComparator(final BCELComparator comparator) { + public static void setComparator(final BCELComparator comparator) { bcelComparator = comparator; } /** - * Construct object from file stream. + * Constructs object from file stream. * - * @param file Input stream + * @param file Input stream. */ Field(final DataInput file, final ConstantPool constantPool) throws IOException, ClassFormatException { super(file, constantPool); @@ -133,7 +125,7 @@ */ @Override public boolean equals(final Object obj) { - return bcelComparator.equals(this, obj); + return obj instanceof Field && bcelComparator.equals(this, (Field) obj); } /** @@ -149,14 +141,16 @@ } /** + * See https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.2.2 + * * @return type of field */ public Type getType() { - return Type.getReturnType(getSignature()); + return Type.getType(getSignature()); } /** - * Return value as defined by given BCELComparator strategy. By default return the hashcode of the field's name XOR + * Return value as defined by given BCELComparator strategy. By default return the hash code of the field's name XOR * signature. * * @see Object#hashCode() diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/FieldOrMethod.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/FieldOrMethod.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/FieldOrMethod.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/FieldOrMethod.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -28,7 +28,7 @@ /** * Abstract super class for fields and methods. * - * @LastModified: Jan 2020 + * @LastModified: Sept 2025 */ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, Node { @@ -72,7 +72,7 @@ } /** - * Construct object from file stream. + * Constructs object from file stream. * * @param file Input stream * @throws IOException if an I/O error occurs. @@ -88,7 +88,7 @@ } /** - * Construct object from file stream. + * Constructs object from file stream. * * @param file Input stream * @throws IOException if an I/O error occurs. @@ -137,7 +137,7 @@ Arrays.setAll(c.attributes, i -> attributes[i].copy(constantPool)); return c; } catch (final CloneNotSupportedException e) { - throw new IllegalStateException(e); + throw new UnsupportedOperationException(e); } } @@ -152,10 +152,8 @@ file.writeShort(name_index); file.writeShort(signature_index); file.writeShort(attributes_count); - if (attributes != null) { - for (final Attribute attribute : attributes) { - attribute.dump(file); - } + for (final Attribute attribute : attributes) { + attribute.dump(file); } } @@ -172,6 +170,22 @@ } /** + * Gets attribute for given tag. + * @return Attribute for given tag, null if not found. + * Refer to {@link com.sun.org.apache.bcel.internal.Const#ATTR_UNKNOWN} constants named ATTR_* for possible values. + * @since 6.10.0 + */ + @SuppressWarnings("unchecked") + public final T getAttribute(final byte tag) { + for (final Attribute attribute : getAttributes()) { + if (attribute.getTag() == tag) { + return (T) attribute; + } + } + return null; + } + + /** * @return Collection of object attributes. */ public final Attribute[] getAttributes() { @@ -221,7 +235,7 @@ } /** - * @return String representation of object's type signature (java style) + * @return String representation of object's type signature (Java style) */ public final String getSignature() { return constant_pool.getConstantUtf8(signature_index).getBytes(); @@ -238,8 +252,8 @@ * @param attributes Collection of object attributes. */ public final void setAttributes(final Attribute[] attributes) { - this.attributes = attributes; - this.attributes_count = attributes != null ? attributes.length : 0; // init deprecated field + this.attributes = attributes != null ? attributes : Attribute.EMPTY_ARRAY; + this.attributes_count = this.attributes.length; // init deprecated field } /** diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/InnerClass.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/InnerClass.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/InnerClass.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/InnerClass.java 2026-04-17 19:09:35.000000000 +0000 @@ -41,7 +41,7 @@ private int innerAccessFlags; /** - * Construct object from file stream. + * Constructs object from file stream. * * @param file Input stream * @throws IOException if an I/O error occurs. diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/InnerClasses.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/InnerClasses.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/InnerClasses.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/InnerClasses.java 2026-04-17 19:09:35.000000000 +0000 @@ -42,7 +42,7 @@ /** * Empty array. */ - private static final InnerClass[] EMPTY_INNER_CLASSE_ARRAY = {}; + private static final InnerClass[] EMPTY_ARRAY = {}; private InnerClass[] innerClasses; @@ -57,7 +57,7 @@ } /** - * Construct object from input stream. + * Constructs object from input stream. * * @param nameIndex Index in constant pool to CONSTANT_Utf8 * @param length Content length in bytes @@ -82,7 +82,7 @@ */ public InnerClasses(final int nameIndex, final int length, final InnerClass[] innerClasses, final ConstantPool constantPool) { super(Const.ATTR_INNER_CLASSES, nameIndex, length, constantPool); - this.innerClasses = innerClasses != null ? innerClasses : EMPTY_INNER_CLASSE_ARRAY; + this.innerClasses = innerClasses != null ? innerClasses : EMPTY_ARRAY; Args.requireU2(this.innerClasses.length, "innerClasses.length"); } @@ -141,7 +141,7 @@ * @param innerClasses the array of inner classes */ public void setInnerClasses(final InnerClass[] innerClasses) { - this.innerClasses = innerClasses != null ? innerClasses : EMPTY_INNER_CLASSE_ARRAY; + this.innerClasses = innerClasses != null ? innerClasses : EMPTY_ARRAY; } /** diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/InvalidMethodSignatureException.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/InvalidMethodSignatureException.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/InvalidMethodSignatureException.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/InvalidMethodSignatureException.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,53 @@ +/* + * reserved comment block + * DO NOT REMOVE OR ALTER! + */ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.sun.org.apache.bcel.internal.classfile; + +/** + * Thrown when the BCEL attempts to read a class file and determines that a class is malformed or otherwise cannot be interpreted as a class file. + * + * @since 6.8.0 + */ +public class InvalidMethodSignatureException extends ClassFormatException { + + private static final long serialVersionUID = 1L; + + /** + * Constructs a new instance with the specified invalid signature as the message. + * + * @param signature The invalid signature is saved for later retrieval by the {@link #getMessage()} method. + */ + public InvalidMethodSignatureException(final String signature) { + super(signature); + } + + /** + * Constructs a new instance with the specified invalid signature as the message and a cause. + * + * @param signature The invalid signature is saved for later retrieval by the {@link #getMessage()} method. + * @param cause the cause (which is saved for later retrieval by the {@link #getCause()} method). A {@code null} value is permitted, and indicates that + * the cause is nonexistent or unknown. + */ + public InvalidMethodSignatureException(final String signature, final Throwable cause) { + super(signature, cause); + } + +} diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/JavaClass.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/JavaClass.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/JavaClass.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/JavaClass.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -38,6 +38,7 @@ import com.sun.org.apache.bcel.internal.util.BCELComparator; import com.sun.org.apache.bcel.internal.util.ClassQueue; import com.sun.org.apache.bcel.internal.util.SyntheticRepository; +import jdk.xml.internal.Utils; /** * Represents a Java class, i.e., the data structures, constant pool, fields, methods and commands contained in a Java @@ -46,7 +47,7 @@ * classes should see the ClassGen class. * * @see com.sun.org.apache.bcel.internal.generic.ClassGen - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparable { @@ -67,26 +68,23 @@ public static final byte HEAP = 1; public static final byte FILE = 2; public static final byte ZIP = 3; - private static BCELComparator bcelComparator = new BCELComparator() { + private static BCELComparator bcelComparator = new BCELComparator() { @Override - public boolean equals(final Object o1, final Object o2) { - final JavaClass THIS = (JavaClass) o1; - final JavaClass THAT = (JavaClass) o2; - return Objects.equals(THIS.getClassName(), THAT.getClassName()); + public boolean equals(final JavaClass a, final JavaClass b) { + return a == b || a != null && b != null && Objects.equals(a.getClassName(), b.getClassName()); } @Override - public int hashCode(final Object o) { - final JavaClass THIS = (JavaClass) o; - return THIS.getClassName().hashCode(); + public int hashCode(final JavaClass o) { + return o != null ? Objects.hashCode(o.getClassName()) : 0; } }; /** - * @return Comparison strategy object + * @return Comparison strategy object. */ - public static BCELComparator getComparator() { + public static BCELComparator getComparator() { return bcelComparator; } @@ -100,9 +98,9 @@ } /** - * @param comparator Comparison strategy object + * @param comparator Comparison strategy object. */ - public static void setComparator(final BCELComparator comparator) { + public static void setComparator(final BCELComparator comparator) { bcelComparator = comparator; } @@ -128,8 +126,10 @@ private boolean isAnonymous; private boolean isNested; + private boolean isRecord; private boolean computedNestedTypeStatus; + private boolean computedRecord; /** * In cases where we go ahead and create something, use the default SyntheticRepository, because we don't know any @@ -177,17 +177,15 @@ public JavaClass(final int classNameIndex, final int superclassNameIndex, final String fileName, final int major, final int minor, final int accessFlags, final ConstantPool constantPool, int[] interfaces, Field[] fields, Method[] methods, Attribute[] attributes, final byte source) { super(accessFlags); - if (interfaces == null) { - interfaces = Const.EMPTY_INT_ARRAY; - } + interfaces = Utils.createEmptyArrayIfNull(interfaces); if (attributes == null) { attributes = Attribute.EMPTY_ARRAY; } if (fields == null) { - fields = Field.EMPTY_FIELD_ARRAY; + fields = Field.EMPTY_ARRAY; } if (methods == null) { - methods = Method.EMPTY_METHOD_ARRAY; + methods = Method.EMPTY_ARRAY; } this.classNameIndex = classNameIndex; this.superclassNameIndex = superclassNameIndex; @@ -254,6 +252,19 @@ return getClassName().compareTo(obj.getClassName()); } + private void computeIsRecord() { + if (computedRecord) { + return; + } + for (final Attribute attribute : this.attributes) { + if (attribute instanceof Record) { + isRecord = true; + break; + } + } + this.computedRecord = true; + } + private void computeNestedTypeStatus() { if (computedNestedTypeStatus) { return; @@ -384,11 +395,51 @@ */ @Override public boolean equals(final Object obj) { - return bcelComparator.equals(this, obj); + return obj instanceof JavaClass && bcelComparator.equals(this, (JavaClass) obj); } /** - * Get all interfaces implemented by this JavaClass (transitively). + * Finds a visible field by name and type in this class and its super classes. + * @param fieldName the field name to find + * @param fieldType the field type to find + * @return field matching given name and type, null if field is not found or not accessible from this class. + * @throws ClassNotFoundException + * @since 6.8.0 + */ + public Field findField(final String fieldName, final Type fieldType) throws ClassNotFoundException { + for (final Field field : fields) { + if (field.getName().equals(fieldName)) { + final Type fType = Type.getType(field.getSignature()); + /* + * TODO: Check if assignment compatibility is sufficient. What does Sun do? + */ + if (fType.equals(fieldType)) { + return field; + } + } + } + + final JavaClass superclass = getSuperClass(); + if (superclass != null && !"java.lang.Object".equals(superclass.getClassName())) { + final Field f = superclass.findField(fieldName, fieldType); + if (f != null && (f.isPublic() || f.isProtected() || !f.isPrivate() && packageName.equals(superclass.getPackageName()))) { + return f; + } + } + final JavaClass[] implementedInterfaces = getInterfaces(); + if (implementedInterfaces != null) { + for (final JavaClass implementedInterface : implementedInterfaces) { + final Field f = implementedInterface.findField(fieldName, fieldType); + if (f != null) { + return f; + } + } + } + return null; + } + + /** + * Gets all interfaces implemented by this JavaClass (transitively). * * @throws ClassNotFoundException if any of the class's superclasses or interfaces can't be found. */ @@ -409,7 +460,7 @@ queue.enqueue(iface); } } - return allInterfaces.toArray(JavaClass.EMPTY_ARRAY); + return allInterfaces.toArray(EMPTY_ARRAY); } /** @@ -425,6 +476,22 @@ } /** + * Gets attribute for given tag. + * @return Attribute for given tag, null if not found. + * Refer to {@link com.sun.org.apache.bcel.internal.Const#ATTR_UNKNOWN} constants named ATTR_* for possible values. + * @since 6.10.0 + */ + @SuppressWarnings("unchecked") + public final T getAttribute(final byte tag) { + for (final Attribute attribute : getAttributes()) { + if (attribute.getTag() == tag) { + return (T) attribute; + } + } + return null; + } + + /** * @return Attributes of the class. */ public Attribute[] getAttributes() { @@ -495,7 +562,7 @@ } /** - * Get interfaces directly implemented by this JavaClass. + * Gets interfaces directly implemented by this JavaClass. * * @throws ClassNotFoundException if any of the class's interfaces can't be found. */ @@ -587,7 +654,7 @@ } /** - * @return the superclass for this JavaClass object, or null if this is java.lang.Object + * @return the superclass for this JavaClass object, or null if this is {@link Object} * @throws ClassNotFoundException if the superclass can't be found */ public JavaClass getSuperClass() throws ClassNotFoundException { @@ -607,12 +674,12 @@ for (clazz = clazz.getSuperClass(); clazz != null; clazz = clazz.getSuperClass()) { allSuperClasses.add(clazz); } - return allSuperClasses.toArray(JavaClass.EMPTY_ARRAY); + return allSuperClasses.toArray(EMPTY_ARRAY); } /** - * returns the super class name of this class. In the case that this class is java.lang.Object, it will return itself - * (java.lang.Object). This is probably incorrect but isn't fixed at this time to not break existing clients. + * returns the super class name of this class. In the case that this class is {@link Object}, it will return itself + * ({@link Object}). This is probably incorrect but isn't fixed at this time to not break existing clients. * * @return Superclass name. */ @@ -628,7 +695,7 @@ } /** - * Return value as defined by given BCELComparator strategy. By default return the hashcode of the class name. + * Return value as defined by given BCELComparator strategy. By default return the hash code of the class name. * * @see Object#hashCode() */ @@ -645,7 +712,7 @@ if (!inter.isInterface()) { throw new IllegalArgumentException(inter.getClassName() + " is no interface"); } - if (this.equals(inter)) { + if (equals(inter)) { return true; } final JavaClass[] superInterfaces = getAllInterfaces(); @@ -664,7 +731,7 @@ * @throws ClassNotFoundException if superclasses or superinterfaces of this object can't be found */ public final boolean instanceOf(final JavaClass superclass) throws ClassNotFoundException { - if (this.equals(superclass)) { + if (equals(superclass)) { return true; } for (final JavaClass clazz : getSuperClasses()) { @@ -698,6 +765,17 @@ return this.isNested; } + /** + * Tests whether this class was declared as a record + * + * @return true if a record attribute is present, false otherwise. + * @since 6.9.0 + */ + public boolean isRecord() { + computeIsRecord(); + return this.isRecord; + } + public final boolean isSuper() { return (super.getAccessFlags() & Const.ACC_SUPER) != 0; } @@ -706,7 +784,7 @@ * @param attributes . */ public void setAttributes(final Attribute[] attributes) { - this.attributes = attributes; + this.attributes = attributes != null ? attributes : Attribute.EMPTY_ARRAY; } /** @@ -734,11 +812,11 @@ * @param fields . */ public void setFields(final Field[] fields) { - this.fields = fields; + this.fields = fields != null ? fields : Field.EMPTY_ARRAY; } /** - * Set File name of class, aka SourceFile attribute value + * Sets File name of class, aka SourceFile attribute value */ public void setFileName(final String fileName) { this.fileName = fileName; @@ -748,14 +826,14 @@ * @param interfaceNames . */ public void setInterfaceNames(final String[] interfaceNames) { - this.interfaceNames = interfaceNames; + this.interfaceNames = Utils.createEmptyArrayIfNull(interfaceNames, String[].class); } /** * @param interfaces . */ public void setInterfaces(final int[] interfaces) { - this.interfaces = interfaces; + this.interfaces = Utils.createEmptyArrayIfNull(interfaces); } /** @@ -769,7 +847,7 @@ * @param methods . */ public void setMethods(final Method[] methods) { - this.methods = methods; + this.methods = methods != null ? methods : Method.EMPTY_ARRAY; } /** @@ -787,7 +865,7 @@ } /** - * Set absolute path to file this class was read from. + * Sets absolute path to file this class was read from. */ public void setSourceFileName(final String sourceFileName) { this.sourceFileName = sourceFileName; diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LineNumber.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LineNumber.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LineNumber.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LineNumber.java 2026-04-17 19:09:35.000000000 +0000 @@ -40,11 +40,11 @@ /** Program Counter (PC) corresponds to line */ private int startPc; - /** number in source file */ + /** Number in source file */ private int lineNumber; /** - * Construct object from file stream. + * Constructs object from file stream. * * @param file Input stream * @throws IOException if an I/O Exception occurs in readUnsignedShort diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LineNumberTable.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LineNumberTable.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LineNumberTable.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LineNumberTable.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -36,7 +36,7 @@ * * @see Code * @see LineNumber - * @LastModified: May 2021 + * @LastModified: Sept 2025 */ public final class LineNumberTable extends Attribute implements Iterable { @@ -44,7 +44,7 @@ private LineNumber[] lineNumberTable; // Table of line/numbers pairs /** - * Construct object from input stream. + * Constructs a new instance from a data input stream. * * @param nameIndex Index of name * @param length Content length in bytes @@ -61,13 +61,12 @@ } } - /* - * @param nameIndex Index of name + /** + * Constructs a new instance. * + * @param nameIndex Index of name * @param length Content length in bytes - * * @param lineNumberTable Table of line/numbers pairs - * * @param constantPool Array of constants */ public LineNumberTable(final int nameIndex, final int length, final LineNumber[] lineNumberTable, final ConstantPool constantPool) { @@ -76,9 +75,11 @@ Args.requireU2(this.lineNumberTable.length, "lineNumberTable.length"); } - /* - * Initialize from another object. Note that both objects use the same references (shallow copy). Use copy() for a - * physical copy. + /** + * Constructs a new instance from another. + *

+ * Note that both objects use the same references (shallow copy). Use copy() for a physical copy. + *

*/ public LineNumberTable(final LineNumberTable c) { this(c.getNameIndex(), c.getLength(), c.getLineNumberTable(), c.getConstantPool()); @@ -190,7 +191,7 @@ * @param lineNumberTable the line number entries for this table */ public void setLineNumberTable(final LineNumber[] lineNumberTable) { - this.lineNumberTable = lineNumberTable; + this.lineNumberTable = lineNumberTable != null ? lineNumberTable : LineNumber.EMPTY_ARRAY; } /** diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LocalVariableTable.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LocalVariableTable.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LocalVariableTable.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LocalVariableTable.java 2026-04-17 19:09:35.000000000 +0000 @@ -40,10 +40,12 @@ */ public class LocalVariableTable extends Attribute implements Iterable { + private static final LocalVariable[] EMPTY_ARRAY = {}; + private LocalVariable[] localVariableTable; // variables /** - * Construct object from input stream. + * Constructs object from input stream. * * @param nameIndex Index in constant pool * @param length Content length in bytes @@ -68,7 +70,7 @@ */ public LocalVariableTable(final int nameIndex, final int length, final LocalVariable[] localVariableTable, final ConstantPool constantPool) { super(Const.ATTR_LOCAL_VARIABLE_TABLE, nameIndex, length, constantPool); - this.localVariableTable = localVariableTable != null ? localVariableTable : LocalVariable.EMPTY_ARRAY; + this.localVariableTable = localVariableTable != null ? localVariableTable : EMPTY_ARRAY; Args.requireU2(this.localVariableTable.length, "localVariableTable.length"); } @@ -167,7 +169,7 @@ } public final int getTableLength() { - return localVariableTable == null ? 0 : localVariableTable.length; + return localVariableTable.length; } @Override @@ -176,7 +178,7 @@ } public final void setLocalVariableTable(final LocalVariable[] localVariableTable) { - this.localVariableTable = localVariableTable; + this.localVariableTable = localVariableTable != null ? localVariableTable : EMPTY_ARRAY; } /** diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LocalVariableTypeTable.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LocalVariableTypeTable.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LocalVariableTypeTable.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/LocalVariableTypeTable.java 2026-04-17 19:09:35.000000000 +0000 @@ -63,14 +63,14 @@ */ public class LocalVariableTypeTable extends Attribute implements Iterable { + private static final LocalVariable[] EMPTY_ARRAY = {}; + private LocalVariable[] localVariableTypeTable; // variables LocalVariableTypeTable(final int nameIdx, final int len, final DataInput input, final ConstantPool cpool) throws IOException { this(nameIdx, len, (LocalVariable[]) null, cpool); - final int localVariableTypeTableLength = input.readUnsignedShort(); localVariableTypeTable = new LocalVariable[localVariableTypeTableLength]; - for (int i = 0; i < localVariableTypeTableLength; i++) { localVariableTypeTable[i] = new LocalVariable(input, cpool); } @@ -97,7 +97,6 @@ @Override public Attribute copy(final ConstantPool constantPool) { final LocalVariableTypeTable c = (LocalVariableTypeTable) clone(); - c.localVariableTypeTable = new LocalVariable[localVariableTypeTable.length]; Arrays.setAll(c.localVariableTypeTable, i -> localVariableTypeTable[i].copy()); c.setConstantPool(constantPool); @@ -119,7 +118,6 @@ return variable; } } - return null; } @@ -137,7 +135,7 @@ } public final void setLocalVariableTable(final LocalVariable[] localVariableTable) { - this.localVariableTypeTable = localVariableTable; + this.localVariableTypeTable = localVariableTable != null ? localVariableTable : EMPTY_ARRAY; } /** @@ -146,15 +144,12 @@ @Override public final String toString() { final StringBuilder buf = new StringBuilder(); - for (int i = 0; i < localVariableTypeTable.length; i++) { buf.append(localVariableTypeTable[i].toStringShared(true)); - if (i < localVariableTypeTable.length - 1) { buf.append('\n'); } } - return buf.toString(); } } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Method.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Method.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Method.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Method.java 2026-04-17 19:09:35.000000000 +0000 @@ -40,42 +40,34 @@ */ public static final Method[] EMPTY_ARRAY = {}; - private static BCELComparator bcelComparator = new BCELComparator() { + private static BCELComparator bcelComparator = new BCELComparator() { @Override - public boolean equals(final Object o1, final Object o2) { - final Method THIS = (Method) o1; - final Method THAT = (Method) o2; - return Objects.equals(THIS.getName(), THAT.getName()) && Objects.equals(THIS.getSignature(), THAT.getSignature()); + public boolean equals(final Method a, final Method b) { + return a == b || a != null && b != null && Objects.equals(a.getName(), b.getName()) && Objects.equals(a.getSignature(), b.getSignature()); } @Override - public int hashCode(final Object o) { - final Method THIS = (Method) o; - return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); + public int hashCode(final Method o) { + return o != null ? Objects.hash(o.getSignature(), o.getName()) : 0; } }; /** - * Empty array. + * @return Comparison strategy object. */ - static final Method[] EMPTY_METHOD_ARRAY = {}; - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { + public static BCELComparator getComparator() { return bcelComparator; } /** - * @param comparator Comparison strategy object + * @param comparator Comparison strategy object. */ - public static void setComparator(final BCELComparator comparator) { + public static void setComparator(final BCELComparator comparator) { bcelComparator = comparator; } - // annotations defined on the parameters of a method + /** Annotations defined on the parameters of a method. */ private ParameterAnnotationEntry[] parameterAnnotationEntries; /** @@ -85,7 +77,7 @@ } /** - * Construct object from file stream. + * Constructs object from file stream. * * @param file Input stream * @throws IOException if an I/O error occurs. @@ -142,7 +134,7 @@ */ @Override public boolean equals(final Object obj) { - return bcelComparator.equals(this, obj); + return obj instanceof Method && bcelComparator.equals(this, (Method) obj); } /** @@ -189,7 +181,7 @@ } /** - * @return LocalVariableTable of code attribute if any, i.e. the call is forwarded to the Code atribute. + * @return LocalVariableTable of code attribute if any, i.e. the call is forwarded to the Code attribute. */ public LocalVariableTable getLocalVariableTable() { final Code code = getCode(); @@ -200,6 +192,19 @@ } /** + * Gets the local variable type table attribute {@link LocalVariableTypeTable}. + * @return LocalVariableTypeTable of code attribute if any, i.e. the call is forwarded to the Code attribute. + * @since 6.10.0 + */ + public LocalVariableTypeTable getLocalVariableTypeTable() { + final Code code = getCode(); + if (code == null) { + return null; + } + return code.getLocalVariableTypeTable(); + } + + /** * @return Annotations on the parameters of a method * @since 6.0 */ @@ -218,7 +223,7 @@ } /** - * Return value as defined by given BCELComparator strategy. By default return the hashcode of the method's name XOR + * Return value as defined by given BCELComparator strategy. By default return the hash code of the method's name XOR * signature. * * @see Object#hashCode() diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/MethodParameter.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/MethodParameter.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/MethodParameter.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/MethodParameter.java 2026-04-17 19:09:35.000000000 +0000 @@ -29,6 +29,9 @@ /** * Entry of the parameters table. + *

+ * Implements {@link Node} as of 6.7.0. + *

* * @see The class File Format : * The MethodParameters Attribute @@ -46,7 +49,7 @@ } /** - * Construct object from input stream. + * Constructs an instance from a DataInput. * * @param input Input stream * @throws IOException if an I/O error occurs. @@ -75,7 +78,7 @@ } /** - * Dump object to file stream on binary format. + * Dumps object to file stream on binary format. * * @param file Output file stream * @throws IOException if an I/O error occurs. @@ -94,7 +97,10 @@ } /** - * Returns the name of the parameter. + * Gets the name of the parameter. + * + * @param constantPool The pool to query. + * @return Constant from the given pool. */ public String getParameterName(final ConstantPool constantPool) { if (nameIndex == 0) { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/MethodParameters.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/MethodParameters.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/MethodParameters.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/MethodParameters.java 2026-04-17 19:09:35.000000000 +0000 @@ -42,13 +42,12 @@ /** * Empty array. */ - private static final MethodParameter[] EMPTY_METHOD_PARAMETER_ARRAY = {}; + private static final MethodParameter[] EMPTY_ARRAY = {}; - private MethodParameter[] parameters = EMPTY_METHOD_PARAMETER_ARRAY; + private MethodParameter[] parameters = EMPTY_ARRAY; MethodParameters(final int nameIndex, final int length, final DataInput input, final ConstantPool constantPool) throws IOException { super(Const.ATTR_METHOD_PARAMETERS, nameIndex, length, constantPool); - final int parameterCount = input.readUnsignedByte(); parameters = new MethodParameter[parameterCount]; for (int i = 0; i < parameterCount; i++) { @@ -65,7 +64,6 @@ public Attribute copy(final ConstantPool constantPool) { final MethodParameters c = (MethodParameters) clone(); c.parameters = new MethodParameter[parameters.length]; - Arrays.setAll(c.parameters, i -> parameters[i].copy()); c.setConstantPool(constantPool); return c; @@ -96,6 +94,6 @@ } public void setParameters(final MethodParameter[] parameters) { - this.parameters = parameters; + this.parameters = parameters != null ? parameters : EMPTY_ARRAY; } } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Module.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Module.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Module.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Module.java 2026-04-17 19:09:35.000000000 +0000 @@ -44,19 +44,27 @@ */ public static final String EXTENSION = ".jmod"; + private static String getClassNameAtIndex(final ConstantPool cp, final int index, final boolean compactClassName) { + final String className = cp.getConstantString(index, Const.CONSTANT_Class); + if (compactClassName) { + return Utility.compactClassName(className, false); + } + return className; + } private final int moduleNameIndex; private final int moduleFlags; - private final int moduleVersionIndex; + private final int moduleVersionIndex; private ModuleRequires[] requiresTable; private ModuleExports[] exportsTable; private ModuleOpens[] opensTable; private final int usesCount; private final int[] usesIndex; + private ModuleProvides[] providesTable; /** - * Construct object from input stream. + * Constructs object from input stream. * * @param nameIndex Index in constant pool * @param length Content length in bytes @@ -113,8 +121,6 @@ v.visitModule(this); } - // TODO add more getters and setters? - /** * @return deep copy of this attribute */ @@ -187,6 +193,25 @@ } /** + * Gets flags for this module. + * @return module flags + * @since 6.10.0 + */ + public int getModuleFlags() { + return moduleFlags; + } + + /** + * Gets module name. + * @param cp Array of constants + * @return module name + * @since 6.10.0 + */ + public String getModuleName(final ConstantPool cp) { + return cp.getConstantString(moduleNameIndex, Const.CONSTANT_Module); + } + + /** * @return table of provided interfaces * @see ModuleOpens */ @@ -211,6 +236,31 @@ } /** + * Gets the array of class names for this module's uses. + * @param constantPool Array of constants usually obtained from the ClassFile object + * @param compactClassName false for original constant pool value, true to replace '/' with '.' + * @return array of used class names + * @since 6.10.0 + */ + public String[] getUsedClassNames(final ConstantPool constantPool, final boolean compactClassName) { + final String[] usedClassNames = new String[usesCount]; + for (int i = 0; i < usesCount; i++) { + usedClassNames[i] = getClassNameAtIndex(constantPool, usesIndex[i], compactClassName); + } + return usedClassNames; + } + + /** + * Gets version for this module. + * @param cp Array of constants + * @return version from constant pool, "0" if version index is 0 + * @since 6.10.0 + */ + public String getVersion(final ConstantPool cp) { + return moduleVersionIndex == 0 ? "0" : cp.getConstantString(moduleVersionIndex, Const.CONSTANT_Utf8); + } + + /** * @return String representation, i.e., a list of packages. */ @Override @@ -218,9 +268,9 @@ final ConstantPool cp = super.getConstantPool(); final StringBuilder buf = new StringBuilder(); buf.append("Module:\n"); - buf.append(" name: ").append(Utility.pathToPackage(cp.getConstantString(moduleNameIndex, Const.CONSTANT_Module))).append("\n"); + buf.append(" name: ").append(Utility.pathToPackage(getModuleName(cp))).append("\n"); buf.append(" flags: ").append(String.format("%04x", moduleFlags)).append("\n"); - final String version = moduleVersionIndex == 0 ? "0" : cp.getConstantString(moduleVersionIndex, Const.CONSTANT_Utf8); + final String version = getVersion(cp); buf.append(" version: ").append(version).append("\n"); buf.append(" requires(").append(requiresTable.length).append("):\n"); @@ -240,8 +290,8 @@ buf.append(" uses(").append(usesIndex.length).append("):\n"); for (final int index : usesIndex) { - final String className = cp.getConstantString(index, Const.CONSTANT_Class); - buf.append(" ").append(Utility.compactClassName(className, false)).append("\n"); + final String className = getClassNameAtIndex(cp, index, true); + buf.append(" ").append(className).append("\n"); } buf.append(" provides(").append(providesTable.length).append("):\n"); diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleExports.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleExports.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleExports.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleExports.java 2026-04-17 19:09:35.000000000 +0000 @@ -36,13 +36,17 @@ */ public final class ModuleExports implements Cloneable, Node { + private static String getToModuleNameAtIndex(final ConstantPool constantPool, final int index) { + return constantPool.getConstantString(index, Const.CONSTANT_Module); + } private final int exportsIndex; // points to CONSTANT_Package_info private final int exportsFlags; private final int exportsToCount; + private final int[] exportsToIndex; // points to CONSTANT_Module_info /** - * Construct object from file stream. + * Constructs object from file stream. * * @param file Input stream * @throws IOException if an I/O Exception occurs in readUnsignedShort @@ -68,8 +72,6 @@ v.visitModuleExports(this); } - // TODO add more getters and setters? - /** * @return deep copy of this object */ @@ -98,6 +100,39 @@ } /** + * Gets the flags for this ModuleExports. + * @return the exportsFlags + * @since 6.10.0 + */ + public int getExportsFlags() { + return exportsFlags; + } + + /** + * Gets the exported package name. + * @param constantPool the constant pool from the ClassFile + * @return the exported package name + * @since 6.10.0 + */ + public String getPackageName(final ConstantPool constantPool) { + return constantPool.constantToString(exportsIndex, Const.CONSTANT_Package); + } + + /** + * Gets an array of module names for this ModuleExports. + * @param constantPool Array of constants usually obtained from the ClassFile object + * @return array of module names following 'exports to' + * @since 6.10.0 + */ + public String[] getToModuleNames(final ConstantPool constantPool) { + final String[] toModuleNames = new String[exportsToCount]; + for (int i = 0; i < exportsToCount; i++) { + toModuleNames[i] = getToModuleNameAtIndex(constantPool, exportsToIndex[i]); + } + return toModuleNames; + } + + /** * @return String representation */ @Override @@ -110,13 +145,13 @@ */ public String toString(final ConstantPool constantPool) { final StringBuilder buf = new StringBuilder(); - final String packageName = constantPool.constantToString(exportsIndex, Const.CONSTANT_Package); - buf.append(Utility.compactClassName(packageName, false)); + final String packageName = getPackageName(constantPool); + buf.append(packageName); buf.append(", ").append(String.format("%04x", exportsFlags)); buf.append(", to(").append(exportsToCount).append("):\n"); for (final int index : exportsToIndex) { - final String moduleName = constantPool.getConstantString(index, Const.CONSTANT_Module); - buf.append(" ").append(Utility.compactClassName(moduleName, false)).append("\n"); + final String moduleName = getToModuleNameAtIndex(constantPool, index); + buf.append(" ").append(moduleName).append("\n"); } return buf.substring(0, buf.length() - 1); // remove the last newline } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleMainClass.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleMainClass.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleMainClass.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleMainClass.java 2026-04-17 19:09:35.000000000 +0000 @@ -39,7 +39,7 @@ private int mainClassIndex; /** - * Construct object from input stream. + * Constructs object from input stream. * * @param nameIndex Index in constant pool * @param length Content length in bytes diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleOpens.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleOpens.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleOpens.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleOpens.java 2026-04-17 19:09:35.000000000 +0000 @@ -36,13 +36,17 @@ */ public final class ModuleOpens implements Cloneable, Node { + private static String getToModuleNameAtIndex(final ConstantPool constantPool, final int index) { + return constantPool.getConstantString(index, Const.CONSTANT_Module); + } private final int opensIndex; // points to CONSTANT_Package_info private final int opensFlags; private final int opensToCount; + private final int[] opensToIndex; // points to CONSTANT_Module_info /** - * Construct object from file stream. + * Constructs object from file stream. * * @param file Input stream * @throws IOException if an I/O Exception occurs in readUnsignedShort @@ -68,8 +72,6 @@ v.visitModuleOpens(this); } - // TODO add more getters and setters? - /** * @return deep copy of this object */ @@ -98,6 +100,39 @@ } /** + * Gets the flags for this ModuleOpens. + * @return the opensFlags + * @since 6.10.0 + */ + public int getOpensFlags() { + return opensFlags; + } + + /** + * Gets the opened package name. + * @param constantPool the constant pool from the ClassFile + * @return the opened package name + * @since 6.10.0 + */ + public String getPackageName(final ConstantPool constantPool) { + return constantPool.constantToString(opensIndex, Const.CONSTANT_Package); + } + + /** + * Gets an array of module names for this ModuleOpens. + * @param constantPool Array of constants usually obtained from the ClassFile object + * @return array of module names following 'opens to' + * @since 6.10.0 + */ + public String[] getToModuleNames(final ConstantPool constantPool) { + final String[] toModuleNames = new String[opensToCount]; + for (int i = 0; i < opensToCount; i++) { + toModuleNames[i] = getToModuleNameAtIndex(constantPool, opensToIndex[i]); + } + return toModuleNames; + } + + /** * @return String representation */ @Override @@ -110,13 +145,13 @@ */ public String toString(final ConstantPool constantPool) { final StringBuilder buf = new StringBuilder(); - final String packageName = constantPool.constantToString(opensIndex, Const.CONSTANT_Package); - buf.append(Utility.compactClassName(packageName, false)); + final String packageName = getPackageName(constantPool); + buf.append(packageName); buf.append(", ").append(String.format("%04x", opensFlags)); buf.append(", to(").append(opensToCount).append("):\n"); for (final int index : opensToIndex) { - final String moduleName = constantPool.getConstantString(index, Const.CONSTANT_Module); - buf.append(" ").append(Utility.compactClassName(moduleName, false)).append("\n"); + final String moduleName = getToModuleNameAtIndex(constantPool, index); + buf.append(" ").append(moduleName).append("\n"); } return buf.substring(0, buf.length() - 1); // remove the last newline } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModulePackages.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModulePackages.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModulePackages.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModulePackages.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -27,20 +27,21 @@ import com.sun.org.apache.bcel.internal.Const; import com.sun.org.apache.bcel.internal.util.Args; +import jdk.xml.internal.Utils; /** * This class is derived from Attribute and represents the list of packages that are exported or opened by the * Module attribute. There may be at most one ModulePackages attribute in a ClassFile structure. * * @see Attribute - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public final class ModulePackages extends Attribute { private int[] packageIndexTable; /** - * Construct object from input stream. + * Constructs object from input stream. * * @param nameIndex Index in constant pool * @param length Content length in bytes @@ -65,7 +66,7 @@ */ public ModulePackages(final int nameIndex, final int length, final int[] packageIndexTable, final ConstantPool constantPool) { super(Const.ATTR_MODULE_PACKAGES, nameIndex, length, constantPool); - this.packageIndexTable = packageIndexTable != null ? packageIndexTable : Const.EMPTY_INT_ARRAY; + this.packageIndexTable = Utils.createEmptyArrayIfNull(packageIndexTable); Args.requireU2(this.packageIndexTable.length, "packageIndexTable.length"); } @@ -145,7 +146,7 @@ * @param packageIndexTable the list of package indexes Also redefines number_of_packages according to table length. */ public void setPackageIndexTable(final int[] packageIndexTable) { - this.packageIndexTable = packageIndexTable != null ? packageIndexTable : Const.EMPTY_INT_ARRAY; + this.packageIndexTable = Utils.createEmptyArrayIfNull(packageIndexTable); } /** diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleProvides.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleProvides.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleProvides.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleProvides.java 2026-04-17 19:09:35.000000000 +0000 @@ -36,12 +36,20 @@ */ public final class ModuleProvides implements Cloneable, Node { + private static String getImplementationClassNameAtIndex(final ConstantPool constantPool, final int index, final boolean compactClassName) { + final String className = constantPool.getConstantString(index, Const.CONSTANT_Class); + if (compactClassName) { + return Utility.compactClassName(className, false); + } + return className; + } private final int providesIndex; // points to CONSTANT_Class_info private final int providesWithCount; + private final int[] providesWithIndex; // points to CONSTANT_Class_info /** - * Construct object from file stream. + * Constructs object from file stream. * * @param file Input stream * @throws IOException if an I/O Exception occurs in readUnsignedShort @@ -66,8 +74,6 @@ v.visitModuleProvides(this); } - // TODO add more getters and setters? - /** * @return deep copy of this object */ @@ -95,6 +101,31 @@ } /** + * Gets the array of implementation class names for this ModuleProvides. + * @param constantPool Array of constants usually obtained from the ClassFile object + * @param compactClassName false for original constant pool value, true to replace '/' with '.' + * @return array of implementation class names + * @since 6.10.0 + */ + public String[] getImplementationClassNames(final ConstantPool constantPool, final boolean compactClassName) { + final String[] implementationClassNames = new String[providesWithCount]; + for (int i = 0; i < providesWithCount; i++) { + implementationClassNames[i] = getImplementationClassNameAtIndex(constantPool, providesWithIndex[i], compactClassName); + } + return implementationClassNames; + } + + /** + * Gets the interface name for this ModuleProvides. + * @param constantPool Array of constants usually obtained from the ClassFile object + * @return interface name + * @since 6.10.0 + */ + public String getInterfaceName(final ConstantPool constantPool) { + return constantPool.constantToString(providesIndex, Const.CONSTANT_Class); + } + + /** * @return String representation */ @Override @@ -107,12 +138,12 @@ */ public String toString(final ConstantPool constantPool) { final StringBuilder buf = new StringBuilder(); - final String interfaceName = constantPool.constantToString(providesIndex, Const.CONSTANT_Class); - buf.append(Utility.compactClassName(interfaceName, false)); + final String interfaceName = getInterfaceName(constantPool); + buf.append(interfaceName); buf.append(", with(").append(providesWithCount).append("):\n"); for (final int index : providesWithIndex) { - final String className = constantPool.getConstantString(index, Const.CONSTANT_Class); - buf.append(" ").append(Utility.compactClassName(className, false)).append("\n"); + final String className = getImplementationClassNameAtIndex(constantPool, index, true); + buf.append(" ").append(className).append("\n"); } return buf.substring(0, buf.length() - 1); // remove the last newline } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleRequires.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleRequires.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleRequires.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ModuleRequires.java 2026-04-17 19:09:35.000000000 +0000 @@ -41,7 +41,7 @@ private final int requiresVersionIndex; // either 0 or points to CONSTANT_Utf8_info /** - * Construct object from file stream. + * Constructs object from file stream. * * @param file Input stream * @throws IOException if an I/O Exception occurs in readUnsignedShort @@ -63,8 +63,6 @@ v.visitModuleRequires(this); } - // TODO add more getters and setters? - /** * @return deep copy of this object */ @@ -90,6 +88,35 @@ } /** + * Gets the module name from the constant pool. + * @param constantPool Array of constants usually obtained from the ClassFile object + * @return module name + * @since 6.10.0 + */ + public String getModuleName(final ConstantPool constantPool) { + return constantPool.constantToString(requiresIndex, Const.CONSTANT_Module); + } + + /** + * Gets the flags for this ModuleRequires. + * @return the requiresFlags + * @since 6.10.0 + */ + public int getRequiresFlags() { + return requiresFlags; + } + + /** + * Gets the required version from the constant pool. + * @param constantPool Array of constants usually obtained from the ClassFile object + * @return required version, "0" if version index is 0. + * @since 6.10.0 + */ + public String getVersion(final ConstantPool constantPool) { + return requiresVersionIndex == 0 ? "0" : constantPool.getConstantString(requiresVersionIndex, Const.CONSTANT_Utf8); + } + + /** * @return String representation */ @Override @@ -102,10 +129,10 @@ */ public String toString(final ConstantPool constantPool) { final StringBuilder buf = new StringBuilder(); - final String moduleName = constantPool.constantToString(requiresIndex, Const.CONSTANT_Module); - buf.append(Utility.compactClassName(moduleName, false)); + final String moduleName = getModuleName(constantPool); + buf.append(moduleName); buf.append(", ").append(String.format("%04x", requiresFlags)); - final String version = requiresVersionIndex == 0 ? "0" : constantPool.getConstantString(requiresVersionIndex, Const.CONSTANT_Utf8); + final String version = getVersion(constantPool); buf.append(", ").append(version); return buf.toString(); } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/NestMembers.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/NestMembers.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/NestMembers.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/NestMembers.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -27,6 +27,7 @@ import com.sun.org.apache.bcel.internal.Const; import com.sun.org.apache.bcel.internal.util.Args; +import jdk.xml.internal.Utils; /** * This class is derived from Attribute and records the classes and interfaces that are authorized to claim @@ -34,14 +35,14 @@ * ClassFile structure. * * @see Attribute - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public final class NestMembers extends Attribute { private int[] classes; /** - * Construct object from input stream. + * Constructs object from input stream. * * @param nameIndex Index in constant pool * @param length Content length in bytes @@ -66,7 +67,7 @@ */ public NestMembers(final int nameIndex, final int length, final int[] classes, final ConstantPool constantPool) { super(Const.ATTR_NEST_MEMBERS, nameIndex, length, constantPool); - this.classes = classes != null ? classes : Const.EMPTY_INT_ARRAY; + this.classes = Utils.createEmptyArrayIfNull(classes); Args.requireU2(this.classes.length, "classes.length"); } @@ -146,7 +147,7 @@ * @param classes the list of class indexes Also redefines number_of_classes according to table length. */ public void setClasses(final int[] classes) { - this.classes = classes != null ? classes : Const.EMPTY_INT_ARRAY; + this.classes = Utils.createEmptyArrayIfNull(classes); } /** diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Node.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Node.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Node.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Node.java 2026-04-17 19:09:35.000000000 +0000 @@ -26,5 +26,5 @@ */ public interface Node { - void accept(Visitor obj); + void accept(Visitor visitor); } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/PMGClass.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/PMGClass.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/PMGClass.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/PMGClass.java 2026-04-17 19:09:35.000000000 +0000 @@ -38,7 +38,7 @@ private int pmgIndex; /** - * Construct object from input stream. + * Constructs object from input stream. * * @param nameIndex Index in constant pool to CONSTANT_Utf8 * @param length Content length in bytes diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ParameterAnnotationEntry.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ParameterAnnotationEntry.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ParameterAnnotationEntry.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ParameterAnnotationEntry.java 2026-04-17 19:09:35.000000000 +0000 @@ -37,22 +37,28 @@ static final ParameterAnnotationEntry[] EMPTY_ARRAY = {}; - public static ParameterAnnotationEntry[] createParameterAnnotationEntries(final Attribute[] attrs) { + public static ParameterAnnotationEntry[] createParameterAnnotationEntries(final Attribute[] attributes) { + if (attributes == null) { + return EMPTY_ARRAY; + } // Find attributes that contain parameter annotation data - final List accumulatedAnnotations = new ArrayList<>(attrs.length); - for (final Attribute attribute : attrs) { + final List accumulatedAnnotations = new ArrayList<>(attributes.length); + for (final Attribute attribute : attributes) { if (attribute instanceof ParameterAnnotations) { final ParameterAnnotations runtimeAnnotations = (ParameterAnnotations) attribute; - Collections.addAll(accumulatedAnnotations, runtimeAnnotations.getParameterAnnotationEntries()); + final ParameterAnnotationEntry[] parameterAnnotationEntries = runtimeAnnotations.getParameterAnnotationEntries(); + if (parameterAnnotationEntries != null) { + Collections.addAll(accumulatedAnnotations, parameterAnnotationEntries); + } } } - return accumulatedAnnotations.toArray(ParameterAnnotationEntry.EMPTY_ARRAY); + return accumulatedAnnotations.toArray(EMPTY_ARRAY); } private final AnnotationEntry[] annotationTable; /** - * Construct object from input stream. + * Constructs object from input stream. * * @param input Input stream * @throws IOException if an I/O error occurs. diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ParameterAnnotations.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ParameterAnnotations.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ParameterAnnotations.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/ParameterAnnotations.java 2026-04-17 19:09:35.000000000 +0000 @@ -34,10 +34,14 @@ */ public abstract class ParameterAnnotations extends Attribute implements Iterable { + private static final ParameterAnnotationEntry[] EMPTY_ARRAY = {}; + /** Table of parameter annotations */ private ParameterAnnotationEntry[] parameterAnnotationTable; /** + * Constructs a new instance. + * * @param parameterAnnotationType the subclass type of the parameter annotation * @param nameIndex Index pointing to the name Code * @param length Content length in bytes @@ -55,6 +59,8 @@ } /** + * Constructs a new instance. + * * @param parameterAnnotationType the subclass type of the parameter annotation * @param nameIndex Index pointing to the name Code * @param length Content length in bytes @@ -120,6 +126,6 @@ * @param parameterAnnotationTable the entries to set in this parameter annotation */ public final void setParameterAnnotationTable(final ParameterAnnotationEntry[] parameterAnnotationTable) { - this.parameterAnnotationTable = parameterAnnotationTable; + this.parameterAnnotationTable = parameterAnnotationTable != null ? parameterAnnotationTable : EMPTY_ARRAY; } } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Record.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Record.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Record.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Record.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,153 @@ +/* + * reserved comment block + * DO NOT REMOVE OR ALTER! + */ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.sun.org.apache.bcel.internal.classfile; + +import java.io.DataInput; +import java.io.DataOutputStream; +import java.io.IOException; + +import com.sun.org.apache.bcel.internal.Const; +import com.sun.org.apache.bcel.internal.util.Args; + +/** + * Extends {@link Attribute} and records the classes and + * interfaces that are authorized to claim membership in the nest hosted by the + * current class or interface. There may be at most one Record attribute in a + * ClassFile structure. + * + * @see Attribute + * @since 6.9.0 + */ +public final class Record extends Attribute { + + private static final RecordComponentInfo[] EMPTY_RCI_ARRAY = {}; + + private static RecordComponentInfo[] readComponents(final DataInput input, final ConstantPool constantPool) + throws IOException { + final int classCount = input.readUnsignedShort(); + final RecordComponentInfo[] components = new RecordComponentInfo[classCount]; + for (int i = 0; i < classCount; i++) { + components[i] = new RecordComponentInfo(input, constantPool); + } + return components; + } + + private RecordComponentInfo[] components; + + /** + * Constructs object from input stream. + * + * @param nameIndex Index in constant pool + * @param length Content length in bytes + * @param input Input stream + * @param constantPool Array of constants + * @throws IOException if an I/O error occurs. + */ + Record(final int nameIndex, final int length, final DataInput input, final ConstantPool constantPool) + throws IOException { + this(nameIndex, length, readComponents(input, constantPool), constantPool); + } + + /** + * Constructs a new instance using components. + * + * @param nameIndex Index in constant pool + * @param length Content length in bytes + * @param classes Array of Record Component Info elements + * @param constantPool Array of constants + */ + public Record(final int nameIndex, final int length, final RecordComponentInfo[] classes, + final ConstantPool constantPool) { + super(Const.ATTR_RECORD, nameIndex, length, constantPool); + this.components = classes != null ? classes : EMPTY_RCI_ARRAY; + Args.requireU2(this.components.length, "attributes.length"); + } + + /** + * Called by objects that are traversing the nodes of the tree implicitly + * defined by the contents of a Java class. For example, the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + @Override + public void accept(final Visitor v) { + v.visitRecord(this); + } + + /** + * Copies this instance and its components. + * + * @return a deep copy of this instance and its components. + */ + @Override + public Attribute copy(final ConstantPool constantPool) { + final Record c = (Record) clone(); + if (components.length > 0) { + c.components = components.clone(); + } + c.setConstantPool(constantPool); + return c; + } + + /** + * Dumps this instance into a file stream in binary format. + * + * @param file output stream. + * @throws IOException if an I/O error occurs. + */ + @Override + public void dump(final DataOutputStream file) throws IOException { + super.dump(file); + file.writeShort(components.length); + for (final RecordComponentInfo component : components) { + component.dump(file); + } + } + + /** + * Gets all the record components. + * + * @return array of Record Component Info elements. + */ + public RecordComponentInfo[] getComponents() { + return components; + } + + /** + * Converts this instance to a String suitable for debugging. + * + * @return String a String suitable for debugging. + */ + @Override + public String toString() { + final StringBuilder buf = new StringBuilder(); + buf.append("Record("); + buf.append(components.length); + buf.append("):\n"); + for (final RecordComponentInfo component : components) { + buf.append(" ").append(component.toString()).append("\n"); + } + return buf.substring(0, buf.length() - 1); // remove the last newline + } + +} diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RecordComponentInfo.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RecordComponentInfo.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RecordComponentInfo.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RecordComponentInfo.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,139 @@ +/* + * reserved comment block + * DO NOT REMOVE OR ALTER! + */ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.sun.org.apache.bcel.internal.classfile; + +import java.io.DataInput; +import java.io.DataOutputStream; +import java.io.IOException; + +import com.sun.org.apache.bcel.internal.Const; + +/** + * Record component info from a record. Instances from this class maps + * every component from a given record. + * + * @see + * The Java Virtual Machine Specification, Java SE 14 Edition, Records (preview) + * @since 6.9.0 + */ +public class RecordComponentInfo implements Node { + + private final int index; + private final int descriptorIndex; + private final Attribute[] attributes; + private final ConstantPool constantPool; + + /** + * Constructs a new instance from an input stream. + * + * @param input Input stream + * @param constantPool Array of constants + * @throws IOException if an I/O error occurs. + */ + public RecordComponentInfo(final DataInput input, final ConstantPool constantPool) throws IOException { + this.index = input.readUnsignedShort(); + this.descriptorIndex = input.readUnsignedShort(); + final int attributesCount = input.readUnsignedShort(); + this.attributes = new Attribute[attributesCount]; + for (int j = 0; j < attributesCount; j++) { + attributes[j] = Attribute.readAttribute(input, constantPool); + } + this.constantPool = constantPool; + } + + @Override + public void accept(final Visitor v) { + v.visitRecordComponent(this); + } + + /** + * Dumps contents into a file stream in binary format. + * + * @param file Output file stream + * @throws IOException if an I/O error occurs. + */ + public void dump(final DataOutputStream file) throws IOException { + file.writeShort(index); + file.writeShort(descriptorIndex); + file.writeShort(attributes.length); + for (final Attribute attribute : attributes) { + attribute.dump(file); + } + } + + /** + * Gets all attributes. + * + * @return all attributes. + */ + public Attribute[] getAttributes() { + return attributes; + } + + /** + * Gets the constant pool. + * + * @return Constant pool. + */ + public ConstantPool getConstantPool() { + return constantPool; + } + + /** + * Gets the description index. + * + * @return index in constant pool of this record component descriptor. + */ + public int getDescriptorIndex() { + return descriptorIndex; + } + + /** + * Gets the name index. + * + * @return index in constant pool of this record component name. + */ + public int getIndex() { + return index; + } + + /** + * Converts this instance to a String suitable for debugging. + * + * @return a String suitable for debugging. + */ + @Override + public String toString() { + final StringBuilder buf = new StringBuilder(); + buf.append("RecordComponentInfo("); + buf.append(constantPool.getConstantString(index, Const.CONSTANT_Utf8)); + buf.append(","); + buf.append(constantPool.getConstantString(descriptorIndex, Const.CONSTANT_Utf8)); + buf.append(","); + buf.append(attributes.length); + buf.append("):\n"); + for (final Attribute attribute : attributes) { + buf.append(" ").append(attribute.toString()).append("\n"); + } + return buf.substring(0, buf.length() - 1); // remove the last newline + } + +} diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeInvisibleAnnotations.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeInvisibleAnnotations.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeInvisibleAnnotations.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeInvisibleAnnotations.java 2026-04-17 19:09:35.000000000 +0000 @@ -28,13 +28,15 @@ import com.sun.org.apache.bcel.internal.Const; /** - * represents an annotation that is represented in the class file but is not provided to the JVM. + * An annotation that is represented in the class file but is not provided to the JVM. * * @since 6.0 */ public class RuntimeInvisibleAnnotations extends Annotations { /** + * Constructs a new instance. + * * @param nameIndex Index pointing to the name Code * @param length Content length in bytes * @param input Input stream @@ -46,7 +48,9 @@ } /** - * @return deep copy of this attribute + * Creates a deep copy of this attribute. + * + * @return deep copy of this attribute. */ @Override public Attribute copy(final ConstantPool constantPool) { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeInvisibleParameterAnnotations.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeInvisibleParameterAnnotations.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeInvisibleParameterAnnotations.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeInvisibleParameterAnnotations.java 2026-04-17 19:09:35.000000000 +0000 @@ -34,6 +34,8 @@ public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { /** + * Constructs a new instance. + * * @param nameIndex Index pointing to the name Code * @param length Content length in bytes * @param input Input stream diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeVisibleAnnotations.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeVisibleAnnotations.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeVisibleAnnotations.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeVisibleAnnotations.java 2026-04-17 19:09:35.000000000 +0000 @@ -28,13 +28,15 @@ import com.sun.org.apache.bcel.internal.Const; /** - * represents an annotation that is represented in the class file and is provided to the JVM. + * An annotation that is represented in the class file and is provided to the JVM. * * @since 6.0 */ public class RuntimeVisibleAnnotations extends Annotations { /** + * Constructs a new instance. + * * @param nameIndex Index pointing to the name Code * @param length Content length in bytes * @param input Input stream @@ -46,7 +48,9 @@ } /** - * @return deep copy of this attribute + * Creates a deep copy of this attribute. + * + * @return deep copy of this attribute. */ @Override public Attribute copy(final ConstantPool constantPool) { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeVisibleParameterAnnotations.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeVisibleParameterAnnotations.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeVisibleParameterAnnotations.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/RuntimeVisibleParameterAnnotations.java 2026-04-17 19:09:35.000000000 +0000 @@ -34,6 +34,8 @@ public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { /** + * Constructs a new instance. + * * @param nameIndex Index pointing to the name Code * @param length Content length in bytes * @param input Input stream diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Signature.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Signature.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Signature.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Signature.java 2026-04-17 19:09:35.000000000 +0000 @@ -110,7 +110,7 @@ if ((ch = in.read()) == -1) { throw new IllegalArgumentException("Illegal signature: " + in.getData() + " no ident, reaching EOF"); } - // System.out.println("return from ident:" + (char)ch); + // System.out.println("return from ident:" + (char) ch); if (!identStart(ch)) { final StringBuilder buf2 = new StringBuilder(); int count = 1; @@ -128,7 +128,7 @@ buf.append(buf2); ch = in.read(); in.unread(); - // System.out.println("so far:" + buf2 + ":next:" +(char)ch); + // System.out.println("so far:" + buf2 + ":next:" +(char) ch); } else { for (int i = 0; i < count; i++) { in.unread(); @@ -141,10 +141,10 @@ do { buf2.append((char) ch); ch = in.read(); - // System.out.println("within ident:"+ (char)ch); + // System.out.println("within ident:"+ (char) ch); } while (ch != -1 && (Character.isJavaIdentifierPart((char) ch) || ch == '/')); buf.append(Utility.pathToPackage(buf2.toString())); - // System.out.println("regular return ident:"+ (char)ch + ":" + buf2); + // System.out.println("regular return ident:"+ (char) ch + ":" + buf2); if (ch != -1) { in.unread(); } @@ -160,7 +160,7 @@ private int signatureIndex; /** - * Construct object from file stream. + * Constructs object from file stream. * * @param nameIndex Index in constant pool to CONSTANT_Utf8 * @param length Content length in bytes diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/SimpleElementValue.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/SimpleElementValue.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/SimpleElementValue.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/SimpleElementValue.java 2026-04-17 19:09:35.000000000 +0000 @@ -54,7 +54,7 @@ dos.writeShort(getIndex()); break; default: - throw new ClassFormatException("SimpleElementValue doesnt know how to write out type " + type); + throw new ClassFormatException("SimpleElementValue doesn't know how to write out type " + type); } } @@ -67,7 +67,7 @@ public boolean getValueBoolean() { if (super.getType() != PRIMITIVE_BOOLEAN) { - throw new IllegalStateException("Dont call getValueBoolean() on a non BOOLEAN ElementValue"); + throw new IllegalStateException("Don't call getValueBoolean() on a non BOOLEAN ElementValue"); } final ConstantInteger bo = (ConstantInteger) super.getConstantPool().getConstant(getIndex()); return bo.getBytes() != 0; @@ -75,21 +75,21 @@ public byte getValueByte() { if (super.getType() != PRIMITIVE_BYTE) { - throw new IllegalStateException("Dont call getValueByte() on a non BYTE ElementValue"); + throw new IllegalStateException("Don't call getValueByte() on a non BYTE ElementValue"); } return (byte) super.getConstantPool().getConstantInteger(getIndex()).getBytes(); } public char getValueChar() { if (super.getType() != PRIMITIVE_CHAR) { - throw new IllegalStateException("Dont call getValueChar() on a non CHAR ElementValue"); + throw new IllegalStateException("Don't call getValueChar() on a non CHAR ElementValue"); } return (char) super.getConstantPool().getConstantInteger(getIndex()).getBytes(); } public double getValueDouble() { if (super.getType() != PRIMITIVE_DOUBLE) { - throw new IllegalStateException("Dont call getValueDouble() on a non DOUBLE ElementValue"); + throw new IllegalStateException("Don't call getValueDouble() on a non DOUBLE ElementValue"); } final ConstantDouble d = (ConstantDouble) super.getConstantPool().getConstant(getIndex()); return d.getBytes(); @@ -97,7 +97,7 @@ public float getValueFloat() { if (super.getType() != PRIMITIVE_FLOAT) { - throw new IllegalStateException("Dont call getValueFloat() on a non FLOAT ElementValue"); + throw new IllegalStateException("Don't call getValueFloat() on a non FLOAT ElementValue"); } final ConstantFloat f = (ConstantFloat) super.getConstantPool().getConstant(getIndex()); return f.getBytes(); @@ -105,14 +105,14 @@ public int getValueInt() { if (super.getType() != PRIMITIVE_INT) { - throw new IllegalStateException("Dont call getValueInt() on a non INT ElementValue"); + throw new IllegalStateException("Don't call getValueInt() on a non INT ElementValue"); } return super.getConstantPool().getConstantInteger(getIndex()).getBytes(); } public long getValueLong() { if (super.getType() != PRIMITIVE_LONG) { - throw new IllegalStateException("Dont call getValueLong() on a non LONG ElementValue"); + throw new IllegalStateException("Don't call getValueLong() on a non LONG ElementValue"); } final ConstantLong j = (ConstantLong) super.getConstantPool().getConstant(getIndex()); return j.getBytes(); @@ -120,7 +120,7 @@ public short getValueShort() { if (super.getType() != PRIMITIVE_SHORT) { - throw new IllegalStateException("Dont call getValueShort() on a non SHORT ElementValue"); + throw new IllegalStateException("Don't call getValueShort() on a non SHORT ElementValue"); } final ConstantInteger s = (ConstantInteger) super.getConstantPool().getConstant(getIndex()); return (short) s.getBytes(); @@ -128,7 +128,7 @@ public String getValueString() { if (super.getType() != STRING) { - throw new IllegalStateException("Dont call getValueString() on a non STRING ElementValue"); + throw new IllegalStateException("Don't call getValueString() on a non STRING ElementValue"); } return super.getConstantPool().getConstantUtf8(getIndex()).getBytes(); } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/SourceFile.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/SourceFile.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/SourceFile.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/SourceFile.java 2026-04-17 19:09:35.000000000 +0000 @@ -40,7 +40,7 @@ private int sourceFileIndex; /** - * Construct object from input stream. + * Constructs object from input stream. * * @param nameIndex Index in constant pool to CONSTANT_Utf8 * @param length Content length in bytes diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/StackMap.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/StackMap.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/StackMap.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/StackMap.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -30,8 +30,8 @@ /** * This class represents a stack map attribute used for preverification of Java classes for the - * Java 2 Micro Edition (J2ME). This attribute is used by the - * KVM and contained within the Code attribute of a method. See CLDC + * Java 2 Micro Edition (J2ME). This attribute is used by the + * KVM and contained within the Code attribute of a method. See CLDC * specification 5.3.1.2 * *
@@ -46,14 +46,14 @@
  * @see Code
  * @see StackMapEntry
  * @see StackMapType
- * @LastModified: Oct 2020
+ * @LastModified: Sept 2025
  */
 public final class StackMap extends Attribute {
 
     private StackMapEntry[] table; // Table of stack map entries
 
     /**
-     * Construct object from input stream.
+     * Constructs object from input stream.
      *
      * @param nameIndex Index of name
      * @param length Content length in bytes
diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/StackMapEntry.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/StackMapEntry.java
--- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/StackMapEntry.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/StackMapEntry.java	2026-04-17 19:09:35.000000000 +0000
@@ -59,7 +59,7 @@
     private ConstantPool constantPool;
 
     /**
-     * Construct object from input stream.
+     * Constructs object from input stream.
      *
      * @param dataInput Input stream
      * @throws IOException if an I/O error occurs.
@@ -75,9 +75,7 @@
         } else if (frameType == Const.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) {
             byteCodeOffset = dataInput.readUnsignedShort();
             typesOfStackItems = new StackMapType[] { new StackMapType(dataInput, constantPool) };
-        } else if (frameType >= Const.CHOP_FRAME && frameType <= Const.CHOP_FRAME_MAX) {
-            byteCodeOffset = dataInput.readUnsignedShort();
-        } else if (frameType == Const.SAME_FRAME_EXTENDED) {
+        } else if (frameType >= Const.CHOP_FRAME && frameType <= Const.CHOP_FRAME_MAX || frameType == Const.SAME_FRAME_EXTENDED) {
             byteCodeOffset = dataInput.readUnsignedShort();
         } else if (frameType >= Const.APPEND_FRAME && frameType <= Const.APPEND_FRAME_MAX) {
             byteCodeOffset = dataInput.readUnsignedShort();
@@ -167,7 +165,7 @@
         try {
             e = (StackMapEntry) clone();
         } catch (final CloneNotSupportedException ex) {
-            throw new Error("Clone Not Supported");
+            throw new UnsupportedOperationException("Clone Not Supported", ex);
         }
 
         e.typesOfLocals = new StackMapType[typesOfLocals.length];
@@ -190,9 +188,7 @@
         } else if (frameType == Const.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) {
             file.writeShort(byteCodeOffset);
             typesOfStackItems[0].dump(file);
-        } else if (frameType >= Const.CHOP_FRAME && frameType <= Const.CHOP_FRAME_MAX) {
-            file.writeShort(byteCodeOffset);
-        } else if (frameType == Const.SAME_FRAME_EXTENDED) {
+        } else if (frameType >= Const.CHOP_FRAME && frameType <= Const.CHOP_FRAME_MAX || frameType == Const.SAME_FRAME_EXTENDED) {
             file.writeShort(byteCodeOffset);
         } else if (frameType >= Const.APPEND_FRAME && frameType <= Const.APPEND_FRAME_MAX) {
             file.writeShort(byteCodeOffset);
@@ -232,7 +228,6 @@
 
     /**
      * Calculate stack map entry size
-     *
      */
     int getMapEntrySize() {
         if (frameType >= Const.SAME_FRAME && frameType <= Const.SAME_FRAME_MAX) {
diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/StackMapType.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/StackMapType.java
--- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/StackMapType.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/StackMapType.java	2026-04-17 19:09:35.000000000 +0000
@@ -34,9 +34,9 @@
  * @see StackMap
  * @see Const
  */
-public final class StackMapType implements Cloneable {
+public final class StackMapType implements Node, Cloneable {
 
-    public static final StackMapType[] EMPTY_ARRAY = {}; // must be public because BCELifier code generator writes calls to it
+    public static final StackMapType[] EMPTY_ARRAY = {}; // BCELifier code generator writes calls to constructor translating null to EMPTY_ARRAY
 
     private byte type;
     private int index = -1; // Index to CONSTANT_Class or offset
@@ -53,7 +53,7 @@
     }
 
     /**
-     * Construct object from file stream.
+     * Constructs object from file stream.
      *
      * @param file Input stream
      * @throws IOException if an I/O error occurs.
@@ -66,6 +66,18 @@
         this.constantPool = constantPool;
     }
 
+    /**
+     * Called by objects that are traversing the nodes of the tree implicitly defined by the contents of a Java class.
+     * I.e., the hierarchy of methods, fields, attributes, etc. spawns a tree of objects.
+     *
+     * @param v Visitor object
+     * @since 6.8.0
+     */
+    @Override
+    public void accept(final Visitor v) {
+        v.visitStackMapType(this);
+    }
+
     private byte checkType(final byte type) {
         if (type < Const.ITEM_Bogus || type > Const.ITEM_NewObject) {
             throw new ClassFormatException("Illegal type for StackMapType: " + type);
@@ -99,6 +111,15 @@
     }
 
     /**
+     * Gets the class name of this StackMapType from the constant pool at index position.
+     * @return the fully qualified name of the class for this StackMapType.
+     * @since 6.8.0
+     */
+    public String getClassName() {
+        return constantPool.constantToString(index, Const.CONSTANT_Class);
+    }
+
+    /**
      * @return Constant pool used by this object.
      */
     public ConstantPool getConstantPool() {
@@ -129,7 +150,7 @@
             if (index < 0) {
                 return ", class=";
             }
-            return ", class=" + constantPool.constantToString(index, Const.CONSTANT_Class);
+            return ", class=" + getClassName();
         }
         if (type == Const.ITEM_NewObject) {
             return ", offset=" + index;
diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Synthetic.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Synthetic.java
--- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Synthetic.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Synthetic.java	2026-04-17 19:09:35.000000000 +0000
@@ -52,7 +52,7 @@
     }
 
     /**
-     * Construct object from input stream.
+     * Constructs object from input stream.
      *
      * @param nameIndex Index in constant pool to CONSTANT_Utf8
      * @param length Content length in bytes
diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Utility.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Utility.java
--- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Utility.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Utility.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
  */
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
@@ -43,7 +43,7 @@
 /**
  * Utility functions that do not really belong to any class in particular.
  *
- * @LastModified: Feb 2023
+ * @LastModified: Sept 2025
  */
 // @since 6.0 methods are no longer final
 public abstract class Utility {
@@ -51,7 +51,7 @@
     /**
      * Decode characters into bytes. Used by decode()
      */
-    private static class JavaReader extends FilterReader {
+    private static final class JavaReader extends FilterReader {
 
         public JavaReader(final Reader in) {
             super(in);
@@ -88,10 +88,10 @@
     }
 
     /**
-     * Encode bytes into valid java identifier characters. Used by
+     * Encode bytes into valid Java identifier characters. Used by
      * encode()
      */
-    private static class JavaWriter extends FilterWriter {
+    private static final class JavaWriter extends FilterWriter {
 
         public JavaWriter(final Writer out) {
             super(out);
@@ -437,7 +437,9 @@
         case Const.NEW:
         case Const.CHECKCAST:
             buf.append("\t");
-            //$FALL-THROUGH$
+            index = bytes.readUnsignedShort();
+            buf.append("\t<").append(constantPool.constantToString(index, Const.CONSTANT_Class)).append(">").append(verbose ? " (" + index + ")" : "");
+            break;
         case Const.INSTANCEOF:
             index = bytes.readUnsignedShort();
             buf.append("\t<").append(constantPool.constantToString(index, Const.CONSTANT_Class)).append(">").append(verbose ? " (" + index + ")" : "");
@@ -864,7 +866,7 @@
             // Skip any type arguments to read argument declarations between '(' and ')'
             index = signature.indexOf('(') + 1;
             if (index <= 0) {
-                throw new ClassFormatException("Invalid method signature: " + signature);
+                throw new InvalidMethodSignatureException(signature);
             }
             while (signature.charAt(index) != ')') {
                 vec.add(typeSignatureToString(signature.substring(index), chopit));
@@ -872,7 +874,7 @@
                 index += unwrap(CONSUMER_CHARS); // update position
             }
         } catch (final StringIndexOutOfBoundsException e) { // Should never occur
-            throw new ClassFormatException("Invalid method signature: " + signature, e);
+            throw new InvalidMethodSignatureException(signature, e);
         }
         return vec.toArray(Const.EMPTY_STRING_ARRAY);
     }
@@ -903,11 +905,11 @@
             // Read return type after ')'
             index = signature.lastIndexOf(')') + 1;
             if (index <= 0) {
-                throw new ClassFormatException("Invalid method signature: " + signature);
+                throw new InvalidMethodSignatureException(signature);
             }
             type = typeSignatureToString(signature.substring(index), chopit);
         } catch (final StringIndexOutOfBoundsException e) { // Should never occur
-            throw new ClassFormatException("Invalid method signature: " + signature, e);
+            throw new InvalidMethodSignatureException(signature, e);
         }
         return type;
     }
@@ -959,7 +961,7 @@
             // Skip any type arguments to read argument declarations between '(' and ')'
             index = signature.indexOf('(') + 1;
             if (index <= 0) {
-                throw new ClassFormatException("Invalid method signature: " + signature);
+                throw new InvalidMethodSignatureException(signature);
             }
             while (signature.charAt(index) != ')') {
                 final String paramType = typeSignatureToString(signature.substring(index), chopit);
@@ -985,7 +987,7 @@
             // Read return type after ')'
             type = typeSignatureToString(signature.substring(index), chopit);
         } catch (final StringIndexOutOfBoundsException e) { // Should never occur
-            throw new ClassFormatException("Invalid method signature: " + signature, e);
+            throw new InvalidMethodSignatureException(signature, e);
         }
         // ignore any throws information in the signature
         if (buf.length() > 1) {
@@ -1172,7 +1174,7 @@
             type = typeParams + typeSignaturesToString(signature.substring(index), chopit, ')');
             index += unwrap(CONSUMER_CHARS); // update position
             // add return type
-            type = type + typeSignatureToString(signature.substring(index), chopit);
+            type += typeSignatureToString(signature.substring(index), chopit);
             index += unwrap(CONSUMER_CHARS); // update position
             // ignore any throws information in the signature
             return type;
@@ -1237,12 +1239,12 @@
         int index;
         try {
             if (signature.charAt(0) != '(') {
-                throw new ClassFormatException("Invalid method signature: " + signature);
+                throw new InvalidMethodSignatureException(signature);
             }
             index = signature.lastIndexOf(')') + 1;
             return typeOfSignature(signature.substring(index));
         } catch (final StringIndexOutOfBoundsException e) {
-            throw new ClassFormatException("Invalid method signature: " + signature, e);
+            throw new InvalidMethodSignatureException(signature, e);
         }
     }
 
@@ -1286,10 +1288,10 @@
             case '*':
                 return typeOfSignature(signature.substring(1));
             default:
-                throw new ClassFormatException("Invalid method signature: " + signature);
+                throw new InvalidMethodSignatureException(signature);
             }
         } catch (final StringIndexOutOfBoundsException e) {
-            throw new ClassFormatException("Invalid method signature: " + signature, e);
+            throw new InvalidMethodSignatureException(signature, e);
         }
     }
 
@@ -1469,8 +1471,8 @@
                 } else {
                     type.append(typeSignatureToString(signature.substring(consumedChars), chopit));
                     // update our consumed count by the number of characters the for type argument
-                    consumedChars = unwrap(Utility.CONSUMER_CHARS) + consumedChars;
-                    wrap(Utility.CONSUMER_CHARS, consumedChars);
+                    consumedChars = unwrap(CONSUMER_CHARS) + consumedChars;
+                    wrap(CONSUMER_CHARS, consumedChars);
                 }
 
                 // are there more TypeArguments?
@@ -1490,8 +1492,8 @@
                     } else {
                         type.append(typeSignatureToString(signature.substring(consumedChars), chopit));
                         // update our consumed count by the number of characters the for type argument
-                        consumedChars = unwrap(Utility.CONSUMER_CHARS) + consumedChars;
-                        wrap(Utility.CONSUMER_CHARS, consumedChars);
+                        consumedChars = unwrap(CONSUMER_CHARS) + consumedChars;
+                        wrap(CONSUMER_CHARS, consumedChars);
                     }
                 }
 
@@ -1508,14 +1510,14 @@
                     // update our consumed count by the number of characters the for type argument
                     // note that this count includes the "L" we added, but that is ok
                     // as it accounts for the "." we didn't consume
-                    consumedChars = unwrap(Utility.CONSUMER_CHARS) + consumedChars;
-                    wrap(Utility.CONSUMER_CHARS, consumedChars);
+                    consumedChars = unwrap(CONSUMER_CHARS) + consumedChars;
+                    wrap(CONSUMER_CHARS, consumedChars);
                     return type.toString();
                 }
                 if (signature.charAt(consumedChars) != ';') {
                     throw new ClassFormatException("Invalid signature: " + signature);
                 }
-                wrap(Utility.CONSUMER_CHARS, consumedChars + 1); // remove final ";"
+                wrap(CONSUMER_CHARS, consumedChars + 1); // remove final ";"
                 return type.toString();
             }
             case 'S':
@@ -1536,9 +1538,9 @@
                 // The rest of the string denotes a ''
                 type = typeSignatureToString(signature.substring(n), chopit);
                 // corrected concurrent private static field acess
-                // Utility.consumed_chars += consumed_chars; is replaced by:
-                final int temp = unwrap(Utility.CONSUMER_CHARS) + consumedChars;
-                wrap(Utility.CONSUMER_CHARS, temp);
+                // consumed_chars += consumed_chars; is replaced by:
+                final int temp = unwrap(CONSUMER_CHARS) + consumedChars;
+                wrap(CONSUMER_CHARS, temp);
                 return type + brackets.toString();
             }
             case 'V':
@@ -1552,11 +1554,11 @@
     }
 
     private static int unwrap(final ThreadLocal tl) {
-        return tl.get();
+        return tl.get().intValue();
     }
 
     private static void wrap(final ThreadLocal tl, final int value) {
-        tl.set(value);
+        tl.set(Integer.valueOf(value));
     }
 
 }
diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Visitor.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Visitor.java
--- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Visitor.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/Visitor.java	2026-04-17 19:09:35.000000000 +0000
@@ -217,11 +217,32 @@
      */
     void visitParameterAnnotation(ParameterAnnotations obj);
 
+
     /**
      * @since 6.0
      */
     void visitParameterAnnotationEntry(ParameterAnnotationEntry obj);
 
+    /**
+     * Visits a {@link Record} object.
+     *
+     * @param obj Record to visit
+     * @since 6.9.0
+     */
+    default void visitRecord(final Record obj) {
+        // empty
+    }
+
+    /**
+     * Visits a {@link RecordComponentInfo} object.
+     *
+     * @param record component to visit
+     * @since 6.9.0
+     */
+    default void visitRecordComponent(final RecordComponentInfo record) {
+     // noop
+    }
+
     void visitSignature(Signature obj);
 
     void visitSourceFile(SourceFile obj);
@@ -230,7 +251,18 @@
 
     void visitStackMapEntry(StackMapEntry obj);
 
+    /**
+     * Visits a {@link StackMapType} object.
+     *
+     * @param obj object to visit
+     * @since 6.8.0
+     */
+    default void visitStackMapType(final StackMapType obj) {
+      // empty
+    }
+
     void visitSynthetic(Synthetic obj);
 
     void visitUnknown(Unknown obj);
+
 }
diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/package-info.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/package-info.java
--- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/package-info.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/classfile/package-info.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,25 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+/**
+ * Classes that describe the structure of a Java class file and a class file parser.
+ */
+package com.sun.org.apache.bcel.internal.classfile;
diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ARRAYLENGTH.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ARRAYLENGTH.java
--- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ARRAYLENGTH.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ARRAYLENGTH.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
  */
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
@@ -28,12 +28,12 @@
  * 
  * Stack: ..., arrayref -> ..., length
  * 
- * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackProducer, StackConsumer /* since 6.0 */ { /** - * Get length of array + * Gets length of array */ public ARRAYLENGTH() { super(com.sun.org.apache.bcel.internal.Const.ARRAYLENGTH, (short) 1); diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ATHROW.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ATHROW.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ATHROW.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ATHROW.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -28,8 +28,10 @@ *
  * Stack: ..., objectref -> objectref
  * 
+ * + * @LastModified: Sept 2025 */ -public class ATHROW extends Instruction implements UnconditionalBranch, ExceptionThrower { +public class ATHROW extends Instruction implements UnconditionalBranch, ExceptionThrower, StackConsumer { /** * Throw exception @@ -48,6 +50,7 @@ public void accept(final Visitor v) { v.visitUnconditionalBranch(this); v.visitExceptionThrower(this); + v.visitStackConsumer(this); v.visitATHROW(this); } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/AnnotationEntryGen.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/AnnotationEntryGen.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/AnnotationEntryGen.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/AnnotationEntryGen.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -28,6 +28,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import com.sun.org.apache.bcel.internal.classfile.AnnotationEntry; import com.sun.org.apache.bcel.internal.classfile.Attribute; @@ -37,10 +38,11 @@ import com.sun.org.apache.bcel.internal.classfile.RuntimeInvisibleParameterAnnotations; import com.sun.org.apache.bcel.internal.classfile.RuntimeVisibleAnnotations; import com.sun.org.apache.bcel.internal.classfile.RuntimeVisibleParameterAnnotations; +import jdk.xml.internal.Utils; /** * @since 6.0 - * @LastModified: Jan 2020 + * @LastModified: Sept 2025 */ public class AnnotationEntryGen { @@ -53,7 +55,7 @@ * @param annotationEntryGens An array of AnnotationGen objects */ static Attribute[] getAnnotationAttributes(final ConstantPoolGen cp, final AnnotationEntryGen[] annotationEntryGens) { - if (annotationEntryGens.length == 0) { + if (annotationEntryGens == null && annotationEntryGens.length == 0) { return Attribute.EMPTY_ARRAY; } @@ -255,11 +257,7 @@ } private List copyValues(final ElementValuePair[] in, final ConstantPoolGen cpool, final boolean copyPoolEntries) { - final List out = new ArrayList<>(); - for (final ElementValuePair nvp : in) { - out.add(new ElementValuePairGen(nvp, cpool, copyPoolEntries)); - } - return out; + return Utils.streamOfIfNonNull(in).map(nvp -> new ElementValuePairGen(nvp, cpool, copyPoolEntries)).collect(Collectors.toList()); } public void dump(final DataOutputStream dos) throws IOException { @@ -286,18 +284,20 @@ } public final String getTypeName() { - return getTypeSignature();// BCELBUG: Should I use this instead? + return getTypeSignature(); // BCELBUG: Should I use this instead? // Utility.signatureToString(getTypeSignature()); } public final String getTypeSignature() { - // ConstantClass c = (ConstantClass)cpool.getConstant(typeIndex); + // ConstantClass c = (ConstantClass) cpool.getConstant(typeIndex); final ConstantUtf8 utf8 = (ConstantUtf8) cpool.getConstant(typeIndex/* c.getNameIndex() */); return utf8.getBytes(); } /** - * Returns list of ElementNameValuePair objects + * Returns list of ElementNameValuePair objects. + * + * @return list of ElementNameValuePair objects. */ public List getValues() { return evs; diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ArrayElementValueGen.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ArrayElementValueGen.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ArrayElementValueGen.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ArrayElementValueGen.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,6 +1,5 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -25,12 +24,15 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import com.sun.org.apache.bcel.internal.classfile.ArrayElementValue; import com.sun.org.apache.bcel.internal.classfile.ElementValue; +import jdk.xml.internal.Utils; /** * @since 6.0 + * @LastModified: Sept 2025 */ public class ArrayElementValueGen extends ElementValueGen { // J5TODO: Should we make this an array or a list? A list would be easier to @@ -46,7 +48,7 @@ evalues = new ArrayList<>(); final ElementValue[] in = value.getElementValuesArray(); for (final ElementValue element : in) { - evalues.add(ElementValueGen.copy(element, cpool, copyPoolEntries)); + evalues.add(copy(element, cpool, copyPoolEntries)); } } @@ -55,15 +57,12 @@ evalues = new ArrayList<>(); } - public ArrayElementValueGen(final int type, final ElementValue[] datums, final ConstantPoolGen cpool) { + public ArrayElementValueGen(final int type, final ElementValue[] elementValues, final ConstantPoolGen cpool) { super(type, cpool); if (type != ARRAY) { throw new IllegalArgumentException("Only element values of type array can be built with this ctor - type specified: " + type); } - this.evalues = new ArrayList<>(); - for (final ElementValue datum : datums) { - evalues.add(ElementValueGen.copy(datum, cpool, true)); - } + this.evalues = Utils.streamOfIfNonNull(elementValues).map(e -> copy(e, cpool, true)).collect(Collectors.toList()); } public void addElement(final ElementValueGen gen) { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ArrayType.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ArrayType.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ArrayType.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ArrayType.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,6 +1,5 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -24,6 +23,8 @@ /** * Denotes array type, such as int[][] + * + * @LastModified: Sept 2025 */ public final class ArrayType extends ReferenceType { @@ -43,7 +44,7 @@ /** * Convenience constructor for reference array type, e.g. Object[] * - * @param className complete name of class (java.lang.String, e.g.) + * @param className complete name of class ({@link String}, for example) * @param dimensions array dimensions */ public ArrayType(final String className, final int dimensions) { @@ -56,6 +57,7 @@ * @param type type of array (may be an array itself) * @param dimensions array dimensions */ + @SuppressWarnings("deprecation") //signature public ArrayType(final Type type, final int dimensions) { super(Const.T_ARRAY, ""); if (dimensions < 1 || dimensions > Const.MAX_BYTE) { @@ -79,7 +81,7 @@ buf.append('['); } buf.append(basicType.getSignature()); - super.setSignature(buf.toString()); + this.signature = buf.toString(); } /** diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/BranchHandle.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/BranchHandle.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/BranchHandle.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/BranchHandle.java 2026-04-17 19:09:35.000000000 +0000 @@ -63,7 +63,7 @@ } /** - * Set new contents. Old instruction is disposed and may not be used anymore. + * Sets new contents. Old instruction is disposed and may not be used anymore. */ @Override // This is only done in order to apply the additional type check; could be merged with super impl. public void setInstruction(final Instruction i) { // TODO could be package-protected? diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/CPInstruction.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/CPInstruction.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/CPInstruction.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/CPInstruction.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -35,7 +35,7 @@ * @see LDC * @see INVOKEVIRTUAL * - * @LastModified: Jan 2020 + * @LastModified: Sept 2025 */ public abstract class CPInstruction extends Instruction implements TypedInstruction, IndexedInstruction { @@ -104,7 +104,7 @@ } /** - * Set the index to constant pool. + * Sets the index to constant pool. * * @param index in constant pool. */ diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ClassElementValueGen.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ClassElementValueGen.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ClassElementValueGen.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ClassElementValueGen.java 2026-04-17 19:09:35.000000000 +0000 @@ -48,12 +48,12 @@ } protected ClassElementValueGen(final int typeIdx, final ConstantPoolGen cpool) { - super(ElementValueGen.CLASS, cpool); + super(CLASS, cpool); this.idx = typeIdx; } public ClassElementValueGen(final ObjectType t, final ConstantPoolGen cpool) { - super(ElementValueGen.CLASS, cpool); + super(CLASS, cpool); // this.idx = cpool.addClass(t); idx = cpool.addUtf8(t.getSignature()); } @@ -67,9 +67,9 @@ public String getClassString() { final ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(idx); return cu8.getBytes(); - // ConstantClass c = (ConstantClass)getConstantPool().getConstant(idx); + // ConstantClass c = (ConstantClass) getConstantPool().getConstant(idx); // ConstantUtf8 utf8 = - // (ConstantUtf8)getConstantPool().getConstant(c.getNameIndex()); + // (ConstantUtf8) getConstantPool().getConstant(c.getNameIndex()); // return utf8.getBytes(); } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ClassGen.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ClassGen.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ClassGen.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ClassGen.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -40,40 +40,37 @@ import com.sun.org.apache.bcel.internal.util.BCELComparator; /** - * Template class for building up a java class. May be initialized with an existing java class (file). + * Template class for building up a java class. May be initialized with an existing Java class (file). * * @see JavaClass - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public class ClassGen extends AccessFlags implements Cloneable { - private static BCELComparator bcelComparator = new BCELComparator() { + private static BCELComparator bcelComparator = new BCELComparator() { @Override - public boolean equals(final Object o1, final Object o2) { - final ClassGen THIS = (ClassGen) o1; - final ClassGen THAT = (ClassGen) o2; - return Objects.equals(THIS.getClassName(), THAT.getClassName()); + public boolean equals(final ClassGen a, final ClassGen b) { + return a == b || a != null && b != null && Objects.equals(a.getClassName(), b.getClassName()); } @Override - public int hashCode(final Object o) { - final ClassGen THIS = (ClassGen) o; - return THIS.getClassName().hashCode(); + public int hashCode(final ClassGen o) { + return o != null ? Objects.hashCode(o.getClassName()) : 0; } }; /** * @return Comparison strategy object */ - public static BCELComparator getComparator() { + public static BCELComparator getComparator() { return bcelComparator; } /** * @param comparator Comparison strategy object */ - public static void setComparator(final BCELComparator comparator) { + public static void setComparator(final BCELComparator comparator) { bcelComparator = comparator; } @@ -101,7 +98,7 @@ private List observers; /** - * Initialize with existing class. + * Constructs a new instance from an existing class. * * @param clazz JavaClass object (e.g. read from file) */ @@ -118,15 +115,26 @@ final Attribute[] attributes = clazz.getAttributes(); // J5TODO: Could make unpacking lazy, done on first reference final AnnotationEntryGen[] annotations = unpackAnnotations(attributes); - Collections.addAll(interfaceList, clazz.getInterfaceNames()); - for (final Attribute attribute : attributes) { - if (!(attribute instanceof Annotations)) { - addAttribute(attribute); + final String[] interfaceNames = clazz.getInterfaceNames(); + if (interfaceNames != null) { + Collections.addAll(interfaceList, interfaceNames); + } + if (attributes != null) { + for (final Attribute attribute : attributes) { + if (!(attribute instanceof Annotations)) { + addAttribute(attribute); + } } } Collections.addAll(annotationList, annotations); - Collections.addAll(methodList, clazz.getMethods()); - Collections.addAll(fieldList, clazz.getFields()); + final Method[] methods = clazz.getMethods(); + if (methods != null) { + Collections.addAll(methodList, methods); + } + final Field[] fields = clazz.getFields(); + if (fields != null) { + Collections.addAll(fieldList, fields); + } } /** @@ -242,7 +250,7 @@ try { return super.clone(); } catch (final CloneNotSupportedException e) { - throw new Error("Clone Not Supported"); // never happens + throw new UnsupportedOperationException("Clone Not Supported", e); // never happens } } @@ -282,7 +290,7 @@ */ @Override public boolean equals(final Object obj) { - return bcelComparator.equals(this, obj); + return obj instanceof ClassGen && bcelComparator.equals(this, (ClassGen) obj); } // J5TODO: Should we make calling unpackAnnotations() lazy and put it in here? @@ -379,7 +387,7 @@ } /** - * Return value as defined by given BCELComparator strategy. By default return the hashcode of the class name. + * Return value as defined by given BCELComparator strategy. By default return the hash code of the class name. * * @see Object#hashCode() */ @@ -478,7 +486,7 @@ } /** - * Set major version number of class file, default value is 45 (JDK 1.1) + * Sets major version number of class file, default value is 45 (JDK 1.1) * * @param major major version number */ @@ -492,11 +500,13 @@ public void setMethods(final Method[] methods) { methodList.clear(); - Collections.addAll(methodList, methods); + if (methods != null) { + Collections.addAll(methodList, methods); + } } /** - * Set minor version number of class file, default value is 3 (JDK 1.1) + * Sets minor version number of class file, default value is 3 (JDK 1.1) * * @param minor minor version number */ @@ -515,17 +525,19 @@ } /** - * Look for attributes representing annotations and unpack them. + * Unpacks attributes representing annotations. */ - private AnnotationEntryGen[] unpackAnnotations(final Attribute[] attrs) { + private AnnotationEntryGen[] unpackAnnotations(final Attribute[] attributes) { final List annotationGenObjs = new ArrayList<>(); - for (final Attribute attr : attrs) { - if (attr instanceof RuntimeVisibleAnnotations) { - final RuntimeVisibleAnnotations rva = (RuntimeVisibleAnnotations) attr; - rva.forEach(a -> annotationGenObjs.add(new AnnotationEntryGen(a, getConstantPool(), false))); - } else if (attr instanceof RuntimeInvisibleAnnotations) { - final RuntimeInvisibleAnnotations ria = (RuntimeInvisibleAnnotations) attr; - ria.forEach(a -> annotationGenObjs.add(new AnnotationEntryGen(a, getConstantPool(), false))); + if (attributes != null) { + for (final Attribute attr : attributes) { + if (attr instanceof RuntimeVisibleAnnotations) { + final RuntimeVisibleAnnotations rva = (RuntimeVisibleAnnotations) attr; + rva.forEach(a -> annotationGenObjs.add(new AnnotationEntryGen(a, getConstantPool(), false))); + } else if (attr instanceof RuntimeInvisibleAnnotations) { + final RuntimeInvisibleAnnotations ria = (RuntimeInvisibleAnnotations) attr; + ria.forEach(a -> annotationGenObjs.add(new AnnotationEntryGen(a, getConstantPool(), false))); + } } } return annotationGenObjs.toArray(AnnotationEntryGen.EMPTY_ARRAY); diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/CodeExceptionGen.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/CodeExceptionGen.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/CodeExceptionGen.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/CodeExceptionGen.java 2026-04-17 19:09:35.000000000 +0000 @@ -63,7 +63,7 @@ try { return super.clone(); } catch (final CloneNotSupportedException e) { - throw new Error("Clone Not Supported"); // never happens + throw new UnsupportedOperationException("Clone Not Supported", e); // never happens } } @@ -81,7 +81,7 @@ } /** - * Get CodeException object.
+ * Gets CodeException object.
* * This relies on that the instruction list has already been dumped to byte code or that the 'setPositions' methods * has been called for the instruction list. @@ -120,7 +120,7 @@ } /* - * Set end of handler + * Sets end of handler * * @param endPc End of handled region (inclusive) */ @@ -130,7 +130,7 @@ } /* - * Set handler code + * Sets handler code * * @param handlerPc Start of handler */ @@ -140,7 +140,7 @@ } /* - * Set start of handler + * Sets start of handler * * @param startPc Start of handled region (inclusive) */ diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ElementValuePairGen.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ElementValuePairGen.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ElementValuePairGen.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ElementValuePairGen.java 2026-04-17 19:09:35.000000000 +0000 @@ -44,7 +44,7 @@ // Could assert nvp.getNameString() points to the same thing as // constantPoolGen.getConstant(nvp.getNameIndex()) // if - // (!nvp.getNameString().equals(((ConstantUtf8)constantPoolGen.getConstant(nvp.getNameIndex())).getBytes())) + // (!nvp.getNameString().equals(((ConstantUtf8) constantPoolGen.getConstant(nvp.getNameIndex())).getBytes())) // { // throw new IllegalArgumentException("envp buggered"); // } @@ -86,7 +86,7 @@ } public final String getNameString() { - // ConstantString cu8 = (ConstantString)constantPoolGen.getConstant(nameIdx); + // ConstantString cu8 = (ConstantString) constantPoolGen.getConstant(nameIdx); return ((ConstantUtf8) constantPoolGen.getConstant(nameIdx)).getBytes(); } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/EnumElementValueGen.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/EnumElementValueGen.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/EnumElementValueGen.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/EnumElementValueGen.java 2026-04-17 19:09:35.000000000 +0000 @@ -40,10 +40,8 @@ public EnumElementValueGen(final EnumElementValue value, final ConstantPoolGen cpool, final boolean copyPoolEntries) { super(ENUM_CONSTANT, cpool); if (copyPoolEntries) { - typeIdx = cpool.addUtf8(value.getEnumTypeString());// was - // addClass(value.getEnumTypeString()); - valueIdx = cpool.addUtf8(value.getEnumValueString()); // was - // addString(value.getEnumValueString()); + typeIdx = cpool.addUtf8(value.getEnumTypeString()); // was addClass(value.getEnumTypeString()); + valueIdx = cpool.addUtf8(value.getEnumValueString()); // was addString(value.getEnumValueString()); } else { typeIdx = value.getTypeIndex(); valueIdx = value.getValueIndex(); @@ -55,7 +53,7 @@ * This ctor is used for deserialization */ protected EnumElementValueGen(final int typeIdx, final int valueIdx, final ConstantPoolGen cpool) { - super(ElementValueGen.ENUM_CONSTANT, cpool); + super(ENUM_CONSTANT, cpool); if (super.getElementValueType() != ENUM_CONSTANT) { throw new IllegalArgumentException("Only element values of type enum can be built with this ctor - type specified: " + super.getElementValueType()); } @@ -64,9 +62,9 @@ } public EnumElementValueGen(final ObjectType t, final String value, final ConstantPoolGen cpool) { - super(ElementValueGen.ENUM_CONSTANT, cpool); - typeIdx = cpool.addUtf8(t.getSignature());// was addClass(t); - valueIdx = cpool.addUtf8(value);// was addString(value); + super(ENUM_CONSTANT, cpool); + typeIdx = cpool.addUtf8(t.getSignature()); // was addClass(t); + valueIdx = cpool.addUtf8(value); // was addString(value); } @Override @@ -90,9 +88,9 @@ public String getEnumTypeString() { // Constant cc = getConstantPool().getConstant(typeIdx); // ConstantClass cu8 = - // (ConstantClass)getConstantPool().getConstant(typeIdx); + // (ConstantClass) getConstantPool().getConstant(typeIdx); // return - // ((ConstantUtf8)getConstantPool().getConstant(cu8.getNameIndex())).getBytes(); + // ((ConstantUtf8) getConstantPool().getConstant(cu8.getNameIndex())).getBytes(); return ((ConstantUtf8) getConstantPool().getConstant(typeIdx)).getBytes(); // return Utility.signatureToString(cu8.getBytes()); } @@ -100,9 +98,9 @@ public String getEnumValueString() { return ((ConstantUtf8) getConstantPool().getConstant(valueIdx)).getBytes(); // ConstantString cu8 = - // (ConstantString)getConstantPool().getConstant(valueIdx); + // (ConstantString) getConstantPool().getConstant(valueIdx); // return - // ((ConstantUtf8)getConstantPool().getConstant(cu8.getStringIndex())).getBytes(); + // ((ConstantUtf8) getConstantPool().getConstant(cu8.getStringIndex())).getBytes(); } public int getTypeIndex() { @@ -118,8 +116,8 @@ final ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(valueIdx); return cu8.getBytes(); // ConstantString cu8 = - // (ConstantString)getConstantPool().getConstant(valueIdx); + // (ConstantString) getConstantPool().getConstant(valueIdx); // return - // ((ConstantUtf8)getConstantPool().getConstant(cu8.getStringIndex())).getBytes(); + // ((ConstantUtf8) getConstantPool().getConstant(cu8.getStringIndex())).getBytes(); } } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ExceptionThrower.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ExceptionThrower.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ExceptionThrower.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ExceptionThrower.java 2026-04-17 19:09:35.000000000 +0000 @@ -23,7 +23,7 @@ /** * Denote an instruction that may throw a run-time or a linking exception (or both) during execution. This is not quite - * the truth as such; because all instructions may throw an java.lang.VirtualMachineError. These exceptions are omitted. + * the truth as such; because all instructions may throw a {@link VirtualMachineError}. These exceptions are omitted. * * The Lava Language Specification specifies exactly which RUN-TIME and which LINKING exceptions each * instruction may throw which is reflected by the implementers. Due to the structure of the JVM specification, it may diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/FieldGen.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/FieldGen.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/FieldGen.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/FieldGen.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -40,37 +40,34 @@ * to a field (which must of course be compatible with to the declared type). * * @see Field - * @LastModified: May 2021 + * @LastModified: Sept 2025 */ public class FieldGen extends FieldGenOrMethodGen { - private static BCELComparator bcelComparator = new BCELComparator() { + private static BCELComparator bcelComparator = new BCELComparator() { @Override - public boolean equals(final Object o1, final Object o2) { - final FieldGen THIS = (FieldGen) o1; - final FieldGen THAT = (FieldGen) o2; - return Objects.equals(THIS.getName(), THAT.getName()) && Objects.equals(THIS.getSignature(), THAT.getSignature()); + public boolean equals(final FieldGen a, final FieldGen b) { + return a == b || a != null && b != null && Objects.equals(a.getName(), b.getName()) && Objects.equals(a.getSignature(), b.getSignature()); } @Override - public int hashCode(final Object o) { - final FieldGen THIS = (FieldGen) o; - return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); + public int hashCode(final FieldGen o) { + return o != null ? Objects.hash(o.getSignature(), o.getName()) : 0; } }; /** - * @return Comparison strategy object + * @return Comparison strategy object. */ - public static BCELComparator getComparator() { + public static BCELComparator getComparator() { return bcelComparator; } /** - * @param comparator Comparison strategy object + * @param comparator Comparison strategy object. */ - public static void setComparator(final BCELComparator comparator) { + public static void setComparator(final BCELComparator comparator) { bcelComparator = comparator; } @@ -81,8 +78,8 @@ /** * Instantiate from existing field. * - * @param field Field object - * @param cp constant pool (must contain the same entries as the field's constant pool) + * @param field Field object. + * @param cp constant pool (must contain the same entries as the field's constant pool). */ public FieldGen(final Field field, final ConstantPoolGen cp) { this(field.getAccessFlags(), Type.getType(field.getSignature()), field.getName(), cp); @@ -187,11 +184,11 @@ */ @Override public boolean equals(final Object obj) { - return bcelComparator.equals(this, obj); + return obj instanceof FieldGen && bcelComparator.equals(this, (FieldGen) obj); } /** - * Get field object after having set up all necessary values. + * Gets field object after having set up all necessary values. */ public Field getField() { final String signature = getSignature(); @@ -207,10 +204,7 @@ } public String getInitValue() { - if (value != null) { - return value.toString(); - } - return null; + return Objects.toString(value, null); } @Override @@ -219,7 +213,7 @@ } /** - * Return value as defined by given BCELComparator strategy. By default return the hashcode of the field's name XOR + * Return value as defined by given BCELComparator strategy. By default return the hash code of the field's name XOR * signature. * * @see Object#hashCode() @@ -295,7 +289,7 @@ } /** - * Set (optional) initial value of field, otherwise it will be set to null/0/false by the JVM automatically. + * Sets (optional) initial value of field, otherwise it will be set to null/0/false by the JVM automatically. */ public void setInitValue(final String str) { checkType(ObjectType.getInstance("java.lang.String")); diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/FieldGenOrMethodGen.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/FieldGenOrMethodGen.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/FieldGenOrMethodGen.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/FieldGenOrMethodGen.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -30,7 +30,7 @@ /** * Super class for FieldGen and MethodGen objects, since they have some methods in common! * - * @LastModified: May 2021 + * @LastModified: Sept 2025 */ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAndTyped, Cloneable { @@ -67,8 +67,10 @@ super(accessFlags); } - protected void addAll(final Attribute[] attrs) { - Collections.addAll(attributeList, attrs); + protected void addAll(final Attribute[] attributes) { + if (attributes != null) { + Collections.addAll(attributeList, attributes); + } } /** @@ -93,7 +95,7 @@ try { return super.clone(); } catch (final CloneNotSupportedException e) { - throw new Error("Clone Not Supported"); // never happens + throw new UnsupportedOperationException("Clone Not Supported", e); // never happens } } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/FieldOrMethod.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/FieldOrMethod.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/FieldOrMethod.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/FieldOrMethod.java 2026-04-17 19:09:35.000000000 +0000 @@ -53,7 +53,6 @@ * generated by Java 1.5, this answer is sometimes wrong (e.g., if the "clone()" method is called on an * array). A better idea is to use the {@link #getReferenceType(ConstantPoolGen)} method, which correctly * distinguishes between class types and array types. - * */ @Deprecated public String getClassName(final ConstantPoolGen cpg) { @@ -89,6 +88,9 @@ if (rt instanceof ObjectType) { return (ObjectType) rt; } + if (rt instanceof ArrayType) { + return Type.OBJECT; + } throw new ClassGenException(rt.getClass().getCanonicalName() + " " + rt.getSignature() + " does not represent an ObjectType"); } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ICONST.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ICONST.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ICONST.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ICONST.java 2026-04-17 19:09:35.000000000 +0000 @@ -25,7 +25,6 @@ *
  * Stack: ... -> ...,
  * 
- * */ public class ICONST extends Instruction implements ConstantPushInstruction { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/INVOKEDYNAMIC.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/INVOKEDYNAMIC.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/INVOKEDYNAMIC.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/INVOKEDYNAMIC.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -37,7 +37,7 @@ * @see The * invokedynamic instruction in The Java Virtual Machine Specification * @since 6.0 - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public class INVOKEDYNAMIC extends InvokeInstruction { @@ -104,11 +104,11 @@ } /** - * Since InvokeDynamic doesn't refer to a reference type, just return java.lang.Object, as that is the only type we can + * Since InvokeDynamic doesn't refer to a reference type, just return {@link Object}, as that is the only type we can * say for sure the reference will be. * * @param cpg the ConstantPoolGen used to create the instruction - * @return an ObjectType for java.lang.Object + * @return an ObjectType for {@link Object} * @since 6.1 */ @Override diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/Instruction.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/Instruction.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/Instruction.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/Instruction.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -29,7 +29,7 @@ /** * Abstract super class for all Java byte codes. * - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public abstract class Instruction implements Cloneable { @@ -461,7 +461,7 @@ public Instruction copy() { Instruction i = null; // "Constant" instruction, no need to duplicate - if (InstructionConst.getInstruction(this.getOpcode()) != null) { + if (InstructionConst.getInstruction(getOpcode()) != null) { i = this; } else { try { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionConst.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionConst.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionConst.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionConst.java 2026-04-17 19:09:35.000000000 +0000 @@ -170,7 +170,7 @@ public static final LocalVariableInstruction ISTORE_2 = new ISTORE(2); /** - * Get object via its opcode, for immutable instructions like branch instructions entries are set to null. + * Gets object via its opcode, for immutable instructions like branch instructions entries are set to null. */ static final Instruction[] INSTRUCTIONS = new Instruction[256]; diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionFactory.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionFactory.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionFactory.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionFactory.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -30,11 +30,11 @@ * * @see Const * @see InstructionConst - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public class InstructionFactory { - private static class MethodObject { + private static final class MethodObject { final Type[] argTypes; final Type resultType; @@ -53,10 +53,12 @@ private static final String FQCN_STRING_BUFFER = "java.lang.StringBuffer"; - // N.N. These must agree with the order of Constants.T_CHAR through T_LONG - private static final String[] shortNames = {"C", "F", "D", "B", "S", "I", "L"}; + /** + * These must agree with the order of Constants.T_CHAR through T_LONG. + */ + private static final String[] SHORT_NAMES = {"C", "F", "D", "B", "S", "I", "L"}; - private static final MethodObject[] appendMethodObjects = { + private static final MethodObject[] APPEND_METHOD_OBJECTS = { new MethodObject(FQCN_STRING_BUFFER, APPEND, Type.STRINGBUFFER, new Type[] { Type.STRING }), new MethodObject(FQCN_STRING_BUFFER, APPEND, Type.STRINGBUFFER, new Type[] { Type.OBJECT }), null, null, // indices 2, 3 new MethodObject(FQCN_STRING_BUFFER, APPEND, Type.STRINGBUFFER, new Type[] { Type.BOOLEAN }), @@ -484,7 +486,7 @@ public Instruction createAppend(final Type type) { final byte t = type.getType(); if (isString(type)) { - return createInvoke(appendMethodObjects[0], Const.INVOKEVIRTUAL); + return createInvoke(APPEND_METHOD_OBJECTS[0], Const.INVOKEVIRTUAL); } switch (t) { case Const.T_BOOLEAN: @@ -495,10 +497,10 @@ case Const.T_SHORT: case Const.T_INT: case Const.T_LONG: - return createInvoke(appendMethodObjects[t], Const.INVOKEVIRTUAL); + return createInvoke(APPEND_METHOD_OBJECTS[t], Const.INVOKEVIRTUAL); case Const.T_ARRAY: case Const.T_OBJECT: - return createInvoke(appendMethodObjects[1], Const.INVOKEVIRTUAL); + return createInvoke(APPEND_METHOD_OBJECTS[1], Const.INVOKEVIRTUAL); default: throw new IllegalArgumentException("No append for this type? " + type); } @@ -515,7 +517,7 @@ if (dest == Const.T_LONG && (src == Const.T_CHAR || src == Const.T_BYTE || src == Const.T_SHORT)) { src = Const.T_INT; } - final String name = "com.sun.org.apache.bcel.internal.generic." + shortNames[src - Const.T_CHAR] + "2" + shortNames[dest - Const.T_CHAR]; + final String name = "com.sun.org.apache.bcel.internal.generic." + SHORT_NAMES[src - Const.T_CHAR] + "2" + SHORT_NAMES[dest - Const.T_CHAR]; Instruction i = null; try { i = (Instruction) Class.forName(name).getDeclaredConstructor().newInstance();; @@ -642,8 +644,10 @@ int index; int nargs = 0; final String signature = Type.getMethodSignature(retType, argTypes); - for (final Type argType : argTypes) { - nargs += argType.getSize(); + if (argTypes != null) { + for (final Type argType : argTypes) { + nargs += argType.getSize(); + } } if (useInterface) { index = cp.addInterfaceMethodref(className, name, signature); diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionHandle.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionHandle.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionHandle.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionHandle.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -38,7 +38,7 @@ * @see Instruction * @see BranchHandle * @see InstructionList - * @LastModified: May 2021 + * @LastModified: Sept 2025 */ public class InstructionHandle { @@ -118,7 +118,7 @@ if (targeters == null) { targeters = new HashSet<>(); } - // if(!targeters.contains(t)) + // if (!targeters.contains(t)) targeters.add(t); } @@ -135,15 +135,12 @@ } /** - * Get attribute of an instruction handle. + * Gets attribute of an instruction handle. * * @param key the key object to store/retrieve the attribute */ public Object getAttribute(final Object key) { - if (attributes != null) { - return attributes.get(key); - } - return null; + return attributes != null ? attributes.get(key) : null; } /** @@ -247,7 +244,7 @@ } /** - * Set the position, i.e., the byte code offset of the contained instruction. + * Sets the position, i.e., the byte code offset of the contained instruction. */ void setPosition(final int pos) { i_position = pos; diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionList.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionList.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionList.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionList.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -33,6 +33,7 @@ import com.sun.org.apache.bcel.internal.Const; import com.sun.org.apache.bcel.internal.classfile.Constant; import com.sun.org.apache.bcel.internal.util.ByteSequence; +import jdk.xml.internal.Utils; /** * This class is a container for a list of Instruction objects. Instructions can be @@ -46,7 +47,7 @@ * @see Instruction * @see InstructionHandle * @see BranchHandle - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public class InstructionList implements Iterable { @@ -60,23 +61,25 @@ * @return target position's instruction handle if available */ public static InstructionHandle findHandle(final InstructionHandle[] ihs, final int[] pos, final int count, final int target) { - int l = 0; - int r = count - 1; - /* - * Do a binary search since the pos array is orderd. - */ - do { - final int i = l + r >>> 1; - final int j = pos[i]; - if (j == target) { - return ihs[i]; - } - if (target < j) { - r = i - 1; - } else { - l = i + 1; - } - } while (l <= r); + if (ihs != null && pos != null) { + int l = 0; + int r = count - 1; + /* + * Do a binary search since the pos array is orderd. + */ + do { + final int i = l + r >>> 1; + final int j = pos[i]; + if (j == target) { + return ihs[i]; + } + if (target < j) { + r = i - 1; + } else { + l = i + 1; + } + } while (l <= r); + } return null; } @@ -513,7 +516,7 @@ } /** - * Get instruction handle for instruction at byte code position pos. This only works properly, if the list is freshly + * Gets instruction handle for instruction at byte code position pos. This only works properly, if the list is freshly * initialized from a byte array or setPositions() has been called before this method. * * @param pos byte code position to search for @@ -605,7 +608,7 @@ } /** - * Get positions (offsets) of all instructions in the list. This relies on that the list has been freshly created from + * Gets positions (offsets) of all instructions in the list. This relies on that the list has been freshly created from * an byte code array, or that setPositions() has been called. Otherwise this may be inaccurate. * * @return array containing all instruction's offset in byte code @@ -959,7 +962,7 @@ * @see MethodGen */ public void redirectExceptionHandlers(final CodeExceptionGen[] exceptions, final InstructionHandle oldTarget, final InstructionHandle newTarget) { - for (final CodeExceptionGen exception : exceptions) { + Utils.streamOfIfNonNull(exceptions).forEach(exception -> { if (exception.getStartPC() == oldTarget) { exception.setStartPC(newTarget); } @@ -969,7 +972,7 @@ if (exception.getHandlerPC() == oldTarget) { exception.setHandlerPC(newTarget); } - } + }); } /** @@ -981,16 +984,14 @@ * @see MethodGen */ public void redirectLocalVariables(final LocalVariableGen[] lg, final InstructionHandle oldTarget, final InstructionHandle newTarget) { - for (final LocalVariableGen element : lg) { - final InstructionHandle start = element.getStart(); - final InstructionHandle end = element.getEnd(); - if (start == oldTarget) { + Utils.streamOfIfNonNull(lg).forEach(element -> { + if (element.getStart() == oldTarget) { element.setStart(newTarget); } - if (end == oldTarget) { + if (element.getEnd() == oldTarget) { element.setEnd(newTarget); } - } + }); } /** @@ -1120,7 +1121,7 @@ ih.setPosition(index); pos[count++] = index; /* - * Get an estimate about how many additional bytes may be added, because BranchInstructions may have variable length + * Gets an estimate about how many additional bytes may be added, because BranchInstructions may have variable length * depending on the target offset (short vs. int) or alignment issues (TABLESWITCH and LOOKUPSWITCH). */ switch (i.getOpcode()) { @@ -1132,11 +1133,14 @@ case Const.LOOKUPSWITCH: maxAdditionalBytes += 3; break; + default: + // TODO should this be an error? + break; } index += i.getLength(); } /* - * Pass 2: Expand the variable-length (Branch)Instructions depending on the target offset (short or int) and ensure that + * Pass 2: Expand the variable-length (Branch) Instructions depending on the target offset (short or int) and ensure that * branch targets are within this list. */ for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { @@ -1152,8 +1156,7 @@ pos[count++] = index; index += i.getLength(); } - bytePositions = new int[count]; // Trim to proper size - System.arraycopy(pos, 0, bytePositions, 0, count); + bytePositions = Arrays.copyOfRange(pos, 0, count); // Trim to proper size } /** diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionTargeter.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionTargeter.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionTargeter.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/InstructionTargeter.java 2026-04-17 19:09:35.000000000 +0000 @@ -22,7 +22,7 @@ package com.sun.org.apache.bcel.internal.generic; /** - * Denote that a class targets InstructionHandles within an InstructionList. Namely the following implementers: + * Denotes that a class targets InstructionHandles within an InstructionList. * * @see BranchHandle * @see LocalVariableGen @@ -33,9 +33,12 @@ // static final InstructionTargeter[] EMPTY_ARRAY = new InstructionTargeter[0]; /** - * Checks whether this targeter targets the specified instruction handle. + * Tests whether this targeter targets the specified instruction handle. + * + * @param instructionHandle the instruction handle to test. + * @return whether this targeter targets the specified instruction handle. */ - boolean containsTarget(InstructionHandle ih); + boolean containsTarget(InstructionHandle instructionHandle); /** * Replaces the target of this targeter from this old handle to the new handle. diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LCMP.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LCMP.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LCMP.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LCMP.java 2026-04-17 19:09:35.000000000 +0000 @@ -27,7 +27,6 @@ *
  * Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 -> ..., result <= -1, 0, 1>
  * 
- * */ public class LCMP extends Instruction implements TypedInstruction, StackProducer, StackConsumer { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LDC.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LDC.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LDC.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LDC.java 2026-04-17 19:09:35.000000000 +0000 @@ -94,6 +94,8 @@ return Type.INT; case com.sun.org.apache.bcel.internal.Const.CONSTANT_Class: return Type.CLASS; + case com.sun.org.apache.bcel.internal.Const.CONSTANT_Dynamic: + return Type.OBJECT; default: // Never reached throw new IllegalArgumentException("Unknown or invalid constant type at " + super.getIndex()); } @@ -113,7 +115,10 @@ case com.sun.org.apache.bcel.internal.Const.CONSTANT_Class: final int nameIndex = ((com.sun.org.apache.bcel.internal.classfile.ConstantClass) c).getNameIndex(); c = cpg.getConstantPool().getConstant(nameIndex); - return Type.getType(((com.sun.org.apache.bcel.internal.classfile.ConstantUtf8) c).getBytes()); + return Type.getType(Type.internalTypeNameToSignature(((com.sun.org.apache.bcel.internal.classfile.ConstantUtf8) c).getBytes())); + case com.sun.org.apache.bcel.internal.Const.CONSTANT_Dynamic: + // Really not sure what to return here, maybe a BootstrapMethod instance but how do we get it? + return c; default: // Never reached throw new IllegalArgumentException("Unknown or invalid constant type at " + super.getIndex()); } @@ -129,7 +134,7 @@ } /** - * Set the index to constant pool and adjust size. + * Sets the index to constant pool and adjust size. */ @Override public final void setIndex(final int index) { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LineNumberGen.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LineNumberGen.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LineNumberGen.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LineNumberGen.java 2026-04-17 19:09:35.000000000 +0000 @@ -54,7 +54,7 @@ try { return super.clone(); } catch (final CloneNotSupportedException e) { - throw new Error("Clone Not Supported"); // never happens + throw new UnsupportedOperationException("Clone Not Supported", e); // never happens } } @@ -71,7 +71,7 @@ } /** - * Get LineNumber attribute. + * Gets LineNumber attribute. * * This relies on that the instruction list has already been dumped to byte code or that the 'setPositions' methods * has been called for the instruction list. diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LocalVariableGen.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LocalVariableGen.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LocalVariableGen.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LocalVariableGen.java 2026-04-17 19:09:35.000000000 +0000 @@ -85,7 +85,7 @@ try { return super.clone(); } catch (final CloneNotSupportedException e) { - throw new Error("Clone Not Supported"); // never happens + throw new UnsupportedOperationException("Clone Not Supported", e); // never happens } } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LocalVariableInstruction.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LocalVariableInstruction.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LocalVariableInstruction.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/LocalVariableInstruction.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -28,7 +28,7 @@ /** * Abstract super class for instructions dealing with local variables. * - * @LastModified: May 2021 + * @LastModified: Sept 2025 */ public abstract class LocalVariableInstruction extends Instruction implements TypedInstruction, IndexedInstruction { @@ -162,7 +162,7 @@ } /** - * Set the local variable index. also updates opcode and length TODO Why? + * Sets the local variable index. also updates opcode and length TODO Why? * * @see #setIndexOnly(int) */ diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/MethodGen.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/MethodGen.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/MethodGen.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/MethodGen.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -27,6 +27,7 @@ import java.util.List; import java.util.Objects; import java.util.Stack; +import java.util.stream.Collectors; import com.sun.org.apache.bcel.internal.Const; import com.sun.org.apache.bcel.internal.classfile.AnnotationEntry; @@ -46,6 +47,7 @@ import com.sun.org.apache.bcel.internal.classfile.RuntimeVisibleParameterAnnotations; import com.sun.org.apache.bcel.internal.classfile.Utility; import com.sun.org.apache.bcel.internal.util.BCELComparator; +import jdk.xml.internal.Utils; /** * Template class for building up a method. This is done by defining exception handlers, adding thrown exceptions, local @@ -57,7 +59,7 @@ * * @see InstructionList * @see Method - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public class MethodGen extends FieldGenOrMethodGen { @@ -102,19 +104,16 @@ } } - private static BCELComparator bcelComparator = new BCELComparator() { + private static BCELComparator bcelComparator = new BCELComparator() { @Override - public boolean equals(final Object o1, final Object o2) { - final FieldGenOrMethodGen THIS = (FieldGenOrMethodGen) o1; - final FieldGenOrMethodGen THAT = (FieldGenOrMethodGen) o2; - return Objects.equals(THIS.getName(), THAT.getName()) && Objects.equals(THIS.getSignature(), THAT.getSignature()); + public boolean equals(final FieldGenOrMethodGen a, final FieldGenOrMethodGen b) { + return a == b || a != null && b != null && Objects.equals(a.getName(), b.getName()) && Objects.equals(a.getSignature(), b.getSignature()); } @Override - public int hashCode(final Object o) { - final FieldGenOrMethodGen THIS = (FieldGenOrMethodGen) o; - return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); + public int hashCode(final FieldGenOrMethodGen o) { + return o != null ? Objects.hash(o.getSignature(), o.getName()) : 0; } }; @@ -127,9 +126,9 @@ } /** - * @return Comparison strategy object + * @return Comparison strategy object. */ - public static BCELComparator getComparator() { + public static BCELComparator getComparator() { return bcelComparator; } @@ -206,9 +205,9 @@ } /** - * @param comparator Comparison strategy object + * @param comparator Comparison strategy object. */ - public static void setComparator(final BCELComparator comparator) { + public static void setComparator(final BCELComparator comparator) { bcelComparator = comparator; } @@ -636,7 +635,7 @@ */ @Override public boolean equals(final Object obj) { - return bcelComparator.equals(this, obj); + return obj instanceof FieldGenOrMethodGen && bcelComparator.equals(this, (FieldGenOrMethodGen) obj); } // J5TODO: Should paramAnnotations be an array of arrays? Rather than an array of lists, this @@ -790,7 +789,7 @@ } /** - * Get method object. Never forget to call setMaxStack() or setMaxStack(max), respectively, before calling this method + * Gets method object. Never forget to call setMaxStack() or setMaxStack(max), respectively, before calling this method * (the same applies for max locals). * * @return method object @@ -888,7 +887,7 @@ } /** - * Return value as defined by given BCELComparator strategy. By default return the hashcode of the method's name XOR + * Return value as defined by given BCELComparator strategy. By default return the hash code of the method's name XOR * signature. * * @see Object#hashCode() @@ -899,11 +898,7 @@ } private List makeMutableVersion(final AnnotationEntry[] mutableArray) { - final List result = new ArrayList<>(); - for (final AnnotationEntry element : mutableArray) { - result.add(new AnnotationEntryGen(element, getConstantPool(), false)); - } - return result; + return Utils.streamOfIfNonNull(mutableArray).map(ae -> new AnnotationEntryGen(ae, getConstantPool(), false)).collect(Collectors.toList()); } /** @@ -1027,10 +1022,8 @@ * * @since 6.5.0 */ - public void removeRuntimeAttributes(final Attribute[] attrs) { - for (final Attribute attr : attrs) { - removeAttribute(attr); - } + public void removeRuntimeAttributes(final Attribute[] attributes) { + Utils.streamOfIfNonNull(attributes).forEach(this::removeAttribute); } public void setArgumentName(final int i, final String name) { @@ -1038,7 +1031,7 @@ } public void setArgumentNames(final String[] argNames) { - this.argNames = argNames; + this.argNames = Utils.createEmptyArrayIfNull(argNames, String[].class); } public void setArgumentType(final int i, final Type type) { @@ -1046,7 +1039,7 @@ } public void setArgumentTypes(final Type[] argTypes) { - this.argTypes = argTypes; + this.argTypes = argTypes != null ? argTypes : Type.NO_ARGS; } public void setClassName(final String className) { // TODO could be package-protected? @@ -1084,7 +1077,7 @@ } /** - * Set maximum number of local variables. + * Sets maximum number of local variables. */ public void setMaxLocals(final int m) { maxLocals = m; @@ -1102,7 +1095,7 @@ } /** - * Set maximum stack size for this method. + * Sets maximum stack size for this method. */ public void setMaxStack(final int m) { // TODO could be package-protected? maxStack = m; diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ObjectType.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ObjectType.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ObjectType.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ObjectType.java 2026-04-17 19:09:35.000000000 +0000 @@ -27,7 +27,7 @@ import com.sun.org.apache.bcel.internal.classfile.Utility; /** - * Denotes reference such as java.lang.String. + * Denotes reference such as {@link String}. */ public class ObjectType extends ReferenceType { @@ -47,7 +47,7 @@ /** * Constructs a new instance. * - * @param className fully qualified class name, e.g. java.lang.String + * @param className fully qualified class name, e.g. {@link String} */ public ObjectType(final String className) { super(Const.T_REFERENCE, "L" + Utility.packageToPath(className) + ";"); @@ -151,7 +151,7 @@ * @throws ClassNotFoundException if any of this class's superclasses can't be found */ public boolean subclassOf(final ObjectType superclass) throws ClassNotFoundException { - if (this.referencesInterfaceExact() || superclass.referencesInterfaceExact()) { + if (referencesInterfaceExact() || superclass.referencesInterfaceExact()) { return false; } return Repository.instanceOf(this.className, superclass.className); diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/RET.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/RET.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/RET.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/RET.java 2026-04-17 19:09:35.000000000 +0000 @@ -110,7 +110,7 @@ } /** - * Set index of local variable containg the return address + * Sets index of local variable containg the return address */ @Override public final void setIndex(final int n) { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ReferenceType.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ReferenceType.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ReferenceType.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/ReferenceType.java 2026-04-17 19:09:35.000000000 +0000 @@ -42,10 +42,10 @@ /** * This commutative operation returns the first common superclass (narrowest ReferenceType referencing a class, not an - * interface). If one of the types is a superclass of the other, the former is returned. If "this" is Type.NULL, then t - * is returned. If t is Type.NULL, then "this" is returned. If "this" equals t ['this.equals(t)'] "this" is returned. If - * "this" or t is an ArrayType, then Type.OBJECT is returned. If "this" or t is a ReferenceType referencing an - * interface, then Type.OBJECT is returned. If not all of the two classes' superclasses cannot be found, "null" is + * interface). If one of the types is a superclass of the other, the former is returned. If "this" is NULL, then t + * is returned. If t is NULL, then "this" is returned. If "this" equals t ['this.equals(t)'] "this" is returned. If + * "this" or t is an ArrayType, then {@link #OBJECT} is returned. If "this" or t is a ReferenceType referencing an + * interface, then {@link #OBJECT} is returned. If not all of the two classes' superclasses cannot be found, "null" is * returned. See the JVM specification edition 2, "4.9.2 The Bytecode Verifier". * * @deprecated use getFirstCommonSuperclass(ReferenceType t) which has slightly changed semantics. @@ -53,46 +53,46 @@ */ @Deprecated public ReferenceType firstCommonSuperclass(final ReferenceType t) throws ClassNotFoundException { - if (this.equals(Type.NULL)) { + if (equals(NULL)) { return t; } - if (t.equals(Type.NULL) || this.equals(t)) { + if (t.equals(NULL) || equals(t)) { return this; /* - * TODO: Above sounds a little arbitrary. On the other hand, there is no object referenced by Type.NULL so we can also - * say all the objects referenced by Type.NULL were derived from java.lang.Object. However, the Java Language's - * "instanceof" operator proves us wrong: "null" is not referring to an instance of java.lang.Object :) + * TODO: Above sounds a little arbitrary. On the other hand, there is no object referenced by {@link #NULL} so we can also + * say all the objects referenced by {@link #NULL} were derived from {@link Object}. However, the Java Language's + * "instanceof" operator proves us wrong: "null" is not referring to an instance of {@link Object} :) */ } if (this instanceof ArrayType || t instanceof ArrayType) { - return Type.OBJECT; - // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? + return OBJECT; + // TODO: Is there a proof of {@link #OBJECT} being the direct ancestor of every ArrayType? } return getFirstCommonSuperclassInternal(t); } /** * This commutative operation returns the first common superclass (narrowest ReferenceType referencing a class, not an - * interface). If one of the types is a superclass of the other, the former is returned. If "this" is Type.NULL, then t - * is returned. If t is Type.NULL, then "this" is returned. If "this" equals t ['this.equals(t)'] "this" is returned. If - * "this" or t is an ArrayType, then Type.OBJECT is returned; unless their dimensions match. Then an ArrayType of the + * interface). If one of the types is a superclass of the other, the former is returned. If "this" is NULL, then t + * is returned. If t is NULL, then "this" is returned. If "this" equals t ['this.equals(t)'] "this" is returned. If + * "this" or t is an ArrayType, then {@link #OBJECT} is returned; unless their dimensions match. Then an ArrayType of the * same number of dimensions is returned, with its basic type being the first common super class of the basic types of - * "this" and t. If "this" or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. If not all of + * "this" and t. If "this" or t is a ReferenceType referencing an interface, then {@link #OBJECT} is returned. If not all of * the two classes' superclasses cannot be found, "null" is returned. See the JVM specification edition 2, "4.9.2 The * Bytecode Verifier". * * @throws ClassNotFoundException on failure to find superclasses of this type, or the type passed as a parameter */ public ReferenceType getFirstCommonSuperclass(final ReferenceType t) throws ClassNotFoundException { - if (this.equals(Type.NULL)) { + if (equals(NULL)) { return t; } - if (t.equals(Type.NULL) || this.equals(t)) { + if (t.equals(NULL) || equals(t)) { return this; /* - * TODO: Above sounds a little arbitrary. On the other hand, there is no object referenced by Type.NULL so we can also - * say all the objects referenced by Type.NULL were derived from java.lang.Object. However, the Java Language's - * "instanceof" operator proves us wrong: "null" is not referring to an instance of java.lang.Object :) + * TODO: Above sounds a little arbitrary. On the other hand, there is no object referenced by {@link #NULL} so we can also + * say all the objects referenced by {@link #NULL} were derived from {@link Object}. However, the Java Language's + * "instanceof" operator proves us wrong: "null" is not referring to an instance of {@link Object} :) */ } /* This code is from a bug report by Konstantin Shagin */ @@ -106,8 +106,8 @@ } } if (this instanceof ArrayType || t instanceof ArrayType) { - return Type.OBJECT; - // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? + return OBJECT; + // TODO: Is there a proof of {@link #OBJECT} being the direct ancestor of every ArrayType? } return getFirstCommonSuperclassInternal(t); } @@ -115,7 +115,7 @@ private ReferenceType getFirstCommonSuperclassInternal(final ReferenceType t) throws ClassNotFoundException { if (this instanceof ObjectType && ((ObjectType) this).referencesInterfaceExact() || t instanceof ObjectType && ((ObjectType) t).referencesInterfaceExact()) { - return Type.OBJECT; + return OBJECT; // TODO: The above line is correct comparing to the vmspec2. But one could // make class file verification a bit stronger here by using the notion of // superinterfaces or even castability or assignment compatibility. @@ -142,7 +142,7 @@ } } } - // Huh? Did you ask for Type.OBJECT's superclass?? + // Huh? Did you ask for OBJECT's superclass?? return null; } @@ -158,7 +158,7 @@ return false; } final ReferenceType T = (ReferenceType) t; - if (this.equals(Type.NULL)) { + if (equals(NULL)) { return true; // This is not explicitly stated, but clear. Isn't it? } /* @@ -169,7 +169,7 @@ * If T is a class type, then this must be the same class as T, or this must be a subclass of T; */ if (T instanceof ObjectType && ((ObjectType) T).referencesClassExact() - && (this.equals(T) || Repository.instanceOf(((ObjectType) this).getClassName(), ((ObjectType) T).getClassName()))) { + && (equals(T) || Repository.instanceOf(((ObjectType) this).getClassName(), ((ObjectType) T).getClassName()))) { return true; } /* @@ -187,14 +187,14 @@ /* * If T is a class type, then T must be Object (2.4.7). */ - if (T instanceof ObjectType && ((ObjectType) T).referencesClassExact() && T.equals(Type.OBJECT)) { + if (T instanceof ObjectType && ((ObjectType) T).referencesClassExact() && T.equals(OBJECT)) { return true; } /* * If T is an interface type, then T must be the same interface as this or a superinterface of this (2.13.2). */ if (T instanceof ObjectType && ((ObjectType) T).referencesInterfaceExact() - && (this.equals(T) || Repository.implementationOf(((ObjectType) this).getClassName(), ((ObjectType) T).getClassName()))) { + && (equals(T) || Repository.implementationOf(((ObjectType) this).getClassName(), ((ObjectType) T).getClassName()))) { return true; } } @@ -205,7 +205,7 @@ /* * If T is a class type, then T must be Object (2.4.7). */ - if (T instanceof ObjectType && ((ObjectType) T).referencesClassExact() && T.equals(Type.OBJECT)) { + if (T instanceof ObjectType && ((ObjectType) T).referencesClassExact() && T.equals(OBJECT)) { return true; } /* @@ -246,14 +246,14 @@ /** * Return true iff this type is castable to another type t as defined in the JVM specification. The case where this is - * Type.NULL is not defined (see the CHECKCAST definition in the JVM specification). However, because e.g. CHECKCAST + * {@link #NULL} is not defined (see the CHECKCAST definition in the JVM specification). However, because e.g. CHECKCAST * doesn't throw a ClassCastException when casting a null reference to any Object, true is returned in this case. * * @throws ClassNotFoundException if any classes or interfaces required to determine assignment compatibility can't be * found */ public boolean isCastableTo(final Type t) throws ClassNotFoundException { - if (this.equals(Type.NULL)) { + if (equals(NULL)) { return t instanceof ReferenceType; // If this is ever changed in isAssignmentCompatible() } return isAssignmentCompatibleWith(t); diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/SWITCH.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/SWITCH.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/SWITCH.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/SWITCH.java 2026-04-17 19:09:35.000000000 +0000 @@ -95,7 +95,7 @@ * @param maxGap maximum gap that may between case branches */ public SWITCH(final int[] match, final InstructionHandle[] targets, final InstructionHandle target, final int maxGap) { - int[] matchClone = match.clone(); + final int[] matchClone = match.clone(); final InstructionHandle[] targetsClone = targets.clone(); final int matchLength = match.length; if (matchLength < 2) { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/Select.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/Select.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/Select.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/Select.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -33,7 +33,7 @@ * @see LOOKUPSWITCH * @see TABLESWITCH * @see InstructionList - * @LastModified: May 2021 + * @LastModified: Sept 2025 */ public abstract class Select extends BranchInstruction implements VariableLengthInstruction, StackConsumer /* @since 6.0 */, StackProducer { @@ -87,7 +87,7 @@ * @param defaultTarget default instruction target */ Select(final short opcode, final int[] match, final InstructionHandle[] targets, final InstructionHandle defaultTarget) { - // don't set default target before instuction is built + // don't set default target before instruction is built super(opcode, null); this.match = match; this.targets = targets; @@ -288,7 +288,7 @@ } /** - * Set branch target for 'i'th case + * Sets branch target for 'i'th case */ public void setTarget(final int i, final InstructionHandle target) { // TODO could be package-protected? notifyTarget(targets[i], target, this); @@ -314,7 +314,11 @@ for (int i = 0; i < match_length; i++) { String s = "null"; if (targets[i] != null) { - s = targets[i].getInstruction().toString(); + if (targets[i].getInstruction() == this) { + s = ""; + } else { + s = targets[i].getInstruction().toString(); + } } buf.append("(").append(match[i]).append(", ").append(s).append(" = {").append(indices[i]).append("})"); } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/SimpleElementValueGen.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/SimpleElementValueGen.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/SimpleElementValueGen.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/SimpleElementValueGen.java 2026-04-17 19:09:35.000000000 +0000 @@ -166,7 +166,7 @@ dos.writeShort(idx); break; default: - throw new IllegalStateException("SimpleElementValueGen doesnt know how to write out type " + super.getElementValueType()); + throw new IllegalStateException("SimpleElementValueGen doesn't know how to write out type " + super.getElementValueType()); } } @@ -184,7 +184,7 @@ public int getValueInt() { if (super.getElementValueType() != PRIMITIVE_INT) { - throw new IllegalStateException("Dont call getValueString() on a non STRING ElementValue"); + throw new IllegalStateException("Don't call getValueString() on a non STRING ElementValue"); } final ConstantInteger c = (ConstantInteger) getConstantPool().getConstant(idx); return c.getBytes(); @@ -192,7 +192,7 @@ public String getValueString() { if (super.getElementValueType() != STRING) { - throw new IllegalStateException("Dont call getValueString() on a non STRING ElementValue"); + throw new IllegalStateException("Don't call getValueString() on a non STRING ElementValue"); } final ConstantUtf8 c = (ConstantUtf8) getConstantPool().getConstant(idx); return c.getBytes(); diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/TargetLostException.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/TargetLostException.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/TargetLostException.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/TargetLostException.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -21,32 +21,32 @@ package com.sun.org.apache.bcel.internal.generic; /** - * Thrown by InstructionList.remove() when one or multiple disposed instructions are still being referenced by an - * InstructionTargeter object. I.e. the InstructionTargeter has to be notified that (one of) the InstructionHandle it is - * referencing is being removed from the InstructionList and thus not valid anymore. + * Thrown by {@link InstructionList} when one or multiple disposed instructions are still being referenced by an {@link InstructionTargeter} object. I.e. the + * {@link InstructionTargeter} has to be notified that (one of) the {@link InstructionHandle} it is referencing is being removed from the + * {@link InstructionList} and thus not valid anymore. * *

- * Making this an exception instead of a return value forces the user to handle these case explicitly in a try { ... } - * catch. The following code illustrates how this may be done: + * Making this an exception instead of a return value forces the user to handle these case explicitly in a try { ... } catch. The following code illustrates how + * this may be done: *

* - *
+ * 
  *     ...
  *     try {
  *         il.delete(start_ih, end_ih);
- *     } catch(TargetLostException e) {
+ *     } catch (TargetLostException e) {
  *         for (InstructionHandle target : e.getTargets()) {
  *             for (InstructionTargeter targeter : target.getTargeters()) {
  *                 targeter.updateTarget(target, new_target);
  *             }
  *         }
  *     }
- * 
+ *
* * @see InstructionHandle * @see InstructionList * @see InstructionTargeter - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public final class TargetLostException extends Exception { @@ -54,12 +54,14 @@ @SuppressWarnings("serial") // Array component type is not Serializable private final InstructionHandle[] targets; - TargetLostException(final InstructionHandle[] t, final String mesg) { - super(mesg); - targets = t; + TargetLostException(final InstructionHandle[] targets, final String message) { + super(message); + this.targets = targets; } /** + * Gets the list of instructions still being targeted. + * * @return list of instructions still being targeted. */ public InstructionHandle[] getTargets() { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/Type.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/Type.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/Type.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/Type.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -26,12 +26,14 @@ import com.sun.org.apache.bcel.internal.Const; import com.sun.org.apache.bcel.internal.classfile.ClassFormatException; +import com.sun.org.apache.bcel.internal.classfile.InvalidMethodSignatureException; import com.sun.org.apache.bcel.internal.classfile.Utility; +import jdk.xml.internal.Utils; /** - * Abstract super class for all possible java types, namely basic types such as int, object types like String and array + * Abstract super class for all possible Java types, namely basic types such as int, object types like String and array * types, e.g. int[] - * @LastModified: May 2021 + * @LastModified: Sept 2025 */ public abstract class Type { @@ -88,15 +90,15 @@ // Skip any type arguments to read argument declarations between '(' and ')' index = signature.indexOf('(') + 1; if (index <= 0) { - throw new ClassFormatException("Invalid method signature: " + signature); + throw new InvalidMethodSignatureException(signature); } while (signature.charAt(index) != ')') { vec.add(getType(signature.substring(index))); - // corrected concurrent private static field acess + // corrected concurrent private static field access index += unwrap(CONSUMED_CHARS); // update position } } catch (final StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " + signature, e); + throw new InvalidMethodSignatureException(signature, e); } final Type[] types = new Type[vec.size()]; vec.toArray(types); @@ -110,7 +112,7 @@ // Skip any type arguments to read argument declarations between '(' and ')' index = signature.indexOf('(') + 1; if (index <= 0) { - throw new ClassFormatException("Invalid method signature: " + signature); + throw new InvalidMethodSignatureException(signature); } while (signature.charAt(index) != ')') { final int coded = getTypeSize(signature.substring(index)); @@ -118,7 +120,7 @@ index += consumed(coded); } } catch (final StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " + signature, e); + throw new InvalidMethodSignatureException(signature, e); } return res; } @@ -154,13 +156,13 @@ final int index = signature.lastIndexOf(')') + 1; return getType(signature.substring(index)); } catch (final StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " + signature, e); + throw new InvalidMethodSignatureException(signature, e); } } static int getReturnTypeSize(final String signature) { final int index = signature.lastIndexOf(')') + 1; - return Type.size(getTypeSize(signature.substring(index))); + return size(getTypeSize(signature.substring(index))); } public static String getSignature(final java.lang.reflect.Method meth) { @@ -175,7 +177,7 @@ } /** - * Convert runtime java.lang.Class to BCEL Type object. + * Convert runtime {@link Class} to BCEL Type object. * * @param cls Java class * @return corresponding Type object @@ -183,7 +185,7 @@ public static Type getType(final Class cls) { Objects.requireNonNull(cls, "cls"); /* - * That's an amzingly easy case, because getName() returns the signature. That's what we would have liked anyway. + * That's an amazingly easy case, because getName() returns the signature. That's what we would have liked anyway. */ if (cls.isArray()) { return getType(cls.getName()); @@ -230,7 +232,7 @@ public static Type getType(final String signature) throws StringIndexOutOfBoundsException { final byte type = Utility.typeOfSignature(signature); if (type <= Const.T_VOID) { - // corrected concurrent private static field acess + // corrected concurrent private static field access wrap(CONSUMED_CHARS, 1); return BasicType.getType(type); } @@ -246,7 +248,7 @@ } while (signature.charAt(dim) == '['); // Recurse, but just once, if the signature is ok final Type t = getType(signature.substring(dim)); - // corrected concurrent private static field acess + // corrected concurrent private static field access // consumed_chars += dim; // update counter - is replaced by final int temp = unwrap(CONSUMED_CHARS) + dim; wrap(CONSUMED_CHARS, temp); @@ -254,7 +256,7 @@ } /** - * Convert runtime java.lang.Class[] to BCEL Type objects. + * Convert runtime {@code java.lang.Class[]} to BCEL Type objects. * * @param classes an array of runtime class objects * @return array of corresponding Type objects @@ -286,6 +288,24 @@ return encode(1, index + 1); } + static String internalTypeNameToSignature(final String internalTypeName) { + if (Utils.isEmpty(internalTypeName) || Arrays.asList(Const.SHORT_TYPE_NAMES).contains(internalTypeName)) { + return internalTypeName; + } + switch (internalTypeName.charAt(0)) { + case '[': + return internalTypeName; + case 'L': + case 'T': + if (internalTypeName.charAt(internalTypeName.length() - 1) == ';') { + return internalTypeName; + } + return 'L' + internalTypeName + ';'; + default: + return 'L' + internalTypeName + ';'; + } + } + static int size(final int coded) { return coded & 3; } @@ -361,7 +381,7 @@ } /** - * @return hashcode of Type + * @return hash code of Type */ @Override public int hashCode() { @@ -369,31 +389,23 @@ } /** - * boolean, short and char variable are considered as int in the stack or local variable area. Returns {@link Type#INT} - * for {@link Type#BOOLEAN}, {@link Type#SHORT} or {@link Type#CHAR}, otherwise returns the given type. + * boolean, short and char variable are considered as int in the stack or local variable area. Returns {@link #INT} + * for {@link #BOOLEAN}, {@link #SHORT} or {@link #CHAR}, otherwise returns the given type. * * @since 6.0 */ public Type normalizeForStackOrLocal() { - if (this == Type.BOOLEAN || this == Type.BYTE || this == Type.SHORT || this == Type.CHAR) { - return Type.INT; + if (this == BOOLEAN || this == BYTE || this == SHORT || this == CHAR) { + return INT; } return this; } - /* - * Currently only used by the ArrayType constructor. The signature has a complicated dependency on other parameter so - * it's tricky to do it in a call to the super ctor. - */ - void setSignature(final String signature) { - this.signature = signature; - } - /** * @return Type string, e.g. 'int[]' */ @Override public String toString() { - return this.equals(Type.NULL) || type >= Const.T_UNKNOWN ? signature : Utility.signatureToString(signature, false); + return equals(NULL) || type >= Const.T_UNKNOWN ? signature : Utility.signatureToString(signature, false); } } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/TypedInstruction.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/TypedInstruction.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/TypedInstruction.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/TypedInstruction.java 2026-04-17 19:09:35.000000000 +0000 @@ -22,7 +22,7 @@ package com.sun.org.apache.bcel.internal.generic; /** - * Get the type associated with an instruction, int for ILOAD, or the type of the field of a PUTFIELD instruction, e.g.. + * Gets the type associated with an instruction, int for ILOAD, or the type of the field of a PUTFIELD instruction, e.g.. */ public interface TypedInstruction { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/package-info.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/package-info.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/package-info.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/package-info.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,26 @@ +/* + * reserved comment block + * DO NOT REMOVE OR ALTER! + */ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Generic part of the Apache Byte Code Engineering Library (BCEL), classes to dynamically modify class objects + * and byte code instructions. + */ +package com.sun.org.apache.bcel.internal.generic; diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/package-info.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/package-info.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/package-info.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/package-info.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,26 @@ +/* + * reserved comment block + * DO NOT REMOVE OR ALTER! + */ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Basic classes for the Apache Byte Code Engineering Library (BCEL) and constants defined by the + * JVM specification. + */ +package com.sun.org.apache.bcel.internal; diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/BCELComparator.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/BCELComparator.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/BCELComparator.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/BCELComparator.java 2026-04-17 19:09:35.000000000 +0000 @@ -22,26 +22,27 @@ package com.sun.org.apache.bcel.internal.util; /** - * Used for BCEL comparison strategy + * Used for BCEL comparison strategy. * + * @param What type we are comparing. * @since 5.2 */ -public interface BCELComparator { +public interface BCELComparator { /** - * Compare two objects and return what THIS.equals(THAT) should return + * Compares two objects and return what a.equals(b) should return. * - * @param THIS - * @param THAT - * @return true if and only if THIS equals THAT + * @param a an object. + * @param b an object to be compared with {@code a} for equality. + * @return {@code true} if the arguments are equal to each other and {@code false} otherwise. */ - boolean equals(Object THIS, Object THAT); + boolean equals(T a, T b); /** - * Return hashcode for THIS.hashCode() + * Gets the hash code for o.hashCode() * - * @param THIS - * @return hashcode for THIS.hashCode() + * @param o + * @return hash code for o.hashCode() */ - int hashCode(Object THIS); + int hashCode(T o); } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/BCELFactory.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/BCELFactory.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/BCELFactory.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/BCELFactory.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -63,9 +63,9 @@ * Factory creates il.append() statements, and sets instruction targets. A helper class for BCELifier. * * @see BCELifier - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ -class BCELFactory extends EmptyVisitor { +final class BCELFactory extends EmptyVisitor { private static final String CONSTANT_PREFIX = Const.class.getSimpleName() + "."; private final MethodGen methodGen; @@ -88,7 +88,7 @@ if (value instanceof String) { embed = '"' + Utility.convertString(embed) + '"'; } else if (value instanceof Character) { - embed = "(char)0x" + Integer.toHexString(((Character) value).charValue()); + embed = "(char) 0x" + Integer.toHexString(((Character) value).charValue()); } else if (value instanceof Float) { final Float f = (Float) value; if (Float.isNaN(f)) { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/BCELifier.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/BCELifier.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/BCELifier.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/BCELifier.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -30,11 +30,15 @@ import com.sun.org.apache.bcel.internal.Const; import com.sun.org.apache.bcel.internal.Repository; import com.sun.org.apache.bcel.internal.classfile.ClassParser; +import com.sun.org.apache.bcel.internal.classfile.Code; import com.sun.org.apache.bcel.internal.classfile.ConstantValue; import com.sun.org.apache.bcel.internal.classfile.ExceptionTable; import com.sun.org.apache.bcel.internal.classfile.Field; import com.sun.org.apache.bcel.internal.classfile.JavaClass; import com.sun.org.apache.bcel.internal.classfile.Method; +import com.sun.org.apache.bcel.internal.classfile.StackMap; +import com.sun.org.apache.bcel.internal.classfile.StackMapEntry; +import com.sun.org.apache.bcel.internal.classfile.StackMapType; import com.sun.org.apache.bcel.internal.classfile.Utility; import com.sun.org.apache.bcel.internal.generic.ArrayType; import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen; @@ -46,7 +50,7 @@ * This gives new users of BCEL a useful example showing how things are done with BCEL. It does not cover all features * of BCEL, but tries to mimic hand-written code as close as possible. * - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public class BCELifier extends com.sun.org.apache.bcel.internal.classfile.EmptyVisitor { @@ -74,7 +78,7 @@ /** * Default main method */ - public static void _main(final String[] argv) throws Exception { + public static void main(final String[] argv) throws Exception { if (argv.length != 1) { System.out.println("Usage: BCELifier className"); System.out.println("\tThe class must exist on the classpath"); @@ -311,6 +315,13 @@ printWriter.println("\");"); } } + final Code code = method.getCode(); + if (code != null) { + final StackMap stackMap = code.getStackMap(); + if (stackMap != null) { + stackMap.accept(this); + } + } printWriter.println(); final BCELFactory factory = new BCELFactory(mg, printWriter); factory.start(); @@ -319,4 +330,78 @@ printWriter.println(" _cg.addMethod(method.getMethod());"); printWriter.println(" il.dispose();"); } + + @Override + public void visitStackMap(final StackMap stackMap) { + super.visitStackMap(stackMap); + printWriter.print(" method.addCodeAttribute("); + printWriter.print("new StackMap(_cp.addUtf8(\""); + printWriter.print(stackMap.getName()); + printWriter.print("\"), "); + printWriter.print(stackMap.getLength()); + printWriter.print(", "); + printWriter.print("new StackMapEntry[] {"); + final StackMapEntry[] table = stackMap.getStackMap(); + for (int i = 0; i < table.length; i++) { + table[i].accept(this); + if (i < table.length - 1) { + printWriter.print(", "); + } else { + printWriter.print(" }"); + } + } + printWriter.print(", _cp.getConstantPool())"); + printWriter.println(");"); + } + + @Override + public void visitStackMapEntry(final StackMapEntry stackMapEntry) { + super.visitStackMapEntry(stackMapEntry); + printWriter.print("new StackMapEntry("); + printWriter.print(stackMapEntry.getFrameType()); + printWriter.print(", "); + printWriter.print(stackMapEntry.getByteCodeOffset()); + printWriter.print(", "); + visitStackMapTypeArray(stackMapEntry.getTypesOfLocals()); + printWriter.print(", "); + visitStackMapTypeArray(stackMapEntry.getTypesOfStackItems()); + printWriter.print(", _cp.getConstantPool())"); + } + + /** + * Visits a {@link StackMapType} object. + * @param stackMapType object to visit + * @since 6.7.1 + */ + @Override + public void visitStackMapType(final StackMapType stackMapType) { + super.visitStackMapType(stackMapType); + printWriter.print("new StackMapType((byte)"); + printWriter.print(stackMapType.getType()); + printWriter.print(", "); + if (stackMapType.hasIndex()) { + printWriter.print("_cp.addClass(\""); + printWriter.print(stackMapType.getClassName()); + printWriter.print("\")"); + } else { + printWriter.print("-1"); + } + printWriter.print(", _cp.getConstantPool())"); + } + + private void visitStackMapTypeArray(final StackMapType[] types) { + if (types == null || types.length == 0) { + printWriter.print("null"); // null translates to StackMapType.EMPTY_ARRAY + } else { + printWriter.print("new StackMapType[] {"); + for (int i = 0; i < types.length; i++) { + types[i].accept(this); + if (i < types.length - 1) { + printWriter.print(", "); + } else { + printWriter.print(" }"); + } + } + } + } } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/Class2HTML.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/Class2HTML.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/Class2HTML.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/Class2HTML.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -53,7 +53,7 @@ * All subfiles reference each other appropriately, e.g. clicking on a method in the Method's frame will jump to the * appropriate method in the Code frame. * - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public class Class2HTML { @@ -73,7 +73,7 @@ basicTypes.add("float"); } - public static void _main(final String[] argv) throws IOException { + public static void main(final String[] argv) throws IOException { final String[] fileName = new String[argv.length]; int files = 0; ClassParser parser = null; @@ -89,7 +89,7 @@ if (argv[i].equals("-d")) { // Specify target directory, default '.' dir = argv[++i]; if (!dir.endsWith("" + sep)) { - dir = dir + sep; + dir += sep; } final File store = new File(dir); if (!store.isDirectory()) { @@ -115,7 +115,7 @@ if (zipFile == null) { parser = new ClassParser(fileName[i]); // Create parser object from file } else { - parser = new ClassParser(zipFile, fileName[i]); // Create parser object from zip file + parser = new ClassParser(zipFile, fileName[i]); // Create parser object from ZIP file } javaClass = parser.parse(); new Class2HTML(javaClass, dir); diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/ClassSet.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/ClassSet.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/ClassSet.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/ClassSet.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -30,7 +30,7 @@ * Utility class implementing a (type-safe) set of JavaClass objects. Since JavaClass has no equals() method, the name of the class is used for comparison. * * @see ClassStack - * @LastModified: Feb 2023 + * @LastModified: Sept 2025 */ public class ClassSet { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/CodeHTML.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/CodeHTML.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/CodeHTML.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/CodeHTML.java 2026-04-17 19:09:35.000000000 +0000 @@ -542,7 +542,7 @@ final String str = codeToHTML(stream, methodNumber); String anchor = ""; /* - * Set an anchor mark if this line is targetted by a goto, jsr, etc. Defining an anchor for every line is very + * Sets an anchor mark if this line is targetted by a goto, jsr, etc. Defining an anchor for every line is very * inefficient! */ if (gotoSet.get(offset)) { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/InstructionFinder.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/InstructionFinder.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/InstructionFinder.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/InstructionFinder.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -63,14 +63,13 @@ * * @see com.sun.org.apache.bcel.internal.generic.Instruction * @see InstructionList - * @LastModified: May 2021 + * @LastModified: Sept 2025 */ public class InstructionFinder { /** * Code patterns found may be checked using an additional user-defined constraint object whether they really match the * needed criterion. I.e., check constraints that can not expressed with regular expressions. - * */ public interface CodeConstraint { @@ -374,7 +373,7 @@ // } // private static final String pattern2string( String pattern, boolean make_string ) { -// StringBuffer buf = new StringBuffer(); +// StringBuilder buf = new StringBuilder(); // for (int i = 0; i < pattern.length(); i++) { // char ch = pattern.charAt(i); // if (ch >= OFFSET) { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/Repository.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/Repository.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/Repository.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/Repository.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -25,8 +25,8 @@ * Abstract definition of a class repository. Instances may be used to load classes from different sources and may be * used in the Repository.setRepository method. * - * @see org.apache.bcel.Repository - * @LastModified: Feb 2023 + * @see com.sun.org.apache.bcel.internal.Repository + * @LastModified: Sept 2025 */ public interface Repository { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/package-info.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/package-info.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/package-info.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/bcel/internal/util/package-info.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,32 @@ +/* + * reserved comment block + * DO NOT REMOVE OR ALTER! + */ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Utility classes for the Apache Byte Code Engineering Library (BCEL), namely: + *
    + *
  • Collection classes for JavaClass objects
  • + *
  • A converter for class files to HTML
  • + *
  • A tool to find instructions patterns via regular expressions
  • + *
  • A class to find classes as defined in the CLASSPATH
  • + *
  • A class loader that allows to create classes at run time
  • + *
+ */ +package com.sun.org.apache.bcel.internal.util; diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathExpressionImpl.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathExpressionImpl.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathExpressionImpl.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathExpressionImpl.java 2026-04-17 19:09:35.000000000 +0000 @@ -20,6 +20,7 @@ package com.sun.org.apache.xpath.internal.jaxp; +import com.sun.org.apache.xerces.internal.utils.XMLSecurityPropertyManager; import com.sun.org.apache.xml.internal.utils.WrappedRuntimeException; import com.sun.org.apache.xpath.internal.objects.XObject; import javax.xml.namespace.QName; @@ -32,6 +33,7 @@ import javax.xml.xpath.XPathFunctionResolver; import javax.xml.xpath.XPathVariableResolver; import jdk.xml.internal.JdkXmlFeatures; +import jdk.xml.internal.XMLSecurityManager; import org.w3c.dom.Document; import org.xml.sax.InputSource; @@ -39,7 +41,7 @@ * The XPathExpression interface encapsulates a (compiled) XPath expression. * * @author Ramesh Mandava - * @LastModified: May 2022 + * @LastModified: Nov 2025 */ public class XPathExpressionImpl extends XPathImplUtil implements XPathExpression { @@ -49,7 +51,9 @@ * from the context. */ protected XPathExpressionImpl() { - this(null, null, null, null, false, new JdkXmlFeatures(false)); + this(null, null, null, null, false, new JdkXmlFeatures(true), + new XMLSecurityManager(true), + new XMLSecurityPropertyManager()); }; protected XPathExpressionImpl(com.sun.org.apache.xpath.internal.XPath xpath, @@ -57,13 +61,16 @@ XPathFunctionResolver functionResolver, XPathVariableResolver variableResolver) { this(xpath, prefixResolver, functionResolver, variableResolver, - false, new JdkXmlFeatures(false)); + false, new JdkXmlFeatures(true), + new XMLSecurityManager(true), + new XMLSecurityPropertyManager()); }; protected XPathExpressionImpl(com.sun.org.apache.xpath.internal.XPath xpath, JAXPPrefixResolver prefixResolver,XPathFunctionResolver functionResolver, XPathVariableResolver variableResolver, boolean featureSecureProcessing, - JdkXmlFeatures featureManager) { + JdkXmlFeatures featureManager, XMLSecurityManager xmlSecMgr, + XMLSecurityPropertyManager xmlSecPropMgr) { this.xpath = xpath; this.prefixResolver = prefixResolver; this.functionResolver = functionResolver; @@ -72,6 +79,8 @@ this.overrideDefaultParser = featureManager.getFeature( JdkXmlFeatures.XmlFeature.JDK_OVERRIDE_PARSER); this.featureManager = featureManager; + this.xmlSecMgr = xmlSecMgr; + this.xmlSecPropMgr = xmlSecPropMgr; }; public void setXPath (com.sun.org.apache.xpath.internal.XPath xpath) { diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java 2026-04-17 19:09:35.000000000 +0000 @@ -49,7 +49,7 @@ * New methods: evaluateExpression * Refactored to share code with XPathExpressionImpl. * - * @LastModified: June 2025 + * @LastModified: Nov 2025 */ public class XPathImpl extends XPathImplUtil implements javax.xml.xpath.XPath { @@ -171,7 +171,8 @@ // Can have errorListener XPathExpressionImpl ximpl = new XPathExpressionImpl (xpath, prefixResolver, functionResolver, variableResolver, - featureSecureProcessing, featureManager); + featureSecureProcessing, featureManager, + xmlSecMgr, xmlSecPropMgr); return ximpl; } catch (TransformerException te) { throw new XPathExpressionException (te) ; diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/classes/jdk/xml/internal/Utils.java openjdk-21-21.0.11+10/src/java.xml/share/classes/jdk/xml/internal/Utils.java --- openjdk-21-21.0.10+7/src/java.xml/share/classes/jdk/xml/internal/Utils.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/classes/jdk/xml/internal/Utils.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,10 @@ package jdk.xml.internal; +import java.lang.reflect.Array; import java.util.Arrays; +import java.util.Objects; +import java.util.stream.Stream; /** * General utility. Use JdkXmlUtils for XML processing related functions. @@ -54,4 +57,59 @@ System.arraycopy(items, 0, result, original.length, items.length); return result; } + + /** + * Returns the original array, or an empty array if it is {@code null}. + * @param array the specified array + * @return the original array, or an empty array if it is {@code null} + */ + public static byte[] createEmptyArrayIfNull(byte[] array) { + return (array != null) ? array : new byte[0]; + } + + /** + * Returns the original array, or an empty array if it is {@code null}. + * @param array the specified array + * @return the original array, or an empty array if it is {@code null} + */ + public static int[] createEmptyArrayIfNull(int[] array) { + return (array != null) ? array : new int[0]; + } + + /** + * Returns the original array, or an empty array if it is {@code null}. + * @param the class type + * @param array the specified array + * @param type the type of the array + * @return the original array, or an empty array if it is {@code null} + */ + public static T[] createEmptyArrayIfNull(final T[] array, final Class type) { + Objects.requireNonNull(type, "The type argument should not be null."); + + return (array != null) ? array : type.cast(Array.newInstance(type.getComponentType(), 0)); + } + + /** + * Returns the new stream created by {@code Stream.of(values)} or an empty + * sequential stream created by {@code Stream.empty()} if values is null. + * + * @param the type of stream elements + * @param values the elements of the new stream + * @return the new stream created by {@code Stream.of(values)} or an empty + * sequential stream created by {@code Stream.empty()} if values is null. + */ + @SafeVarargs + @SuppressWarnings("varargs") // Creating a stream from an array is safe + public static Stream streamOfIfNonNull(final T... values) { + return values == null ? Stream.empty() : Stream.of(values); + } + + /** + * Checks if a CharSequence is empty ("") or null. + * @param cs the CharSequence to check, may be null + * @return {@code true} if the CharSequence is empty or null + */ + public static boolean isEmpty(final CharSequence cs) { + return cs == null || cs.length() == 0; + } } diff -Nru openjdk-21-21.0.10+7/src/java.xml/share/legal/bcel.md openjdk-21-21.0.11+10/src/java.xml/share/legal/bcel.md --- openjdk-21-21.0.10+7/src/java.xml/share/legal/bcel.md 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/src/java.xml/share/legal/bcel.md 2026-04-17 19:09:35.000000000 +0000 @@ -1,4 +1,4 @@ -## Apache Commons Byte Code Engineering Library (BCEL) Version 6.7.0 +## Apache Commons Byte Code Engineering Library (BCEL) Version 6.10.0 ### Apache Commons BCEL Notice
diff -Nru openjdk-21-21.0.10+7/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java openjdk-21-21.0.11+10/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java
--- openjdk-21-21.0.10+7/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java	2026-04-17 19:09:35.000000000 +0000
@@ -28,12 +28,16 @@
 import com.sun.tools.attach.AttachNotSupportedException;
 import com.sun.tools.attach.spi.AttachProvider;
 
-import java.io.InputStream;
-import java.io.IOException;
 import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.nio.file.Files;
+
+import java.util.Optional;
+
+import java.util.regex.Pattern;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 
@@ -46,13 +50,18 @@
     // location is the same for all processes, otherwise the tools
     // will not be able to find all Hotspot processes.
     // Any changes to this needs to be synchronized with HotSpot.
-    private static final String tmpdir = "/tmp";
+    private static final Path TMPDIR = Path.of("/tmp");
+
+    private static final Path PROC     = Path.of("/proc");
+    private static final Path STATUS   = Path.of("status");
+    private static final Path ROOT_TMP = Path.of("root/tmp");
+
     String socket_path;
+
     /**
      * Attaches to the target VM
      */
-    VirtualMachineImpl(AttachProvider provider, String vmid)
-        throws AttachNotSupportedException, IOException
+    VirtualMachineImpl(AttachProvider provider, String vmid) throws AttachNotSupportedException, IOException
     {
         super(provider, vmid);
 
@@ -63,23 +72,26 @@
         }
 
         // Try to resolve to the "inner most" pid namespace
-        int ns_pid = getNamespacePid(pid);
+        final long ns_pid = getNamespacePid(pid);
 
         // Find the socket file. If not found then we attempt to start the
         // attach mechanism in the target VM by sending it a QUIT signal.
         // Then we attempt to find the socket file again.
-        File socket_file = findSocketFile(pid, ns_pid);
+        final File socket_file = findSocketFile(pid, ns_pid);
         socket_path = socket_file.getPath();
         if (!socket_file.exists()) {
             // Keep canonical version of File, to delete, in case target process ends and /proc link has gone:
             File f = createAttachFile(pid, ns_pid).getCanonicalFile();
+
+            boolean timedout = false;
+
             try {
-                sendQuitTo(pid);
+                checkCatchesAndSendQuitTo(pid, false);
 
                 // give the target VM time to start the attach mechanism
                 final int delay_step = 100;
                 final long timeout = attachTimeout();
-                long time_spend = 0;
+                long time_spent = 0;
                 long delay = 0;
                 do {
                     // Increase timeout on each attempt to reduce polling
@@ -88,18 +100,19 @@
                         Thread.sleep(delay);
                     } catch (InterruptedException x) { }
 
-                    time_spend += delay;
-                    if (time_spend > timeout/2 && !socket_file.exists()) {
+                    timedout = (time_spent += delay) > timeout;
+
+                    if (time_spent > timeout/2 && !socket_file.exists()) {
                         // Send QUIT again to give target VM the last chance to react
-                        sendQuitTo(pid);
+                        checkCatchesAndSendQuitTo(pid, !timedout);
                     }
-                } while (time_spend <= timeout && !socket_file.exists());
+                } while (!timedout && !socket_file.exists());
+
                 if (!socket_file.exists()) {
                     throw new AttachNotSupportedException(
                         String.format("Unable to open socket file %s: " +
                           "target process %d doesn't respond within %dms " +
-                          "or HotSpot VM not loaded", socket_path, pid,
-                                      time_spend));
+                          "or HotSpot VM not loaded", socket_path, pid, time_spent));
                 }
             } finally {
                 f.delete();
@@ -210,49 +223,55 @@
     }
 
     // Return the socket file for the given process.
-    private File findSocketFile(int pid, int ns_pid) throws IOException {
-        String root = findTargetProcessTmpDirectory(pid, ns_pid);
-        return new File(root, ".java_pid" + ns_pid);
+    private File findSocketFile(long pid, long ns_pid) throws AttachNotSupportedException, IOException {
+        return new File(findTargetProcessTmpDirectory(pid, ns_pid), ".java_pid" + ns_pid);
     }
 
     // On Linux a simple handshake is used to start the attach mechanism
     // if not already started. The client creates a .attach_pid file in the
     // target VM's working directory (or temp directory), and the SIGQUIT handler
     // checks for the file.
-    private File createAttachFile(int pid, int ns_pid) throws IOException {
-        String fn = ".attach_pid" + ns_pid;
-        String path = "/proc/" + pid + "/cwd/" + fn;
-        File f = new File(path);
+    private File createAttachFile(long pid, long ns_pid) throws AttachNotSupportedException, IOException {
+        Path fn   = Path.of(".attach_pid" + ns_pid);
+        Path path = PROC.resolve(Path.of(Long.toString(pid), "cwd")).resolve(fn);
+        File f    = new File(path.toString());
         try {
             // Do not canonicalize the file path, or we will fail to attach to a VM in a container.
             f.createNewFile();
-        } catch (IOException x) {
-            String root = findTargetProcessTmpDirectory(pid, ns_pid);
-            f = new File(root, fn);
+        } catch (IOException e) {
+            f = new File(findTargetProcessTmpDirectory(pid, ns_pid), fn.toString());
             f.createNewFile();
         }
         return f;
     }
 
-    private String findTargetProcessTmpDirectory(int pid, int ns_pid) throws IOException {
-        String root;
-        if (pid != ns_pid) {
-            // A process may not exist in the same mount namespace as the caller, e.g.
-            // if we are trying to attach to a JVM process inside a container.
-            // Instead, attach relative to the target root filesystem as exposed by
-            // procfs regardless of namespaces.
-            String procRootDirectory = "/proc/" + pid + "/root";
-            if (!Files.isReadable(Path.of(procRootDirectory))) {
-                throw new IOException(
-                        String.format("Unable to access root directory %s " +
-                          "of target process %d", procRootDirectory, pid));
-            }
+    private String findTargetProcessTmpDirectory(long pid, long ns_pid) throws AttachNotSupportedException, IOException {
+        final var procPidRoot = PROC.resolve(Long.toString(pid)).resolve(ROOT_TMP);
 
-            root = procRootDirectory + "/" + tmpdir;
-        } else {
-            root = tmpdir;
-        }
-        return root;
+        /* We need to handle at least 4 different cases:
+         * 1. Caller and target processes share PID namespace and root filesystem (host to host or container to
+         *    container with both /tmp mounted between containers).
+         * 2. Caller and target processes share PID namespace and root filesystem but the target process has elevated
+         *    privileges (host to host).
+         * 3. Caller and target processes share PID namespace but NOT root filesystem (container to container).
+         * 4. Caller and target processes share neither PID namespace nor root filesystem (host to container)
+         *
+         * if target is elevated, we cant use /proc//... so we have to fallback to /tmp, but that may not be shared
+         * with the target/attachee process, we can try, except in the case where the ns_pid also exists in this pid ns
+         * which is ambiguous, if we share /tmp with the intended target, the attach will succeed, if we do not,
+         * then we will potentially attempt to attach to some arbitrary process with the same pid (in this pid ns)
+         * as that of the intended target (in its * pid ns).
+         *
+         * so in that case we should prehaps throw - or risk sending SIGQUIT to some arbitrary process... which could kill it
+         *
+         * however we can also check the target pid's signal masks to see if it catches SIGQUIT and only do so if in
+         * fact it does ... this reduces the risk of killing an innocent process in the current ns as opposed to
+         * attaching to the actual target JVM ... c.f: checkCatchesAndSendQuitTo() below.
+         *
+         * note that if pid == ns_pid we are in a shared pid ns with the target and may (potentially) share /tmp
+         */
+
+        return (Files.isWritable(procPidRoot) ? procPidRoot : TMPDIR).toString();
     }
 
     /*
@@ -269,13 +288,12 @@
         write(fd, b, 0, 1);
     }
 
-
     // Return the inner most namespaced PID if there is one,
     // otherwise return the original PID.
-    private int getNamespacePid(int pid) throws AttachNotSupportedException, IOException {
+    private long getNamespacePid(long pid) throws AttachNotSupportedException, IOException {
         // Assuming a real procfs sits beneath, reading this doesn't block
         // nor will it consume a lot of memory.
-        String statusFile = "/proc/" + pid + "/status";
+        final var statusFile = PROC.resolve(Long.toString(pid)).resolve(STATUS).toString();
         File f = new File(statusFile);
         if (!f.exists()) {
             return pid; // Likely a bad pid, but this is properly handled later.
@@ -291,8 +309,7 @@
                     // The last entry represents the PID the JVM "thinks" it is.
                     // Even in non-namespaced pids these entries should be
                     // valid. You could refer to it as the inner most pid.
-                    int ns_pid = Integer.parseInt(parts[parts.length - 1]);
-                    return ns_pid;
+                    return Long.parseLong(parts[parts.length - 1]);
                 }
             }
             // Old kernels may not have NSpid field (i.e. 3.10).
@@ -303,6 +320,74 @@
         }
     }
 
+    private static final String FIELD = "field";
+    private static final String MASK  = "mask";
+
+    private static final Pattern SIGNAL_MASK_PATTERN = Pattern.compile("(?<" + FIELD + ">Sig\\p{Alpha}{3}):\\s+(?<" + MASK + ">\\p{XDigit}{16}).*");
+
+    private static final long SIGQUIT = 0b100; // mask bit for SIGQUIT
+
+    private static boolean checkCatchesAndSendQuitTo(int pid, boolean throwIfNotReady) throws AttachNotSupportedException, IOException {
+        var quitIgn = false;
+        var quitBlk = false;
+        var quitCgt = false;
+
+        final var procPid = PROC.resolve(Integer.toString(pid));
+
+        var readBlk = false;
+        var readIgn = false;
+        var readCgt = false;
+
+
+        if (!Files.exists(procPid)) throw new IOException("non existent JVM pid: " + pid);
+
+        for (var line : Files.readAllLines(procPid.resolve("status"))) {
+
+            if (!line.startsWith("Sig")) continue; // to speed things up ... avoids the matcher/RE invocation...
+
+            final var m = SIGNAL_MASK_PATTERN.matcher(line);
+
+            if (!m.matches()) continue;
+
+            var       sigmask = m.group(MASK);
+            final var slen    = sigmask.length();
+
+            sigmask = sigmask.substring(slen / 2 , slen); // only really interested in the non r/t signals ...
+
+            final var sigquit = (Long.valueOf(sigmask, 16) & SIGQUIT) != 0L;
+
+            switch (m.group(FIELD)) {
+                case "SigBlk": { quitBlk = sigquit; readBlk = true; break; }
+                case "SigIgn": { quitIgn = sigquit; readIgn = true; break; }
+                case "SigCgt": { quitCgt = sigquit; readCgt = true; break; }
+            }
+
+            if (readBlk && readIgn && readCgt) break;
+        }
+
+        final boolean  okToSendQuit = (!quitIgn && quitCgt); // ignore blocked as it may be temporary ...
+
+        if (okToSendQuit) {
+            sendQuitTo(pid);
+        } else if (throwIfNotReady) {
+            Optional cmdline = Optional.empty();
+
+            try (final var clf = Files.lines(procPid.resolve("cmdline"))) {
+                cmdline = clf.findFirst();
+            }
+
+            var cmd = "null"; // default
+
+            if (cmdline.isPresent()) {
+                cmd = cmdline.get();
+                cmd = cmd.substring(0, cmd.length() - 1); // remove trailing \0
+            }
+
+            throw new AttachNotSupportedException("pid: " + pid + " cmd: '" + cmd + "' state is not ready to participate in attach handshake!");
+        }
+
+        return okToSendQuit;
+    }
 
     //-- native methods
 
diff -Nru openjdk-21-21.0.10+7/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/RSACipherAdaptor.java openjdk-21-21.0.11+10/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/RSACipherAdaptor.java
--- openjdk-21-21.0.10+7/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/RSACipherAdaptor.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/RSACipherAdaptor.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.security.pkcs11;
+
+import java.io.ByteArrayOutputStream;
+import java.security.MessageDigest;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.SecureRandom;
+import java.security.SignatureSpi;
+import java.security.InvalidKeyException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidParameterException;
+import java.security.ProviderException;
+import java.security.SignatureException;
+import java.security.spec.AlgorithmParameterSpec;
+import javax.crypto.Cipher;
+import javax.crypto.BadPaddingException;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import sun.security.pkcs11.wrapper.PKCS11Exception;
+
+/**
+ * NONEwithRSA Signature implementation using the RSA/ECB/PKCS1Padding Cipher
+ * implementation from SunPKCS11.
+ */
+public final class RSACipherAdaptor extends SignatureSpi {
+
+    private final P11RSACipher c;
+    private ByteArrayOutputStream verifyBuf;
+
+    public RSACipherAdaptor(Token token, long mechanism) {
+        try {
+            c = new P11RSACipher(token, "", mechanism);
+            c.engineSetPadding("pkcs1padding");
+        } catch (PKCS11Exception | NoSuchPaddingException e) {
+            // should not happen, but wrap and re-throw if it were to happen
+            throw new ProviderException(e);
+        }
+    }
+
+    @Override
+    protected void engineInitVerify(PublicKey publicKey)
+            throws InvalidKeyException {
+        c.engineInit(Cipher.DECRYPT_MODE, publicKey, null);
+        if (verifyBuf == null) {
+            verifyBuf = new ByteArrayOutputStream(128);
+        } else {
+            verifyBuf.reset();
+        }
+    }
+
+    @Override
+    protected void engineInitSign(PrivateKey privateKey)
+            throws InvalidKeyException {
+        c.engineInit(Cipher.ENCRYPT_MODE, privateKey, null);
+        verifyBuf = null;
+    }
+
+    @Override
+    protected void engineInitSign(PrivateKey privateKey, SecureRandom random)
+            throws InvalidKeyException {
+        c.engineInit(Cipher.ENCRYPT_MODE, privateKey, random);
+        verifyBuf = null;
+    }
+
+    @Override
+    protected void engineUpdate(byte b) throws SignatureException {
+        engineUpdate(new byte[] {b}, 0, 1);
+    }
+
+    @Override
+    protected void engineUpdate(byte[] b, int off, int len)
+            throws SignatureException {
+        if (verifyBuf != null) {
+            verifyBuf.write(b, off, len);
+        } else {
+            byte[] out = c.engineUpdate(b, off, len);
+            if ((out != null) && (out.length != 0)) {
+                throw new SignatureException
+                       ("Cipher unexpectedly returned data");
+            }
+        }
+    }
+
+    @Override
+    protected byte[] engineSign() throws SignatureException {
+        try {
+            return c.engineDoFinal(null, 0, 0);
+        } catch (IllegalBlockSizeException | BadPaddingException e) {
+           throw new SignatureException("doFinal() failed", e);
+        }
+    }
+
+    @Override
+    protected boolean engineVerify(byte[] sigBytes) throws SignatureException {
+        try {
+            byte[] out = c.engineDoFinal(sigBytes, 0, sigBytes.length);
+            byte[] data = verifyBuf.toByteArray();
+            verifyBuf.reset();
+            return MessageDigest.isEqual(out, data);
+        } catch (BadPaddingException e) {
+            // e.g. wrong public key used
+            // return false rather than throwing exception
+            return false;
+        } catch (IllegalBlockSizeException e) {
+            throw new SignatureException("doFinal() failed", e);
+        }
+    }
+
+    @Override
+    protected void engineSetParameter(AlgorithmParameterSpec params)
+            throws InvalidAlgorithmParameterException {
+        if (params != null) {
+            throw new InvalidParameterException("Parameters not supported");
+        }
+    }
+
+    @Override
+    @SuppressWarnings("deprecation")
+    protected void engineSetParameter(String param, Object value)
+            throws InvalidParameterException {
+        throw new InvalidParameterException("Parameters not supported");
+    }
+
+    @Override
+    @SuppressWarnings("deprecation")
+    protected Object engineGetParameter(String param)
+            throws InvalidParameterException {
+        throw new InvalidParameterException("Parameters not supported");
+    }
+}
diff -Nru openjdk-21-21.0.10+7/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java openjdk-21-21.0.11+10/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java
--- openjdk-21-21.0.10+7/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java	2026-04-17 19:09:35.000000000 +0000
@@ -995,6 +995,8 @@
         d(SIG, "SHA3-512withECDSAinP1363Format", P11Signature,
                 m(CKM_ECDSA_SHA3_512, CKM_ECDSA));
 
+        d(SIG, "NONEwithRSA",    "sun.security.pkcs11.RSACipherAdaptor",
+                m(CKM_RSA_PKCS));
         dA(SIG, "MD2withRSA",    P11Signature,
                 m(CKM_MD2_RSA_PKCS, CKM_RSA_PKCS, CKM_RSA_X_509));
         dA(SIG, "MD5withRSA",    P11Signature,
@@ -1423,6 +1425,8 @@
             } else if (type == SIG) {
                 if (algorithm.contains("RSASSA-PSS")) {
                     return new P11PSSSignature(token, algorithm, mechanism);
+                } else if (algorithm.equals("NONEwithRSA")) {
+                    return new RSACipherAdaptor(token, mechanism);
                 } else {
                     return new P11Signature(token, algorithm, mechanism);
                 }
diff -Nru openjdk-21-21.0.10+7/src/jdk.internal.le/share/classes/jdk/internal/org/jline/JdkConsoleProviderImpl.java openjdk-21-21.0.11+10/src/jdk.internal.le/share/classes/jdk/internal/org/jline/JdkConsoleProviderImpl.java
--- openjdk-21-21.0.10+7/src/jdk.internal.le/share/classes/jdk/internal/org/jline/JdkConsoleProviderImpl.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/jdk.internal.le/share/classes/jdk/internal/org/jline/JdkConsoleProviderImpl.java	2026-04-17 19:09:35.000000000 +0000
@@ -49,6 +49,7 @@
      */
     @Override
     public JdkConsole console(boolean isTTY, Charset charset) {
+        if (!isTTY) return null;
         try {
             Terminal terminal = TerminalBuilder.builder().encoding(charset)
                                                .exec(false)
diff -Nru openjdk-21-21.0.10+7/src/jdk.jfr/share/classes/jdk/jfr/events/EventConfigurations.java openjdk-21-21.0.11+10/src/jdk.jfr/share/classes/jdk/jfr/events/EventConfigurations.java
--- openjdk-21-21.0.10+7/src/jdk.jfr/share/classes/jdk/jfr/events/EventConfigurations.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/jdk.jfr/share/classes/jdk/jfr/events/EventConfigurations.java	2026-04-17 19:09:35.000000000 +0000
@@ -35,4 +35,10 @@
     public static final EventConfiguration FILE_FORCE = Utils.getConfiguration(FileForceEvent.class);
     public static final EventConfiguration ERROR_THROWN = Utils.getConfiguration(ErrorThrownEvent.class);
     public static final EventConfiguration EXCEPTION_THROWN = Utils.getConfiguration(ExceptionThrownEvent.class);
+
+    public static void initialize() {
+        // This method is intentionally empty. It is used to initialize the
+        // event configurations, i.e. ensure that this class's static
+        // initializer is run.
+    }
 }
diff -Nru openjdk-21-21.0.10+7/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformEventType.java openjdk-21-21.0.11+10/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformEventType.java
--- openjdk-21-21.0.10+7/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformEventType.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformEventType.java	2026-04-17 19:09:35.000000000 +0000
@@ -41,6 +41,7 @@
     private final boolean isJVM;
     private final boolean isJDK;
     private final boolean isMethodSampling;
+    private final boolean isBackToBackSensitive;
     private final List settings = new ArrayList<>(5);
     private final boolean dynamicSettings;
     private final int stackTraceOffset;
@@ -71,10 +72,25 @@
         this.dynamicSettings = dynamicSettings;
         this.isJVM = Type.isDefinedByJVM(id);
         this.isMethodSampling = isJVM && (name.equals(Type.EVENT_NAME_PREFIX + "ExecutionSample") || name.equals(Type.EVENT_NAME_PREFIX + "NativeMethodSample"));
+        this.isBackToBackSensitive = determineBackToBackSensitive();
         this.isJDK = isJDK;
         this.stackTraceOffset = stackTraceOffset(name, isJDK);
     }
 
+    private boolean determineBackToBackSensitive() {
+        if (getName().equals(Type.EVENT_NAME_PREFIX + "ThreadDump")) {
+            return true;
+        }
+        if (getName().equals(Type.EVENT_NAME_PREFIX + "ClassLoaderStatistics")) {
+            return true;
+        }
+        return false;
+    }
+
+    public boolean isBackToBackSensitive() {
+        return isBackToBackSensitive;
+    }
+
     private static boolean isExceptionEvent(String name) {
         switch (name) {
             case Type.EVENT_NAME_PREFIX + "JavaErrorThrow" :
diff -Nru openjdk-21-21.0.10+7/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java openjdk-21-21.0.11+10/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java
--- openjdk-21-21.0.10+7/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java	2026-04-17 19:09:35.000000000 +0000
@@ -54,6 +54,7 @@
 import jdk.jfr.RecordingState;
 import jdk.jfr.events.ActiveRecordingEvent;
 import jdk.jfr.events.ActiveSettingEvent;
+import jdk.jfr.events.EventConfigurations;
 import jdk.jfr.internal.SecuritySupport.SafePath;
 import jdk.jfr.internal.SecuritySupport.SecureRecorderListener;
 import jdk.jfr.internal.consumer.EventLog;
@@ -83,6 +84,7 @@
         Logger.log(JFR_SYSTEM, INFO, "Created native");
         JDKEvents.initialize();
         Logger.log(JFR_SYSTEM, INFO, "Registered JDK events");
+        EventConfigurations.initialize();
         JDKEvents.addInstrumentation();
         startDiskMonitor();
         shutdownHook = SecuritySupport.createThreadWitNoPermissions("JFR Shutdown Hook", new ShutdownHook(this));
@@ -281,7 +283,7 @@
         if (toDisk) {
             PeriodicEvents.setFlushInterval(streamInterval);
         }
-        PeriodicEvents.doChunkBegin();
+        PeriodicEvents.doChunkBegin(true);
         Duration duration = recording.getDuration();
         if (duration != null) {
             recording.setStopTime(startTime.plus(duration));
@@ -353,7 +355,7 @@
                 finishChunk(currentChunk, stopTime, null);
             }
             currentChunk = newChunk;
-            PeriodicEvents.doChunkBegin();
+            PeriodicEvents.doChunkBegin(false);
         }
 
         if (toDisk) {
@@ -408,7 +410,7 @@
             finishChunk(currentChunk, timestamp, null);
         }
         currentChunk = newChunk;
-        PeriodicEvents.doChunkBegin();
+        PeriodicEvents.doChunkBegin(false);
     }
 
     private List getRunningRecordings() {
diff -Nru openjdk-21-21.0.10+7/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/PeriodicEvents.java openjdk-21-21.0.11+10/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/PeriodicEvents.java
--- openjdk-21-21.0.10+7/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/PeriodicEvents.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/jdk.jfr/share/classes/jdk/jfr/internal/periodic/PeriodicEvents.java	2026-04-17 19:09:35.000000000 +0000
@@ -74,12 +74,14 @@
         return taskRepository.removeTask(runnable);
     }
 
-    public static void doChunkBegin() {
+    public static void doChunkBegin(boolean startRecording) {
         long timestamp = JVM.counterTime();
         for (EventTask task : taskRepository.getTasks()) {
             var eventType = task.getEventType();
             if (eventType.isEnabled() && eventType.isBeginChunk()) {
-                task.run(timestamp, PeriodicType.BEGIN_CHUNK);
+                if (!eventType.isBackToBackSensitive() || startRecording) {
+                    task.run(timestamp, PeriodicType.BEGIN_CHUNK);
+                }
             }
         }
     }
diff -Nru openjdk-21-21.0.10+7/src/jdk.management/aix/native/libmanagement_ext/UnixOperatingSystem.c openjdk-21-21.0.11+10/src/jdk.management/aix/native/libmanagement_ext/UnixOperatingSystem.c
--- openjdk-21-21.0.10+7/src/jdk.management/aix/native/libmanagement_ext/UnixOperatingSystem.c	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/src/jdk.management/aix/native/libmanagement_ext/UnixOperatingSystem.c	2026-04-17 19:09:35.000000000 +0000
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2008, 2022, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2015, 2020 SAP SE. All rights reserved.
+ * Copyright (c) 2008, 2025, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2025 SAP SE. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,20 +28,111 @@
 /* Implement and update https://bugs.openjdk.org/browse/JDK-8030957 */
 
 #include 
+#include 
+#include 
+#include 
+#include 
 #include "com_sun_management_internal_OperatingSystemImpl.h"
 
+static struct perfMetrics{
+    unsigned long long timebase;
+    perfstat_process_t stats;
+    perfstat_cpu_total_t cpu_total;
+} counters;
+
+static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
+
+int perfInit() {
+    static int initialized = 0;
+    if (!initialized) {
+
+        perfstat_id_t id;
+        counters.stats = (perfstat_process_t){0};
+        counters.timebase = 0;
+        int rc = perfstat_cpu_total(NULL, &counters.cpu_total, sizeof(perfstat_cpu_total_t), 1);
+        if (rc < 0) {
+            return -1;
+        }
+        rc = perfstat_process(&id, &counters.stats, sizeof(perfstat_process_t), 1);
+        if (rc < 0) {
+            return -1;
+        }
+        counters.timebase = counters.stats.last_timebase;
+        initialized = 1;
+    }
+    return initialized ? 0 : -1;
+}
+
 JNIEXPORT jdouble JNICALL
 Java_com_sun_management_internal_OperatingSystemImpl_getCpuLoad0
 (JNIEnv *env, jobject dummy)
 {
-    return -1.0;
+    double load = -1.0;
+    pthread_mutex_lock(&lock);
+    if (perfInit() == 0) {
+        int ret;
+        perfstat_cpu_total_t cpu_total;
+        ret = perfstat_cpu_total(NULL, &cpu_total, sizeof(perfstat_cpu_total_t), 1);
+        if (ret < 0) {
+            return -1.0;
+        }
+        long long user_diff = cpu_total.user - counters.cpu_total.user;
+        long long sys_diff = cpu_total.sys - counters.cpu_total.sys;
+        long long idle_diff = cpu_total.idle - counters.cpu_total.idle;
+        long long wait_diff = cpu_total.wait - counters.cpu_total.wait;
+        long long total = user_diff + sys_diff + idle_diff + wait_diff;
+        if (total < (user_diff + sys_diff)) {
+            total = user_diff + sys_diff;
+        }
+        if (total == 0) {
+            load = 0.0;
+        } else {
+            load = (double)(user_diff + sys_diff) / total;
+            load = MAX(load, 0.0);
+            load = MIN(load, 1.0);
+        }
+        counters.cpu_total = cpu_total;
+    }
+    pthread_mutex_unlock(&lock);
+    return load;
 }
 
 JNIEXPORT jdouble JNICALL
 Java_com_sun_management_internal_OperatingSystemImpl_getProcessCpuLoad0
 (JNIEnv *env, jobject dummy)
 {
-    return -1.0;
+    perfstat_process_t curr_stats;
+    perfstat_id_t id;
+    unsigned long long curr_timebase, timebase_diff;
+    double user_diff, sys_diff, delta_time;
+    double cpu_load = -1.0;
+    pthread_mutex_lock(&lock);
+    if (perfInit() == 0) {
+        int ret;
+        ret = perfstat_process(&id, &curr_stats, sizeof(perfstat_process_t), 1);
+        if (ret < 0) {
+            return -1.0;
+        }
+        curr_timebase = curr_stats.last_timebase;
+        timebase_diff = curr_timebase - counters.timebase;
+        if ((long long)timebase_diff < 0 || XINTFRAC == 0) {
+            return -1.0;
+        }
+        delta_time = HTIC2NANOSEC(timebase_diff) / 1000000000.0;
+        user_diff = (double)(curr_stats.ucpu_time - counters.stats.ucpu_time);
+        sys_diff  = (double)(curr_stats.scpu_time - counters.stats.scpu_time);
+        counters.stats = curr_stats;
+        counters.timebase = curr_timebase;
+        if (delta_time == 0) {
+            cpu_load = 0.0;
+        } else {
+            cpu_load = (user_diff + sys_diff) / delta_time;
+            cpu_load = MAX(cpu_load, 0.0);
+            cpu_load = MIN(cpu_load, 1.0);
+        }
+    }
+    pthread_mutex_unlock(&lock);
+    return (jdouble)cpu_load;
 }
 
 JNIEXPORT jdouble JNICALL
diff -Nru openjdk-21-21.0.10+7/test/hotspot/gtest/runtime/test_os.cpp openjdk-21-21.0.11+10/test/hotspot/gtest/runtime/test_os.cpp
--- openjdk-21-21.0.10+7/test/hotspot/gtest/runtime/test_os.cpp	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/gtest/runtime/test_os.cpp	2026-04-17 19:09:35.000000000 +0000
@@ -166,82 +166,95 @@
 }
 #endif
 
-static void do_test_print_hex_dump(address addr, size_t len, int unitsize, const char* expected) {
-  char buf[256];
+#ifndef AIX
+// Test relies on the ability to protect memory allocated with os::reserve_memory. AIX may not be able
+// to do that (mprotect won't work on System V shm).
+static void do_test_print_hex_dump(const_address from, const_address to, int unitsize, int bytes_per_line,
+                                   const_address logical_start, const char* expected) {
+  char buf[2048];
   buf[0] = '\0';
   stringStream ss(buf, sizeof(buf));
-  os::print_hex_dump(&ss, addr, addr + len, unitsize);
-  // tty->print_cr("expected: %s", expected);
-  // tty->print_cr("result: %s", buf);
-  EXPECT_THAT(buf, HasSubstr(expected));
+  os::print_hex_dump(&ss, from, to, unitsize, /* print_ascii=*/true, bytes_per_line, logical_start);
+  EXPECT_STREQ(buf, expected);
 }
 
 TEST_VM(os, test_print_hex_dump) {
-  const char* pattern [4] = {
-#ifdef VM_LITTLE_ENDIAN
-    "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f",
-    "0100 0302 0504 0706 0908 0b0a 0d0c 0f0e",
-    "03020100 07060504 0b0a0908 0f0e0d0c",
-    "0706050403020100 0f0e0d0c0b0a0908"
+
+#ifdef _LP64
+#define ADDRESS1 "0x0000aaaaaaaaaa00"
+#define ADDRESS2 "0x0000aaaaaaaaaa20"
+#define ADDRESS3 "0x0000aaaaaaaaaa40"
 #else
-    "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f",
-    "0001 0203 0405 0607 0809 0a0b 0c0d 0e0f",
-    "00010203 04050607 08090a0b 0c0d0e0f",
-    "0001020304050607 08090a0b0c0d0e0f"
+#define ADDRESS1 "0xaaaaaa00"
+#define ADDRESS2 "0xaaaaaa20"
+#define ADDRESS3 "0xaaaaaa40"
 #endif
-  };
 
-  const char* pattern_not_readable [4] = {
-    "?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??",
-    "???? ???? ???? ???? ???? ???? ???? ????",
-    "???????? ???????? ???????? ????????",
-    "???????????????? ????????????????"
-  };
+#define ASCII_1  "....#.jdk/internal/loader/Native"
+#define ASCII_2  "Libraries......."
 
-  // On AIX, zero page is readable.
-  address unreadable =
-#ifdef AIX
-    (address) 0xFFFFFFFFFFFF0000ULL;
-#else
-    (address) 0
-#endif
-    ;
+#define PAT_1 ADDRESS1 ":   ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??\n" \
+              ADDRESS2 ":   ff ff e0 dc 23 00 6a 64 6b 2f 69 6e 74 65 72 6e 61 6c 2f 6c 6f 61 64 65 72 2f 4e 61 74 69 76 65   " ASCII_1 "\n" \
+              ADDRESS3 ":   4c 69 62 72 61 72 69 65 73 00 00 00 00 00 00 00                                                   " ASCII_2 "\n"
 
-  ResourceMark rm;
-  char buf[64];
-  stringStream ss(buf, sizeof(buf));
-  outputStream* out = &ss;
-//  outputStream* out = tty; // enable for printout
+#ifdef VM_LITTLE_ENDIAN
+#define PAT_2 ADDRESS1 ":   ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ????\n" \
+              ADDRESS2 ":   ffff dce0 0023 646a 2f6b 6e69 6574 6e72 6c61 6c2f 616f 6564 2f72 614e 6974 6576   " ASCII_1 "\n" \
+              ADDRESS3 ":   694c 7262 7261 6569 0073 0000 0000 0000                                           " ASCII_2 "\n"
+
+#define PAT_4 ADDRESS1 ":   ???????? ???????? ???????? ???????? ???????? ???????? ???????? ????????\n" \
+              ADDRESS2 ":   dce0ffff 646a0023 6e692f6b 6e726574 6c2f6c61 6564616f 614e2f72 65766974   " ASCII_1 "\n" \
+              ADDRESS3 ":   7262694c 65697261 00000073 00000000                                       " ASCII_2 "\n"
+
+#define PAT_8 ADDRESS1 ":   ???????????????? ???????????????? ???????????????? ????????????????\n" \
+              ADDRESS2 ":   646a0023dce0ffff 6e7265746e692f6b 6564616f6c2f6c61 65766974614e2f72   " ASCII_1 "\n" \
+              ADDRESS3 ":   656972617262694c 0000000000000073                                     " ASCII_2 "\n"
+#else
+#define PAT_2 ADDRESS1 ":   ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ????\n" \
+              ADDRESS2 ":   ffff e0dc 2300 6a64 6b2f 696e 7465 726e 616c 2f6c 6f61 6465 722f 4e61 7469 7665   " ASCII_1 "\n" \
+              ADDRESS3 ":   4c69 6272 6172 6965 7300 0000 0000 0000                                           " ASCII_2 "\n"
+
+#define PAT_4 ADDRESS1 ":   ???????? ???????? ???????? ???????? ???????? ???????? ???????? ????????\n" \
+              ADDRESS2 ":   ffffe0dc 23006a64 6b2f696e 7465726e 616c2f6c 6f616465 722f4e61 74697665   " ASCII_1 "\n" \
+              ADDRESS3 ":   4c696272 61726965 73000000 00000000                                       " ASCII_2 "\n"
+
+#define PAT_8 ADDRESS1 ":   ???????????????? ???????????????? ???????????????? ????????????????\n" \
+              ADDRESS2 ":   ffffe0dc23006a64 6b2f696e7465726e 616c2f6c6f616465 722f4e6174697665   " ASCII_1 "\n" \
+              ADDRESS3 ":   4c69627261726965 7300000000000000                                     " ASCII_2 "\n"
+#endif
+
+  constexpr uint8_t bytes[] = {
+    0xff, 0xff, 0xe0, 0xdc, 0x23, 0x00, 0x6a, 0x64, 0x6b, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+    0x61, 0x6c, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2f, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65,
+    0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+  };
 
-  // Test dumping unreadable memory
-  // Exclude test for Windows for now, since it needs SEH handling to work which cannot be
-  // guaranteed when we call directly into VM code. (see JDK-8220220)
-#ifndef _WIN32
-  do_test_print_hex_dump(unreadable, 100, 1, pattern_not_readable[0]);
-  do_test_print_hex_dump(unreadable, 100, 2, pattern_not_readable[1]);
-  do_test_print_hex_dump(unreadable, 100, 4, pattern_not_readable[2]);
-  do_test_print_hex_dump(unreadable, 100, 8, pattern_not_readable[3]);
-#endif
-
-  // Test dumping readable memory
-  address arr = (address)os::malloc(100, mtInternal);
-  for (int c = 0; c < 100; c++) {
-    arr[c] = c;
-  }
-
-  // properly aligned
-  do_test_print_hex_dump(arr, 100, 1, pattern[0]);
-  do_test_print_hex_dump(arr, 100, 2, pattern[1]);
-  do_test_print_hex_dump(arr, 100, 4, pattern[2]);
-  do_test_print_hex_dump(arr, 100, 8, pattern[3]);
-
-  // Not properly aligned. Should automatically down-align by unitsize
-  do_test_print_hex_dump(arr + 1, 100, 2, pattern[1]);
-  do_test_print_hex_dump(arr + 1, 100, 4, pattern[2]);
-  do_test_print_hex_dump(arr + 1, 100, 8, pattern[3]);
+  // two pages, first one protected.
+  const size_t ps = os::vm_page_size();
+  char* two_pages = os::reserve_memory(ps * 2, false, mtTest);
+  os::commit_memory(two_pages, ps * 2, false);
+  os::protect_memory(two_pages, ps, os::MEM_PROT_NONE, true);
+
+  memcpy(two_pages + ps, bytes, sizeof(bytes));
+
+  // print
+  const const_address from = (const_address) two_pages + ps - 32;
+  const const_address to = (const_address) from + 32 + sizeof(bytes);
+  const const_address logical_start = (const_address) LP64_ONLY(0xAAAAAAAAAA00ULL) NOT_LP64(0xAAAAAA00ULL);
+
+  do_test_print_hex_dump(from, to, 1, 32, logical_start, PAT_1);
+  do_test_print_hex_dump(from, to, 2, 32, logical_start, PAT_2);
+  do_test_print_hex_dump(from, to, 4, 32, logical_start, PAT_4);
+  do_test_print_hex_dump(from, to, 8, 32, logical_start, PAT_8);
+
+  // unaligned printing, should align to next lower unitsize
+  do_test_print_hex_dump(from + 1, to, 2, 32, logical_start, PAT_2);
+  do_test_print_hex_dump(from + 1, to, 4, 32, logical_start, PAT_4);
+  do_test_print_hex_dump(from + 1, to, 8, 32, logical_start, PAT_8);
 
-  os::free(arr);
+  os::release_memory(two_pages, ps * 2);
 }
+#endif // not AIX
 
 //////////////////////////////////////////////////////////////////////////////
 // Test os::vsnprintf and friends.
@@ -939,3 +952,24 @@
   ::close(fd);
 #endif
 }
+
+TEST_VM(os, reserve_at_wish_address_shall_not_replace_mappings_smallpages) {
+  char* p1 = os::reserve_memory(M, false, mtTest);
+  ASSERT_NE(p1, nullptr);
+  char* p2 = os::attempt_reserve_memory_at(p1, M);
+  ASSERT_EQ(p2, nullptr); // should have failed
+  os::release_memory(p1, M);
+}
+
+TEST_VM(os, reserve_at_wish_address_shall_not_replace_mappings_largepages) {
+  if (UseLargePages && !os::can_commit_large_page_memory()) { // aka special
+    const size_t lpsz = os::large_page_size();
+    char* p1 = os::reserve_memory_aligned(lpsz, lpsz, false);
+    ASSERT_NE(p1, nullptr);
+    char* p2 = os::reserve_memory_special(lpsz, lpsz, lpsz, p1, false);
+    ASSERT_EQ(p2, nullptr); // should have failed
+    os::release_memory(p1, M);
+  } else {
+    tty->print_cr("Skipped.");
+  }
+}
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/TEST.ROOT openjdk-21-21.0.11+10/test/hotspot/jtreg/TEST.ROOT
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/TEST.ROOT	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/TEST.ROOT	2026-04-17 19:09:35.000000000 +0000
@@ -94,7 +94,7 @@
     jdk.containerized
 
 # Minimum jtreg version
-requiredVersion=7.3.1+1
+requiredVersion=7.5.2+1
 
 # Path to libraries in the topmost test directory. This is needed so @library
 # does not need ../../../ notation to reach them
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/compiler/loopopts/TestValidTypeInOverflowProtection.java openjdk-21-21.0.11+10/test/hotspot/jtreg/compiler/loopopts/TestValidTypeInOverflowProtection.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/compiler/loopopts/TestValidTypeInOverflowProtection.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/compiler/loopopts/TestValidTypeInOverflowProtection.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8373525
+ * @summary Test for the check of a valid type (long) for the input variable of overflow protection
+ * @run main/othervm -Xbatch -XX:-TieredCompilation -XX:CompileCommand=compileonly,compiler.loopopts.TestValidTypeInOverflowProtection::test
+ *                   compiler.loopopts.TestValidTypeInOverflowProtection
+ * @run main compiler.loopopts.TestValidTypeInOverflowProtection
+ */
+
+package compiler.loopopts;
+
+import java.util.Vector;
+
+class TestVector extends Vector {
+    TestVector(int initialCapacity) {
+        super(initialCapacity);
+    }
+
+    Object getElementData() {
+        return elementData;
+    }
+}
+
+public class TestValidTypeInOverflowProtection {
+    int cntr;
+    int mode;
+    int value = 533;
+    int one = 1;
+
+    public static void main(String[] args) {
+        TestValidTypeInOverflowProtection test = new TestValidTypeInOverflowProtection();
+        for (int i = 0; i < 1000; i++) {
+            test.test();
+        }
+    }
+
+    TestVector nextVector() {
+        if (cntr == one) {
+            return null;
+        }
+        TestVector vect = new TestVector(value);
+        if (mode == 2) {
+            int cap = vect.capacity();
+            for (int i = 0; i < cap; i++) {
+                vect.addElement(new Object());
+            }
+        }
+        if (++mode == 3) {
+            mode = cntr++;
+        }
+        return vect;
+    }
+
+    String test() {
+        cntr = 0;
+        TestVector vect = nextVector();
+        while (vect != null) {
+            Object backup_array = new Object[vect.size()];
+            System.arraycopy(vect.getElementData(), 0, backup_array, 0, vect.size());
+            int old_size = vect.size();
+            int old_cap = vect.capacity();
+            vect.setSize(vect.capacity() + 1);
+            for (int i = old_size; i < old_cap; i++) {
+                if (vect.elementAt(i) != null) {
+                }
+            }
+            for (int i = 0; i < new MyInteger(old_size).v; i++) {
+            }
+            vect = nextVector();
+        }
+        return null;
+    }
+
+    class MyInteger {
+        int v;
+
+        MyInteger(int v) {
+            int M452 = 4;
+            int N452 = 8;
+            for (int i452 = 0; i452 < M452; i452++) {
+                for (int j452 = 0; j452 < N452; j452++) {
+                    switch (i452) {
+                        case -2:
+                        case 0:
+                            this.v = v;
+                    }
+                }
+            }
+        }
+    }
+}
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/compiler/loopstripmining/CheckLoopStripMining.java openjdk-21-21.0.11+10/test/hotspot/jtreg/compiler/loopstripmining/CheckLoopStripMining.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/compiler/loopstripmining/CheckLoopStripMining.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/compiler/loopstripmining/CheckLoopStripMining.java	2026-04-17 19:09:35.000000000 +0000
@@ -42,8 +42,8 @@
                                     "-XX:+SafepointTimeout",
                                     "-XX:+SafepointALot",
                                     "-XX:+AbortVMOnSafepointTimeout",
-                                    "-XX:SafepointTimeoutDelay=" + Utils.adjustTimeout(300),
-                                    "-XX:GuaranteedSafepointInterval=" + Utils.adjustTimeout(300),
+                                    "-XX:SafepointTimeoutDelay=" + Utils.adjustTimeout(1200),
+                                    "-XX:GuaranteedSafepointInterval=" + Utils.adjustTimeout(1200),
                                     "-XX:-TieredCompilation",
                                     "-XX:+UseCountedLoopSafepoints",
                                     "-XX:LoopStripMiningIter=1000",
@@ -58,8 +58,8 @@
                                     "-XX:+SafepointTimeout",
                                     "-XX:+SafepointALot",
                                     "-XX:+AbortVMOnSafepointTimeout",
-                                    "-XX:SafepointTimeoutDelay=" + Utils.adjustTimeout(300),
-                                    "-XX:GuaranteedSafepointInterval=" + Utils.adjustTimeout(300),
+                                    "-XX:SafepointTimeoutDelay=" + Utils.adjustTimeout(1200),
+                                    "-XX:GuaranteedSafepointInterval=" + Utils.adjustTimeout(1200),
                                     "-XX:-TieredCompilation",
                                     "-XX:+UseCountedLoopSafepoints",
                                     "-XX:LoopStripMiningIter=1000",
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/containers/docker/TestJFRWithJMX.java openjdk-21-21.0.11+10/test/hotspot/jtreg/containers/docker/TestJFRWithJMX.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/containers/docker/TestJFRWithJMX.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/containers/docker/TestJFRWithJMX.java	2026-04-17 19:09:35.000000000 +0000
@@ -77,7 +77,7 @@
             throw new SkippedException("Docker is not supported on this host");
         }
 
-        if (isPodman() & !Platform.isRoot()) {
+        if (DockerTestUtils.isPodman() & !Platform.isRoot()) {
             throw new SkippedException("test cannot be run under rootless podman configuration");
         }
 
@@ -222,10 +222,4 @@
         }
     }
 
-    static boolean isPodman() {
-        String[] parts = Container.ENGINE_COMMAND
-            .toLowerCase()
-            .split(File.pathSeparator);
-        return "podman".equals(parts[parts.length - 1]);
-    }
 }
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/containers/docker/TestJcmd.java openjdk-21-21.0.11+10/test/hotspot/jtreg/containers/docker/TestJcmd.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/containers/docker/TestJcmd.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/containers/docker/TestJcmd.java	2026-04-17 19:09:35.000000000 +0000
@@ -57,7 +57,7 @@
     private static final String IMAGE_NAME = Common.imageName("jcmd");
     private static final int TIME_TO_RUN_CONTAINER_PROCESS = (int) (10 * Utils.TIMEOUT_FACTOR); // seconds
     private static final String CONTAINER_NAME = "test-container";
-    private static final boolean IS_PODMAN = Container.ENGINE_COMMAND.contains("podman");
+    private static final boolean IS_PODMAN = DockerTestUtils.isPodman();
     private static final String ROOT_UID = "0";
 
 
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/containers/docker/TestJcmdWithSideCar.java openjdk-21-21.0.11+10/test/hotspot/jtreg/containers/docker/TestJcmdWithSideCar.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/containers/docker/TestJcmdWithSideCar.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/containers/docker/TestJcmdWithSideCar.java	2026-04-17 19:09:35.000000000 +0000
@@ -39,14 +39,23 @@
  * @build EventGeneratorLoop
  * @run driver TestJcmdWithSideCar
  */
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import java.nio.file.Paths;
-import java.util.Arrays;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.EnumSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
+
 import jdk.test.lib.Container;
+import jdk.test.lib.Platform;
 import jdk.test.lib.Utils;
 import jdk.test.lib.containers.docker.Common;
 import jdk.test.lib.containers.docker.DockerRunOptions;
@@ -61,6 +70,31 @@
     private static final long TIME_TO_WAIT_FOR_MAIN_METHOD_START = 50 * 1000; // milliseconds
     private static final String MAIN_CONTAINER_NAME = "test-container-main";
 
+    private static final String UID = "uid";
+    private static final String GID = "gid";
+
+    private static final Pattern ID_PATTERN = Pattern.compile("uid=(?<" + UID + ">\\d+)\\([^\\)]+\\)\\s+gid=(?<" + GID + ">\\d+).*");
+
+    private static final Optional USER = ProcessHandle.current().info().user().map(
+            user -> {
+                try (var br = new BufferedReader(new InputStreamReader(new ProcessBuilder("id", user).start().getInputStream()))) {
+                    for (final var line : br.lines().toList()) {
+                        final var m = ID_PATTERN.matcher(line);
+
+                        if (m.matches()) {
+                            return "--user=" + m.group(UID) + ":" + m.group(GID);
+                        }
+                    }
+                } catch (IOException e) {
+                    // do nothing...
+                }
+
+                return null;
+            }
+    );
+
+    private static final String NET_BIND_SERVICE = "--cap-add=NET_BIND_SERVICE";
+
     public static void main(String[] args) throws Exception {
         if (!DockerTestUtils.canTestDocker()) {
             return;
@@ -69,24 +103,33 @@
         DockerTestUtils.buildJdkContainerImage(IMAGE_NAME);
 
         try {
-            // Start the loop process in the "main" container, then run test cases
-            // using a sidecar container.
-            MainContainer mainContainer = new MainContainer();
-            mainContainer.start();
-            mainContainer.waitForMainMethodStart(TIME_TO_WAIT_FOR_MAIN_METHOD_START);
-
-            long mainProcPid = testCase01();
-
-            // Excluding the test case below until JDK-8228850 is fixed
-            // JDK-8228850: jhsdb jinfo fails with ClassCastException:
-            // s.j.h.oops.TypeArray cannot be cast to s.j.h.oops.Instance
-            // mainContainer.assertIsAlive();
-            // testCase02(mainProcPid);
+            for (final boolean elevated : USER.isPresent() ? new Boolean[] { false, true } : new Boolean[] { false }) {
+                // Start the loop process in the "main" container, then run test cases
+                // using a sidecar container.
+                MainContainer mainContainer = new MainContainer();
+                mainContainer.start(elevated);
+                mainContainer.waitForMainMethodStart(TIME_TO_WAIT_FOR_MAIN_METHOD_START);
+
+                for (AttachStrategy attachStrategy : EnumSet.allOf(AttachStrategy.class)) {
+                    if (attachStrategy == AttachStrategy.ACCESS_TMP_VIA_PROC_ROOT &&
+                        elevated && !Platform.isRoot()) {
+                        // Elevated attach via proc/root not yet supported.
+                        continue;
+                    }
+                    long mainProcPid = testCase01(attachStrategy, elevated);
+
+                    // Excluding the test case below until JDK-8228850 is fixed
+                    // JDK-8228850: jhsdb jinfo fails with ClassCastException:
+                    // s.j.h.oops.TypeArray cannot be cast to s.j.h.oops.Instance
+                    // mainContainer.assertIsAlive();
+                    // testCase02(mainProcPid, attachStrategy, elevated);
 
-            mainContainer.assertIsAlive();
-            testCase03(mainProcPid);
+                    mainContainer.assertIsAlive();
+                    testCase03(mainProcPid, attachStrategy, elevated);
+                }
 
-            mainContainer.waitForAndCheck(TIME_TO_RUN_MAIN_PROCESS * 1000);
+                mainContainer.waitForAndCheck(TIME_TO_RUN_MAIN_PROCESS * 1000);
+            }
         } finally {
             DockerTestUtils.removeDockerImage(IMAGE_NAME);
         }
@@ -94,21 +137,21 @@
 
 
     // Run "jcmd -l" in a sidecar container, find a target process.
-    private static long testCase01() throws Exception {
-        OutputAnalyzer out = runSideCar(MAIN_CONTAINER_NAME, "/jdk/bin/jcmd", "-l")
+    private static long testCase01(AttachStrategy attachStrategy, boolean elevated) throws Exception {
+        OutputAnalyzer out = runSideCar(MAIN_CONTAINER_NAME, attachStrategy, elevated, "/jdk/bin/jcmd", "-l")
             .shouldHaveExitValue(0)
             .shouldContain("sun.tools.jcmd.JCmd");
         long pid = findProcess(out, "EventGeneratorLoop");
         if (pid == -1) {
-            throw new RuntimeException("Could not find specified process");
+            throw new RuntimeException(attachStrategy + ": Could not find specified process");
         }
 
         return pid;
     }
 
     // run jhsdb jinfo  (jhsdb uses PTRACE)
-    private static void testCase02(long pid) throws Exception {
-        runSideCar(MAIN_CONTAINER_NAME, "/jdk/bin/jhsdb", "jinfo", "--pid", "" + pid)
+    private static void testCase02(long pid, AttachStrategy attachStrategy, boolean elevated) throws Exception {
+        runSideCar(MAIN_CONTAINER_NAME, attachStrategy, elevated, "/jdk/bin/jhsdb", "jinfo", "--pid", "" + pid)
             .shouldHaveExitValue(0)
             .shouldContain("Java System Properties")
             .shouldContain("VM Flags");
@@ -116,11 +159,11 @@
 
     // test jcmd with some commands (help, start JFR recording)
     // JCMD will use signal mechanism and Unix Socket
-    private static void testCase03(long pid) throws Exception {
-        runSideCar(MAIN_CONTAINER_NAME, "/jdk/bin/jcmd", "" + pid, "help")
+    private static void testCase03(long pid, AttachStrategy attachStrategy, boolean elevated) throws Exception {
+        runSideCar(MAIN_CONTAINER_NAME, attachStrategy, elevated, "/jdk/bin/jcmd", "" + pid, "help")
             .shouldHaveExitValue(0)
             .shouldContain("VM.version");
-        runSideCar(MAIN_CONTAINER_NAME, "/jdk/bin/jcmd", "" + pid, "JFR.start")
+        runSideCar(MAIN_CONTAINER_NAME, attachStrategy, elevated, "/jdk/bin/jcmd", "" + pid, "JFR.start")
             .shouldHaveExitValue(0)
             .shouldContain("Started recording");
     }
@@ -128,21 +171,36 @@
 
     // JCMD relies on the attach mechanism (com.sun.tools.attach),
     // which in turn relies on JVMSTAT mechanism, which puts its mapped
-    // buffers in /tmp directory (hsperfdata_). Thus, in sidecar
-    // we mount /tmp via --volumes-from from the main container.
-    private static OutputAnalyzer runSideCar(String mainContainerName, String whatToRun,
-                                             String... args) throws Exception {
-        List cmd = new ArrayList<>();
-        String[] command = new String[] {
+    // buffers in /tmp directory (hsperfdata_). Thus, in the sidecar
+    // we have two options:
+    // 1. mount /tmp from the main container using --volumes-from.
+    // 2. access /tmp from the main container via /proc//root/tmp.
+    private static OutputAnalyzer runSideCar(String mainContainerName, AttachStrategy attachStrategy, boolean elevated,  String whatToRun, String... args) throws Exception {
+        System.out.println("Attach strategy " + attachStrategy);
+
+        List initialCommands = List.of(
             Container.ENGINE_COMMAND, "run",
             "--tty=true", "--rm",
             "--cap-add=SYS_PTRACE", "--sig-proxy=true",
-            "--pid=container:" + mainContainerName,
-            "--volumes-from", mainContainerName,
-            IMAGE_NAME, whatToRun
+            "--pid=container:" + mainContainerName
+        );
+
+        List attachStrategyCommands = switch (attachStrategy) {
+            case TMP_MOUNTED_INTO_SIDECAR -> List.of("--volumes-from", mainContainerName);
+            case ACCESS_TMP_VIA_PROC_ROOT -> List.of();
         };
 
-        cmd.addAll(Arrays.asList(command));
+        List elevatedOpts = elevated && USER.isPresent() ? List.of(NET_BIND_SERVICE, USER.get()) : Collections.emptyList();
+
+        List imageAndCommand = List.of(
+            IMAGE_NAME, whatToRun
+        );
+
+        List cmd = new ArrayList<>();
+        cmd.addAll(initialCommands);
+        cmd.addAll(elevatedOpts);
+        cmd.addAll(attachStrategyCommands);
+        cmd.addAll(imageAndCommand);
         cmd.addAll(Arrays.asList(args));
         return DockerTestUtils.execute(cmd);
     }
@@ -189,9 +247,15 @@
             }
         };
 
-        public Process start() throws Exception {
+        public Process start(final boolean elevated) throws Exception {
             // start "main" container (the observee)
             DockerRunOptions opts = commonDockerOpts("EventGeneratorLoop");
+
+            if (elevated && USER.isPresent()) {
+                opts.addDockerOpts(USER.get());
+                opts.addDockerOpts(NET_BIND_SERVICE);
+            }
+
             opts.addDockerOpts("--cap-add=SYS_PTRACE")
                 .addDockerOpts("--name", MAIN_CONTAINER_NAME)
                 .addDockerOpts("--volume", "/tmp")
@@ -242,7 +306,7 @@
                 try {
                     exitValue = p.exitValue();
                 } catch(IllegalThreadStateException ex) {
-                    System.out.println("IllegalThreadStateException occured when calling exitValue()");
+                    System.out.println("IllegalThreadStateException occurred when calling exitValue()");
                     retryCount--;
                 }
             } while (exitValue == -1 && retryCount > 0);
@@ -254,4 +318,8 @@
 
     }
 
+    private enum AttachStrategy {
+        TMP_MOUNTED_INTO_SIDECAR,
+        ACCESS_TMP_VIA_PROC_ROOT
+    }
 }
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/containers/docker/TestMemoryInvisibleParent.java openjdk-21-21.0.11+10/test/hotspot/jtreg/containers/docker/TestMemoryInvisibleParent.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/containers/docker/TestMemoryInvisibleParent.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/containers/docker/TestMemoryInvisibleParent.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2025, IBM Corporation. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import jdk.test.lib.Container;
+import jdk.test.lib.containers.docker.Common;
+import jdk.test.lib.containers.docker.DockerTestUtils;
+import jdk.test.lib.containers.docker.ContainerRuntimeVersionTestUtils;
+import jdk.test.lib.containers.docker.DockerRunOptions;
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.internal.platform.Metrics;
+
+import java.nio.file.Path;
+import java.nio.file.Files;
+import java.util.ArrayList;
+
+import jtreg.SkippedException;
+
+/*
+ * @test
+ * @bug 8370966
+ * @requires os.family == "linux"
+ * @requires !vm.asan
+ * @modules java.base/jdk.internal.platform
+ * @library /test/lib
+ * @run main TestMemoryInvisibleParent
+ */
+public class TestMemoryInvisibleParent {
+    private static final String UNLIMITED = "-1";
+    private static final String imageName = Common.imageName("invisible-parent");
+
+    public static void main(String[] args) throws Exception {
+        Metrics metrics = Metrics.systemMetrics();
+        if (metrics == null) {
+            System.out.println("Cgroup not configured.");
+            return;
+        }
+        if (!DockerTestUtils.canTestDocker()) {
+            System.out.println("Unable to run docker tests.");
+            return;
+        }
+
+        ContainerRuntimeVersionTestUtils.checkContainerVersionSupported();
+
+        if (DockerTestUtils.isRootless()) {
+            throw new SkippedException("Test skipped in rootless mode");
+        }
+        DockerTestUtils.buildJdkContainerImage(imageName);
+
+        if ("cgroupv1".equals(metrics.getProvider())) {
+            try {
+                testMemoryLimitHiddenParent("104857600", "104857600");
+                testMemoryLimitHiddenParent("209715200", "209715200");
+            } finally {
+                DockerTestUtils.removeDockerImage(imageName);
+            }
+        } else {
+            throw new SkippedException("cgroup v1 - only test! This is " + metrics.getProvider());
+        }
+    }
+
+    private static void testMemoryLimitHiddenParent(String valueToSet, String expectedValue)
+            throws Exception {
+
+        Common.logNewTestCase("Cgroup V1 hidden parent memory limit: " + valueToSet);
+
+        try {
+        String cgroupParent = setParentWithLimit(valueToSet);
+        DockerRunOptions opts = new DockerRunOptions(imageName, "/jdk/bin/java", "-version", "-Xlog:os+container=trace");
+        opts.appendTestJavaOptions = false;
+        if (DockerTestUtils.isPodman()) {
+            // Podman needs to run this test with engine option --cgroup-manager=cgroupfs
+            opts.addEngineOpts("--cgroup-manager", "cgroupfs");
+        }
+        opts.addDockerOpts("--cgroup-parent=/" + cgroupParent);
+        Common.run(opts)
+              .shouldContain("Hierarchical Memory Limit is: " + expectedValue);
+        } finally {
+            // Reset the parent memory limit to unlimited (-1)
+            setParentWithLimit(UNLIMITED);
+        }
+    }
+
+    private static String setParentWithLimit(String memLimit) throws Exception {
+        String cgroupParent = "hidden-parent-" + TestMemoryInvisibleParent.class.getSimpleName() + Runtime.version().feature();
+        Path sysFsMemory = Path.of("/", "sys", "fs", "cgroup", "memory");
+        Path cgroupParentPath = sysFsMemory.resolve(cgroupParent);
+        ProcessBuilder pb = new ProcessBuilder("mkdir", "-p", cgroupParentPath.toString());
+        OutputAnalyzer out = new OutputAnalyzer(pb.start())
+            .shouldHaveExitValue(0);
+        Path memoryLimitsFile = cgroupParentPath.resolve("memory.limit_in_bytes");
+        Files.writeString(memoryLimitsFile, memLimit);
+        System.out.println("Cgroup parent is: /" + cgroupParentPath.getFileName() +
+                           " at " + sysFsMemory.toString());
+        return cgroupParent;
+    }
+
+}
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java openjdk-21-21.0.11+10/test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/containers/docker/TestMemoryWithSubgroups.java	2026-04-17 19:09:35.000000000 +0000
@@ -45,19 +45,6 @@
 public class TestMemoryWithSubgroups {
     private static final String imageName = Common.imageName("subgroup");
 
-    static String getEngineInfo(String format) throws Exception {
-        return DockerTestUtils.execute(Container.ENGINE_COMMAND, "info", "-f", format)
-            .getStdout();
-    }
-
-    static boolean isRootless() throws Exception {
-        // Docker and Podman have different INFO structures.
-        // The node path for Podman is .Host.Security.Rootless, that also holds for
-        // Podman emulating Docker CLI. The node path for Docker is .SecurityOptions.
-        return (getEngineInfo("{{.Host.Security.Rootless}}").contains("true") ||
-                getEngineInfo("{{.SecurityOptions}}").contains("name=rootless"));
-    }
-
     public static void main(String[] args) throws Exception {
         Metrics metrics = Metrics.systemMetrics();
         if (metrics == null) {
@@ -71,7 +58,7 @@
 
         ContainerRuntimeVersionTestUtils.checkContainerVersionSupported();
 
-        if (isRootless()) {
+        if (DockerTestUtils.isRootless()) {
             throw new SkippedException("Test skipped in rootless mode");
         }
         Common.prepareWhiteBox();
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/containers/docker/TestPids.java openjdk-21-21.0.11+10/test/hotspot/jtreg/containers/docker/TestPids.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/containers/docker/TestPids.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/containers/docker/TestPids.java	2026-04-17 19:09:35.000000000 +0000
@@ -47,7 +47,7 @@
 
 public class TestPids {
     private static final String imageName = Common.imageName("pids");
-    private static final boolean IS_PODMAN = Container.ENGINE_COMMAND.contains("podman");
+    private static final boolean IS_PODMAN = DockerTestUtils.isPodman();
     private static final int UNLIMITED_PIDS_PODMAN = 0;
     private static final int UNLIMITED_PIDS_DOCKER = -1;
 
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/containers/systemd/SystemdMemoryAwarenessTest.java openjdk-21-21.0.11+10/test/hotspot/jtreg/containers/systemd/SystemdMemoryAwarenessTest.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/containers/systemd/SystemdMemoryAwarenessTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/containers/systemd/SystemdMemoryAwarenessTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2024, Red Hat, Inc.
+ * Copyright (c) 2024, 2025, Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -68,14 +68,14 @@
 
         OutputAnalyzer out = SystemdTestUtils.buildAndRunSystemdJava(opts);
         out.shouldHaveExitValue(0)
-           .shouldContain("Hello Systemd")
-           .shouldContain(String.format("Memory Limit is: %d", (expectedMemLimit * MB)));
+           .shouldContain("Hello Systemd");
         try {
+            out.shouldContain(String.format("Memory Limit is: %d", (expectedMemLimit * MB)));
             out.shouldContain("OSContainer::active_processor_count: " + coreLimit);
         } catch (RuntimeException e) {
-            // CPU delegation needs to be enabled when run as user on cg v2
+            // CPU/memory delegation needs to be enabled when run as user on cg v2
             if (SystemdTestUtils.RUN_AS_USER) {
-                String hint = "When run as user on cg v2 cpu delegation needs to be configured!";
+                String hint = "When run as user on cg v2 cpu/memory delegation needs to be configured!";
                 throw new SkippedException(hint);
             }
             throw e;
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/gc/arguments/TestG1CompressedOops.java openjdk-21-21.0.11+10/test/hotspot/jtreg/gc/arguments/TestG1CompressedOops.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/gc/arguments/TestG1CompressedOops.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/gc/arguments/TestG1CompressedOops.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (C) 2025 THL A29 Limited, a Tencent company. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package gc.arguments;
+
+/*
+ * @test TestG1CompressedOops
+ * @bug 8354145
+ * @requires vm.flagless
+ * @summary Verify that the flag UseCompressedOops is updated properly
+ * @library /test/lib
+ * @library /
+ * @run driver gc.arguments.TestG1CompressedOops
+ */
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import jdk.test.lib.process.OutputAnalyzer;
+
+public class TestG1CompressedOops {
+
+  private static void checkG1CompressedOops(String[] flags, boolean expectedValue, int exitValue) throws Exception {
+    ArrayList flagList = new ArrayList();
+    flagList.addAll(Arrays.asList(flags));
+    flagList.add("-XX:+UseG1GC");
+    flagList.add("-XX:+PrintFlagsFinal");
+    flagList.add("-version");
+
+    OutputAnalyzer output = GCArguments.executeTestJava(flagList);
+    output.shouldHaveExitValue(exitValue);
+
+    if (exitValue == 0) {
+      String stdout = output.getStdout();
+      boolean flagValue = getFlagValue("UseCompressedOops", stdout);
+      if (flagValue != expectedValue) {
+        throw new RuntimeException("Wrong value for UseCompressedOops. Expected " + expectedValue + " but got " + flagValue);
+      }
+    }
+  }
+
+  private static boolean getFlagValue(String flag, String where) {
+      Matcher m = Pattern.compile(flag + "\\s+:?=\\s+\\D+").matcher(where);
+      if (!m.find()) {
+          throw new RuntimeException("Could not find value for flag " + flag + " in output string");
+      }
+      String match = m.group();
+      return match.contains("true");
+  }
+
+  public static void main(String args[]) throws Exception {
+    checkG1CompressedOops(new String[] { "-Xmx64m"   /* default is 1m */        }, true, 0);
+    checkG1CompressedOops(new String[] { "-Xmx64m",  "-XX:G1HeapRegionSize=2m"  }, true, 0);
+    checkG1CompressedOops(new String[] { "-Xmx32768m" /* 32g will turn off the usecompressedoops */  }, false, 0);
+    checkG1CompressedOops(new String[] { "-Xmx32760m" }, false, 0);
+    checkG1CompressedOops(new String[] { "-Xmx32736m", /* 32g - 32m will turn on the usecomppressedoops */ }, true, 0);
+
+    // if set G1HeapRegionSize explicitly with -Xmx32736m will turn off the UseCompressedOops
+    checkG1CompressedOops(new String[] { "-Xmx32736m", "-XX:G1HeapRegionSize=1m" }, false, 0);
+    checkG1CompressedOops(new String[] { "-Xmx32256m", "-XX:G1HeapRegionSize=512m" }, true, 0);
+  }
+}
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/gc/g1/TestEvacuationFailure.java openjdk-21-21.0.11+10/test/hotspot/jtreg/gc/g1/TestEvacuationFailure.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/gc/g1/TestEvacuationFailure.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/gc/g1/TestEvacuationFailure.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,10 +31,7 @@
  * @library /test/lib
  * @modules java.base/jdk.internal.misc
  *          java.management
- * @build jdk.test.whitebox.WhiteBox
- * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
- *                   gc.g1.TestEvacuationFailure
+ * @run driver gc.g1.TestEvacuationFailure
  */
 
 import jdk.test.lib.process.OutputAnalyzer;
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/runtime/Safepoint/TestAbortOnVMOperationTimeout.java openjdk-21-21.0.11+10/test/hotspot/jtreg/runtime/Safepoint/TestAbortOnVMOperationTimeout.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/runtime/Safepoint/TestAbortOnVMOperationTimeout.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/runtime/Safepoint/TestAbortOnVMOperationTimeout.java	2026-04-17 19:09:35.000000000 +0000
@@ -68,6 +68,7 @@
                 "-XX:+AbortVMOnVMOperationTimeout",
                 "-XX:AbortVMOnVMOperationTimeoutDelay=" + delay,
                 "-Xmx256m",
+                "-XX:NewSize=64m",
                 "-XX:+UseSerialGC",
                 "-XX:-CreateCoredumpOnCrash",
                 "-Xlog:gc*=info",
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/runtime/Thread/AsyncExceptionOnMonitorEnter.java openjdk-21-21.0.11+10/test/hotspot/jtreg/runtime/Thread/AsyncExceptionOnMonitorEnter.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/runtime/Thread/AsyncExceptionOnMonitorEnter.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/runtime/Thread/AsyncExceptionOnMonitorEnter.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,7 +26,7 @@
  * @bug 8283044
  * @summary Stress delivery of asynchronous exceptions while target is at monitorenter
  * @library /test/hotspot/jtreg/testlibrary
- * @run main/othervm AsyncExceptionOnMonitorEnter 0
+ * @run main/othervm/native AsyncExceptionOnMonitorEnter 0
  * @run main/othervm/native -agentlib:AsyncExceptionOnMonitorEnter AsyncExceptionOnMonitorEnter 1
  */
 
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/runtime/Thread/AsyncExceptionTest.java openjdk-21-21.0.11+10/test/hotspot/jtreg/runtime/Thread/AsyncExceptionTest.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/runtime/Thread/AsyncExceptionTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/runtime/Thread/AsyncExceptionTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -27,7 +27,7 @@
  * @requires vm.compiler1.enabled | vm.compiler2.enabled
  * @summary Stress delivery of asynchronous exceptions.
  * @library /test/hotspot/jtreg/testlibrary
- * @run main/othervm -Xcomp
+ * @run main/othervm/native -Xcomp
                      -XX:CompileCommand=dontinline,AsyncExceptionTest::internalRun2
                      -XX:CompileCommand=compileonly,AsyncExceptionTest::internalRun1
                      -XX:CompileCommand=compileonly,AsyncExceptionTest::internalRun2
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/runtime/Thread/TestBreakSignalThreadDump.java openjdk-21-21.0.11+10/test/hotspot/jtreg/runtime/Thread/TestBreakSignalThreadDump.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/runtime/Thread/TestBreakSignalThreadDump.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/runtime/Thread/TestBreakSignalThreadDump.java	2026-04-17 19:09:35.000000000 +0000
@@ -28,7 +28,7 @@
  * @summary Check that Ctrl-\ or Ctrl-Break (on Windows) causes HotSpot VM to print a full thread dump.
  * @library /vmTestbase
  *          /test/lib
- * @run driver TestBreakSignalThreadDump
+ * @run main/native TestBreakSignalThreadDump
  */
 
 /*
@@ -40,7 +40,7 @@
  * @requires !vm.asan
  * @library /vmTestbase
  *          /test/lib
- * @run driver TestBreakSignalThreadDump load_libjsig
+ * @run main/native TestBreakSignalThreadDump load_libjsig
  */
 
 import java.nio.file.Files;
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/runtime/Thread/ThreadCountLimit.java openjdk-21-21.0.11+10/test/hotspot/jtreg/runtime/Thread/ThreadCountLimit.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/runtime/Thread/ThreadCountLimit.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/runtime/Thread/ThreadCountLimit.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
  * @summary Stress test that reaches the process limit for thread count, or time limit.
  * @requires os.family != "aix"
  * @key stress
+ * @library /test/lib
  * @run main/othervm -Xmx1g ThreadCountLimit
  */
 
@@ -34,12 +35,17 @@
  * @summary Stress test that reaches the process limit for thread count, or time limit.
  * @requires os.family == "aix"
  * @key stress
+ * @library /test/lib
  * @run main/othervm -Xmx1g -XX:MaxExpectedDataSegmentSize=16g ThreadCountLimit
  */
 
 import java.util.concurrent.CountDownLatch;
 import java.util.ArrayList;
 
+import jdk.test.lib.Platform;
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.process.ProcessTools;
+
 public class ThreadCountLimit {
 
   static final int TIME_LIMIT_MS = 5000; // Create as many threads as possible in 5 sec
@@ -61,21 +67,55 @@
     }
   }
 
-  public static void main(String[] args) {
+  public static void main(String[] args) throws Exception {
+    if (args.length == 0) {
+      // Called from the driver process so exec a new JVM on Linux.
+      if (Platform.isLinux()) {
+        // On Linux this test sometimes hits the limit for the maximum number of memory mappings,
+        // which leads to various other failure modes. Run this test with a limit on how many
+        // threads the process is allowed to create, so we hit that limit first. What we want is
+        // for another "limit" processes to be available, but ulimit doesn't work that way and
+        // if there are already many running processes we could fail to even start the JVM properly.
+        // So we loop increasing the limit until we get a successful run. This is not foolproof.
+        int pLimit = 4096;
+        final String ULIMIT_CMD = "ulimit -u ";
+        ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder(ThreadCountLimit.class.getName());
+        String javaCmd = ProcessTools.getCommandLine(pb);
+        for (int i = 1; i <= 10; i++) {
+            // Relaunch the test with args.length > 0, and the ulimit set
+            String cmd = ULIMIT_CMD + Integer.toString(pLimit * i) + " && " + javaCmd + " dummy";
+            System.out.println("Trying: bash -c " + cmd);
+            OutputAnalyzer oa = ProcessTools.executeCommand("bash", "-c", cmd);
+            int exitValue = oa.getExitValue();
+            switch (exitValue) {
+              case 0: System.out.println("Success!"); return;
+              case 1: System.out.println("Retry ..."); continue;
+              default: oa.shouldHaveExitValue(0); // generate error report
+            }
+        }
+        throw new Error("Failed to perform a successful run!");
+      } else {
+        // Not Linux so run directly.
+        test();
+      }
+    } else {
+      // This is the exec'd process so run directly.
+      test();
+    }
+  }
+
+  static void test() {
     CountDownLatch startSignal = new CountDownLatch(1);
     ArrayList workers = new ArrayList();
 
-    boolean reachedTimeLimit = false;
     boolean reachedNativeOOM = false;
-    int countAtTimeLimit = -1;
-    int countAtNativeOOM = -1;
 
     // This is dangerous loop: it depletes system resources,
     // so doing additional things there that may end up allocating
     // Java/native memory risks failing the VM prematurely.
     // Avoid doing unnecessary calls, printouts, etc.
 
-    int count = 1;
+    int count = 0;
     long start = System.currentTimeMillis();
     try {
       while (true) {
@@ -86,16 +126,15 @@
 
         long end = System.currentTimeMillis();
         if ((end - start) > TIME_LIMIT_MS) {
-          reachedTimeLimit = true;
-          countAtTimeLimit = count;
+          // Windows always gets here, but we also get here if
+          // ulimit is set high enough.
           break;
         }
       }
     } catch (OutOfMemoryError e) {
       if (e.getMessage().contains("unable to create native thread")) {
-        // Linux, macOS path
+        // Linux, macOS path if we hit ulimit
         reachedNativeOOM = true;
-        countAtNativeOOM = count;
       } else {
         throw e;
       }
@@ -113,13 +152,12 @@
 
     // Now that all threads have joined, we are away from dangerous
     // VM state and have enough memory to perform any other things.
-    if (reachedTimeLimit) {
-       // Windows path or a system with very large ulimit
-       System.out.println("INFO: reached the time limit " + TIME_LIMIT_MS +
-                          " ms, with " + countAtTimeLimit + " threads created");
-    } else if (reachedNativeOOM) {
-       System.out.println("INFO: reached this process thread count limit with " +
-                           countAtNativeOOM + " threads created");
+    if (reachedNativeOOM) {
+      System.out.println("INFO: reached this process thread count limit with " +
+                         count + " threads created");
+    } else {
+      System.out.println("INFO: reached the time limit " + TIME_LIMIT_MS +
+                         " ms, with " + count + " threads created");
     }
   }
 }
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/runtime/handshake/HandshakeTimeoutTest.java openjdk-21-21.0.11+10/test/hotspot/jtreg/runtime/handshake/HandshakeTimeoutTest.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/runtime/handshake/HandshakeTimeoutTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/runtime/handshake/HandshakeTimeoutTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -36,7 +36,7 @@
  * @library /testlibrary /test/lib
  * @build HandshakeTimeoutTest
  * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox
- * @run driver HandshakeTimeoutTest
+ * @run driver/timeout=480 HandshakeTimeoutTest
  */
 
 public class HandshakeTimeoutTest {
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/testlibrary/jittester/conf/default.properties openjdk-21-21.0.11+10/test/hotspot/jtreg/testlibrary/jittester/conf/default.properties
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/testlibrary/jittester/conf/default.properties	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/testlibrary/jittester/conf/default.properties	2026-04-17 19:09:35.000000000 +0000
@@ -8,6 +8,6 @@
 exclude-methods-file=conf/exclude.methods.lst
 print-complexity=true
 print-hierarchy=true
-disable-static=true
+disable-static=false
 generatorsFactories=jdk.test.lib.jittester.TestGeneratorsFactory
 generators=JavaCode,ByteCode
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/factories/StaticConstructorDefinitionFactory.java openjdk-21-21.0.11+10/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/factories/StaticConstructorDefinitionFactory.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/factories/StaticConstructorDefinitionFactory.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/testlibrary/jittester/src/jdk/test/lib/jittester/factories/StaticConstructorDefinitionFactory.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -63,7 +63,7 @@
                     .setOperatorLimit(operatorLimit)
                     .setLevel(level)
                     .setSubBlock(true)
-                    .setCanHaveBreaks(true)
+                    .setCanHaveBreaks(false)
                     .setCanHaveContinues(false)
                     .setCanHaveReturn(false)
                     .getBlockFactory()
diff -Nru openjdk-21-21.0.10+7/test/hotspot/jtreg/vmTestbase/nsk/share/gc/GC.java openjdk-21-21.0.11+10/test/hotspot/jtreg/vmTestbase/nsk/share/gc/GC.java
--- openjdk-21-21.0.10+7/test/hotspot/jtreg/vmTestbase/nsk/share/gc/GC.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/hotspot/jtreg/vmTestbase/nsk/share/gc/GC.java	2026-04-17 19:09:35.000000000 +0000
@@ -48,6 +48,9 @@
 
                 public GCTestRunner(Test test, String[] args) {
                         super(test, args);
+                        // GC tests often run at the brink of OOME, make sure
+                        // LocalRandom is loaded, initialized, and has enough memory.
+                        LocalRandom.init();
                 }
 
                 private GCParams getGCParams(String[] args) {
diff -Nru openjdk-21-21.0.10+7/test/jaxp/TEST.ROOT openjdk-21-21.0.11+10/test/jaxp/TEST.ROOT
--- openjdk-21-21.0.10+7/test/jaxp/TEST.ROOT	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jaxp/TEST.ROOT	2026-04-17 19:09:35.000000000 +0000
@@ -23,7 +23,7 @@
 groups=TEST.groups
 
 # Minimum jtreg version
-requiredVersion=7.3.1+1
+requiredVersion=7.5.2+1
 
 # Path to libraries in the topmost test directory. This is needed so @library
 # does not need ../../ notation to reach them
diff -Nru openjdk-21-21.0.10+7/test/jdk/ProblemList-Virtual.txt openjdk-21-21.0.11+10/test/jdk/ProblemList-Virtual.txt
--- openjdk-21-21.0.10+7/test/jdk/ProblemList-Virtual.txt	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/ProblemList-Virtual.txt	2026-04-17 19:09:35.000000000 +0000
@@ -72,3 +72,6 @@
 javax/management/ImplementationVersion/ImplVersionTest.java 0000000 generic-all
 javax/management/remote/mandatory/subjectDelegation/SubjectDelegation1Test.java 0000000 generic-all
 javax/management/remote/mandatory/version/ImplVersionTest.java 0000000 generic-all
+
+# Direct buffer memory allocated before test launch
+java/nio/Buffer/LimitDirectMemory.java 8342849 generic-all
diff -Nru openjdk-21-21.0.10+7/test/jdk/ProblemList.txt openjdk-21-21.0.11+10/test/jdk/ProblemList.txt
--- openjdk-21-21.0.10+7/test/jdk/ProblemList.txt	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/ProblemList.txt	2026-04-17 19:09:35.000000000 +0000
@@ -177,7 +177,7 @@
 java/awt/Mixing/AWT_Mixing/JSliderOverlapping.java 8158801 windows-all
 java/awt/Mixing/AWT_Mixing/JSpinnerInGlassPaneOverlapping.java 8158801 windows-all
 java/awt/Mixing/AWT_Mixing/JSpinnerOverlapping.java 8158801 windows-all
-java/awt/Mixing/AWT_Mixing/JTableInGlassPaneOverlapping.java 8158801 windows-all
+java/awt/Mixing/AWT_Mixing/JTableInGlassPaneOverlapping.java 8158801,8357360 windows-all,linux-all
 java/awt/Mixing/AWT_Mixing/JTableOverlapping.java 8158801 windows-all
 java/awt/Mixing/AWT_Mixing/JTextAreaInGlassPaneOverlapping.java 8158801 windows-all
 java/awt/Mixing/AWT_Mixing/JTextAreaOverlapping.java 8158801 windows-all
@@ -197,6 +197,7 @@
 java/awt/EventDispatchThread/HandleExceptionOnEDT/HandleExceptionOnEDT.java 8072110 macosx-all
 java/awt/EventDispatchThread/LoopRobustness/LoopRobustness.java 8073636 macosx-all
 java/awt/FullScreen/FullScreenInsets/FullScreenInsets.java 7019055,8266245 windows-all,linux-all,macosx-all
+java/awt/FullScreen/BufferStrategyExceptionTest/BufferStrategyExceptionTest.java 8246558 windows-all
 java/awt/Focus/8013611/JDK8013611.java 8175366 windows-all,macosx-all
 java/awt/Focus/6981400/Test1.java 8029675 windows-all,macosx-all
 java/awt/Focus/6981400/Test3.java 8173264 generic-all
@@ -546,8 +547,6 @@
 
 # jdk_management
 
-com/sun/management/OperatingSystemMXBean/GetProcessCpuLoad.java 8030957 aix-all
-com/sun/management/OperatingSystemMXBean/GetSystemCpuLoad.java  8030957 aix-all
 
 java/lang/management/MemoryMXBean/Pending.java                  8158837 generic-all
 java/lang/management/MemoryMXBean/PendingAllGC.sh               8158837 generic-all
@@ -562,7 +561,6 @@
 
 # jdk_jmx
 
-javax/management/MBeanServer/OldMBeanServerTest.java            8030957 aix-all
 
 javax/management/remote/mandatory/connection/RMIConnector_NPETest.java 8267887 generic-all
 
@@ -589,14 +587,10 @@
 java/net/MulticastSocket/SetOutgoingIf.java                     8308807 aix-ppc64
 java/net/MulticastSocket/Test.java                              7145658,8308807 macosx-all,aix-ppc64
 
-java/net/Socket/asyncClose/Race.java                            8317801 aix-ppc64
-
 ############################################################################
 
 # jdk_nio
 
-java/nio/channels/Channels/SocketChannelStreams.java            8317838 aix-ppc64
-
 java/nio/channels/DatagramChannel/AdaptorMulticasting.java      8144003,8308807 macosx-all,aix-ppc64
 java/nio/channels/DatagramChannel/AfterDisconnect.java          8308807 aix-ppc64
 java/nio/channels/DatagramChannel/BasicMulticastTests.java      8144003 macosx-all
@@ -697,7 +691,6 @@
 javax/swing/JPopupMenu/4870644/bug4870644.java 8194130 macosx-all,linux-all
 javax/swing/dnd/8139050/NativeErrorsInTableDnD.java 8202765  macosx-all,linux-all
 javax/swing/JEditorPane/6917744/bug6917744.java 8213124 macosx-all
-javax/swing/JRadioButton/4314194/bug4314194.java 8298153 linux-all
 
 # Several tests which fail on some hidpi systems/macosx12-aarch64 system
 javax/swing/JFrame/8175301/ScaledFrameBackgroundTest.java 8274106 macosx-aarch64
@@ -829,7 +822,6 @@
 java/awt/TextComponent/CorrectTextComponentSelectionTest.java 8237220 macosx-all
 java/awt/TextComponent/SelectionAndCaretColor.java 7017622 linux-all
 java/awt/event/MouseEvent/SpuriousExitEnter/SpuriousExitEnter.java 8254841 macosx-all
-java/awt/Focus/AppletInitialFocusTest/AppletInitialFocusTest1.java 8256289 windows-x64
 java/awt/FullScreen/TranslucentWindow/TranslucentWindow.java 8258103 linux-all
 java/awt/Focus/FrameMinimizeTest/FrameMinimizeTest.java 8016266 linux-x64
 java/awt/Frame/SizeMinimizedTest.java 8305915 linux-x64
diff -Nru openjdk-21-21.0.10+7/test/jdk/TEST.ROOT openjdk-21-21.0.11+10/test/jdk/TEST.ROOT
--- openjdk-21-21.0.10+7/test/jdk/TEST.ROOT	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/TEST.ROOT	2026-04-17 19:09:35.000000000 +0000
@@ -115,7 +115,7 @@
     jdk.foreign.linker
 
 # Minimum jtreg version
-requiredVersion=7.3.1+1
+requiredVersion=7.5.2+1
 
 # Path to libraries in the topmost test directory. This is needed so @library
 # does not need ../../ notation to reach them
diff -Nru openjdk-21-21.0.10+7/test/jdk/com/sun/jdi/JdbStopInNotificationThreadTest.java openjdk-21-21.0.11+10/test/jdk/com/sun/jdi/JdbStopInNotificationThreadTest.java
--- openjdk-21-21.0.10+7/test/jdk/com/sun/jdi/JdbStopInNotificationThreadTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/com/sun/jdi/JdbStopInNotificationThreadTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -113,9 +113,11 @@
     private static final String DEBUGGEE_CLASS = JdbStopInNotificationThreadTestTarg.class.getName();
     private static final String PATTERN1_TEMPLATE = "^Breakpoint hit: \"thread=Notification Thread\", " +
             "JdbStopInNotificationThreadTestTarg\\$1\\.handleNotification\\(\\), line=%LINE_NUMBER.*\\R%LINE_NUMBER\\s+System\\.out\\.println\\(\"Memory usage low!!!\"\\);.*";
+    private static final String[] DEBUGGEE_OPTIONS = {"-Xmx256M"};
 
     private JdbStopInNotificationThreadTest() {
-        super(DEBUGGEE_CLASS);
+        super(new LaunchOptions(DEBUGGEE_CLASS)
+                .addDebuggeeOptions(DEBUGGEE_OPTIONS));
     }
 
     public static void main(String argv[]) {
diff -Nru openjdk-21-21.0.10+7/test/jdk/com/sun/jdi/TwoThreadsTest.java openjdk-21-21.0.11+10/test/jdk/com/sun/jdi/TwoThreadsTest.java
--- openjdk-21-21.0.10+7/test/jdk/com/sun/jdi/TwoThreadsTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/com/sun/jdi/TwoThreadsTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -55,6 +55,13 @@
 
         t1.start();
         t2.start();
+        // The threads might be virtual and daemon, so wait until completion.
+        try {
+            t1.join();
+            t2.join();
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
     }
 
 
diff -Nru openjdk-21-21.0.10+7/test/jdk/com/sun/jndi/ldap/LdapPoolTimeoutTest.java openjdk-21-21.0.11+10/test/jdk/com/sun/jndi/ldap/LdapPoolTimeoutTest.java
--- openjdk-21-21.0.10+7/test/jdk/com/sun/jndi/ldap/LdapPoolTimeoutTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/com/sun/jndi/ldap/LdapPoolTimeoutTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -30,13 +30,13 @@
  * @run testng/othervm LdapPoolTimeoutTest
  */
 
-import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import java.io.IOException;
 import javax.naming.Context;
 import javax.naming.NamingException;
 import javax.naming.directory.InitialDirContext;
+
+import java.net.SocketTimeoutException;
 import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
@@ -44,13 +44,8 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.TimeUnit;
 
 import static jdk.test.lib.Utils.adjustTimeout;
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.expectThrows;
 
 public class LdapPoolTimeoutTest {
     /*
@@ -89,24 +84,21 @@
         env.put(Context.PROVIDER_URL, "ldap://example.com:1234");
 
         try {
-            futures.add(executorService.submit(() -> { attemptConnect(env); return null; }));
-            futures.add(executorService.submit(() -> { attemptConnect(env); return null; }));
-            futures.add(executorService.submit(() -> { attemptConnect(env); return null; }));
-            futures.add(executorService.submit(() -> { attemptConnect(env); return null; }));
-            futures.add(executorService.submit(() -> { attemptConnect(env); return null; }));
-            futures.add(executorService.submit(() -> { attemptConnect(env); return null; }));
-            futures.add(executorService.submit(() -> { attemptConnect(env); return null; }));
-            futures.add(executorService.submit(() -> { attemptConnect(env); return null; }));
+            // launch a few concurrent connection attempts
+            for (int i = 0; i < 8; i++) {
+                futures.add(executorService.submit(() -> { attemptConnect(env); return null; }));
+            }
         } finally {
             executorService.shutdown();
         }
         int failedCount = 0;
-        for (var f : futures) {
+        for (int i = 0; i < futures.size(); i++) {
             try {
-                f.get();
+                futures.get(i).get();
             } catch (ExecutionException e) {
                 failedCount++;
-                e.getCause().printStackTrace(System.out);
+                System.err.println("task " + (i + 1) + " failed:");
+                e.getCause().printStackTrace();
             }
         }
         if (failedCount > 0)
@@ -115,27 +107,56 @@
 
     private static void attemptConnect(Hashtable env) throws Exception {
         try {
-            LdapTimeoutTest.assertCompletion(CONNECT_MILLIS - 1000,
-                   2 * CONNECT_MILLIS + TOLERANCE,
-                   () -> new InitialDirContext(env));
-        } catch (RuntimeException e) {
-            String msg = e.getCause() == null ? e.getMessage() : e.getCause().getMessage();
-            System.err.println("MSG RTE: " + msg);
-            // assertCompletion may wrap a CommunicationException in an RTE
-            assertNotNull(msg);
-            assertTrue(msg.contains("Network is unreachable")
-                        || msg.contains("No route to host") || msg.contains("Connection timed out"));
-        } catch (NamingException ex) {
-            String msg = ex.getCause() == null ? ex.getMessage() : ex.getCause().getMessage();
-            System.err.println("MSG: " + msg);
-            assertTrue(msg != null &&
-                    (msg.contains("Network is unreachable")
-                        || msg.contains("Timed out waiting for lock")
-                        || msg.contains("Connect timed out")
-                        || msg.contains("Timeout exceeded while waiting for a connection")));
+            final InitialDirContext unexpectedCtx =
+                    LdapTimeoutTest.assertCompletion(CONNECT_MILLIS - 1000,
+                            2 * CONNECT_MILLIS + TOLERANCE,
+                            () -> new InitialDirContext(env));
+            throw new RuntimeException("InitialDirContext construction was expected to fail," +
+                    " but returned " + unexpectedCtx);
         } catch (Throwable t) {
-            throw new RuntimeException(t);
+            final NamingException namingEx = findNamingException(t);
+            if (namingEx != null) {
+                // found the NamingException, verify it's the right reason
+                if (namingEx.getCause() instanceof SocketTimeoutException ste) {
+                    // got the expected exception
+                    System.out.println("Received expected SocketTimeoutException: " + ste);
+                    return;
+                }
+                // rely on the exception message to verify the expected exception
+                final String msg = namingEx.getCause() == null
+                        ? namingEx.getMessage()
+                        : namingEx.getCause().getMessage();
+                if (msg != null &&
+                        (msg.contains("Network is unreachable")
+                                || msg.contains("No route to host")
+                                || msg.contains("Timed out waiting for lock")
+                                || msg.contains("Connect timed out")
+                                || msg.contains("Connection timed out")
+                                || msg.contains("Timeout exceeded while waiting for a connection"))) {
+                    // got the expected exception
+                    System.out.println("Received expected NamingException with message: " + msg);
+                    return;
+                }
+            }
+            // unexpected exception, propagate it
+            if (t instanceof Exception e) {
+                throw e;
+            } else {
+                throw new Exception(t);
+            }
+        }
+    }
+
+    // Find and return the NamingException from the given Throwable. Returns null if none found.
+    private static NamingException findNamingException(final Throwable t) {
+        Throwable cause = t;
+        while (cause != null) {
+            if (cause instanceof NamingException ne) {
+                return ne;
+            }
+            cause = cause.getCause();
         }
+        return null;
     }
 
 }
diff -Nru openjdk-21-21.0.10+7/test/jdk/com/sun/tools/attach/java.policy.allow openjdk-21-21.0.11+10/test/jdk/com/sun/tools/attach/java.policy.allow
--- openjdk-21-21.0.10+7/test/jdk/com/sun/tools/attach/java.policy.allow	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/com/sun/tools/attach/java.policy.allow	2026-04-17 19:09:35.000000000 +0000
@@ -1,6 +1,4 @@
 /*
- *
- *
  * Policy file used by unit tests for attach API
  */
 grant {
@@ -15,7 +13,10 @@
     permission java.lang.RuntimePermission "loadLibrary.attach";
     permission java.util.PropertyPermission "sun.jvmstat.*", "read";
 
-    /* to read configuration file in META-INF/services, and write/delete .attach_pid */
-    permission java.io.FilePermission "<>", "read,write,delete";
+    /* 
+     * To read configuration file in META-INF/services, write/delete .attach_pid, 
+     * and read symbolic link of /proc/self/ns/mnt.
+     */
+    permission java.io.FilePermission "<>", "read,write,delete,readlink";
 };
 
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/Focus/AppletInitialFocusTest/AppletInitialFocusTest.java openjdk-21-21.0.11+10/test/jdk/java/awt/Focus/AppletInitialFocusTest/AppletInitialFocusTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/awt/Focus/AppletInitialFocusTest/AppletInitialFocusTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/Focus/AppletInitialFocusTest/AppletInitialFocusTest.java	1970-01-01 00:00:00.000000000 +0000
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
-  @test
-  @key headful
-  @bug 4041703 4096228 4025223 4260929
-  @summary Ensures that appletviewer sets a reasonable default focus for an Applet on start
-  @library ../../regtesthelpers
-  @build   Util
-  @run main AppletInitialFocusTest
-*/
-
-import java.awt.Button;
-import java.awt.FlowLayout;
-import java.awt.Frame;
-import java.awt.Robot;
-import test.java.awt.regtesthelpers.Util;
-
-public class AppletInitialFocusTest extends Frame {
-
-    Robot robot = Util.createRobot();
-    Button button = new Button("Button");
-
-    public static void main(final String[] args) throws Exception {
-        AppletInitialFocusTest app = new AppletInitialFocusTest();
-        app.init();
-        app.start();
-    }
-
-    public void init() {
-        setSize(200, 200);
-        setLocationRelativeTo(null);
-        setLayout(new FlowLayout());
-        add(button);
-        setVisible(true);
-    }
-
-    public void start() throws Exception {
-        Thread thread = new Thread(new Runnable() {
-                public void run() {
-                    Util.waitTillShown(button);
-                    robot.delay(1000); // delay the thread to let EDT to start dispatching focus events
-                    Util.waitForIdle(robot);
-                    if (!button.hasFocus()) {
-                        throw new RuntimeException("Appletviewer doesn't set default focus correctly.");
-                    }
-                }
-            });
-        thread.start();
-        thread.join();
-    }
-}
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/Focus/AppletInitialFocusTest/AppletInitialFocusTest1.java openjdk-21-21.0.11+10/test/jdk/java/awt/Focus/AppletInitialFocusTest/AppletInitialFocusTest1.java
--- openjdk-21-21.0.10+7/test/jdk/java/awt/Focus/AppletInitialFocusTest/AppletInitialFocusTest1.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/Focus/AppletInitialFocusTest/AppletInitialFocusTest1.java	1970-01-01 00:00:00.000000000 +0000
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2008, 2020, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import java.awt.Button;
-import java.awt.FlowLayout;
-import java.awt.Frame;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
-
-/**
- * @test
- * @key headful
- * @bug 4411534 4517274
- * @summary ensures that user's requestFocus() during applet initialization
- *          is not ignored
- */
-public class AppletInitialFocusTest1 extends Frame implements FocusListener {
-
-    Button button1 = new Button("Button1");
-    Button button2 = new Button("Button2");
-    private static volatile Object focused;
-
-    public static void main(final String[] args) throws Exception {
-        AppletInitialFocusTest1 app = new AppletInitialFocusTest1();
-        try {
-            app.setSize(200, 200);
-            app.setLocationRelativeTo(null);
-            app.setLayout(new FlowLayout());
-
-            app.button1.addFocusListener(app);
-            app.button2.addFocusListener(app);
-            app.add(app.button1);
-            app.add(app.button2);
-            app.setVisible(true);
-            app.button2.requestFocus();
-            // wait for the very very last focus event
-            Thread.sleep(10000);
-            if (app.button2 != focused) {
-                throw new RuntimeException("Wrong focus owner: " + focused);
-            }
-        } finally {
-            app.dispose();
-        }
-    }
-
-    public void focusGained(FocusEvent e) {
-        focused = e.getSource();
-        System.out.println("focused = " + focused);
-    }
-
-    public void focusLost(FocusEvent e) {
-    }
-}
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/Focus/InitialFocusTest/InitialFocusTest.java openjdk-21-21.0.11+10/test/jdk/java/awt/Focus/InitialFocusTest/InitialFocusTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/awt/Focus/InitialFocusTest/InitialFocusTest.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/Focus/InitialFocusTest/InitialFocusTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2008, 2025, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+  @test
+  @key headful
+  @bug 4041703 4096228 4025223 4260929
+  @summary Ensures that reasonable default focus is set correctly on start
+  @library ../../regtesthelpers
+  @build   Util
+  @run main InitialFocusTest
+*/
+
+import java.awt.Button;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.Robot;
+import test.java.awt.regtesthelpers.Util;
+
+public class InitialFocusTest extends Frame {
+
+    Robot robot = Util.createRobot();
+    Button button = new Button("Button");
+
+    public static void main(final String[] args) throws Exception {
+        InitialFocusTest app = new InitialFocusTest();
+        app.init();
+        app.start();
+    }
+
+    public void init() {
+        setSize(200, 200);
+        setLocationRelativeTo(null);
+        setLayout(new FlowLayout());
+        add(button);
+        setVisible(true);
+    }
+
+    public void start() throws Exception {
+        Thread thread = new Thread(new Runnable() {
+                public void run() {
+                    Util.waitTillShown(button);
+                    robot.delay(1000); // delay the thread to let EDT to start dispatching focus events
+                    Util.waitForIdle(robot);
+                    if (!button.hasFocus()) {
+                        throw new RuntimeException("default focus is not set correctly.");
+                    }
+                }
+            });
+        thread.start();
+        thread.join();
+    }
+}
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/Focus/InitialFocusTest/InitialFocusTest1.java openjdk-21-21.0.11+10/test/jdk/java/awt/Focus/InitialFocusTest/InitialFocusTest1.java
--- openjdk-21-21.0.10+7/test/jdk/java/awt/Focus/InitialFocusTest/InitialFocusTest1.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/Focus/InitialFocusTest/InitialFocusTest1.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2008, 2025, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Button;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+
+/**
+ * @test
+ * @key headful
+ * @bug 4411534 4517274
+ * @summary ensures that user's requestFocus() during frame initialization
+ *          is not ignored
+ */
+public class InitialFocusTest1 extends Frame implements FocusListener {
+
+    Button button1 = new Button("Button1");
+    Button button2 = new Button("Button2");
+    private static volatile Object focused;
+
+    public static void main(final String[] args) throws Exception {
+        InitialFocusTest1 app = new InitialFocusTest1();
+        try {
+            app.setSize(200, 200);
+            app.setLocationRelativeTo(null);
+            app.setLayout(new FlowLayout());
+
+            app.button1.addFocusListener(app);
+            app.button2.addFocusListener(app);
+            app.add(app.button1);
+            app.add(app.button2);
+            app.setVisible(true);
+            app.button2.requestFocus();
+            // wait for the very very last focus event
+            Thread.sleep(10000);
+            if (app.button2 != focused) {
+                throw new RuntimeException("Wrong focus owner: " + focused);
+            }
+        } finally {
+            app.dispose();
+        }
+    }
+
+    public void focusGained(FocusEvent e) {
+        focused = e.getSource();
+        System.out.println("focused = " + focused);
+    }
+
+    public void focusLost(FocusEvent e) {
+    }
+}
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/Frame/MiscUndecorated/ActiveAWTWindowTest.java openjdk-21-21.0.11+10/test/jdk/java/awt/Frame/MiscUndecorated/ActiveAWTWindowTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/awt/Frame/MiscUndecorated/ActiveAWTWindowTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/Frame/MiscUndecorated/ActiveAWTWindowTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -24,18 +24,22 @@
 /*
  * @test
  * @key headful
- * @summary To check proper WINDOW_EVENTS are triggered when Frame gains or losses the focus
- * @library /lib/client
- * @build ExtendedRobot
+ * @summary To check proper WINDOW_EVENTS are triggered when Frame gains
+ * or loses the focus
  * @run main ActiveAWTWindowTest
  */
 
+import java.awt.AWTException;
 import java.awt.BorderLayout;
 import java.awt.Button;
 import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
 import java.awt.EventQueue;
 import java.awt.FlowLayout;
 import java.awt.Frame;
+import java.awt.Point;
+import java.awt.Robot;
 import java.awt.TextField;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
@@ -43,101 +47,74 @@
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.awt.event.WindowFocusListener;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.swing.JButton;
+import javax.swing.JComponent;
 
 public class ActiveAWTWindowTest {
 
-    private Frame frame, frame2;
-    private Button button, button2;
-    private TextField textField, textField2;
-    private volatile int eventType;
-    private final Object lock1 = new Object();
-    private final Object lock2 = new Object();
-    private final Object lock3 = new Object();
-    private boolean passed = true;
-    private final int delay = 150;
+    private static Frame frame, frame2;
+    private static Button button, button2;
+    private static TextField textField, textField2;
+
+    private static CountDownLatch windowActivatedLatch = new CountDownLatch(1);
+    private static CountDownLatch windowDeactivatedLatch = new CountDownLatch(1);
+    private static CountDownLatch windowFocusGainedLatch = new CountDownLatch(1);
 
     public static void main(String[] args) throws Exception {
-        ActiveAWTWindowTest test = new ActiveAWTWindowTest();
-        try {
-            test.doTest();
-        } finally {
-            EventQueue.invokeAndWait(() -> {
-                if (test.frame != null) {
-                    test.frame.dispose();
-                }
-                if (test.frame2 != null) {
-                    test.frame2.dispose();
-                }
-            });
-        }
-    }
-
-    public ActiveAWTWindowTest() {
-        try{
-            EventQueue.invokeAndWait( () -> {
-                    initializeGUI();
-            });
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new RuntimeException("Interrupted or unexpected Exception occured");
-        }
+        EventQueue.invokeAndWait(() -> {
+            initializeGUI();
+        });
+        doTest();
+        EventQueue.invokeAndWait(() -> {
+            if (frame != null) {
+                frame.dispose();
+            }
+            if (frame2 != null) {
+                frame2.dispose();
+            }
+        });
     }
 
-    private void initializeGUI() {
+    private static void initializeGUI() {
         frame = new Frame();
         frame.setLayout(new FlowLayout());
-
         frame.setLocation(5, 20);
         frame.setSize(200, 200);
         frame.setUndecorated(true);
+
         frame.addWindowFocusListener(new WindowFocusListener() {
+            @Override
             public void windowGainedFocus(WindowEvent event) {
                 System.out.println("Frame Focus gained");
-                synchronized (lock3) {
-                    try {
-                        lock3.notifyAll();
-                    } catch (Exception ex) {
-                        ex.printStackTrace();
-                    }
-                }
+                windowFocusGainedLatch.countDown();
             }
 
+            @Override
             public void windowLostFocus(WindowEvent event) {
-                    System.out.println("Frame Focus lost");
+                System.out.println("Frame Focus lost");
             }
         });
+
         frame.addWindowListener(new WindowAdapter() {
+            @Override
             public void windowActivated(WindowEvent e) {
-                eventType = WindowEvent.WINDOW_ACTIVATED;
-                System.out.println("Undecorated Frame is activated\n");
-                synchronized (lock1) {
-                    try {
-                        lock1.notifyAll();
-                    } catch (Exception ex) {
-                        ex.printStackTrace();
-                    }
-                }
+                System.out.println("Undecorated Frame is activated");
+                windowActivatedLatch.countDown();
             }
 
+            @Override
             public void windowDeactivated(WindowEvent e) {
-                eventType = WindowEvent.WINDOW_DEACTIVATED;
-                System.out.println("Undecorated Frame got Deactivated\n");
-                synchronized (lock2) {
-                    try {
-                        lock2.notifyAll();
-                    } catch (Exception ex) {
-                        ex.printStackTrace();
-                    }
-                }
+                System.out.println("Undecorated Frame got Deactivated");
+                windowDeactivatedLatch.countDown();
             }
         });
+
         textField = new TextField("TextField");
         button = new Button("Click me");
-        button.addActionListener(new ActionListener() {
-            public void actionPerformed(ActionEvent e) {
-                textField.setText("Focus gained");
-            }
-        });
+        button.addActionListener(e -> textField.setText("Focus gained"));
 
         frame.setBackground(Color.green);
         frame.add(button);
@@ -149,86 +126,46 @@
         frame2.setLocation(5, 250);
         frame2.setSize(200, 200);
         frame2.setBackground(Color.green);
+
         button2 = new Button("Click me");
         textField2 = new TextField("TextField");
-        button2.addActionListener(new ActionListener() {
-            public void actionPerformed(ActionEvent e) {
-                textField2.setText("Got the focus");
-            }
-        });
+        button2.addActionListener(e -> textField2.setText("Got the focus"));
 
         frame2.add(button2, BorderLayout.SOUTH);
         frame2.add(textField2, BorderLayout.NORTH);
         frame2.setVisible(true);
-
-        frame.toFront();
     }
 
-    public void doTest() {
-        ExtendedRobot robot;
-        try {
-            robot = new ExtendedRobot();
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new RuntimeException("Cannot create robot");
-        }
-
-        robot.setAutoDelay(delay);
+    private static void doTest() throws AWTException, InterruptedException  {
+        Robot robot = new Robot();
+        robot.setAutoDelay(150);
         robot.setAutoWaitForIdle(true);
-
-        robot.waitForIdle(5*delay);
-        robot.mouseMove(button.getLocationOnScreen().x + button.getSize().width / 2,
-                        button.getLocationOnScreen().y + button.getSize().height / 2);
-        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
-        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
-
-        if (eventType != WindowEvent.WINDOW_ACTIVATED) {
-            synchronized (lock1) {
-                try {
-                    lock1.wait(delay * 10);
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-        if (eventType != WindowEvent.WINDOW_ACTIVATED) {
-            passed = false;
-            System.err.println("WINDOW_ACTIVATED event did not occur when the " +
-                    "undecorated frame is activated!");
+        if (!windowFocusGainedLatch.await(1000, TimeUnit.MILLISECONDS)) {
+            throw new RuntimeException("Frame did not gain focus");
         }
+        clickButtonCenter(robot, button);
 
-        eventType = -1;
-
-        robot.mouseMove(button2.getLocationOnScreen().x + button2.getSize().width / 2,
-                        button2.getLocationOnScreen().y + button2.getSize().height / 2);
-        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
-        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
-
-        if (eventType != WindowEvent.WINDOW_DEACTIVATED) {
-            synchronized (lock2) {
-                try {
-                    lock2.wait(delay * 10);
-                } catch (Exception e) {
-                }
-            }
+        if (!windowActivatedLatch.await(1000, TimeUnit.MILLISECONDS)) {
+            throw new RuntimeException("Frame was not activated");
         }
-        if (eventType != WindowEvent.WINDOW_DEACTIVATED) {
-            passed = false;
-            System.err.println("FAIL: WINDOW_DEACTIVATED event did not occur for the " +
-                    "undecorated frame when another frame gains focus!");
+        clickButtonCenter(robot, button2);
+
+        if (!windowDeactivatedLatch.await(2000, TimeUnit.MILLISECONDS)) {
+            throw new RuntimeException("Frame was not deactivated");
         }
         if (frame.hasFocus()) {
-            passed = false;
-            System.err.println("FAIL: The undecorated frame has focus even when " +
-                        "another frame is clicked!");
+            throw new RuntimeException("Frame did not lose focus");
         }
+    }
 
-        if (!passed) {
-            //captureScreenAndSave();
-            System.err.println("Test failed!");
-            throw new RuntimeException("Test failed.");
-        } else {
-            System.out.println("Test passed");
-        }
+    private static void clickButtonCenter(Robot robot, Component button) {
+        Point location = button.getLocationOnScreen();
+        Dimension size = button.getSize();
+        int x = location.x + size.width / 2;
+        int y = location.y + size.height / 2;
+        robot.mouseMove(x, y);
+        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
+        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
     }
 }
+
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/Mouse/MouseModifiersUnitTest/ExtraButtonDrag.java openjdk-21-21.0.11+10/test/jdk/java/awt/Mouse/MouseModifiersUnitTest/ExtraButtonDrag.java
--- openjdk-21-21.0.10+7/test/jdk/java/awt/Mouse/MouseModifiersUnitTest/ExtraButtonDrag.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/Mouse/MouseModifiersUnitTest/ExtraButtonDrag.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,110 +22,120 @@
  */
 
 /*
-  @test
-  @key headful
-  @bug 6315717
-  @summary verifies that drag events are coming for every button if the property is set to true
-  @author Andrei Dmitriev : area=awt.mouse
-  @run main ExtraButtonDrag
+ * @test
+ * @key headful
+ * @bug 6315717
+ * @summary Verifies that the mouse drag events received for every button if the property is set to true
+ * @run main ExtraButtonDrag
  */
 
-//events from standard should also come
-
-import java.awt.*;
-import java.awt.event.*;
-
-public class ExtraButtonDrag extends Frame {
-    static String tk = Toolkit.getDefaultToolkit().getClass().getName();
-    static Robot robot;
-    static int [] buttonsPressed;
-    static int [] buttonsReleased;
-    static int [] buttonsClicked;
-    volatile static boolean dragged = false;
-    volatile static boolean moved = false;
-
-    public ExtraButtonDrag(){
-        super("ExtraButtonDrag");
-    }
-
-    public static void main(String []s){
-        Frame frame = new ExtraButtonDrag();
-
-        MouseAdapter ma = new MouseAdapter() {
-                public void mouseDragged(MouseEvent e) {
-                    System.out.println("Dragged "+e);// +" : "+ e.getButton() + " : " +e.getButtonState(e.getButton()));
-                    dragged = true;
-                }
-                public void mouseMoved(MouseEvent e) {
-                    System.out.println("Moved "+e);
-                    moved = true;
-                }
-                public void mousePressed(MouseEvent e) {
-                    System.out.println(">>> "+e);
-                }
-                public void mouseReleased(MouseEvent e) {
-                    System.out.println(">>> "+e);
-                }
+import java.awt.AWTException;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.Frame;
+import java.awt.MouseInfo;
+import java.awt.Point;
+import java.awt.Robot;
+import java.awt.Toolkit;
+import java.awt.event.InputEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.lang.reflect.InvocationTargetException;
+
+public class ExtraButtonDrag {
+
+    private static Frame frame;
+    private static Robot robot;
+    private static volatile boolean dragged = false;
+    private static volatile boolean moved = false;
+    private static volatile Point centerFrame;
+    private static volatile Point outboundsFrame;
+    private static final String OS_NAME = System.getProperty("os.name");
+    private static MouseAdapter mAdapter = new MouseAdapter() {
+        @Override
+        public void mouseDragged(MouseEvent e) {
+            dragged = true;
+        }
 
-            };
+        @Override
+        public void mouseMoved(MouseEvent e) {
+            moved = true;
+        }
+    };
 
-        frame.addMouseMotionListener(ma);
-        frame.addMouseListener(ma);
+    public static void initializeGUI() {
+        frame = new Frame("ExtraButtonDrag");
+        frame.addMouseMotionListener(mAdapter);
+        frame.addMouseListener(mAdapter);
 
         frame.setSize(300, 300);
+        frame.setLocationRelativeTo(null);
         frame.setVisible(true);
+    }
+
+    public static void doTest()
+        throws InvocationTargetException, InterruptedException {
 
-        int [] buttonMask = new int [MouseInfo.getNumberOfButtons()]; //InputEvent.getButtonMasks();
+        int[] buttonMask = new int[MouseInfo.getNumberOfButtons()];
 
-        for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){
-            buttonMask[i] = InputEvent.getMaskForButton(i+1);
-            //            System.out.println("TEST: "+tmp[i]);
+        for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++) {
+            buttonMask[i] = InputEvent.getMaskForButton(i + 1);
         }
 
-        try {
-            robot = new Robot();
-            robot.delay(1000);
-            Point centerFrame = new Point(frame.getLocationOnScreen().x + frame.getWidth()/2, frame.getLocationOnScreen().y + frame.getHeight()/2);
-            Point outboundsFrame = new Point(frame.getLocationOnScreen().x + frame.getWidth()*3/2, frame.getLocationOnScreen().y + frame.getHeight()/2);
-
-            System.out.println("areExtraMouseButtonsEnabled() == " + Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled() );
-
-            for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){
-                System.out.println("button to drag = " +(i+1) + " : value passed to robot = " +buttonMask[i]);
-
-                try {
-                    dragMouse(buttonMask[i], centerFrame.x, centerFrame.y, outboundsFrame.x, outboundsFrame.y);
-                } catch (IllegalArgumentException e){
-                    throw new RuntimeException("Test failed. Exception occured.", e);
-                }
+        EventQueue.invokeAndWait(() -> {
+            Point location = frame.getLocationOnScreen();
+            Dimension size = frame.getSize();
+            centerFrame = new Point(location.x + size.width / 2,
+                location.y + size.height / 2);
+            outboundsFrame = new Point(location.x + size.width * 3 / 2,
+                location.y + size.height / 2);
+        });
+
+        System.out.println("areExtraMouseButtonsEnabled() == "
+            + Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled());
+
+        for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++) {
+            System.out.println("button to drag = " + (i + 1)
+                + " : value passed to robot = " + buttonMask[i]);
+
+            try {
+                dragMouse(buttonMask[i], centerFrame.x, centerFrame.y,
+                    outboundsFrame.x, outboundsFrame.y);
+            } catch (IllegalArgumentException e) {
+                throw new RuntimeException("Test failed. Exception occured.",
+                    e);
+            }
 
-                robot.delay(500);
-                //this is a choice-case for X protocol issue: native events from extra buttons doesn't contain
-                // the correct state so it's unable to decide if there is a drag or move. By default we send MOVED event.
-                //XToolkit: extra buttons should report MOVED events only
-                //WToolkit: extra buttons should report DRAGGED events only
-                if (i > 2){ //extra buttons only
-                    if (tk.equals("sun.awt.X11.XToolkit")) {
-                        if (!moved || dragged) {
-                            throw new RuntimeException("Test failed."+ tk +" Button = " +(i+1) + " moved = "+moved +" : dragged = " +dragged);
-                        }
-                    } else { //WToolkit
-                        if (moved || !dragged) {
-                            throw new RuntimeException("Test failed."+ tk +" Button = " +(i+1) + " moved = "+moved +" : dragged = " +dragged);
-                        }
+            // this is a choice-case for X protocol issue: native events from
+            // extra buttons doesn't contain
+            // the correct state so it's unable to decide if there is a drag or
+            // move. By default we send MOVED event.
+            // XToolkit: extra buttons should report MOVED events only
+            // WToolkit: extra buttons should report DRAGGED events only
+            if (i > 2) { // extra buttons only
+                if (OS_NAME.equals("Linux")) {
+                    if (!moved || dragged) {
+                        throw new RuntimeException("Test failed." + OS_NAME
+                            + " Button = " + (i + 1) + " moved = " + moved
+                            + " : dragged = " + dragged);
                     }
-                } else {
-                    if (moved || !dragged){
-                        throw new RuntimeException("Test failed. Button = " +(i+1) + " not dragged.");
+                } else { // WToolkit
+                    if (moved || !dragged) {
+                        throw new RuntimeException("Test failed." + OS_NAME
+                            + " Button = " + (i + 1) + " moved = " + moved
+                            + " : dragged = " + dragged);
                     }
                 }
+            } else {
+                if (moved || !dragged) {
+                    throw new RuntimeException(
+                        "Test failed. Button = " + (i + 1) + " not dragged.");
+                }
             }
-        } catch (Exception e){
-            throw new RuntimeException("", e);
         }
     }
 
-    public static void dragMouse(int button, int x0, int y0, int x1, int y1){
+    public static void dragMouse(int button, int x0, int y0, int x1, int y1) {
         int curX = x0;
         int curY = y0;
         int dx = x0 < x1 ? 1 : -1;
@@ -138,12 +148,12 @@
 
         robot.mousePress(button);
 
-        while (curX != x1){
+        while (curX != x1) {
             curX += dx;
             robot.mouseMove(curX, curY);
             robot.delay(5);
         }
-        while (curY != y1 ){
+        while (curY != y1) {
             curY += dy;
             robot.mouseMove(curX, curY);
             robot.delay(5);
@@ -151,4 +161,30 @@
         robot.mouseRelease(button);
     }
 
+    public static void main(String[] s)
+        throws InvocationTargetException, InterruptedException, AWTException {
+        try {
+            robot = new Robot();
+            robot.setAutoDelay(10);
+            robot.setAutoWaitForIdle(true);
+
+            EventQueue.invokeAndWait(ExtraButtonDrag::initializeGUI);
+            robot.waitForIdle();
+            robot.delay(100);
+
+            doTest();
+
+            System.out.println("Test Passed");
+        } finally {
+            EventQueue.invokeAndWait(ExtraButtonDrag::disposeFrame);
+        }
+    }
+
+    public static void disposeFrame() {
+        if (frame != null) {
+            frame.dispose();
+            frame = null;
+        }
+    }
+
 }
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/Multiscreen/MultiScreenInsetsTest/MultiScreenInsetsTest.java openjdk-21-21.0.11+10/test/jdk/java/awt/Multiscreen/MultiScreenInsetsTest/MultiScreenInsetsTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/awt/Multiscreen/MultiScreenInsetsTest/MultiScreenInsetsTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/Multiscreen/MultiScreenInsetsTest/MultiScreenInsetsTest.java	1970-01-01 00:00:00.000000000 +0000
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
-  @test
-  @key headful
-  @bug 8020443
-  @summary Frame is not created on the specified GraphicsDevice with two
-monitors
-  @author Oleg Pekhovskiy
-  @library /test/lib
-  @build jdk.test.lib.Platform
-  @run main MultiScreenInsetsTest
- */
-
-import java.awt.Frame;
-import java.awt.GraphicsConfiguration;
-import java.awt.GraphicsDevice;
-import java.awt.GraphicsEnvironment;
-import java.awt.Insets;
-import java.awt.Rectangle;
-import java.awt.Toolkit;
-
-import jdk.test.lib.Platform;
-
-public class MultiScreenInsetsTest {
-    private static final int SIZE = 100;
-
-    public static void main(String[] args) throws InterruptedException {
-        if (!Platform.isLinux()) {
-            System.out.println("This test is for Linux only..." +
-                               "skipping!");
-            return;
-        }
-
-        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
-        GraphicsDevice[] gds = ge.getScreenDevices();
-        if (gds.length < 2) {
-            System.out.println("It's a multi-screen test... skipping!");
-            return;
-        }
-
-        for (int screen = 0; screen < gds.length; ++screen) {
-            GraphicsDevice gd = gds[screen];
-            GraphicsConfiguration gc = gd.getDefaultConfiguration();
-            Rectangle bounds = gc.getBounds();
-            Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc);
-
-            Frame frame = new Frame(gc);
-            frame.setLocation(bounds.x + (bounds.width - SIZE) / 2,
-                              bounds.y + (bounds.height - SIZE) / 2);
-            frame.setSize(SIZE, SIZE);
-            frame.setUndecorated(true);
-            frame.setVisible(true);
-
-            // Maximize Frame to reach the struts
-            frame.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
-            Thread.sleep(2000);
-
-            Rectangle frameBounds = frame.getBounds();
-            frame.dispose();
-            if (bounds.x + insets.left != frameBounds.x
-                || bounds.y + insets.top != frameBounds.y
-                || bounds.width - insets.right - insets.left != frameBounds.width
-                || bounds.height - insets.bottom - insets.top != frameBounds.height) {
-                throw new RuntimeException("Test FAILED! Wrong screen #" +
-                                           screen + " insets: " + insets);
-            }
-        }
-        System.out.println("Test PASSED!");
-    }
-}
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/Toolkit/ScreenInsetsTest/ScreenInsetsTest.java openjdk-21-21.0.11+10/test/jdk/java/awt/Toolkit/ScreenInsetsTest/ScreenInsetsTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/awt/Toolkit/ScreenInsetsTest/ScreenInsetsTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/Toolkit/ScreenInsetsTest/ScreenInsetsTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,15 +22,14 @@
  */
 
 /*
-  @test
-  @key headful
-  @bug 4737732
-  @summary Tests that Toolkit.getScreenInsets() returns correct insets
-  @author artem.ananiev: area=awt.toplevel
-  @library ../../regtesthelpers
-  @build Util
-  @run main ScreenInsetsTest
-*/
+ * @test
+ * @key headful
+ * @bug 8020443 6899304 4737732
+ * @summary Tests that Toolkit.getScreenInsets() returns correct insets
+ * @library /test/lib
+ * @build jdk.test.lib.Platform
+ * @run main ScreenInsetsTest
+ */
 
 import java.awt.Frame;
 import java.awt.GraphicsConfiguration;
@@ -40,85 +39,77 @@
 import java.awt.Rectangle;
 import java.awt.Toolkit;
 
-import test.java.awt.regtesthelpers.Util;
+import jdk.test.lib.Platform;
 
-public class ScreenInsetsTest
-{
-    public static void main(String[] args)
-    {
-        boolean passed = true;
+public class ScreenInsetsTest {
+    private static final int SIZE = 100;
+    // Allow a margin tolerance of 1 pixel due to scaling
+    private static final int MARGIN_TOLERANCE = 1;
 
+    public static void main(String[] args) throws InterruptedException {
         GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
         GraphicsDevice[] gds = ge.getScreenDevices();
-        for (GraphicsDevice gd : gds) {
-            GraphicsConfiguration gc = gd.getDefaultConfiguration();
-            Rectangle gcBounds = gc.getBounds();
-            Insets gcInsets = Toolkit.getDefaultToolkit().getScreenInsets(gc);
-            int left = gcInsets.left;
-            int right = gcInsets.right;
-            int bottom = gcInsets.bottom;
-            int top = gcInsets.top;
-            if (left < 0 || right < 0 || bottom < 0 || top < 0) {
-                throw new RuntimeException("Negative value: " + gcInsets);
-            }
-            int maxW = gcBounds.width / 3;
-            int maxH = gcBounds.height / 3;
-            if (left > maxW || right > maxW || bottom > maxH || top > maxH) {
-                throw new RuntimeException("Big value: " + gcInsets);
-            }
-
-            if (!Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_BOTH))
-            {
-                // this state is used in the test - sorry
-                continue;
-            }
 
-            Frame f = new Frame("Test", gc);
-            f.setUndecorated(true);
-            f.setBounds(gcBounds.x + 100, gcBounds.y + 100, 320, 240);
-            f.setVisible(true);
-            Util.waitForIdle(null);
-
-            f.setExtendedState(Frame.MAXIMIZED_BOTH);
-            Util.waitForIdle(null);
-
-            Rectangle fBounds = f.getBounds();
-            // workaround: on Windows maximized windows have negative coordinates
-            if (fBounds.x < gcBounds.x)
-            {
-                fBounds.width -= (gcBounds.x - fBounds.x) * 2; // width is decreased
-                fBounds.x = gcBounds.x;
-            }
-            if (fBounds.y < gcBounds.y)
-            {
-                fBounds.height -= (gcBounds.y - fBounds.y) * 2; // height is decreased
-                fBounds.y = gcBounds.y;
-            }
-            Insets expected = new Insets(fBounds.y - gcBounds.y,
-                                         fBounds.x - gcBounds.x,
-                                         gcBounds.y + gcBounds.height - fBounds.y - fBounds.height,
-                                         gcBounds.x + gcBounds.width - fBounds.x - fBounds.width);
-
-            // On Windows 10 and up system allows undecorated maximized windows
-            // to be placed over the taskbar so calculated insets might
-            // be smaller than reported ones depending on the taskbar position
-            if (gcInsets.top < expected.top
-                    || gcInsets.bottom < expected.bottom
-                    || gcInsets.left < expected.left
-                    || gcInsets.right < expected.right)
-            {
-                passed = false;
-                System.err.println("Wrong insets for GraphicsConfig: " + gc);
-                System.err.println("\tExpected: " + expected);
-                System.err.println("\tActual: " + gcInsets);
+        for (int screen = 0; screen < gds.length; ++screen) {
+            GraphicsDevice gd = gds[screen];
+            GraphicsConfiguration gc = gd.getDefaultConfiguration();
+            Rectangle bounds = gc.getBounds();
+            Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc);
+            int workAreaWidth = bounds.width - insets.left - insets.right;
+            int workAreaHeight = bounds.height - insets.top - insets.bottom;
+            System.out.println("Screen #" + screen);
+            System.out.println("Screen Bounds: " + bounds);
+            System.out.println("Insets: " + insets);
+
+            Frame frame = new Frame(gc);
+            frame.setLocation(bounds.x + (bounds.width - SIZE) / 2,
+                    bounds.y + (bounds.height - SIZE) / 2);
+            frame.setSize(SIZE, SIZE);
+
+            /*
+             * On Windows, undecorated maximized frames are placed over the taskbar.
+             * Use a decorated frame instead.
+             */
+            if (Platform.isWindows()) {
+                frame.setUndecorated(false);
+            } else {
+                frame.setUndecorated(true);
+            }
+
+            frame.setVisible(true);
+
+            // Maximize Frame to reach the struts
+            frame.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
+            Thread.sleep(2000);
+
+            Rectangle frameBounds = frame.getBounds();
+            System.out.println("Frame bounds: " + frameBounds);
+
+            frame.dispose();
+
+            /*
+             * On Windows, the top-left corner of an undecorated maximized frame
+             * may have negative coordinates (x, y).
+             * Adjust the frame bounds accordingly.
+             */
+            if (frameBounds.x < bounds.x) {
+                frameBounds.width -= (bounds.x - frameBounds.x) * 2;
+                frameBounds.x = bounds.x;
+            }
+            if (frameBounds.y < bounds.y) {
+                frameBounds.height -= (bounds.y - frameBounds.y) * 2;
+                frameBounds.y = bounds.y;
+            }
+            System.out.println("Adjusted Frame bounds: " + frameBounds);
+
+            if (bounds.x + insets.left != frameBounds.x
+                    || bounds.y + insets.top != frameBounds.y
+                    || Math.abs(workAreaWidth - frameBounds.width) > MARGIN_TOLERANCE
+                    || Math.abs(workAreaHeight - frameBounds.height) > MARGIN_TOLERANCE) {
+                throw new RuntimeException("Test FAILED! Wrong screen #" +
+                        screen + " insets: " + insets);
             }
-
-            f.dispose();
-        }
-
-        if (!passed)
-        {
-            throw new RuntimeException("TEST FAILED: Toolkit.getScreenInsets() returns wrong value for some screens");
         }
+        System.out.println("Test PASSED!");
     }
 }
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/font/TextLayout/TestLayoutVsICU.java openjdk-21-21.0.11+10/test/jdk/java/awt/font/TextLayout/TestLayoutVsICU.java
--- openjdk-21-21.0.10+7/test/jdk/java/awt/font/TextLayout/TestLayoutVsICU.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/font/TextLayout/TestLayoutVsICU.java	1970-01-01 00:00:00.000000000 +0000
@@ -1,889 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * Copyright (C) 2013-2014 IBM Corporation and Others. All Rights Reserved.
- */
-
-import java.awt.Color;
-import java.awt.Composite;
-import java.awt.Font;
-import java.awt.FontFormatException;
-import java.awt.FontMetrics;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.GraphicsConfiguration;
-import java.awt.Image;
-import java.awt.Paint;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.RenderingHints.Key;
-import java.awt.Shape;
-import java.awt.Stroke;
-import java.awt.font.FontRenderContext;
-import java.awt.font.GlyphVector;
-import java.awt.font.TextLayout;
-import java.awt.geom.AffineTransform;
-import java.awt.image.BufferedImage;
-import java.awt.image.BufferedImageOp;
-import java.awt.image.ImageObserver;
-import java.awt.image.RenderedImage;
-import java.awt.image.renderable.RenderableImage;
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.text.AttributedCharacterIterator;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.TreeMap;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * This test runs against a test XML file. It opens the fonts and attempts
- * to shape and layout glyphs.
- * Note that the test is highly environment dependent- you must have
- * the same versions of the same fonts available or the test will fail.
- *
- * It is similar to letest which is part of ICU.
- * For reference, here are some reference items:
- * ICU's test file:
- *  http://source.icu-project.org/repos/icu/icu/trunk/source/test/testdata/letest.xml
- * ICU's readme for the similar test:
- *  http://source.icu-project.org/repos/icu/icu/trunk/source/test/letest/readme.html
- *
- * @bug 8054203
- * @test
- * @summary manual test of layout engine behavior. Takes an XML control file.
- * @compile TestLayoutVsICU.java
- * @author srl
- * @run main/manual
- */
-public class TestLayoutVsICU {
-
-    public static boolean OPT_DRAW = false;
-    public static boolean OPT_VERBOSE = false;
-    public static boolean OPT_FAILMISSING = false;
-    public static boolean OPT_NOTHROW= false; // if true - don't stop on failure
-
-    public static int docs = 0; // # docs processed
-    public static int skipped = 0; // cases skipped due to bad font
-    public static int total = 0; // cases processed
-    public static int bad = 0; // cases with errs
-
-    public static final String XML_LAYOUT_TESTS = "layout-tests"; // top level
-    public static final String XML_TEST_CASE = "test-case";
-    public static final String XML_TEST_FONT = "test-font";
-    public static final String XML_TEST_TEXT = "test-text";
-    public static final String XML_RESULT_GLYPHS = "result-glyphs";
-    public static final String XML_ID = "id";
-    public static final String XML_SCRIPT = "script";
-    public static final String XML_NAME = "name";
-    public static final String XML_VERSION = "version";
-    public static final String XML_CHECKSUM = "checksum";
-    public static final String XML_RESULT_INDICES = "result-indices";
-    public static final String XML_RESULT_POSITIONS = "result-positions";
-
-    /**
-     * @param args
-     * @throws IOException
-     * @throws SAXException
-     * @throws ParserConfigurationException
-     */
-    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
-        System.out.println("Java " + System.getProperty("java.version") + " from " + System.getProperty("java.vendor"));
-        TestLayoutVsICU tlvi = null;
-        for(String arg : args) {
-            if(arg.equals("-d")) {
-                OPT_DRAW = true;
-            } else if(arg.equals("-n")) {
-                OPT_NOTHROW = true;
-            } else if(arg.equals("-v")) {
-                OPT_VERBOSE = true;
-            } else if(arg.equals("-f")) {
-                OPT_FAILMISSING = true;
-            } else {
-                if(tlvi == null) {
-                    tlvi = new TestLayoutVsICU();
-                }
-                try {
-                    tlvi.show(arg);
-                } finally {
-                    if(OPT_VERBOSE) {
-                        System.out.println("# done with " + arg);
-                    }
-                }
-            }
-        }
-
-        if(tlvi == null) {
-            throw new IllegalArgumentException("No XML input. Usage: " + TestLayoutVsICU.class.getSimpleName() + " [-d][-v][-f] letest.xml ...");
-        } else {
-            System.out.println("\n\nRESULTS:\n");
-            System.out.println(skipped+"\tskipped due to missing font");
-            System.out.println(total+"\ttested of which:");
-            System.out.println(bad+"\twere bad");
-
-            if(bad>0) {
-                throw new InternalError("One or more failure(s)");
-            }
-        }
-    }
-
-    String id;
-
-    private void show(String arg) throws ParserConfigurationException, SAXException, IOException {
-        id = "";
-        File xmlFile = new File(arg);
-        if(!xmlFile.exists()) {
-            throw new FileNotFoundException("Can't open input XML file " + arg);
-        }
-        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-        DocumentBuilder db = dbf.newDocumentBuilder();
-        if(OPT_VERBOSE) {
-            System.out.println("# Parsing " + xmlFile.getAbsolutePath());
-        }
-        Document doc = db.parse(xmlFile);
-        Element e = doc.getDocumentElement();
-        if(!XML_LAYOUT_TESTS.equals(e.getNodeName())) {
-            throw new IllegalArgumentException("Document " + xmlFile.getAbsolutePath() + " does not have  as its base");
-        }
-
-        NodeList testCases = e.getElementsByTagName(XML_TEST_CASE);
-        for(int caseNo=0;caseNo testCaseAttrs = attrs(testCase);
-            id = testCaseAttrs.get(XML_ID);
-            final String script = testCaseAttrs.get(XML_SCRIPT);
-            String testText = null;
-            Integer[] expectGlyphs = null;
-            Integer[] expectIndices = null;
-            Map fontAttrs = null;
-            if(OPT_VERBOSE) {
-                System.out.println("#"+caseNo+" id="+id + ", script="+script);
-            }
-            NodeList children = testCase.getChildNodes();
-            for(int sub=0;sub glyphs = new ArrayList();
-            Graphics2D myg2 = new Graphics2D(){
-
-                    @Override
-                    public void draw(Shape s) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public boolean drawImage(Image img, AffineTransform xform,
-                                             ImageObserver obs) {
-                        // TODO Auto-generated method stub
-                        return false;
-                    }
-
-                    @Override
-                    public void drawImage(BufferedImage img,
-                                          BufferedImageOp op, int x, int y) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void drawRenderedImage(RenderedImage img,
-                                                  AffineTransform xform) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void drawRenderableImage(RenderableImage img,
-                                                    AffineTransform xform) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void drawString(String str, int x, int y) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void drawString(String str, float x, float y) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void drawString(
-                                           AttributedCharacterIterator iterator, int x, int y) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void drawString(
-                                           AttributedCharacterIterator iterator, float x,
-                                           float y) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void drawGlyphVector(GlyphVector g, float x, float y) {
-                        if(x!=0.0 || y!=0.0) {
-                            throw new InternalError("x,y should be 0 but got " + x+","+y);
-                        }
-                        //System.err.println("dGV : " + g.toString() + " @ "+x+","+y);
-                        glyphs.add(g);
-                    }
-
-                    @Override
-                    public void fill(Shape s) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public boolean hit(Rectangle rect, Shape s, boolean onStroke) {
-                        // TODO Auto-generated method stub
-                        return false;
-                    }
-
-                    @Override
-                    public GraphicsConfiguration getDeviceConfiguration() {
-                        // TODO Auto-generated method stub
-                        return null;
-                    }
-
-                    @Override
-                    public void setComposite(Composite comp) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void setPaint(Paint paint) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void setStroke(Stroke s) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void setRenderingHint(Key hintKey, Object hintValue) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public Object getRenderingHint(Key hintKey) {
-                        // TODO Auto-generated method stub
-                        return null;
-                    }
-
-                    @Override
-                    public void setRenderingHints(Map hints) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void addRenderingHints(Map hints) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public RenderingHints getRenderingHints() {
-                        // TODO Auto-generated method stub
-                        return null;
-                    }
-
-                    @Override
-                    public void translate(int x, int y) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void translate(double tx, double ty) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void rotate(double theta) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void rotate(double theta, double x, double y) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void scale(double sx, double sy) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void shear(double shx, double shy) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void transform(AffineTransform Tx) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void setTransform(AffineTransform Tx) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public AffineTransform getTransform() {
-                        // TODO Auto-generated method stub
-                        return null;
-                    }
-
-                    @Override
-                    public Paint getPaint() {
-                        // TODO Auto-generated method stub
-                        return null;
-                    }
-
-                    @Override
-                    public Composite getComposite() {
-                        // TODO Auto-generated method stub
-                        return null;
-                    }
-
-                    @Override
-                    public void setBackground(Color color) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public Color getBackground() {
-                        // TODO Auto-generated method stub
-                        return null;
-                    }
-
-                    @Override
-                    public Stroke getStroke() {
-                        // TODO Auto-generated method stub
-                        return null;
-                    }
-
-                    @Override
-                    public void clip(Shape s) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public FontRenderContext getFontRenderContext() {
-                        // TODO Auto-generated method stub
-                        return null;
-                    }
-
-                    @Override
-                    public Graphics create() {
-                        // TODO Auto-generated method stub
-                        return null;
-                    }
-
-                    @Override
-                    public Color getColor() {
-                        // TODO Auto-generated method stub
-                        return null;
-                    }
-
-                    @Override
-                    public void setColor(Color c) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void setPaintMode() {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void setXORMode(Color c1) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public Font getFont() {
-                        // TODO Auto-generated method stub
-                        return null;
-                    }
-
-                    @Override
-                    public void setFont(Font font) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public FontMetrics getFontMetrics(Font f) {
-                        // TODO Auto-generated method stub
-                        return null;
-                    }
-
-                    @Override
-                    public Rectangle getClipBounds() {
-                        // TODO Auto-generated method stub
-                        return null;
-                    }
-
-                    @Override
-                    public void clipRect(int x, int y, int width, int height) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void setClip(int x, int y, int width, int height) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public Shape getClip() {
-                        // TODO Auto-generated method stub
-                        return null;
-                    }
-
-                    @Override
-                    public void setClip(Shape clip) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void copyArea(int x, int y, int width, int height,
-                                         int dx, int dy) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void drawLine(int x1, int y1, int x2, int y2) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void fillRect(int x, int y, int width, int height) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void clearRect(int x, int y, int width, int height) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void drawRoundRect(int x, int y, int width,
-                                              int height, int arcWidth, int arcHeight) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void fillRoundRect(int x, int y, int width,
-                                              int height, int arcWidth, int arcHeight) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void drawOval(int x, int y, int width, int height) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void fillOval(int x, int y, int width, int height) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void drawArc(int x, int y, int width, int height,
-                                        int startAngle, int arcAngle) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void fillArc(int x, int y, int width, int height,
-                                        int startAngle, int arcAngle) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void drawPolyline(int[] xPoints, int[] yPoints,
-                                             int nPoints) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void drawPolygon(int[] xPoints, int[] yPoints,
-                                            int nPoints) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public void fillPolygon(int[] xPoints, int[] yPoints,
-                                            int nPoints) {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                    @Override
-                    public boolean drawImage(Image img, int x, int y,
-                                             ImageObserver observer) {
-                        // TODO Auto-generated method stub
-                        return false;
-                    }
-
-                    @Override
-                    public boolean drawImage(Image img, int x, int y,
-                                             int width, int height, ImageObserver observer) {
-                        // TODO Auto-generated method stub
-                        return false;
-                    }
-
-                    @Override
-                    public boolean drawImage(Image img, int x, int y,
-                                             Color bgcolor, ImageObserver observer) {
-                        // TODO Auto-generated method stub
-                        return false;
-                    }
-
-                    @Override
-                    public boolean drawImage(Image img, int x, int y,
-                                             int width, int height, Color bgcolor,
-                                             ImageObserver observer) {
-                        // TODO Auto-generated method stub
-                        return false;
-                    }
-
-                    @Override
-                    public boolean drawImage(Image img, int dx1, int dy1,
-                                             int dx2, int dy2, int sx1, int sy1, int sx2,
-                                             int sy2, ImageObserver observer) {
-                        // TODO Auto-generated method stub
-                        return false;
-                    }
-
-                    @Override
-                    public boolean drawImage(Image img, int dx1, int dy1,
-                                             int dx2, int dy2, int sx1, int sy1, int sx2,
-                                             int sy2, Color bgcolor, ImageObserver observer) {
-                        // TODO Auto-generated method stub
-                        return false;
-                    }
-
-                    @Override
-                    public void dispose() {
-                        // TODO Auto-generated method stub
-
-                    }
-
-                };
-            tl.draw(myg2, 0, 0);
-            if(glyphs.size() != 1) {
-                err("drew " + glyphs.size() + " times - expected 1");
-                total++;
-                bad++;
-                continue;
-            }
-            boolean isBad = false;
-            GlyphVector gv = glyphs.get(0);
-
-            // GLYPHS
-            int gotGlyphs[] = gv.getGlyphCodes(0, gv.getNumGlyphs(), new int[gv.getNumGlyphs()]);
-
-            int count = Math.min(gotGlyphs.length, expectGlyphs.length); // go up to this count
-
-            for(int i=0;i> OK: " + gotGlyphs.length + " glyphs");
-                }
-            }
-
-
-            if(isBad) {
-                bad++;
-                System.out.println("* FAIL: " + id + "  /\t" + fontName);
-            } else {
-                System.out.println("* OK  : " + id + "  /\t" + fontName);
-            }
-            total++;
-        }
-    }
-
-
-    private boolean verifyFont(File f, Map fontAttrs) {
-        InputStream fis = null;
-        String fontName = fontAttrs.get(XML_NAME);
-        int count=0;
-        try {
-            fis = new BufferedInputStream(new FileInputStream(f));
-
-            int i = 0;
-            int r;
-            try {
-                while((r=fis.read())!=-1) {
-                    i+=(int)r;
-                    count++;
-                }
-            } catch (IOException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-                return false;
-            }
-            if(OPT_VERBOSE) {
-                System.out.println("for " + f.getAbsolutePath() + " chks = 0x" + Integer.toHexString(i) + " size=" + count);
-            }
-            String theirStr = fontAttrs.get("rchecksum");
-
-            String ourStr = Integer.toHexString(i).toLowerCase();
-
-            if(theirStr!=null) {
-                if(theirStr.startsWith("0x")) {
-                    theirStr = theirStr.substring(2).toLowerCase();
-                } else {
-                    theirStr = theirStr.toLowerCase();
-                }
-                long theirs = Integer.parseInt(theirStr, 16);
-                if(theirs != i) {
-                    err("WARNING: rchecksum for " + fontName + " was " + i  + " (0x"+ourStr+") "+ " but file said " + theirs +" (0x"+theirStr+")  - perhaps a different font?");
-                    return false;
-                } else {
-                    if(OPT_VERBOSE) {
-                        System.out.println(" rchecksum for " + fontName + " OK");
-                    }
-                    return true;
-                }
-            } else {
-                //if(OPT_VERBOSE) {
-                System.err.println("WARNING: rchecksum for " + fontName + " was " + i  + " (0x"+ourStr+") "+ " but rchecksum was MISSING. Old ICU data?");
-                //}
-            }
-        } catch (FileNotFoundException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-            return false;
-        } finally {
-            try {
-                fis.close();
-            } catch (IOException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
-        }
-        return true;
-    }
-
-
-    private Integer[] parseHexArray(String hex) {
-        List ret = new ArrayList();
-        String items[] = hex.split("[\\s,]");
-        for(String i : items) {
-            if(i.isEmpty()) continue;
-            if(i.startsWith("0x")) {
-                i = i.substring(2);
-            }
-            ret.add(Integer.parseInt(i, 16));
-        }
-        return ret.toArray(new Integer[0]);
-    }
-
-
-    private void err(String string) {
-        if(OPT_NOTHROW) {
-            System.out.println(id+" ERROR: " + string +" (continuing due to -n)");
-        } else {
-            throw new InternalError(id+ ": " + string);
-        }
-    }
-
-
-    private Font getFont(String fontName, Map fontAttrs) {
-        Font f;
-        if(false)
-            try {
-                f = Font.getFont(fontName);
-                if(f!=null)  {
-                    if(OPT_VERBOSE) {
-                        System.out.println("Loaded default path to " + fontName);
-                    }
-                    return f;
-                }
-            } catch(Throwable t) {
-                if(OPT_VERBOSE) {
-                    t.printStackTrace();
-                    System.out.println("problem loading font " + fontName + " - " + t.toString());
-                }
-            }
-
-        File homeDir = new File(System.getProperty("user.home"));
-        File fontDir = new File(homeDir, "fonts");
-        File fontFile = new File(fontDir, fontName);
-        //System.out.println("## trying " + fontFile.getAbsolutePath());
-        if(fontFile.canRead()) {
-            try {
-                if(!verifyFont(fontFile,fontAttrs)) {
-                    System.out.println("Warning: failed to verify " + fontName);
-                }
-                f = Font.createFont(Font.TRUETYPE_FONT, fontFile);
-                if(f!=null & OPT_VERBOSE) {
-                    System.out.println("> loaded from " + fontFile.getAbsolutePath() + " - " + f.toString());
-                }
-                return f;
-            } catch (FontFormatException e) {
-                if(OPT_VERBOSE) {
-                    e.printStackTrace();
-                    System.out.println("problem loading font " + fontName + " - " + e.toString());
-                }
-            } catch (IOException e) {
-                if(OPT_VERBOSE) {
-                    e.printStackTrace();
-                    System.out.println("problem loading font " + fontName + " - " + e.toString());
-                }
-            }
-        }
-        return null;
-    }
-
-
-    private static Map attrs(Node testCase) {
-        Map rv = new TreeMap();
-        NamedNodeMap nnm = testCase.getAttributes();
-        for(int i=0;i
-
-
-
-
-
-
-    
-        
-
-        श्रीमद् भगवद्गीता अध्याय अर्जुन विषाद योग धृतराष्ट्र उवाचृ धर्मक्षेत्रे कुरुक्षेत्रे समवेता युयुत्सवः मामकाः पाण्डवाश्चैव किमकुर्वत संजव
-
-        
-            0x0000009E, 0x0000009A, 0x00000051, 0x00000222, 0x00000098, 0x00000091, 0x00000051, 0x00000003, 
-            0x00000097, 0x00000082, 0x0000009D, 0x000001A5, 0x0000FFFF, 0x0000FFFF, 0x00000222, 0x0000008F, 
-            0x00000221, 0x00000003, 0x0000005C, 0x000000DA, 0x0000FFFF, 0x00000099, 0x00000221, 0x00000099, 
-            0x00000003, 0x0000005C, 0x00000087, 0x000001D5, 0x0000005B, 0x0000FFFF, 0x00000093, 0x00000003, 
-            0x000001D2, 0x0000009D, 0x0000009F, 0x00000221, 0x00000091, 0x00000003, 0x00000099, 0x0000022A, 
-            0x00000082, 0x00000003, 0x00000092, 0x000001D9, 0x0000008F, 0x0000009A, 0x00000221, 0x000001B4, 
-            0x0000FFFF, 0x0000FFFF, 0x0000009A, 0x00000051, 0x00000003, 0x00000060, 0x0000009D, 0x00000221, 
-            0x00000085, 0x000001D9, 0x00000003, 0x00000092, 0x00000098, 0x0000005B, 0x0000FFFF, 0x000000A2, 
-            0x0000FFFF, 0x0000FFFF, 0x0000022F, 0x0000008F, 0x0000009A, 0x00000051, 0x0000022F, 0x00000003, 
-            0x00000080, 0x000001D5, 0x0000009A, 0x000001FD, 0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x0000022F, 
-            0x0000008F, 0x0000009A, 0x00000051, 0x0000022F, 0x00000003, 0x000000A0, 0x00000098, 0x0000009D, 
-            0x0000022F, 0x0000008F, 0x00000221, 0x00000003, 0x00000099, 0x000001D5, 0x00000099, 0x000001D5, 
-            0x000000D7, 0x0000FFFF, 0x000000A0, 0x0000009D, 0x0000022C, 0x00000003, 0x00000098, 0x00000221, 
-            0x00000098, 0x00000080, 0x00000221, 0x0000022C, 0x00000003, 0x00000094, 0x00000221, 0x000000D6, 
-            0x0000FFFF, 0x0000008C, 0x0000009D, 0x00000221, 0x000001B1, 0x0000FFFF, 0x0000FFFF, 0x00000230, 
-            0x0000009D, 0x00000003, 0x000001D1, 0x00000080, 0x00000098, 0x00000080, 0x000001D5, 0x0000009D, 
-            0x0000005B, 0x0000FFFF, 0x0000008F, 0x00000003, 0x000000A0, 0x00000232, 0x00000087, 0x0000009D
-        
-
-        
-            0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, 
-            0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, 
-            0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, 
-            0x00000018, 0x00000019, 0x0000001C, 0x0000001D, 0x0000001A, 0x0000001B, 0x0000001E, 0x0000001F, 
-            0x00000021, 0x00000020, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, 
-            0x00000028, 0x00000029, 0x0000002A, 0x0000002B, 0x0000002C, 0x0000002D, 0x0000002E, 0x0000002F, 
-            0x00000030, 0x00000031, 0x00000033, 0x00000032, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 
-            0x00000038, 0x00000039, 0x0000003A, 0x0000003B, 0x0000003E, 0x0000003C, 0x0000003D, 0x0000003F, 
-            0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000045, 0x00000044, 0x00000046, 0x00000047, 
-            0x00000048, 0x00000049, 0x0000004A, 0x0000004B, 0x0000004C, 0x0000004D, 0x0000004E, 0x0000004F, 
-            0x00000050, 0x00000052, 0x00000051, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, 
-            0x00000058, 0x00000059, 0x0000005A, 0x0000005B, 0x0000005C, 0x0000005D, 0x0000005E, 0x0000005F, 
-            0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, 
-            0x00000068, 0x00000069, 0x0000006A, 0x0000006B, 0x0000006C, 0x0000006D, 0x0000006E, 0x0000006F, 
-            0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, 
-            0x00000078, 0x00000079, 0x0000007B, 0x0000007A, 0x0000007C, 0x0000007D, 0x0000007E, 0x00000081, 
-            0x0000007F, 0x00000080, 0x00000082, 0x00000083, 0x00000084, 0x00000085, 0x00000086, 0x00000087
-        
-
-        
-            0.000000, 0.000000, 9.468750, 0.000000, 19.130859, -0.451172, 15.984375, 0.000000, 
-            19.640625, 0.000000, 29.109375, 0.000000, 40.177734, -0.451172, 37.078125, 0.000000, 
-            43.078125, 0.000000, 52.546875, 0.000000, 62.015625, 0.000000, 69.984375, 0.000000, 
-            77.953125, 0.000000, 77.953125, 0.000000, 77.953125, 0.000000, 81.609375, 0.000000, 
-            89.578125, 0.000000, 93.234375, 0.000000, 99.234375, 0.000000, 109.171875, 0.000000, 
-            116.437500, 0.000000, 116.437500, 0.000000, 125.906250, 0.000000, 129.562500, 0.000000, 
-            139.031250, 0.000000, 145.031250, 0.000000, 154.968750, 0.000000, 164.718750, -0.011719, 
-            164.718750, 0.263672, 164.437500, 0.000000, 164.437500, 0.000000, 173.906250, 0.000000, 
-            179.906250, 0.000000, 184.265625, 0.000000, 192.234375, 0.000000, 200.203125, 0.000000, 
-            203.859375, 0.000000, 211.828125, 0.000000, 217.828125, 0.000000, 227.296875, 0.000000, 
-            231.375000, 0.000000, 240.843750, 0.000000, 246.843750, 0.000000, 256.740234, -0.011719, 
-            256.312500, 0.000000, 264.281250, 0.000000, 270.796875, 0.000000, 274.453125, 0.000000, 
-            282.796875, 0.000000, 282.796875, 0.000000, 282.796875, 0.000000, 292.458984, -0.451172, 
-            289.312500, 0.000000, 295.312500, 0.000000, 303.281250, 0.000000, 311.250000, 0.000000, 
-            314.906250, 0.000000, 324.890625, -0.011719, 324.375000, 0.000000, 330.375000, 0.000000, 
-            339.843750, 0.000000, 349.675781, 0.263672, 349.312500, 0.000000, 349.312500, 0.000000, 
-            360.187500, 0.000000, 360.187500, 0.000000, 359.384766, 0.275391, 360.187500, 0.000000, 
-            368.156250, 0.000000, 377.818359, -0.451172, 372.996094, 0.263672, 374.671875, 0.000000, 
-            380.671875, 0.000000, 388.371094, -0.011719, 391.546875, 0.000000, 398.062500, 0.000000, 
-            399.421875, 0.000000, 410.296875, 0.000000, 410.296875, 0.000000, 409.494141, 0.275391, 
-            410.296875, 0.000000, 418.265625, 0.000000, 427.927734, -0.451172, 423.105469, 0.263672, 
-            424.781250, 0.000000, 430.781250, 0.000000, 440.250000, 0.000000, 449.718750, 0.000000, 
-            456.832031, 0.263672, 457.687500, 0.000000, 465.656250, 0.000000, 469.312500, 0.000000, 
-            475.312500, 0.000000, 484.921875, -0.011719, 484.781250, 0.000000, 494.390625, -0.011719, 
-            494.250000, 0.000000, 500.179688, 0.000000, 500.179688, 0.000000, 509.648438, 0.000000, 
-            517.617188, 0.000000, 521.976562, 0.000000, 527.976562, 0.000000, 537.445312, 0.000000, 
-            541.101562, 0.000000, 550.570312, 0.000000, 561.445312, 0.000000, 565.101562, 0.000000, 
-            569.460938, 0.000000, 575.460938, 0.000000, 583.429688, 0.000000, 587.085938, 0.000000, 
-            594.351562, 0.000000, 594.351562, 0.000000, 602.320312, 0.000000, 610.289062, 0.000000, 
-            613.945312, 0.000000, 624.820312, 0.000000, 624.820312, 0.000000, 624.691406, 0.263672, 
-            624.820312, 0.000000, 632.789062, 0.000000, 638.789062, 0.000000, 643.148438, 0.000000, 
-            654.023438, 0.000000, 663.492188, 0.000000, 671.191406, -0.011719, 674.367188, 0.000000, 
-            682.628906, 0.263672, 682.335938, 0.000000, 682.335938, 0.000000, 690.304688, 0.000000, 
-            696.304688, 0.000000, 705.140625, 0.439453, 705.773438, 0.000000, 715.242188, 0.000000, 
-            723.210938, 0.000000
-        
-    
-
-    
-        
-
-        أساسًا، تتعامل الحواسيب فقط مع الأرقام، وتقوم بتخزين الأحرف والمحارف الأخرى بعد أن تُعطي رقما معينا لكل واحد منها. وقبل اختراع "يونِكود"، كان هناك مئات الأنظمة للتشفير وتخصيص هذه الأرقام للمحارف، ولم يوجد نظام تشفير واحد يحتوي على جميع المحارف الضرورية
-
-        
-            0x0000CE28, 0x0000CE87, 0x0000CE41, 0x0000CE81, 0x0000CE42, 0x0000CE54, 0x0000CE73, 0x0000CE21, 
-            0x00000003, 0x0000CE65, 0x0000CE41, 0x0000CE22, 0x0000CE38, 0x0000CE78, 0x0000CE73, 0x0000CE21, 
-            0x00000003, 0x0000CE5E, 0x0000CE88, 0x0000CE78, 0x0000CE33, 0x00000003, 0x0000CE84, 0x0000CE74, 
-            0x0000CE5F, 0x00000003, 0x0000CE85, 0x0000CE82, 0x0000CE2C, 0x0000CE38, 0x0000CE87, 0x00000003, 
-            0x0000CE3E, 0x0000CE37, 0x0000CE21, 0x0000CE81, 0x00000003, 0x0000CE42, 0x0000CE88, 0x0000CE68, 
-            0x0000CE4C, 0x0000CE2B, 0x00000003, 0x0000CE75, 0x0000CE22, 0x0000CE5C, 0x0000CE7B, 0x00000003, 
-            0x0000CE3E, 0x0000CE33, 0x0000CE82, 0x0000CE87, 0x00000003, 0x0000CE76, 0x0000CE73, 0x0000CE81, 
-            0x00000003, 0x00000588, 0x0000CE65, 0x0000CE41, 0x0000CE22, 0x0000CE38, 0x0000CE78, 0x0000CE74, 
-            0x0000CE73, 0x00000003, 0x0000CE75, 0x0000CE22, 0x0000CE6B, 0x0000CE41, 0x0000FFFE, 0x0000CE8B, 
-            0x0000CE21, 0x00000003, 0x0000CE7D, 0x0000CE40, 0x0000CE7F, 0x00000003, 0x0000CE4E, 0x0000CE88, 
-            0x0000CE50, 0x0000CE3C, 0x0000CE2B, 0x0000CE81, 0x00000003, 0x0000CE42, 0x0000CE88, 0x0000CE68, 
-            0x0000CE4C, 0x0000CE2C, 0x0000CE74, 0x0000CE73, 0x00000003, 0x0000CE28, 0x0000CE78, 0x0000CE5C, 
-            0x0000CE7B, 0x0000FFFE, 0x0000CE8B, 0x0000CE21, 0x00000003, 0x0000CE29, 0x0000CE22, 0x0000CE20, 
-            0x0000CE77, 0x00000003, 0x0000CE6D, 0x0000CE22, 0x0000CE7C, 0x0000CE7F, 0x00000003, 0x0000CE79, 
-            0x0000CE22, 0x0000CE6F, 0x00000003, 0x00000588, 0x00000005, 0x0000CE3D, 0x0000CE82, 0x0000CE70, 
-            0x000005B5, 0x0000CE7B, 0x0000CE82, 0x0000CE87, 0x00000005, 0x00000003, 0x0000CE5D, 0x0000CE21, 
-            0x0000CE42, 0x0000CE2C, 0x0000CE3B, 0x0000CE21, 0x00000003, 0x0000CE72, 0x0000CE26, 0x0000CE6B, 
-            0x0000CE81, 0x00000003, 0x00000011, 0x0000CE22, 0x0000CE80, 0x0000CE7C, 0x0000CE77, 0x00000003, 
-            0x0000CE3E, 0x0000CE37, 0x0000CE21, 0x0000CE81, 0x00000003, 0x0000CE72, 0x0000CE70, 0x0000CE73, 
-            0x00000003, 0x0000CE22, 0x0000CE7C, 0x0000CE88, 0x0000CE60, 0x0000CE77, 0x00000003, 0x0000CE22, 
-            0x0000CE78, 0x0000CE6B, 0x0000CE41, 0x00000003, 0x0000CE86, 0x0000CE58, 0x0000CE60, 0x000005B4, 
-            0x0000CE2B, 0x00000003, 0x0000CE79, 0x0000CE17, 0x00000003, 0x0000CE3E, 0x0000CE60, 0x0000CE25, 
-            0x00000003, 0x0000CE83, 0x0000CE42, 0x0000CE3B, 0x0000FFFE, 0x0000CE8B, 0x0000CE21, 0x00000003, 
-            0x0000CE65, 0x0000CE41, 0x0000CE22, 0x0000CE38, 0x0000CE78, 0x0000CE73, 0x0000CE21, 0x0000CE81, 
-            0x00000003, 0x0000CE65, 0x0000CE42, 0x0000CE37, 0x0000FFFE, 0x0000CE8B, 0x0000CE21, 0x00000003, 
-            0x0000CE7A, 0x0000CE87, 0x0000CE44, 0x0000CE3C, 0x0000CE2C, 0x0000CE25, 0x00000003, 0x0000CE75, 
-            0x0000CE82, 0x0000CE6C, 0x0000CE2B, 0x0000CE81, 0x00000003, 0x00000588, 0x0000CE75, 0x0000CE22, 
-            0x0000CE6B, 0x0000CE41, 0x0000FFFE, 0x0000CE8B, 0x0000CE21, 0x00000003, 0x0000CE5E, 0x0000CE77, 
-            0x00000003, 0x0000CE56, 0x0000CE6C, 0x0000CE67, 0x00000003, 0x0000CE24, 0x0000CE88, 0x0000CE47, 
-            0x0000CE21, 0x0000CE82, 0x0000CE38, 0x0000CE73, 0x0000CE21, 0x00000003, 0x0000CE72, 0x0000CE77, 
-            0x0000CE22, 0x0000CE60, 0x0000CE2C, 0x0000CE2B, 0x00000003, 0x00000588, 0x0000CE22, 0x000005B0, 
-            0x0000CE47, 0x0000CE22, 0x0000CE47, 0x0000CE17
-        
-
-        
-            0x000000FB, 0x000000FA, 0x000000F9, 0x000000F8, 0x000000F7, 0x000000F6, 0x000000F5, 0x000000F4, 
-            0x000000F3, 0x000000F2, 0x000000F1, 0x000000F0, 0x000000EF, 0x000000EE, 0x000000ED, 0x000000EC, 
-            0x000000EB, 0x000000EA, 0x000000E9, 0x000000E8, 0x000000E7, 0x000000E6, 0x000000E5, 0x000000E4, 
-            0x000000E3, 0x000000E2, 0x000000E1, 0x000000E0, 0x000000DF, 0x000000DE, 0x000000DD, 0x000000DC, 
-            0x000000DB, 0x000000DA, 0x000000D9, 0x000000D8, 0x000000D7, 0x000000D6, 0x000000D5, 0x000000D4, 
-            0x000000D3, 0x000000D2, 0x000000D1, 0x000000D0, 0x000000CF, 0x000000CE, 0x000000CD, 0x000000CC, 
-            0x000000CB, 0x000000CA, 0x000000C9, 0x000000C8, 0x000000C7, 0x000000C6, 0x000000C5, 0x000000C4, 
-            0x000000C3, 0x000000C2, 0x000000C1, 0x000000C0, 0x000000BF, 0x000000BE, 0x000000BD, 0x000000BC, 
-            0x000000BB, 0x000000BA, 0x000000B9, 0x000000B8, 0x000000B7, 0x000000B6, 0x000000B5, 0x000000B4, 
-            0x000000B3, 0x000000B2, 0x000000B1, 0x000000B0, 0x000000AF, 0x000000AE, 0x000000AD, 0x000000AC, 
-            0x000000AB, 0x000000AA, 0x000000A9, 0x000000A8, 0x000000A7, 0x000000A6, 0x000000A5, 0x000000A4, 
-            0x000000A3, 0x000000A2, 0x000000A1, 0x000000A0, 0x0000009F, 0x0000009E, 0x0000009D, 0x0000009C, 
-            0x0000009B, 0x0000009A, 0x00000099, 0x00000098, 0x00000097, 0x00000096, 0x00000095, 0x00000094, 
-            0x00000093, 0x00000092, 0x00000091, 0x00000090, 0x0000008F, 0x0000008E, 0x0000008D, 0x0000008C, 
-            0x0000008B, 0x0000008A, 0x00000089, 0x00000088, 0x00000087, 0x00000086, 0x00000085, 0x00000084, 
-            0x00000083, 0x00000082, 0x00000081, 0x00000080, 0x0000007F, 0x0000007E, 0x0000007D, 0x0000007C, 
-            0x0000007B, 0x0000007A, 0x00000079, 0x00000078, 0x00000077, 0x00000076, 0x00000075, 0x00000074, 
-            0x00000073, 0x00000072, 0x00000071, 0x00000070, 0x0000006F, 0x0000006E, 0x0000006D, 0x0000006C, 
-            0x0000006B, 0x0000006A, 0x00000069, 0x00000068, 0x00000067, 0x00000066, 0x00000065, 0x00000064, 
-            0x00000063, 0x00000062, 0x00000061, 0x00000060, 0x0000005F, 0x0000005E, 0x0000005D, 0x0000005C, 
-            0x0000005B, 0x0000005A, 0x00000059, 0x00000058, 0x00000057, 0x00000056, 0x00000055, 0x00000054, 
-            0x00000053, 0x00000052, 0x00000051, 0x00000050, 0x0000004F, 0x0000004E, 0x0000004D, 0x0000004C, 
-            0x0000004B, 0x0000004A, 0x00000049, 0x00000048, 0x00000047, 0x00000046, 0x00000045, 0x00000044, 
-            0x00000043, 0x00000042, 0x00000041, 0x00000040, 0x0000003F, 0x0000003E, 0x0000003D, 0x0000003C, 
-            0x0000003B, 0x0000003A, 0x00000039, 0x00000038, 0x00000037, 0x00000036, 0x00000035, 0x00000034, 
-            0x00000033, 0x00000032, 0x00000031, 0x00000030, 0x0000002F, 0x0000002E, 0x0000002D, 0x0000002C, 
-            0x0000002B, 0x0000002A, 0x00000029, 0x00000028, 0x00000027, 0x00000026, 0x00000025, 0x00000024, 
-            0x00000023, 0x00000022, 0x00000021, 0x00000020, 0x0000001F, 0x0000001E, 0x0000001D, 0x0000001C, 
-            0x0000001B, 0x0000001A, 0x00000019, 0x00000018, 0x00000017, 0x00000016, 0x00000015, 0x00000014, 
-            0x00000013, 0x00000012, 0x00000011, 0x00000010, 0x0000000F, 0x0000000E, 0x0000000D, 0x0000000C, 
-            0x0000000B, 0x0000000A, 0x00000009, 0x00000008, 0x00000007, 0x00000006, 0x00000005, 0x00000004, 
-            0x00000003, 0x00000002, 0x00000001, 0x00000000
-        
-
-        
-            0.000000, 0.000000, 4.007812, 0.000000, 8.226562, 0.000000, 12.679688, 0.000000, 
-            18.679688, 0.000000, 23.132812, 0.000000, 31.289062, 0.000000, 34.312500, 0.000000, 
-            36.375000, 0.000000, 41.062500, 0.000000, 50.296875, 0.000000, 54.750000, 0.000000, 
-            56.859375, 0.000000, 62.367188, 0.000000, 66.632812, 0.000000, 69.656250, 0.000000, 
-            71.718750, 0.000000, 76.406250, 0.000000, 81.421875, 0.000000, 85.664062, 0.000000, 
-            89.929688, 0.000000, 95.742188, 0.000000, 100.429688, 0.000000, 108.796875, 0.000000, 
-            112.171875, 0.000000, 115.734375, 0.000000, 120.421875, 0.000000, 128.765625, 0.000000, 
-            134.765625, 0.000000, 139.007812, 0.000000, 144.515625, 0.000000, 148.734375, 0.000000, 
-            153.421875, 0.000000, 157.359375, 0.000000, 163.171875, 0.000000, 165.234375, 0.000000, 
-            171.234375, 0.000000, 175.921875, 0.000000, 180.375000, 0.000000, 184.617188, 0.000000, 
-            188.085938, 0.000000, 195.117188, 0.000000, 199.312500, 0.000000, 204.000000, 0.000000, 
-            208.007812, 0.000000, 210.117188, 0.000000, 217.054688, 0.000000, 220.429688, 0.000000, 
-            225.117188, 0.000000, 229.054688, 0.000000, 234.867188, 0.000000, 240.867188, 0.000000, 
-            245.085938, 0.000000, 249.773438, 0.000000, 253.781250, 0.000000, 256.804688, 0.000000, 
-            262.804688, 0.000000, 267.492188, 0.000000, 271.007812, 0.000000, 280.242188, 0.000000, 
-            284.695312, 0.000000, 286.804688, 0.000000, 292.312500, 0.000000, 296.578125, 0.000000, 
-            299.953125, 0.000000, 302.976562, 0.000000, 307.664062, 0.000000, 311.671875, 0.000000, 
-            313.781250, 0.000000, 317.882812, 0.000000, 322.335938, 0.000000, 322.335938, 0.000000, 
-            328.500000, 0.000000, 330.562500, 0.000000, 335.250000, 0.000000, 339.140625, 0.000000, 
-            343.078125, 0.000000, 348.984375, 0.000000, 353.671875, 0.000000, 366.445312, 0.000000, 
-            370.687500, 0.000000, 378.843750, 0.000000, 384.351562, 0.000000, 388.546875, 0.000000, 
-            394.546875, 0.000000, 399.234375, 0.000000, 403.687500, 0.000000, 407.929688, 0.000000, 
-            411.398438, 0.000000, 418.429688, 0.000000, 422.671875, 0.000000, 426.046875, 0.000000, 
-            429.070312, 0.000000, 433.757812, 0.000000, 437.765625, 0.000000, 442.031250, 0.000000, 
-            448.968750, 0.000000, 452.343750, 0.000000, 452.343750, 0.000000, 458.507812, 0.000000, 
-            460.570312, 0.000000, 465.257812, 0.000000, 474.492188, 0.000000, 476.601562, 0.000000, 
-            480.843750, 0.000000, 485.109375, 0.000000, 489.796875, 0.000000, 497.437500, 0.000000, 
-            499.546875, 0.000000, 503.765625, 0.000000, 509.671875, 0.000000, 514.359375, 0.000000, 
-            521.671875, 0.000000, 523.781250, 0.000000, 529.453125, 0.000000, 534.140625, 0.000000, 
-            537.656250, 0.000000, 543.046875, 0.000000, 546.585938, 0.000000, 552.585938, 0.000000, 
-            560.367188, 0.000000, 560.367188, 0.000000, 563.742188, 0.000000, 569.742188, 0.000000, 
-            573.960938, 0.000000, 579.351562, 0.000000, 584.039062, 0.000000, 589.851562, 0.000000, 
-            591.914062, 0.000000, 596.367188, 0.000000, 600.609375, 0.000000, 606.421875, 0.000000, 
-            608.484375, 0.000000, 613.171875, 0.000000, 619.570312, 0.000000, 623.812500, 0.000000, 
-            627.914062, 0.000000, 633.914062, 0.000000, 638.601562, 0.000000, 641.929688, 0.000000, 
-            644.039062, 0.000000, 647.789062, 0.000000, 652.007812, 0.000000, 656.273438, 0.000000, 
-            660.960938, 0.000000, 664.898438, 0.000000, 670.710938, 0.000000, 672.773438, 0.000000, 
-            678.773438, 0.000000, 683.460938, 0.000000, 689.859375, 0.000000, 697.640625, 0.000000, 
-            700.664062, 0.000000, 705.351562, 0.000000, 707.460938, 0.000000, 711.679688, 0.000000, 
-            715.921875, 0.000000, 719.390625, 0.000000, 723.656250, 0.000000, 728.343750, 0.000000, 
-            730.453125, 0.000000, 734.718750, 0.000000, 738.820312, 0.000000, 743.273438, 0.000000, 
-            747.960938, 0.000000, 756.328125, 0.000000, 763.265625, 0.000000, 766.734375, 0.000000, 
-            766.734375, 0.000000, 770.929688, 0.000000, 775.617188, 0.000000, 782.929688, 0.000000, 
-            785.273438, 0.000000, 789.960938, 0.000000, 793.898438, 0.000000, 797.367188, 0.000000, 
-            800.812500, 0.000000, 805.500000, 0.000000, 813.843750, 0.000000, 818.296875, 0.000000, 
-            824.109375, 0.000000, 824.109375, 0.000000, 830.273438, 0.000000, 832.335938, 0.000000, 
-            837.023438, 0.000000, 846.257812, 0.000000, 850.710938, 0.000000, 852.820312, 0.000000, 
-            858.328125, 0.000000, 862.593750, 0.000000, 865.617188, 0.000000, 867.679688, 0.000000, 
-            873.679688, 0.000000, 878.367188, 0.000000, 887.601562, 0.000000, 892.054688, 0.000000, 
-            897.867188, 0.000000, 897.867188, 0.000000, 904.031250, 0.000000, 906.093750, 0.000000, 
-            910.781250, 0.000000, 918.257812, 0.000000, 922.476562, 0.000000, 926.929688, 0.000000, 
-            932.437500, 0.000000, 936.679688, 0.000000, 940.125000, 0.000000, 944.812500, 0.000000, 
-            948.820312, 0.000000, 954.820312, 0.000000, 958.289062, 0.000000, 962.484375, 0.000000, 
-            968.484375, 0.000000, 973.171875, 0.000000, 976.687500, 0.000000, 980.695312, 0.000000, 
-            982.804688, 0.000000, 986.906250, 0.000000, 991.359375, 0.000000, 991.359375, 0.000000, 
-            997.523438, 0.000000, 999.585938, 0.000000, 1004.273438, 0.000000, 1009.289062, 0.000000, 
-            1013.554688, 0.000000, 1018.242188, 0.000000, 1026.187500, 0.000000, 1029.656250, 0.000000, 
-            1033.757812, 0.000000, 1038.445312, 0.000000, 1047.796875, 0.000000, 1052.039062, 0.000000, 
-            1058.859375, 0.000000, 1060.921875, 0.000000, 1066.921875, 0.000000, 1072.429688, 0.000000, 
-            1075.453125, 0.000000, 1077.515625, 0.000000, 1082.203125, 0.000000, 1088.601562, 0.000000, 
-            1092.867188, 0.000000, 1094.976562, 0.000000, 1098.445312, 0.000000, 1102.687500, 0.000000, 
-            1106.882812, 0.000000, 1111.570312, 0.000000, 1115.085938, 0.000000, 1117.195312, 0.000000, 
-            1117.195312, 0.000000, 1124.015625, 0.000000, 1126.125000, 0.000000, 1132.945312, 0.000000, 
-            1135.289062, 0.000000
-        
-    
-
-    
-        
-
-        أساسًا، تتعامل الحواسيب فقط مع الأرقام، وتقوم بتخزين الأحرف والمحارف الأخرى بعد أن تُعطي رقما معينا لكل واحد منها. وقبل اختراع "يونِكود"، كان هناك مئات الأنظمة للتشفير وتخصيص هذه الأرقام للمحارف، ولم يوجد نظام تشفير واحد يحتوي على جميع المحارف الضرورية
-
-        
-            0x00000872, 0x000008D1, 0x000003F9, 0x0000040B, 0x0000088C, 0x0000089E, 0x000008BD, 0x000003EF, 
-            0x00000003, 0x00000404, 0x000003F9, 0x0000086C, 0x00000882, 0x000008C2, 0x000008BD, 0x000003EF, 
-            0x00000003, 0x000008A8, 0x000008D2, 0x000008C2, 0x0000087D, 0x00000003, 0x000008CE, 0x000008BE, 
-            0x000008A9, 0x00000003, 0x0000040D, 0x000008CC, 0x00000876, 0x00000882, 0x000008D1, 0x00000003, 
-            0x00000888, 0x00000881, 0x000003EF, 0x0000040B, 0x00000003, 0x0000088C, 0x000008D2, 0x000008B2, 
-            0x00000896, 0x00000875, 0x00000003, 0x00000408, 0x0000086C, 0x000008A6, 0x000008C5, 0x00000003, 
-            0x00000888, 0x0000087D, 0x000008CC, 0x000008D1, 0x00000003, 0x000008C0, 0x000008BD, 0x0000040B, 
-            0x00000003, 0x000003E6, 0x00000404, 0x000003F9, 0x0000086C, 0x00000882, 0x000008C2, 0x000008BE, 
-            0x000008BD, 0x00000003, 0x00000408, 0x0000086C, 0x000008B5, 0x000003F9, 0x0000FFFF, 0x000008D5, 
-            0x000003EF, 0x00000003, 0x0000040A, 0x0000088A, 0x000008C9, 0x00000003, 0x00000898, 0x000008D2, 
-            0x0000089A, 0x00000886, 0x00000875, 0x0000040B, 0x00000003, 0x0000088C, 0x000008D2, 0x000008B2, 
-            0x00000896, 0x00000876, 0x000008BE, 0x000008BD, 0x00000003, 0x00000872, 0x000008C2, 0x000008A6, 
-            0x000008C5, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, 0x000003F2, 0x0000086C, 0x0000086A, 
-            0x000008C1, 0x00000003, 0x00000406, 0x0000086C, 0x000008C6, 0x000008C9, 0x00000003, 0x00000409, 
-            0x0000086C, 0x000008B9, 0x00000003, 0x000003E6, 0x00000005, 0x000003F7, 0x000008CC, 0x000008BA, 
-            0x00000413, 0x000008C5, 0x000008CC, 0x000008D1, 0x00000005, 0x00000003, 0x00000401, 0x000003EF, 
-            0x0000088C, 0x00000876, 0x00000885, 0x000003EF, 0x00000003, 0x000008BC, 0x00000870, 0x000008B5, 
-            0x0000040B, 0x00000003, 0x00000011, 0x0000086C, 0x000008CA, 0x000008C6, 0x000008C1, 0x00000003, 
-            0x00000888, 0x00000881, 0x000003EF, 0x0000040B, 0x00000003, 0x000008BC, 0x000008BA, 0x000008BD, 
-            0x00000003, 0x0000086C, 0x000008C6, 0x000008D2, 0x000008AA, 0x000008C1, 0x00000003, 0x0000086C, 
-            0x000008C2, 0x000008B5, 0x000003F9, 0x00000003, 0x000008D0, 0x000008A2, 0x000008AA, 0x00000412, 
-            0x00000875, 0x00000003, 0x00000409, 0x000003EB, 0x00000003, 0x00000888, 0x000008AA, 0x0000086F, 
-            0x00000003, 0x0000040C, 0x0000088C, 0x00000885, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, 
-            0x00000404, 0x000003F9, 0x0000086C, 0x00000882, 0x000008C2, 0x000008BD, 0x000003EF, 0x0000040B, 
-            0x00000003, 0x00000404, 0x0000088C, 0x00000881, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, 
-            0x000008C4, 0x000008D1, 0x0000088E, 0x00000886, 0x00000876, 0x0000086F, 0x00000003, 0x00000408, 
-            0x000008CC, 0x000008B6, 0x00000875, 0x0000040B, 0x00000003, 0x000003E6, 0x00000408, 0x0000086C, 
-            0x000008B5, 0x000003F9, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, 0x000008A8, 0x000008C1, 
-            0x00000003, 0x000008A0, 0x000008B6, 0x000008B1, 0x00000003, 0x0000086E, 0x000008D2, 0x00000891, 
-            0x000003EF, 0x000008CC, 0x00000882, 0x000008BD, 0x000003EF, 0x00000003, 0x000008BC, 0x000008C1, 
-            0x0000086C, 0x000008AA, 0x00000876, 0x00000875, 0x00000003, 0x000003E6, 0x0000086C, 0x0000040E, 
-            0x00000891, 0x0000086C, 0x00000891, 0x000003EB
-        
-
-        
-            0x000000FB, 0x000000FA, 0x000000F9, 0x000000F8, 0x000000F7, 0x000000F6, 0x000000F5, 0x000000F4, 
-            0x000000F3, 0x000000F2, 0x000000F1, 0x000000F0, 0x000000EF, 0x000000EE, 0x000000ED, 0x000000EC, 
-            0x000000EB, 0x000000EA, 0x000000E9, 0x000000E8, 0x000000E7, 0x000000E6, 0x000000E5, 0x000000E4, 
-            0x000000E3, 0x000000E2, 0x000000E1, 0x000000E0, 0x000000DF, 0x000000DE, 0x000000DD, 0x000000DC, 
-            0x000000DB, 0x000000DA, 0x000000D9, 0x000000D8, 0x000000D7, 0x000000D6, 0x000000D5, 0x000000D4, 
-            0x000000D3, 0x000000D2, 0x000000D1, 0x000000D0, 0x000000CF, 0x000000CE, 0x000000CD, 0x000000CC, 
-            0x000000CB, 0x000000CA, 0x000000C9, 0x000000C8, 0x000000C7, 0x000000C6, 0x000000C5, 0x000000C4, 
-            0x000000C3, 0x000000C2, 0x000000C1, 0x000000C0, 0x000000BF, 0x000000BE, 0x000000BD, 0x000000BC, 
-            0x000000BB, 0x000000BA, 0x000000B9, 0x000000B8, 0x000000B7, 0x000000B6, 0x000000B5, 0x000000B4, 
-            0x000000B3, 0x000000B2, 0x000000B1, 0x000000B0, 0x000000AF, 0x000000AE, 0x000000AD, 0x000000AC, 
-            0x000000AB, 0x000000AA, 0x000000A9, 0x000000A8, 0x000000A7, 0x000000A6, 0x000000A5, 0x000000A4, 
-            0x000000A3, 0x000000A2, 0x000000A1, 0x000000A0, 0x0000009F, 0x0000009E, 0x0000009D, 0x0000009C, 
-            0x0000009B, 0x0000009A, 0x00000099, 0x00000098, 0x00000097, 0x00000096, 0x00000095, 0x00000094, 
-            0x00000093, 0x00000092, 0x00000091, 0x00000090, 0x0000008F, 0x0000008E, 0x0000008D, 0x0000008C, 
-            0x0000008B, 0x0000008A, 0x00000089, 0x00000088, 0x00000087, 0x00000086, 0x00000085, 0x00000084, 
-            0x00000083, 0x00000082, 0x00000081, 0x00000080, 0x0000007F, 0x0000007E, 0x0000007D, 0x0000007C, 
-            0x0000007B, 0x0000007A, 0x00000079, 0x00000078, 0x00000077, 0x00000076, 0x00000075, 0x00000074, 
-            0x00000073, 0x00000072, 0x00000071, 0x00000070, 0x0000006F, 0x0000006E, 0x0000006D, 0x0000006C, 
-            0x0000006B, 0x0000006A, 0x00000069, 0x00000068, 0x00000067, 0x00000066, 0x00000065, 0x00000064, 
-            0x00000063, 0x00000062, 0x00000061, 0x00000060, 0x0000005F, 0x0000005E, 0x0000005D, 0x0000005C, 
-            0x0000005B, 0x0000005A, 0x00000059, 0x00000058, 0x00000057, 0x00000056, 0x00000055, 0x00000054, 
-            0x00000053, 0x00000052, 0x00000051, 0x00000050, 0x0000004F, 0x0000004E, 0x0000004D, 0x0000004C, 
-            0x0000004B, 0x0000004A, 0x00000049, 0x00000048, 0x00000047, 0x00000046, 0x00000045, 0x00000044, 
-            0x00000043, 0x00000042, 0x00000041, 0x00000040, 0x0000003F, 0x0000003E, 0x0000003D, 0x0000003C, 
-            0x0000003B, 0x0000003A, 0x00000039, 0x00000038, 0x00000037, 0x00000036, 0x00000035, 0x00000034, 
-            0x00000033, 0x00000032, 0x00000031, 0x00000030, 0x0000002F, 0x0000002E, 0x0000002D, 0x0000002C, 
-            0x0000002B, 0x0000002A, 0x00000029, 0x00000028, 0x00000027, 0x00000026, 0x00000025, 0x00000024, 
-            0x00000023, 0x00000022, 0x00000021, 0x00000020, 0x0000001F, 0x0000001E, 0x0000001D, 0x0000001C, 
-            0x0000001B, 0x0000001A, 0x00000019, 0x00000018, 0x00000017, 0x00000016, 0x00000015, 0x00000014, 
-            0x00000013, 0x00000012, 0x00000011, 0x00000010, 0x0000000F, 0x0000000E, 0x0000000D, 0x0000000C, 
-            0x0000000B, 0x0000000A, 0x00000009, 0x00000008, 0x00000007, 0x00000006, 0x00000005, 0x00000004, 
-            0x00000003, 0x00000002, 0x00000001, 0x00000000
-        
-
-        
-            0.000000, 0.000000, 6.316406, 0.000000, 10.382812, 0.000000, 15.492188, 0.000000, 
-            21.035156, 0.000000, 27.058594, 0.000000, 39.527344, 0.000000, 43.792969, 0.000000, 
-            47.408203, 0.000000, 51.205078, 0.000000, 66.216797, 0.000000, 71.326172, 0.000000, 
-            74.695312, 0.000000, 83.367188, 0.000000, 90.826172, 0.000000, 95.091797, 0.000000, 
-            98.707031, 0.000000, 102.503906, 0.000000, 109.962891, 0.000000, 114.949219, 0.000000, 
-            122.408203, 0.000000, 130.687500, 0.000000, 134.484375, 0.000000, 145.787109, 0.000000, 
-            150.773438, 0.000000, 156.884766, 0.000000, 160.681641, 0.000000, 172.277344, 0.000000, 
-            177.919922, 0.000000, 182.906250, 0.000000, 191.578125, 0.000000, 195.644531, 0.000000, 
-            199.441406, 0.000000, 206.507812, 0.000000, 214.787109, 0.000000, 218.402344, 0.000000, 
-            223.945312, 0.000000, 227.742188, 0.000000, 233.765625, 0.000000, 238.751953, 0.000000, 
-            245.185547, 0.000000, 257.982422, 0.000000, 262.048828, 0.000000, 265.845703, 0.000000, 
-            272.654297, 0.000000, 276.023438, 0.000000, 285.240234, 0.000000, 289.306641, 0.000000, 
-            293.103516, 0.000000, 300.169922, 0.000000, 308.449219, 0.000000, 314.091797, 0.000000, 
-            318.158203, 0.000000, 321.955078, 0.000000, 329.572266, 0.000000, 333.837891, 0.000000, 
-            339.380859, 0.000000, 343.177734, 0.000000, 346.974609, 0.000000, 361.986328, 0.000000, 
-            367.095703, 0.000000, 370.464844, 0.000000, 379.136719, 0.000000, 386.595703, 0.000000, 
-            391.582031, 0.000000, 395.847656, 0.000000, 399.644531, 0.000000, 406.453125, 0.000000, 
-            409.822266, 0.000000, 415.523438, 0.000000, 420.632812, 0.000000, 420.632812, 0.000000, 
-            427.441406, 0.000000, 431.056641, 0.000000, 434.853516, 0.000000, 441.357422, 0.000000, 
-            448.423828, 0.000000, 455.912109, 0.000000, 459.708984, 0.000000, 479.255859, 0.000000, 
-            484.242188, 0.000000, 496.710938, 0.000000, 505.382812, 0.000000, 509.449219, 0.000000, 
-            514.992188, 0.000000, 518.789062, 0.000000, 524.812500, 0.000000, 529.798828, 0.000000, 
-            536.232422, 0.000000, 549.029297, 0.000000, 554.015625, 0.000000, 559.001953, 0.000000, 
-            563.267578, 0.000000, 567.064453, 0.000000, 573.380859, 0.000000, 580.839844, 0.000000, 
-            590.056641, 0.000000, 594.123047, 0.000000, 594.123047, 0.000000, 600.931641, 0.000000, 
-            604.546875, 0.000000, 608.343750, 0.000000, 620.636719, 0.000000, 624.005859, 0.000000, 
-            628.992188, 0.000000, 635.830078, 0.000000, 639.626953, 0.000000, 653.361328, 0.000000, 
-            656.730469, 0.000000, 661.716797, 0.000000, 669.205078, 0.000000, 673.001953, 0.000000, 
-            683.777344, 0.000000, 687.146484, 0.000000, 692.660156, 0.000000, 696.457031, 0.000000, 
-            700.253906, 0.000000, 704.736328, 0.000000, 711.105469, 0.000000, 716.748047, 0.000000, 
-            722.994141, 0.000000, 722.994141, 0.000000, 727.060547, 0.000000, 732.703125, 0.000000, 
-            736.769531, 0.000000, 741.251953, 0.000000, 745.048828, 0.000000, 752.507812, 0.000000, 
-            756.123047, 0.000000, 762.146484, 0.000000, 767.132812, 0.000000, 775.412109, 0.000000, 
-            779.027344, 0.000000, 782.824219, 0.000000, 794.203125, 0.000000, 799.189453, 0.000000, 
-            804.890625, 0.000000, 810.433594, 0.000000, 814.230469, 0.000000, 818.027344, 0.000000, 
-            821.396484, 0.000000, 828.128906, 0.000000, 833.115234, 0.000000, 839.953125, 0.000000, 
-            843.750000, 0.000000, 850.816406, 0.000000, 859.095703, 0.000000, 862.710938, 0.000000, 
-            868.253906, 0.000000, 872.050781, 0.000000, 883.429688, 0.000000, 889.675781, 0.000000, 
-            893.941406, 0.000000, 897.738281, 0.000000, 901.107422, 0.000000, 906.093750, 0.000000, 
-            911.080078, 0.000000, 917.800781, 0.000000, 924.638672, 0.000000, 928.435547, 0.000000, 
-            931.804688, 0.000000, 939.263672, 0.000000, 944.964844, 0.000000, 950.074219, 0.000000, 
-            953.871094, 0.000000, 965.173828, 0.000000, 974.390625, 0.000000, 981.111328, 0.000000, 
-            981.111328, 0.000000, 985.177734, 0.000000, 988.974609, 0.000000, 999.750000, 0.000000, 
-            1003.365234, 0.000000, 1007.162109, 0.000000, 1014.228516, 0.000000, 1020.949219, 0.000000, 
-            1025.015625, 0.000000, 1028.812500, 0.000000, 1040.408203, 0.000000, 1046.431641, 0.000000, 
-            1054.710938, 0.000000, 1054.710938, 0.000000, 1061.519531, 0.000000, 1065.134766, 0.000000, 
-            1068.931641, 0.000000, 1083.943359, 0.000000, 1089.052734, 0.000000, 1092.421875, 0.000000, 
-            1101.093750, 0.000000, 1108.552734, 0.000000, 1112.818359, 0.000000, 1116.433594, 0.000000, 
-            1121.976562, 0.000000, 1125.773438, 0.000000, 1140.785156, 0.000000, 1146.808594, 0.000000, 
-            1155.087891, 0.000000, 1155.087891, 0.000000, 1161.896484, 0.000000, 1165.511719, 0.000000, 
-            1169.308594, 0.000000, 1180.541016, 0.000000, 1184.607422, 0.000000, 1190.630859, 0.000000, 
-            1199.302734, 0.000000, 1204.289062, 0.000000, 1208.355469, 0.000000, 1212.152344, 0.000000, 
-            1218.960938, 0.000000, 1224.603516, 0.000000, 1231.037109, 0.000000, 1235.103516, 0.000000, 
-            1240.646484, 0.000000, 1244.443359, 0.000000, 1248.240234, 0.000000, 1255.048828, 0.000000, 
-            1258.417969, 0.000000, 1264.119141, 0.000000, 1269.228516, 0.000000, 1269.228516, 0.000000, 
-            1276.037109, 0.000000, 1279.652344, 0.000000, 1283.449219, 0.000000, 1290.908203, 0.000000, 
-            1297.746094, 0.000000, 1301.542969, 0.000000, 1311.427734, 0.000000, 1317.861328, 0.000000, 
-            1323.562500, 0.000000, 1327.359375, 0.000000, 1341.492188, 0.000000, 1346.478516, 0.000000, 
-            1357.904297, 0.000000, 1361.519531, 0.000000, 1367.162109, 0.000000, 1375.833984, 0.000000, 
-            1380.099609, 0.000000, 1383.714844, 0.000000, 1387.511719, 0.000000, 1398.890625, 0.000000, 
-            1405.728516, 0.000000, 1409.097656, 0.000000, 1415.818359, 0.000000, 1420.804688, 0.000000, 
-            1424.871094, 0.000000, 1428.667969, 0.000000, 1432.464844, 0.000000, 1435.833984, 0.000000, 
-            1435.833984, 0.000000, 1447.259766, 0.000000, 1450.628906, 0.000000, 1462.054688, 0.000000, 
-            1465.669922, 0.000000
-        
-    
-
-    
-        
-
-        บทที่๑พายุไซโคลนโดโรธีอาศัยอยู่ท่ามกลางทุ่งใหญ่ในแคนซัสกับลุงเฮนรีชาวไร่และป้าเอ็มภรรยาชาวไร่บ้านของพวกเขาหลังเล็กเพราะไม้สร้างบ้านต้องขนมาด้วยเกวียนเป็นระยะทางหลายไมล์
-
-        
-            0x000000F3, 0x000000F0, 0x000000F0, 0x0000010E, 0x0000011D, 0x00000126, 0x000000F7, 0x0000010B, 
-            0x000000FB, 0x00000111, 0x00000119, 0x000000E4, 0x00000117, 0x000000DD, 0x000000FE, 0x000000F2, 
-            0x00000117, 0x000000ED, 0x00000117, 0x000000FC, 0x000000F1, 0x0000010E, 0x00000106, 0x0000010B, 
-            0x00000101, 0x0000010A, 0x000000FB, 0x00000106, 0x000000FB, 0x00000112, 0x0000013B, 0x000000F0, 
-            0x0000013B, 0x0000010B, 0x000000FA, 0x000000DA, 0x000000FE, 0x0000010B, 0x000000E0, 0x000000F0, 
-            0x00000111, 0x0000013B, 0x000000E0, 0x00000118, 0x00000104, 0x000000E6, 0x0000013B, 0x00000118, 
-            0x000000F2, 0x00000116, 0x000000DD, 0x000000F2, 0x000000E4, 0x0000010A, 0x00000103, 0x000000DA, 
-            0x0000010A, 0x000000F3, 0x000000FE, 0x00000111, 0x000000E0, 0x00000115, 0x00000107, 0x000000F2, 
-            0x000000FC, 0x0000010E, 0x000000E3, 0x0000010B, 0x00000100, 0x00000119, 0x000000FC, 0x0000013B, 
-            0x00000116, 0x000000FE, 0x00000109, 0x000000F4, 0x00000137, 0x0000010B, 0x00000115, 0x00000106, 
-            0x0000011C, 0x000000FA, 0x000000F9, 0x000000FC, 0x000000FC, 0x000000FB, 0x0000010B, 0x000000E3, 
-            0x0000010B, 0x00000100, 0x00000119, 0x000000FC, 0x0000013B, 0x000000F3, 0x0000013C, 0x0000010B, 
-            0x000000F2, 0x000000DB, 0x00000106, 0x000000E0, 0x000000F7, 0x00000100, 0x000000DA, 0x00000115, 
-            0x000000DB, 0x0000010B, 0x00000104, 0x000000FE, 0x0000010A, 0x000000E0, 0x00000115, 0x000000FE, 
-            0x0000011C, 0x000000DA, 0x00000115, 0x000000F7, 0x000000FC, 0x0000010B, 0x00000109, 0x00000119, 
-            0x000000FA, 0x0000013C, 0x00000103, 0x000000FC, 0x0000013C, 0x0000010B, 0x000000E0, 0x000000F3, 
-            0x0000013C, 0x0000010B, 0x000000F2, 0x000000EE, 0x0000013C, 0x00000106, 0x000000E0, 0x000000DB, 
-            0x000000F2, 0x000000FA, 0x0000010B, 0x000000ED, 0x0000013C, 0x00000100, 0x000000FB, 0x00000115, 
-            0x000000DA, 0x00000100, 0x0000010E, 0x000000FB, 0x000000F2, 0x00000115, 0x000000F4, 0x00000143, 
-            0x000000F2, 0x000000FC, 0x00000109, 0x000000FB, 0x00000109, 0x000000F0, 0x0000010B, 0x000000E0, 
-            0x00000104, 0x000000FE, 0x0000010B, 0x000000FB, 0x00000119, 0x000000FA, 0x000000FE, 0x0000013F
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, 
-            0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, 
-            0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, 
-            0x00000018, 0x00000019, 0x0000001A, 0x0000001B, 0x0000001C, 0x0000001D, 0x0000001E, 0x0000001F, 
-            0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, 
-            0x00000028, 0x00000029, 0x0000002A, 0x0000002B, 0x0000002C, 0x0000002D, 0x0000002E, 0x0000002F, 
-            0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 
-            0x00000038, 0x00000039, 0x0000003A, 0x0000003B, 0x0000003C, 0x0000003D, 0x0000003E, 0x0000003F, 
-            0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, 
-            0x00000048, 0x00000049, 0x0000004A, 0x0000004B, 0x0000004C, 0x0000004D, 0x0000004E, 0x0000004F, 
-            0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, 
-            0x00000058, 0x00000059, 0x0000005A, 0x0000005B, 0x0000005C, 0x0000005D, 0x0000005E, 0x0000005F, 
-            0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, 
-            0x00000068, 0x00000069, 0x0000006A, 0x0000006B, 0x0000006C, 0x0000006D, 0x0000006E, 0x0000006F, 
-            0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, 
-            0x00000078, 0x00000079, 0x0000007A, 0x0000007B, 0x0000007C, 0x0000007D, 0x0000007E, 0x0000007F, 
-            0x00000080, 0x00000081, 0x00000082, 0x00000083, 0x00000084, 0x00000085, 0x00000086, 0x00000087, 
-            0x00000088, 0x00000089, 0x0000008A, 0x0000008B, 0x0000008C, 0x0000008D, 0x0000008E, 0x0000008F, 
-            0x00000090, 0x00000091, 0x00000092, 0x00000093, 0x00000094, 0x00000095, 0x00000096, 0x00000097, 
-            0x00000098, 0x00000099, 0x0000009A, 0x0000009B, 0x0000009C, 0x0000009D, 0x0000009E, 0x0000009F, 
-            0x000000A0, 0x000000A1, 0x000000A2, 0x000000A3, 0x000000A4, 0x000000A5, 0x000000A6, 0x000000A7
-        
-
-        
-            0.000000, 0.000000, 5.399414, 0.000000, 10.798828, 0.000000, 16.198242, 0.000000, 
-            16.198242, 0.000000, 16.198242, 0.000000, 21.046875, 0.000000, 26.616211, 0.000000, 
-            30.035156, 0.000000, 34.151367, 0.000000, 34.151367, 0.000000, 38.279297, 0.000000, 
-            43.558594, 0.000000, 47.663086, 0.000000, 52.438477, 0.000000, 57.178711, 0.000000, 
-            62.698242, 0.000000, 66.802734, 0.000000, 71.601562, 0.000000, 75.706055, 0.000000, 
-            79.810547, 0.000000, 84.369141, 0.000000, 84.369141, 0.000000, 89.097656, 0.000000, 
-            92.516602, 0.000000, 97.195312, 0.000000, 97.195312, 0.000000, 101.311523, 0.000000, 
-            106.040039, 0.000000, 110.156250, 0.000000, 110.156250, 0.000000, 110.156250, 0.000000, 
-            115.555664, 0.000000, 115.555664, 0.000000, 118.974609, 0.000000, 124.013672, 0.000000, 
-            128.765625, 0.000000, 133.505859, 0.000000, 136.924805, 0.000000, 140.704102, 0.000000, 
-            146.103516, 0.000000, 146.103516, 0.000000, 146.103516, 0.000000, 149.882812, 0.000000, 
-            153.553711, 0.000000, 159.158203, 0.000000, 165.421875, 0.000000, 165.421875, 0.000000, 
-            169.092773, 0.000000, 174.612305, 0.000000, 179.135742, 0.000000, 183.911133, 0.000000, 
-            189.430664, 0.000000, 194.709961, 0.000000, 194.709961, 0.000000, 199.989258, 0.000000, 
-            204.741211, 0.000000, 204.741211, 0.000000, 210.140625, 0.000000, 214.880859, 0.000000, 
-            214.880859, 0.000000, 218.660156, 0.000000, 220.675781, 0.000000, 225.128906, 0.000000, 
-            230.648438, 0.000000, 234.752930, 0.000000, 234.752930, 0.000000, 239.613281, 0.000000, 
-            243.032227, 0.000000, 247.280273, 0.000000, 251.408203, 0.000000, 255.512695, 0.000000, 
-            255.512695, 0.000000, 260.036133, 0.000000, 264.776367, 0.000000, 269.071289, 0.000000, 
-            274.470703, 0.000000, 274.470703, 0.000000, 277.889648, 0.000000, 279.905273, 0.000000, 
-            284.633789, 0.000000, 284.633789, 0.000000, 289.672852, 0.000000, 294.641602, 0.000000, 
-            298.746094, 0.000000, 302.850586, 0.000000, 306.966797, 0.000000, 310.385742, 0.000000, 
-            315.246094, 0.000000, 318.665039, 0.000000, 322.913086, 0.000000, 327.041016, 0.000000, 
-            331.145508, 0.000000, 331.145508, 0.000000, 336.544922, 0.000000, 336.544922, 0.000000, 
-            339.963867, 0.000000, 345.483398, 0.000000, 350.258789, 0.000000, 354.987305, 0.000000, 
-            358.766602, 0.000000, 364.335938, 0.000000, 368.583984, 0.000000, 373.335938, 0.000000, 
-            375.351562, 0.000000, 380.126953, 0.000000, 383.545898, 0.000000, 389.150391, 0.000000, 
-            393.890625, 0.000000, 393.890625, 0.000000, 397.669922, 0.000000, 399.685547, 0.000000, 
-            404.425781, 0.000000, 404.425781, 0.000000, 409.177734, 0.000000, 411.193359, 0.000000, 
-            416.762695, 0.000000, 420.867188, 0.000000, 424.286133, 0.000000, 428.581055, 0.000000, 
-            432.708984, 0.000000, 437.748047, 0.000000, 437.748047, 0.000000, 443.027344, 0.000000, 
-            447.131836, 0.000000, 447.131836, 0.000000, 450.550781, 0.000000, 454.330078, 0.000000, 
-            459.729492, 0.000000, 459.729492, 0.000000, 463.148438, 0.000000, 468.667969, 0.000000, 
-            473.478516, 0.000000, 473.478516, 0.000000, 478.207031, 0.000000, 481.986328, 0.000000, 
-            486.761719, 0.000000, 492.281250, 0.000000, 497.320312, 0.000000, 500.739258, 0.000000, 
-            505.538086, 0.000000, 505.538086, 0.000000, 509.786133, 0.000000, 513.902344, 0.000000, 
-            515.917969, 0.000000, 520.669922, 0.000000, 524.917969, 0.000000, 524.917969, 0.000000, 
-            529.034180, 0.000000, 534.553711, 0.000000, 536.569336, 0.000000, 541.968750, 0.000000, 
-            541.968750, 0.000000, 547.488281, 0.000000, 551.592773, 0.000000, 555.887695, 0.000000, 
-            560.003906, 0.000000, 564.298828, 0.000000, 569.698242, 0.000000, 573.117188, 0.000000, 
-            576.896484, 0.000000, 582.500977, 0.000000, 587.241211, 0.000000, 590.660156, 0.000000, 
-            594.776367, 0.000000, 598.904297, 0.000000, 603.943359, 0.000000, 608.683594, 0.000000, 
-            608.683594, 0.000000
-        
-    
-
-    
-        
-
-        أساسًا، تتعامل الحواسيب فقط مع الأرقام، وتقوم بتخزين الأحرف والمحارف الأخرى بعد أن تُعطي رقما معينا لكل واحد منها. وقبل اختراع "يونِكود"، كان هناك مئات الأنظمة للتشفير وتخصيص هذه الأرقام للمحارف، ولم يوجد نظام تشفير واحد يحتوي على جميع المحارف الضرورية
-
-        
-            0x00000872, 0x000008D1, 0x000003F9, 0x0000040B, 0x0000088C, 0x0000089E, 0x000008BD, 0x000003EF, 
-            0x00000003, 0x00000404, 0x000003F9, 0x0000086C, 0x00000882, 0x000008C2, 0x000008BD, 0x000003EF, 
-            0x00000003, 0x000008A8, 0x000008D2, 0x000008C2, 0x0000087D, 0x00000003, 0x000008CE, 0x000008BE, 
-            0x000008A9, 0x00000003, 0x0000040D, 0x000008CC, 0x00000876, 0x00000882, 0x000008D1, 0x00000003, 
-            0x00000888, 0x00000881, 0x000003EF, 0x0000040B, 0x00000003, 0x0000088C, 0x000008D2, 0x000008B2, 
-            0x00000896, 0x00000875, 0x00000003, 0x00000408, 0x0000086C, 0x000008A6, 0x000008C5, 0x00000003, 
-            0x00000888, 0x0000087D, 0x000008CC, 0x000008D1, 0x00000003, 0x000008C0, 0x000008BD, 0x0000040B, 
-            0x00000003, 0x000003E6, 0x00000404, 0x000003F9, 0x0000086C, 0x00000882, 0x000008C2, 0x000008BE, 
-            0x000008BD, 0x00000003, 0x00000408, 0x0000086C, 0x000008B5, 0x000003F9, 0x0000FFFF, 0x000008D5, 
-            0x000003EF, 0x00000003, 0x0000040A, 0x0000088A, 0x000008C9, 0x00000003, 0x00000898, 0x000008D2, 
-            0x0000089A, 0x00000886, 0x00000875, 0x0000040B, 0x00000003, 0x0000088C, 0x000008D2, 0x000008B2, 
-            0x00000896, 0x00000876, 0x000008BE, 0x000008BD, 0x00000003, 0x00000872, 0x000008C2, 0x000008A6, 
-            0x000008C5, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, 0x000003F2, 0x0000086C, 0x0000086A, 
-            0x000008C1, 0x00000003, 0x00000406, 0x0000086C, 0x000008C6, 0x000008C9, 0x00000003, 0x00000409, 
-            0x0000086C, 0x000008B9, 0x00000003, 0x000003E6, 0x00000005, 0x000003F7, 0x000008CC, 0x000008BA, 
-            0x00000413, 0x000008C5, 0x000008CC, 0x000008D1, 0x00000005, 0x00000003, 0x00000401, 0x000003EF, 
-            0x0000088C, 0x00000876, 0x00000885, 0x000003EF, 0x00000003, 0x000008BC, 0x00000870, 0x000008B5, 
-            0x0000040B, 0x00000003, 0x00000011, 0x0000086C, 0x000008CA, 0x000008C6, 0x000008C1, 0x00000003, 
-            0x00000888, 0x00000881, 0x000003EF, 0x0000040B, 0x00000003, 0x000008BC, 0x000008BA, 0x000008BD, 
-            0x00000003, 0x0000086C, 0x000008C6, 0x000008D2, 0x000008AA, 0x000008C1, 0x00000003, 0x0000086C, 
-            0x000008C2, 0x000008B5, 0x000003F9, 0x00000003, 0x000008D0, 0x000008A2, 0x000008AA, 0x00000412, 
-            0x00000875, 0x00000003, 0x00000409, 0x000003EB, 0x00000003, 0x00000888, 0x000008AA, 0x0000086F, 
-            0x00000003, 0x0000040C, 0x0000088C, 0x00000885, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, 
-            0x00000404, 0x000003F9, 0x0000086C, 0x00000882, 0x000008C2, 0x000008BD, 0x000003EF, 0x0000040B, 
-            0x00000003, 0x00000404, 0x0000088C, 0x00000881, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, 
-            0x000008C4, 0x000008D1, 0x0000088E, 0x00000886, 0x00000876, 0x0000086F, 0x00000003, 0x00000408, 
-            0x000008CC, 0x000008B6, 0x00000875, 0x0000040B, 0x00000003, 0x000003E6, 0x00000408, 0x0000086C, 
-            0x000008B5, 0x000003F9, 0x0000FFFF, 0x000008D5, 0x000003EF, 0x00000003, 0x000008A8, 0x000008C1, 
-            0x00000003, 0x000008A0, 0x000008B6, 0x000008B1, 0x00000003, 0x0000086E, 0x000008D2, 0x00000891, 
-            0x000003EF, 0x000008CC, 0x00000882, 0x000008BD, 0x000003EF, 0x00000003, 0x000008BC, 0x000008C1, 
-            0x0000086C, 0x000008AA, 0x00000876, 0x00000875, 0x00000003, 0x000003E6, 0x0000086C, 0x0000040E, 
-            0x00000891, 0x0000086C, 0x00000891, 0x000003EB
-        
-
-        
-            0x000000FB, 0x000000FA, 0x000000F9, 0x000000F8, 0x000000F7, 0x000000F6, 0x000000F5, 0x000000F4, 
-            0x000000F3, 0x000000F2, 0x000000F1, 0x000000F0, 0x000000EF, 0x000000EE, 0x000000ED, 0x000000EC, 
-            0x000000EB, 0x000000EA, 0x000000E9, 0x000000E8, 0x000000E7, 0x000000E6, 0x000000E5, 0x000000E4, 
-            0x000000E3, 0x000000E2, 0x000000E1, 0x000000E0, 0x000000DF, 0x000000DE, 0x000000DD, 0x000000DC, 
-            0x000000DB, 0x000000DA, 0x000000D9, 0x000000D8, 0x000000D7, 0x000000D6, 0x000000D5, 0x000000D4, 
-            0x000000D3, 0x000000D2, 0x000000D1, 0x000000D0, 0x000000CF, 0x000000CE, 0x000000CD, 0x000000CC, 
-            0x000000CB, 0x000000CA, 0x000000C9, 0x000000C8, 0x000000C7, 0x000000C6, 0x000000C5, 0x000000C4, 
-            0x000000C3, 0x000000C2, 0x000000C1, 0x000000C0, 0x000000BF, 0x000000BE, 0x000000BD, 0x000000BC, 
-            0x000000BB, 0x000000BA, 0x000000B9, 0x000000B8, 0x000000B7, 0x000000B6, 0x000000B5, 0x000000B4, 
-            0x000000B3, 0x000000B2, 0x000000B1, 0x000000B0, 0x000000AF, 0x000000AE, 0x000000AD, 0x000000AC, 
-            0x000000AB, 0x000000AA, 0x000000A9, 0x000000A8, 0x000000A7, 0x000000A6, 0x000000A5, 0x000000A4, 
-            0x000000A3, 0x000000A2, 0x000000A1, 0x000000A0, 0x0000009F, 0x0000009E, 0x0000009D, 0x0000009C, 
-            0x0000009B, 0x0000009A, 0x00000099, 0x00000098, 0x00000097, 0x00000096, 0x00000095, 0x00000094, 
-            0x00000093, 0x00000092, 0x00000091, 0x00000090, 0x0000008F, 0x0000008E, 0x0000008D, 0x0000008C, 
-            0x0000008B, 0x0000008A, 0x00000089, 0x00000088, 0x00000087, 0x00000086, 0x00000085, 0x00000084, 
-            0x00000083, 0x00000082, 0x00000081, 0x00000080, 0x0000007F, 0x0000007E, 0x0000007D, 0x0000007C, 
-            0x0000007B, 0x0000007A, 0x00000079, 0x00000078, 0x00000077, 0x00000076, 0x00000075, 0x00000074, 
-            0x00000073, 0x00000072, 0x00000071, 0x00000070, 0x0000006F, 0x0000006E, 0x0000006D, 0x0000006C, 
-            0x0000006B, 0x0000006A, 0x00000069, 0x00000068, 0x00000067, 0x00000066, 0x00000065, 0x00000064, 
-            0x00000063, 0x00000062, 0x00000061, 0x00000060, 0x0000005F, 0x0000005E, 0x0000005D, 0x0000005C, 
-            0x0000005B, 0x0000005A, 0x00000059, 0x00000058, 0x00000057, 0x00000056, 0x00000055, 0x00000054, 
-            0x00000053, 0x00000052, 0x00000051, 0x00000050, 0x0000004F, 0x0000004E, 0x0000004D, 0x0000004C, 
-            0x0000004B, 0x0000004A, 0x00000049, 0x00000048, 0x00000047, 0x00000046, 0x00000045, 0x00000044, 
-            0x00000043, 0x00000042, 0x00000041, 0x00000040, 0x0000003F, 0x0000003E, 0x0000003D, 0x0000003C, 
-            0x0000003B, 0x0000003A, 0x00000039, 0x00000038, 0x00000037, 0x00000036, 0x00000035, 0x00000034, 
-            0x00000033, 0x00000032, 0x00000031, 0x00000030, 0x0000002F, 0x0000002E, 0x0000002D, 0x0000002C, 
-            0x0000002B, 0x0000002A, 0x00000029, 0x00000028, 0x00000027, 0x00000026, 0x00000025, 0x00000024, 
-            0x00000023, 0x00000022, 0x00000021, 0x00000020, 0x0000001F, 0x0000001E, 0x0000001D, 0x0000001C, 
-            0x0000001B, 0x0000001A, 0x00000019, 0x00000018, 0x00000017, 0x00000016, 0x00000015, 0x00000014, 
-            0x00000013, 0x00000012, 0x00000011, 0x00000010, 0x0000000F, 0x0000000E, 0x0000000D, 0x0000000C, 
-            0x0000000B, 0x0000000A, 0x00000009, 0x00000008, 0x00000007, 0x00000006, 0x00000005, 0x00000004, 
-            0x00000003, 0x00000002, 0x00000001, 0x00000000
-        
-
-        
-            0.000000, 0.000000, 6.316406, 0.000000, 10.382812, 0.000000, 15.492188, 0.000000, 
-            21.035156, 0.000000, 27.058594, 0.000000, 39.527344, 0.000000, 43.792969, 0.000000, 
-            47.408203, 0.000000, 51.205078, 0.000000, 66.216797, 0.000000, 71.326172, 0.000000, 
-            74.695312, 0.000000, 83.367188, 0.000000, 90.826172, 0.000000, 95.091797, 0.000000, 
-            98.707031, 0.000000, 102.503906, 0.000000, 109.962891, 0.000000, 114.949219, 0.000000, 
-            122.408203, 0.000000, 130.687500, 0.000000, 134.484375, 0.000000, 145.787109, 0.000000, 
-            150.773438, 0.000000, 156.884766, 0.000000, 160.681641, 0.000000, 172.277344, 0.000000, 
-            177.919922, 0.000000, 182.906250, 0.000000, 191.578125, 0.000000, 195.644531, 0.000000, 
-            199.441406, 0.000000, 206.507812, 0.000000, 214.787109, 0.000000, 218.402344, 0.000000, 
-            223.945312, 0.000000, 227.742188, 0.000000, 233.765625, 0.000000, 238.751953, 0.000000, 
-            245.185547, 0.000000, 257.982422, 0.000000, 262.048828, 0.000000, 265.845703, 0.000000, 
-            272.654297, 0.000000, 276.023438, 0.000000, 285.240234, 0.000000, 289.306641, 0.000000, 
-            293.103516, 0.000000, 300.169922, 0.000000, 308.449219, 0.000000, 314.091797, 0.000000, 
-            318.158203, 0.000000, 321.955078, 0.000000, 329.572266, 0.000000, 333.837891, 0.000000, 
-            339.380859, 0.000000, 343.177734, 0.000000, 346.974609, 0.000000, 361.986328, 0.000000, 
-            367.095703, 0.000000, 370.464844, 0.000000, 379.136719, 0.000000, 386.595703, 0.000000, 
-            391.582031, 0.000000, 395.847656, 0.000000, 399.644531, 0.000000, 406.453125, 0.000000, 
-            409.822266, 0.000000, 415.523438, 0.000000, 420.632812, 0.000000, 420.632812, 0.000000, 
-            427.441406, 0.000000, 431.056641, 0.000000, 434.853516, 0.000000, 441.357422, 0.000000, 
-            448.423828, 0.000000, 455.912109, 0.000000, 459.708984, 0.000000, 479.255859, 0.000000, 
-            484.242188, 0.000000, 496.710938, 0.000000, 505.382812, 0.000000, 509.449219, 0.000000, 
-            514.992188, 0.000000, 518.789062, 0.000000, 524.812500, 0.000000, 529.798828, 0.000000, 
-            536.232422, 0.000000, 549.029297, 0.000000, 554.015625, 0.000000, 559.001953, 0.000000, 
-            563.267578, 0.000000, 567.064453, 0.000000, 573.380859, 0.000000, 580.839844, 0.000000, 
-            590.056641, 0.000000, 594.123047, 0.000000, 594.123047, 0.000000, 600.931641, 0.000000, 
-            604.546875, 0.000000, 608.343750, 0.000000, 620.636719, 0.000000, 624.005859, 0.000000, 
-            628.992188, 0.000000, 635.830078, 0.000000, 639.626953, 0.000000, 653.361328, 0.000000, 
-            656.730469, 0.000000, 661.716797, 0.000000, 669.205078, 0.000000, 673.001953, 0.000000, 
-            683.777344, 0.000000, 687.146484, 0.000000, 692.660156, 0.000000, 696.457031, 0.000000, 
-            700.253906, 0.000000, 704.736328, 0.000000, 711.105469, 0.000000, 716.748047, 0.000000, 
-            722.994141, 0.000000, 722.994141, 0.000000, 727.060547, 0.000000, 732.703125, 0.000000, 
-            736.769531, 0.000000, 741.251953, 0.000000, 745.048828, 0.000000, 752.507812, 0.000000, 
-            756.123047, 0.000000, 762.146484, 0.000000, 767.132812, 0.000000, 775.412109, 0.000000, 
-            779.027344, 0.000000, 782.824219, 0.000000, 794.203125, 0.000000, 799.189453, 0.000000, 
-            804.890625, 0.000000, 810.433594, 0.000000, 814.230469, 0.000000, 818.027344, 0.000000, 
-            821.396484, 0.000000, 828.128906, 0.000000, 833.115234, 0.000000, 839.953125, 0.000000, 
-            843.750000, 0.000000, 850.816406, 0.000000, 859.095703, 0.000000, 862.710938, 0.000000, 
-            868.253906, 0.000000, 872.050781, 0.000000, 883.429688, 0.000000, 889.675781, 0.000000, 
-            893.941406, 0.000000, 897.738281, 0.000000, 901.107422, 0.000000, 906.093750, 0.000000, 
-            911.080078, 0.000000, 917.800781, 0.000000, 924.638672, 0.000000, 928.435547, 0.000000, 
-            931.804688, 0.000000, 939.263672, 0.000000, 944.964844, 0.000000, 950.074219, 0.000000, 
-            953.871094, 0.000000, 965.173828, 0.000000, 974.390625, 0.000000, 981.111328, 0.000000, 
-            981.111328, 0.000000, 985.177734, 0.000000, 988.974609, 0.000000, 999.750000, 0.000000, 
-            1003.365234, 0.000000, 1007.162109, 0.000000, 1014.228516, 0.000000, 1020.949219, 0.000000, 
-            1025.015625, 0.000000, 1028.812500, 0.000000, 1040.408203, 0.000000, 1046.431641, 0.000000, 
-            1054.710938, 0.000000, 1054.710938, 0.000000, 1061.519531, 0.000000, 1065.134766, 0.000000, 
-            1068.931641, 0.000000, 1083.943359, 0.000000, 1089.052734, 0.000000, 1092.421875, 0.000000, 
-            1101.093750, 0.000000, 1108.552734, 0.000000, 1112.818359, 0.000000, 1116.433594, 0.000000, 
-            1121.976562, 0.000000, 1125.773438, 0.000000, 1140.785156, 0.000000, 1146.808594, 0.000000, 
-            1155.087891, 0.000000, 1155.087891, 0.000000, 1161.896484, 0.000000, 1165.511719, 0.000000, 
-            1169.308594, 0.000000, 1180.541016, 0.000000, 1184.607422, 0.000000, 1190.630859, 0.000000, 
-            1199.302734, 0.000000, 1204.289062, 0.000000, 1208.355469, 0.000000, 1212.152344, 0.000000, 
-            1218.960938, 0.000000, 1224.603516, 0.000000, 1231.037109, 0.000000, 1235.103516, 0.000000, 
-            1240.646484, 0.000000, 1244.443359, 0.000000, 1248.240234, 0.000000, 1255.048828, 0.000000, 
-            1258.417969, 0.000000, 1264.119141, 0.000000, 1269.228516, 0.000000, 1269.228516, 0.000000, 
-            1276.037109, 0.000000, 1279.652344, 0.000000, 1283.449219, 0.000000, 1290.908203, 0.000000, 
-            1297.746094, 0.000000, 1301.542969, 0.000000, 1311.427734, 0.000000, 1317.861328, 0.000000, 
-            1323.562500, 0.000000, 1327.359375, 0.000000, 1341.492188, 0.000000, 1346.478516, 0.000000, 
-            1357.904297, 0.000000, 1361.519531, 0.000000, 1367.162109, 0.000000, 1375.833984, 0.000000, 
-            1380.099609, 0.000000, 1383.714844, 0.000000, 1387.511719, 0.000000, 1398.890625, 0.000000, 
-            1405.728516, 0.000000, 1409.097656, 0.000000, 1415.818359, 0.000000, 1420.804688, 0.000000, 
-            1424.871094, 0.000000, 1428.667969, 0.000000, 1432.464844, 0.000000, 1435.833984, 0.000000, 
-            1435.833984, 0.000000, 1447.259766, 0.000000, 1450.628906, 0.000000, 1462.054688, 0.000000, 
-            1465.669922, 0.000000
-        
-    
-
-    
-        
-
-        ुं ं॑
-
-        
-            0x0000029C, 0x000001D5, 0x00000232, 0x00000003, 0x0000029C, 0x00000232, 0x00000233
-        
-
-        
-            0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000003, 0x00000004
-        
-
-        
-            0.000000, 0.000000, 7.541016, 0.000000, 7.541016, 0.000000, 7.541016, 0.000000, 
-            13.541016, 0.000000, 21.082031, 0.000000, 19.953125, -6.052734, 21.082031, 0.000000
-        
-    
-
-    
-        
-
-        कँ कं कः क॑ क॒ कँ॑ कं॒ कँंः क॒॑
-
-        
-            0x00000080, 0x00000231, 0x00000003, 0x00000080, 0x00000232, 0x00000003, 0x00000080, 0x0000022C, 
-            0x00000003, 0x00000080, 0x00000233, 0x00000003, 0x00000080, 0x000001DF, 0x00000003, 0x00000080, 
-            0x00000231, 0x00000233, 0x00000003, 0x00000080, 0x000001DF, 0x00000232, 0x00000003, 0x00000080, 
-            0x00000231, 0x0000029C, 0x00000232, 0x0000029C, 0x0000022C, 0x00000003, 0x00000080, 0x00000233, 
-            0x0000029C, 0x000001DF
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, 
-            0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, 
-            0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000015, 0x00000014, 0x00000016, 0x00000017, 
-            0x00000018, 0x00000019, 0x00000019, 0x0000001A, 0x0000001A, 0x0000001B, 0x0000001C, 0x0000001D, 
-            0x0000001E, 0x0000001E
-        
-
-        
-            0.000000, 0.000000, 10.001953, -0.087891, 10.875000, 0.000000, 16.875000, 0.000000, 
-            23.783203, 0.439453, 27.750000, 0.000000, 33.750000, 0.000000, 44.625000, 0.000000, 
-            48.984375, 0.000000, 54.984375, 0.000000, 63.546875, -1.669922, 65.859375, 0.000000, 
-            71.859375, 0.000000, 80.332031, 0.492188, 82.734375, 0.000000, 88.734375, 0.000000, 
-            98.736328, -0.087891, 97.431641, -6.228516, 99.609375, 0.000000, 105.609375, 0.000000, 
-            114.082031, 0.492188, 112.517578, 0.439453, 116.484375, 0.000000, 122.484375, 0.000000, 
-            132.486328, -0.087891, 133.359375, 0.000000, 140.900391, 0.000000, 140.900391, 0.000000, 
-            148.441406, 0.000000, 152.800781, 0.000000, 158.800781, 0.000000, 167.363281, -1.669922, 
-            169.675781, 0.000000, 177.216797, 0.000000, 177.216797, 0.000000
-        
-    
-
-    
-        
-
-        रू क़् क्ष क्कि क्रि ट्रि हिन्दी र्क्रिं क्षत्रज्ञत्रक्ष श्र थ्र श्र कके र्कें केूकूेकेृ र्कू क़ क क् क्ष क्ष् क्ष्क  ज़ ज ज् ज्ञ ज्ञ् ज्ञ्क र्क र्क्क ड्र क्क क़्क क़्क क़् क्ष्क क्ष् त्र्क द्द कि हि रू रु र्के र्कं क् कु के द्द्द क़्ष क्ष र्क्षे द्दत्र्क ज्ञ क्त्व ज्ञ्क र्कँ र्किँ र्केँ र्क्रिँ हिंदी ह्मिह्यिखि ङ्क ङ्म ङ्क्त ङ्ख ङ्ग ङ्घ ङ्क्ष ङ्क्ष्व ङ्क्ष्य र्क्त्वि र्र्र्र कै के कु कू कृ कॅ कॆ हु हू हॆ है हे
-
-        
-            0x0000009A, 0x000001FE, 0x00000003, 0x000000A4, 0x00000051, 0x00000003, 0x000000A2, 0x0000FFFF, 
-            0x0000FFFF, 0x00000003, 0x000001D4, 0x000000C8, 0x0000FFFF, 0x00000080, 0x00000003, 0x000001D1, 
-            0x00000080, 0x0000009A, 0x00000051, 0x00000003, 0x000001D1, 0x0000008A, 0x0000009A, 0x00000051, 
-            0x00000003, 0x000001D1, 0x000000A1, 0x000000DB, 0x0000FFFF, 0x00000091, 0x00000223, 0x00000003, 
-            0x000001D1, 0x00000080, 0x000000E2, 0x0000FFFF, 0x0000009A, 0x00000051, 0x00000232, 0x00000003, 
-            0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x0000008F, 0x000000E2, 0x0000FFFF, 0x000000A3, 0x0000FFFF, 
-            0x0000FFFF, 0x0000008F, 0x000000E2, 0x0000FFFF, 0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x00000003, 
-            0x0000009E, 0x0000009A, 0x00000051, 0x00000003, 0x00000090, 0x0000009A, 0x00000051, 0x00000003, 
-            0x0000009E, 0x0000009A, 0x00000051, 0x00000003, 0x00000080, 0x00000080, 0x0000022F, 0x00000003, 
-            0x00000080, 0x0000022F, 0x0000024D, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x00000080, 0x0000022F, 
-            0x0000029C, 0x000001D7, 0x00000080, 0x000001D7, 0x0000029C, 0x0000022F, 0x00000080, 0x0000022F, 
-            0x0000029C, 0x000001D9, 0x00000003, 0x00000080, 0x000001D7, 0x0000005B, 0x0000FFFF, 0x00000003, 
-            0x000000A4, 0x00000003, 0x00000080, 0x00000003, 0x00000080, 0x00000051, 0x00000003, 0x000000A2, 
-            0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x00000051, 0x00000003, 
-            0x000000EA, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000080, 0x00000003, 0x00000003, 0x000000AB, 
-            0x0000FFFF, 0x00000003, 0x00000087, 0x00000003, 0x00000087, 0x00000051, 0x00000003, 0x000000A3, 
-            0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000A3, 0x0000FFFF, 0x0000FFFF, 0x00000051, 0x00000003, 
-            0x000000EB, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000080, 0x00000003, 0x00000080, 0x0000005B, 
-            0x0000FFFF, 0x00000003, 0x000000C8, 0x0000FFFF, 0x00000080, 0x0000005B, 0x0000FFFF, 0x00000003, 
-            0x0000008C, 0x0000009A, 0x00000051, 0x00000003, 0x000000C8, 0x0000FFFF, 0x00000080, 0x00000003, 
-            0x000000EC, 0x0000FFFF, 0x00000080, 0x00000003, 0x000000EC, 0x0000FFFF, 0x00000080, 0x00000003, 
-            0x000000A4, 0x00000051, 0x00000003, 0x000000EA, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000080, 
-            0x00000003, 0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x00000051, 0x00000003, 0x000000D7, 0x0000FFFF, 
-            0x000000E2, 0x0000FFFF, 0x00000080, 0x00000003, 0x000001A7, 0x0000FFFF, 0x0000FFFF, 0x00000003, 
-            0x000001D1, 0x00000080, 0x00000003, 0x000001D1, 0x000000A1, 0x00000003, 0x0000009A, 0x000001FE, 
-            0x00000003, 0x0000009A, 0x000001FD, 0x00000003, 0x00000080, 0x0000022F, 0x0000005A, 0x0000FFFF, 
-            0x00000003, 0x00000080, 0x0000024D, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x00000080, 0x00000051, 
-            0x00000003, 0x00000080, 0x000001D5, 0x00000003, 0x00000080, 0x0000022F, 0x00000003, 0x000000D9, 
-            0x0000FFFF, 0x000001A7, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000EC, 0x0000FFFF, 0x0000009F, 
-            0x00000003, 0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000A2, 0x0000FFFF, 0x0000FFFF, 
-            0x0000022F, 0x0000005A, 0x0000FFFF, 0x00000003, 0x000001A7, 0x0000FFFF, 0x0000FFFF, 0x000000D7, 
-            0x0000FFFF, 0x000000E2, 0x0000FFFF, 0x00000080, 0x00000003, 0x000000A3, 0x0000FFFF, 0x0000FFFF, 
-            0x00000003, 0x000000C8, 0x0000FFFF, 0x000000D7, 0x0000FFFF, 0x0000009D, 0x00000003, 0x000000EB, 
-            0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000080, 0x00000003, 0x00000080, 0x0000024C, 0x0000FFFF, 
-            0x0000FFFF, 0x00000003, 0x000001D1, 0x00000080, 0x0000024C, 0x0000FFFF, 0x0000FFFF, 0x00000003, 
-            0x00000080, 0x0000022F, 0x0000024C, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000001D1, 0x00000080, 
-            0x000000E2, 0x0000FFFF, 0x0000009A, 0x00000051, 0x00000231, 0x00000003, 0x000001D1, 0x000000A1, 
-            0x00000232, 0x00000091, 0x00000223, 0x00000003, 0x000001D3, 0x000001BA, 0x0000FFFF, 0x0000FFFF, 
-            0x000001D3, 0x000001BB, 0x0000FFFF, 0x0000FFFF, 0x000001D4, 0x00000081, 0x00000003, 0x000000CC, 
-            0x0000FFFF, 0x00000080, 0x00000003, 0x000001A2, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000CC, 
-            0x0000FFFF, 0x000001A0, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000CC, 0x0000FFFF, 0x00000081, 
-            0x00000003, 0x000000CC, 0x0000FFFF, 0x00000082, 0x00000003, 0x000000CC, 0x0000FFFF, 0x00000083, 
-            0x00000003, 0x000000CC, 0x0000FFFF, 0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x000000CC, 
-            0x0000FFFF, 0x000000EA, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x0000009D, 0x00000003, 0x000000CC, 
-            0x0000FFFF, 0x000000EA, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x00000099, 0x00000003, 0x000001D4, 
-            0x000000C8, 0x0000FFFF, 0x000000D7, 0x0000FFFF, 0x0000009D, 0x0000005B, 0x0000FFFF, 0x00000003, 
-            0x0000009A, 0x00000051, 0x0000009A, 0x000000E2, 0x0000FFFF, 0x0000009A, 0x00000051, 0x00000003, 
-            0x00000080, 0x00000230, 0x00000003, 0x00000080, 0x0000022F, 0x00000003, 0x00000080, 0x000001D5, 
-            0x00000003, 0x00000080, 0x000001D7, 0x00000003, 0x00000080, 0x000001D9, 0x00000003, 0x00000080, 
-            0x0000022D, 0x00000003, 0x00000080, 0x0000022E, 0x00000003, 0x000000A1, 0x000001D5, 0x00000003, 
-            0x000000A1, 0x000001D7, 0x00000003, 0x000000A1, 0x0000022E, 0x00000003, 0x000000A1, 0x00000230, 
-            0x00000003, 0x000000A1, 0x0000022F
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, 
-            0x00000008, 0x00000009, 0x0000000D, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000E, 0x00000012, 
-            0x0000000F, 0x00000011, 0x00000010, 0x00000013, 0x00000017, 0x00000014, 0x00000016, 0x00000015, 
-            0x00000018, 0x0000001A, 0x00000019, 0x0000001B, 0x0000001C, 0x0000001D, 0x0000001E, 0x0000001F, 
-            0x00000025, 0x00000022, 0x00000024, 0x00000023, 0x00000020, 0x00000021, 0x00000026, 0x00000027, 
-            0x00000028, 0x00000029, 0x0000002A, 0x0000002B, 0x0000002D, 0x0000002C, 0x0000002E, 0x0000002F, 
-            0x00000030, 0x00000031, 0x00000033, 0x00000032, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 
-            0x00000038, 0x0000003A, 0x00000039, 0x0000003B, 0x0000003C, 0x0000003E, 0x0000003D, 0x0000003F, 
-            0x00000040, 0x00000042, 0x00000041, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, 
-            0x0000004A, 0x0000004B, 0x00000048, 0x00000049, 0x0000004C, 0x0000004D, 0x0000004E, 0x0000004F, 
-            0x00000050, 0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000053, 0x00000054, 0x00000055, 
-            0x00000056, 0x00000056, 0x00000057, 0x0000005A, 0x0000005B, 0x00000058, 0x00000059, 0x0000005C, 
-            0x0000005D, 0x0000005E, 0x0000005F, 0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 
-            0x00000065, 0x00000066, 0x00000067, 0x00000068, 0x00000069, 0x0000006A, 0x0000006B, 0x0000006C, 
-            0x0000006D, 0x0000006E, 0x0000006F, 0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 
-            0x00000075, 0x00000076, 0x00000077, 0x00000078, 0x00000079, 0x0000007A, 0x0000007B, 0x0000007C, 
-            0x0000007D, 0x0000007E, 0x0000007F, 0x00000080, 0x00000081, 0x00000082, 0x00000083, 0x00000084, 
-            0x00000085, 0x00000086, 0x00000087, 0x00000088, 0x00000089, 0x0000008A, 0x0000008D, 0x0000008B, 
-            0x0000008C, 0x0000008E, 0x00000091, 0x00000092, 0x00000093, 0x0000008F, 0x00000090, 0x00000094, 
-            0x00000095, 0x00000097, 0x00000096, 0x00000098, 0x00000099, 0x0000009A, 0x0000009B, 0x0000009C, 
-            0x0000009D, 0x0000009E, 0x0000009F, 0x000000A0, 0x000000A1, 0x000000A2, 0x000000A3, 0x000000A4, 
-            0x000000A5, 0x000000A6, 0x000000A7, 0x000000A8, 0x000000A9, 0x000000AA, 0x000000AB, 0x000000AC, 
-            0x000000AD, 0x000000AE, 0x000000AF, 0x000000B0, 0x000000B1, 0x000000B2, 0x000000B3, 0x000000B4, 
-            0x000000B5, 0x000000B6, 0x000000B7, 0x000000B8, 0x000000B9, 0x000000BA, 0x000000BB, 0x000000BC, 
-            0x000000BE, 0x000000BD, 0x000000BF, 0x000000C1, 0x000000C0, 0x000000C2, 0x000000C3, 0x000000C4, 
-            0x000000C5, 0x000000C6, 0x000000C7, 0x000000C8, 0x000000CB, 0x000000CC, 0x000000C9, 0x000000CA, 
-            0x000000CD, 0x000000D0, 0x000000CE, 0x000000CF, 0x000000D1, 0x000000D2, 0x000000D3, 0x000000D4, 
-            0x000000D5, 0x000000D6, 0x000000D7, 0x000000D8, 0x000000D9, 0x000000DA, 0x000000DB, 0x000000DC, 
-            0x000000DD, 0x000000DE, 0x000000DF, 0x000000E0, 0x000000E1, 0x000000E2, 0x000000E3, 0x000000E4, 
-            0x000000E5, 0x000000E6, 0x000000E7, 0x000000E8, 0x000000E9, 0x000000EC, 0x000000ED, 0x000000EE, 
-            0x000000EF, 0x000000EA, 0x000000EB, 0x000000F0, 0x000000F1, 0x000000F2, 0x000000F3, 0x000000F4, 
-            0x000000F5, 0x000000F6, 0x000000F7, 0x000000F8, 0x000000F9, 0x000000FA, 0x000000FB, 0x000000FC, 
-            0x000000FD, 0x000000FE, 0x000000FF, 0x00000100, 0x00000101, 0x00000102, 0x00000103, 0x00000104, 
-            0x00000105, 0x00000106, 0x00000107, 0x00000108, 0x00000109, 0x0000010C, 0x0000010A, 0x0000010B, 
-            0x0000010D, 0x0000010E, 0x00000112, 0x00000111, 0x0000010F, 0x00000110, 0x00000113, 0x00000114, 
-            0x00000117, 0x00000118, 0x00000115, 0x00000116, 0x00000119, 0x0000011A, 0x00000120, 0x0000011D, 
-            0x0000011F, 0x0000011E, 0x0000011B, 0x0000011C, 0x00000121, 0x00000122, 0x00000124, 0x00000123, 
-            0x00000125, 0x00000126, 0x00000127, 0x00000128, 0x0000012C, 0x00000129, 0x0000012A, 0x0000012B, 
-            0x00000130, 0x0000012D, 0x0000012E, 0x0000012F, 0x00000132, 0x00000131, 0x00000133, 0x00000134, 
-            0x00000135, 0x00000136, 0x00000137, 0x00000138, 0x00000139, 0x0000013A, 0x0000013B, 0x0000013C, 
-            0x0000013D, 0x0000013E, 0x0000013F, 0x00000140, 0x00000141, 0x00000142, 0x00000143, 0x00000144, 
-            0x00000145, 0x00000146, 0x00000147, 0x00000148, 0x00000149, 0x0000014A, 0x0000014B, 0x0000014C, 
-            0x0000014D, 0x0000014E, 0x0000014F, 0x00000150, 0x00000151, 0x00000152, 0x00000153, 0x00000154, 
-            0x00000155, 0x00000156, 0x00000157, 0x00000158, 0x00000159, 0x0000015A, 0x0000015B, 0x0000015C, 
-            0x0000015D, 0x0000015E, 0x0000015F, 0x00000160, 0x00000161, 0x00000162, 0x00000163, 0x0000016B, 
-            0x00000166, 0x00000167, 0x00000168, 0x00000169, 0x0000016A, 0x00000164, 0x00000165, 0x0000016C, 
-            0x0000016F, 0x00000170, 0x00000171, 0x00000173, 0x00000172, 0x0000016D, 0x0000016E, 0x00000174, 
-            0x00000175, 0x00000176, 0x00000177, 0x00000178, 0x00000179, 0x0000017A, 0x0000017B, 0x0000017C, 
-            0x0000017D, 0x0000017E, 0x0000017F, 0x00000180, 0x00000181, 0x00000182, 0x00000183, 0x00000184, 
-            0x00000185, 0x00000186, 0x00000187, 0x00000188, 0x00000189, 0x0000018A, 0x0000018B, 0x0000018C, 
-            0x0000018D, 0x0000018E, 0x0000018F, 0x00000190, 0x00000191, 0x00000192, 0x00000193, 0x00000194, 
-            0x00000195, 0x00000196, 0x00000197
-        
-
-        
-            0.000000, 0.000000, 6.515625, 0.000000, 8.121094, 0.000000, 14.121094, 0.000000, 
-            24.861328, -0.451172, 24.996094, 0.000000, 30.996094, 0.000000, 41.871094, 0.000000, 
-            41.871094, 0.000000, 41.871094, 0.000000, 47.871094, 0.000000, 52.230469, 0.000000, 
-            60.949219, 0.000000, 60.949219, 0.000000, 71.824219, 0.000000, 77.824219, 0.000000, 
-            82.183594, 0.000000, 93.058594, 0.000000, 102.720703, -0.451172, 99.574219, 0.000000, 
-            105.574219, 0.000000, 109.933594, 0.000000, 117.902344, 0.000000, 127.564453, -0.451172, 
-            124.417969, 0.000000, 130.417969, 0.000000, 134.777344, 0.000000, 142.746094, 0.000000, 
-            150.011719, 0.000000, 150.011719, 0.000000, 157.980469, 0.000000, 161.636719, 0.000000, 
-            167.636719, 0.000000, 171.996094, 0.000000, 182.871094, 0.000000, 186.621094, 0.000000, 
-            186.621094, 0.000000, 196.283203, -0.451172, 191.613281, 0.439453, 193.136719, 0.000000, 
-            199.136719, 0.000000, 210.011719, 0.000000, 210.011719, 0.000000, 210.011719, 0.000000, 
-            217.980469, 0.000000, 221.730469, 0.000000, 221.730469, 0.000000, 232.605469, 0.000000, 
-            232.605469, 0.000000, 232.605469, 0.000000, 240.574219, 0.000000, 244.324219, 0.000000, 
-            244.324219, 0.000000, 255.199219, 0.000000, 255.199219, 0.000000, 255.199219, 0.000000, 
-            261.199219, 0.000000, 270.667969, 0.000000, 280.330078, -0.451172, 277.183594, 0.000000, 
-            283.183594, 0.000000, 292.652344, 0.000000, 302.314453, -0.451172, 299.167969, 0.000000, 
-            305.167969, 0.000000, 314.636719, 0.000000, 324.298828, -0.451172, 321.152344, 0.000000, 
-            327.152344, 0.000000, 338.027344, 0.000000, 344.783203, 0.263672, 348.902344, 0.000000, 
-            354.902344, 0.000000, 361.658203, 0.263672, 362.279297, 0.263672, 365.777344, 0.000000, 
-            365.777344, 0.000000, 365.777344, 0.000000, 371.777344, 0.000000, 378.533203, 0.263672, 
-            382.652344, 0.000000, 390.193359, 0.000000, 390.193359, 0.000000, 397.916016, -0.011719, 
-            401.068359, 0.000000, 408.609375, 0.000000, 408.609375, 0.000000, 415.365234, 0.263672, 
-            419.484375, 0.000000, 427.025391, 0.000000, 427.025391, 0.000000, 433.025391, 0.000000, 
-            440.748047, -0.011719, 440.929688, 0.263672, 443.900391, 0.000000, 443.900391, 0.000000, 
-            449.900391, 0.000000, 460.775391, 0.000000, 466.775391, 0.000000, 477.650391, 0.000000, 
-            483.650391, 0.000000, 494.390625, -0.451172, 494.525391, 0.000000, 500.525391, 0.000000, 
-            511.400391, 0.000000, 511.400391, 0.000000, 511.400391, 0.000000, 517.400391, 0.000000, 
-            528.275391, 0.000000, 528.275391, 0.000000, 531.457031, -0.451172, 528.275391, 0.000000, 
-            534.275391, 0.000000, 542.994141, 0.000000, 542.994141, 0.000000, 542.994141, 0.000000, 
-            542.994141, 0.000000, 553.869141, 0.000000, 559.869141, 0.000000, 565.869141, 0.000000, 
-            575.337891, 0.000000, 575.337891, 0.000000, 581.337891, 0.000000, 590.806641, 0.000000, 
-            596.806641, 0.000000, 609.597656, -0.451172, 606.275391, 0.000000, 612.275391, 0.000000, 
-            623.150391, 0.000000, 623.150391, 0.000000, 623.150391, 0.000000, 629.150391, 0.000000, 
-            640.025391, 0.000000, 640.025391, 0.000000, 643.207031, -0.451172, 640.025391, 0.000000, 
-            646.025391, 0.000000, 653.994141, 0.000000, 653.994141, 0.000000, 653.994141, 0.000000, 
-            653.994141, 0.000000, 664.869141, 0.000000, 670.869141, 0.000000, 678.773438, 0.263672, 
-            681.744141, 0.000000, 681.744141, 0.000000, 687.744141, 0.000000, 696.462891, 0.000000, 
-            696.462891, 0.000000, 704.367188, 0.263672, 707.337891, 0.000000, 707.337891, 0.000000, 
-            713.337891, 0.000000, 721.306641, 0.000000, 730.968750, -0.451172, 727.822266, 0.000000, 
-            733.822266, 0.000000, 742.541016, 0.000000, 742.541016, 0.000000, 753.416016, 0.000000, 
-            759.416016, 0.000000, 768.134766, 0.000000, 768.134766, 0.000000, 779.009766, 0.000000, 
-            785.009766, 0.000000, 793.728516, 0.000000, 793.728516, 0.000000, 804.603516, 0.000000, 
-            810.603516, 0.000000, 821.343750, -0.451172, 821.478516, 0.000000, 827.478516, 0.000000, 
-            836.197266, 0.000000, 836.197266, 0.000000, 836.197266, 0.000000, 836.197266, 0.000000, 
-            847.072266, 0.000000, 853.072266, 0.000000, 863.947266, 0.000000, 863.947266, 0.000000, 
-            867.128906, -0.451172, 863.947266, 0.000000, 869.947266, 0.000000, 875.876953, 0.000000, 
-            875.876953, 0.000000, 879.626953, 0.000000, 879.626953, 0.000000, 890.501953, 0.000000, 
-            896.501953, 0.000000, 903.064453, 0.000000, 903.064453, 0.000000, 903.064453, 0.000000, 
-            909.064453, 0.000000, 913.423828, 0.000000, 924.298828, 0.000000, 930.298828, 0.000000, 
-            934.658203, 0.000000, 942.626953, 0.000000, 948.626953, 0.000000, 955.142578, 0.000000, 
-            956.748047, 0.000000, 962.748047, 0.000000, 969.263672, 0.000000, 970.623047, 0.000000, 
-            976.623047, 0.000000, 983.378906, 0.263672, 983.853516, 0.164062, 987.498047, 0.000000, 
-            987.498047, 0.000000, 993.498047, 0.000000, 1000.875000, 0.263672, 1004.373047, 0.000000, 
-            1004.373047, 0.000000, 1004.373047, 0.000000, 1010.373047, 0.000000, 1021.113281, -0.451172, 
-            1021.248047, 0.000000, 1027.248047, 0.000000, 1034.947266, -0.011719, 1038.123047, 0.000000, 
-            1044.123047, 0.000000, 1050.878906, 0.263672, 1054.998047, 0.000000, 1060.998047, 0.000000, 
-            1068.966797, 0.000000, 1068.966797, 0.000000, 1075.529297, 0.000000, 1075.529297, 0.000000, 
-            1075.529297, 0.000000, 1081.529297, 0.000000, 1090.248047, 0.000000, 1090.248047, 0.000000, 
-            1098.216797, 0.000000, 1104.216797, 0.000000, 1115.091797, 0.000000, 1115.091797, 0.000000, 
-            1115.091797, 0.000000, 1121.091797, 0.000000, 1131.966797, 0.000000, 1131.966797, 0.000000, 
-            1131.164062, 0.275391, 1131.638672, 0.175781, 1131.966797, 0.000000, 1131.966797, 0.000000, 
-            1137.966797, 0.000000, 1144.529297, 0.000000, 1144.529297, 0.000000, 1144.529297, 0.000000, 
-            1150.458984, 0.000000, 1150.458984, 0.000000, 1154.208984, 0.000000, 1154.208984, 0.000000, 
-            1165.083984, 0.000000, 1171.083984, 0.000000, 1181.958984, 0.000000, 1181.958984, 0.000000, 
-            1181.958984, 0.000000, 1187.958984, 0.000000, 1196.677734, 0.000000, 1196.677734, 0.000000, 
-            1202.607422, 0.000000, 1202.607422, 0.000000, 1210.576172, 0.000000, 1216.576172, 0.000000, 
-            1224.544922, 0.000000, 1224.544922, 0.000000, 1224.544922, 0.000000, 1224.544922, 0.000000, 
-            1235.419922, 0.000000, 1241.419922, 0.000000, 1249.236328, 0.263672, 1252.294922, 0.000000, 
-            1252.294922, 0.000000, 1252.294922, 0.000000, 1258.294922, 0.000000, 1262.654297, 0.000000, 
-            1270.470703, 0.263672, 1273.529297, 0.000000, 1273.529297, 0.000000, 1273.529297, 0.000000, 
-            1279.529297, 0.000000, 1286.285156, 0.263672, 1287.345703, 0.263672, 1290.404297, 0.000000, 
-            1290.404297, 0.000000, 1290.404297, 0.000000, 1296.404297, 0.000000, 1300.763672, 0.000000, 
-            1311.638672, 0.000000, 1315.388672, 0.000000, 1315.388672, 0.000000, 1325.050781, -0.451172, 
-            1323.474609, -0.087891, 1321.904297, 0.000000, 1327.904297, 0.000000, 1332.263672, 0.000000, 
-            1338.767578, 0.439453, 1340.232422, 0.000000, 1348.201172, 0.000000, 1351.857422, 0.000000, 
-            1357.857422, 0.000000, 1362.216797, 0.000000, 1372.388672, 0.000000, 1372.388672, 0.000000, 
-            1372.388672, 0.000000, 1376.748047, 0.000000, 1386.919922, 0.000000, 1386.919922, 0.000000, 
-            1386.919922, 0.000000, 1391.279297, 0.000000, 1402.154297, 0.000000, 1408.154297, 0.000000, 
-            1416.123047, 0.000000, 1416.123047, 0.000000, 1426.998047, 0.000000, 1432.998047, 0.000000, 
-            1446.076172, 0.000000, 1446.076172, 0.000000, 1446.076172, 0.000000, 1452.076172, 0.000000, 
-            1460.044922, 0.000000, 1460.044922, 0.000000, 1471.294922, 0.000000, 1471.294922, 0.000000, 
-            1471.294922, 0.000000, 1477.294922, 0.000000, 1485.263672, 0.000000, 1485.263672, 0.000000, 
-            1496.138672, 0.000000, 1502.138672, 0.000000, 1510.107422, 0.000000, 1510.107422, 0.000000, 
-            1519.576172, 0.000000, 1525.576172, 0.000000, 1533.544922, 0.000000, 1533.544922, 0.000000, 
-            1543.013672, 0.000000, 1549.013672, 0.000000, 1556.982422, 0.000000, 1556.982422, 0.000000, 
-            1567.857422, 0.000000, 1567.857422, 0.000000, 1567.857422, 0.000000, 1573.857422, 0.000000, 
-            1581.826172, 0.000000, 1581.826172, 0.000000, 1590.544922, 0.000000, 1590.544922, 0.000000, 
-            1590.544922, 0.000000, 1590.544922, 0.000000, 1598.513672, 0.000000, 1604.513672, 0.000000, 
-            1612.482422, 0.000000, 1612.482422, 0.000000, 1621.201172, 0.000000, 1621.201172, 0.000000, 
-            1621.201172, 0.000000, 1621.201172, 0.000000, 1630.669922, 0.000000, 1636.669922, 0.000000, 
-            1641.029297, 0.000000, 1649.748047, 0.000000, 1649.748047, 0.000000, 1655.677734, 0.000000, 
-            1655.677734, 0.000000, 1663.939453, 0.263672, 1663.646484, 0.000000, 1663.646484, 0.000000, 
-            1669.646484, 0.000000, 1679.308594, -0.451172, 1676.162109, 0.000000, 1682.677734, 0.000000, 
-            1686.427734, 0.000000, 1686.427734, 0.000000, 1696.089844, -0.451172, 1692.943359, 0.000000, 
-            1698.943359, 0.000000, 1706.314453, 0.263672, 1709.818359, 0.000000, 1715.818359, 0.000000, 
-            1722.574219, 0.263672, 1726.693359, 0.000000, 1732.693359, 0.000000, 1740.392578, -0.011719, 
-            1743.568359, 0.000000, 1749.568359, 0.000000, 1757.291016, -0.011719, 1760.443359, 0.000000, 
-            1766.443359, 0.000000, 1774.376953, -0.011719, 1777.318359, 0.000000, 1783.318359, 0.000000, 
-            1791.738281, -0.439453, 1794.193359, 0.000000, 1800.193359, 0.000000, 1808.121094, 0.263672, 
-            1811.068359, 0.000000, 1817.068359, 0.000000, 1823.085938, -0.011719, 1825.037109, 0.000000, 
-            1831.037109, 0.000000, 1837.078125, -0.011719, 1839.005859, 0.000000, 1845.005859, 0.000000, 
-            1852.529297, 0.263672, 1852.974609, 0.000000, 1858.974609, 0.000000, 1865.941406, 0.263672, 
-            1866.943359, 0.000000, 1872.943359, 0.000000, 1879.294922, 0.263672, 1880.912109, 0.000000
-        
-    
-
-    
-        
-
-        中华人民共和国 台湾 中華人民共和國 臺灣
-
-        
-            0x000020BC, 0x000025DD, 0x00002149, 0x00003EA0, 0x00002400, 0x0000271B, 0x0000298C, 0x00000003, 
-            0x0000267F, 0x0000410D, 0x00000003, 0x000020BC, 0x0000567E, 0x00002149, 0x00003EA0, 0x00002400, 
-            0x0000271B, 0x0000299A, 0x00000003, 0x00005489, 0x000042F2
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, 
-            0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, 
-            0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014
-        
-
-        
-            0.000000, 0.000000, 12.000000, 0.000000, 24.000000, 0.000000, 36.000000, 0.000000, 
-            48.000000, 0.000000, 60.000000, 0.000000, 72.000000, 0.000000, 84.000000, 0.000000, 
-            87.333984, 0.000000, 99.333984, 0.000000, 111.333984, 0.000000, 114.667969, 0.000000, 
-            126.667969, 0.000000, 138.667969, 0.000000, 150.667969, 0.000000, 162.667969, 0.000000, 
-            174.667969, 0.000000, 186.667969, 0.000000, 198.667969, 0.000000, 202.001953, 0.000000, 
-            214.001953, 0.000000, 226.001953, 0.000000
-        
-    
-
-
-
-
-
-
-    
-        
-
-        शङ़ु
-
-        
-            0x00000002, 0x00000001, 0x00000006, 0x0000FFFF
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003
-        
-
-        
-            0.000000, 0.000000, 7.572000, 0.000000, 15.108000, 0.000000, 15.108000, 0.000000, 
-            15.108000, 0.000000
-        
-    
-
-
-
-    
-        
-
-        क्ष र्क क्‍ष र्‍क
-
-        
-            0x000000A2, 0x0000FFFF, 0x0000FFFF, 0x00000003, 0x00000080, 0x0000005B, 0x0000FFFF, 0x00000003, 
-            0x00000080, 0x00000051, 0x00000001, 0x0000009F, 0x00000003, 0x0000009A, 0x00000051, 0x00000001, 
-            0x00000080
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000006, 0x00000004, 0x00000005, 0x00000007, 
-            0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, 
-            0x00000010
-        
-
-        
-            0.000000, 0.000000, 10.875000, 0.000000, 10.875000, 0.000000, 10.875000, 0.000000, 
-            16.875000, 0.000000, 24.779297, 0.263672, 27.750000, 0.000000, 27.750000, 0.000000, 
-            33.750000, 0.000000, 44.490234, -0.451172, 44.625000, 0.000000, 44.625000, 0.000000, 
-            52.593750, 0.000000, 58.593750, 0.000000, 68.255859, -0.451172, 65.109375, 0.000000, 
-            65.109375, 0.000000, 75.984375, 0.000000
-        
-    
-
-    
-        
-
-        마만만
-
-        
-            0x00000000, 0x0000FFFF, 0x00000000, 0x0000FFFF, 0x0000FFFF, 0x00000000, 0x0000FFFF
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006
-        
-
-        
-            0.000000, 0.000000, 9.000000, 0.000000, 9.000000, 0.000000, 18.000000, 0.000000, 
-            18.000000, 0.000000, 18.000000, 0.000000, 27.000000, 0.000000, 27.000000, 0.000000
-        
-    
-
-    
-        
-
-        מָשְׁכֵנִיאַחֲרֶיךָנָּרוּצָההֱבִיאַנִיהַמֶּלֶךְחֲדָרָיונָגִילָהוְנִשְׂמְחָהבָּךְנַזְכִּירָהדֹדֶיךָמִיַּיִןמֵישָׁרִיםאֲהֵבוּךָ
-
-        
-            0x0000FFFF, 0x00000055, 0x0000FFFF, 0x0000004B, 0x0000001D, 0x00000097, 0x00000021, 0x00000094, 
-            0x0000001B, 0x0000002D, 0x00000027, 0x00000096, 0x0000003A, 0x0000009A, 0x0000FFFF, 0x00000066, 
-            0x00000027, 0x00000097, 0x0000002F, 0x00000030, 0x00000096, 0x00000027, 0x00000099, 0x0000FFFF, 
-            0x00000051, 0x00000096, 0x0000002F, 0x0000FFFF, 0x00000055, 0x00000027, 0x00000098, 0x0000001F, 
-            0x0000009C, 0x0000001F, 0x00000021, 0x0000009A, 0x0000003A, 0x00000027, 0x00000096, 0x0000FFFF, 
-            0x00000056, 0x00000092, 0x00000024, 0x00000099, 0x00000031, 0x0000FFFF, 0x00000054, 0x0000009A, 
-            0x0000FFFF, 0x00000043, 0x00000021, 0x0000009A, 0x00000025, 0x00000092, 0x0000002F, 0x00000092, 
-            0x0000FFFF, 0x00000067, 0x00000096, 0x00000031, 0x00000092, 0x00000023, 0x00000021, 0x0000009A, 
-            0x0000002B, 0x00000027, 0x00000096, 0x0000001E, 0x0000009A, 0x00000031, 0x00000023, 0x00000027, 
-            0x0000009A, 0x0000003A, 0x0000009A, 0x0000001F, 0x00000094, 0x00000025, 0x0000FFFF, 0x00000054, 
-            0x00000098, 0x0000002B, 0x00000098, 0x0000FFFF, 0x0000005D, 0x00000099, 0x00000021, 0x00000027, 
-            0x00000096, 0x00000031, 0x00000099, 0x0000001B, 0x00000027, 0x00000096, 0x0000001D, 0x00000093, 
-            0x00000021, 0x00000021, 0x0000009A, 0x00000038, 0x0000FFFF, 0x0000004B, 0x0000003A, 0x0000009A, 
-            0x0000FFFF, 0x0000005E, 0x0000FFFF, 0x00000055, 0x00000027, 0x00000098, 0x0000003A, 0x00000094, 
-            0x00000025, 0x00000099, 0x0000001B, 0x00000027, 0x00000096, 0x00000031, 0x00000097, 0x00000029, 
-            0x00000092, 0x0000FFFF, 0x00000066, 0x0000009A, 0x0000002F
-        
-
-        
-            0x0000007C, 0x0000007B, 0x0000007A, 0x00000079, 0x00000078, 0x00000077, 0x00000076, 0x00000075, 
-            0x00000074, 0x00000073, 0x00000072, 0x00000071, 0x00000070, 0x0000006F, 0x0000006E, 0x0000006D, 
-            0x0000006C, 0x0000006B, 0x0000006A, 0x00000069, 0x00000068, 0x00000067, 0x00000066, 0x00000065, 
-            0x00000064, 0x00000063, 0x00000062, 0x00000061, 0x00000060, 0x0000005F, 0x0000005E, 0x0000005D, 
-            0x0000005C, 0x0000005B, 0x0000005A, 0x00000059, 0x00000058, 0x00000057, 0x00000056, 0x00000055, 
-            0x00000054, 0x00000053, 0x00000052, 0x00000051, 0x00000050, 0x0000004F, 0x0000004E, 0x0000004D, 
-            0x0000004C, 0x0000004B, 0x0000004A, 0x00000049, 0x00000048, 0x00000047, 0x00000046, 0x00000045, 
-            0x00000044, 0x00000043, 0x00000042, 0x00000041, 0x00000040, 0x0000003F, 0x0000003E, 0x0000003D, 
-            0x0000003C, 0x0000003B, 0x0000003A, 0x00000039, 0x00000038, 0x00000037, 0x00000036, 0x00000035, 
-            0x00000034, 0x00000033, 0x00000032, 0x00000031, 0x00000030, 0x0000002F, 0x0000002E, 0x0000002D, 
-            0x0000002C, 0x0000002B, 0x0000002A, 0x00000029, 0x00000028, 0x00000027, 0x00000026, 0x00000025, 
-            0x00000024, 0x00000023, 0x00000022, 0x00000021, 0x00000020, 0x0000001F, 0x0000001E, 0x0000001D, 
-            0x0000001C, 0x0000001B, 0x0000001A, 0x00000019, 0x00000018, 0x00000017, 0x00000016, 0x00000015, 
-            0x00000014, 0x00000013, 0x00000012, 0x00000011, 0x00000010, 0x0000000F, 0x0000000E, 0x0000000D, 
-            0x0000000C, 0x0000000B, 0x0000000A, 0x00000009, 0x00000008, 0x00000007, 0x00000006, 0x00000005, 
-            0x00000004, 0x00000003, 0x00000002, 0x00000001, 0x00000000
-        
-
-        
-            0.000000, 0.000000, 0.000000, 0.000000, 5.806641, 0.000000, 5.806641, 0.000000, 
-            9.087891, 0.000000, 18.679688, 0.000000, 15.251953, 0.000000, 25.365234, 0.000000, 
-            21.878906, 0.000000, 28.787109, 0.000000, 35.191406, 0.000000, 42.966797, 0.000000, 
-            38.279297, 0.000000, 47.982422, 0.000000, 44.085938, 0.000000, 44.085938, 0.000000, 
-            52.347656, 0.000000, 58.453125, 0.000000, 55.113281, 0.000000, 62.021484, 0.000000, 
-            66.292969, 0.000000, 64.886719, 0.000000, 69.292969, 0.000000, 67.886719, 0.000000, 
-            67.886719, 0.000000, 74.050781, 0.000000, 70.710938, 0.000000, 77.619141, 0.000000, 
-            77.619141, 0.000000, 83.425781, 0.000000, 90.527344, 0.000000, 86.513672, 0.000000, 
-            91.804688, 0.000000, 92.390625, 0.000000, 98.267578, 0.000000, 109.347656, 0.000000, 
-            104.894531, 0.000000, 110.701172, 0.000000, 116.250000, 0.000000, 113.701172, 0.000000, 
-            113.554688, 0.000000, 121.242188, 0.000000, 119.484375, 0.000000, 124.552734, 0.000000, 
-            122.677734, 0.000000, 126.679688, 0.000000, 126.679688, 0.000000, 135.210938, 0.000000, 
-            132.486328, 0.000000, 132.251953, 0.000000, 138.416016, 0.000000, 148.734375, 0.000000, 
-            145.042969, 0.000000, 155.308594, 0.000000, 151.968750, 0.000000, 162.773438, 0.000000, 
-            158.876953, 0.000000, 158.876953, 0.000000, 168.398438, 0.000000, 166.523438, 0.000000, 
-            172.546875, 0.000000, 170.525391, 0.000000, 173.689453, 0.000000, 182.718750, 0.000000, 
-            180.199219, 0.000000, 185.583984, 0.000000, 190.107422, 0.000000, 187.998047, 0.000000, 
-            194.132812, 0.000000, 192.257812, 0.000000, 196.259766, 0.000000, 199.423828, 0.000000, 
-            206.964844, 0.000000, 202.511719, 0.000000, 212.332031, 0.000000, 208.318359, 0.000000, 
-            217.886719, 0.000000, 214.195312, 0.000000, 221.121094, 0.000000, 221.121094, 0.000000, 
-            229.447266, 0.000000, 226.927734, 0.000000, 235.652344, 0.000000, 232.312500, 0.000000, 
-            232.312500, 0.000000, 242.648438, 0.000000, 239.220703, 0.000000, 245.847656, 0.000000, 
-            250.195312, 0.000000, 248.320312, 0.000000, 255.808594, 0.000000, 252.322266, 0.000000, 
-            259.230469, 0.000000, 265.042969, 0.000000, 262.083984, 0.000000, 271.675781, 0.000000, 
-            268.248047, 0.000000, 274.875000, 0.000000, 284.197266, 0.000000, 281.501953, 0.000000, 
-            287.250000, 0.000000, 287.250000, 0.000000, 290.531250, 0.000000, 298.212891, 0.000000, 
-            296.337891, 0.000000, 296.337891, 0.000000, 300.339844, 0.000000, 300.339844, 0.000000, 
-            306.146484, 0.000000, 313.687500, 0.000000, 309.234375, 0.000000, 318.732422, 0.000000, 
-            315.041016, 0.000000, 325.453125, 0.000000, 321.966797, 0.000000, 328.875000, 0.000000, 
-            333.222656, 0.000000, 331.347656, 0.000000, 338.044922, 0.000000, 335.349609, 0.000000, 
-            345.175781, 0.000000, 341.279297, 0.000000, 341.279297, 0.000000, 352.558594, 0.000000, 
-            349.218750, 0.000000, 356.126953, 0.000000
-        
-    
-
-    
-        
-
-        Ţhiş iş a ţeşţ.
-
-        
-            0x00000107, 0x00000049, 0x0000004A, 0x00000104, 0x00000001, 0x0000004A, 0x00000104, 0x00000001, 
-            0x00000042, 0x00000001, 0x00000108, 0x00000046, 0x00000104, 0x00000108, 0x0000000F
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, 
-            0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E
-        
-
-        
-            0.000000, 0.000000, 7.356000, 0.000000, 14.340000, 0.000000, 17.832001, 0.000000, 
-            22.920000, 0.000000, 25.920000, 0.000000, 29.412001, 0.000000, 34.500000, 0.000000, 
-            37.500000, 0.000000, 43.500000, 0.000000, 46.500000, 0.000000, 50.411999, 0.000000, 
-            56.160000, 0.000000, 61.248001, 0.000000, 65.160004, 0.000000, 68.160004, 0.000000
-        
-    
-
-
-
-    
-        
-
-        فتح بینچ خلیج شیخ پہنچ
-
-        
-            0x0000003B, 0x00000344, 0x000001D5, 0x00000318, 0x00000349, 0x0000007C, 0x00000003, 0x0000003D, 
-            0x00000348, 0x000001D5, 0x00000346, 0x000000B5, 0x00000003, 0x0000003A, 0x00000348, 0x000001D5, 
-            0x000002E3, 0x00000344, 0x00000087, 0x00000003, 0x0000003B, 0x00000344, 0x000001D5, 0x00000348, 
-            0x000001E5, 0x00000347, 0x0000006E, 0x00000003, 0x0000003C, 0x00000345, 0x000001D5, 0x00000344, 
-            0x0000011D
-        
-
-        
-            0x00000015, 0x00000014, 0x00000014, 0x00000013, 0x00000012, 0x00000012, 0x00000011, 0x00000010, 
-            0x0000000F, 0x0000000F, 0x0000000E, 0x0000000E, 0x0000000D, 0x0000000C, 0x0000000B, 0x0000000B, 
-            0x0000000A, 0x00000009, 0x00000009, 0x00000008, 0x00000007, 0x00000006, 0x00000006, 0x00000005, 
-            0x00000005, 0x00000004, 0x00000004, 0x00000003, 0x00000002, 0x00000001, 0x00000001, 0x00000000, 
-            0x00000000
-        
-
-        
-            0.000000, 0.000000, 3.205078, -11.097656, 1.406250, 0.000000, 4.558594, -1.376953, 
-            9.421875, -5.273438, 7.505859, -6.843750, 11.537109, 0.000000, 12.726562, 0.000000, 
-            20.455078, -4.798828, 15.357422, 0.000000, 19.289062, -13.072266, 18.509766, -1.376953, 
-            22.552734, 0.000000, 23.742188, 0.000000, 30.246094, -4.798828, 25.148438, 0.000000, 
-            28.300781, -1.376953, 32.917969, -13.792969, 30.158203, -7.792969, 35.208984, 0.000000, 
-            36.398438, 0.000000, 39.603516, -11.097656, 37.804688, 0.000000, 45.632812, 3.181641, 
-            40.957031, -1.376953, 44.853516, -6.046875, 42.457031, -5.572266, 46.066406, 0.000000, 
-            47.255859, 0.000000, 49.376953, -11.396484, 48.662109, 0.000000, 52.769531, -14.332031, 
-            51.814453, -1.376953, 56.789062, 0.000000
-        
-    
-
-    
-        
-
-        ണു്
-
-        
-            0x00000023, 0x0000003C, 0x00000045
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002
-        
-
-        
-            0.000000, 0.000000, 15.117188, 0.000000, 18.503906, 0.000000, 18.503906, 0.000000
-        
-    
-
-    
-        
-
-        中華人民共和國 臺灣
-
-        
-            0x00000292, 0x000024E8, 0x000002D1, 0x00001582, 0x000004A1, 0x00000650, 0x000007E2, 0x00000021, 
-            0x00002395, 0x00001896
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, 
-            0x00000008, 0x00000009
-        
-
-        
-            0.000000, 0.000000, 12.000000, 0.000000, 24.000000, 0.000000, 36.000000, 0.000000, 
-            48.000000, 0.000000, 60.000000, 0.000000, 72.000000, 0.000000, 84.000000, 0.000000, 
-            90.000000, 0.000000, 102.000000, 0.000000, 114.000000, 0.000000
-        
-    
-
-    
-        
-
-        ప్రకాష్
-
-        
-            0x00000057, 0x0000023B, 0x0000FFFF, 0x00000125, 0x00000066, 0x00000241, 0x0000FFFF
-        
-
-        
-            0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x00000004, 0x00000005, 0x00000006
-        
-
-        
-            0.000000, 0.000000, 8.285156, 0.000000, 14.894531, 0.000000, 14.894531, 0.000000, 
-            21.503906, 0.000000, 25.136719, 0.000000, 33.421875, 0.000000, 33.421875, 0.000000
-        
-    
-
-    
-        
-
-        บทที่๑พายุไซโคลนโดโรธีอาศัยอยู่ท่ามกลางทุ่งใหญ่ในแคนซัสกับลุงเฮนรีชาวไร่และป้าเอ็มภรรยาชาวไร่บ้านของพวกเขาหลังเล็กเพราะไม้สร้างบ้านต้องขนมาด้วยเกวียนเป็นระยะทางหลายไมล์
-
-        
-            0x0000009D, 0x0000009A, 0x0000009A, 0x000000B8, 0x000000C9, 0x000000D2, 0x000000A1, 0x000000B5, 
-            0x000000A5, 0x000000BB, 0x000000C5, 0x0000008E, 0x000000C3, 0x00000087, 0x000000A8, 0x0000009C, 
-            0x000000C3, 0x00000097, 0x000000C3, 0x000000A6, 0x0000009B, 0x000000B8, 0x000000B0, 0x000000B5, 
-            0x000000AB, 0x000000B4, 0x000000A5, 0x000000B0, 0x000000A5, 0x000000BC, 0x0000006E, 0x0000009A, 
-            0x0000006E, 0x000000B5, 0x000000A4, 0x00000084, 0x000000A8, 0x000000B5, 0x0000008A, 0x0000009A, 
-            0x000000BB, 0x0000006E, 0x0000008A, 0x000000C4, 0x000000AE, 0x00000090, 0x0000006E, 0x000000C4, 
-            0x0000009C, 0x000000C2, 0x00000087, 0x0000009C, 0x0000008E, 0x000000B4, 0x000000AD, 0x00000084, 
-            0x000000B4, 0x0000009D, 0x000000A8, 0x000000BB, 0x0000008A, 0x000000C1, 0x000000B1, 0x0000009C, 
-            0x000000A6, 0x000000B8, 0x0000008D, 0x000000B5, 0x000000AA, 0x000000C5, 0x000000A6, 0x0000006E, 
-            0x000000C2, 0x000000A8, 0x000000B3, 0x0000009E, 0x0000006F, 0x000000B5, 0x000000C1, 0x000000B0, 
-            0x000000C8, 0x000000A4, 0x000000A3, 0x000000A6, 0x000000A6, 0x000000A5, 0x000000B5, 0x0000008D, 
-            0x000000B5, 0x000000AA, 0x000000C5, 0x000000A6, 0x0000006E, 0x0000009D, 0x0000006F, 0x000000B5, 
-            0x0000009C, 0x00000085, 0x000000B0, 0x0000008A, 0x000000A1, 0x000000AA, 0x00000084, 0x000000C1, 
-            0x00000085, 0x000000B5, 0x000000AE, 0x000000A8, 0x000000B4, 0x0000008A, 0x000000C1, 0x000000A8, 
-            0x000000C8, 0x00000084, 0x000000C1, 0x000000A1, 0x000000A6, 0x000000B5, 0x000000B3, 0x000000C5, 
-            0x000000A4, 0x0000006F, 0x000000AD, 0x000000A6, 0x0000006F, 0x000000B5, 0x0000008A, 0x0000009D, 
-            0x0000006F, 0x000000B5, 0x0000009C, 0x00000098, 0x0000006F, 0x000000B0, 0x0000008A, 0x00000085, 
-            0x0000009C, 0x000000A4, 0x000000B5, 0x00000097, 0x0000006F, 0x000000AA, 0x000000A5, 0x000000C1, 
-            0x00000084, 0x000000AA, 0x000000B8, 0x000000A5, 0x0000009C, 0x000000C1, 0x0000009E, 0x000000C8, 
-            0x0000009C, 0x000000A6, 0x000000B3, 0x000000A5, 0x000000B3, 0x0000009A, 0x000000B5, 0x0000008A, 
-            0x000000AE, 0x000000A8, 0x000000B5, 0x000000A5, 0x000000C5, 0x000000A4, 0x000000A8, 0x00000072
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, 
-            0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, 
-            0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, 
-            0x00000018, 0x00000019, 0x0000001A, 0x0000001B, 0x0000001C, 0x0000001D, 0x0000001E, 0x0000001F, 
-            0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000026, 0x00000027, 
-            0x00000028, 0x00000029, 0x0000002A, 0x0000002B, 0x0000002C, 0x0000002D, 0x0000002E, 0x0000002F, 
-            0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034, 0x00000035, 0x00000036, 0x00000037, 
-            0x00000038, 0x00000039, 0x0000003A, 0x0000003B, 0x0000003C, 0x0000003D, 0x0000003E, 0x0000003F, 
-            0x00000040, 0x00000041, 0x00000042, 0x00000043, 0x00000044, 0x00000045, 0x00000046, 0x00000047, 
-            0x00000048, 0x00000049, 0x0000004A, 0x0000004B, 0x0000004C, 0x0000004D, 0x0000004E, 0x0000004F, 
-            0x00000050, 0x00000051, 0x00000052, 0x00000053, 0x00000054, 0x00000055, 0x00000056, 0x00000057, 
-            0x00000058, 0x00000059, 0x0000005A, 0x0000005B, 0x0000005C, 0x0000005D, 0x0000005E, 0x0000005F, 
-            0x00000060, 0x00000061, 0x00000062, 0x00000063, 0x00000064, 0x00000065, 0x00000066, 0x00000067, 
-            0x00000068, 0x00000069, 0x0000006A, 0x0000006B, 0x0000006C, 0x0000006D, 0x0000006E, 0x0000006F, 
-            0x00000070, 0x00000071, 0x00000072, 0x00000073, 0x00000074, 0x00000075, 0x00000076, 0x00000077, 
-            0x00000078, 0x00000079, 0x0000007A, 0x0000007B, 0x0000007C, 0x0000007D, 0x0000007E, 0x0000007F, 
-            0x00000080, 0x00000081, 0x00000082, 0x00000083, 0x00000084, 0x00000085, 0x00000086, 0x00000087, 
-            0x00000088, 0x00000089, 0x0000008A, 0x0000008B, 0x0000008C, 0x0000008D, 0x0000008E, 0x0000008F, 
-            0x00000090, 0x00000091, 0x00000092, 0x00000093, 0x00000094, 0x00000095, 0x00000096, 0x00000097, 
-            0x00000098, 0x00000099, 0x0000009A, 0x0000009B, 0x0000009C, 0x0000009D, 0x0000009E, 0x0000009F, 
-            0x000000A0, 0x000000A1, 0x000000A2, 0x000000A3, 0x000000A4, 0x000000A5, 0x000000A6, 0x000000A7
-        
-
-        
-            0.000000, 0.000000, 5.399414, 0.000000, 10.798828, 0.000000, 15.072266, 0.000000, 
-            15.072266, 0.000000, 16.198242, 0.000000, 21.046875, 0.000000, 26.616211, 0.000000, 
-            30.035156, 0.000000, 31.312500, 0.000000, 34.151367, 0.000000, 38.279297, 0.000000, 
-            43.558594, 0.000000, 47.663086, 0.000000, 52.438477, 0.000000, 57.178711, 0.000000, 
-            62.698242, 0.000000, 66.802734, 0.000000, 71.601562, 0.000000, 75.706055, 0.000000, 
-            79.810547, 0.000000, 84.029297, 0.000000, 84.369141, 0.000000, 89.097656, 0.000000, 
-            92.516602, 0.000000, 97.614258, 0.000000, 97.195312, 0.000000, 101.311523, 0.000000, 
-            106.040039, 0.000000, 107.375977, 0.000000, 108.326172, -0.084961, 110.156250, 0.000000, 
-            113.497070, -0.084961, 115.555664, 0.000000, 118.974609, 0.000000, 124.013672, 0.000000, 
-            128.765625, 0.000000, 133.505859, 0.000000, 136.924805, 0.000000, 140.704102, 0.000000, 
-            143.036133, 0.000000, 144.044922, -0.084961, 146.103516, 0.000000, 149.882812, 0.000000, 
-            153.553711, 0.000000, 159.158203, 0.000000, 163.377930, -0.084961, 165.421875, 0.000000, 
-            169.092773, 0.000000, 174.612305, 0.000000, 179.135742, 0.000000, 183.911133, 0.000000, 
-            189.430664, 0.000000, 194.879883, 0.000000, 194.709961, 0.000000, 199.989258, 0.000000, 
-            204.092773, -0.084961, 204.741211, 0.000000, 210.140625, 0.000000, 212.828125, 0.000000, 
-            214.880859, 0.000000, 218.660156, 0.000000, 220.675781, 0.000000, 225.128906, 0.000000, 
-            230.648438, 0.000000, 234.105469, 0.000000, 234.752930, 0.000000, 239.613281, 0.000000, 
-            243.032227, 0.000000, 247.280273, 0.000000, 251.408203, 0.000000, 253.932617, -0.084961, 
-            255.512695, 0.000000, 260.036133, 0.000000, 264.776367, 0.000000, 269.071289, 0.000000, 
-            272.704102, 0.000000, 274.470703, 0.000000, 277.889648, 0.000000, 279.905273, 0.000000, 
-            284.768555, 0.000000, 284.633789, 0.000000, 289.672852, 0.000000, 294.641602, 0.000000, 
-            298.746094, 0.000000, 302.850586, 0.000000, 306.966797, 0.000000, 310.385742, 0.000000, 
-            315.246094, 0.000000, 318.665039, 0.000000, 322.913086, 0.000000, 327.041016, 0.000000, 
-            329.565430, -0.084961, 331.145508, 0.000000, 335.911133, 0.000000, 336.544922, 0.000000, 
-            339.963867, 0.000000, 345.483398, 0.000000, 350.258789, 0.000000, 354.987305, 0.000000, 
-            358.766602, 0.000000, 364.335938, 0.000000, 368.583984, 0.000000, 373.335938, 0.000000, 
-            375.351562, 0.000000, 380.126953, 0.000000, 383.545898, 0.000000, 389.150391, 0.000000, 
-            394.306641, 0.000000, 393.890625, 0.000000, 397.669922, 0.000000, 399.685547, 0.000000, 
-            404.548828, 0.000000, 404.425781, 0.000000, 409.177734, 0.000000, 411.193359, 0.000000, 
-            416.762695, 0.000000, 420.867188, 0.000000, 424.286133, 0.000000, 428.581055, 0.000000, 
-            432.708984, 0.000000, 438.123047, 0.000000, 437.748047, 0.000000, 443.027344, 0.000000, 
-            446.976562, 0.000000, 447.131836, 0.000000, 450.550781, 0.000000, 454.330078, 0.000000, 
-            459.095703, 0.000000, 459.729492, 0.000000, 463.148438, 0.000000, 468.667969, 0.000000, 
-            473.847656, 0.000000, 473.478516, 0.000000, 478.207031, 0.000000, 481.986328, 0.000000, 
-            486.761719, 0.000000, 492.281250, 0.000000, 497.320312, 0.000000, 500.739258, 0.000000, 
-            505.860352, 0.000000, 505.538086, 0.000000, 509.786133, 0.000000, 513.902344, 0.000000, 
-            515.917969, 0.000000, 520.669922, 0.000000, 523.947266, 0.000000, 524.917969, 0.000000, 
-            529.034180, 0.000000, 534.553711, 0.000000, 536.569336, 0.000000, 540.846680, 0.000000, 
-            541.968750, 0.000000, 547.488281, 0.000000, 551.592773, 0.000000, 555.887695, 0.000000, 
-            560.003906, 0.000000, 564.298828, 0.000000, 569.698242, 0.000000, 573.117188, 0.000000, 
-            576.896484, 0.000000, 582.500977, 0.000000, 587.241211, 0.000000, 590.660156, 0.000000, 
-            594.776367, 0.000000, 598.904297, 0.000000, 603.943359, 0.000000, 608.894531, 0.000000, 
-            608.683594, 0.000000
-        
-    
-
-
-
-    
-        
-
-        ‭ﻲﺑﺮﻌﻟﺎﺑ
-
-        
-            0x0000FFFF, 0x00000206, 0x000001A5, 0x000001C2, 0x000001E0, 0x000001F3, 0x000001A2, 0x000001A5
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007
-        
-
-        
-            0.000000, 0.000000, 0.000000, 0.000000, 5.759766, 0.000000, 7.980469, 0.000000, 
-            11.748047, 0.000000, 15.298828, 0.000000, 17.302734, 0.000000, 19.763672, 0.000000, 
-            21.984375, 0.000000
-        
-    
-
-    
-        
-
-        ﻲﺑﺮﻌﻟﺎﺑ
-
-        
-            0x000001A5, 0x000001A2, 0x000001F3, 0x000001E0, 0x000001C2, 0x000001A5, 0x00000206
-        
-
-        
-            0x00000006, 0x00000005, 0x00000004, 0x00000003, 0x00000002, 0x00000001, 0x00000000
-        
-
-        
-            0.000000, 0.000000, 2.220703, 0.000000, 4.681641, 0.000000, 6.685547, 0.000000, 
-            10.236328, 0.000000, 14.003906, 0.000000, 16.224609, 0.000000, 21.984375, 0.000000
-        
-    
-
-    
-        
-
-        ḤḤ
-
-        
-            0x000009A3, 0x000009A3
-        
-
-        
-            0x00000000, 0x00000001
-        
-
-        
-            0.000000, 0.000000, 8.666016, 0.000000, 17.332031, 0.000000
-        
-    
-
-    
-        
-
-        र्य र्‌य
-
-        
-            0x00000099, 0x0000005B, 0x0000FFFF, 0x00000003, 0x0000009A, 0x00000051, 0x00000001, 0x00000099
-        
-
-        
-            0x00000002, 0x00000000, 0x00000001, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007
-        
-
-        
-            0.000000, 0.000000, 9.726562, 0.263672, 9.468750, 0.000000, 9.468750, 0.000000, 
-            15.468750, 0.000000, 25.130859, -0.451172, 21.984375, 0.000000, 21.984375, 0.000000, 
-            31.453125, 0.000000
-        
-    
-
-
-
-
-
-    
-        
-
-        Li kien kien, li kieku kieku.
-
-        
-            0x0000000D, 0x00000024, 0x00000001, 0x00000026, 0x00000024, 0x00000020, 0x00000029, 0x00000001, 
-            0x00000026, 0x00000024, 0x00000020, 0x00000029, 0x000001D0, 0x00000001, 0x00000027, 0x00000024, 
-            0x00000001, 0x00000026, 0x00000024, 0x00000020, 0x00000026, 0x00000030, 0x00000001, 0x00000026, 
-            0x00000024, 0x00000020, 0x00000026, 0x00000030, 0x000001CF
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, 
-            0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, 
-            0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, 
-            0x00000018, 0x00000019, 0x0000001A, 0x0000001B, 0x0000001C
-        
-
-        
-            0.000000, 0.000000, 7.200000, 0.000000, 14.400000, 0.000000, 21.599998, 0.000000, 
-            28.799999, 0.000000, 36.000000, 0.000000, 43.200001, 0.000000, 50.400002, 0.000000, 
-            57.600002, 0.000000, 64.800003, 0.000000, 72.000000, 0.000000, 79.199997, 0.000000, 
-            86.399994, 0.000000, 93.599991, 0.000000, 100.799988, 0.000000, 107.999985, 0.000000, 
-            115.199982, 0.000000, 122.399979, 0.000000, 129.599976, 0.000000, 136.799973, 0.000000, 
-            143.999969, 0.000000, 151.199966, 0.000000, 158.399963, 0.000000, 165.599960, 0.000000, 
-            172.799957, 0.000000, 179.999954, 0.000000, 187.199951, 0.000000, 194.399948, 0.000000, 
-            201.599945, 0.000000, 208.799942, 0.000000
-        
-    
-
-    
-        
-
-        Il-Mistoqsija oħt l-għerf.
-
-        
-            0x0000000A, 0x00000027, 0x00000210, 0x0000000E, 0x00000024, 0x0000002E, 0x0000002F, 0x0000002A, 
-            0x0000002C, 0x0000002E, 0x00000024, 0x00000025, 0x0000001C, 0x00000001, 0x0000002A, 0x0000011F, 
-            0x0000002F, 0x00000001, 0x00000027, 0x00000210, 0x00000022, 0x0000011F, 0x00000020, 0x0000002D, 
-            0x00000021, 0x000001FB
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, 
-            0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, 
-            0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, 
-            0x00000018, 0x00000019
-        
-
-        
-            0.000000, 0.000000, 3.096000, 0.000000, 6.156000, 0.000000, 9.888000, 0.000000, 
-            18.552000, 0.000000, 21.504000, 0.000000, 26.532000, 0.000000, 30.467999, 0.000000, 
-            36.972000, 0.000000, 43.571999, 0.000000, 48.599998, 0.000000, 51.551998, 0.000000, 
-            54.515999, 0.000000, 60.660000, 0.000000, 63.084000, 0.000000, 69.587997, 0.000000, 
-            76.115997, 0.000000, 80.171997, 0.000000, 82.596001, 0.000000, 85.655998, 0.000000, 
-            89.388000, 0.000000, 95.435997, 0.000000, 101.963997, 0.000000, 107.916000, 0.000000, 
-            112.080002, 0.000000, 114.984001, 0.000000, 117.972000, 0.000000
-        
-    
-
-    
-        
-
-        ༄༅།། ཏིན་ཏིན་གྱི་དཔའ་རྩལ
-
-        
-            0x00000145, 0x0000FFFF, 0x00000151, 0x00000151, 0x00000003, 0x0000046C, 0x00000BFD, 0x0000059A, 
-            0x0000014E, 0x0000046C, 0x00000BFD, 0x0000059A, 0x0000014E, 0x000002CA, 0x0000FFFF, 0x00000BFD, 
-            0x0000014E, 0x0000050E, 0x00000611, 0x00000848, 0x0000014E, 0x0000093C, 0x0000FFFF, 0x0000098B
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, 
-            0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F, 
-            0x00000010, 0x00000011, 0x00000012, 0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017
-        
-
-        
-            0.000000, 0.000000, 14.906250, 0.000000, 14.906250, 0.000000, 17.648438, 0.000000, 
-            20.390625, 0.000000, 23.906250, 0.000000, 29.109375, 0.000000, 29.109375, 0.000000, 
-            34.171875, 0.000000, 35.929688, 0.000000, 41.132812, 0.000000, 41.132812, 0.000000, 
-            46.195312, 0.000000, 47.953125, 0.000000, 54.773438, 0.000000, 54.773438, 0.000000, 
-            54.773438, 0.000000, 56.531250, 0.000000, 61.875000, 0.000000, 67.570312, 0.000000, 
-            73.195312, 0.000000, 74.953125, 0.000000, 80.437500, 0.000000, 80.437500, 0.000000, 
-            87.328125, 0.000000
-        
-    
-
-    
-        
-
-        ᄊᆞᆷ ᄒᆞᆫ글 ᄀᆞᇹ ᄫᆞᆼ
-
-        
-            0x000044FF, 0x00004707, 0x00004859, 0x00000005, 0x0000462B, 0x00004707, 0x00004785, 0x000019B2, 
-            0x00000005, 0x00004361, 0x00004707, 0x0000498D, 0x00000005, 0x000044C3, 0x00004707, 0x00004911
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, 0x00000007, 
-            0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, 0x0000000F
-        
-
-        
-            0.000000, 0.000000, 12.000000, 0.000000, 12.000000, 0.000000, 12.000000, 0.000000, 
-            14.700000, 0.000000, 26.700001, 0.000000, 26.700001, 0.000000, 26.700001, 0.000000, 
-            38.700001, 0.000000, 41.400002, 0.000000, 53.400002, 0.000000, 53.400002, 0.000000, 
-            53.400002, 0.000000, 56.100002, 0.000000, 68.100006, 0.000000, 68.100006, 0.000000, 
-            68.100006, 0.000000
-        
-    
-
-    
-        
-
-        के े
-
-        
-            0x00000901, 0x00000931, 0x00000003, 0x00000956, 0x00000931
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000003
-        
-
-        
-            0.000000, 0.000000, 5.935547, 0.000000, 8.548828, 0.000000, 12.345703, 0.000000, 
-            17.085938, 0.000000, 18.345703, 0.000000
-        
-    
-
-
-    
-        
-
-        अँग्रेज़ी
-
-        
-            0x000008F1, 0x000008EE, 0x000009CB, 0x0000FFFF, 0x0000FFFF, 0x00000931, 0x00000940, 0x0000FFFF, 
-            0x0000092A
-        
-
-        
-            0x00000000, 0x00000001, 0x00000002, 0x00000004, 0x00000003, 0x00000005, 0x00000006, 0x00000007, 
-            0x00000008
-        
-
-        
-            0.000000, 0.000000, 9.076172, 0.000000, 9.076172, 0.000000, 16.025391, 0.000000, 
-            16.025391, 0.000000, 16.025391, 0.000000, 16.025391, 0.000000, 23.976562, 0.000000, 
-            23.976562, 0.000000, 27.304688, 0.000000
-        
-    
-
-
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/XBMDecoderTest.java openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/XBMDecoderTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/XBMDecoderTest.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/XBMDecoderTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8361748
+ * @summary Tests XBM image size limits and if XBMImageDecoder.produceImage()
+ *          throws appropriate error when parsing invalid XBM image data.
+ * @run main XBMDecoderTest
+ */
+
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.PrintStream;
+import java.util.Arrays;
+import javax.swing.ImageIcon;
+
+public class XBMDecoderTest {
+
+    public static void main(String[] args) throws Exception {
+        String dir = System.getProperty("test.src");
+        PrintStream originalErr = System.err;
+        boolean validCase;
+
+        File currentDir = new File(dir);
+        File[] files = currentDir.listFiles((File d, String s)
+                                            -> s.endsWith(".xbm"));
+
+        for (File file : files) {
+            String fileName = file.getName();
+            validCase = fileName.startsWith("valid");
+
+            System.out.println("--- Testing " + fileName + " ---");
+            try (FileInputStream fis = new FileInputStream(file);
+                 ByteArrayOutputStream errContent = new ByteArrayOutputStream()) {
+                System.setErr(new PrintStream(errContent));
+
+                ImageIcon icon = new ImageIcon(fis.readAllBytes());
+                boolean isErrEmpty = errContent.toString().isEmpty();
+
+                if (!isErrEmpty) {
+                    System.out.println("Expected ImageFormatException occurred.");
+                    System.out.print(errContent);
+                }
+                if (validCase && !isErrEmpty) {
+                    throw new RuntimeException("Test failed: Error stream not empty");
+                } else if (!validCase && isErrEmpty && hasPixelData(icon.getImage())) {
+                    throw new RuntimeException("Test failed: ImageFormatException"
+                            + " expected but not thrown");
+                }
+                if (validCase && !hasPixelData(icon.getImage())) {
+                    throw new RuntimeException("Test failed: the parsed image " +
+                            "does not contain any pixel data");
+                }
+                System.out.println("PASSED\n");
+            } finally {
+                System.setErr(originalErr);
+            }
+        }
+    }
+
+    private static boolean hasPixelData(Image img) {
+        int w = img.getWidth(null);
+        int h = img.getHeight(null);
+        BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D g = bi.createGraphics();
+        g.drawImage(img, 0, 0, null);
+        g.dispose();
+        int[] pixels = bi.getRGB(0, 0, w, h, null, 0, w);
+        if (Arrays.stream(pixels).allMatch(i -> i == 0)) {
+            return false;
+        }
+        return true;
+    }
+}
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/invalid.xbm openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/invalid.xbm
--- openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/invalid.xbm	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/invalid.xbm	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,2 @@
+#define k_ht 3
+h` k[] = { 01x0, 42222222222236319330::
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/invalid_empty.xbm openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/invalid_empty.xbm
--- openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/invalid_empty.xbm	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/invalid_empty.xbm	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,6 @@
+#define test_width 16
+#define test_height 3
+#define ht_x 1
+#define ht_y 2
+static unsigned char test_bits[] = {
+};
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/invalid_hex.xbm openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/invalid_hex.xbm
--- openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/invalid_hex.xbm	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/invalid_hex.xbm	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,3 @@
+#define k_width 16
+#define k_height  1
+k[] = { 0x10, 1234567890};
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/invalid_ht.xbm openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/invalid_ht.xbm
--- openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/invalid_ht.xbm	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/invalid_ht.xbm	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,3 @@
+#define k_wt 16
+#define k_ht  0
+k[] = { 0x10, 0x12};
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/invalid_plus.xbm openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/invalid_plus.xbm
--- openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/invalid_plus.xbm	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/invalid_plus.xbm	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,3 @@
+#define test_width 16
+#define test_height 2
+static unsigned char test_bits[] = { 0x13, 0x11, 0xAB+, 0xff };
\ No newline at end of file
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/valid.xbm openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/valid.xbm
--- openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/valid.xbm	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/valid.xbm	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,6 @@
+#define test_width 16
+#define test_height 3
+#define ht_x 1
+#define ht_y 2
+static unsigned char test_bits[] = {
+0x13, 0x11, 0x15, 0x00, 0xAB, 0xcd };
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/valid_hex.xbm openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/valid_hex.xbm
--- openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/valid_hex.xbm	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/valid_hex.xbm	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,4 @@
+#define test_width 16
+#define test_height 2
+static unsigned char test_bits[] = { 0x13, 0x11,
+ 0xAB, 0xff };
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/valid_multiline.xbm openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/valid_multiline.xbm
--- openjdk-21-21.0.10+7/test/jdk/java/awt/image/XBMDecoder/valid_multiline.xbm	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/image/XBMDecoder/valid_multiline.xbm	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,8 @@
+#define test_width 16
+#define test_height 3
+#define ht_x 1
+#define ht_y 2
+static unsigned char test_bits[] = {
+0x20, 0x10, 
+0x25, 0x01, 
+0xAC, 0xab };
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/awt/regtesthelpers/PassFailJFrame.java openjdk-21-21.0.11+10/test/jdk/java/awt/regtesthelpers/PassFailJFrame.java
--- openjdk-21-21.0.10+7/test/jdk/java/awt/regtesthelpers/PassFailJFrame.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/awt/regtesthelpers/PassFailJFrame.java	2026-04-17 19:09:35.000000000 +0000
@@ -486,9 +486,11 @@
                           long testTimeOut,
                           int rows, int columns)
             throws InterruptedException, InvocationTargetException {
-        invokeOnEDT(() -> createUI(title, instructions,
-                                   testTimeOut,
-                                   rows, columns));
+        this(builder().title(title)
+                      .instructions(instructions)
+                      .testTimeOut(testTimeOut)
+                      .rows(rows)
+                      .columns(columns));
     }
 
     /**
@@ -503,6 +505,7 @@
      */
     private PassFailJFrame(final Builder builder)
             throws InterruptedException, InvocationTargetException {
+        builder.validate();
         invokeOnEDT(() -> createUI(builder));
 
         if (!builder.splitUI && builder.panelCreator != null) {
@@ -584,39 +587,13 @@
         }
     }
 
-    private static void createUI(String title, String instructions,
-                                 long testTimeOut, int rows, int columns) {
-        frame = new JFrame(title);
-        frame.setLayout(new BorderLayout());
-
-        frame.addWindowListener(windowClosingHandler);
-
-        frame.add(createInstructionUIPanel(instructions,
-                                           testTimeOut,
-                                           rows, columns,
-                                           null,
-                                           false,
-                                           false, 0),
-                  BorderLayout.CENTER);
-        frame.pack();
-        frame.setLocationRelativeTo(null);
-        addTestWindow(frame);
-    }
-
     private static void createUI(Builder builder) {
         frame = new JFrame(builder.title);
         frame.setLayout(new BorderLayout());
 
         frame.addWindowListener(windowClosingHandler);
 
-        JComponent instructionUI =
-                createInstructionUIPanel(builder.instructions,
-                                         builder.testTimeOut,
-                                         builder.rows, builder.columns,
-                                         builder.hyperlinkListener,
-                                         builder.screenCapture,
-                                         builder.addLogArea,
-                                         builder.logAreaRows);
+        JComponent instructionUI = createInstructionUIPanel(builder);
         if (builder.splitUI) {
             JSplitPane splitPane = new JSplitPane(
                     builder.splitUIOrientation,
@@ -632,24 +609,23 @@
         addTestWindow(frame);
     }
 
-    private static JComponent createInstructionUIPanel(String instructions,
-                                                       long testTimeOut,
-                                                       int rows, int columns,
-                                                       HyperlinkListener hyperlinkListener,
-                                                       boolean enableScreenCapture,
-                                                       boolean addLogArea,
-                                                       int logAreaRows) {
+    private static JComponent createInstructionUIPanel(final Builder builder) {
         JPanel main = new JPanel(new BorderLayout());
         main.setBorder(createFrameBorder());
 
-        timeoutHandlerPanel = new TimeoutHandlerPanel(testTimeOut);
+        timeoutHandlerPanel = new TimeoutHandlerPanel(builder.testTimeOut);
         main.add(timeoutHandlerPanel, BorderLayout.NORTH);
 
-        JTextComponent text = instructions.startsWith("")
-                              ? configureHTML(instructions, rows, columns)
-                              : configurePlainText(instructions, rows, columns);
-        if (hyperlinkListener != null && text instanceof JEditorPane ep) {
-            ep.addHyperlinkListener(hyperlinkListener);
+        JTextComponent text = builder.instructions.startsWith("")
+                              ? configureHTML(builder.instructions,
+                                              builder.rows,
+                                              builder.columns)
+                              : configurePlainText(builder.instructions,
+                                                   builder.rows,
+                                                   builder.columns);
+        if (builder.hyperlinkListener != null
+            && text instanceof JEditorPane ep) {
+            ep.addHyperlinkListener(builder.hyperlinkListener);
         }
         text.setEditable(false);
         text.setBorder(createTextBorder());
@@ -678,12 +654,12 @@
         buttonsPanel.add(btnPass);
         buttonsPanel.add(btnFail);
 
-        if (enableScreenCapture) {
+        if (builder.screenCapture) {
             buttonsPanel.add(createCapturePanel());
         }
 
-        if (addLogArea) {
-            logArea = new JTextArea(logAreaRows, columns);
+        if (builder.addLogArea) {
+            logArea = new JTextArea(builder.logAreaRows, builder.columns);
             logArea.setEditable(false);
             logArea.setBorder(createTextBorder());
 
@@ -1843,7 +1819,6 @@
         public PassFailJFrame build() throws InterruptedException,
                 InvocationTargetException {
             try {
-                validate();
                 return new PassFailJFrame(this);
             } catch (final Throwable t) {
                 // Dispose of all the windows, including those that may not
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/foreign/nested/TestNested.java openjdk-21-21.0.11+10/test/jdk/java/foreign/nested/TestNested.java
--- openjdk-21-21.0.10+7/test/jdk/java/foreign/nested/TestNested.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/foreign/nested/TestNested.java	2026-04-17 19:09:35.000000000 +0000
@@ -27,7 +27,7 @@
  * @library ../ /test/lib
  * @requires jdk.foreign.linker != "UNSUPPORTED"
  * @requires jdk.foreign.linker != "FALLBACK"
- * @build NativeTestHelper
+ * @compile --release 21 --enable-preview ../NativeTestHelper.java
  * @run testng/othervm --enable-native-access=ALL-UNNAMED TestNested
  */
 
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/io/Console/ModuleSelectionTest.java openjdk-21-21.0.11+10/test/jdk/java/io/Console/ModuleSelectionTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/io/Console/ModuleSelectionTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/io/Console/ModuleSelectionTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -21,38 +21,88 @@
  * questions.
  */
 
-/**
+/*
  * @test
- * @bug 8295803 8299689
+ * @bug 8295803 8299689 8361613 8366261
  * @summary Tests System.console() returns correct Console (or null) from the expected
  *          module.
- * @modules java.base/java.io:+open
- * @run main/othervm ModuleSelectionTest java.base
- * @run main/othervm -Djdk.console=jdk.internal.le ModuleSelectionTest jdk.internal.le
- * @run main/othervm -Djdk.console=java.base ModuleSelectionTest java.base
- * @run main/othervm --limit-modules java.base ModuleSelectionTest java.base
+ * @library /test/lib
+ * @build jdk.test.lib.Utils
+ *        jdk.test.lib.process.ProcessTools
+ * @run junit ModuleSelectionTest
  */
 
 import java.io.Console;
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.MethodType;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.stream.Stream;
+
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.process.ProcessTools;
+import org.junit.jupiter.api.Assumptions;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import static jdk.test.lib.Utils.*;
 
 public class ModuleSelectionTest {
+    private static Stream options() {
+        return Stream.of(
+            Arguments.of("-Djdk.console=foo", "java.base"),
+            Arguments.of("-Djdk.console=java.base", "java.base"),
+            Arguments.of("-Djdk.console=jdk.internal.le", "jdk.internal.le"),
+            Arguments.of("--limit-modules java.base", "java.base")
+        );
+    }
+
+    @ParameterizedTest
+    @MethodSource("options")
+    void testNonTTY(String opts) throws Exception {
+        opts = opts +
+            " --add-opens java.base/java.io=ALL-UNNAMED ModuleSelectionTest null";
+        OutputAnalyzer output = ProcessTools.executeTestJava(opts.split(" "));
+        output.reportDiagnosticSummary();
+        output.shouldHaveExitValue(0);
+    }
+
+    @ParameterizedTest
+    @MethodSource("options")
+    void testTTY(String opts, String expected) throws Exception {
+        // check "expect" command availability
+        var expect = Paths.get("/usr/bin/expect");
+        Assumptions.assumeTrue(Files.exists(expect) && Files.isExecutable(expect),
+            "'" + expect + "' not found. Test ignored.");
+
+        opts = "expect -n " + TEST_SRC + "/moduleSelection.exp " +
+            TEST_CLASSES + " " +
+            expected + " " +
+            TEST_JDK + "/bin/java" +
+            " --add-opens java.base/java.io=ALL-UNNAMED "
+            + opts;
+        // invoking "expect" command
+        OutputAnalyzer output = ProcessTools.executeProcess(opts.split(" "));
+        output.reportDiagnosticSummary();
+        output.shouldHaveExitValue(0);
+    }
+
     public static void main(String... args) throws Throwable {
         var con = System.console();
         var pc = Class.forName("java.io.ProxyingConsole");
         var jdkc = Class.forName("jdk.internal.io.JdkConsole");
-        var istty = (boolean)MethodHandles.privateLookupIn(Console.class, MethodHandles.lookup())
-                .findStatic(Console.class, "istty", MethodType.methodType(boolean.class))
-                .invoke();
+        var lookup = MethodHandles.privateLookupIn(Console.class, MethodHandles.lookup());
+        var istty = (boolean)lookup.findStatic(Console.class, "isStdinTty", MethodType.methodType(boolean.class))
+                        .invoke() &&
+                   (boolean)lookup.findStatic(Console.class, "isStdoutTty", MethodType.methodType(boolean.class))
+                        .invoke();
+
         var impl = con != null ? MethodHandles.privateLookupIn(pc, MethodHandles.lookup())
                 .findGetter(pc, "delegate", jdkc)
                 .invoke(con) : null;
 
-        var expected = switch (args[0]) {
-            case "java.base" -> istty ? "java.base" : "null";
-            default -> args[0];
-        };
+        var expected = args[0];
         var actual = con == null ? "null" : impl.getClass().getModule().getName();
 
         if (!actual.equals(expected)) {
@@ -62,7 +112,7 @@
                 Actual: %s
                 """.formatted(expected, actual));
         } else {
-            System.out.printf("%s is the expected implementation. (tty: %s)\n", impl, istty);
+            System.out.printf("%s is the expected implementation. (tty: %s)\n", actual, istty);
         }
     }
 }
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/io/Console/moduleSelection.exp openjdk-21-21.0.11+10/test/jdk/java/io/Console/moduleSelection.exp
--- openjdk-21-21.0.10+7/test/jdk/java/io/Console/moduleSelection.exp	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/io/Console/moduleSelection.exp	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,30 @@
+#
+# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+# simply invoking java under expect command
+set classpath [lrange $argv 0 0]
+set expected [lrange $argv 1 1]
+set java [lrange $argv 2 2]
+set opts [lrange $argv 3 end]
+eval spawn $java $opts -classpath $classpath ModuleSelectionTest $expected
+expect eof
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/io/Serializable/cloneArray/CloneArray.java openjdk-21-21.0.11+10/test/jdk/java/io/Serializable/cloneArray/CloneArray.java
--- openjdk-21-21.0.10+7/test/jdk/java/io/Serializable/cloneArray/CloneArray.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/io/Serializable/cloneArray/CloneArray.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
 /* @test
  * @bug 6990094
  * @summary Verify ObjectInputStream.cloneArray works on many kinds of arrays
- * @author Stuart Marks, Joseph D. Darcy
  */
 
 import java.io.ByteArrayInputStream;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Byte/Decode.java openjdk-21-21.0.11+10/test/jdk/java/lang/Byte/Decode.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Byte/Decode.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Byte/Decode.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,8 +25,6 @@
  * @test
  * @bug 4242173 5017980 6576055
  * @summary Test Byte.decode method
- * @author madbot
- * @author Joseph D. Darcy
  */
 
 /**
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Class/IsAnnotationType.java openjdk-21-21.0.11+10/test/jdk/java/lang/Class/IsAnnotationType.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Class/IsAnnotationType.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Class/IsAnnotationType.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4891872 4988155
  * @summary Check isAnnotation() method
- * @author Joseph D. Darcy
  */
 
 import java.lang.annotation.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Class/IsEnum.java openjdk-21-21.0.11+10/test/jdk/java/lang/Class/IsEnum.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Class/IsEnum.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Class/IsEnum.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4891872 4989735 4990789 5020490
  * @summary Check isEnum() method
- * @author Joseph D. Darcy
  */
 
 import java.lang.annotation.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Class/IsSynthetic.java openjdk-21-21.0.11+10/test/jdk/java/lang/Class/IsSynthetic.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Class/IsSynthetic.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Class/IsSynthetic.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 5012133
  * @summary Check Class.isSynthetic method
- * @author Joseph D. Darcy
  */
 
 import java.lang.reflect.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Class/getEnclosingConstructor/EnclosingConstructorTests.java openjdk-21-21.0.11+10/test/jdk/java/lang/Class/getEnclosingConstructor/EnclosingConstructorTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Class/getEnclosingConstructor/EnclosingConstructorTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Class/getEnclosingConstructor/EnclosingConstructorTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4962341 6832557
  * @summary Check getEnclosingMethod method
- * @author Joseph D. Darcy
  */
 
 import java.lang.reflect.Constructor;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Class/getEnclosingMethod/EnclosingMethodTests.java openjdk-21-21.0.11+10/test/jdk/java/lang/Class/getEnclosingMethod/EnclosingMethodTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Class/getEnclosingMethod/EnclosingMethodTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Class/getEnclosingMethod/EnclosingMethodTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4962341
  * @summary Check getEnclosingMethod method
- * @author Joseph D. Darcy
  */
 
 import java.lang.reflect.Method;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Double/BitwiseConversion.java openjdk-21-21.0.11+10/test/jdk/java/lang/Double/BitwiseConversion.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Double/BitwiseConversion.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Double/BitwiseConversion.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,7 +28,6 @@
  * @library ../Math
  * @build DoubleConsts
  * @run main BitwiseConversion
- * @author Joseph D. Darcy
  */
 
 import static java.lang.Double.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Double/Constants.java openjdk-21-21.0.11+10/test/jdk/java/lang/Double/Constants.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Double/Constants.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Double/Constants.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,7 +26,6 @@
  * @compile Constants.java
  * @bug 4397405 4826652
  * @summary Testing constant-ness of Double.{MIN_VALUE, MAX_VALUE}, etc.
- * @author Joseph D. Darcy
  */
 
 public class Constants {
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Double/Extrema.java openjdk-21-21.0.11+10/test/jdk/java/lang/Double/Extrema.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Double/Extrema.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Double/Extrema.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4408489 4826652
  * @summary Testing values of Double.{MIN_VALUE, MIN_NORMAL, MAX_VALUE}
- * @author Joseph D. Darcy
  */
 
 public class Extrema {
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Double/NaNInfinityParsing.java openjdk-21-21.0.11+10/test/jdk/java/lang/Double/NaNInfinityParsing.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Double/NaNInfinityParsing.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Double/NaNInfinityParsing.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4428772
  * @summary Testing recognition of "NaN" and "Infinity" strings
- * @author Joseph D. Darcy
  */
 
 
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Double/ParseHexFloatingPoint.java openjdk-21-21.0.11+10/test/jdk/java/lang/Double/ParseHexFloatingPoint.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Double/ParseHexFloatingPoint.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Double/ParseHexFloatingPoint.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,7 +28,6 @@
  * @run main ParseHexFloatingPoint
  * @bug 4826774 8078672
  * @summary Numerical tests for hexadecimal inputs to parse{Double, Float} (use -Dseed=X to set PRNG seed)
- * @author Joseph D. Darcy
  * @key randomness
  */
 
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Double/ToHexString.java openjdk-21-21.0.11+10/test/jdk/java/lang/Double/ToHexString.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Double/ToHexString.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Double/ToHexString.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,7 +28,6 @@
  * @library ../Math
  * @build DoubleConsts
  * @run main ToHexString
- * @author Joseph D. Darcy
  */
 
 import java.util.regex.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Float/BitwiseConversion.java openjdk-21-21.0.11+10/test/jdk/java/lang/Float/BitwiseConversion.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Float/BitwiseConversion.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Float/BitwiseConversion.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,7 +28,6 @@
  * @library ../Math
  * @build FloatConsts
  * @run main BitwiseConversion
- * @author Joseph D. Darcy
  */
 
 import static java.lang.Float.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Float/Constants.java openjdk-21-21.0.11+10/test/jdk/java/lang/Float/Constants.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Float/Constants.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Float/Constants.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,7 +26,6 @@
  * @compile Constants.java
  * @bug 4397405 4826652
  * @summary Testing constant-ness of Float.{MIN_VALUE, MAX_VALUE}, etc.
- * @author Joseph D. Darcy
  */
 
 public class Constants {
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Float/Extrema.java openjdk-21-21.0.11+10/test/jdk/java/lang/Float/Extrema.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Float/Extrema.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Float/Extrema.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4408489 4826652
  * @summary Testing values of Float.{MIN_VALUE, MIN_NORMAL, MAX_VALUE}
- * @author Joseph D. Darcy
  */
 
 public class Extrema {
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Float/NaNInfinityParsing.java openjdk-21-21.0.11+10/test/jdk/java/lang/Float/NaNInfinityParsing.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Float/NaNInfinityParsing.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Float/NaNInfinityParsing.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4428772
  * @summary Testing recognition of "NaN" and "Infinity" strings
- * @author Joseph D. Darcy
  */
 
 
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Integer/Decode.java openjdk-21-21.0.11+10/test/jdk/java/lang/Integer/Decode.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Integer/Decode.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Integer/Decode.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,8 +25,6 @@
  * @test
  * @bug 4136371 5017980 6576055
  * @summary Test Integer.decode method
- * @author madbot
- * @author Joseph D. Darcy
  */
 
 /**
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Integer/ParsingTest.java openjdk-21-21.0.11+10/test/jdk/java/lang/Integer/ParsingTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Integer/ParsingTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Integer/ParsingTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 5017980 6576055 8041972 8055251
  * @summary Test parsing methods
- * @author Joseph D. Darcy
  */
 
 import java.lang.IndexOutOfBoundsException;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Integer/Unsigned.java openjdk-21-21.0.11+10/test/jdk/java/lang/Integer/Unsigned.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Integer/Unsigned.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Integer/Unsigned.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4504839 4215269 6322074
  * @summary Basic tests for unsigned operations.
- * @author Joseph D. Darcy
  */
 public class Unsigned {
     public static void main(String... args) {
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Long/Decode.java openjdk-21-21.0.11+10/test/jdk/java/lang/Long/Decode.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Long/Decode.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Long/Decode.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,8 +25,6 @@
  * @test
  * @bug 4136371 5017980 6576055
  * @summary Test Long.decode method
- * @author madbot
- * @author Joseph D. Darcy
  */
 
 import java.math.BigInteger;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Long/ParsingTest.java openjdk-21-21.0.11+10/test/jdk/java/lang/Long/ParsingTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Long/ParsingTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Long/ParsingTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 5017980 6576055 8041972 8055251
  * @summary Test parsing methods
- * @author Joseph D. Darcy
  */
 
 /**
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Long/Unsigned.java openjdk-21-21.0.11+10/test/jdk/java/lang/Long/Unsigned.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Long/Unsigned.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Long/Unsigned.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4504839 4215269 6322074 8030814
  * @summary Basic tests for unsigned operations
- * @author Joseph D. Darcy
  */
 
 import java.math.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/ProcessBuilder/Basic.java openjdk-21-21.0.11+10/test/jdk/java/lang/ProcessBuilder/Basic.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/ProcessBuilder/Basic.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/ProcessBuilder/Basic.java	2026-04-17 19:09:35.000000000 +0000
@@ -88,8 +88,8 @@
     static final String libpath = System.getenv("LIBPATH");
 
     /* Used for regex String matching for long error messages */
-    static final String PERMISSION_DENIED_ERROR_MSG = "(Permission denied|error=13)";
-    static final String NO_SUCH_FILE_ERROR_MSG = "(No such file|error=2)";
+    static final String PERMISSION_DENIED_ERROR_MSG = "(Permission denied|error:13)";
+    static final String NO_SUCH_FILE_ERROR_MSG = "(No such file|error:2)";
     static final String SPAWNHELPER_FAILURE_MSG = "(Possible reasons:)";
 
     /**
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/ProcessBuilder/SiblingIOEHandle.java openjdk-21-21.0.11+10/test/jdk/java/lang/ProcessBuilder/SiblingIOEHandle.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/ProcessBuilder/SiblingIOEHandle.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/ProcessBuilder/SiblingIOEHandle.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
  * @bug 6921885
  * @run main/othervm SiblingIOEHandle
  * @summary inherit IOE handles and MS CreateProcess limitations (kb315939)
+ * @requires (os.family == "windows")
  */
 
 import java.io.BufferedReader;
@@ -58,10 +59,6 @@
     }
 
     public static void main(String[] args) {
-        if (!System.getProperty("os.name").startsWith("Windows")) {
-            return;
-        }
-
         APP app = (args.length > 0) ? APP.valueOf(args[0]) : APP.A;
         switch (app) {
             case A:
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/ProcessHandle/TEST.properties openjdk-21-21.0.11+10/test/jdk/java/lang/ProcessHandle/TEST.properties
--- openjdk-21-21.0.10+7/test/jdk/java/lang/ProcessHandle/TEST.properties	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/ProcessHandle/TEST.properties	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1 @@
+maxOutputSize=6000000
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/RuntimeTests/exec/Space.java openjdk-21-21.0.11+10/test/jdk/java/lang/RuntimeTests/exec/Space.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/RuntimeTests/exec/Space.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/RuntimeTests/exec/Space.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,13 +24,13 @@
 /* @test 1.4 00/10/18
    @bug 4231349
    @summary test runtime.exec on windows for extra space in cmd
+   @requires (os.family == "windows")
  */
 import java.io.*;
 
 public class Space {
     public static void main(String[] args) throws Exception {
-        if (File.separatorChar == '\\') {
-            try {
+        try {
             Process p = Runtime.getRuntime().exec( "cmd /c echo hello" );
             BufferedReader reader = new BufferedReader(
                                     new InputStreamReader(p.getInputStream()));
@@ -38,10 +38,9 @@
             String echo = reader.readLine();
             if (echo.length() == 6)
                 throw new RuntimeException("Extra space in command.");
-            } catch (IOException e) {
-            // not Win NT - cmd doesnt exist
+        } catch (IOException e) {
+            // not Win NT - cmd doesn't exist
             return;
-            }
         }
     }
 }
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/RuntimeTests/exec/Status.java openjdk-21-21.0.11+10/test/jdk/java/lang/RuntimeTests/exec/Status.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/RuntimeTests/exec/Status.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/RuntimeTests/exec/Status.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
  * @bug 4763362
  * @summary Ensure that Process.waitFor returns the correct status code
  *          even for very short-running subprocesses
+ * @requires (os.family == "linux")
  */
 
 
@@ -35,10 +36,6 @@
     public static void main(String args[])
         throws Exception
     {
-        if (!System.getProperty("os.name").equals("Linux")) {
-            System.out.println("Only for Linux");
-            return;
-        }
         UnixCommands.ensureCommandsAvailable("false");
 
         final String falseCmd = UnixCommands.findCommand("false");
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Short/Decode.java openjdk-21-21.0.11+10/test/jdk/java/lang/Short/Decode.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Short/Decode.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Short/Decode.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,8 +25,6 @@
  * @test
  * @bug 4136371 5017980 6576055
  * @summary Test Short.decode method
- * @author madbot
- * @author Joseph D. Darcy
  */
 
 /**
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/StringBuilder/RacingSBThreads.java openjdk-21-21.0.11+10/test/jdk/java/lang/StringBuilder/RacingSBThreads.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/StringBuilder/RacingSBThreads.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/StringBuilder/RacingSBThreads.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,303 @@
+/*
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @summary Test multi-threaded use of StringBuilder
+ * @compile --release 8 RacingSBThreads.java
+ * @run main/othervm -esa RacingSBThreads read
+ * @run main/othervm -esa RacingSBThreads insert
+ * @run main/othervm -esa RacingSBThreads append
+ * @run main/othervm -Xcomp RacingSBThreads
+ */
+
+import java.nio.CharBuffer;
+import java.time.Duration;
+import java.time.Instant;
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.BiConsumer;
+
+/**
+ * Test racing accesses in StringBuilder.
+ * Test source code should be compatible with JDK 8 to allow testing on older versions.
+ */
+public class RacingSBThreads {
+
+    private static final int TIMEOUT_SEC = 1;   // Duration to run each test case
+    private static final int N = 1_000_000;     // static number of iterations for writes and modifies
+    private static final int LEN = 100_000;     // Length of initial SB
+
+    // Strings available to be used as the initial contents of a StringBuilder
+    private static final String UTF16_CHARS = initString('\u1000', LEN);
+    private static final String LATIN1_CHARS = initString('a', LEN);
+
+    // Cache jtreg timeout factor to allow test to be run as a standalone main()
+    private static final double TIMEOUT_FACTOR = Double.parseDouble(System.getProperty("test.timeout.factor", "1.0"));
+
+    // Constant arguments available to be passed to StringBuilder operations
+    private static final StringBuilder otherSB = new StringBuilder("ab\uFF21\uFF22");
+    private static final StringBuilder otherLongerSB = new StringBuilder("abcde\uFF21\uFF22\uFF23\uFF24\uFF25");
+
+    // Create a String with a repeated character
+    private static String initString(char c, int len) {
+        char[] chars = new char[len];
+        Arrays.fill(chars, c);
+        return new String(chars);
+    }
+
+    // Plain unsynchronized reference to a StringBuilder
+    // Updated by the writer thread
+    // Read by the reader thread
+    private StringBuilder buf;
+
+    // The current stress test case
+    private final StressKind stressKind;
+
+    // Count of faults, zero if no faults found
+    private final AtomicInteger faultCount = new AtomicInteger(0);
+
+    /**
+     * Run the stress cases indicated by command line arguments or run all cases.
+     * Running each for TIMEOUT_SEC seconds or until a failure.
+     * The timeout/test duration can be scaled by setting System property
+     * `test.timeout.factor` to a double value, for example, `-Dtest.timeout.factor=2.0`
+     * @param args command line arguments
+     */
+    public static void main(String[] args) {
+        Duration duration = Duration.ofSeconds((long)(TIMEOUT_SEC * TIMEOUT_FACTOR));
+
+        StressKind[] kinds = StressKind.values();
+        if (args.length > 0) {
+            // Parse explicitly supplied StressKind arguments
+            try {
+                 kinds = Arrays.stream(args)
+                         .map((s) -> StressKind.valueOf(s.toUpperCase(Locale.ROOT)))
+                         .toArray(StressKind[]::new);
+            } catch (Exception ex) {
+                System.out.println("Invalid StressKind arguments: " + Arrays.toString(args));
+                return;
+            }
+        }
+
+        // Run each kind for the duration
+        int totalFaults = 0;
+        for (StressKind sk : kinds) {
+            Instant end = Instant.now().plus(duration); // note clock time, not runtime
+            while (Instant.now().isBefore(end)) {
+                int faultCount = new RacingSBThreads(sk).stress();
+                if (faultCount > 0) {
+                    System.out.printf("ERROR: Test case %s, %d faults%n", sk, faultCount);
+                }
+                totalFaults += faultCount;
+            }
+        }
+        if (totalFaults > 0) {
+            throw new AssertionError("Total faults: " + totalFaults);
+        }
+    }
+
+    // Enum of the various test cases with a lambda to invoke for each
+    enum StressKind {
+        /**
+         * Reading characters should always be one of the known values being written to the destination
+         */
+        READ(LATIN1_CHARS, (sb,  chr) -> {
+            char ch = sb.charAt(LEN * 4 / 5);
+            if (ch != chr & ch != (chr & 0xff) & ch != chr >> 8) {
+                throw new AssertionError("Unexpected characters in buffer: 0x" + Integer.toHexString(ch));
+            }
+        }),
+        /**
+         * Insert another StringBuilder; in the face of racy changes to the destination
+         */
+        INSERT(LATIN1_CHARS, (sb, C) -> {
+            sb.insert(sb.length() - 1, otherLongerSB, 0, otherLongerSB.length());
+        }),
+        /**
+         * Appending a StringBuilder in the face of racy changes to the destination
+         */
+        APPEND(LATIN1_CHARS, (sb, C) -> {
+            sb.append(otherSB, 0, otherSB.length());
+        }),
+        ;
+
+        private final BiConsumer func;
+        private final String sbInitString;
+
+        /**
+         * Defines a test case.
+         * @param sbInitString the initial contents of the StringBuilder; chooses the coder
+         * @param func the test BiConsumer to apply to the StringBuilder
+         */
+        private StressKind(String sbInitString, BiConsumer func) {
+            this.func = func;
+            this.sbInitString = sbInitString;
+        }
+    }
+
+    public RacingSBThreads(StressKind stressKind) {
+        this.stressKind = stressKind;
+    }
+
+    /**
+     * Run the stress case.
+     * One thread continuously creates a StringBuilder and fills it before trimming it to zero.
+     * The other thread performs the test case on the same StringBuilder (without any synchronization)
+     * @return the count of faults
+     */
+    private int stress() {
+        PokeBuilder r = new PokeBuilder(this, N);
+        Writer w = new Writer(this, N);
+
+        Thread writer = new Thread(w::createShrink);
+        Thread reader = new Thread(r::readModify);
+        writer.start();
+        reader.start();
+        join(reader);
+        System.out.println(r);
+        writer.interrupt();
+        join(writer);
+        System.out.println(w);
+        return r.racing.faultCount.get();
+    }
+
+    /**
+     * Wait for a thread to terminate.
+     * @param thread a thread to wait for
+     */
+    private void join(Thread thread) {
+        do {
+            try {
+                thread.join();
+                break;
+            } catch (InterruptedException ie) {
+                // ignore and retry
+            }
+        } while (true);
+    }
+
+    /**
+     * Run a StressKind case in a loop keeping track of exceptions.
+     * The StringBuilder under test is shared with the writer task without benefit of synchronization.
+     */
+    private static class PokeBuilder {
+        private final RacingSBThreads racing;
+        private final int iterations;
+        private int nulls;
+        private int bounds;
+        private int pokeCycles;
+        private int bufChanges;
+
+        public PokeBuilder(RacingSBThreads racing, int iterations) {
+            this.racing = racing;
+            this.iterations = iterations;
+            nulls = 0;
+            bounds = 0;
+            pokeCycles = 0;
+            bufChanges = 0;
+        }
+
+        // Repeatedly change the racy StringBuilder, ignoring and counting exceptions
+        private void readModify() {
+            System.out.println("Starting " + racing.stressKind);
+            sleep(100);
+            for (int i = 0; i < iterations; ++i) {
+                pokeCycles++;
+                StringBuilder sb = racing.buf;  // read once
+                try {
+                    if (sb.length() > Integer.MAX_VALUE / 4) {
+                        sb.setLength(Integer.MAX_VALUE / 4);
+                    }
+                    // Invoke the test case
+                    racing.stressKind.func.accept(sb, racing.stressKind.sbInitString.charAt(0));
+                    if (sb != racing.buf) {
+                        bufChanges++;
+                    }
+                } catch (NullPointerException e) {
+                    ++nulls;
+                } catch (IndexOutOfBoundsException e) {
+                    ++bounds;
+                } catch (AssertionError ae) {
+                    racing.faultCount.incrementAndGet();
+                    throw ae;
+                }
+            }
+        }
+
+        private static void sleep(int i) {
+            try {
+                Thread.sleep(i);
+            } catch (InterruptedException ignored) {
+            }
+        }
+
+        public String toString() {
+            return String.format("pokeCycles:%d, bounds:%d, bufChanges:%d, nulls=%d",
+                    pokeCycles, bounds, bufChanges, nulls);
+        }
+    }
+
+    /**
+     * Repeatedly create and append strings to a StringBuilder shared through fields of RacingSBThreads.
+     * The StringBuilder is created new on each iteration and truncated at the end of each iteration.
+     * Exceptions are counted and reported.
+     */
+    private static class Writer {
+        private final RacingSBThreads racing;
+        private final int iterations;
+        private int sumWriter;
+        private int writeCycles;
+        private int putBounds;
+
+        public Writer(RacingSBThreads racing, int iterations) {
+            this.racing = racing;
+            this.iterations = iterations;
+        }
+
+        private void createShrink() {
+            for (int i = 0; i < iterations; ++i) {
+                if (i % 100_000 == 0) {
+                    if (Thread.interrupted()) {
+                        break;
+                    }
+                }
+                try {
+                    ++writeCycles;
+                    racing.buf = new StringBuilder(racing.stressKind.sbInitString);
+                    racing.buf.append(UTF16_CHARS);
+                    sumWriter += racing.buf.length();
+                    racing.buf.setLength(0);
+                    racing.buf.trimToSize();
+                } catch (Exception ex) {
+                    ++putBounds;
+                }
+            }
+        }
+
+        public String toString() {
+            return String.format("writeCycles:%d, bounds:%d, sumWriter=%d", writeCycles, putBounds, sumWriter);
+        }
+    }
+}
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/System/NonAnsiFileEncodingTest.java openjdk-21-21.0.11+10/test/jdk/java/lang/System/NonAnsiFileEncodingTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/System/NonAnsiFileEncodingTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/System/NonAnsiFileEncodingTest.java	1970-01-01 00:00:00.000000000 +0000
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * @bug 4459099
- * @key i18n
- * @summary Tests non ANSI code page locales set default file encoding
- * to "utf-8".  This test must be run on Windows 2K/XP in one of Armenian,
- * Georgian, Hindi, Punjabi, Gujarati, Tamil, Telugu, Kannada, Marathi,
- * or Sanskrit languages.
- */
-
-public class NonAnsiFileEncodingTest {
-    public static void main(String[] s)  {
-        String OS = System.getProperty("os.name");
-        String lang = System.getProperty("user.language");
-        String fileenc = System.getProperty("file.encoding");
-
-        if (!(OS.equals("Windows 2000") || OS.equals("Windows XP"))) {
-            System.out.println("This test is not meaningful on the platform \"" + OS + "\".");
-            return;
-        }
-
-        if (!(lang.equals("hy") ||      // Armenian
-              lang.equals("ka") ||      // Georgian
-              lang.equals("hi") ||      // Hindi
-              lang.equals("pa") ||      // Punjabi
-              lang.equals("gu") ||      // Gujarati
-              lang.equals("ta") ||      // Tamil
-              lang.equals("te") ||      // Telugu
-              lang.equals("kn") ||      // Kannada
-              lang.equals("mr") ||      // Marathi
-              lang.equals("sa"))) {     // Sanskrit
-            System.out.println("Windows' locale settings for this test is incorrect.  Select one of \"Armenian\", \"Georgian\", \"Hindi\", \"Punjabi\", \"Gujarati\", \"Tamil\", \"Telugu\", \"Kannada\", \"Marathi\", or \"Sanskrit\" for the user locale, and \"English(United States)\" for the system default locale using the Control Panel.");
-            return;
-        }
-
-        if (!fileenc.equals("utf-8")) {
-            throw new RuntimeException("file.encoding is incorrectly set to \"" + fileenc + "\".  Should be \"utf-8\".");
-        }
-    }
-}
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/Throwable/SuppressedExceptions.java openjdk-21-21.0.11+10/test/jdk/java/lang/Throwable/SuppressedExceptions.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/Throwable/SuppressedExceptions.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/Throwable/SuppressedExceptions.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,7 +28,6 @@
  * @test
  * @bug     6911258 6962571 6963622 6991528 7005628 8012044
  * @summary Basic tests of suppressed exceptions
- * @author  Joseph D. Darcy
  */
 
 public class SuppressedExceptions {
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/annotation/Missing/MissingTest.java openjdk-21-21.0.11+10/test/jdk/java/lang/annotation/Missing/MissingTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/annotation/Missing/MissingTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/annotation/Missing/MissingTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 6322301 5041778
  * @summary Verify when missing annotation classes cause exceptions
- * @author Joseph D. Darcy
  * @compile MissingTest.java A.java B.java C.java D.java Marker.java Missing.java MissingWrapper.java MissingDefault.java
  * @clean Missing
  * @run main MissingTest
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/annotation/TestIncompleteAnnotationExceptionNPE.java openjdk-21-21.0.11+10/test/jdk/java/lang/annotation/TestIncompleteAnnotationExceptionNPE.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/annotation/TestIncompleteAnnotationExceptionNPE.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/annotation/TestIncompleteAnnotationExceptionNPE.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug     7021922
  * @summary Test null handling of IncompleteAnnotationException constructor
- * @author  Joseph D. Darcy
  */
 
 import java.lang.annotation.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/AnnotatedElement/TestAnnotatedElementDefaults.java openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/AnnotatedElement/TestAnnotatedElementDefaults.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/AnnotatedElement/TestAnnotatedElementDefaults.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/AnnotatedElement/TestAnnotatedElementDefaults.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 8005294
  * @summary Check behavior of default methods of AnnotatedElement
- * @author Joseph D. Darcy
  */
 
 import java.lang.annotation.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Constructor/GenericStringTest.java openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Constructor/GenericStringTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Constructor/GenericStringTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Constructor/GenericStringTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 5033583 6316717 6470106 8161500 8162539 6304578
  * @summary Check toGenericString() and toString() methods
- * @author Joseph D. Darcy
  */
 
 import java.lang.reflect.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Constructor/TestParameterAnnotations.java openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Constructor/TestParameterAnnotations.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Constructor/TestParameterAnnotations.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Constructor/TestParameterAnnotations.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 6332964
  * @summary Verify getParameterAnnotations doesn't throw spurious errors
- * @author Joseph D. Darcy
  */
 
 import java.lang.reflect.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/DefaultAccessibility.java openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/DefaultAccessibility.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/DefaultAccessibility.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/DefaultAccessibility.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 6648344
  * @summary Test that default accessibility is false
- * @author Joseph D. Darcy
  */
 
 import java.lang.reflect.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Field/GenericStringTest.java openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Field/GenericStringTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Field/GenericStringTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Field/GenericStringTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 5033583 8161500
  * @summary Check toGenericString() method
- * @author Joseph D. Darcy
  */
 
 import java.lang.reflect.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Generics/HashCodeTest.java openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Generics/HashCodeTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Generics/HashCodeTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Generics/HashCodeTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 5097856
  * @summary Computing hashCode of objects modeling generics shouldn't blow stack
- * @author Joseph D. Darcy
  */
 
 import java.util.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Generics/Probe.java openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Generics/Probe.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Generics/Probe.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Generics/Probe.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 5003916 6704655 6873951 6476261 8004928
  * @summary Testing parsing of signatures attributes of nested classes
- * @author Joseph D. Darcy
  */
 
 import java.lang.reflect.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Generics/StringsAndBounds.java openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Generics/StringsAndBounds.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Generics/StringsAndBounds.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Generics/StringsAndBounds.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 5015676 4987888 4997464
  * @summary Testing upper bounds and availability of toString methods
- * @author Joseph D. Darcy
  */
 
 import java.lang.reflect.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Generics/TestParameterizedType.java openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Generics/TestParameterizedType.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Generics/TestParameterizedType.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Generics/TestParameterizedType.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 5061485
  * @summary Test sematics of ParameterizedType.equals
- * @author Joseph D. Darcy
  */
 
 import java.util.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Generics/exceptionCauseTest.java openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Generics/exceptionCauseTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Generics/exceptionCauseTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Generics/exceptionCauseTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4981727
  * @summary
- * @author Joseph D. Darcy
  */
 
 import java.io.PrintStream;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Generics/getAnnotationTest.java openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Generics/getAnnotationTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Generics/getAnnotationTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Generics/getAnnotationTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4979440
  * @summary Test for signature parsing corner case
- * @author Joseph D. Darcy
  */
 
 import java.lang.reflect.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Method/GenericStringTest.java openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Method/GenericStringTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Method/GenericStringTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Method/GenericStringTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 5033583 6316717 6470106 8004979 8161500 8162539 6304578
  * @summary Check toGenericString() and toString() methods
- * @author Joseph D. Darcy
  */
 
 import java.lang.reflect.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Method/IsDefaultTest.java openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Method/IsDefaultTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Method/IsDefaultTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Method/IsDefaultTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 8005042
  * @summary Check behavior of Method.isDefault
- * @author Joseph D. Darcy
  */
 
 import java.lang.reflect.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Method/defaultMethodModeling/DefaultMethodModeling.java openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Method/defaultMethodModeling/DefaultMethodModeling.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/Method/defaultMethodModeling/DefaultMethodModeling.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/Method/defaultMethodModeling/DefaultMethodModeling.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 8011590
  * @summary Check modeling of default methods
- * @author Joseph D. Darcy
  */
 
 import java.util.Objects;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/TypeVariable/TestAnnotatedElement.java openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/TypeVariable/TestAnnotatedElement.java
--- openjdk-21-21.0.10+7/test/jdk/java/lang/reflect/TypeVariable/TestAnnotatedElement.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/lang/reflect/TypeVariable/TestAnnotatedElement.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 7086192
  * @summary Verify functionality of AnnotatedElement methods on type variables
- * @author Joseph D. Darcy
  */
 
 import java.lang.reflect.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/AddTests.java openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/AddTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/AddTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/AddTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 6362557 8200698
  * @summary Some tests of add(BigDecimal, mc)
- * @author Joseph D. Darcy
  */
 
 import java.math.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/CompareToTests.java openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/CompareToTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/CompareToTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/CompareToTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 6473768
  * @summary Tests of BigDecimal.compareTo
- * @author Joseph D. Darcy
  */
 import java.math.*;
 import static java.math.BigDecimal.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/DivideTests.java openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/DivideTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/DivideTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/DivideTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4851776 4907265 6177836 6876282 8066842
  * @summary Some tests for the divide methods.
- * @author Joseph D. Darcy
  */
 
 import java.math.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/IntegralDivisionTests.java openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/IntegralDivisionTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/IntegralDivisionTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/IntegralDivisionTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,7 +24,6 @@
  * @test
  * @bug 4904082 4917089 6337226 6378503
  * @summary Tests that integral division and related methods return the proper result and scale.
- * @author Joseph D. Darcy
  */
 import java.math.*;
 public class IntegralDivisionTests {
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/NegateTests.java openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/NegateTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/NegateTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/NegateTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 6325535
  * @summary Test for the rounding behavior of negate(MathContext)
- * @author Joseph D. Darcy
  */
 
 import java.math.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/PowTests.java openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/PowTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/PowTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/PowTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4916097
  * @summary Some exponent over/undeflow tests for the pow method
- * @author Joseph D. Darcy
  */
 
 import java.math.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/PrecisionTests.java openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/PrecisionTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/PrecisionTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/PrecisionTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 1234567
  * @summary Test that precision() is computed properly.
- * @author Joseph D. Darcy
  */
 
 import java.math.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/RoundingTests.java openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/RoundingTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/RoundingTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/RoundingTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 6334849
  * @summary Tests of dropping digits near the scale threshold
- * @author Joseph D. Darcy
  */
 import java.math.*;
 public class RoundingTests {
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/ScaleByPowerOfTenTests.java openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/ScaleByPowerOfTenTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/ScaleByPowerOfTenTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/ScaleByPowerOfTenTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4899722
  * @summary Basic tests of scaleByPowerOfTen
- * @author Joseph D. Darcy
  */
 
 import java.math.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/StrippingZerosTest.java openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/StrippingZerosTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/StrippingZerosTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/StrippingZerosTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,6 @@
  * @summary A few tests of stripTrailingZeros
  * @run main StrippingZerosTest
  * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+EliminateAutoBox -XX:AutoBoxCacheMax=20000 StrippingZerosTest
- * @author Joseph D. Darcy
  */
 
 import java.math.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/ToPlainStringTests.java openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/ToPlainStringTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/ToPlainStringTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/ToPlainStringTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,6 @@
  * @summary Basic tests of toPlainString method
  * @run main ToPlainStringTests
  * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+EliminateAutoBox -XX:AutoBoxCacheMax=20000 ToPlainStringTests
- * @author Joseph D. Darcy
  */
 
 import java.math.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/ZeroScalingTests.java openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/ZeroScalingTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigDecimal/ZeroScalingTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigDecimal/ZeroScalingTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,6 @@
  * @summary Tests that the scale of zero is propagated properly and has the
  * proper effect and that setting the scale to zero does not mutate the
  * BigDecimal.
- * @author Joseph D. Darcy
  */
 
 import java.math.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigInteger/CompareToTests.java openjdk-21-21.0.11+10/test/jdk/java/math/BigInteger/CompareToTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigInteger/CompareToTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigInteger/CompareToTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 6473768
  * @summary Tests of BigInteger.compareTo
- * @author Joseph D. Darcy
  */
 import java.math.*;
 import static java.math.BigInteger.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigInteger/ExtremeShiftingTests.java openjdk-21-21.0.11+10/test/jdk/java/math/BigInteger/ExtremeShiftingTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigInteger/ExtremeShiftingTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigInteger/ExtremeShiftingTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,6 @@
  * @summary Tests of shiftLeft and shiftRight on Integer.MIN_VALUE
  * @requires os.maxMemory >= 1g
  * @run main/othervm -Xmx512m ExtremeShiftingTests
- * @author Joseph D. Darcy
  */
 import java.math.BigInteger;
 import static java.math.BigInteger.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigInteger/OperatorNpeTests.java openjdk-21-21.0.11+10/test/jdk/java/math/BigInteger/OperatorNpeTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigInteger/OperatorNpeTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigInteger/OperatorNpeTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 6365176
  * @summary Get NullPointerExceptions when expected
- * @author Joseph D. Darcy
  */
 
 import java.math.*;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigInteger/StringConstructor.java openjdk-21-21.0.11+10/test/jdk/java/math/BigInteger/StringConstructor.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigInteger/StringConstructor.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigInteger/StringConstructor.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4489146 5017980
  * @summary tests String constructors of BigInteger
- * @author Joseph D. Darcy
  */
 import java.math.*;
 
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/BigInteger/TestValueExact.java openjdk-21-21.0.11+10/test/jdk/java/math/BigInteger/TestValueExact.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/BigInteger/TestValueExact.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/BigInteger/TestValueExact.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 6371401
  * @summary Tests of fooValueExact methods
- * @author Joseph D. Darcy
  */
 import java.math.BigInteger;
 
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/math/RoundingMode/RoundingModeTests.java openjdk-21-21.0.11+10/test/jdk/java/math/RoundingMode/RoundingModeTests.java
--- openjdk-21-21.0.10+7/test/jdk/java/math/RoundingMode/RoundingModeTests.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/math/RoundingMode/RoundingModeTests.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
  * @test
  * @bug 4851776 4891522 4905335
  * @summary Basic tests for the RoundingMode class.
- * @author Joseph D. Darcy
  */
 
 import java.math.RoundingMode;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/Buffer/LimitDirectMemory.java openjdk-21-21.0.11+10/test/jdk/java/nio/Buffer/LimitDirectMemory.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/Buffer/LimitDirectMemory.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/Buffer/LimitDirectMemory.java	2026-04-17 19:09:35.000000000 +0000
@@ -25,7 +25,7 @@
  * @test
  * @bug 4627316 6743526
  * @summary Test option to limit direct memory allocation
- * @requires (os.arch == "x86_64") | (os.arch == "amd64")
+ * @requires (os.arch == "x86_64") | (os.arch == "amd64") | (os.arch == "aarch64")
  * @library /test/lib
  *
  * @summary Test: memory is properly limited using multiple buffers
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/channels/Selector/HelperSlowToDie.java openjdk-21-21.0.11+10/test/jdk/java/nio/channels/Selector/HelperSlowToDie.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/channels/Selector/HelperSlowToDie.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/channels/Selector/HelperSlowToDie.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
  * @bug 6823609
  * @summary Selector.select can hangs on Windows for cases where a helper thread
  *   becomes redudant but a new helper is immediately needed.
+ * @requires (os.family == "windows")
  */
 
 import java.nio.channels.*;
@@ -37,11 +38,6 @@
     private static volatile boolean done;
 
     public static void main(String[] args) throws IOException {
-        if (!System.getProperty("os.name").startsWith("Windows")) {
-            System.out.println("Test skipped as it verifies a Windows specific bug");
-            return;
-        }
-
         Selector sel = Selector.open();
 
         // register channels
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/channels/SocketChannel/AsyncCloseChannel.java openjdk-21-21.0.11+10/test/jdk/java/nio/channels/SocketChannel/AsyncCloseChannel.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/channels/SocketChannel/AsyncCloseChannel.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/channels/SocketChannel/AsyncCloseChannel.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,6 +24,7 @@
 /* @test
  * @bug 6285901 6501089
  * @summary Check no data is written to wrong socket channel during async closing.
+ * @requires (os.family != "windows")
  */
 
 import java.io.IOException;
@@ -44,10 +45,6 @@
     static int targetPort;
 
     public static void main(String args[]) throws Exception {
-        if (System.getProperty("os.name").startsWith("Windows")) {
-            System.err.println("WARNING: Still does not work on Windows!");
-            return;
-        }
         Thread ss = new SensorServer(); ss.start();
         Thread ts = new TargetServer(); ts.start();
 
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/channels/SocketChannel/SocketInheritance.java openjdk-21-21.0.11+10/test/jdk/java/nio/channels/SocketChannel/SocketInheritance.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/channels/SocketChannel/SocketInheritance.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/channels/SocketChannel/SocketInheritance.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,6 +24,7 @@
 /*
  * @test
  * @summary Sockets shouldn't be inherited when creating a child process
+ * @requires (os.family == "windows")
  */
 import java.nio.ByteBuffer;
 import java.nio.channels.*;
@@ -138,9 +139,6 @@
     }
 
     public static void main(String[] args) throws Exception {
-        if (!System.getProperty("os.name").startsWith("Windows"))
-            return;
-
         if (args.length == 0) {
             start();
         } else {
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java openjdk-21-21.0.11+10/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -65,11 +65,6 @@
     private static final Path POLICY_PASS = Paths.get(TEST_SRC, "java.policy.pass");
     private static final Path POLICY_FAIL = Paths.get(TEST_SRC, "java.policy.fail");
 
-    private static final String OS_NAME = System.getProperty("os.name").toLowerCase();
-
-    private static final String ARCH = System.getProperty("os.arch");
-    private static final String OS_ARCH = ARCH.equals("i386") ? "i586" : ARCH;
-
     private static final Path libraryPath
             = Paths.get(System.getProperty("java.library.path"));
 
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/channels/vthread/BlockingChannelOps.java openjdk-21-21.0.11+10/test/jdk/java/nio/channels/vthread/BlockingChannelOps.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/channels/vthread/BlockingChannelOps.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/channels/vthread/BlockingChannelOps.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,7 +21,7 @@
  * questions.
  */
 
-/**
+/*
  * @test id=default
  * @bug 8284161
  * @summary Test virtual threads doing blocking I/O on NIO channels
@@ -29,7 +29,7 @@
  * @run junit BlockingChannelOps
  */
 
-/**
+/*
  * @test id=direct-register
  * @summary Test virtual threads doing blocking I/O on NIO channels and with
  *    the I/O poller configured to use direct registration
@@ -37,7 +37,7 @@
  * @run junit/othervm -Djdk.useDirectRegister BlockingChannelOps
  */
 
-/**
+/*
  * @test id=no-vmcontinuations
  * @requires vm.continuations
  * @library /test/lib
@@ -62,6 +62,7 @@
 import java.nio.channels.ServerSocketChannel;
 import java.nio.channels.SocketChannel;
 import java.nio.channels.WritableByteChannel;
+import java.util.concurrent.locks.LockSupport;
 
 import jdk.test.lib.thread.VThreadRunner;
 import org.junit.jupiter.api.Test;
@@ -162,6 +163,22 @@
     }
 
     /**
+     * SocketChannel shutdownInput while virtual thread blocked in read.
+     */
+    @Test
+    void testSocketChannelReadAsyncShutdownInput() throws Exception {
+        VThreadRunner.run(() -> {
+            try (var connection = new Connection()) {
+                SocketChannel sc = connection.channel1();
+                runAfterParkedAsync(sc::shutdownInput);
+                int n = sc.read(ByteBuffer.allocate(100));
+                assertEquals(-1, n);
+                assertTrue(sc.isOpen());
+            }
+        });
+    }
+
+    /**
      * Virtual thread interrupted while blocked in SocketChannel read.
      */
     @Test
@@ -190,13 +207,15 @@
     @Test
     void testSocketChannelWriteAsyncClose() throws Exception {
         VThreadRunner.run(() -> {
-            boolean retry = true;
-            while (retry) {
+            boolean done = false;
+            while (!done) {
                 try (var connection = new Connection()) {
                     SocketChannel sc = connection.channel1();
 
                     // close sc when current thread blocks in write
-                    runAfterParkedAsync(sc::close);
+                    runAfterParkedAsync(sc::close, true);
+
+                    // write until channel is closed
                     try {
                         ByteBuffer bb = ByteBuffer.allocate(100*1024);
                         for (;;) {
@@ -206,11 +225,39 @@
                         }
                     } catch (AsynchronousCloseException expected) {
                         // closed when blocked in write
-                        retry = false;
+                        done = true;
                     } catch (ClosedChannelException e) {
-                        // closed when not blocked in write, need to retry test
+                        // closed but not blocked in write, need to retry test
+                        System.err.format("%s, need to retry!%n", e);
+                    }
+                }
+            }
+        });
+    }
+
+
+    /**
+     * SocketChannel shutdownOutput while virtual thread blocked in write.
+     */
+    @Test
+    void testSocketChannelWriteAsyncShutdownOutput() throws Exception {
+        VThreadRunner.run(() -> {
+            try (var connection = new Connection()) {
+                SocketChannel sc = connection.channel1();
+
+                // shutdown output when current thread blocks in write
+                runAfterParkedAsync(sc::shutdownOutput);
+                try {
+                    ByteBuffer bb = ByteBuffer.allocate(100*1024);
+                    for (;;) {
+                        int n = sc.write(bb);
+                        assertTrue(n > 0);
+                        bb.clear();
                     }
+                } catch (ClosedChannelException e) {
+                    // expected
                 }
+                assertTrue(sc.isOpen());
             }
         });
     }
@@ -221,15 +268,16 @@
     @Test
     void testSocketChannelWriteInterrupt() throws Exception {
         VThreadRunner.run(() -> {
-            boolean retry = true;
-            while (retry) {
+            boolean done = false;
+            while (!done) {
                 try (var connection = new Connection()) {
                     SocketChannel sc = connection.channel1();
 
                     // interrupt current thread when it blocks in write
                     Thread thisThread = Thread.currentThread();
-                    runAfterParkedAsync(thisThread::interrupt);
+                    runAfterParkedAsync(thisThread::interrupt, true);
 
+                    // write until channel is closed
                     try {
                         ByteBuffer bb = ByteBuffer.allocate(100*1024);
                         for (;;) {
@@ -240,9 +288,10 @@
                     } catch (ClosedByInterruptException e) {
                         // closed when blocked in write
                         assertTrue(Thread.interrupted());
-                        retry = false;
+                        done = true;
                     } catch (ClosedChannelException e) {
-                        // closed when not blocked in write, need to retry test
+                        // closed but not blocked in write, need to retry test
+                        System.err.format("%s, need to retry!%n", e);
                     }
                 }
             }
@@ -734,14 +783,16 @@
     @Test
     void testPipeWriteAsyncClose() throws Exception {
         VThreadRunner.run(() -> {
-            boolean retry = true;
-            while (retry) {
+            boolean done = false;
+            while (!done) {
                 Pipe p = Pipe.open();
                 try (Pipe.SinkChannel sink = p.sink();
                      Pipe.SourceChannel source = p.source()) {
 
                     // close sink when current thread blocks in write
-                    runAfterParkedAsync(sink::close);
+                    runAfterParkedAsync(sink::close, true);
+
+                    // write until channel is closed
                     try {
                         ByteBuffer bb = ByteBuffer.allocate(100*1024);
                         for (;;) {
@@ -751,9 +802,10 @@
                         }
                     } catch (AsynchronousCloseException e) {
                         // closed when blocked in write
-                        retry = false;
+                        done = true;
                     } catch (ClosedChannelException e) {
-                        // closed when not blocked in write, need to retry test
+                        // closed but not blocked in write, need to retry test
+                        System.err.format("%s, need to retry!%n", e);
                     }
                 }
             }
@@ -766,16 +818,17 @@
     @Test
     void testPipeWriteInterrupt() throws Exception {
         VThreadRunner.run(() -> {
-            boolean retry = true;
-            while (retry) {
+            boolean done = false;
+            while (!done) {
                 Pipe p = Pipe.open();
                 try (Pipe.SinkChannel sink = p.sink();
                      Pipe.SourceChannel source = p.source()) {
 
                     // interrupt current thread when it blocks in write
                     Thread thisThread = Thread.currentThread();
-                    runAfterParkedAsync(thisThread::interrupt);
+                    runAfterParkedAsync(thisThread::interrupt, true);
 
+                    // write until channel is closed
                     try {
                         ByteBuffer bb = ByteBuffer.allocate(100*1024);
                         for (;;) {
@@ -786,9 +839,10 @@
                     } catch (ClosedByInterruptException expected) {
                         // closed when blocked in write
                         assertTrue(Thread.interrupted());
-                        retry = false;
+                        done = true;
                     } catch (ClosedChannelException e) {
-                        // closed when not blocked in write, need to retry test
+                        // closed but not blocked in write, need to retry test
+                        System.err.format("%s, need to retry!%n", e);
                     }
                 }
             }
@@ -848,26 +902,50 @@
     }
 
     /**
-     * Runs the given task asynchronously after the current virtual thread has parked.
+     * Runs the given task asynchronously after the current virtual thread parks.
+     * @param writing if the thread will block in write
      * @return the thread started to run the task
      */
-    static Thread runAfterParkedAsync(ThrowingRunnable task) {
+    private static Thread runAfterParkedAsync(ThrowingRunnable task, boolean writing) {
         Thread target = Thread.currentThread();
         if (!target.isVirtual())
             throw new WrongThreadException();
         return Thread.ofPlatform().daemon().start(() -> {
             try {
-                Thread.State state = target.getState();
-                while (state != Thread.State.WAITING
-                        && state != Thread.State.TIMED_WAITING) {
+                // wait for target thread to park
+                while (!isWaiting(target)) {
                     Thread.sleep(20);
-                    state = target.getState();
                 }
-                Thread.sleep(20);  // give a bit more time to release carrier
+
+                // if the target thread is parked in write then we nudge it a few times
+                // to avoid wakeup with some bytes written
+                if (writing) {
+                    for (int i = 0; i < 3; i++) {
+                        LockSupport.unpark(target);
+                        while (!isWaiting(target)) {
+                            Thread.sleep(20);
+                        }
+                    }
+                }
+
                 task.run();
+
             } catch (Exception e) {
                 e.printStackTrace();
             }
         });
     }
+
+    private static Thread runAfterParkedAsync(ThrowingRunnable task) {
+        return runAfterParkedAsync(task, false);
+    }
+
+    /**
+     * Return true if the given Thread is parked.
+     */
+    private static boolean isWaiting(Thread target) {
+        Thread.State state = target.getState();
+        assertNotEquals(Thread.State.TERMINATED, state);
+        return (state == Thread.State.WAITING || state == Thread.State.TIMED_WAITING);
+    }
 }
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/charset/RemovingSunIO/TestCOMP.java openjdk-21-21.0.11+10/test/jdk/java/nio/charset/RemovingSunIO/TestCOMP.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/charset/RemovingSunIO/TestCOMP.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/charset/RemovingSunIO/TestCOMP.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,6 +24,7 @@
 /* @test
    @bug 6176819
    @summary Check if COMPUND_TEXT charset works as expected
+   @requires (os.family != "windows")
    @run main/timeout=1200 TestCOMP
  */
 
@@ -35,9 +36,6 @@
 
 public class TestCOMP {
     public static void main(String[] argv) throws CharacterCodingException {
-        String osName = System.getProperty("os.name");
-        if (osName.startsWith("Windows"))
-            return;
         try {
             String src =
                 "JIS0208\u4eb0" +
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/DirectoryStream/DriveLetter.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/DirectoryStream/DriveLetter.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/DirectoryStream/DriveLetter.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/DirectoryStream/DriveLetter.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
  * @bug 6808647
  * @summary Checks that a DirectoryStream's iterator returns the expected
  *    path when opening a directory by specifying only the drive letter.
+ * @requires (os.family == "windows")
  * @library ..
  */
 
@@ -35,11 +36,6 @@
 public class DriveLetter {
 
     public static void main(String[] args) throws IOException {
-        String os = System.getProperty("os.name");
-        if (!os.startsWith("Windows")) {
-            System.out.println("This is Windows specific test");
-            return;
-        }
         String here = System.getProperty("user.dir");
         if (here.length() < 2 || here.charAt(1) != ':')
             throw new RuntimeException("Unable to determine drive letter");
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/DirectoryStream/SecureDS.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/DirectoryStream/SecureDS.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/DirectoryStream/SecureDS.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/DirectoryStream/SecureDS.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -37,7 +37,7 @@
 import java.util.*;
 
 public class SecureDS {
-    static boolean supportsLinks;
+    static boolean supportsSymbolicLinks;
 
     public static void main(String[] args) throws IOException {
         Path dir = TestUtil.createTemporaryDirectory();
@@ -52,7 +52,7 @@
                 return;
             }
 
-            supportsLinks = TestUtil.supportsLinks(dir);
+            supportsSymbolicLinks = TestUtil.supportsSymbolicLinks(dir);
 
             // run tests
             doBasicTests(dir);
@@ -76,11 +76,11 @@
         createDirectory(dir1.resolve(dirEntry));
         // myfilelink -> myfile
         Path link1Entry = Paths.get("myfilelink");
-        if (supportsLinks)
+        if (supportsSymbolicLinks)
             createSymbolicLink(dir1.resolve(link1Entry), fileEntry);
         // mydirlink -> mydir
         Path link2Entry = Paths.get("mydirlink");
-        if (supportsLinks)
+        if (supportsSymbolicLinks)
             createSymbolicLink(dir1.resolve(link2Entry), dirEntry);
 
         // open directory and then move it so that it is no longer accessible
@@ -92,7 +92,7 @@
         // Test: iterate over all entries
         int count = 0;
         for (Path entry: stream) { count++; }
-        assertTrue(count == (supportsLinks ? 4 : 2));
+        assertTrue(count == (supportsSymbolicLinks ? 4 : 2));
 
         // Test: getFileAttributeView to access directory's attributes
         assertTrue(stream
@@ -117,7 +117,7 @@
             .getFileAttributeView(dirEntry, BasicFileAttributeView.class, NOFOLLOW_LINKS)
                 .readAttributes()
                     .isDirectory());
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             assertTrue(stream
                 .getFileAttributeView(link1Entry, BasicFileAttributeView.class)
                     .readAttributes()
@@ -139,7 +139,7 @@
         // Test: newByteChannel
         Set opts = Collections.emptySet();
         stream.newByteChannel(fileEntry, opts).close();
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             stream.newByteChannel(link1Entry, opts).close();
             try {
                 Set mixed = new HashSet<>();
@@ -153,7 +153,7 @@
         // Test: newDirectoryStream
         stream.newDirectoryStream(dirEntry).close();
         stream.newDirectoryStream(dirEntry, LinkOption.NOFOLLOW_LINKS).close();
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             stream.newDirectoryStream(link2Entry).close();
             try {
                 stream.newDirectoryStream(link2Entry, LinkOption.NOFOLLOW_LINKS)
@@ -163,7 +163,7 @@
         }
 
         // Test: delete
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             stream.deleteFile(link1Entry);
             stream.deleteFile(link2Entry);
         }
@@ -186,7 +186,7 @@
         Path dirEntry = Paths.get("mydir");
         createDirectory(dir1.resolve(dirEntry));
         Path linkEntry = Paths.get("mylink");
-        if (supportsLinks)
+        if (supportsSymbolicLinks)
             createSymbolicLink(dir1.resolve(linkEntry), Paths.get("missing"));
 
         // target name
@@ -211,7 +211,7 @@
         stream2.deleteDirectory(target);
 
         // Test: move dir1/mylink -> dir2/newfile
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             stream1.move(linkEntry, stream2, target);
             assertTrue(isSymbolicLink(dir2.resolve(target)));
             stream2.deleteFile(target);
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/CheckPermissions.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/CheckPermissions.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/CheckPermissions.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/CheckPermissions.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -251,7 +251,7 @@
                 delete(target);
             }
 
-            if (TestUtil.supportsLinks(testdir)) {
+            if (TestUtil.supportsSymbolicLinks(testdir)) {
                 Path link = testdir.resolve("link1234");
                 createSymbolicLink(link, file);
                 try {
@@ -297,7 +297,7 @@
 
             // -- createSymbolicLink --
 
-            if (TestUtil.supportsLinks(testdir)) {
+            if (TestUtil.supportsSymbolicLinks(testdir)) {
                 prepare();
                 Path link = testdir.resolve("link1234");
                 createSymbolicLink(link, file);
@@ -311,7 +311,7 @@
 
             // -- createLink --
 
-            if (TestUtil.supportsLinks(testdir)) {
+            if (TestUtil.supportsHardLinks(testdir)) {
                 prepare();
                 Path link = testdir.resolve("entry234");
                 createLink(link, file);
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/CopyAndMove.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/CopyAndMove.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/CopyAndMove.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/CopyAndMove.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -57,8 +57,8 @@
             FileStore fileStore1 = getFileStore(dir1);
             printDirInfo("dir1", dir1, fileStore1);
             testPosixAttributes = fileStore1.supportsFileAttributeView("posix");
-            testCopyFileToFile(dir1, dir1, TestUtil.supportsLinks(dir1));
-            testMove(dir1, dir1, TestUtil.supportsLinks(dir1));
+            testCopyFileToFile(dir1, dir1, TestUtil.supportsSymbolicLinks(dir1));
+            testMove(dir1, dir1, TestUtil.supportsSymbolicLinks(dir1));
 
             // Use test.dir to define second directory if possible as it might
             // be a different volume/file system and so improve test coverage.
@@ -72,8 +72,8 @@
                 try {
                     testPosixAttributes =
                         fileStore2.supportsFileAttributeView("posix");
-                    testCopyFileToFile(dir2, dir2, TestUtil.supportsLinks(dir2));
-                    testMove(dir2, dir2, TestUtil.supportsLinks(dir2));
+                    testCopyFileToFile(dir2, dir2, TestUtil.supportsSymbolicLinks(dir2));
+                    testMove(dir2, dir2, TestUtil.supportsSymbolicLinks(dir2));
                 } finally {
                     TestUtil.removeAll(dir2);
                 }
@@ -86,7 +86,7 @@
                     dir2 = TestUtil.createTemporaryDirectory(testDir);
                 }
                 boolean testSymbolicLinks =
-                    TestUtil.supportsLinks(dir1) && TestUtil.supportsLinks(dir2);
+                    TestUtil.supportsSymbolicLinks(dir1) && TestUtil.supportsSymbolicLinks(dir2);
                 testPosixAttributes = fileStore1.supportsFileAttributeView("posix") &&
                                       fileStore2.supportsFileAttributeView("posix");
                 testCopyFileToFile(dir1, dir2, testSymbolicLinks);
@@ -288,7 +288,7 @@
     /**
      * Tests all possible ways to invoke move
      */
-    static void testMove(Path dir1, Path dir2, boolean supportsLinks)
+    static void testMove(Path dir1, Path dir2, boolean supportsSymbolicLinks)
         throws IOException
     {
         Path source, target, entry;
@@ -510,7 +510,7 @@
         /**
          * Test: Move symbolic link to file, target does not exist
          */
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             Path tmp = createSourceFile(dir1);
             source = dir1.resolve("link");
             createSymbolicLink(source, tmp);
@@ -523,7 +523,7 @@
         /**
          * Test: Move symbolic link to directory, target does not exist
          */
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             source = dir1.resolve("link");
             createSymbolicLink(source, dir2);
             target = getTargetFile(dir2);
@@ -534,7 +534,7 @@
         /**
          * Test: Move broken symbolic link, target does not exists
          */
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             Path tmp = Paths.get("doesnotexist");
             source = dir1.resolve("link");
             createSymbolicLink(source, tmp);
@@ -546,7 +546,7 @@
         /**
          * Test: Move symbolic link, target exists
          */
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             source = dir1.resolve("link");
             createSymbolicLink(source, dir2);
             target = getTargetFile(dir2);
@@ -563,7 +563,7 @@
         /**
          * Test: Move regular file, target exists
          */
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             source = dir1.resolve("link");
             createSymbolicLink(source, dir2);
             target = getTargetFile(dir2);
@@ -575,7 +575,7 @@
         /**
          * Test: move symbolic link, target exists and is empty directory
          */
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             source = dir1.resolve("link");
             createSymbolicLink(source, dir2);
             target = getTargetFile(dir2);
@@ -587,7 +587,7 @@
         /**
          * Test: symbolic link, target exists and is non-empty directory
          */
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             source = dir1.resolve("link");
             createSymbolicLink(source, dir2);
             target = getTargetFile(dir2);
@@ -607,7 +607,7 @@
         /**
          * Test atomic move of symbolic link (same file store)
          */
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             source = dir1.resolve("link");
             createSymbolicLink(source, dir1);
             target = getTargetFile(dir2);
@@ -722,7 +722,7 @@
     /**
      * Tests all possible ways to invoke copy to copy a file to a file
      */
-    static void testCopyFileToFile(Path dir1, Path dir2, boolean supportsLinks)
+    static void testCopyFileToFile(Path dir1, Path dir2, boolean supportsSymbolicLinks)
         throws IOException
     {
         Path source, target, link, entry;
@@ -926,7 +926,7 @@
         /**
          * Test: Follow link
          */
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             source = createSourceFile(dir1);
             link = dir1.resolve("link");
             createSymbolicLink(link, source.getFileName());
@@ -939,7 +939,7 @@
         /**
          * Test: Copy link (to file)
          */
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             source = createSourceFile(dir1);
             link = dir1.resolve("link");
             createSymbolicLink(link, source);
@@ -952,7 +952,7 @@
         /**
          * Test: Copy link (to directory)
          */
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             source = dir1.resolve("mydir");
             createDirectory(source);
             link = dir1.resolve("link");
@@ -966,7 +966,7 @@
         /**
          * Test: Copy broken link
          */
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             assertTrue(notExists(source));
             link = dir1.resolve("link");
             createSymbolicLink(link, source);
@@ -978,7 +978,7 @@
         /**
          * Test: Copy link to UNC (Windows only)
          */
-        if (supportsLinks && Platform.isWindows()) {
+        if (supportsSymbolicLinks && Platform.isWindows()) {
             Path unc = Paths.get("\\\\rialto\\share\\file");
             link = dir1.resolve("link");
             createSymbolicLink(link, unc);
@@ -1045,7 +1045,7 @@
         }
         Path tmpdir = createTempDirectory("blah");
         try {
-            if (TestUtil.supportsLinks(tmpdir)) {
+            if (TestUtil.supportsSymbolicLinks(tmpdir)) {
                 Path link = createSymbolicLink(tmpdir.resolve("link"),
                                                   tmpdir.resolve("target"));
                 try {
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/CopyInterference.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/CopyInterference.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/CopyInterference.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/CopyInterference.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ * @bug 8114830
+ * @summary Verify FileAlreadyExistsException is not thrown for REPLACE_EXISTING
+ * @library ..
+ * @build CopyInterference
+ * @run junit CopyInterference
+ */
+import java.io.InputStream;
+import java.io.IOException;
+import java.nio.file.CopyOption;
+import java.nio.file.FileAlreadyExistsException;
+import java.nio.file.Files;
+import java.nio.file.FileSystemException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Stream;
+
+import static java.nio.file.StandardCopyOption.*;
+import static java.nio.file.LinkOption.*;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+public class CopyInterference {
+
+    private static final int N_THREADS = 2;
+
+    private static final AtomicBoolean running = new AtomicBoolean(true);
+
+    private static class CopyTask implements Runnable {
+        final Path source;
+        final Path target;
+        final CopyOption[] options;
+
+        CopyTask(Path source, Path target, CopyOption[] options) {
+            this.source = source;
+            this.target = target;
+            this.options = options;
+        }
+
+        @Override
+        public void run() {
+            try {
+                while (running.get()) {
+                    Files.copy(source, target, options);
+                }
+            } catch (FileAlreadyExistsException e) {
+                throw new RuntimeException("Unexpected exception", e);
+            } catch (FileSystemException e) {
+                System.out.printf("Expected FileSystemException: \"%s\"%n",
+                                  e.getMessage());
+            } catch (IOException e) {
+                throw new RuntimeException("Unexpected exception", e);
+            } finally {
+                running.set(false);
+            }
+        }
+    }
+
+    private static Stream pathAndOptionsProvider()
+        throws IOException {
+        Path parent = Path.of(System.getProperty("test.dir", "."));
+        Path dir = Files.createTempDirectory(parent, "foobargus");
+
+        List list = new ArrayList();
+
+        // regular file
+        Path sourceFile = Files.createTempFile(dir, "foo", "baz");
+        Class c = CopyInterference.class;
+        String name = "CopyInterference.class";
+
+        try (InputStream in = c.getResourceAsStream(name)) {
+            Files.copy(in, sourceFile, REPLACE_EXISTING);
+        }
+
+        Arguments args = Arguments.of(sourceFile, dir.resolve("targetFile"),
+                                      new CopyOption[] {REPLACE_EXISTING});
+        list.add(args);
+
+        // directory
+        Path sourceDirectory = Files.createTempDirectory(dir, "fubar");
+        args = Arguments.of(sourceDirectory, dir.resolve("targetDir"),
+                            new CopyOption[] {REPLACE_EXISTING});
+        list.add(args);
+
+        if (TestUtil.supportsSymbolicLinks(dir)) {
+            // symbolic link, followed
+            Path link = dir.resolve("link");
+            Files.createSymbolicLink(link, sourceFile);
+            args = Arguments.of(link, dir.resolve("linkFollowed"),
+                                new CopyOption[] {REPLACE_EXISTING});
+            list.add(args);
+
+            // symbolic link, not followed
+            args = Arguments.of(link, dir.resolve("linkNotFollowed"),
+                                new CopyOption[] {REPLACE_EXISTING,
+                                                  NOFOLLOW_LINKS});
+            list.add(args);
+        } else {
+            System.out.println("Links not supported: not testing links");
+        }
+
+        return list.stream();
+    }
+
+    @ParameterizedTest
+    @MethodSource("pathAndOptionsProvider")
+    void copy(Path source, Path target, CopyOption[] options)
+        throws InterruptedException, IOException {
+
+        Future[] results = new Future[N_THREADS];
+        try (ExecutorService es = Executors.newFixedThreadPool(N_THREADS)) {
+            CopyTask copyTask = new CopyTask(source, target, options);
+            for (int i = 0; i < N_THREADS; i++)
+                results[i] = es.submit(copyTask);
+        }
+
+        for (Future res : results) {
+            try {
+                res.get();
+            } catch (ExecutionException e) {
+                throw new RuntimeException(res.exceptionNow());
+            }
+        }
+    }
+}
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/CreateDirectories.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/CreateDirectories.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/CreateDirectories.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/CreateDirectories.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -46,7 +46,7 @@
     public void testSymlinkDir() throws Exception {
         // create a temp dir as the "root" in which we will run our tests.
         final Path top = TestUtil.createTemporaryDirectory();
-        if (!TestUtil.supportsLinks(top)) {
+        if (!TestUtil.supportsSymbolicLinks(top)) {
             System.out.println("Skipping tests since symbolic links isn't " +
                     "supported under directory "+ top);
             throw new SkipException("Symbolic links not supported");
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/DeleteOnClose.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/DeleteOnClose.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/DeleteOnClose.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/DeleteOnClose.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -82,7 +82,7 @@
         Path dir = Files.createTempDirectory("blah");
         try {
             // check that DELETE_ON_CLOSE fails when file is a sym link
-            if (TestUtil.supportsLinks(dir)) {
+            if (TestUtil.supportsSymbolicLinks(dir)) {
                 file = dir.resolve("foo");
                 Files.createFile(file);
                 Path link = dir.resolve("link");
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/Misc.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/Misc.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/Misc.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/Misc.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -156,7 +156,7 @@
             /**
              * Test: Symbolic links
              */
-            if (TestUtil.supportsLinks(tmpdir)) {
+            if (TestUtil.supportsSymbolicLinks(tmpdir)) {
                 createSymbolicLink(thatFile, thisFile);
                 try {
                     assertTrue(isSameFile(thisFile, thatFile));
@@ -198,7 +198,7 @@
             assertTrue(!isDirectory(file, NOFOLLOW_LINKS));
             assertTrue(!isSymbolicLink(file));
 
-            if (TestUtil.supportsLinks(tmpdir)) {
+            if (TestUtil.supportsSymbolicLinks(tmpdir)) {
                 Path link = tmpdir.resolve("link");
 
                 createSymbolicLink(link, tmpdir);
@@ -222,6 +222,10 @@
                 } finally {
                     delete(link);
                 }
+            }
+
+            if (TestUtil.supportsHardLinks(tmpdir)) {
+                Path link = tmpdir.resolve("hardlink");
 
                 createLink(link, file);
                 try {
@@ -234,7 +238,6 @@
                     delete(link);
                 }
             }
-
         } finally {
             delete(file);
         }
@@ -273,7 +276,7 @@
             }
 
             // sym link exists
-            if (TestUtil.supportsLinks(tmpdir)) {
+            if (TestUtil.supportsSymbolicLinks(tmpdir)) {
                 Path link = tmpdir.resolve("link");
 
                 createSymbolicLink(link, file);
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/SBC.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/SBC.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/SBC.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/SBC.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -39,12 +39,12 @@
 
 public class SBC {
 
-    static boolean supportsLinks;
+    static boolean supportsSymbolicLinks;
 
     public static void main(String[] args) throws Exception {
         Path dir = TestUtil.createTemporaryDirectory();
         try {
-            supportsLinks = TestUtil.supportsLinks(dir);
+            supportsSymbolicLinks = TestUtil.supportsSymbolicLinks(dir);
 
             // open options
             createTests(dir);
@@ -84,7 +84,7 @@
             Files.newByteChannel(file, CREATE, WRITE).close();
 
             // create file where existing file is a sym link
-            if (supportsLinks) {
+            if (supportsSymbolicLinks) {
                 Path link = Files.createSymbolicLink(dir.resolve("link"), file);
                 try {
                     // file already exists
@@ -121,7 +121,7 @@
             } catch (FileAlreadyExistsException x) { }
 
             // create should fail
-            if (supportsLinks) {
+            if (supportsSymbolicLinks) {
                 Path link = dir.resolve("link");
                 Path target = dir.resolve("thisDoesNotExist");
                 Files.createSymbolicLink(link, target);
@@ -224,7 +224,7 @@
 
     // test NOFOLLOW_LINKS option
     static void noFollowLinksTests(Path dir) throws Exception {
-        if (!supportsLinks)
+        if (!supportsSymbolicLinks)
             return;
         Path file = Files.createFile(dir.resolve("foo"));
         try {
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/SetLastModifiedTime.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/SetLastModifiedTime.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/SetLastModifiedTime.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/SetLastModifiedTime.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -87,7 +87,7 @@
 
     @Test
     public void testSymbolicLink() throws Exception {
-        if (TestUtil.supportsLinks(testDir)) {
+        if (TestUtil.supportsSymbolicLinks(testDir)) {
             Path target = Files.createFile(testDir.resolve("target"));
             Path link = testDir.resolve("link");
             Files.createSymbolicLink(link, target);
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/StreamTest.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/StreamTest.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/StreamTest.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/StreamTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -72,7 +72,7 @@
      *            - linkFile(./file)
      */
     static Path testFolder;
-    static boolean supportsLinks;
+    static boolean supportsSymbolicLinks;
     static Path[] level1;
     static Path[] all;
     static Path[] all_folowLinks;
@@ -80,7 +80,7 @@
     @BeforeClass
     void setupTestFolder() throws IOException {
         testFolder = TestUtil.createTemporaryDirectory();
-        supportsLinks = TestUtil.supportsLinks(testFolder);
+        supportsSymbolicLinks = TestUtil.supportsSymbolicLinks(testFolder);
         TreeSet set = new TreeSet<>();
 
         // Level 1
@@ -96,7 +96,7 @@
         set.add(file);
         set.add(dir);
         set.add(dir2);
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             Path tmp = testFolder.resolve("linkDir");
             Files.createSymbolicLink(tmp, dir);
             set.add(tmp);
@@ -113,7 +113,7 @@
         tmp = dir.resolve("f1");
         Files.createFile(tmp);
         set.add(tmp);
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             tmp = dir.resolve("lnDir2");
             Files.createSymbolicLink(tmp, dir2);
             set.add(tmp);
@@ -123,7 +123,7 @@
         all = set.toArray(new Path[0]);
 
         // Follow links
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             tmp = testFolder.resolve("linkDir");
             set.add(tmp.resolve("d1"));
             set.add(tmp.resolve("f1"));
@@ -212,7 +212,7 @@
     }
 
     public void testWalkFollowLinkLoop() {
-        if (!supportsLinks) {
+        if (!supportsSymbolicLinks) {
             return;
         }
 
@@ -513,7 +513,7 @@
         Path triggerLink = null;
         Path linkTriggerDir = null;
         Path linkTriggerFile = null;
-        if (supportsLinks) {
+        if (supportsSymbolicLinks) {
             Path dir = testFolder.resolve("dir");
             triggerLink = Files.createSymbolicLink(dir.resolve("SecurityException"), empty);
             linkTriggerDir = Files.createSymbolicLink(dir.resolve("lnDirSE"), triggerDir);
@@ -539,7 +539,7 @@
                 assertEqualsNoOrder(result, new String[] { "dir2", "SecurityException", "fileInSE", "file" });
             }
 
-            if (supportsLinks) {
+            if (supportsSymbolicLinks) {
                 try (Stream s = Files.list(fakeRoot.resolve("dir"))) {
                     String[] result = s.map(path -> path.getFileName().toString())
                                        .toArray(String[]::new);
@@ -562,7 +562,7 @@
                 assertEqualsNoOrder(result, new String[] { "dir2", "file" });
             }
 
-            if (supportsLinks) {
+            if (supportsSymbolicLinks) {
                 // not following links
                 try (Stream s = Files.walk(fakeRoot.resolve("dir"))) {
                     String[] result = s.map(path -> path.getFileName().toString())
@@ -639,7 +639,7 @@
             if (fs != null) {
                 fs.close();
             }
-            if (supportsLinks) {
+            if (supportsSymbolicLinks) {
                 Files.delete(triggerLink);
                 Files.delete(linkTriggerDir);
                 Files.delete(linkTriggerFile);
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/SubstDrive.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/SubstDrive.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/SubstDrive.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/SubstDrive.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2020 Microsoft Corporation. All rights reserved.
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -276,7 +277,7 @@
      */
     @Test
     public void testGetResolvedSymlinkAttribute() throws IOException {
-        if (!TestUtil.supportsLinks(TEST_TEMP_DIRECTORY)) {
+        if (!TestUtil.supportsSymbolicLinks(TEST_TEMP_DIRECTORY)) {
             return;
         }
 
@@ -308,7 +309,7 @@
      */
     @Test
     public void testSubstWithSymlinkedDirectory() throws IOException {
-        if (!TestUtil.supportsLinks(TEST_TEMP_DIRECTORY)) {
+        if (!TestUtil.supportsSymbolicLinks(TEST_TEMP_DIRECTORY)) {
             return;
         }
 
@@ -350,7 +351,7 @@
      */
     @Test
     public void testMoveAndCopyFilesToSymlinkedDrive() throws IOException {
-        if (!TestUtil.supportsLinks(TEST_TEMP_DIRECTORY)) {
+        if (!TestUtil.supportsSymbolicLinks(TEST_TEMP_DIRECTORY)) {
             return;
         }
 
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/SymlinkTime.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/SymlinkTime.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/SymlinkTime.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/SymlinkTime.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -41,7 +41,7 @@
 public class SymlinkTime {
     public static void main(String[] args) throws IOException {
         Path dir = TestUtil.createTemporaryDirectory();
-        if (!TestUtil.supportsLinks(dir)) {
+        if (!TestUtil.supportsSymbolicLinks(dir)) {
             System.out.println("Links not supported: skipping test");
             return;
         }
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/walkFileTree/CreateFileTree.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/walkFileTree/CreateFileTree.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/Files/walkFileTree/CreateFileTree.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/Files/walkFileTree/CreateFileTree.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -34,7 +34,7 @@
 
     private static final Random rand = new Random();
 
-    private static boolean supportsLinks(Path dir) {
+    private static boolean supportsSymbolicLinks(Path dir) {
         Path link = dir.resolve("testlink");
         Path target = dir.resolve("testtarget");
         try {
@@ -77,7 +77,7 @@
         }
 
         // create a few sym links in the file tree so as to create cycles
-        if (supportsLinks(top)) {
+        if (supportsSymbolicLinks(top)) {
             int links = 1 + rand.nextInt(5);
             for (int i=0; i doesNotExist.toRealPath(NOFOLLOW_LINKS));
     }
 
-    @EnabledIf("supportsLinks")
+    @EnabledIf("supportsSymbolicLinks")
     @Test
     public void shouldResolveLinks() throws IOException {
         Path resolvedFile = FILE;
@@ -110,7 +110,7 @@
     }
 
     @Test
-    @EnabledIf("supportsLinks")
+    @EnabledIf("supportsSymbolicLinks")
     public void shouldNotResolveLinks() throws IOException {
         Files.createSymbolicLink(LINK, FILE.toAbsolutePath());
         assertEquals(LINK.toRealPath(NOFOLLOW_LINKS).getFileName(),
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/TestUtil.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/TestUtil.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/TestUtil.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/TestUtil.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -102,7 +102,7 @@
     /**
      * Returns true if symbolic links are supported
      */
-    static boolean supportsLinks(Path dir) {
+    static boolean supportsSymbolicLinks(Path dir) {
         Path link = dir.resolve("testlink");
         Path target = dir.resolve("testtarget");
         try {
@@ -110,6 +110,23 @@
             Files.delete(link);
             return true;
         } catch (UnsupportedOperationException x) {
+            return false;
+        } catch (IOException x) {
+            return false;
+        }
+    }
+
+    /**
+     * Returns true if hard links are supported
+     */
+    static boolean supportsHardLinks(Path dir) {
+        Path link = dir.resolve("testlink");
+        Path target = dir.resolve("testtarget");
+        try {
+            Files.createLink(link, target);
+            Files.delete(link);
+            return true;
+        } catch (UnsupportedOperationException x) {
             return false;
         } catch (IOException x) {
             return false;
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/WatchService/FileTreeModifier.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/WatchService/FileTreeModifier.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/WatchService/FileTreeModifier.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/WatchService/FileTreeModifier.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,6 +24,7 @@
 /* @test
  * @bug 4313887 6838333
  * @summary Sanity test for JDK-specific FILE_TREE watch event modifier
+ * @requires (os.family == "windows")
  * @library ..
  * @modules jdk.unsupported
  */
@@ -129,11 +130,6 @@
 
 
     public static void main(String[] args) throws IOException {
-        if (!System.getProperty("os.name").startsWith("Windows")) {
-            System.out.println("This is Windows-only test at this time!");
-            return;
-        }
-
         Path dir = TestUtil.createTemporaryDirectory();
         try {
             doTest(dir);
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/attribute/DosFileAttributeView/Basic.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/attribute/DosFileAttributeView/Basic.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/attribute/DosFileAttributeView/Basic.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/attribute/DosFileAttributeView/Basic.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -79,7 +79,7 @@
             testAttributes(Files.getFileAttributeView(file, DosFileAttributeView.class));
 
             // Following tests use a symbolic link so skip if not supported
-            if (!TestUtil.supportsLinks(dir))
+            if (!TestUtil.supportsSymbolicLinks(dir))
                 return;
 
             Path link = dir.resolve("link");
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/attribute/PosixFileAttributeView/Basic.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/attribute/PosixFileAttributeView/Basic.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/attribute/PosixFileAttributeView/Basic.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/attribute/PosixFileAttributeView/Basic.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -169,7 +169,7 @@
 
         // create link (to file that doesn't exist) and test reading of
         // permissions
-        if (TestUtil.supportsLinks(dir)) {
+        if (TestUtil.supportsSymbolicLinks(dir)) {
             Path link = dir.resolve("link");
             System.out.format("create link %s\n", link);
             Files.createSymbolicLink(link, file);
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/nio/file/attribute/UserDefinedFileAttributeView/Basic.java openjdk-21-21.0.11+10/test/jdk/java/nio/file/attribute/UserDefinedFileAttributeView/Basic.java
--- openjdk-21-21.0.10+7/test/jdk/java/nio/file/attribute/UserDefinedFileAttributeView/Basic.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/nio/file/attribute/UserDefinedFileAttributeView/Basic.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -299,7 +299,7 @@
             }
 
             // test access to user defined attributes of sym link
-            if (TestUtil.supportsLinks(dir)) {
+            if (TestUtil.supportsSymbolicLinks(dir)) {
                 Path target = dir.resolve("doesnotexist");
                 Path link = dir.resolve("link");
                 Files.createSymbolicLink(link, target);
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/rmi/server/RemoteServer/AddrInUse.java openjdk-21-21.0.11+10/test/jdk/java/rmi/server/RemoteServer/AddrInUse.java
--- openjdk-21-21.0.10+7/test/jdk/java/rmi/server/RemoteServer/AddrInUse.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/rmi/server/RemoteServer/AddrInUse.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,7 +24,6 @@
 /* @test
  * @bug 4111507
  * @summary retryServerSocket should not retry on BindException
- * @author Ann Wollrath
  *
  * @run main/othervm AddrInUse
  */
@@ -33,75 +32,54 @@
 import java.rmi.registry.LocateRegistry;
 import java.rmi.server.ExportException;
 
-public class AddrInUse implements Runnable {
+public class AddrInUse {
 
-    private static int port = -1;
-    private static final long TIMEOUT = 10000;
-
-    private boolean exportSucceeded = false;
-    private Throwable exportException = null;
-
-    public void run() {
-
-        /*
-         * Attempt to create (i.e. export) a registry on the port that
-         * has already been bound, and record the result.
-         */
-        try {
-            LocateRegistry.createRegistry(port);
-            synchronized (this) {
-                exportSucceeded = true;
-                notifyAll();
-            }
-        } catch (Throwable t) {
-            synchronized (this) {
-                exportException = t;
-                notifyAll();
-            }
-        }
-    }
+    private static volatile Throwable registryExportFailure = null;
 
     public static void main(String[] args) throws Exception {
-        System.err.println("\nRegression test for bug 4111507\n");
-
         /*
          * Bind a server socket to a port.
          */
-        ServerSocket server = new ServerSocket(0);
-        port = server.getLocalPort();
-        System.err.println("Created a ServerSocket on port " + port + "...");
-
-        /*
-         * Start a thread that creates a registry on the same port,
-         * and analyze the result.
-         */
-        System.err.println("create a registry on the same port...");
-        System.err.println("(should cause an ExportException)");
-        AddrInUse obj = new AddrInUse();
-        synchronized (obj) {
-            (new Thread(obj, "AddrInUse")).start();
+        try (ServerSocket server = new ServerSocket(0)) {
+            int port = server.getLocalPort();
+            System.err.println("Created a ServerSocket on port " + port + "...");
 
             /*
-             * Don't wait forever (original bug is that the export
-             * hangs).
+             * Start a thread that creates a registry on the same port,
+             * and analyze the result.
              */
-            obj.wait(TIMEOUT);
+            System.err.println("create a registry on the same port...");
+            System.err.println("(should cause an ExportException)");
 
-            if (obj.exportSucceeded) {
-                throw new RuntimeException(
-                    "TEST FAILED: export on already-bound port succeeded");
-            } else if (obj.exportException != null) {
-                obj.exportException.printStackTrace();
-                if (obj.exportException instanceof ExportException) {
-                    System.err.println("TEST PASSED");
-                } else {
-                    throw new RuntimeException(
-                        "TEST FAILED: unexpected exception occurred",
-                        obj.exportException);
+            Thread exportRegistryThread = new Thread(() -> {
+                /*
+                 * Attempt to create (i.e. export) a registry on the port that
+                 * has already been bound, and record the result.
+                 */
+                try {
+                    LocateRegistry.createRegistry(port);
+                } catch (Throwable t) {
+                    registryExportFailure = t;
                 }
-            } else {
-                throw new RuntimeException("TEST FAILED: export timed out");
+            }, "ExportRegistry-Thread");
+
+            exportRegistryThread.start();
+
+            /*
+             * Wait for the LocateRegistry.createRegistry() call to complete or
+             * if it blocks forever (due to the original bug), then let jtreg fail
+             * the test with a timeout
+             */
+            exportRegistryThread.join();
+            if (registryExportFailure == null) {
+                throw new RuntimeException(
+                        "TEST FAILED: export on already-bound port succeeded");
+            }
+            if (!(registryExportFailure instanceof ExportException)) {
+                throw new RuntimeException(
+                        "TEST FAILED: unexpected exception occurred", registryExportFailure);
             }
+            System.err.println("TEST PASSED, received expected exception: " + registryExportFailure);
         }
     }
 }
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/security/KeyStore/TestDisabledAlgorithms.java openjdk-21-21.0.11+10/test/jdk/java/security/KeyStore/TestDisabledAlgorithms.java
--- openjdk-21-21.0.10+7/test/jdk/java/security/KeyStore/TestDisabledAlgorithms.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/security/KeyStore/TestDisabledAlgorithms.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8244336
+ * @summary Test JCE layer algorithm restriction
+ * @library /test/lib
+ * @run main/othervm TestDisabledAlgorithms KEYSTORE.JKs true
+ * @run main/othervm TestDisabledAlgorithms keySTORE.what false
+ * @run main/othervm TestDisabledAlgorithms kEYstoRe.jceKS false
+ * @run main/othervm -Djdk.crypto.disabledAlgorithms="keystore.jkS" TestDisabledAlgorithms keySTORE.jceKs true
+ * @run main/othervm -Djdk.crypto.disabledAlgorithms="KEYstORE.what" TestDisabledAlgorithms KeYStore.JKs false
+ * @run main/othervm -Djdk.crypto.disabledAlgorithms="keystOre.jceKS" TestDisabledAlgorithms KEysTORE.JKS false
+ */
+import java.io.File;
+import java.util.List;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.Provider;
+import java.security.Security;
+import jdk.test.lib.Utils;
+
+public class TestDisabledAlgorithms {
+
+    private static final String PROP_NAME = "jdk.crypto.disabledAlgorithms";
+
+    // reuse existing JKS test keystore
+    private final static String DIR = System.getProperty("test.src", ".");
+    private static final char[] PASSWD = "passphrase".toCharArray();
+    private static final String JKS_FN = "keystore.jks";
+
+    private static void test(List algos, Provider p,
+            boolean shouldThrow) throws Exception {
+
+        for (String a : algos) {
+            System.out.println("Testing " + (p != null ? p.getName() : "") +
+                    ": " + a + ", shouldThrow=" + shouldThrow);
+            if (shouldThrow) {
+                if (p == null) {
+                    Utils.runAndCheckException(() -> KeyStore.getInstance(a),
+                            KeyStoreException.class);
+                    Utils.runAndCheckException(
+                            () -> KeyStore.getInstance(new File(DIR, JKS_FN),
+                                PASSWD),
+                            KeyStoreException.class);
+                    Utils.runAndCheckException(
+                            () -> KeyStore.getInstance(new File(DIR, JKS_FN),
+                                () -> {
+                                    return new KeyStore.PasswordProtection(PASSWD);
+                                }),
+                            KeyStoreException.class);
+                } else {
+                    // with a provider argument
+                    Utils.runAndCheckException(() -> KeyStore.getInstance(a, p),
+                            KeyStoreException.class);
+                    Utils.runAndCheckException(() -> KeyStore.getInstance(a,
+                            p.getName()), KeyStoreException.class);
+                }
+            } else {
+                KeyStore k;
+                if (p == null) {
+                    k = KeyStore.getInstance(a);
+                    System.out.println("Got KeyStore w/ algo " + k.getType());
+                    k = KeyStore.getInstance(new File(DIR, JKS_FN), PASSWD);
+                    System.out.println("Got KeyStore w/ algo " + k.getType());
+                    k = KeyStore.getInstance(new File(DIR, JKS_FN),
+                        () -> {
+                            return new KeyStore.PasswordProtection(PASSWD);
+                        });
+                    System.out.println("Got KeyStore w/ algo " + k.getType());
+                } else {
+                    // with a provider argument
+                    k = KeyStore.getInstance(a, p);
+                    k = KeyStore.getInstance(a, p.getName());
+                    System.out.println("Got KeyStore w/ algo " + k.getType());
+                }
+            }
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        String propValue = args[0];
+        System.out.println("Setting Security Prop " + PROP_NAME + " = " +
+                propValue);
+        Security.setProperty(PROP_NAME, propValue);
+
+        boolean shouldThrow = Boolean.valueOf(args[1]);
+
+        List algos = List.of("JKS", "jkS");
+        // test w/o provider
+        test(algos, null, shouldThrow);
+
+        // test w/ provider
+        Provider[] providers = Security.getProviders("KeyStore.JKS");
+        for (Provider p : providers) {
+            test(algos, p, shouldThrow);
+        }
+    }
+}
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/security/MessageDigest/TestDisabledAlgorithms.java openjdk-21-21.0.11+10/test/jdk/java/security/MessageDigest/TestDisabledAlgorithms.java
--- openjdk-21-21.0.10+7/test/jdk/java/security/MessageDigest/TestDisabledAlgorithms.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/security/MessageDigest/TestDisabledAlgorithms.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8244336
+ * @summary Test JCE layer algorithm restriction
+ * @library /test/lib
+ * @run main/othervm TestDisabledAlgorithms MESSAGEdigest.Sha-512 true
+ * @run main/othervm TestDisabledAlgorithms messageDIGest.what false
+ * @run main/othervm TestDisabledAlgorithms meSSagedIgest.sHA-512/224 false
+ */
+import java.util.List;
+import java.security.NoSuchAlgorithmException;
+import java.security.MessageDigest;
+import java.security.Provider;
+import java.security.Security;
+import jdk.test.lib.Utils;
+
+public class TestDisabledAlgorithms {
+
+    private static final String PROP_NAME = "jdk.crypto.disabledAlgorithms";
+
+    private static void test(List algos, Provider p,
+            boolean shouldThrow) throws Exception {
+
+        for (String a : algos) {
+            System.out.println("Testing " + (p != null ? p.getName() : "") +
+                    ": " + a + ", shouldThrow=" + shouldThrow);
+            if (shouldThrow) {
+                if (p == null) {
+                    Utils.runAndCheckException(() -> MessageDigest.getInstance(a),
+                            NoSuchAlgorithmException.class);
+                } else {
+                    Utils.runAndCheckException(() -> MessageDigest.getInstance(a, p),
+                            NoSuchAlgorithmException.class);
+                    Utils.runAndCheckException(() -> MessageDigest.getInstance(a,
+                            p.getName()), NoSuchAlgorithmException.class);
+                }
+            } else {
+                MessageDigest m;
+                if (p == null) {
+                    m = MessageDigest.getInstance(a);
+                } else {
+                    m = MessageDigest.getInstance(a, p);
+                    m = MessageDigest.getInstance(a, p.getName());
+                }
+                System.out.println("Got MessageDigest w/ algo " +
+                        m.getAlgorithm());
+            }
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        String propValue = args[0];
+        System.out.println("Setting Security Prop " + PROP_NAME + " = " +
+                propValue);
+        Security.setProperty(PROP_NAME, propValue);
+
+        boolean shouldThrow = Boolean.valueOf(args[1]);
+
+        List algos = List.of("sHA-512", "shA-512",
+                "2.16.840.1.101.3.4.2.3");
+        // test w/o provider
+        test(algos, null, shouldThrow);
+
+        // test w/ provider
+        Provider[] providers = Security.getProviders("MessageDigest.SHA-512");
+        for (Provider p : providers) {
+            test(algos, p, shouldThrow);
+        }
+    }
+}
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/security/Signature/TestDisabledAlgorithms.java openjdk-21-21.0.11+10/test/jdk/java/security/Signature/TestDisabledAlgorithms.java
--- openjdk-21-21.0.10+7/test/jdk/java/security/Signature/TestDisabledAlgorithms.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/security/Signature/TestDisabledAlgorithms.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8244336
+ * @summary Test JCE layer algorithm restriction
+ * @library /test/lib
+ * @run main/othervm TestDisabledAlgorithms SIGNATURe.sha512withRSA true
+ * @run main/othervm TestDisabledAlgorithms signaturE.what false
+ * @run main/othervm TestDisabledAlgorithms SiGnAtUrE.SHa512/224withRSA false
+ */
+import java.util.List;
+import java.security.NoSuchAlgorithmException;
+import java.security.Signature;
+import java.security.Provider;
+import java.security.Security;
+import jdk.test.lib.Utils;
+
+public class TestDisabledAlgorithms {
+
+    private static final String PROP_NAME = "jdk.crypto.disabledAlgorithms";
+
+    private static void test(List algos, Provider p,
+            boolean shouldThrow) throws Exception {
+
+        for (String a : algos) {
+            System.out.println("Testing " + (p != null ? p.getName() : "") +
+                    ": " + a + ", shouldThrow=" + shouldThrow);
+            if (shouldThrow) {
+                if (p == null) {
+                    Utils.runAndCheckException(() -> Signature.getInstance(a),
+                            NoSuchAlgorithmException.class);
+                } else {
+                    Utils.runAndCheckException(() -> Signature.getInstance(a, p),
+                            NoSuchAlgorithmException.class);
+                    Utils.runAndCheckException(() -> Signature.getInstance(a,
+                            p.getName()), NoSuchAlgorithmException.class);
+                }
+            } else {
+                Signature s;
+                if (p == null) {
+                    s = Signature.getInstance(a);
+                } else {
+                    s = Signature.getInstance(a, p);
+                    s = Signature.getInstance(a, p.getName());
+                }
+                System.out.println("Got Signature w/ algo " + s.getAlgorithm());
+            }
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        String propValue = args[0];
+        System.out.println("Setting Security Prop " + PROP_NAME + " = " +
+                propValue);
+        Security.setProperty(PROP_NAME, propValue);
+
+        boolean shouldThrow = Boolean.valueOf(args[1]);
+
+        List algos = List.of("sha512withRsa", "1.2.840.113549.1.1.13");
+        // test w/o provider
+        test(algos, null, shouldThrow);
+
+        // test w/ provider
+        Provider[] providers = Security.getProviders("Signature.SHA512withRSA");
+        for (Provider p : providers) {
+            test(algos, p, shouldThrow);
+        }
+    }
+}
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/text/testlib/HexDumpReader.java openjdk-21-21.0.11+10/test/jdk/java/text/testlib/HexDumpReader.java
--- openjdk-21-21.0.10+7/test/jdk/java/text/testlib/HexDumpReader.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/text/testlib/HexDumpReader.java	2026-04-17 19:09:35.000000000 +0000
@@ -21,15 +21,14 @@
  * questions.
  */
 
-import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.File;
-import java.io.FileInputStream;
+import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.List;
+import java.nio.file.Files;
+import java.util.HexFormat;
+import java.util.stream.Collectors;
 
 /**
  * HexDumpReader provides utility methods to read a hex dump text file
@@ -43,78 +42,33 @@
     // Utility class should not be instantiated
     private HexDumpReader() {}
 
-    public static InputStream getStreamFromHexDump(String fileName) {
+    /*
+     * Converts a Hex dump file given by the String name into an InputStream
+     * containing bytes. The expected format of the file should be given as lines
+     * that are either:
+     *  - Valid hexadecimal value(s) (two hexadecimal characters) combined with no
+     *    spaces between. E.g. "ace95365" represents four hexadecimal values.
+     *    There should not be an odd amount of hexadecimal characters. E.g. "ace"
+     *  - Contain leading comments given by '#' (which are ignored). E.g. "#foo"
+     *    Non-leading comments are not allowed. E.g. "ace953 #foo"
+     *  - Empty (which are ignored).
+     */
+    public static InputStream getStreamFromHexDump(String fileName) throws IOException {
         return getStreamFromHexDump(new File(System.getProperty("test.src", "."),
-                                             fileName));
+                fileName));
     }
 
-    public static InputStream getStreamFromHexDump(File hexFile) {
-        ByteArrayBuilder bab = new ByteArrayBuilder();
-        int lineNo = 0;
-        try (BufferedReader reader
-                 = new BufferedReader(new InputStreamReader(new FileInputStream(hexFile),
-                StandardCharsets.US_ASCII))) {
-            String line;
-            while ((line = reader.readLine()) != null) {
-                lineNo++;
-                line = line.trim();
-                // Skip blank and comment lines.
-                if (line.length() == 0) {
-                    continue;
-                }
-                int x = line.indexOf('#');
-                if (x == 0) {
-                    continue;
-                }
-                if (x > 0) {
-                    line = line.substring(0, x).trim();
-                }
-                int len = line.length();
-                for (int i = 0; i < len; i += 2) {
-                    bab.put((byte)Integer.parseInt(line, i, i + 2, 16));
-                }
-            }
-        } catch (Exception e) {
-            throw new RuntimeException(hexFile.getName() + ":error:" + lineNo + ": " + e, e);
-        }
-        return new ByteArrayInputStream(bab.toArray());
+    // Overloaded version of getStreamFromHexDump() that takes the File itself as input.
+    public static InputStream getStreamFromHexDump(File hexFile) throws IOException {
+        // This hexString should only consist of valid hexadecimal digits and be even
+        // otherwise an exception will be thrown when converting to bytes
+        String hexString = Files.readAllLines(hexFile.toPath(), StandardCharsets.UTF_8)
+                .stream()
+                .map(String::trim)
+                .filter(s -> !s.isEmpty() && !s.startsWith("#"))
+                .collect(Collectors.joining());
+        // Iterate the hex string and convert it to bytes
+        byte[] bArray = HexFormat.of().parseHex(hexString);
+        return new ByteArrayInputStream(bArray);
     }
-
-
-    private static class ByteArrayBuilder {
-        private static final int BUFFER_SIZE = 4096;
-
-        private int size;
-        private List bytes;
-        private byte[] current;
-        private int offset;
-
-        ByteArrayBuilder() {
-            bytes = new ArrayList<>();
-            current = new byte[BUFFER_SIZE];
-        }
-
-        void put(byte b) {
-            if (offset == BUFFER_SIZE) {
-                bytes.add(current);
-                current = new byte[BUFFER_SIZE];
-                offset = 0;
-            }
-            current[offset++] = b;
-            size++;
-        }
-
-        byte[] toArray() {
-            byte[] buf = new byte[size];
-            int ptr = 0;
-            for (byte[] ba : bytes) {
-                System.arraycopy(ba, 0, buf, ptr, ba.length);
-                ptr += ba.length;
-            }
-            System.arraycopy(current, 0, buf, ptr, offset);
-            assert ptr + offset == size;
-            return buf;
-        }
-    }
-
 }
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/util/Locale/PreserveTagCase.java openjdk-21-21.0.11+10/test/jdk/java/util/Locale/PreserveTagCase.java
--- openjdk-21-21.0.10+7/test/jdk/java/util/Locale/PreserveTagCase.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/util/Locale/PreserveTagCase.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2026, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -53,7 +53,7 @@
      */
     @ParameterizedTest
     @MethodSource("filterProvider")
-    public static void testFilterTags(String ranges, List tags,
+    public void testFilterTags(String ranges, List tags,
                                   List expected, FilteringMode mode) {
         List priorityList = LanguageRange.parse(ranges);
         List actual = Locale.filterTags(priorityList, tags, mode);
@@ -67,7 +67,7 @@
      */
     @ParameterizedTest
     @MethodSource("lookupProvider")
-    public static void testLookupTag(String ranges, List tags,
+    public void testLookupTag(String ranges, List tags,
                                   String expected) {
         List priorityList = LanguageRange.parse(ranges);
         String actual = Locale.lookupTag(priorityList, tags);
diff -Nru openjdk-21-21.0.10+7/test/jdk/java/util/TimeZone/TimeZoneData/VERSION openjdk-21-21.0.11+10/test/jdk/java/util/TimeZone/TimeZoneData/VERSION
--- openjdk-21-21.0.10+7/test/jdk/java/util/TimeZone/TimeZoneData/VERSION	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/java/util/TimeZone/TimeZoneData/VERSION	2026-04-17 19:09:35.000000000 +0000
@@ -1 +1 @@
-tzdata2025b
+tzdata2026a
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/crypto/Cipher/TestDisabledAlgorithms.java openjdk-21-21.0.11+10/test/jdk/javax/crypto/Cipher/TestDisabledAlgorithms.java
--- openjdk-21-21.0.10+7/test/jdk/javax/crypto/Cipher/TestDisabledAlgorithms.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/crypto/Cipher/TestDisabledAlgorithms.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8244336
+ * @summary Test JCE layer algorithm restriction
+ * @library /test/lib
+ * @run main/othervm TestDisabledAlgorithms CIPHEr.Rsa/ECB/PKCS1Padding true
+ * @run main/othervm TestDisabledAlgorithms cipheR.rsA true
+ * @run main/othervm TestDisabledAlgorithms CIPher.what false
+ * @run main/othervm TestDisabledAlgorithms cipHER.RSA/ECB/PKCS1Padding2 false
+ */
+import java.util.List;
+import java.security.NoSuchAlgorithmException;
+import java.security.Provider;
+import java.security.Security;
+import java.security.Signature;
+import javax.crypto.Cipher;
+import javax.crypto.NoSuchPaddingException;
+import jdk.test.lib.Utils;
+
+public class TestDisabledAlgorithms {
+
+    private static final String PROP_NAME = "jdk.crypto.disabledAlgorithms";
+
+    private static final String TARGET = "Cipher.RSA/ECB/PKCS1Padding";
+
+    private static void test(List algos, Provider p,
+            boolean shouldThrow) throws Exception {
+
+        for (String a : algos) {
+            System.out.println("Testing " + (p != null ? p.getName() : "") +
+                    ": " + a + ", shouldThrow=" + shouldThrow);
+            if (shouldThrow) {
+                if (p == null) {
+                    Utils.runAndCheckException(() -> Cipher.getInstance(a),
+                            NoSuchAlgorithmException.class);
+                } else {
+                    Utils.runAndCheckException(() -> Cipher.getInstance(a, p),
+                            NoSuchAlgorithmException.class);
+                    Utils.runAndCheckException(() -> Cipher.getInstance(a,
+                            p.getName()), NoSuchAlgorithmException.class);
+
+                }
+            } else {
+                Cipher c;
+                if (p == null) {
+                    c = Cipher.getInstance(a);
+                } else {
+                    c = Cipher.getInstance(a, p);
+                    c = Cipher.getInstance(a, p.getName());
+                }
+                System.out.println("Got cipher w/ algo " + c.getAlgorithm());
+            }
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        String propValue = args[0];
+        System.out.println("Setting Security Prop " + PROP_NAME + " = " +
+                propValue);
+        Security.setProperty(PROP_NAME, propValue);
+
+        boolean shouldThrow = Boolean.valueOf(args[1]);
+
+        List algos = List.of("Rsa/ECB/PKCS1Padding", "rSA");
+
+        // test w/o provider
+        test(algos, null, shouldThrow);
+
+        // test w/ provider
+        Provider[] providers = Security.getProviders();
+        for (Provider p : providers) {
+            if (p.getService("Cipher", "RSA/ECB/PKCS1Padding") != null) {
+                test(algos, p, shouldThrow);
+            }
+        }
+
+        // make sure NONEwithRSA signature is still available from SunJCE and
+        // SunMSCAPI (windows)
+        if (shouldThrow) {
+            System.out.println("Testing NONEwithRSA signature support");
+            for (String pn : List.of("SunJCE", "SunMSCAPI")) {
+                Provider p = Security.getProvider(pn);
+                if (p != null) {
+                    Signature s = Signature.getInstance("NONEwithRSA", p);
+                    System.out.println(pn + "=> yes");
+                } else {
+                    System.out.println(pn + "=> skip; not found");
+                }
+            }
+        }
+        System.out.println("Done");
+    }
+}
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/crypto/Cipher/TestDisabledWithOids.java openjdk-21-21.0.11+10/test/jdk/javax/crypto/Cipher/TestDisabledWithOids.java
--- openjdk-21-21.0.10+7/test/jdk/javax/crypto/Cipher/TestDisabledWithOids.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/crypto/Cipher/TestDisabledWithOids.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8375549
+ * @summary Test JCE layer algorithm restriction using algorithms w/ oids
+ * @library /test/lib
+ * @run main/othervm -Djdk.crypto.disabledAlgorithms=Cipher.DES,Cipher.RSA/ECB/PKCS1Padding TestDisabledWithOids
+ * @run main/othervm -Djdk.crypto.disabledAlgorithms=Cipher.RSA/ECB/PKCS1Padding,Cipher.DES TestDisabledWithOids
+ */
+import java.security.NoSuchAlgorithmException;
+import javax.crypto.Cipher;
+import jdk.test.lib.Utils;
+
+public class TestDisabledWithOids {
+    public static void main(String[] args) throws Exception {
+        String algo1 = "RSA/ECB/PKCS1Padding";
+        String algo2 = "DES";
+
+        Utils.runAndCheckException(() -> Cipher.getInstance(algo1),
+                            NoSuchAlgorithmException.class);
+        Utils.runAndCheckException(() -> Cipher.getInstance(algo2),
+                            NoSuchAlgorithmException.class);
+        System.out.println("Done");
+    }
+}
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/crypto/Cipher/TestEmptyModePadding.java openjdk-21-21.0.11+10/test/jdk/javax/crypto/Cipher/TestEmptyModePadding.java
--- openjdk-21-21.0.10+7/test/jdk/javax/crypto/Cipher/TestEmptyModePadding.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/crypto/Cipher/TestEmptyModePadding.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2025 IBM Corporation. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8359388
+ * @summary test that the Cipher.getInstance() would reject improper
+ *     transformations with empty mode and/or padding.
+ */
+
+import java.security.NoSuchAlgorithmException;
+import java.security.Provider;
+import java.security.Security;
+import javax.crypto.Cipher;
+
+public class TestEmptyModePadding {
+
+    public static void main(String[] args) throws Exception {
+        Provider provider = Security.getProvider(
+                System.getProperty("test.provider.name", "SunJCE"));
+
+        System.out.println("Testing against " + provider.getName());
+
+        String[] testTransformations = {
+            // transformations w/ only 1 component, i.e. algo
+            " ",
+            // transformations w/ only 2 components
+            "AES/",
+            "AES/ ",
+            "AES/CBC",
+            "PBEWithHmacSHA512/224AndAES_128/",
+            "PBEWithHmacSHA512/256AndAES_128/ ",
+            "PBEWithHmacSHA512/224AndAES_128/CBC",
+            // 3-component transformations w/ empty component(s)
+            "AES//",
+            "AES/ /",
+            "AES// ",
+            "AES/ / ",
+            "AES/CBC/", "AES/CBC/ ",
+            "AES//PKCS5Padding", "AES/ /NoPadding",
+            "PBEWithHmacSHA512/224AndAES_128//",
+            "PBEWithHmacSHA512/224AndAES_128/ /",
+            "PBEWithHmacSHA512/224AndAES_128// ",
+            "PBEWithHmacSHA512/224AndAES_128/ / ",
+            "PBEWithHmacSHA512/256AndAES_128/CBC/",
+            "PBEWithHmacSHA512/256AndAES_128/CBC/ ",
+            "PBEWithHmacSHA512/256AndAES_128//PKCS5Padding",
+            "PBEWithHmacSHA512/256AndAES_128/ /PKCS5Padding",
+        };
+
+        for (String t : testTransformations) {
+            test(t, provider);
+        }
+    }
+
+    private static void test(String t, Provider p) throws Exception {
+        try {
+            Cipher c = Cipher.getInstance(t, p);
+            throw new RuntimeException("Should throw NSAE for \'" + t + "\'");
+        } catch (NoSuchAlgorithmException nsae) {
+            // transformation info is already in the NSAE message
+            System.out.println("Expected NSAE: " + nsae.getMessage());
+        }
+    }
+}
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/net/ssl/SSLSession/CertMsgCheck.java openjdk-21-21.0.11+10/test/jdk/javax/net/ssl/SSLSession/CertMsgCheck.java
--- openjdk-21-21.0.10+7/test/jdk/javax/net/ssl/SSLSession/CertMsgCheck.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/net/ssl/SSLSession/CertMsgCheck.java	2026-04-17 19:09:35.000000000 +0000
@@ -39,10 +39,12 @@
             build();
 
         // Initial client session
-        TLSBase.Client client1 = new TLSBase.Client(true, false);
+        TLSBase.Client client = new TLSBase.Client(true, false);
+        client.connect();
 
-        server.getSession(client1).getSessionContext();
-        server.done();
+        // Close must be called to gather all the exceptions thrown
+        client.close();
+        server.close();
 
         var eList = server.getExceptionList();
         System.out.println("Exception list size is " + eList.size());
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/net/ssl/SSLSession/CheckSessionContext.java openjdk-21-21.0.11+10/test/jdk/javax/net/ssl/SSLSession/CheckSessionContext.java
--- openjdk-21-21.0.10+7/test/jdk/javax/net/ssl/SSLSession/CheckSessionContext.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/net/ssl/SSLSession/CheckSessionContext.java	2026-04-17 19:09:35.000000000 +0000
@@ -47,6 +47,7 @@
 
         // Initial client session
         TLSBase.Client client1 = new TLSBase.Client();
+        client1.connect();
         if (server.getSession(client1).getSessionContext() == null) {
             throw new Exception("Context was null.  Handshake failure.");
         } else {
@@ -66,6 +67,7 @@
 
         // Resume the client session
         TLSBase.Client client2 = new TLSBase.Client();
+        client2.connect();
         if (server.getSession(client2).getSessionContext() == null) {
             throw new Exception("Context was null on resumption");
         } else {
@@ -73,6 +75,5 @@
         }
         server.close(client2);
         client2.close();
-        server.done();
     }
 }
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/net/ssl/Stapling/HttpsUrlConnClient.java openjdk-21-21.0.11+10/test/jdk/javax/net/ssl/Stapling/HttpsUrlConnClient.java
--- openjdk-21-21.0.10+7/test/jdk/javax/net/ssl/Stapling/HttpsUrlConnClient.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/net/ssl/Stapling/HttpsUrlConnClient.java	2026-04-17 19:09:35.000000000 +0000
@@ -33,7 +33,11 @@
  * @run main/othervm HttpsUrlConnClient RSASSA-PSS RSASSA-PSS
  */
 
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
 import java.math.BigInteger;
 import java.security.KeyPair;
 import java.security.KeyPairGenerator;
@@ -41,7 +45,9 @@
 import java.net.URL;
 import java.net.HttpURLConnection;
 import java.net.InetAddress;
+
 import javax.net.ssl.*;
+
 import java.security.KeyStore;
 import java.security.PublicKey;
 import java.security.Security;
@@ -55,7 +61,16 @@
 import java.security.cert.PKIXRevocationChecker;
 import java.security.spec.PKCS8EncodedKeySpec;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 import jdk.test.lib.security.SimpleOCSPServer;
@@ -92,10 +107,6 @@
     static String INT_ALIAS = "intermediate";
     static String SSL_ALIAS = "ssl";
 
-    /*
-     * Is the server ready to serve?
-     */
-    volatile static boolean serverReady = false;
     volatile int serverPort = 0;
 
     volatile Exception serverException = null;
@@ -164,7 +175,7 @@
         ClientParameters cliParams = new ClientParameters();
         cliParams.protocols = allowedProts;
         ServerParameters servParams = new ServerParameters();
-        serverReady = false;
+        CountDownLatch serverReady = new CountDownLatch(1);
 
         System.out.println("=====================================");
         System.out.println("Stapling enabled, PKIXParameters with");
@@ -192,7 +203,7 @@
         Security.setProperty("ocsp.enable", "false");
 
         HttpsUrlConnClient sslTest = new HttpsUrlConnClient(cliParams,
-                servParams);
+                servParams, serverReady);
         TestResult tr = sslTest.getResult();
         if (!checkClientValidationFailure(tr.clientExc, BasicReason.REVOKED)) {
             if (tr.clientExc != null) {
@@ -219,10 +230,11 @@
     /*
      * Define the server side of the test.
      *
-     * If the server prematurely exits, serverReady will be set to true
+     * If the server prematurely exits, serverReady will be counted down
      * to avoid infinite hangs.
      */
-    void doServerSide(ServerParameters servParams) throws Exception {
+    void doServerSide(ServerParameters servParams, CountDownLatch serverReady)
+            throws Exception {
 
         // Selectively enable or disable the feature
         System.setProperty("jdk.tls.server.enableStatusRequestExtension",
@@ -274,7 +286,7 @@
         /*
          * Signal Client, we're ready for his connect.
          */
-        serverReady = true;
+        serverReady.countDown();
 
         try (SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();
                 BufferedReader in = new BufferedReader(
@@ -306,18 +318,13 @@
     /*
      * Define the client side of the test.
      *
-     * If the server prematurely exits, serverReady will be set to true
+     * If the server prematurely exits, serverReady will be counted down
      * to avoid infinite hangs.
      */
-    void doClientSide(ClientParameters cliParams) throws Exception {
+    void doClientSide(ClientParameters cliParams, CountDownLatch serverReady)
+            throws Exception {
 
-        // Wait 5 seconds for server ready
-        for (int i = 0; (i < 100 && !serverReady); i++) {
-            Thread.sleep(50);
-        }
-        if (!serverReady) {
-            throw new RuntimeException("Server not ready yet");
-        }
+        serverReady.await();
 
         // Selectively enable or disable the feature
         System.setProperty("jdk.tls.client.enableStatusRequestExtension",
@@ -373,16 +380,16 @@
      *
      * Fork off the other side, then do your work.
      */
-    HttpsUrlConnClient(ClientParameters cliParams,
-            ServerParameters servParams) throws Exception {
+    HttpsUrlConnClient(ClientParameters cliParams, ServerParameters servParams,
+            CountDownLatch serverReady) throws Exception {
         Exception startException = null;
         try {
             if (separateServerThread) {
-                startServer(servParams, true);
-                startClient(cliParams, false);
+                startServer(servParams, true, serverReady);
+                startClient(cliParams, false, serverReady);
             } else {
-                startClient(cliParams, true);
-                startServer(servParams, false);
+                startClient(cliParams, true, serverReady);
+                startServer(servParams, false, serverReady);
             }
         } catch (Exception e) {
             startException = e;
@@ -453,51 +460,53 @@
         return tr;
     }
 
-    final void startServer(ServerParameters servParams, boolean newThread)
-            throws Exception {
+    final void startServer(ServerParameters servParams, boolean newThread,
+            CountDownLatch serverReady) throws IOException {
         if (newThread) {
             serverThread = new Thread() {
                 @Override
                 public void run() {
                     try {
-                        doServerSide(servParams);
+                        doServerSide(servParams, serverReady);
                     } catch (Exception e) {
                         /*
                          * Our server thread just died.
                          *
                          * Release the client, if not active already...
                          */
-                        System.err.println("Server died...");
-                        serverReady = true;
+                        System.err.println("Server died: " + e);
                         serverException = e;
+                    } finally {
+                        serverReady.countDown();
                     }
                 }
             };
             serverThread.start();
         } else {
             try {
-                doServerSide(servParams);
+                doServerSide(servParams, serverReady);
             } catch (Exception e) {
+                System.err.println("Server died: " + e);
                 serverException = e;
             } finally {
-                serverReady = true;
+                serverReady.countDown();
             }
         }
     }
 
-    final void startClient(ClientParameters cliParams, boolean newThread)
-            throws Exception {
+    final void startClient(ClientParameters cliParams, boolean newThread,
+            CountDownLatch serverReady) throws Exception {
         if (newThread) {
             clientThread = new Thread() {
                 @Override
                 public void run() {
                     try {
-                        doClientSide(cliParams);
+                        doClientSide(cliParams, serverReady);
                     } catch (Exception e) {
                         /*
                          * Our client thread just died.
                          */
-                        System.err.println("Client died...");
+                        System.err.println("Client died: " + e);
                         clientException = e;
                     }
                 }
@@ -505,9 +514,10 @@
             clientThread.start();
         } else {
             try {
-                doClientSide(cliParams);
+                doClientSide(cliParams, serverReady);
             } catch (Exception e) {
                 clientException = e;
+                System.err.println("Client died: " + e);
             }
         }
     }
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/net/ssl/TLSCommon/interop/AbstractPeer.java openjdk-21-21.0.11+10/test/jdk/javax/net/ssl/TLSCommon/interop/AbstractPeer.java
--- openjdk-21-21.0.10+7/test/jdk/javax/net/ssl/TLSCommon/interop/AbstractPeer.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/net/ssl/TLSCommon/interop/AbstractPeer.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -50,13 +50,6 @@
     }
 
     /*
-     * Deletes log file if exists.
-     */
-    protected void deleteLog() throws IOException {
-        Utilities.deleteFile(getLogPath());
-    }
-
-    /*
      * The negotiated application protocol.
      */
     public String getNegoAppProtocol() throws SSLTestException {
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcClient.java openjdk-21-21.0.11+10/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcClient.java
--- openjdk-21-21.0.10+7/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcClient.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcClient.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -148,7 +148,6 @@
     @Override
     public void close() throws IOException {
         printLog();
-        deleteLog();
     }
 
     public static void main(String[] args) throws Exception {
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcServer.java openjdk-21-21.0.11+10/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcServer.java
--- openjdk-21-21.0.10+7/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcServer.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcServer.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -166,7 +166,6 @@
     public void close() throws IOException {
         printLog();
         deletePort();
-        deleteLog();
     }
 
     private static int readPort() {
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/net/ssl/templates/TLSBase.java openjdk-21-21.0.11+10/test/jdk/javax/net/ssl/templates/TLSBase.java
--- openjdk-21-21.0.10+7/test/jdk/javax/net/ssl/templates/TLSBase.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/net/ssl/templates/TLSBase.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,13 +25,13 @@
 import java.io.*;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
+import java.nio.charset.StandardCharsets;
 import java.security.KeyStore;
 import java.security.cert.PKIXBuilderParameters;
 import java.security.cert.X509CertSelector;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.*;
 
 /**
  * This is a base setup for creating a server and clients.  All clients will
@@ -39,7 +39,7 @@
  * first.  The idea is for the test code to be minimal as possible without
  * this library class being complicated.
  *
- * Server.done() must be called or the server will never exit and hang the test.
+ * Server.close() must be called so the server will exit and end threading.
  *
  * After construction, reading and writing are allowed from either side,
  * or a combination write/read from both sides for verifying text.
@@ -52,24 +52,25 @@
  */
 
 abstract public class TLSBase {
-    static String pathToStores = "../etc";
+    static String pathToStores = "javax/net/ssl/etc";
     static String keyStoreFile = "keystore";
     static String trustStoreFile = "truststore";
     static String passwd = "passphrase";
 
+    static final String TESTROOT =
+        System.getProperty("test.root", "../../../..");
+
     SSLContext sslContext;
     // Server's port
     static int serverPort;
     // Name shown during read and write ops
-    String name;
+    public String name;
 
     TLSBase() {
-        String keyFilename =
-            System.getProperty("test.src", "./") + "/" + pathToStores +
-                "/" + keyStoreFile;
-        String trustFilename =
-            System.getProperty("test.src", "./") + "/" + pathToStores +
-                "/" + trustStoreFile;
+
+        String keyFilename = TESTROOT +  "/" + pathToStores + "/" + keyStoreFile;
+        String trustFilename = TESTROOT + "/" + pathToStores + "/" +
+            trustStoreFile;
         System.setProperty("javax.net.ssl.keyStore", keyFilename);
         System.setProperty("javax.net.ssl.keyStorePassword", passwd);
         System.setProperty("javax.net.ssl.trustStore", trustFilename);
@@ -78,26 +79,24 @@
 
     // Base read operation
     byte[] read(SSLSocket sock) throws Exception {
-        BufferedReader reader = new BufferedReader(
-            new InputStreamReader(sock.getInputStream()));
-        String s = reader.readLine();
-        System.err.println("(read) " + name + ": " + s);
-        return s.getBytes();
+        BufferedInputStream is = new BufferedInputStream(sock.getInputStream());
+        byte[] b = is.readNBytes(5);
+        System.err.println("(read) " + Thread.currentThread().getName() + ": " +
+            new String(b));
+        return b;
     }
 
     // Base write operation
     public void write(SSLSocket sock, byte[] data) throws Exception {
-        PrintWriter out = new PrintWriter(
-            new OutputStreamWriter(sock.getOutputStream()));
-        out.println(new String(data));
-        out.flush();
-        System.err.println("(write)" + name + ": " + new String(data));
+        sock.getOutputStream().write(data);
+        System.err.println("(write)" + Thread.currentThread().getName() + ": " +
+            new String(data));
     }
 
     private static KeyManager[] getKeyManager(boolean empty) throws Exception {
         FileInputStream fis = null;
         if (!empty) {
-            fis = new FileInputStream(System.getProperty("test.src", "./") +
+            fis = new FileInputStream(System.getProperty("test.root", "./") +
                 "/" + pathToStores + "/" + keyStoreFile);
         }
         // Load the keystore
@@ -113,7 +112,7 @@
     private static TrustManager[] getTrustManager(boolean empty) throws Exception {
         FileInputStream fis = null;
         if (!empty) {
-            fis = new FileInputStream(System.getProperty("test.src", "./") +
+            fis = new FileInputStream(System.getProperty("test.root", "./") +
                 "/" + pathToStores + "/" + trustStoreFile);
         }
         // Load the keystore
@@ -148,9 +147,9 @@
         // Clients sockets are kept in a hash table with the port as the key.
         ConcurrentHashMap clientMap =
                 new ConcurrentHashMap<>();
-        Thread t;
         List exceptionList = new ArrayList<>();
-
+        ExecutorService threadPool = Executors.newFixedThreadPool(1);
+        CountDownLatch serverLatch = new CountDownLatch(1);
         Server(ServerBuilder builder) {
             super();
             name = "server";
@@ -160,128 +159,82 @@
                     TLSBase.getTrustManager(builder.tm), null);
                 fac = sslContext.getServerSocketFactory();
                 ssock = (SSLServerSocket) fac.createServerSocket(0);
+                ssock.setReuseAddress(true);
                 ssock.setNeedClientAuth(builder.clientauth);
                 serverPort = ssock.getLocalPort();
+                System.err.println("Server Port: " + serverPort);
             } catch (Exception e) {
                 System.err.println("Failure during server initialization");
                 e.printStackTrace();
             }
 
             // Thread to allow multiple clients to connect
-            t = new Thread(() -> {
+            new Thread(() -> {
                 try {
-                    while (true) {
-                        System.err.println("Server ready on port " +
-                            serverPort);
-                        SSLSocket c = (SSLSocket)ssock.accept();
-                        clientMap.put(c.getPort(), c);
-                        try {
-                            write(c, read(c));
-                        } catch (Exception e) {
-                            System.out.println("Caught " + e.getMessage());
-                            e.printStackTrace();
-                            exceptionList.add(e);
-                        }
-                    }
+                    System.err.println("Server starting to accept");
+                    serverLatch.countDown();
+                    do {
+                        SSLSocket sock = (SSLSocket)ssock.accept();
+                        threadPool.submit(new ServerThread(sock));
+                    } while (true);
                 } catch (Exception ex) {
                     System.err.println("Server Down");
                     ex.printStackTrace();
+                } finally {
+                    threadPool.close();
                 }
-            });
-            t.start();
+            }).start();
         }
 
-        Server() {
-            this(new ServerBuilder());
-        }
+        class ServerThread extends Thread {
+            SSLSocket sock;
 
-        /**
-         * @param km - true for an empty key manager
-         * @param tm - true for an empty trust manager
-         */
-        Server(boolean km, boolean tm) {
-            super();
-            name = "server";
-            try {
-                sslContext = SSLContext.getInstance("TLS");
-                sslContext.init(TLSBase.getKeyManager(km),
-                    TLSBase.getTrustManager(tm), null);
-                fac = sslContext.getServerSocketFactory();
-                ssock = (SSLServerSocket) fac.createServerSocket(0);
-                ssock.setNeedClientAuth(true);
-                serverPort = ssock.getLocalPort();
-            } catch (Exception e) {
-                System.err.println("Failure during server initialization");
-                e.printStackTrace();
-            }
-
-                // Thread to allow multiple clients to connect
-                t = new Thread(() -> {
-                    try {
-                        while (true) {
-                            System.err.println("Server ready on port " +
-                                serverPort);
-                            SSLSocket c = (SSLSocket)ssock.accept();
-                            clientMap.put(c.getPort(), c);
-                            try {
-                                write(c, read(c));
-                            } catch (Exception e) {
-                                System.out.println("Caught " + e.getMessage());
-                                e.printStackTrace();
-                                exceptionList.add(e);
-                            }
-                        }
-                    } catch (Exception ex) {
-                        System.err.println("Server Down");
-                        ex.printStackTrace();
-                    }
-                });
-                t.start();
-            }
-
-        // Exit test to quit the test.  This must be called at the end of the
-        // test or the test will never end.
-        void done() {
-            try {
-                t.join(5000);
-                ssock.close();
-            } catch (Exception e) {
-                System.err.println(e.getMessage());
-                e.printStackTrace();
+            ServerThread(SSLSocket s) {
+                this.sock = s;
+                System.err.println("(Server) client connection on port " +
+                    sock.getPort());
+                clientMap.put(sock.getPort(), sock);
             }
-        }
 
-        // Read from the client
-        byte[] read(Client client) throws Exception {
-            SSLSocket s = clientMap.get(Integer.valueOf(client.getPort()));
-            if (s == null) {
-                System.err.println("No socket found, port " + client.getPort());
+            public void run() {
+                try {
+                    write(sock, read(sock));
+                } catch (Exception e) {
+                    System.err.println("Caught " + e.getMessage());
+                    e.printStackTrace();
+                    exceptionList.add(e);
+                }
             }
-            return read(s);
         }
 
-        // Write to the client
-        void write(Client client, byte[] data) throws Exception {
-            write(clientMap.get(client.getPort()), data);
+        Server() {
+            this(new ServerBuilder());
         }
 
-        // Server writes to the client, then reads from the client.
-        // Return true if the read & write data match, false if not.
-        boolean writeRead(Client client, String s) throws Exception{
-            write(client, s.getBytes());
-            return (Arrays.compare(s.getBytes(), client.read()) == 0);
+        public SSLSession getSession(Client client) throws Exception {
+            System.err.println("getSession("+client.getPort()+")");
+            SSLSocket clientSocket = clientMap.get(client.getPort());
+            if (clientSocket == null) {
+                throw new Exception("Server can't find client socket");
+            }
+            return clientSocket.getSession();
         }
 
-        // Get the SSLSession from the server side socket
-        SSLSession getSession(Client c) {
-            SSLSocket s = clientMap.get(Integer.valueOf(c.getPort()));
-            return s.getSession();
+        void close(Client client) {
+            try {
+                System.err.println("close("+client.getPort()+")");
+                clientMap.remove(client.getPort()).close();
+            } catch (Exception e) {
+                ;
+            }
         }
-
-        // Close client socket
-        void close(Client c) throws IOException {
-            SSLSocket s = clientMap.get(Integer.valueOf(c.getPort()));
-            s.close();
+        void close() throws InterruptedException {
+            clientMap.values().stream().forEach(s -> {
+                try {
+                    s.close();
+                } catch (IOException e) {}
+            });
+            threadPool.awaitTermination(500, TimeUnit.MILLISECONDS);
         }
 
         List getExceptionList() {
@@ -312,11 +265,11 @@
         }
     }
     /**
-     * Client side will establish a connection from the constructor and wait.
+     * Client side will establish a SSLContext instance.
      * It must be run after the Server constructor is called.
      */
     static class Client extends TLSBase {
-        SSLSocket sock;
+        public SSLSocket socket;
         boolean km, tm;
         Client() {
             this(false, false);
@@ -330,55 +283,70 @@
             super();
             this.km = km;
             this.tm = tm;
-            connect();
-        }
-
-        // Connect to server.  Maybe runnable in the future
-        public SSLSocket connect() {
             try {
                 sslContext = SSLContext.getInstance("TLS");
-                sslContext.init(TLSBase.getKeyManager(km), TLSBase.getTrustManager(tm), null);
-                sock = (SSLSocket)sslContext.getSocketFactory().createSocket();
-                sock.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(), serverPort));
-                System.err.println("Client connected using port " +
-                        sock.getLocalPort());
-                name = "client(" + sock.toString() + ")";
-                write("Hello");
-                read();
+                sslContext.init(TLSBase.getKeyManager(km),
+                    TLSBase.getTrustManager(tm), null);
+                socket = createSocket();
             } catch (Exception ex) {
                 ex.printStackTrace();
             }
-            return sock;
         }
 
-        // Read from the client socket
-        byte[] read() throws Exception {
-            return read(sock);
+        Client(Client cl) {
+            sslContext = cl.sslContext;
+            socket = createSocket();
         }
 
-        // Write to the client socket
-        void write(byte[] data) throws Exception {
-            write(sock, data);
+        public SSLSocket createSocket() {
+            try {
+                return (SSLSocket) sslContext.getSocketFactory().createSocket();
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+            return null;
         }
-        void write(String s) throws Exception {
-            write(sock, s.getBytes());
+
+        public SSLSocket connect() {
+            try {
+                socket.connect(new InetSocketAddress(
+                    InetAddress.getLoopbackAddress(), serverPort));
+                System.err.println("Client (" +
+                    Thread.currentThread().getName() +
+                    ") connected using port " + socket.getLocalPort() + " to " +
+                    socket.getPort());
+                writeRead();
+            } catch (Exception ex) {
+                ex.printStackTrace();
+                return null;
+            }
+            return socket;
         }
 
-        // Client writes to the server, then reads from the server.
-        // Return true if the read & write data match, false if not.
-        boolean writeRead(Server server, String s) throws Exception {
-            write(s.getBytes());
-            return (Arrays.compare(s.getBytes(), server.read(this)) == 0);
+        public SSLSession getSession() {
+            return socket.getSession();
+        }
+        public void close() {
+            try {
+                socket.close();
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
         }
 
-        // Get port from the socket
-        int getPort() {
-            return sock.getLocalPort();
+        public int getPort() {
+            return socket.getLocalPort();
         }
 
-        // Close socket
-        void close() throws IOException {
-            sock.close();
+        private SSLSocket writeRead() {
+            try {
+                write(socket, "Hello".getBytes(StandardCharsets.ISO_8859_1));
+                read(socket);
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+            return socket;
         }
+
     }
 }
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/rmi/ssl/SslRMIClientSocketFactory.policy openjdk-21-21.0.11+10/test/jdk/javax/rmi/ssl/SslRMIClientSocketFactory.policy
--- openjdk-21-21.0.10+7/test/jdk/javax/rmi/ssl/SslRMIClientSocketFactory.policy	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/rmi/ssl/SslRMIClientSocketFactory.policy	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,4 @@
+grant {
+    permission java.lang.RuntimePermission "setSecurityManager";
+    permission java.net.SocketPermission "", "connect,listen,resolve";
+};
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/rmi/ssl/SslRMIClientSocketFactoryPermissionTest.java openjdk-21-21.0.11+10/test/jdk/javax/rmi/ssl/SslRMIClientSocketFactoryPermissionTest.java
--- openjdk-21-21.0.10+7/test/jdk/javax/rmi/ssl/SslRMIClientSocketFactoryPermissionTest.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/rmi/ssl/SslRMIClientSocketFactoryPermissionTest.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2026 SAP SE. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8366866
+ * @summary Tests that SslRMIClientSocketFactory.createSocket() uses doPrivileged() when needed.
+ * @author Ralf Schmelter
+ * @run main/othervm/policy=SslRMIClientSocketFactory.policy SslRMIClientSocketFactoryPermissionTest
+ */
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+import javax.net.ssl.SSLServerSocketFactory;
+import javax.rmi.ssl.SslRMIClientSocketFactory;
+
+public class SslRMIClientSocketFactoryPermissionTest {
+
+    public static void main(String[] args) throws IOException {
+        try (ServerSocket server = SSLServerSocketFactory.getDefault().createServerSocket(0)) {
+            SslRMIClientSocketFactory factory = new SslRMIClientSocketFactory();
+            try (Socket socket = factory.createSocket("localhost", server.getLocalPort())) {
+                // Should not throw AccessControlException.
+            }
+        }
+    }
+}
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/swing/ButtonGroup/TestButtonGroupFocusTraversal.java openjdk-21-21.0.11+10/test/jdk/javax/swing/ButtonGroup/TestButtonGroupFocusTraversal.java
--- openjdk-21-21.0.10+7/test/jdk/javax/swing/ButtonGroup/TestButtonGroupFocusTraversal.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/swing/ButtonGroup/TestButtonGroupFocusTraversal.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -30,7 +30,6 @@
  * @run main TestButtonGroupFocusTraversal
  */
 
-import javax.swing.AbstractAction;
 import javax.swing.ButtonGroup;
 import javax.swing.JCheckBox;
 import javax.swing.JFrame;
@@ -43,9 +42,7 @@
 import java.awt.Container;
 import java.awt.FlowLayout;
 import java.awt.KeyboardFocusManager;
-import java.awt.Point;
 import java.awt.Robot;
-import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 
 public class TestButtonGroupFocusTraversal {
@@ -53,25 +50,11 @@
     private static JTextField textFieldFirst, textFieldLast;
     private static JToggleButton toggleButton1, toggleButton2;
     private static JCheckBox checkBox1, checkBox2;
-    private static boolean toggleButtonActionPerformed;
-    private static boolean checkboxActionPerformed;
+    private static volatile boolean toggleButtonActionPerformed;
+    private static volatile boolean checkboxActionPerformed;
     private static JRadioButton radioButton1, radioButton2;
     private static Robot robot;
 
-    private static void blockTillDisplayed(Component comp) {
-        Point p = null;
-        while (p == null) {
-            try {
-                p = comp.getLocationOnScreen();
-            } catch (IllegalStateException e) {
-                try {
-                    Thread.sleep(500);
-                } catch (InterruptedException ie) {
-                }
-            }
-        }
-    }
-
     private static void createUI() throws Exception {
         SwingUtilities.invokeAndWait(new Runnable() {
             public void run() {
@@ -84,33 +67,11 @@
                 checkBox1 = new JCheckBox("1");
                 checkBox2 = new JCheckBox("2");
 
-                toggleButton1.setAction(new AbstractAction() {
-                    @Override
-                    public void actionPerformed(ActionEvent e) {
-                        toggleButtonActionPerformed = true;
-                    }
-                });
-
-                toggleButton2.setAction(new AbstractAction() {
-                    @Override
-                    public void actionPerformed(ActionEvent e) {
-                        toggleButtonActionPerformed = true;
-                    }
-                });
-
-                checkBox1.setAction(new AbstractAction() {
-                    @Override
-                    public void actionPerformed(ActionEvent e) {
-                        checkboxActionPerformed = true;
-                    }
-                });
-
-                checkBox2.setAction(new AbstractAction() {
-                    @Override
-                    public void actionPerformed(ActionEvent e) {
-                        checkboxActionPerformed = true;
-                    }
-                });
+                toggleButton1.addActionListener((x) -> toggleButtonActionPerformed = true);
+                toggleButton2.addActionListener((x) -> toggleButtonActionPerformed = true);
+
+                checkBox1.addActionListener((x) -> checkboxActionPerformed = true);
+                checkBox2.addActionListener((x) -> checkboxActionPerformed = true);
 
                 ButtonGroup toggleGroup = new ButtonGroup();
                 toggleGroup.add(toggleButton1);
@@ -128,7 +89,7 @@
                 radioButton2.setSelected(true);
                 checkBox2.setSelected(true);
 
-                frame = new JFrame("Test");
+                frame = new JFrame("TestButtonGroupFocusTraversal");
                 frame.setLayout(new FlowLayout());
 
                 Container pane = frame.getContentPane();
@@ -178,7 +139,7 @@
     }
 
     private static void checkCheckboxActionPerformed() {
-        if (toggleButtonActionPerformed) {
+        if (checkboxActionPerformed) {
             throw new RuntimeException("Checkbox Action should not be" +
                     "performed");
         }
@@ -196,19 +157,13 @@
                 createUI();
 
                 robot.waitForIdle();
-                robot.delay(200);
-
-                blockTillDisplayed(frame);
+                robot.delay(500);
 
                 SwingUtilities.invokeAndWait(textFieldFirst::requestFocus);
 
                 if (!textFieldFirst.equals(KeyboardFocusManager.getCurrentKeyboardFocusManager()
                         .getFocusOwner())) {
-                    try {
-                        Thread.sleep(100);
-                    } catch (InterruptedException e) {
-                        e.printStackTrace();
-                    }
+                    robot.delay(300);
                     SwingUtilities.invokeAndWait(textFieldFirst::requestFocus);
                 }
 
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/swing/GraphicsConfigNotifier/StalePreferredSize.java openjdk-21-21.0.11+10/test/jdk/javax/swing/GraphicsConfigNotifier/StalePreferredSize.java
--- openjdk-21-21.0.10+7/test/jdk/javax/swing/GraphicsConfigNotifier/StalePreferredSize.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/swing/GraphicsConfigNotifier/StalePreferredSize.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -66,9 +66,8 @@
  *          It is checked by SwingUtilities.updateComponentTreeUI(), if layout
  *          was correct the call to updateComponentTreeUI() will be no-op.
  * @compile -encoding utf-8 StalePreferredSize.java
- * @run main/othervm/timeout=600 StalePreferredSize
- * @run main/othervm/timeout=600 -Dsun.java2d.uiScale=1 StalePreferredSize
- * @run main/othervm/timeout=600 -Dsun.java2d.uiScale=2.25 StalePreferredSize
+ * @run main/othervm/timeout=420 StalePreferredSize
+ * @run main/othervm/timeout=420 -Dsun.java2d.uiScale=2.25 StalePreferredSize
  */
 public final class StalePreferredSize {
 
@@ -92,7 +91,7 @@
     public static void main(final String[] args) throws Exception {
         for (final UIManager.LookAndFeelInfo laf : getInstalledLookAndFeels()) {
             EventQueue.invokeAndWait(() -> setLookAndFeel(laf));
-            for (typeFont = 0; typeFont < 3; typeFont++) {
+            for (typeFont = 0; typeFont < 1; typeFont++) {
                 System.err.println("typeFont = " + typeFont);
                 for (boolean usePopup : new boolean[]{true, false}) {
                     addViaPopup = usePopup;
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/swing/JColorChooser/Test8152419.java openjdk-21-21.0.11+10/test/jdk/javax/swing/JColorChooser/Test8152419.java
--- openjdk-21-21.0.10+7/test/jdk/javax/swing/JColorChooser/Test8152419.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/swing/JColorChooser/Test8152419.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,11 +21,12 @@
  * questions.
  */
 
- /*
-* @test
-* @bug 8152419
-* @summary To Verify JColorChooser tab selection
-* @run main/manual Test8152419
+/*
+ * @test
+ * @bug 8152419
+ * @library /test/lib
+ * @summary To Verify JColorChooser tab selection
+ * @run main/manual Test8152419
  */
 
 import java.awt.Color;
@@ -43,9 +44,17 @@
 import javax.swing.UIManager;
 import javax.swing.border.EmptyBorder;
 
+import jtreg.SkippedException;
+
 public class Test8152419 {
 
     public static void main(String args[]) throws Exception {
+        // ColorChooser UI design is different for GTK L&F.
+        // There are no tabs available for GTK L&F, skip the testing.
+        if (UIManager.getLookAndFeel().getName().contains("GTK")) {
+            throw new SkippedException("Test not applicable for GTK L&F");
+        }
+
         final CountDownLatch latch = new CountDownLatch(1);
 
         JColorChooserTest test = new JColorChooserTest(latch);
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/swing/JComboBox/ComboPopupBug.java openjdk-21-21.0.11+10/test/jdk/javax/swing/JComboBox/ComboPopupBug.java
--- openjdk-21-21.0.10+7/test/jdk/javax/swing/JComboBox/ComboPopupBug.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/swing/JComboBox/ComboPopupBug.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,66 +21,81 @@
  * questions.
  */
 
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Robot;
+import java.awt.event.InputEvent;
 import javax.swing.JButton;
 import javax.swing.JComboBox;
 import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
 
 /*
  * @test
  * @bug 8322754
+ * @key headful
  * @summary Verifies clicking JComboBox during frame closure causes Exception
- * @library /java/awt/regtesthelpers
- * @build PassFailJFrame
- * @run main/manual ComboPopupBug
+ * @run main ComboPopupBug
  */
 
 public class ComboPopupBug {
-    private static final String instructionsText = """
-            This test is used to verify that clicking on JComboBox
-            when frame containing it is about to close should not
-            cause IllegalStateException.
-
-            A JComboBox is shown with Close button at the bottom.
-            Click on Close and then click on JComboBox arrow button
-            to try to show combobox popup.
-            If IllegalStateException is thrown, test will automatically Fail
-            otherwise click Pass.""";
+    private static JFrame frame;
+    private static JButton closeButton;
+    private static JComboBox comboBox;
+    private static Robot robot;
+    private static final int PADDING = 10;
 
     public static void main(String[] args) throws Exception {
-        PassFailJFrame.builder()
-                .title("ComboPopup Instructions")
-                .instructions(instructionsText)
-                .testTimeOut(5)
-                .rows(10)
-                .columns(35)
-                .testUI(ComboPopupBug::createUI)
-                .build()
-                .awaitAndCheck();
+        try {
+            robot = new Robot();
+            robot.setAutoDelay(50);
+
+            SwingUtilities.invokeAndWait(ComboPopupBug::createUI);
+
+            robot.waitForIdle();
+            robot.delay(1000);
+
+            SwingUtilities.invokeAndWait(() -> closeButton.doClick());
+
+            robot.waitForIdle();
+        } finally {
+            SwingUtilities.invokeAndWait(() -> {
+                if (frame != null) {
+                    frame.dispose();
+                }
+            });
+        }
     }
 
-    private static JFrame createUI() {
-        JFrame frame = new JFrame("ComboPopup");
+    private static void clickComboBox() {
+        Point comboBoxLocation = comboBox.getLocationOnScreen();
+        Dimension comboBoxSize = comboBox.getSize();
+
+        robot.mouseMove(comboBoxLocation.x + comboBoxSize.width - PADDING,
+                comboBoxLocation.y + comboBoxSize.height / 2);
+        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
+        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
+    }
 
-        JComboBox cb = new JComboBox<>();
-        cb.setEditable(true);
-        cb.addItem("test");
-        cb.addItem("test2");
-        cb.addItem("test3");
-
-        JButton b = new JButton("Close");
-        b.addActionListener(
-                (e)->{
-                    try {
-                        Thread.sleep(3000);
-                    } catch (Exception ignored) {
-                    }
-                    frame.setVisible(false);
-                });
+    private static void createUI() {
+        frame = new JFrame("ComboPopup");
 
-        frame.getContentPane().add(cb, "North");
-        frame.getContentPane().add(b, "South");
-        frame.setSize(200, 200);
+        comboBox = new JComboBox<>();
+        comboBox.setEditable(true);
+        comboBox.addItem("test");
+        comboBox.addItem("test2");
+        comboBox.addItem("test3");
+
+        closeButton = new JButton("Close");
+        closeButton.addActionListener((e) -> {
+            clickComboBox();
+            frame.setVisible(false);
+        });
 
-        return frame;
+        frame.getContentPane().add(comboBox, "North");
+        frame.getContentPane().add(closeButton, "South");
+        frame.setSize(200, 200);
+        frame.setLocationRelativeTo(null);
+        frame.setVisible(true);
     }
 }
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/swing/JRadioButton/4314194/bug4314194.java openjdk-21-21.0.11+10/test/jdk/javax/swing/JRadioButton/4314194/bug4314194.java
--- openjdk-21-21.0.10+7/test/jdk/javax/swing/JRadioButton/4314194/bug4314194.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/swing/JRadioButton/4314194/bug4314194.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -135,6 +135,10 @@
             if (laf.getClassName().contains("Motif")) {
                 System.out.println("Skipping Motif L&F as it is deprecated");
                 continue;
+            } else if (laf.getClassName().contains("GTK")) {
+                System.out.println("GTK doesn't support color setting explicitly" +
+                        " specified by user using UIManager property.");
+                continue;
             }
             System.out.println("Testing L&F: " + laf.getClassName());
             SwingUtilities.invokeAndWait(() -> setLookAndFeel(laf));
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/swing/plaf/basic/BasicHTML/bug4248210.java openjdk-21-21.0.11+10/test/jdk/javax/swing/plaf/basic/BasicHTML/bug4248210.java
--- openjdk-21-21.0.10+7/test/jdk/javax/swing/plaf/basic/BasicHTML/bug4248210.java	1970-01-01 00:00:00.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/swing/plaf/basic/BasicHTML/bug4248210.java	2026-04-17 19:09:35.000000000 +0000
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 1999, 2025, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import javax.imageio.ImageIO;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+import javax.swing.plaf.nimbus.NimbusLookAndFeel;
+import static java.awt.image.BufferedImage.TYPE_INT_RGB;
+
+/*
+ * @test
+ * @bug 4248210
+ * @key headful
+ * @summary Tests that HTML in JLabel is painted using LAF-defined
+            foreground color
+ * @run main bug4248210
+ */
+
+public class bug4248210 {
+    private static final Color labelColor = Color.red;
+
+    public static void main(String[] args) throws Exception {
+        for (UIManager.LookAndFeelInfo laf :
+                UIManager.getInstalledLookAndFeels()) {
+            if (!(laf.getName().contains("Motif") || laf.getName().contains("GTK"))) {
+                System.out.println("Testing LAF: " + laf.getName());
+                SwingUtilities.invokeAndWait(() -> test(laf));
+            }
+        }
+    }
+
+    private static void test(UIManager.LookAndFeelInfo laf) {
+        setLookAndFeel(laf);
+        if (UIManager.getLookAndFeel() instanceof NimbusLookAndFeel) {
+            // reset "basic" properties
+            UIManager.getDefaults().put("Label.foreground", null);
+            // set "synth - nimbus" properties
+            UIManager.getDefaults().put("Label[Enabled].textForeground", labelColor);
+        } else {
+            // reset "synth - nimbus" properties
+            UIManager.getDefaults().put("Label[Enabled].textForeground", null);
+            // set "basic" properties
+            UIManager.getDefaults().put("Label.foreground", labelColor);
+        }
+
+        JLabel label = new JLabel("\u2588 \u2588 \u2588 \u2588");
+        label.setSize(150, 30);
+
+        BufferedImage img = paintToImage(label);
+        if (!chkImgForegroundColor(img)) {
+            try {
+                ImageIO.write(img, "png", new File("Label_" + laf.getName() + ".png"));
+            } catch (IOException ignored) {}
+            throw new RuntimeException("JLabel not painted with LAF defined " +
+                    "foreground color");
+        }
+        System.out.println("Test Passed");
+    }
+
+    private static void setLookAndFeel(UIManager.LookAndFeelInfo laf) {
+        try {
+            UIManager.setLookAndFeel(laf.getClassName());
+        } catch (UnsupportedLookAndFeelException ignored) {
+            System.out.println("Unsupported LAF: " + laf.getClassName());
+        } catch (ClassNotFoundException | InstantiationException
+                 | IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static BufferedImage paintToImage(JComponent content) {
+        BufferedImage im = new BufferedImage(content.getWidth(), content.getHeight(),
+                TYPE_INT_RGB);
+        Graphics2D g = (Graphics2D) im.getGraphics();
+        g.setBackground(Color.WHITE);
+        g.clearRect(0, 0, content.getWidth(), content.getHeight());
+        content.paint(g);
+        g.dispose();
+        return im;
+    }
+
+    private static boolean chkImgForegroundColor(BufferedImage img) {
+        for (int x = 0; x < img.getWidth(); ++x) {
+            for (int y = 0; y < img.getHeight(); ++y) {
+                if (img.getRGB(x, y) == labelColor.getRGB()) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+}
diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/swing/regtesthelpers/Util.java openjdk-21-21.0.11+10/test/jdk/javax/swing/regtesthelpers/Util.java
--- openjdk-21-21.0.10+7/test/jdk/javax/swing/regtesthelpers/Util.java	2026-01-15 15:34:19.000000000 +0000
+++ openjdk-21-21.0.11+10/test/jdk/javax/swing/regtesthelpers/Util.java	2026-04-17 19:09:35.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2025, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,14 +21,32 @@
  * questions.
  */
 
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.*;
+import java.awt.AWTException;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dialog;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Robot;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
 import java.awt.image.BufferedImage;
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.Callable;
+import java.util.function.Predicate;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.SwingUtilities;
+
+import static javax.swing.SwingUtilities.isEventDispatchThread;
 
 /**
  * 

This class contains utilities useful for regression testing. @@ -123,26 +141,44 @@ } /** - * Find a sub component by class name. - * Always run this method on the EDT thread + * Find a subcomponent by class name. */ public static Component findSubComponent(Component parent, String className) { - String parentClassName = parent.getClass().getName(); + return findComponent((Container) parent, + c -> c.getClass() + .getName() + .contains(className)); + } - if (parentClassName.contains(className)) { - return parent; + /** + * Find a component based on predicate. + */ + public static Component findComponent(final Container container, + final Predicate predicate) { + try { + if (isEventDispatchThread()) { + return findComponentImpl(container, predicate); + } else { + return Util.invokeOnEDT(() -> findComponentImpl(container, predicate)); + } + } catch (Exception e) { + throw new RuntimeException("Error occurred while finding component", e); } + } - if (parent instanceof Container) { - for (Component child : ((Container) parent).getComponents()) { - Component subComponent = findSubComponent(child, className); - - if (subComponent != null) { - return subComponent; + private static Component findComponentImpl(final Container container, + final Predicate predicate) { + for (Component child : container.getComponents()) { + if (predicate.test(child)) { + return child; + } + if (child instanceof Container cont && cont.getComponentCount() > 0) { + Component result = findComponentImpl(cont, predicate); + if (result != null) { + return result; } } } - return null; } diff -Nru openjdk-21-21.0.10+7/test/jdk/javax/swing/text/html/CSS/8231286/HtmlFontSizeTest.java openjdk-21-21.0.11+10/test/jdk/javax/swing/text/html/CSS/8231286/HtmlFontSizeTest.java --- openjdk-21-21.0.10+7/test/jdk/javax/swing/text/html/CSS/8231286/HtmlFontSizeTest.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/javax/swing/text/html/CSS/8231286/HtmlFontSizeTest.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,8 +51,8 @@ htmlPane.setEditorKit(kit); String htmlString = "\n" - + "\n" - + "

This should be 16 pt.

\n" + + "\n" + + "

This should be 32 pt.

\n" + "\n" + ""; @@ -71,10 +71,16 @@ System.out.println("size with W3C:" + w3cFrameSize); System.out.println("size without W3C:" + stdFrameSize); - float ratio = (float)w3cFrameSize.width / (float)stdFrameSize.width; - System.out.println("w3cFrameSize.width/stdFrameSize.width " + ratio); + float widthRatio = (float)w3cFrameSize.width / (float)stdFrameSize.width; + System.out.println("w3cFrameSize.width/stdFrameSize.width " + widthRatio); - if (!"1.3".equals(String.format(Locale.ENGLISH, "%.1f", ratio))) { + float heightRatio = (float)w3cFrameSize.height / (float)stdFrameSize.height; + System.out.println("w3cFrameSize.height/stdFrameSize.height " + heightRatio); + + float avgRatio = (widthRatio + heightRatio) / 2.0f; + System.out.println("Average ratio of two dimensions " + avgRatio); + + if (!"1.3".equals(String.format(Locale.ENGLISH, "%.1f", avgRatio))) { throw new RuntimeException("HTML font size too large with high-DPI scaling and W3C_LENGTH_UNITS"); } } diff -Nru openjdk-21-21.0.10+7/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java openjdk-21-21.0.11+10/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java --- openjdk-21-21.0.10+7/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetricsSubgroup.java 2026-04-17 19:09:35.000000000 +0000 @@ -51,19 +51,6 @@ DockerfileConfig.getBaseImageName() + ":" + DockerfileConfig.getBaseImageVersion(); - static String getEngineInfo(String format) throws Exception { - return DockerTestUtils.execute(Container.ENGINE_COMMAND, "info", "-f", format) - .getStdout(); - } - - static boolean isRootless() throws Exception { - // Docker and Podman have different INFO structures. - // The node path for Podman is .Host.Security.Rootless, that also holds for - // Podman emulating Docker CLI. The node path for Docker is .SecurityOptions. - return (getEngineInfo("{{.Host.Security.Rootless}}").contains("true") || - getEngineInfo("{{.SecurityOptions}}").contains("name=rootless")); - } - public static void main(String[] args) throws Exception { Metrics metrics = Metrics.systemMetrics(); if (metrics == null) { @@ -77,7 +64,7 @@ ContainerRuntimeVersionTestUtils.checkContainerVersionSupported(); - if (isRootless()) { + if (DockerTestUtils.isRootless()) { throw new SkippedException("Test skipped in rootless mode"); } diff -Nru openjdk-21-21.0.10+7/test/jdk/jdk/internal/vm/Continuation/Fuzz.java openjdk-21-21.0.11+10/test/jdk/jdk/internal/vm/Continuation/Fuzz.java --- openjdk-21-21.0.10+7/test/jdk/jdk/internal/vm/Continuation/Fuzz.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/jdk/internal/vm/Continuation/Fuzz.java 2026-04-17 19:09:35.000000000 +0000 @@ -94,6 +94,9 @@ if (Platform.isPPC()) { COMPILATION_TIMEOUT = COMPILATION_TIMEOUT * 2; } + if (Platform.isDebugBuild()) { + COMPILATION_TIMEOUT = COMPILATION_TIMEOUT * 2; + } warmup(); for (int compileLevel : new int[]{4}) { for (boolean compileRun : new boolean[]{true}) { diff -Nru openjdk-21-21.0.10+7/test/jdk/jdk/jfr/event/runtime/TestBackToBackSensitive.java openjdk-21-21.0.11+10/test/jdk/jdk/jfr/event/runtime/TestBackToBackSensitive.java --- openjdk-21-21.0.10+7/test/jdk/jdk/jfr/event/runtime/TestBackToBackSensitive.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/jdk/jfr/event/runtime/TestBackToBackSensitive.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2025, 2026, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.jfr.event.runtime; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Instant; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Set; + +import jdk.jfr.Configuration; +import jdk.jfr.Event; +import jdk.jfr.Recording; +import jdk.jfr.StackTrace; +import jdk.jfr.consumer.EventStream; +import jdk.jfr.consumer.RecordedClassLoader; +import jdk.test.lib.jfr.TestClassLoader; + +/** + * @test + * @summary The test verifies that jdk.ClassLoaderStatistics and + * jdk.ThreadThreadDump are not emitted at the beginning of a chunk + * when the period is everyChunk, as is the case in default.jfc + * @requires vm.flagless + * @requires vm.hasJFR + * @library /test/lib /test/jdk + * @run main/othervm jdk.jfr.event.runtime.TestBackToBackSensitive + */ +public class TestBackToBackSensitive { + @StackTrace(false) + static class FillEvent extends Event { + String message; + } + public static Object OBJECT; + + public static void main(String... arg) throws Exception { + TestClassLoader loader = new TestClassLoader(); + Class clazz = loader.loadClass(TestBackToBackSensitive.class.getName()); + String classLoaderName = loader.getClass().getName(); + OBJECT = clazz.getDeclaredConstructor().newInstance(); + Configuration configuration = Configuration.getConfiguration("default"); + try (Recording r1 = new Recording(configuration)) { + // Start chunk 1 + r1.start(); + try (Recording r2 = new Recording()) { + // Start chunk 2 + r2.start(); + // Starts chunk 3 + r2.stop(); + } + // Start chunk 4 by filling up chunk 3 + for (int i = 0; i < 1_500_000; i++) { + FillEvent f = new FillEvent(); + f.commit(); + } + r1.stop(); + Path file = Path.of("file.jfr"); + r1.dump(file); + Set threadDumps = new LinkedHashSet<>(); + Set classLoaderStatistics = new LinkedHashSet<>(); + Set physicalMemory = new LinkedHashSet<>(); + try (EventStream es = EventStream.openFile(file)) { + es.onEvent("jdk.ThreadDump", e -> threadDumps.add(e.getStartTime())); + es.onEvent("jdk.ClassLoaderStatistics", e -> { + RecordedClassLoader cl = e.getValue("classLoader"); + if (cl != null) { + if (cl.getType().getName().equals(classLoaderName)) { + classLoaderStatistics.add(e.getStartTime()); + System.out.println("Class loader" + e); + } + } + }); + es.onEvent("jdk.PhysicalMemory", e -> physicalMemory.add(e.getStartTime())); + es.start(); + } + long chunkFiles = filesInRepository(); + System.out.println("Number of chunk files: " + chunkFiles); + // When jdk.PhysicalMemory is expected to be emitted: + // Chunk 1: begin, end + // Chunk 2: begin, end + // Chunk 3: begin, end + // Chunk 4: begin, end + assertCount("jdk.PhysicalMemory", physicalMemory, 2 * chunkFiles); + // When jdk.ClassLoaderStatistics and jdk.ThreadThreadDump are expected to be + // emitted: + // Chunk 1: begin, end + // Chunk 2: begin, end + // Chunk 3: end + // Chunk 4: end + assertCount("jdk.ThreadDump", threadDumps, 2 + 2 + (chunkFiles - 2)); + assertCount("jdk.ClassLoaderStatistics", classLoaderStatistics, 2 + 2 + (chunkFiles - 2)); + } + } + + private static long filesInRepository() throws IOException { + Path repository = Path.of(System.getProperty("jdk.jfr.repository")); + return Files.list(repository).filter(p -> p.toString().endsWith(".jfr")).count(); + } + + private static void assertCount(String eventName, Set timestamps, long expected) throws Exception { + System.out.println("Timestamps for " + eventName + ":"); + for (Instant timestamp : timestamps) { + System.out.println(timestamp); + } + int count = timestamps.size(); + if (count != expected) { + throw new Exception("Expected " + expected + " timestamps for event " + eventName + ", but got " + count); + } + } +} diff -Nru openjdk-21-21.0.10+7/test/jdk/jdk/nio/zipfs/TestPosix.java openjdk-21-21.0.11+10/test/jdk/jdk/nio/zipfs/TestPosix.java --- openjdk-21-21.0.10+7/test/jdk/jdk/nio/zipfs/TestPosix.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/jdk/nio/zipfs/TestPosix.java 2026-04-17 19:09:35.000000000 +0000 @@ -66,7 +66,7 @@ import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; -/** +/* * @test * @bug 8213031 8273935 * @summary Test POSIX ZIP file operations. @@ -697,7 +697,7 @@ delTree(UNZIP_DIR); Files.createDirectory(UNZIP_DIR); File targetDir = UNZIP_DIR.toFile(); - try (JarFile jf = new JarFile(ZIP_FILE.toFile())) { + try (JarFile jf = new JarFile(JAR_FILE.toFile())) { Enumeration zenum = jf.entries(); while (zenum.hasMoreElements()) { JarEntry ze = zenum.nextElement(); diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/java2d/marlin/ClipShapeTest.java openjdk-21-21.0.11+10/test/jdk/sun/java2d/marlin/ClipShapeTest.java --- openjdk-21-21.0.10+7/test/jdk/sun/java2d/marlin/ClipShapeTest.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/java2d/marlin/ClipShapeTest.java 2026-04-17 19:09:35.000000000 +0000 @@ -154,13 +154,12 @@ static final AtomicBoolean isMarlin = new AtomicBoolean(); static final AtomicBoolean isClipRuntime = new AtomicBoolean(); + static final Logger log = Logger.getLogger("sun.java2d.marlin"); + static { Locale.setDefault(Locale.US); // FIRST: Get Marlin runtime state from its log: - - // initialize j.u.l Looger: - final Logger log = Logger.getLogger("sun.java2d.marlin"); log.addHandler(new Handler() { @Override public void publish(LogRecord record) { diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/krb5/NullStringToKey.java openjdk-21-21.0.11+10/test/jdk/sun/security/krb5/NullStringToKey.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/krb5/NullStringToKey.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/krb5/NullStringToKey.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8343622 + * @summary KerberosKey created with null key bytes + * @run main/othervm NullStringToKey + */ + +import javax.security.auth.kerberos.KerberosKey; +import javax.security.auth.kerberos.KerberosPrincipal; +import java.security.Security; +import java.util.List; + +public class NullStringToKey { + public static void main(String[] args) throws Exception { + + Security.removeProvider("SUN"); + Security.removeProvider("SunJCE"); + + var name = new KerberosPrincipal("me@ME.COM"); + var pass = "password".toCharArray(); + for (var alg : List.of( + "aes128-cts-hmac-sha1-96", "aes256-cts-hmac-sha1-96", + "aes128-cts-hmac-sha256-128", "aes256-cts-hmac-sha384-192")) { + System.out.println(alg); + // Do not use Utils.runAndCheckException as it might call + // MessageDigest.getInstance("MD5") at class initialization + // and we have already removed the SUN provider. + try { + new KerberosKey(name, pass, alg); + throw new RuntimeException("Didn't get expected exception"); + } catch (IllegalArgumentException e) { + // expected + System.out.println(e); + } + } + } +} diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/krb5/RFC396xTest.java openjdk-21-21.0.11+10/test/jdk/sun/security/krb5/RFC396xTest.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/krb5/RFC396xTest.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/krb5/RFC396xTest.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,6 +52,7 @@ public static void main(String[] args) throws Exception { System.setProperty("sun.security.krb5.msinterop.des.s2kcharset", "utf-8"); + DkCrypto.ALLOW_WEAK_PBKDF2_ITERATION_COUNT = true; test(); } diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/krb5/auto/DiffSaltParams.java openjdk-21-21.0.11+10/test/jdk/sun/security/krb5/auto/DiffSaltParams.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/krb5/auto/DiffSaltParams.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/krb5/auto/DiffSaltParams.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,11 +38,11 @@ OneKDC kdc = new OneKDC(null).writeJAASConf(); kdc.addPrincipal("user1", "user1pass".toCharArray(), - "hello", new byte[]{0, 0, 1, 0}); + "hello", new byte[]{0, 1, 0, 0}); kdc.addPrincipal("user2", "user2pass".toCharArray(), "hello", null); kdc.addPrincipal("user3", "user3pass".toCharArray(), - null, new byte[]{0, 0, 1, 0}); + null, new byte[]{0, 1, 0, 0}); kdc.addPrincipal("user4", "user4pass".toCharArray()); Context.fromUserPass("user1", "user1pass".toCharArray(), true); diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/krb5/auto/KDC.java openjdk-21-21.0.11+10/test/jdk/sun/security/krb5/auto/KDC.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/krb5/auto/KDC.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/krb5/auto/KDC.java 2026-04-17 19:09:35.000000000 +0000 @@ -362,11 +362,12 @@ name.indexOf('/') < 0 ? PrincipalName.KRB_NT_UNKNOWN : PrincipalName.KRB_NT_SRV_HST); - ktab.addEntry(pn, - getSalt(pn), - pass, - kvno, - true); + int[] etypes = EType.getDefaults("default_tkt_enctypes"); + EncryptionKey[] keys = new EncryptionKey[etypes.length]; + for (int i = 0; i < etypes.length; i++) { + keys[i] = keyForUser(pn, etypes[i], false); + } + ktab.addEntry(pn, keys, kvno, true); } else { nativeKdc.ktadd(name, tab); } @@ -667,10 +668,7 @@ */ private char[] getPassword(PrincipalName p, boolean server) throws KrbException { - String pn = p.toString(); - if (p.getRealmString() == null) { - pn = pn + "@" + getRealm(); - } + String pn = nameOf(p); char[] pass = passwords.get(pn); if (pass == null) { throw new KrbException(server? @@ -686,10 +684,7 @@ * @return the salt */ protected String getSalt(PrincipalName p) { - String pn = p.toString(); - if (p.getRealmString() == null) { - pn = pn + "@" + getRealm(); - } + String pn = nameOf(p); if (salts.containsKey(pn)) { return salts.get(pn); } @@ -721,10 +716,7 @@ case EncryptedData.ETYPE_AES256_CTS_HMAC_SHA1_96: case EncryptedData.ETYPE_AES128_CTS_HMAC_SHA256_128: case EncryptedData.ETYPE_AES256_CTS_HMAC_SHA384_192: - String pn = p.toString(); - if (p.getRealmString() == null) { - pn = pn + "@" + getRealm(); - } + String pn = nameOf(p); if (s2kparamses.containsKey(pn)) { return s2kparamses.get(pn); } @@ -739,6 +731,23 @@ } /** + * Returns the name of a PrincipalName inside KDC dbs. + * @param p the principal name + * @return the name + */ + private String nameOf(PrincipalName p) { + String pn = p.toString(); + if (p.getRealmString() == null) { + pn = pn + "@" + getRealm(); + } + if (pn.startsWith("krbtgt/")) { + // We always register krbtgt using REALM + pn = "krbtgt/" + pn.substring(7).toUpperCase(Locale.ROOT); + } + return pn; + } + + /** * Returns the key for a given principal of the given encryption type * @param p the principal * @param etype the encryption type diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/krb5/auto/UserIterCount.java openjdk-21-21.0.11+10/test/jdk/sun/security/krb5/auto/UserIterCount.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/krb5/auto/UserIterCount.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/krb5/auto/UserIterCount.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8370615 + * @summary Improve Kerberos credentialing + * @library /test/lib + * @compile -XDignore.symbol.file UserIterCount.java + * @run main jdk.test.lib.FileInstaller TestHosts TestHosts + * @run main/othervm -Djdk.net.hosts.file=TestHosts UserIterCount + */ +import sun.security.krb5.PrincipalName; + +public class UserIterCount { + + static class MyKDC extends OneKDC { + public MyKDC() throws Exception { + super(null); + } + + @Override + protected byte[] getParams(PrincipalName p, int etype) { + if (etype == 18) { + if (p.toString().startsWith(OneKDC.USER)) { + return new byte[]{0, 0, 16, 01}; + } else { + return new byte[]{0, 79, (byte)255, (byte)255}; + } + } else { + return super.getParams(p, etype); + } + } + } + + public static void main(String[] args) throws Exception { + new MyKDC().writeJAASConf(); + Context.fromUserPass(OneKDC.USER, OneKDC.PASS, false); + Context.fromUserPass(OneKDC.USER2, OneKDC.PASS2, false); + } +} diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/pkcs11/Cipher/TestDisabledAlgorithms.java openjdk-21-21.0.11+10/test/jdk/sun/security/pkcs11/Cipher/TestDisabledAlgorithms.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/pkcs11/Cipher/TestDisabledAlgorithms.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/pkcs11/Cipher/TestDisabledAlgorithms.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8244336 + * @summary Test JCE layer algorithm restriction + * @library /test/lib .. + * @run main/othervm TestDisabledAlgorithms sm CiPhEr.RSA/ECB/PKCS1Padding true + * @run main/othervm TestDisabledAlgorithms sm cIpHeR.rsA true + * @run main/othervm TestDisabledAlgorithms sm Cipher.what false + * @run main/othervm TestDisabledAlgorithms sm CiPhER.RSA/ECB/PKCS1Padding2 false + */ +import java.util.List; +import java.security.NoSuchAlgorithmException; +import java.security.Provider; +import java.security.Security; +import javax.crypto.Cipher; +import javax.crypto.NoSuchPaddingException; +import jdk.test.lib.Utils; + +public class TestDisabledAlgorithms extends PKCS11Test { + + boolean shouldThrow; + + TestDisabledAlgorithms(boolean shouldThrow) { + this.shouldThrow = shouldThrow; + } + + private static final String PROP_NAME = "jdk.crypto.disabledAlgorithms"; + + private static void test(String alg, Provider p, boolean shouldThrow) + throws Exception { + System.out.println("Testing " + p.getName() + ": " + alg + + ", shouldThrow=" + shouldThrow); + if (shouldThrow) { + Utils.runAndCheckException(() -> Cipher.getInstance(alg, p), + NoSuchAlgorithmException.class); + } else { + Cipher c = Cipher.getInstance(alg, p); + System.out.println("Got cipher w/ algo " + c.getAlgorithm()); + } + } + + @Override + public void main(Provider p) throws Exception { + for (String a : List.of("RSA/ECB/PKCS1Padding", "RSA")) { + test(a, p, shouldThrow); + } + System.out.println("Done"); + } + + public static void main(String[] args) throws Exception { + String propValue = args[1]; + System.out.println("Setting Security Prop " + PROP_NAME + " = " + + propValue); + Security.setProperty(PROP_NAME, propValue); + boolean shouldThrow = Boolean.valueOf(args[2]); + main(new TestDisabledAlgorithms(shouldThrow), args); + } +} diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/pkcs11/Signature/TestNONEwithRSA.java openjdk-21-21.0.11+10/test/jdk/sun/security/pkcs11/Signature/TestNONEwithRSA.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/pkcs11/Signature/TestNONEwithRSA.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/pkcs11/Signature/TestNONEwithRSA.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +import java.security.*; +import java.security.interfaces.*; +import java.security.spec.*; +import java.util.stream.IntStream; +import jtreg.SkippedException; + +/** + * @test + * @bug 8244336 + * @summary Test the NONEwithRSA signature refactoring for JCE layer + * algorithm restriction + * @library /test/lib .. + * @modules jdk.crypto.cryptoki + */ +public class TestNONEwithRSA extends PKCS11Test { + + private static final String SIGALG = "NONEwithRSA"; + + private static final int[] KEYSIZES = { 2048, 3072 }; + private static final byte[] DATA = generateData(100); + + public static void main(String[] args) throws Exception { + main(new TestNONEwithRSA(), args); + } + + @Override + public void main(Provider p) throws Exception { + try { + Signature.getInstance(SIGALG, p); + } catch (NoSuchAlgorithmException nsae) { + throw new SkippedException("Skip due to no support for " + SIGALG); + } + + for (int kSize : KEYSIZES) { + System.out.println("[KEYSIZE = " + kSize + "]"); + KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", p); + kpg.initialize(kSize); + KeyPair kp = kpg.generateKeyPair(); + PrivateKey privKey = kp.getPrivate(); + PublicKey pubKey = kp.getPublic(); + checkSignature(p, DATA, pubKey, privKey); + } + } + + private static void checkSignature(Provider p, byte[] data, PublicKey pub, + PrivateKey priv) + throws NoSuchAlgorithmException, InvalidKeyException, + SignatureException, NoSuchProviderException, + InvalidAlgorithmParameterException { + + Signature sig = Signature.getInstance(SIGALG, p); + sig.initSign(priv); + + sig.update(data); + byte[] signedData = sig.sign(); + + // Make sure signature verifies with original data + sig.initVerify(pub); + sig.update(data); + if (!sig.verify(signedData)) { + throw new RuntimeException("Failed to verify signature"); + } + + // Make sure signature does NOT verify when the original data + // has changed + sig.initVerify(pub); + sig.update(data); + sig.update(data); + if (sig.verify(signedData)) { + throw new RuntimeException("Failed to detect bad signature"); + } + System.out.println(" => Passed"); + } +} diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTClient.java openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTClient.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTClient.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTClient.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @library /test/lib + * @library /javax/net/ssl/templates + * @bug 8242008 + * @summary Verifies multiple PSKs are used by JSSE + * @run main/othervm MultiNSTClient -Djdk.tls.client.protocols=TLSv1.3 -Djdk.tls.server.newSessionTicketCount=1 + * @run main/othervm MultiNSTClient -Djdk.tls.client.protocols=TLSv1.3 -Djdk.tls.server.newSessionTicketCount=3 + * @run main/othervm MultiNSTClient -Djdk.tls.client.protocols=TLSv1.3 -Djdk.tls.server.newSessionTicketCount=10 + * @run main/othervm MultiNSTClient -Djdk.tls.client.protocols=TLSv1.3 -Djdk.tls.server.enableSessionTicketExtension=true -Djdk.tls.client.enableSessionTicketExtension=true + * @run main/othervm MultiNSTClient -Djdk.tls.client.protocols=TLSv1.3 -Djdk.tls.server.enableSessionTicketExtension=false -Djdk.tls.client.enableSessionTicketExtension=true + * @run main/othervm MultiNSTClient -Djdk.tls.client.protocols=TLSv1.3 -Djdk.tls.server.enableSessionTicketExtension=true -Djdk.tls.client.enableSessionTicketExtension=false + * @run main/othervm MultiNSTClient -Djdk.tls.client.protocols=TLSv1.3 -Djdk.tls.server.enableSessionTicketExtension=false -Djdk.tls.client.enableSessionTicketExtension=false + * @run main/othervm MultiNSTClient -Djdk.tls.client.protocols=TLSv1.2 -Djdk.tls.server.enableSessionTicketExtension=true -Djdk.tls.client.enableSessionTicketExtension=true + */ + +import jdk.test.lib.Utils; +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +import javax.net.ssl.SSLSession; +import java.util.Arrays; +import java.util.HexFormat; +import java.util.List; + +/** + * This test verifies that multiple NSTs and PSKs are sent by a JSSE server. + * Then JSSE client is able to store them all and resume the connection. It + * requires specific text in the TLS debugging to verify the success. + */ + +public class MultiNSTClient { + + static HexFormat hex = HexFormat.of(); + + public static void main(String[] args) throws Exception { + + if (!args[0].equalsIgnoreCase("p")) { + StringBuilder sb = new StringBuilder(); + Arrays.stream(args).forEach(a -> { + sb.append(a); + sb.append(" "); + }); + String params = sb.toString(); + System.setProperty("test.java.opts", + "-Dtest.src=" + System.getProperty("test.src") + + " -Dtest.jdk=" + System.getProperty("test.jdk") + + " -Dtest.root=" + System.getProperty("test.root") + + " -Djavax.net.debug=ssl,handshake " + params + ); + + boolean TLS13 = args[0].contains("1.3"); + + System.out.println("test.java.opts: " + + System.getProperty("test.java.opts")); + + ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder( + Utils.addTestJavaOpts("MultiNSTClient", "p")); + + OutputAnalyzer output = ProcessTools.executeProcess(pb); + boolean pass = true; + try { + List list = output.stderrShouldContain("MultiNST PSK"). + asLines().stream().filter(s -> + s.contains("MultiNST PSK")).toList(); + List serverPSK = list.stream().filter(s -> + s.contains("MultiNST PSK (Server)")).toList(); + List clientPSK = list.stream().filter(s -> + s.contains("MultiNST PSK (Client)")).toList(); + System.out.println("found list: " + list.size()); + System.out.println("found server: " + serverPSK.size()); + serverPSK.stream().forEach(s -> System.out.println("\t" + s)); + System.out.println("found client: " + clientPSK.size()); + clientPSK.stream().forEach(s -> System.out.println("\t" + s)); + for (int i = 0; i < 2; i++) { + String svr = serverPSK.getFirst(); + String cli = clientPSK.getFirst(); + if (svr.regionMatches(svr.length() - 16, cli, + cli.length() - 16, 16)) { + System.out.println("entry " + (i + 1) + " match."); + } else { + System.out.println("entry " + (i + 1) + + " server and client PSK didn't match:"); + System.out.println(" server: " + svr); + System.out.println(" client: " + cli); + pass = false; + } + } + } catch (RuntimeException e) { + System.out.println("No MultiNST PSK found."); + pass = false; + } + + if (TLS13) { + if (!pass) { + throw new Exception("Test failed: " + params); + } + } else { + if (pass) { + throw new Exception("Test failed: " + params); + } + } + System.out.println("Test Passed"); + return; + } + + TLSBase.Server server = new TLSBase.Server(); + server.serverLatch.await(); + System.out.println("------ Server ready, starting original client."); + TLSBase.Client initial = new TLSBase.Client(); + SSLSession initialSession = initial.connect().getSession(); + System.out.println("id = " + hex.formatHex(initialSession.getId())); + System.out.println("session = " + initialSession); + + System.out.println("------ getNewSession from original client"); + TLSBase.Client resumClient = new TLSBase.Client(initial); + SSLSession resumption = resumClient.connect().getSession(); + System.out.println("id = " + hex.formatHex(resumption.getId())); + System.out.println("session = " + resumption); + if (!initialSession.toString().equalsIgnoreCase(resumption.toString())) { + throw new Exception("Resumed session did not match"); + } + + System.out.println("------ Second getNewSession from original client"); + TLSBase.Client resumClient2 = new TLSBase.Client(initial); + resumption = resumClient2.connect().getSession(); + System.out.println("id = " + hex.formatHex(resumption.getId())); + System.out.println("session = " + resumption); + if (!initialSession.toString().equalsIgnoreCase(resumption.toString())) { + throw new Exception("Resumed session did not match"); + } + + System.out.println("------ New client connection"); + TLSBase.Client newConnection = new TLSBase.Client(); + SSLSession newSession = newConnection.connect().getSession(); + System.out.println("id = " + hex.formatHex(newSession.getId())); + System.out.println("session = " + newSession); + if (initialSession.toString().equalsIgnoreCase(newSession.toString())) { + throw new Exception("new session is the same as the initial."); + } + + System.out.println("------ Closing connections"); + initial.close(); + resumClient.close(); + resumClient2.close(); + newConnection.close(); + server.close(); + System.out.println("------ End"); + System.exit(0); + } +} diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTNoSessionCreation.java openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTNoSessionCreation.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTNoSessionCreation.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTNoSessionCreation.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @library /test/lib + * @library /javax/net/ssl/templates + * @bug 8242008 + * @summary Verifies resumption fails with 0 NSTs and session creation off + * @run main/othervm MultiNSTNoSessionCreation -Djdk.tls.client.protocols=TLSv1.3 -Djdk.tls.server.newSessionTicketCount=0 + * @run main/othervm MultiNSTNoSessionCreation -Djdk.tls.client.protocols=TLSv1.2 -Djdk.tls.server.newSessionTicketCount=0 + */ + +import jdk.test.lib.Utils; +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +import java.util.Arrays; + +/** + * With no NSTs sent by the server, try to resume the session with + * setEnabledSessionCreation(false). The test should get an exception and + * fail to connect. + */ + +public class MultiNSTNoSessionCreation { + + public static void main(String[] args) throws Exception { + + if (!args[0].equalsIgnoreCase("p")) { + StringBuilder sb = new StringBuilder(); + Arrays.stream(args).forEach(a -> sb.append(a).append(" ")); + String params = sb.toString(); + System.setProperty("test.java.opts", + "-Dtest.src=" + System.getProperty("test.src") + + " -Dtest.jdk=" + System.getProperty("test.jdk") + + " -Dtest.root=" + System.getProperty("test.root") + + " -Djavax.net.debug=ssl,handshake " + params); + + System.out.println("test.java.opts: " + + System.getProperty("test.java.opts")); + + ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder( + Utils.addTestJavaOpts("MultiNSTNoSessionCreation", "p")); + + OutputAnalyzer output = ProcessTools.executeProcess(pb); + try { + if (output.stderrContains( + "(PROTOCOL_VERSION): New session creation is disabled")) { + return; + } + } catch (RuntimeException e) { + throw new Exception("Error collecting data", e); + } + throw new Exception("Disabled creation msg not found"); + } + + TLSBase.Server server = new TLSBase.Server(); + server.serverLatch.await(); + System.out.println("------ Server ready, starting initial client."); + TLSBase.Client initial = new TLSBase.Client(); + initial.connect(); + System.out.println( + "------ Resume client w/ setEnableSessionCreation set to false"); + TLSBase.Client resumClient = new TLSBase.Client(initial); + resumClient.socket.setEnableSessionCreation(false); + resumClient.connect(); + + System.out.println("------ Closing connections"); + initial.close(); + resumClient.close(); + server.close(); + System.out.println("------ End"); + System.exit(0); + } +} diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTParallel.java openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTParallel.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTParallel.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTParallel.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @library /test/lib + * @library /javax/net/ssl/templates + * @bug 8242008 + * @summary Verifies multiple PSKs are used by TLSv1.3 + * @run main/othervm MultiNSTParallel 10 -Djdk.tls.client.protocols=TLSv1.3 + */ + +import jdk.test.lib.Utils; +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +import javax.net.ssl.SSLSession; +import java.util.ArrayList; +import java.util.HexFormat; +import java.util.List; +import java.util.concurrent.CountDownLatch; + +/** + * This test verifies that parallel resumption connections successfully get + * a PSK entry and not initiate a full handshake. + * + * Note: THe first argument after 'MultiNSTParallel' is the ticket count + * The test will set 'jdk.tls.server.NewSessionTicketCount` to that number and + * will start the same number of resumption client attempts. The ticket count + * must be the same or larger than resumption attempts otherwise the queue runs + * empty and the test will fail. + * + * Because this test runs parallel connections, the thread order finish is not + * guaranteed. Each client NST id is checked with all server NSTs ids until + * a match is found. When a match is found, it is removed from the list to + * verify no NST was used more than once. + * + * TLS 1.2 spec does not specify multiple NST behavior. + */ + +public class MultiNSTParallel { + + static HexFormat hex = HexFormat.of(); + final static CountDownLatch wait = new CountDownLatch(1); + + static class ClientThread extends Thread { + TLSBase.Client client; + + ClientThread(TLSBase.Client c) { + client = c; + } + + public void run() { + String name = Thread.currentThread().getName(); + SSLSession r; + System.err.println(name + " is ready"); + try { + wait.await(); + r = new TLSBase.Client(client).connect().getSession(); + } catch (Exception e) { + throw new RuntimeException(name + ": " +e); + } + StringBuffer sb = new StringBuffer(100); + sb.append("(").append(name).append(") id = "); + sb.append(hex.formatHex(r.getId())); + sb.append("\n(").append(name).append(") session = ").append(r); + System.err.println(sb); + if (!client.getSession().toString().equalsIgnoreCase(r.toString())) { + throw new RuntimeException("(" + name + + ") Resumed session did not match"); + } + } + } + + static boolean pass = true; + + public static void main(String[] args) throws Exception { + + if (!args[0].equalsIgnoreCase("p")) { + int ticketCount = Integer.parseInt(args[0]); + StringBuilder sb = new StringBuilder(); + for (int i = 1; i < args.length; i++) { + sb.append(" ").append(args[i]); + } + String params = sb.toString(); + System.setProperty("test.java.opts", + "-Dtest.src=" + System.getProperty("test.src") + + " -Dtest.jdk=" + System.getProperty("test.jdk") + + " -Dtest.root=" + System.getProperty("test.root") + + " -Djavax.net.debug=ssl,handshake " + + " -Djdk.tls.server.newSessionTicketCount=" + ticketCount + + params); + + boolean TLS13 = args[1].contains("1.3"); + + System.out.println("test.java.opts: " + + System.getProperty("test.java.opts")); + + ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder( + Utils.addTestJavaOpts("MultiNSTParallel", "p")); + + OutputAnalyzer output = ProcessTools.executeProcess(pb); + try { + List list = output.stderrShouldContain("MultiNST PSK"). + asLines().stream().filter(s -> + s.contains("MultiNST PSK")).toList(); + List sp = list.stream().filter(s -> + s.contains("MultiNST PSK (Server)")).toList(); + List serverPSK = new ArrayList<>(sp.stream().toList()); + List clientPSK = list.stream().filter(s -> + s.contains("MultiNST PSK (Client)")).toList(); + System.out.println("found list: " + list.size()); + System.out.println("found server: " + serverPSK.size()); + serverPSK.stream().forEach(s -> System.out.println("\t" + s)); + System.out.println("found client: " + clientPSK.size()); + clientPSK.stream().forEach(s -> System.out.println("\t" + s)); + if (list.size() == 0 || serverPSK.size() == 0) { + throw new Exception("Error setting up test. No server " + + "PSKs found in debug log."); + } + if (clientPSK.size() == 0) { + throw new Exception("Error setting up test. No " + + "client PSKs found in debug log."); + } + // Must search all results as order is not guaranteed. + clientPSK.stream().forEach(cli -> { + for (int i = 0; i < serverPSK.size(); i++) { + String svr = serverPSK.get(i); + if (svr.regionMatches(svr.length() - 16, cli, + cli.length() - 16, 16)) { + System.out.println("entry " + (i + 1) + " match."); + serverPSK.remove(i); + return; + } + } + System.out.println("client entry (" + cli.substring(0, 16) + + ") not found in server list"); + pass = false; + }); + } catch (RuntimeException e) { + System.out.println("Error looking at PSK results."); + throw new Exception(e); + } + + if (TLS13) { + if (!pass) { + throw new Exception("Test failed: " + params); + } + } else { + if (pass) { + throw new Exception("Test failed: " + params); + } + } + System.out.println("Test Passed"); + return; + } + + int ticketCount = Integer.parseInt( + System.getProperty("jdk.tls.server.newSessionTicketCount")); + + TLSBase.Server server = new TLSBase.Server(); + server.serverLatch.await(); + System.out.println("------ Server ready, starting initial client."); + TLSBase.Client initialClient = new TLSBase.Client(); + SSLSession initialSession = initialClient.connect().getSession(); + System.out.println("id = " + hex.formatHex(initialSession.getId())); + System.out.println("session = " + initialSession); + System.out.println("------ Initial client context ready."); + + ArrayList slist = new ArrayList<>(ticketCount); + + System.out.println("Client count = " + ticketCount); + for (int i = 0; ticketCount > i; i++) { + Thread t = new ClientThread(initialClient); + t.setName("client " + i); + slist.add(t); + t.start(); + } + + wait.countDown(); + for (Thread t : slist) { + t.join(1000); + System.err.println("released: " + t.getName()); + } + + System.out.println("------ Closing connections"); + initialClient.close(); + server.close(); + System.out.println("------ End"); + System.exit(0); + } +} diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTSequence.java openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTSequence.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTSequence.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/SSLSessionImpl/MultiNSTSequence.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @library /test/lib + * @library /javax/net/ssl/templates + * @bug 8242008 + * @summary Verifies sequence of used NST entries from the cache queue. + * @run main/othervm MultiNSTSequence -Djdk.tls.server.newSessionTicketCount=2 + */ + +import jdk.test.lib.Utils; +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +import javax.net.ssl.SSLSession; +import java.util.Arrays; +import java.util.HexFormat; +import java.util.List; + +/** + * This test verifies that multiple NSTs take the oldest PSK from the + * QueueCacheEntry stored in the TLS Session Cache. + * + * Note: Beyond 9 iterations the PSK id verification code becomes complicated + * with a QueueCacheEntry limit set to retain only the 10 newest entries. + * + * TLS 1.2 spec does not specify multiple NST behavior. + */ + +public class MultiNSTSequence { + + static HexFormat hex = HexFormat.of(); + static final int ITERATIONS = 9; + + public static void main(String[] args) throws Exception { + + if (!args[0].equalsIgnoreCase("p")) { + StringBuilder sb = new StringBuilder(); + Arrays.stream(args).forEach(a -> sb.append(a).append(" ")); + String params = sb.toString(); + System.setProperty("test.java.opts", + "-Dtest.src=" + System.getProperty("test.src") + + " -Dtest.jdk=" + System.getProperty("test.jdk") + + " -Dtest.root=" + System.getProperty("test.root") + + " -Djavax.net.debug=ssl,handshake " + params); + + System.out.println("test.java.opts: " + + System.getProperty("test.java.opts")); + + ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder( + Utils.addTestJavaOpts("MultiNSTSequence", "p")); + + OutputAnalyzer output = ProcessTools.executeProcess(pb); + boolean pass = true; + try { + List list = output.stderrShouldContain("MultiNST PSK"). + asLines().stream().filter(s -> + s.contains("MultiNST PSK")).toList(); + List serverPSK = list.stream().filter(s -> + s.contains("MultiNST PSK (Server)")).toList(); + List clientPSK = list.stream().filter(s -> + s.contains("MultiNST PSK (Client)")).toList(); + System.out.println("found list: " + list.size()); + System.out.println("found server: " + serverPSK.size()); + serverPSK.stream().forEach(s -> System.out.println("\t" + s)); + System.out.println("found client: " + clientPSK.size()); + clientPSK.stream().forEach(s -> System.out.println("\t" + s)); + int i; + for (i = 0; i < ITERATIONS; i++) { + String svr = serverPSK.get(i); + String cli = clientPSK.get(i); + if (svr.regionMatches(svr.length() - 16, cli, cli.length() - 16, 16)) { + System.out.println("entry " + (i + 1) + " match."); + } else { + System.out.println("entry " + (i + 1) + " server and client PSK didn't match:"); + System.out.println(" server: " + svr); + System.out.println(" client: " + cli); + pass = false; + } + } + } catch (RuntimeException e) { + System.out.println("Server and Client PSK usage order is not" + + " the same."); + pass = false; + } + + if (!pass) { + throw new Exception("Test failed: " + params); + } + System.out.println("Test Passed"); + return; + } + + TLSBase.Server server = new TLSBase.Server(); + server.serverLatch.await(); + System.out.println("------ Server ready, starting initial client."); + TLSBase.Client initial = new TLSBase.Client(); + + SSLSession initialSession = initial.connect().getSession(); + System.out.println("id = " + hex.formatHex(initialSession.getId())); + System.out.println("session = " + initialSession); + + System.out.println("------ Resume client"); + for (int i = 0; i < ITERATIONS; i++) { + SSLSession r = new TLSBase.Client(initial).connect().getSession(); + StringBuilder sb = new StringBuilder(100); + sb.append("Iteration: ").append(i); + sb.append("\tid = ").append(hex.formatHex(r.getId())); + sb.append("\tsession = ").append(r); + System.out.println(sb); + if (!initialSession.toString().equalsIgnoreCase(r.toString())) { + throw new Exception("Resumed session did not match"); + } + } + + System.out.println("------ Closing connections"); + initial.close(); + server.close(); + System.out.println("------ End"); + System.exit(0); + } +} diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/SSLSessionImpl/ResumeChecksClient.java openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/SSLSessionImpl/ResumeChecksClient.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/SSLSessionImpl/ResumeChecksClient.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/SSLSessionImpl/ResumeChecksClient.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8206929 8212885 + * @bug 8206929 8212885 8333857 * @summary ensure that client only resumes a session if certain properties * of the session are compatible with the new connection * @library /javax/net/ssl/templates @@ -47,6 +47,9 @@ import java.security.*; import java.net.*; import java.util.*; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public class ResumeChecksClient extends SSLContextTemplate { enum TestMode { @@ -56,49 +59,60 @@ CIPHER_SUITE, SIGNATURE_SCHEME } + static TestMode testMode; public static void main(String[] args) throws Exception { - new ResumeChecksClient(TestMode.valueOf(args[0])).run(); + testMode = TestMode.valueOf(args[0]); + new ResumeChecksClient().test(); } - private final TestMode testMode; - public ResumeChecksClient(TestMode mode) { - this.testMode = mode; - } - - private void run() throws Exception { - Server server = startServer(); - server.signal(); + private void test() throws Exception { + Server server = new Server(); SSLContext sslContext = createClientSSLContext(); - while (!server.started) { - Thread.yield(); - } - SSLSession firstSession = connect(sslContext, server.port, testMode, false); + HexFormat hex = HexFormat.of(); + long firstStartTime = System.currentTimeMillis(); + SSLSession firstSession = connect(sslContext, server.port, true); + System.err.println("firstStartTime = " + firstStartTime); + System.err.println("firstId = " + hex.formatHex(firstSession.getId())); + System.err.println("firstSession.getCreationTime() = " + + firstSession.getCreationTime()); - server.signal(); long secondStartTime = System.currentTimeMillis(); - Thread.sleep(10); - SSLSession secondSession = connect(sslContext, server.port, testMode, true); - - server.go = false; - server.signal(); + SSLSession secondSession = connect(sslContext, server.port, false); + System.err.println("secondStartTime = " + secondStartTime); + // Note: Ids will never match with TLS 1.3 due to spec + System.err.println("secondId = " + hex.formatHex(secondSession.getId())); + System.err.println("secondSession.getCreationTime() = " + + secondSession.getCreationTime()); switch (testMode) { case BASIC: // fail if session is not resumed - checkResumedSession(firstSession, secondSession); + try { + checkResumedSession(firstSession, secondSession); + } catch (Exception e) { + throw new AssertionError("secondSession did not resume: FAIL", + e); + } + System.out.println("secondSession used resumption: PASS"); break; case VERSION_2_TO_3: case VERSION_3_TO_2: case CIPHER_SUITE: case SIGNATURE_SCHEME: // fail if a new session is not created - if (secondSession.getCreationTime() <= secondStartTime) { - throw new RuntimeException("Existing session was used"); + try { + checkResumedSession(firstSession, secondSession); + System.err.println("firstSession = " + firstSession); + System.err.println("secondSession = " + secondSession); + throw new AssertionError("Second connection should not " + + "have resumed first session: FAIL"); + } catch (Exception e) { + System.out.println("secondSession didn't use resumption: PASS"); } break; default: - throw new RuntimeException("unknown mode: " + testMode); + throw new AssertionError("unknown mode: " + testMode); } } @@ -134,51 +148,29 @@ } private static SSLSession connect(SSLContext sslContext, int port, - TestMode mode, boolean second) { + boolean first) { try { SSLSocket sock = (SSLSocket) sslContext.getSocketFactory().createSocket(); SSLParameters params = sock.getSSLParameters(); - switch (mode) { - case BASIC: - // do nothing to ensure resumption works - break; - case VERSION_2_TO_3: - if (second) { - params.setProtocols(new String[] {"TLSv1.3"}); - } else { - params.setProtocols(new String[] {"TLSv1.2"}); - } - break; - case VERSION_3_TO_2: - if (second) { - params.setProtocols(new String[] {"TLSv1.2"}); - } else { - params.setProtocols(new String[] {"TLSv1.3"}); - } - break; - case CIPHER_SUITE: - if (second) { - params.setCipherSuites( - new String[] {"TLS_AES_256_GCM_SHA384"}); - } else { - params.setCipherSuites( - new String[] {"TLS_AES_128_GCM_SHA256"}); - } - break; - case SIGNATURE_SCHEME: - AlgorithmConstraints constraints = - params.getAlgorithmConstraints(); - if (second) { - params.setAlgorithmConstraints(new NoSig("ecdsa")); - } else { - params.setAlgorithmConstraints(new NoSig("rsa")); - } - break; - default: - throw new RuntimeException("unknown mode: " + mode); + switch (testMode) { + case BASIC -> {} // do nothing + case VERSION_2_TO_3 -> params.setProtocols(new String[]{ + first ? "TLSv1.2" : "TLSv1.3"}); + case VERSION_3_TO_2 -> params.setProtocols(new String[]{ + first ? "TLSv1.3" : "TLSv1.2"}); + case CIPHER_SUITE -> params.setCipherSuites( + new String[]{ + first ? "TLS_AES_128_GCM_SHA256" : + "TLS_AES_256_GCM_SHA384"}); + case SIGNATURE_SCHEME -> + params.setAlgorithmConstraints(new NoSig( + first ? "rsa" : "ecdsa")); + default -> + throw new AssertionError("unknown mode: " + + testMode); } sock.setSSLParameters(params); sock.connect(new InetSocketAddress("localhost", port)); @@ -195,7 +187,7 @@ return result; } catch (Exception ex) { // unexpected exception - throw new RuntimeException(ex); + throw new AssertionError(ex); } } @@ -274,65 +266,63 @@ } } - private static Server startServer() { - Server server = new Server(); - new Thread(server).start(); - return server; - } - - private static class Server extends SSLContextTemplate implements Runnable { + private static class Server extends SSLContextTemplate { + public int port; + private final SSLServerSocket ssock; + ExecutorService threadPool = Executors.newFixedThreadPool(1); + CountDownLatch serverLatch = new CountDownLatch(1); - public volatile boolean go = true; - private boolean signal = false; - public volatile int port = 0; - public volatile boolean started = false; - - private synchronized void waitForSignal() { - while (!signal) { - try { - wait(); - } catch (InterruptedException ex) { - // do nothing - } - } - signal = false; - } - public synchronized void signal() { - signal = true; - notify(); - } - - @Override - public void run() { + Server() { try { - SSLContext sc = createServerSSLContext(); ServerSocketFactory fac = sc.getServerSocketFactory(); - SSLServerSocket ssock = (SSLServerSocket) - fac.createServerSocket(0); - this.port = ssock.getLocalPort(); - - waitForSignal(); - started = true; - while (go) { + ssock = (SSLServerSocket) fac.createServerSocket(0); + port = ssock.getLocalPort(); + + // Thread to allow multiple clients to connect + new Thread(() -> { try { - System.out.println("Waiting for connection"); - Socket sock = ssock.accept(); - BufferedReader reader = new BufferedReader( - new InputStreamReader(sock.getInputStream())); - String line = reader.readLine(); - System.out.println("server read: " + line); - PrintWriter out = new PrintWriter( - new OutputStreamWriter(sock.getOutputStream())); - out.println(line); - out.flush(); - waitForSignal(); + System.err.println("Server starting to accept"); + serverLatch.countDown(); + do { + threadPool.submit( + new ServerThread((SSLSocket) ssock.accept())); + } while (true); } catch (Exception ex) { - ex.printStackTrace(); + throw new AssertionError("Server Down", ex); + } finally { + threadPool.close(); } + }).start(); + + } catch (Exception e) { + throw new AssertionError(e); + } + } + + static class ServerThread extends Thread { + SSLSocket sock; + + ServerThread(SSLSocket s) { + this.sock = s; + System.err.println("(Server) client connection on port " + + sock.getPort()); + } + + public void run() { + try { + BufferedReader reader = new BufferedReader( + new InputStreamReader(sock.getInputStream())); + String line = reader.readLine(); + System.out.println("server read: " + line); + PrintWriter out = new PrintWriter( + new OutputStreamWriter(sock.getOutputStream())); + out.println(line); + out.flush(); + out.close(); + } catch (Exception e) { + throw new AssertionError("Server thread error", e); } - } catch (Exception ex) { - throw new RuntimeException(ex); } } } diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/SSLSessionImpl/ResumeChecksServer.java openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/SSLSessionImpl/ResumeChecksServer.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/SSLSessionImpl/ResumeChecksServer.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/SSLSessionImpl/ResumeChecksServer.java 2026-04-17 19:09:35.000000000 +0000 @@ -23,7 +23,7 @@ /* * @test - * @bug 8206929 + * @bug 8206929 8333857 * @summary ensure that server only resumes a session if certain properties * of the session are compatible with the new connection * @library /javax/net/ssl/templates @@ -48,6 +48,9 @@ import java.security.*; import java.net.*; import java.util.*; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public class ResumeChecksServer extends SSLContextTemplate { @@ -60,51 +63,50 @@ SIGNATURE_SCHEME } - public static void main(String[] args) throws Exception { - - new ResumeChecksServer(TestMode.valueOf(args[0])).run(); - } - private final TestMode testMode; + static CountDownLatch latch = new CountDownLatch(1); + static TestMode testMode; + static int serverPort; - public ResumeChecksServer(TestMode testMode) { - this.testMode = testMode; + public static void main(String[] args) throws Exception { + testMode = TestMode.valueOf(args[0]); + new ResumeChecksServer().test(); } - private void run() throws Exception { - SSLSession secondSession = null; - - SSLContext sslContext = createServerSSLContext(); - ServerSocketFactory fac = sslContext.getServerSocketFactory(); - SSLServerSocket ssock = (SSLServerSocket) - fac.createServerSocket(0); - - Client client = startClient(ssock.getLocalPort()); - - try { - connect(client, ssock, testMode, false); - } catch (Exception ex) { - throw new RuntimeException(ex); - } + private void test() throws Exception { + SSLSession firstSession, secondSession; + HexFormat hex = HexFormat.of(); + + serverPort = new Server().port; + latch.await(); + Client c = new Client(serverPort); + + System.out.println("Waiting for connection"); + long firstStartTime = System.currentTimeMillis(); + firstSession = c.test(); + + System.err.println("firstStartTime = " + firstStartTime); + System.err.println("firstId = " + hex.formatHex(firstSession.getId())); + System.err.println("firstSession.getCreationTime() = " + + firstSession.getCreationTime()); long secondStartTime = System.currentTimeMillis(); - Thread.sleep(10); - try { - secondSession = connect(client, ssock, testMode, true); - } catch (SSLHandshakeException ex) { - // this is expected - } catch (Exception ex) { - throw new RuntimeException(ex); - } + secondSession = c.test(); - client.go = false; - client.signal(); + System.err.println("secondStartTime = " + secondStartTime); + // Note: Ids will never match with TLS 1.3 due to spec + System.err.println("secondId = " + hex.formatHex(secondSession.getId())); + System.err.println("secondSession.getCreationTime() = " + + secondSession.getCreationTime()); switch (testMode) { case BASIC: // fail if session is not resumed - if (secondSession.getCreationTime() > secondStartTime) { - throw new RuntimeException("Session was not reused"); + if (firstSession.getCreationTime() != + secondSession.getCreationTime()) { + throw new AssertionError("Session was not reused: FAIL"); } + + System.out.println("secondSession used resumption: PASS"); break; case CLIENT_AUTH: // throws an exception if the client is not authenticated @@ -115,24 +117,23 @@ case CIPHER_SUITE: case SIGNATURE_SCHEME: // fail if a new session is not created - if (secondSession.getCreationTime() <= secondStartTime) { - throw new RuntimeException("Existing session was used"); + if (secondSession.getCreationTime() < secondStartTime) { + throw new AssertionError("Existing session was used: FAIL"); } + System.out.println("secondSession not resumed: PASS"); break; default: - throw new RuntimeException("unknown mode: " + testMode); + throw new AssertionError("unknown mode: " + testMode); } } private static class NoSig implements AlgorithmConstraints { - private final String alg; NoSig(String alg) { this.alg = alg; } - private boolean test(String a) { return !a.toLowerCase().contains(alg.toLowerCase()); } @@ -140,160 +141,137 @@ public boolean permits(Set primitives, Key key) { return true; } + public boolean permits(Set primitives, String algorithm, AlgorithmParameters parameters) { - return test(algorithm); } + public boolean permits(Set primitives, String algorithm, Key key, AlgorithmParameters parameters) { - return test(algorithm); } } - private static SSLSession connect(Client client, SSLServerSocket ssock, - TestMode mode, boolean second) throws Exception { - try { - client.signal(); - System.out.println("Waiting for connection"); - SSLSocket sock = (SSLSocket) ssock.accept(); - SSLParameters params = sock.getSSLParameters(); - - switch (mode) { - case BASIC: - // do nothing to ensure resumption works - break; - case CLIENT_AUTH: - if (second) { - params.setNeedClientAuth(true); - } else { - params.setNeedClientAuth(false); - } - break; - case VERSION_2_TO_3: - if (second) { - params.setProtocols(new String[] {"TLSv1.3"}); - } else { - params.setProtocols(new String[] {"TLSv1.2"}); - } - break; - case VERSION_3_TO_2: - if (second) { - params.setProtocols(new String[] {"TLSv1.2"}); - } else { - params.setProtocols(new String[] {"TLSv1.3"}); - } - break; - case CIPHER_SUITE: - if (second) { - params.setCipherSuites( - new String[] {"TLS_AES_128_GCM_SHA256"}); - } else { - params.setCipherSuites( - new String[] {"TLS_AES_256_GCM_SHA384"}); - } - break; - case SIGNATURE_SCHEME: - params.setNeedClientAuth(true); - AlgorithmConstraints constraints = - params.getAlgorithmConstraints(); - if (second) { - params.setAlgorithmConstraints(new NoSig("ecdsa")); - } else { - params.setAlgorithmConstraints(new NoSig("rsa")); - } - break; - default: - throw new RuntimeException("unknown mode: " + mode); - } - sock.setSSLParameters(params); - BufferedReader reader = new BufferedReader( - new InputStreamReader(sock.getInputStream())); - String line = reader.readLine(); - System.out.println("server read: " + line); + private static class Client extends SSLContextTemplate { + private final int port; + private final SSLContext sc; + public SSLSession session; + + Client(int port) throws Exception { + sc = createClientSSLContext(); + this.port = port; + } + + public SSLSession test() throws Exception { + SSLSocket sock = null; + latch.await(); + do { + try { + sock = (SSLSocket) sc.getSocketFactory().createSocket(); + } catch (IOException e) { + // If the server never starts, test will time out. + System.err.println("client trying again to connect"); + Thread.sleep(500); + } + } while (sock == null); + sock.connect(new InetSocketAddress("localhost", port)); PrintWriter out = new PrintWriter( new OutputStreamWriter(sock.getOutputStream())); - out.println(line); + out.println("message"); out.flush(); + BufferedReader reader = new BufferedReader( + new InputStreamReader(sock.getInputStream())); + String inMsg = reader.readLine(); + System.out.println("Client received: " + inMsg); out.close(); - SSLSession result = sock.getSession(); + session = sock.getSession(); sock.close(); - return result; - } catch (SSLHandshakeException ex) { - if (!second) { - throw ex; - } + return session; } - return null; } - private static Client startClient(int port) { - Client client = new Client(port); - new Thread(client).start(); - return client; - } - - private static class Client extends SSLContextTemplate implements Runnable { - - public volatile boolean go = true; - private boolean signal = false; - private final int port; - - Client(int port) { - this.port = port; - } + // The server will only have two connections each tests + private static class Server extends SSLContextTemplate { + public int port; + ExecutorService threadPool = Executors.newFixedThreadPool(1); + // Stores the certs from the first connection in mode LOCAL_CERTS + // first connection to the server + static boolean first = true; + + Server() throws Exception { + SSLContext sc = createServerSSLContext(); + ServerSocketFactory fac = sc.getServerSocketFactory(); + SSLServerSocket ssock = (SSLServerSocket) fac.createServerSocket(0); + port = ssock.getLocalPort(); - private synchronized void waitForSignal() { - while (!signal) { + // Thread to allow multiple clients to connect + new Thread(() -> { try { - wait(); - } catch (InterruptedException ex) { - // do nothing + System.err.println("Server starting to accept"); + latch.countDown(); + do { + threadPool.submit(new ServerThread(ssock.accept())); + } while (true); + } catch (Exception ex) { + throw new AssertionError("Server Down", ex); + } finally { + threadPool.close(); } - } - signal = false; - - try { - Thread.sleep(1000); - } catch (InterruptedException ex) { - // do nothing - } - } - public synchronized void signal() { - signal = true; - notify(); + }).start(); } - public void run() { - try { + static class ServerThread implements Runnable { + final SSLSocket sock; - SSLContext sc = createClientSSLContext(); + ServerThread(Socket s) { + this.sock = (SSLSocket) s; + System.err.println("(Server) client connection on port " + + sock.getPort()); + } - waitForSignal(); - while (go) { - try { - SSLSocket sock = (SSLSocket) - sc.getSocketFactory().createSocket(); - sock.connect(new InetSocketAddress("localhost", port)); - PrintWriter out = new PrintWriter( - new OutputStreamWriter(sock.getOutputStream())); - out.println("message"); - out.flush(); - BufferedReader reader = new BufferedReader( - new InputStreamReader(sock.getInputStream())); - String inMsg = reader.readLine(); - System.out.println("Client received: " + inMsg); - out.close(); - sock.close(); - waitForSignal(); - } catch (Exception ex) { - ex.printStackTrace(); + + public void run() { + try { + SSLParameters params = sock.getSSLParameters(); + switch (testMode) { + case BASIC -> {} // do nothing + case CLIENT_AUTH -> params.setNeedClientAuth(!first); + case VERSION_2_TO_3 -> params.setProtocols(new String[]{ + first ? "TLSv1.2" : "TLSv1.3"}); + case VERSION_3_TO_2 -> params.setProtocols(new String[]{ + first ? "TLSv1.3" : "TLSv1.2"}); + case CIPHER_SUITE -> params.setCipherSuites( + new String[]{ + first ? "TLS_AES_256_GCM_SHA384" : + "TLS_AES_128_GCM_SHA256"}); + case SIGNATURE_SCHEME -> { + params.setNeedClientAuth(true); + params.setAlgorithmConstraints(new NoSig( + first ? "ecdsa_secp521r1_sha512" : + "ecdsa_secp384r1_sha384")); + } + default -> + throw new AssertionError("Server: " + + "unknown mode: " + testMode); } + sock.setSSLParameters(params); + BufferedReader reader = new BufferedReader( + new InputStreamReader(sock.getInputStream())); + String line = reader.readLine(); + System.err.println("server read: " + line); + PrintWriter out = new PrintWriter( + new OutputStreamWriter(sock.getOutputStream())); + out.println(line); + out.flush(); + out.close(); + SSLSession session = sock.getSession(); + first = false; + System.err.println("server socket closed: " + session); + } catch (Exception e) { + throw new AssertionError("Server error", e); } - } catch (Exception ex) { - throw new RuntimeException(ex); } } } diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/X509TrustManagerImpl/distrust/Chunghwa.java openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/X509TrustManagerImpl/distrust/Chunghwa.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/X509TrustManagerImpl/distrust/Chunghwa.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/X509TrustManagerImpl/distrust/Chunghwa.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import javax.net.ssl.X509TrustManager; +import java.io.File; +import java.security.Security; +import java.time.LocalDate; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.Date; + +/* + * @test + * @bug 8369282 + * @summary Check that TLS Server certificates chaining back to distrusted + * Chunghwa root are invalid + * @library /test/lib + * @modules java.base/sun.security.validator + * @run main/othervm Chunghwa after policyOn invalid + * @run main/othervm Chunghwa after policyOff valid + * @run main/othervm Chunghwa before policyOn valid + * @run main/othervm Chunghwa before policyOff valid + */ + +public class Chunghwa { + + private static final String CERT_PATH = "chains" + File.separator + "chunghwa"; + + // The ePKI root has a test certificate chain stored in a file + // named "-chain.pem". + private static final String ROOT_TO_TEST = "chunghwaepkirootca"; + + // Date after the restrictions take effect + private static final ZonedDateTime DISTRUST_DATE = + LocalDate.of(2026, 03, 18).atStartOfDay(ZoneOffset.UTC); + + public static void main(String[] args) throws Exception { + + Distrust distrust = new Distrust(args); + + X509TrustManager[] tms = new X509TrustManager[]{ + distrust.getTMF("PKIX", null), + distrust.getTMF("SunX509", null) + }; + + Date notBefore = distrust.getNotBefore(DISTRUST_DATE); + distrust.testCertificateChain(CERT_PATH, notBefore, tms, ROOT_TO_TEST); + } +} diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/X509TrustManagerImpl/distrust/chains/chunghwa/chunghwaepkirootca-chain.pem openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/X509TrustManagerImpl/distrust/chains/chunghwa/chunghwaepkirootca-chain.pem --- openjdk-21-21.0.10+7/test/jdk/sun/security/ssl/X509TrustManagerImpl/distrust/chains/chunghwa/chunghwaepkirootca-chain.pem 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/ssl/X509TrustManagerImpl/distrust/chains/chunghwa/chunghwaepkirootca-chain.pem 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,50 @@ +Owner: CN=HiPKI Root CA - G1, + O="Chunghwa Telecom Co., Ltd.", C=TW +Issuer: OU=ePKI Root Certification Authority, + O="Chunghwa Telecom Co., Ltd.", C=TW +Serial number: 23fba648360e15e92ba78aedb67a0ae5 +Valid from: Wed Dec 20 19:11:23 MST 2023 until: Tue Dec 19 08:59:59 MST 2034 +Certificate fingerprints: + SHA1: 87:F1:DD:3B:8E:F1:E0:8C:A8:CA:CB:9B:CE:4E:26:5A:E4:4E:05:F2 + SHA256: 68:07:C9:72:35:C5:EC:60:90:26:9A:4B:5F:ED:FA:B4:69:86:E4:2F:4D:67:D2:ED:DD:CF:6E:45:CF:0D:FA:80 +Signature algorithm name: SHA256withRSA +Subject Public Key Algorithm: 4096-bit RSA key +Version: 3 + +-----BEGIN CERTIFICATE----- +MIIGjDCCBHSgAwIBAgIQI/umSDYOFekrp4rttnoK5TANBgkqhkiG9w0BAQsFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0yMzEyMjEwMjExMjNaFw0zNDEyMTkxNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQ +S0kgUm9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +9B5/UnMyDHPkvRN0o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh +8Ge6zCFovkRTv4354twvVcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux5 +5199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEu +iAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRt +U6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd +hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXT +T3OUM3ECoWqj1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK +9p/7qxj3ccC2HTHsOyDry+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8 +b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8Pg +cSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NV +vxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaOCAVMwggFPMB8G +A1UdIwQYMBaAFB4M97Zn8uGSJglFwFU5Lnc/QkqiMB0GA1UdDgQWBBTydxf6Xqj+ +9j1x1Wi6yUYMONivsDAOBgNVHQ8BAf8EBAMCAYYwQAYDVR0fBDkwNzA1oDOgMYYv +aHR0cDovL2VjYS5oaW5ldC5uZXQvcmVwb3NpdG9yeS9DUkxfU0hBMi9DQS5jcmww +gYIGCCsGAQUFBwEBBHYwdDA7BggrBgEFBQcwAoYvaHR0cDovL2VjYS5oaW5ldC5u +ZXQvcmVwb3NpdG9yeS9DZXJ0cy9lQ0FHMS5jcnQwNQYIKwYBBQUHMAGGKWh0dHA6 +Ly9vY3NwLmVjYS5oaW5ldC5uZXQvT0NTUC9vY3NwRzFzaGEyMBIGA1UdEwEB/wQI +MAYBAf8CAQEwIgYDVR0gBBswGTAIBgZngQwBAgIwDQYLKwYBBAGBtyNkAAMwDQYJ +KoZIhvcNAQELBQADggIBACY9pps8fqk3p8Xqv/qr26I1aFA4jOEG3VWd2bqn68Y9 +InOMZozTMVh7iOnOfat7mEqn/RNhikvR5MOV3qAeg4gwgNb1OMuGltwfXWGiuGeT +vhimsV6E2hhJFAmZyXtfuoV9vSrnr1a5pCWqhVYWSCvoAQ/8Kv0tATKbIe21CYXz +NIo7O9QBSXt0BiaP9+CVQtJAYYuy2MNAcXgzgL4rownrYYAixhPmkxQE0Dt1gVbW +s2htBLJGse0z1fJDblY0Zar4t2ly+kIScx5DhRrrd8XKMK0YvID9Ythb+ao8m7Wd +Kymqr36benGL3GsvmSypLPlqZtfEqVITFhXwQiL8ruxoL+3WfNQJ09x0iV4xaP+E +bZSLLVzIiyhU49YdFHaqKyAJQvzgF2Za3DOwQWlP7OngtUx0ScEGHsoo78AM+Y0T +eLFxmr82kuyH18wZkUT9bLZlot11P2aC8VTprBGr+jEAMJjpmEjSA83ja/ttmqgh +qjj29Jnw3Lgy91XIhzBFMxMYo+hhYeBRmBFWl5+Y5oxBgPVLZpDJvg2rKa8xdqim +KgvF0DMKHntE0hhVy7JfUCnKovNQ0pf0NodLfjpqcCS2GBZ1mNcsW2MG2uBPANcn +LRXmt7N4XX11mctQTADwt8yZZ+2HDrST4kghOz+FXgftrPBdtDtM0T6WJcHWR1uS +-----END CERTIFICATE----- diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/tools/keytool/EchoPassword.java openjdk-21-21.0.11+10/test/jdk/sun/security/tools/keytool/EchoPassword.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/tools/keytool/EchoPassword.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/tools/keytool/EchoPassword.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8354469 + * @summary keytool password does not echo in multiple cases + * @library /java/awt/regtesthelpers + * @modules java.base/jdk.internal.util + * @build PassFailJFrame + * @run main/manual/othervm EchoPassword + */ + +import jdk.internal.util.OperatingSystem; + +import javax.swing.JEditorPane; +import javax.swing.JLabel; +import javax.swing.event.HyperlinkEvent; + +import java.awt.Toolkit; +import java.awt.datatransfer.StringSelection; +import java.io.File; +import java.nio.file.Path; + +public class EchoPassword { + + static JLabel label; + + public static void main(String[] args) throws Exception { + + var ks1 = "\"" + Path.of("8354469.ks1").toAbsolutePath() + "\""; + var ks2 = "\"" + Path.of("8354469.ks2").toAbsolutePath() + "\""; + var ks3 = "\"" + Path.of("8354469.ks3").toAbsolutePath() + "\""; + + final String keytool = "\"" + System.getProperty("java.home") + + File.separator + "bin" + File.separator + "keytool\""; + final String nonASCII = "äöäöäöäö"; + + final String[][] commands = { + // Input password from real Console + {"First command", keytool + " -keystore " + ks1 + + " -genkeypair -keyalg ec -dname cn=a -alias first"}, + // Input password from limited Console (when stdout is redirected) + {"Second command", keytool + " -keystore " + ks2 + + " -genkeypair -keyalg ec -dname cn=b -alias second | sort"}, + // Input password from System.in stream + {"Third command", "echo changeit| " + keytool + " -keystore " + ks1 + + " -genkeypair -keyalg ec -dname cn=c -alias third"}, + // Ensure limited Console does not write a newline to System.out + {"Fourth command", keytool + " -keystore " + ks1 + + " -exportcert -alias first | " + + keytool + " -printcert -rfc"}, + {"The password", nonASCII} + }; + + final String message = String.format(""" + Open a terminal or Windows Command Prompt window, perform + the following steps, and record the final result. Each time you + click a link to copy something, make sure the status line at the + bottom shows the link has been successfully clicked. +

Part I: Password Echoing Tests

+
    +
  1. Click Copy First Command to copy the + following command into the system clipboard. Paste it into the + terminal window and execute the command. +

    + %s +

    + When prompted, enter "changeit" and press Enter. When prompted + again, enter "changeit" again and press Enter. Verify that the + two password prompts show up on different lines, both + passwords are hidden, and a key pair is generated successfully. + +

  2. Click Copy Second Command to copy the + following command into the system clipboard. Paste it into the + terminal window and execute the command. +

    + %s +

    + When prompted, enter "changeit" and press Enter. When prompted + again, enter "changeit" again and press Enter. Verify that the + two password prompts show up on different lines, both + passwords are hidden, and a key pair is generated successfully. + +

  3. Click Copy Third Command to copy the + following command into the system clipboard. Paste it into the + terminal window and execute the command. +

    + %s +

    + You will see a prompt but you don't need to enter anything. + Verify that the password "changeit" is not shown in the command + output and a key pair is generated successfully. + +

  4. Click Copy Fourth Command to copy the + following command into the system clipboard. Paste it into the + terminal window and execute the command. +

    + %s +

    + When prompted, enter "changeit" and press Enter. Verify that the + password is hidden and a PEM certificate is correctly shown. +

+ Press "pass" if the behavior matches expectations; + otherwise, press "fail". + """, commands[0][1], commands[1][1], commands[2][1], commands[3][1], + commands[4][1]); + + PassFailJFrame.builder() + .instructions(message) + .rows(40).columns(100) + .hyperlinkListener(e -> { + if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + int pos = Integer.parseInt(e.getDescription().substring(1)); + Toolkit.getDefaultToolkit().getSystemClipboard().setContents( + new StringSelection(commands[pos][1]), null); + label.setText(commands[pos][0] + " copied"); + if (e.getSource() instanceof JEditorPane ep) { + ep.getCaret().setVisible(false); + } + } + }) + .splitUIBottom(() -> { + label = new JLabel("Status"); + return label; + }) + .build() + .awaitAndCheck(); + } +} diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/tools/keytool/SetInPassword.java openjdk-21-21.0.11+10/test/jdk/sun/security/tools/keytool/SetInPassword.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/tools/keytool/SetInPassword.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/tools/keytool/SetInPassword.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8354469 + * @summary ensure password can be read from user's System.in + * @library /test/lib + * @modules java.base/sun.security.tools.keytool + */ + +import jdk.test.lib.SecurityTools; + +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; + +public class SetInPassword { + public static void main(String[] args) throws Exception { + SecurityTools.keytool("-keystore ks -storepass changeit -genkeypair -alias a -dname CN=A -keyalg EC") + .shouldHaveExitValue(0); + System.setIn(new ByteArrayInputStream("changeit".getBytes(StandardCharsets.UTF_8))); + sun.security.tools.keytool.Main.main("-keystore ks -alias a -certreq".split(" ")); + } +} diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/util/AlgorithmConstraints/InvalidCryptoDisabledAlgos.java openjdk-21-21.0.11+10/test/jdk/sun/security/util/AlgorithmConstraints/InvalidCryptoDisabledAlgos.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/util/AlgorithmConstraints/InvalidCryptoDisabledAlgos.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/util/AlgorithmConstraints/InvalidCryptoDisabledAlgos.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8244336 + * @modules java.base/sun.security.util + * @summary Check that invalid property values for + * "jdk.crypto.disabledAlgorithms" are rejected + * @run main/othervm InvalidCryptoDisabledAlgos "*" + * @run main/othervm InvalidCryptoDisabledAlgos "." + * @run main/othervm InvalidCryptoDisabledAlgos ".AES" + * @run main/othervm InvalidCryptoDisabledAlgos "Cipher." + * @run main/othervm InvalidCryptoDisabledAlgos "A.B" + * @run main/othervm InvalidCryptoDisabledAlgos "KeyStore.MY,." + * @run main/othervm InvalidCryptoDisabledAlgos "KeyStore.MY,.AES" + * @run main/othervm InvalidCryptoDisabledAlgos "KeyStore.MY,Cipher." + * @run main/othervm InvalidCryptoDisabledAlgos "KeyStore.MY,A.B" + */ +import java.security.Security; +import sun.security.util.CryptoAlgorithmConstraints; + +public class InvalidCryptoDisabledAlgos { + + public static void main(String[] args) throws Exception { + System.out.println("Invalid Property Value = " + args[0]); + Security.setProperty("jdk.crypto.disabledAlgorithms", args[0]); + try { + // Trigger the check to parse and validate property value + CryptoAlgorithmConstraints.permits("x", "y"); + throw new AssertionError( + "CryptoAlgorithmConstraints.permits() did not generate expected exception"); + } catch (Throwable t) { + if (!(t instanceof ExceptionInInitializerError) + || !(t.getCause() instanceof IllegalArgumentException)) { + // unexpected exception, propagate it + throw t; + } + // got expected + System.out.println("Received expected exception: " + t); + } + } +} diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/util/Password/EmptyIn.java openjdk-21-21.0.11+10/test/jdk/sun/security/util/Password/EmptyIn.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/util/Password/EmptyIn.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/util/Password/EmptyIn.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import jdk.test.lib.Asserts; +import sun.security.util.Password; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +/* + * @test + * @bug 8374555 + * @summary only print warning when reading from System.in + * @modules java.base/sun.security.util + * @library /test/lib + */ +public class EmptyIn { + public static void main(String[] args) throws Exception { + testSystemIn(); + testNotSystemIn(); + } + + static void testSystemIn() throws Exception { + var in = new ByteArrayInputStream(new byte[0]); + var err = new ByteArrayOutputStream(); + var oldErr = System.err; + var oldIn = System.in; + try { + System.setIn(in); + System.setErr(new PrintStream(err)); + Password.readPassword(System.in); + } finally { + System.setIn(oldIn); + System.setErr(oldErr); + } + // Read from System.in. Should warn. + Asserts.assertNotEquals(0, err.size()); + } + + static void testNotSystemIn() throws Exception { + var in = new ByteArrayInputStream(new byte[0]); + var err = new ByteArrayOutputStream(); + var oldErr = System.err; + try { + System.setErr(new PrintStream(err)); + Password.readPassword(in); + } finally { + System.setErr(oldErr); + } + // Not read from System.in. Should not warn. + Asserts.assertEQ(0, err.size()); + } +} diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/util/Resources/Usages.java openjdk-21-21.0.11+10/test/jdk/sun/security/util/Resources/Usages.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/util/Resources/Usages.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/util/Resources/Usages.java 2026-04-17 19:09:35.000000000 +0000 @@ -23,7 +23,7 @@ /* * @test - * @bug 8215937 + * @bug 8215937 8354469 * @modules java.base/sun.security.util * java.base/sun.security.tools.keytool * jdk.jartool/sun.security.tools.jarsigner @@ -132,6 +132,8 @@ List.of(LOC_GETNONLOC, NEW_LOC)), new Pair("java.base/share/classes/sun/security/provider/PolicyFile.java", List.of(MGR_GETSTRING, LOC_GETNONLOC, LOC_GETNONLOC_POLICY)), + new Pair("java.base/share/classes/sun/security/util/Password.java", + List.of(MGR_GETSTRING)), new Pair("java.base/share/classes/javax/security/auth/", List.of(MGR_GETSTRING))) ); diff -Nru openjdk-21-21.0.10+7/test/jdk/sun/security/x509/URICertStore/CRLReadTimeout.java openjdk-21-21.0.11+10/test/jdk/sun/security/x509/URICertStore/CRLReadTimeout.java --- openjdk-21-21.0.10+7/test/jdk/sun/security/x509/URICertStore/CRLReadTimeout.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/sun/security/x509/URICertStore/CRLReadTimeout.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,45 +22,101 @@ */ /* - * @test + * @test id=0 * @bug 8191808 8179502 * @summary check that CRL download is interrupted if it takes too long * @modules java.base/sun.security.x509 * java.base/sun.security.util * @library /test/lib - * @run main/othervm -Dcom.sun.security.crl.readtimeout=1 + * @run main/othervm -Djava.security.debug=certpath -Dcom.sun.security.crl.readtimeout=1 * CRLReadTimeout 5000 false - * @run main/othervm -Dcom.sun.security.crl.readtimeout=1s + */ + +/* + * @test id=1 + * @bug 8191808 8179502 + * @summary check that CRL download is interrupted if it takes too long + * @modules java.base/sun.security.x509 + * java.base/sun.security.util + * @library /test/lib + * @run main/othervm -Djava.security.debug=certpath -Dcom.sun.security.crl.readtimeout=1s * CRLReadTimeout 5000 false - * @run main/othervm -Dcom.sun.security.crl.readtimeout=4 + */ + +/* + * @test id=2 + * @bug 8191808 8179502 + * @summary check that CRL download is interrupted if it takes too long + * @modules java.base/sun.security.x509 + * java.base/sun.security.util + * @library /test/lib + * @run main/othervm -Djava.security.debug=certpath -Dcom.sun.security.crl.readtimeout=200 * CRLReadTimeout 1000 true - * @run main/othervm -Dcom.sun.security.crl.readtimeout=1500ms + */ + +/* + * @test id=3 + * @bug 8191808 8179502 + * @summary check that CRL download is interrupted if it takes too long + * @modules java.base/sun.security.x509 + * java.base/sun.security.util + * @library /test/lib + * @run main/othervm -Djava.security.debug=certpath -Dcom.sun.security.crl.readtimeout=1500ms * CRLReadTimeout 5000 false - * @run main/othervm -Dcom.sun.security.crl.readtimeout=4500ms - * CRLReadTimeout 1000 true */ -import java.io.*; +/* + * @test id=4 + * @bug 8191808 8179502 + * @summary check that CRL download is interrupted if it takes too long + * @modules java.base/sun.security.x509 + * java.base/sun.security.util + * @library /test/lib + * @run main/othervm -Djava.security.debug=certpath -Dcom.sun.security.crl.readtimeout=4500ms + * CRLReadTimeout 100 true + */ + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.math.BigInteger; +import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketTimeoutException; import java.security.GeneralSecurityException; import java.security.KeyStore; import java.security.PrivateKey; -import java.security.cert.*; +import java.security.cert.CRLException; +import java.security.cert.CertPath; +import java.security.cert.CertPathValidator; +import java.security.cert.CertPathValidatorException; +import java.security.cert.CertificateFactory; +import java.security.cert.PKIXParameters; +import java.security.cert.PKIXRevocationChecker; +import java.security.cert.TrustAnchor; +import java.security.cert.X509CRL; +import java.security.cert.X509Certificate; import java.util.Date; import java.util.EnumSet; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; -import static java.security.cert.PKIXRevocationChecker.Option.*; +import static java.security.cert.PKIXRevocationChecker.Option.NO_FALLBACK; +import static java.security.cert.PKIXRevocationChecker.Option.PREFER_CRLS; +import static java.security.cert.PKIXRevocationChecker.Option.SOFT_FAIL; import com.sun.net.httpserver.HttpServer; import jdk.test.lib.SecurityTools; import jdk.test.lib.process.OutputAnalyzer; import sun.security.util.SignatureUtil; -import sun.security.x509.*; +import sun.security.x509.AuthorityKeyIdentifierExtension; +import sun.security.x509.CRLExtensions; +import sun.security.x509.CRLNumberExtension; +import sun.security.x509.KeyIdentifier; +import sun.security.x509.X500Name; +import sun.security.x509.X509CRLImpl; public class CRLReadTimeout { @@ -117,9 +173,10 @@ // unwrap soft fail exceptions and check for SocketTimeoutException List softExc = prc.getSoftFailExceptions(); if (expectedPass) { - if (softExc.size() > 0) { + if (!softExc.isEmpty()) { throw new RuntimeException("Expected to pass, found " + - softExc.size() + " soft fail exceptions"); + softExc.size() + + " soft fail exceptions"); } } else { boolean foundSockTOExc = false; @@ -182,7 +239,7 @@ } public void start() throws IOException { - server.bind(new InetSocketAddress(0), 0); + server.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 0), 0); server.createContext("/crl", t -> { try (InputStream is = t.getRequestBody()) { is.readAllBytes(); diff -Nru openjdk-21-21.0.10+7/test/jdk/tools/jar/ReproducibleJar.java openjdk-21-21.0.11+10/test/jdk/tools/jar/ReproducibleJar.java --- openjdk-21-21.0.10+7/test/jdk/tools/jar/ReproducibleJar.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/tools/jar/ReproducibleJar.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,7 +66,9 @@ private static final TimeZone TZ = TimeZone.getDefault(); private static final boolean DST = TZ.inDaylightTime(new Date()); private static final String UNIX_2038_ROLLOVER_TIME = "2038-01-19T03:14:07Z"; + private static final String UNIX_EPOCH_TIME = "1970-01-01T00:00:00Z"; private static final Instant UNIX_2038_ROLLOVER = Instant.parse(UNIX_2038_ROLLOVER_TIME); + private static final Instant UNIX_EPOCH = Instant.parse(UNIX_EPOCH_TIME); private static final File DIR_OUTER = new File("outer"); private static final File DIR_INNER = new File(DIR_OUTER, "inner"); private static final File FILE_INNER = new File(DIR_INNER, "foo.txt"); @@ -231,12 +233,15 @@ if (Math.abs(now - original) > PRECISION) { // If original time is after UNIX 2038 32bit rollover - // and the now time is exactly the rollover time, then assume + // and the now time is exactly the rollover time or UNIX epoch time, then assume // running on a file system that only supports to 2038 (e.g.XFS) and pass test - if (FileTime.fromMillis(original).toInstant().isAfter(UNIX_2038_ROLLOVER) && - FileTime.fromMillis(now).toInstant().equals(UNIX_2038_ROLLOVER)) { - System.out.println("Checking file time after Unix 2038 rollover," + - " and extracted file time is " + UNIX_2038_ROLLOVER_TIME + ", " + + Instant originalInstant = FileTime.fromMillis(original).toInstant(); + Instant nowInstant = FileTime.fromMillis(now).toInstant(); + if (originalInstant.isAfter(UNIX_2038_ROLLOVER) && + (nowInstant.equals(UNIX_2038_ROLLOVER) || + nowInstant.equals(UNIX_EPOCH))) { + System.out.println("Checking file time after Unix 2038 rollover," + + " and extracted file time is " + nowInstant + ", " + " Assuming restricted file system, pass file time check."); } else { throw new AssertionError("checkFileTime failed," + diff -Nru openjdk-21-21.0.10+7/test/jdk/tools/launcher/ChangeDataModel.java openjdk-21-21.0.11+10/test/jdk/tools/launcher/ChangeDataModel.java --- openjdk-21-21.0.10+7/test/jdk/tools/launcher/ChangeDataModel.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/tools/launcher/ChangeDataModel.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ * @compile -XDignore.symbol.file ChangeDataModel.java * @run main ChangeDataModel * @summary Verify -d32, -d64 and -J prefixed data-model options are rejected on all platforms - * @author Joseph D. Darcy, ksrini */ import java.util.Arrays; diff -Nru openjdk-21-21.0.10+7/test/jdk/tools/launcher/I18NTest.java openjdk-21-21.0.11+10/test/jdk/tools/launcher/I18NTest.java --- openjdk-21-21.0.10+7/test/jdk/tools/launcher/I18NTest.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/tools/launcher/I18NTest.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ * @compile -XDignore.symbol.file I18NTest.java * @run main I18NTest * @summary Test to see if class files with non-ASCII characters can be run - * @author Joseph D. Darcy, Kumar Srinivasan */ diff -Nru openjdk-21-21.0.10+7/test/jdk/tools/launcher/UnresolvedExceptions.java openjdk-21-21.0.11+10/test/jdk/tools/launcher/UnresolvedExceptions.java --- openjdk-21-21.0.10+7/test/jdk/tools/launcher/UnresolvedExceptions.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/jdk/tools/launcher/UnresolvedExceptions.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,6 @@ * @compile -XDignore.symbol.file UnresolvedExceptions.java * @run main UnresolvedExceptions * @summary Verifying jvm won't segv if exception not available - * @author Joseph D. Darcy, ksrini */ import java.io.File; diff -Nru openjdk-21-21.0.10+7/test/langtools/TEST.ROOT openjdk-21-21.0.11+10/test/langtools/TEST.ROOT --- openjdk-21-21.0.10+7/test/langtools/TEST.ROOT 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/langtools/TEST.ROOT 2026-04-17 19:09:35.000000000 +0000 @@ -15,7 +15,7 @@ groups=TEST.groups # Minimum jtreg version -requiredVersion=7.3.1+1 +requiredVersion=7.5.2+1 # Use new module options useNewOptions=true diff -Nru openjdk-21-21.0.10+7/test/langtools/jdk/jshell/JdiHangingListenExecutionControlTest.java openjdk-21-21.0.11+10/test/langtools/jdk/jshell/JdiHangingListenExecutionControlTest.java --- openjdk-21-21.0.10+7/test/langtools/jdk/jshell/JdiHangingListenExecutionControlTest.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/langtools/jdk/jshell/JdiHangingListenExecutionControlTest.java 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,7 +46,11 @@ System.err.printf("Unexpected return value: %s\n", HangingRemoteAgent.state(false, null).eval("33;")); } catch (IllegalStateException ex) { - assertTrue(ex.getMessage().startsWith(EXPECTED_ERROR), ex.getMessage()); + if (!ex.getMessage().startsWith(EXPECTED_ERROR)) { + // unexpected message in the exception, rethrow the original exception + throw ex; + } + // received expected exception return; } fail("Expected IllegalStateException"); diff -Nru openjdk-21-21.0.10+7/test/lib/jdk/test/lib/containers/docker/DockerRunOptions.java openjdk-21-21.0.11+10/test/lib/jdk/test/lib/containers/docker/DockerRunOptions.java --- openjdk-21-21.0.10+7/test/lib/jdk/test/lib/containers/docker/DockerRunOptions.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/lib/jdk/test/lib/containers/docker/DockerRunOptions.java 2026-04-17 19:09:35.000000000 +0000 @@ -31,6 +31,7 @@ // in test environment. public class DockerRunOptions { public String imageNameAndTag; + public ArrayList engineOpts = new ArrayList<>(); public ArrayList dockerOpts = new ArrayList<>(); public String command; // normally a full path to java public ArrayList javaOpts = new ArrayList<>(); @@ -65,22 +66,27 @@ this.addJavaOpts("-XX:+ErrorFileToStderr"); } - public DockerRunOptions addDockerOpts(String... opts) { + public final DockerRunOptions addDockerOpts(String... opts) { Collections.addAll(dockerOpts, opts); return this; } - public DockerRunOptions addJavaOpts(String... opts) { + public final DockerRunOptions addEngineOpts(String... opts) { + Collections.addAll(engineOpts, opts); + return this; + } + + public final DockerRunOptions addJavaOpts(String... opts) { Collections.addAll(javaOpts, opts); return this; } - public DockerRunOptions addJavaOptsAppended(String... opts) { + public final DockerRunOptions addJavaOptsAppended(String... opts) { Collections.addAll(javaOptsAppended, opts); return this; } - public DockerRunOptions addClassOptions(String... opts) { + public final DockerRunOptions addClassOptions(String... opts) { Collections.addAll(classParams,opts); return this; } diff -Nru openjdk-21-21.0.10+7/test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java openjdk-21-21.0.11+10/test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java --- openjdk-21-21.0.10+7/test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java 2026-04-17 19:09:35.000000000 +0000 @@ -83,6 +83,14 @@ return isDockerEngineAvailable; } + /** + * Checks if the actual engine command is podman. + * + * @return {@code true} if engine is podman. {@code false} otherwise. + */ + public static boolean isPodman() { + return Container.ENGINE_COMMAND.contains("podman"); + } /** * Convenience method, will check if docker engine is available and usable; @@ -121,6 +129,26 @@ return true; } + private static String getEngineInfo(String format) throws Exception { + return execute(Container.ENGINE_COMMAND, "info", "-f", format).getStdout(); + } + + /** + * Determine if the engine is running in root-less mode. + * + * @return {@code true} when running root-less (podman or docker). {@code false} + * otherwise. + * + * @throws Exception + */ + public static boolean isRootless() throws Exception { + // Docker and Podman have different INFO structures. + // The node path for Podman is .Host.Security.Rootless, that also holds for + // Podman emulating Docker CLI. The node path for Docker is .SecurityOptions. + return (getEngineInfo("{{.Host.Security.Rootless}}").contains("true") || + getEngineInfo("{{.SecurityOptions}}").contains("name=rootless")); + } + /** * Build a container image that contains JDK under test. * The jdk will be placed under the "/jdk/" folder inside the image/container file system. @@ -202,6 +230,9 @@ */ public static List buildJavaCommand(DockerRunOptions opts) throws Exception { List cmd = buildContainerCommand(); + if (!opts.engineOpts.isEmpty()) { + cmd.addAll(opts.engineOpts); + } cmd.add("run"); if (opts.tty) cmd.add("--tty=true"); diff -Nru openjdk-21-21.0.10+7/test/lib/jdk/test/lib/process/OutputAnalyzer.java openjdk-21-21.0.11+10/test/lib/jdk/test/lib/process/OutputAnalyzer.java --- openjdk-21-21.0.10+7/test/lib/jdk/test/lib/process/OutputAnalyzer.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/lib/jdk/test/lib/process/OutputAnalyzer.java 2026-04-17 19:09:35.000000000 +0000 @@ -225,6 +225,20 @@ } /** + * Returns true if stderr contains the given string + */ + public boolean stderrContains(String expectedString) { + return getStderr().contains(expectedString); + } + + /** + * Returns true if either stdout or stderr contains the given string + */ + public boolean contains(String expectedString) { + return stdoutContains(expectedString) || stderrContains(expectedString); + } + + /** * Verify that the stdout and stderr contents of output buffer contains the string * * @param expectedString String that buffer should contain diff -Nru openjdk-21-21.0.10+7/test/lib/jdk/test/lib/security/OpensslArtifactFetcher.java openjdk-21-21.0.11+10/test/lib/jdk/test/lib/security/OpensslArtifactFetcher.java --- openjdk-21-21.0.10+7/test/lib/jdk/test/lib/security/OpensslArtifactFetcher.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/lib/jdk/test/lib/security/OpensslArtifactFetcher.java 2026-04-17 19:09:35.000000000 +0000 @@ -32,7 +32,7 @@ public class OpensslArtifactFetcher { - private static final String OPENSSL_BUNDLE_VERSION = "3.0.14"; + private static final String OPENSSL_BUNDLE_VERSION = "3.5.1"; private static final String OPENSSL_ORG = "jpg.tests.jdk.openssl"; /** diff -Nru openjdk-21-21.0.10+7/test/lib/jdk/test/whitebox/WhiteBox.java openjdk-21-21.0.11+10/test/lib/jdk/test/whitebox/WhiteBox.java --- openjdk-21-21.0.10+7/test/lib/jdk/test/whitebox/WhiteBox.java 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/lib/jdk/test/whitebox/WhiteBox.java 2026-04-17 19:09:35.000000000 +0000 @@ -539,7 +539,7 @@ try { wfrp = Reference.class.getDeclaredMethod("waitForReferenceProcessing"); wfrp.setAccessible(true); - assert wfrp.getReturnType() == Boolean.class; + assert wfrp.getReturnType().equals(boolean.class); Class[] ev = wfrp.getExceptionTypes(); assert ev.length == 1; assert ev[0] == InterruptedException.class; diff -Nru openjdk-21-21.0.10+7/test/lib-test/TEST.ROOT openjdk-21-21.0.11+10/test/lib-test/TEST.ROOT --- openjdk-21-21.0.10+7/test/lib-test/TEST.ROOT 2026-01-15 15:34:19.000000000 +0000 +++ openjdk-21-21.0.11+10/test/lib-test/TEST.ROOT 2026-04-17 19:09:35.000000000 +0000 @@ -1,5 +1,5 @@ # -# Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,7 @@ keys=randomness # Minimum jtreg version -requiredVersion=7.3.1+1 +requiredVersion=7.5.2+1 # Path to libraries in the topmost test directory. This is needed so @library # does not need ../../ notation to reach them diff -Nru openjdk-21-21.0.10+7/test/lib-test/jdk/test/whitebox/WaitForRefProcTest.java openjdk-21-21.0.11+10/test/lib-test/jdk/test/whitebox/WaitForRefProcTest.java --- openjdk-21-21.0.10+7/test/lib-test/jdk/test/whitebox/WaitForRefProcTest.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/lib-test/jdk/test/whitebox/WaitForRefProcTest.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,30 @@ +/* + * @test + * @summary Test WhiteBox.waitForReferenceProcessing + * @bug 8305186 8355632 + * @library /test/lib + * @build jdk.test.whitebox.WhiteBox + * @modules java.base/java.lang.ref:open + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -ea -esa + * -Xbootclasspath/a:. + * -XX:+UnlockDiagnosticVMOptions + * -XX:+WhiteBoxAPI + * WaitForRefProcTest + */ + +import jdk.test.whitebox.WhiteBox; + +public class WaitForRefProcTest { + + public static void main(String[] args) { + WhiteBox.getWhiteBox().fullGC(); + try { + boolean ret = WhiteBox.getWhiteBox().waitForReferenceProcessing(); + System.out.println("wFRP returned " + ret); + } catch (InterruptedException e) { + e.printStackTrace(); + throw new RuntimeException("test caught InterruptedException"); + } + } +} diff -Nru openjdk-21-21.0.10+7/test/micro/org/openjdk/bench/java/lang/reflect/NativeMethodInvoke.java openjdk-21-21.0.11+10/test/micro/org/openjdk/bench/java/lang/reflect/NativeMethodInvoke.java --- openjdk-21-21.0.10+7/test/micro/org/openjdk/bench/java/lang/reflect/NativeMethodInvoke.java 1970-01-01 00:00:00.000000000 +0000 +++ openjdk-21-21.0.11+10/test/micro/org/openjdk/bench/java/lang/reflect/NativeMethodInvoke.java 2026-04-17 19:09:35.000000000 +0000 @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.openjdk.bench.java.lang.reflect; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; + +import java.lang.reflect.Method; +import java.util.concurrent.TimeUnit; + +/** + * Benchmark for regression in native method invocation. + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Thread) +@Warmup(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS) +@Fork(3) +public class NativeMethodInvoke { + + private Method objectHashCode; + private Method threadCurrentThread; + + private Object[] objects; + + @Setup + public void setup() throws ReflectiveOperationException { + objects = new Object[]{ + 1, 5L, + 5.6d, 23.11f, + Boolean.TRUE, 'd' + }; + + objectHashCode = Object.class.getDeclaredMethod("hashCode"); + threadCurrentThread = Thread.class.getDeclaredMethod("currentThread"); + } + + @Benchmark + public void objectHashCode(Blackhole bh) throws ReflectiveOperationException { + for (var obj : objects) { + bh.consume(objectHashCode.invoke(obj)); + } + } + + @Benchmark + public Object threadCurrentThread() throws ReflectiveOperationException { + return threadCurrentThread.invoke(null); + } +}