class LineMatcher {
    // Line Matcher States
    public static final int NOT_MATCHED = 0;
    public static final int MATCHED = 1;
    public static final int WAIT = 2;

    /**
     * Tells whether the matching should be done in a case-insensitive manner.
     */
    private final boolean caseInsensitive;

    /**
     * Create a {@code LineMatcher} instance.
     *
     * @param caseInsensitive if {@code true}, matching should not consider
     * case differences significant
     */
    LineMatcher(boolean caseInsensitive) {
        this.caseInsensitive = caseInsensitive;
    }

    /**
     * Check if two strings are equal. If this is a case-insensitive matcher,
     * the check will return true if the only difference between the strings
     * is difference in case.
     */
    boolean equal(String s1, String s2) {
        return compareStrings(s1, s2) == 0;
    }

    /**
     * Compare two strings and return -1, 0 or 1 if the first string is
     * lexicographically smaller than, equal to or greater than the second
     * string. If this is a case-insensitive matcher, case differences will
     * be ignored.
     */
    int compareStrings(String s1, String s2) {<FILL_FUNCTION_BODY>}

    /**
     * Normalize a string token for comparison with other string tokens. That
     * is, convert to lower case if this is a case-insensitive matcher.
     * Otherwise, return the string itself.
     */
    String normalizeString(String s) {
        if (s == null) {
            return null;
        } else if (caseInsensitive) {
            return s.toLowerCase(Locale.ROOT);
        } else {
            return s;
        }
    }

    public abstract int match(String line);
}

        if (s1 == null) {
            return s2 == null ? 0 : -1;
        } else if (caseInsensitive) {
            return s1.compareToIgnoreCase(s2);
        } else {
            return s1.compareTo(s2);
        }
    
<no_super_class>