#include <bits/stdc++.h>
int f[100000];
int cnt;
int ans[8];
int a, b, c;
struct point {
  double x, y;
} p[8];
int st[8];
double xmult(point p1, point p2, point p0) {
  return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
}
double dmult(point p1, point p2, point p0) {
  return (p1.x - p0.x) * (p2.x - p0.x) + (p1.y - p0.y) * (p2.y - p0.y);
}
double max(double a, double b) { return a > b ? a : b; }
bool cmp(const point &a, const point &b) {
  if (a.y == b.y) return a.x < b.x;
  return a.y < b.y;
}
double dist(point p1, point p2) {
  return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
}
bool zero(double x) { return x > 0 ? x < 1e-8 : x > -1e-8; }
bool isrect(point p1, point p2, point p3, point p4) {
  return zero(dist(p1, p2) - dist(p3, p4)) &&
         zero(dist(p1, p4) - dist(p3, p2)) && zero(dmult(p3, p1, p2));
}
bool issqure(point p1, point p2, point p3, point p4) {
  return zero(dist(p1, p2) - dist(p3, p4)) &&
         zero(dist(p1, p4) - dist(p3, p2)) && zero(dmult(p3, p1, p2)) &&
         zero(dist(p2, p3) - dist(p3, p4));
}
int main() {
  int n, m, i, j, k, h;
  n = 8;
  for (i = 0; i < n; i++) scanf("%lf %lf", &p[i].x, &p[i].y);
  bool isok = false;
  int a1, a2, a3, a4;
  for (i = 0; i < 8 && !isok; i++) {
    for (j = i + 1; j < 8 && !isok; j++) {
      for (k = j + 1; k < 8 && !isok; k++) {
        for (h = k + 1; h < 8 && !isok; h++) {
          if (issqure(p[i], p[j], p[k], p[h]) ||
              issqure(p[i], p[j], p[h], p[k]) ||
              issqure(p[i], p[k], p[j], p[h]) ||
              issqure(p[i], p[k], p[h], p[j]) ||
              issqure(p[i], p[h], p[j], p[k]) ||
              issqure(p[i], p[h], p[k], p[j])) {
            a1 = i, a2 = j, a3 = k, a4 = h;
            st[i] = st[j] = st[k] = st[h] = 1;
            point temp[8];
            int cnt = 0;
            int q;
            for (q = 0; q < 8; q++)
              if (st[q] == 0) ans[cnt++] = q;
            if (isrect(p[ans[0]], p[ans[1]], p[ans[2]], p[ans[3]]) ||
                isrect(p[ans[0]], p[ans[1]], p[ans[3]], p[ans[2]]) ||
                isrect(p[ans[0]], p[ans[2]], p[ans[1]], p[ans[3]]) ||
                isrect(p[ans[0]], p[ans[2]], p[ans[3]], p[ans[1]]) ||
                isrect(p[ans[0]], p[ans[3]], p[ans[1]], p[ans[2]]) ||
                isrect(p[ans[0]], p[ans[3]], p[ans[2]], p[ans[1]])) {
              isok = true;
              break;
            }
            st[i] = st[j] = st[k] = st[h] = 0;
          }
        }
      }
    }
  }
  if (isok) {
    printf("YES\n");
    printf("%d %d %d %d\n", a1 + 1, a2 + 1, a3 + 1, a4 + 1);
    printf("%d %d %d %d\n", ans[0] + 1, ans[1] + 1, ans[2] + 1, ans[3] + 1);
  } else
    printf("NO\n");
  return 0;
}
