// 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/
 * </p>
 */
@SuppressWarnings("unused")
public class IrishStemmer 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 final static Among a_0[] = {
  new Among("b'", -1, 1),
  new Among("bh", -1, 4),
  new Among("bhf", 1, 2),
  new Among("bp", -1, 8),
  new Among("ch", -1, 5),
  new Among("d'", -1, 1),
  new Among("d'fh", 5, 2),
  new Among("dh", -1, 6),
  new Among("dt", -1, 9),
  new Among("fh", -1, 2),
  new Among("gc", -1, 5),
  new Among("gh", -1, 7),
  new Among("h-", -1, 1),
  new Among("m'", -1, 1),
  new Among("mb", -1, 4),
  new Among("mh", -1, 10),
  new Among("n-", -1, 1),
  new Among("nd", -1, 6),
  new Among("ng", -1, 7),
  new Among("ph", -1, 8),
  new Among("sh", -1, 3),
  new Among("t-", -1, 1),
  new Among("th", -1, 9),
  new Among("ts", -1, 3)
};

private final static Among a_1[] = {
  new Among("\u00EDochta", -1, 1),
  new Among("a\u00EDochta", 0, 1),
  new Among("ire", -1, 2),
  new Among("aire", 2, 2),
  new Among("abh", -1, 1),
  new Among("eabh", 4, 1),
  new Among("ibh", -1, 1),
  new Among("aibh", 6, 1),
  new Among("amh", -1, 1),
  new Among("eamh", 8, 1),
  new Among("imh", -1, 1),
  new Among("aimh", 10, 1),
  new Among("\u00EDocht", -1, 1),
  new Among("a\u00EDocht", 12, 1),
  new Among("ir\u00ED", -1, 2),
  new Among("air\u00ED", 14, 2)
};

private final static Among a_2[] = {
  new Among("\u00F3ideacha", -1, 6),
  new Among("patacha", -1, 5),
  new Among("achta", -1, 1),
  new Among("arcachta", 2, 2),
  new Among("eachta", 2, 1),
  new Among("grafa\u00EDochta", -1, 4),
  new Among("paite", -1, 5),
  new Among("ach", -1, 1),
  new Among("each", 7, 1),
  new Among("\u00F3ideach", 8, 6),
  new Among("gineach", 8, 3),
  new Among("patach", 7, 5),
  new Among("grafa\u00EDoch", -1, 4),
  new Among("pataigh", -1, 5),
  new Among("\u00F3idigh", -1, 6),
  new Among("acht\u00FAil", -1, 1),
  new Among("eacht\u00FAil", 15, 1),
  new Among("gineas", -1, 3),
  new Among("ginis", -1, 3),
  new Among("acht", -1, 1),
  new Among("arcacht", 19, 2),
  new Among("eacht", 19, 1),
  new Among("grafa\u00EDocht", -1, 4),
  new Among("arcachta\u00ED", -1, 2),
  new Among("grafa\u00EDochta\u00ED", -1, 4)
};

private final static Among a_3[] = {
  new Among("imid", -1, 1),
  new Among("aimid", 0, 1),
  new Among("\u00EDmid", -1, 1),
  new Among("a\u00EDmid", 2, 1),
  new Among("adh", -1, 2),
  new Among("eadh", 4, 2),
  new Among("faidh", -1, 1),
  new Among("fidh", -1, 1),
  new Among("\u00E1il", -1, 2),
  new Among("ain", -1, 2),
  new Among("tear", -1, 2),
  new Among("tar", -1, 2)
};

private static final char g_v[] = {17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 4, 2 };

private int I_p2;
private int I_p1;
private int I_pV;


