#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:100000000000000")
using namespace std;
const long long int INF = 2e9;
int dp[158][158][158][2][2];
int sum[158][2][2];
int add[158][2][2];
int n, m;
int mod = 1000000007;
int main() {
  cin >> n >> m;
  memset(dp, 0, sizeof dp);
  for (int i = 0; i < (m); i++)
    for (int j = i; j < m; j++) {
      dp[0][i][j][0][0] = 1;
    }
  for (int i = 1; i < n; i++) {
    memset(sum, 0, sizeof sum);
    for (int j = 0; j < (m); j++) {
      if (j) {
        sum[j][0][0] = sum[j - 1][0][0];
        sum[j][0][1] = sum[j - 1][0][1];
        for (int k = 0; k < (j); k++) {
          sum[j][0][1] = (sum[j][0][1] + mod - dp[i - 1][k][j - 1][0][1]) % mod;
          sum[j][0][1] = (sum[j][0][1] + mod - dp[i - 1][k][j][0][0]) % mod;
          sum[j][0][0] = (sum[j][0][0] + dp[i - 1][k][j][0][0]) % mod;
        }
      }
      for (int k = j; k < m; k++) {
        for (int t = 0; t < (2); t++) {
          int to = t;
          if (k > j) to = 1;
          sum[j][0][to] = (sum[j][0][to] + dp[i - 1][j][k][0][t]) % mod;
        }
      }
      for (int t = 0; t < (2); t++) dp[i][0][j][0][t] = sum[j][0][t];
    }
    for (int f = 1; f < m; f++) {
      memset(add, 0, sizeof add);
      for (int j = 0; j < f - 1; j++) {
        add[f][1][0] = (add[f][1][0] + mod - dp[i - 1][j][f - 1][0][0]) % mod;
        add[f][1][0] = (add[f][1][0] + mod - dp[i - 1][j][f - 1][1][0]) % mod;
      }
      add[f][0][0] = mod - dp[i - 1][f - 1][f - 1][0][0];
      add[f][1][0] = (add[f][1][0] + mod - dp[i - 1][f - 1][f - 1][1][0]) % mod;
      for (int j = f; j < m; j++) {
        for (int t = 0; t < (2); t++) {
          int val = dp[i - 1][f - 1][j][0][t];
          add[f][0][1] = (add[f][0][1] + mod - val) % mod;
          add[f][1][1] = (add[f][1][1] + val) % mod;
          add[j + t][0][1] = (add[j + t][0][1] + val) % mod;
          add[j + t][1][1] = (add[j + t][1][1] + mod - val) % mod;
          if (!t) {
            add[j][0][0] = (add[j][0][0] + mod - val) % mod;
            add[j][1][0] = (add[j][1][0] + val) % mod;
          }
          val = dp[i - 1][f][j][1][t];
          add[f][1][1] = (add[f][1][1] + val) % mod;
          add[j + t][1][1] = (add[j + t][1][1] + mod - val) % mod;
          if (!t) {
            add[j][1][0] = (add[j][1][0] + val) % mod;
          }
        }
      }
      for (int j = f; j < m; j++) {
        for (int t = 0; t < (2); t++)
          for (int t2 = 0; t2 < (2); t2++) {
            dp[i][f][j][t][t2] =
                (sum[j][t][t2] = (sum[j][t][t2] + add[j][t][t2]) % mod);
            add[j + 1][t][t2] = (add[j + 1][t][t2] + add[j][t][t2]) % mod;
          }
      }
    }
    for (int f = 0; f < (m); f++)
      for (int j = f; j < m; j++) {
        dp[i][f][j][0][0] = (dp[i][f][j][0][0] + 1) % mod;
      }
  }
  int out = 0;
  for (int i = 0; i < (n); i++)
    for (int j = 0; j < (m); j++)
      for (int k = 0; k < (j + 1); k++)
        for (int t = 0; t < (2); t++)
          for (int t2 = 0; t2 < (2); t2++) {
            out = (out + dp[i][k][j][t][t2]) % mod;
          }
  cout << out;
}
