// Generated by Snowball 2.0.0 - https://snowballstem.org/

package org.tartarus.snowball.ext;

import org.tartarus.snowball.Among;

/**
 * This class implements the stemming algorithm defined by a snowball script.
 *
 * <p>Generated by Snowball 2.0.0 - https://snowballstem.org/
 */
@SuppressWarnings("unused")
public class TamilStemmer extends org.tartarus.snowball.SnowballStemmer {

  private static final long serialVersionUID = 1L;
  private static final java.lang.invoke.MethodHandles.Lookup methodObject =
      java.lang.invoke.MethodHandles.lookup();

  private static final Among a_0[] = {
    new Among("\u0B95", -1, -1),
    new Among("\u0B99", -1, -1),
    new Among("\u0B9A", -1, -1),
    new Among("\u0B9E", -1, -1),
    new Among("\u0BA4", -1, -1),
    new Among("\u0BA8", -1, -1),
    new Among("\u0BAA", -1, -1),
    new Among("\u0BAE", -1, -1),
    new Among("\u0BAF", -1, -1),
    new Among("\u0BB5", -1, -1)
  };

  private static final Among a_1[] = {
    new Among("\u0BA8\u0BCD\u0BA4", -1, -1),
    new Among("\u0BA8\u0BCD\u0BA4\u0BCD", -1, -1),
    new Among("\u0BA8\u0BCD", -1, -1)
  };

  private static final Among a_2[] = {
    new Among("\u0BBF", -1, -1), new Among("\u0BC0", -1, -1), new Among("\u0BC8", -1, -1)
  };

  private static final Among a_3[] = {
    new Among("\u0B95", -1, -1),
    new Among("\u0B9A", -1, -1),
    new Among("\u0B9F", -1, -1),
    new Among("\u0BA4", -1, -1),
    new Among("\u0BAA", -1, -1),
    new Among("\u0BB1", -1, -1)
  };

  private static final Among a_4[] = {
    new Among("\u0B95", -1, -1),
    new Among("\u0B9A", -1, -1),
    new Among("\u0B9F", -1, -1),
    new Among("\u0BA4", -1, -1),
    new Among("\u0BAA", -1, -1),
    new Among("\u0BB1", -1, -1)
  };

  private static final Among a_5[] = {
    new Among("\u0B95", -1, -1),
    new Among("\u0B9A", -1, -1),
    new Among("\u0B9F", -1, -1),
    new Among("\u0BA4", -1, -1),
    new Among("\u0BAA", -1, -1),
    new Among("\u0BB1", -1, -1)
  };

  private static final Among a_6[] = {
    new Among("\u0BAF", -1, -1),
    new Among("\u0BB0", -1, -1),
    new Among("\u0BB2", -1, -1),
    new Among("\u0BB3", -1, -1),
    new Among("\u0BB4", -1, -1),
    new Among("\u0BB5", -1, -1)
  };

  private static final Among a_7[] = {
    new Among("\u0B99", -1, -1),
    new Among("\u0B9E", -1, -1),
    new Among("\u0BA3", -1, -1),
    new Among("\u0BA8", -1, -1),
    new Among("\u0BA9", -1, -1),
    new Among("\u0BAE", -1, -1)
  };

  private static final Among a_8[] = {
    new Among("\u0BAF", -1, -1), new Among("\u0BB5", -1, -1), new Among("\u0BB5\u0BCD", -1, -1)
  };

  private static final Among a_9[] = {
    new Among("\u0BBE", -1, -1),
    new Among("\u0BBF", -1, -1),
    new Among("\u0BC0", -1, -1),
    new Among("\u0BC1", -1, -1),
    new Among("\u0BC2", -1, -1),
    new Among("\u0BC6", -1, -1),
    new Among("\u0BC7", -1, -1),
    new Among("\u0BC8", -1, -1)
  };

  private static final Among a_10[] = {
    new Among("\u0BBE", -1, -1),
    new Among("\u0BBF", -1, -1),
    new Among("\u0BC0", -1, -1),
    new Among("\u0BC1", -1, -1),
    new Among("\u0BC2", -1, -1),
    new Among("\u0BC6", -1, -1),
    new Among("\u0BC7", -1, -1),
    new Among("\u0BC8", -1, -1)
  };

  private static final Among a_11[] = {
    new Among("\u0B85", -1, -1), new Among("\u0B87", -1, -1), new Among("\u0B89", -1, -1)
  };

  private static final Among a_12[] = {
    new Among("\u0B95", -1, -1),
    new Among("\u0B99", -1, -1),
    new Among("\u0B9A", -1, -1),
    new Among("\u0B9E", -1, -1),
    new Among("\u0BA4", -1, -1),
    new Among("\u0BA8", -1, -1),
    new Among("\u0BAA", -1, -1),
    new Among("\u0BAE", -1, -1),
    new Among("\u0BAF", -1, -1),
    new Among("\u0BB5", -1, -1)
  };

  private static final Among a_13[] = {
    new Among("\u0B95", -1, -1),
    new Among("\u0B9A", -1, -1),
    new Among("\u0B9F", -1, -1),
    new Among("\u0BA4", -1, -1),
    new Among("\u0BAA", -1, -1),
    new Among("\u0BB1", -1, -1)
  };

  private static final Among a_14[] = {
    new Among("\u0BBE", -1, -1), new Among("\u0BC7", -1, -1), new Among("\u0BCB", -1, -1)
  };

  private static final Among a_15[] = {
    new Among("\u0BAA\u0BBF", -1, -1), new Among("\u0BB5\u0BBF", -1, -1)
  };

  private static final Among a_16[] = {
    new Among("\u0BBE", -1, -1),
    new Among("\u0BBF", -1, -1),
    new Among("\u0BC0", -1, -1),
    new Among("\u0BC1", -1, -1),
    new Among("\u0BC2", -1, -1),
    new Among("\u0BC6", -1, -1),
    new Among("\u0BC7", -1, -1),
    new Among("\u0BC8", -1, -1)
  };

