#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>

#include <iostream>
#include <complex>
#include <string>
#include <algorithm>
#include <numeric>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>

#include <functional>
#include <cassert>

typedef long long ll;
using namespace std;

#ifndef LOCAL
#define debug(x) ;
#else
#define debug(x) cerr << __LINE__ << " : " << #x << " = " << (x) << endl;

template <typename T1, typename T2>
ostream &operator<<(ostream &out, const pair<T1, T2> &p) {
  out << "{" << p.first << ", " << p.second << "}";
  return out;
}

template <typename T>
ostream &operator<<(ostream &out, const vector<T> &v) {
  out << '{';
  for (const T &item : v) out << item << ", ";
  out << "\b\b}";
  return out;
}
#endif

#define mod 1000000007 //1e9+7(prime number)
#define INF 1000000000 //1e9
#define LLINF 2000000000000000000LL //2e18
#define SIZE 200010

/* 再帰下降法 */
// char *p = str; res = expr(p);

int term(char* &s);
int number(char* &s);
int factor(char* &s);
int expr(char* &s);

const int LIMIT = 1 << 10;

//数
int number(char* &s){
  if (!*s) throw "number";

  int res = 0;
  while('0' <= *s && *s <= '9')
    res = res*2 + (*s++ - '0');

  if (*s == '(') throw "number";

  if (res < 0 || LIMIT <= res)
    throw "number";

  return res;
}

//乗算除算(優先順位:高)
int term(char* &s){
  if (!*s) throw "term";

  int res = factor(s);
  while(1){
    if(*s == '*') res *= factor(++s);
    else if(*s == '/') res /= factor(++s);
    else break;

    if (res < 0 || LIMIT <= res)
      throw "term";
  }

  if (res < 0 || LIMIT <= res)
    throw "term";

  return res;
}

//括弧か数
int factor(char* &s){
  if (!*s) throw "factor";
  if (!isdigit(*s) && *s != '(') throw "factor";

  if(*s != '(') return number(s);
  int res = expr(++s);

  if (!*s) throw "factor";

  s++;

  if (res < 0 || LIMIT <= res)
    throw "factor";

  return res;
}

//式(優先順位: 低)
int expr(char* &s){
  if (!*s) throw "expr";

  int res = term(s);
  while(1){
    if(*s == '+') res += term(++s);
    else if(*s == '-') res -= term(++s);
    else break;

    if (res < 0 || LIMIT <= res)
      throw "term";
  }

  if (res < 0 || LIMIT <= res)
    throw "expr";

  return res;
}

bool check(string s) {
  stack<int> st;

  for (int i=0; i<s.size(); i++) {
    switch (s[i]) {
    case '(':
      st.push(1);
      break;
    case ')': {
      if (st.empty()) return false;
      if (st.top() > 0) return false;
      while(st.size() && st.top() < 0) st.pop();
      if (st.empty()) return false;
      st.pop();
    }
      break;
    case '0':
    case '1':
      break;
    default:
      st.push(-1);
      break;
    }
  }

  while(st.size() && st.top() < 0)
    st.pop();

  return st.empty();
}


int calc(string s2) {
  if (!check(s2)) return -1;

  char s[1000];
  strcpy(s, s2.c_str());
  char *p = s;

  try{
    int res = expr(p);

    if (*p) return -1;

    return res;

  }catch(...){

    return -1;
  }
}

int main(){
  string str;

  cin >> str;

  vector<int> dots;

  for (int i=0; i<str.size(); i++)
    if (str[i] == '.') dots.push_back(i);

  int ans = -1;

  int limit = 7 * 7 * 7 * 7 * 7;
  for (int i=0; i<limit; i++) {
    int tmp = i;

    for (int p : dots) {
      str[p] = "01+-*()"[tmp % 7];
      tmp /= 7;
    }

    int res = calc(str);
    if (ans < res) {
      debug(str); debug(res);
    }

    ans = max(ans, res);
  }

  cout << ans << endl;

  return 0;
}



Measured memory_bytes: 3268