package ru.ifmo.nds.tests;

import java.util.Arrays;
import java.util.Collections;
import java.util.Random;

import org.junit.Assert;
import org.junit.Test;

import ru.ifmo.nds.NonDominatedSorting;
import ru.ifmo.nds.NonDominatedSortingFactory;

public abstract class CorrectnessTestsBase {
    protected abstract NonDominatedSortingFactory getFactory();

    private void groupCheck(int[][] input, int[] expectedOutput) {
        double[][] doubleInput = new double[input.length][];
        for (int i = 0; i < input.length; ++i) {
            doubleInput[i] = new double[input[i].length];
            for (int j = 0; j < input[i].length; ++j) {
                doubleInput[i][j] = input[i][j];
            }
        }
        groupCheck(doubleInput, expectedOutput);
    }

    private void assertArrayEquals(int[] expected, int[] found) {
        int minExpectedDiffering = -1;
        int maxDistanceDiffering = -1;
        boolean isAlwaysNonGreater = true;
        boolean isAlwaysNonSmaller = true;
        boolean failed = false;

        // Shall not happen anyway
        Assert.assertEquals(expected.length, found.length);

        for (int i = 0; i < expected.length; ++i) {
            int ev = expected[i], av = found[i];
            if (ev != av) {
                failed = true;
                isAlwaysNonGreater &= av <= ev;
                isAlwaysNonSmaller &= av >= ev;
                if (minExpectedDiffering == -1 || expected[i] < expected[minExpectedDiffering]) {
                    minExpectedDiffering = i;
                }
                if (maxDistanceDiffering == -1 || Math.abs(found[i] - expected[i]) > Math.abs(found[maxDistanceDiffering] - expected[maxDistanceDiffering])) {
                    maxDistanceDiffering = i;
                }
            }
        }

        if (failed) {
            throw new AssertionError("Arrays differ"
                    + "\nSmallest expected: index " + minExpectedDiffering + " expected "
                    + expected[minExpectedDiffering] + " found " + found[minExpectedDiffering]
                    + "\nLargest difference: index " + maxDistanceDiffering + " expected "
                    + expected[maxDistanceDiffering] + " found " + found[maxDistanceDiffering]
                    + "\nAlways not greater: " + isAlwaysNonGreater
                    + "\nAlways not smaller: " + isAlwaysNonSmaller);
        }
    }

    private void groupCheck(double[][] input, int[] expectedOutput) {
        expectedOutput = expectedOutput.clone();
        NonDominatedSortingFactory factory = getFactory();

        int maxExpectedOutput = 0;
        for (int expected : expectedOutput) {
            maxExpectedOutput = Math.max(maxExpectedOutput, expected);
        }

        double[][] dupInput = new double[2 * input.length][];
        int[] dupOutput = new int[2 * expectedOutput.length];
        for (int i = 0; i < dupInput.length; ++i) {
            dupInput[i] = input[i / 2].clone();
            dupOutput[i] = expectedOutput[i / 2];
        }

        try (NonDominatedSorting sorting = factory.getInstance(input.length, input[0].length)) {
            int[] actualOutput = new int[expectedOutput.length];
            sorting.sort(input, actualOutput);
            assertArrayEquals(expectedOutput, actualOutput);
            Arrays.fill(actualOutput, 2347);
            sorting.sort(input, actualOutput);
            assertArrayEquals(expectedOutput, actualOutput);

            for (int maxRankG = maxExpectedOutput; maxRankG >= -maxExpectedOutput; --maxRankG) {
                int maxRank = Math.abs(maxRankG);
                int[] localExpectedOutput = expectedOutput.clone();
                for (int i = 0; i < localExpectedOutput.length; ++i) {
                    if (localExpectedOutput[i] > maxRank) {
                        localExpectedOutput[i] = maxRank + 1;
                    }
                }
                Arrays.fill(actualOutput, 0);
                sorting.sort(input, actualOutput, maxRank);
                assertArrayEquals(localExpectedOutput, actualOutput);
                Arrays.fill(actualOutput, 2347);
                sorting.sort(input, actualOutput, maxRank);
                assertArrayEquals(localExpectedOutput, actualOutput);
            }

            Arrays.fill(actualOutput, 0);
            sorting.sort(input, actualOutput);
            assertArrayEquals(expectedOutput, actualOutput);
            Arrays.fill(actualOutput, 2347);
            sorting.sort(input, actualOutput);
            assertArrayEquals(expectedOutput, actualOutput);
        }

        try (NonDominatedSorting sorting = factory.getInstance(dupInput.length, dupInput[0].length)) {
            int[] actualOutput = new int[dupOutput.length];
            sorting.sort(dupInput, actualOutput);
            assertArrayEquals(dupOutput, actualOutput);
            Arrays.fill(actualOutput, 2347);
            sorting.sort(dupInput, actualOutput);
            assertArrayEquals(dupOutput, actualOutput);
        }
    }

    private int[][] concat(int[][] a, int[][] b) {
        int[][] rv = new int[a.length + b.length][];
        for (int i = 0; i < a.length; ++i) {
            rv[i] = a[i].clone();
        }
        for (int i = 0; i < b.length; ++i) {
            rv[a.length + i] = b[i].clone();
        }
        return rv;
    }

    private int[] concat(int[] a, int[] b) {
        int[] rv = new int[a.length + b.length];
        System.arraycopy(a, 0, rv, 0, a.length);
        System.arraycopy(b, 0, rv, a.length, b.length);
        return rv;
    }

    private int[][] fill(int rows, int cols, int value) {
        int[][] rv = new int[rows][cols];
        for (int[] a : rv) {
            Arrays.fill(a, value);
        }
        return rv;
    }

    private int[] fill(int size, int value) {
        int[] rv = new int[size];
        Arrays.fill(rv, value);
        return rv;
    }

    private int[][] generateHypercube(int dim, int size) {
        if (dim == 1) {
            int[][] rv = new int[size][dim];
            for (int i = 0; i < size; ++i) {
                rv[i] = new int[] {i};
            }
            return rv;
        } else {
            int[][] rec = generateHypercube(dim - 1, size);
            int[][] rv = new int[size * rec.length][];
            for (int i = 0; i < rec.length; ++i) {
                for (int j = 0; j < size; ++j) {
                    int[] newValue = new int[dim];
                    System.arraycopy(rec[i], 0, newValue, 0, dim - 1);
                    newValue[dim - 1] = j;
                    rv[i * size + j] = newValue;
                }
            }
            return rv;
        }
    }

    private int[] hypercubeRanks(int[][] hypercube) {
        int[] rv = new int[hypercube.length];
        for (int i = 0; i < hypercube.length; ++i) {
            for (int j = 0; j < hypercube[i].length; ++j) {
                rv[i] += hypercube[i][j];
            }
        }
        return rv;
    }

    @Test
    public void maximumBoundariesAreSane() {
        Random random = new Random(325465);
        for (int i = 0; i < 100; ++i) {
            int maxPoints = 1 + random.nextInt(100);
            int maxDimension = 1 + random.nextInt(20);
            NonDominatedSortingFactory f = getFactory();
            NonDominatedSorting s = f.getInstance(maxPoints, maxDimension);
            Assert.assertEquals(maxPoints, s.getMaximumPoints());
            Assert.assertEquals(maxDimension, s.getMaximumDimension());
        }
    }

    @Test
    public void doesNotShareState() {
        try (NonDominatedSorting sorting = getFactory().getInstance(2, 3)) {
            double[][] nonDominated = {{1, 0, 0}, {0, 1, 0}};
            double[][] dominated = {{0, 0, 0}, {1, 1, 1}};
            int[] output = new int[2];
            for (int t = 0; t < 10; ++t) {
                sorting.sort(nonDominated, output);
                Assert.assertEquals(0, output[0]);
                Assert.assertEquals(0, output[1]);
                sorting.sort(dominated, output);
                Assert.assertEquals(0, output[0]);
                Assert.assertEquals(1, output[1]);
            }
        }
    }

    @Test
    public void single1D() {
        groupCheck(fill(1, 1, 239), fill(1, 0));
    }

    @Test
    public void single100D() {
        groupCheck(fill(1, 100, 239), fill(1, 0));
    }

    @Test
    public void single0D() {
        groupCheck(fill(1, 0, 239), fill(1, 0));
    }

    @Test
    public void several0D() {
        groupCheck(fill(10, 0, 239), fill(10, 0));
    }

    @Test
    public void two1DUnequalDecreasing() {
        groupCheck(new int[][] {{2}, {1}}, new int[] {1, 0});
    }

    @Test
    public void two1DUnequalIncreasing() {
        groupCheck(new int[][] {{1}, {2}}, new int[] {0, 1});
    }

    @Test
    public void multiple1DUnequalDecreasing() {
        int n = 100;
        int[][] input = new int[n][1];
        int[] output = new int[n];
        for (int i = 0; i < n; ++i) {
            input[i][0] = n - i;
            output[i] = n - i - 1;
        }
        groupCheck(input, output);
    }

    @Test
    public void multiple1DUnequalIncreasing() {
        int n = 100;
        int[][] input = new int[n][1];
        int[] output = new int[n];
        for (int i = 0; i < n; ++i) {
            input[i][0] = i + 1;
            output[i] = i;
        }
        groupCheck(input, output);
    }

    @Test
    public void two1DEqual() {
        groupCheck(new int[][] {{2}, {2}}, new int[] {0, 0});
    }

    @Test
    public void two2DUnequalIncomparable() {
        groupCheck(new int[][] {{1, 2}, {2, 1}}, new int[] {0, 0});
    }

    @Test
    public void two2DUnequalIncreasing() {
        groupCheck(new int[][] {{1, 1}, {2, 2}}, new int[] {0, 1});
    }

    @Test
    public void two2DUnequalDecreasing() {
        groupCheck(new int[][] {{2, 2}, {1, 1}}, new int[] {1, 0});
    }

    @Test
    public void twoGroupsOfManyEqualPoints() {
        groupCheck(concat(fill(10, 10, 11110), fill(10, 10, 11111)),
                concat(fill(10, 0), fill(10, 1)));
    }

    @Test
    public void twoGroupsOfManyEqualPointsReversed() {
        groupCheck(concat(fill(10, 10, 11111), fill(10, 10, 11110)),
                concat(fill(10, 1), fill(10, 0)));
    }

    @Test
    public void hypercube2D() {
        Random r = new Random(8352762);
        int[][] hc = generateHypercube(2, 10);
        Collections.shuffle(Arrays.asList(hc), r);
        int[] ranks = hypercubeRanks(hc);
        groupCheck(hc, ranks);
    }

    @Test
    public void hypercube3D() {
        Random r = new Random(82346357);
        int[][] hc = generateHypercube(3, 8);
        Collections.shuffle(Arrays.asList(hc), r);
        int[] ranks = hypercubeRanks(hc);
        groupCheck(hc, ranks);
    }

    @Test
    public void hypercube4D() {
        Random r = new Random(62143632);
        int[][] hc = generateHypercube(4, 5);
        Collections.shuffle(Arrays.asList(hc), r);
        int[] ranks = hypercubeRanks(hc);
        groupCheck(hc, ranks);
    }

    @Test
    public void hypercube5D() {
        Random r = new Random(62143632);
        int[][] hc = generateHypercube(5, 4);
        Collections.shuffle(Arrays.asList(hc), r);
        int[] ranks = hypercubeRanks(hc);
        groupCheck(hc, ranks);
    }

    @Test
    public void hypercube6D() {
        Random r = new Random(62143632);
        int[][] hc = generateHypercube(6, 3);
        Collections.shuffle(Arrays.asList(hc), r);
        int[] ranks = hypercubeRanks(hc);
        groupCheck(hc, ranks);
    }

    private void hyperplaneImpl(int dimension) {
        Random r = new Random(346357);
        int[][] data = new int[100][dimension];
        for (int i = 0; i < data.length; ++i) {
            data[i][0] = 1000000000;
            for (int j = 1; j < data[i].length; ++j) {
                data[i][j] = r.nextInt(10000000);
                data[i][0] -= data[i][j];
            }
        }
        int[] ranks = new int[100];
        groupCheck(data, ranks);
    }

    @Test
    public void singleMeaningfulRow() {
        int n = 100, d = 5;
        int[][] data = new int[n][d];
        int[] ranks = new int[n];
        for (int i = 0; i < d; ++i) {
            for (int j = 0; j < n; ++j) {
                data[j][i] = j;
                ranks[j] = j;
            }
            groupCheck(data, ranks);
            for (int j = 0; j < n; ++j) {
                data[j][i] = 0;
            }
        }
    }

    @Test
    public void hyperplane2D() {
        hyperplaneImpl(2);
    }

    @Test
    public void hyperplane3D() {
        hyperplaneImpl(3);
    }

    @Test
    public void hyperplane4D() {
        hyperplaneImpl(4);
    }

    @Test
    public void hyperplane5D() {
        hyperplaneImpl(5);
    }

    @Test
    public void generatedTest1() {
        groupCheck(new int[][] {
                {-802722320, -454657628, 225851471}, {-98542905, -152834951, 84118477},
                {-914454915, 959085012, -60245822}, {-657036692, -349821749, 311923685},
                {-474717265, -445106490, 535962357}, {-815877872, 512265128, 531492492},
                {-832876652, 780965133, -262104115}, {-589905879, 725260188, 705639821},
                {744492102, 650058155, 902077439}, {916192307, -400878152, -177898421},
                {-711082130, 23981619, 723118547}, {289717915, -694022593, -15699066},
                {-542792952, 235407179, 957383274}, {-625141817, -839959208, 994536087},
                {822035885, 564018861, 571738696}
        }, new int[] {0, 0, 0, 1, 1, 0, 0, 2, 2, 0, 1, 0, 2, 0, 2});
    }

    @Test
    public void generatedTest2() {
        groupCheck(new int[][] {
                {-758, -515, -226}, {-786, -98, -268}, {-876, -264, -655}, {-43, -572, -418}, {-158, -517, -647},
                {-636, -321, -369}, {-19, -547, -935}, {-571, -866, -524}, {-819, -917, -692}, {-555, -487, -980}
        }, new int[] {1, 1, 0, 2, 1, 1, 0, 1, 0, 0});
    }

    @Test
    public void small3dSortedPointsTest() {
        groupCheck(new int[][] {
                {1, 5, 6}, {2, 4, 5}, {3, 6, 8}, {4, 2, 7}, {5, 3, 1}, {6, 7, 3}, {7, 8, 4}, {8, 1, 2}
        }, new int[] {0, 0, 1, 0, 0, 1, 2, 0});
    }

    @Test
    public void fromNDTreePaperTest() {
        groupCheck(new int[][] {
                {1, 5}, {2, 2}, {4, 1}, {7, 3}, {5, 4}, {6, 8}, {8, 5}, {3, 7}
        }, new int[] {0, 0, 0, 1, 1, 2, 2, 1});
    }

