You are given three multisets of pairs of colored sticks: 

  * R pairs of red sticks, the first pair has length r_1, the second pair has length r_2, ..., the R-th pair has length r_R; 
  * G pairs of green sticks, the first pair has length g_1, the second pair has length g_2, ..., the G-th pair has length g_G; 
  * B pairs of blue sticks, the first pair has length b_1, the second pair has length b_2, ..., the B-th pair has length b_B; 



You are constructing rectangles from these pairs of sticks with the following process: 

  1. take a pair of sticks of one color; 
  2. take a pair of sticks of another color different from the first one; 
  3. add the area of the resulting rectangle to the total area. 



Thus, you get such rectangles that their opposite sides are the same color and their adjacent sides are not the same color.

Each pair of sticks can be used at most once, some pairs can be left unused. You are not allowed to split a pair into independent sticks.

What is the maximum area you can achieve?

Input

The first line contains three integers R, G, B (1 ≤ R, G, B ≤ 200) — the number of pairs of red sticks, the number of pairs of green sticks and the number of pairs of blue sticks.

The second line contains R integers r_1, r_2, ..., r_R (1 ≤ r_i ≤ 2000) — the lengths of sticks in each pair of red sticks.

The third line contains G integers g_1, g_2, ..., g_G (1 ≤ g_i ≤ 2000) — the lengths of sticks in each pair of green sticks.

The fourth line contains B integers b_1, b_2, ..., b_B (1 ≤ b_i ≤ 2000) — the lengths of sticks in each pair of blue sticks.

Output

Print the maximum possible total area of the constructed rectangles.

Examples

Input


1 1 1
3
5
4


Output


20


Input


2 1 3
9 5
1
2 8 5


Output


99


Input


10 1 1
11 7 20 15 19 14 2 4 13 14
8
11


Output


372

Note

In the first example you can construct one of these rectangles: red and green with sides 3 and 5, red and blue with sides 3 and 4 and green and blue with sides 5 and 4. The best area of them is 4 × 5 = 20.

In the second example the best rectangles are: red/blue 9 × 8, red/blue 5 × 5, green/blue 2 × 1. So the total area is 72 + 25 + 2 = 99.

