generators.ET0LTreeGrammar:
(
  { S, S1, S2,
    A-L1, A-L2, A-R1, A-R2, AH-L2, AH-R2,
    L-WAIT1, R-WAIT1, L-WAIT2, R-WAIT2,
    L-WAIT-BOT0, R-WAIT-BOT0, L-WAIT-BOT1, R-WAIT-BOT1, L-WAIT-BOT2, R-WAIT-BOT2, H1, H2
  },
  { rot180:2, lr:4, l:3, r:3, +:2, mir:1, rot:1, left:2, right:2, flip:1, up:4, tile:0, single:0, double:0, trinity:0, -:0 },
  {
    {
      S -> rot180[S1, S1],
      S1 -> up[flip[tile], A-L2, A-R2, S2],
      S2 -> up[tile, A-L1, A-R1, S1],
      A-L1 -> left[flip[tile], A-L2],
      A-L2 -> left[tile, A-L1],
      A-R1 -> right[flip[tile], A-R2],
      A-R2 -> right[tile, A-R1],
      H1 -> up[flip[single], AH-L2, AH-R2, S2],
      L-WAIT-BOT1 -> left[flip[rot[single]], A-L2],
      R-WAIT-BOT1 -> right[flip[rot[rot[single]]], A-R2],
      L-WAIT1 -> left[flip[rot[rot[double]]], AH-L2],
      R-WAIT1 -> right[flip[rot[double]], AH-R2],
      AH-L2 -> left[rot[rot[single]], A-L1],
      AH-R2 -> right[rot[single], A-R1]
    },
    {
      S1 -> up[flip[tile], L-WAIT-BOT2, R-WAIT-BOT2, H2],
      A-L1 -> left[flip[tile], A-L2],
      A-L2 -> left[tile, A-L1],
      A-R1 -> right[flip[tile], A-R2],
      A-R2 -> right[tile, A-R1],
      H1 -> up[flip[trinity], L-WAIT-BOT0, R-WAIT-BOT0, H2],
      L-WAIT-BOT1 -> left[flip[rot[single]], A-L2],
      R-WAIT-BOT1 -> right[flip[rot[rot[single]]], A-R2],
      L-WAIT1 -> left[flip[rot[rot[double]]], AH-L2],
      R-WAIT1 -> right[flip[rot[double]], AH-R2],
      AH-L2 -> left[rot[rot[single]], A-L1],
      AH-R2 -> right[rot[single], A-R1]
    },
    {
      S -> rot180[H1, H1],
      S1 -> up[flip[double], L-WAIT-BOT2, R-WAIT-BOT2, H2],
      A-L1 -> left[flip[tile], A-L2],
      A-L2 -> left[tile, A-L1],
      A-R1 -> right[flip[tile], A-R2],
      A-R2 -> right[tile, A-R1],
      H2 -> up[-, L-WAIT1, R-WAIT1, H1],
      H1 -> up[-, L-WAIT2, R-WAIT2, H2],
      L-WAIT-BOT1 -> left[flip[double], L-WAIT-BOT2],
      L-WAIT-BOT2 -> left[single, L-WAIT-BOT1],
      L-WAIT-BOT0 -> left[rot[double], L-WAIT-BOT1],
      R-WAIT-BOT1 -> right[flip[double], R-WAIT-BOT2],
      R-WAIT-BOT2 -> right[single, R-WAIT-BOT1],
      R-WAIT-BOT0 -> right[rot[rot[double]], R-WAIT-BOT1],
      L-WAIT1 -> left[-, L-WAIT2],
      R-WAIT1 -> right[-, R-WAIT2],
      L-WAIT2 -> left[-, L-WAIT1],
      R-WAIT2 -> right[-, R-WAIT1],
      AH-L2 -> left[rot[rot[single]], A-L1],
      AH-R2 -> right[rot[single], A-R1]
    },
    {
      S1 -> up[flip[double], rot[rot[double]], rot[double], trinity],
      A-L1 -> left[flip[rot[rot[single]]], rot[rot[double]]],
      A-R1 -> right[flip[rot[single]], rot[double]]
    }
  },
  S,
  (1, 3 (3 3)* (2 3 (3 3)*)* 1 1) (((3 3)* (3 3 2 3)*)* 1 1)*  4
)
