Problem: There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move on red tiles, he can move only on black tiles.

Write a program to count the number of black tiles which he can reach by repeating the moves described above.



Input

The input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20.

There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.

* '.' - a black tile
* '#' - a red tile
* '@' - a man on a black tile(appears exactly once in a data set)


The end of the input is indicated by a line consisting of two zeros.

Output

For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).

Examples

Input

6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0


Output

45
59
6
13


Input

6 9
....#.
.....#
......
......
......
......
......
@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
.###
...@...
.###
..#.#..
..#.#..
0 0


Output

45
59
6
13

Solution (in JAVA):

Solution:
public class Main{
  static int topx = 0;
  static int topy = 0;
  public void run(java.io.InputStream in, java.io.PrintStream out){
    java.util.Scanner sc = new java.util.Scanner(in);
/*answer*/
    int w, h, i, j, res;
    char[][] field;
    int[][] count;
    int[] nowx, nowy;
    String str;

    for(;;){
      w = sc.nextInt(); h = sc.nextInt();
      if(w == 0 && h == 0)break;
      field = new char[h][w]; count = new int[h][w];
      nowx = new int[h * w + 1]; nowy = new int[h * w + 1];
      for(i = 0;i < h;i++)for(j = 0;j < w;j++)count[i][j] = 0;
      res = 0;

      for(i = 0;i < h;i++){
        str = sc.next();
        for(j = 0;j < w;j++){
          field[i][j] = str.charAt(j);
          if(field[i][j] == '@'){
            pushx(nowx, i); pushy(nowy, j); count[i][j]++; res++;
          }
        }
      }

      for(;;){
        if(topx == 0)break;
        i = seetopx(nowx); j = seetopy(nowy);
        if(i != 0 && field[i - 1][j] == '.' && count[i - 1][j] == 0){
          pushx(nowx, i - 1); pushy(nowy, j); count[i - 1][j]++; res++;
        }else if(j != 0 && field[i][j - 1] == '.' && count[i][j - 1] == 0){
          pushx(nowx, i); pushy(nowy, j - 1); count[i][j - 1]++; res++;
        }else if(i != h - 1 && field[i + 1][j] == '.' && count[i + 1][j] == 0){
          pushx(nowx, i + 1); pushy(nowy, j); count[i + 1][j]++; res++;
        }else if(j != w - 1 && field[i][j + 1] == '.' && count[i][j + 1] == 0){
          pushx(nowx, i); pushy(nowy, j + 1); count[i][j + 1]++; res++;
        }else{
          i = popx(nowx); j = popy(nowy);
        }
      }

      out.println(res);
    }

    sc.close();
  }
  public static void main(String[] args){
    (new Main()).run(System.in, System.out);
  }
  private static int popx(int[] stack){
    return stack[--topx];
  }
  private static void pushx(int[] stack, int a){
    stack[topx++] = a; return;
  }
  private static int seetopx(int[] stack){
    return stack[topx - 1];
  }
  private static int popy(int[] stack){
    return stack[--topy];
  }
  private static void pushy(int[] stack, int a){
    stack[topy++] = a; return;
  }
  private static int seetopy(int[] stack){
    return stack[topy - 1];
  }
}