  private static final Among a_17[] = {
    new Among("\u0BAA\u0B9F\u0BCD\u0B9F", -1, -1),
    new Among("\u0BAA\u0B9F\u0BCD\u0B9F\u0BA3", -1, -1),
    new Among("\u0BA4\u0BBE\u0BA9", -1, -1),
    new Among("\u0BAA\u0B9F\u0BBF\u0BA4\u0BBE\u0BA9", 2, -1),
    new Among("\u0B95\u0BC1\u0BB0\u0BBF\u0BAF", -1, -1),
    new Among("\u0BAA\u0B9F\u0BBF", -1, -1),
    new Among("\u0BAA\u0BB1\u0BCD\u0BB1\u0BBF", -1, -1),
    new Among("\u0BAA\u0B9F\u0BC1", -1, -1),
    new Among("\u0BB5\u0BBF\u0B9F\u0BC1", -1, -1),
    new Among("\u0BAA\u0B9F\u0BCD\u0B9F\u0BC1", -1, -1),
    new Among("\u0BB5\u0BBF\u0B9F\u0BCD\u0B9F\u0BC1", -1, -1),
    new Among("\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1", -1, -1),
    new Among("\u0BC6\u0BB2\u0BCD\u0BB2\u0BBE\u0BAE\u0BCD", -1, -1)
  };

  private static final Among a_18[] = {
    new Among("\u0B95", -1, -1),
    new Among("\u0B9A", -1, -1),
    new Among("\u0B9F", -1, -1),
    new Among("\u0BA4", -1, -1),
    new Among("\u0BAA", -1, -1),
    new Among("\u0BB1", -1, -1)
  };

  private static final Among a_19[] = {
    new Among("\u0B95", -1, -1),
    new Among("\u0B9A", -1, -1),
    new Among("\u0B9F", -1, -1),
    new Among("\u0BA4", -1, -1),
    new Among("\u0BAA", -1, -1),
    new Among("\u0BB1", -1, -1)
  };

  private static final Among a_20[] = {
    new Among("\u0BBE", -1, -1),
    new Among("\u0BBF", -1, -1),
    new Among("\u0BC0", -1, -1),
    new Among("\u0BC1", -1, -1),
    new Among("\u0BC2", -1, -1),
    new Among("\u0BC6", -1, -1),
    new Among("\u0BC7", -1, -1),
    new Among("\u0BC8", -1, -1)
  };

  private static final Among a_21[] = {
    new Among("\u0BBE", -1, -1),
    new Among("\u0BBF", -1, -1),
    new Among("\u0BC0", -1, -1),
    new Among("\u0BC1", -1, -1),
    new Among("\u0BC2", -1, -1),
    new Among("\u0BC6", -1, -1),
    new Among("\u0BC7", -1, -1),
    new Among("\u0BC8", -1, -1)
  };

  private static final Among a_22[] = {
    new Among("\u0BAA\u0B9F\u0BC1", -1, -1),
    new Among("\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BCD", -1, -1)
  };

  private static final Among a_23[] = {
    new Among("\u0B85", -1, -1),
    new Among("\u0B86", -1, -1),
    new Among("\u0B87", -1, -1),
    new Among("\u0B88", -1, -1),
    new Among("\u0B89", -1, -1),
    new Among("\u0B8A", -1, -1),
    new Among("\u0B8E", -1, -1),
    new Among("\u0B8F", -1, -1),
    new Among("\u0B90", -1, -1),
    new Among("\u0B92", -1, -1),
    new Among("\u0B93", -1, -1),
    new Among("\u0B94", -1, -1)
  };

  private static final Among a_24[] = {
    new Among("\u0BBE", -1, -1),
    new Among("\u0BBF", -1, -1),
    new Among("\u0BC0", -1, -1),
    new Among("\u0BC1", -1, -1),
    new Among("\u0BC2", -1, -1),
    new Among("\u0BC6", -1, -1),
    new Among("\u0BC7", -1, -1),
    new Among("\u0BC8", -1, -1)
  };

  private static final Among a_25[] = {
    new Among("\u0B95\u0BBF\u0BB1", -1, -1),
    new Among("\u0B95\u0BBF\u0BA9\u0BCD\u0BB1", -1, -1),
    new Among("\u0BBE\u0BA8\u0BBF\u0BA9\u0BCD\u0BB1", -1, -1),
    new Among("\u0B95\u0BBF\u0BB1\u0BCD", -1, -1),
    new Among("\u0B95\u0BBF\u0BA9\u0BCD\u0BB1\u0BCD", -1, -1),
    new Among("\u0BBE\u0BA8\u0BBF\u0BA9\u0BCD\u0BB1\u0BCD", -1, -1)
  };

  private boolean B_found_vetrumai_urupu;
  private boolean B_found_a_match;

  private boolean r_has_min_length() {
    if (!(limit > 4)) {
      return false;
    }
    return true;
  }

  private boolean r_fix_va_start() {
    lab0:
    {
      int v_1 = cursor;
      lab1:
      {
        int v_2 = cursor;
        int v_3 = cursor;
        lab2:
        {
          if (!(eq_s("\u0BB5\u0BCB"))) {
            cursor = v_3;
            break lab2;
          }
        }
        cursor = v_2;
        bra = cursor;
        if (!(eq_s("\u0BB5\u0BCB"))) {
          break lab1;
        }
        ket = cursor;
        slice_from("\u0B93");
        break lab0;
      }
      cursor = v_1;
      lab3:
      {
        int v_4 = cursor;
        int v_5 = cursor;
        lab4:
        {
          if (!(eq_s("\u0BB5\u0BCA"))) {
            cursor = v_5;
            break lab4;
          }
        }
        cursor = v_4;
        bra = cursor;
        if (!(eq_s("\u0BB5\u0BCA"))) {
          break lab3;
        }
        ket = cursor;
        slice_from("\u0B92");
        break lab0;
      }
      cursor = v_1;
      lab5:
      {
        int v_6 = cursor;
        int v_7 = cursor;
        lab6:
        {
          if (!(eq_s("\u0BB5\u0BC1"))) {
            cursor = v_7;
            break lab6;
          }
        }
        cursor = v_6;
        bra = cursor;
        if (!(eq_s("\u0BB5\u0BC1"))) {
          break lab5;
        }
        ket = cursor;
        slice_from("\u0B89");
        break lab0;
      }
      cursor = v_1;
      int v_8 = cursor;
      int v_9 = cursor;
      lab7:
      {
        if (!(eq_s("\u0BB5\u0BC2"))) {
          cursor = v_9;
          break lab7;
        }
      }
      cursor = v_8;
      bra = cursor;
      if (!(eq_s("\u0BB5\u0BC2"))) {
        return false;
      }
      ket = cursor;
      slice_from("\u0B8A");
    }
    return true;
  }

