#include <bits/stdc++.h>
using namespace std;
const int MAXN = 160;
const int MOD = 1e9 + 7;
int n, m;
long long f[MAXN][MAXN][2][2];
void lucky() { scanf("%d %d", &n, &m); }
void upd(long long& a, long long b) { a = (a + b) % MOD; }
int main() {
  long long ans = 0;
  lucky();
  for (int i = 1; i <= m; i++)
    for (int j = 1; j <= m; j++) f[i][j][0][0] = 1;
  for (int R = 1; R <= n; R++) {
    for (int i = 1; i <= m; i++)
      for (int j = i; j <= m; j++) {
        long long tot = 0;
        for (int a = 0; a <= 1; a++)
          for (int b = 0; b <= 1; b++) upd(tot, f[i][j][a][b]);
        upd(ans, tot * (n + 1 - R));
      }
    if (R == n) break;
    for (int j = 1; j <= m; j++)
      for (int i = 1; i < j; i++)
        for (int k = 0; k <= 1; k++)
          upd(f[i + 1][j][1][k], f[i][j][0][k] + f[i][j][1][k]);
    for (int i = 1; i <= m; i++)
      for (int j = m; j > i; j--)
        for (int k = 0; k <= 1; k++)
          upd(f[i][j - 1][k][1], f[i][j][k][0] + f[i][j][k][1]);
    for (int j = 1; j <= m; j++)
      for (int i = j; i > 1; i--)
        for (int k = 0; k <= 1; k++) upd(f[i - 1][j][0][k], f[i][j][0][k]);
    for (int i = 1; i <= m; i++)
      for (int j = i; j < m; j++)
        for (int k = 0; k <= 1; k++) upd(f[i][j + 1][k][0], f[i][j][k][0]);
  }
  printf("%d\n", int(ans));
  return 0;
}