private boolean r_mark_regions() {
  I_pV = limit;
  I_p1 = limit;
  I_p2 = limit;
  int v_1 = cursor;
  lab0: {
    golab1: while(true)
    {
      lab2: {
        if (!(in_grouping(g_v, 97, 250)))
        {
          break lab2;
        }
        break golab1;
      }
      if (cursor >= limit)
      {
        break lab0;
      }
      cursor++;
    }
    I_pV = cursor;
  }
  cursor = v_1;
  int v_3 = cursor;
  lab3: {
    golab4: while(true)
    {
      lab5: {
        if (!(in_grouping(g_v, 97, 250)))
        {
          break lab5;
        }
        break golab4;
      }
      if (cursor >= limit)
      {
        break lab3;
      }
      cursor++;
    }
    golab6: while(true)
    {
      lab7: {
        if (!(out_grouping(g_v, 97, 250)))
        {
          break lab7;
        }
        break golab6;
      }
      if (cursor >= limit)
      {
        break lab3;
      }
      cursor++;
    }
    I_p1 = cursor;
    golab8: while(true)
    {
      lab9: {
        if (!(in_grouping(g_v, 97, 250)))
        {
          break lab9;
        }
        break golab8;
      }
      if (cursor >= limit)
      {
        break lab3;
      }
      cursor++;
    }
    golab10: while(true)
    {
      lab11: {
        if (!(out_grouping(g_v, 97, 250)))
        {
          break lab11;
        }
        break golab10;
      }
      if (cursor >= limit)
      {
        break lab3;
      }
      cursor++;
    }
    I_p2 = cursor;
  }
  cursor = v_3;
  return true;
}

private boolean r_initial_morph() {
  int among_var;
  bra = cursor;
  among_var = find_among(a_0);
  if (among_var == 0)
  {
    return false;
  }
  ket = cursor;
  switch (among_var) {
    case 1:
      slice_del();
      break;
    case 2:
      slice_from("f");
      break;
    case 3:
      slice_from("s");
      break;
    case 4:
      slice_from("b");
      break;
    case 5:
      slice_from("c");
      break;
    case 6:
      slice_from("d");
      break;
    case 7:
      slice_from("g");
      break;
    case 8:
      slice_from("p");
      break;
    case 9:
      slice_from("t");
      break;
    case 10:
      slice_from("m");
      break;
  }
  return true;
}

private boolean r_RV() {
  if (!(I_pV <= cursor))
  {
    return false;
  }
  return true;
}

private boolean r_R1() {
  if (!(I_p1 <= cursor))
  {
    return false;
  }
  return true;
}

private boolean r_R2() {
  if (!(I_p2 <= cursor))
  {
    return false;
  }
  return true;
}

private boolean r_noun_sfx() {
  int among_var;
  ket = cursor;
  among_var = find_among_b(a_1);
  if (among_var == 0)
  {
    return false;
  }
  bra = cursor;
  switch (among_var) {
    case 1:
      if (!r_R1())
      {
        return false;
      }
      slice_del();
      break;
    case 2:
      if (!r_R2())
      {
        return false;
      }
      slice_del();
      break;
  }
  return true;
}

private boolean r_deriv() {
  int among_var;
  ket = cursor;
  among_var = find_among_b(a_2);
  if (among_var == 0)
  {
    return false;
  }
  bra = cursor;
  switch (among_var) {
    case 1:
      if (!r_R2())
      {
        return false;
      }
      slice_del();
      break;
    case 2:
      slice_from("arc");
      break;
    case 3:
      slice_from("gin");
      break;
    case 4:
      slice_from("graf");
      break;
    case 5:
      slice_from("paite");
      break;
    case 6:
      slice_from("\u00F3id");
      break;
  }
  return true;
}

private boolean r_verb_sfx() {
  int among_var;
  ket = cursor;
  among_var = find_among_b(a_3);
  if (among_var == 0)
  {
    return false;
  }
  bra = cursor;
  switch (among_var) {
    case 1:
      if (!r_RV())
      {
        return false;
      }
      slice_del();
      break;
    case 2:
      if (!r_R1())
      {
        return false;
      }
      slice_del();
      break;
  }
  return true;
}

public boolean stem() {
  int v_1 = cursor;
  r_initial_morph();
  cursor = v_1;
  r_mark_regions();
  limit_backward = cursor;
  cursor = limit;
  int v_3 = limit - cursor;
  r_noun_sfx();
  cursor = limit - v_3;
  int v_4 = limit - cursor;
  r_deriv();
  cursor = limit - v_4;
  int v_5 = limit - cursor;
  r_verb_sfx();
  cursor = limit - v_5;
  cursor = limit_backward;
  return true;
}

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

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



}

