#include <bits/stdc++.h>
using namespace std;
const int maxn = 1100000;
const int MOD = 1000000007;
char t[maxn], s[maxn];
int fail[maxn], len[maxn], nxt[maxn][26], diff[maxn], slink[maxn], n, p, last;
int newnode(int l) {
  len[p] = l;
  return p++;
}
void init() {
  p = 0;
  newnode(0);
  newnode(-1);
  fail[last = 0] = 1;
  s[n = 0] = 0;
}
int getfail(int x) {
  while (s[n - len[x] - 1] != s[n]) x = fail[x];
  return x;
}
int add() {
  int c = s[++n] - 'a';
  int cur = getfail(last);
  if (!nxt[cur][c]) {
    int now = newnode(len[cur] + 2);
    fail[now] = nxt[getfail(fail[cur])][c];
    diff[now] = len[now] - len[fail[now]];
    slink[now] = diff[now] == diff[fail[now]] ? slink[fail[now]] : fail[now];
    nxt[cur][c] = now;
  }
  last = nxt[cur][c];
  return last;
}
int f[maxn], g[maxn];
int main() {
  int i;
  scanf("%s", t + 1);
  n = strlen(t + 1);
  if (n & 1) {
    puts("0");
    return 0;
  }
  for (i = (1); i <= (n >> 1); i++)
    s[2 * i - 1] = t[i], s[2 * i] = t[n - i + 1];
  int tmp = n;
  init();
  f[0] = 1;
  for (i = (1); i <= (tmp); i++) {
    for (int x = add(); len[x] > 0; x = slink[x]) {
      g[x] = f[i - len[slink[x]] - diff[x]];
      if (diff[x] == diff[fail[x]]) (g[x] += g[fail[x]]) %= MOD;
      (f[i] += g[x]) %= MOD;
    }
    if (i & 1) f[i] = 0;
  }
  cout << f[n] << endl;
  return 0;
}
