import java.util.function.BiFunction

class TriangleOverlap {
    private static class Pair {
        double first
        double second

        Pair(double first, double second) {
            this.first = first
            this.second = second
        }

        @Override
        String toString() {
            return String.format("(%s,%s)", first, second)
        }
    }

    private static class Triangle {
        Pair p1, p2, p3

        Triangle(Pair p1, Pair p2, Pair p3) {
            this.p1 = p1
            this.p2 = p2
            this.p3 = p3
        }

        @Override
        String toString() {
            return String.format("Triangle:%s,%s,%s", p1, p2, p3)
        }
    }

    private static double det2D(Triangle t) {
        Pair p1 = t.p1
        Pair p2 = t.p2
        Pair p3 = t.p3
        return p1.first * (p2.second - p3.second) + p2.first * (p3.second - p1.second) + p3.first * (p1.second - p2.second)
    }

    private static void checkTriWinding(Triangle t, boolean allowReversed) {
        double detTri = det2D(t)
        if (detTri < 0.0) {
            if (allowReversed) {
                Pair a = t.p3
                t.p3 = t.p2
                t.p2 = a
            } else throw new RuntimeException("Triangle has wrong winding direction")
        }
    }

    private static boolean boundaryCollideChk(Triangle t, double eps) {
        return det2D(t) < eps
    }

    private static boolean boundaryDoesntCollideChk(Triangle t, double eps) {
        return det2D(t) <= eps
    }

    private static boolean triTri2D(Triangle t1, Triangle t2) {
        return triTri2D(t1, t2, 0.0, false, true)
    }

    private static boolean triTri2D(Triangle t1, Triangle t2, double eps, boolean allowedReversed) {
        return triTri2D(t1, t2, eps, allowedReversed, true)
    }

    private static boolean triTri2D(Triangle t1, Triangle t2, double eps, boolean allowedReversed, boolean onBoundary) {