This time our child has a simple polygon. He has to find the number of ways to split the polygon into non-degenerate triangles, each way must satisfy the following requirements:

  * each vertex of each triangle is one of the polygon vertex; 
  * each side of the polygon must be the side of exactly one triangle; 
  * the area of intersection of every two triangles equals to zero, and the sum of all areas of triangles equals to the area of the polygon; 
  * each triangle must be completely inside the polygon; 
  * each side of each triangle must contain exactly two vertices of the polygon. 



The picture below depicts an example of a correct splitting.

<image>

Please, help the child. Calculate the described number of ways modulo 1000000007 (109 + 7) for him.

Input

The first line contains one integer n (3 ≤ n ≤ 200) — the number of vertices of the polygon. Then follow n lines, each line containing two integers. The i-th line contains xi, yi (|xi|, |yi| ≤ 107) — the i-th vertex of the polygon in clockwise or counterclockwise order.

It's guaranteed that the polygon is simple.

Output

Output the number of ways modulo 1000000007 (109 + 7).

Examples

Input

4
0 0
0 1
1 1
1 0


Output

2


Input

4
0 0
1 0
0 1
-1 0


Output

1


Input

5
0 0
1 0
1 1
0 1
-2 -1


Output

3

Note

In the first sample, there are two possible splittings:

<image>

In the second sample, there are only one possible splitting:

<image>
#include <bits/stdc++.h>
using namespace std;
const int MD = 1000000007;
struct Point {
  int x, y;
} p[205];
Point operator-(Point a, Point b) {
  a.x -= b.x;
  a.y -= b.y;
  return a;
}
long long cp(Point a, Point b) { return a.x * 1LL * b.y - a.y * 1LL * b.x; }
long long dot(Point a, Point b) { return a.x * 1LL * b.x + a.y * 1LL * b.y; }
bool intersect(Point p1, Point p2, Point q1, Point q2) {
  Point v = p2 - p1;
  Point u = q2 - q1;
  long long tmp = cp(u, v);
  if (tmp == 0) {
    if (cp(q1 - p1, q1 - p2) != 0) return false;
    if (dot(p2 - p1, q2 - p1) > 0 && dot(p1 - p2, q1 - p2) > 0) return true;
    if (dot(p2 - p1, q1 - p1) > 0 && dot(p1 - p2, q2 - p2) > 0) return true;
    return false;
  } else {
    long long a = cp(p1, v) - cp(q1, v);
    long long b = cp(q1, u) - cp(p1, u);
    if (tmp > 0) {
      if (0 > a || a > tmp) return false;
    } else {
      if (0 < a || a < tmp) return false;
    }
    tmp *= -1;
    if (tmp > 0) {
      if (0 > b || b > tmp) return false;
    } else {
      if (0 < b || b < tmp) return false;
    }
    tmp *= -1;
    if (tmp > 0) {
      if (0 < a && a < tmp) return true;
    } else {
      if (0 > a && a > tmp) return true;
    }
    tmp *= -1;
    if (tmp > 0) {
      if (0 < b && b < tmp) return true;
    } else {
      if (0 > b && b > tmp) return true;
    }
    return false;
  }
}
void add(int& a, int b) {
  a += b;
  if (a >= MD) a -= MD;
}
int mod_mult(long long a, long long b) { return (a * b) % MD; }
bool valid[205][205];
int dp[205][205];
int main() {
  int n;
  ignore = scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    ignore = scanf("%d %d", &p[i].x, &p[i].y);
  }
  for (int i = 0; i < n; i++) {
    valid[i][i] = true;
    valid[i][(i + 1) % n] = true;
    valid[(i + 1) % n][i] = true;
  }
  long long S = 0;
  for (int i = 0; i < n; i++) {
    S += cp(p[i], p[(i + 1) % n]);
  }
  for (int i = 0; i < n; i++) {
    for (int j = i + 2; j < n; j++) {
      if (i == 0 && j == n - 1) continue;
      bool ok = true;
      for (int k = 0; k < n; k++) {
        if (intersect(p[i], p[j], p[k], p[(k + 1) % n])) {
          ok = false;
          break;
        }
      }
      if (!ok) continue;
      long long tmp = 0;
      for (int k = i; k < j; k++) {
        tmp += cp(p[k] - p[i], p[k + 1] - p[i]);
      }
      long long tmp2 = 0;
      for (int k = j; k != i;) {
        int nxt = k + 1;
        if (nxt == n) nxt = 0;
        tmp2 += cp(p[k] - p[j], p[nxt] - p[j]);
        k = nxt;
      }
      if ((tmp > 0) != (tmp2 > 0)) continue;
      valid[i][j] = valid[j][i] = true;
    }
  }
  for (int i = 0; i + 1 < n; i++) {
    dp[i][i + 1] = 1;
  }
  for (int i = 0; i + 2 < n; i++) {
    dp[i][i + 2] = valid[i][i + 2];
  }
  for (int len = 3; len <= n - 2; len++) {
    for (int i = 0; i + len < n; i++) {
      if (!valid[i][i + len]) continue;
      for (int j = i + 1; j < i + len; j++) {
        add(dp[i][i + len], mod_mult(dp[i][j], dp[j][i + len]));
      }
    }
  }
  int ans = 0;
  for (int i = 1; i < n - 1; i++) {
    add(ans, mod_mult(dp[0][i], dp[i][n - 1]));
  }
  printf("%d\n", ans);
}
