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 JAVA):

Solution:

import java.io.*;
import java.util.*;

public class B198{      
        
        private BufferedReader in;  
        private StringTokenizer st;
        private PrintWriter out;
        
        
        int ccw(point p1,point p2,point p3){
            
            return (p2.x - p1.x)*(p3.y - p1.y) - (p2.y - p1.y)*(p3.x - p1.x);
        }

        
        void solve() throws IOException{
            
            int n = nextInt();
            point[]pts = new point[n];
            for (int i = 0; i < pts.length; i++) {
                pts[i] = new point(nextInt(),nextInt());
            }
            int max = 0;
            for (int i = 0; i < pts.length; i++) {
                for (int j = i+1; j < pts.length; j++) {
                    
                    int pos = 0, neg = 0;
                    for (int k = 0; k < pts.length; k++) {
                        if(k == i || k == j) continue;
                        int val = ccw(pts[i],pts[j],pts[k]);
                        if(val < 0) neg = Math.max(neg, -val);
                        else pos = Math.max(pos, val);
                    }
                    if(pos != 0 && neg != 0)
                        max = Math.max(max, pos + neg);
                }
            }
            out.println(max/2.0);
        
                    
        }
            

        B198() throws IOException {
            in = new BufferedReader(new InputStreamReader(System.in));  
            out = new PrintWriter(System.out);
            eat("");
            solve();    
            out.close();
        }

        private void eat(String str) {
            st = new StringTokenizer(str);
        }

        String next() throws IOException {
            while (!st.hasMoreTokens()) {
                String line = in.readLine();                
                if (line == null) {                 
                    return null;
                }
                eat(line);
            }
            return st.nextToken();
        }

        int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        double nextDouble() throws IOException {
            return Double.parseDouble(next());
        }

        public static void main(String[] args) throws IOException {
            new B198();
        }

        int gcd(int a,int b){
            if(b>a) return gcd(b,a);
            if(b==0) return a;
            return gcd(b,a%b);
        }

}
class point{
    
    int x,y;
    public point(){};
    public point(int x , int y){
        this.x = x;
        this.y = y;
    }
}