import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Scanner;
import static java.lang.Math.*;

public class Main {
    final static long MOD = 1000000007;

    public static void main(String[] args) throws ArithmeticException {
        Object o = run();
        if (o != null)
            System.out.println(o);
    }

    static Object run() throws ArithmeticException {
        try (Scanner sc = new Scanner(System.in)) {
            // Main Code
            long a = sc.nextLong();
            long b = sc.nextLong();
            long c = sc.nextLong();
            long d = sc.nextLong();
            long max = Long.MIN_VALUE;
            max = max(max,a*c);
            max = max(max,a*d);
            max = max(max,b*c);
            max = max(max,b*d);
            return max;
        }
    }

}

class ChenNumberUtil {
    /**
     * nが素数かどうかを判定します。
     *
     * @param n 素数か判定したい値
     * @return boolean 素数か否か
     */
    static boolean isPrime(long n) {
        if (n == 1)
            return false;
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0)
                return false;
        }
        return true;
    }

    /**
     * nの約数の配列を求めます。
     *
     * @param n 約数を取得したい値
     * @return 約数の配列
     */
    static Collection<Long> getDivisors(long n) {
        ArrayList<Long> al = new ArrayList<>();
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                al.add(i);
                if (n / i != i)
                    al.add(n / i);
            }
        }
        Collections.sort(al);
        return al;
    }

    /**
     * nの約数の個数を求めます。
     *
     * @param n 約数の個数を取得したい値
     * @return 約数の個数
     */
    static long getDivisorsCount(long n) {
        long count = 0;
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                count++;
                if (n / i != i)
                    count++;
            }
        }
        return count;
    }

    /**
     * nの約数の総和を求めます。
     *
     * @param n 約数を取得したい値
     * @return 約数の配列
     */
    static long getDivisorsSum(long n) {
        long sum = 0;
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                sum += i;
                if (n / i != i)
                    sum += n / i;
            }
        }
        return sum;
    }

    /**
     * nの素因数分解の数列を求めます。
     *
     * @param n , not {@code null}
     * @return 素因数分解のペア配列 <素因数, 指数>
     */
    static Collection<Pair<Long, Long>> primeFactorize(long n) {
        ArrayList<Pair<Long, Long>> al = new ArrayList<>();
        for (long a = 2; a * a <= n; ++a) {
            if (n % a != 0)
                continue;
            long ex = 0;

            while (n % a == 0) {
                ex++;
                n /= a;
            }

            al.add(new Pair<>(a, ex));
        }
        if (n != 1)
            al.add(new Pair<>(n, 1l));
        return al;
    }

    /**
     * 最大公約数を求めます。1が返る場合、xとyは互いに素です。
     *
     * @param x 自然数1
     * @param y 自然数2
     * @return 最大公約数
     * @throws Error x,yのどちらかが0だよ
     */
    static long getGCD(long x, long y) throws Error {
        long r;
        if (x == 0 || y == 0) {
            throw new Error("Invalid Value");
        }
        while ((r = x % y) != 0) {
            x = y;
            y = r;
        }
        return y;
    }

    /**
     *
     * @param a
     * @param p
     * @return
     * @throws Error
     */
    static long modInvert(long a, long p) throws Error {
        if (ChenNumberUtil.getGCD(a, p) != 1)
            throw new Error("Inverse element does not exist");
        long b = p, u = 1, v = 0;
        while (b != 0) {
            long t = a / b, temp;

            a -= t * b;
            temp = a;
            a = b;
            b = temp;

            u -= t * v;
            temp = u;
            u = v;
            v = temp;
        }
        u %= p;
        if (u < 0)
            u += p;
        return u;
    }
}

class ChenBitUtil {
    static int popCount(int bit) {
        return Integer.bitCount(bit);
    }

    static boolean isFlag(int bit, int i) {
        return 0 != (bit & (1 << i));
    }

    static int setTrue(int bit, int i) {
        return bit |= (1 << i);
    }

    static int setFalse(int bit, int i) {
        return bit &= ~(1 << i);
    }

    static int setReverse(int bit, int i) {
        return isFlag(bit, i) ? setFalse(bit, i) : setTrue(bit, i);
    }

    static int reverseAll(int bit) {
        return ~bit;
    }
}

/**
 * ペアで値を格納します
 *
 * @param <K>
 * @param <V>
 */
