#include <algorithm>
#include <cstring>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <vector>
using namespace std;
using ll = long long;
using I = pair<int, int>;
/* clang-format off */
template <class T, size_t D> struct _vec { using type = vector<typename _vec<T, D - 1>::type>; };
template <class T> struct _vec<T, 1> { using type = vector<T>; };
template <class T, size_t D> using vec = typename _vec<T, D>::type;
template <class T> vector<T> make_v(size_t size, const T& init) { return vector<T>(size, init); }
template <class... Ts> auto make_v(size_t size, Ts... rest) { return vector<decltype(make_v(rest...))>(size, make_v(rest...)); }
/* clang-format on */
const int N = 5;
const ll MOD = 1e9 + 7;
int main() {
vec<int, 2> x = make_v(N, N, 0);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> x[i][j];
}
}
bool valid = true;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N - 2; j++) {
int a = x[i][j], b = x[i][j + 1], c = x[i][j + 2];
if (a && b && c && (b - a) * (c - b) > 0) {
valid = false;
}
}
}
for (int j = 0; j < N; j++) {
for (int i = 0; i < N - 2; i++) {
int a = x[i][j], b = x[i + 1][j], c = x[i + 2][j];
if (a && b && c && (b - a) * (c - b) > 0) {
valid = false;
}
}
}
if (!valid) {
cout << 0 << endl;
return 0;
}
set<int> exists;
vector<I> ps;
vec<int, 2> mp = make_v(N, N, -1);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (x[i][j] > 0) {
exists.insert(x[i][j]);
} else {
mp[i][j] = ps.size();
ps.push_back(I(i, j));
}
}
}
vector<int> nums;
for (int i = 1; i <= 25; i++) {
if (!exists.count(i)) nums.push_back(i);
}
auto get = [&](int m, int i, int j) {
int id = mp[i][j];
if (id < 0) return x[i][j];
return ((m >> id) & 1) ? 0 : 100;
};
int P = ps.size();
vector<ll> dp(1 << P, 0);
dp[0] = 1;
for (int m = 0; m < (1 << P) - 1; m++) {
int b = __builtin_popcount(m);
int n = nums[b];
for (int i = 0; i < P; i++) {
if ((m >> i) & 1) continue;
int y, x;
tie(y, x) = ps[i];
bool can = true;
if (0 < y && y < N - 1) {
can &= ((get(m, y - 1, x) < n) + (get(m, y + 1, x) < n)) != 1;
}
if (0 < x && x < N - 1) {
can &= ((get(m, y, x - 1) < n) + (get(m, y, x + 1) < n)) != 1;
}
if (can) {
(dp[m | (1 << i)] += dp[m]) %= MOD;
}
}
}
cout << dp.back() << endl;
return 0;
}