#include <iostream>

using namespace std;

int podskup(int N){
    if(N==0){
        return 0;
    }
    int P=1;
    for(int j=0;j<N;j++){
        P*=2;
    }
    return (P-1);
}

int podskup1(int N){
    if(N==0){
        return 0;
    }
    int P=1;
    for(int j=0;j<N;j++){
        P*=2;
    }
    return P;
}

int podskup2(int N){
    int P=1;
    for(int j=0;j<N;j++){
        P*=2;
    }
    return P;
}

int main()
{
    long int N;
    cin >> N;
    long int x[N],y[N];
    int GoreDesno=0,DoleDesno=0,GoreLevo=0,DoleLevo=0;
    for(int k=0;k<N;k++){
        cin >> x[k] >> y[k];
        if(x[k]>0){
            if(y[k]>0){
                GoreDesno++;
            }else{
                DoleDesno++;
            }
        }else{
            if(y[k]>0){
                GoreLevo++;
            }else{
                DoleLevo++;
            }
        }
    }
    if(N<3){
        cout << "0";
        return 0;
    }else if(N==3){
        if((GoreDesno!=2 && GoreLevo!=2 && DoleDesno!=2 && DoleLevo!=2) && GoreDesno!=3 && GoreLevo!=3 && DoleDesno!=3 && DoleLevo!=3){
            cout << "1";
            return 0;
        }else{
            if((GoreDesno==2 && DoleLevo==0) || (GoreDesno==0 && DoleLevo==2) || (DoleDesno==2 && GoreLevo==0) || (DoleDesno==0 && GoreLevo==2)){
                cout << "00";
                return 0;
            }
            bool negativnoy=false,pozitivnoy=false;
            for(int i=0;i<N;i++){
                for(int j=0;j<N;j++){
                    float kf1=(y[i]-y[j]);
                    float kf2=(x[i]-x[j]);
                    if(y[i]>(kf1/kf2)*x[i]){
                        pozitivnoy=true;
                    }else if(y[i]<(kf1/kf2)*x[i]){
                        negativnoy=true;
                    }
                }
            }
            if(pozitivnoy && negativnoy){
                cout << "1";
                return 0;
            }else{
                cout << "0";
                return 0;
            }

        }
    }
    if(GoreDesno==N || GoreLevo==N || DoleDesno==N || DoleLevo==N){
        cout << "0";
        return 0;
    }
    long long int Cetri;
    Cetri=podskup(GoreDesno)*podskup(GoreLevo)*podskup(DoleDesno)*podskup(DoleLevo);
    //===============
    int iznady=0,ispody=0,iznadx=0,ispodx=0;
    for(int k=0;k<N;k++){
        if(x[k]>0&&y[k]>0){
            for(int i=0;i<N;i++){
                if(x[i]<=0&&y[i]<=0){
                    float kf1=(y[k]-y[i]);
                    float kf2=(x[k]-x[i]);
                    if(y[k]>kf1/kf2*x[k]){
                        iznady++;
                    }else if(y[k]<kf1/kf2*x[k]){
                        ispody++;
                    }
                }
            }
        }else if(x[k]<=0&&y[k]>0){
            for(int i=0;i<N;i++){
                if(x[i]>0&&y[i]<=0){
                    float kf1=(y[k]-y[i]);
                    float kf2=(x[k]-x[i]);
                    if(y[k]>(kf1/kf2)*x[k]){
                        iznadx++;
                    }else if(y[k]<(kf1/kf2)*x[k]){
                        ispodx++;
                    }
                }
            }
        }
    }
    long long int tri;
    tri=iznady*podskup1(DoleDesno)*podskup1(GoreDesno-1)*podskup1(DoleLevo-1)+ispody*podskup1(GoreLevo)*podskup1(GoreDesno-1)*podskup1(DoleLevo-1)+iznadx*podskup1(DoleLevo)*podskup1(DoleDesno-1)*podskup1(GoreLevo-1)+ispodx*podskup1(GoreDesno)*podskup1(DoleDesno-1)*podskup1(GoreLevo-1);
    long long int dva;
    dva = iznadx*podskup2(DoleDesno-2)*ispodx*podskup2(GoreLevo-2)+iznady*podskup2(GoreDesno-2)*ispody*podskup2(DoleLevo-2);
    long long int Konacan=Cetri+tri+dva;
    Konacan=Konacan%1000000007;
    cout << Konacan;
    return 0;
}