#include <bits/stdc++.h>
using namespace std;
int n, m;
char d[1010][1010];
char r[1010][1010];
char g[1010][1010];
bool gorightr(vector<int>&, int, int);
bool godownl(vector<int>&, int, int);
bool godownr(vector<int>& res, int si, int sj) {
  for (int i = si; i < n; i++) {
    d[i][sj] = 'm';
    if (sj + 1 < m && d[i][sj + 1] != '.') {
      res.push_back(i - si);
      return gorightr(res, i, sj);
    } else {
      if (i + 1 == n || d[i + 1][sj] == '.') {
        res.push_back(i - si);
        return true;
      }
    }
  }
  return true;
}
bool gorightr(vector<int>& res, int si, int sj) {
  for (int j = sj; j < m; j++) {
    d[si][j] = 'm';
    if (j != sj && si > 0 && d[si - 1][j] != '.') return false;
    if (j + 1 == m || d[si][j + 1] == '.') {
      res.push_back(j - sj);
      if (si + 1 == n || d[si + 1][j] == '.') return true;
      return godownr(res, si, j);
    }
  }
  return true;
}
bool gorightl(vector<int>& res, int si, int sj) {
  for (int j = sj; j < m; j++) {
    d[si][j] = 'm';
    if (si + 1 < n && d[si + 1][j] != '.') {
      res.push_back(j - sj);
      return godownl(res, si, j);
    } else {
      if (j + 1 == m || d[si][j + 1] == '.') {
        res.push_back(j - sj);
        return true;
      }
    }
  }
  return true;
}
bool canI(int si, int sj, int ej) {
  for (int j = sj; j < ej; j++)
    if (r[si][j] != 'X') return false;
  return true;
}
void fillI(int si, int sj, int ej) {
  for (int j = sj; j < ej; j++) r[si][j] = 'm';
}
bool canJ(int sj, int si, int ei) {
  for (int i = si; i < ei; i++)
    if (r[i][sj] != 'X') return false;
  return true;
}
void fillJ(int sj, int si, int ei) {
  for (int i = si; i < ei; i++) r[i][sj] = 'm';
}
bool canI1(int si, int sj, int ej) {
  for (int j = sj; j < ej; j++)
    if (g[si][j] != 'X') return false;
  return true;
}
void fillI1(int si, int sj, int ej) {
  for (int j = sj; j < ej; j++) g[si][j] = 'm';
}
bool canJ1(int sj, int si, int ei) {
  for (int i = si; i < ei; i++)
    if (g[i][sj] != 'X') return false;
  return true;
}
void fillJ1(int sj, int si, int ei) {
  for (int i = si; i < ei; i++) g[i][sj] = 'm';
}
bool godownl(vector<int>& res, int si, int sj) {
  for (int i = si; i < n; i++) {
    d[i][sj] = 'm';
    if (i != si && sj > 0 && d[i][sj - 1] != '.') return false;
    if (i + 1 == n || d[i + 1][sj] == '.') {
      res.push_back(i - si);
      if (sj + 1 == m || d[i][sj + 1] == '.') return true;
      return gorightl(res, i, sj);
    }
  }
  return true;
}
bool notfill() {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (r[i][j] == 'X') return true;
    }
  }
  return false;
}
bool notfill1() {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (g[i][j] == 'X') return true;
    }
  }
  return false;
}
int main() {
  cin >> n >> m;
  int sI, sJ;
  for (int i = 0; i < n; i++) cin >> d[i];
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) r[i][j] = g[i][j] = d[i][j];
  }
  vector<int> res1;
  vector<int> res2;
  bool be = true;
  for (int i = 0; i < n && be; i++) {
    for (int j = 0; j < m && be; j++) {
      if (d[i][j] == 'X') {
        sI = i;
        sJ = j;
        bool r1 = gorightr(res1, i, j);
        bool r2 = godownl(res2, i, j);
        if (r1 == false || r2 == false) {
          cout << -1;
          return 0;
        }
        be = false;
      }
    }
  }
  const int STRI = sI;
  const int STRJ = sJ;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (d[i][j] == 'X') {
        if (i == 0 || i == n - 1 || j == 0 || j == m - 1) {
          cout << -1;
          return 0;
        }
        if (d[i - 1][j] == '.' || d[i + 1][j] == '.' || d[i][j - 1] == '.' ||
            d[i][j + 1] == '.') {
          cout << -1;
          return 0;
        }
      }
    }
  }
  for (int i = 0; i < n - 1; i++) {
    for (int j = 0; j < m - 1; j++) {
      if (d[i][j] != '.' && d[i][j + 1] != '.' && d[i + 1][j] != '.' &&
          d[i + 1][j + 1] == '.') {
        cout << -1;
        return 0;
      }
    }
  }
  if (res1.size() == 1 && res2.size() == 1) {
    cout << 1;
    return 0;
  }
  bool incorrectR = false;
  int h, w;
  if (res1[1] == res2[0]) {
    h = 1;
    w = res1[0] + 1;
  } else if (res1[1] < res2[0]) {
    w = res1[0] + 1;
    h = res2[0] - res1[1] + 1;
  } else {
    h = res2[0] + 1;
    w = res1[0] - res2[1] + 1;
  }
  for (int i = sI; i < sI + h; i++) {
    for (int j = sJ; j < sJ + w; j++) {
      r[i][j] = 'm';
    }
  }
  while (true) {
    bool cani = canI(sI + h, sJ, sJ + w);
    bool canj = canJ(sJ + w, sI, sI + h);
    if (cani && canj) {
      incorrectR = true;
    }
    if (!cani && !canj) {
      break;
    }
    if (cani) {
      fillI(sI + h, sJ, sJ + w);
      sI++;
    } else {
      fillJ(sJ + w, sI, sI + h);
      sJ++;
    }
  }
  int first = h * w;
  if (notfill()) incorrectR = true;
  bool incorrectG = false;
  if (res2[1] == res1[0]) {
    w = 1;
    h = res2[0] + 1;
  } else if (res2[1] < res1[0]) {
    w = res1[0] - res2[1] + 1;
    h = res2[0] + 1;
  } else {
    h = res2[0] - res1[1] + 1;
    w = res1[0] + 1;
  }
  sI = STRI;
  sJ = STRJ;
  for (int i = sI; i < sI + h; i++) {
    for (int j = sJ; j < sJ + w; j++) {
      g[i][j] = 'm';
    }
  }
  while (true) {
    bool cani = canI1(sI + h, sJ, sJ + w);
    bool canj = canJ1(sJ + w, sI, sI + h);
    if (cani && canj) {
      incorrectG = true;
    }
    if (!cani && !canj) {
      break;
    }
    if (cani) {
      fillI1(sI + h, sJ, sJ + w);
      sI++;
    } else {
      fillJ1(sJ + w, sI, sI + h);
      sJ++;
    }
  }
  int second = h * w;
  if (notfill1()) incorrectG = true;
  if (incorrectR && incorrectG) cout << -1;
  if (incorrectR && !incorrectG) cout << second;
  if (!incorrectR && incorrectG) cout << first;
  if (!incorrectR && !incorrectG) cout << std::min(second, first);
  return 0;
}
