You are given an array a of length 2n. Consider a partition of array a into two subsequences p and q of length n each (each element of array a should be in exactly one subsequence: either in p or in q).

Let's sort p in non-decreasing order, and q in non-increasing order, we can denote the sorted versions by x and y, respectively. Then the cost of a partition is defined as f(p, q) = ∑_{i = 1}^n |x_i - y_i|.

Find the sum of f(p, q) over all correct partitions of array a. Since the answer might be too big, print its remainder modulo 998244353.

Input

The first line contains a single integer n (1 ≤ n ≤ 150 000).

The second line contains 2n integers a_1, a_2, …, a_{2n} (1 ≤ a_i ≤ 10^9) — elements of array a.

Output

Print one integer — the answer to the problem, modulo 998244353.

Examples

Input


1
1 4


Output


6

Input


2
2 1 2 1


Output


12

Input


3
2 2 2 2 2 2


Output


0

Input


5
13 8 35 94 9284 34 54 69 123 846


Output


2588544

Note

Two partitions of an array are considered different if the sets of indices of elements included in the subsequence p are different.

In the first example, there are two correct partitions of the array a:

  1. p = [1], q = [4], then x = [1], y = [4], f(p, q) = |1 - 4| = 3; 
  2. p = [4], q = [1], then x = [4], y = [1], f(p, q) = |4 - 1| = 3. 



In the second example, there are six valid partitions of the array a: 

  1. p = [2, 1], q = [2, 1] (elements with indices 1 and 2 in the original array are selected in the subsequence p); 
  2. p = [2, 2], q = [1, 1]; 
  3. p = [2, 1], q = [1, 2] (elements with indices 1 and 4 are selected in the subsequence p); 
  4. p = [1, 2], q = [2, 1]; 
  5. p = [1, 1], q = [2, 2]; 
  6. p = [2, 1], q = [2, 1] (elements with indices 3 and 4 are selected in the subsequence p). 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.*;

public class Main
{
	public static void main(String[] args) {
		new Thread(null, new Runnable() {
			public void run() {
                solve();
            }
        }, "1", 1 << 26).start();
	}
	static void solve () {
		FastReader fr =new FastReader();	PrintWriter op =new PrintWriter(System.out);
 
 		int n =fr.nextInt() ,i ;

 		long a[] =new long[2*n] ,j ,k ,mod =998244353l ;

 		for (i =0 ; i<2*n ; ++i)
 			a[i] =fr.nextLong() ;

 		sort(a,0,2*n-1) ;

 		for (i =1 ; i<n ; ++i)
 			a[0] += a[i] ;

 		for (++i ; i<2*n ; ++i)
 			a[n] += a[i] ;

 		j =a[n]-a[0] ;	j %= mod ;

 		k =nCr(2*n , n , mod) ;

 		j =(j*k)%mod ;

		op.println(j) ;	op.flush();	op.close();
	}
	static long nCr(long n , long r , long mod) {
		long i ,num =1l ,denom =1l ;

		for (i =1 ; i<=r ; ++i)
			denom =(denom*i)%mod ;

		for (; i<=n ; ++i)
			num =(num*i)%mod ;

		denom =pow(denom , mod-2l , mod) ;

		num =(num * denom)%mod ;

		return num ;
	}
	static long pow (long b , long e , long mod) {
		if (e==0l)	return 1l;
		if (e==1l)	return b;
		long dm =pow(b,e/2l,mod) ;	dm *= dm ;	dm%=mod ;
		if ((e&1l)==1l)	{
			dm *= b ;	dm%=mod ;
		}
		return dm ;
	}
	public static void sort(long[] arr , int l , int u) {
		int m ;
 
		if(l < u){
			m =(l + u)/2 ;
 
			sort(arr , l , m);	sort(arr , m + 1 , u);
 
			merge(arr , l , m , u);
		}
	}
	public static void merge(long[] arr , int l , int m , int u) {
		long[] low = new long[m - l + 1] ;
 
		long[] upr = new long[u - m] ;
 
		int i ,j =0 ,k =0 ;
 
		for(i =l;i<=m;i++)
			low[i - l] =arr[i] ;
 
		for(i =m + 1;i<=u;i++)
			upr[i - m - 1] =arr[i] ;

		i =l;
 
		while((j < low.length) && (k < upr.length))
		{
			if(low[j] < upr[k])
				arr[i++] =low[j++] ;
			else 
				arr[i++] =upr[k++] ;
		}
 
		while(j < low.length)
			arr[i++] =low[j++] ;
 
		while(k < upr.length)
			arr[i++] =upr[k++] ;
	}
	static class FastReader {
		BufferedReader br;
		StringTokenizer st;

		public FastReader() {
			br =new BufferedReader(new InputStreamReader(System.in));
		}

		String next() {
			while (st==null || (!st.hasMoreElements())) 
			{
				try
				{
					st =new StringTokenizer(br.readLine());
				}
				catch(IOException e)
				{
					e.printStackTrace();
				}
				
			}
			return st.nextToken();
		}

		String nextLine() {
			String str ="";

			try
			{
				str =br.readLine();
			}
			catch(IOException e)
			{
				e.printStackTrace();
			}

			return str;
		}

		int nextInt() {
			return Integer.parseInt(next());
		}

		long nextLong() {
			return Long.parseLong(next()) ;
		}
	}
}