In the third example the best rectangles are: red/green 19 × 8 and red/blue 20 × 11. The total area is 152 + 220 = 372. Note that you can't construct more rectangles because you are not allowed to have both pairs taken to be the same color.

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Round659 {

	static int ans=0;
	static int rec=0;
	static int X[] = { -1, 0, 0, 1 };
	static int Y[] = { 0, -1, 1, 0 };

	static class Reader {
		final private int BUFFER_SIZE = 1 << 16;
		private DataInputStream din;
		private byte[] buffer;
		private int bufferPointer, bytesRead;

		public Reader() {
			din = new DataInputStream(System.in);
			buffer = new byte[BUFFER_SIZE];
			bufferPointer = bytesRead = 0;
		}

		public Reader(String file_name) throws IOException {
			din = new DataInputStream(new FileInputStream(file_name));
			buffer = new byte[BUFFER_SIZE];
			bufferPointer = bytesRead = 0;
		}

		public String readLine() throws IOException {
			byte[] buf = new byte[64]; // line length
			int cnt = 0, c;
			while ((c = read()) != -1) {
				if (c == '\n')
					break;
				buf[cnt++] = (byte) c;
			}
			return new String(buf, 0, cnt);
		}

		public int nextInt() throws IOException {
			int ret = 0;
			byte c = read();
			while (c <= ' ')
				c = read();
			boolean neg = (c == '-');
			if (neg)
				c = read();
			do {
				ret = ret * 10 + c - '0';
			} while ((c = read()) >= '0' && c <= '9');

			if (neg)
				return -ret;
			return ret;
		}

		public long nextLong() throws IOException {
			long ret = 0;
			byte c = read();
			while (c <= ' ')
				c = read();
			boolean neg = (c == '-');
			if (neg)
				c = read();
			do {
				ret = ret * 10 + c - '0';
			} while ((c = read()) >= '0' && c <= '9');
			if (neg)
				return -ret;
			return ret;
		}

		public double nextDouble() throws IOException {
			double ret = 0, div = 1;
			byte c = read();
			while (c <= ' ')
				c = read();
			boolean neg = (c == '-');
			if (neg)
				c = read();

			do {
				ret = ret * 10 + c - '0';
			} while ((c = read()) >= '0' && c <= '9');

			if (c == '.') {
				while ((c = read()) >= '0' && c <= '9') {
					ret += (c - '0') / (div *= 10);
				}
			}

			if (neg)
				return -ret;
			return ret;
		}

		private void fillBuffer() throws IOException {
			bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
			if (bytesRead == -1)
				buffer[0] = -1;
		}

		private byte read() throws IOException {
			if (bufferPointer == bytesRead)
				fillBuffer();
			return buffer[bufferPointer++];
		}

		public void close() throws IOException {
			if (din == null)
				return;
			din.close();
		}
	}

	public static long[] initArray(int n, Reader scan) throws IOException {

		long arr[] = new long[n];
		for (int i = 0; i < n; i++) {
			arr[i] = scan.nextLong();
		}

		return arr;
	}

	public static long sum(long arr[]) {

		long sum = 0;
		for (long i : arr) {
			sum += (long) i;
		}

		return sum;
	}

	public static long max(long arr[]) {

		long max = Long.MIN_VALUE;

		for (long i : arr) {
			max = Math.max(i, max);
		}

		return max;
	}

	public static long min(long arr[]) {
		long min = Long.MAX_VALUE;

		for (long i : arr) {
			min = Math.min(i, min);
		}

		return min;
	}

	public static List<Integer>[] initAdjacency(int n, int e, Reader scan, boolean type) throws IOException {

		List<Integer> adj[] = new ArrayList[n + 1];

		for (int i = 0; i < e; i++) {
			int u = scan.nextInt();
			int v = scan.nextInt();

			if (adj[u] == null)
				adj[u] = new ArrayList<>();
			if (type && adj[v] == null)
				adj[v] = new ArrayList<>();

			adj[u].add(v);

			if (type)
				adj[v].add(u);

		}

		return adj;
	}
	public static void main(String[] args) throws IOException {
		
		Reader scan=new Reader();
//		Scanner scan=new Scanner(System.in);
		
		
		int t=1;
		while(t-->0) {
			int r=scan.nextInt();
			int g=scan.nextInt();
			int b=scan.nextInt();
//			int d=scan.nextInt();
//			int m=scan.nextInt();
//			int m=scan.nextInt();
//			int k=scan.nextInt();
//			int l=scan.nextInt();
//			int arr[]=new int[n];
//			
//			for(int i=0;i<n;i++) {
//				arr[i]=scan.nextInt();
//			}
//			
			
//			int arr1[]=new int[n];
//
//			int arr2[]=new int[m];
//			
//			for(int i=0;i<n;i++) {
//				arr1[i]=scan.nextInt();
//			}
//			
//			for(int i=0;i<m;i++) {
//				arr2[i]=scan.nextInt();
//			}

			
			long rs[]=initArray(r, scan);
			long gs[]=initArray(g, scan);
			long bs[]=initArray(b, scan);
			D(r, g, b, rs, gs, bs);
		}

	
	}
	
	public static void A(int n, long arr[]) {
		
		
		long a=arr[0];
		long b=arr[1];
		
		for(int i=2;i<n;i++) {
			
			if(a+b<=arr[i]) {
				
				System.out.println((1)+" "+(2)+" "+(i+1));
				return;
			}
			
		}
		
		System.out.println(-1);
		
	}
	
	public static boolean canTransform(long a, long b, long c) {
		
		if(a<=0||b<=0||c<=0) return false;
		
		return true;
		
	}
	
	public static void B(String s) {
		
		
		List<Integer> count=new ArrayList<>();
		
		int c=0;
		int cur=0;
		for(int i=0;i<s.length();i++) {
			
			
			if(s.charAt(i)=='1') {
				if(cur==1) {
					c++;
				}else {
					cur=1;
					c++;
				}
			}else {
				
				if(cur==1) {
					count.add(c);
					cur=0;
					c=0;
				}
			}
		}
		
		if(cur==1) {
			count.add(c);
		}
		
		Collections.sort(count, Collections.reverseOrder());
		
		int ans=0;
		
		for(int i=0;i<count.size();i+=2) {
			ans+= count.get(i);
		}
		
		System.out.println(ans);
		
	}
	
	public static void rightZigZag(int n, int m, int i, int j) {
		
		if(j==m) {
			return;
		}
		

		j++;
		
		if(i==1) {
			
			while(i<=n) {
				System.out.println(i+" "+j);
				i++;
			}
			
			i=n;
		}else {
			
			while(i>=1) {
				System.out.println(i+" "+j);
				i--;
			}
			
			i=1;
			
		}
		
		rightZigZag(n, m, i, j);
		
	}
	
	public static void leftZigZag(int n, int m, int i, int j) {
		
		if(j==1) {
			return;
		}
		

		j--;
		
		if(i==1) {
			
			while(i<=n) {
				System.out.println(i+" "+j);
				i++;
			}
			
			i=n;
		}else {
			
			while(i>=1) {
				System.out.println(i+" "+j);
				i--;
			}
			
			i=1;
			
		}
		
		leftZigZag(n, m, i, j);
		
	}
	
	
	public static void C(int n, String s) {
		
		
		long preSum[]=new long[n+1];
		
		preSum[0]=0;
		for(int i=0;i<s.length();i++) {
			preSum[i+1]= preSum[i]+ (long)(s.charAt(i)-'0');
			
		}
		
		Map<Long, Long> map=new HashMap<>();
		
		map.put((long)0,  (long)1);
		
		long ans=0;
		
		for(int i=1;i<n+1;i++) {
			
			if(map.containsKey(preSum[i]-i)) {
				ans+=(map.get(preSum[i]-i));
			}
			
			map.put((long)(preSum[i]-i), map.getOrDefault((long)(preSum[i]-i), (long)0)+(long)1);
		}
		
		System.out.println(ans);
		
	}
	
	public static void D(int r, int g, int b, long rs[], long gs[], long bs[]) {
		
		
		Arrays.sort(rs);
		Arrays.sort(gs);
		Arrays.sort(bs);
		
		int i=r;
		int j= g;
		int k=b;
		
		
		long dp[][][]=new long[r+1][g+1][b+1];
		
		for(long t[][]: dp) {
			for(long t1[]: t) {
				Arrays.fill(t1,  -1);
			}
		}
		
		long ans=helper(i, j, k, rs, gs, bs, dp);
		System.out.println(ans);
		
	}
	
	public static long helper(int i, int j, int k, long rs[], long gs[], long bs[], long dp[][][]) {
		
		if(!helper(i, j, k)) return 0;
		
		if(dp[i][j][k]!=-1) {
			return dp[i][j][k];
		}
		
		long ans1= Long.MIN_VALUE;
		long ans2= Long.MIN_VALUE;
		long ans3= Long.MIN_VALUE;
		
		if(i>=1&&j>=1) {
			ans1= helper(i-1, j-1, k, rs, gs, bs, dp)+ rs[i-1]*gs[j-1];
		}
		
		if(i>=1&&k>=1) {
			ans2= helper(i-1, j, k-1, rs, gs, bs, dp)+ rs[i-1]*bs[k-1];
		}
		
		if(k>=1&&j>=1) {
			ans3= helper(i, j-1, k-1, rs, gs, bs, dp)+ bs[k-1]*gs[j-1];
		}
		
		dp[i][j][k]=Math.max(ans1, Math.max(ans2,  ans3));
		
		return dp[i][j][k];
		
		
	}
	
	public static boolean helper(int a, int b, int c) {
		
		int count=0;
		if(a>=1) count++;
		if(b>=1) count++;
		if(c>=1) count++;
		
		return (count>=2);
		
	}
	
	public static boolean isPossible(int n, int m, int arr1[], int arr2[], int val) {
		
		
		for(int i=0;i<n;i++) {
			
			boolean found=false;
			
			for(int j=0;j<m;j++) {
				
				int num= arr1[i]&arr2[j];
				
				int val1= num|val;
				
				if((val1^val)==0) {
					found=true;
					break;
				}
				
			}
			
			if(!found) return false;
		}
		
		return true;
		
		
	}
	
	
	
	public static void B(int n, int m, char arr[][]) {
		
		
		int ans=0;
		
		for(int j=0;j<m-1;j++) {
			if(arr[n-1][j]=='D') {
				ans++;
			}
		}
		
		for(int i=0;i<n-1;i++) {
			if(arr[i][m-1]=='R') {
				ans++;
			}
		}
		
		System.out.println(ans);
		
		
	}
	
	
	
	
	
	
	public static void D(int n,int m, String arr[]) {
		
		
		if(n>=4&&m>=4) {
			System.out.println(-1);
			return;
		}
		
		if(n==1||m==1) {
			System.out.println(0);
			return;
		}
		
		
		if(n==2) {
			
		}
		
	}
	
	
}
