//***********************************************
// PROJECT HOTEL-MANAGEMENT
//***********************************************
//****************************
// INCLUDED HEADER FILES
//****************************
#include<iostream>
#include<string.h>
#include<graphics.h>
#include<dos.h>
#include<stdio.h>
#include<fstream.h>
#include<iomanip.h>
#include<stdlib.h>
//********************************************
// THIS CLASS CONTAINS FUNTIONS FOR FOOD
//********************************************
class food
{
private:
fstream p1;
int c;
char ap;
struct fd
{
char name[55];
float price;
}f;
public:
food()
{
c=0;
}
void food_menu(void);
void app_fmenu(void);
void food_bill();
void del_all();
};
//*****************************************************
// FUNCTION FOR DISPLAYING FOOD MENU
//*****************************************************
void food::food_menu(void)
{
cleardevice();
setfillstyle(7,1);
floodfill(0,0,4);
setfillstyle(7,10);
bar(17,40,605,420);
rectangle(17,40,605,420);
setfillstyle(1,10);
bar(24,47,598,413);
rectangle(24,47,598,413);
p1.close();
c=0;
p1.open("food.txt",ios::in|ios::binary);
outtextxy(30,50,"S.N. ITEM NAME PRICE");
gotoxy(4,5);
char h[5],pr[15];
while(p1.read((char*)&f,sizeof(f)))
{
c++;
settextstyle(4,0,1);
itoa(c,h,10);
outtextxy(40,60+20*c,h);
outtextxy(150,60+20*c,f.name);
itoa(f.price,pr,10);
outtextxy(390,60+20*c,pr);
}//END OF WHILE
p1.close();
settextstyle(15,0,1);
outtextxy(30,325,"DO YOU WANT TO ADD AN ITEM - (Y/N)");
gotoxy(60,20);
cin>>ap;
if(ap=='y'||ap=='Y')
{
app_fmenu();
//CALLING APPEND FUNCTION
}
else
{
if(ap=='n'||ap=='N')
{
outtextxy(30,360,"DO YOU WANT TO DELETE ALL (Y/N)");
char ch;
gotoxy(60,23);
cin>>ch;
if(ch=='y'||ch=='Y')
{
del_all();
//CALLING DELETE FUNCTION
}
}
}
}
//***************************************
// FUNCTION TO APPEND IN FOOD MENU
//***************************************
void food::app_fmenu(void)
{
p1.open("food.txt",ios::app|ios::binary);
outtextxy(30,360,"ENTER ITEM NAME U WANTTO ADD");
gotoxy(60,23);
gets(f.name);
outtextxy(30,380,"ENTER THE PRICE");
gotoxy(60,24);
cin>>f.price;
p1.write((char*)&f,sizeof(f));
p1.close();
getch();
}
//*****************************
// FUNCTION FOR FOOD BILL
//*****************************
void food::food_bill()
{
double bill=-1;
char c_name[20],f_name[20];
int dt;
cleardevice();
setfillstyle(7,1);
floodfill(0,0,4);
setfillstyle(7,10);
bar(17,40,605,420);
rectangle(17,40,605,420);
setfillstyle(1,7);
bar(24,47,598,413);
rectangle(24,47,598,413);
setcolor(4);
settextstyle(7,0,1);
outtextxy(30,70,"ENTER CUSTOMER NAME ");
gotoxy(50,6);
cin>>c_name;
outtextxy(30,120,"ENTER ITEM NAME TAKEN");
gotoxy(50,9);
cin>>f_name;
outtextxy(30,170,"ENTER THE QUANTITY");
gotoxy(50,12);
cin>>dt;
p1.close();
p1.open("food.txt",ios::in|ios::binary);
while(p1.read((char*)&f,sizeof(f)))
{
if(strcmp(f.name,f_name)==0)
{
bill=dt*f.price;
}
}//END OF WHILE
if(bill==-1)
{
setcolor(1);
for(int i=0;i<20;i++)
{
setcolor(1);
outtextxy(30,220,"ITEM IS NOT PRESENT");
delay(100);
setcolor(WHITE);
outtextxy(30,220,"ITEM IS NOT PRESENT");
delay(100);
// delay(2500);
}
}
else
{
char t[5],b[5];
setcolor(1);
itoa(dt,t,10);
itoa(bill,b,10);
outtextxy(30,250,"NAME FOOD.NAME QUANTITY BILL ");
setcolor(1);
settextstyle(4,0,1);
outtextxy(30,280,c_name);
outtextxy(140,280,f_name);
outtextxy(320,280,t);
outtextxy(445,280,b);
getch();
}
}
//************************************
// FUNCTION TO DELETE FOOD MENU
//******************************
void food::del_all()
{
remove("food.txt");
p1.open("food.txt",ios::out);
p1.close();
c=0;
}
//END OF CLASS FOOD
//***************************************
// THIS CLASS CONTAINS INFORMATION
// RELATED TO CUSTOMER
//***************************************
class customer
{
private:
int q,w;
fstream f1;
struct cust
{
int c_no;
char c_name[20];
char c_add[80];
int a_date;
int a_month;
int a_year;
int d_date;
int d_month;
int d_year;
int room_no;
char room_type[25];
}p;
public:
food j;
customer()
{
p.c_no=0;
p.d_date=0;
p.d_month=0;
}
//**********************************
// FUNCTION FOR CUSTOMER BILL
//*****************************
inline void customer::cust_bill()
{
int cho;
do
{
cleardevice();
f1.close();
setfillstyle(7,1);
floodfill(0,0,4);
setfillstyle(7,10);
bar(10,70,600,450);
rectangle(10,70,600,450);
setfillstyle(1,7);
bar(17,77,593,443);
rectangle(17,77,593,443);
setcolor(5);
setfillstyle(1,2);
settextstyle(7,0,1);
setcolor(9);
setfillstyle(1,2);
bar(210,140,410,238);
rectangle(210,140,410,158);
rectangle(210,140,410,174);
rectangle(210,140,410,190);
rectangle(210,140,410,206);
rectangle(210,140,410,222);
rectangle(210,140,410,238);
setcolor(4);
settextstyle(1,0,4);
outtextxy(180,20,"HOTEL BILL");
line(180,60,383,60);
setcolor(4);
settextstyle(1,0,1);
outtextxy(210,137," 1. ROOM BILL");
outtextxy(210,170," 2. FOOD BILL");
outtextxy(210,200," 3. MAIN MENU");
outtextxy(63,318,"ENTER CHOICE FOR WHICH YOU WANT THE BILL");
gotoxy(67,21);
cin>>cho;
choose(cho);
}while(cho!=3);//END OF WHILE
}
void choose(int a)
{
switch(a)
{
case 1:
{
room_bill();
break;
}
case 2:
{
j.food_bill();
break;
}
case 3:
break;
}
}
//****************************
// FUNCTION FOR ROOM BILL
//************************
void room_bill()
{
double bill;
int days,no,dt,mth;
cleardevice();
setfillstyle(7,1);
floodfill(0,0,4);
setfillstyle(7,10);
bar(17,40,605,420);
rectangle(17,40,605,420);
setfillstyle(1,7);
bar(24,47,598,413);
rectangle(24,47,598,413);
setcolor(4);
settextstyle(7,0,1);
outtextxy(30,70,"ENTER CUSTOMER NO DEPARTING");
gotoxy(50,6);
cin>>no;
outtextxy(30,120,"DATE OF DEPARTURE");
gotoxy(50,9);
cin>>dt;
outtextxy(30,170,"MONTH OF DEPARTURE");
gotoxy(50,12);
cin>>mth;
if(p.a_month>mth)
{bill=0;
}
f1.close();
f1.open("cust.txt",ios::in|ios::binary);
int c=0;
while(f1.read((char*)&p,sizeof(p)))
{
if(p.c_no==no)
{ c++;
if(p.a_month==mth)
{
days=dt-p.a_date;
}
else
{
days=(mth-p.a_month)*30+(dt-p.a_date);
}
if(p.room_no<11)
{
char d[5],m[5],h[5],mt[5],dy[5],bl[5];
bill=days*250;
setcolor(4);
outtextxy(30,270," NAME ARRIVAL DEPARTURE DAYS IN BILL ");
setcolor(1);
settextstyle(1,0,1);
outtextxy(40,300,p.c_name);
itoa(p.a_date,d,10);
outtextxy(150,300,d);
outtextxy(160,300,"/");
itoa(p.a_month,m,10);
outtextxy(170,300,m);
itoa(dt,h,10);
outtextxy(270,300,h);
outtextxy(280,300,"/");
itoa(mth,mt,10);
outtextxy(290,300,mt);
itoa(days,dy,10);
outtextxy(405,300,dy);
itoa(bill,bl,10);
outtextxy(515,300,bl);
}
else
{
char d[5],m[5],h[5],mt[5],dy[5],bl[5];
bill=days*150;
setcolor(4);
outtextxy(30,270," NAME ARRIVAL DEPARTURE DAYS IN BILL ");
setcolor(1);
settextstyle(1,0,1);
outtextxy(40,300,p.c_name);
itoa(p.a_date,d,10);
outtextxy(150,300,d);
outtextxy(160,300,"/");
itoa(p.a_month,m,10);
outtextxy(170,300,m);
itoa(dt,h,10);
outtextxy(270,300,h);
outtextxy(280,300,"/");
itoa(mth,mt,10);
outtextxy(290,300,mt);
itoa(days,dy,10);
outtextxy(405,300,dy);
itoa(bill,bl,10);
outtextxy(510,300,bl);
}
f1.close();
int count=1;
f1.open("cust.txt",ios::in| ios::binary);
fstream f2;
while(f1.read((char*)&p,sizeof(p)))
{
if(p.c_no==no)
{
continue;
}
else
{
f2.open("dup.txt",ios::app|ios::binary);
p.c_no=count;
f2.write((char*)&p,sizeof(p));
count++;
f2.close();
}
}//END OF WHILE
remove("cust.txt");
rename("dup.txt","cust.txt");
f1.close();
}
}//END OF WHILE
if(c==0)
{ for(int i=0;i<10;i++)
{
settextstyle(1,0,3);
setcolor(4);
outtextxy(150,300,"CUSTOMER IS NOT PRESENT");
delay(100); setcolor(WHITE);
outtextxy(150,300,"CUSTOMER IS NOT PRESENT");
delay(100);
}
}
getch();
}
//**************************************
// FUNCTION TO DISPLAY CUSTOMER DETAIL
//**************************************
void cust_detail()
{
int c;
do
{
cleardevice();
setfillstyle(7,1);
floodfill(0,0,4);
setfillstyle(7,10);
bar(50,80,600,470);
rectangle(50,80,600,470);
setfillstyle(1,7);
bar(57,87,593,463);
rectangle(57,87,593,463);
setcolor(9);
setfillstyle(1,2);
bar(210,140,410,254);
rectangle(210,140,410,158);
rectangle(210,140,410,174);
rectangle(210,140,410,190);
rectangle(210,140,410,206);
rectangle(210,140,410,222);
rectangle(210,140,410,238);
rectangle(210,140,410,254);
setcolor(4);
settextstyle(1,0,4);
outtextxy(160,20,"CUSTOMER DETAIL ");
setcolor(14);
line(163,60,475,60);
setcolor(4);
settextstyle(1,0,1);
outtextxy(225,137," CHOICES ARE :-");
setcolor(4);
settextstyle(1,0,1);
outtextxy(210,154," 1. APPEND");
outtextxy(210,170," 2. MODIFY");
outtextxy(210,186," 3. DELETE ");
outtextxy(210,202," 4. DELETE ALL ");
outtextxy(210,218," 5. DISPLAY ");
outtextxy(210,234," 6. MAIN MENU");
setcolor(4);
settextstyle(7,0,2);
outtextxy(210,300,"ENTER CHOICE :- ");
gotoxy(53,20);
cin>>c;
switch(c)
{
case 1:
{
cust_app();
break;
}
case 2:
{
cust_mod();
break;
}
case 3:
{
cust_del();
break;
}
case 4:
{
cust_adel();
break;
}
case 5:
{
cust_disp();
break;
}
}
}while(c!=6);//END OF WHILE
}
//***********************************
// FUNCTION TO APPEND CUSTOMER
//***********************************
void cust_app()
{
int ten,temp;
cleardevice();
f1.open("cust.txt",ios::app|ios::binary);
f1.seekg(0,ios::end);
ten=f1.tellg()/sizeof(p);
p.c_no=ten+1;
setfillstyle(7,1);
floodfill(0,0,4);
setfillstyle(7,10);
bar(17,50,605,470);
rectangle(17,50,605,470);
setfillstyle(1,7);
bar(24,57,598,463);
rectangle(24,57,598,463);
setcolor(4);
settextstyle(7,0,1);
outtextxy(30,70,"NAME");
gotoxy(50,6);
cin>>p.c_name;
outtextxy(30,120,"ADDRESS");
gotoxy(50,9);
gets(p.c_add);
outtextxy(30,170,"DATE OF ARRIVAL");
gotoxy(50,12);
cin>>p.a_date;
outtextxy(30,220,"MONTH OF ARRIVAL");
gotoxy(50,15);
cin>>p.a_month;
outtextxy(30,270,"YEAR OF ARRIVAL");
gotoxy(50,18);
cin>>p.a_year;
p.room_no=ten+1;
f1.write((char*)&p,sizeof(p));
f1.close();
}
//**********************************************
// FUNCTION TO DISPLAY CUSTOMER IN HOTEL
//**********************************************
void cust_disp()
{
cleardevice();
f1.close();
setfillstyle(7,1);
floodfill(0,0,4);
setfillstyle(7,10);
bar(20,20,620,450);
rectangle(20,20,620,450);
setfillstyle(1,7);
bar(27,27,613,443);
rectangle(27,27,613,443);
setcolor(4);
setfillstyle(1,2);
settextstyle(7,0,1);
outtextxy(25,40," CUST NO NAME ADDRESS ROOM.NO DATE");
gotoxy(30,3);
int c=0;
f1.open("cust.txt",ios::in|ios::binary);
f1.seekg(0,ios::beg);
char h[5],pr[5],d[5],m[6];
while(f1.read((char*)&p,sizeof(p)))
{
c++;
setcolor(1);
settextstyle(1,0,1);
itoa(p.c_no,h,10);
outtextxy(55,50+20*c,h);
outtextxy(160,50+20*c,p.c_name);
outtextxy(280,50+20*c,p.c_add);
itoa(p.room_no,pr,10);
outtextxy(440,50+20*c,pr);
itoa(p.a_date,d,10);
outtextxy(550,50+20*c,d);
outtextxy(560,50+20*c,"/");
itoa(p.a_month,m,10);
outtextxy(570,50+20*c,m);
}//END OF WHILE
getch();
f1.close();
}
//************************************************
// FUNCTION FOR MODIFYING CUSTOMER DETAIL
//************************************************
void cust_mod()
{
cleardevice();
f1.close();
setfillstyle(7,1);
floodfill(0,0,4);
setfillstyle(7,10);
bar(10,10,600,470);
rectangle(10,10,600,470);
setfillstyle(1,7);
bar(17,17,593,463);
rectangle(17,17,593,463);
setcolor(9);
setfillstyle(1,2);
setcolor(4);
int no;//,count=0;
outtextxy(30,42,"ENTER CUSTOMER NO TO BE MODIFIED");
gotoxy(65,4);
cin>>no;
f1.open("cust.txt",ios::in|ios::binary);
while(f1.read((char*)&p,sizeof(p)))
{
if(p.c_no==no)
{
f1.close();
int num=sizeof(p)*(no-1);
f1.open("cust.txt",ios::out|ios::ate|ios::binary);
f1.seekp(num,ios::beg);
outtextxy(30,110,"ENTER NEW RECORD ");
outtextxy(30,150,"NAME");
gotoxy(30,11);
cin>>p.c_name;
outtextxy(30,200,"ADDRESS");
gotoxy(30,14);
cin>>p.c_add;
outtextxy(30,250,"DATE");
gotoxy(30,17);
cin>>p.a_date;
outtextxy(30,300,"MONTH");
gotoxy(30,20);
cin>>p.a_month;
outtextxy(30,350,"YEAR");
gotoxy(30,23);
cin>>p.a_year;
f1.write((char*)&p,sizeof(p));
f1.close();
}
}//END OF WHILE
getch();
}
//*************************************************
// FUNCTION TO DELETE ALL CUSTOMER RECORDS
//*************************************************
void cust_adel()
{
remove("cust.txt");
f1.open("cust.txt",ios::out|ios::binary|ios::in);
p.c_no=0;
p.room_no=0;
}
//**********************************************
// FUNCTION TO DELETE A CUSTOMER RECORD
//**********************************************
void cust_del()
{
cleardevice();
f1.close();
setfillstyle(7,1);
floodfill(0,0,4);
setfillstyle(7,10);
bar(10,10,600,470);
rectangle(10,10,600,470);
setfillstyle(1,7);
bar(17,17,593,463);
rectangle(17,17,593,463);
setcolor(9);
setfillstyle(1,2);
setcolor(4);
int no,count=1;
outtextxy(30,42,"ENTER CUSTOMER NO TO BE DELETED");
gotoxy(65,4);
cin>>no;
f1.open("cust.txt",ios::in|ios::binary);
fstream f2;
while(f1.read((char*)&p,sizeof(p)))
{
if(p.c_no==no)
{
continue;
}
else
{
f2.open("dup.txt",ios::app|ios::binary);
p.c_no=count;
f2.write((char*)&p,sizeof(p));
count++;
f2.close();
}
}
remove("cust.txt");
rename("dup.txt","cust.txt");
f1.close();
getch();
}
};
//END OF CLASS CUSTOMER
//*****************************************
// THIS CLASS CONTAINS INFORMATION
// ABOUT HOTEL
//*****************************************
class hotel
{
private:
fstream f1;
struct cust
{
int c_no;
char c_name[20];
char c_add[20];
int a_date;
int a_month;
int a_year;
int d_date;
int d_month;
int d_year;
int room_no;
char room_type[25];
}x;
public:
};
//END OF CLASS HOTEL
//*******************************************
// CLASS CONTROLLING ALL THE CLASSES
//*******************************************
class control
{
private:
int ch;
public:
hotel h;
customer cust;
food d;
//***************************
// FUNCTION FOR PASSWORD
//***************************
void pass()
{
char passw[20];
for(;;)
{
hot_name();
setcolor(4);
setfillstyle(7,1);
floodfill(0,0,4);
setfillstyle(7,10);
bar(50,60,600,450);
rectangle(50,60,600,450);
setfillstyle(1,7);
bar(57,67,593,443);
rectangle(57,67,593,443);
setcolor(4);
settextstyle(7,0,1);
settextstyle(7,0,2) ;
outtextxy(200,220,"ENTER PASSWORD :-");
gotoxy(55,15);
cin>>passw;
if (strcmp(passw,"a")==0)
{
cleardevice();
break;
}
else
{
setcolor(4);
settextstyle(7,0,1);
for(int i=0;i<10;i++)
{
setcolor(4);
outtextxy(200,320,"ENTER CORRECT PASSWORD ");
delay(100);
setcolor(WHITE);
outtextxy(200,320,"ENTER CORRECT PASSWORD ");
delay(100);
settextstyle(7,0,1);
outtextxy(200,340,"PRESS ANY KEY TO CONTINUE"); }
cleardevice();
}
}
do
{
ch=mmenu();
choice(ch);
}while(ch!=5);//END OF WHILE
}
//*****************************
// FUNCTION FOR HOTEL NAME
//************************
void hot_name()
{
settextstyle(4,0,5);
setcolor(WHITE);
outtextxy(200,3," TIME HOTEL");
line(200,50,440,50);
}
//*****************************
// FUNCTION FOR MAIN MENU
//*****************************
int mmenu()
{
cleardevice();
int c;
setfillstyle(7,1);
floodfill(0,0,4);
setfillstyle(7,10);
bar(50,80,600,470);
rectangle(50,80,600,470);
setfillstyle(1,7);
bar(57,87,593,463);
rectangle(57,87,593,463);
setcolor(9);
setfillstyle(1,2);
bar(210,140,410,238);
rectangle(210,140,410,158);
rectangle(210,140,410,174);
rectangle(210,140,410,190);
rectangle(210,140,410,206);
rectangle(210,140,410,222);
rectangle(210,140,410,238);
setcolor(WHITE);
settextstyle(4,0,4);
outtextxy(160,20,"HOTEL MANAGEMENT");
setcolor(14);
line(163,60,515,60);
setcolor(4);
settextstyle(1,0,1);
outtextxy(225,137," MAIN MENU");
outtextxy(210,154," 1. INFORMATION");
outtextxy(210,170," 2. CUSTOMER DETAIL");
outtextxy(210,186," 3. FOOD DETAIL ");
outtextxy(210,202," 4. CUSTOMER BILL ");
outtextxy(210,218," 5. EXIT ");
setcolor(4);
settextstyle(7,0,2);
outtextxy(210,300,"ENTER CHOICE :- ");
fflush(stdin);
gotoxy(53,20);
cin>>c;
return c;
}
//************************
// FUNCTION OF ENDING
//************************
void bye()
{
cleardevice();
setcolor(12);
settextstyle(1,0,5);
setbkcolor(BLUE);
outtextxy(70,150,"THANKS FOR VISITING");
setcolor(10);
settextstyle(1,0,8);
outtextxy(100,250,"PROJECT");
settextstyle(1,0,3);
outtextxy(150,450,"SHUTTING DOWN.. . .");
getch();
setcolor(12);
settextstyle(1,0,5);
outtextxy(70,150,"THANKS FOR VISITING");
setcolor(10);
settextstyle(1,0,8);
outtextxy(100,250,"PROJECT");
settextstyle(1,0,3);
outtextxy(150,450,"SHUTTING DOWN.. . .");
for(int i=0;i<10;i++)
{
sound(1000*i);
setbkcolor(i);
nosound();
}
}
//***********************************
// FUNCTION OF CHOICE FOR INFORMATION
//***********************************
void choice(int a)
{
switch(a)
{
case 1:
{
information();
break;
}
case 2:
{
cust.cust_detail();
break;
}
case 3:
{
d.food_menu();
break;
}
case 4:
{
cust.cust_bill();
break;
}
}
}
//***************************
// FUNCTION FOR INFORMATION
//***************************
void information()
{
cleardevice();
setfillstyle(7,1);
floodfill(0,0,4);
setfillstyle(7,10);
bar(17,50,605,470);
rectangle(17,50,605,470);
setfillstyle(1,7);
bar(24,57,598,463);
rectangle(24,57,598,463);
gotoxy(6,4);
setcolor(4);
getch();
}
};
//**********************************************
// THIS IS MAIN FUNCTION CALLING VARIOUS
// FUNCTIONS
//**********************************************
void main()
{
clrscr();
int gm=DETECT,gd;
initgraph(&gm,&gd,"c:\\turboc3\\bgi");
setbkcolor(BLUE);
setcolor(RED);
for(int i=0;i<450;i++)
{circle(305,250,i);
delay(3);
}
setcolor(GREEN);
settextstyle(1,0,11);
outtextxy(80,150,"VINEETA");
getch();
cleardevice();
setbkcolor(BLUE);
setcolor(RED);
for(i=0;i<450;i++)
{circle(305,250,i);
delay(3);
}
setcolor(GREEN);
settextstyle(1,0,9);
outtextxy(100,0,"PRESENTS");
outtextxy(270,120,"A");
outtextxy(100,240,"PROJECT");
outtextxy(250,360,"ON");
getch();
cleardevice();
setbkcolor(4);
setcolor(GREEN);
for(i=0;i<9;i++)
{
settextstyle(1,0,i);
outtextxy(40+i,140+i," TIME HOTEL ");
sound(200*i);
delay(600);
nosound();
cleardevice();
}
outtextxy(46,146," TIME HOTEL");
getch();
control c;
// void acknow()
//{
// cleardevice();
setbkcolor(BLACK);
setfillstyle(7,1);
floodfill(0,0,4);
setfillstyle(7,10);
bar(17,50,605,470);
rectangle(17,50,605,470);
setfillstyle(1,7);
bar(24,57,598,463);
rectangle(24,57,598,463);
setcolor(5);
settextstyle(1,0,5);
outtextxy(85,5,"ACKNOWLEDGEMENT");
settextstyle(1,0,3);
setcolor(BLACK);
outtextxy(80,60,"I wish to express my deep and heartiest");
outtextxy(40,90,"thanks to my sir :Mr. RAMESH YADAV whose");
outtextxy(40,120,"valueable advice,guidence and helped me a ");
outtextxy(40,150,"lot in doing this project from conception to");
outtextxy(40,180,"completion ");
outtextxy(100,210,"I am also very thankful to my parents ");
outtextxy(40,240,"and friends who gave me moral encouragement ");
outtextxy(40,270,"to make this project a success.");
outtextxy(40,300,"SUBMITTED BY:- ");
outtextxy(40,330,"VINEETA ");
outtextxy(40,360,"B.TECH.III Year ");
outtextxy(40,390,"Shri Krishan Institute of ");
outtextxy(40,420,"Engg. & Technology ");
getch();
cleardevice();
// FOR VERIFICATION
setfillstyle(7,1);
floodfill(0,0,4);
setfillstyle(7,10);
bar(17,50,605,470);
rectangle(17,50,605,470);
setfillstyle(1,7);
bar(24,57,598,463);
rectangle(24,57,598,463);
setcolor(5);
settextstyle(1,0,5);
outtextxy(120,5,"VERIFICATION");
settextstyle(1,0,3);
setcolor(BLACK);
outtextxy(40,60,"I VINEETA submitting this project");
outtextxy(40,90,"as an evidence of my work in computer");
outtextxy(40,120,"lab. in guidence of Mr.RAMESH YADAV ");
outtextxy(40,190,"SUBMITTED BY:- SUBMITTED TO:-");
outtextxy(40,220,"VINEETA Mr.RAMESH YADAV");
outtextxy(40,250,"B.TECH.III Year lecturer in computer");
outtextxy(40,280, "Shri Krishan Institute Of Hartron Workstation ");
outtextxy(40,310,"Engg. & Technology ");
getch();
cleardevice();
c.pass();
c.bye();
closegraph();
}
Ci8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gICAgICAgUFJPSkVDVCAgSE9URUwtTUFOQUdFTUVOVAovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKIAovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gIElOQ0xVREVEIEhFQURFUiBGSUxFUwovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogCgojaW5jbHVkZTxpb3N0cmVhbT4KI2luY2x1ZGU8c3RyaW5nLmg+CiNpbmNsdWRlPGdyYXBoaWNzLmg+CiNpbmNsdWRlPGRvcy5oPgojaW5jbHVkZTxzdGRpby5oPgojaW5jbHVkZTxmc3RyZWFtLmg+CiNpbmNsdWRlPGlvbWFuaXAuaD4KI2luY2x1ZGU8c3RkbGliLmg+CiAKIAovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vIFRISVMgQ0xBU1MgQ09OVEFJTlMgRlVOVElPTlMgRk9SIEZPT0QKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAKY2xhc3MgZm9vZAp7CiAgIHByaXZhdGU6CiAgICAgZnN0cmVhbSBwMTsKICAgICBpbnQgYzsKICAgICBjaGFyIGFwOwogICAgIHN0cnVjdCBmZAogICAgIHsKCSAgY2hhciBuYW1lWzU1XTsKCSAgZmxvYXQgcHJpY2U7CiAgICAgfWY7CiAgIHB1YmxpYzoKICAgICBmb29kKCkKICAgICB7CgkgIGM9MDsKICAgICB9CiAgICAgdm9pZCBmb29kX21lbnUodm9pZCk7CiAgICAgdm9pZCBhcHBfZm1lbnUodm9pZCk7CiAgICAgdm9pZCBmb29kX2JpbGwoKTsKICAgICB2b2lkIGRlbF9hbGwoKTsKfTsKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLyAgRlVOQ1RJT04gRk9SIERJU1BMQVlJTkcgRk9PRCBNRU5VCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIHZvaWQgZm9vZDo6Zm9vZF9tZW51KHZvaWQpCiAgICAgewoJICBjbGVhcmRldmljZSgpOwoJICBzZXRmaWxsc3R5bGUoNywxKTsKCSAgZmxvb2RmaWxsKDAsMCw0KTsKCSAgc2V0ZmlsbHN0eWxlKDcsMTApOwoJICBiYXIoMTcsNDAsNjA1LDQyMCk7CgkgIHJlY3RhbmdsZSgxNyw0MCw2MDUsNDIwKTsKCSAgc2V0ZmlsbHN0eWxlKDEsMTApOwoJICBiYXIoMjQsNDcsNTk4LDQxMyk7CgkgIHJlY3RhbmdsZSgyNCw0Nyw1OTgsNDEzKTsKCSAgcDEuY2xvc2UoKTsKCSAgYz0wOwoJICBwMS5vcGVuKCJmb29kLnR4dCIsaW9zOjppbnxpb3M6OmJpbmFyeSk7CgkgIG91dHRleHR4eSgzMCw1MCwiUy5OLiAgICAgICBJVEVNIE5BTUUgICAgICAgICAgICAgUFJJQ0UiKTsKCSAgZ290b3h5KDQsNSk7CgkgIGNoYXIgaFs1XSxwclsxNV07CgkgIHdoaWxlKHAxLnJlYWQoKGNoYXIqKSZmLHNpemVvZihmKSkpCgkgIHsKCSAgICAgICBjKys7CgkgICAgICAgc2V0dGV4dHN0eWxlKDQsMCwxKTsKCSAgICAgICBpdG9hKGMsaCwxMCk7CgkgICAgICAgb3V0dGV4dHh5KDQwLDYwKzIwKmMsaCk7CgkgICAgICAgb3V0dGV4dHh5KDE1MCw2MCsyMCpjLGYubmFtZSk7CgkgICAgICAgaXRvYShmLnByaWNlLHByLDEwKTsKCSAgICAgICBvdXR0ZXh0eHkoMzkwLDYwKzIwKmMscHIpOwoJICB9Ly9FTkQgT0YgV0hJTEUKCSAgcDEuY2xvc2UoKTsKCSAgc2V0dGV4dHN0eWxlKDE1LDAsMSk7CgkgIG91dHRleHR4eSgzMCwzMjUsIkRPIFlPVSBXQU5UIFRPIEFERCBBTiBJVEVNIC0gKFkvTikiKTsKCSAgZ290b3h5KDYwLDIwKTsKCSAgY2luPj5hcDsKCSAgaWYoYXA9PSd5J3x8YXA9PSdZJykKCSAgewoJICAgICAgIGFwcF9mbWVudSgpOwoJICAgLy9DQUxMSU5HIEFQUEVORCBGVU5DVElPTgogICAgICAgIAkgIH0KCSAgZWxzZQoJICB7CgkgICAgICAgaWYoYXA9PSduJ3x8YXA9PSdOJykKCSAgICAgICB7CgkJICAgIG91dHRleHR4eSgzMCwzNjAsIkRPIFlPVSBXQU5UIFRPIERFTEVURSBBTEwgIChZL04pIik7CgkJICAgIGNoYXIgY2g7CgkJICAgIGdvdG94eSg2MCwyMyk7CgkJICAgIGNpbj4+Y2g7CgkJICAgIGlmKGNoPT0neSd8fGNoPT0nWScpCgkJICAgIHsKCQkJIGRlbF9hbGwoKTsKCSAgICAgIC8vQ0FMTElORyBERUxFVEUgRlVOQ1RJT04KCQkgICAgfQoJICAgICAgIH0KCSAgfQogICAgIH0KIAovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLyAgRlVOQ1RJT04gVE8gQVBQRU5EIElOIEZPT0QgTUVOVQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgdm9pZCBmb29kOjphcHBfZm1lbnUodm9pZCkKICAgICB7CgkgIHAxLm9wZW4oImZvb2QudHh0Iixpb3M6OmFwcHxpb3M6OmJpbmFyeSk7CgkgIG91dHRleHR4eSgzMCwzNjAsIkVOVEVSIElURU0gTkFNRSBVIFdBTlRUTyBBREQiKTsKCSAgZ290b3h5KDYwLDIzKTsKCSAgZ2V0cyhmLm5hbWUpOwoJICBvdXR0ZXh0eHkoMzAsMzgwLCJFTlRFUiBUSEUgUFJJQ0UiKTsKCSAgZ290b3h5KDYwLDI0KTsKCSAgY2luPj5mLnByaWNlOwoJICBwMS53cml0ZSgoY2hhciopJmYsc2l6ZW9mKGYpKTsKCSAgcDEuY2xvc2UoKTsKCSAgZ2V0Y2goKTsKICAgICB9CiAKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLyAgRlVOQ1RJT04gRk9SIEZPT0QgQklMTAovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICB2b2lkIGZvb2Q6OmZvb2RfYmlsbCgpCiAgICAgewoJICBkb3VibGUgYmlsbD0tMTsKCSAgY2hhciBjX25hbWVbMjBdLGZfbmFtZVsyMF07CgkgIGludCBkdDsKCSAgY2xlYXJkZXZpY2UoKTsKCSAgc2V0ZmlsbHN0eWxlKDcsMSk7CgkgIGZsb29kZmlsbCgwLDAsNCk7CgkgIHNldGZpbGxzdHlsZSg3LDEwKTsKCSAgYmFyKDE3LDQwLDYwNSw0MjApOwoJICByZWN0YW5nbGUoMTcsNDAsNjA1LDQyMCk7CgkgIHNldGZpbGxzdHlsZSgxLDcpOwoJICBiYXIoMjQsNDcsNTk4LDQxMyk7CgkgIHJlY3RhbmdsZSgyNCw0Nyw1OTgsNDEzKTsKCSAgc2V0Y29sb3IoNCk7CgkgIHNldHRleHRzdHlsZSg3LDAsMSk7CgkgIG91dHRleHR4eSgzMCw3MCwiRU5URVIgQ1VTVE9NRVIgTkFNRSAiKTsKCSAgZ290b3h5KDUwLDYpOwoJICBjaW4+PmNfbmFtZTsKCSAgb3V0dGV4dHh5KDMwLDEyMCwiRU5URVIgSVRFTSBOQU1FIFRBS0VOIik7CgkgIGdvdG94eSg1MCw5KTsKCSAgY2luPj5mX25hbWU7CgkgIG91dHRleHR4eSgzMCwxNzAsIkVOVEVSIFRIRSBRVUFOVElUWSIpOwoJICBnb3RveHkoNTAsMTIpOwoJICBjaW4+PmR0OwoJICBwMS5jbG9zZSgpOwoJICBwMS5vcGVuKCJmb29kLnR4dCIsaW9zOjppbnxpb3M6OmJpbmFyeSk7CgkgIHdoaWxlKHAxLnJlYWQoKGNoYXIqKSZmLHNpemVvZihmKSkpCgkgIHsKCSAgICAgICBpZihzdHJjbXAoZi5uYW1lLGZfbmFtZSk9PTApCgkgICAgICAgewoJCSAgICBiaWxsPWR0KmYucHJpY2U7CgkgICAgICAgfQoJICB9Ly9FTkQgT0YgV0hJTEUKCSAgaWYoYmlsbD09LTEpCgkgIHsKCSAgICAgICBzZXRjb2xvcigxKTsKIAoJICAgICAgIGZvcihpbnQgaT0wO2k8MjA7aSsrKQoJICAgICAgIHsKCSAgICAgICBzZXRjb2xvcigxKTsKCSAgICAgICBvdXR0ZXh0eHkoMzAsMjIwLCJJVEVNIElTIE5PVCBQUkVTRU5UIik7CgkgICAgICAgZGVsYXkoMTAwKTsKCSAgICAgICBzZXRjb2xvcihXSElURSk7CgkgICAgICAgb3V0dGV4dHh5KDMwLDIyMCwiSVRFTSBJUyBOT1QgUFJFU0VOVCIpOwoJICAgICAgIGRlbGF5KDEwMCk7CgkgICAgIC8vICBkZWxheSgyNTAwKTsKCSAgICAgfQoJICB9CgkgIGVsc2UKCSAgewoJICAgICAgIGNoYXIgdFs1XSxiWzVdOwoJICAgICAgIHNldGNvbG9yKDEpOwoJICAgICAgIGl0b2EoZHQsdCwxMCk7CgkgICAgICAgaXRvYShiaWxsLGIsMTApOwoJICAgICAgIG91dHRleHR4eSgzMCwyNTAsIk5BTUUgRk9PRC5OQU1FICAgICAgUVVBTlRJVFkgICAgICBCSUxMICIpOwoJICAgICAgIHNldGNvbG9yKDEpOwoJICAgICAgIHNldHRleHRzdHlsZSg0LDAsMSk7CgkgICAgICAgb3V0dGV4dHh5KDMwLDI4MCxjX25hbWUpOwoJICAgICAgIG91dHRleHR4eSgxNDAsMjgwLGZfbmFtZSk7CgkgICAgICAgb3V0dGV4dHh5KDMyMCwyODAsdCk7CgkgICAgICAgb3V0dGV4dHh5KDQ0NSwyODAsYik7CgkgICAgICAgZ2V0Y2goKTsKCSAgfQogICAgIH0KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gIEZVTkNUSU9OIFRPIERFTEVURSBGT09EIE1FTlUKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICB2b2lkIGZvb2Q6OmRlbF9hbGwoKQogICAgIHsKCSAgcmVtb3ZlKCJmb29kLnR4dCIpOwoJICBwMS5vcGVuKCJmb29kLnR4dCIsaW9zOjpvdXQpOwoJICBwMS5jbG9zZSgpOwoJICBjPTA7CiAgICAgfQogCiAKLy9FTkQgT0YgQ0xBU1MgRk9PRAogCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vIFRISVMgQ0xBU1MgQ09OVEFJTlMgSU5GT1JNQVRJT04KLy8gICBSRUxBVEVEIFRPIENVU1RPTUVSCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKIApjbGFzcyBjdXN0b21lcgp7CiAgIHByaXZhdGU6CiAgICAgaW50IHEsdzsKICAgICBmc3RyZWFtIGYxOwogICAgIHN0cnVjdCBjdXN0CiAgICAgewoJICBpbnQgY19ubzsKCSAgY2hhciBjX25hbWVbMjBdOwoJICBjaGFyIGNfYWRkWzgwXTsKCSAgaW50IGFfZGF0ZTsKCSAgaW50IGFfbW9udGg7CgkgIGludCBhX3llYXI7CgkgIGludCBkX2RhdGU7CgkgIGludCBkX21vbnRoOwoJICBpbnQgZF95ZWFyOwoJICBpbnQgcm9vbV9ubzsKCSAgY2hhciByb29tX3R5cGVbMjVdOwogICAgIH1wOwogICBwdWJsaWM6CiAgICAgZm9vZCBqOwogCiAgICAgY3VzdG9tZXIoKQogICAgIHsKCSAgcC5jX25vPTA7CgkgIHAuZF9kYXRlPTA7CgkgIHAuZF9tb250aD0wOwogICAgIH0KIAovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gIEZVTkNUSU9OIEZPUiBDVVNUT01FUiBCSUxMCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICBpbmxpbmUgdm9pZCBjdXN0b21lcjo6Y3VzdF9iaWxsKCkKICAgICB7CgkgIGludCBjaG87CgkgIGRvCgkgIHsKCSAgICAgICBjbGVhcmRldmljZSgpOwoJICAgICAgIGYxLmNsb3NlKCk7CgkgICAgICAgc2V0ZmlsbHN0eWxlKDcsMSk7CgkgICAgICAgZmxvb2RmaWxsKDAsMCw0KTsKCSAgICAgICBzZXRmaWxsc3R5bGUoNywxMCk7CgkgICAgICAgYmFyKDEwLDcwLDYwMCw0NTApOwoJICAgICAgIHJlY3RhbmdsZSgxMCw3MCw2MDAsNDUwKTsKCSAgICAgICBzZXRmaWxsc3R5bGUoMSw3KTsKCSAgICAgICBiYXIoMTcsNzcsNTkzLDQ0Myk7CgkgICAgICAgcmVjdGFuZ2xlKDE3LDc3LDU5Myw0NDMpOwoJICAgICAgIHNldGNvbG9yKDUpOwoJICAgICAgIHNldGZpbGxzdHlsZSgxLDIpOwoJICAgICAgIHNldHRleHRzdHlsZSg3LDAsMSk7CgkgICAgICAgc2V0Y29sb3IoOSk7CgkgICAgICAgc2V0ZmlsbHN0eWxlKDEsMik7CgkgICAgICAgYmFyKDIxMCwxNDAsNDEwLDIzOCk7CgkgICAgICAgcmVjdGFuZ2xlKDIxMCwxNDAsNDEwLDE1OCk7CgkgICAgICAgcmVjdGFuZ2xlKDIxMCwxNDAsNDEwLDE3NCk7CgkgICAgICAgcmVjdGFuZ2xlKDIxMCwxNDAsNDEwLDE5MCk7CgkgICAgICAgcmVjdGFuZ2xlKDIxMCwxNDAsNDEwLDIwNik7CgkgICAgICAgcmVjdGFuZ2xlKDIxMCwxNDAsNDEwLDIyMik7CgkgICAgICAgcmVjdGFuZ2xlKDIxMCwxNDAsNDEwLDIzOCk7CgkgICAgICAgc2V0Y29sb3IoNCk7CgkgICAgICAgc2V0dGV4dHN0eWxlKDEsMCw0KTsKCSAgICAgICBvdXR0ZXh0eHkoMTgwLDIwLCJIT1RFTCBCSUxMIik7CgkgICAgICAgbGluZSgxODAsNjAsMzgzLDYwKTsKCSAgICAgICBzZXRjb2xvcig0KTsKCSAgICAgICBzZXR0ZXh0c3R5bGUoMSwwLDEpOwoJICAgICAgIG91dHRleHR4eSgyMTAsMTM3LCIgIDEuICBST09NIEJJTEwiKTsKCSAgICAgICBvdXR0ZXh0eHkoMjEwLDE3MCwiICAyLiAgRk9PRCBCSUxMIik7CgkgICAgICAgb3V0dGV4dHh5KDIxMCwyMDAsIiAgMy4gIE1BSU4gTUVOVSIpOwoJICAgICAgIG91dHRleHR4eSg2MywzMTgsIkVOVEVSIENIT0lDRSBGT1IgV0hJQ0ggWU9VIFdBTlQgVEhFIEJJTEwiKTsKCSAgICAgICBnb3RveHkoNjcsMjEpOwoJICAgICAgIGNpbj4+Y2hvOwoJICAgICAgIGNob29zZShjaG8pOwoJICB9d2hpbGUoY2hvIT0zKTsvL0VORCBPRiBXSElMRQogICAgIH0KIAogICAgIHZvaWQgY2hvb3NlKGludCBhKQogICAgIHsKCSAgc3dpdGNoKGEpCgkgIHsKIAogCgkJY2FzZSAxOgoJCXsKCQkJcm9vbV9iaWxsKCk7CgkJCWJyZWFrOwoJCX0KCQljYXNlIDI6CgkJewoJCQlqLmZvb2RfYmlsbCgpOwoJCQlicmVhazsKCQl9CgkJY2FzZSAzOgoJCQlicmVhazsKCSAgfQogICAgIH0KIAovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gIEZVTkNUSU9OIEZPUiBST09NIEJJTEwKLy8qKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIHZvaWQgcm9vbV9iaWxsKCkKICAgICB7CgkgIGRvdWJsZSBiaWxsOwoJICBpbnQgZGF5cyxubyxkdCxtdGg7CgkgIGNsZWFyZGV2aWNlKCk7CgkgIHNldGZpbGxzdHlsZSg3LDEpOwoJICBmbG9vZGZpbGwoMCwwLDQpOwoJICBzZXRmaWxsc3R5bGUoNywxMCk7CgkgIGJhcigxNyw0MCw2MDUsNDIwKTsKCSAgcmVjdGFuZ2xlKDE3LDQwLDYwNSw0MjApOwoJICBzZXRmaWxsc3R5bGUoMSw3KTsKCSAgYmFyKDI0LDQ3LDU5OCw0MTMpOwoJICByZWN0YW5nbGUoMjQsNDcsNTk4LDQxMyk7CgkgIHNldGNvbG9yKDQpOwoJICBzZXR0ZXh0c3R5bGUoNywwLDEpOwoJICBvdXR0ZXh0eHkoMzAsNzAsIkVOVEVSIENVU1RPTUVSIE5PIERFUEFSVElORyIpOwoJICBnb3RveHkoNTAsNik7CgkgIGNpbj4+bm87CgkgIG91dHRleHR4eSgzMCwxMjAsIkRBVEUgT0YgREVQQVJUVVJFIik7CgkgIGdvdG94eSg1MCw5KTsKCSAgY2luPj5kdDsKCSAgb3V0dGV4dHh5KDMwLDE3MCwiTU9OVEggT0YgREVQQVJUVVJFIik7CgkgIGdvdG94eSg1MCwxMik7CgkgIGNpbj4+bXRoOwoJICBpZihwLmFfbW9udGg+bXRoKQoJICB7YmlsbD0wOwoJICB9CgkgIGYxLmNsb3NlKCk7CgkgIGYxLm9wZW4oImN1c3QudHh0Iixpb3M6OmlufGlvczo6YmluYXJ5KTsKCSAgaW50IGM9MDsKCSAgd2hpbGUoZjEucmVhZCgoY2hhciopJnAsc2l6ZW9mKHApKSkKCSAgewoJICAgICAgIGlmKHAuY19ubz09bm8pCgkgICAgICAgeyAgICBjKys7CgkJICAgICBpZihwLmFfbW9udGg9PW10aCkKCQkgICAgICB7CgkJCSAgIGRheXM9ZHQtcC5hX2RhdGU7CgkJICAgICAgfQoJCSAgICAgZWxzZQoJCSAgICAgIHsKCQkJICAgZGF5cz0obXRoLXAuYV9tb250aCkqMzArKGR0LXAuYV9kYXRlKTsKCQkgICAgICB9CgkJICAgIGlmKHAucm9vbV9ubzwxMSkKCQkgICAgIHsKCQkJICBjaGFyIGRbNV0sbVs1XSxoWzVdLG10WzVdLGR5WzVdLGJsWzVdOwoJCQkgIGJpbGw9ZGF5cyoyNTA7CgkJCSAgc2V0Y29sb3IoNCk7CgkJCSAgb3V0dGV4dHh5KDMwLDI3MCwiIE5BTUUgICAgQVJSSVZBTCAgICBERVBBUlRVUkUgICAgREFZUyBJTiAgICBCSUxMICIpOwoJCQkgIHNldGNvbG9yKDEpOwoJCQkgIHNldHRleHRzdHlsZSgxLDAsMSk7CgkJCSAgb3V0dGV4dHh5KDQwLDMwMCxwLmNfbmFtZSk7CgkJCSAgaXRvYShwLmFfZGF0ZSxkLDEwKTsKCQkJICBvdXR0ZXh0eHkoMTUwLDMwMCxkKTsKCQkJICBvdXR0ZXh0eHkoMTYwLDMwMCwiLyIpOwoJCQkgIGl0b2EocC5hX21vbnRoLG0sMTApOwoJCQkgIG91dHRleHR4eSgxNzAsMzAwLG0pOwoJCQkgIGl0b2EoZHQsaCwxMCk7CgkJCSAgb3V0dGV4dHh5KDI3MCwzMDAsaCk7CgkJCSAgb3V0dGV4dHh5KDI4MCwzMDAsIi8iKTsKCQkJICBpdG9hKG10aCxtdCwxMCk7CgkJCSAgb3V0dGV4dHh5KDI5MCwzMDAsbXQpOwoJCQkgIGl0b2EoZGF5cyxkeSwxMCk7CgkJCSAgb3V0dGV4dHh5KDQwNSwzMDAsZHkpOwoJCQkgIGl0b2EoYmlsbCxibCwxMCk7CgkJCSAgb3V0dGV4dHh5KDUxNSwzMDAsYmwpOwoJCSAgICB9CgkJICAgIGVsc2UKCQkgICAgIHsKCQkJICBjaGFyIGRbNV0sbVs1XSxoWzVdLG10WzVdLGR5WzVdLGJsWzVdOwoJCQkgIGJpbGw9ZGF5cyoxNTA7CgkJCSAgc2V0Y29sb3IoNCk7CgkJCSAgb3V0dGV4dHh5KDMwLDI3MCwiIE5BTUUgICAgQVJSSVZBTCAgICBERVBBUlRVUkUgICAgREFZUyBJTiAgICBCSUxMICIpOwoJCQkgIHNldGNvbG9yKDEpOwoJCQkgIHNldHRleHRzdHlsZSgxLDAsMSk7CgkJCSAgb3V0dGV4dHh5KDQwLDMwMCxwLmNfbmFtZSk7CgkJCSAgaXRvYShwLmFfZGF0ZSxkLDEwKTsKCQkJICBvdXR0ZXh0eHkoMTUwLDMwMCxkKTsKCQkJICBvdXR0ZXh0eHkoMTYwLDMwMCwiLyIpOwoJCQkgIGl0b2EocC5hX21vbnRoLG0sMTApOwoJCQkgIG91dHRleHR4eSgxNzAsMzAwLG0pOwoJCQkgIGl0b2EoZHQsaCwxMCk7CgkJCSAgb3V0dGV4dHh5KDI3MCwzMDAsaCk7CgkJCSAgb3V0dGV4dHh5KDI4MCwzMDAsIi8iKTsKCQkJICBpdG9hKG10aCxtdCwxMCk7CgkJCSAgb3V0dGV4dHh5KDI5MCwzMDAsbXQpOwoJCQkgIGl0b2EoZGF5cyxkeSwxMCk7CgkJCSAgb3V0dGV4dHh5KDQwNSwzMDAsZHkpOwoJCQkgIGl0b2EoYmlsbCxibCwxMCk7CgkJCSAgb3V0dGV4dHh5KDUxMCwzMDAsYmwpOwoJCSAgICB9CgkJICAgIGYxLmNsb3NlKCk7CgkJICAgIGludCBjb3VudD0xOwoJCSAgICBmMS5vcGVuKCJjdXN0LnR4dCIsaW9zOjppbnwgaW9zOjpiaW5hcnkpOwoJCSAgICBmc3RyZWFtIGYyOwoJCSAgICB3aGlsZShmMS5yZWFkKChjaGFyKikmcCxzaXplb2YocCkpKQoJCSAgICB7CgkJCSBpZihwLmNfbm89PW5vKQoJCQkgewoJCQkgICAgICBjb250aW51ZTsKCQkJIH0KCQkJIGVsc2UKCQkJIHsKCQkJICAgICAgZjIub3BlbigiZHVwLnR4dCIsaW9zOjphcHB8aW9zOjpiaW5hcnkpOwoJCQkgICAgICBwLmNfbm89Y291bnQ7CgkJCSAgICAgIGYyLndyaXRlKChjaGFyKikmcCxzaXplb2YocCkpOwoJCQkgICAgICBjb3VudCsrOwoJCQkgICAgICBmMi5jbG9zZSgpOwoJCQkgfQoJCSAgICB9Ly9FTkQgT0YgV0hJTEUKCQkgICAgcmVtb3ZlKCJjdXN0LnR4dCIpOwoJCSAgICByZW5hbWUoImR1cC50eHQiLCJjdXN0LnR4dCIpOwoJCSAgICBmMS5jbG9zZSgpOwoJICAgICAgIH0KCSAgfS8vRU5EIE9GIFdISUxFCgkgIGlmKGM9PTApCgkgIHsgICAgZm9yKGludCBpPTA7aTwxMDtpKyspCgkgICAgICAgewoJICAgICAgIHNldHRleHRzdHlsZSgxLDAsMyk7CgkgICAgICAgc2V0Y29sb3IoNCk7CgkgICAgICAgb3V0dGV4dHh5KDE1MCwzMDAsIkNVU1RPTUVSIElTIE5PVCBQUkVTRU5UIik7CgkgICAgICAgZGVsYXkoMTAwKTsgIHNldGNvbG9yKFdISVRFKTsKCSAgICAgICBvdXR0ZXh0eHkoMTUwLDMwMCwiQ1VTVE9NRVIgSVMgTk9UIFBSRVNFTlQiKTsKCSAgICAgICBkZWxheSgxMDApOwoJICAgICAgIH0KCSAgfQogCiAKCSAgZ2V0Y2goKTsKICAgICB9CiAKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLyAgRlVOQ1RJT04gVE8gRElTUExBWSBDVVNUT01FUiBERVRBSUwKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgdm9pZCBjdXN0X2RldGFpbCgpCiAgICAgewoJICBpbnQgYzsKCSAgZG8KCSAgewoJICAgICAgIGNsZWFyZGV2aWNlKCk7CgkgICAgICAgc2V0ZmlsbHN0eWxlKDcsMSk7CgkgICAgICAgZmxvb2RmaWxsKDAsMCw0KTsKCSAgICAgICBzZXRmaWxsc3R5bGUoNywxMCk7CgkgICAgICAgYmFyKDUwLDgwLDYwMCw0NzApOwoJICAgICAgIHJlY3RhbmdsZSg1MCw4MCw2MDAsNDcwKTsKCSAgICAgICBzZXRmaWxsc3R5bGUoMSw3KTsKCSAgICAgICBiYXIoNTcsODcsNTkzLDQ2Myk7CgkgICAgICAgcmVjdGFuZ2xlKDU3LDg3LDU5Myw0NjMpOwoJICAgICAgIHNldGNvbG9yKDkpOwoJICAgICAgIHNldGZpbGxzdHlsZSgxLDIpOwoJICAgICAgIGJhcigyMTAsMTQwLDQxMCwyNTQpOwoJICAgICAgIHJlY3RhbmdsZSgyMTAsMTQwLDQxMCwxNTgpOwoJICAgICAgIHJlY3RhbmdsZSgyMTAsMTQwLDQxMCwxNzQpOwoJICAgICAgIHJlY3RhbmdsZSgyMTAsMTQwLDQxMCwxOTApOwoJICAgICAgIHJlY3RhbmdsZSgyMTAsMTQwLDQxMCwyMDYpOwoJICAgICAgIHJlY3RhbmdsZSgyMTAsMTQwLDQxMCwyMjIpOwoJICAgICAgIHJlY3RhbmdsZSgyMTAsMTQwLDQxMCwyMzgpOwoJICAgICAgIHJlY3RhbmdsZSgyMTAsMTQwLDQxMCwyNTQpOwoJICAgICAgIHNldGNvbG9yKDQpOwoJICAgICAgIHNldHRleHRzdHlsZSgxLDAsNCk7CgkgICAgICAgb3V0dGV4dHh5KDE2MCwyMCwiQ1VTVE9NRVIgREVUQUlMICIpOwoJICAgICAgIHNldGNvbG9yKDE0KTsKCSAgICAgICBsaW5lKDE2Myw2MCw0NzUsNjApOwoJICAgICAgIHNldGNvbG9yKDQpOwoJICAgICAgIHNldHRleHRzdHlsZSgxLDAsMSk7CgkgICAgICAgb3V0dGV4dHh5KDIyNSwxMzcsIiAgQ0hPSUNFUyBBUkUgOi0iKTsKCSAgICAgICBzZXRjb2xvcig0KTsKCSAgICAgICBzZXR0ZXh0c3R5bGUoMSwwLDEpOwoJICAgICAgIG91dHRleHR4eSgyMTAsMTU0LCIgMS4gQVBQRU5EIik7CgkgICAgICAgb3V0dGV4dHh5KDIxMCwxNzAsIiAyLiBNT0RJRlkiKTsKCSAgICAgICBvdXR0ZXh0eHkoMjEwLDE4NiwiIDMuIERFTEVURSAiKTsKCSAgICAgICBvdXR0ZXh0eHkoMjEwLDIwMiwiIDQuIERFTEVURSBBTEwgIik7CgkgICAgICAgb3V0dGV4dHh5KDIxMCwyMTgsIiA1LiBESVNQTEFZICIpOwoJICAgICAgIG91dHRleHR4eSgyMTAsMjM0LCIgNi4gTUFJTiBNRU5VIik7CgkgICAgICAgc2V0Y29sb3IoNCk7CgkgICAgICAgc2V0dGV4dHN0eWxlKDcsMCwyKTsKCSAgICAgICBvdXR0ZXh0eHkoMjEwLDMwMCwiRU5URVIgQ0hPSUNFIDotICIpOwoJICAgICAgIGdvdG94eSg1MywyMCk7CgkgICAgICAgY2luPj5jOwoJICAgICAgIHN3aXRjaChjKQoJICAgICAgIHsKCQkgICAgY2FzZSAxOgoJCSAgICB7CgkJCSAgICBjdXN0X2FwcCgpOwoJCQkgICAgYnJlYWs7CgkJICAgIH0KCQkgICAgY2FzZSAyOgoJCSAgICB7CgkJCSAgICBjdXN0X21vZCgpOwoJCQkgICAgYnJlYWs7CgkJICAgIH0KCQkgICAgY2FzZSAzOgoJCSAgICB7CgkJCSAgICBjdXN0X2RlbCgpOwoJCQkgICAgYnJlYWs7CgkJICAgIH0KCQkgICAgY2FzZSA0OgoJCSAgICB7CgkJCSAgICBjdXN0X2FkZWwoKTsKCQkJICAgIGJyZWFrOwoJCSAgICB9CgkJICAgIGNhc2UgNToKCQkgICAgewoJCQkgICAgY3VzdF9kaXNwKCk7CgkJCSAgICBicmVhazsKCQkgICAgfQoJICAgICAgIH0KCSAgfXdoaWxlKGMhPTYpOy8vRU5EIE9GIFdISUxFCiAgICAgfQogCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gIEZVTkNUSU9OIFRPIEFQUEVORCBDVVNUT01FUgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICB2b2lkIGN1c3RfYXBwKCkKICAgICB7CgkgIGludCB0ZW4sdGVtcDsKCSAgY2xlYXJkZXZpY2UoKTsKCSAgZjEub3BlbigiY3VzdC50eHQiLGlvczo6YXBwfGlvczo6YmluYXJ5KTsKCSAgZjEuc2Vla2coMCxpb3M6OmVuZCk7CgkgIHRlbj1mMS50ZWxsZygpL3NpemVvZihwKTsKCSAgcC5jX25vPXRlbisxOwoJICBzZXRmaWxsc3R5bGUoNywxKTsKCSAgZmxvb2RmaWxsKDAsMCw0KTsKCSAgc2V0ZmlsbHN0eWxlKDcsMTApOwoJICBiYXIoMTcsNTAsNjA1LDQ3MCk7CgkgIHJlY3RhbmdsZSgxNyw1MCw2MDUsNDcwKTsKCSAgc2V0ZmlsbHN0eWxlKDEsNyk7CgkgIGJhcigyNCw1Nyw1OTgsNDYzKTsKCSAgcmVjdGFuZ2xlKDI0LDU3LDU5OCw0NjMpOwoJICBzZXRjb2xvcig0KTsKCSAgc2V0dGV4dHN0eWxlKDcsMCwxKTsKCSAgb3V0dGV4dHh5KDMwLDcwLCJOQU1FIik7CgkgIGdvdG94eSg1MCw2KTsKCSAgY2luPj5wLmNfbmFtZTsKCSAgb3V0dGV4dHh5KDMwLDEyMCwiQUREUkVTUyIpOwoJICBnb3RveHkoNTAsOSk7CgkgIGdldHMocC5jX2FkZCk7CgkgIG91dHRleHR4eSgzMCwxNzAsIkRBVEUgT0YgQVJSSVZBTCIpOwoJICBnb3RveHkoNTAsMTIpOwoJICBjaW4+PnAuYV9kYXRlOwoJICBvdXR0ZXh0eHkoMzAsMjIwLCJNT05USCBPRiBBUlJJVkFMIik7CgkgIGdvdG94eSg1MCwxNSk7CgkgIGNpbj4+cC5hX21vbnRoOwoJICBvdXR0ZXh0eHkoMzAsMjcwLCJZRUFSIE9GIEFSUklWQUwiKTsKCSAgZ290b3h5KDUwLDE4KTsKCSAgY2luPj5wLmFfeWVhcjsKCSAgcC5yb29tX25vPXRlbisxOwoJICBmMS53cml0ZSgoY2hhciopJnAsc2l6ZW9mKHApKTsKCSAgZjEuY2xvc2UoKTsKICAgICB9CiAKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vICBGVU5DVElPTiBUTyBESVNQTEFZIENVU1RPTUVSIElOIEhPVEVMCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgdm9pZCBjdXN0X2Rpc3AoKQogICAgIHsKCSAgY2xlYXJkZXZpY2UoKTsKCSAgZjEuY2xvc2UoKTsKCSAgc2V0ZmlsbHN0eWxlKDcsMSk7CgkgIGZsb29kZmlsbCgwLDAsNCk7CgkgIHNldGZpbGxzdHlsZSg3LDEwKTsKCSAgYmFyKDIwLDIwLDYyMCw0NTApOwoJICByZWN0YW5nbGUoMjAsMjAsNjIwLDQ1MCk7CgkgIHNldGZpbGxzdHlsZSgxLDcpOwoJICBiYXIoMjcsMjcsNjEzLDQ0Myk7CgkgIHJlY3RhbmdsZSgyNywyNyw2MTMsNDQzKTsKCSAgc2V0Y29sb3IoNCk7CgkgIHNldGZpbGxzdHlsZSgxLDIpOwoJICBzZXR0ZXh0c3R5bGUoNywwLDEpOwoJICBvdXR0ZXh0eHkoMjUsNDAsIiBDVVNUIE5PICAgICAgTkFNRSAgICAgQUREUkVTUyAgICAgIFJPT00uTk8gICAgIERBVEUiKTsKCSAgZ290b3h5KDMwLDMpOwoJICBpbnQgYz0wOwoJICBmMS5vcGVuKCJjdXN0LnR4dCIsaW9zOjppbnxpb3M6OmJpbmFyeSk7CgkgIGYxLnNlZWtnKDAsaW9zOjpiZWcpOwoJICBjaGFyIGhbNV0scHJbNV0sZFs1XSxtWzZdOwoJICB3aGlsZShmMS5yZWFkKChjaGFyKikmcCxzaXplb2YocCkpKQoJICB7CgkgICAgICAgYysrOwoJICAgICAgIHNldGNvbG9yKDEpOwoJICAgICAgIHNldHRleHRzdHlsZSgxLDAsMSk7CgkgICAgICAgaXRvYShwLmNfbm8saCwxMCk7CgkgICAgICAgb3V0dGV4dHh5KDU1LDUwKzIwKmMsaCk7CgkgICAgICAgb3V0dGV4dHh5KDE2MCw1MCsyMCpjLHAuY19uYW1lKTsKCSAgICAgICBvdXR0ZXh0eHkoMjgwLDUwKzIwKmMscC5jX2FkZCk7CgkgICAgICAgaXRvYShwLnJvb21fbm8scHIsMTApOwoJICAgICAgIG91dHRleHR4eSg0NDAsNTArMjAqYyxwcik7CgkgICAgICAgaXRvYShwLmFfZGF0ZSxkLDEwKTsKCSAgICAgICBvdXR0ZXh0eHkoNTUwLDUwKzIwKmMsZCk7CgkgICAgICAgb3V0dGV4dHh5KDU2MCw1MCsyMCpjLCIvIik7CgkgICAgICAgaXRvYShwLmFfbW9udGgsbSwxMCk7CgkgICAgICAgb3V0dGV4dHh5KDU3MCw1MCsyMCpjLG0pOwoJICB9Ly9FTkQgT0YgV0hJTEUKCSAgZ2V0Y2goKTsKCSAgZjEuY2xvc2UoKTsKICAgICB9CiAKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gIEZVTkNUSU9OIEZPUiBNT0RJRllJTkcgQ1VTVE9NRVIgREVUQUlMCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICB2b2lkIGN1c3RfbW9kKCkKICAgICB7CgkgIGNsZWFyZGV2aWNlKCk7CgkgIGYxLmNsb3NlKCk7CgkgIHNldGZpbGxzdHlsZSg3LDEpOwoJICBmbG9vZGZpbGwoMCwwLDQpOwoJICBzZXRmaWxsc3R5bGUoNywxMCk7CgkgIGJhcigxMCwxMCw2MDAsNDcwKTsKCSAgcmVjdGFuZ2xlKDEwLDEwLDYwMCw0NzApOwoJICBzZXRmaWxsc3R5bGUoMSw3KTsKCSAgYmFyKDE3LDE3LDU5Myw0NjMpOwoJICByZWN0YW5nbGUoMTcsMTcsNTkzLDQ2Myk7CgkgIHNldGNvbG9yKDkpOwoJICBzZXRmaWxsc3R5bGUoMSwyKTsKCSAgc2V0Y29sb3IoNCk7CgkgIGludCBubzsvLyxjb3VudD0wOwoJICBvdXR0ZXh0eHkoMzAsNDIsIkVOVEVSIENVU1RPTUVSIE5PIFRPIEJFIE1PRElGSUVEIik7CgkgIGdvdG94eSg2NSw0KTsKCSAgY2luPj5ubzsKCSAgZjEub3BlbigiY3VzdC50eHQiLGlvczo6aW58aW9zOjpiaW5hcnkpOwoJICB3aGlsZShmMS5yZWFkKChjaGFyKikmcCxzaXplb2YocCkpKQoJICB7CgkgICAgICAgaWYocC5jX25vPT1ubykKCSAgICAgICB7CgkJICAgIGYxLmNsb3NlKCk7CgkJICAgIGludCBudW09c2l6ZW9mKHApKihuby0xKTsKCQkgICAgZjEub3BlbigiY3VzdC50eHQiLGlvczo6b3V0fGlvczo6YXRlfGlvczo6YmluYXJ5KTsKCQkgICAgZjEuc2Vla3AobnVtLGlvczo6YmVnKTsKCQkgICAgb3V0dGV4dHh5KDMwLDExMCwiRU5URVIgTkVXIFJFQ09SRCAiKTsKCQkgICAgb3V0dGV4dHh5KDMwLDE1MCwiTkFNRSIpOwoJCSAgICBnb3RveHkoMzAsMTEpOwoJCSAgICBjaW4+PnAuY19uYW1lOwoJCSAgICBvdXR0ZXh0eHkoMzAsMjAwLCJBRERSRVNTIik7CgkJICAgIGdvdG94eSgzMCwxNCk7CgkJICAgIGNpbj4+cC5jX2FkZDsKCQkgICAgb3V0dGV4dHh5KDMwLDI1MCwiREFURSIpOwoJCSAgICBnb3RveHkoMzAsMTcpOwoJCSAgICBjaW4+PnAuYV9kYXRlOwoJCSAgICBvdXR0ZXh0eHkoMzAsMzAwLCJNT05USCIpOwoJCSAgICBnb3RveHkoMzAsMjApOwoJCSAgICBjaW4+PnAuYV9tb250aDsKCQkgICAgb3V0dGV4dHh5KDMwLDM1MCwiWUVBUiIpOwoJCSAgICBnb3RveHkoMzAsMjMpOwoJCSAgICBjaW4+PnAuYV95ZWFyOwoJCSAgICBmMS53cml0ZSgoY2hhciopJnAsc2l6ZW9mKHApKTsKCQkgICAgZjEuY2xvc2UoKTsKCSAgICAgICB9CgkgIH0vL0VORCBPRiBXSElMRQoJICBnZXRjaCgpOwogICAgIH0KIAovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gIEZVTkNUSU9OIFRPIERFTEVURSBBTEwgQ1VTVE9NRVIgUkVDT1JEUwovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIHZvaWQgY3VzdF9hZGVsKCkKICAgICB7CgkgIHJlbW92ZSgiY3VzdC50eHQiKTsKCSAgZjEub3BlbigiY3VzdC50eHQiLGlvczo6b3V0fGlvczo6YmluYXJ5fGlvczo6aW4pOwoJICBwLmNfbm89MDsKCSAgcC5yb29tX25vPTA7CiAgICAgfQogCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLyAgRlVOQ1RJT04gVE8gREVMRVRFIEEgQ1VTVE9NRVIgUkVDT1JECi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgdm9pZCBjdXN0X2RlbCgpCiAgICAgewoJICBjbGVhcmRldmljZSgpOwoJICBmMS5jbG9zZSgpOwoJICBzZXRmaWxsc3R5bGUoNywxKTsKCSAgZmxvb2RmaWxsKDAsMCw0KTsKCSAgc2V0ZmlsbHN0eWxlKDcsMTApOwoJICBiYXIoMTAsMTAsNjAwLDQ3MCk7CgkgIHJlY3RhbmdsZSgxMCwxMCw2MDAsNDcwKTsKCSAgc2V0ZmlsbHN0eWxlKDEsNyk7CgkgIGJhcigxNywxNyw1OTMsNDYzKTsKCSAgcmVjdGFuZ2xlKDE3LDE3LDU5Myw0NjMpOwoJICBzZXRjb2xvcig5KTsKCSAgc2V0ZmlsbHN0eWxlKDEsMik7CgkgIHNldGNvbG9yKDQpOwoJICBpbnQgbm8sY291bnQ9MTsKCSAgb3V0dGV4dHh5KDMwLDQyLCJFTlRFUiBDVVNUT01FUiBOTyBUTyBCRSBERUxFVEVEIik7CgkgIGdvdG94eSg2NSw0KTsKCSAgY2luPj5ubzsKCSAgZjEub3BlbigiY3VzdC50eHQiLGlvczo6aW58aW9zOjpiaW5hcnkpOwoJICBmc3RyZWFtIGYyOwoJICB3aGlsZShmMS5yZWFkKChjaGFyKikmcCxzaXplb2YocCkpKQoJICB7CgkgICAgICAgaWYocC5jX25vPT1ubykKCSAgICAgICB7CgkJICAgIGNvbnRpbnVlOwoJICAgICAgIH0KCSAgICAgICBlbHNlCgkgICAgICAgewoJCSAgICBmMi5vcGVuKCJkdXAudHh0Iixpb3M6OmFwcHxpb3M6OmJpbmFyeSk7CgkJICAgIHAuY19ubz1jb3VudDsKCQkgICAgZjIud3JpdGUoKGNoYXIqKSZwLHNpemVvZihwKSk7CgkJICAgIGNvdW50Kys7CgkJICAgIGYyLmNsb3NlKCk7CgkgICAgICAgfQoJICB9CgkgIHJlbW92ZSgiY3VzdC50eHQiKTsKCSAgcmVuYW1lKCJkdXAudHh0IiwiY3VzdC50eHQiKTsKCSAgZjEuY2xvc2UoKTsKCSAgZ2V0Y2goKTsKICAgICB9Cn07Ci8vRU5EIE9GIENMQVNTIENVU1RPTUVSCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gIFRISVMgQ0xBU1MgQ09OVEFJTlMgSU5GT1JNQVRJT04KLy8gICBBQk9VVCBIT1RFTAovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKY2xhc3MgaG90ZWwKewogICBwcml2YXRlOgogICAgIGZzdHJlYW0gZjE7CiAKICAgICBzdHJ1Y3QgY3VzdAogICAgIHsKCSAgaW50IGNfbm87CgkgIGNoYXIgY19uYW1lWzIwXTsKCSAgY2hhciBjX2FkZFsyMF07CgkgIGludCBhX2RhdGU7CgkgIGludCBhX21vbnRoOwoJICBpbnQgYV95ZWFyOwoJICBpbnQgZF9kYXRlOwoJICBpbnQgZF9tb250aDsKCSAgaW50IGRfeWVhcjsKCSAgaW50IHJvb21fbm87CgkgIGNoYXIgcm9vbV90eXBlWzI1XTsKICAgICB9eDsKIAogICBwdWJsaWM6Cn07Ci8vRU5EIE9GIENMQVNTIEhPVEVMCiAKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vICAgQ0xBU1MgQ09OVFJPTExJTkcgQUxMIFRIRSBDTEFTU0VTCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCmNsYXNzIGNvbnRyb2wKewogICBwcml2YXRlOgogICAgIGludCBjaDsKIAogICBwdWJsaWM6CiAgICAgaG90ZWwgaDsKICAgICBjdXN0b21lciBjdXN0OwogICAgIGZvb2QgZDsKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gIEZVTkNUSU9OIEZPUiBQQVNTV09SRAovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgdm9pZCBwYXNzKCkKICAgICB7CgkgIGNoYXIgcGFzc3dbMjBdOwoJICBmb3IoOzspCgkgIHsKCSAgICAgICBob3RfbmFtZSgpOwoJICAgICAgIHNldGNvbG9yKDQpOwoJICAgICAgIHNldGZpbGxzdHlsZSg3LDEpOwoJICAgICAgIGZsb29kZmlsbCgwLDAsNCk7CgkgICAgICAgc2V0ZmlsbHN0eWxlKDcsMTApOwoJICAgICAgIGJhcig1MCw2MCw2MDAsNDUwKTsKCSAgICAgICByZWN0YW5nbGUoNTAsNjAsNjAwLDQ1MCk7CgkgICAgICAgc2V0ZmlsbHN0eWxlKDEsNyk7CgkgICAgICAgYmFyKDU3LDY3LDU5Myw0NDMpOwoJICAgICAgIHJlY3RhbmdsZSg1Nyw2Nyw1OTMsNDQzKTsKCSAgICAgICBzZXRjb2xvcig0KTsKCSAgICAgICBzZXR0ZXh0c3R5bGUoNywwLDEpOwoJICAgICAgIHNldHRleHRzdHlsZSg3LDAsMikgOwoJICAgICAgIG91dHRleHR4eSgyMDAsMjIwLCJFTlRFUiBQQVNTV09SRCA6LSIpOwoJICAgICAgIGdvdG94eSg1NSwxNSk7CgkgICAgICAgY2luPj5wYXNzdzsKCSAgICAgICBpZiAoc3RyY21wKHBhc3N3LCJhIik9PTApCgkgICAgICAgewoJCSAgICBjbGVhcmRldmljZSgpOwoJCSAgICBicmVhazsKCSAgICAgICB9CgkgICAgICAgZWxzZQoJICAgICAgIHsKCQkgICAgc2V0Y29sb3IoNCk7CgkJICAgIHNldHRleHRzdHlsZSg3LDAsMSk7CgkJICAgIGZvcihpbnQgaT0wO2k8MTA7aSsrKQoJCSAgICB7CgkJICAgIHNldGNvbG9yKDQpOwoJCSAgICBvdXR0ZXh0eHkoMjAwLDMyMCwiRU5URVIgQ09SUkVDVCAgUEFTU1dPUkQgIik7CgkJICAgIGRlbGF5KDEwMCk7CgkJICAgIHNldGNvbG9yKFdISVRFKTsKCQkgICAgb3V0dGV4dHh5KDIwMCwzMjAsIkVOVEVSIENPUlJFQ1QgIFBBU1NXT1JEICIpOwoJCSAgICBkZWxheSgxMDApOwoJCSAgICBzZXR0ZXh0c3R5bGUoNywwLDEpOwoJCSAgICBvdXR0ZXh0eHkoMjAwLDM0MCwiUFJFU1MgQU5ZIEtFWSBUTyAgQ09OVElOVUUiKTsgfQoJCSAgICBjbGVhcmRldmljZSgpOwogCgkgICAgICAgfQoJICB9CgkgIGRvCgkgIHsKCSAgICAgICBjaD1tbWVudSgpOwoJICAgICAgIGNob2ljZShjaCk7CgkgIH13aGlsZShjaCE9NSk7Ly9FTkQgT0YgV0hJTEUKICAgICB9CiAKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLyBGVU5DVElPTiBGT1IgSE9URUwgTkFNRQovLyoqKioqKioqKioqKioqKioqKioqKioqKgogCiAgdm9pZCBob3RfbmFtZSgpCiAgICAgewoJICBzZXR0ZXh0c3R5bGUoNCwwLDUpOwoJICBzZXRjb2xvcihXSElURSk7CgkgIG91dHRleHR4eSgyMDAsMywiIFRJTUUgSE9URUwiKTsKCSAgbGluZSgyMDAsNTAsNDQwLDUwKTsKICAgICB9CiAKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLyAgRlVOQ1RJT04gRk9SIE1BSU4gTUVOVQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBpbnQgbW1lbnUoKQogICAgIHsKCSAgY2xlYXJkZXZpY2UoKTsKCSAgaW50IGM7CgkgIHNldGZpbGxzdHlsZSg3LDEpOwoJICBmbG9vZGZpbGwoMCwwLDQpOwoJICBzZXRmaWxsc3R5bGUoNywxMCk7CgkgIGJhcig1MCw4MCw2MDAsNDcwKTsKCSAgcmVjdGFuZ2xlKDUwLDgwLDYwMCw0NzApOwoJICBzZXRmaWxsc3R5bGUoMSw3KTsKCSAgYmFyKDU3LDg3LDU5Myw0NjMpOwoJICByZWN0YW5nbGUoNTcsODcsNTkzLDQ2Myk7CgkgIHNldGNvbG9yKDkpOwoJICBzZXRmaWxsc3R5bGUoMSwyKTsKCSAgYmFyKDIxMCwxNDAsNDEwLDIzOCk7CgkgIHJlY3RhbmdsZSgyMTAsMTQwLDQxMCwxNTgpOwoJICByZWN0YW5nbGUoMjEwLDE0MCw0MTAsMTc0KTsKCSAgcmVjdGFuZ2xlKDIxMCwxNDAsNDEwLDE5MCk7CgkgIHJlY3RhbmdsZSgyMTAsMTQwLDQxMCwyMDYpOwoJICByZWN0YW5nbGUoMjEwLDE0MCw0MTAsMjIyKTsKCSAgcmVjdGFuZ2xlKDIxMCwxNDAsNDEwLDIzOCk7CgkgIHNldGNvbG9yKFdISVRFKTsKCSAgc2V0dGV4dHN0eWxlKDQsMCw0KTsKCSAgb3V0dGV4dHh5KDE2MCwyMCwiSE9URUwgTUFOQUdFTUVOVCIpOwoJICBzZXRjb2xvcigxNCk7CgkgIGxpbmUoMTYzLDYwLDUxNSw2MCk7CgkgIHNldGNvbG9yKDQpOwoJICBzZXR0ZXh0c3R5bGUoMSwwLDEpOwoJICBvdXR0ZXh0eHkoMjI1LDEzNywiICBNQUlOIE1FTlUiKTsKCSAgb3V0dGV4dHh5KDIxMCwxNTQsIiAxLiBJTkZPUk1BVElPTiIpOwoJICBvdXR0ZXh0eHkoMjEwLDE3MCwiIDIuIENVU1RPTUVSIERFVEFJTCIpOwoJICBvdXR0ZXh0eHkoMjEwLDE4NiwiIDMuIEZPT0QgREVUQUlMICIpOwoJICBvdXR0ZXh0eHkoMjEwLDIwMiwiIDQuIENVU1RPTUVSIEJJTEwgIik7CgkgIG91dHRleHR4eSgyMTAsMjE4LCIgNS4gRVhJVCAiKTsKCSAgc2V0Y29sb3IoNCk7CgkgIHNldHRleHRzdHlsZSg3LDAsMik7CgkgIG91dHRleHR4eSgyMTAsMzAwLCJFTlRFUiBDSE9JQ0UgOi0gIik7CgkgIGZmbHVzaChzdGRpbik7CgkgIGdvdG94eSg1MywyMCk7CgkgIGNpbj4+YzsKCSAgcmV0dXJuIGM7CiAgICAgfQovLyoqKioqKioqKioqKioqKioqKioqKioqKgovLyAgRlVOQ1RJT04gT0YgRU5ESU5HCi8vKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICB2b2lkIGJ5ZSgpCiAgICAgewoJICBjbGVhcmRldmljZSgpOwoJICBzZXRjb2xvcigxMik7CgkgIHNldHRleHRzdHlsZSgxLDAsNSk7CgkgIHNldGJrY29sb3IoQkxVRSk7CgkgIG91dHRleHR4eSg3MCwxNTAsIlRIQU5LUyBGT1IgVklTSVRJTkciKTsKCSAgc2V0Y29sb3IoMTApOwoJICBzZXR0ZXh0c3R5bGUoMSwwLDgpOwoJICBvdXR0ZXh0eHkoMTAwLDI1MCwiUFJPSkVDVCIpOwoJICBzZXR0ZXh0c3R5bGUoMSwwLDMpOwoJICBvdXR0ZXh0eHkoMTUwLDQ1MCwiU0hVVFRJTkcgRE9XTi4uIC4gLiIpOwoJICBnZXRjaCgpOwoJICBzZXRjb2xvcigxMik7CgkgIHNldHRleHRzdHlsZSgxLDAsNSk7CgkgIG91dHRleHR4eSg3MCwxNTAsIlRIQU5LUyBGT1IgVklTSVRJTkciKTsKCSAgc2V0Y29sb3IoMTApOwoJICBzZXR0ZXh0c3R5bGUoMSwwLDgpOwoJICBvdXR0ZXh0eHkoMTAwLDI1MCwiUFJPSkVDVCIpOwoJICBzZXR0ZXh0c3R5bGUoMSwwLDMpOwoJICBvdXR0ZXh0eHkoMTUwLDQ1MCwiU0hVVFRJTkcgRE9XTi4uIC4gLiIpOwogCgkgIGZvcihpbnQgaT0wO2k8MTA7aSsrKQoJICB7CgkgICAgICAgc291bmQoMTAwMCppKTsKCSAgICAgICBzZXRia2NvbG9yKGkpOwoJICAgICAgIG5vc291bmQoKTsKCSAgfQogICAgIH0KIAovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vICBGVU5DVElPTiBPRiBDSE9JQ0UgRk9SIElORk9STUFUSU9OCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIHZvaWQgY2hvaWNlKGludCBhKQogICAgIHsKCSAgc3dpdGNoKGEpCgkgIHsKCSAgICAgICBjYXNlIDE6CgkgICAgICAgewoJCSAgICAgICBpbmZvcm1hdGlvbigpOwoJCSAgICAgICBicmVhazsKCSAgICAgICB9CgkgICAgICAgY2FzZSAyOgoJICAgICAgIHsKCQkgICAgICAgY3VzdC5jdXN0X2RldGFpbCgpOwoJCSAgICAgICBicmVhazsKCSAgICAgICB9CgkgICAgICAgY2FzZSAzOgoJICAgICAgIHsKCQkgICAgICAgZC5mb29kX21lbnUoKTsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgfQoJICAgICAgIGNhc2UgNDoKCSAgICAgICB7CgkJICAgICAgIGN1c3QuY3VzdF9iaWxsKCk7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIH0KIAoJICB9CiAgICAgfQogCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vICBGVU5DVElPTiBGT1IgSU5GT1JNQVRJT04KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICAgIHZvaWQgaW5mb3JtYXRpb24oKQogICAgIHsKCSAgY2xlYXJkZXZpY2UoKTsKCSAgc2V0ZmlsbHN0eWxlKDcsMSk7CgkgIGZsb29kZmlsbCgwLDAsNCk7CgkgIHNldGZpbGxzdHlsZSg3LDEwKTsKCSAgYmFyKDE3LDUwLDYwNSw0NzApOwoJICByZWN0YW5nbGUoMTcsNTAsNjA1LDQ3MCk7CgkgIHNldGZpbGxzdHlsZSgxLDcpOwoJICBiYXIoMjQsNTcsNTk4LDQ2Myk7CgkgIHJlY3RhbmdsZSgyNCw1Nyw1OTgsNDYzKTsKCSAgZ290b3h5KDYsNCk7CgkgIHNldGNvbG9yKDQpOwogICAgICBnZXRjaCgpOwogICAgIH0KfTsKIAovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gVEhJUyBJUyBNQUlOIEZVTkNUSU9OIENBTExJTkcgVkFSSU9VUwovLyAgIEZVTkNUSU9OUwovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogdm9pZCBtYWluKCkKIHsKICAgICBjbHJzY3IoKTsKICAgICBpbnQgZ209REVURUNULGdkOwogICAgIGluaXRncmFwaCgmZ20sJmdkLCJjOlxcdHVyYm9jM1xcYmdpIik7CiAgICAgc2V0Ymtjb2xvcihCTFVFKTsKICAgICBzZXRjb2xvcihSRUQpOwogICAgIGZvcihpbnQgaT0wO2k8NDUwO2krKykKICAgICB7Y2lyY2xlKDMwNSwyNTAsaSk7CiAgICAgIGRlbGF5KDMpOwogICAgIH0KICAgICBzZXRjb2xvcihHUkVFTik7CiAgICAgc2V0dGV4dHN0eWxlKDEsMCwxMSk7CiAgICAgb3V0dGV4dHh5KDgwLDE1MCwiVklORUVUQSIpOwogICAgIGdldGNoKCk7CiAgICAgY2xlYXJkZXZpY2UoKTsKICAgICBzZXRia2NvbG9yKEJMVUUpOwogICAgIHNldGNvbG9yKFJFRCk7CiAgICAgZm9yKGk9MDtpPDQ1MDtpKyspCiAgICAge2NpcmNsZSgzMDUsMjUwLGkpOwogICAgICBkZWxheSgzKTsKICAgICB9CiAgICAgc2V0Y29sb3IoR1JFRU4pOwogICAgIHNldHRleHRzdHlsZSgxLDAsOSk7CiAgICAgb3V0dGV4dHh5KDEwMCwwLCJQUkVTRU5UUyIpOwogICAgIG91dHRleHR4eSgyNzAsMTIwLCJBIik7CiAgICAgb3V0dGV4dHh5KDEwMCwyNDAsIlBST0pFQ1QiKTsKICAgICBvdXR0ZXh0eHkoMjUwLDM2MCwiT04iKTsKICAgICBnZXRjaCgpOwogICAgIGNsZWFyZGV2aWNlKCk7CiAgICAgc2V0Ymtjb2xvcig0KTsKICAgICBzZXRjb2xvcihHUkVFTik7CiAgICAgZm9yKGk9MDtpPDk7aSsrKQogICAgIHsKICAgICAgc2V0dGV4dHN0eWxlKDEsMCxpKTsKICAgICAgb3V0dGV4dHh5KDQwK2ksMTQwK2ksIiBUSU1FIEhPVEVMICIpOwogICAgICBzb3VuZCgyMDAqaSk7CiAgICAgIGRlbGF5KDYwMCk7CiAgICAgIG5vc291bmQoKTsKICAgICAgY2xlYXJkZXZpY2UoKTsKICAgICAgfQogICAgICBvdXR0ZXh0eHkoNDYsMTQ2LCIgIFRJTUUgSE9URUwiKTsKICAgICAgZ2V0Y2goKTsKICAgICBjb250cm9sIGM7CgkvLyB2b2lkIGFja25vdygpCiAgICAgLy97CgkgLy8gY2xlYXJkZXZpY2UoKTsKCSAgc2V0Ymtjb2xvcihCTEFDSyk7CgkgIHNldGZpbGxzdHlsZSg3LDEpOwoJICBmbG9vZGZpbGwoMCwwLDQpOwoJICBzZXRmaWxsc3R5bGUoNywxMCk7CgkgIGJhcigxNyw1MCw2MDUsNDcwKTsKCSAgcmVjdGFuZ2xlKDE3LDUwLDYwNSw0NzApOwoJICBzZXRmaWxsc3R5bGUoMSw3KTsKCSAgYmFyKDI0LDU3LDU5OCw0NjMpOwoJICByZWN0YW5nbGUoMjQsNTcsNTk4LDQ2Myk7CgkgIHNldGNvbG9yKDUpOwoJICBzZXR0ZXh0c3R5bGUoMSwwLDUpOwoJICBvdXR0ZXh0eHkoODUsNSwiQUNLTk9XTEVER0VNRU5UIik7CgkgIHNldHRleHRzdHlsZSgxLDAsMyk7CgkgIHNldGNvbG9yKEJMQUNLKTsKCSAgb3V0dGV4dHh5KDgwLDYwLCJJIHdpc2ggdG8gZXhwcmVzcyBteSBkZWVwIGFuZCBoZWFydGllc3QiKTsKCSAgb3V0dGV4dHh5KDQwLDkwLCJ0aGFua3MgdG8gbXkgc2lyIDpNci4gUkFNRVNIIFlBREFWIHdob3NlIik7CgkgIG91dHRleHR4eSg0MCwxMjAsInZhbHVlYWJsZSBhZHZpY2UsZ3VpZGVuY2UgYW5kIGhlbHBlZCBtZSBhICAiKTsKCSAgb3V0dGV4dHh5KDQwLDE1MCwibG90IGluIGRvaW5nIHRoaXMgcHJvamVjdCBmcm9tIGNvbmNlcHRpb24gdG8iKTsKCSAgb3V0dGV4dHh5KDQwLDE4MCwiY29tcGxldGlvbiAiKTsKCSAgb3V0dGV4dHh5KDEwMCwyMTAsIkkgYW0gYWxzbyB2ZXJ5IHRoYW5rZnVsIHRvIG15IHBhcmVudHMgIik7CgkgIG91dHRleHR4eSg0MCwyNDAsImFuZCBmcmllbmRzIHdobyBnYXZlIG1lIG1vcmFsIGVuY291cmFnZW1lbnQgIik7CgkgIG91dHRleHR4eSg0MCwyNzAsInRvIG1ha2UgdGhpcyBwcm9qZWN0IGEgc3VjY2Vzcy4iKTsKCSAgb3V0dGV4dHh5KDQwLDMwMCwiU1VCTUlUVEVEIEJZOi0gICAgICAgICAiKTsKCSAgb3V0dGV4dHh5KDQwLDMzMCwiVklORUVUQSAgICAgICAgICAgICAgICAiKTsKCSAgb3V0dGV4dHh5KDQwLDM2MCwiQi5URUNILklJSSBZZWFyICAgICAgICAiKTsKCSAgb3V0dGV4dHh5KDQwLDM5MCwiU2hyaSBLcmlzaGFuIEluc3RpdHV0ZSBvZiAgICAgICIpOwoJICBvdXR0ZXh0eHkoNDAsNDIwLCJFbmdnLiAmIFRlY2hub2xvZ3kgICAgICAiKTsKCSAgZ2V0Y2goKTsKCSAgY2xlYXJkZXZpY2UoKTsKIAoJIC8vIEZPUiBWRVJJRklDQVRJT04KCSAgICBzZXRmaWxsc3R5bGUoNywxKTsKCSAgZmxvb2RmaWxsKDAsMCw0KTsKCSAgc2V0ZmlsbHN0eWxlKDcsMTApOwoJICBiYXIoMTcsNTAsNjA1LDQ3MCk7CgkgIHJlY3RhbmdsZSgxNyw1MCw2MDUsNDcwKTsKCSAgc2V0ZmlsbHN0eWxlKDEsNyk7CgkgIGJhcigyNCw1Nyw1OTgsNDYzKTsKCSAgcmVjdGFuZ2xlKDI0LDU3LDU5OCw0NjMpOwoJICBzZXRjb2xvcig1KTsKCSAgc2V0dGV4dHN0eWxlKDEsMCw1KTsKCSAgb3V0dGV4dHh5KDEyMCw1LCJWRVJJRklDQVRJT04iKTsKCSAgc2V0dGV4dHN0eWxlKDEsMCwzKTsKCSAgIHNldGNvbG9yKEJMQUNLKTsKCSAgb3V0dGV4dHh5KDQwLDYwLCJJIFZJTkVFVEEgc3VibWl0dGluZyB0aGlzIHByb2plY3QiKTsKCSAgICBvdXR0ZXh0eHkoNDAsOTAsImFzIGFuIGV2aWRlbmNlIG9mIG15IHdvcmsgaW4gY29tcHV0ZXIiKTsKCSAgICBvdXR0ZXh0eHkoNDAsMTIwLCJsYWIuIGluIGd1aWRlbmNlIG9mIE1yLlJBTUVTSCBZQURBViAiKTsKCSAgICBvdXR0ZXh0eHkoNDAsMTkwLCJTVUJNSVRURUQgQlk6LSAgICAgICAgICAgICAgU1VCTUlUVEVEIFRPOi0iKTsKCSAgICBvdXR0ZXh0eHkoNDAsMjIwLCJWSU5FRVRBICAgICAgICAgICAgICAgICAgICAgTXIuUkFNRVNIIFlBREFWIik7CgkgICAgIG91dHRleHR4eSg0MCwyNTAsIkIuVEVDSC5JSUkgWWVhciAgICAgICAgICAgICAgbGVjdHVyZXIgaW4gY29tcHV0ZXIiKTsKCSAgICBvdXR0ZXh0eHkoNDAsMjgwLCAiU2hyaSBLcmlzaGFuIEluc3RpdHV0ZSBPZiAgICBIYXJ0cm9uIFdvcmtzdGF0aW9uICIpOwoJICAgICBvdXR0ZXh0eHkoNDAsMzEwLCJFbmdnLiAmIFRlY2hub2xvZ3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgIGdldGNoKCk7CgkgIGNsZWFyZGV2aWNlKCk7CiAKIAogICAgIGMucGFzcygpOwogICAgIGMuYnllKCk7CiAgICAgY2xvc2VncmFwaCgpOwogfQo=