  private boolean r_fix_endings() {
    int v_1 = cursor;
    lab0:
    {
      while (true) {
        int v_2 = cursor;
        lab1:
        {
          if (!r_fix_ending()) {
            break lab1;
          }
          continue;
        }
        cursor = v_2;
        break;
      }
    }
    cursor = v_1;
    return true;
  }

  private boolean r_remove_question_prefixes() {
    bra = cursor;
    if (!(eq_s("\u0B8E"))) {
      return false;
    }
    if (find_among(a_0) == 0) {
      return false;
    }
    if (!(eq_s("\u0BCD"))) {
      return false;
    }
    ket = cursor;
    slice_del();
    int v_1 = cursor;
    r_fix_va_start();
    cursor = v_1;
    return true;
  }

  private boolean r_fix_ending() {
    if (!(limit > 3)) {
      return false;
    }
    limit_backward = cursor;
    cursor = limit;
    lab0:
    {
      int v_1 = limit - cursor;
      lab1:
      {
        ket = cursor;
        if (find_among_b(a_1) == 0) {
          break lab1;
        }
        bra = cursor;
        slice_del();
        break lab0;
      }
      cursor = limit - v_1;
      lab2:
      {
        ket = cursor;
        if (!(eq_s_b("\u0BAF\u0BCD"))) {
          break lab2;
        }
        int v_2 = limit - cursor;
        if (find_among_b(a_2) == 0) {
          break lab2;
        }
        cursor = limit - v_2;
        bra = cursor;
        slice_del();
        break lab0;
      }
      cursor = limit - v_1;
      lab3:
      {
        ket = cursor;
        lab4:
        {
          int v_3 = limit - cursor;
          lab5:
          {
            if (!(eq_s_b("\u0B9F\u0BCD\u0BAA\u0BCD"))) {
              break lab5;
            }
            break lab4;
          }
          cursor = limit - v_3;
          if (!(eq_s_b("\u0B9F\u0BCD\u0B95\u0BCD"))) {
            break lab3;
          }
        }
        bra = cursor;
        slice_from("\u0BB3\u0BCD");
        break lab0;
      }
      cursor = limit - v_1;
      lab6:
      {
        ket = cursor;
        if (!(eq_s_b("\u0BA9\u0BCD\u0BB1\u0BCD"))) {
          break lab6;
        }
        bra = cursor;
        slice_from("\u0BB2\u0BCD");
        break lab0;
      }
      cursor = limit - v_1;
      lab7:
      {
        ket = cursor;
        if (!(eq_s_b("\u0BB1\u0BCD\u0B95\u0BCD"))) {
          break lab7;
        }
        bra = cursor;
        slice_from("\u0BB2\u0BCD");
        break lab0;
      }
      cursor = limit - v_1;
      lab8:
      {
        ket = cursor;
        if (!(eq_s_b("\u0B9F\u0BCD\u0B9F\u0BCD"))) {
          break lab8;
        }
        bra = cursor;
        slice_from("\u0B9F\u0BC1");
        break lab0;
      }
      cursor = limit - v_1;
      lab9:
      {
        if (!(B_found_vetrumai_urupu)) {
          break lab9;
        }
        ket = cursor;
        if (!(eq_s_b("\u0BA4\u0BCD\u0BA4\u0BCD"))) {
          break lab9;
        }
        int v_4 = limit - cursor;
        {
          int v_5 = limit - cursor;
          lab10:
          {
            if (!(eq_s_b("\u0BC8"))) {
              break lab10;
            }
            break lab9;
          }
          cursor = limit - v_5;
        }
        cursor = limit - v_4;
        bra = cursor;
        slice_from("\u0BAE\u0BCD");
        bra = cursor;
        break lab0;
      }
      cursor = limit - v_1;
      lab11:
      {
        ket = cursor;
        lab12:
        {
          int v_6 = limit - cursor;
          lab13:
          {
            if (!(eq_s_b("\u0BC1\u0B95\u0BCD"))) {
              break lab13;
            }
            break lab12;
          }
          cursor = limit - v_6;
          if (!(eq_s_b("\u0BC1\u0B95\u0BCD\u0B95\u0BCD"))) {
            break lab11;
          }
        }
        bra = cursor;
        slice_from("\u0BCD");
        break lab0;
      }
      cursor = limit - v_1;
      lab14:
      {
        ket = cursor;
        if (!(eq_s_b("\u0BCD"))) {
          break lab14;
        }
        if (find_among_b(a_3) == 0) {
          break lab14;
        }
        if (!(eq_s_b("\u0BCD"))) {
          break lab14;
        }
        if (find_among_b(a_4) == 0) {
          break lab14;
        }
        bra = cursor;
        slice_del();
        break lab0;
      }
      cursor = limit - v_1;
      lab15:
      {
        ket = cursor;
        if (!(eq_s_b("\u0BC1\u0B95\u0BCD"))) {
          break lab15;
        }
        bra = cursor;
        slice_from("\u0BCD");
        break lab0;
      }
      cursor = limit - v_1;
      lab16:
      {
        ket = cursor;
        if (!(eq_s_b("\u0BCD"))) {
          break lab16;
        }
        if (find_among_b(a_5) == 0) {
          break lab16;
        }
        bra = cursor;
        slice_del();
        break lab0;
      }
      cursor = limit - v_1;
      lab17:
      {
        ket = cursor;
        if (!(eq_s_b("\u0BCD"))) {
          break lab17;
        }
        lab18:
        {
          int v_7 = limit - cursor;
          lab19:
          {
            if (find_among_b(a_6) == 0) {
              break lab19;
            }
            break lab18;
          }
          cursor = limit - v_7;
          if (find_among_b(a_7) == 0) {
            break lab17;
          }
        }
        if (!(eq_s_b("\u0BCD"))) {
          break lab17;
        }
        bra = cursor;
        slice_from("\u0BCD");
        break lab0;
      }
      cursor = limit - v_1;
      lab20:
      {
        ket = cursor;
        if (find_among_b(a_8) == 0) {
          break lab20;
        }
        bra = cursor;
        slice_del();
        break lab0;
      }
      cursor = limit - v_1;
      lab21:
      {
        ket = cursor;
        if (!(eq_s_b("\u0BA9\u0BC1"))) {
          break lab21;
        }
        int v_8 = limit - cursor;
        {
          int v_9 = limit - cursor;
          lab22:
          {
            if (find_among_b(a_9) == 0) {
              break lab22;
            }
            break lab21;
          }
          cursor = limit - v_9;
        }
        cursor = limit - v_8;
        bra = cursor;
        slice_del();
        break lab0;
      }
      cursor = limit - v_1;
      lab23:
      {
        ket = cursor;
        if (!(eq_s_b("\u0B99\u0BCD"))) {
          break lab23;
        }
        int v_10 = limit - cursor;
        {
          int v_11 = limit - cursor;
          lab24:
          {
            if (!(eq_s_b("\u0BC8"))) {
              break lab24;
            }
            break lab23;
          }
          cursor = limit - v_11;
        }
        cursor = limit - v_10;
        bra = cursor;
        slice_from("\u0BAE\u0BCD");
        break lab0;
      }
      cursor = limit - v_1;
      lab25:
      {
        ket = cursor;
        if (!(eq_s_b("\u0B99\u0BCD"))) {
          break lab25;
        }
        bra = cursor;
        slice_del();
        break lab0;
      }
      cursor = limit - v_1;
      ket = cursor;
      if (!(eq_s_b("\u0BCD"))) {
        return false;
      }
      int v_12 = limit - cursor;
      lab26:
      {
        int v_13 = limit - cursor;
        lab27:
        {
          if (find_among_b(a_10) == 0) {
            break lab27;
          }
          break lab26;
        }
        cursor = limit - v_13;
        if (!(eq_s_b("\u0BCD"))) {
          return false;
        }
      }
      cursor = limit - v_12;
      bra = cursor;
      slice_del();
    }
    cursor = limit_backward;
    return true;
  }

