#include <bits/stdc++.h>
#define f first
#define s second
#define fore(i,a,b) for(int i = (a), ThxMK = (b); i < ThxMK; ++i)
#define pb push_back
#define all(s) begin(s), end(s)
#define lb(c, x) distance((c).begin(), lower_bound(all(c), (x)))
#define ub(c, x) distance((c).begin(), upper_bound(all(c), (x)))
#define _ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define sz(s) int(s.size())
#define ENDL '\n'
#define vv(type, name, h, ...) vector<vector<type>> name(h, vector<type>(__VA_ARGS__))
#define vvv(type, name, h, w, ...) vector<vector<vector<type>>> name(h, vector<vector<type>>(w, vector<type>(__VA_ARGS__)))
using namespace std;
typedef long double ld;
typedef long long lli;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef vector<lli> vl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef vector<ii> vii;

#define deb(x) cout << #x": " << (x) << endl;

const int N = 105;
const int MX = 32000;
const lli INF = 1e18;
const lli MOD = 1e9+7;

vi primes(1,2);
vector<vector<ld>>nk;
void sieve(){
	vi m(N+1,0);
	for(int i = 4; i<N; i+=2)m[i]=1;
	for(int i = 3; i*i<=N; i+=2)if(!m[i])for(int j = i*i; j<N; j+=i)m[j]=1;
	for(int i = 3; i<N; i+=2)if(!m[i])primes.pb(i);
}

void pascal(){
	nk =vector<vector<ld>>(N,vector<ld>(N,0.0));
	fore(i,0,N)nk[i][0]=nk[i][i]=1.0;
	fore(i,1,N)fore(j,1,i)nk[i][j]=nk[i-1][j-1]+nk[i-1][j];
}

lli gcd(lli a, lli b){return (b?gcd(b,a%b):a);}

lli lcm(lli a, lli b){
	if(a<b)swap(a,b);
	lli c = gcd(a,b);
	a/=c;
	return a*b;
}

int popcount(lli x) { return __builtin_popcountll(x); }

lli poww(lli a, lli b){
	lli res =1;
	while(b){
		if(b&1) res = res * a;
		a = a*a;
		b/=2;
	}
	return res;
}

lli powm(lli a, lli b){
	lli res =1;
	while(b){
		if(b&1) res = (res * a)%MOD;
		a = (a*a)%MOD;
		b/=2;
	}
	return res;
}

bool isPrime(lli x){
	if(x==1)return 0;
	for(auto i:primes){
		if(i*i>x)return 1;
		if(x%i==0)return 0;
	}
	return 1;
}


lli SUM(lli a, lli b, lli mod=MOD){
	return (a+b+mod)%mod;
}

lli PROD(lli a, lli b, lli mod=MOD){
	a%=mod; b%=mod;
	return a*b % mod;
}

int dx[4]={0,0,1,-1}, dy[4]={1,-1,0,0};

vvi graph(int n, int m){
	vv(int,v,n+1,0);
	fore(i,0,m){
		int a,b; cin>>a>>b;
		v[a].pb(b);
		v[b].pb(a);
	}
	return v;
}

// ---- コーディングはここから！ ('-')7

map<ii,bool>dp;
vi v;
int n,res;

bool valid(lli a){
	return a>=-MX and a<=MX;
}
bool f(int u, int sum){
	//cout<<u<<" "<<sum<<ENDL;
	if(u==n)return sum==res;
	if(dp.count({u,sum}))return dp[{u,sum}];
	bool can = 0;
	if(valid(sum+v[u]))can|=f(u+1,sum+v[u]);
	if(valid(sum*v[u]))can|=f(u+1,sum*v[u]);
	if(valid(sum-v[u]))can|=f(u+1,sum-v[u]);
	if(v[u]!=0 and sum%v[u]==0 and valid(sum/v[u]))can|=f(u+1,sum/v[u]);
	return dp[{u,sum}]=can;
}

void rec(int u, int sum){
	if(u==n-1){
		cout<<v[u]<<"="<<res<<ENDL;
		return;
	}
	if(dp.count({u+1,sum+v[u]}) and dp[{u+1,sum+v[u]}]){
		cout<<v[u]<<"+";
		rec(u+1,sum+v[u]);
		return;
	}
	if(dp.count({u+1,sum-v[u]}) and dp[{u+1,sum-v[u]}]){
			cout<<v[u]<<"-";
			rec(u+1,sum-v[u]);
			return;
	}
	if(dp.count({u+1,sum*v[u]}) and dp[{u+1,sum*v[u]}]){
		cout<<v[u]<<"*";
		rec(u+1,sum*v[u]);
		return;
	}
	if(dp.count({u+1,sum/v[u]}) and dp[{u+1,sum/v[u]}]){
		cout<<v[u]<<"/";
		rec(u+1,sum/v[u]);
		return;
	}
}

void solve(){
lli a,b,c,d; cin>>a>>b>>c>>d;
	vl v= {a*c, a*d, b*c, b*d};
	cout<<*max_element(all(v))<<ENDL;
}

int main(){_
//	int t; cin>>t; while(t--)

	solve();
}


Measured memory_bytes: 3652