#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<math.h>
#include<algorithm>
#include<vector>

using namespace std;

    double abs(double xx)
    {
            if(xx<0) return -xx;
            return xx;
    }

    struct tacka
    {
        double x,y;
        double fi;
        bool operator <(tacka xx)const
        {
            if(abs(fi-xx.fi)<0.0000001) { if(x<xx.x) return 1; if(x>xx.x) return 0; return y<xx.y; }
            if(fi<xx.fi) return 1;
            if(fi>xx.fi) return 0;

        }

    };


    int n;
    FILE *f, *g;
    tacka a[2001];
    tacka v[4011];//sadrzi convex hull

    double p(tacka a, tacka b, tacka c)
    {
        b.x-=a.x; b.y-=a.y;
        c.x-=a.x; c.y-=a.y;
        return abs((b.x*c.y-c.x*b.y)/2);
    }

    double best(tacka a, tacka b, int l, int d)//trougao najvece povrsine izmedju l i d, u v
    {
        if(l>d) return 0;
        double bestr = 0;
        int l1 = l, d1 = d;
        int m;
        double result;
        double r1, r2;

        while(l1<=d1)
        {
            m = (l1+d1)/2;
            result = p(a,b,v[m]);
            if(result>bestr) { bestr = result; }
            //sada treba vidjeti u kom smeru treba ici
            bool desno = 0;//ko da je desno veca vrednost od ove
            if(m==l1) { desno = 1; l1 = m+1; }//onda mora desno
            else if(m==d1) { desno = 0; d1 = m-1; }
            else
            {
            //inace ima jos prostora za manevrisanje,tj moze i levo i desno
                r1 = p(a,b,v[m+1]);
                r2 = p(a,b,v[m-1]);
                if(r1>r2) { l1 = m+1; }
                else d1 = m-1;
            }

        }

        return bestr;
    }

    int main()
    {
        f = fopen("farmeri.in","r");
        g = fopen("fameri.out","w");

        fscanf(f,"%d",&n);

        double minx = 2000000, miny=2000000;

        for(int i = 1; i <= n; i++)
        {
             fscanf(f,"%lf %lf",&a[i].x,&a[i].y);
             if(a[i].x<minx||(a[i].x==minx&&a[i].y<miny)) { minx = a[i].x; miny = a[i].y; }
             //a[i].fi = atan2(a[i].y,a[i].x);

        }

        //for(int i = 1; i <= n; i++) printf("%lf %lf\n",a[i].x, a[i].y);

        for(int i = 1; i <= n; i++)
        {
            a[i].x-=minx;
            a[i].y-=miny;
            a[i].fi = atan2(a[i].y,a[i].x);
        }

        sort(&a[1],&a[n+1]);

        //for(int i = 1; i <= n; i++) printf("%lf %lf\n",a[i].x, a[i].y);

        int t = 0;//br elemenata unutar omotaca

        for(int i = 1; i <= n; i++)
        {
            while(t>1&&((v[t-1].x-v[t].x)*(a[i].y-v[t].y)-(a[i].x-v[t].x)*(v[t-1].y-v[t].y)>0)) { t--; }
            t++; v[t] = a[i];
                // for(int j = 1; j <= t; j++) printf("%lf,%lf ",v[j].x, v[j].y); printf("\n");
        }

       // for(int i = 1; i <= t; i++) printf("%lf %lf\n",v[i].x, v[i].y);

        for(int i = t+1; i <= 2*t; i++)
        {
            v[i] = v[i-t];
        }//dupliranje niza

        if(t==3) { fprintf(g,"%.3lf\n",p(v[1],v[2],v[3])); return 0; }

        double bestr = 0;
        double result = 0;

        for(int i = 1; i <= t; i++)
        {
                for(int j = i+1; j <= t; j++)
                {
                    result = best(v[i], v[j], i+1, j-1) + best(v[i],v[j], j+1, t+i-1);
                    if(result > bestr) bestr = result;
                }
        }

        fprintf(g,"%.3lf\n", bestr);

    }