    @Test
    public void generatedTest3() {
        groupCheck(new int[][] {
                {1, 4, 3, 3, 1, 1}, {3, 5, 4, 6, 7, 1}, {1, 2, 2, 3, 8, 0}, {0, 2, 4, 8, 3, 5}, {0, 2, 7, 4, 2, 9},
                {1, 3, 9, 4, 0, 1}, {7, 6, 7, 1, 7, 4}, {6, 0, 9, 3, 7, 1}, {7, 0, 7, 8, 3, 0}, {4, 7, 6, 4, 0, 3},
                {9, 2, 7, 0, 8, 8}, {5, 5, 3, 3, 6, 1}, {0, 7, 4, 1, 9, 2}, {1, 2, 0, 3, 9, 6}, {2, 8, 2, 6, 9, 3},
                {1, 5, 0, 7, 4, 9}, {4, 8, 4, 8, 2, 9}, {7, 7, 5, 7, 3, 2}, {2, 6, 3, 6, 7, 9}, {8, 3, 3, 7, 0, 4},
                {4, 1, 5, 1, 1, 5}, {9, 7, 4, 0, 9, 4}, {6, 5, 3, 5, 7, 9}, {1, 2, 7, 7, 0, 1}, {4, 9, 8, 4, 3, 8},
                {5, 7, 5, 7, 4, 6}, {1, 2, 1, 0, 6, 8}, {8, 8, 3, 8, 4, 9}, {8, 5, 7, 8, 2, 3}, {2, 1, 1, 0, 6, 0},
                {9, 5, 8, 9, 6, 6}, {1, 5, 5, 2, 3, 4}, {8, 4, 9, 5, 4, 7}, {1, 9, 2, 5, 3, 5}, {0, 5, 9, 4, 3, 2},
                {0, 7, 4, 5, 8, 0}, {0, 3, 6, 2, 3, 7}, {7, 3, 1, 3, 7, 3}, {5, 2, 4, 0, 7, 0}, {4, 6, 2, 2, 8, 4},
                {2, 7, 1, 0, 6, 8}, {0, 5, 8, 0, 7, 6}, {5, 0, 4, 1, 7, 9}, {6, 9, 1, 4, 2, 6}, {5, 4, 3, 3, 4, 5},
                {6, 5, 0, 1, 1, 6}, {9, 5, 1, 0, 0, 5}, {8, 2, 4, 3, 7, 5}, {3, 4, 5, 7, 9, 1}, {9, 1, 4, 9, 0, 5},
                {6, 3, 9, 0, 6, 0}, {7, 2, 4, 3, 6, 1}, {8, 4, 4, 4, 3, 9}, {3, 7, 1, 1, 3, 8}, {9, 4, 6, 3, 4, 0},
                {3, 4, 9, 0, 1, 5}, {4, 7, 9, 5, 9, 8}, {2, 2, 2, 8, 0, 9}, {8, 2, 4, 7, 7, 2}, {6, 4, 4, 0, 0, 4},
                {9, 3, 0, 2, 0, 6}, {1, 6, 2, 6, 1, 5}, {9, 8, 3, 3, 9, 3}, {0, 3, 2, 7, 3, 6}, {8, 3, 9, 5, 0, 9},
                {6, 5, 9, 2, 3, 5}, {5, 6, 8, 2, 0, 5}, {7, 7, 1, 5, 4, 3}, {2, 9, 8, 5, 2, 7}, {4, 3, 8, 7, 1, 0},
                {2, 1, 7, 0, 4, 5}, {4, 3, 5, 2, 5, 4}, {4, 1, 6, 6, 5, 1}, {1, 6, 7, 3, 9, 9}, {8, 4, 6, 6, 8, 6},
                {2, 5, 1, 6, 0, 7}, {6, 5, 9, 7, 6, 2}, {0, 2, 0, 8, 0, 1}, {0, 7, 9, 2, 8, 7}, {2, 5, 4, 1, 2, 2},
                {1, 0, 0, 5, 7, 0}, {4, 8, 6, 2, 7, 1}, {4, 6, 2, 5, 3, 5}, {4, 5, 6, 0, 0, 9}, {2, 7, 1, 6, 5, 7},
                {1, 5, 5, 0, 5, 4}, {0, 4, 8, 7, 0, 0}, {3, 0, 7, 1, 1, 7}, {7, 2, 6, 6, 3, 3}, {7, 7, 4, 2, 0, 8},
                {2, 7, 6, 9, 8, 2}, {7, 5, 5, 7, 7, 0}, {4, 4, 9, 1, 5, 0}, {1, 4, 8, 7, 9, 9}, {0, 2, 0, 7, 8, 4},
                {5, 8, 1, 9, 7, 4}, {6, 2, 6, 1, 9, 2}, {2, 5, 7, 8, 2, 1}, {2, 0, 7, 9, 3, 3}, {7, 3, 6, 6, 4, 5},
                {0, 3, 3, 2, 5, 7}, {9, 7, 2, 7, 2, 6}, {0, 3, 8, 9, 4, 9}, {5, 2, 4, 7, 1, 0}, {6, 2, 1, 1, 0, 2},
                {9, 7, 0, 2, 0, 1}, {1, 3, 0, 6, 5, 3}, {0, 9, 6, 3, 6, 8}, {1, 1, 8, 7, 9, 4}, {3, 2, 1, 2, 7, 6},
                {2, 0, 8, 1, 7, 7}, {7, 4, 3, 8, 1, 3}, {1, 2, 5, 5, 2, 9}, {9, 4, 0, 8, 0, 6}, {5, 2, 2, 0, 9, 1},
                {1, 5, 8, 9, 4, 3}, {0, 8, 2, 3, 7, 6}, {1, 4, 8, 0, 9, 3}, {3, 0, 3, 2, 0, 2}, {1, 3, 3, 9, 5, 3},
                {5, 5, 3, 7, 2, 0}, {6, 3, 5, 3, 8, 7}, {6, 9, 7, 3, 1, 8}, {3, 6, 6, 2, 7, 0}, {9, 9, 1, 6, 3, 0},
                {1, 6, 5, 5, 0, 2}, {2, 4, 5, 4, 8, 7}, {5, 1, 1, 2, 1, 9}, {6, 2, 1, 1, 1, 9}, {1, 2, 1, 2, 4, 8},
                {4, 6, 5, 1, 5, 1}, {2, 5, 8, 3, 2, 8}, {2, 4, 5, 2, 2, 5}, {8, 6, 5, 0, 8, 8}, {8, 9, 5, 2, 5, 9},
                {2, 5, 1, 1, 4, 7}, {8, 9, 6, 9, 5, 5}, {6, 9, 3, 8, 4, 3}, {4, 8, 7, 9, 3, 9}, {6, 8, 7, 5, 8, 6},
                {2, 1, 9, 1, 4, 2}, {5, 4, 5, 2, 1, 2}, {5, 0, 7, 8, 9, 2}, {4, 6, 3, 5, 7, 1}, {9, 3, 2, 0, 6, 1},
                {8, 2, 8, 8, 7, 5}, {3, 8, 6, 6, 0, 1}, {3, 3, 1, 5, 4, 2}, {9, 4, 9, 0, 4, 3}, {6, 9, 5, 7, 8, 7},
                {3, 5, 3, 4, 1, 6}, {2, 4, 3, 2, 6, 3}, {7, 2, 7, 5, 4, 0}, {5, 3, 0, 0, 7, 9}, {0, 7, 8, 8, 5, 5},
                {8, 8, 3, 8, 0, 5}, {4, 8, 2, 6, 5, 0}, {1, 0, 7, 8, 2, 9}, {0, 7, 1, 6, 2, 1}, {2, 5, 3, 0, 8, 6},
                {2, 7, 4, 7, 6, 3}, {0, 9, 5, 8, 9, 5}, {5, 6, 6, 7, 4, 0}, {8, 4, 8, 3, 2, 7}, {5, 3, 8, 6, 0, 0},
                {5, 0, 1, 5, 2, 9}, {3, 6, 4, 4, 1, 0}, {3, 7, 8, 2, 1, 8}, {8, 9, 1, 5, 4, 3}, {1, 2, 6, 8, 1, 8},
                {3, 8, 2, 4, 8, 3}, {8, 5, 3, 6, 3, 8}, {2, 6, 6, 1, 5, 9}, {5, 9, 0, 5, 1, 9}, {6, 4, 2, 1, 4, 9},
                {3, 8, 6, 4, 4, 8}, {9, 0, 4, 0, 8, 0}, {8, 3, 8, 7, 2, 2}, {4, 7, 4, 2, 9, 6}, {4, 4, 4, 2, 4, 7},
                {3, 0, 1, 2, 8, 9}, {5, 1, 3, 2, 2, 1}, {0, 9, 0, 0, 2, 5}, {1, 0, 3, 8, 9, 6}, {5, 6, 8, 7, 6, 2},
                {1, 4, 1, 5, 7, 7}, {2, 2, 1, 8, 0, 4}, {4, 9, 0, 2, 5, 1}, {8, 4, 4, 7, 9, 9}, {8, 2, 2, 0, 9, 1},
                {4, 1, 0, 2, 9, 8}, {4, 6, 0, 5, 3, 5}, {8, 6, 0, 8, 7, 3}, {6, 6, 5, 5, 9, 4}, {1, 5, 0, 6, 2, 2},
                {4, 1, 7, 7, 8, 7}, {7, 4, 4, 6, 5, 4}, {6, 7, 6, 2, 2, 7}, {4, 1, 3, 5, 0, 0}, {1, 5, 9, 5, 6, 7}
        }, new int[] {
                0, 1, 0, 1, 0, 0, 2, 0, 0, 1, 2, 1, 0, 0, 1, 1, 3, 2, 2, 1, 0, 3, 3, 0, 2, 2, 0, 3, 2, 0, 3, 0, 3, 1,
                0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 2, 1, 1, 1, 1, 2, 0, 0, 0, 3, 2, 2, 0, 0, 0, 3, 0, 1, 2, 1, 1,
                1, 1, 0, 1, 1, 1, 3, 0, 2, 0, 1, 0, 0, 2, 1, 0, 1, 0, 0, 0, 1, 1, 1, 2, 0, 2, 0, 2, 2, 1, 0, 2, 0, 1,
                2, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 2, 2, 1, 0, 0, 2, 0, 1, 0, 0, 1, 0, 2, 3, 0,
                3, 2, 4, 3, 0, 1, 1, 1, 1, 3, 0, 0, 0, 3, 1, 1, 1, 0, 2, 2, 0, 0, 0, 1, 2, 2, 2, 2, 1, 0, 0, 1, 2, 1,
                1, 2, 1, 0, 2, 2, 0, 2, 2, 1, 0, 0, 0, 1, 3, 1, 1, 0, 3, 2, 0, 0, 1, 2, 0, 2, 1, 2, 0, 1
        });
    }

    @Test
    public void generatedTest4() {
        groupCheck(new int[][] {
                {923, 565, 773}, {444, 591, 756}, {272, 974, 743}, {962, 736, 763}, {957, 562, 957}, {995, 334, 950},
                {925, 43, 100}, {550, 727, 269}, {360, 67, 428}, {728, 395, 315}, {88, 558, 283}, {8, 550, 45},
                {184, 308, 822}, {666, 955, 90}, {551, 370, 277}, {338, 142, 269}, {770, 757, 11}, {46, 882, 761},
                {2, 385, 623}, {730, 188, 566}, {712, 927, 754}, {37, 506, 103}, {360, 109, 715}, {478, 229, 95},
                {285, 466, 526}, {987, 374, 510}, {528, 644, 338}, {943, 32, 927}, {505, 613, 708}, {996, 10, 70},
                {505, 750, 181}, {375, 842, 799}, {843, 46, 984}, {994, 221, 710}, {553, 627, 448}, {222, 401, 828},
                {668, 259, 821}, {955, 924, 943}, {361, 402, 956}, {308, 201, 698}, {53, 508, 482}, {114, 908, 13},
                {68, 415, 283}, {786, 393, 958}, {72, 296, 86}, {271, 985, 889}, {925, 439, 260}, {5, 731, 719},
                {746, 194, 762}, {171, 504, 219}, {853, 328, 76}, {134, 504, 168}, {499, 870, 44}, {90, 558, 870},
                {568, 23, 938}, {687, 912, 122}, {84, 727, 814}, {562, 409, 296}, {964, 204, 904}, {642, 374, 47},
                {423, 950, 211}, {602, 178, 259}, {825, 451, 93}, {62, 862, 371}, {880, 359, 80}, {720, 102, 385},
                {731, 510, 973}, {188, 799, 896}, {215, 416, 478}, {557, 796, 302}, {201, 584, 751}, {785, 217, 107},
                {412, 972, 201}, {838, 230, 904}, {294, 399, 300}, {312, 325, 101}, {448, 664, 434}, {367, 479, 29},
                {388, 252, 82}, {960, 579, 951}, {424, 871, 520}, {652, 379, 288}, {794, 696, 790}, {655, 443, 615},
                {458, 786, 600}, {218, 447, 453}, {876, 346, 845}, {65, 539, 554}, {511, 205, 530}, {676, 382, 542},
                {984, 781, 697}, {867, 718, 37}, {767, 174, 794}, {636, 315, 744}, {796, 657, 6}, {902, 952, 327},
                {404, 131, 73}, {35, 80, 480}, {961, 555, 169}, {545, 356, 947}, {312, 108, 98}, {364, 26, 189},
                {648, 865, 687}, {856, 132, 756}, {720, 433, 703}, {568, 252, 401}, {761, 315, 393}, {380, 847, 372},
                {325, 889, 815}, {142, 664, 427}, {167, 942, 243}, {743, 227, 968}, {448, 530, 945}, {179, 952, 35},
                {166, 348, 577}, {296, 328, 41}, {266, 39, 921}, {65, 704, 471}, {674, 962, 248}, {271, 507, 885},
                {929, 594, 918}, {839, 563, 787}, {856, 764, 807}, {701, 974, 447}, {821, 833, 498}, {63, 73, 537},
                {484, 870, 732}, {244, 355, 878}, {198, 901, 463}, {295, 965, 944}, {616, 511, 624}, {439, 6, 779},
                {772, 916, 261}, {933, 107, 802}, {90, 233, 618}, {871, 254, 978}, {966, 510, 534}, {84, 404, 284},
                {187, 166, 534}, {996, 978, 737}, {641, 70, 225}, {982, 241, 144}, {722, 663, 843}, {878, 478, 334},
                {223, 365, 530}, {733, 859, 880}, {373, 945, 970}, {590, 115, 728}, {144, 66, 460}, {228, 374, 431},
                {86, 570, 559}, {118, 900, 487}, {959, 808, 318}, {213, 171, 148}, {912, 924, 841}, {283, 505, 183},
                {644, 962, 850}, {351, 569, 362}, {495, 220, 291}, {412, 476, 621}, {128, 819, 599}, {600, 859, 972},
                {971, 509, 135}, {548, 784, 723}, {568, 523, 645}, {91, 690, 824}, {332, 835, 154}, {31, 931, 984},
                {193, 216, 324}, {614, 857, 828}, {677, 532, 104}, {283, 938, 998}, {913, 44, 884}, {925, 357, 711},
                {1, 115, 790}, {167, 506, 438}, {17, 966, 822}, {749, 224, 612}, {778, 841, 284}, {91, 849, 313},
                {6, 759, 269}, {102, 612, 219}, {386, 280, 662}, {746, 33, 819}, {77, 997, 679}, {635, 681, 244},
                {427, 250, 160}, {531, 651, 98}, {562, 710, 101}, {798, 335, 447}, {408, 320, 519}, {169, 31, 527},
                {326, 512, 468}, {954, 236, 313}, {424, 858, 106}, {699, 774, 854}, {686, 174, 740}, {530, 436, 683},
                {936, 748, 396}, {190, 958, 875}, {741, 385, 381}, {673, 782, 822}, {934, 922, 931}, {989, 323, 352},
                {601, 583, 763}, {982, 393, 252}, {697, 472, 920}, {841, 345, 779}, {953, 816, 601}, {657, 523, 83},
                {114, 955, 452}, {756, 132, 863}, {713, 25, 296}, {676, 950, 870}, {148, 598, 664}, {414, 783, 413},
                {309, 796, 764}, {565, 75, 465}, {702, 809, 835}, {528, 80, 188}, {618, 200, 390}, {210, 678, 836},
                {467, 743, 612}, {832, 615, 800}, {853, 272, 226}, {704, 334, 235}, {593, 968, 628}, {807, 852, 329},
                {235, 385, 287}, {239, 509, 23}, {44, 129, 821}, {912, 444, 277}, {623, 342, 603}, {715, 593, 517},
                {840, 123, 418}, {182, 898, 986}, {469, 418, 603}, {654, 192, 386}, {884, 681, 61}, {790, 392, 922},
                {404, 135, 279}, {859, 416, 905}, {449, 80, 221}, {541, 666, 928}, {662, 181, 488}, {537, 418, 252},
                {359, 777, 835}, {535, 138, 553}, {94, 209, 457}, {999, 587, 244}, {869, 453, 283}, {206, 597, 48},
                {543, 133, 177}, {702, 658, 638}, {636, 122, 653}, {852, 17, 381}, {336, 175, 877}, {752, 707, 981},
                {82, 454, 489}, {894, 478, 376}, {507, 103, 329}, {373, 416, 624}, {835, 556, 247}, {169, 345, 836},
                {843, 28, 108}, {406, 765, 118}, {881, 123, 937}, {706, 417, 202}, {425, 354, 688}, {560, 158, 687},
                {832, 953, 304}, {899, 290, 990}, {85, 103, 420}, {569, 315, 177}, {835, 294, 11}, {827, 335, 575},
                {655, 39, 474}, {49, 265, 625}, {327, 277, 954}, {672, 830, 860}, {225, 792, 578}, {572, 407, 740},
                {307, 243, 454}, {697, 725, 836}, {511, 200, 476}, {615, 584, 735}, {552, 248, 952}, {402, 297, 425},
                {508, 457, 618}, {812, 921, 60}, {481, 5, 510}, {891, 177, 7}, {882, 197, 224}, {544, 849, 242},
                {633, 593, 375}, {676, 808, 628}, {964, 821, 755}, {887, 461, 205}, {778, 31, 941}, {69, 774, 75}
        }, new int[] {
                7, 5, 5, 8, 9, 8, 0, 3, 0, 4, 1, 0, 2, 3, 2, 1, 0, 2, 0, 4, 8, 0, 1, 1, 3, 6, 3, 1, 5, 0, 2, 6, 3, 5,
                4, 3, 5, 12, 4, 2, 1, 0, 0, 7, 0, 6, 4, 1, 6, 2, 1, 1, 1, 3, 1, 4, 3, 3, 7, 1, 3, 2, 2, 1, 2, 2, 8, 5,
                2, 4, 4, 1, 3, 7, 2, 1, 4, 0, 0, 9, 5, 3, 8, 6, 5, 2, 8, 2, 4, 5, 8, 1, 6, 5, 0, 6, 0, 0, 4, 5, 0, 0,
                7, 4, 6, 3, 4, 4, 6, 2, 2, 6, 5, 1, 2, 0, 1, 1, 4, 4, 9, 7, 9, 5, 6, 0, 6, 3, 3, 6, 6, 0, 5, 3, 1, 8,
                7, 1, 1, 9, 1, 2, 8, 5, 2, 10, 7, 3, 0, 1, 3, 3, 5, 0, 10, 2, 9, 3, 2, 4, 4, 7, 3, 6, 6, 4, 2, 2, 0,
                8, 3, 6, 2, 7, 0, 2, 2, 5, 4, 2, 0, 1, 2, 1, 3, 3, 1, 2, 3, 5, 3, 0, 3, 3, 2, 9, 5, 5, 7, 5, 4, 8, 11,
                4, 7, 4, 7, 7, 8, 2, 3, 4, 0, 9, 4, 4, 5, 1, 9, 0, 3, 5, 5, 8, 2, 3, 6, 5, 1, 0, 1, 4, 5, 5, 3, 5, 4,
                3, 2, 7, 1, 8, 1, 6, 3, 2, 5, 3, 1, 5, 4, 1, 1, 7, 3, 0, 2, 9, 1, 6, 2, 3, 4, 2, 0, 2, 4, 3, 4, 4, 6,
                9, 0, 2, 0, 6, 1, 1, 3, 8, 4, 5, 1, 8, 3, 7, 5, 2, 5, 2, 0, 0, 2, 3, 4, 7, 9, 4, 2, 1
        });
    }

