#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define go(ptr) ptr=ptr->next
//building structure
struct data {
int num;
char *name;//name ptr
float gpa;
struct data *next;
};
typedef struct data student;
//header initialize
student *header = NULL;
//printing functions
void printInstr() {
printf("DATABASE PROGRAM\nuse i, u, d, D, f, l to run\n"); }
void printArrow() {
}
//basis funtions
student* lastNode() {
student *last;
for (last=header;last->next!=NULL;go(last));
return last;
}//returtn last node
int lengthName(char *name_s) {
int i;
for (i=0;*(name_s+i)!='\0';i++);
return i;
}
void insertHeader (int num_s, char *name_s, float gpa_s) {
student *newNode;
newNode
=(student
*)malloc(sizeof(student
));
if (header == NULL) {
newNode -> next=NULL;
header=newNode;
}//no nodes in list
else {
newNode->next=header;
header=newNode;
}//building a link
newNode -> num=num_s;
newNode
-> name
=(char*)malloc(sizeof(char)*(lengthName
(name_s
)+1)); newNode -> gpa=gpa_s;
}
void insertNew (student *node, int num_s, char *name_s, float gpa_s) {
student *newNode;
newNode
=(student
*)malloc(sizeof(student
));
if (node == NULL) {
newNode->next = NULL;
node = newNode;
}//'node' is NULL
else {
newNode->next=node->next;
node->next=newNode;
}
newNode -> num=num_s;
newNode
-> name
=(char*)malloc(sizeof(char)*(lengthName
(name_s
)+1)); strcpy(newNode
->name
,name_s
);//copy name newNode -> gpa=gpa_s;
}
void printNode (student *node) {
printf("NUM: %5d NAME: %10s GPA: %.2f\n",node
->num
,node
->name
,node
->gpa
); }
//funtions
void printList() {
student *curr=header; student *prev=header;
int i,j;
if (header
==NULL
) { printArrow
(); printf("NO node in List..\n"); }//no nodes in List else { printArrow
(); printf("Nodes in the List..\n"); for (i=0;curr!=NULL;i++)
go(curr); //determine size of List
curr=header;
for(;i>0;i--) {
for(j=1;j<i;go(curr),j++);
printNode(curr);
curr=header;
}//double loop to access nodes reversly
}
}
void insertStudent(int num_s, char *name_s, float gpa_s) {
student *prev=header; student *curr=header;
int rpt=0;//to check error;repeated number..
if (header==NULL) insertHeader(num_s, name_s, gpa_s);//empty list
else {
for(prev=header;prev!=NULL;go(prev)) {
if(prev->num==num_s) rpt++;
}
if (rpt
!=0) {printArrow
(); printf("No.%d is already in List..\n",num_s
); } else {
if (header->next==NULL) {
if (header->num<num_s) insertHeader(num_s, name_s, gpa_s);
else insertNew(header, num_s, name_s, gpa_s);
} //only one node on list
else {
if (header->num<num_s) insertHeader(num_s, name_s, gpa_s);
else {
while (curr->num>num_s&&curr!=NULL) {
prev=curr;
go(curr);
}
insertNew(prev, num_s, name_s, gpa_s);//insert new node
}}}}
}
void deleteStudent(int num_s) {
student *prev; student *curr;
prev=header; curr=header;
if (header
==NULL
) { printArrow
(); printf("NO node in List..\n"); } else if (header->next==NULL&&header->num==num_s) {
printArrow
(); printf("%d %s %.2f has been eliminated..\n" ,header->num,header->name,header->gpa);
go(header);
free(prev
);//header is 'only' node in List header=NULL;//after touching 'header', initialize for safety..
}
else if (header->num==num_s&&header->next!=NULL) {
printArrow
(); printf("%d %s %.2f has been eliminated..\n" ,header->num,header->name,header->gpa);
go(header);//manipulate header forward
}
else { go(curr);
while (curr!=NULL) {
if (curr->num==num_s) break;
prev=curr;
go(curr);//go next
}
if (curr
==NULL
) {printArrow
(); printf("NO No.%d in the List..\n",num_s
);}//no num_s in List else {
printArrow
(); printf("%d %s %.2f has been eliminated..\n",curr
->num
,curr
->name
,curr
->gpa
); prev->next=curr->next;
free(curr
);//delete node and reserve link between nodes.. }
}
}//to delete node and announcement
void clearNode(int num_s) {
student *prev; student *curr;
prev=header; curr=header; go(curr);
if (header==NULL);
else if (header->num==num_s) {
go(header);
}
else {
while (curr!=NULL) {
if (curr->num==num_s) break;
prev=curr;
go(curr);//go next
}
if (curr==NULL);
else {
prev->next=curr->next;
free(curr
);//delete nodes.. }
}
}//clear node without annoucement
void findStudent(int num_s) {
student *curr=header;
if (header
==NULL
) { printArrow
(); printf("NO node in List..\n"); }//empty list else {
while (curr!=NULL) {
if (curr->num==num_s) break;//break after find num_s
go(curr);//go next
}
if (curr
==NULL
) { printArrow
(); printf("NO No.%d in the List..\n",num_s
); } else printNode(curr);
}
}
void updateStudent(int num_s, char *name_s, float gpa_s) {
student *curr=header; student *prev=header;
if (header
==NULL
) { printArrow
(); printf("NO node in List..\n"); }//empty list else {
if (header->num==num_s) {
clearNode(num_s);
insertHeader(num_s,name_s,gpa_s);//header was only node and header->num==num_s..
}
else {
while (curr!=NULL) {
if (curr->num==num_s) break;
prev=curr;
go(curr);//go next
}
if (curr
==NULL
) { printf("NO No.%d in the List..\n",num_s
); } else {
clearNode(num_s);
insertNew(prev,num_s,name_s,gpa_s);
}}}
}
void deleteAll() {
student *prev=header; student *curr=header;
printArrow
(); printf("Delete every node\n");
if (header==NULL) {/*do nothing*/}//no node in List
else {
if (header->next == NULL) { //only one node in List
header=NULL;//initialize header to avoid error..
}
else {
go(curr);
while(curr!=NULL) {
free(curr
->name
);//free name
prev=curr;
go(curr);
}
free(prev
);//delete last node header=NULL;//initialize to avoid error..
}}
}
int main () {
char instr;
char name_s[10];
int num_s;
float gpa_s;
printInstr();
while (instr!='q') {
switch (instr) {
case 'i' :
scanf("%d %s %f",&num_s
,name_s
,&gpa_s
); insertStudent(num_s, name_s, gpa_s);
//insert node
break;
case 'u' :
scanf("%d %s %f",&num_s
,name_s
,&gpa_s
); //update
updateStudent(num_s,name_s,gpa_s);
break;
case 'f' :
findStudent(num_s);
//find
break;
case 'd' :
deleteStudent(num_s);
//delete one
break;
case 'D' :
deleteAll();
//delete all
break;
case 'l' :
printList();
break;
case 'q' :
printArrow();
}
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBnbyhwdHIpIHB0cj1wdHItPm5leHQKCi8vYnVpbGRpbmcgc3RydWN0dXJlCnN0cnVjdCBkYXRhIHsKCWludCBudW07CgljaGFyICpuYW1lOy8vbmFtZSBwdHIKCWZsb2F0IGdwYTsKCXN0cnVjdCBkYXRhICpuZXh0Owp9OwoKdHlwZWRlZiBzdHJ1Y3QgZGF0YSBzdHVkZW50OwoKLy9oZWFkZXIgaW5pdGlhbGl6ZQpzdHVkZW50ICpoZWFkZXIgPSBOVUxMOwoKLy9wcmludGluZyBmdW5jdGlvbnMKdm9pZCBwcmludEluc3RyKCkgewoJcHJpbnRmKCJEQVRBQkFTRSBQUk9HUkFNXG51c2UgaSwgdSwgZCwgRCwgZiwgbCB0byBydW5cbiIpOwp9CnZvaWQgcHJpbnRBcnJvdygpIHsKCXByaW50ZigiPT0+Iik7Cn0KCi8vYmFzaXMgZnVudGlvbnMKc3R1ZGVudCogbGFzdE5vZGUoKSB7CglzdHVkZW50ICpsYXN0OwoJZm9yIChsYXN0PWhlYWRlcjtsYXN0LT5uZXh0IT1OVUxMO2dvKGxhc3QpKTsKCXJldHVybiBsYXN0Owp9Ly9yZXR1cnRuIGxhc3Qgbm9kZQppbnQgbGVuZ3RoTmFtZShjaGFyICpuYW1lX3MpIHsKCWludCBpOwoJZm9yIChpPTA7KihuYW1lX3MraSkhPSdcMCc7aSsrKTsKCXJldHVybiBpOwp9CnZvaWQgaW5zZXJ0SGVhZGVyIChpbnQgbnVtX3MsIGNoYXIgKm5hbWVfcywgZmxvYXQgZ3BhX3MpIHsKCXN0dWRlbnQgKm5ld05vZGU7CgluZXdOb2RlPShzdHVkZW50ICopbWFsbG9jKHNpemVvZihzdHVkZW50KSk7CgoJaWYgKGhlYWRlciA9PSBOVUxMKSB7CgkJbmV3Tm9kZSAtPiBuZXh0PU5VTEw7CgkJaGVhZGVyPW5ld05vZGU7Cgl9Ly9ubyBub2RlcyBpbiBsaXN0CgllbHNlIHsKCQluZXdOb2RlLT5uZXh0PWhlYWRlcjsKCQloZWFkZXI9bmV3Tm9kZTsKCX0vL2J1aWxkaW5nIGEgbGluawoJbmV3Tm9kZSAtPiBudW09bnVtX3M7CgluZXdOb2RlIC0+IG5hbWU9KGNoYXIqKW1hbGxvYyhzaXplb2YoY2hhcikqKGxlbmd0aE5hbWUobmFtZV9zKSsxKSk7CglzdHJjcHkobmV3Tm9kZS0+bmFtZSxuYW1lX3MpOwoJbmV3Tm9kZSAtPiBncGE9Z3BhX3M7Cn0Kdm9pZCBpbnNlcnROZXcgKHN0dWRlbnQgKm5vZGUsIGludCBudW1fcywgY2hhciAqbmFtZV9zLCBmbG9hdCBncGFfcykgewoJc3R1ZGVudCAqbmV3Tm9kZTsKCW5ld05vZGU9KHN0dWRlbnQgKiltYWxsb2Moc2l6ZW9mKHN0dWRlbnQpKTsKCglpZiAobm9kZSA9PSBOVUxMKSB7CgkJbmV3Tm9kZS0+bmV4dCA9IE5VTEw7CgkJbm9kZSA9IG5ld05vZGU7Cgl9Ly8nbm9kZScgaXMgTlVMTAoJZWxzZSB7CQkKCQkJbmV3Tm9kZS0+bmV4dD1ub2RlLT5uZXh0OwoJCQlub2RlLT5uZXh0PW5ld05vZGU7CgkJfQoJbmV3Tm9kZSAtPiBudW09bnVtX3M7CgluZXdOb2RlIC0+IG5hbWU9KGNoYXIqKW1hbGxvYyhzaXplb2YoY2hhcikqKGxlbmd0aE5hbWUobmFtZV9zKSsxKSk7CglzdHJjcHkobmV3Tm9kZS0+bmFtZSxuYW1lX3MpOy8vY29weSBuYW1lCgluZXdOb2RlIC0+IGdwYT1ncGFfczsKfQp2b2lkIHByaW50Tm9kZSAoc3R1ZGVudCAqbm9kZSkgewoJcHJpbnRmKCJOVU06ICU1ZCAgTkFNRTogJTEwcyAgR1BBOiAlLjJmXG4iLG5vZGUtPm51bSxub2RlLT5uYW1lLG5vZGUtPmdwYSk7Cn0KCgovL2Z1bnRpb25zCnZvaWQgcHJpbnRMaXN0KCkgewoJc3R1ZGVudCAqY3Vycj1oZWFkZXI7IHN0dWRlbnQgKnByZXY9aGVhZGVyOwoJaW50IGksajsKCWlmIChoZWFkZXI9PU5VTEwpIHsgcHJpbnRBcnJvdygpOyBwcmludGYoIk5PIG5vZGUgaW4gTGlzdC4uXG4iKTsgfS8vbm8gbm9kZXMgaW4gTGlzdAoJZWxzZSB7IHByaW50QXJyb3coKTsgcHJpbnRmKCJOb2RlcyBpbiB0aGUgTGlzdC4uXG4iKTsKCWZvciAoaT0wO2N1cnIhPU5VTEw7aSsrKQoJCWdvKGN1cnIpOyAvL2RldGVybWluZSBzaXplIG9mIExpc3QKCWN1cnI9aGVhZGVyOwoJZm9yKDtpPjA7aS0tKSB7CgkJZm9yKGo9MTtqPGk7Z28oY3VyciksaisrKTsKCQlwcmludE5vZGUoY3Vycik7CgkJY3Vycj1oZWFkZXI7Cgl9Ly9kb3VibGUgbG9vcCB0byBhY2Nlc3Mgbm9kZXMgcmV2ZXJzbHkKCX0KfQp2b2lkIGluc2VydFN0dWRlbnQoaW50IG51bV9zLCBjaGFyICpuYW1lX3MsIGZsb2F0IGdwYV9zKSB7CglzdHVkZW50ICpwcmV2PWhlYWRlcjsgc3R1ZGVudCAqY3Vycj1oZWFkZXI7CglpbnQgcnB0PTA7Ly90byBjaGVjayBlcnJvcjtyZXBlYXRlZCBudW1iZXIuLgoJCglpZiAoaGVhZGVyPT1OVUxMKSBpbnNlcnRIZWFkZXIobnVtX3MsIG5hbWVfcywgZ3BhX3MpOy8vZW1wdHkgbGlzdAoJZWxzZSB7CgkJZm9yKHByZXY9aGVhZGVyO3ByZXYhPU5VTEw7Z28ocHJldikpIHsKCQkJaWYocHJldi0+bnVtPT1udW1fcykgcnB0Kys7CgkJfQoJCWlmIChycHQhPTApIHtwcmludEFycm93KCk7IHByaW50ZigiTm8uJWQgaXMgYWxyZWFkeSBpbiBMaXN0Li5cbiIsbnVtX3MpOyB9CgkJZWxzZSB7CgkJaWYgKGhlYWRlci0+bmV4dD09TlVMTCkgewoJCWlmIChoZWFkZXItPm51bTxudW1fcykgaW5zZXJ0SGVhZGVyKG51bV9zLCBuYW1lX3MsIGdwYV9zKTsKCQllbHNlIGluc2VydE5ldyhoZWFkZXIsIG51bV9zLCBuYW1lX3MsIGdwYV9zKTsKCX0gLy9vbmx5IG9uZSBub2RlIG9uIGxpc3QKCWVsc2UgewoJCWlmIChoZWFkZXItPm51bTxudW1fcykgaW5zZXJ0SGVhZGVyKG51bV9zLCBuYW1lX3MsIGdwYV9zKTsKCQllbHNlIHsKCQl3aGlsZSAoY3Vyci0+bnVtPm51bV9zJiZjdXJyIT1OVUxMKSB7CgkJCXByZXY9Y3VycjsKCQkJZ28oY3Vycik7CgkJfQoJCWluc2VydE5ldyhwcmV2LCBudW1fcywgbmFtZV9zLCBncGFfcyk7Ly9pbnNlcnQgbmV3IG5vZGUKCQl9fX19Cn0Kdm9pZCBkZWxldGVTdHVkZW50KGludCBudW1fcykgewoJc3R1ZGVudCAqcHJldjsgc3R1ZGVudCAqY3VycjsKCXByZXY9aGVhZGVyOyBjdXJyPWhlYWRlcjsKCglpZiAoaGVhZGVyPT1OVUxMKSB7IHByaW50QXJyb3coKTsgcHJpbnRmKCJOTyBub2RlIGluIExpc3QuLlxuIik7IH0KCWVsc2UgaWYgKGhlYWRlci0+bmV4dD09TlVMTCYmaGVhZGVyLT5udW09PW51bV9zKSB7CgkJcHJpbnRBcnJvdygpOyBwcmludGYoIiVkICVzICUuMmYgaGFzIGJlZW4gZWxpbWluYXRlZC4uXG4iCgkJCSxoZWFkZXItPm51bSxoZWFkZXItPm5hbWUsaGVhZGVyLT5ncGEpOwoJCWZyZWUoaGVhZGVyLT5uYW1lKTsKCQlnbyhoZWFkZXIpOwoJCWZyZWUocHJldik7Ly9oZWFkZXIgaXMgJ29ubHknIG5vZGUgaW4gTGlzdAoJCWhlYWRlcj1OVUxMOy8vYWZ0ZXIgdG91Y2hpbmcgJ2hlYWRlcicsIGluaXRpYWxpemUgZm9yIHNhZmV0eS4uCgl9CgllbHNlIGlmIChoZWFkZXItPm51bT09bnVtX3MmJmhlYWRlci0+bmV4dCE9TlVMTCkgewoJCXByaW50QXJyb3coKTsgcHJpbnRmKCIlZCAlcyAlLjJmIGhhcyBiZWVuIGVsaW1pbmF0ZWQuLlxuIgoJCQksaGVhZGVyLT5udW0saGVhZGVyLT5uYW1lLGhlYWRlci0+Z3BhKTsKCQlmcmVlKGhlYWRlci0+bmFtZSk7CgkJZ28oaGVhZGVyKTsvL21hbmlwdWxhdGUgaGVhZGVyIGZvcndhcmQKCQlmcmVlKHByZXYpOy8vZnJlZSBoZWFkZXIKCX0KCWVsc2UgewlnbyhjdXJyKTsJCQoJCXdoaWxlIChjdXJyIT1OVUxMKSB7CgkJCWlmIChjdXJyLT5udW09PW51bV9zKSBicmVhazsKCQkJCgkJCXByZXY9Y3VycjsKCQkJZ28oY3Vycik7Ly9nbyBuZXh0CgkJfQoJCWlmIChjdXJyPT1OVUxMKSB7cHJpbnRBcnJvdygpOyBwcmludGYoIk5PIE5vLiVkIGluIHRoZSBMaXN0Li5cbiIsbnVtX3MpO30vL25vIG51bV9zIGluIExpc3QKCQllbHNlIHsKCQkJcHJpbnRBcnJvdygpOyBwcmludGYoIiVkICVzICUuMmYgaGFzIGJlZW4gZWxpbWluYXRlZC4uXG4iLGN1cnItPm51bSxjdXJyLT5uYW1lLGN1cnItPmdwYSk7CgkJCWZyZWUoY3Vyci0+bmFtZSk7CgkJCXByZXYtPm5leHQ9Y3Vyci0+bmV4dDsKCQkJZnJlZShjdXJyKTsvL2RlbGV0ZSBub2RlIGFuZCByZXNlcnZlIGxpbmsgYmV0d2VlbiBub2Rlcy4uCgkJfQoJfQp9Ly90byBkZWxldGUgbm9kZSBhbmQgYW5ub3VuY2VtZW50CnZvaWQgY2xlYXJOb2RlKGludCBudW1fcykgewoJc3R1ZGVudCAqcHJldjsgc3R1ZGVudCAqY3VycjsKCXByZXY9aGVhZGVyOyBjdXJyPWhlYWRlcjsgZ28oY3Vycik7CgoJaWYgKGhlYWRlcj09TlVMTCk7CgllbHNlIGlmIChoZWFkZXItPm51bT09bnVtX3MpIHsKCgkJZnJlZShoZWFkZXItPm5hbWUpOwoJCWdvKGhlYWRlcik7CgkJZnJlZShwcmV2KTsvL2ZyZWUgaGVhZGVyCgl9CgllbHNlIHsKCQl3aGlsZSAoY3VyciE9TlVMTCkgewoJCQlpZiAoY3Vyci0+bnVtPT1udW1fcykgYnJlYWs7CgkJCQoJCQlwcmV2PWN1cnI7CgkJCWdvKGN1cnIpOy8vZ28gbmV4dAoJCX0KCQlpZiAoY3Vycj09TlVMTCk7CgkJZWxzZSB7CgkJCWZyZWUoY3Vyci0+bmFtZSk7CgkJCXByZXYtPm5leHQ9Y3Vyci0+bmV4dDsKCQkJZnJlZShjdXJyKTsvL2RlbGV0ZSBub2Rlcy4uCgkJfQoJfQp9Ly9jbGVhciBub2RlIHdpdGhvdXQgYW5ub3VjZW1lbnQKdm9pZCBmaW5kU3R1ZGVudChpbnQgbnVtX3MpIHsKCXN0dWRlbnQgKmN1cnI9aGVhZGVyOwoJaWYgKGhlYWRlcj09TlVMTCkgeyBwcmludEFycm93KCk7IHByaW50ZigiTk8gbm9kZSBpbiBMaXN0Li5cbiIpOyB9Ly9lbXB0eSBsaXN0CgllbHNlIHsKCQl3aGlsZSAoY3VyciE9TlVMTCkgewoJCQlpZiAoY3Vyci0+bnVtPT1udW1fcykgYnJlYWs7Ly9icmVhayBhZnRlciBmaW5kIG51bV9zCgoJCQlnbyhjdXJyKTsvL2dvIG5leHQKCQl9CgoJCWlmIChjdXJyPT1OVUxMKSB7IHByaW50QXJyb3coKTsgcHJpbnRmKCJOTyBOby4lZCBpbiB0aGUgTGlzdC4uXG4iLG51bV9zKTsgfQoJCWVsc2UgcHJpbnROb2RlKGN1cnIpOwoJfQp9CnZvaWQgdXBkYXRlU3R1ZGVudChpbnQgbnVtX3MsIGNoYXIgKm5hbWVfcywgZmxvYXQgZ3BhX3MpIHsKCXN0dWRlbnQgKmN1cnI9aGVhZGVyOyBzdHVkZW50ICpwcmV2PWhlYWRlcjsKCWlmIChoZWFkZXI9PU5VTEwpIHsgcHJpbnRBcnJvdygpOyBwcmludGYoIk5PIG5vZGUgaW4gTGlzdC4uXG4iKTsgfS8vZW1wdHkgbGlzdAoJZWxzZSB7CgkJaWYgKGhlYWRlci0+bnVtPT1udW1fcykgewoJCWNsZWFyTm9kZShudW1fcyk7CgkJaW5zZXJ0SGVhZGVyKG51bV9zLG5hbWVfcyxncGFfcyk7Ly9oZWFkZXIgd2FzIG9ubHkgbm9kZSBhbmQgaGVhZGVyLT5udW09PW51bV9zLi4KCQl9CgkJZWxzZSB7CgoJCXdoaWxlIChjdXJyIT1OVUxMKSB7CgkJCWlmIChjdXJyLT5udW09PW51bV9zKSBicmVhazsKCgkJCXByZXY9Y3VycjsKCQkJZ28oY3Vycik7Ly9nbyBuZXh0CgkJfQoJCWlmIChjdXJyPT1OVUxMKSB7IHByaW50ZigiTk8gTm8uJWQgaW4gdGhlIExpc3QuLlxuIixudW1fcyk7IH0KCQllbHNlIHsKCQkJCgkJY2xlYXJOb2RlKG51bV9zKTsKCQlpbnNlcnROZXcocHJldixudW1fcyxuYW1lX3MsZ3BhX3MpOwoJCQkKCQl9fX0KCX0Kdm9pZCBkZWxldGVBbGwoKSB7CglzdHVkZW50ICpwcmV2PWhlYWRlcjsgc3R1ZGVudCAqY3Vycj1oZWFkZXI7CglwcmludEFycm93KCk7IHByaW50ZigiRGVsZXRlIGV2ZXJ5IG5vZGVcbiIpOwoJCQoJaWYgKGhlYWRlcj09TlVMTCkgey8qZG8gbm90aGluZyovfS8vbm8gbm9kZSBpbiBMaXN0CgllbHNlIHsKCQlpZiAoaGVhZGVyLT5uZXh0ID09IE5VTEwpIHsgLy9vbmx5IG9uZSBub2RlIGluIExpc3QKCQkJZnJlZShoZWFkZXItPm5hbWUpOwoJCQlmcmVlKGhlYWRlcik7CgkJCWhlYWRlcj1OVUxMOy8vaW5pdGlhbGl6ZSBoZWFkZXIgdG8gYXZvaWQgZXJyb3IuLgoJCX0KCQllbHNlIHsKCQkJZ28oY3Vycik7CgkJCQkJCQoJCQl3aGlsZShjdXJyIT1OVUxMKSB7CgkJCQlmcmVlKGN1cnItPm5hbWUpOy8vZnJlZSBuYW1lCgkJCQlmcmVlKHByZXYpOy8vZnJlZSBub2RlCgoJCQkJcHJldj1jdXJyOwoJCQkJZ28oY3Vycik7CgkJCX0KCQkJZnJlZShwcmV2KTsvL2RlbGV0ZSBsYXN0IG5vZGUKCQkJaGVhZGVyPU5VTEw7Ly9pbml0aWFsaXplIHRvIGF2b2lkIGVycm9yLi4KCQl9fQp9CgppbnQgbWFpbiAoKSB7CgljaGFyIGluc3RyOwoJY2hhciBuYW1lX3NbMTBdOwoJaW50IG51bV9zOwoJZmxvYXQgZ3BhX3M7CgoJcHJpbnRJbnN0cigpOwoKCXdoaWxlIChpbnN0ciE9J3EnKSB7CgkJZmZsdXNoKHN0ZGluKTsKCQlzY2FuZigiJWMiLCZpbnN0cik7CgoJCXN3aXRjaCAoaW5zdHIpIHsKCQljYXNlICdpJyA6CgkJCXNjYW5mKCIlZCAlcyAlZiIsJm51bV9zLG5hbWVfcywmZ3BhX3MpOwoJCQlpbnNlcnRTdHVkZW50KG51bV9zLCBuYW1lX3MsIGdwYV9zKTsKCQkJLy9pbnNlcnQgbm9kZQoJCQlicmVhazsKCQljYXNlICd1JyA6CgkJCXNjYW5mKCIlZCAlcyAlZiIsJm51bV9zLG5hbWVfcywmZ3BhX3MpOwoJCQkvL3VwZGF0ZQoJCQl1cGRhdGVTdHVkZW50KG51bV9zLG5hbWVfcyxncGFfcyk7CgkJCWJyZWFrOwoJCWNhc2UgJ2YnIDoKCQkJc2NhbmYoIiVkIiwmbnVtX3MpOwoJCQlmaW5kU3R1ZGVudChudW1fcyk7CgkJCS8vZmluZAoJCQlicmVhazsKCQljYXNlICdkJyA6CgkJCXNjYW5mKCIlZCIsJm51bV9zKTsKCQkJZGVsZXRlU3R1ZGVudChudW1fcyk7CgkJCS8vZGVsZXRlIG9uZQoJCQlicmVhazsKCQljYXNlICdEJyA6CgkJCWRlbGV0ZUFsbCgpOwoJCQkvL2RlbGV0ZSBhbGwKCQkJYnJlYWs7CgkJY2FzZSAnbCcgOgoJCQlwcmludExpc3QoKTsKCQkJYnJlYWs7CgkJY2FzZSAncScgOgoJCQlwcmludEFycm93KCk7CgkJCXByaW50ZigiR29vZCBieWUuLlxuIik7CgkJfQoJfQoKCXJldHVybiAwOwp9