docs: static boolean regionMatches(final CharSequence cs, final boolean ignoreCase, final int thisStart,
                                   final CharSequence substring, final int start, final int length)    {
          if (cs instanceof String && substring instanceof String) {
              return ((String) cs).regionMatches(ignoreCase, thisStart, (String) substring, start, length);
          }
          int index1 = thisStart;
          int index2 = start;
          int tmpLen = length;
  
          // Extract these first so we detect NPEs the same as the java.lang.String version
          final int srcLen = cs.length() - thisStart;
          final int otherLen = substring.length() - start;
  
          // Check for invalid parameters
          if (thisStart < 0 || start < 0 || length < 0) {
              return false;
          }
  
          // Check that the regions are long enough
          if (srcLen < length || otherLen < length) {
              return false;
          }
  
          while (tmpLen-- > 0) {
              final char c1 = cs.charAt(index1++);
              final char c2 = substring.charAt(index2++);
  
              if (c1 == c2) {
                  continue;
              }
  
              if (!ignoreCase) {
                  return false;
              }
  
              // The same check as in String.regionMatches():
              if (Character.toUpperCase(c1) != Character.toUpperCase(c2)
                      && Character.toLowerCase(c1) != Character.toLowerCase(c2)) {
                  return false;
              }
          }
  
          return true;
      }