    @Test
    public void generatedTest5() {
        groupCheck(new int[][] {
                {15, 4, 2, 15, 10}, {19, 8, 3, 2, 9}, {8, 14, 13, 7, 4}, {3, 12, 15, 15, 13}, {12, 10, 4, 17, 12},
                {1, 2, 13, 19, 2}, {2, 1, 5, 10, 2}, {19, 10, 7, 1, 14}, {7, 4, 12, 5, 0}, {14, 17, 2, 8, 9},
                {5, 11, 5, 9, 11}, {9, 10, 7, 15, 0}, {18, 12, 11, 14, 16}, {11, 17, 9, 18, 7}, {11, 4, 16, 17, 12},
                {6, 6, 9, 15, 4}, {13, 18, 14, 3, 16}, {6, 12, 13, 2, 3}, {14, 16, 12, 12, 2}, {18, 0, 11, 12, 9},
                {9, 5, 7, 12, 15}, {10, 11, 18, 0, 3}, {11, 11, 12, 15, 8}, {19, 18, 18, 8, 13}, {19, 1, 5, 4, 14},
                {11, 0, 10, 4, 19}, {19, 12, 14, 18, 18}, {11, 16, 14, 17, 1}, {8, 18, 17, 8, 8}, {15, 8, 13, 12, 3},
                {17, 18, 14, 1, 6}, {7, 19, 1, 15, 0}, {6, 6, 9, 18, 11}, {3, 4, 12, 2, 4}, {3, 9, 13, 15, 17},
                {9, 19, 11, 9, 2}, {1, 6, 5, 0, 6}, {10, 11, 10, 5, 16}, {13, 13, 16, 12, 6}, {6, 7, 14, 0, 19},
                {10, 9, 18, 1, 7}, {17, 16, 8, 5, 6}, {4, 15, 12, 9, 15}, {5, 9, 9, 12, 12}, {7, 12, 9, 9, 7},
                {5, 0, 4, 14, 3}, {14, 5, 18, 11, 1}, {0, 14, 9, 3, 13}, {2, 13, 19, 15, 11}, {1, 13, 1, 11, 11},
                {7, 15, 1, 13, 9}, {3, 17, 2, 18, 4}, {16, 12, 8, 2, 7}, {5, 6, 12, 19, 11}, {14, 5, 15, 11, 6},
                {9, 7, 8, 18, 16}, {8, 5, 0, 7, 6}, {18, 6, 0, 19, 7}, {18, 17, 4, 0, 18}, {8, 7, 2, 8, 9},
                {3, 4, 11, 3, 5}, {13, 15, 12, 11, 8}, {16, 12, 12, 14, 14}, {17, 6, 17, 10, 0}, {5, 2, 10, 16, 6},
                {1, 9, 0, 2, 14}, {3, 0, 5, 4, 5}, {19, 1, 16, 4, 2}, {10, 3, 9, 18, 16}, {10, 16, 10, 2, 16},
                {6, 16, 2, 8, 3}, {12, 15, 19, 2, 5}, {7, 5, 14, 17, 3}, {2, 11, 8, 5, 1}, {8, 4, 9, 0, 16},
                {7, 13, 3, 4, 6}, {12, 2, 3, 6, 6}, {10, 11, 6, 10, 18}, {4, 3, 6, 11, 0}, {5, 4, 8, 7, 12},
                {19, 9, 9, 2, 9}, {11, 18, 15, 9, 19}, {14, 8, 2, 8, 11}, {12, 19, 17, 7, 3}, {10, 19, 4, 3, 5},
                {16, 3, 16, 8, 15}, {13, 18, 8, 14, 4}, {5, 15, 16, 19, 16}, {4, 17, 15, 10, 19}, {4, 0, 7, 12, 13},
                {12, 1, 16, 11, 14}, {5, 18, 13, 4, 0}, {6, 13, 19, 9, 19}, {7, 19, 3, 10, 16}, {5, 9, 1, 13, 18},
                {14, 19, 2, 13, 7}, {1, 0, 7, 15, 7}, {9, 1, 0, 19, 4}, {17, 3, 13, 3, 12}, {3, 4, 16, 7, 18},
                {15, 19, 5, 14, 12}, {9, 7, 9, 9, 10}, {15, 5, 3, 4, 9}, {19, 5, 13, 10, 18}, {14, 18, 13, 8, 18},
                {8, 11, 7, 13, 13}, {10, 15, 1, 0, 1}, {9, 18, 11, 4, 6}, {6, 10, 11, 13, 0}, {17, 4, 8, 7, 17},
                {9, 8, 14, 12, 1}, {4, 10, 6, 1, 11}, {16, 15, 17, 10, 2}, {5, 11, 6, 7, 15}, {14, 3, 3, 3, 0},
                {15, 11, 10, 14, 4}, {18, 19, 1, 10, 1}, {3, 17, 17, 8, 3}, {12, 18, 0, 9, 4}, {3, 9, 16, 2, 6},
                {14, 16, 8, 3, 4}, {2, 9, 5, 17, 19}, {13, 16, 3, 13, 1}, {2, 15, 8, 19, 1}, {13, 17, 13, 2, 6},
                {16, 12, 7, 14, 3}, {17, 19, 16, 17, 18}, {16, 4, 14, 2, 10}, {0, 14, 14, 18, 19}, {9, 3, 11, 13, 6},
                {8, 18, 10, 11, 1}, {18, 11, 1, 9, 14}, {17, 11, 12, 11, 2}, {18, 9, 5, 19, 14}, {12, 17, 18, 3, 3},
                {9, 2, 15, 10, 1}, {2, 0, 9, 8, 3}, {1, 19, 14, 8, 10}, {11, 9, 16, 3, 19}, {5, 0, 17, 11, 19},
                {5, 15, 8, 3, 8}, {15, 17, 16, 0, 14}, {6, 15, 3, 13, 14}, {10, 9, 11, 1, 3}, {4, 2, 19, 17, 2},
                {13, 6, 3, 19, 10}, {9, 7, 19, 11, 12}, {13, 1, 4, 18, 19}, {18, 14, 4, 2, 4}, {10, 1, 0, 0, 2},
                {19, 0, 13, 3, 2}, {11, 2, 10, 5, 0}, {17, 11, 4, 2, 18}, {0, 13, 11, 1, 17}, {10, 6, 14, 5, 1},
                {8, 6, 1, 4, 10}, {15, 4, 3, 3, 10}, {14, 10, 17, 10, 9}, {2, 17, 2, 7, 12}, {3, 5, 11, 7, 6},
                {1, 6, 14, 5, 8}, {0, 19, 9, 11, 3}, {0, 0, 3, 6, 8}, {7, 11, 9, 9, 18}, {0, 8, 9, 12, 10},
                {18, 19, 15, 16, 13}, {6, 1, 1, 17, 2}, {7, 18, 15, 16, 0}, {10, 7, 9, 11, 6}, {5, 11, 6, 19, 19},
                {1, 13, 11, 19, 0}, {2, 5, 2, 4, 4}, {13, 14, 19, 18, 4}, {7, 19, 3, 4, 15}, {5, 17, 10, 2, 10},
                {11, 13, 7, 10, 2}, {7, 1, 14, 8, 6}, {4, 13, 17, 2, 5}, {12, 10, 6, 17, 13}, {9, 17, 10, 7, 2},
                {11, 18, 18, 11, 6}, {19, 7, 18, 3, 15}, {4, 9, 0, 15, 0}, {0, 19, 17, 8, 7}, {3, 8, 14, 5, 11},
                {11, 12, 19, 17, 3}, {0, 0, 13, 11, 15}, {7, 19, 3, 8, 3}, {5, 4, 12, 8, 7}, {3, 1, 8, 3, 4},
                {12, 16, 9, 19, 14}, {10, 4, 13, 7, 9}, {1, 1, 6, 7, 9}, {0, 10, 18, 16, 4}, {18, 6, 13, 8, 8},
                {15, 9, 11, 5, 7}, {13, 9, 6, 15, 18}, {13, 11, 10, 4, 15}, {8, 18, 8, 0, 6}, {2, 5, 15, 3, 6},
                {13, 18, 6, 5, 13}, {19, 1, 8, 6, 7}, {12, 5, 6, 13, 18}, {18, 12, 3, 10, 14}, {7, 17, 0, 2, 1},
                {7, 6, 1, 3, 17}, {17, 0, 9, 17, 17}, {15, 9, 0, 19, 16}, {8, 15, 18, 15, 17}, {11, 5, 3, 4, 0},
                {9, 0, 4, 17, 15}, {6, 18, 15, 11, 18}, {6, 19, 9, 16, 10}, {15, 3, 10, 7, 11}, {18, 7, 9, 6, 16},
                {5, 12, 8, 15, 12}, {11, 1, 1, 12, 7}, {17, 18, 13, 8, 5}, {9, 18, 0, 6, 15}, {2, 17, 10, 13, 12},
                {9, 2, 13, 11, 3}, {3, 11, 18, 14, 4}, {11, 5, 17, 18, 0}, {4, 15, 15, 12, 13}, {18, 12, 6, 14, 18},
                {6, 14, 18, 14, 2}, {19, 10, 19, 15, 5}, {19, 2, 6, 3, 17}, {19, 16, 0, 19, 10}, {3, 18, 7, 9, 17},
                {8, 2, 13, 5, 13}, {12, 14, 10, 14, 1}, {12, 9, 11, 12, 10}, {19, 4, 15, 3, 17}, {5, 0, 15, 2, 8},
                {19, 0, 18, 13, 10}, {13, 6, 8, 4, 10}, {4, 7, 16, 3, 7}, {11, 10, 5, 17, 9}, {8, 1, 1, 2, 9},
                {8, 17, 16, 5, 0}, {12, 7, 8, 12, 12}, {3, 16, 18, 15, 6}, {0, 19, 12, 8, 3}, {14, 6, 19, 12, 2},
                {6, 6, 14, 9, 1}, {17, 12, 15, 5, 8}, {9, 16, 16, 18, 17}, {16, 8, 14, 4, 6}, {12, 18, 9, 11, 14},
                {3, 9, 15, 13, 7}, {4, 5, 3, 0, 17}, {7, 16, 5, 0, 4}, {0, 14, 9, 12, 8}, {14, 11, 5, 19, 16},
                {1, 7, 15, 0, 11}, {7, 10, 19, 8, 16}, {15, 10, 13, 3, 10}, {16, 6, 17, 11, 10}, {16, 12, 19, 13, 6},
                {10, 13, 5, 19, 10}, {12, 13, 11, 14, 12}, {5, 10, 15, 8, 7}, {7, 12, 11, 7, 3}, {14, 4, 12, 5, 5},
                {16, 16, 7, 13, 17}, {14, 4, 8, 5, 17}, {6, 12, 1, 9, 11}, {18, 9, 13, 0, 11}, {17, 16, 0, 15, 18},
                {18, 10, 1, 7, 9}, {2, 2, 6, 19, 18}, {5, 11, 4, 13, 2}, {1, 1, 14, 15, 15}, {2, 4, 13, 16, 14},
                {11, 0, 15, 14, 16}, {13, 7, 7, 15, 18}, {6, 18, 9, 17, 17}, {8, 15, 2, 6, 13}, {5, 19, 15, 4, 19},
                {4, 16, 15, 4, 19}, {1, 9, 11, 1, 6}, {4, 1, 1, 9, 15}, {17, 7, 6, 4, 19}, {1, 14, 17, 6, 2},
                {16, 3, 17, 10, 0}, {18, 2, 1, 9, 5}, {0, 3, 15, 5, 18}, {13, 2, 1, 13, 9}, {15, 9, 4, 12, 2},
                {15, 10, 19, 1, 9}, {2, 15, 0, 13, 16}, {2, 9, 10, 3, 14}, {17, 15, 14, 10, 6}, {6, 19, 7, 0, 3},
                {9, 14, 10, 15, 7}, {16, 18, 10, 18, 9}, {15, 7, 10, 8, 4}, {17, 8, 2, 11, 1}, {17, 5, 17, 17, 16},
                {9, 2, 12, 13, 17}, {7, 0, 16, 5, 19}, {9, 17, 10, 12, 15}, {7, 17, 6, 5, 14}, {12, 9, 4, 6, 13},
                {15, 15, 11, 15, 8}, {5, 16, 2, 9, 15}, {16, 10, 5, 1, 13}, {16, 3, 5, 13, 6}, {15, 17, 16, 0, 19},
                {11, 18, 18, 5, 19}, {7, 19, 1, 16, 1}, {16, 17, 1, 16, 17}, {2, 1, 12, 4, 18}, {19, 11, 0, 14, 16},
                {6, 6, 17, 10, 9}, {16, 4, 18, 9, 14}, {13, 8, 19, 2, 13}, {15, 19, 17, 18, 4}, {12, 8, 17, 10, 11},
                {5, 10, 2, 12, 4}, {4, 12, 8, 16, 8}, {17, 8, 4, 3, 8}, {1, 8, 1, 4, 18}, {10, 10, 14, 11, 0},
                {6, 12, 9, 5, 14}, {2, 11, 11, 6, 4}, {7, 7, 15, 18, 11}, {16, 2, 13, 2, 9}, {15, 3, 2, 12, 5},
                {0, 8, 2, 0, 15}, {13, 4, 6, 9, 5}, {19, 6, 3, 7, 7}, {9, 2, 7, 17, 14}, {2, 5, 12, 17, 13},
                {6, 7, 11, 12, 17}, {17, 18, 18, 18, 4}, {19, 0, 3, 4, 11}, {0, 0, 11, 2, 4}, {19, 12, 19, 14, 5},
                {14, 18, 11, 1, 1}, {2, 6, 13, 0, 5}, {2, 4, 0, 11, 18}, {5, 17, 0, 18, 5}, {0, 6, 10, 8, 10},
                {2, 1, 11, 13, 13}, {9, 2, 9, 19, 12}, {18, 13, 5, 12, 1}, {13, 18, 19, 6, 15}, {15, 8, 7, 8, 17},
                {2, 16, 6, 16, 7}, {7, 7, 16, 5, 6}, {0, 9, 3, 1, 3}, {6, 15, 4, 8, 0}, {17, 5, 14, 17, 2},
                {1, 0, 13, 15, 7}, {6, 10, 11, 7, 11}, {0, 0, 6, 7, 10}, {15, 15, 6, 13, 13}, {15, 2, 11, 7, 8},
                {6, 7, 10, 9, 5}, {9, 7, 17, 19, 15}, {12, 5, 15, 13, 2}, {4, 18, 5, 1, 6}, {5, 18, 14, 18, 1},
                {13, 8, 10, 1, 13}, {5, 3, 14, 13, 4}, {2, 9, 2, 10, 16}, {16, 8, 12, 13, 0}, {19, 14, 2, 3, 16},
                {6, 10, 2, 17, 6}, {15, 8, 8, 12, 11}, {4, 4, 9, 5, 9}, {15, 18, 15, 13, 6}, {17, 18, 5, 17, 10},
                {16, 12, 10, 19, 10}, {19, 13, 14, 19, 19}, {16, 0, 11, 3, 10}, {18, 1, 8, 16, 12}, {1, 16, 0, 1, 0},
                {1, 12, 6, 5, 13}, {6, 6, 6, 18, 17}, {9, 14, 16, 9, 6}, {1, 2, 1, 3, 16}, {8, 1, 15, 13, 1},
                {14, 11, 11, 4, 5}, {19, 14, 18, 7, 1}, {5, 14, 19, 10, 14}, {6, 11, 2, 2, 4}, {12, 1, 6, 14, 19},
                {18, 14, 2, 16, 13}, {4, 16, 17, 17, 12}, {18, 11, 3, 10, 1}, {4, 4, 11, 15, 4}, {4, 0, 17, 12, 18},
                {12, 6, 4, 5, 16}, {18, 14, 1, 18, 3}, {4, 8, 9, 7, 7}, {11, 6, 8, 15, 6}, {19, 7, 7, 19, 8},
                {17, 2, 1, 8, 12}, {13, 5, 1, 14, 6}, {17, 17, 8, 15, 0}, {2, 7, 2, 11, 5}, {7, 4, 1, 0, 2},
                {9, 0, 13, 9, 13}, {19, 16, 5, 17, 10}, {16, 9, 0, 0, 5}, {16, 17, 17, 11, 3}, {16, 19, 12, 9, 6},
                {1, 5, 18, 4, 10}, {13, 13, 1, 4, 13}, {13, 11, 13, 10, 3}, {19, 11, 13, 10, 15}, {10, 17, 11, 2, 13},
                {18, 16, 6, 4, 15}, {3, 0, 15, 15, 1}, {11, 15, 11, 9, 17}, {12, 15, 0, 11, 14}, {5, 17, 14, 0, 12},
                {15, 6, 8, 2, 13}, {8, 13, 18, 9, 1}, {14, 8, 15, 7, 6}, {11, 18, 17, 18, 19}, {5, 12, 6, 7, 15},
                {7, 16, 0, 16, 2}, {18, 8, 13, 12, 15}, {16, 16, 0, 15, 8}, {16, 17, 4, 5, 18}, {14, 12, 13, 9, 17},
                {10, 19, 16, 4, 12}, {1, 16, 19, 13, 5}, {8, 0, 18, 7, 2}, {0, 12, 5, 16, 16}, {17, 14, 14, 8, 9},
                {8, 0, 0, 10, 4}, {19, 15, 1, 1, 13}, {5, 2, 18, 16, 3}, {12, 1, 17, 7, 8}, {18, 16, 19, 18, 4},
                {13, 16, 18, 2, 0}, {1, 12, 19, 15, 17}, {9, 11, 12, 18, 10}, {13, 11, 10, 9, 1}, {13, 10, 14, 12, 19},
                {16, 15, 18, 8, 15}, {0, 16, 9, 15, 2}, {12, 9, 3, 7, 2}, {17, 0, 17, 12, 2}, {1, 11, 17, 18, 6},
                {13, 3, 5, 7, 10}, {13, 4, 9, 19, 15}, {11, 15, 12, 5, 0}, {6, 18, 2, 3, 2}, {19, 10, 2, 4, 15},
                {18, 6, 2, 8, 9}, {15, 6, 1, 5, 16}, {8, 15, 4, 8, 13}, {15, 15, 18, 14, 5}, {0, 3, 2, 17, 1},
                {8, 2, 8, 8, 17}, {16, 12, 17, 2, 19}, {2, 16, 2, 9, 16}, {2, 17, 1, 12, 12}, {13, 10, 8, 12, 13},
                {3, 2, 3, 11, 5}, {0, 2, 18, 19, 9}, {14, 2, 3, 0, 12}, {15, 10, 19, 11, 1}, {19, 11, 3, 11, 10},
                {9, 18, 10, 9, 10}, {7, 14, 4, 1, 6}, {1, 11, 5, 6, 3}, {16, 15, 7, 19, 17}, {19, 9, 7, 18, 14},
                {8, 7, 0, 7, 6}, {2, 15, 9, 12, 6}, {17, 19, 1, 14, 2}, {11, 13, 8, 19, 10}, {16, 14, 3, 17, 2},
                {7, 15, 17, 12, 1}, {19, 11, 7, 8, 12}, {14, 6, 4, 16, 5}, {15, 0, 1, 7, 14}, {8, 4, 7, 18, 17},
                {15, 3, 19, 17, 17}, {9, 17, 15, 16, 6}, {17, 6, 16, 0, 10}, {2, 11, 6, 16, 10}, {2, 12, 4, 13, 0},
                {4, 10, 15, 10, 7}, {13, 17, 0, 1, 11}, {18, 2, 8, 6, 15}, {16, 9, 8, 13, 3}, {10, 10, 1, 19, 6},
                {3, 4, 9, 18, 17}, {19, 5, 19, 9, 15}, {10, 16, 2, 13, 11}, {11, 13, 5, 10, 11}, {16, 15, 5, 15, 10},
                {8, 0, 10, 3, 10}, {6, 15, 3, 13, 9}, {11, 16, 3, 2, 3}, {19, 4, 5, 6, 6}, {11, 17, 7, 16, 12},
                {1, 10, 13, 4, 16}, {7, 13, 16, 12, 11}, {12, 7, 18, 0, 10}, {11, 15, 7, 4, 13}, {16, 10, 13, 19, 16},
                {10, 13, 15, 16, 18}, {19, 9, 8, 18, 0}, {7, 1, 10, 1, 11}, {4, 19, 0, 12, 8}, {14, 0, 14, 13, 0},
                {17, 16, 8, 2, 15}, {13, 1, 1, 14, 8}, {13, 4, 13, 2, 0}, {8, 2, 1, 15, 18}, {12, 6, 17, 18, 2},
                {0, 12, 13, 10, 3}, {14, 6, 12, 13, 19}, {10, 15, 15, 8, 4}, {6, 5, 9, 6, 18}, {0, 18, 18, 18, 2},
                {6, 9, 6, 16, 4}, {19, 6, 10, 18, 18}, {10, 10, 5, 18, 5}, {15, 3, 1, 4, 10}, {2, 1, 13, 15, 7},
                {14, 7, 1, 5, 11}, {18, 18, 14, 5, 16}, {4, 6, 13, 1, 12}, {1, 1, 0, 19, 0}, {1, 0, 9, 2, 18},
                {0, 5, 10, 16, 15}, {12, 17, 10, 1, 14}, {14, 5, 6, 0, 15}, {12, 7, 0, 0, 6}, {3, 3, 3, 19, 9},
                {0, 5, 3, 3, 3}, {18, 8, 10, 5, 0}, {6, 6, 9, 5, 1}, {17, 0, 1, 17, 15}, {16, 11, 18, 2, 11},
                {5, 13, 12, 5, 15}, {13, 13, 6, 13, 10}, {11, 16, 14, 5, 10}, {17, 2, 4, 8, 2}, {18, 17, 2, 2, 13},
                {5, 5, 13, 14, 6}, {8, 1, 11, 17, 11}, {3, 5, 13, 16, 4}, {12, 6, 19, 0, 9}, {1, 8, 8, 7, 10},
                {1, 0, 12, 6, 16}, {6, 6, 18, 7, 5}, {14, 4, 11, 16, 3}, {9, 12, 9, 9, 3}, {13, 18, 18, 19, 14},
                {4, 9, 5, 17, 13}, {1, 10, 0, 3, 0}, {16, 11, 4, 14, 8}, {10, 13, 11, 3, 1}, {17, 16, 5, 15, 15},
                {0, 11, 11, 13, 17}, {7, 13, 0, 3, 0}, {17, 5, 15, 16, 8}, {3, 13, 5, 4, 7}, {14, 11, 1, 15, 14},
                {7, 15, 16, 18, 10}, {13, 3, 11, 12, 19}, {3, 2, 4, 0, 0}, {14, 13, 4, 18, 16}, {6, 8, 19, 0, 19},
                {3, 3, 13, 10, 0}, {10, 5, 14, 9, 11}, {8, 5, 17, 19, 19}, {14, 14, 17, 5, 7}, {4, 19, 0, 6, 3},
                {17, 18, 9, 3, 11}, {3, 9, 19, 12, 1}, {8, 6, 14, 3, 10}, {7, 1, 4, 10, 12}, {12, 10, 10, 2, 6},
                {15, 6, 2, 8, 4}, {14, 6, 16, 0, 3}, {0, 14, 18, 12, 1}, {0, 8, 18, 19, 6}, {3, 14, 12, 17, 10},
                {18, 4, 13, 9, 3}, {12, 6, 10, 2, 11}, {6, 11, 10, 17, 13}, {10, 1, 11, 8, 5}, {5, 19, 14, 12, 14},
                {11, 8, 15, 19, 3}, {2, 5, 12, 7, 3}, {4, 5, 10, 14, 12}, {9, 16, 6, 5, 15}, {9, 6, 19, 5, 9},
                {16, 7, 6, 17, 15}, {9, 11, 11, 0, 19}, {6, 15, 15, 1, 14}, {10, 3, 3, 18, 13}, {6, 8, 9, 0, 4},
                {3, 10, 17, 5, 18}, {5, 17, 10, 5, 0}, {15, 5, 14, 11, 6}, {4, 16, 11, 18, 14}, {17, 19, 10, 12, 16},
                {14, 17, 15, 9, 9}, {15, 16, 18, 3, 8}, {12, 10, 6, 6, 15}, {2, 8, 10, 3, 19}, {14, 12, 19, 2, 2},
                {15, 10, 6, 18, 9}, {13, 7, 16, 11, 0}, {2, 5, 17, 16, 8}, {19, 17, 1, 5, 12}, {0, 16, 8, 13, 19},
                {10, 5, 6, 19, 18}, {13, 10, 12, 18, 2}, {12, 9, 10, 12, 3}, {12, 5, 18, 3, 16}, {12, 17, 8, 2, 5},
                {8, 10, 10, 15, 11}, {8, 11, 4, 12, 4}, {0, 9, 13, 12, 2}, {1, 19, 18, 18, 11}, {8, 10, 13, 8, 11},
                {17, 12, 0, 8, 4}, {17, 9, 0, 7, 5}, {10, 6, 2, 7, 1}, {16, 4, 1, 17, 19}, {3, 12, 16, 5, 3},
                {15, 4, 18, 18, 10}, {10, 7, 16, 16, 5}, {1, 9, 16, 17, 3}, {13, 11, 18, 8, 16}, {10, 14, 12, 9, 13},
                {18, 17, 6, 6, 6}, {5, 8, 11, 7, 14}, {18, 5, 19, 12, 6}, {5, 0, 12, 5, 11}, {18, 4, 7, 5, 1},
                {6, 10, 3, 10, 2}, {0, 5, 19, 9, 7}, {4, 17, 13, 16, 2}, {17, 9, 11, 16, 18}, {9, 15, 11, 6, 1},
                {12, 16, 2, 12, 4}, {8, 6, 18, 17, 14}, {12, 16, 1, 14, 15}, {14, 12, 4, 2, 4}, {5, 15, 0, 16, 15},
                {1, 5, 19, 0, 2}, {17, 10, 15, 3, 2}, {18, 19, 2, 9, 16}, {5, 16, 6, 13, 16}, {10, 11, 13, 14, 0},
                {7, 7, 13, 12, 9}, {13, 19, 9, 19, 11}, {12, 15, 8, 10, 10}, {7, 9, 10, 13, 14}, {16, 9, 2, 5, 7},
                {8, 1, 1, 1, 9}, {12, 16, 14, 0, 5}, {5, 4, 3, 15, 18}, {11, 18, 10, 0, 6}, {11, 14, 15, 19, 1},
                {6, 17, 5, 17, 18}, {14, 11, 18, 1, 19}, {8, 0, 3, 12, 1}, {6, 16, 1, 10, 2}, {19, 6, 10, 3, 2},
                {2, 8, 11, 15, 0}, {0, 13, 13, 12, 6}, {1, 15, 2, 11, 16}, {17, 12, 9, 5, 5}, {7, 7, 12, 0, 3},
                {9, 1, 4, 3, 19}, {8, 9, 14, 16, 1}, {15, 1, 10, 18, 17}, {2, 7, 11, 7, 12}, {18, 17, 13, 19, 8},
                {1, 6, 3, 3, 4}, {8, 12, 3, 16, 3}, {0, 18, 15, 3, 8}, {16, 18, 14, 4, 19}, {1, 16, 1, 0, 8},
                {8, 1, 9, 6, 13}, {15, 8, 14, 0, 5}, {5, 15, 9, 2, 15}, {1, 6, 1, 16, 18}, {17, 17, 16, 14, 1},
                {6, 2, 5, 0, 10}, {8, 6, 0, 2, 1}, {14, 6, 17, 9, 9}, {19, 5, 8, 19, 9}, {14, 2, 4, 16, 4},
                {4, 9, 0, 5, 16}, {4, 14, 15, 7, 2}, {6, 2, 15, 10, 13}, {15, 15, 6, 8, 11}, {18, 15, 13, 1, 3},
                {2, 1, 15, 17, 10}, {13, 18, 8, 3, 10}, {6, 15, 4, 19, 3}, {0, 10, 16, 14, 2}, {17, 14, 4, 7, 8},
                {3, 5, 17, 12, 3}, {5, 14, 14, 11, 8}, {5, 1, 12, 16, 3}, {6, 6, 14, 6, 6}, {12, 8, 3, 19, 5},
                {7, 16, 5, 10, 3}, {9, 14, 18, 18, 15}, {17, 19, 1, 13, 19}, {17, 13, 3, 18, 7}, {12, 0, 9, 2, 10},
                {13, 17, 14, 15, 4}, {12, 3, 16, 12, 19}, {8, 4, 10, 4, 15}, {8, 16, 6, 18, 2}, {3, 1, 13, 17, 14},
                {14, 13, 16, 15, 17}, {17, 17, 14, 16, 3}, {3, 18, 0, 15, 17}, {13, 11, 5, 2, 9}, {12, 6, 13, 8, 16},
                {0, 17, 19, 4, 0}, {6, 1, 6, 18, 19}, {6, 19, 9, 7, 12}, {17, 7, 11, 5, 6}, {4, 18, 7, 17, 0},
                {6, 0, 19, 4, 18}, {3, 19, 17, 17, 3}, {15, 6, 11, 19, 19}, {4, 14, 2, 3, 18}, {12, 10, 15, 2, 0},
                {18, 12, 17, 15, 10}, {12, 0, 8, 17, 10}, {9, 16, 14, 14, 3}, {2, 13, 11, 5, 9}, {2, 1, 11, 5, 17},
                {4, 2, 12, 0, 4}, {17, 17, 0, 11, 12}, {7, 3, 6, 11, 17}, {18, 18, 18, 7, 8}, {14, 11, 2, 18, 16},
                {2, 5, 6, 1, 12}, {4, 9, 13, 1, 0}, {17, 0, 8, 16, 15}, {19, 13, 6, 6, 11}, {9, 6, 17, 11, 5},
                {0, 19, 12, 12, 9}, {0, 4, 9, 14, 9}, {14, 11, 17, 7, 8}, {0, 4, 2, 19, 13}, {14, 18, 6, 7, 10},
                {6, 11, 3, 0, 6}, {7, 10, 16, 0, 10}, {8, 13, 4, 10, 4}, {17, 0, 12, 11, 2}, {2, 7, 18, 0, 1},
                {10, 15, 16, 15, 3}, {14, 4, 2, 9, 2}, {14, 17, 18, 10, 13}, {14, 14, 8, 0, 1}, {9, 9, 9, 8, 11},
                {13, 0, 8, 2, 2}, {7, 8, 15, 3, 10}, {11, 11, 9, 4, 9}, {0, 14, 12, 9, 4}, {10, 9, 11, 5, 9},
                {12, 9, 6, 10, 8}, {8, 0, 11, 8, 0}, {14, 18, 9, 11, 2}, {13, 12, 0, 15, 11}, {12, 3, 15, 4, 8},
                {17, 6, 10, 4, 13}, {4, 14, 12, 10, 14}, {19, 4, 18, 14, 9}, {12, 1, 17, 12, 13}, {9, 3, 10, 12, 5},
                {15, 2, 11, 0, 9}, {7, 4, 5, 17, 7}, {13, 19, 12, 6, 3}, {4, 3, 18, 18, 16}, {3, 1, 11, 5, 0},
                {5, 9, 7, 19, 10}, {2, 7, 7, 6, 16}, {5, 17, 2, 6, 9}, {17, 10, 16, 16, 11}, {7, 8, 19, 15, 8},
                {19, 7, 16, 14, 11}, {15, 2, 5, 17, 18}, {9, 13, 9, 10, 11}, {5, 11, 19, 1, 3}, {6, 19, 7, 6, 13},
                {10, 13, 16, 14, 15}, {15, 9, 12, 0, 13}, {5, 13, 19, 8, 18}, {16, 7, 3, 16, 17}, {5, 17, 12, 6, 10},
                {2, 12, 3, 9, 14}, {12, 9, 6, 14, 3}, {8, 18, 10, 8, 17}, {12, 19, 6, 4, 10}, {4, 6, 13, 13, 1},
                {3, 6, 4, 10, 19}, {10, 8, 17, 6, 9}, {4, 0, 7, 19, 3}, {0, 2, 17, 15, 7}, {0, 0, 16, 14, 1},
                {14, 16, 2, 17, 1}, {12, 1, 5, 13, 14}, {4, 17, 3, 17, 10}, {4, 14, 6, 19, 6}, {17, 10, 7, 9, 13},
                {15, 10, 14, 18, 4}, {13, 18, 16, 8, 19}, {18, 12, 1, 15, 6}, {2, 10, 15, 7, 7}, {1, 10, 14, 14, 12},
                {6, 8, 15, 3, 7}, {5, 1, 14, 2, 10}, {2, 4, 16, 11, 1}, {11, 3, 0, 10, 1}, {1, 17, 15, 7, 2},
                {14, 3, 18, 16, 18}, {6, 0, 15, 13, 14}, {11, 12, 5, 16, 6}, {1, 9, 0, 9, 8}, {5, 14, 4, 1, 7},
                {16, 8, 4, 7, 17}, {5, 14, 6, 4, 9}, {19, 15, 17, 7, 2}, {11, 13, 15, 17, 14}, {18, 10, 3, 3, 12},
                {13, 3, 18, 17, 10}, {15, 11, 18, 16, 16}, {3, 2, 8, 6, 9}, {12, 15, 16, 0, 15}, {11, 11, 1, 1, 15},
                {4, 2, 9, 5, 2}, {5, 12, 10, 6, 6}, {16, 16, 18, 19, 5}, {7, 4, 6, 15, 1}, {8, 13, 10, 9, 4},
        }, new int[] {
                3, 2, 3, 4, 3, 1, 0, 3, 1, 3, 2, 2, 6, 4, 4, 2, 4, 2, 3, 1, 3, 2, 4, 6, 2, 1, 7, 4, 4, 3, 4, 2, 3, 1, 3,
                3, 0, 3, 4, 2, 2, 3, 3, 3, 3, 0, 2, 1, 3, 1, 2, 1, 2, 3, 3, 4, 0, 2, 2, 2, 1, 4, 6, 3, 2, 0, 0, 2, 4, 3,
                1, 3, 3, 1, 2, 2, 1, 3, 1, 2, 3, 6, 4, 3, 2, 4, 4, 5, 4, 2, 3, 2, 6, 4, 2, 3, 0, 1, 3, 2, 5, 3, 2, 4, 6,
                3, 0, 3, 2, 3, 3, 1, 3, 2, 0, 4, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 8, 3, 4, 3, 2, 4, 3, 5, 3, 1, 0, 3, 4, 3,
                2, 3, 3, 1, 2, 3, 4, 3, 2, 0, 1, 1, 2, 1, 2, 2, 2, 5, 1, 2, 2, 1, 0, 4, 2, 7, 0, 3, 2, 3, 1, 0, 5, 3, 2,
                2, 1, 2, 4, 2, 5, 4, 0, 2, 3, 4, 2, 2, 2, 0, 5, 3, 1, 2, 3, 2, 4, 4, 2, 1, 4, 1, 3, 5, 1, 1, 4, 2, 5, 0,
                1, 5, 4, 3, 4, 3, 1, 4, 2, 3, 2, 3, 2, 4, 6, 3, 5, 2, 3, 3, 2, 2, 4, 4, 1, 3, 3, 2, 3, 1, 2, 3, 4, 1, 3,
                2, 4, 5, 3, 5, 3, 0, 1, 1, 6, 1, 4, 3, 5, 5, 3, 5, 3, 2, 2, 7, 2, 1, 2, 3, 3, 2, 1, 3, 3, 4, 4, 5, 3, 4,
                3, 1, 0, 3, 1, 2, 1, 1, 2, 3, 3, 1, 2, 4, 1, 4, 5, 3, 2, 5, 3, 2, 5, 4, 3, 5, 1, 2, 2, 4, 5, 3, 5, 1, 3,
                3, 4, 3, 6, 5, 1, 2, 2, 1, 2, 3, 2, 4, 2, 1, 0, 1, 2, 3, 3, 3, 6, 0, 0, 5, 2, 0, 0, 1, 2, 2, 2, 3, 5, 5,
                2, 2, 0, 1, 3, 1, 3, 1, 6, 2, 2, 5, 2, 1, 3, 2, 2, 1, 2, 2, 2, 5, 2, 5, 6, 5, 8, 1, 3, 0, 2, 2, 4, 0, 1,
                2, 3, 4, 0, 3, 5, 4, 2, 2, 3, 3, 2, 2, 3, 3, 2, 1, 3, 1, 0, 2, 6, 1, 4, 4, 1, 3, 3, 6, 3, 4, 0, 5, 2, 2,
                2, 3, 3, 7, 3, 2, 6, 2, 4, 5, 4, 2, 0, 1, 4, 0, 2, 2, 2, 6, 3, 4, 4, 2, 5, 6, 0, 2, 2, 2, 2, 4, 2, 1, 3,
                3, 3, 4, 5, 0, 2, 4, 1, 2, 4, 0, 2, 1, 3, 4, 4, 1, 1, 7, 5, 1, 2, 2, 4, 3, 3, 5, 2, 0, 3, 5, 5, 2, 2, 1,
                3, 2, 2, 4, 2, 2, 5, 3, 3, 5, 0, 2, 1, 2, 4, 2, 4, 2, 4, 6, 5, 2, 0, 2, 1, 3, 2, 1, 2, 3, 1, 4, 4, 3, 2,
                2, 5, 2, 2, 2, 3, 5, 2, 0, 0, 2, 2, 2, 1, 1, 0, 2, 1, 1, 4, 3, 4, 4, 1, 3, 3, 2, 2, 2, 2, 1, 2, 3, 2, 6,
                2, 0, 4, 2, 6, 3, 1, 4, 2, 4, 4, 3, 0, 6, 3, 1, 4, 4, 3, 1, 4, 2, 2, 1, 2, 2, 1, 0, 1, 3, 2, 2, 4, 1, 5,
                4, 1, 3, 4, 3, 4, 3, 3, 2, 1, 4, 1, 3, 4, 6, 5, 4, 4, 2, 3, 4, 2, 3, 4, 2, 3, 3, 3, 3, 2, 3, 2, 0, 4, 4,
                1, 2, 1, 3, 2, 5, 3, 1, 5, 4, 3, 3, 4, 1, 1, 1, 1, 3, 6, 2, 2, 4, 3, 1, 1, 0, 3, 5, 4, 3, 3, 5, 4, 4, 2,
                0, 2, 1, 3, 4, 4, 4, 0, 1, 1, 0, 2, 2, 2, 1, 2, 3, 3, 2, 6, 1, 2, 1, 5, 0, 2, 2, 2, 1, 4, 1, 0, 4, 3, 1,
                1, 2, 2, 5, 2, 3, 3, 2, 1, 3, 2, 3, 1, 2, 2, 2, 5, 4, 3, 0, 5, 4, 2, 3, 3, 6, 5, 2, 2, 4, 0, 2, 4, 2, 2,
                2, 4, 5, 1, 2, 6, 2, 4, 2, 1, 1, 3, 2, 5, 5, 0, 1, 3, 4, 3, 2, 1, 4, 1, 4, 0, 2, 2, 1, 0, 4, 1, 6, 1, 3,
                0, 3, 2, 1, 3, 3, 0, 3, 2, 2, 4, 3, 4, 3, 2, 1, 1, 3, 4, 0, 2, 2, 1, 6, 4, 5, 3, 4, 2, 4, 5, 2, 5, 4, 4,
                2, 3, 5, 4, 2, 2, 3, 0, 1, 0, 2, 2, 2, 2, 5, 4, 6, 3, 2, 3, 2, 1, 0, 0, 1, 5, 3, 3, 0, 1, 4, 3, 4, 5, 3,
                4, 6, 1, 3, 1, 1, 2, 6, 2, 2
        });
    }

