class SimpleDateFormatX
        extends SimpleDateFormat {
    transient boolean format19;
    transient boolean format10;

    public SimpleDateFormatX(String pattern) {
        super(pattern);
        switch (pattern) {
            case "yyyy-MM-dd HH:mm:ss":
                format19 = true;
                break;
            case "yyyy-MM-dd":
                format10 = true;
                break;
            default:
                break;
        }
    }

    @Override
    public StringBuffer format(
            Date date,
            StringBuffer toAppendTo,
            FieldPosition pos
    ) {
        if (format19 || format10) {
            calendar.setTime(date);

            int year = calendar.get(Calendar.YEAR);
            int month = calendar.get(Calendar.MONTH) + 1;
            int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);

            toAppendTo.append(year).append('-');
            if (month < 10) {
                toAppendTo.append('0');
            }
            toAppendTo.append(month).append('-');
            if (dayOfMonth < 10) {
                toAppendTo.append('0');
            }
            toAppendTo.append(dayOfMonth);
            if (format10) {
                return toAppendTo;
            }

            int hour = calendar.get(Calendar.HOUR_OF_DAY);
            int minute = calendar.get(Calendar.MINUTE);
            int second = calendar.get(Calendar.SECOND);

            toAppendTo.append(' ');
            if (hour < 10) {
                toAppendTo.append('0');
            }
            toAppendTo.append(hour).append(':');
            if (minute < 10) {
                toAppendTo.append('0');
            }
            toAppendTo.append(minute).append(':');
            if (second < 10) {
                toAppendTo.append('0');
            }
            toAppendTo.append(second);
            return toAppendTo;
        }

        return super.format(date, toAppendTo, pos);
    }

    public Date parse(String text) throws ParseException {<FILL_FUNCTION_BODY>}
}

        if (text != null) {
            final int textLength = text.length();
            if ((format10 && textLength == 10) || (format19 && textLength == 19)) {
                char c0 = text.charAt(0);
                char c1 = text.charAt(1);
                char c2 = text.charAt(2);
                char c3 = text.charAt(3);
                char c4 = text.charAt(4);
                char c5 = text.charAt(5);
                char c6 = text.charAt(6);
                char c7 = text.charAt(7);
                char c8 = text.charAt(8);
                char c9 = text.charAt(9);

                int year, month, dayOfMonth;
                if (c0 >= '0' && c0 <= '9'
                        && c1 >= '0' && c1 <= '9'
                        && c2 >= '0' && c2 <= '9'
                        && c3 >= '0' && c3 <= '9'
                        && c4 == '-'
                        && c5 >= '0' && c5 <= '9'
                        && c6 >= '0' && c6 <= '9'
                        && c7 == '-'
                        && c8 >= '0' && c8 <= '9'
                        && c9 >= '0' && c9 <= '9'
                ) {
                    year = (c0 - '0') * 1000 + (c1 - '0') * 100 + (c2 - '0') * 10 + (c3 - '0');
                    month = (c5 - '0') * 10 + (c6 - '0');
                    dayOfMonth = (c8 - '0') * 10 + (c9 - '0');
                } else {
                    return super.parse(text);
                }

                int dom = 31;
                switch (month) {
                    case 2:
                        boolean isLeapYear = (year & 15) == 0 ? (year & 3) == 0 : (year & 3) == 0 && year % 100 != 0;
                        dom = isLeapYear ? 29 : 28;
                        break;
                    case 4:
                    case 6:
                    case 9:
                    case 11:
                        dom = 30;
                        break;
                }

                if (year >= -999999999 && year <= 999999999
                        && month >= 1 && month <= 12
                        && dayOfMonth >= 1 && dayOfMonth <= dom
                ) {
                    calendar.set(Calendar.YEAR, year);
                    calendar.set(Calendar.MONTH, month - 1);
                    calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);

                    if (format10) {
                        calendar.set(Calendar.HOUR_OF_DAY, 0);
                        calendar.set(Calendar.MINUTE, 0);
                        calendar.set(Calendar.SECOND, 0);
                        calendar.set(Calendar.MILLISECOND, 0);

                        return calendar.getTime();
                    }
                } else {
                    return super.parse(text);
                }

                char c10 = text.charAt(10);
                char c11 = text.charAt(11);
                char c12 = text.charAt(12);
                char c13 = text.charAt(13);
                char c14 = text.charAt(14);
                char c15 = text.charAt(15);
                char c16 = text.charAt(16);
                char c17 = text.charAt(17);
                char c18 = text.charAt(18);

                int hour, minute, second;
                if (c10 == ' '
                        && c11 >= '0' && c11 <= '9'
                        && c12 >= '0' && c12 <= '9'
                        && c13 == ':'
                        && c14 >= '0' && c14 <= '9'
                        && c15 >= '0' && c15 <= '9'
                        && c16 == ':'
                        && c17 >= '0' && c17 <= '9'
                        && c18 >= '0' && c18 <= '9'
                ) {
                    hour = (c11 - '0') * 10 + (c12 - '0');
                    minute = (c14 - '0') * 10 + (c15 - '0');
                    second = (c17 - '0') * 10 + (c18 - '0');

                    if (hour >= 0 && hour <= 23
                            && minute >= 0 && minute <= 59
                            && second >= 0 && second <= 59
                    ) {
                        calendar.set(Calendar.HOUR_OF_DAY, hour);
                        calendar.set(Calendar.MINUTE, minute);
                        calendar.set(Calendar.SECOND, second);
                        calendar.set(Calendar.MILLISECOND, 0);

                        return calendar.getTime();
                    }
                } else {
                    return super.parse(text);
                }
            }
        }
        return super.parse(text);
    
