shithub: puzzles

ref: 819277148315fd5b5cc987e4b4e440e5b2bd2dad
dir: /spectre-tables-auto.h/

View raw version
/*
 * Autogenerated transition tables for the Spectre tiling.
 * Generated by auxiliary/spectre-gen.c.
 */

static const struct MapEntry hexmap_G[] = {
    { true,  2, 5 }, /* edge 0 of hex 0 (F) */
    { true,  3, 5 }, /* edge 1 of hex 0 (F) */
    { true,  1, 0 }, /* edge 2 of hex 0 (F) */
    { false, 2, 0 }, /* edge 3 of hex 0 (F) */
    { false, 1, 2 }, /* edge 4 of hex 0 (F) */
    { false, 1, 1 }, /* edge 5 of hex 0 (F) */
    { true,  0, 2 }, /* edge 0 of hex 1 (X) */
    { true,  3, 4 }, /* edge 1 of hex 1 (X) */
    { false, 3, 1 }, /* edge 2 of hex 1 (X) */
    { false, 3, 0 }, /* edge 3 of hex 1 (X) */
    { false, 2, 2 }, /* edge 4 of hex 1 (X) */
    { false, 2, 1 }, /* edge 5 of hex 1 (X) */
    { false, 1, 0 }, /* edge 0 of hex 2 (G) */
    { false, 0, 1 }, /* edge 1 of hex 2 (G) */
    { true,  4, 1 }, /* edge 2 of hex 2 (G) */
    { true,  5, 1 }, /* edge 3 of hex 2 (G) */
    { true,  3, 0 }, /* edge 4 of hex 2 (G) */
    { true,  0, 0 }, /* edge 5 of hex 2 (G) */
    { true,  2, 4 }, /* edge 0 of hex 3 (S) */
    { true,  5, 0 }, /* edge 1 of hex 3 (S) */
    { true,  6, 0 }, /* edge 2 of hex 3 (S) */
    { false, 3, 2 }, /* edge 3 of hex 3 (S) */
    { true,  1, 1 }, /* edge 4 of hex 3 (S) */
    { true,  0, 1 }, /* edge 5 of hex 3 (S) */
    { true,  5, 2 }, /* edge 0 of hex 4 (P) */
    { true,  2, 2 }, /* edge 1 of hex 4 (P) */
    { false, 0, 0 }, /* edge 2 of hex 4 (P) */
    { false, 5, 1 }, /* edge 3 of hex 4 (P) */
    { false, 5, 0 }, /* edge 4 of hex 4 (P) */
    { false, 4, 4 }, /* edge 5 of hex 4 (P) */
    { true,  3, 1 }, /* edge 0 of hex 5 (D) */
    { true,  2, 3 }, /* edge 1 of hex 5 (D) */
    { true,  4, 0 }, /* edge 2 of hex 5 (D) */
    { false, 4, 3 }, /* edge 3 of hex 5 (D) */
    { false, 4, 2 }, /* edge 4 of hex 5 (D) */
    { true,  6, 1 }, /* edge 5 of hex 5 (D) */
    { true,  3, 2 }, /* edge 0 of hex 6 (J) */
    { true,  5, 5 }, /* edge 1 of hex 6 (J) */
    { false, 4, 1 }, /* edge 2 of hex 6 (J) */
    { false, 4, 0 }, /* edge 3 of hex 6 (J) */
    { false, 3, 4 }, /* edge 4 of hex 6 (J) */
    { false, 3, 3 }, /* edge 5 of hex 6 (J) */
};
static const struct MapEdge hexedges_G[] = {
    {  0, 2 },
    {  2, 3 },
    {  5, 3 },
    {  8, 5 },
    { 13, 5 },
    { 18, 2 },
};
static const struct MapEntry hexin_G[] = {
    { true,  4, 2 }, /* subedge 0 of edge 0 */
    { true,  2, 1 }, /* subedge 1 of edge 0 */
    { true,  2, 0 }, /* subedge 0 of edge 1 */
    { true,  0, 5 }, /* subedge 1 of edge 1 */
    { true,  0, 4 }, /* subedge 2 of edge 1 */
    { true,  0, 3 }, /* subedge 0 of edge 2 */
    { true,  1, 5 }, /* subedge 1 of edge 2 */
    { true,  1, 4 }, /* subedge 2 of edge 2 */
    { true,  1, 3 }, /* subedge 0 of edge 3 */
    { true,  1, 2 }, /* subedge 1 of edge 3 */
    { true,  3, 3 }, /* subedge 2 of edge 3 */
    { true,  6, 5 }, /* subedge 3 of edge 3 */
    { true,  6, 4 }, /* subedge 4 of edge 3 */
    { true,  6, 3 }, /* subedge 0 of edge 4 */
    { true,  6, 2 }, /* subedge 1 of edge 4 */
    { true,  5, 4 }, /* subedge 2 of edge 4 */
    { true,  5, 3 }, /* subedge 3 of edge 4 */
    { true,  4, 5 }, /* subedge 4 of edge 4 */
    { true,  4, 4 }, /* subedge 0 of edge 5 */
    { true,  4, 3 }, /* subedge 1 of edge 5 */
};
static const struct MapEntry hexmap_D[] = {
    { true,  2, 5 }, /* edge 0 of hex 0 (F) */
    { true,  3, 5 }, /* edge 1 of hex 0 (F) */
    { true,  1, 0 }, /* edge 2 of hex 0 (F) */
    { false, 1, 3 }, /* edge 3 of hex 0 (F) */
    { false, 1, 2 }, /* edge 4 of hex 0 (F) */
    { false, 1, 1 }, /* edge 5 of hex 0 (F) */
    { true,  0, 2 }, /* edge 0 of hex 1 (P) */
    { true,  3, 4 }, /* edge 1 of hex 1 (P) */
    { false, 3, 0 }, /* edge 2 of hex 1 (P) */
    { false, 2, 1 }, /* edge 3 of hex 1 (P) */
    { false, 2, 0 }, /* edge 4 of hex 1 (P) */
    { false, 1, 4 }, /* edge 5 of hex 1 (P) */
    { false, 1, 0 }, /* edge 0 of hex 2 (G) */
    { false, 0, 2 }, /* edge 1 of hex 2 (G) */
    { true,  4, 1 }, /* edge 2 of hex 2 (G) */
    { true,  5, 1 }, /* edge 3 of hex 2 (G) */
    { true,  3, 0 }, /* edge 4 of hex 2 (G) */
    { true,  0, 0 }, /* edge 5 of hex 2 (G) */
    { true,  2, 4 }, /* edge 0 of hex 3 (S) */
    { true,  5, 0 }, /* edge 1 of hex 3 (S) */
    { true,  6, 0 }, /* edge 2 of hex 3 (S) */
    { false, 3, 1 }, /* edge 3 of hex 3 (S) */
    { true,  1, 1 }, /* edge 4 of hex 3 (S) */
    { true,  0, 1 }, /* edge 5 of hex 3 (S) */
    { true,  5, 2 }, /* edge 0 of hex 4 (X) */
    { true,  2, 2 }, /* edge 1 of hex 4 (X) */
    { false, 0, 1 }, /* edge 2 of hex 4 (X) */
    { false, 0, 0 }, /* edge 3 of hex 4 (X) */
    { false, 5, 4 }, /* edge 4 of hex 4 (X) */
    { false, 5, 3 }, /* edge 5 of hex 4 (X) */
    { true,  3, 1 }, /* edge 0 of hex 5 (D) */
    { true,  2, 3 }, /* edge 1 of hex 5 (D) */
    { true,  4, 0 }, /* edge 2 of hex 5 (D) */
    { false, 5, 2 }, /* edge 3 of hex 5 (D) */
    { true,  7, 1 }, /* edge 4 of hex 5 (D) */
    { true,  6, 1 }, /* edge 5 of hex 5 (D) */
    { true,  3, 2 }, /* edge 0 of hex 6 (F) */
    { true,  5, 5 }, /* edge 1 of hex 6 (F) */
    { true,  7, 0 }, /* edge 2 of hex 6 (F) */
    { false, 4, 0 }, /* edge 3 of hex 6 (F) */
    { false, 3, 3 }, /* edge 4 of hex 6 (F) */
    { false, 3, 2 }, /* edge 5 of hex 6 (F) */
    { true,  6, 2 }, /* edge 0 of hex 7 (X) */
    { true,  5, 4 }, /* edge 1 of hex 7 (X) */
    { false, 5, 1 }, /* edge 2 of hex 7 (X) */
    { false, 5, 0 }, /* edge 3 of hex 7 (X) */
    { false, 4, 2 }, /* edge 4 of hex 7 (X) */
    { false, 4, 1 }, /* edge 5 of hex 7 (X) */
};
static const struct MapEdge hexedges_D[] = {
    {  0, 3 },
    {  3, 5 },
    {  8, 2 },
    { 10, 4 },
    { 14, 3 },
    { 17, 5 },
};
static const struct MapEntry hexin_D[] = {
    { true,  4, 3 }, /* subedge 0 of edge 0 */
    { true,  4, 2 }, /* subedge 1 of edge 0 */
    { true,  2, 1 }, /* subedge 2 of edge 0 */
    { true,  2, 0 }, /* subedge 0 of edge 1 */
    { true,  0, 5 }, /* subedge 1 of edge 1 */
    { true,  0, 4 }, /* subedge 2 of edge 1 */
    { true,  0, 3 }, /* subedge 3 of edge 1 */
    { true,  1, 5 }, /* subedge 4 of edge 1 */
    { true,  1, 4 }, /* subedge 0 of edge 2 */
    { true,  1, 3 }, /* subedge 1 of edge 2 */
    { true,  1, 2 }, /* subedge 0 of edge 3 */
    { true,  3, 3 }, /* subedge 1 of edge 3 */
    { true,  6, 5 }, /* subedge 2 of edge 3 */
    { true,  6, 4 }, /* subedge 3 of edge 3 */
    { true,  6, 3 }, /* subedge 0 of edge 4 */
    { true,  7, 5 }, /* subedge 1 of edge 4 */
    { true,  7, 4 }, /* subedge 2 of edge 4 */
    { true,  7, 3 }, /* subedge 0 of edge 5 */
    { true,  7, 2 }, /* subedge 1 of edge 5 */
    { true,  5, 3 }, /* subedge 2 of edge 5 */
    { true,  4, 5 }, /* subedge 3 of edge 5 */
    { true,  4, 4 }, /* subedge 4 of edge 5 */
};
static const struct MapEntry hexmap_J[] = {
    { true,  2, 5 }, /* edge 0 of hex 0 (F) */
    { true,  3, 5 }, /* edge 1 of hex 0 (F) */
    { true,  1, 0 }, /* edge 2 of hex 0 (F) */
    { false, 1, 3 }, /* edge 3 of hex 0 (F) */
    { false, 1, 2 }, /* edge 4 of hex 0 (F) */
    { false, 1, 1 }, /* edge 5 of hex 0 (F) */
    { true,  0, 2 }, /* edge 0 of hex 1 (P) */
    { true,  3, 4 }, /* edge 1 of hex 1 (P) */
    { false, 3, 0 }, /* edge 2 of hex 1 (P) */
    { false, 2, 1 }, /* edge 3 of hex 1 (P) */
    { false, 2, 0 }, /* edge 4 of hex 1 (P) */
    { false, 1, 4 }, /* edge 5 of hex 1 (P) */
    { false, 1, 0 }, /* edge 0 of hex 2 (G) */
    { false, 0, 1 }, /* edge 1 of hex 2 (G) */
    { true,  4, 1 }, /* edge 2 of hex 2 (G) */
    { true,  5, 1 }, /* edge 3 of hex 2 (G) */
    { true,  3, 0 }, /* edge 4 of hex 2 (G) */
    { true,  0, 0 }, /* edge 5 of hex 2 (G) */
    { true,  2, 4 }, /* edge 0 of hex 3 (S) */
    { true,  5, 0 }, /* edge 1 of hex 3 (S) */
    { true,  6, 0 }, /* edge 2 of hex 3 (S) */
    { false, 3, 1 }, /* edge 3 of hex 3 (S) */
    { true,  1, 1 }, /* edge 4 of hex 3 (S) */
    { true,  0, 1 }, /* edge 5 of hex 3 (S) */
    { true,  5, 2 }, /* edge 0 of hex 4 (Y) */
    { true,  2, 2 }, /* edge 1 of hex 4 (Y) */
    { false, 0, 0 }, /* edge 2 of hex 4 (Y) */
    { false, 5, 4 }, /* edge 3 of hex 4 (Y) */
    { false, 5, 3 }, /* edge 4 of hex 4 (Y) */
    { false, 5, 2 }, /* edge 5 of hex 4 (Y) */
    { true,  3, 1 }, /* edge 0 of hex 5 (D) */
    { true,  2, 3 }, /* edge 1 of hex 5 (D) */
    { true,  4, 0 }, /* edge 2 of hex 5 (D) */
    { false, 5, 1 }, /* edge 3 of hex 5 (D) */
    { true,  7, 1 }, /* edge 4 of hex 5 (D) */
    { true,  6, 1 }, /* edge 5 of hex 5 (D) */
    { true,  3, 2 }, /* edge 0 of hex 6 (F) */
    { true,  5, 5 }, /* edge 1 of hex 6 (F) */
    { true,  7, 0 }, /* edge 2 of hex 6 (F) */
    { false, 3, 4 }, /* edge 3 of hex 6 (F) */
    { false, 3, 3 }, /* edge 4 of hex 6 (F) */
    { false, 3, 2 }, /* edge 5 of hex 6 (F) */
    { true,  6, 2 }, /* edge 0 of hex 7 (P) */
    { true,  5, 4 }, /* edge 1 of hex 7 (P) */
    { false, 5, 0 }, /* edge 2 of hex 7 (P) */
    { false, 4, 1 }, /* edge 3 of hex 7 (P) */
    { false, 4, 0 }, /* edge 4 of hex 7 (P) */
    { false, 3, 5 }, /* edge 5 of hex 7 (P) */
};
static const struct MapEdge hexedges_J[] = {
    {  0, 2 },
    {  2, 5 },
    {  7, 2 },
    {  9, 6 },
    { 15, 2 },
    { 17, 5 },
};
static const struct MapEntry hexin_J[] = {
    { true,  4, 2 }, /* subedge 0 of edge 0 */
    { true,  2, 1 }, /* subedge 1 of edge 0 */
    { true,  2, 0 }, /* subedge 0 of edge 1 */
    { true,  0, 5 }, /* subedge 1 of edge 1 */
    { true,  0, 4 }, /* subedge 2 of edge 1 */
    { true,  0, 3 }, /* subedge 3 of edge 1 */
    { true,  1, 5 }, /* subedge 4 of edge 1 */
    { true,  1, 4 }, /* subedge 0 of edge 2 */
    { true,  1, 3 }, /* subedge 1 of edge 2 */
    { true,  1, 2 }, /* subedge 0 of edge 3 */
    { true,  3, 3 }, /* subedge 1 of edge 3 */
    { true,  6, 5 }, /* subedge 2 of edge 3 */
    { true,  6, 4 }, /* subedge 3 of edge 3 */
    { true,  6, 3 }, /* subedge 4 of edge 3 */
    { true,  7, 5 }, /* subedge 5 of edge 3 */
    { true,  7, 4 }, /* subedge 0 of edge 4 */
    { true,  7, 3 }, /* subedge 1 of edge 4 */
    { true,  7, 2 }, /* subedge 0 of edge 5 */
    { true,  5, 3 }, /* subedge 1 of edge 5 */
    { true,  4, 5 }, /* subedge 2 of edge 5 */
    { true,  4, 4 }, /* subedge 3 of edge 5 */
    { true,  4, 3 }, /* subedge 4 of edge 5 */
};
static const struct MapEntry hexmap_L[] = {
    { true,  2, 5 }, /* edge 0 of hex 0 (F) */
    { true,  3, 5 }, /* edge 1 of hex 0 (F) */
    { true,  1, 0 }, /* edge 2 of hex 0 (F) */
    { false, 1, 3 }, /* edge 3 of hex 0 (F) */
    { false, 1, 2 }, /* edge 4 of hex 0 (F) */
    { false, 1, 1 }, /* edge 5 of hex 0 (F) */
    { true,  0, 2 }, /* edge 0 of hex 1 (P) */
    { true,  3, 4 }, /* edge 1 of hex 1 (P) */
    { false, 3, 0 }, /* edge 2 of hex 1 (P) */
    { false, 2, 1 }, /* edge 3 of hex 1 (P) */
    { false, 2, 0 }, /* edge 4 of hex 1 (P) */
    { false, 1, 4 }, /* edge 5 of hex 1 (P) */
    { false, 1, 0 }, /* edge 0 of hex 2 (G) */
    { false, 0, 1 }, /* edge 1 of hex 2 (G) */
    { true,  4, 1 }, /* edge 2 of hex 2 (G) */
    { true,  5, 1 }, /* edge 3 of hex 2 (G) */
    { true,  3, 0 }, /* edge 4 of hex 2 (G) */
    { true,  0, 0 }, /* edge 5 of hex 2 (G) */
    { true,  2, 4 }, /* edge 0 of hex 3 (S) */
    { true,  5, 0 }, /* edge 1 of hex 3 (S) */
    { true,  6, 0 }, /* edge 2 of hex 3 (S) */
    { false, 3, 1 }, /* edge 3 of hex 3 (S) */
    { true,  1, 1 }, /* edge 4 of hex 3 (S) */
    { true,  0, 1 }, /* edge 5 of hex 3 (S) */
    { true,  5, 2 }, /* edge 0 of hex 4 (Y) */
    { true,  2, 2 }, /* edge 1 of hex 4 (Y) */
    { false, 0, 0 }, /* edge 2 of hex 4 (Y) */
    { false, 5, 5 }, /* edge 3 of hex 4 (Y) */
    { false, 5, 4 }, /* edge 4 of hex 4 (Y) */
    { false, 5, 3 }, /* edge 5 of hex 4 (Y) */
    { true,  3, 1 }, /* edge 0 of hex 5 (D) */
    { true,  2, 3 }, /* edge 1 of hex 5 (D) */
    { true,  4, 0 }, /* edge 2 of hex 5 (D) */
    { false, 5, 2 }, /* edge 3 of hex 5 (D) */
    { true,  7, 1 }, /* edge 4 of hex 5 (D) */
    { true,  6, 1 }, /* edge 5 of hex 5 (D) */
    { true,  3, 2 }, /* edge 0 of hex 6 (F) */
    { true,  5, 5 }, /* edge 1 of hex 6 (F) */
    { true,  7, 0 }, /* edge 2 of hex 6 (F) */
    { false, 4, 0 }, /* edge 3 of hex 6 (F) */
    { false, 3, 3 }, /* edge 4 of hex 6 (F) */
    { false, 3, 2 }, /* edge 5 of hex 6 (F) */
    { true,  6, 2 }, /* edge 0 of hex 7 (X) */
    { true,  5, 4 }, /* edge 1 of hex 7 (X) */
    { false, 5, 1 }, /* edge 2 of hex 7 (X) */
    { false, 5, 0 }, /* edge 3 of hex 7 (X) */
    { false, 4, 2 }, /* edge 4 of hex 7 (X) */
    { false, 4, 1 }, /* edge 5 of hex 7 (X) */
};
static const struct MapEdge hexedges_L[] = {
    {  0, 2 },
    {  2, 5 },
    {  7, 2 },
    {  9, 4 },
    { 13, 3 },
    { 16, 6 },
};
static const struct MapEntry hexin_L[] = {
    { true,  4, 2 }, /* subedge 0 of edge 0 */
    { true,  2, 1 }, /* subedge 1 of edge 0 */
    { true,  2, 0 }, /* subedge 0 of edge 1 */
    { true,  0, 5 }, /* subedge 1 of edge 1 */
    { true,  0, 4 }, /* subedge 2 of edge 1 */
    { true,  0, 3 }, /* subedge 3 of edge 1 */
    { true,  1, 5 }, /* subedge 4 of edge 1 */
    { true,  1, 4 }, /* subedge 0 of edge 2 */
    { true,  1, 3 }, /* subedge 1 of edge 2 */
    { true,  1, 2 }, /* subedge 0 of edge 3 */
    { true,  3, 3 }, /* subedge 1 of edge 3 */
    { true,  6, 5 }, /* subedge 2 of edge 3 */
    { true,  6, 4 }, /* subedge 3 of edge 3 */
    { true,  6, 3 }, /* subedge 0 of edge 4 */
    { true,  7, 5 }, /* subedge 1 of edge 4 */
    { true,  7, 4 }, /* subedge 2 of edge 4 */
    { true,  7, 3 }, /* subedge 0 of edge 5 */
    { true,  7, 2 }, /* subedge 1 of edge 5 */
    { true,  5, 3 }, /* subedge 2 of edge 5 */
    { true,  4, 5 }, /* subedge 3 of edge 5 */
    { true,  4, 4 }, /* subedge 4 of edge 5 */
    { true,  4, 3 }, /* subedge 5 of edge 5 */
};
static const struct MapEntry hexmap_X[] = {
    { true,  2, 5 }, /* edge 0 of hex 0 (F) */
    { true,  3, 5 }, /* edge 1 of hex 0 (F) */
    { true,  1, 0 }, /* edge 2 of hex 0 (F) */
    { false, 2, 0 }, /* edge 3 of hex 0 (F) */
    { false, 1, 2 }, /* edge 4 of hex 0 (F) */
    { false, 1, 1 }, /* edge 5 of hex 0 (F) */
    { true,  0, 2 }, /* edge 0 of hex 1 (Y) */
    { true,  3, 4 }, /* edge 1 of hex 1 (Y) */
    { false, 3, 0 }, /* edge 2 of hex 1 (Y) */
    { false, 2, 3 }, /* edge 3 of hex 1 (Y) */
    { false, 2, 2 }, /* edge 4 of hex 1 (Y) */
    { false, 2, 1 }, /* edge 5 of hex 1 (Y) */
    { false, 1, 0 }, /* edge 0 of hex 2 (G) */
    { false, 0, 1 }, /* edge 1 of hex 2 (G) */
    { true,  4, 1 }, /* edge 2 of hex 2 (G) */
    { true,  5, 1 }, /* edge 3 of hex 2 (G) */
    { true,  3, 0 }, /* edge 4 of hex 2 (G) */
    { true,  0, 0 }, /* edge 5 of hex 2 (G) */
    { true,  2, 4 }, /* edge 0 of hex 3 (S) */
    { true,  5, 0 }, /* edge 1 of hex 3 (S) */
    { true,  6, 0 }, /* edge 2 of hex 3 (S) */
    { false, 3, 1 }, /* edge 3 of hex 3 (S) */
    { true,  1, 1 }, /* edge 4 of hex 3 (S) */
    { true,  0, 1 }, /* edge 5 of hex 3 (S) */
    { true,  5, 2 }, /* edge 0 of hex 4 (Y) */
    { true,  2, 2 }, /* edge 1 of hex 4 (Y) */
    { false, 0, 0 }, /* edge 2 of hex 4 (Y) */
    { false, 5, 4 }, /* edge 3 of hex 4 (Y) */
    { false, 5, 3 }, /* edge 4 of hex 4 (Y) */
    { false, 5, 2 }, /* edge 5 of hex 4 (Y) */
    { true,  3, 1 }, /* edge 0 of hex 5 (D) */
    { true,  2, 3 }, /* edge 1 of hex 5 (D) */
    { true,  4, 0 }, /* edge 2 of hex 5 (D) */
    { false, 5, 1 }, /* edge 3 of hex 5 (D) */
    { true,  7, 1 }, /* edge 4 of hex 5 (D) */
    { true,  6, 1 }, /* edge 5 of hex 5 (D) */
    { true,  3, 2 }, /* edge 0 of hex 6 (F) */
    { true,  5, 5 }, /* edge 1 of hex 6 (F) */
    { true,  7, 0 }, /* edge 2 of hex 6 (F) */
    { false, 3, 4 }, /* edge 3 of hex 6 (F) */
    { false, 3, 3 }, /* edge 4 of hex 6 (F) */
    { false, 3, 2 }, /* edge 5 of hex 6 (F) */
    { true,  6, 2 }, /* edge 0 of hex 7 (P) */
    { true,  5, 4 }, /* edge 1 of hex 7 (P) */
    { false, 5, 0 }, /* edge 2 of hex 7 (P) */
    { false, 4, 1 }, /* edge 3 of hex 7 (P) */
    { false, 4, 0 }, /* edge 4 of hex 7 (P) */
    { false, 3, 5 }, /* edge 5 of hex 7 (P) */
};
static const struct MapEdge hexedges_X[] = {
    {  0, 2 },
    {  2, 3 },
    {  5, 4 },
    {  9, 6 },
    { 15, 2 },
    { 17, 5 },
};
static const struct MapEntry hexin_X[] = {
    { true,  4, 2 }, /* subedge 0 of edge 0 */
    { true,  2, 1 }, /* subedge 1 of edge 0 */
    { true,  2, 0 }, /* subedge 0 of edge 1 */
    { true,  0, 5 }, /* subedge 1 of edge 1 */
    { true,  0, 4 }, /* subedge 2 of edge 1 */
    { true,  0, 3 }, /* subedge 0 of edge 2 */
    { true,  1, 5 }, /* subedge 1 of edge 2 */
    { true,  1, 4 }, /* subedge 2 of edge 2 */
    { true,  1, 3 }, /* subedge 3 of edge 2 */
    { true,  1, 2 }, /* subedge 0 of edge 3 */
    { true,  3, 3 }, /* subedge 1 of edge 3 */
    { true,  6, 5 }, /* subedge 2 of edge 3 */
    { true,  6, 4 }, /* subedge 3 of edge 3 */
    { true,  6, 3 }, /* subedge 4 of edge 3 */
    { true,  7, 5 }, /* subedge 5 of edge 3 */
    { true,  7, 4 }, /* subedge 0 of edge 4 */
    { true,  7, 3 }, /* subedge 1 of edge 4 */
    { true,  7, 2 }, /* subedge 0 of edge 5 */
    { true,  5, 3 }, /* subedge 1 of edge 5 */
    { true,  4, 5 }, /* subedge 2 of edge 5 */
    { true,  4, 4 }, /* subedge 3 of edge 5 */
    { true,  4, 3 }, /* subedge 4 of edge 5 */
};
static const struct MapEntry hexmap_P[] = {
    { true,  2, 5 }, /* edge 0 of hex 0 (F) */
    { true,  3, 5 }, /* edge 1 of hex 0 (F) */
    { true,  1, 0 }, /* edge 2 of hex 0 (F) */
    { false, 2, 0 }, /* edge 3 of hex 0 (F) */
    { false, 1, 2 }, /* edge 4 of hex 0 (F) */
    { false, 1, 1 }, /* edge 5 of hex 0 (F) */
    { true,  0, 2 }, /* edge 0 of hex 1 (Y) */
    { true,  3, 4 }, /* edge 1 of hex 1 (Y) */
    { false, 3, 0 }, /* edge 2 of hex 1 (Y) */
    { false, 2, 3 }, /* edge 3 of hex 1 (Y) */
    { false, 2, 2 }, /* edge 4 of hex 1 (Y) */
    { false, 2, 1 }, /* edge 5 of hex 1 (Y) */
    { false, 1, 0 }, /* edge 0 of hex 2 (G) */
    { false, 0, 1 }, /* edge 1 of hex 2 (G) */
    { true,  4, 1 }, /* edge 2 of hex 2 (G) */
    { true,  5, 1 }, /* edge 3 of hex 2 (G) */
    { true,  3, 0 }, /* edge 4 of hex 2 (G) */
    { true,  0, 0 }, /* edge 5 of hex 2 (G) */
    { true,  2, 4 }, /* edge 0 of hex 3 (S) */
    { true,  5, 0 }, /* edge 1 of hex 3 (S) */
    { true,  6, 0 }, /* edge 2 of hex 3 (S) */
    { false, 3, 1 }, /* edge 3 of hex 3 (S) */
    { true,  1, 1 }, /* edge 4 of hex 3 (S) */
    { true,  0, 1 }, /* edge 5 of hex 3 (S) */
    { true,  5, 2 }, /* edge 0 of hex 4 (Y) */
    { true,  2, 2 }, /* edge 1 of hex 4 (Y) */
    { false, 0, 0 }, /* edge 2 of hex 4 (Y) */
    { false, 5, 5 }, /* edge 3 of hex 4 (Y) */
    { false, 5, 4 }, /* edge 4 of hex 4 (Y) */
    { false, 5, 3 }, /* edge 5 of hex 4 (Y) */
    { true,  3, 1 }, /* edge 0 of hex 5 (D) */
    { true,  2, 3 }, /* edge 1 of hex 5 (D) */
    { true,  4, 0 }, /* edge 2 of hex 5 (D) */
    { false, 5, 2 }, /* edge 3 of hex 5 (D) */
    { true,  7, 1 }, /* edge 4 of hex 5 (D) */
    { true,  6, 1 }, /* edge 5 of hex 5 (D) */
    { true,  3, 2 }, /* edge 0 of hex 6 (F) */
    { true,  5, 5 }, /* edge 1 of hex 6 (F) */
    { true,  7, 0 }, /* edge 2 of hex 6 (F) */
    { false, 4, 0 }, /* edge 3 of hex 6 (F) */
    { false, 3, 3 }, /* edge 4 of hex 6 (F) */
    { false, 3, 2 }, /* edge 5 of hex 6 (F) */
    { true,  6, 2 }, /* edge 0 of hex 7 (X) */
    { true,  5, 4 }, /* edge 1 of hex 7 (X) */
    { false, 5, 1 }, /* edge 2 of hex 7 (X) */
    { false, 5, 0 }, /* edge 3 of hex 7 (X) */
    { false, 4, 2 }, /* edge 4 of hex 7 (X) */
    { false, 4, 1 }, /* edge 5 of hex 7 (X) */
};
static const struct MapEdge hexedges_P[] = {
    {  0, 2 },
    {  2, 3 },
    {  5, 4 },
    {  9, 4 },
    { 13, 3 },
    { 16, 6 },
};
static const struct MapEntry hexin_P[] = {
    { true,  4, 2 }, /* subedge 0 of edge 0 */
    { true,  2, 1 }, /* subedge 1 of edge 0 */
    { true,  2, 0 }, /* subedge 0 of edge 1 */
    { true,  0, 5 }, /* subedge 1 of edge 1 */
    { true,  0, 4 }, /* subedge 2 of edge 1 */
    { true,  0, 3 }, /* subedge 0 of edge 2 */
    { true,  1, 5 }, /* subedge 1 of edge 2 */
    { true,  1, 4 }, /* subedge 2 of edge 2 */
    { true,  1, 3 }, /* subedge 3 of edge 2 */
    { true,  1, 2 }, /* subedge 0 of edge 3 */
    { true,  3, 3 }, /* subedge 1 of edge 3 */
    { true,  6, 5 }, /* subedge 2 of edge 3 */
    { true,  6, 4 }, /* subedge 3 of edge 3 */
    { true,  6, 3 }, /* subedge 0 of edge 4 */
    { true,  7, 5 }, /* subedge 1 of edge 4 */
    { true,  7, 4 }, /* subedge 2 of edge 4 */
    { true,  7, 3 }, /* subedge 0 of edge 5 */
    { true,  7, 2 }, /* subedge 1 of edge 5 */
    { true,  5, 3 }, /* subedge 2 of edge 5 */
    { true,  4, 5 }, /* subedge 3 of edge 5 */
    { true,  4, 4 }, /* subedge 4 of edge 5 */
    { true,  4, 3 }, /* subedge 5 of edge 5 */
};
static const struct MapEntry hexmap_S[] = {
    { true,  2, 5 }, /* edge 0 of hex 0 (L) */
    { true,  3, 5 }, /* edge 1 of hex 0 (L) */
    { true,  1, 0 }, /* edge 2 of hex 0 (L) */
    { false, 1, 1 }, /* edge 3 of hex 0 (L) */
    { false, 1, 0 }, /* edge 4 of hex 0 (L) */
    { false, 0, 4 }, /* edge 5 of hex 0 (L) */
    { true,  0, 2 }, /* edge 0 of hex 1 (P) */
    { true,  3, 4 }, /* edge 1 of hex 1 (P) */
    { false, 3, 0 }, /* edge 2 of hex 1 (P) */
    { false, 2, 1 }, /* edge 3 of hex 1 (P) */
    { false, 2, 0 }, /* edge 4 of hex 1 (P) */
    { false, 1, 2 }, /* edge 5 of hex 1 (P) */
    { false, 0, 3 }, /* edge 0 of hex 2 (G) */
    { false, 0, 2 }, /* edge 1 of hex 2 (G) */
    { true,  4, 1 }, /* edge 2 of hex 2 (G) */
    { true,  5, 1 }, /* edge 3 of hex 2 (G) */
    { true,  3, 0 }, /* edge 4 of hex 2 (G) */
    { true,  0, 0 }, /* edge 5 of hex 2 (G) */
    { true,  2, 4 }, /* edge 0 of hex 3 (S) */
    { true,  5, 0 }, /* edge 1 of hex 3 (S) */
    { true,  6, 0 }, /* edge 2 of hex 3 (S) */
    { false, 3, 1 }, /* edge 3 of hex 3 (S) */
    { true,  1, 1 }, /* edge 4 of hex 3 (S) */
    { true,  0, 1 }, /* edge 5 of hex 3 (S) */
    { true,  5, 2 }, /* edge 0 of hex 4 (X) */
    { true,  2, 2 }, /* edge 1 of hex 4 (X) */
    { false, 0, 1 }, /* edge 2 of hex 4 (X) */
    { false, 0, 0 }, /* edge 3 of hex 4 (X) */
    { false, 5, 4 }, /* edge 4 of hex 4 (X) */
    { false, 5, 3 }, /* edge 5 of hex 4 (X) */
    { true,  3, 1 }, /* edge 0 of hex 5 (D) */
    { true,  2, 3 }, /* edge 1 of hex 5 (D) */
    { true,  4, 0 }, /* edge 2 of hex 5 (D) */
    { false, 5, 2 }, /* edge 3 of hex 5 (D) */
    { true,  7, 1 }, /* edge 4 of hex 5 (D) */
    { true,  6, 1 }, /* edge 5 of hex 5 (D) */
    { true,  3, 2 }, /* edge 0 of hex 6 (F) */
    { true,  5, 5 }, /* edge 1 of hex 6 (F) */
    { true,  7, 0 }, /* edge 2 of hex 6 (F) */
    { false, 4, 0 }, /* edge 3 of hex 6 (F) */
    { false, 3, 3 }, /* edge 4 of hex 6 (F) */
    { false, 3, 2 }, /* edge 5 of hex 6 (F) */
    { true,  6, 2 }, /* edge 0 of hex 7 (X) */
    { true,  5, 4 }, /* edge 1 of hex 7 (X) */
    { false, 5, 1 }, /* edge 2 of hex 7 (X) */
    { false, 5, 0 }, /* edge 3 of hex 7 (X) */
    { false, 4, 2 }, /* edge 4 of hex 7 (X) */
    { false, 4, 1 }, /* edge 5 of hex 7 (X) */
};
static const struct MapEdge hexedges_S[] = {
    {  0, 5 },
    {  5, 3 },
    {  8, 2 },
    { 10, 4 },
    { 14, 3 },
    { 17, 5 },
};
static const struct MapEntry hexin_S[] = {
    { true,  4, 3 }, /* subedge 0 of edge 0 */
    { true,  4, 2 }, /* subedge 1 of edge 0 */
    { true,  2, 1 }, /* subedge 2 of edge 0 */
    { true,  2, 0 }, /* subedge 3 of edge 0 */
    { true,  0, 5 }, /* subedge 4 of edge 0 */
    { true,  0, 4 }, /* subedge 0 of edge 1 */
    { true,  0, 3 }, /* subedge 1 of edge 1 */
    { true,  1, 5 }, /* subedge 2 of edge 1 */
    { true,  1, 4 }, /* subedge 0 of edge 2 */
    { true,  1, 3 }, /* subedge 1 of edge 2 */
    { true,  1, 2 }, /* subedge 0 of edge 3 */
    { true,  3, 3 }, /* subedge 1 of edge 3 */
    { true,  6, 5 }, /* subedge 2 of edge 3 */
    { true,  6, 4 }, /* subedge 3 of edge 3 */
    { true,  6, 3 }, /* subedge 0 of edge 4 */
    { true,  7, 5 }, /* subedge 1 of edge 4 */
    { true,  7, 4 }, /* subedge 2 of edge 4 */
    { true,  7, 3 }, /* subedge 0 of edge 5 */
    { true,  7, 2 }, /* subedge 1 of edge 5 */
    { true,  5, 3 }, /* subedge 2 of edge 5 */
    { true,  4, 5 }, /* subedge 3 of edge 5 */
    { true,  4, 4 }, /* subedge 4 of edge 5 */
};
static const struct MapEntry hexmap_F[] = {
    { true,  2, 5 }, /* edge 0 of hex 0 (F) */
    { true,  3, 5 }, /* edge 1 of hex 0 (F) */
    { true,  1, 0 }, /* edge 2 of hex 0 (F) */
    { false, 1, 3 }, /* edge 3 of hex 0 (F) */
    { false, 1, 2 }, /* edge 4 of hex 0 (F) */
    { false, 1, 1 }, /* edge 5 of hex 0 (F) */
    { true,  0, 2 }, /* edge 0 of hex 1 (P) */
    { true,  3, 4 }, /* edge 1 of hex 1 (P) */
    { false, 3, 0 }, /* edge 2 of hex 1 (P) */
    { false, 2, 1 }, /* edge 3 of hex 1 (P) */
    { false, 2, 0 }, /* edge 4 of hex 1 (P) */
    { false, 1, 4 }, /* edge 5 of hex 1 (P) */
    { false, 1, 0 }, /* edge 0 of hex 2 (G) */
    { false, 0, 1 }, /* edge 1 of hex 2 (G) */
    { true,  4, 1 }, /* edge 2 of hex 2 (G) */
    { true,  5, 1 }, /* edge 3 of hex 2 (G) */
    { true,  3, 0 }, /* edge 4 of hex 2 (G) */
    { true,  0, 0 }, /* edge 5 of hex 2 (G) */
    { true,  2, 4 }, /* edge 0 of hex 3 (S) */
    { true,  5, 0 }, /* edge 1 of hex 3 (S) */
    { true,  6, 0 }, /* edge 2 of hex 3 (S) */
    { false, 3, 1 }, /* edge 3 of hex 3 (S) */
    { true,  1, 1 }, /* edge 4 of hex 3 (S) */
    { true,  0, 1 }, /* edge 5 of hex 3 (S) */
    { true,  5, 2 }, /* edge 0 of hex 4 (Y) */
    { true,  2, 2 }, /* edge 1 of hex 4 (Y) */
    { false, 0, 0 }, /* edge 2 of hex 4 (Y) */
    { false, 5, 4 }, /* edge 3 of hex 4 (Y) */
    { false, 5, 3 }, /* edge 4 of hex 4 (Y) */
    { false, 5, 2 }, /* edge 5 of hex 4 (Y) */
    { true,  3, 1 }, /* edge 0 of hex 5 (D) */
    { true,  2, 3 }, /* edge 1 of hex 5 (D) */
    { true,  4, 0 }, /* edge 2 of hex 5 (D) */
    { false, 5, 1 }, /* edge 3 of hex 5 (D) */
    { true,  7, 1 }, /* edge 4 of hex 5 (D) */
    { true,  6, 1 }, /* edge 5 of hex 5 (D) */
    { true,  3, 2 }, /* edge 0 of hex 6 (F) */
    { true,  5, 5 }, /* edge 1 of hex 6 (F) */
    { true,  7, 0 }, /* edge 2 of hex 6 (F) */
    { false, 4, 0 }, /* edge 3 of hex 6 (F) */
    { false, 3, 3 }, /* edge 4 of hex 6 (F) */
    { false, 3, 2 }, /* edge 5 of hex 6 (F) */
    { true,  6, 2 }, /* edge 0 of hex 7 (Y) */
    { true,  5, 4 }, /* edge 1 of hex 7 (Y) */
    { false, 5, 0 }, /* edge 2 of hex 7 (Y) */
    { false, 4, 3 }, /* edge 3 of hex 7 (Y) */
    { false, 4, 2 }, /* edge 4 of hex 7 (Y) */
    { false, 4, 1 }, /* edge 5 of hex 7 (Y) */
};
static const struct MapEdge hexedges_F[] = {
    {  0, 2 },
    {  2, 5 },
    {  7, 2 },
    {  9, 4 },
    { 13, 4 },
    { 17, 5 },
};
static const struct MapEntry hexin_F[] = {
    { true,  4, 2 }, /* subedge 0 of edge 0 */
    { true,  2, 1 }, /* subedge 1 of edge 0 */
    { true,  2, 0 }, /* subedge 0 of edge 1 */
    { true,  0, 5 }, /* subedge 1 of edge 1 */
    { true,  0, 4 }, /* subedge 2 of edge 1 */
    { true,  0, 3 }, /* subedge 3 of edge 1 */
    { true,  1, 5 }, /* subedge 4 of edge 1 */
    { true,  1, 4 }, /* subedge 0 of edge 2 */
    { true,  1, 3 }, /* subedge 1 of edge 2 */
    { true,  1, 2 }, /* subedge 0 of edge 3 */
    { true,  3, 3 }, /* subedge 1 of edge 3 */
    { true,  6, 5 }, /* subedge 2 of edge 3 */
    { true,  6, 4 }, /* subedge 3 of edge 3 */
    { true,  6, 3 }, /* subedge 0 of edge 4 */
    { true,  7, 5 }, /* subedge 1 of edge 4 */
    { true,  7, 4 }, /* subedge 2 of edge 4 */
    { true,  7, 3 }, /* subedge 3 of edge 4 */
    { true,  7, 2 }, /* subedge 0 of edge 5 */
    { true,  5, 3 }, /* subedge 1 of edge 5 */
    { true,  4, 5 }, /* subedge 2 of edge 5 */
    { true,  4, 4 }, /* subedge 3 of edge 5 */
    { true,  4, 3 }, /* subedge 4 of edge 5 */
};
static const struct MapEntry hexmap_Y[] = {
    { true,  2, 5 }, /* edge 0 of hex 0 (F) */
    { true,  3, 5 }, /* edge 1 of hex 0 (F) */
    { true,  1, 0 }, /* edge 2 of hex 0 (F) */
    { false, 2, 0 }, /* edge 3 of hex 0 (F) */
    { false, 1, 2 }, /* edge 4 of hex 0 (F) */
    { false, 1, 1 }, /* edge 5 of hex 0 (F) */
    { true,  0, 2 }, /* edge 0 of hex 1 (Y) */
    { true,  3, 4 }, /* edge 1 of hex 1 (Y) */
    { false, 3, 0 }, /* edge 2 of hex 1 (Y) */
    { false, 2, 3 }, /* edge 3 of hex 1 (Y) */
    { false, 2, 2 }, /* edge 4 of hex 1 (Y) */
    { false, 2, 1 }, /* edge 5 of hex 1 (Y) */
    { false, 1, 0 }, /* edge 0 of hex 2 (G) */
    { false, 0, 1 }, /* edge 1 of hex 2 (G) */
    { true,  4, 1 }, /* edge 2 of hex 2 (G) */
    { true,  5, 1 }, /* edge 3 of hex 2 (G) */
    { true,  3, 0 }, /* edge 4 of hex 2 (G) */
    { true,  0, 0 }, /* edge 5 of hex 2 (G) */
    { true,  2, 4 }, /* edge 0 of hex 3 (S) */
    { true,  5, 0 }, /* edge 1 of hex 3 (S) */
    { true,  6, 0 }, /* edge 2 of hex 3 (S) */
    { false, 3, 1 }, /* edge 3 of hex 3 (S) */
    { true,  1, 1 }, /* edge 4 of hex 3 (S) */
    { true,  0, 1 }, /* edge 5 of hex 3 (S) */
    { true,  5, 2 }, /* edge 0 of hex 4 (Y) */
    { true,  2, 2 }, /* edge 1 of hex 4 (Y) */
    { false, 0, 0 }, /* edge 2 of hex 4 (Y) */
    { false, 5, 4 }, /* edge 3 of hex 4 (Y) */
    { false, 5, 3 }, /* edge 4 of hex 4 (Y) */
    { false, 5, 2 }, /* edge 5 of hex 4 (Y) */
    { true,  3, 1 }, /* edge 0 of hex 5 (D) */
    { true,  2, 3 }, /* edge 1 of hex 5 (D) */
    { true,  4, 0 }, /* edge 2 of hex 5 (D) */
    { false, 5, 1 }, /* edge 3 of hex 5 (D) */
    { true,  7, 1 }, /* edge 4 of hex 5 (D) */
    { true,  6, 1 }, /* edge 5 of hex 5 (D) */
    { true,  3, 2 }, /* edge 0 of hex 6 (F) */
    { true,  5, 5 }, /* edge 1 of hex 6 (F) */
    { true,  7, 0 }, /* edge 2 of hex 6 (F) */
    { false, 4, 0 }, /* edge 3 of hex 6 (F) */
    { false, 3, 3 }, /* edge 4 of hex 6 (F) */
    { false, 3, 2 }, /* edge 5 of hex 6 (F) */
    { true,  6, 2 }, /* edge 0 of hex 7 (Y) */
    { true,  5, 4 }, /* edge 1 of hex 7 (Y) */
    { false, 5, 0 }, /* edge 2 of hex 7 (Y) */
    { false, 4, 3 }, /* edge 3 of hex 7 (Y) */
    { false, 4, 2 }, /* edge 4 of hex 7 (Y) */
    { false, 4, 1 }, /* edge 5 of hex 7 (Y) */
};
static const struct MapEdge hexedges_Y[] = {
    {  0, 2 },
    {  2, 3 },
    {  5, 4 },
    {  9, 4 },
    { 13, 4 },
    { 17, 5 },
};
static const struct MapEntry hexin_Y[] = {
    { true,  4, 2 }, /* subedge 0 of edge 0 */
    { true,  2, 1 }, /* subedge 1 of edge 0 */
    { true,  2, 0 }, /* subedge 0 of edge 1 */
    { true,  0, 5 }, /* subedge 1 of edge 1 */
    { true,  0, 4 }, /* subedge 2 of edge 1 */
    { true,  0, 3 }, /* subedge 0 of edge 2 */
    { true,  1, 5 }, /* subedge 1 of edge 2 */
    { true,  1, 4 }, /* subedge 2 of edge 2 */
    { true,  1, 3 }, /* subedge 3 of edge 2 */
    { true,  1, 2 }, /* subedge 0 of edge 3 */
    { true,  3, 3 }, /* subedge 1 of edge 3 */
    { true,  6, 5 }, /* subedge 2 of edge 3 */
    { true,  6, 4 }, /* subedge 3 of edge 3 */
    { true,  6, 3 }, /* subedge 0 of edge 4 */
    { true,  7, 5 }, /* subedge 1 of edge 4 */
    { true,  7, 4 }, /* subedge 2 of edge 4 */
    { true,  7, 3 }, /* subedge 3 of edge 4 */
    { true,  7, 2 }, /* subedge 0 of edge 5 */
    { true,  5, 3 }, /* subedge 1 of edge 5 */
    { true,  4, 5 }, /* subedge 2 of edge 5 */
    { true,  4, 4 }, /* subedge 3 of edge 5 */
    { true,  4, 3 }, /* subedge 4 of edge 5 */
};
static const struct MapEntry specmap_G[] = {
    { false, 2,  2 }, /* edge  0 of Spectre 0 */
    { false, 2,  1 }, /* edge  1 of Spectre 0 */
    { false, 2,  0 }, /* edge  2 of Spectre 0 */
    { false, 1,  2 }, /* edge  3 of Spectre 0 */
    { false, 1,  1 }, /* edge  4 of Spectre 0 */
    { false, 1,  0 }, /* edge  5 of Spectre 0 */
    { false, 0,  2 }, /* edge  6 of Spectre 0 */
    { false, 0,  1 }, /* edge  7 of Spectre 0 */
    { false, 0,  0 }, /* edge  8 of Spectre 0 */
    { false, 5,  2 }, /* edge  9 of Spectre 0 */
    { true,  1,  7 }, /* edge 10 of Spectre 0 */
    { true,  1,  6 }, /* edge 11 of Spectre 0 */
    { true,  1,  5 }, /* edge 12 of Spectre 0 */
    { true,  1,  4 }, /* edge 13 of Spectre 0 */
    { false, 4,  1 }, /* edge  0 of Spectre 1 */
    { false, 4,  0 }, /* edge  1 of Spectre 1 */
    { false, 3,  1 }, /* edge  2 of Spectre 1 */
    { false, 3,  0 }, /* edge  3 of Spectre 1 */
    { true,  0, 13 }, /* edge  4 of Spectre 1 */
    { true,  0, 12 }, /* edge  5 of Spectre 1 */
    { true,  0, 11 }, /* edge  6 of Spectre 1 */
    { true,  0, 10 }, /* edge  7 of Spectre 1 */
    { false, 5,  1 }, /* edge  8 of Spectre 1 */
    { false, 5,  0 }, /* edge  9 of Spectre 1 */
    { false, 4,  5 }, /* edge 10 of Spectre 1 */
    { false, 4,  4 }, /* edge 11 of Spectre 1 */
    { false, 4,  3 }, /* edge 12 of Spectre 1 */
    { false, 4,  2 }, /* edge 13 of Spectre 1 */
};
static const struct MapEdge specedges_G[] = {
    {  0, 3 },
    {  3, 3 },
    {  6, 3 },
    {  9, 2 },
    { 11, 6 },
    { 17, 3 },
};
static const struct MapEntry specin_G[] = {
    { true,  0,  8 }, /* subedge 0 of edge 0 */
    { true,  0,  7 }, /* subedge 1 of edge 0 */
    { true,  0,  6 }, /* subedge 2 of edge 0 */
    { true,  0,  5 }, /* subedge 0 of edge 1 */
    { true,  0,  4 }, /* subedge 1 of edge 1 */
    { true,  0,  3 }, /* subedge 2 of edge 1 */
    { true,  0,  2 }, /* subedge 0 of edge 2 */
    { true,  0,  1 }, /* subedge 1 of edge 2 */
    { true,  0,  0 }, /* subedge 2 of edge 2 */
    { true,  1,  3 }, /* subedge 0 of edge 3 */
    { true,  1,  2 }, /* subedge 1 of edge 3 */
    { true,  1,  1 }, /* subedge 0 of edge 4 */
    { true,  1,  0 }, /* subedge 1 of edge 4 */
    { true,  1, 13 }, /* subedge 2 of edge 4 */
    { true,  1, 12 }, /* subedge 3 of edge 4 */
    { true,  1, 11 }, /* subedge 4 of edge 4 */
    { true,  1, 10 }, /* subedge 5 of edge 4 */
    { true,  1,  9 }, /* subedge 0 of edge 5 */
    { true,  1,  8 }, /* subedge 1 of edge 5 */
    { true,  0,  9 }, /* subedge 2 of edge 5 */
};
static const struct MapEntry specmap_D[] = {
    { false, 3,  0 }, /* edge  0 of Spectre 0 */
    { false, 2,  2 }, /* edge  1 of Spectre 0 */
    { false, 2,  1 }, /* edge  2 of Spectre 0 */
    { false, 2,  0 }, /* edge  3 of Spectre 0 */
    { false, 1,  1 }, /* edge  4 of Spectre 0 */
    { false, 1,  0 }, /* edge  5 of Spectre 0 */
    { false, 0,  1 }, /* edge  6 of Spectre 0 */
    { false, 0,  0 }, /* edge  7 of Spectre 0 */
    { false, 5,  1 }, /* edge  8 of Spectre 0 */
    { false, 5,  0 }, /* edge  9 of Spectre 0 */
    { false, 4,  2 }, /* edge 10 of Spectre 0 */
    { false, 4,  1 }, /* edge 11 of Spectre 0 */
    { false, 4,  0 }, /* edge 12 of Spectre 0 */
    { false, 3,  1 }, /* edge 13 of Spectre 0 */
};
static const struct MapEdge specedges_D[] = {
    {  0, 2 },
    {  2, 2 },
    {  4, 3 },
    {  7, 2 },
    {  9, 3 },
    { 12, 2 },
};
static const struct MapEntry specin_D[] = {
    { true,  0,  7 }, /* subedge 0 of edge 0 */
    { true,  0,  6 }, /* subedge 1 of edge 0 */
    { true,  0,  5 }, /* subedge 0 of edge 1 */
    { true,  0,  4 }, /* subedge 1 of edge 1 */
    { true,  0,  3 }, /* subedge 0 of edge 2 */
    { true,  0,  2 }, /* subedge 1 of edge 2 */
    { true,  0,  1 }, /* subedge 2 of edge 2 */
    { true,  0,  0 }, /* subedge 0 of edge 3 */
    { true,  0, 13 }, /* subedge 1 of edge 3 */
    { true,  0, 12 }, /* subedge 0 of edge 4 */
    { true,  0, 11 }, /* subedge 1 of edge 4 */
    { true,  0, 10 }, /* subedge 2 of edge 4 */
    { true,  0,  9 }, /* subedge 0 of edge 5 */
    { true,  0,  8 }, /* subedge 1 of edge 5 */
};
static const struct MapEntry specmap_J[] = {
    { false, 3,  0 }, /* edge  0 of Spectre 0 */
    { false, 2,  2 }, /* edge  1 of Spectre 0 */
    { false, 2,  1 }, /* edge  2 of Spectre 0 */
    { false, 2,  0 }, /* edge  3 of Spectre 0 */
    { false, 1,  1 }, /* edge  4 of Spectre 0 */
    { false, 1,  0 }, /* edge  5 of Spectre 0 */
    { false, 0,  2 }, /* edge  6 of Spectre 0 */
    { false, 0,  1 }, /* edge  7 of Spectre 0 */
    { false, 0,  0 }, /* edge  8 of Spectre 0 */
    { false, 5,  1 }, /* edge  9 of Spectre 0 */
    { false, 5,  0 }, /* edge 10 of Spectre 0 */
    { false, 4,  2 }, /* edge 11 of Spectre 0 */
    { false, 4,  1 }, /* edge 12 of Spectre 0 */
    { false, 4,  0 }, /* edge 13 of Spectre 0 */
};
static const struct MapEdge specedges_J[] = {
    {  0, 3 },
    {  3, 2 },
    {  5, 3 },
    {  8, 1 },
    {  9, 3 },
    { 12, 2 },
};
static const struct MapEntry specin_J[] = {
    { true,  0,  8 }, /* subedge 0 of edge 0 */
    { true,  0,  7 }, /* subedge 1 of edge 0 */
    { true,  0,  6 }, /* subedge 2 of edge 0 */
    { true,  0,  5 }, /* subedge 0 of edge 1 */
    { true,  0,  4 }, /* subedge 1 of edge 1 */
    { true,  0,  3 }, /* subedge 0 of edge 2 */
    { true,  0,  2 }, /* subedge 1 of edge 2 */
    { true,  0,  1 }, /* subedge 2 of edge 2 */
    { true,  0,  0 }, /* subedge 0 of edge 3 */
    { true,  0, 13 }, /* subedge 0 of edge 4 */
    { true,  0, 12 }, /* subedge 1 of edge 4 */
    { true,  0, 11 }, /* subedge 2 of edge 4 */
    { true,  0, 10 }, /* subedge 0 of edge 5 */
    { true,  0,  9 }, /* subedge 1 of edge 5 */
};
static const struct MapEntry specmap_L[] = {
    { false, 3,  0 }, /* edge  0 of Spectre 0 */
    { false, 2,  2 }, /* edge  1 of Spectre 0 */
    { false, 2,  1 }, /* edge  2 of Spectre 0 */
    { false, 2,  0 }, /* edge  3 of Spectre 0 */
    { false, 1,  1 }, /* edge  4 of Spectre 0 */
    { false, 1,  0 }, /* edge  5 of Spectre 0 */
    { false, 0,  2 }, /* edge  6 of Spectre 0 */
    { false, 0,  1 }, /* edge  7 of Spectre 0 */
    { false, 0,  0 }, /* edge  8 of Spectre 0 */
    { false, 5,  0 }, /* edge  9 of Spectre 0 */
    { false, 4,  2 }, /* edge 10 of Spectre 0 */
    { false, 4,  1 }, /* edge 11 of Spectre 0 */
    { false, 4,  0 }, /* edge 12 of Spectre 0 */
    { false, 3,  1 }, /* edge 13 of Spectre 0 */
};
static const struct MapEdge specedges_L[] = {
    {  0, 3 },
    {  3, 2 },
    {  5, 3 },
    {  8, 2 },
    { 10, 3 },
    { 13, 1 },
};
static const struct MapEntry specin_L[] = {
    { true,  0,  8 }, /* subedge 0 of edge 0 */
    { true,  0,  7 }, /* subedge 1 of edge 0 */
    { true,  0,  6 }, /* subedge 2 of edge 0 */
    { true,  0,  5 }, /* subedge 0 of edge 1 */
    { true,  0,  4 }, /* subedge 1 of edge 1 */
    { true,  0,  3 }, /* subedge 0 of edge 2 */
    { true,  0,  2 }, /* subedge 1 of edge 2 */
    { true,  0,  1 }, /* subedge 2 of edge 2 */
    { true,  0,  0 }, /* subedge 0 of edge 3 */
    { true,  0, 13 }, /* subedge 1 of edge 3 */
    { true,  0, 12 }, /* subedge 0 of edge 4 */
    { true,  0, 11 }, /* subedge 1 of edge 4 */
    { true,  0, 10 }, /* subedge 2 of edge 4 */
    { true,  0,  9 }, /* subedge 0 of edge 5 */
};
static const struct MapEntry specmap_X[] = {
    { false, 3,  0 }, /* edge  0 of Spectre 0 */
    { false, 2,  1 }, /* edge  1 of Spectre 0 */
    { false, 2,  0 }, /* edge  2 of Spectre 0 */
    { false, 1,  2 }, /* edge  3 of Spectre 0 */
    { false, 1,  1 }, /* edge  4 of Spectre 0 */
    { false, 1,  0 }, /* edge  5 of Spectre 0 */
    { false, 0,  2 }, /* edge  6 of Spectre 0 */
    { false, 0,  1 }, /* edge  7 of Spectre 0 */
    { false, 0,  0 }, /* edge  8 of Spectre 0 */
    { false, 5,  1 }, /* edge  9 of Spectre 0 */
    { false, 5,  0 }, /* edge 10 of Spectre 0 */
    { false, 4,  2 }, /* edge 11 of Spectre 0 */
    { false, 4,  1 }, /* edge 12 of Spectre 0 */
    { false, 4,  0 }, /* edge 13 of Spectre 0 */
};
static const struct MapEdge specedges_X[] = {
    {  0, 3 },
    {  3, 3 },
    {  6, 2 },
    {  8, 1 },
    {  9, 3 },
    { 12, 2 },
};
static const struct MapEntry specin_X[] = {
    { true,  0,  8 }, /* subedge 0 of edge 0 */
    { true,  0,  7 }, /* subedge 1 of edge 0 */
    { true,  0,  6 }, /* subedge 2 of edge 0 */
    { true,  0,  5 }, /* subedge 0 of edge 1 */
    { true,  0,  4 }, /* subedge 1 of edge 1 */
    { true,  0,  3 }, /* subedge 2 of edge 1 */
    { true,  0,  2 }, /* subedge 0 of edge 2 */
    { true,  0,  1 }, /* subedge 1 of edge 2 */
    { true,  0,  0 }, /* subedge 0 of edge 3 */
    { true,  0, 13 }, /* subedge 0 of edge 4 */
    { true,  0, 12 }, /* subedge 1 of edge 4 */
    { true,  0, 11 }, /* subedge 2 of edge 4 */
    { true,  0, 10 }, /* subedge 0 of edge 5 */
    { true,  0,  9 }, /* subedge 1 of edge 5 */
};
static const struct MapEntry specmap_P[] = {
    { false, 3,  0 }, /* edge  0 of Spectre 0 */
    { false, 2,  1 }, /* edge  1 of Spectre 0 */
    { false, 2,  0 }, /* edge  2 of Spectre 0 */
    { false, 1,  2 }, /* edge  3 of Spectre 0 */
    { false, 1,  1 }, /* edge  4 of Spectre 0 */
    { false, 1,  0 }, /* edge  5 of Spectre 0 */
    { false, 0,  2 }, /* edge  6 of Spectre 0 */
    { false, 0,  1 }, /* edge  7 of Spectre 0 */
    { false, 0,  0 }, /* edge  8 of Spectre 0 */
    { false, 5,  0 }, /* edge  9 of Spectre 0 */
    { false, 4,  2 }, /* edge 10 of Spectre 0 */
    { false, 4,  1 }, /* edge 11 of Spectre 0 */
    { false, 4,  0 }, /* edge 12 of Spectre 0 */
    { false, 3,  1 }, /* edge 13 of Spectre 0 */
};
static const struct MapEdge specedges_P[] = {
    {  0, 3 },
    {  3, 3 },
    {  6, 2 },
    {  8, 2 },
    { 10, 3 },
    { 13, 1 },
};
static const struct MapEntry specin_P[] = {
    { true,  0,  8 }, /* subedge 0 of edge 0 */
    { true,  0,  7 }, /* subedge 1 of edge 0 */
    { true,  0,  6 }, /* subedge 2 of edge 0 */
    { true,  0,  5 }, /* subedge 0 of edge 1 */
    { true,  0,  4 }, /* subedge 1 of edge 1 */
    { true,  0,  3 }, /* subedge 2 of edge 1 */
    { true,  0,  2 }, /* subedge 0 of edge 2 */
    { true,  0,  1 }, /* subedge 1 of edge 2 */
    { true,  0,  0 }, /* subedge 0 of edge 3 */
    { true,  0, 13 }, /* subedge 1 of edge 3 */
    { true,  0, 12 }, /* subedge 0 of edge 4 */
    { true,  0, 11 }, /* subedge 1 of edge 4 */
    { true,  0, 10 }, /* subedge 2 of edge 4 */
    { true,  0,  9 }, /* subedge 0 of edge 5 */
};
static const struct MapEntry specmap_S[] = {
    { false, 3,  0 }, /* edge  0 of Spectre 0 */
    { false, 2,  2 }, /* edge  1 of Spectre 0 */
    { false, 2,  1 }, /* edge  2 of Spectre 0 */
    { false, 2,  0 }, /* edge  3 of Spectre 0 */
    { false, 0,  3 }, /* edge  4 of Spectre 0 */
    { false, 0,  2 }, /* edge  5 of Spectre 0 */
    { false, 0,  1 }, /* edge  6 of Spectre 0 */
    { false, 0,  0 }, /* edge  7 of Spectre 0 */
    { false, 5,  1 }, /* edge  8 of Spectre 0 */
    { false, 5,  0 }, /* edge  9 of Spectre 0 */
    { false, 4,  2 }, /* edge 10 of Spectre 0 */
    { false, 4,  1 }, /* edge 11 of Spectre 0 */
    { false, 4,  0 }, /* edge 12 of Spectre 0 */
    { false, 3,  1 }, /* edge 13 of Spectre 0 */
};
static const struct MapEdge specedges_S[] = {
    {  0, 6 },
    {  6, 2 },
    {  8, 3 },
    { 11, 2 },
    { 13, 3 },
    { 16, 2 },
};
static const struct MapEntry specin_S[] = {
    { true,  0,  7 }, /* subedge 0 of edge 0 */
    { true,  0,  6 }, /* subedge 1 of edge 0 */
    { true,  0,  5 }, /* subedge 2 of edge 0 */
    { true,  0,  4 }, /* subedge 3 of edge 0 */
    { false, 1,  1 }, /* subedge 4 of edge 0 */
    { false, 1,  0 }, /* subedge 5 of edge 0 */
    { false, 0,  5 }, /* subedge 0 of edge 1 */
    { false, 0,  4 }, /* subedge 1 of edge 1 */
    { true,  0,  3 }, /* subedge 0 of edge 2 */
    { true,  0,  2 }, /* subedge 1 of edge 2 */
    { true,  0,  1 }, /* subedge 2 of edge 2 */
    { true,  0,  0 }, /* subedge 0 of edge 3 */
    { true,  0, 13 }, /* subedge 1 of edge 3 */
    { true,  0, 12 }, /* subedge 0 of edge 4 */
    { true,  0, 11 }, /* subedge 1 of edge 4 */
    { true,  0, 10 }, /* subedge 2 of edge 4 */
    { true,  0,  9 }, /* subedge 0 of edge 5 */
    { true,  0,  8 }, /* subedge 1 of edge 5 */
};
static const struct MapEntry specmap_F[] = {
    { false, 3,  0 }, /* edge  0 of Spectre 0 */
    { false, 2,  2 }, /* edge  1 of Spectre 0 */
    { false, 2,  1 }, /* edge  2 of Spectre 0 */
    { false, 2,  0 }, /* edge  3 of Spectre 0 */
    { false, 1,  1 }, /* edge  4 of Spectre 0 */
    { false, 1,  0 }, /* edge  5 of Spectre 0 */
    { false, 0,  2 }, /* edge  6 of Spectre 0 */
    { false, 0,  1 }, /* edge  7 of Spectre 0 */
    { false, 0,  0 }, /* edge  8 of Spectre 0 */
    { false, 5,  1 }, /* edge  9 of Spectre 0 */
    { false, 5,  0 }, /* edge 10 of Spectre 0 */
    { false, 4,  1 }, /* edge 11 of Spectre 0 */
    { false, 4,  0 }, /* edge 12 of Spectre 0 */
    { false, 3,  1 }, /* edge 13 of Spectre 0 */
};
static const struct MapEdge specedges_F[] = {
    {  0, 3 },
    {  3, 2 },
    {  5, 3 },
    {  8, 2 },
    { 10, 2 },
    { 12, 2 },
};
static const struct MapEntry specin_F[] = {
    { true,  0,  8 }, /* subedge 0 of edge 0 */
    { true,  0,  7 }, /* subedge 1 of edge 0 */
    { true,  0,  6 }, /* subedge 2 of edge 0 */
    { true,  0,  5 }, /* subedge 0 of edge 1 */
    { true,  0,  4 }, /* subedge 1 of edge 1 */
    { true,  0,  3 }, /* subedge 0 of edge 2 */
    { true,  0,  2 }, /* subedge 1 of edge 2 */
    { true,  0,  1 }, /* subedge 2 of edge 2 */
    { true,  0,  0 }, /* subedge 0 of edge 3 */
    { true,  0, 13 }, /* subedge 1 of edge 3 */
    { true,  0, 12 }, /* subedge 0 of edge 4 */
    { true,  0, 11 }, /* subedge 1 of edge 4 */
    { true,  0, 10 }, /* subedge 0 of edge 5 */
    { true,  0,  9 }, /* subedge 1 of edge 5 */
};
static const struct MapEntry specmap_Y[] = {
    { false, 3,  0 }, /* edge  0 of Spectre 0 */
    { false, 2,  1 }, /* edge  1 of Spectre 0 */
    { false, 2,  0 }, /* edge  2 of Spectre 0 */
    { false, 1,  2 }, /* edge  3 of Spectre 0 */
    { false, 1,  1 }, /* edge  4 of Spectre 0 */
    { false, 1,  0 }, /* edge  5 of Spectre 0 */
    { false, 0,  2 }, /* edge  6 of Spectre 0 */
    { false, 0,  1 }, /* edge  7 of Spectre 0 */
    { false, 0,  0 }, /* edge  8 of Spectre 0 */
    { false, 5,  1 }, /* edge  9 of Spectre 0 */
    { false, 5,  0 }, /* edge 10 of Spectre 0 */
    { false, 4,  1 }, /* edge 11 of Spectre 0 */
    { false, 4,  0 }, /* edge 12 of Spectre 0 */
    { false, 3,  1 }, /* edge 13 of Spectre 0 */
};
static const struct MapEdge specedges_Y[] = {
    {  0, 3 },
    {  3, 3 },
    {  6, 2 },
    {  8, 2 },
    { 10, 2 },
    { 12, 2 },
};
static const struct MapEntry specin_Y[] = {
    { true,  0,  8 }, /* subedge 0 of edge 0 */
    { true,  0,  7 }, /* subedge 1 of edge 0 */
    { true,  0,  6 }, /* subedge 2 of edge 0 */
    { true,  0,  5 }, /* subedge 0 of edge 1 */
    { true,  0,  4 }, /* subedge 1 of edge 1 */
    { true,  0,  3 }, /* subedge 2 of edge 1 */
    { true,  0,  2 }, /* subedge 0 of edge 2 */
    { true,  0,  1 }, /* subedge 1 of edge 2 */
    { true,  0,  0 }, /* subedge 0 of edge 3 */
    { true,  0, 13 }, /* subedge 1 of edge 3 */
    { true,  0, 12 }, /* subedge 0 of edge 4 */
    { true,  0, 11 }, /* subedge 1 of edge 4 */
    { true,  0, 10 }, /* subedge 0 of edge 5 */
    { true,  0,  9 }, /* subedge 1 of edge 5 */
};
static const struct Possibility poss_G[] = {
    { HEX_G, 2, PROB_G },
    { HEX_D, 2, PROB_D },
    { HEX_J, 2, PROB_J },
    { HEX_L, 2, PROB_L },
    { HEX_X, 2, PROB_X },
    { HEX_P, 2, PROB_P },
    { HEX_S, 2, PROB_S },
    { HEX_F, 2, PROB_F },
    { HEX_Y, 2, PROB_Y },
};
static const struct Possibility poss_D[] = {
    { HEX_G, 5, PROB_G },
    { HEX_D, 5, PROB_D },
    { HEX_J, 5, PROB_J },
    { HEX_L, 5, PROB_L },
    { HEX_X, 5, PROB_X },
    { HEX_P, 5, PROB_P },
    { HEX_S, 5, PROB_S },
    { HEX_F, 5, PROB_F },
    { HEX_Y, 5, PROB_Y },
};
static const struct Possibility poss_J[] = {
    { HEX_G, 6, PROB_G },
};
static const struct Possibility poss_L[] = {
    { HEX_S, 0, PROB_S },
};
static const struct Possibility poss_X[] = {
    { HEX_G, 1, PROB_G },
    { HEX_D, 4, PROB_D },
    { HEX_D, 7, PROB_D },
    { HEX_L, 7, PROB_L },
    { HEX_P, 7, PROB_P },
    { HEX_S, 4, PROB_S },
    { HEX_S, 7, PROB_S },
};
static const struct Possibility poss_P[] = {
    { HEX_G, 4, PROB_G },
    { HEX_D, 1, PROB_D },
    { HEX_J, 1, PROB_J },
    { HEX_J, 7, PROB_J },
    { HEX_L, 1, PROB_L },
    { HEX_X, 7, PROB_X },
    { HEX_S, 1, PROB_S },
    { HEX_F, 1, PROB_F },
};
static const struct Possibility poss_S[] = {
    { HEX_G, 3, PROB_G },
    { HEX_D, 3, PROB_D },
    { HEX_J, 3, PROB_J },
    { HEX_L, 3, PROB_L },
    { HEX_X, 3, PROB_X },
    { HEX_P, 3, PROB_P },
    { HEX_S, 3, PROB_S },
    { HEX_F, 3, PROB_F },
    { HEX_Y, 3, PROB_Y },
};
static const struct Possibility poss_F[] = {
    { HEX_G, 0, PROB_G },
    { HEX_D, 0, PROB_D },
    { HEX_D, 6, PROB_D },
    { HEX_J, 0, PROB_J },
    { HEX_J, 6, PROB_J },
    { HEX_L, 0, PROB_L },
    { HEX_L, 6, PROB_L },
    { HEX_X, 0, PROB_X },
    { HEX_X, 6, PROB_X },
    { HEX_P, 0, PROB_P },
    { HEX_P, 6, PROB_P },
    { HEX_S, 6, PROB_S },
    { HEX_F, 0, PROB_F },
    { HEX_F, 6, PROB_F },
    { HEX_Y, 0, PROB_Y },
    { HEX_Y, 6, PROB_Y },
};
static const struct Possibility poss_Y[] = {
    { HEX_J, 4, PROB_J },
    { HEX_L, 4, PROB_L },
    { HEX_X, 1, PROB_X },
    { HEX_X, 4, PROB_X },
    { HEX_P, 1, PROB_P },
    { HEX_P, 4, PROB_P },
    { HEX_F, 4, PROB_F },
    { HEX_F, 7, PROB_F },
    { HEX_Y, 1, PROB_Y },
    { HEX_Y, 4, PROB_Y },
    { HEX_Y, 7, PROB_Y },
};
static const struct Possibility poss_spectre[] = {
    { HEX_G, 0, PROB_G },
    { HEX_G, 1, PROB_G },
    { HEX_D, 0, PROB_D },
    { HEX_J, 0, PROB_J },
    { HEX_L, 0, PROB_L },
    { HEX_X, 0, PROB_X },
    { HEX_P, 0, PROB_P },
    { HEX_S, 0, PROB_S },
    { HEX_F, 0, PROB_F },
    { HEX_Y, 0, PROB_Y },
};