{
TASK:sym
LANG:pascal
}
{$R-}
type data = record x,y,ind:longint; end;
var a:array[-1..10200] of data;
    c,b:array[-1..10200] of longint;
    f:data;
    q:longint;
    dx,dy,c2:double;
    jx,jy:double;
    n,i,j,br:longint;
    a3,b3,a1,b1,c3,c1,a2,b2:longint;
Procedure Qsort(l,r:longint);
var i,j,x,y:longint;
begin
   i:=l;
   j:=r;
   x:=a[(i+j) div 2].x;
   repeat
      while a[i].x<x do inc(i);
      while x<a[j].x do dec(j);
      if i<=j then
         begin
            y:=a[i].x;
            a[i].x:=a[j].x;
            a[j].x:=y;
            y:=a[i].y;
            a[i].y:=a[j].y;
            a[j].y:=y;
            y:=a[i].ind;
            a[i].ind:=a[j].ind;
            a[j].ind:=y;
            inc(i);
            dec(j);
         end;
   until i>j;
   if i<r then Qsort(i,r);
   if l<j then Qsort(l,j);
end;
Function Find(p,q:double):longint;
var l,r:longint;
begin
   l:=1;
   r:=n;
   repeat
      if a[(l+r) div 2].x>p then r:=((l+r) div 2)-1
      else if a[(l+r) div 2].x<p then l:=((l+r) div 2)+1;
   until (abs(r-l)<=2)or(a[(l+r) div 2].x=p);
   if (a[l].x<>p)and(a[l+1].x<>p)and(a[l+2].x<>p) then Find:=0
   else
      begin
         l:=(l+r) div 2;
         r:=l;
         if a[l].y = q then Find:=l
         else
            begin
               repeat
                  if a[l].y = q then inc(l);
                  if a[r].y = q then dec(r);
               until ((a[l].y<>q)and(a[r].y<>q))or(a[r].y=q)or(a[l].y=q);
               if a[l].y = q then Find:=l
               else if a[r].y = q then find:=r
               else Find:=0;
            end;

      end;

end;
begin
   readln(n);
   f.x:=100000;
   f.y:=100000;
   for i:=1 to n do
      begin
         readln(a[i].x,a[i].y);
         a[i].ind:=i;
         if (a[i].y<f.y)or((a[i].y=f.y)and(a[i].x<f.x)) then
            begin
               f.x:=a[i].x;
               f.y:=a[i].y;
               f.ind:=i;
            end;
      end;
   Qsort(1,n);
   br:=0;
   i:=n+1;
   repeat
      dec(i);
      if f.ind<>a[i].ind then
         begin
            inc(br);
            a1:=f.y-a[i].y;
            b1:=a[i].x-f.x;
            c1:=f.x*a[i].y-f.y*a[i].x;
            dx:=(f.x+a[i].x)/2;
            dy:=(f.y +a[i].y)/2;
            a2:=b1;
            b2:=-a1;
            c2:=-a2*dx - b2*dy;
            j:=0;
            b[f.ind]:=br;
            b[a[i].ind]:=br;
            c[f.ind]:=a[i].ind;
            c[a[i].ind]:=f.ind;
            repeat
               inc(j);
               if b[a[j].ind]<>br then
                  begin
                     if a2 = 0 then
                        begin
                           jX:= a[j].x;
                           jY:= 2*dy - a[j].y;
                        end
                     else if b2=0 then
                        begin
                           jX:= 2*dx-a[j].x;
                           jY:=a[j].y;
                        end
                     else
                        begin
                           a3:=b2;
                           b3:=-a2;
                           c3:=-a3*a[j].x-b3*a[j].y;
                           jY:=  (c3*a2-c2*a3) / (b2*a3-a2*b3);
                           jx:=  (-b3*jY - c3) / a3;
                           jy:=2*jy-a[j].y;
                           jx:=2*jx-a[j].x;

                        end;

                     q:=Find(jx,jy)  ;
                     if (jx=a[j].x)and(jy=a[j].y) then
                        begin
                           c[a[j].ind]:=a[j].ind;
                           b[a[j].ind]:=br;
                        end
                     else
                        begin
                     b[a[j].ind]:=br;
                     b[a[q].ind]:=br;
                     c[a[j].ind]:=a[q].ind;
                     c[a[q].ind]:=a[j].ind;
                     end;
                  end
                  else q:=1;
            until (q = 0)or(j=n);
         end;
   until (q <> 0)or(i=1);
   if q <>0 then
      begin
         for i:=1 to n-1 do write(c[i],' ');
         writeln(c[n]);
      end;

end.
