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 https://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. Apache Commons Lang 3.21.0 Release Notes ---------------------------------------- The Apache Commons Lang team is pleased to announce the release of Apache Commons Lang 3.21.0. Apache Commons Lang is a package of Java utility classes for the Java lang packages, classes that could be considered standard to justify their existence in java.lang. The code is tested using the latest revision of the JDK for supported LTS releases: 8, 11, 17, 21, and 25. See https://github.com/apache/commons-lang/blob/master/.github/workflows/maven.yml Please ensure your build environment is up-to-date and kindly report any build issues. Starting with Commons Lang 3.9, we target Java 8 and use those features. For advice on upgrading from 2.x to 3.x, see https://commons.apache.org/lang/article3_0.html This is a feature and maintenance release. Java 8 or later is required. Changes in this version include: New features: * Add JavaVersion.JAVA_27. Thanks to Gary Gregory. * Add SystemUtils.IS_JAVA_27. Thanks to Gary Gregory. * JavaVersion.get(String) now support Java 26, 27 and 28. Thanks to Gary Gregory. * LANG-1810: Deprecate ArrayUtils.SOFT_MAX_ARRAY_LENGTH in favor of SAFE_MAX_ARRAY_LENGTH #1559. Thanks to Yelim Koo, Gary Gregory. * Add long support to BitField #1561. Thanks to Gary Gregory, Theodora Anastasia Lazaridou. * Add ArrayUtils.getDimensions(Object). Thanks to Gary Gregory. * LANG-1707: Add ArrayUtils.concat() methods for concatenating multiple arrays #1519. Thanks to Ivan Malutin, Gilles Sadowski, Gary Gregory. * Add FailableConsumer.accept(FailableConsumer, T) (#1641). Thanks to Gary Gregory. * Add AutoCloseables #1643. Thanks to Gary Gregory. * LANG-1711: Make object accessibility optional with AbstractReflection.AbstractBuilder.setForceAccessible(boolean) (#1558). Thanks to Gary Gregory. * Add ArrayFill.clear(char[]) (#1667). Thanks to Gary Gregory. * Add DurationUtils.toMillisLong(Duration) (#1679). Thanks to Gary Gregory. * Add Instants.toEpochMillis(Instant) (#1680). Thanks to Gary Gregory. * Add StringUtils.trimAsciiControl(String) (#1681). Thanks to Gary Gregory. * Add Instants.toMillisSince(Instant) (#1683). Thanks to Gary Gregory. * Add CharUtils isHex(int), isAsciiNumeric(int), isOctal(int) (#1685). Thanks to Gary Gregory. * Add and use Instants.toInstant(Instant[, Instant]) (#1690). Thanks to Gary Gregory. * LANG-1833: Handle ParsePosition index beyond source string length cleanly (#1757). Thanks to Maksym Korshun. * Add ClassUtils.getClassStrict(ClassLoader, String, boolean) (f020). Thanks to Gary Gregory. * Add ClassUtils.getClassStrict(String) (f020). Thanks to Gary Gregory. * Fix TypeUtils.isAssignable() for wildcards with multiple upper bounds (#1782). Thanks to Gary Gregory, gaurav kumar pandey. * Add JavaVersion.JAVA_28. Thanks to Gary Gregory. * Add SystemUtils.IS_JAVA_28. Thanks to Gary Gregory. Fixed Bugs: * Stop ExtendedMessageFormat seekNonWs reading past the pattern end. Thanks to Javid Khan, Gary Gregory. * Fix spelling and grammar in StringUtils #1486. Thanks to ThrawnCA. * Add ConversionTest assertions to increase coverage #1489. Thanks to Michael Hausegger, Gary Gregory. * Use Class instead of Class in MethodUtils #1491. Thanks to Boda65665, Gary Gregory. * ClassUtils now throws IllegalArgumentException if a class name represents an array with more dimensions than the JVM supports, 255: getClass(ClassLoader, String, boolean), ClassUtils.getClass(ClassLoader, String), ClassUtils.getClass(String, boolean), ClassUtils.getClass(String), #1494. Thanks to Gary Gregory, Arnout Engelen, Piotr P. Karwasz, Vladimir Sitnikov, Gilles Sadowski. * ClassUtils now throws IllegalArgumentException if a class name length is greater than 65,535: getClass(ClassLoader, String, boolean), ClassUtils.getClass(ClassLoader, String), ClassUtils.getClass(String, boolean), ClassUtils.getClass(String), #1495. Thanks to Gary Gregory, Arnout Engelen, Piotr P. Karwasz, Vladimir Sitnikov, Gilles Sadowski. * Fix console compiler warning: TypeUtils.java:[361,33] non-varargs call of varargs method with inexact argument type for last parameter. Thanks to Gary Gregory. * Fix console compiler warning: ReflectionDiffBuilderTest.java:[172,52] non-varargs call of varargs method with inexact argument type for last parameter. Thanks to Gary Gregory. * Fix Apache RAT plugin console warnings. Thanks to Gary Gregory. * LANG-1793: Fix Javadoc description in CharUtils.isAsciiAlphanumeric() #1501. Thanks to IcoreE. * LANG-1794: Fix Javadoc for RandomUtils.secure(), it incorrectly mentions securerandom.strongAlgorithms #1503. Thanks to IcoreE. * Fix NullPointerException in ReflectionDiffBuilder.getExcludeFieldNames() when instance created with ReflectionDiffBuilder.ReflectionDiffBuilder(T, T, ToStringStyle). Thanks to Gary Gregory. * Fail-fast for a null DiffBuilder in ReflectionDiffBuilder.ReflectionDiffBuilder(DiffBuilder, String[]) instead of getting a NullPointerException in ReflectionDiffBuilder instance methods. Thanks to Gary Gregory. * Fix NumberUtilsTest#testMaxDouble() and testMaxFloat() #4959. Thanks to Michael Hausegger, Gary Gregory. * LANG-1797: Fix Javadoc for IEEE754rUtils.max(float...) and IEEE754rUtils.max(double...). Thanks to IcoreE. * LANG-1798: Fix StringUtilsSubstringTest.testCountMatches_char() to call the correct method. Thanks to IcoreE, Gary Gregory. * LANG-1799: Make private static variables final in RandomStringUtils #1513. Thanks to IcoreE, Gary Gregory. * Speed up StringUtils.getDigits(String) #1515. Thanks to David Du, Gary Gregory. * Remove redundant length check in StringUtils.isBlank(CharSequence) #1516. Thanks to David Du, Gary Gregory. * LANG-1800: Incorrect grammar and unclear wording in RandomStringUtils#random method #1520. Thanks to IcoreE. * LANG-1802: Fix collision in CharRange.hashCode(). Thanks to Gary Gregory, IcoreE. * Fix race condition in Fraction.hashCode(). Thanks to Gary Gregory. * Fix race condition in Range.hashCode(). Thanks to Gary Gregory. * Document safer deserialization option in Javadoc for SerializationUtils. Thanks to Gary Gregory, Akshat_Agg. * LANG-1729: NumberUtils.isParsable(String) returns true for full width Unicode digits for inputs with a decimal point. Thanks to Gary Gregory, Andrei Anischevici, Akshat_Agg. * LANG-1803: Fix incorrect method invocation in ObjectUtilsTest and Javadoc reference in RandomStringUtils. Thanks to IcoreE. * LANG-1695: Allow trailing decimal point in NumberUtils.isParsable(String) #1531. Thanks to Guillaume Nodet, Harshit Goel, Gary Gregory. * LANG-1804: Fix CharSet#getInstance returns null instead of EMPTY when input setStrs is null #1530. Thanks to IcoreE, Gary Gregory. * Speedup CharSequenceUtils.toCharArray(CharSequence) for StringBuilder input: 160-205% improvement (2-3x faster), see CharSequenceUtilsBenchmark. Thanks to Gary Gregory. * Speedup CharSequenceUtils.toCharArray(CharSequence) for StringBuffer input: 300-4,250% improvement (4-44x faster), see CharSequenceUtilsBenchmark. Thanks to Gary Gregory. * Speedup CharSequenceUtils.toCharArray(CharSequence) for String input: ~1-2% improvement (essentially identical). Thanks to Gary Gregory. * Streamline StringUtils.truncate(String, int, int). Thanks to Gary Gregory. * Fix Javadoc comma spacing #1538. Thanks to Gary Gregory, sekharchowdary774. * LANG-1807: Make private static variables final in RandomUtils. Thanks to Zhongxin Yan, Gary Gregory. * LANG-1448: Javadoc: Normalize some varargs examples. Thanks to David W. Burhans, Gary Gregory, kamGP92. * LANG-1805: Speedup StringUtils.join(AllPrimitiveTypes[], char, int, int), see StringUtilsJoinBenchmark, based on #1532. Also better StringBuilder allocation Thanks to Gary Gregory, jher235. * LANG-1749: TypeUtils.isAssignable returns a wrong result for ParameterizedType when raw class is "Class" #1548. Thanks to jinwoo choi, Gary Gregory, YuMing Ma, Ivan ?ari?. * LANG-1700: Improve handling of parameterized types and variable unrolling. Thanks to seokhyeon moon, Gary Gregory, Ivan ?ari?. * LANG-1811: ArrayUtils.shuffle() throws NullPointerException for null array input. Thanks to Raju Gupta, Gary Gregory. * [javadoc] Fix incorrect exception type in CharUtils Javadoc examples #1563. Thanks to Dennis Ginter, Gary Gregory. * LANG-1806: [javadoc] Fix incorrect class names in RegExUtils Javadoc examples #1564. Thanks to Dennis Ginter, Gary Gregory. * NumberUtils.isParsable("1.f") should return true #1560. Thanks to Gary Gregory, Jagdish Singh Bisht. * Simplify literal assignments in ArrayFillTest #1567. Thanks to Gary Gregory, David Du. * Make ArrayUtils methods implementation consistent with other overloads #1568. Thanks to Gary Gregory, David Du. * Fix handling of null marker in StringUtils.abbreviate(String, String, int, int) #1571. Thanks to ThrawnCA, Gary Gregory. * Better exception messages from FastDateParser.parse(String). Thanks to Gary Gregory. * Simplify NumberUtils.isParsable(String) #1570. Thanks to Gary Gregory, David Du. * RandomStringUtils.random() methods may not return when asked to generate only letters or only numbers while provided with a range that contains neither. Thanks to Gary Gregory. * Fix Javadoc parameter comments in StringUtils.truncate() methods #1536. Thanks to Gary Gregory, Akshat Upadhyay. * Improve test coverage for TypeUtils.isAssignable() #1574. Thanks to Gary Gregory, Dhaneesh.M. * Improve branch coverage for Processor (isAarch64, isRISCV); add ProcessorTest #1578. Thanks to Gary Gregory, Dhaneesh.M. * Fix ClassNotFoundException message in ClassUtils.getClass(String) #1577. Thanks to Gary Gregory, ?????. * Fix Javadoc in DoubleRange.of(Double, Double) to reflect actual exception type thrown #1581. Thanks to Ivan Ponomarev. * LANG-1452: RecursiveToStringStyle and MultilineRecursiveToStringStyle shouldn't recurse into a java.math.BigDecimal #1584. Thanks to Gary Gregory, Aleksey Novozhilov, Sara. * LANG-1814: ArrayUtils.subarray(..) may overflow index arithmetic and violate contract for extreme index values. Thanks to Ivan Ponomarev. * LANG-1816: ArrayUtils contains/indexOf/indexesOf with tolerance fail to match NaN values #1589. Thanks to Ivan Ponomarev, Gary Gregory. * Fix StringIndexOutOfBoundsException message in StrBuilder.append(char[], int, int). Thanks to Ivan Ponomarev, Gary Gregory. * LANG-1818: Fix ClassUtils.getShortClassName(Class) to correctly handle $ in valid class names #1591. Thanks to Ivan Ponomarev, Gary Gregory. * ThreadUtils.sleepQuietly(Duration) now restores the current thread's interrupt flag when catching InterruptedException. Thanks to Ivan Ponomarev, Gary Gregory. * LANG-1817: UncheckedFutureImpl clears thread interrupt status when wrapping InterruptedException #1590. Thanks to Ivan Ponomarev, Gary Gregory. * Fix StringUtils.abbreviate(String, String, int) contract violations #1572. Thanks to ThrawnCA, Gary Gregory. * Add test coverage for negative-day adjustment in DurationFormatUtils #1596. Thanks to TK_ENDO, Arnout Engelen, Gary Gregory. * [Javadoc] Add usage examples to CharSet.contains(char) #1605. Thanks to Mohammad Bireybi, Gary Gregory. * CharSet now maintains iteration order. Thanks to Gary Gregory. * LANG-771: DateUtils.ceiling does not behave correctly for dates on the boundaries. Thanks to Ryan Holmes, Makarand Hinge, Gary Gregory. * LANG-1819: [LANG-] Javadoc ArrayUtils.removeAll() null input behavior #1614. Thanks to Partha Protim Paul, Gary Gregory. * LANG-1813: ArrayUtils#hashCode() Javadoc incorrectly states ?null returns zero? (actual result is 629). Thanks to Ivan Ponomarev, Gary Gregory. * Deprecate Validate.Validate(). Thanks to Gary Gregory. * LANG-1820: [javadoc] Fix ObjectUtils.anyNull(Object) for empty arrays. Thanks to Partha Paul, Gary Gregory. * Fix StopWatch's stopInstant match stopTimeNanos when split is called #1610. Thanks to Lars Helge Øverland, Gary Gregory. * Fix NullPointerException in StopWatch.getStopTime(). Thanks to Gary Gregory. * Add "ppc64le" to ArchUtils #1625. See https://bugs.gentoo.org/972590 Bug 972590 - dev-java/commons-lang-3.20.0: java.lang.NullPointerException: Cannot invoke "org.apache.commons.lang3.arch.Processor.toString()" because "" Thanks to Volkmar W. Pogatzki, Gary Gregory. * LANG-1821: NumberUtils.isCreatable(String) should match NumberUtils.createNumber(String), exactly #1626. Thanks to FloydDsilva, Gary Gregory, Rob Tompkins. * NumberUtils.isCreatable fails for hexadecimal numbers with long type qualifier. Thanks to ????, Gary Gregory. * NumberUtils.createNumber() performance: Short-circuit check based on pre-derived candidate Double #1628. Thanks to ax1nch, Gary Gregory. * LANG-1823: LocaleUtils.toLocale cannot parse valid JDK Locale string containing '#' #1630. Thanks to ????, Gary Gregory. * LANG-879: LocaleUtils test fails with new Locale "ja_JP_JP_#u-ca-japanese" of JDK7. Thanks to Matthew T. Adams, Gary Gregory. * Fix typo in SystemProperties.JDK_XML_ENTITY_REPLACEMENT_LIMIT (#1631). Thanks to Omkhar Arasaratnam, Gary Gregory. * Recompute Range cached hash codes on deserialization while retaining endpoint and comparator validation (#1633). Thanks to Omkhar Arasaratnam, Gary Gregory. * Harden Fraction.readObject() to reject bad cached hash code (#1634). Thanks to Omkhar Arasaratnam, Gary Gregory. * NumberUtils.createNumber(String): Float shortcut can bypass exact decimal parsing (#1635). Thanks to Omkhar Arasaratnam, Gary Gregory. * StringUtils.joins() for primitive types can throw OOME before index check (#1636). Thanks to Omkhar Arasaratnam, Gary Gregory. * Annotation lookup in MethodUtils.getAnnotation(Method, Class, boolean, boolean) matches unrelated overloads via assignable-parameter resolution (#1637). Thanks to Omkhar Arasaratnam, Gary Gregory. * RandomStringUtils.random(...): A custom chars array throws IllegalArgumentException because validation loops treat the loop index as a char code point instead of an index into the chars array (#1638). Thanks to Omkhar Arasaratnam, Gary Gregory. * RandomStringUtils.random(...): Can hang when the specified [start, end) range contains ONLY rejected code points (UNASSIGNED, PRIVATE_USE, SURROGATE). The loop increments count and retries indefinitely (#1638). Thanks to Omkhar Arasaratnam, Gary Gregory. * TimedSemaphore.shutdown() must wake threads blocked in acquire() (#1639). Thanks to Omkhar Arasaratnam, Gary Gregory. * NaN bypass in primitive double range validators (#1640). Thanks to Omkhar Arasaratnam, Gary Gregory. * LANG-1826: StringUtils.repeat(String, [String,] int) now throws IllegalArgumentException instead of NegativeArraySizeException (#1644). Thanks to Cyl, Gary Gregory, Piotr Karwasz. * LANG-1825: EqualsBuilder.reflectionAppend ttries to set visibility on excluded fields #1647. Thanks to Daniel Skiles, Gary Gregory. * ToStringStyle.appendDetail(StringBuffer,String,Collection) bypass cycle registry. #1648. Thanks to Omkhar Arasaratnam, Gary Gregory. * ToStringStyle.appendDetail(StringBuffer,String,Map) bypass cycle registry. #1648. Thanks to Gary Gregory. * WordUtils.wrap() zero-width wrapOn regex match causes infinite loop (#1649).WordUtils.wrap() zero-width wrapOn regex match causes infinite loop (#1649). Thanks to Omkhar Arasaratnam, Gary Gregory. * HashCodeBuilder.append(Object) StackOverflowError on mutually-referential objects (#1650). Thanks to Omkhar Arasaratnam, Gary Gregory. * AtomicSafeInitializer.get() busy-spin without yield burns CPU during slow initialization (#1651). Thanks to Omkhar Arasaratnam, Gary Gregory. * StrBuilder.readFrom(Readable) exposes stale internal buffer to Readable parameter (#1652). Thanks to Omkhar Arasaratnam, Gary Gregory. * EqualsBuilder.reflectionEquals() array branch missing cycle guard causes stack overflow on self-referential Object arrays (#1653). Thanks to Omkhar Arasaratnam, Gary Gregory. * WordUtils.wrap() leaves separator characters in the output when the wrapOn regex match is longer than one character (#1655). Thanks to Piotr Karwasz. * StringUtils.indexOfAny(CharSequence, int, char...) should not throw for a bad index (#1656). Thanks to Omkhar Arasaratnam, Gary Gregory. * StrBuilder.deleteImpl(int, int, int) doesn't clear its unused bytes. (#1654). Thanks to Omkhar Arasaratnam, Gary Gregory. * LocaleUtils.parseLocale(String) operator precedence bug allows invalid language with numeric country (#1658). Thanks to Omkhar Arasaratnam, Gary Gregory. * DurationUtils.toMillisInt() throws ArithmeticException on long overflows before clamping (#1657). Thanks to Omkhar Arasaratnam, Gary Gregory. * FastDatePrinter WeekYear rule calls Calendar.getWeekYear() may throw UnsupportedOperationException (#1659). Thanks to Omkhar Arasaratnam, Gary Gregory. * DateUtils.parseDateWithLeniency() doesn't reset its time zone (#1660). Thanks to Omkhar Arasaratnam, Gary Gregory. * FormattableUtils.append re-parses literal output as format string (#1661). Thanks to Omkhar Arasaratnam, Gary Gregory. * ClassUtils.getShortClassName(String) can throw NoClassDefFoundError on malformed inner classes (#1665). Thanks to Omkhar Arasaratnam, Gary Gregory. * TimeZones.GMT is a mutable public static final field (#1666). Thanks to Omkhar Arasaratnam, Gary Gregory. * CompareToBuilder lacks cycle guard on Object[] recursion. (#1669). Thanks to Omkhar Arasaratnam, Gary Gregory. * ClassUtils.toCleanName(String) resolves malformed array suffixes (#1670). Thanks to Omkhar Arasaratnam, Gary Gregory. * StrBuilder.setLength(int) shrink-branch leaves residual chars in buffer tail (#1671). Thanks to Omkhar Arasaratnam, Gary Gregory. * StrBuilder.replaceImpl() shrink-branch leaves residual chars in buffer tail (#1672). Thanks to Omkhar Arasaratnam, Gary Gregory. * NumericEntityUnescaper.translate() throws IllegalArgumentException for values out of range (#1673). Thanks to Omkhar Arasaratnam, Gary Gregory. * FastTimeZone.getGmtTimeZone() Javadoc promises null on no-match; regex always matches (#1674). Thanks to Omkhar Arasaratnam, Gary Gregory. * Range.readObject() does not null-check comparator, minimum, or maximum (#1675). Thanks to Omkhar Arasaratnam, Gary Gregory. * Make the StopWatch more reliable for tracking nanos, adjust suspend test (#1677). Thanks to Gary Gregory. * LANG-1801: RandomStringUtils.random() does not strictly validate start and end (#1682). Thanks to Zhongxin Yan, Gary Gregory. * Fix CharSequenceUtils.lastIndexOf for supplementary code points #1684. Thanks to alhudz, Gary Gregory. * Range.readObject() does not re-assert the comparator/ordering invariant (#1686). Thanks to Omkhar Arasaratnam, Gary Gregory. * Fraction.readObject() does not re-assert denominator != 0 (#1688). Thanks to Omkhar Arasaratnam, Gary Gregory. * FastDateParser.readObject(ObjectInputStream) now validates the same (#1692). Thanks to Omkhar Arasaratnam, Gary Gregory. * Fix StringUtils.indexOfAny() matching an unpaired trailing high surrogate (#1687). Thanks to alhudz, Gary Gregory. * Fix LookupTranslator code point consumption for supplementary keys (#1691). Thanks to alhudz, Gary Gregory. * Re-assert CharRange start <= end invariant in readObject (#1693). Thanks to alhudz, Gary Gregory. * FluentBitSet.readObject(ObjectInputStream) should validate constructor invariants (#1694). Thanks to Gary Gregory. * EventListenerSupport.readObject(ObjectInputStream) should validate constructor invariants (#1695). Thanks to Gary Gregory. * Correct JavaDoc in Strings.java concerning case-sensitivity (#1696). Thanks to mfg92. * Fix case-insensitive Strings.replace() dropping length-changing matches (#1697). Thanks to alhudz, Gary Gregory. * Fix int overflow in StringUtils.midString() and StrBuilder.midString() length handling (#1699). Thanks to alhudz. * Throw IllegalArgumentException for trailing whitespace in ExtendedMessageFormat argument index (#1701). Thanks to Gary Gregory, Javid Khan. * Reject doubled leading sign in NumberUtils.createBigInteger (#1702). Thanks to alhudz, Gary Gregory. * Fix RandomStringUtils.random() false rejection of letters and digits (#1703). Thanks to alhudz, Gary Gregory. * Fix substringAfter(Last) for supplementary code points (#1707). Thanks to alhudz, Gary Gregory. * Strip L suffix for oversized hex literals in createNumber (#1712). Thanks to alhudz, Gary Gregory. * Fix spurious overflow in Fraction.add/subtract for coprime denominators (#1709). Thanks to alhudz, Gary Gregory. * Drop trailing empty token from splitByWholeSeparator (#1710). Thanks to alhudz, Gary Gregory. * Fix indexOfDifference splitting a surrogate pair (#1713). Thanks to alhudz, Gary Gregory. * Fix int mask sign extension in BitField long methods (#1711). Thanks to alhudz, Gary Gregory. * Account for duplicate values in ObjectUtils.median() (#1715). Thanks to alhudz, Gary Gregory. * Fix silent int overflow in Fraction.getFraction(double) (#1717). Thanks to alhudz, Gary Gregory. * Find NaN in ArrayUtils.lastIndexOf for double and float arrays (#1718). Thanks to alhudz, Gary Gregory. * Reject sign characters in UnicodeUnescaper hex values (#1721). Thanks to alhudz, Gary Gregory. * Keep abbreviate and truncate off surrogate pair boundaries (#1719). Thanks to alhudz, Gary Gregory. * Keep initials from splitting a supplementary code point (#1722). Thanks to alhudz, Gary Gregory. * Fix int overflow in DurationFormatUtils.formatPeriod (#1720). Thanks to alhudz, Gary Gregory. * Fix CsvUnescaper bounds error on a single quote field (#1723). Thanks to alhudz, Gary Gregory. * LANG-1824: Fix Strings.replace overflow on large replacements (#1716). Thanks to Dhruv Aggarwal, Gary Gregory. * Classify supplementary code points in StringUtils is* predicates (#1724). Thanks to alhudz, Gary Gregory. * Emit surrogate pair for supplementary code points in UnicodeEscaper (#1726). Thanks to alhudz, Gary Gregory. * Fix MethodUtils.getMatchingMethod false ambiguity on boxed arguments (#1727). Thanks to alhudz, Gary Gregory. * Fold supplementary code points in CharSequenceUtils.regionMatches (#1725). Thanks to alhudz, Gary Gregory. * Fix WordUtils.containsAllWords missing words across line breaks (#1732). Thanks to alhudz, Gary Gregory. * Handle supplementary code points in WordUtils case methods (#1728). Thanks to alhudz, Gary Gregory. * Fix StringUtils.getDigits dropping supplementary digits (#1729). Thanks to alhudz, Gary Gregory. * Keep StrBuilder.reverse from splitting surrogate pairs (#1730). Thanks to alhudz, Gary Gregory. * Fix NumberUtils min/max varargs dropping the sign of zero (#1733). Thanks to alhudz, Gary Gregory. * Handle supplementary code points in StringUtils.splitByCharacterType() (#1734). Thanks to alhudz, Gary Gregory. * LANG-1828: Fix OOM in StringUtils.leftPad/rightPad when size is Integer.MIN_VALUE (#1736). Thanks to Dhruv Aggarwal, Gary Gregory. * Fix Strings.CI.indexOf() returning out-of-range index for empty search (#1737). Thanks to alhudz, Gary Gregory. * LANG-1827: Support escaped single quotes ('') in DurationFormatUtils format patterns (#1700). Thanks to Sarankumar Baskar, Gary Gregory. * Keep DurationFormatUtils.lexx() from merging repeated fields split by a literal (#1738). Thanks to alhudz, Gary Gregory. * Reject hex letters in NumericEntityUnescaper decimal scan (#1739). Thanks to alhudz, Gary Gregory. * Keep FastDateParser numeric parse from throwing on int overflow (#1741). Thanks to alhudz, Gary Gregory. * Keep FastDateParser.parse error message intact for Japanese imperial locale (#1743). Thanks to alhudz, Gary Gregory. * Keep ExtendedMessageFormat from rejecting a quoted format style (#1744). Thanks to alhudz, Gary Gregory. * Match String case folding in StrBuilder.equalsIgnoreCase (#1745). Thanks to alhudz, Gary Gregory. * Fix FieldUtils.getField false ambiguity on inherited interface field (#1748). Thanks to alhudz, Gary Gregory. * Skip Chuvash locale parser tests on Java 27 (#1746). Thanks to Sarankumar Baskar, Gary Gregory. * Fix ArrayUtils.reverse range underflow on Integer.MIN_VALUE end (#1750). Thanks to alhudz, Gary Gregory. * Fix sign extension in BitField.getValue for top-bit fields (#1749). Thanks to alhudz, Gary Gregory. * Fix int overflow in FluentBitSet.setInclusive at Integer.MAX_VALUE (#1751). Thanks to alhudz, Gary Gregory. * Add messages when throwing NullPointerException. Thanks to Gary Gregory. * [Javadoc] Fix Failable class comment to clarify comparison of lambda versions (#1752). Thanks to Konrad Windszus. * LANG-1829: Add tests for DateUtils.truncatedCompareTo and truncatedEquals (#1753). Thanks to Maksym Korshun. * LANG-1830: Avoid repeated regex compilation in ClassUtils.toCleanName() (#1754). Thanks to Maksym Korshun. * Add missing test for ObjectUtils.isEmpty(Object) and wait(Object, Duration) (#1755, #1756). Thanks to Maksym Korshun, Gary Gregory. * Fix negative week year formatting in FastDatePrinter (#1762). Thanks to alhudz, Gary Gregory. * Keep abbreviateMiddle off surrogate pair boundaries (#1758). Thanks to kdelay, Gary Gregory. * LANG-1815: Fix AnnotationUtils.equals for package-private annotations (#1760). Thanks to Maksym Korshun, Gary Gregory. * Fix two Javadoc errors in StringUtils (#1763). Thanks to hunghhdev. * Reject non-ASCII hex characters in Conversion.hexDigitToInt (#1767). Thanks to alhuda, Gary Gregory. * Fix the overflow bound direction in Instants.toMillisSince(Instant) (#1766). Thanks to renechoi, Gary Gregory. * Fix spurious overflow in Fraction.multiplyBy for unreduced operands (#1769). Thanks to alhuda, Gary Gregory. * Fix low surrogate false match in StringUtils containsAny/containsNone/indexOfAny (#1771). Thanks to alhuda, Gary Gregory. * Keep StringUtils.chop from splitting a trailing surrogate pair (#1770). Thanks to alhuda, Gary Gregory. * Keep StringUtils stripStart and stripEnd off surrogate pair boundaries (#1773). Thanks to alhuda, Gary Gregory. * Fix the month/day example in DurationFormatUtils.formatPeriod Javadoc (#1772). Thanks to codeAnqiang-ma, Gary Gregory. * Fix typos in Javadoc and example comments (#1774). Thanks to gaurav kumar pandey, Gary Gregory. * Fix CharRange.contains(CharRange) for negated argument ranges (#1775). Thanks to alhuda, Gary Gregory. * Fix SpotBugs USO_UNSAFE_METHOD_SYNCHRONIZATION in CharSet. Thanks to Gary Gregory. * Keep StopWatch.formatSplitTime from clamping splits to int millis (#1777). Thanks to alhuda, Gary Gregory. * Keep StringUtils left, right, mid, and overlay off surrogate pair boundaries (#1776). Thanks to gaurav kumar pandey, Gary Gregory. * Align ReflectionDiffBuilder with AbstractReflection and add cycle detection to prevent StackOverflowError on cyclic object graphs. Thanks to Gaurav Pandey, Gary Gregory. * Fix DurationFormatUtils.formatPeriod() calculation when pattern omits 'M' (#1780). Thanks to gaurav kumar pandey, Gary Gregory. * FastDateParser parses 'Y' (week year) as plain calendar year; asymmetric with FastDatePrinter and with SimpleDateFormat; boundary dates shift by a full year, silently (f002). Thanks to Gary Gregory. * UnicodeUnescaper.unescapeJava/EcmaScript/Json: malformed \u sequences throw undeclared IllegalArgumentException, AND non-ASCII digit spellings of \u escapes are silently accepted; both arms of one missing ASCII-hex prescan (f004). Thanks to Gary Gregory. * StringUtils.replaceEachRepeatedly derives its recursion budget from the input itself; the documented StackOverflowError protection fails on large tables, and expanding rules amplify text 64x even at the default TTL (f005). Thanks to Gary Gregory. * EventUtils.EventBindingInvocationHandler.invoke() dispatches Object.hashCode/equals/toString into the bound business method (empty-eventTypes default), or returns null -> NPE from hash collections (non-empty) (f006). Thanks to Gary Gregory. * LocaleUtils static caches no longer grows on invalid input to LocaleUtils.countriesByLanguage(String) (f007). Thanks to Gary Gregory. * LocaleUtils static caches no longer grows on invalid input to LocaleUtils.countriesByLanguage(String) (f007). Thanks to Gary Gregory. * ExtendedMessageFormat.applyPattern() is quadratic: full pattern.toCharArray() per token (f008). Thanks to Gary Gregory. * WordUtils.wrap(wrapLongWords=false, the 2-arg default) copies the entire remaining string every iteration. (f009). Thanks to Gary Gregory. * FastDateParser.parse throws undeclared IllegalArgumentException, NullPointerException, and IllegalStateException on crafted date strings (f010). Thanks to Gary Gregory. * Memoizer: default caches the first failure forever, has no size bound or eviction, and runs the user computation inside the ConcurrentHashMap bin lock (blocking unrelated keys, deadlocking reentrant use) (f011). Thanks to Gary Gregory. * StringEscapeUtils.escapeEcmaScript() misses backtick/template-literal (`, ${) and inline-script parser-state sequences (