#include <bits/stdc++.h>

using namespace std;

template <class TH> void _dbg(const char *sdbg, TH h){cerr<<sdbg<<"="<<h<<"\n";}
template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) {
  while(*sdbg!=',')
    cerr<<*sdbg++;
  cerr<<"="<<h<<","; 
  _dbg(sdbg+1, a...);
}

template<class T> ostream & operator<<(ostream & os, vector<T> V){
  os<<"[";
  for(auto vv: V) os << vv <<",";
  return os << "]";
}
template<class L, class R> ostream & operator <<(ostream & os, pair<L,R> P){
  return os <<"("<<P.first <<","<<P.second <<")";
}

#ifdef LOCAL
#define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#else
#define debug(...) (__VA_ARGS__)
#define cerr if(0)cout
#endif
const int N = 3005, M = 998244353;

void add(int &w, int u) {
    w += u;
    if (w >= M) w -= M;
}

int mul(int w, int u) {
    return (long long)w * u % M;
}

int a, b, c, d, dp[N][N][3][3];

int main() {

    scanf("%d %d %d %d", &a, &b, &c, &d);
    dp[a][b][0][0] = 1;
    for (int i = a; i <= c; i++) {
        for (int j = b; j <= d; j++) {
            if (i == a && j == b) continue;
            
            for (int k = 0; k <= 2; k++) {
                for (int l = 0; l <= 2; l++) {
                    if (k > 1 && l > 1) continue;
                    if ((k == 0 && j > b) || (l == 0 && i > a)) continue;
                    if (k > 1) {
                        add(dp[i][j][k][l], mul(j, dp[i - 1][j][k][0]));
                        add(dp[i][j][k][l], mul(j, dp[i - 1][j][k][1]));
                        add(dp[i][j][k][l], mul(j, dp[i - 1][j][k][2]));
                        add(dp[i][j][k][l], dp[i - 1][j][k - 1][0]);
                        add(dp[i][j][k][l], dp[i - 1][j][k - 1][1]);
                        add(dp[i][j][k][l], dp[i - 1][j][k - 1][2]);
                        continue;
                    }
                    if (l > 1) {
                        add(dp[i][j][k][l], mul(i, dp[i][j - 1][0][l]));
                        add(dp[i][j][k][l], mul(i, dp[i][j - 1][1][l]));
                        add(dp[i][j][k][l], mul(i, dp[i][j - 1][2][l]));
                        add(dp[i][j][k][l], dp[i][j - 1][0][l - 1]);
                        add(dp[i][j][k][l], dp[i][j - 1][1][l - 1]);
                        add(dp[i][j][k][l], dp[i][j - 1][2][l - 1]);
                        continue;
                    }
                    if (l >= 1 && i > a) {
                        add(dp[i][j][k][l], mul(j - 1, dp[i - 1][j][k][0]));
                        add(dp[i][j][k][l], mul(j - 1, dp[i - 1][j][k][1]));
                        add(dp[i][j][k][l], mul(j - 1, dp[i - 1][j][k][2]));
                    } else {
//                     if (l >= 1 && (k == 0 || j == b)) {
                        add(dp[i][j][k][l], mul(i - 1, dp[i][j - 1][0][l]));
                        add(dp[i][j][k][l], mul(i - 1, dp[i][j - 1][1][l]));
                        add(dp[i][j][k][l], mul(i - 1, dp[i][j - 1][2][l]));
//                     }
                    }
                    if (k >= 1 && l >= 1) {
                        add(dp[i][j][k][l], dp[i - 1][j][k - 1][0]);
                        add(dp[i][j][k][l], dp[i - 1][j][k - 1][1]);
                        add(dp[i][j][k][l], dp[i - 1][j][k - 1][2]);
                        
                        add(dp[i][j][k][l], dp[i][j - 1][0][l - 1]);
                        add(dp[i][j][k][l], dp[i][j - 1][1][l - 1]);
                        add(dp[i][j][k][l], dp[i][j - 1][2][l - 1]);
                    }
                    
                }
            }
//             add(dp[i][j][1], dp[i - 1][j][2]);
//             add(dp[i][j][1], dp[i - 1][j][1]);
//             add(dp[i][j][1], dp[i - 1][j][0]);
//             
//             add(dp[i][j][2], dp[i][j - 1][0]);
//             add(dp[i][j][2], dp[i][j - 1][1]);
//             add(dp[i][j][2], dp[i][j - 1][2]);
//             
//             add(dp[i][j][0], dp[i - 1][j][0]);
//             add(dp[i][j][0], dp[i - 1][j][2]);
//             add(dp[i][j][0], dp[i][j - 1][0]);
//             add(dp[i][j][0], dp[i][j - 1][1]);
//             if (i > a) {
//                 add(dp[i][j][0], mul(j - 1, dp[i - 1][j][0]));
//                 add(dp[i][j][0], mul(j - 1, dp[i - 1][j][1]));
//             } else {
//                 add(dp[i][j][0], mul(i - 1, dp[i][j - 1][0]));
//                 add(dp[i][j][0], mul(i - 1, dp[i][j - 1][2]));
//             }
//             debug(i, j, dp[i][j][0], dp[i][j][1], dp[i][j][2]);
        }
    } 
    
//     for (int i = a; i <= c; i++) {
//         for (int j = b; j <= d; j++) {
// //             if (i == a && j == b) continue;
//             
//             for (int k = 0; k <= 2; k++) {
//                 for (int l = 0; l <= 2; l++) {
//                     debug(i, j, k, l, dp[i][j][k][l]);
//                 }
//             }
//         }
//     }
//     
    int ans = 0;
    for (int i = 0; i <= 2; i++) {
        for (int j = 0; j <= 2; j++) {
            add(ans, dp[c][d][i][j]);
        }
    }

    printf("%d\n", ans);
    
    return 0;
}


Measured memory_bytes: 320696