<methods>public void <init>() ,public void <init>(java.lang.String) ,public void <init>(java.lang.String, java.util.Locale) ,public void <init>(java.lang.String, java.text.DateFormatSymbols) ,public void applyLocalizedPattern(java.lang.String) ,public void applyPattern(java.lang.String) ,public java.lang.Object clone() ,public boolean equals(java.lang.Object) ,public java.lang.StringBuffer format(java.util.Date, java.lang.StringBuffer, java.text.FieldPosition) ,public java.text.AttributedCharacterIterator formatToCharacterIterator(java.lang.Object) ,public java.util.Date get2DigitYearStart() ,public java.text.DateFormatSymbols getDateFormatSymbols() ,public int hashCode() ,public java.util.Date parse(java.lang.String, java.text.ParsePosition) ,public void set2DigitYearStart(java.util.Date) ,public void setDateFormatSymbols(java.text.DateFormatSymbols) ,public java.lang.String toLocalizedPattern() ,public java.lang.String toPattern() <variables>static final boolean $assertionsDisabled,private static final java.lang.String GMT,private static final int MILLIS_PER_MINUTE,private static final int[] PATTERN_INDEX_TO_CALENDAR_FIELD,private static final int[] PATTERN_INDEX_TO_DATE_FORMAT_FIELD,private static final java.text.DateFormat.Field[] PATTERN_INDEX_TO_DATE_FORMAT_FIELD_ID,private static final int[] REST_OF_STYLES,private static final int TAG_QUOTE_ASCII_CHAR,private static final int TAG_QUOTE_CHARS,private static final ConcurrentMap<java.util.Locale,java.text.NumberFormat> cachedNumberFormatData,private transient char[] compiledPattern,static final int currentSerialVersion,private java.util.Date defaultCenturyStart,private transient int defaultCenturyStartYear,private transient boolean forceStandaloneForm,private java.text.DateFormatSymbols formatData,private transient boolean hasFollowingMinusSign,private java.util.Locale locale,private transient char minusSign,private transient java.text.NumberFormat originalNumberFormat,private transient java.lang.String originalNumberPattern,private java.lang.String pattern,private int serialVersionOnStream,static final long serialVersionUID,transient boolean useDateFormatSymbols,private transient char zeroDigit