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:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.io.*;
import java.math.BigInteger;
import java.util.*;
import java.text.*;

public class cf340b {

    static BufferedReader br;
    static Scanner sc;
    static PrintWriter out;

    public static void initA() {
        try {
            br = new BufferedReader(new InputStreamReader(System.in));
            sc = new Scanner(System.in);
            out = new PrintWriter(System.out);
        } catch (Exception e) {
        }
    }

    static boolean next_permutation(Integer[] p) {
        for (int a = p.length - 2; a >= 0; --a) {
            if (p[a] < p[a + 1]) {
                for (int b = p.length - 1;; --b) {
                    if (p[b] > p[a]) {
                        int t = p[a];
                        p[a] = p[b];
                        p[b] = t;
                        for (++a, b = p.length - 1; a < b; ++a, --b) {
                            t = p[a];
                            p[a] = p[b];
                            p[b] = t;
                        }
                        return true;
                    }
                }
            }
        }
        return false;
    }

    public static String getString() {
        try {
            return br.readLine();
        } catch (Exception e) {
        }
        return "";
    }

    public static Integer getInt() {
        try {
            return Integer.parseInt(br.readLine());
        } catch (Exception e) {
        }
        return 0;
    }

    public static Integer[] getIntArr() {
        try {
            StringTokenizer temp = new StringTokenizer(br.readLine());
            int n = temp.countTokens();
            Integer temp2[] = new Integer[n];
            for (int i = 0; i < n; i++) {
                temp2[i] = Integer.parseInt(temp.nextToken());
            }
            return temp2;
        } catch (Exception e) {
        }
        return null;
    }

    public static Long[] getLongArr() {
        try {
            StringTokenizer temp = new StringTokenizer(br.readLine());
            int n = temp.countTokens();
            Long temp2[] = new Long[n];
            for (int i = 0; i < n; i++) {
                temp2[i] = Long.parseLong(temp.nextToken());
            }
            return temp2;
        } catch (Exception e) {
        }
        return null;
    }

    public static String[] getStringArr() {
        try {
            StringTokenizer temp = new StringTokenizer(br.readLine());
            int n = temp.countTokens();
            String temp2[] = new String[n];
            for (int i = 0; i < n; i++) {
                temp2[i] = (temp.nextToken());
            }
            return temp2;
        } catch (Exception e) {
        }
        return null;
    }

    public static void print(Object a) {
        out.println(a);
    }

    public static void print(String s, Object... a) {
        out.printf(s, a);
    }

    public static int nextInt() {
        return sc.nextInt();
    }

    public static double nextDouble() {
        return sc.nextDouble();
    }

    public static void main(String[] ar) {
        initA();
        solve();
        out.flush();
    }
    static double eps = 1e-15;

    static double luas(int i, int j, int k) {
        double l = ((x[i] * y[j]) + (x[j] * y[k]) + (x[k] * y[i])) - ((y[i] * x[j]) + (y[j] * x[k]) + (y[k] * x[i]));

        l /= 2;
        return Math.abs(l);
    }

    public static boolean isleft(int a, int b, int c) {
        return ((x[b] - x[a]) * (y[c] - y[a]) - (y[b] - y[a]) * (x[c] - x[a])) > 0;
    }

    static boolean isInside(double l, int i, int j, int k, int d) {
        //ijd,ikd, jkd = ijk

        // double l = ((x[i] * y[j]) + (x[j] * y[k]) + (x[k] * y[i])) - ((y[i] * x[j]) + (y[j] * x[k]) + (y[k] * x[i]));

        double l1 = luas(i, j, d);
        double l2 = luas(i, k, d);
        double l3 = luas(j, k, d);

        if (Math.abs(l1 + l2 + l3 - l) <= eps) {
            return true;
        }
        return false;
    }
    static int x[];
    static int y[];

    public static void solve() {
        int n = getInt();

        x = new int[n];
        y = new int[n];

        for (int i = 0; i < n; i++) {
            Integer xx[] = getIntArr();
            x[i] = xx[0];
            y[i] = xx[1];
        }


        double out = 0;

        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                double le = -1, ri= -1;
                for (int k = 0; k < n; k++) {
                    if(k==i || k==j){
                        continue;
                    }

                    double l = ((x[i] * y[j]) + (x[j] * y[k]) + (x[k] * y[i])) - ((y[i] * x[j]) + (y[j] * x[k]) + (y[k] * x[i]));

                    if (l < 0) {
                        l *= -1;
                    }

                    l /= 2;
                    if(isleft(i,j,k)){
                        
                //print("GARIS %d dan %d %s\n",i,j,"TITIK "+k+" DI KIRINYA");
                        le = Math.max(le,l);
                    }else{
                        
                //print("GARIS %d dan %d %s\n",i,j,"TITIK "+k+" DI KANANNYA");
                        ri = Math.max(ri,l);
                    }
                }
                //print("GARIS %d dan %d %s\n",i,j,le+" "+ri);
                if(le>0 && ri >0){
                    out = Math.max(out,le+ri);
                }
            }
        }
        print(out);


    }
}