#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>

using namespace std;


vector<string> vs;
bool used[1010][100];

int search(int x,int y){
  // 0->E,1->º,2->¶,3->ã
  int sit=0;
  int cx=x;
  int cy=y;
  int over=1;
  int under=1;

  int high=0;

  int dx=1;
  int dy=0;

  int miny=10000000;
  int maxy=-1000000;
  while(1){
    used[cy][cx]=true;
    if(sit==0){
      int nx=cx+dx;
      int ny=cy+dy;
      if(nx>=0&&ny>=0&&ny<vs.size()&&nx<vs[ny].size()
	 &&vs[ny][nx]=='*'){
	cx=nx;
	cy=ny;
	miny=min(miny,ny);
	maxy=max(maxy,ny);
	over++;
      }
      // ºÖÚ®·éBÚ®ûüàT·
      else{
	for(int i = -1; i <=1; i++){
	  int nnx=cx+i;
	  int nny=cy+1;
	  int nnnx=nnx+i;
	  int nnny=nny+1;
	  if(nnx>=0&&nny<vs.size()&&nny>=0&&nnx<vs[nny].size()
	     &&vs[nny][nnx]=='*'
	     &&nnnx>=0&&nnny<vs.size()&&nnny>=0&&nnnx<vs[nnny].size()
	     &&vs[nnny][nnnx]=='*'
	     ){
	    dy=1;
	    dx=i;
	    break;
	  }
	}
	sit=1;
      }
    }
    else if(sit==1){
      int nx=cx+dx;
      int ny=cy+dy;
      if(nx>=0&&ny<vs.size()&&ny>=0&&nx<vs[ny].size()
	 &&vs[ny][nx]=='*'){
	cx=nx;
	cy=ny;
	miny=min(miny,ny);
	maxy=max(maxy,ny);
      }
      else{
	// ¶ÖÚ®
	dx=-1;
	dy=0;
	sit=2;
      }
    }
    else if(sit==2){
      int nx=cx+dx;
      int ny=cy+dy;
      if(nx>=0&&ny<vs.size()&&ny>=0&&nx<vs[ny].size()
	 &&vs[ny][nx]=='*'){
	under++;
	cx=nx;
	cy=ny;
	miny=min(miny,ny);
	maxy=max(maxy,ny);
      }
      else{
	// ãÖÚ®
	for(int i = -1; i <=1; i++){
	  int nnx=cx+i;
	  int nny=cy-1;
	  int nnnx=nnx+i;
	  int nnny=nny-1;
	  if(nnx>=0&&nny<vs.size()&&nny>=0&&nnx<vs[nny].size()
	     &&vs[nny][nnx]=='*'
	     &&nnnx>=0&&nnny<vs.size()&&nnny>=0&&nnnx<vs[nnny].size()
	     &&vs[nnny][nnnx]=='*'
	     ){
	    // if(nnx>=0&&nny>=0&&nny<vs.size()&&nnx<vs[nny].size()
	    //  &&vs[nny][nnx]=='*'){
	    dy=-1;
	    dx=i;
	    break;
	  }
	}
	sit=3;
      }
    }
    else{
      int nx=cx+dx;
      int ny=cy+dy;
      //cout<<ny<<" "<<nx<<" "<<y<<" "<<x<<endl;
      cx=nx;
      cy=ny;
      if(ny==y&&nx==x)
	break;
    }
  }
  int res=(over+under)*(abs(miny-maxy)+1)/2;
  return res;
}

int main(){

  int n;
  bool b=false;
  while(cin>>n&&n!=0){
    if(b){
      cout<<"----------"<<endl;
    }
    b=true;
    memset(used,0,sizeof(used));
    int maxLength=0;
    string str;
    getline(cin,str);
    for(int i = 0; i < n; i++){
      getline(cin,str);
      vs.push_back(str);
      maxLength=max(maxLength,(int)str.size());
    }
    for(int i = 0; i < n; i++){
      int diff=maxLength-vs[i].size();
      for(int j = 0; j < diff; j++){
	vs[i]+=' ';
      }
    }
    map<int,int> mii;
    int res=0;
    for(int i = 0; i < vs.size(); i++){
      for(int j= 0;j<vs[i].size();j++){
	if(vs[i][j]=='*'&&!used[i][j]){
	  //cout<<i<<" "<<j<<endl;
	  //cout<<search(j,i)<<endl;
	  mii[search(j,i)]++;
	}
      }
    }
    for(map<int,int>::iterator it=mii.begin();it!=mii.end();it++){
      cout<<it->first<<" "<<it->second<<endl;
    }
    vs.clear();
  }
  return 0;
}