#include <bits/stdc++.h>
using namespace std;
const int maxn = 2 * 100000 + 10, MOD = 1000 * 1000 * 1000 + 7,
          INF = 1000 * 1000 * 1000;
const long long LINF = (1ll) << 60;
const double EPS = 1e-9, PI = 2. * acos(0.0);
vector<long long> f;
int inverse[22];
int mul(int a, int b) { return (int)(((long long)a * b) % MOD); }
int add(int a, int b) { return ((a + b) % MOD); }
int exGCD(int a, int b, int &x, int &y) {
  if (b == 0) {
    x = 1;
    y = 0;
    return a;
  }
  int xx, yy;
  int d = exGCD(b, a % b, xx, yy);
  x = yy;
  y = xx - a / b * yy;
  return d;
}
int modInverse(int a, int mod) {
  int x, y;
  int gcd = exGCD(a, mod, x, y);
  if (gcd != 1) {
    return -1;
  }
  x = x % mod;
  if (x < 0) {
    x += mod;
  }
  return x;
}
int C(long long n, int r) {
  if (n < 0 || r > n) {
    return 0;
  }
  if (r == 0) {
    return 1;
  }
  if (n == 0) {
    return 0;
  }
  int ret = 1;
  for (long long i = n; i >= n - r + 1; i--) {
    ret = mul(ret, (int)(i % MOD));
  }
  for (int i = 1; i <= r; i++) {
    ret = mul(ret, inverse[i]);
  }
  return ret;
}
int main() {
  for (int i = 1; i < 22; i++) {
    inverse[i] = modInverse(i, MOD);
  }
  int n;
  cin >> n;
  long long sum;
  cin >> sum;
  f.resize(n);
  for (int i = 0; i < n; i++) {
    cin >> f[i];
  }
  int ans = 0;
  for (int mask = 0; mask < (1 << n); mask++) {
    long long curSum = sum + n - 1;
    int cnt = 0;
    for (int i = 0; i < n; i++) {
      if ((mask & (1 << i)) != 0) {
        cnt++;
        curSum -= f[i] + 1;
      }
    }
    int curVal = C(curSum, n - 1);
    if (cnt % 2 == 0) {
      ans = (ans + curVal) % MOD;
    } else {
      ans = (ans - curVal + MOD) % MOD;
    }
  }
  cout << ans << "\n";
  return 0;
}
