#include <bits/stdc++.h>   using namespace std;   int maps[1010][1010];   int n;   int dir[8][2] = {{0, 1},  {1, 0}, {0, -1}, {-1, 0},                    {-1, 1}, {1, 1}, {1, -1}, {-1, -1}};   int pre[8][1010][1010];   double sums[8][1010][1010];   void partial() {     for (int i = 0; i < 8; i++) {       for (int j = 0; j < n; j++) {         for (int k = 0; k < n; k++) {           if (j - dir[i][0] < 0 || j - dir[i][0] >= n || k - dir[i][1] < 0 ||               k - dir[i][1] >= n)             for (int x = j, y = k; x >= 0 && x < n && y >= 0 && y < n;                  x += dir[i][0], y += dir[i][1]) {               if (maps[x][y] == 0) {                 pre[i][x][y] = 0;                 sums[i][x][y] = 0;               } else {                 if (x == j && y == k) {                   pre[i][x][y] = 1;                   sums[i][x][y] = log(maps[x][y]);                 } else {                   pre[i][x][y] = pre[i][x - dir[i][0]][y - dir[i][1]] + 1;                   sums[i][x][y] =                       sums[i][x - dir[i][0]][y - dir[i][1]] + log(maps[x][y]);                 }               }             }         }       }     }   }   double maxCross(int x, int y) {     int minN = 1e9, minR = 1e9;     double rot = log(maps[x][y]), norm = log(maps[x][y]);     for (int i = 0; i < 4; i++) {       minN = min(minN, pre[i][x][y]);     }     for (int i = 4; i < 8; i++) {       minR = min(minR, pre[i][x][y]);     }     minN--;     minR--;     for (int i = 0; i < 4; i++) {       int sx = x + (dir[i][0] * minN);       int sy = y + (dir[i][1] * minN);       norm += sums[i][sx][sy] - sums[i][x][y];     }     for (int i = 4; i < 8; i++) {       int sx = x + (dir[i][0] * minR);       int sy = y + (dir[i][1] * minR);       rot += sums[i][sx][sy] - sums[i][x][y];     }     return max(norm, rot);   }   bool isNorm(int x, int y) {     int minN = 1e9, minR = 1e9;     double rot = log(maps[x][y]), norm = log(maps[x][y]);     for (int i = 0; i < 4; i++) {       minN = min(minN, pre[i][x][y]);     }     for (int i = 4; i < 8; i++) {       minR = min(minR, pre[i][x][y]);     }     minN--;     minR--;     for (int i = 0; i < 4; i++) {       int sx = x + (dir[i][0] * minN);       int sy = y + (dir[i][1] * minN);       norm += sums[i][sx][sy] - sums[i][x][y];     }     for (int i = 4; i < 8; i++) {       int sx = x + (dir[i][0] * minR);       int sy = y + (dir[i][1] * minR);       rot += sums[i][sx][sy] - sums[i][x][y];     }     return norm > rot;   }   long long calcMax(int x, int y) {     int minN = 1e9, minR = 1e9;     long long rot = maps[x][y], norm = maps[x][y];     for (int i = 0; i < 4; i++) {       minN = min(minN, pre[i][x][y]);     }     for (int i = 4; i < 8; i++) {       minR = min(minR, pre[i][x][y]);     }     minN--;     minR--;     for (int i = 0; i < 4; i++) {       int sx = x;       int sy = y;       for (int j = 0; j < minN; j++) {         sx += dir[i][0];         sy += dir[i][1];         norm *= maps[sx][sy];         norm %= (long long)1e9 + 7;       }     }     for (int i = 4; i < 8; i++) {       int sx = x;       int sy = y;       for (int j = 0; j < minR; j++) {         sx += dir[i][0];         sy += dir[i][1];         rot *= maps[sx][sy];         rot %= (long long)1e9 + 7;       }     }     return (isNorm(x, y) ? norm : rot);   }   int main() {     ios::sync_with_stdio(false);     cin.tie(0);     ;     cin >> n;     for (int i = 0; i < n; i++) {       for (int j = 0; j < n; j++) {         char ch;         cin >> ch;         maps[i][j] = ch -  0 ;       }     }     partial();     int maxX = 0, maxY = 0;     double maxVal = -1;     for (int i = 0; i < n; i++) {       for (int j = 0; j < n; j++) {         if (maps[i][j] != 0) {           double temp = maxCross(i, j);           if (temp > maxVal) {             maxVal = temp;             maxX = i;             maxY = j;           }         }       }     }     cout << calcMax(maxX, maxY) << endl;   }