  private boolean r_remove_pronoun_prefixes() {
    B_found_a_match = false;
    bra = cursor;
    if (find_among(a_11) == 0) {
      return false;
    }
    if (find_among(a_12) == 0) {
      return false;
    }
    if (!(eq_s("\u0BCD"))) {
      return false;
    }
    ket = cursor;
    slice_del();
    B_found_a_match = true;
    int v_1 = cursor;
    r_fix_va_start();
    cursor = v_1;
    return true;
  }

  private boolean r_remove_plural_suffix() {
    B_found_a_match = false;
    limit_backward = cursor;
    cursor = limit;
    lab0:
    {
      int v_1 = limit - cursor;
      lab1:
      {
        ket = cursor;
        if (!(eq_s_b("\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD"))) {
          break lab1;
        }
        int v_2 = limit - cursor;
        {
          int v_3 = limit - cursor;
          lab2:
          {
            if (find_among_b(a_13) == 0) {
              break lab2;
            }
            break lab1;
          }
          cursor = limit - v_3;
        }
        cursor = limit - v_2;
        bra = cursor;
        slice_from("\u0BCD");
        break lab0;
      }
      cursor = limit - v_1;
      lab3:
      {
        ket = cursor;
        if (!(eq_s_b("\u0BB1\u0BCD\u0B95\u0BB3\u0BCD"))) {
          break lab3;
        }
        bra = cursor;
        slice_from("\u0BB2\u0BCD");
        break lab0;
      }
      cursor = limit - v_1;
      lab4:
      {
        ket = cursor;
        if (!(eq_s_b("\u0B9F\u0BCD\u0B95\u0BB3\u0BCD"))) {
          break lab4;
        }
        bra = cursor;
        slice_from("\u0BB3\u0BCD");
        break lab0;
      }
      cursor = limit - v_1;
      ket = cursor;
      if (!(eq_s_b("\u0B95\u0BB3\u0BCD"))) {
        return false;
      }
      bra = cursor;
      slice_del();
    }
    B_found_a_match = true;
    cursor = limit_backward;
    return true;
  }

  private boolean r_remove_question_suffixes() {
    if (!r_has_min_length()) {
      return false;
    }
    B_found_a_match = false;
    limit_backward = cursor;
    cursor = limit;
    int v_1 = limit - cursor;
    lab0:
    {
      ket = cursor;
      if (find_among_b(a_14) == 0) {
        break lab0;
      }
      bra = cursor;
      slice_from("\u0BCD");
      B_found_a_match = true;
    }
    cursor = limit - v_1;
    cursor = limit_backward;
    r_fix_endings();
    return true;
  }

  private boolean r_remove_command_suffixes() {
    if (!r_has_min_length()) {
      return false;
    }
    B_found_a_match = false;
    limit_backward = cursor;
    cursor = limit;
    ket = cursor;
    if (find_among_b(a_15) == 0) {
      return false;
    }
    bra = cursor;
    slice_del();
    B_found_a_match = true;
    cursor = limit_backward;
    return true;
  }

  private boolean r_remove_um() {
    B_found_a_match = false;
    if (!r_has_min_length()) {
      return false;
    }
    limit_backward = cursor;
    cursor = limit;
    ket = cursor;
    if (!(eq_s_b("\u0BC1\u0BAE\u0BCD"))) {
      return false;
    }
    bra = cursor;
    slice_from("\u0BCD");
    B_found_a_match = true;
    cursor = limit_backward;
    int v_1 = cursor;
    r_fix_ending();
    cursor = v_1;
    return true;
  }