    @Test
    public void generatedTest6() {
        groupCheck(new int[][] {
                {9, 11, 11, 10, 0}, {3, 14, 9, 5, 13}, {19, 15, 18, 9, 9}, {17, 4, 5, 6, 1}, {7, 11, 11, 5, 7},
                {7, 8, 18, 12, 14}, {7, 15, 7, 3, 4}, {14, 13, 18, 8, 11}, {13, 13, 6, 8, 14}, {18, 1, 12, 19, 19},
                {4, 19, 14, 0, 8}, {11, 9, 9, 9, 14}, {6, 5, 0, 17, 19}, {16, 1, 7, 5, 3}, {5, 0, 0, 19, 1},
                {1, 2, 16, 10, 5}, {13, 12, 15, 9, 6}, {5, 14, 2, 17, 8}, {7, 16, 10, 6, 19}, {15, 19, 2, 0, 1},
                {7, 4, 6, 9, 14}, {7, 12, 5, 3, 11}, {14, 13, 17, 8, 2}, {0, 14, 17, 17, 12}, {11, 16, 16, 15, 18},
                {12, 19, 7, 3, 0}, {8, 18, 10, 2, 3}, {14, 16, 16, 2, 14}, {11, 13, 1, 1, 12}, {15, 2, 9, 2, 12},
                {11, 3, 11, 18, 10}, {17, 11, 16, 12, 13}, {10, 4, 5, 7, 8}, {0, 19, 12, 0, 3}, {3, 10, 1, 13, 19},
                {18, 10, 11, 2, 9}, {12, 17, 9, 7, 3}, {8, 11, 19, 7, 1}, {5, 8, 16, 6, 4}, {6, 6, 8, 10, 18},
                {0, 15, 15, 10, 6}, {11, 5, 9, 14, 10}, {6, 10, 12, 9, 8}, {10, 8, 1, 2, 14}, {0, 9, 10, 16, 7},
                {5, 3, 13, 1, 2}, {2, 9, 4, 12, 2}, {8, 4, 5, 16, 19}, {18, 15, 19, 16, 16}, {6, 0, 12, 9, 6},
                {6, 14, 4, 8, 7}, {3, 13, 9, 11, 6}, {3, 7, 1, 14, 18}, {2, 4, 19, 4, 2}, {17, 3, 4, 2, 2},
                {7, 0, 15, 16, 17}, {14, 14, 16, 13, 19}, {1, 6, 13, 5, 3}, {9, 19, 9, 17, 6}, {9, 0, 3, 13, 3},
                {14, 18, 12, 4, 13}, {7, 0, 12, 2, 5}, {9, 2, 2, 11, 19}, {7, 6, 6, 12, 3}, {6, 5, 3, 11, 18},
                {0, 19, 11, 0, 6}, {0, 4, 4, 10, 9}, {10, 9, 5, 6, 6}, {12, 8, 5, 16, 14}, {3, 1, 14, 6, 15},
                {0, 16, 9, 0, 16}, {0, 15, 10, 17, 3}, {18, 6, 4, 16, 1}, {0, 3, 12, 19, 0}, {9, 5, 11, 3, 13},
                {8, 10, 0, 18, 16}, {6, 1, 16, 16, 12}, {9, 0, 14, 2, 10}, {5, 19, 12, 19, 19}, {8, 1, 16, 13, 1},
                {13, 14, 2, 16, 8}, {16, 15, 3, 0, 11}, {4, 4, 8, 4, 11}, {1, 19, 1, 15, 2}, {19, 2, 6, 2, 8},
                {17, 13, 16, 6, 7}, {5, 15, 13, 7, 12}, {7, 15, 9, 3, 3}, {3, 14, 12, 15, 17}, {19, 18, 14, 8, 0},
                {6, 8, 18, 5, 6}, {19, 12, 12, 14, 4}, {12, 5, 8, 18, 2}, {0, 15, 17, 6, 7}, {1, 2, 14, 2, 5},
                {13, 11, 12, 15, 11}, {7, 14, 17, 3, 16}, {19, 17, 15, 10, 2}, {4, 4, 14, 17, 15}, {18, 18, 14, 8, 12},
                {2, 2, 4, 1, 11}, {9, 13, 17, 8, 12}, {10, 19, 13, 10, 6}, {19, 6, 10, 0, 0}, {2, 8, 17, 3, 6},
                {16, 15, 18, 4, 0}, {1, 16, 6, 10, 0}, {14, 15, 19, 11, 0}, {13, 15, 12, 2, 6}, {0, 13, 18, 11, 14},
                {2, 3, 0, 5, 11}, {0, 2, 16, 16, 11}, {13, 12, 13, 10, 3}, {12, 1, 3, 19, 4}, {6, 5, 0, 13, 18},
                {14, 13, 5, 9, 8}, {8, 12, 6, 18, 17}, {7, 11, 11, 10, 15}, {12, 0, 1, 8, 12}, {15, 6, 19, 2, 12},
                {14, 17, 2, 3, 15}, {15, 13, 1, 12, 15}, {1, 3, 2, 0, 18}, {4, 2, 17, 16, 8}, {4, 0, 18, 2, 11},
                {1, 15, 16, 8, 10}, {5, 3, 14, 8, 9}, {12, 17, 12, 7, 19}, {17, 18, 6, 7, 13}, {17, 9, 18, 3, 3},
                {13, 12, 18, 10, 9}, {0, 11, 14, 18, 15}, {14, 15, 18, 9, 1}, {9, 19, 12, 2, 12}, {19, 0, 17, 12, 2},
                {18, 9, 0, 16, 18}, {1, 7, 14, 15, 3}, {15, 18, 16, 3, 4}, {16, 2, 10, 8, 6}, {0, 2, 16, 5, 12},
                {4, 12, 17, 18, 14}, {15, 8, 17, 5, 1}, {5, 15, 5, 18, 3}, {15, 15, 0, 18, 8}, {18, 18, 6, 2, 17},
                {16, 7, 12, 5, 1}, {3, 10, 15, 5, 8}, {15, 14, 3, 3, 10}, {13, 10, 14, 9, 5}, {1, 4, 9, 9, 5},
                {16, 9, 7, 16, 4}, {14, 16, 3, 19, 15}, {17, 19, 12, 16, 16}, {16, 3, 11, 15, 14}, {6, 3, 19, 10, 7},
                {5, 0, 3, 10, 8}, {12, 3, 1, 17, 0}, {0, 6, 15, 9, 1}, {15, 0, 14, 7, 10}, {17, 16, 16, 9, 14},
                {17, 7, 18, 15, 12}, {19, 12, 0, 12, 6}, {11, 15, 11, 12, 3}, {3, 15, 15, 0, 14}, {17, 13, 13, 18, 14},
                {18, 12, 1, 12, 9}, {19, 16, 13, 8, 12}, {9, 1, 16, 10, 11}, {16, 14, 13, 14, 3}, {5, 2, 6, 18, 1},
                {16, 6, 2, 3, 3}, {10, 13, 7, 1, 19}, {12, 16, 7, 13, 13}, {16, 4, 2, 0, 19}, {5, 10, 8, 16, 10},
                {8, 12, 13, 11, 3}, {11, 13, 3, 7, 8}, {1, 0, 19, 6, 12}, {10, 9, 12, 15, 8}, {9, 17, 16, 8, 17},
                {11, 7, 2, 9, 19}, {12, 0, 0, 10, 4}, {1, 11, 1, 5, 17}, {19, 0, 1, 2, 11}, {1, 13, 9, 14, 10},
                {5, 16, 6, 16, 6}, {7, 10, 3, 0, 8}, {5, 13, 5, 14, 17}, {2, 4, 2, 7, 14}, {2, 17, 16, 1, 0},
                {3, 3, 16, 10, 15}, {7, 7, 12, 9, 5}, {11, 9, 14, 1, 19}, {14, 9, 10, 12, 5}, {9, 16, 8, 0, 6},
                {12, 5, 6, 11, 7}, {17, 3, 17, 9, 1}, {17, 11, 4, 14, 7}, {9, 17, 11, 1, 4}, {15, 7, 7, 11, 0},
                {15, 18, 4, 6, 4}, {3, 3, 1, 1, 1}, {6, 7, 16, 17, 13}, {19, 4, 9, 3, 12}, {13, 13, 13, 8, 3},
                {14, 14, 6, 8, 6}, {19, 3, 8, 9, 2}, {4, 10, 8, 11, 11}, {13, 2, 19, 2, 17}, {7, 4, 17, 14, 4},
                {17, 18, 14, 2, 1}, {17, 3, 12, 1, 10}, {12, 5, 7, 2, 10}, {17, 16, 7, 13, 13}, {4, 11, 12, 2, 15},
                {9, 8, 16, 5, 4}, {10, 5, 4, 11, 7}, {3, 16, 12, 15, 19}, {3, 12, 1, 5, 19}, {4, 12, 15, 11, 18},
                {0, 6, 9, 6, 0}, {7, 9, 1, 13, 1}, {12, 14, 10, 12, 7}, {0, 19, 18, 12, 2}, {16, 4, 2, 14, 2},
                {2, 14, 17, 8, 13}, {10, 1, 9, 1, 2}, {15, 15, 11, 16, 16}, {3, 10, 6, 4, 2}, {2, 19, 19, 9, 13},
                {5, 4, 16, 6, 9}, {10, 19, 14, 15, 0}, {8, 16, 8, 6, 15}, {1, 10, 1, 0, 10}, {15, 6, 14, 16, 8},
                {17, 5, 19, 9, 18}, {14, 1, 13, 1, 8}, {12, 13, 18, 14, 14}, {17, 9, 17, 5, 10}, {2, 16, 18, 8, 13},
                {18, 6, 6, 1, 12}, {9, 13, 16, 17, 5}, {8, 4, 13, 12, 16}, {1, 11, 14, 0, 11}, {0, 9, 2, 8, 0},
                {12, 4, 19, 15, 19}, {9, 1, 0, 5, 13}, {4, 4, 8, 3, 13}, {0, 9, 8, 2, 1}, {14, 1, 3, 10, 7},
                {5, 19, 16, 16, 8}, {3, 6, 9, 3, 3}, {6, 1, 19, 10, 18}, {18, 5, 11, 7, 14}, {10, 10, 16, 6, 3},
                {3, 0, 18, 16, 19}, {7, 11, 5, 3, 8}, {1, 3, 6, 5, 18}, {9, 6, 18, 2, 8}, {2, 14, 19, 15, 1},
                {7, 0, 6, 7, 4}, {16, 16, 19, 1, 11}, {5, 16, 10, 19, 18}, {13, 7, 16, 10, 6}, {12, 1, 15, 10, 0},
                {15, 8, 11, 6, 17}, {2, 5, 19, 15, 16}, {17, 1, 17, 18, 2}, {1, 9, 19, 6, 12}, {4, 19, 9, 19, 10},
                {8, 0, 16, 13, 16}, {19, 0, 12, 17, 12}, {2, 13, 5, 8, 18}, {2, 5, 3, 3, 14}, {3, 1, 4, 12, 1},
                {16, 19, 18, 19, 11}, {1, 7, 3, 18, 13}, {8, 13, 6, 5, 3}, {4, 19, 12, 2, 2}, {11, 2, 16, 14, 13},
                {4, 3, 13, 1, 15}, {0, 15, 1, 3, 7}, {6, 14, 12, 18, 2}, {9, 1, 8, 6, 7}, {9, 3, 3, 11, 3},
                {5, 18, 5, 7, 15}, {12, 5, 7, 19, 17}, {7, 7, 19, 7, 2}, {17, 13, 10, 3, 13}, {1, 16, 7, 13, 16},
                {6, 6, 14, 15, 14}, {11, 7, 14, 13, 4}, {5, 6, 11, 4, 5}, {5, 14, 10, 7, 0}, {19, 5, 5, 0, 18},
                {13, 1, 6, 18, 5}, {17, 2, 16, 14, 4}, {15, 4, 9, 17, 15}, {14, 4, 4, 15, 18}, {3, 19, 16, 8, 14},
                {7, 11, 19, 9, 3}, {16, 11, 10, 7, 16}, {11, 2, 17, 6, 14}, {15, 12, 16, 4, 12}, {8, 6, 18, 5, 6},
                {13, 6, 6, 13, 19}, {14, 19, 4, 0, 9}, {15, 15, 7, 4, 11}, {15, 4, 4, 2, 13}, {1, 11, 15, 6, 10},
                {7, 1, 14, 17, 17}, {8, 6, 3, 8, 9}, {9, 4, 0, 13, 17}, {0, 2, 0, 13, 1}, {0, 16, 16, 18, 14},
                {5, 4, 19, 11, 1}, {7, 3, 6, 19, 2}, {11, 15, 19, 2, 19}, {14, 19, 18, 13, 4}, {4, 8, 18, 1, 3},
                {18, 11, 19, 11, 16}, {13, 8, 6, 11, 15}, {5, 4, 2, 14, 11}, {3, 16, 7, 15, 3}, {5, 13, 16, 14, 0},
                {12, 12, 17, 3, 3}, {6, 12, 14, 0, 1}, {3, 2, 17, 13, 5}, {0, 0, 2, 17, 12}, {4, 19, 8, 17, 5},
                {10, 18, 18, 6, 12}, {1, 12, 1, 6, 5}, {13, 10, 15, 18, 18}, {3, 2, 14, 4, 7}, {9, 7, 10, 2, 16},
                {10, 15, 19, 2, 9}, {2, 2, 4, 1, 3}, {8, 9, 18, 7, 11}, {13, 13, 8, 16, 12}, {0, 18, 12, 15, 3},
                {12, 14, 9, 5, 3}, {13, 17, 17, 2, 15}, {3, 7, 14, 4, 13}, {12, 8, 0, 5, 10}, {14, 9, 14, 15, 2},
                {19, 17, 5, 15, 7}, {8, 8, 4, 6, 17}, {7, 5, 16, 19, 11}, {1, 13, 0, 7, 5}, {15, 18, 2, 18, 2},
                {8, 14, 0, 9, 16}, {5, 11, 19, 9, 13}, {2, 13, 15, 1, 9}, {4, 16, 16, 9, 8}, {11, 2, 4, 7, 19},
                {19, 18, 4, 11, 14}, {17, 6, 15, 7, 1}, {18, 18, 3, 6, 15}, {7, 5, 17, 0, 0}, {14, 8, 2, 15, 3},
                {6, 18, 7, 11, 14}, {11, 18, 16, 5, 11}, {10, 10, 9, 13, 13}, {0, 12, 11, 5, 8}, {4, 9, 16, 10, 14},
                {5, 17, 4, 2, 6}, {2, 9, 12, 2, 14}, {2, 14, 14, 1, 16}, {16, 3, 14, 17, 1}, {16, 3, 11, 5, 19},
                {19, 5, 1, 19, 7}, {13, 10, 10, 8, 4}, {16, 2, 1, 13, 3}, {4, 16, 17, 3, 17}, {6, 4, 5, 6, 7},
                {19, 11, 15, 18, 2}, {1, 6, 4, 19, 14}, {6, 10, 15, 3, 16}, {0, 0, 14, 7, 10}, {17, 3, 1, 12, 10},
                {11, 4, 17, 16, 19}, {11, 3, 7, 11, 12}, {3, 3, 19, 8, 7}, {15, 19, 8, 13, 11}, {13, 16, 11, 1, 10},
                {3, 10, 7, 16, 2}, {12, 11, 1, 11, 4}, {15, 3, 8, 19, 9}, {0, 2, 1, 14, 1}, {1, 14, 1, 7, 17},
                {0, 13, 4, 11, 12}, {15, 16, 6, 8, 17}, {8, 14, 19, 13, 14}, {10, 2, 12, 9, 14}, {17, 19, 9, 2, 9},
                {15, 15, 17, 12, 1}, {1, 6, 2, 9, 2}, {17, 15, 9, 2, 4}, {9, 3, 11, 0, 12}, {4, 13, 12, 4, 14},
                {17, 0, 0, 12, 8}, {2, 2, 2, 11, 13}, {16, 17, 5, 7, 10}, {11, 17, 13, 9, 19}, {3, 14, 5, 4, 3},
                {9, 0, 2, 5, 11}, {19, 16, 8, 0, 4}, {4, 8, 11, 19, 4}, {16, 10, 9, 9, 12}, {10, 17, 7, 19, 1},
                {1, 0, 10, 11, 4}, {12, 19, 9, 12, 16}, {13, 13, 4, 6, 10}, {10, 7, 7, 1, 9}, {4, 12, 7, 1, 6},
                {8, 3, 9, 16, 4}, {3, 0, 6, 0, 18}, {14, 3, 5, 14, 15}, {11, 0, 12, 8, 12}, {0, 6, 3, 17, 5},
                {7, 18, 9, 5, 13}, {3, 0, 18, 10, 2}, {10, 14, 6, 6, 0}, {9, 16, 9, 17, 1}, {8, 2, 2, 6, 6},
                {9, 3, 1, 6, 5}, {6, 12, 19, 1, 14}, {5, 7, 1, 14, 17}, {17, 15, 18, 18, 3}, {2, 4, 5, 1, 13},
                {19, 9, 13, 10, 8}, {15, 5, 5, 13, 15}, {8, 1, 15, 0, 15}, {16, 6, 16, 15, 11}, {7, 7, 12, 16, 6},
                {0, 14, 6, 13, 8}, {5, 3, 4, 18, 1}, {8, 2, 2, 0, 12}, {18, 3, 15, 9, 3}, {18, 4, 6, 5, 9},
                {18, 12, 8, 17, 17}, {18, 7, 4, 10, 14}, {10, 14, 9, 7, 1}, {8, 9, 15, 11, 3}, {0, 11, 5, 6, 9},
                {15, 2, 4, 10, 13}, {6, 0, 6, 4, 12}, {7, 16, 18, 11, 16}, {4, 5, 16, 18, 17}, {3, 18, 10, 5, 17},
                {9, 13, 7, 2, 19}, {17, 12, 18, 11, 17}, {10, 18, 15, 14, 12}, {7, 11, 1, 10, 11}, {17, 4, 17, 15, 17},
                {18, 12, 19, 4, 7}, {5, 12, 0, 17, 17}, {14, 8, 7, 16, 14}, {10, 16, 14, 16, 1}, {10, 0, 18, 7, 15},
                {7, 11, 2, 15, 15}, {13, 1, 7, 18, 8}, {11, 6, 5, 14, 9}, {15, 19, 13, 6, 2}, {11, 8, 8, 19, 2},
                {3, 13, 15, 2, 13}, {19, 2, 9, 7, 7}, {2, 8, 16, 17, 16}, {14, 10, 7, 7, 17}, {9, 13, 12, 8, 7},
                {7, 8, 19, 6, 13}, {8, 0, 14, 2, 18}, {8, 4, 9, 12, 5}, {12, 8, 18, 6, 10}, {15, 3, 13, 8, 11},
                {2, 1, 13, 16, 15}, {4, 7, 7, 18, 7}, {0, 16, 19, 18, 10}, {17, 13, 4, 1, 4}, {19, 2, 7, 4, 17},
                {4, 15, 19, 2, 14}, {3, 9, 3, 9, 16}, {19, 10, 2, 17, 5}, {13, 0, 12, 7, 19}, {11, 12, 19, 7, 15},
                {19, 4, 10, 5, 19}, {10, 10, 3, 1, 5}, {19, 2, 13, 17, 19}, {0, 7, 1, 10, 4}, {13, 17, 11, 7, 11},
                {12, 15, 12, 13, 3}, {0, 6, 10, 15, 6}, {5, 10, 14, 11, 7}, {1, 9, 15, 1, 9}, {13, 4, 9, 15, 15},
                {3, 7, 5, 17, 14}, {12, 12, 9, 7, 13}, {16, 0, 0, 9, 6}, {17, 14, 14, 13, 19}, {4, 16, 8, 15, 9},
                {16, 4, 7, 9, 1}, {19, 1, 5, 11, 19}, {3, 0, 12, 14, 2}, {14, 12, 4, 17, 15}, {0, 1, 16, 10, 9},
                {13, 11, 12, 18, 15}, {7, 15, 13, 18, 7}, {6, 16, 1, 3, 11}, {4, 1, 14, 17, 6}, {10, 15, 5, 19, 10},
                {12, 0, 10, 14, 15}, {10, 1, 12, 8, 8}, {14, 3, 9, 14, 7}, {2, 3, 2, 18, 8}, {1, 2, 18, 7, 6},
                {6, 7, 9, 4, 0}, {12, 17, 16, 10, 13}, {17, 3, 17, 17, 1}, {5, 18, 14, 5, 16}, {10, 17, 6, 10, 2},
                {10, 18, 18, 2, 3}, {16, 5, 19, 4, 3}, {13, 10, 16, 16, 4}, {6, 0, 9, 6, 10}, {15, 6, 14, 4, 6},
                {11, 0, 16, 11, 7}, {19, 18, 14, 18, 3}, {9, 3, 16, 8, 14}, {3, 18, 8, 7, 13}, {8, 15, 9, 1, 0},
                {12, 6, 12, 1, 14}, {3, 11, 3, 10, 10}, {13, 17, 16, 17, 19}, {18, 0, 11, 8, 4}, {9, 19, 9, 19, 4},
                {1, 0, 3, 17, 0}, {17, 3, 5, 1, 1}, {10, 2, 4, 14, 4}, {1, 6, 8, 1, 0}, {12, 2, 10, 3, 2},
                {6, 18, 7, 0, 3}, {15, 10, 17, 17, 19}, {7, 12, 3, 12, 5}, {16, 11, 17, 5, 6}, {17, 15, 0, 17, 8},
                {13, 5, 17, 18, 12}, {4, 0, 7, 8, 13}, {0, 8, 14, 6, 10}, {18, 4, 4, 8, 11}, {1, 7, 14, 7, 15},
                {16, 2, 9, 2, 13}, {8, 14, 4, 10, 12}, {19, 11, 11, 10, 9}, {12, 1, 16, 6, 2}, {6, 19, 19, 5, 9},
                {8, 1, 14, 13, 19}, {4, 14, 1, 14, 8}, {11, 6, 11, 3, 4}, {14, 7, 17, 4, 19}, {14, 1, 14, 16, 7},
                {1, 10, 14, 19, 19}, {10, 9, 4, 3, 3}, {7, 1, 13, 3, 17},
        }, new int[] {
                2, 3, 6, 2, 3, 4, 1, 5, 3, 3, 1, 4, 2, 0, 0, 1, 5, 3, 4, 0, 3, 2, 2, 4, 6, 0, 2, 4, 1, 2, 3, 5, 2, 0,
                1, 2, 4, 2, 2, 4, 2, 3, 3, 1, 3, 1, 1, 3, 7, 0, 1, 2, 2, 0, 1, 1, 6, 1, 4, 0, 5, 0, 1, 1, 2, 0, 0, 2,
                4, 0, 0, 2, 2, 0, 4, 1, 1, 1, 6, 1, 3, 1, 2, 2, 1, 4, 3, 2, 4, 2, 3, 3, 3, 1, 0, 5, 5, 4, 4, 6, 1, 5,
                4, 0, 1, 2, 1, 3, 2, 2, 0, 2, 3, 1, 1, 3, 4, 4, 0, 3, 2, 2, 0, 3, 0, 3, 2, 5, 4, 2, 6, 4, 3, 3, 0, 2,
                2, 3, 2, 0, 5, 2, 3, 1, 3, 2, 2, 2, 4, 0, 3, 4, 7, 4, 3, 0, 0, 1, 2, 6, 5, 1, 3, 2, 6, 2, 5, 2, 4, 2,
                1, 3, 4, 1, 3, 2, 2, 0, 4, 5, 2, 0, 1, 0, 2, 2, 0, 3, 1, 1, 2, 3, 3, 2, 0, 3, 2, 3, 2, 0, 2, 0, 4, 3,
                3, 3, 2, 3, 2, 2, 2, 2, 1, 5, 4, 2, 2, 5, 2, 5, 0, 1, 4, 2, 2, 3, 0, 6, 1, 5, 2, 3, 4, 0, 4, 5, 1, 6,
                4, 4, 2, 4, 4, 1, 0, 5, 0, 3, 0, 1, 4, 1, 1, 5, 2, 1, 1, 1, 2, 2, 0, 3, 4, 4, 0, 5, 3, 2, 2, 4, 1, 2,
                3, 0, 0, 7, 3, 2, 1, 3, 2, 0, 3, 0, 1, 3, 4, 2, 4, 2, 4, 3, 2, 1, 1, 1, 3, 5, 3, 4, 3, 4, 2, 4, 3, 4,
                1, 3, 2, 2, 2, 1, 1, 0, 4, 1, 3, 5, 5, 1, 6, 4, 2, 2, 1, 2, 0, 2, 0, 3, 4, 0, 5, 1, 3, 3, 0, 4, 4, 2,
                3, 5, 3, 0, 2, 4, 2, 4, 0, 2, 1, 4, 2, 3, 2, 4, 3, 3, 0, 2, 3, 4, 4, 1, 4, 1, 3, 3, 2, 4, 2, 2, 1, 5,
                1, 4, 3, 4, 0, 2, 5, 2, 2, 4, 2, 2, 1, 4, 1, 2, 1, 4, 5, 2, 3, 3, 0, 2, 1, 4, 1, 0, 3, 5, 1, 0, 0, 2,
                3, 3, 0, 5, 2, 1, 1, 2, 0, 3, 1, 2, 4, 0, 0, 2, 0, 1, 3, 2, 5, 2, 4, 3, 0, 4, 4, 1, 2, 0, 2, 2, 6, 3,
                2, 2, 0, 2, 0, 6, 5, 4, 3, 7, 5, 1, 5, 4, 1, 5, 3, 2, 3, 2, 3, 2, 4, 3, 1, 3, 3, 4, 4, 1, 1, 4, 2, 1,
                3, 4, 1, 2, 4, 2, 3, 1, 5, 4, 1, 4, 0, 5, 4, 2, 3, 1, 4, 3, 4, 0, 6, 3, 1, 2, 0, 4, 0, 6, 5, 1, 1, 4,
                1, 1, 3, 2, 1, 1, 5, 3, 5, 2, 3, 2, 4, 0, 3, 1, 5, 3, 3, 1, 3, 1, 7, 1, 4, 0, 1, 2, 0, 1, 0, 6, 1, 4,
                2, 4, 0, 1, 2, 2, 3, 2, 4, 1, 4, 2, 2, 2, 5, 2, 4, 1, 1
        });
    }

