
/*
TASK: sym
LANG: C
*/

#include<stdio.h>
#include<math.h>

#define MAXN 16768

int isntright(int ,int ,int );
int found(int ,int );
void swiftc(int, int );
void swiftp(int, int );
int try1();
int try2();
int try3();
int try4();

typedef struct {
                int a,b,n,used;
                } points;

typedef struct {
                int a,b;
                double angle;
                } convex_hull;
                

points point[MAXN],tmp;
convex_hull conv[MAXN],t,q[MAXN];
int sym[MAXN];
int i,j,n,min=0;
int a,b,k=2;
int x,y;
int a1,b1,a2,b2;

int main () {
//        freopen("TEST.TXT","rt",stdin);
        scanf("%d",&n);
        for (i=0;i<n;i++) {
                scanf("%d %d",&a,&b);
                conv[i].a=a;
                conv[i].b=b;
                if (conv[i].b<conv[min].b) min=i;
                else if (conv[i].b==conv[min].b&&conv[i].a<conv[min].a) min=i;
                point[i+1].a=a;
                point[i+1].b=b;
                point[i+1].n=i+1;
                point[i+1].used=0;
                }
        t=conv[min];
        conv[min]=conv[0];
        conv[0]=t;
        for (i=1;i<n;i++)
            conv[i].angle = atan2((double)(conv[i].b-conv[0].b),(double)(conv[i].a-conv[0].a));
        n-=1;
        for (i=n/2;i>0;i--)
                swiftc(i,n);
        for (i=1;i<n;i++) {
                t=conv[1];
                conv[1]=conv[n-i+1];
                conv[n-i+1]=t;
                swiftc(1,n-i);
                }
        n+=1;
        for (i=n/2;i>0;i--)
                swiftp(i,n);
        for (i=1;i<n;i++) {
                tmp=point[1];
                point[1]=point[n-i+1];
                point[n-i+1]=tmp;
                swiftp(1,n-i);
                }

        q[0]=conv[0];
        q[1]=conv[1];
        for (i=2;i<n;i++) {
                q[k++]=conv[i];
                while (k>2&&isntright(k-3,k-2,k-1)) {q[k-2]=q[k-1];k--;}
                }
        q[k]=q[0];
///do tuk e vjarno
        for (i=0;i<=k;i++) {
                a1=q[i].a;
                b1=q[i].b;
                a2=q[i+1].a;
                b2=q[i+1].b;
                if (a1<a2&&b1<b2||a1>a2&&b1>b2) {
                        for (j=1;j<=n;j++)
                                if (point[j].used) point[j].used=0;
                                else if (!try1()) break;
                        }
                else if (a1<a2&&b1>b2||a1>a2&&b1<b2) {
                        for (j=1;j<=n;j++)
                                if (point[j].used) point[j].used=0;
                                else if (!try2()) break;
                        }
                else if (a1==a2) {
                        for (j=1;j<=n;j++)
                                if (point[j].used) point[j].used=0;
                                else if (!try3()) break;
                        }
                else if (b1==b2) {
                        for (j=1;j<=n;j++)
                                if (point[j].used) point[j].used=0;
                                else if (!try4()) break;
                        }
                if (j>n) break;
                }
        if (i>k) {printf("0\n");return 0;}

        if (a1<a2&&b1<b2||a1>a2&&b1>b2) {
                for (j=1;j<=n;j++)
                        if (!point[j].used) try1();
                }
        else if (a1<a2&&b1>b2||a1>a2&&b1<b2) {
                for (j=1;j<=n;j++)
                        if (!point[j].used) try2();
                }
        else if (a1==a2) {
                for (j=1;j<=n;j++)
                        if (!point[j].used) try3();
                }
        else if (b1==b2) {
                for (j=1;j<=n;j++)
                        if (!point[j].used) try4();
                }
        for (i=1;i<=n;i++)
        if (point[i].used) {
                        a1=point[i].n;
                        a2=point[point[i].used].n;
                        sym[a1]=a2;
                        sym[a2]=a1;
                        }
        for (i=1;i<n;i++)
                printf("%d ",sym[i]);
        printf("%d\n",sym[i]);
        return 0;
        }

void swiftc(int o, int r) {
        convex_hull x=conv[o];
        int p=o<<1;
        while (p<=r) {
                if (p<r)
                        if (conv[p].angle<conv[p+1].angle) p++;
                        else if (conv[p].angle==conv[p+1].angle&&abs(conv[0].a-conv[p].a)<abs(conv[0].a-conv[p+1].a)) p++;
                if (conv[p].angle<x.angle) break;
                else if (conv[p].angle==x.angle&&abs(conv[0].a-conv[p].a)<abs(conv[0].a-x.a)) p++;
                conv[o]=conv[p];
                o=p;
                p<<=1;
                }
        conv[o]=x;
        return ;
        }
        
void swiftp(int o, int r) {
        points x=point[o];
        int p=o<<1;
        while (p<=r) {
                if (p<r)
                        if (point[p].a<point[p+1].a) p++;
                        else if (point[p].a==point[p+1].a)
                                if (point[p].b<point[p+1].b) p++;
                if (point[p].a<x.a) break;
                else if (point[p].a==x.a)
                        if (point[p].b<x.b) break;
                point[o]=point[p];
                o=p;p<<=1;
                }
        point[o]=x;
        return ;
        }
        
int isntright(int x,int y,int z) {
        int det;
        det=q[x].a*q[y].b+q[x].b*q[z].a+q[y].a*q[z].b-q[z].a*q[y].b-q[z].b*q[x].a-q[y].a*q[x].b;
        if (det<=0) return 1;
        else return 0;
        }
        
int found(int x,int y) {
        int l=1,r=n,mid;
        while (l<=r) {
                mid=(l+r)/2;
                if (point[mid].a<x) l=mid+1;
                else if (point[mid].a==x) {
                                                if (point[mid].b<y) l=mid+1;
                                                else if (point[mid].b==y) {point[mid].used=j;return 1;}
                                                else r=mid-1;
                                                }
                else r=mid-1;
                }
        return 0;
        }

int try1() {
        x=a2+b1-point[j].b;
        y=b2+a1-point[j].a;
        if (found(x,y)) return 1;
        return 0;
        }
        
int try2() {
        x=a2+b1-point[j].b;
        y=b2+point[j].a-a1;
        if (found(x,y)) return 1;
        return 0;
        }
        
int try3() {
        x=point[j].a;
        y=b2+b1-point[j].b;
        if (found(x,y)) return 1;
        return 0;
        }

int try4() {
        x=a2+a1-point[j].a;
        y=point[j].b;
        if (found(x,y)) return 1;
        return 0;
        }