  private boolean r_remove_common_word_endings() {
    B_found_a_match = false;
    if (!r_has_min_length()) {
      return false;
    }
    limit_backward = cursor;
    cursor = limit;
    lab0:
    {
      int v_1 = limit - cursor;
      lab1:
      {
        int v_2 = limit - cursor;
        ket = cursor;
        lab2:
        {
          int v_3 = limit - cursor;
          lab3:
          {
            if (!(eq_s_b("\u0BC1\u0B9F\u0BA9\u0BCD"))) {
              break lab3;
            }
            break lab2;
          }
          cursor = limit - v_3;
          lab4:
          {
            if (!(eq_s_b("\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8"))) {
              break lab4;
            }
            break lab2;
          }
          cursor = limit - v_3;
          lab5:
          {
            if (!(eq_s_b("\u0BBF\u0B9F\u0BAE\u0BCD"))) {
              break lab5;
            }
            break lab2;
          }
          cursor = limit - v_3;
          lab6:
          {
            if (!(eq_s_b("\u0BBF\u0BA9\u0BCD\u0BB1\u0BBF"))) {
              break lab6;
            }
            break lab2;
          }
          cursor = limit - v_3;
          lab7:
          {
            if (!(eq_s_b("\u0BBE\u0B95\u0BBF"))) {
              break lab7;
            }
            break lab2;
          }
          cursor = limit - v_3;
          lab8:
          {
            if (!(eq_s_b("\u0BBE\u0B95\u0BBF\u0BAF"))) {
              break lab8;
            }
            break lab2;
          }
          cursor = limit - v_3;
          lab9:
          {
            if (!(eq_s_b("\u0BC6\u0BA9\u0BCD\u0BB1\u0BC1"))) {
              break lab9;
            }
            break lab2;
          }
          cursor = limit - v_3;
          lab10:
          {
            if (!(eq_s_b("\u0BC1\u0BB3\u0BCD\u0BB3"))) {
              break lab10;
            }
            break lab2;
          }
          cursor = limit - v_3;
          lab11:
          {
            if (!(eq_s_b("\u0BC1\u0B9F\u0BC8\u0BAF"))) {
              break lab11;
            }
            break lab2;
          }
          cursor = limit - v_3;
          lab12:
          {
            if (!(eq_s_b("\u0BC1\u0B9F\u0BC8"))) {
              break lab12;
            }
            break lab2;
          }
          cursor = limit - v_3;
          lab13:
          {
            if (!(eq_s_b("\u0BC6\u0BA9\u0BC1\u0BAE\u0BCD"))) {
              break lab13;
            }
            break lab2;
          }
          cursor = limit - v_3;
          lab14:
          {
            if (!(eq_s_b("\u0BB2\u0BCD\u0BB2"))) {
              break lab14;
            }
            int v_4 = limit - cursor;
            {
              int v_5 = limit - cursor;
              lab15:
              {
                if (find_among_b(a_16) == 0) {
                  break lab15;
                }
                break lab14;
              }
              cursor = limit - v_5;
            }
            cursor = limit - v_4;
            break lab2;
          }
          cursor = limit - v_3;
          lab16:
          {
            if (!(eq_s_b("\u0BC6\u0BA9"))) {
              break lab16;
            }
            break lab2;
          }
          cursor = limit - v_3;
          if (!(eq_s_b("\u0BBE\u0B95\u0BBF"))) {
            break lab1;
          }
        }
        bra = cursor;
        slice_from("\u0BCD");
        B_found_a_match = true;
        cursor = limit - v_2;
        break lab0;
      }
      cursor = limit - v_1;
      int v_6 = limit - cursor;
      ket = cursor;
      if (find_among_b(a_17) == 0) {
        return false;
      }
      bra = cursor;
      slice_del();
      B_found_a_match = true;
      cursor = limit - v_6;
    }
    cursor = limit_backward;
    r_fix_endings();
    return true;
  }

