#include <bits/stdc++.h>
int64_t calc_inverse(int64_t x) {
  int64_t p1, p2;
  std::function<void(int64_t, int64_t, int64_t, int64_t, int64_t, int64_t)>
      gcd = [&](int64_t a, int64_t ma, int64_t na, int64_t b, int64_t mb,
                int64_t nb) {
        if (b != 0) {
          int64_t q = a / b;
          int64_t c = a % b;
          int64_t mc = ma - q * mb;
          int64_t nc = na - q * nb;
          gcd(b, mb, nb, c, mc, nc);
        } else {
          p1 = ma;
          p2 = na;
        }
      };
  gcd(1000000007, 1, 0, x, 0, 1);
  int64_t inverse = p2 % 1000000007;
  if (inverse < 0) inverse += 1000000007;
  return inverse;
}
int main() {
  int64_t n, s, f[20];
  scanf("%" SCNd64 " %" SCNd64, &n, &s);
  for (int64_t *ptr = f; ptr < f + n; ptr++) scanf("%" SCNd64, ptr);
  int64_t factorial = 1;
  for (int64_t i = 2; i <= n - 1; i++) factorial = factorial * i % 1000000007;
  int64_t inverse = calc_inverse(factorial);
  auto comb_with_rep = [&](int64_t k) {
    int64_t result = 1;
    for (int64_t i = n + k - 1; i > k; i--)
      result = result * (i % 1000000007) % 1000000007;
    result = result * inverse % 1000000007;
    return result;
  };
  int64_t r = s;
  int64_t sign = 1;
  int64_t count = comb_with_rep(r);
  for (int prev_gray = 0, cnt = 1; cnt < (1 << n); cnt++) {
    sign = -sign;
    int gray = cnt ^ (cnt >> 1);
    int altered_bit = prev_gray ^ gray;
    int index = __builtin_ctz(altered_bit);
    if (gray & altered_bit)
      r -= f[index] + 1;
    else
      r += f[index] + 1;
    if (r >= 0) {
      count = (count + sign * comb_with_rep(r)) % 1000000007;
      if (count < 0) count += 1000000007;
    }
    prev_gray = gray;
  }
  printf("%" PRId64 "\n", count);
  return 0;
}
