#include <bits/stdc++.h>
using namespace std;
const int maxn = 155;
const int mod = 1000000007;
int sub(int x, int y) {
  x -= y;
  if (x < 0) x += mod;
  return x;
}
int add(int x, int y) { return (x + y) % mod; }
int mult(int x, int y) { return (long long)x * y % mod; }
int n, m;
int pref[maxn][maxn][4];
int dp[maxn][maxn][maxn][4];
void calc(int ind) {
  for (int t = 0; t < 4; t++)
    for (int j = 1; j <= m; j++)
      for (int k = 1; k <= m; k++) {
        pref[j][k][t] = sub(add(pref[j - 1][k][t], pref[j][k - 1][t]),
                            pref[j - 1][k - 1][t]);
        pref[j][k][t] = add(pref[j][k][t], dp[ind][j][k][t]);
      }
}
int get(int ux, int dx, int ly, int ry, int ind) {
  if (ux > dx || ly > ry) return 0;
  return add(
      sub(pref[dx][ry][ind], add(pref[dx][ly - 1][ind], pref[ux - 1][ry][ind])),
      pref[ux - 1][ly - 1][ind]);
}
int main(void) {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++)
    for (int j = i; j <= m; j++)
      for (int k = 0; k < 4; k++) dp[n + 1][i][j][k] = 1;
  calc(n + 1);
  for (int i = n; i > 0; i--) {
    for (int j = 1; j <= m; j++)
      for (int k = j; k <= m; k++)
        for (int t = 0; t < 4; t++) {
          int spread = get(1, j - 1, k + 1, m, 0);
          int spreadUpType = 0;
          if (t == 2) spreadUpType = 2;
          int spreadDownType = 0;
          if (t == 1) spreadDownType = 1;
          int spreadUp = get(1, j - 1, k, k, spreadUpType);
          int spreadDown = get(j, j, k + 1, m, spreadDownType);
          int up = get(1, j - 1, j, k - 1, 2);
          int down = get(j + 1, k, k + 1, m, 1);
          int upSpecType = 2;
          if (t == 1 || t == 3) upSpecType = 3;
          int downSpecType = 1;
          if (t == 2 || t == 3) downSpecType = 3;
          int upSpec = get(j, j, j, k - 1, upSpecType);
          int downSpec = get(j + 1, k, k, k, downSpecType);
          int inside = get(j + 1, k - 1, j + 1, k - 1, 3);
          inside = add(inside, 1);
          if (t == 0) dp[i][j][k][t] = add(dp[i][j][k][t], spread);
          if (t != 1 && t != 3)
            dp[i][j][k][t] = add(dp[i][j][k][t], add(spreadUp, up));
          if (t != 2 && t != 3)
            dp[i][j][k][t] = add(dp[i][j][k][t], add(spreadDown, down));
          dp[i][j][k][t] = add(dp[i][j][k][t], add(upSpec, downSpec));
          dp[i][j][k][t] = add(dp[i][j][k][t], inside);
          dp[i][j][k][t] = add(dp[i][j][k][t], dp[i + 1][j][k][t]);
        }
    calc(i);
  }
  int sol = 0;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      for (int k = j; k <= m; k++) sol = add(sol, dp[i + 1][j][k][0]);
  printf("%d\n", sol);
  return 0;
}