  private boolean r_remove_vetrumai_urupukal() {
    B_found_a_match = false;
    B_found_vetrumai_urupu = false;
    if (!r_has_min_length()) {
      return false;
    }
    limit_backward = cursor;
    cursor = limit;
    lab0:
    {
      int v_1 = limit - cursor;
      lab1:
      {
        int v_2 = limit - cursor;
        ket = cursor;
        if (!(eq_s_b("\u0BA9\u0BC8"))) {
          break lab1;
        }
        bra = cursor;
        slice_del();
        cursor = limit - v_2;
        break lab0;
      }
      cursor = limit - v_1;
      lab2:
      {
        int v_3 = limit - cursor;
        ket = cursor;
        lab3:
        {
          int v_4 = limit - cursor;
          lab4:
          {
            lab5:
            {
              int v_5 = limit - cursor;
              lab6:
              {
                if (!(eq_s_b("\u0BBF\u0BA9\u0BC8"))) {
                  break lab6;
                }
                break lab5;
              }
              cursor = limit - v_5;
              if (!(eq_s_b("\u0BC8"))) {
                break lab4;
              }
            }
            int v_6 = limit - cursor;
            {
              int v_7 = limit - cursor;
              lab7:
              {
                if (find_among_b(a_18) == 0) {
                  break lab7;
                }
                break lab4;
              }
              cursor = limit - v_7;
            }
            cursor = limit - v_6;
            break lab3;
          }
          cursor = limit - v_4;
          if (!(eq_s_b("\u0BC8"))) {
            break lab2;
          }
          int v_8 = limit - cursor;
          if (find_among_b(a_19) == 0) {
            break lab2;
          }
          if (!(eq_s_b("\u0BCD"))) {
            break lab2;
          }
          cursor = limit - v_8;
        }
        bra = cursor;
        slice_from("\u0BCD");
        cursor = limit - v_3;
        break lab0;
      }
      cursor = limit - v_1;
      lab8:
      {
        int v_9 = limit - cursor;
        ket = cursor;
        lab9:
        {
          int v_10 = limit - cursor;
          lab10:
          {
            if (!(eq_s_b("\u0BCA\u0B9F\u0BC1"))) {
              break lab10;
            }
            break lab9;
          }
          cursor = limit - v_10;
          lab11:
          {
            if (!(eq_s_b("\u0BCB\u0B9F\u0BC1"))) {
              break lab11;
            }
            break lab9;
          }
          cursor = limit - v_10;
          lab12:
          {
            if (!(eq_s_b("\u0BBF\u0BB2\u0BCD"))) {
              break lab12;
            }
            break lab9;
          }
          cursor = limit - v_10;
          lab13:
          {
            if (!(eq_s_b("\u0BBF\u0BB1\u0BCD"))) {
              break lab13;
            }
            break lab9;
          }
          cursor = limit - v_10;
          lab14:
          {
            if (!(eq_s_b("\u0BBF\u0BA9\u0BCD"))) {
              break lab14;
            }
            int v_11 = limit - cursor;
            {
              int v_12 = limit - cursor;
              lab15:
              {
                if (!(eq_s_b("\u0BAE"))) {
                  break lab15;
                }
                break lab14;
              }
              cursor = limit - v_12;
            }
            cursor = limit - v_11;
            break lab9;
          }
          cursor = limit - v_10;
          lab16:
          {
            if (!(eq_s_b("\u0BBF\u0BA9\u0BCD\u0BB1\u0BC1"))) {
              break lab16;
            }
            break lab9;
          }
          cursor = limit - v_10;
          lab17:
          {
            if (!(eq_s_b("\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1"))) {
              break lab17;
            }
            break lab9;
          }
          cursor = limit - v_10;
          lab18:
          {
            if (!(eq_s_b("\u0BB5\u0BBF\u0B9F"))) {
              break lab18;
            }
            break lab9;
          }
          cursor = limit - v_10;
          lab19:
          {
            if (!(limit >= 7)) {
              break lab19;
            }
            if (!(eq_s_b("\u0BBF\u0B9F\u0BAE\u0BCD"))) {
              break lab19;
            }
            break lab9;
          }
          cursor = limit - v_10;
          lab20:
          {
            if (!(eq_s_b("\u0BBE\u0BB2\u0BCD"))) {
              break lab20;
            }
            break lab9;
          }
          cursor = limit - v_10;
          lab21:
          {
            if (!(eq_s_b("\u0BC1\u0B9F\u0BC8"))) {
              break lab21;
            }
            break lab9;
          }
          cursor = limit - v_10;
          lab22:
          {
            if (!(eq_s_b("\u0BBE\u0BAE\u0BB2\u0BCD"))) {
              break lab22;
            }
            break lab9;
          }
          cursor = limit - v_10;
          lab23:
          {
            if (!(eq_s_b("\u0BB2\u0BCD"))) {
              break lab23;
            }
            int v_13 = limit - cursor;
            {
              int v_14 = limit - cursor;
              lab24:
              {
                if (find_among_b(a_20) == 0) {
                  break lab24;
                }
                break lab23;
              }
              cursor = limit - v_14;
            }
            cursor = limit - v_13;
            break lab9;
          }
          cursor = limit - v_10;
          if (!(eq_s_b("\u0BC1\u0BB3\u0BCD"))) {
            break lab8;
          }
        }
        bra = cursor;
        slice_from("\u0BCD");
        cursor = limit - v_9;
        break lab0;
      }
      cursor = limit - v_1;
      lab25:
      {
        int v_15 = limit - cursor;
        ket = cursor;
        lab26:
        {
          int v_16 = limit - cursor;
          lab27:
          {
            if (!(eq_s_b("\u0B95\u0BA3\u0BCD"))) {
              break lab27;
            }
            break lab26;
          }
          cursor = limit - v_16;
          lab28:
          {
            if (!(eq_s_b("\u0BAE\u0BC1\u0BA9\u0BCD"))) {
              break lab28;
            }
            break lab26;
          }
          cursor = limit - v_16;
          lab29:
          {
            if (!(eq_s_b("\u0BAE\u0BC7\u0BB2\u0BCD"))) {
              break lab29;
            }
            break lab26;
          }
          cursor = limit - v_16;
          lab30:
          {
            if (!(eq_s_b("\u0BAE\u0BC7\u0BB1\u0BCD"))) {
              break lab30;
            }
            break lab26;
          }
          cursor = limit - v_16;
          lab31:
          {
            if (!(eq_s_b("\u0B95\u0BC0\u0BB4\u0BCD"))) {
              break lab31;
            }
            break lab26;
          }
          cursor = limit - v_16;
          lab32:
          {
            if (!(eq_s_b("\u0BAA\u0BBF\u0BA9\u0BCD"))) {
              break lab32;
            }
            break lab26;
          }
          cursor = limit - v_16;
          if (!(eq_s_b("\u0BA4\u0BC1"))) {
            break lab25;
          }
          int v_17 = limit - cursor;
          {
            int v_18 = limit - cursor;
            lab33:
            {
              if (find_among_b(a_21) == 0) {
                break lab33;
              }
              break lab25;
            }
            cursor = limit - v_18;
          }
          cursor = limit - v_17;
        }
        bra = cursor;
        slice_del();
        cursor = limit - v_15;
        break lab0;
      }
      cursor = limit - v_1;
      int v_19 = limit - cursor;
      ket = cursor;
      if (!(eq_s_b("\u0BC0"))) {
        return false;
      }
      bra = cursor;
      slice_from("\u0BBF");
      cursor = limit - v_19;
    }
    B_found_a_match = true;
    B_found_vetrumai_urupu = true;
    int v_20 = limit - cursor;
    lab34:
    {
      ket = cursor;
      if (!(eq_s_b("\u0BBF\u0BA9\u0BCD"))) {
        break lab34;
      }
      bra = cursor;
      slice_from("\u0BCD");
    }
    cursor = limit - v_20;
    cursor = limit_backward;
    r_fix_endings();
    return true;
  }