    @Test
    public void generatedTest8() {
        groupCheck(new double[][] {
                {0.0, 1.0, 5.0}, {0.0, 6.0, 2.0}, {0.0, 16.0, 12.0}, {1.0, 11.0, 10.0}, {1.0, 8.0, 1.0},
                {1.0, 7.0, 12.0}, {16.0, 7.0, 0.0}, {9.0, 1.0, 0.0}, {8.0, 11.0, 4.0}, {7.0, 14.0, 6.0},
                {1.0, 15.0, 3.0}, {2.0, 8.0, 1.0}, {8.0, 6.0, 1.0}, {10.0, 1.0, 1.0}, {7.0, 7.0, 6.0},
                {3.0, 9.0, 12.0}, {6.0, 6.0, 16.0}, {7.0, 10.0, 0.0}
        }, new int[]{0, 0, 1, 1, 0, 1, 1, 0, 2, 2, 1, 1, 0, 1, 1, 2, 1, 0});
    }

    @Test
    public void generatedTest9() {
        double[][] points = new double[][] {
                {2, 12, 18, 4}, {0, 14, 16, 7}, {2, 2, 13, 13}, {4, 5, 0, 15}, {18, 6, 14, 4}, {13, 18, 4, 19},
                {0, 8, 8, 7}, {8, 4, 3, 3}, {2, 3, 13, 16}, {16, 6, 14, 11}, {13, 19, 2, 17}, {1, 3, 12, 10},
                {5, 8, 3, 19}, {11, 12, 0, 0}, {0, 8, 7, 10}, {7, 4, 6, 2}, {7, 1, 12, 2}, {17, 3, 14, 13},
                {11, 11, 16, 7}, {4, 9, 7, 12}, {5, 18, 2, 6}, {16, 3, 7, 1}, {16, 6, 17, 6}, {12, 11, 5, 15},
                {7, 1, 12, 10}, {18, 6, 8, 12}, {3, 1, 0, 15}, {17, 5, 1, 0}, {7, 19, 15, 10}, {10, 11, 7, 11},
                {1, 18, 15, 15}, {11, 6, 14, 6}, {3, 2, 16, 1}, {13, 0, 10, 15}, {12, 6, 2, 7}, {13, 2, 10, 17},
                {11, 18, 12, 10}, {6, 2, 3, 11}, {7, 14, 10, 12}, {19, 4, 18, 7}, {16, 9, 18, 8}, {4, 17, 4, 12},
                {13, 14, 12, 1}, {10, 18, 9, 2}, {15, 17, 17, 4}, {7, 7, 10, 10}, {5, 15, 16, 13}, {5, 8, 12, 2},
                {8, 10, 2, 15}, {7, 6, 10, 4}, {6, 1, 19, 12}, {4, 19, 0, 0}, {4, 0, 0, 19}, {13, 8, 15, 6},
                {13, 18, 14, 3}, {6, 10, 4, 14}, {12, 12, 18, 3}, {10, 18, 2, 11}, {14, 15, 1, 15}, {9, 17, 11, 5},
                {18, 7, 7, 12}, {2, 9, 5, 7}, {4, 9, 9, 10}, {5, 15, 19, 2}, {18, 4, 1, 19}, {14, 17, 0, 2},
                {19, 1, 6, 10}, {7, 9, 6, 9}, {2, 0, 10, 1}, {16, 4, 17, 16}, {4, 1, 5, 7}, {10, 7, 3, 0},
                {3, 13, 19, 19}, {9, 10, 8, 11}, {1, 12, 14, 10}, {11, 16, 5, 15}, {6, 11, 17, 2}, {3, 13, 4, 2},
                {7, 12, 7, 15}, {0, 10, 13, 9}, {10, 16, 1, 18}, {9, 10, 18, 10}, {4, 8, 5, 7}, {10, 4, 6, 14},
                {10, 14, 16, 8}, {14, 19, 9, 6}, {18, 16, 6, 2}, {1, 9, 15, 16}, {13, 4, 4, 17}, {13, 4, 3, 16},
                {2, 14, 13, 13}, {13, 2, 12, 7}, {10, 12, 14, 1}, {7, 1, 13, 11}, {0, 4, 7, 15}, {17, 9, 4, 1},
                {7, 9, 17, 10}, {15, 9, 11, 10}, {10, 10, 19, 5}, {3, 5, 18, 5}, {6, 12, 2, 6}, {8, 8, 18, 16},
                {2, 2, 9, 3}, {5, 8, 17, 12}, {7, 16, 7, 11}, {2, 18, 5, 18}, {16, 11, 8, 17}, {9, 10, 6, 0},
                {9, 11, 2, 2}, {7, 15, 4, 5}, {3, 10, 15, 13}, {11, 8, 3, 8}, {13, 16, 13, 0}, {9, 15, 17, 9},
                {0, 10, 16, 16}, {2, 5, 13, 7}, {6, 8, 10, 13}, {4, 8, 14, 10}, {15, 1, 9, 13}, {16, 4, 13, 17},
                {14, 17, 11, 7}, {1, 1, 7, 1}, {3, 10, 15, 16}, {19, 11, 9, 1}, {14, 0, 6, 0}, {15, 5, 1, 13},
                {2, 8, 16, 10}, {17, 5, 11, 12}, {14, 4, 11, 7}, {3, 5, 6, 6}, {10, 16, 9, 0}, {0, 11, 7, 15},
                {8, 3, 18, 18}, {13, 0, 12, 6}, {12, 2, 18, 3}, {8, 8, 0, 5}, {0, 7, 10, 12}, {4, 8, 18, 0},
                {3, 15, 1, 5}, {7, 19, 6, 14}, {2, 15, 19, 5}, {8, 6, 10, 8}, {17, 17, 3, 13}, {2, 3, 18, 19},
                {11, 13, 11, 10}, {3, 4, 2, 8}, {2, 9, 1, 8}, {4, 13, 0, 4}, {8, 9, 13, 13}, {15, 2, 8, 12},
                {17, 11, 9, 6}, {10, 19, 19, 3}, {11, 11, 16, 10}, {12, 4, 18, 1}, {6, 7, 0, 15}, {3, 3, 17, 7},
                {12, 4, 6, 4}, {19, 5, 5, 3}, {12, 6, 7, 2}, {19, 4, 13, 12}, {0, 10, 3, 2}, {2, 15, 10, 1},
                {10, 16, 2, 4}, {13, 17, 14, 5}, {7, 8, 0, 0}, {2, 18, 16, 18}, {0, 12, 17, 7}, {17, 17, 1, 3},
                {7, 16, 11, 5}, {7, 10, 4, 14}, {13, 1, 12, 14}, {9, 12, 8, 6}, {4, 19, 13, 9}, {1, 17, 14, 17},
                {17, 15, 10, 2}, {6, 16, 8, 15}, {8, 8, 4, 14}, {9, 15, 14, 7}, {17, 4, 15, 12}, {8, 9, 12, 9},
                {16, 3, 7, 2}, {15, 17, 2, 2}, {12, 7, 5, 0}, {13, 0, 14, 7}, {14, 1, 4, 18}, {11, 17, 17, 1},
                {13, 15, 15, 0}, {18, 12, 1, 8}, {16, 15, 0, 6}, {5, 10, 5, 11}, {11, 17, 3, 1}, {1, 10, 19, 18},
                {7, 18, 17, 9}, {14, 0, 4, 9}, {8, 6, 5, 6}, {1, 10, 17, 11}, {16, 11, 16, 5}, {8, 13, 12, 17},
                {13, 8, 5, 12}, {4, 15, 6, 1}, {16, 9, 6, 0}, {0, 16, 8, 11}, {16, 6, 0, 9}, {0, 11, 1, 8},
                {0, 0, 15, 12}, {11, 3, 5, 10}, {18, 14, 5, 13}, {7, 4, 2, 18}, {4, 2, 18, 3}, {1, 10, 9, 17},
                {10, 2, 1, 16}, {15, 2, 10, 15}, {4, 2, 6, 5}, {9, 9, 7, 12}, {9, 11, 7, 5}, {2, 16, 14, 16},
                {19, 1, 6, 16}, {18, 4, 8, 4}, {13, 12, 4, 16}, {6, 8, 8, 13}, {9, 5, 13, 18}, {13, 18, 10, 1},
                {9, 2, 14, 16}, {15, 15, 14, 2}, {8, 4, 19, 18}, {3, 7, 10, 15}, {6, 16, 10, 10}, {2, 6, 15, 10},
                {1, 4, 3, 16}, {4, 7, 16, 3}, {19, 8, 6, 6}, {13, 3, 7, 18}, {15, 4, 19, 0}, {2, 2, 14, 5},
                {8, 7, 19, 7}, {12, 2, 15, 4}, {15, 0, 12, 8}, {4, 0, 8, 10}, {13, 14, 0, 12}, {18, 1, 16, 17},
                {13, 8, 7, 11}, {6, 7, 18, 14}, {14, 6, 0, 17}, {13, 12, 8, 19}, {1, 14, 13, 18}, {5, 8, 17, 4},
                {10, 5, 4, 5}, {1, 19, 10, 1}, {11, 10, 18, 5}, {8, 10, 11, 11}, {10, 1, 7, 5}, {15, 6, 0, 1},
                {11, 1, 7, 12}, {14, 11, 5, 3}, {5, 0, 7, 0}, {9, 3, 19, 14}, {2, 6, 8, 1}, {12, 2, 7, 13},
                {18, 14, 3, 13}, {16, 6, 1, 17}, {7, 14, 10, 10}, {5, 5, 7, 2}, {12, 1, 13, 0}, {19, 11, 1, 9},
                {4, 16, 4, 19}, {8, 3, 18, 2}, {9, 13, 5, 11}, {1, 19, 19, 13}, {3, 7, 17, 5}, {16, 10, 4, 16},
                {2, 1, 5, 6}, {8, 15, 3, 10}, {8, 15, 6, 19}, {4, 3, 0, 10}, {1, 7, 5, 19}, {5, 0, 15, 18},
                {0, 19, 11, 12}, {2, 13, 18, 0}, {3, 14, 7, 12}, {5, 17, 16, 0}, {1, 18, 2, 19}, {4, 11, 1, 6},
                {6, 7, 16, 10}, {10, 4, 13, 8}, {15, 6, 18, 7}, {3, 5, 0, 6}, {6, 16, 15, 4}, {1, 14, 1, 6},
                {2, 11, 11, 19}, {10, 15, 1, 4}, {14, 6, 8, 11}, {4, 14, 2, 2}, {17, 18, 9, 8}, {12, 3, 17, 0},
                {6, 12, 15, 6}, {1, 12, 18, 9}, {0, 10, 5, 16}, {11, 10, 10, 11}, {5, 11, 5, 8}, {1, 5, 17, 19},
                {10, 15, 3, 14}, {15, 9, 3, 11}, {8, 14, 8, 5}, {12, 17, 8, 1}, {2, 12, 3, 12}, {17, 1, 13, 5},
                {7, 18, 8, 10}, {16, 2, 3, 3}, {7, 13, 13, 13}, {9, 9, 19, 9}, {3, 15, 1, 2}, {7, 6, 17, 5},
                {10, 8, 10, 4}, {15, 8, 5, 12}, {17, 1, 19, 6}, {2, 15, 1, 11}, {9, 0, 9, 11}, {10, 11, 9, 16},
                {5, 15, 15, 11}, {2, 3, 14, 19}, {3, 14, 14, 12}, {1, 10, 6, 14}, {2, 9, 10, 3}, {12, 3, 10, 18},
                {13, 6, 7, 14}, {15, 9, 5, 8}, {3, 3, 16, 1}, {17, 2, 16, 5}, {13, 6, 10, 17}, {6, 11, 5, 5},
                {5, 16, 5, 11}, {1, 3, 6, 3}, {15, 3, 18, 18}, {5, 4, 8, 3}, {5, 12, 4, 10}, {9, 14, 7, 8},
                {13, 18, 7, 4}, {18, 16, 3, 17}, {14, 3, 3, 10}, {17, 6, 14, 10}, {6, 0, 9, 10}, {0, 15, 7, 7},
                {12, 0, 5, 6}, {12, 11, 0, 5}, {14, 0, 13, 17}, {14, 18, 11, 2}, {2, 0, 9, 15}, {5, 0, 11, 7},
                {13, 19, 10, 10}, {14, 6, 18, 12}, {16, 4, 1, 0}, {17, 10, 14, 0}, {9, 15, 4, 11}, {16, 7, 4, 18},
                {8, 7, 17, 11}, {11, 9, 13, 12}, {10, 7, 14, 8}, {9, 10, 5, 8}, {6, 15, 11, 13}, {16, 15, 9, 9},
                {0, 12, 13, 4}, {6, 7, 6, 5}, {2, 17, 10, 15}, {3, 5, 11, 17}, {17, 0, 12, 17}, {16, 1, 18, 16},
                {10, 9, 2, 14}, {14, 2, 19, 10}, {9, 5, 18, 17}, {9, 12, 15, 12}, {7, 4, 2, 8}, {11, 4, 6, 4},
                {6, 0, 2, 13}, {8, 9, 17, 7}, {10, 19, 5, 13}, {0, 16, 14, 2}, {2, 3, 15, 13}, {11, 16, 0, 2},
                {7, 12, 13, 3}, {12, 6, 8, 11}, {14, 16, 8, 3}, {8, 14, 0, 4}, {11, 5, 11, 15}, {6, 19, 18, 10},
                {11, 17, 12, 0}, {17, 10, 1, 16}, {15, 9, 16, 5}, {10, 1, 9, 1}, {16, 11, 15, 4}, {10, 8, 14, 18},
                {12, 2, 12, 12}, {0, 8, 13, 10}, {6, 0, 6, 1}, {14, 3, 7, 17}, {16, 5, 7, 10}, {6, 17, 2, 2},
                {19, 17, 4, 3}, {9, 19, 5, 5}, {1, 17, 17, 11}, {10, 6, 4, 12}, {4, 16, 13, 10}, {0, 6, 18, 8},
                {10, 13, 0, 3}, {18, 3, 9, 17}, {3, 18, 10, 13}, {3, 2, 18, 0}, {1, 19, 9, 7}, {5, 1, 16, 19},
                {12, 14, 6, 11}, {10, 2, 6, 7}, {4, 18, 2, 5}, {4, 16, 14, 9}, {0, 0, 17, 10}, {14, 15, 15, 9},
                {3, 7, 18, 13}, {19, 5, 16, 7}, {11, 9, 11, 0}, {3, 10, 11, 7}, {19, 18, 1, 6}, {12, 9, 2, 7},
                {0, 15, 12, 0}, {11, 15, 15, 4}, {5, 5, 10, 0}, {14, 0, 5, 5}, {14, 15, 0, 4}, {13, 15, 2, 14},
                {18, 6, 15, 3}, {1, 18, 18, 15}, {14, 1, 1, 7}, {7, 6, 0, 0}, {12, 10, 12, 7}, {10, 13, 1, 11},
                {8, 2, 17, 14}, {2, 6, 0, 19}, {10, 6, 2, 3}, {19, 7, 5, 0}, {16, 3, 2, 0}, {10, 18, 3, 8},
                {3, 2, 8, 10}, {13, 10, 9, 2}, {9, 9, 3, 4}, {11, 5, 8, 6}, {15, 12, 10, 3}, {4, 2, 4, 13},
                {19, 12, 2, 16}, {7, 13, 9, 19}, {12, 0, 6, 15}, {2, 14, 0, 18}, {13, 13, 6, 13}, {19, 3, 5, 10},
                {13, 4, 7, 17}, {1, 16, 6, 12}, {3, 16, 9, 17}, {2, 10, 19, 7}, {9, 19, 11, 10}, {4, 4, 13, 18},
                {12, 18, 1, 9}, {0, 10, 17, 18}, {9, 3, 14, 3}, {15, 18, 11, 1}, {15, 6, 17, 2}, {13, 15, 16, 5},
                {12, 4, 4, 16}, {2, 15, 5, 18}, {16, 3, 10, 3}, {0, 2, 12, 7}, {15, 4, 7, 14}, {9, 5, 10, 4},
                {2, 19, 15, 16}, {5, 1, 2, 10}, {3, 16, 17, 12}, {6, 8, 8, 0}, {18, 7, 13, 11}, {0, 3, 9, 7},
                {5, 13, 13, 18}, {14, 6, 10, 9}, {11, 1, 15, 2}, {16, 7, 5, 18}, {13, 2, 2, 6}, {11, 15, 9, 5},
                {4, 17, 9, 5}, {0, 6, 18, 16}, {5, 5, 8, 2}, {15, 19, 8, 5}, {6, 11, 5, 8}, {7, 5, 1, 12},
                {18, 0, 0, 7}, {15, 7, 15, 14}, {3, 10, 11, 17}, {5, 12, 5, 3}, {2, 2, 15, 17}, {1, 5, 12, 12},
                {12, 3, 15, 11}, {4, 9, 11, 11}, {16, 0, 1, 2}, {8, 3, 17, 0}, {13, 9, 12, 10}, {5, 9, 10, 2},
                {13, 0, 19, 13}, {14, 2, 3, 10}, {5, 17, 17, 8}, {3, 0, 3, 16}, {10, 18, 2, 2}, {8, 0, 6, 5},
                {13, 13, 3, 4}, {11, 0, 8, 11}, {12, 1, 2, 17}, {5, 11, 12, 1}, {4, 19, 15, 14}
        };
        int[] ranks = new int[]{
                3, 2, 2, 1, 5, 6, 0, 0, 3, 6, 6, 1, 2, 2, 0, 1, 1, 5, 5, 3, 3, 1, 5, 5, 2, 6, 0, 1, 6, 5, 3, 4, 1, 3,
                2, 5, 6, 1, 6, 5, 6, 2, 3, 4, 6, 4, 6, 3, 3, 3, 2, 0, 0, 5, 6, 2, 5, 5, 5, 5, 5, 1, 3, 4, 2, 4, 2, 3,
                0, 6, 1, 1, 6, 4, 2, 6, 4, 1, 5, 1, 4, 6, 2, 3, 6, 6, 4, 3, 3, 2, 3, 3, 3, 3, 0, 2, 5, 6, 5, 3, 2, 6,
                1, 5, 5, 3, 6, 2, 2, 2, 4, 3, 4, 6, 2, 2, 4, 3, 4, 6, 6, 0, 5, 4, 0, 2, 4, 5, 4, 1, 3, 1, 5, 2, 3, 2,
                1, 1, 1, 5, 4, 4, 6, 5, 5, 0, 0, 0, 6, 4, 4, 5, 6, 3, 2, 3, 3, 2, 2, 5, 0, 2, 4, 6, 1, 5, 2, 5, 4, 3,
                4, 4, 4, 3, 4, 5, 3, 5, 5, 5, 2, 5, 2, 3, 2, 5, 3, 4, 4, 3, 3, 4, 6, 0, 1, 2, 6, 6, 4, 0, 3, 2, 2, 0,
                0, 2, 6, 2, 2, 2, 1, 5, 0, 4, 3, 4, 3, 4, 4, 3, 5, 5, 4, 4, 6, 2, 5, 3, 0, 3, 4, 5, 3, 2, 5, 3, 3, 0,
                4, 5, 4, 5, 2, 6, 3, 4, 1, 1, 5, 5, 2, 1, 3, 3, 0, 5, 1, 4, 5, 3, 5, 1, 1, 4, 2, 3, 5, 4, 3, 5, 0, 3,
                5, 0, 1, 2, 3, 0, 2, 2, 1, 1, 4, 3, 5, 0, 4, 0, 3, 3, 5, 0, 6, 2, 4, 3, 1, 5, 3, 3, 4, 4, 3, 4, 1, 3,
                5, 1, 5, 6, 0, 4, 4, 5, 4, 1, 2, 6, 5, 4, 4, 1, 2, 5, 5, 4, 2, 4, 6, 1, 4, 0, 6, 1, 2, 5, 5, 6, 2, 6,
                1, 1, 0, 3, 4, 6, 0, 1, 6, 6, 0, 4, 4, 4, 5, 6, 5, 3, 5, 6, 1, 1, 3, 2, 4, 5, 3, 4, 5, 6, 1, 2, 0, 5,
                6, 1, 3, 3, 4, 4, 4, 2, 4, 6, 4, 3, 5, 1, 5, 6, 4, 1, 0, 5, 4, 1, 6, 3, 3, 2, 4, 1, 2, 6, 3, 0, 2, 3,
                6, 2, 2, 4, 0, 6, 4, 5, 2, 3, 6, 3, 0, 5, 1, 0, 3, 5, 4, 4, 0, 0, 5, 3, 4, 0, 1, 3, 0, 5, 1, 3, 2, 3,
                4, 0, 5, 6, 2, 0, 6, 3, 5, 1, 3, 3, 6, 4, 4, 3, 2, 6, 3, 6, 2, 2, 3, 0, 5, 3, 5, 0, 5, 1, 6, 0, 5, 5,
                2, 5, 0, 4, 2, 2, 2, 6, 4, 1, 0, 6, 4, 1, 3, 2, 4, 4, 0, 1, 6, 3, 4, 1, 5, 0, 3, 1, 3, 2, 1, 2, 5
        };

        groupCheck(points, ranks);
    }

