Bike loves looking for the second maximum element in the sequence. The second maximum element in the sequence of distinct numbers x1, x2, ..., xk (k > 1) is such maximum element xj, that the following inequality holds: <image>.

The lucky number of the sequence of distinct positive integers x1, x2, ..., xk (k > 1) is the number that is equal to the bitwise excluding OR of the maximum element of the sequence and the second maximum element of the sequence.

You've got a sequence of distinct positive integers s1, s2, ..., sn (n > 1). Let's denote sequence sl, sl + 1, ..., sr as s[l..r] (1 ≤ l < r ≤ n). Your task is to find the maximum number among all lucky numbers of sequences s[l..r].

Note that as all numbers in sequence s are distinct, all the given definitions make sence.

Input

The first line contains integer n (1 < n ≤ 105). The second line contains n distinct integers s1, s2, ..., sn (1 ≤ si ≤ 109).

Output

Print a single integer — the maximum lucky number among all lucky numbers of sequences s[l..r].

Examples

Input

5
5 2 1 4 3


Output

7


Input

5
9 8 3 5 7


Output

15

Note

For the first sample you can choose s[4..5] = {4, 3} and its lucky number is (4 xor 3) = 7. You can also choose s[1..2].

For the second sample you must choose s[2..5] = {8, 3, 5, 7}.
import static java.util.Arrays.deepToString;

import java.io.*;
import java.math.*;
import java.util.*;

import static java.lang.Math.max;

public class B {

	static void solve() {
		int n = nextInt();
		int[] a = new int[n];
		for (int i = 0; i < n; i++) {
			a[i] = nextInt();
		}
		int ans = getOK(a);
		writer.println(ans);
	}

	static boolean isSet(int x, int bit) {
		return ((x >> bit) & 1) != 0;
	}

	static int getOK(int[] a) {
		int goodBit;
		for (goodBit = 30; goodBit >= 0; goodBit--) {
			boolean all = true, any = false;
			for (int v : a) {
				all &= isSet(v, goodBit);
				any |= isSet(v, goodBit);
			}
			if (!all && any) {
				break;
			}
		}
		boolean[] set = new boolean[a.length];
		for (int i = 0; i < a.length; i++) {
			set[i] = isSet(a[i], goodBit);
		}
		int ret = 0;
		for (int i = 0; i < a.length; i++) {
			if (set[i]) {
				int left_max = 0;
				for (int j = i - 1; j >= 0 && !set[j]; j--) {
					left_max = max(left_max, a[j]);
					ret = max(ret, a[i] ^ left_max);
				}
				int right_max = 0;
				for (int j = i + 1; j < a.length && !set[j]; j++) {
					right_max = max(right_max, a[j]);
					ret = max(ret, a[i] ^ right_max);
				}
			}
		}
		return ret;
	}

	public static void main(String[] args) throws Exception {
		reader = new BufferedReader(new InputStreamReader(System.in));
		writer = new PrintWriter(System.out);
		Locale.setDefault(Locale.US);

		setTime();
		solve();
		printTime();
		printMemory();

		writer.close();
	}

	static BufferedReader reader;
	static PrintWriter writer;
	static StringTokenizer tok = new StringTokenizer("");
	static long systemTime;

	static void debug(Object... o) {
		System.err.println(deepToString(o));
	}

	static void setTime() {
		systemTime = System.currentTimeMillis();
	}

	static void printTime() {
		System.err.println("Time consumed: " + (System.currentTimeMillis() - systemTime));
	}

	static void printMemory() {
		System.err.println("Memory consumed: "
				+ (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1000 + "kb");
	}

	static String next() {
		while (!tok.hasMoreTokens()) {
			String w = null;
			try {
				w = reader.readLine();
			} catch (Exception e) {
				e.printStackTrace();
			}
			if (w == null)
				return null;
			tok = new StringTokenizer(w);
		}
		return tok.nextToken();
	}

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

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

	static double nextDouble() {
		return Double.parseDouble(next());
	}

	static BigInteger nextBigInteger() {
		return new BigInteger(next());
	}
}