Problem: Iahub has drawn a set of n points in the cartesian plane which he calls "special points". A quadrilateral is a simple polygon without self-intersections with four sides (also called edges) and four vertices (also called corners). Please note that a quadrilateral doesn't have to be convex. A special quadrilateral is one which has all four vertices in the set of special points. Given the set of special points, please calculate the maximal area of a special quadrilateral. 

Input

The first line contains integer n (4 ≤ n ≤ 300). Each of the next n lines contains two integers: xi, yi ( - 1000 ≤ xi, yi ≤ 1000) — the cartesian coordinates of ith special point. It is guaranteed that no three points are on the same line. It is guaranteed that no two points coincide. 

Output

Output a single real number — the maximal area of a special quadrilateral. The answer will be considered correct if its absolute or relative error does't exceed 10 - 9.

Examples

Input

5
0 0
0 4
4 0
4 4
2 3


Output

16.000000

Note

In the test example we can choose first 4 points to be the vertices of the quadrilateral. They form a square by side 4, so the area is 4·4 = 16.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
struct point {
  int x, y;
  point() { x = y = 0; }
  point(int _x, int _y) : x(_x), y(_y) {}
};
inline int area(point &p1, point &p2, point &p3) {
  int result = 0, x1, y1, x2, y2;
  result += p1.x * p2.y + p2.x * p3.y + p3.x * p1.y;
  result -= p1.y * p2.x + p2.y * p3.x + p3.y * p1.x;
  return abs(result);
}
inline int orientation(point &p1, point &p2, point &p3) {
  int val = (p2.y - p1.y) * (p3.x - p2.x) - (p2.x - p1.x) * (p3.y - p2.y);
  if (val == 0) return 0;
  return (val > 0) ? 1 : -1;
}
int main() {
  ios_base::sync_with_stdio(false);
  int n;
  cin >> n;
  vector<point> v(n);
  int temp, temp2;
  for (temp = 0; temp < n; temp++) {
    v[temp].x += 1000;
    v[temp].y += 1000;
    cin >> v[temp].x >> v[temp].y;
  }
  int mx = 0;
  int temp3;
  for (temp = 0; temp < n; temp++)
    for (temp2 = temp + 1; temp2 < n; temp2++) {
      int best[2];
      memset(best, -1, sizeof(best));
      for (temp3 = 0; temp3 < n; temp3++) {
        int ori = orientation(v[temp], v[temp3], v[temp2]);
        int luas = area(v[temp], v[temp2], v[temp3]);
        if (ori < 0)
          best[0] = max(best[0], luas);
        else if (ori > 0)
          best[1] = max(best[1], luas);
      }
      if (best[0] == -1 || best[1] == -1) continue;
      mx = max(mx, best[0] + best[1]);
    }
  cout << fixed << setprecision(9) << 1.0 * mx / 2 << "\n";
}