#include <bits/stdc++.h>
using namespace std;
const int inf = 0x20202020;
const int mod = 1000000007;
template <class T>
inline void read(T &first) {
  bool fu = 0;
  char c;
  for (c = getchar(); c <= 32; c = getchar())
    ;
  if (c == '-') fu = 1, c = getchar();
  for (first = 0; c > 32; c = getchar()) first = first * 10 + c - '0';
  if (fu) first = -first;
};
template <class T>
inline void read(T &first, T &second) {
  read(first);
  read(second);
}
template <class T>
inline void read(T &first, T &second, T &z) {
  read(first);
  read(second);
  read(z);
}
template <class T>
inline void read(T &first, T &second, T &z, T &q) {
  read(first);
  read(second);
  read(z);
  read(q);
}
const int DX[] = {1, 0, -1, 0}, DY[] = {0, 1, 0, -1};
long long powmod(long long a, long long b) {
  long long res = 1;
  a %= mod;
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
long long powmod(long long a, long long b, long long mod) {
  long long res = 1;
  a %= mod;
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
const int N = 155, M = 111111;
int l, m, n, t, C;
long long ans;
long long f[N][N][2][2], s[N][N][2][2];
void add(long long &first, long long second) { first = (first + second) % mod; }
long long sum(int a, int b, int c, int d, int e, int f) {
  return (s[c][d][e][f] - s[a - 1][d][e][f] - s[c][b - 1][e][f] +
          s[a - 1][b - 1][e][f]) %
             mod +
         mod;
}
int main() {
  scanf("%d%d", &m, &n);
  for (int _ = (1); _ <= (m); ++_) {
    for (int i = (1); i <= (n); ++i)
      for (int j = (i); j <= (n); ++j) {
        f[i][j][0][0] = sum(i, i, j, j, 0, 0) % mod;
        f[i][j][0][1] =
            (sum(i, j + 1, j, n, 0, 0) + sum(i, j, j, n, 0, 1)) % mod;
        f[i][j][1][0] =
            (sum(1, i, i - 1, j, 0, 0) + sum(1, i, i, j, 1, 0)) % mod;
        f[i][j][1][1] =
            (sum(1, j + 1, i - 1, n, 0, 0) + sum(1, j, i - 1, n, 0, 1) +
             sum(1, j + 1, i, n, 1, 0) + sum(1, j, i, n, 1, 1)) %
            mod;
        if (_ == 1) f[i][j][0][0] = 1;
      }
    memcpy(s, f, sizeof(s));
    for (int i = (1); i <= (n); ++i)
      for (int j = (1); j <= (n); ++j)
        for (int k = (0); k <= (3); ++k)
          add(s[i][j][k & 1][k >> 1], s[i - 1][j][k & 1][k >> 1] +
                                          s[i][j - 1][k & 1][k >> 1] -
                                          s[i - 1][j - 1][k & 1][k >> 1]);
    add(ans, (s[n][n][0][0] + s[n][n][0][1] + s[n][n][1][0] + s[n][n][1][1]) *
                 (m - _ + 1));
  }
  printf("%I64d\n", ans);
  return 0;
}
