#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct dicionario
{
char chave[21];
int* linhas;
int tam_linhas;
}Dicionario;
void inicializa(Dicionario* tabela, int tam)
{
int i;
for(i=0; i < tam; i++)
tabela[i].tam_linhas = 0;
}
int code(char str[])//gera um codigo p a chave
{
int tam_str
= strlen(str
),aux
=0, i
, j
;
for(i=0,j=tam_str-1; i < tam_str; i++,j--)
aux
= aux
+ (str
[i
]-'a')*(pow(26,j
));
return aux;
}
int hash(int chave, int tam, int i)
{
return (chave%tam + i);
}
int naoTemRepeticaoDaLinha(int linha, int v[], int tam)
{
int i;//índice de reaplicação do Hash
char existe = 'N';
for(i = 0; i < tam; i++)
if(v[i] == linha)
existe = 'S';
return (existe == 'N');
}
void insereTabela(char* aux, Dicionario* tabela, int tam, int num_linha, int* num_chaves)
{
int pos, i=0;
char op_efetuada = 'N';
pos = hash(code(aux), tam, i);
//printf("%d\n", pos);
while(op_efetuada == 'N')
{
if(tabela[pos].tam_linhas == 0)//se nao houve conflito
{
strcpy(tabela
[pos
].
chave, aux
);//atualiza a chave
tabela[pos].tam_linhas++;//atualiza o tamanho
tabela
[pos
].
linhas = (int*) malloc(sizeof(int));//cria o vetor de linhas
if(tabela[pos].linhas == NULL)
{
printf("\nmemoria insuficiente");
}
tabela[pos].linhas[tabela[pos].tam_linhas - 1] = num_linha;//add a linha atual
op_efetuada = 'S';
*num_chaves = *num_chaves + 1;
}
else//houve conflito
{
if(strcmp(aux
, tabela
[pos
].
chave) == 0)//se a chave coincidir {
if(naoTemRepeticaoDaLinha(num_linha, tabela[pos].linhas, tabela[pos].tam_linhas))//se não houver repeticao de linha
{
tabela[pos].tam_linhas++;
tabela
[pos
].
linhas = (int*) realloc(tabela
[pos
].
linhas, (tabela
[pos
].
tam_linhas)*sizeof(int) );
if(tabela[pos].linhas == NULL)
{
printf("\nmemoria insuficiente");
}
tabela[pos].linhas[tabela[pos].tam_linhas - 1] = num_linha;
op_efetuada = 'S';
}
}
else//procura outra posicao
{
i++;
pos = hash(code(aux), tam, i);
}
}
}
}
void reallocaTabela(Dicionario* tabela, Dicionario* tabela2, int tam, int tam_temp)
{
int i,
j,
k,
pos;
char op_efetuada;
for(i=0; i < tam_temp; i++)
{
op_efetuada == 'N';
if(tabela[i].tam_linhas != 0)
{
j=0;
pos = hash(code(tabela[i].chave), tam, j);
while(op_efetuada == 'N')
{
if(tabela2[pos].tam_linhas == 0)//se nao houve conflito
{
strcpy(tabela2
[pos
].
chave, tabela
[i
].
chave);//atualiza a chave
tabela2[pos].tam_linhas = tabela[i].tam_linhas;//atualiza o tamanho
tabela2
[pos
].
linhas = (int*) malloc(tabela2
[pos
].
tam_linhas*sizeof(int));//cria o vetor de linhas
if(tabela2[pos].linhas == NULL)
{
printf("\nmemoria insuficiente");
}
for(k=0; k < tabela2[pos].tam_linhas; k++)
tabela2[pos].linhas[k] = tabela[i].linhas[k];
op_efetuada = 'S';
}
else//procura outra posicao
{
j++;
pos = hash(code(tabela[i].chave), tam, j);
}
}
}
}
}
///MAIN
int main()
{
int tam=11,
num_chaves=0,
i,//coeficiente anti-colisão
num_linha = 1,
tam_temp,
k,
pos;
float load_factor=0;//razão entre o número de chaves distintas na tabela e a capacidade máxima da tabela
char str[101], op_efetuada;
Dicionario
* tabela
= (Dicionario
*) malloc(tam
*sizeof(Dicionario
));
Dicionario* tabela2;
if(tabela == NULL)
{
printf("\nmemoria insuficiente");
}
inicializa(tabela, tam);//inicializa tabela com tam_linhas = 0;
//enquanto tiver linhas do texto para ler
while (scanf(" %100[^\n]", str
) && strcmp(str
, "$CONSULTAS") != 0) {
load_factor = (float) num_chaves/tam;
if(load_factor > 0.5 && num_chaves < 6000)//se load_factor for maior que 1/2
{
tam_temp = tam;
tam = tam*2 + 1;//duplique o tam
tabela2
= (Dicionario
*) malloc(tam
*sizeof(Dicionario
));
if(tabela2 == NULL)
{
printf("\nmemoria insuficiente");
}
inicializa(tabela2, tam);
reallocaTabela(tabela, tabela2, tam, tam_temp);
tabela = tabela2;
}
char* aux
= strtok(str
, " ");//strtok vai separar a string nas palavras
while (aux != NULL)
{
//printf("%s\n", aux);
insereTabela(aux, tabela, tam, num_linha, &num_chaves);
}
num_linha++;
}
//como no loop acima ja lemos o $CONSULTAS, so precisamos ler as consultas
while (scanf(" %20[^\n]", str
) == 1)//enquanto tiver consulta para ler {
i=0;
k=num_chaves;
op_efetuada == 'N';
pos = hash(code(str), tam, i);
while(op_efetuada == 'N')
{
if(strcmp(tabela
[pos
].
chave,str
) == 0) {
//tam_temp faz papel de contador
for(tam_temp = 0; tam_temp < tabela[pos].tam_linhas; tam_temp++)
printf("%d ", tabela
[pos
].
linhas[tam_temp
]);
op_efetuada == 'S';
}
else
{
if(k>0)
{
i++;
pos = hash(code(str), tam, i);
k--;
}
else
{
op_efetuada == 'S';
}
}
}
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8bWF0aC5oPgoKdHlwZWRlZiBzdHJ1Y3QgZGljaW9uYXJpbwp7CiAgICBjaGFyIGNoYXZlWzIxXTsKCiAgICBpbnQqIGxpbmhhczsKCiAgICBpbnQgdGFtX2xpbmhhczsKCn1EaWNpb25hcmlvOwoKdm9pZCBpbmljaWFsaXphKERpY2lvbmFyaW8qIHRhYmVsYSwgaW50IHRhbSkKewogICAgaW50IGk7CgogICAgZm9yKGk9MDsgaSA8IHRhbTsgaSsrKQogICAgICAgIHRhYmVsYVtpXS50YW1fbGluaGFzID0gMDsKfQoKaW50IGNvZGUoY2hhciBzdHJbXSkvL2dlcmEgdW0gY29kaWdvIHAgYSBjaGF2ZQp7CiAgICBpbnQgdGFtX3N0ciA9IHN0cmxlbihzdHIpLGF1eD0wLCBpLCBqOwoKICAgIGZvcihpPTAsaj10YW1fc3RyLTE7IGkgPCB0YW1fc3RyOyBpKyssai0tKQogICAgICAgIGF1eCA9IGF1eCArIChzdHJbaV0tJ2EnKSoocG93KDI2LGopKTsKCiAgICByZXR1cm4gYXV4Owp9CgppbnQgaGFzaChpbnQgY2hhdmUsIGludCB0YW0sIGludCBpKQp7CiAgICByZXR1cm4gKGNoYXZlJXRhbSArIGkpOwp9CgppbnQgbmFvVGVtUmVwZXRpY2FvRGFMaW5oYShpbnQgbGluaGEsIGludCB2W10sIGludCB0YW0pCnsKICAgIGludCBpOy8vw61uZGljZSBkZSByZWFwbGljYcOnw6NvIGRvIEhhc2gKCiAgICBjaGFyIGV4aXN0ZSA9ICdOJzsKCiAgICBmb3IoaSA9IDA7IGkgPCB0YW07IGkrKykKICAgICAgICBpZih2W2ldID09IGxpbmhhKQogICAgICAgICAgICBleGlzdGUgPSAnUyc7CgogICAgcmV0dXJuIChleGlzdGUgPT0gJ04nKTsKfQoKdm9pZCBpbnNlcmVUYWJlbGEoY2hhciogYXV4LCBEaWNpb25hcmlvKiB0YWJlbGEsIGludCB0YW0sIGludCBudW1fbGluaGEsIGludCogbnVtX2NoYXZlcykKewogICAgaW50IHBvcywgaT0wOwoKICAgIGNoYXIgb3BfZWZldHVhZGEgPSAnTic7CgogICAgcG9zID0gaGFzaChjb2RlKGF1eCksIHRhbSwgaSk7CgogICAgLy9wcmludGYoIiVkXG4iLCBwb3MpOwoKICAgIHdoaWxlKG9wX2VmZXR1YWRhID09ICdOJykKICAgIHsKCiAgICAgICAgaWYodGFiZWxhW3Bvc10udGFtX2xpbmhhcyA9PSAwKS8vc2UgbmFvIGhvdXZlIGNvbmZsaXRvCiAgICAgICAgewogICAgICAgICAgICBzdHJjcHkodGFiZWxhW3Bvc10uY2hhdmUsIGF1eCk7Ly9hdHVhbGl6YSBhIGNoYXZlCgogICAgICAgICAgICB0YWJlbGFbcG9zXS50YW1fbGluaGFzKys7Ly9hdHVhbGl6YSBvIHRhbWFuaG8KCiAgICAgICAgICAgIHRhYmVsYVtwb3NdLmxpbmhhcyA9IChpbnQqKSBtYWxsb2Moc2l6ZW9mKGludCkpOy8vY3JpYSBvIHZldG9yIGRlIGxpbmhhcwoKICAgICAgICAgICAgaWYodGFiZWxhW3Bvc10ubGluaGFzID09IE5VTEwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByaW50ZigiXG5tZW1vcmlhIGluc3VmaWNpZW50ZSIpOwoKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRhYmVsYVtwb3NdLmxpbmhhc1t0YWJlbGFbcG9zXS50YW1fbGluaGFzIC0gMV0gPSBudW1fbGluaGE7Ly9hZGQgYSBsaW5oYSBhdHVhbAoKICAgICAgICAgICAgb3BfZWZldHVhZGEgPSAnUyc7CgogICAgICAgICAgICAqbnVtX2NoYXZlcyA9ICpudW1fY2hhdmVzICsgMTsKCiAgICAgICAgfQogICAgICAgIGVsc2UvL2hvdXZlIGNvbmZsaXRvCiAgICAgICAgewoKICAgICAgICAgICAgaWYoc3RyY21wKGF1eCwgdGFiZWxhW3Bvc10uY2hhdmUpID09IDApLy9zZSBhIGNoYXZlIGNvaW5jaWRpcgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihuYW9UZW1SZXBldGljYW9EYUxpbmhhKG51bV9saW5oYSwgdGFiZWxhW3Bvc10ubGluaGFzLCB0YWJlbGFbcG9zXS50YW1fbGluaGFzKSkvL3NlIG7Do28gaG91dmVyIHJlcGV0aWNhbyBkZSBsaW5oYQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRhYmVsYVtwb3NdLnRhbV9saW5oYXMrKzsKCiAgICAgICAgICAgICAgICAgICAgdGFiZWxhW3Bvc10ubGluaGFzID0gKGludCopIHJlYWxsb2ModGFiZWxhW3Bvc10ubGluaGFzLCAodGFiZWxhW3Bvc10udGFtX2xpbmhhcykqc2l6ZW9mKGludCkgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYodGFiZWxhW3Bvc10ubGluaGFzID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxubWVtb3JpYSBpbnN1ZmljaWVudGUiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0YWJlbGFbcG9zXS5saW5oYXNbdGFiZWxhW3Bvc10udGFtX2xpbmhhcyAtIDFdID0gbnVtX2xpbmhhOwoKICAgICAgICAgICAgICAgICAgICBvcF9lZmV0dWFkYSA9ICdTJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlLy9wcm9jdXJhIG91dHJhIHBvc2ljYW8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaSsrOwoKICAgICAgICAgICAgICAgIHBvcyA9IGhhc2goY29kZShhdXgpLCB0YW0sIGkpOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgIH0KfQoKdm9pZCByZWFsbG9jYVRhYmVsYShEaWNpb25hcmlvKiB0YWJlbGEsIERpY2lvbmFyaW8qIHRhYmVsYTIsIGludCB0YW0sIGludCB0YW1fdGVtcCkKewogICAgaW50IGksCiAgICAgICAgaiwKICAgICAgICBrLAogICAgICAgIHBvczsKCiAgICBjaGFyIG9wX2VmZXR1YWRhOwoKICAgIGZvcihpPTA7IGkgPCB0YW1fdGVtcDsgaSsrKQogICAgewogICAgICAgIG9wX2VmZXR1YWRhID09ICdOJzsKCiAgICAgICAgaWYodGFiZWxhW2ldLnRhbV9saW5oYXMgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIGo9MDsKCiAgICAgICAgICAgIHBvcyA9IGhhc2goY29kZSh0YWJlbGFbaV0uY2hhdmUpLCB0YW0sIGopOwoKICAgICAgICAgICAgd2hpbGUob3BfZWZldHVhZGEgPT0gJ04nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZih0YWJlbGEyW3Bvc10udGFtX2xpbmhhcyA9PSAwKS8vc2UgbmFvIGhvdXZlIGNvbmZsaXRvCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHRhYmVsYTJbcG9zXS5jaGF2ZSwgdGFiZWxhW2ldLmNoYXZlKTsvL2F0dWFsaXphIGEgY2hhdmUKCiAgICAgICAgICAgICAgICAgICAgdGFiZWxhMltwb3NdLnRhbV9saW5oYXMgPSB0YWJlbGFbaV0udGFtX2xpbmhhczsvL2F0dWFsaXphIG8gdGFtYW5obwoKICAgICAgICAgICAgICAgICAgICB0YWJlbGEyW3Bvc10ubGluaGFzID0gKGludCopIG1hbGxvYyh0YWJlbGEyW3Bvc10udGFtX2xpbmhhcypzaXplb2YoaW50KSk7Ly9jcmlhIG8gdmV0b3IgZGUgbGluaGFzCgogICAgICAgICAgICAgICAgICAgIGlmKHRhYmVsYTJbcG9zXS5saW5oYXMgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5tZW1vcmlhIGluc3VmaWNpZW50ZSIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZvcihrPTA7IGsgPCB0YWJlbGEyW3Bvc10udGFtX2xpbmhhczsgaysrKQogICAgICAgICAgICAgICAgICAgICAgICB0YWJlbGEyW3Bvc10ubGluaGFzW2tdID0gdGFiZWxhW2ldLmxpbmhhc1trXTsKCiAgICAgICAgICAgICAgICAgICAgb3BfZWZldHVhZGEgPSAnUyc7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZS8vcHJvY3VyYSBvdXRyYSBwb3NpY2FvCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaisrOwoKICAgICAgICAgICAgICAgICAgICBwb3MgPSBoYXNoKGNvZGUodGFiZWxhW2ldLmNoYXZlKSwgdGFtLCBqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKCi8vL01BSU4KCgppbnQgbWFpbigpCnsKICAgIGludCB0YW09MTEsCiAgICAgICAgbnVtX2NoYXZlcz0wLAogICAgICAgIGksLy9jb2VmaWNpZW50ZSBhbnRpLWNvbGlzw6NvCiAgICAgICAgbnVtX2xpbmhhID0gMSwKICAgICAgICB0YW1fdGVtcCwKICAgICAgICBrLAogICAgICAgIHBvczsKCiAgICBmbG9hdCBsb2FkX2ZhY3Rvcj0wOy8vcmF6w6NvIGVudHJlIG8gbsO6bWVybyBkZSBjaGF2ZXMgZGlzdGludGFzIG5hIHRhYmVsYSBlIGEgY2FwYWNpZGFkZSBtw6F4aW1hIGRhIHRhYmVsYQoKICAgIGNoYXIgc3RyWzEwMV0sIG9wX2VmZXR1YWRhOwoKICAgIERpY2lvbmFyaW8qIHRhYmVsYSA9IChEaWNpb25hcmlvKikgbWFsbG9jKHRhbSpzaXplb2YoRGljaW9uYXJpbykpOwoKICAgIERpY2lvbmFyaW8qIHRhYmVsYTI7CgogICAgaWYodGFiZWxhID09IE5VTEwpCiAgICB7CiAgICAgICAgcHJpbnRmKCJcbm1lbW9yaWEgaW5zdWZpY2llbnRlIik7CgogICAgICAgIGV4aXQoMSk7CiAgICB9CgogICAgaW5pY2lhbGl6YSh0YWJlbGEsIHRhbSk7Ly9pbmljaWFsaXphIHRhYmVsYSBjb20gdGFtX2xpbmhhcyA9IDA7CgogICAgZnJlb3BlbigiTDNRMS5pbiIsInIiLHN0ZGluKTsKICAgIGZyZW9wZW4oIkwzUTEub3V0IiwidyIsc3Rkb3V0KTsKCiAgICBnZXRzKHN0cik7Ly9sw6ogJFRFWFRPCgogICAgLy9lbnF1YW50byB0aXZlciBsaW5oYXMgZG8gdGV4dG8gcGFyYSBsZXIKICAgIHdoaWxlIChzY2FuZigiICUxMDBbXlxuXSIsIHN0cikgJiYgc3RyY21wKHN0ciwgIiRDT05TVUxUQVMiKSAhPSAwKQogICAgewogICAgICAgIGxvYWRfZmFjdG9yID0gKGZsb2F0KSBudW1fY2hhdmVzL3RhbTsKCiAgICAgICAgaWYobG9hZF9mYWN0b3IgPiAwLjUgJiYgbnVtX2NoYXZlcyA8IDYwMDApLy9zZSBsb2FkX2ZhY3RvciBmb3IgbWFpb3IgcXVlIDEvMgogICAgICAgIHsKICAgICAgICAgICAgdGFtX3RlbXAgPSB0YW07CgogICAgICAgICAgICB0YW0gPSB0YW0qMiArIDE7Ly9kdXBsaXF1ZSBvIHRhbQoKICAgICAgICAgICAgdGFiZWxhMiA9IChEaWNpb25hcmlvKikgbWFsbG9jKHRhbSpzaXplb2YoRGljaW9uYXJpbykpOwoKICAgICAgICAgICAgaWYodGFiZWxhMiA9PSBOVUxMKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmludGYoIlxubWVtb3JpYSBpbnN1ZmljaWVudGUiKTsKCiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpbmljaWFsaXphKHRhYmVsYTIsIHRhbSk7CgogICAgICAgICAgICByZWFsbG9jYVRhYmVsYSh0YWJlbGEsIHRhYmVsYTIsIHRhbSwgdGFtX3RlbXApOwoKICAgICAgICAgICAgZnJlZSh0YWJlbGEpOwoKICAgICAgICAgICAgdGFiZWxhID0gdGFiZWxhMjsKICAgICAgICB9CgogICAgICAgIGNoYXIqIGF1eCA9IHN0cnRvayhzdHIsICIgIik7Ly9zdHJ0b2sgdmFpIHNlcGFyYXIgYSBzdHJpbmcgbmFzIHBhbGF2cmFzCgoKICAgICAgICB3aGlsZSAoYXV4ICE9IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICAvL3ByaW50ZigiJXNcbiIsIGF1eCk7CiAgICAgICAgICAgIGluc2VyZVRhYmVsYShhdXgsIHRhYmVsYSwgdGFtLCBudW1fbGluaGEsICZudW1fY2hhdmVzKTsKCiAgICAgICAgICAgIGF1eCA9IHN0cnRvayhOVUxMLCAiICIpOwogICAgICAgIH0KCiAgICAgICAgbnVtX2xpbmhhKys7CiAgICB9CgogICAgLy9jb21vIG5vIGxvb3AgYWNpbWEgamEgbGVtb3MgbyAkQ09OU1VMVEFTLCBzbyBwcmVjaXNhbW9zIGxlciBhcyBjb25zdWx0YXMKICAgIHdoaWxlIChzY2FuZigiICUyMFteXG5dIiwgc3RyKSA9PSAxKS8vZW5xdWFudG8gdGl2ZXIgY29uc3VsdGEgcGFyYSBsZXIKICAgIHsKICAgICAgICBpPTA7CgogICAgICAgIGs9bnVtX2NoYXZlczsKCiAgICAgICAgb3BfZWZldHVhZGEgPT0gJ04nOwoKICAgICAgICBwb3MgPSBoYXNoKGNvZGUoc3RyKSwgdGFtLCBpKTsKCiAgICAgICAgd2hpbGUob3BfZWZldHVhZGEgPT0gJ04nKQogICAgICAgIHsKICAgICAgICAgICAgaWYoc3RyY21wKHRhYmVsYVtwb3NdLmNoYXZlLHN0cikgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJpbnRmKCIlczogIixzdHIpOwoKICAgICAgICAgICAgICAgIC8vdGFtX3RlbXAgZmF6IHBhcGVsIGRlIGNvbnRhZG9yCiAgICAgICAgICAgICAgICBmb3IodGFtX3RlbXAgPSAwOyB0YW1fdGVtcCA8IHRhYmVsYVtwb3NdLnRhbV9saW5oYXM7IHRhbV90ZW1wKyspCiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZCAiLCB0YWJlbGFbcG9zXS5saW5oYXNbdGFtX3RlbXBdKTsKCiAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CgogICAgICAgICAgICAgICAgb3BfZWZldHVhZGEgPT0gJ1MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoaz4wKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGkrKzsKCiAgICAgICAgICAgICAgICAgICAgcG9zID0gaGFzaChjb2RlKHN0ciksIHRhbSwgaSk7CgogICAgICAgICAgICAgICAgICAgIGstLTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvcF9lZmV0dWFkYSA9PSAnUyc7CgogICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXM6IFxuIixzdHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgcmV0dXJuIDA7Cn0K