#include <bits/stdc++.h>
using namespace std;
const int N = 160, P = 1e9 + 7;
int n, m, dp[N][N][N][4];
void add(int &a, int b) {
  a += b;
  if (a >= P) a -= P;
  if (a < 0) a += P;
}
void add(int i, int x1, int y1, int x2, int y2, int op, int r) {
  ++x2, ++y2;
  add(dp[i][x1][y1][op], r);
  add(dp[i][x1][y2][op], -r);
  add(dp[i][x2][y1][op], -r);
  add(dp[i][x2][y2][op], r);
}
int main() {
  scanf("%d%d", &n, &m);
  add(1, 1, 1, m, m, 0, 1);
  int ans = 0;
  for (int i = 1; i <= n + 1; ++i)
    for (int l = 1; l <= m; ++l)
      for (int r = 1; r <= m; ++r)
        for (int z = 0; z <= 3; ++z) {
          int &ret = dp[i - 1][l][r][z];
          add(ret, dp[i - 1][l - 1][r][z]);
          add(ret, dp[i - 1][l][r - 1][z]);
          add(ret, -dp[i - 1][l - 1][r - 1][z]);
          if (!ret || l > r) continue;
          ans = (ans + (long long)(n + 2 - i) * ret) % P;
          if (i == n + 1) continue;
          if (z == 0) {
            add(i, 1, r, l, m, 0, ret);
            if (l + 1 <= r) add(i, l + 1, r, r, m, 1, ret);
            if (l <= r - 1) add(i, 1, l, l, r - 1, 2, ret);
            if (l + 1 <= r - 1) add(i, l + 1, l + 1, r, r - 1, 3, ret);
          } else if (z == 1) {
            add(i, l, r, r, m, 1, ret);
            if (l <= r - 1) add(i, l, l, r, r - 1, 3, ret);
          } else if (z == 2) {
            add(i, 1, l, l, r, 2, ret);
            if (l + 1 <= r) add(i, l + 1, l + 1, r, r, 3, ret);
          } else if (z == 3) {
            add(i, l, l, r, r, 3, ret);
          }
        }
  printf("%d\n", ans);
}
