#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#define INF 105

using namespace std;
vector <int> vec[INF*INF];
int dis[INF][INF],Dif[INF],Dfn,Du[INF*INF],MAXN=5000;
bool vis[INF*INF];
void Pre_vec(int i,int j)
{
    vec[i].push_back(j),vec[j].push_back(i);
    if (i<MAXN) Du[i]++;
    if (j<MAXN) Du[j]++;
}
void Pre_node()
{
    int i;
    for (Dfn=0,i=1;i+1<dis[1][2];i++)
        Pre_vec(i,i+1); Dfn=i;
    Pre_vec(1,1+MAXN),Pre_vec(i,2+MAXN);
}
void dfs(int n,int dis)
{
    if (n>MAXN) {
        Dif[n-MAXN]=dis; return ;
    }
    int i,j,siz=vec[n].size();
    for (i=vis[n]=0;i<siz;i++)
        if (vis[j=vec[n][i]])
            dfs(j,dis+1);
}
void Pre_dfs(int n)
{
    memset(vis,true,sizeof(vis));
    dfs(n,0);
}
int Check(int n)
{
    int i,dif=dis[n][1]-Dif[1];
    for (i=2;i<n;i++)
        if (dif!=dis[n][i]-Dif[i])
            return 0;
    return dif;
}
void Inc_node(int n)
{
    int i,j,dif;
    for (i=1;i<=Dfn;i++)
        if (Pre_dfs(i),dif=Check(n),dif)
            break;
    if (dif==1) {
        Pre_vec(i,n+MAXN); return ;
    }
    Pre_vec(i,++Dfn);
    for (j=1;j+1<dif;j++)
        Pre_vec(Dfn,Dfn+1),++Dfn;
    Pre_vec(Dfn,n+MAXN);
}
int main()
{
    int i,j,n;
    while (scanf("%d",&n),n)
    {
        memset(Du,0,sizeof(Du));
        for (i=1;i<=n;i++)
            for (j=1;j<=n;j++)
                scanf("%d",&dis[i][j]);
        Pre_node();
        for (i=3;i<=n;i++)
            Inc_node(i);
        for (sort(Du+1,Du+Dfn+1),i=1;i<=Dfn;i++)
            printf("%d%c",Du[i],i==Dfn?'\n':' '),vec[i].clear();
    }
    return 0;
}