  private boolean r_remove_tense_suffixes() {
    B_found_a_match = true;
    while (true) {
      int v_1 = cursor;
      lab0:
      {
        if (!(B_found_a_match)) {
          break lab0;
        }
        int v_2 = cursor;
        r_remove_tense_suffix();
        cursor = v_2;
        continue;
      }
      cursor = v_1;
      break;
    }
    return true;
  }

  private boolean r_remove_tense_suffix() {
    B_found_a_match = false;
    if (!r_has_min_length()) {
      return false;
    }
    limit_backward = cursor;
    cursor = limit;
    int v_1 = limit - cursor;
    lab0:
    {
      lab1:
      {
        int v_2 = limit - cursor;
        lab2:
        {
          int v_3 = limit - cursor;
          ket = cursor;
          if (find_among_b(a_22) == 0) {
            break lab2;
          }
          bra = cursor;
          slice_del();
          B_found_a_match = true;
          cursor = limit - v_3;
          break lab1;
        }
        cursor = limit - v_2;
        lab3:
        {
          int v_4 = limit - cursor;
          ket = cursor;
          lab4:
          {
            int v_5 = limit - cursor;
            lab5:
            {
              if (!(eq_s_b("\u0BAE\u0BBE\u0BB0\u0BCD"))) {
                break lab5;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab6:
            {
              if (!(eq_s_b("\u0BAE\u0BBF\u0BA9\u0BCD"))) {
                break lab6;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab7:
            {
              if (!(eq_s_b("\u0BA9\u0BA9\u0BCD"))) {
                break lab7;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab8:
            {
              if (!(eq_s_b("\u0BA9\u0BBE\u0BA9\u0BCD"))) {
                break lab8;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab9:
            {
              if (!(eq_s_b("\u0BA9\u0BBE\u0BB3\u0BCD"))) {
                break lab9;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab10:
            {
              if (!(eq_s_b("\u0BA9\u0BBE\u0BB0\u0BCD"))) {
                break lab10;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab11:
            {
              if (!(eq_s_b("\u0BB5\u0BA9\u0BCD"))) {
                break lab11;
              }
              int v_6 = limit - cursor;
              {
                int v_7 = limit - cursor;
                lab12:
                {
                  if (find_among_b(a_23) == 0) {
                    break lab12;
                  }
                  break lab11;
                }
                cursor = limit - v_7;
              }
              cursor = limit - v_6;
              break lab4;
            }
            cursor = limit - v_5;
            lab13:
            {
              if (!(eq_s_b("\u0BA9\u0BB3\u0BCD"))) {
                break lab13;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab14:
            {
              if (!(eq_s_b("\u0BB5\u0BB3\u0BCD"))) {
                break lab14;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab15:
            {
              if (!(eq_s_b("\u0BA9\u0BB0\u0BCD"))) {
                break lab15;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab16:
            {
              if (!(eq_s_b("\u0BB5\u0BB0\u0BCD"))) {
                break lab16;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab17:
            {
              if (!(eq_s_b("\u0BA9"))) {
                break lab17;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab18:
            {
              if (!(eq_s_b("\u0BAA"))) {
                break lab18;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab19:
            {
              if (!(eq_s_b("\u0B95"))) {
                break lab19;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab20:
            {
              if (!(eq_s_b("\u0BA4"))) {
                break lab20;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab21:
            {
              if (!(eq_s_b("\u0BAF"))) {
                break lab21;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab22:
            {
              if (!(eq_s_b("\u0BAA\u0BA9\u0BCD"))) {
                break lab22;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab23:
            {
              if (!(eq_s_b("\u0BAA\u0BB3\u0BCD"))) {
                break lab23;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab24:
            {
              if (!(eq_s_b("\u0BAA\u0BB0\u0BCD"))) {
                break lab24;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab25:
            {
              if (!(eq_s_b("\u0BA4\u0BC1"))) {
                break lab25;
              }
              int v_8 = limit - cursor;
              {
                int v_9 = limit - cursor;
                lab26:
                {
                  if (find_among_b(a_24) == 0) {
                    break lab26;
                  }
                  break lab25;
                }
                cursor = limit - v_9;
              }
              cursor = limit - v_8;
              break lab4;
            }
            cursor = limit - v_5;
            lab27:
            {
              if (!(eq_s_b("\u0BBF\u0BB1\u0BCD\u0BB1\u0BC1"))) {
                break lab27;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab28:
            {
              if (!(eq_s_b("\u0BAA\u0BAE\u0BCD"))) {
                break lab28;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab29:
            {
              if (!(eq_s_b("\u0BA9\u0BAE\u0BCD"))) {
                break lab29;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab30:
            {
              if (!(eq_s_b("\u0BA4\u0BC1\u0BAE\u0BCD"))) {
                break lab30;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab31:
            {
              if (!(eq_s_b("\u0BB1\u0BC1\u0BAE\u0BCD"))) {
                break lab31;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab32:
            {
              if (!(eq_s_b("\u0B95\u0BC1\u0BAE\u0BCD"))) {
                break lab32;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab33:
            {
              if (!(eq_s_b("\u0BA9\u0BC6\u0BA9\u0BCD"))) {
                break lab33;
              }
              break lab4;
            }
            cursor = limit - v_5;
            lab34:
            {
              if (!(eq_s_b("\u0BA9\u0BC8"))) {
                break lab34;
              }
              break lab4;
            }
            cursor = limit - v_5;
            if (!(eq_s_b("\u0BB5\u0BC8"))) {
              break lab3;
            }
          }
          bra = cursor;
          slice_del();
          B_found_a_match = true;
          cursor = limit - v_4;
          break lab1;
        }
        cursor = limit - v_2;
        lab35:
        {
          int v_10 = limit - cursor;
          ket = cursor;
          lab36:
          {
            int v_11 = limit - cursor;
            lab37:
            {
              if (!(eq_s_b("\u0BBE\u0BA9\u0BCD"))) {
                break lab37;
              }
              int v_12 = limit - cursor;
              {
                int v_13 = limit - cursor;
                lab38:
                {
                  if (!(eq_s_b("\u0B9A"))) {
                    break lab38;
                  }
                  break lab37;
                }
                cursor = limit - v_13;
              }
              cursor = limit - v_12;
              break lab36;
            }
            cursor = limit - v_11;
            lab39:
            {
              if (!(eq_s_b("\u0BBE\u0BB3\u0BCD"))) {
                break lab39;
              }
              break lab36;
            }
            cursor = limit - v_11;
            lab40:
            {
              if (!(eq_s_b("\u0BBE\u0BB0\u0BCD"))) {
                break lab40;
              }
              break lab36;
            }
            cursor = limit - v_11;
            lab41:
            {
              if (!(eq_s_b("\u0BC7\u0BA9\u0BCD"))) {
                break lab41;
              }
              break lab36;
            }
            cursor = limit - v_11;
            lab42:
            {
              if (!(eq_s_b("\u0BBE"))) {
                break lab42;
              }
              break lab36;
            }
            cursor = limit - v_11;
            lab43:
            {
              if (!(eq_s_b("\u0BBE\u0BAE\u0BCD"))) {
                break lab43;
              }
              break lab36;
            }
            cursor = limit - v_11;
            lab44:
            {
              if (!(eq_s_b("\u0BC6\u0BAE\u0BCD"))) {
                break lab44;
              }
              break lab36;
            }
            cursor = limit - v_11;
            lab45:
            {
              if (!(eq_s_b("\u0BC7\u0BAE\u0BCD"))) {
                break lab45;
              }
              break lab36;
            }
            cursor = limit - v_11;
            lab46:
            {
              if (!(eq_s_b("\u0BCB\u0BAE\u0BCD"))) {
                break lab46;
              }
              break lab36;
            }
            cursor = limit - v_11;
            lab47:
            {
              if (!(eq_s_b("\u0B95\u0BC1\u0BAE\u0BCD"))) {
                break lab47;
              }
              break lab36;
            }
            cursor = limit - v_11;
            lab48:
            {
              if (!(eq_s_b("\u0BA4\u0BC1\u0BAE\u0BCD"))) {
                break lab48;
              }
              break lab36;
            }
            cursor = limit - v_11;
            lab49:
            {
              if (!(eq_s_b("\u0B9F\u0BC1\u0BAE\u0BCD"))) {
                break lab49;
              }
              break lab36;
            }
            cursor = limit - v_11;
            lab50:
            {
              if (!(eq_s_b("\u0BB1\u0BC1\u0BAE\u0BCD"))) {
                break lab50;
              }
              break lab36;
            }
            cursor = limit - v_11;
            lab51:
            {
              if (!(eq_s_b("\u0BBE\u0BAF\u0BCD"))) {
                break lab51;
              }
              break lab36;
            }
            cursor = limit - v_11;
            lab52:
            {
              if (!(eq_s_b("\u0BA9\u0BC6\u0BA9\u0BCD"))) {
                break lab52;
              }
              break lab36;
            }
            cursor = limit - v_11;
            lab53:
            {
              if (!(eq_s_b("\u0BA9\u0BBF\u0BB0\u0BCD"))) {
                break lab53;
              }
              break lab36;
            }
            cursor = limit - v_11;
            lab54:
            {
              if (!(eq_s_b("\u0BC0\u0BB0\u0BCD"))) {
                break lab54;
              }
              break lab36;
            }
            cursor = limit - v_11;
            if (!(eq_s_b("\u0BC0\u0BAF\u0BB0\u0BCD"))) {
              break lab35;
            }
          }
          bra = cursor;
          slice_from("\u0BCD");
          B_found_a_match = true;
          cursor = limit - v_10;
          break lab1;
        }
        cursor = limit - v_2;
        int v_14 = limit - cursor;
        ket = cursor;
        lab55:
        {
          int v_15 = limit - cursor;
          lab56:
          {
            if (!(eq_s_b("\u0B95\u0BC1"))) {
              break lab56;
            }
            break lab55;
          }
          cursor = limit - v_15;
          if (!(eq_s_b("\u0BA4\u0BC1"))) {
            break lab0;
          }
        }
        int v_16 = limit - cursor;
        if (!(eq_s_b("\u0BCD"))) {
          break lab0;
        }
        cursor = limit - v_16;
        bra = cursor;
        slice_del();
        B_found_a_match = true;
        cursor = limit - v_14;
      }
    }
    cursor = limit - v_1;
    int v_17 = limit - cursor;
    lab57:
    {
      ket = cursor;
      if (find_among_b(a_25) == 0) {
        break lab57;
      }
      bra = cursor;
      slice_del();
      B_found_a_match = true;
    }
    cursor = limit - v_17;
    cursor = limit_backward;
    r_fix_endings();
    return true;
  }

  @Override
  public boolean stem() {
    B_found_vetrumai_urupu = false;
    int v_1 = cursor;
    r_fix_ending();
    cursor = v_1;
    if (!r_has_min_length()) {
      return false;
    }
    int v_2 = cursor;
    r_remove_question_prefixes();
    cursor = v_2;
    int v_3 = cursor;
    r_remove_pronoun_prefixes();
    cursor = v_3;
    int v_4 = cursor;
    r_remove_question_suffixes();
    cursor = v_4;
    int v_5 = cursor;
    r_remove_um();
    cursor = v_5;
    int v_6 = cursor;
    r_remove_common_word_endings();
    cursor = v_6;
    int v_7 = cursor;
    r_remove_vetrumai_urupukal();
    cursor = v_7;
    int v_8 = cursor;
    r_remove_plural_suffix();
    cursor = v_8;
    int v_9 = cursor;
    r_remove_command_suffixes();
    cursor = v_9;
    int v_10 = cursor;
    r_remove_tense_suffixes();
    cursor = v_10;
    return true;
  }

  @Override
  public boolean equals(Object o) {
    return o instanceof TamilStemmer;
  }

  @Override
  public int hashCode() {
    return TamilStemmer.class.getName().hashCode();
  }
}
