#include <cstdio>
#include <algorithm>
using namespace std;
struct dreapta{
int x1;
int y1;
int x2;
int y2;
};
dreapta a[1000001];
pair <int,int> v[1001],x;
int cadran (dreapta x){
if (x.y1<=x.y2)
return 1;
return 2;
}
pair <int,int> sin (dreapta x){
if (x.y1<=x.y2)
return make_pair( (x.y2-x.y1) * (x.y2-x.y1) , (x.y2-x.y1) * (x.y2-x.y1) + (x.x2-x.x1) * (x.x2-x.x1) );
return make_pair ( (x.y2-x.y1) * (x.y2-x.y1) , (x.y2-x.y1) * (x.y2-x.y1) + (x.x2-x.x1) * (x.x2-x.x1) );
}
int cmp (dreapta x , dreapta y){
pair <long long,long long> xx,yy;
//printf ("%d %d %d %d\n",x.x1,x.y1,x.x2,x.y2);
//printf ("%d %d %d %d\n",y.x1,y.y1,y.x2,y.y2);
xx=sin(x);
yy=sin(y);
if (cadran(x)!=cadran(y))
return cadran(x)<cadran(y);
return (xx.first*yy.second) < (xx.second * yy.first);
}
int same (int i,int j){
pair <long long,long long> x,y;
x=sin(a[i]);
y=sin(a[j]);
return ((x.first*y.second) == (x.second * y.first) && cadran(a[i])==cadran(a[j]));
}
int main()
{
FILE *fin=fopen ("trapez.in","r");
FILE *fout=fopen ("trapez.out","w");
int n,i,j,m;
long long sol,l;
fscanf (fin,"%d",&n);
for (i=1;i<=n;i++)
fscanf (fin,"%d%d",&v[i].first,&v[i].second);
sort (v+1,v+n+1);
m=0;
for (i=1;i<=n;i++){
for (j=i+1;j<=n;j++){
a[++m].x1=v[i].first;
a[m].y1=v[i].second;
a[m].x2=v[j].first;
a[m].y2=v[j].second;
}
}
// in a am toate segmentele
// le sortez dupa cadran, si in caz de egalitate, dupa unghiul cu ox
sort (a+1,a+m+1,cmp);
//for (i=1;i<=m;i++){
// x=sin(a[i]);
//printf ("%d %d %d %d %d %d\n",a[i].x1,a[i].y1,a[i].x2,a[i].y2,x.first,x.second);
//}
l=0;
sol=0;
for (i=1;i<=m;i++){
if (i==1 || same(i,i-1)==0){
sol=sol+ l*(l-1)/2;
l=1;
}
else if (same (i,i-1))
l++;
}
sol=sol+ l*(l-1)/2;
fprintf (fout,"%lld",sol);
return 0;
}