    @Test
    public void generatedTest10() {
        groupCheck(new double[][] {
                {9, 9, 6}, {4, 3, 7}, {2, 7, 9}, {2, 11, 0}, {16, 3, 1}, {1, 11, 9}, {4, 17, 18}, {4, 2, 6},
                {0, 14, 5}, {1, 16, 14}, {12, 7, 12}, {0, 1, 19}, {0, 15, 4}, {19, 3, 18}, {17, 14, 13}, {7, 8, 18},
                {13, 1, 13}, {7, 16, 1}, {14, 7, 10}, {17, 14, 18}, {2, 6, 10}, {18, 2, 2}, {16, 13, 1}, {5, 1, 15},
                {13, 14, 4}, {16, 16, 10}, {5, 7, 1}, {13, 14, 1}, {12, 0, 11}, {6, 15, 15}, {17, 16, 13}, {4, 2, 11},
                {8, 1, 0}, {10, 13, 0}, {17, 4, 3}, {3, 16, 11}, {14, 15, 4}, {4, 14, 2}, {8, 12, 17}, {6, 4, 18},
                {11, 10, 1}, {11, 18, 14}, {1, 3, 0}, {9, 4, 1}, {15, 13, 1}, {6, 13, 13}, {17, 7, 12}, {0, 16, 18},
                {18, 10, 8}, {1, 15, 15}, {18, 2, 12}, {12, 9, 9}, {9, 7, 0}, {16, 4, 4}, {6, 9, 6}, {1, 13, 1},
                {19, 7, 4}, {19, 16, 11}, {3, 8, 11}, {15, 15, 15}, {18, 3, 19},
        }, new int[]{
                3, 1, 1, 1, 1, 1, 4, 0, 0, 2, 2, 0, 0, 3, 5, 3, 1, 2, 2, 6, 1, 1, 4, 0, 4, 6, 1, 3, 0, 4, 7, 1, 0, 2,
                2, 3, 5, 2, 3, 2, 2, 4, 0, 1, 3, 3, 3, 1, 4, 2, 2, 4, 1, 2, 2, 1, 3, 7, 2, 6, 3
        });
    }