class Pair<K, V> extends AbstractMap.SimpleEntry<K, V> {
    /** serialVersionUID. */
    private static final long serialVersionUID = 6411527075103472113L;

    public Pair(final K key, final V value) {
        super(key, value);
    }
} import java.util.AbstractMap; AbstractMap java.util import java.util.ArrayList; ArrayList java.util import java.util.Collection; Collection java.util import java.util.Collections; Collections java.util import java.util.Scanner; Scanner java.util import static java.lang.Math.*; import static java.lang.Math.*; import static java.lang.Math.*; public class Main {
    final static long MOD = 1000000007;

    public static void main(String[] args) throws ArithmeticException {
        Object o = run();
        if (o != null)
            System.out.println(o);
    }

    static Object run() throws ArithmeticException {
        try (Scanner sc = new Scanner(System.in)) {
            // Main Code
            long a = sc.nextLong();
            long b = sc.nextLong();
            long c = sc.nextLong();
            long d = sc.nextLong();
            long max = Long.MIN_VALUE;
            max = max(max,a*c);
            max = max(max,a*d);
            max = max(max,b*c);
            max = max(max,b*d);
            return max;
        }
    }

} Main final static long MOD = 1000000007; MOD 1000000007 public static void main(String[] args) throws ArithmeticException {
        Object o = run();
        if (o != null)
            System.out.println(o);
    } main {
        Object o = run();
        if (o != null)
            System.out.println(o);
    } Object o = run(); o run() run if (o != null)
            System.out.println(o); o != null o null System.out.println(o) System.out.println System.out System System.out o String[] args args static Object run() throws ArithmeticException {
        try (Scanner sc = new Scanner(System.in)) {
            // Main Code
            long a = sc.nextLong();
            long b = sc.nextLong();
            long c = sc.nextLong();
            long d = sc.nextLong();
            long max = Long.MIN_VALUE;
            max = max(max,a*c);
            max = max(max,a*d);
            max = max(max,b*c);
            max = max(max,b*d);
            return max;
        }
    } run {
        try (Scanner sc = new Scanner(System.in)) {
            // Main Code
            long a = sc.nextLong();
            long b = sc.nextLong();
            long c = sc.nextLong();
            long d = sc.nextLong();
            long max = Long.MIN_VALUE;
            max = max(max,a*c);
            max = max(max,a*d);
            max = max(max,b*c);
            max = max(max,b*d);
            return max;
        }
    } try (Scanner sc = new Scanner(System.in)) {
            // Main Code
            long a = sc.nextLong();
            long b = sc.nextLong();
            long c = sc.nextLong();
            long d = sc.nextLong();
            long max = Long.MIN_VALUE;
            max = max(max,a*c);
            max = max(max,a*d);
            max = max(max,b*c);
            max = max(max,b*d);
            return max;
        } {
            // Main Code
            long a = sc.nextLong();
            long b = sc.nextLong();
            long c = sc.nextLong();
            long d = sc.nextLong();
            long max = Long.MIN_VALUE;
            max = max(max,a*c);
            max = max(max,a*d);
            max = max(max,b*c);
            max = max(max,b*d);
            return max;
        } Scanner sc = new Scanner(System.in) Scanner sc = new Scanner(System.in) new Scanner(System.in) long a = sc.nextLong(); a sc.nextLong() sc.nextLong sc long b = sc.nextLong(); b sc.nextLong() sc.nextLong sc long c = sc.nextLong(); c sc.nextLong() sc.nextLong sc long d = sc.nextLong(); d sc.nextLong() sc.nextLong sc long max = Long.MIN_VALUE; max Long.MIN_VALUE Long Long.MIN_VALUE max = max(max,a*c) max max(max,a*c) max max a*c a c max = max(max,a*d) max max(max,a*d) max max a*d a d max = max(max,b*c) max max(max,b*c) max max b*c b c max = max(max,b*d) max max(max,b*d) max max b*d b d return max; max class ChenNumberUtil {
    /**
     * nが素数かどうかを判定します。
     *
     * @param n 素数か判定したい値
     * @return boolean 素数か否か
     */
    static boolean isPrime(long n) {
        if (n == 1)
            return false;
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0)
                return false;
        }
        return true;
    }

    /**
     * nの約数の配列を求めます。
     *
     * @param n 約数を取得したい値
     * @return 約数の配列
     */
    static Collection<Long> getDivisors(long n) {
        ArrayList<Long> al = new ArrayList<>();
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                al.add(i);
                if (n / i != i)
                    al.add(n / i);
            }
        }
        Collections.sort(al);
        return al;
    }

    /**
     * nの約数の個数を求めます。
     *
     * @param n 約数の個数を取得したい値
     * @return 約数の個数
     */
    static long getDivisorsCount(long n) {
        long count = 0;
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                count++;
                if (n / i != i)
                    count++;
            }
        }
        return count;
    }

    /**
     * nの約数の総和を求めます。
     *
     * @param n 約数を取得したい値
     * @return 約数の配列
     */
    static long getDivisorsSum(long n) {
        long sum = 0;
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                sum += i;
                if (n / i != i)
                    sum += n / i;
            }
        }
        return sum;
    }

    /**
     * nの素因数分解の数列を求めます。
     *
     * @param n , not {@code null}
     * @return 素因数分解のペア配列 <素因数, 指数>
     */
    static Collection<Pair<Long, Long>> primeFactorize(long n) {
        ArrayList<Pair<Long, Long>> al = new ArrayList<>();
        for (long a = 2; a * a <= n; ++a) {
            if (n % a != 0)
                continue;
            long ex = 0;

            while (n % a == 0) {
                ex++;
                n /= a;
            }

            al.add(new Pair<>(a, ex));
        }
        if (n != 1)
            al.add(new Pair<>(n, 1l));
        return al;
    }

    /**
     * 最大公約数を求めます。1が返る場合、xとyは互いに素です。
     *
     * @param x 自然数1
     * @param y 自然数2
     * @return 最大公約数
     * @throws Error x,yのどちらかが0だよ
     */
    static long getGCD(long x, long y) throws Error {
        long r;
        if (x == 0 || y == 0) {
            throw new Error("Invalid Value");
        }
        while ((r = x % y) != 0) {
            x = y;
            y = r;
        }
        return y;
    }

    /**
     *
     * @param a
     * @param p
     * @return
     * @throws Error
     */
    static long modInvert(long a, long p) throws Error {
        if (ChenNumberUtil.getGCD(a, p) != 1)
            throw new Error("Inverse element does not exist");
        long b = p, u = 1, v = 0;
        while (b != 0) {
            long t = a / b, temp;

            a -= t * b;
            temp = a;
            a = b;
            b = temp;

            u -= t * v;
            temp = u;
            u = v;
            v = temp;
        }
        u %= p;
        if (u < 0)
            u += p;
        return u;
    }
} ChenNumberUtil /**
     * nが素数かどうかを判定します。
     *
     * @param n 素数か判定したい値
     * @return boolean 素数か否か
     */
    static boolean isPrime(long n) {
        if (n == 1)
            return false;
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0)
                return false;
        }
        return true;
    } isPrime {
        if (n == 1)
            return false;
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0)
                return false;
        }
        return true;
    } if (n == 1)
            return false; n == 1 n 1 return false; false for (long i = 1; i * i <= n; i++) {
            if (n % i == 0)
                return false;
        } long i = 1; long i = 1; i 1 i * i <= n i * i i i n i++ i++ i {
            if (n % i == 0)
                return false;
        } {
            if (n % i == 0)
                return false;
        } if (n % i == 0)
                return false; n % i == 0 n % i n i 0 return false; false return true; true long n n /**
     * nの約数の配列を求めます。
     *
     * @param n 約数を取得したい値
     * @return 約数の配列
     */
    static Collection<Long> getDivisors(long n) {
        ArrayList<Long> al = new ArrayList<>();
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                al.add(i);
                if (n / i != i)
                    al.add(n / i);
            }
        }
        Collections.sort(al);
        return al;
    } getDivisors {
        ArrayList<Long> al = new ArrayList<>();
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                al.add(i);
                if (n / i != i)
                    al.add(n / i);
            }
        }
        Collections.sort(al);
        return al;
    } ArrayList<Long> al = new ArrayList<>(); al new ArrayList<>() for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                al.add(i);
                if (n / i != i)
                    al.add(n / i);
            }
        } long i = 1; long i = 1; i 1 i * i <= n i * i i i n i++ i++ i {
            if (n % i == 0) {
                al.add(i);
                if (n / i != i)
                    al.add(n / i);
            }
        } {
            if (n % i == 0) {
                al.add(i);
                if (n / i != i)
                    al.add(n / i);
            }
        } if (n % i == 0) {
                al.add(i);
                if (n / i != i)
                    al.add(n / i);
            } n % i == 0 n % i n i 0 {
                al.add(i);
                if (n / i != i)
                    al.add(n / i);
            } al.add(i) al.add al i if (n / i != i)
                    al.add(n / i); n / i != i n / i n i i al.add(n / i) al.add al n / i n i Collections.sort(al) Collections.sort Collections al return al; al long n n /**
     * nの約数の個数を求めます。
     *
     * @param n 約数の個数を取得したい値
     * @return 約数の個数
     */
    static long getDivisorsCount(long n) {
        long count = 0;
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                count++;
                if (n / i != i)
                    count++;
            }
        }
        return count;
    } getDivisorsCount {
        long count = 0;
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                count++;
                if (n / i != i)
                    count++;
            }
        }
        return count;
    } long count = 0; count 0 for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                count++;
                if (n / i != i)
                    count++;
            }
        } long i = 1; long i = 1; i 1 i * i <= n i * i i i n i++ i++ i {
            if (n % i == 0) {
                count++;
                if (n / i != i)
                    count++;
            }
        } {
            if (n % i == 0) {
                count++;
                if (n / i != i)
                    count++;
            }
        } if (n % i == 0) {
                count++;
                if (n / i != i)
                    count++;
            } n % i == 0 n % i n i 0 {
                count++;
                if (n / i != i)
                    count++;
            } count++ count if (n / i != i)
                    count++; n / i != i n / i n i i count++ count return count; count long n n /**
     * nの約数の総和を求めます。
     *
     * @param n 約数を取得したい値
     * @return 約数の配列
     */
    static long getDivisorsSum(long n) {
        long sum = 0;
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                sum += i;
                if (n / i != i)
                    sum += n / i;
            }
        }
        return sum;
    } getDivisorsSum {
        long sum = 0;
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                sum += i;
                if (n / i != i)
                    sum += n / i;
            }
        }
        return sum;
    } long sum = 0; sum 0 for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                sum += i;
                if (n / i != i)
                    sum += n / i;
            }
        } long i = 1; long i = 1; i 1 i * i <= n i * i i i n i++ i++ i {
            if (n % i == 0) {
                sum += i;
                if (n / i != i)
                    sum += n / i;
            }
        } {
            if (n % i == 0) {
                sum += i;
                if (n / i != i)
                    sum += n / i;
            }
        } if (n % i == 0) {
                sum += i;
                if (n / i != i)
                    sum += n / i;
            } n % i == 0 n % i n i 0 {
                sum += i;
                if (n / i != i)
                    sum += n / i;
            } sum += i sum i if (n / i != i)
                    sum += n / i; n / i != i n / i n i i sum += n / i sum n / i n i return sum; sum long n n /**
     * nの素因数分解の数列を求めます。
     *
     * @param n , not {@code null}
     * @return 素因数分解のペア配列 <素因数, 指数>
     */
    static Collection<Pair<Long, Long>> primeFactorize(long n) {
        ArrayList<Pair<Long, Long>> al = new ArrayList<>();
        for (long a = 2; a * a <= n; ++a) {
            if (n % a != 0)
                continue;
            long ex = 0;

            while (n % a == 0) {
                ex++;
                n /= a;
            }

            al.add(new Pair<>(a, ex));
        }
        if (n != 1)
            al.add(new Pair<>(n, 1l));
        return al;
    } primeFactorize {
        ArrayList<Pair<Long, Long>> al = new ArrayList<>();
        for (long a = 2; a * a <= n; ++a) {
            if (n % a != 0)
                continue;
            long ex = 0;

            while (n % a == 0) {
                ex++;
                n /= a;
            }

            al.add(new Pair<>(a, ex));
        }
        if (n != 1)
            al.add(new Pair<>(n, 1l));
        return al;
    } ArrayList<Pair<Long, Long>> al = new ArrayList<>(); al new ArrayList<>() for (long a = 2; a * a <= n; ++a) {
            if (n % a != 0)
                continue;
            long ex = 0;

            while (n % a == 0) {
                ex++;
                n /= a;
            }

            al.add(new Pair<>(a, ex));
        } long a = 2; long a = 2; a 2 a * a <= n a * a a a n ++a ++a a {
            if (n % a != 0)
                continue;
            long ex = 0;

            while (n % a == 0) {
                ex++;
                n /= a;
            }

            al.add(new Pair<>(a, ex));
        } {
            if (n % a != 0)
                continue;
            long ex = 0;

            while (n % a == 0) {
                ex++;
                n /= a;
            }

            al.add(new Pair<>(a, ex));
        } if (n % a != 0)
                continue; n % a != 0 n % a n a 0 continue; long ex = 0; ex 0 while (n % a == 0) {
                ex++;
                n /= a;
            } n % a == 0 n % a n a 0 {
                ex++;
                n /= a;
            } ex++ ex n /= a n a al.add(new Pair<>(a, ex)) al.add al new Pair<>(a, ex) if (n != 1)
            al.add(new Pair<>(n, 1l)); n != 1 n 1 al.add(new Pair<>(n, 1l)) al.add al new Pair<>(n, 1l) return al; al long n n /**
     * 最大公約数を求めます。1が返る場合、xとyは互いに素です。
     *
     * @param x 自然数1
     * @param y 自然数2
     * @return 最大公約数
     * @throws Error x,yのどちらかが0だよ
     */
    static long getGCD(long x, long y) throws Error {
        long r;
        if (x == 0 || y == 0) {
            throw new Error("Invalid Value");
        }
        while ((r = x % y) != 0) {
            x = y;
            y = r;
        }
        return y;
    } getGCD {
        long r;
        if (x == 0 || y == 0) {
            throw new Error("Invalid Value");
        }
        while ((r = x % y) != 0) {
            x = y;
            y = r;
        }
        return y;
    } long r; r if (x == 0 || y == 0) {
            throw new Error("Invalid Value");
        } x == 0 || y == 0 x == 0 x 0 y == 0 y 0 {
            throw new Error("Invalid Value");
        } throw new Error("Invalid Value"); new Error("Invalid Value") while ((r = x % y) != 0) {
            x = y;
            y = r;
        } (r = x % y) != 0 (r = x % y) r x % y x y 0 {
            x = y;
            y = r;
        } x = y x y y = r y r return y; y long x x long y y /**
     *
     * @param a
     * @param p
     * @return
     * @throws Error
     */
    static long modInvert(long a, long p) throws Error {
        if (ChenNumberUtil.getGCD(a, p) != 1)
            throw new Error("Inverse element does not exist");
        long b = p, u = 1, v = 0;
        while (b != 0) {
            long t = a / b, temp;

            a -= t * b;
            temp = a;
            a = b;
            b = temp;

            u -= t * v;
            temp = u;
            u = v;
            v = temp;
        }
        u %= p;
        if (u < 0)
            u += p;
        return u;
    } modInvert {
        if (ChenNumberUtil.getGCD(a, p) != 1)
            throw new Error("Inverse element does not exist");
        long b = p, u = 1, v = 0;
        while (b != 0) {
            long t = a / b, temp;

            a -= t * b;
            temp = a;
            a = b;
            b = temp;

            u -= t * v;
            temp = u;
            u = v;
            v = temp;
        }
        u %= p;
        if (u < 0)
            u += p;
        return u;
    } if (ChenNumberUtil.getGCD(a, p) != 1)
            throw new Error("Inverse element does not exist"); ChenNumberUtil.getGCD(a, p) != 1 ChenNumberUtil.getGCD(a, p) ChenNumberUtil.getGCD ChenNumberUtil a p 1 throw new Error("Inverse element does not exist"); new Error("Inverse element does not exist") long b = p b p u = 1 u 1 v = 0; v 0 while (b != 0) {
            long t = a / b, temp;

            a -= t * b;
            temp = a;
            a = b;
            b = temp;

            u -= t * v;
            temp = u;
            u = v;
            v = temp;
        } b != 0 b 0 {
            long t = a / b, temp;

            a -= t * b;
            temp = a;
            a = b;
            b = temp;

            u -= t * v;
            temp = u;
            u = v;
            v = temp;
        } long t = a / b t a / b a b temp; temp a -= t * b a t * b t b temp = a temp a a = b a b b = temp b temp u -= t * v u t * v t v temp = u temp u u = v u v v = temp v temp u %= p u p if (u < 0)
            u += p; u < 0 u 0 u += p u p return u; u long a a long p p class ChenBitUtil {
    static int popCount(int bit) {
        return Integer.bitCount(bit);
    }

    static boolean isFlag(int bit, int i) {
        return 0 != (bit & (1 << i));
    }

    static int setTrue(int bit, int i) {
        return bit |= (1 << i);
    }

    static int setFalse(int bit, int i) {
        return bit &= ~(1 << i);
    }

    static int setReverse(int bit, int i) {
        return isFlag(bit, i) ? setFalse(bit, i) : setTrue(bit, i);
    }

    static int reverseAll(int bit) {
        return ~bit;
    }
} ChenBitUtil static int popCount(int bit) {
        return Integer.bitCount(bit);
    } popCount {
        return Integer.bitCount(bit);
    } return Integer.bitCount(bit); Integer.bitCount(bit) Integer.bitCount Integer bit int bit bit static boolean isFlag(int bit, int i) {
        return 0 != (bit & (1 << i));
    } isFlag {
        return 0 != (bit & (1 << i));
    } return 0 != (bit & (1 << i)); 0 != (bit & (1 << i)) 0 (bit & (1 << i)) bit (1 << i) 1 i int bit bit int i i static int setTrue(int bit, int i) {
        return bit |= (1 << i);
    } setTrue {
        return bit |= (1 << i);
    } return bit |= (1 << i); bit |= (1 << i) bit (1 << i) 1 i int bit bit int i i static int setFalse(int bit, int i) {
        return bit &= ~(1 << i);
    } setFalse {
        return bit &= ~(1 << i);
    } return bit &= ~(1 << i); bit &= ~(1 << i) bit ~(1 << i) (1 << i) 1 i int bit bit int i i static int setReverse(int bit, int i) {
        return isFlag(bit, i) ? setFalse(bit, i) : setTrue(bit, i);
    } setReverse {
        return isFlag(bit, i) ? setFalse(bit, i) : setTrue(bit, i);
    } return isFlag(bit, i) ? setFalse(bit, i) : setTrue(bit, i); isFlag(bit, i) ? setFalse(bit, i) : setTrue(bit, i) isFlag(bit, i) isFlag bit i setFalse(bit, i) setFalse bit i setTrue(bit, i) setTrue bit i int bit bit int i i static int reverseAll(int bit) {
        return ~bit;
    } reverseAll {
        return ~bit;
    } return ~bit; ~bit bit int bit bit class Pair<K, V> extends AbstractMap.SimpleEntry<K, V> {
    /** serialVersionUID. */
    private static final long serialVersionUID = 6411527075103472113L;

    public Pair(final K key, final V value) {
        super(key, value);
    }
} Pair /** serialVersionUID. */
    private static final long serialVersionUID = 6411527075103472113L; serialVersionUID 6411527075103472113L public Pair(final K key, final V value) {
        super(key, value);
    } Pair {
        super(key, value);
    } super(key, value) super key value final K key key final V value value SimpleEntry public class Main {
    final static long MOD = 1000000007;

    public static void main(String[] args) throws ArithmeticException {
        Object o = run();
        if (o != null)
            System.out.println(o);
    }

    static Object run() throws ArithmeticException {
        try (Scanner sc = new Scanner(System.in)) {
            // Main Code
            long a = sc.nextLong();
            long b = sc.nextLong();
            long c = sc.nextLong();
            long d = sc.nextLong();
            long max = Long.MIN_VALUE;
            max = max(max,a*c);
            max = max(max,a*d);
            max = max(max,b*c);
            max = max(max,b*d);
            return max;
        }
    }

} public class Main {
    final static long MOD = 1000000007;

    public static void main(String[] args) throws ArithmeticException {
        Object o = run();
        if (o != null)
            System.out.println(o);
    }

    static Object run() throws ArithmeticException {
        try (Scanner sc = new Scanner(System.in)) {
            // Main Code
            long a = sc.nextLong();
            long b = sc.nextLong();
            long c = sc.nextLong();
            long d = sc.nextLong();
            long max = Long.MIN_VALUE;
            max = max(max,a*c);
            max = max(max,a*d);
            max = max(max,b*c);
            max = max(max,b*d);
            return max;
        }
    }

} Main
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Scanner;
import static java.lang.Math.*;

