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:
import java.io.*;
import java.util.*;


public class Main {
	public static void main(String[] args) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));       
		try {
			String line;
			while(true){
				/* input */
				line = br.readLine();

				int w = Integer.parseInt(line.split(" ")[0]);
				int h = Integer.parseInt(line.split(" ")[1]);
				if(w == 0 && h == 0){
					return;
				} 
				int[][] field = new int[h][w];
				int[] pos = new int[2]; 
				for(int i=0;i<h;i++){
					String str = br.readLine();
					for(int j=0;j<w;j++){
						if(str.charAt(j)=='.'){
							field[i][j] = 1;
						} else if(str.charAt(j)=='#'){
							field[i][j] = 0;
						} else {
							field[i][j] = 2;
							pos[0] = i;
							pos[1] = j;
						}
					}
				}
				/*
				for(int i=0;i<h;i++){
					for(int j=0;j<w;j++){
						System.out.print(field[i][j]);
					}
					System.out.println();
				}
				*/
				/* processing */
				int res = search(pos[0],pos[1],field,h,w);
				
				res = 0;
				
				for(int i=0;i<h;i++){
					for(int j=0;j<w;j++){
						if(field[i][j]==2){
							res++;
						}
					}
				}
				
				/* output */
				System.out.println(res);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static int search(int posi, int posj, int[][] field,int h,int w){
		int sum = 1;
		field[posi][posj] = 2;
		
		//up
		if(posi>0&&field[posi-1][posj]==1){
			sum = 1 + search(posi-1,posj,field,h,w);
		}
		//right
		if(posj<w-1&&field[posi][posj+1]==1){
			sum = 1 + search(posi,posj+1,field,h,w);
		}
		
		//down
		if(posi<h-1&&field[posi+1][posj]==1){
			sum = 1 + search(posi+1,posj,field,h,w);
		}
		
		//left
		if(posj>0&&field[posi][posj-1]==1){			
			sum = 1 + search(posi,posj-1,field,h,w);
		}

		return sum;
	}
	
}