#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX 10
int contas_validas = 0;
int contas_invalidas = 0;
typedef struct conta {
char saldo[1000000];
char limite_saldo[1000000];
char id[11];
struct conta * prox;
} Conta;
typedef struct movimento {
int tipo_movimento;
int opcao;
} Movimento;
int validar_id(char* id){
if (id[3] == '-' && id[9] == '-' && id[11] == '\0'){
int i = 0;
for(i = 0; i < 11; i++){
if(i != 3 && i != 9){
return 0;
}
}
}
}
else{
return 0;
}
return 1;
}
int validar_id2 (char* id) {
int componente_a = ((id[0]-'0')+ (id[1]-'0')+(id[2]-'0'));
int componente_b = ((id[4]-'0')+ (id[5]-'0')+(id[6]-'0')+(id[7]-'0')+(id[8]-'0'));
int componente_c = (id[10]-'0');
int soma1 = componente_a;
int soma2 = componente_a + componente_b;
int resto = soma2 % soma1;
if (resto == componente_c) {
return 1;
}
else {
return 0;
}
}
int validar_saldo(char *str) {
fprintf(stderr
, "DEBUG: valor passado: [%s]\n", str
); if (*str == '-') str++;
if (!isdigit((unsigned char)*str
)) return 0; /* empty strings return false */ while (*str) {
if (!isdigit((unsigned char)*str
)) return 0; str++;
}
return 1;
}
int validar_limite(char* str){
int i=1;
for(i = 1; str[i]!='\0' ; i++){
return 0;
}
}
}
return 1;
}
int validar_movimento (char * mov){
if (mov[0] == 0){
}
else if (mov[0] == 1){
}
else if (mov[0] == 2){
}
else{
return 0;
}
return 0;
}
void transferencia ( Conta* a , char id[] , char id2[] , char valor[] ){
int i=0;
int j=0;
int valor1;
int valor2;
for ( i; i<contas_validas ; i++){
if(strcmp( a
[i
].
id , id
) == 0) break;
}
for ( j ; j<contas_validas ; j++){
if(strcmp( a
[j
].
id , id2
) == 0) break;
}
valor1
= atoi(a
[i
].
saldo); valor2
= atoi(a
[j
].
saldo);
snprintf( a
[i
].
saldo , sizeof(a
[i
].
saldo) , "%d" , valor1
); snprintf( a
[j
].
saldo , sizeof(a
[j
].
saldo) , "%d" , valor2
); }
void deposito ( Conta* a , char id[] , char valor[] ){
int valor1;
int i=0;
for ( i ; i<contas_validas ; i++ ){
if(strcmp( a
[i
].
id , id
) == 0) break;
}
valor1
= atoi(a
[i
].
saldo); snprintf( a
[i
].
saldo , sizeof(a
[i
].
saldo) , "%d" , valor1
); }
void levantamento ( Conta* a , char id[] , char valor[] ){
int valor1;
int i=0;
for ( i ; i<contas_validas ; i++ ){
if(strcmp( a
[i
].
id , id
) == 0) break;
}
valor1
= atoi(a
[i
].
saldo); snprintf( a
[i
].
saldo , sizeof(a
[i
].
saldo) , "%d" , valor1
); }
/* ATENÇÃO!!!!!!!!!!!!!!!!!!!
void movimentos (){
FILE * fp = fopen ("movimentos.txt", "r");
if (fp != NULL){
char temp[255+1];
char * componentes;
int contador = 0;
char id_origem[11];
char id_destino[11]
char valor[1000000];
while (fgets(temp, 255+1, fp) != NULL){
printf ("\n-> %s\n\n", temp);
contador = 0;
int last = strlen (temp);
if (temp[last-1] == '\n')
temp[last-1] = '\0';
componentes = strtok (temp, " ");
/* FALTA MERDAS
if (contador == 0 ){
int i = 0;
transferencia(guarda_conta , id_origem , id_destino , valor);
}
else if(contador == 1){
deposito();
}
else if(contador == 2{
levantamento();
}
}
fclose(fp);
}
}
*/
void contas (Conta* a){
FILE
* fp
= fopen ("contas.txt", "r"); //"r" -> leitura (modo texto) ou "b" -> leitura (modo binario) FILE
* fp2
= fopen ("stats.txt", "w");
if (fp != NULL){
char tmpid[11];
char tmpsaldo[1000000];
char tmplimitecredito[1000000];
char contas[255+1];
char* temp_id[11+1];
char* componentes;
int contador = 0;
int val1;
int val2;
int val3;
printf ("As contas existentes no ficheiro sao:\n");
while (fgets(contas
, 255+1, fp
) != NULL
){ printf ("\n-> %s\n\n", contas
); contador = 0;
if (contas[last-1] == '\n')
contas[last-1] = '\0';
componentes
= strtok (contas
, " ");
while (componentes != NULL){
if (contador == 0) {
printf ("- ID = %s\n", componentes
); int valido = validar_id (componentes);
int valido2 = validar_id2 (componentes);
if (valido == 1 && valido2 == 1){
val1 = 1;
}
else {
val1 = 0;
}
}
else if (contador == 1){
strcpy(tmpsaldo
, componentes
); int valido = validar_saldo(componentes);
if (valido == 1){
printf ("- Saldo: %s\n", componentes
); val2 = 1;
}
else{
val2 = 0;
}
}
else if (contador == 2){
strcpy(tmplimitecredito
, componentes
); int valido = validar_limite(componentes);
/* ATENÇÂO AO FACTO DE NÃO HAVER COMPONENTE) */
if (valido == 1){
printf ("- Limite de credito: %s\n", componentes
); val3 = 1;
}
else{
printf ("Limite de credito invalido!\n"); val3 = 0;
}
}
componentes
= strtok (NULL
, " "); contador++;
}
if (val1 == 1 && val2 == 1 && val3 == 1){
strcpy(a
[contas_validas
].
id , tmpid
); strcpy(a
[contas_validas
].
saldo , tmpsaldo
); strcpy(a
[contas_validas
].
limite_saldo , tmplimitecredito
); contas_validas++;
if((contas_validas%MAX)==0){
Conta* ptr;
ptr
=(Conta
*)realloc(a
,sizeof(Conta
)*(contas_validas
+MAX
)); if(ptr!=NULL){
a=ptr;
ptr=NULL;
}
}
}
else if (val1 == 0 || val2 == 0 || val3 == 0){
contas_invalidas++;
}
}
printf ("\nNumero de contas validas: %d\n", contas_validas
); printf ("\nNumero de contas invalidas: %d\n", contas_invalidas
); }
else{
}
}
/*
int compara_conta (Conta * c1, Conta * c2) {
if (c1 -> saldo > c2 -> saldo)
return 1;
if (c1 -> saldo = c2 -> saldo)
return 0;
if (c1 -> saldo < c2 -> saldo)
return -1;
}
*/
int main() {
FILE
* fp
= fopen("contas-final.txt" , "w+"); Conta
* guardar_conta
=(Conta
*)malloc(sizeof(Conta
)*MAX
); contas(guardar_conta);
long int somatorioInicial = 0;
int i = 0;
for ( i ; i< contas_validas ; i++){
somatorioInicial
+= atoi(guardar_conta
[i
].
saldo); }
printf("\n%d", somatorioInicial
); /* ATENÇÂO AO COMENTÁRIO DE CIMA */ /* movimentos(); */
int n;
for ( n=0 ; n<contas_validas ; n++){
fprintf(fp
, "%s %s %s\n" , guardar_conta
[n
].
id , guardar_conta
[n
].
saldo ,guardar_conta
[n
].
limite_saldo); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2RlZmluZSBNQVggMTAKCmludCBjb250YXNfdmFsaWRhcyA9IDA7CmludCBjb250YXNfaW52YWxpZGFzID0gMDsKCnR5cGVkZWYgc3RydWN0IGNvbnRhIHsKICAgIGNoYXIgc2FsZG9bMTAwMDAwMF07CiAgICBjaGFyIGxpbWl0ZV9zYWxkb1sxMDAwMDAwXTsKICAgIGNoYXIgaWRbMTFdOwogICAgc3RydWN0IGNvbnRhICogcHJveDsKfSBDb250YTsKCnR5cGVkZWYgc3RydWN0IG1vdmltZW50byB7CiAgICBpbnQgdGlwb19tb3ZpbWVudG87CiAgICBpbnQgb3BjYW87Cn0gTW92aW1lbnRvOwoKaW50IHZhbGlkYXJfaWQoY2hhciogaWQpewoKICAgIGlmIChpZFszXSA9PSAnLScgJiYgaWRbOV0gPT0gJy0nICYmIGlkWzExXSA9PSAnXDAnKXsKCgkJCWludCBpID0gMDsKCgkJCWZvcihpID0gMDsgaSA8IDExOyBpKyspewoJCQkJaWYoaSAhPSAzICYmIGkgIT0gOSl7CgkJCQkJaWYoaXNkaWdpdChpZFtpXSkgPT0gMCl7CgkJCQkJCXJldHVybiAwOwoJCQkJCX0KCQkJCX0KCQkJfQoJfQoJZWxzZXsKCQlyZXR1cm4gMDsKCX0KCXJldHVybiAxOwp9CgppbnQgdmFsaWRhcl9pZDIgKGNoYXIqIGlkKSB7CgogICAgaW50IGNvbXBvbmVudGVfYSA9ICgoaWRbMF0tJzAnKSsgKGlkWzFdLScwJykrKGlkWzJdLScwJykpOwogICAgaW50IGNvbXBvbmVudGVfYiA9ICgoaWRbNF0tJzAnKSsgKGlkWzVdLScwJykrKGlkWzZdLScwJykrKGlkWzddLScwJykrKGlkWzhdLScwJykpOwogICAgaW50IGNvbXBvbmVudGVfYyA9IChpZFsxMF0tJzAnKTsKCiAgICBpbnQgc29tYTEgPSBjb21wb25lbnRlX2E7CiAgICBpbnQgc29tYTIgPSBjb21wb25lbnRlX2EgKyBjb21wb25lbnRlX2I7CiAgICBpbnQgcmVzdG8gPSBzb21hMiAlIHNvbWExOwoKICAgIGlmIChyZXN0byA9PSBjb21wb25lbnRlX2MpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCWVsc2UgewogICAgICAgIHJldHVybiAwOwogICAgfQp9CgppbnQgdmFsaWRhcl9zYWxkbyhjaGFyICpzdHIpIHsKCWZwcmludGYoc3RkZXJyLCAiREVCVUc6IHZhbG9yIHBhc3NhZG86IFslc11cbiIsIHN0cik7CiAgICBpZiAoKnN0ciA9PSAnLScpIHN0cisrOwogICAgaWYgKCFpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSpzdHIpKSByZXR1cm4gMDsgLyogZW1wdHkgc3RyaW5ncyByZXR1cm4gZmFsc2UgKi8KICAgIHdoaWxlICgqc3RyKSB7CiAgICAgICAgaWYgKCFpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSpzdHIpKSByZXR1cm4gMDsKICAgICAgICBzdHIrKzsKICAgIH0KICAgIHJldHVybiAxOwp9CgppbnQgdmFsaWRhcl9saW1pdGUoY2hhciogc3RyKXsKCWlmKGlzZGlnaXQoc3RyWzBdKSA9PSAxKXsKCQlpbnQgaT0xOwoJCWZvcihpID0gMTsgc3RyW2ldIT0nXDAnIDsgaSsrKXsKCQkJaWYoaXNkaWdpdChzdHJbaV0pPT0wKXsKCQkJCXJldHVybiAwOwoJCQl9CgkJfQoJfQoJcmV0dXJuIDE7IAp9CgppbnQgdmFsaWRhcl9tb3ZpbWVudG8gKGNoYXIgKiBtb3YpewogICAgaWYgKG1vdlswXSA9PSAwKXsKICAgICAgICBwcmludGYgKCJUcmFuc2ZlcmVuY2lhLlxuIik7CiAgICB9CgllbHNlIGlmIChtb3ZbMF0gPT0gMSl7CiAgICAgICAgcHJpbnRmICgiRGVwb3NpdG8uXG4iKTsKICAgIH0KCWVsc2UgaWYgKG1vdlswXSA9PSAyKXsKICAgICAgICBwcmludGYgKCJMZXZhbnRhbWVudG8uXG4iKTsKICAgIH0KCWVsc2V7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKdm9pZCB0cmFuc2ZlcmVuY2lhICggQ29udGEqICBhICwgY2hhciBpZFtdICwgY2hhciBpZDJbXSAsIGNoYXIgdmFsb3JbXSApewoJaW50IGk9MDsKCWludCBqPTA7CglpbnQgdmFsb3IxOwoJaW50IHZhbG9yMjsKIAoJZm9yICggaTsgaTxjb250YXNfdmFsaWRhcyA7IGkrKyl7CgkJaWYoc3RyY21wKCBhW2ldLmlkICwgaWQgKSA9PSAwKQoJCQlicmVhazsKCX0KIAoJZm9yICggaiA7IGo8Y29udGFzX3ZhbGlkYXMgOyBqKyspewoJCWlmKHN0cmNtcCggYVtqXS5pZCAsIGlkMikgPT0gMCkKCQkJYnJlYWs7Cgl9CiAKCXZhbG9yMSA9IGF0b2koYVtpXS5zYWxkbyk7Cgl2YWxvcjEgLT0gYXRvaSh2YWxvcik7Cgl2YWxvcjIgPSBhdG9pKGFbal0uc2FsZG8pOwoJdmFsb3IyICs9IGF0b2kodmFsb3IpOwogCglzbnByaW50ZiggYVtpXS5zYWxkbyAsIHNpemVvZihhW2ldLnNhbGRvKSAsICIlZCIgLCB2YWxvcjEpOwoJc25wcmludGYoIGFbal0uc2FsZG8gLCBzaXplb2YoYVtqXS5zYWxkbykgLCAiJWQiICwgdmFsb3IyKTsKfQoKdm9pZCBkZXBvc2l0byAoIENvbnRhKiBhICwgY2hhciBpZFtdICwgY2hhciB2YWxvcltdICl7CglpbnQgdmFsb3IxOwoJaW50IGk9MDsKCQoJZm9yICggaSA7IGk8Y29udGFzX3ZhbGlkYXMgOyBpKysgKXsKCQlpZihzdHJjbXAoIGFbaV0uaWQgLCBpZCApID09IDApCgkJYnJlYWs7Cgl9CgoJdmFsb3IxID0gYXRvaShhW2ldLnNhbGRvKTsKCXZhbG9yMSArPSBhdG9pKHZhbG9yKTsKCXNucHJpbnRmKCBhW2ldLnNhbGRvICwgc2l6ZW9mKGFbaV0uc2FsZG8pICwgIiVkIiAsIHZhbG9yMSk7Cn0KCnZvaWQgbGV2YW50YW1lbnRvICggQ29udGEqIGEgLCBjaGFyIGlkW10gLCBjaGFyIHZhbG9yW10gKXsKCWludCB2YWxvcjE7CglpbnQgaT0wOwoKCWZvciAoIGkgOyBpPGNvbnRhc192YWxpZGFzIDsgaSsrICl7CgkJaWYoc3RyY21wKCBhW2ldLmlkICwgaWQgKSA9PSAwKQoJCQlicmVhazsKCX0KCgl2YWxvcjEgPSBhdG9pKGFbaV0uc2FsZG8pOwoJdmFsb3IxIC09IGF0b2kodmFsb3IpOwoJc25wcmludGYoIGFbaV0uc2FsZG8gLCBzaXplb2YoYVtpXS5zYWxkbykgLCAiJWQiICwgdmFsb3IxKTsKfQogLyogQVRFTsOHw4NPISEhISEhISEhISEhISEhISEhIQp2b2lkIG1vdmltZW50b3MgKCl7CgogICAgRklMRSAqIGZwID0gZm9wZW4gKCJtb3ZpbWVudG9zLnR4dCIsICJyIik7CgogICAgaWYgKGZwICE9IE5VTEwpewoKCQljaGFyIHRlbXBbMjU1KzFdOwogICAgICAgIGNoYXIgKiBjb21wb25lbnRlczsKICAgICAgICBpbnQgY29udGFkb3IgPSAwOwoJCWNoYXIgaWRfb3JpZ2VtWzExXTsKCQljaGFyIGlkX2Rlc3Rpbm9bMTFdCgkJY2hhciB2YWxvclsxMDAwMDAwXTsKCiAgICAgICAgd2hpbGUgKGZnZXRzKHRlbXAsIDI1NSsxLCBmcCkgIT0gTlVMTCl7CgkJCXByaW50ZiAoIlxuLT4gJXNcblxuIiwgdGVtcCk7CgkJCWNvbnRhZG9yID0gMDsKCQkJCgkJCWludCBsYXN0ID0gc3RybGVuICh0ZW1wKTsKICAgICAgICAgICAgaWYgKHRlbXBbbGFzdC0xXSA9PSAnXG4nKQoJCQkJdGVtcFtsYXN0LTFdID0gJ1wwJzsKCQkJCQogICAgICAgICAgICBjb21wb25lbnRlcyA9IHN0cnRvayAodGVtcCwgIiAiKTsKCQkJLyogRkFMVEEgTUVSREFTIAoJCQkKCQkJaWYgKGNvbnRhZG9yID09IDAgKXsKCQkJCWludCBpID0gMDsKCQkJCXRyYW5zZmVyZW5jaWEoZ3VhcmRhX2NvbnRhICwgaWRfb3JpZ2VtICwgaWRfZGVzdGlubyAsIHZhbG9yKTsKCQkJfQoJCQllbHNlIGlmKGNvbnRhZG9yID09IDEpewoJCQkJCWRlcG9zaXRvKCk7CgkJCX0KCQkJZWxzZSBpZihjb250YWRvciA9PSAyewoJCQkJCWxldmFudGFtZW50bygpOwoJCQl9CgkJfSAgIAogICAgICAgIAogICAgICAgIGZjbG9zZShmcCk7CiAgICB9Cn0KKi8Kdm9pZCBjb250YXMgKENvbnRhKiBhKXsKCglGSUxFKiBmcCA9IGZvcGVuICgiY29udGFzLnR4dCIsICJyIik7IC8vInIiIC0+IGxlaXR1cmEgKG1vZG8gdGV4dG8pIG91ICJiIiAtPiBsZWl0dXJhIChtb2RvIGJpbmFyaW8pCglGSUxFKiBmcDIgPSBmb3BlbiAoInN0YXRzLnR4dCIsICJ3Iik7CgoKICAgIGlmIChmcCAhPSBOVUxMKXsKCgkJCWNoYXIgdG1waWRbMTFdOwoJCQljaGFyIHRtcHNhbGRvWzEwMDAwMDBdOwoJCQljaGFyIHRtcGxpbWl0ZWNyZWRpdG9bMTAwMDAwMF07CiAgICAgICAgICAgIGNoYXIgY29udGFzWzI1NSsxXTsKICAgICAgICAgICAgY2hhciogdGVtcF9pZFsxMSsxXTsKICAgICAgICAgICAgY2hhciogY29tcG9uZW50ZXM7CiAgICAgICAgICAgIGludCBjb250YWRvciA9IDA7CiAgICAgICAgICAgIGludCB2YWwxOwogICAgICAgICAgICBpbnQgdmFsMjsKICAgICAgICAgICAgaW50IHZhbDM7CgogICAgICAgICAgICBwcmludGYgKCJBcyBjb250YXMgZXhpc3RlbnRlcyBubyBmaWNoZWlybyBzYW86XG4iKTsKCiAgICAgICAgICAgIHdoaWxlIChmZ2V0cyhjb250YXMsIDI1NSsxLCBmcCkgIT0gTlVMTCl7CgkJCQlwcmludGYgKCJcbi0+ICVzXG5cbiIsIGNvbnRhcyk7CiAgICAgICAgICAgICAgICBjb250YWRvciA9IDA7CgogICAgICAgICAgICAgICAgaW50IGxhc3QgPSBzdHJsZW4gKGNvbnRhcyk7CiAgICAgICAgICAgICAgICBpZiAoY29udGFzW2xhc3QtMV0gPT0gJ1xuJykKICAgICAgICAgICAgICAgICAgICBjb250YXNbbGFzdC0xXSA9ICdcMCc7CgoJCQkJY29tcG9uZW50ZXMgPSBzdHJ0b2sgKGNvbnRhcywgIiAiKTsKCgkJCQl3aGlsZSAoY29tcG9uZW50ZXMgIT0gTlVMTCl7CgoJCQkJCWlmIChjb250YWRvciA9PSAwKSB7CgoJCQkJCQlwcmludGYgKCItIElEID0gJXNcbiIsIGNvbXBvbmVudGVzKTsKCQkJCQkJc3RyY3B5KHRtcGlkICwgY29tcG9uZW50ZXMpOwoJCQkJCQlpbnQgdmFsaWRvID0gdmFsaWRhcl9pZCAoY29tcG9uZW50ZXMpOwoJCQkJCQlpbnQgdmFsaWRvMiA9IHZhbGlkYXJfaWQyIChjb21wb25lbnRlcyk7CgoJCQkJCQlpZiAodmFsaWRvID09IDEgJiYgdmFsaWRvMiA9PSAxKXsKCQkJCQkJCXByaW50ZiAoIklEIHZhbGlkbyFcbiIpOwoJCQkJCQkJdmFsMSA9IDE7CgkJCQkJCX0KCQkJCQkJZWxzZSB7CgkJCQkJCQlwcmludGYgKCJJRCBpbnZhbGlkbyFcbiIpOwoJCQkJCQkJdmFsMSA9IDA7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZSBpZiAoY29udGFkb3IgPT0gMSl7CgkJCQkJCXN0cmNweSh0bXBzYWxkbyAsIGNvbXBvbmVudGVzKTsKCQkJCQkJaW50IHZhbGlkbyA9IHZhbGlkYXJfc2FsZG8oY29tcG9uZW50ZXMpOwoJCQkJCQlpZiAodmFsaWRvID09IDEpewoJCQkJCQkJcHJpbnRmICgiLSBTYWxkbzogJXNcbiIsIGNvbXBvbmVudGVzKTsKCQkJCQkJCXZhbDIgPSAxOwoJCQkJCQl9CgkJCQkJCWVsc2V7CgkJCQkJCQlwcmludGYgKCJTYWxkbyBpbnZhbGlkbyFcbiIpOwoJCQkJCQkJdmFsMiA9IDA7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZSBpZiAoY29udGFkb3IgPT0gMil7CgkJCQkJCXN0cmNweSh0bXBsaW1pdGVjcmVkaXRvICwgY29tcG9uZW50ZXMpOwoJCQkJCQlpbnQgdmFsaWRvID0gdmFsaWRhcl9saW1pdGUoY29tcG9uZW50ZXMpOwoJCQkJCQkvKiBBVEVOw4fDgk8gQU8gRkFDVE8gREUgTsODTyBIQVZFUiBDT01QT05FTlRFKSAqLwoJCQkJCQlpZiAodmFsaWRvID09IDEpewoJCQkJCQkJcHJpbnRmICgiLSBMaW1pdGUgZGUgY3JlZGl0bzogJXNcbiIsIGNvbXBvbmVudGVzKTsKCQkJCQkJCXZhbDMgPSAxOwoJCQkJCQl9CgkJCQkJCWVsc2V7CgkJCQkJCQlwcmludGYgKCJMaW1pdGUgZGUgY3JlZGl0byBpbnZhbGlkbyFcbiIpOwoJCQkJCQkJdmFsMyA9IDA7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCWNvbXBvbmVudGVzID0gc3RydG9rIChOVUxMLCAiICIpOwoJCQkJCWNvbnRhZG9yKys7CgoJCQkJfQoKCQkJCWlmICh2YWwxID09IDEgJiYgdmFsMiA9PSAxICYmIHZhbDMgPT0gMSl7CgoJCQkJCQlzdHJjcHkoYVtjb250YXNfdmFsaWRhc10uaWQgLCB0bXBpZCk7CgkJCQkJCXN0cmNweShhW2NvbnRhc192YWxpZGFzXS5zYWxkbyAsIHRtcHNhbGRvKTsKCQkJCQkJc3RyY3B5KGFbY29udGFzX3ZhbGlkYXNdLmxpbWl0ZV9zYWxkbyAsIHRtcGxpbWl0ZWNyZWRpdG8pOwoJCQkJCQljb250YXNfdmFsaWRhcysrOwoJCQkJCQlpZigoY29udGFzX3ZhbGlkYXMlTUFYKT09MCl7CgkJCQkJCQlDb250YSogcHRyOwoJCQkJCQkJcHRyPShDb250YSopcmVhbGxvYyhhLHNpemVvZihDb250YSkqKGNvbnRhc192YWxpZGFzK01BWCkpOwoJCQkJCQkJaWYocHRyIT1OVUxMKXsKCQkJCQkJCQlhPXB0cjsKCQkJCQkJCQlwdHI9TlVMTDsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJfQoJCQkJZWxzZSBpZiAodmFsMSA9PSAwIHx8IHZhbDIgPT0gMCB8fCB2YWwzID09IDApewogICAgICAgICAgICAgICAgICAgIGNvbnRhc19pbnZhbGlkYXMrKzsKCQkJCX0KICAgICAgICAgICAgfQoJCQkKCQkJZmNsb3NlKGZwKTsKCgkJCXByaW50ZiAoIlxuTnVtZXJvIGRlIGNvbnRhcyB2YWxpZGFzOiAlZFxuIiwgY29udGFzX3ZhbGlkYXMpOwoJCQlwcmludGYgKCJcbk51bWVybyBkZSBjb250YXMgaW52YWxpZGFzOiAlZFxuIiwgY29udGFzX2ludmFsaWRhcyk7CiAgICB9CiAgICBlbHNlewoJCXByaW50ZiAoIkVycm8hXG4iKTsKICAgIH0KfQovKgppbnQgY29tcGFyYV9jb250YSAoQ29udGEgKiBjMSwgQ29udGEgKiBjMikgewogICAgICAgIGlmIChjMSAtPiBzYWxkbyA+IGMyIC0+IHNhbGRvKQogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICBpZiAoYzEgLT4gc2FsZG8gPSBjMiAtPiBzYWxkbykKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKGMxIC0+IHNhbGRvIDwgYzIgLT4gc2FsZG8pCiAgICAgICAgICAgIHJldHVybiAtMTsKfQoqLwppbnQgbWFpbigpIHsKCglGSUxFICogZnAgPSBmb3BlbigiY29udGFzLWZpbmFsLnR4dCIgLCAidysiKTsKCUNvbnRhKiBndWFyZGFyX2NvbnRhPShDb250YSopbWFsbG9jKHNpemVvZihDb250YSkqTUFYKTsKICAgIGNvbnRhcyhndWFyZGFyX2NvbnRhKTsKCWxvbmcgaW50IHNvbWF0b3Jpb0luaWNpYWwgPSAwOwoJaW50IGkgPSAwOwoJZm9yICggaSAgOyBpPCBjb250YXNfdmFsaWRhcyA7IGkrKyl7CiAgICAgICBzb21hdG9yaW9JbmljaWFsICs9IGF0b2koZ3VhcmRhcl9jb250YVtpXS5zYWxkbyk7Cgl9CglwcmludGYoIlxuJWQiLCBzb21hdG9yaW9JbmljaWFsKTsgLyogQVRFTsOHw4JPIEFPIENPTUVOVMOBUklPIERFIENJTUEgKi8KICAgIHByaW50ZigiXG4iKTsKIC8qICAgbW92aW1lbnRvcygpOyAqLwoJaW50IG47Cglmb3IgKCBuPTAgOyBuPGNvbnRhc192YWxpZGFzIDsgbisrKXsKCQlmcHJpbnRmKGZwICwgIiVzICVzICVzXG4iICwgZ3VhcmRhcl9jb250YVtuXS5pZCAsIGd1YXJkYXJfY29udGFbbl0uc2FsZG8gLGd1YXJkYXJfY29udGFbbl0ubGltaXRlX3NhbGRvKTsKCX0KCWZjbG9zZShmcCk7CgogICAgcmV0dXJuIDA7Cn0=