#include <bits/stdc++.h>
using namespace std;
char data[2005][2005];
int n, m, r, c, x, y;
struct node {
  int t, x, y, l, r;
  bool operator<(node a) const {
    if (l == a.l)
      return r > a.r;
    else
      return l > a.l;
  }
};
int ans = 0;
bool isok(int x, int y) {
  return x >= 0 && x < n && y >= 0 && y < m && data[x][y] != '*';
}
int vis[2005][2005];
void bfs() {
  priority_queue<node> q;
  q.push(node{0, r - 1, c - 1, 0, 0});
  vis[r - 1][c - 1] = 1;
  data[r - 1][c - 1] = '+';
  ans++;
  while (!q.empty()) {
    node u = q.top();
    q.pop();
    if (isok(u.x - 1, u.y) && vis[u.x - 1][u.y] != 1) {
      if (data[u.x - 1][u.y] != '+') {
        ans++;
        data[u.x - 1][u.y] = '+';
      }
      vis[u.x - 1][u.y]++;
      q.push(node{vis[u.x - 1][u.y], u.x - 1, u.y, u.l, u.r});
    }
    if (isok(u.x + 1, u.y) && vis[u.x + 1][u.y] != 1) {
      if (data[u.x + 1][u.y] != '+') {
        ans++;
        data[u.x + 1][u.y] = '+';
      }
      vis[u.x + 1][u.y]++;
      q.push(node{vis[u.x + 1][u.y], u.x + 1, u.y, u.l, u.r});
    }
    if (isok(u.x, u.y - 1) && vis[u.x][u.y - 1] != 1 && u.l + 1 <= x) {
      if (data[u.x][u.y - 1] != '+') {
        ans++;
        data[u.x][u.y - 1] = '+';
      }
      vis[u.x][u.y - 1]++;
      q.push(node{vis[u.x][u.y - 1], u.x, u.y - 1, u.l + 1, u.r});
    }
    if (isok(u.x, u.y + 1) && vis[u.x][u.y + 1] != 1 && u.r + 1 <= y) {
      if (data[u.x][u.y + 1] != '+') {
        ans++;
        data[u.x][u.y + 1] = '+';
      }
      vis[u.x][u.y + 1]++;
      q.push(node{vis[u.x][u.y + 1], u.x, u.y + 1, u.l, u.r + 1});
    }
  }
}
int main() {
  ans = 0;
  memset(vis, 0, sizeof(vis));
  scanf("%d %d", &n, &m);
  getchar();
  scanf("%d %d", &r, &c);
  getchar();
  scanf("%d %d", &x, &y);
  getchar();
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      data[i][j] = getchar();
    }
    getchar();
  }
  bfs();
  printf("%d", ans);
}
