Problem: You're given the centers of three equal sides of a strictly convex tetragon. Your task is to restore the initial tetragon.

Input

The first input line contains one number T — amount of tests (1 ≤ T ≤ 5·104). Each of the following T lines contains numbers x1, y1, x2, y2, x3, y3 — coordinates of different points that are the centers of three equal sides (non-negative integer numbers, not exceeding 10).

Output

For each test output two lines. If the required tetragon exists, output in the first line YES, in the second line — four pairs of numbers — coordinates of the polygon's vertices in clockwise or counter-clockwise order. Don't forget, please, that the tetragon should be strictly convex, i.e. no 3 of its points lie on one line. Output numbers with 9 characters after a decimal point.

If the required tetragon doen't exist, output NO in the first line, and leave the second line empty.

Examples

Input

3
1 1 2 2 3 3
0 1 1 0 2 2
9 3 7 9 9 8


Output

NO

YES
3.5 1.5 0.5 2.5 -0.5 -0.5 2.5 0.5
NO

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-10;
struct point {
  double x, y;
};
struct segment {
  double a, b, c;
};
point operator+(point a, point b) { return (point){a.x + b.x, a.y + b.y}; }
point operator-(point a, point b) { return (point){a.x - b.x, a.y - b.y}; }
double operator*(point a, point b) { return a.x * b.x + a.y * b.y; }
double operator/(point a, point b) { return a.x * b.y - a.y * b.x; }
point operator*(point a, double b) { return (point){a.x * b, a.y * b}; }
point operator/(point a, double b) { return (point){a.x / b, a.y / b}; }
int T;
point I, J, K, L;
segment midline(point A, double a, double b) {
  segment line;
  line.a = b;
  line.b = -a;
  line.c = -(A.x * line.a + A.y * line.b);
  return line;
}
point getpoint(segment A, segment B) {
  point C;
  C.x = (-A.c * B.b + B.c * A.b) / (A.a * B.b - B.a * A.b);
  C.y = (-A.a * B.c + B.a * A.c) / (A.a * B.b - B.a * A.b);
  return C;
}
point mirror(point A, point B) {
  point C;
  C = A + (B - A) * 2;
  return C;
}
int zero1(double x) { return x > eps; }
int zero0(double x) { return x < -eps; }
int solve(point A, point B, point C) {
  point D, E, F, G, H;
  point IJ, JK, KL, LI;
  segment lineAC, lineBC, lineD, lineE, lineHG;
  bool ans;
  ans = false;
  lineAC = (segment){A.y - C.y, C.x - A.x, A / C};
  lineBC = (segment){B.y - C.y, C.x - B.x, B / C};
  D = (A + C) / 2;
  E = (B + C) / 2;
  lineD = midline(D, lineAC.a, lineAC.b);
  lineE = midline(E, lineBC.a, lineBC.b);
  F = getpoint(lineD, lineE);
  G = mirror(E, C);
  H = mirror(F, C);
  lineHG = (segment){H.y - G.y, G.x - H.x, H / G};
  I = getpoint(lineHG, lineD);
  J = mirror(I, C);
  K = mirror(J, B);
  L = mirror(I, A);
  IJ = J - I;
  JK = K - J;
  KL = L - K;
  LI = I - L;
  if (zero1(IJ / JK) && zero1(JK / KL) && zero1(KL / LI) && zero1(LI / IJ))
    ans = true;
  if (zero0(IJ / JK) && zero0(JK / KL) && zero0(KL / LI) && zero0(LI / IJ))
    ans = true;
  return ans;
}
void print() {
  printf("YES\n%.9lf %.9lf %.9lf %.9lf %.9lf %.9lf %.9lf %.9lf\n", I.x, I.y,
         J.x, J.y, K.x, K.y, L.x, L.y);
}
int main() {
  point A, B, C;
  scanf("%d", &T);
  while (T--) {
    scanf("%lf%lf%lf%lf%lf%lf", &A.x, &A.y, &B.x, &B.y, &C.x, &C.y);
    if (solve(A, B, C))
      print();
    else if (solve(A, C, B))
      print();
    else if (solve(B, C, A))
      print();
    else
      printf("NO\n");
  }
  return 0;
}