Problem: For a vector \vec{v} = (x, y), define |v| = √{x^2 + y^2}.

Allen had a bit too much to drink at the bar, which is at the origin. There are n vectors \vec{v_1}, \vec{v_2}, ⋅⋅⋅, \vec{v_n}. Allen will make n moves. As Allen's sense of direction is impaired, during the i-th move he will either move in the direction \vec{v_i} or -\vec{v_i}. In other words, if his position is currently p = (x, y), he will either move to p + \vec{v_i} or p - \vec{v_i}.

Allen doesn't want to wander too far from home (which happens to also be the bar). You need to help him figure out a sequence of moves (a sequence of signs for the vectors) such that his final position p satisfies |p| ≤ 1.5 ⋅ 10^6 so that he can stay safe.

Input

The first line contains a single integer n (1 ≤ n ≤ 10^5) — the number of moves.

Each of the following lines contains two space-separated integers x_i and y_i, meaning that \vec{v_i} = (x_i, y_i). We have that |v_i| ≤ 10^6 for all i.

Output

Output a single line containing n integers c_1, c_2, ⋅⋅⋅, c_n, each of which is either 1 or -1. Your solution is correct if the value of p = ∑_{i = 1}^n c_i \vec{v_i}, satisfies |p| ≤ 1.5 ⋅ 10^6.

It can be shown that a solution always exists under the given constraints.

Examples

Input

3
999999 0
0 999999
999999 0


Output

1 1 -1 


Input

1
-824590 246031


Output

1 


Input

8
-67761 603277
640586 -396671
46147 -122580
569609 -2112
400 914208
131792 309779
-850150 -486293
5272 721899


Output

1 1 1 1 1 1 1 -1 

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
template <typename T>
struct outputer;
struct outputable {};
template <typename T>
inline auto sqr(T x) -> decltype(x * x) {
  return x * x;
}
template <typename T1, typename T2>
inline bool umx(T1& a, T2 b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2>
inline bool umn(T1& a, T2 b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
const int N = 100000;
const int64_t X = 1000000;
struct Input {
  int n;
  int64_t x[N], y[N];
  bool read() {
    if (!(cin >> n)) {
      return 0;
    }
    for (int i = int(0); i < int(n); ++i) {
      scanf("%" SCNd64 "%" SCNd64, &x[i], &y[i]);
    }
    return 1;
  }
  void init(const Input& input) { *this = input; }
};
struct Data : Input {
  int ans[N];
  void write() {
    for (int i = int(0); i < int(n); ++i) {
      if (i) {
        printf(" ");
      }
      printf("%d", ans[i]);
    }
    puts("");
  }
};
namespace Main {
struct Solution : Data {
  int64_t xx[2 * N], yy[2 * N];
  int p1[2 * N], p2[2 * N];
  int s1[2 * N], s2[2 * N];
  void rec(int i, int sgn) {
    ;
    if (i < n) {
      ans[i] = sgn;
      return;
    }
    rec(p1[i], sgn * s1[i]);
    rec(p2[i], sgn * s2[i]);
  }
  void solve() {
    for (int i = int(0); i < int(n); ++i) {
      xx[i] = x[i];
      yy[i] = y[i];
    }
    int cnt = n;
    vector<int> num;
    for (int i = int(0); i < int(n); ++i) {
      num.emplace_back(i);
      if (((int)(num).size()) < 3) {
        continue;
      };
      bool ok = 0;
      for (int i1 = int(0); i1 < int(((int)(num).size())); ++i1) {
        if (ok) {
          break;
        }
        for (int i2 = int(0); i2 < int(i1); ++i2) {
          if (ok) {
            break;
          }
          for (int sgn : {-1, 1}) {
            if (ok) {
              break;
            }
            int64_t xxx = xx[num[i1]] + sgn * xx[num[i2]];
            int64_t yyy = yy[num[i1]] + sgn * yy[num[i2]];
            if (sqr(xxx) + sqr(yyy) <= sqr(X)) {
              ;
              ok = 1;
              xx[cnt] = xxx;
              yy[cnt] = yyy;
              p1[cnt] = num[i1];
              p2[cnt] = num[i2];
              s1[cnt] = 1;
              s2[cnt] = sgn;
              num.erase(find((num).begin(), (num).end(), p1[cnt]));
              num.erase(find((num).begin(), (num).end(), p2[cnt]));
              num.emplace_back(cnt);
              ++cnt;
              ;
            }
          }
        }
      };
      assert(ok);
    }
    if (((int)(num).size()) > 1) {
      ;
      bool ok = 0;
      int i1 = 0;
      int i2 = 1;
      for (int sgn : {-1, 1}) {
        if (ok) {
          break;
        }
        int64_t xxx = xx[num[i1]] + sgn * xx[num[i2]];
        int64_t yyy = yy[num[i1]] + sgn * yy[num[i2]];
        if (sqr(xxx) + sqr(yyy) <= 2 * sqr(X)) {
          ;
          ok = 1;
          xx[cnt] = xxx;
          yy[cnt] = yyy;
          p1[cnt] = num[i1];
          p2[cnt] = num[i2];
          s1[cnt] = 1;
          s2[cnt] = sgn;
          ;
          ;
          ;
          num.erase(find((num).begin(), (num).end(), p1[cnt]));
          ;
          num.erase(find((num).begin(), (num).end(), p2[cnt]));
          ;
          num.emplace_back(cnt);
          ++cnt;
          ;
        }
      }
      assert(ok);
    };
    ;
    ;
    rec(cnt - 1, 1);
  }
  void clear() { *this = Solution(); }
};
}  // namespace Main
Main::Solution sol;
int main() {
  cout.setf(ios::showpoint | ios::fixed);
  cout.precision(20);
  sol.read();
  sol.solve();
  sol.write();
  return 0;
}