    @Test
    public void generatedTest11() {
        groupCheck(new double[][] {
                {2.0, 14.0}, {9.0, 17.0}, {2.0, 11.0}, {3.0, 19.0}, {7.0, 11.0}, {7.0, 4.0}, {6.0, 16.0}, {5.0, 12.0},
                {10.0, 12.0}, {16.0, 3.0}, {7.0, 19.0}, {7.0, 9.0}, {13.0, 17.0}, {14.0, 6.0}, {3.0, 9.0}, {4.0, 19.0},
                {8.0, 3.0}, {1.0, 14.0}, {17.0, 9.0}, {15.0, 11.0}, {2.0, 9.0}, {4.0, 15.0}, {8.0, 2.0}, {18.0, 12.0},
                {8.0, 10.0}, {10.0, 15.0}, {15.0, 9.0}, {15.0, 0.0}, {4.0, 1.0}, {4.0, 13.0}, {15.0, 9.0}, {2.0, 6.0},
                {8.0, 0.0}, {3.0, 16.0}, {1.0, 17.0}, {17.0, 7.0}, {17.0, 19.0}, {3.0, 15.0}, {10.0, 0.0}, {13.0, 10.0},
                {9.0, 18.0}, {11.0, 19.0}, {9.0, 15.0}, {19.0, 8.0}, {6.0, 2.0}, {19.0, 11.0}, {16.0, 1.0}, {19.0, 6.0},
                {4.0, 4.0}, {17.0, 4.0}, {16.0, 16.0}, {16.0, 3.0}, {7.0, 19.0}, {14.0, 7.0}, {9.0, 4.0}, {10.0, 6.0},
                {17.0, 15.0}, {0.0, 17.0}, {10.0, 2.0}, {19.0, 8.0}, {19.0, 17.0}, {19.0, 7.0}, {12.0, 19.0},
                {15.0, 5.0}, {3.0, 2.0}, {8.0, 15.0}, {5.0, 6.0}, {9.0, 1.0}, {8.0, 7.0}, {0.0, 19.0}, {13.0, 16.0},
                {6.0, 14.0}, {9.0, 14.0}, {8.0, 8.0},
        }, new int[] {
                3, 9, 2, 6, 4, 2, 6, 3, 7, 4, 8, 3, 11, 6, 2, 7, 3, 0, 9, 9, 1, 5, 2, 10, 6, 9, 8, 2, 0, 3, 8, 0, 0,
                5, 1, 8, 13, 4, 1, 7, 10, 11, 8, 10, 1, 11, 3, 7, 1, 5, 11, 4, 8, 7, 4, 5, 10, 0, 3, 10, 12, 9, 12, 5,
                0, 7, 2, 1, 4, 1, 10, 4, 7, 5
        });
    }
    