public class Main {
    final static long MOD = 1000000007;

    public static void main(String[] args) throws ArithmeticException {
        Object o = run();
        if (o != null)
            System.out.println(o);
    }

    static Object run() throws ArithmeticException {
        try (Scanner sc = new Scanner(System.in)) {
            // Main Code
            long a = sc.nextLong();
            long b = sc.nextLong();
            long c = sc.nextLong();
            long d = sc.nextLong();
            long max = Long.MIN_VALUE;
            max = max(max,a*c);
            max = max(max,a*d);
            max = max(max,b*c);
            max = max(max,b*d);
            return max;
        }
    }

}

class ChenNumberUtil {
    /**
     * nが素数かどうかを判定します。
     *
     * @param n 素数か判定したい値
     * @return boolean 素数か否か
     */
    static boolean isPrime(long n) {
        if (n == 1)
            return false;
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0)
                return false;
        }
        return true;
    }

    /**
     * nの約数の配列を求めます。
     *
     * @param n 約数を取得したい値
     * @return 約数の配列
     */
    static Collection<Long> getDivisors(long n) {
        ArrayList<Long> al = new ArrayList<>();
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                al.add(i);
                if (n / i != i)
                    al.add(n / i);
            }
        }
        Collections.sort(al);
        return al;
    }

    /**
     * nの約数の個数を求めます。
     *
     * @param n 約数の個数を取得したい値
     * @return 約数の個数
     */
    static long getDivisorsCount(long n) {
        long count = 0;
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                count++;
                if (n / i != i)
                    count++;
            }
        }
        return count;
    }

    /**
     * nの約数の総和を求めます。
     *
     * @param n 約数を取得したい値
     * @return 約数の配列
     */
    static long getDivisorsSum(long n) {
        long sum = 0;
        for (long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                sum += i;
                if (n / i != i)
                    sum += n / i;
            }
        }
        return sum;
    }

    /**
     * nの素因数分解の数列を求めます。
     *
     * @param n , not {@code null}
     * @return 素因数分解のペア配列 <素因数, 指数>
     */
    static Collection<Pair<Long, Long>> primeFactorize(long n) {
        ArrayList<Pair<Long, Long>> al = new ArrayList<>();
        for (long a = 2; a * a <= n; ++a) {
            if (n % a != 0)
                continue;
            long ex = 0;

            while (n % a == 0) {
                ex++;
                n /= a;
            }

            al.add(new Pair<>(a, ex));
        }
        if (n != 1)
            al.add(new Pair<>(n, 1l));
        return al;
    }

    /**
     * 最大公約数を求めます。1が返る場合、xとyは互いに素です。
     *
     * @param x 自然数1
     * @param y 自然数2
     * @return 最大公約数
     * @throws Error x,yのどちらかが0だよ
     */
    static long getGCD(long x, long y) throws Error {
        long r;
        if (x == 0 || y == 0) {
            throw new Error("Invalid Value");
        }
        while ((r = x % y) != 0) {
            x = y;
            y = r;
        }
        return y;
    }

    /**
     *
     * @param a
     * @param p
     * @return
     * @throws Error
     */
    static long modInvert(long a, long p) throws Error {
        if (ChenNumberUtil.getGCD(a, p) != 1)
            throw new Error("Inverse element does not exist");
        long b = p, u = 1, v = 0;
        while (b != 0) {
            long t = a / b, temp;

            a -= t * b;
            temp = a;
            a = b;
            b = temp;

            u -= t * v;
            temp = u;
            u = v;
            v = temp;
        }
        u %= p;
        if (u < 0)
            u += p;
        return u;
    }
}

class ChenBitUtil {
    static int popCount(int bit) {
        return Integer.bitCount(bit);
    }

    static boolean isFlag(int bit, int i) {
        return 0 != (bit & (1 << i));
    }

    static int setTrue(int bit, int i) {
        return bit |= (1 << i);
    }

    static int setFalse(int bit, int i) {
        return bit &= ~(1 << i);
    }

    static int setReverse(int bit, int i) {
        return isFlag(bit, i) ? setFalse(bit, i) : setTrue(bit, i);
    }

    static int reverseAll(int bit) {
        return ~bit;
    }
}

/**
 * ペアで値を格納します
 *
 * @param <K>
 * @param <V>
 */
class Pair<K, V> extends AbstractMap.SimpleEntry<K, V> {
    /** serialVersionUID. */
    private static final long serialVersionUID = 6411527075103472113L;

    public Pair(final K key, final V value) {
        super(key, value);
    }
}