Problem: A Garden with Ponds

Mr. Gardiner is a modern garden designer who is excellent at utilizing the terrain features. His design method is unique: he first decides the location of ponds and design them with the terrain features intact.

According to his unique design procedure, all of his ponds are rectangular with simple aspect ratios. First, Mr. Gardiner draws a regular grid on the map of the garden site so that the land is divided into cells of unit square, and annotates every cell with its elevation. In his design method, a pond occupies a rectangular area consisting of a number of cells. Each of its outermost cells has to be higher than all of its inner cells. For instance, in the following grid map, in which numbers are elevations of cells, a pond can occupy the shaded area, where the outermost cells are shaded darker and the inner cells are shaded lighter. You can easily see that the elevations of the outermost cells are at least three and those of the inner ones are at most two.

<image>

A rectangular area on which a pond is built must have at least one inner cell. Therefore, both its width and depth are at least three.

When you pour water at an inner cell of a pond, the water can be kept in the pond until its level reaches that of the lowest outermost cells. If you continue pouring, the water inevitably spills over. Mr. Gardiner considers the larger capacity the pond has, the better it is. Here, the capacity of a pond is the maximum amount of water it can keep. For instance, when a pond is built on the shaded area in the above map, its capacity is (3 − 1) + (3 − 0) + (3 − 2) = 6, where 3 is the lowest elevation of the outermost cells and 1, 0, 2 are the elevations of the inner cells. Your mission is to write a computer program that, given a grid map describing the elevation of each unit square cell, calculates the largest possible capacity of a pond built in the site.

Note that neither of the following rectangular areas can be a pond. In the left one, the cell at the bottom right corner is not higher than the inner cell. In the right one, the central cell is as high as the outermost cells.

<image>

Input

The input consists of at most 100 datasets, each in the following format.


d w
e1, 1 ... e1, w
...
ed, 1 ... ed, w


The first line contains d and w, representing the depth and the width, respectively, of the garden site described in the map. They are positive integers between 3 and 10, inclusive. Each of the following d lines contains w integers between 0 and 9, inclusive, separated by a space. The x-th integer in the y-th line of the d lines is the elevation of the unit square cell with coordinates (x, y).

The end of the input is indicated by a line containing two zeros separated by a space.

Output

For each dataset, output a single line containing the largest possible capacity of a pond that can be built in the garden site described in the dataset. If no ponds can be built, output a single line containing a zero.

Sample Input


3 3
2 3 2
2 1 2
2 3 1
3 5
3 3 4 3 3
3 1 0 2 3
3 3 4 3 2
7 7
1 1 1 1 1 0 0
1 0 0 0 1 0 0
1 0 1 1 1 1 1
1 0 1 0 1 0 1
1 1 1 1 1 0 1
0 0 1 0 0 0 1
0 0 1 1 1 1 1
6 6
1 1 1 1 2 2
1 0 0 2 0 2
1 0 0 2 0 2
3 3 3 9 9 9
3 0 0 9 0 9
3 3 3 9 9 9
0 0


Output for the Sample Input


0
3
1
9






Example

Input

3 3
2 3 2
2 1 2
2 3 1
3 5
3 3 4 3 3
3 1 0 2 3
3 3 4 3 2
7 7
1 1 1 1 1 0 0
1 0 0 0 1 0 0
1 0 1 1 1 1 1
1 0 1 0 1 0 1
1 1 1 1 1 0 1
0 0 1 0 0 0 1
0 0 1 1 1 1 1
6 6
1 1 1 1 2 2
1 0 0 2 0 2
1 0 0 2 0 2
3 3 3 9 9 9
3 0 0 9 0 9
3 3 3 9 9 9
0 0


Output

0
3
1
9

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std; 
int d,w;
int main(){
	while(scanf(" %d%d",&d,&w)==2&&w!=0&&d!=0){
		int tbl[12][12]={};
		int ans=0;
		for(int i=1;i<=d;i++){	//d代表行数 
			for(int j=1;j<=w;j++){	//w代表列数 
				cin>>tbl[i][j];	//x,y仍然是，x代表列数，y代表行数,横坐标写在后面，纵坐标写在前面 
			}
		}
		//枚举所有矩形，每次枚举记录边界的最小值和区域的最大值，不满足则break，满足就记录面积
		//取max，至遍历完，关键在于边界的遍历注意坐标。
		//不妨每次枚举左上端点以及深度和宽度，则决定了一个矩形
		for(int i=1;i<=d-2;i++){	//(j,i)为枚举的左上端点 
			for(int j=1;j<=w-2;j++){
				for(int deep=3;deep+i-1<=d;deep++){	//枚举深度和宽度 
					for(int wid=3;wid+j-1<=w;wid++){
						//到此处矩形已经决定了
						//遍历边界
						int y,x;
						int outmii=100,inmiv=-1;
						for(x=0;x<wid;x++)	//水平向右遍历
						{
							if(tbl[i][x+j]<outmii) outmii=tbl[i][x+j];
							if(tbl[i+deep-1][x+j]<outmii) outmii=tbl[i+deep-1][x+j];
						}
						for(y=0;y<deep;y++)
						{
							if(tbl[y+i][j]<outmii) outmii = tbl[y+i][j];
							if(tbl[y+i][j+wid-1]<outmii) outmii = tbl[y+i][j+wid-1];
						}
						
						//遍历区域
						int sum=0;
						for(int x=1;x<wid-1;x++){
							for(int y=1;y<deep-1;y++){
								if(tbl[y+i][x+j]>inmiv) inmiv = tbl[y+i][x+j];
								sum+=outmii-tbl[y+i][x+j];
							}
						}
						
					//	if(i==1&&j==1&&wid==5&&deep==3){
					//		cout<<sum<<" "<<outmii<<" "<<inmiv<<endl;
					//	}
						
						if(inmiv >= outmii) continue;
						else{
							ans=max(ans,sum);
						} 
					}
				}
			}
		} 
		cout<<ans<<endl;
	}
} 

/*
3 3
2 3 2
2 1 2
2 3 1
3 5
3 3 4 3 3
3 1 0 2 3
3 3 4 3 2
7 7
1 1 1 1 1 0 0
1 0 0 0 1 0 0
1 0 1 1 1 1 1
1 0 1 0 1 0 1
1 1 1 1 1 0 1
0 0 1 0 0 0 1
0 0 1 1 1 1 1
6 6
1 1 1 1 2 2
1 0 0 2 0 2
1 0 0 2 0 2
3 3 3 9 9 9
3 0 0 9 0 9
3 3 3 9 9 9
0 0
*/