    @Test
    public void generatedTest12() {
        groupCheck(new double[][] {
                {6, 14, 6, 11, 18}, {2, 6, 8, 11, 5}, {7, 15, 19, 14, 3}, {13, 10, 19, 12, 1}, {16, 6, 18, 0, 12},
                {8, 5, 11, 19, 5}, {16, 2, 14, 0, 15}, {2, 8, 2, 8, 9}, {18, 3, 15, 19, 15}, {1, 2, 16, 18, 15},
                {16, 10, 19, 10, 4}, {6, 10, 6, 15, 18}, {7, 13, 2, 14, 1}, {8, 9, 17, 8, 7}, {8, 14, 15, 19, 11},
                {10, 0, 1, 19, 7}, {9, 18, 10, 17, 6}, {0, 19, 4, 14, 2}, {19, 16, 19, 15, 0}, {10, 16, 2, 18, 19},
                {6, 3, 14, 2, 4}, {2, 12, 6, 18, 19}, {13, 9, 6, 9, 3}, {12, 17, 14, 0, 1}, {3, 14, 6, 16, 8},
                {0, 0, 8, 10, 15}, {7, 7, 18, 0, 9}, {16, 15, 4, 19, 17}, {8, 15, 16, 14, 0}, {14, 5, 19, 8, 16},
                {10, 6, 16, 2, 12}, {13, 7, 1, 0, 17}, {17, 4, 16, 3, 6}, {1, 0, 3, 4, 4}, {15, 7, 8, 17, 18},
                {0, 5, 10, 2, 18}, {1, 18, 6, 4, 12}, {8, 12, 6, 4, 17}, {13, 1, 13, 7, 14}, {14, 3, 12, 2, 10},
                {17, 10, 1, 4, 6}, {15, 7, 4, 13, 3}, {18, 6, 18, 3, 17}, {10, 10, 5, 15, 1}, {16, 15, 10, 7, 0},
                {4, 18, 15, 2, 18}, {16, 15, 5, 0, 2}, {16, 17, 4, 8, 14}, {14, 1, 9, 5, 6}, {2, 2, 12, 0, 11},
                {18, 12, 9, 8, 4}, {7, 8, 3, 2, 19}, {3, 18, 9, 4, 17}, {3, 12, 17, 17, 11}, {8, 15, 11, 10, 18},
                {8, 15, 2, 3, 6}, {15, 7, 9, 15, 10}, {16, 1, 5, 18, 18}, {5, 0, 4, 17, 8}, {18, 17, 16, 12, 10},
                {8, 9, 19, 14, 19}, {0, 8, 1, 1, 10}, {12, 19, 9, 13, 7}, {11, 1, 1, 13, 18}, {0, 12, 19, 2, 18},
                {6, 10, 16, 17, 17}, {10, 5, 11, 4, 17}, {6, 11, 17, 16, 6}, {13, 9, 13, 9, 0}, {11, 13, 15, 7, 18},
                {12, 4, 3, 18, 19}, {1, 4, 16, 5, 16}, {14, 6, 11, 4, 13}, {8, 0, 14, 5, 10}, {18, 16, 5, 17, 13},
                {17, 17, 17, 16, 7}, {16, 5, 14, 13, 10}, {16, 16, 17, 5, 1}, {4, 10, 19, 1, 18}, {7, 19, 15, 14, 14},
                {2, 16, 0, 5, 9}, {1, 5, 10, 14, 18}, {12, 10, 6, 2, 6}, {14, 10, 7, 11, 6}, {4, 17, 7, 5, 5},
                {8, 0, 8, 1, 19}, {1, 12, 12, 1, 7}, {18, 16, 11, 16, 2}, {3, 2, 0, 0, 0}, {12, 3, 1, 16, 15},
                {2, 19, 18, 5, 7}, {10, 8, 3, 19, 6}, {5, 18, 17, 9, 15}, {5, 8, 16, 7, 14}, {9, 14, 1, 6, 16},
                {7, 13, 1, 9, 10}, {13, 19, 11, 15, 6}, {3, 7, 7, 2, 10}, {19, 8, 4, 17, 11}, {6, 12, 5, 17, 8},
                {0, 7, 12, 11, 19}, {6, 18, 19, 4, 14}, {14, 18, 1, 4, 7}, {15, 0, 0, 4, 17}, {6, 8, 13, 1, 8},
                {11, 12, 6, 12, 2}, {11, 18, 12, 13, 0}, {17, 18, 9, 11, 3}, {3, 9, 0, 16, 15}, {0, 15, 9, 16, 11},
                {0, 3, 7, 12, 3}, {4, 5, 2, 9, 2}, {10, 3, 3, 7, 0}, {2, 18, 1, 3, 16}, {9, 7, 17, 9, 7},
                {2, 7, 15, 12, 2}, {16, 10, 8, 11, 3}, {11, 17, 4, 4, 17}, {3, 2, 18, 6, 15}, {16, 0, 6, 17, 14},
                {16, 11, 14, 15, 15}, {3, 4, 3, 14, 15}, {0, 19, 11, 12, 6}, {7, 6, 5, 9, 16}, {8, 10, 7, 0, 15},
                {6, 7, 18, 17, 5}, {0, 10, 10, 6, 7}, {14, 14, 9, 3, 14}, {0, 9, 1, 15, 8}, {18, 1, 10, 15, 15},
                {18, 0, 16, 0, 15}, {0, 3, 0, 16, 12}, {19, 1, 2, 19, 1}, {7, 13, 3, 13, 19}, {7, 13, 4, 14, 3},
                {15, 11, 3, 15, 9}, {11, 0, 10, 16, 18}, {11, 0, 10, 11, 6}, {1, 7, 1, 0, 15}, {2, 9, 18, 15, 7},
                {17, 3, 0, 0, 15}, {18, 7, 3, 4, 8}, {0, 14, 4, 5, 13}, {4, 12, 14, 13, 2}, {13, 18, 4, 8, 18},
                {4, 16, 7, 5, 4}, {6, 19, 11, 1, 5}, {7, 18, 13, 3, 10}, {19, 16, 6, 19, 6}, {4, 1, 4, 6, 18},
                {4, 5, 11, 1, 12}, {8, 5, 15, 14, 4}, {6, 4, 8, 15, 6}, {3, 17, 1, 10, 2}, {2, 17, 4, 4, 5},
                {2, 8, 4, 8, 14}, {11, 8, 11, 18, 10}, {9, 7, 14, 1, 7}, {3, 4, 11, 7, 19}, {1, 2, 14, 10, 13},
                {19, 16, 5, 8, 17}, {16, 17, 12, 0, 4}, {11, 4, 14, 12, 10}, {1, 3, 6, 0, 8}, {17, 9, 6, 17, 6},
                {2, 16, 15, 17, 18}, {4, 18, 10, 8, 12}, {18, 3, 11, 2, 14}, {14, 16, 8, 10, 13}, {16, 18, 11, 9, 6},
                {12, 18, 14, 2, 15}, {6, 7, 2, 2, 15}, {1, 11, 18, 17, 10}, {11, 3, 12, 1, 13}, {16, 4, 12, 11, 8},
                {17, 0, 13, 5, 12}, {16, 15, 7, 8, 6}, {8, 8, 9, 12, 7}, {4, 12, 15, 2, 13}, {18, 8, 14, 12, 10},
                {9, 3, 3, 1, 8}, {8, 18, 1, 2, 16}, {15, 10, 6, 6, 15}, {12, 6, 6, 11, 19}, {12, 6, 4, 1, 1},
                {3, 1, 3, 14, 8}, {4, 3, 4, 9, 18}, {0, 6, 0, 14, 8}, {11, 12, 12, 6, 9}, {17, 6, 10, 4, 19},
                {1, 9, 8, 17, 6}, {5, 6, 14, 18, 17}, {8, 19, 9, 18, 6}, {6, 14, 15, 0, 7}, {15, 1, 11, 5, 2},
                {1, 12, 12, 16, 14}, {6, 6, 6, 4, 1}, {17, 4, 7, 9, 0}, {5, 16, 5, 5, 15}, {2, 11, 0, 17, 7},
                {3, 6, 0, 2, 19}, {8, 15, 4, 14, 13}, {11, 5, 17, 11, 14}, {10, 15, 9, 2, 8}, {17, 13, 2, 3, 4},
                {2, 14, 16, 16, 0}, {15, 19, 2, 4, 19}, {8, 16, 14, 11, 6}, {6, 14, 13, 15, 12}, {9, 8, 10, 1, 13},
                {4, 13, 2, 10, 9}, {1, 5, 15, 16, 6}, {15, 7, 1, 4, 18}, {15, 8, 9, 14, 17}, {4, 18, 10, 14, 9},
                {6, 13, 7, 13, 6}, {13, 7, 5, 7, 14}, {4, 0, 9, 5, 3}, {9, 15, 10, 6, 16}, {3, 11, 16, 15, 10},
                {6, 14, 19, 9, 13}, {8, 12, 2, 3, 5}, {12, 9, 11, 13, 8}, {0, 7, 6, 1, 9}, {4, 3, 7, 9, 3},
                {11, 3, 12, 19, 1}, {13, 13, 10, 12, 6}, {2, 1, 13, 16, 15}, {5, 12, 5, 12, 16}, {15, 12, 3, 14, 1},
                {0, 3, 14, 11, 10}, {2, 13, 7, 5, 19}, {16, 6, 1, 18, 10}, {19, 2, 6, 14, 8}, {3, 10, 5, 7, 19},
                {18, 16, 11, 15, 1}, {15, 7, 15, 0, 8}, {1, 8, 11, 6, 12}, {17, 4, 12, 5, 14}, {13, 13, 1, 10, 14},
                {19, 18, 12, 11, 18}, {11, 11, 16, 4, 15}, {4, 19, 2, 19, 13}, {8, 10, 19, 16, 7}, {0, 11, 8, 6, 8},
                {15, 10, 1, 19, 3},
        }, new int[] {
                3, 1, 3, 3, 1, 2, 1, 0, 3, 2, 3, 3, 1, 2, 3, 0, 3, 0, 3, 3, 1, 2, 2, 1, 2, 0, 1, 4, 1, 3, 2, 1, 2, 0,
                3, 0, 1, 2, 1, 2, 1, 2, 3, 2, 2, 3, 1, 3, 1, 0, 2, 2, 2, 3, 3, 2, 3, 2, 1, 4, 3, 0, 3, 0, 1, 3, 2, 3,
                2, 3, 3, 1, 2, 1, 4, 4, 3, 2, 2, 4, 0, 1, 2, 3, 2, 0, 0, 4, 0, 1, 2, 2, 4, 2, 1, 1, 4, 1, 3, 2, 1, 3,
                1, 0, 1, 2, 2, 4, 1, 2, 0, 1, 1, 1, 2, 0, 3, 3, 1, 2, 4, 2, 1, 2, 1, 2, 0, 3, 1, 2, 0, 0, 0, 3, 2, 2,
                2, 1, 0, 2, 1, 2, 1, 2, 4, 1, 1, 2, 4, 1, 1, 2, 2, 1, 1, 1, 3, 1, 1, 1, 3, 2, 2, 0, 3, 3, 3, 2, 3, 4,
                3, 1, 2, 2, 2, 1, 3, 2, 2, 3, 1, 1, 3, 3, 1, 1, 2, 0, 2, 2, 1, 3, 3, 1, 0, 2, 1, 2, 2, 0, 1, 3, 3, 2,
                1, 0, 3, 3, 3, 2, 2, 1, 2, 3, 3, 2, 2, 0, 3, 2, 3, 1, 3, 0, 1, 2, 3, 1, 2, 2, 0, 1, 1, 2, 2, 3, 1, 1,
                3, 2, 5, 3, 3, 3, 0, 1
        });
      
    }

    @Test
    public void generatedTest13() {
        groupCheck(new double[][] {
                {14, 9}, {4, 7}, {9, 9}, {14, 17}, {13, 5}, {4, 5}, {13, 7}, {13, 2}, {19, 8}, {17, 18}, {4, 16},
                {6, 10}, {10, 15}, {0, 19}, {11, 17}, {15, 5}, {16, 10}, {17, 17}, {10, 1}, {10, 17}, {4, 13}, {17, 5},
                {9, 10}, {15, 6}, {8, 16}, {1, 18}, {8, 12}, {14, 13}, {0, 1}, {8, 4}, {16, 19}, {9, 0}, {0, 3},
                {16, 0}, {17, 2}, {1, 14}, {19, 12}, {1, 11}, {11, 4}, {1, 14}, {17, 14}, {13, 6}, {1, 2}, {6, 12},
                {13, 17}, {7, 5}, {9, 2}, {0, 14}, {1, 3}, {16, 8}, {17, 3}, {10, 1}, {12, 7}, {7, 7}, {5, 0}, {19, 3},
                {17, 17}, {9, 18}, {11, 12}, {19, 11}, {7, 11}, {12, 5}, {18, 18}, {11, 3}, {3, 3}, {6, 3}, {3, 7},
                {2, 7}, {4, 10}, {11, 19}, {12, 12}, {17, 19}, {11, 10}, {14, 6}, {4, 11}, {16, 17}, {18, 16}, {3, 13},
                {11, 4}, {5, 4}, {8, 1}, {3, 6}, {1, 16}, {7, 9}, {8, 13}, {9, 7}, {15, 4}, {12, 8}, {1, 4}, {16, 6},
                {7, 8}, {11, 11}, {1, 16}, {1, 15}, {11, 15}, {12, 18}, {11, 12}, {17, 19}, {10, 14}, {16, 19}, {1, 8},
                {12, 5}, {3, 4}, {4, 0}, {3, 6}, {9, 9}, {3, 9}, {2, 13}, {12, 6}, {0, 15}, {1, 12}, {4, 5}, {11, 12},
                {15, 7}, {5, 1}, {11, 15}, {9, 3}, {5, 9}, {6, 15}, {13, 8}, {14, 15}, {2, 4}, {11, 14}, {7, 3},
                {3, 11}, {18, 4}, {17, 17}, {4, 2}, {17, 5}, {8, 10}, {19, 18}, {7, 16}, {8, 1}, {19, 12}, {0, 3},
                {1, 15}, {3, 1}, {17, 7}, {11, 1}, {11, 4}, {16, 9}, {15, 2}, {5, 2}, {12, 8}, {0, 15}, {17, 15},
                {11, 11}, {6, 11}, {0, 0}, {2, 5}, {11, 15}, {9, 0}, {19, 7}, {19, 1},
        }, new int[] {
                15, 9, 13, 22, 11, 7, 13, 7, 18, 25, 13, 11, 17, 5, 20, 12, 18, 24, 5, 18, 12, 13, 14, 14, 16, 11, 14,
                19, 1, 8, 24, 3, 2, 4, 9, 8, 20, 6, 9, 8, 20, 12, 2, 13, 21, 8, 5, 3, 3, 16, 10, 5, 12, 10, 2, 11, 24,
                17, 17, 19, 13, 10, 26, 8, 4, 5, 8, 7, 10, 21, 18, 26, 15, 13, 11, 23, 22, 11, 9, 7, 4, 7, 10, 12, 15,
                11, 10, 13, 4, 15, 11, 16, 10, 9, 19, 21, 17, 26, 16, 24, 5, 10, 6, 1, 7, 13, 9, 8, 11, 4, 7, 7, 17, 15,
                3, 19, 7, 10, 14, 14, 20, 5, 18, 6, 10, 11, 24, 3, 13, 13, 27, 15, 4, 20, 2, 9, 2, 16, 6, 9, 17, 8, 4,
                13, 4, 21, 16, 12, 0, 6, 19, 3, 17, 7

        });
    }
}
