Problem: Ksusha is a vigorous mathematician. She is keen on absolutely incredible mathematical riddles. 

Today Ksusha came across a convex polygon of non-zero area. She is now wondering: if she chooses a pair of distinct points uniformly among all integer points (points with integer coordinates) inside or on the border of the polygon and then draws a square with two opposite vertices lying in the chosen points, what will the expectation of this square's area be?

A pair of distinct points is chosen uniformly among all pairs of distinct points, located inside or on the border of the polygon. Pairs of points p, q (p ≠ q) and q, p are considered the same.

Help Ksusha! Count the required expectation.

Input

The first line contains integer n (3 ≤ n ≤ 105) — the number of vertices of Ksusha's convex polygon. Next n lines contain the coordinates of the polygon vertices in clockwise or counterclockwise order. The i-th line contains integers xi, yi (|xi|, |yi| ≤ 106) — the coordinates of the vertex that goes i-th in that order.

Output

Print a single real number — the required expected area. 

The answer will be considered correct if its absolute and relative error doesn't exceed 10 - 6.

Examples

Input

3
0 0
5 5
5 0


Output

4.6666666667


Input

4
-1 3
4 5
6 2
3 -5


Output

8.1583333333


Input

3
17 136
859 937
16 641


Output

66811.3704155169

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
int N;
long double ans;
pair<int, int> Point[100005];
long double Number[2000005];
long double Partial[2000005], cnt = 0;
const int add = 1000000;
vector<long double> Ox[2000005];
void Read() {
  cin >> N;
  for (int i = 1; i <= N; i++) cin >> Point[i].first >> Point[i].second;
}
void Coef(long double& A, long double& B, long double& C,
          pair<long double, long double> p1,
          pair<long double, long double> p2) {
  A = p1.second - p2.second;
  B = p2.first - p1.first;
  C = -A * p1.first - B * p1.second;
}
void precalcRange() {
  Point[N + 1] = Point[1];
  for (int i = 1; i <= N; i++) {
    int left = Point[i].first, right = Point[i + 1].first;
    if (left > right) swap(left, right);
    if (left == right) {
      Ox[left + add].push_back((long double)Point[i].second);
      Ox[left + add].push_back((long double)Point[i + 1].second);
      continue;
    }
    for (int j = left; j <= right; j++) {
      long double A, B, C;
      Coef(A, B, C, Point[i], Point[i + 1]);
      long double Y = (-C - A * j) / (B);
      Ox[j + add].push_back(Y);
    }
  }
  for (int x = -1000000; x <= 1000000; x++) {
    if (Ox[x + add].size() == 0) continue;
    long double Min = Ox[x + add][0], Max = Min;
    for (int i = 1; i < Ox[x + add].size(); i++) {
      Min = min(Min, Ox[x + add][i]);
      Max = max(Max, Ox[x + add][i]);
    }
    if (floor(Max) < ceil(Min)) continue;
    Number[x + add] = floor(Max) - ceil(Min) + 1;
  }
}
void Solve() {
  long double sum = Number[0], curr = Number[0], last = Number[0];
  Partial[0] = 2.0 * Number[0];
  cnt = 0;
  cnt += Number[0];
  for (int i = -1000000 + 1; i <= 1000000; i++) {
    cnt += Number[i + add];
    if (i == 0) {
      int d;
      d = 0;
    }
    Partial[i + add] = 2.0 * Number[i + add];
    ans += Number[i + add] * last;
    if (i + add > 0) Partial[i + add] += Partial[i + add - 1];
    sum += Partial[i + add] - Number[i + add];
    last += sum;
  }
}
int main() {
  Read();
  precalcRange();
  Solve();
  for (int i = 1; i <= N; i++) swap(Point[i].first, Point[i].second);
  for (int i = 0; i <= add * 2; i++) {
    Partial[i] = Number[i] = 0.0;
    Ox[i].clear();
  }
  precalcRange();
  Solve();
  cout << fixed << setprecision(15) << ans / ((cnt) * (cnt - 1));
  return 0;
}