Snake Game
#include<iostream.h>
#include<conio.h>
#include<graphics.h>
#include<dos.h>
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<string.h>
class Snake
{
int p1,p2,v1,v2,v3,e1,e2,prev,now,n,colr,dsp,cnt,dly,m;
int stp,egGen;
int xr,yr;
void caught();
public:
long scr;
int strtX,strtY,endX,endY;
int pos[100][2];
void show();
void init();
void egg();
void transpose();
void gnrtCond();
void gnrtUnCond();
void check();
void checkEgg();
void move();
void chngDir();
void sndEt();
void sndCgt();
int test();
void score();
Snake();
Snake(Snake*);
~Snake();
};
Snake::Snake()
{
}
Snake::~Snake()
{
}
void Snake::checkEgg()
{
if((e1 == p1) && (e2 == p2))
{sndEt();
egg();
dly--;
score();
n++;
}
}
void Snake::sndEt()
{nosound();
sound(2500);
delay(2);
nosound();
}
void Snake::sndCgt()
{nosound();
for(int x=1000;x>0;x--)
{sound(x);
delay(1);
}
nosound();
}
void Snake::score()
{ char *p;
ltoa(scr,p,10);
settextstyle(8,0,1);
setcolor(0);
outtextxy(585,40,p);
if(egGen != 1){
scr = scr + dly / 10;
}
ltoa(scr,p,10);
setcolor(10);
outtextxy(585,40,p);
}
void Snake::gnrtCond()
{if(n < 367)
{if(now == 8 && (prev != 8 && prev != 2))
{pos[0][0] = p1;
pos[0][1] = p2 - dsp;
prev = now;
}
if(now == 4 && (prev != 4 && prev != 1))
{pos[0][0] = p1 + dsp;
pos[0][1] = p2;
prev = now;
}
if(now == 2 && (prev != 8 && prev != 2))
{pos[0][0] = p1;
pos[0][1] = p2 + dsp;
prev = now;
}
if(now == 1 && (prev != 1 && prev != 4))
{pos[0][0] = p1 - dsp;
pos[0][1] = p2;
prev = now;
}
}
}
void Snake::gnrtUnCond()
{
if( prev == 8 )
{pos[0][0] = p1;
pos[0][1] = p2 - dsp;
}
if( prev == 4 )
{pos[0][0] = p1 + dsp;
pos[0][1] = p2;
}
if( prev == 2 )
{pos[0][0] = p1;
pos[0][1] = p2 + dsp;
}
if( prev == 1 )
{pos[0][0] = p1 - dsp;
pos[0][1] = p2;
}
p1 = pos[0][0];
p2 = pos[0][1];
}
void Snake::check()
{
if(p1 > endX)
{p1 = strtX;}
else if(p1 < strtX)
{p1 = endX;}
if(p2 > endY)
{p2 = strtY;}
else if(p2 < strtY)
{p2 = endY;}
pos[0][0] = p1;
pos[0][1] = p2;
for(int i = 1;i < n;i++)
{ if(p1 == pos[i][0] && p2 == pos[i][1])
{caught();
break;
}
}
}
void Snake::show()
{
int x = getcolor();
if(egGen != 1)
{
setcolor(getbkcolor());
setfillstyle(1,getbkcolor());
fillellipse(v1,v2,yr,yr);
}
else
egGen = 0;
if(egGen == 2)
egGen--;
setcolor(colr);
setfillstyle(1,9);
if(now == 8 || now == 2)
fillellipse(pos[0][0],pos[0][1],xr,yr);
else if(now == 4 || now == 1)
fillellipse(pos[0][0],pos[0][1],yr,xr);
setcolor(x);
}
void Snake::transpose()
{ int i,j,x,y;
p1 = pos[0][0];
p2 = pos[0][1];
if(!egGen){
v1 = pos[n-1][0];
v2 = pos[n-1][1];
}
else
egGen = 0;
for(i = n-1;i >= 1;i--)
{pos[i][0] = pos[i-1][0];
pos[i][1] = pos[i-1][1];
}
}
void Snake::move()
{ int st = 0;
do{
if(!kbhit())
{checkEgg();
if(!st)
show();
else
st = 0;
delay(dly/4);
transpose();
delay(dly/4);
gnrtUnCond();
delay(dly/4);
check();
delay(dly/4);
}
else if(stp){
chngDir();
gnrtCond();
check();
show();
st = 1;
}
}while(stp);
}
void Snake::init()
{time_t tm;
srand(time(&tm));
dsp = 20;
n = 5;
prev = 4;
for(int i = 4;i >= 0;i--)
{pos[i][0] = 201 + (n - i - 1) * dsp;
pos[i][1] = 301;
}
strtX = 21;
strtY = 21;
endX = 481;
endY = 361;
colr = 14;
now = prev;
dsp = 20;
stp = 111;
cnt = -1;
scr = 0;
dly = 150;
xr = 3;
yr = 9;
egg();
egGen = 1;
score();
int x = getcolor();
setlinestyle(0,1,3);
setcolor(15);
rectangle(strtX-15,strtY-15,endX+15,endY+15);
rectangle(endX+25,strtY-15,getmaxx()-15,endY+15);
rectangle(strtX-15,endY+25,getmaxx()-15,getmaxy()-5);
line(endX+25,strtY+75,getmaxx()-15,strtY+75);
line(endX+25,strtY+200,getmaxx()-15,strtY+200);
line(endX+25,strtY+275,getmaxx()-15,strtY+275);
setlinestyle(0,1,1);
settextstyle(8,0,1);
setcolor(11);
outtextxy(514,40,"SCORE");
setcolor(14);
settextstyle(11,0,5);
outtextxy(524,110," CONTROLS ");
outtextxy(522,135,"p = PAUSE");
outtextxy(522,155,"g = RESUME");
outtextxy(522,175,"e = EXIT");
outtextxy(513,195,"ARROWS");
outtextxy(512,205," -MOVEMENT");
setcolor(14);
settextstyle(4,0,9);
outtextxy(getmaxx()-500,getmaxy()-110,"SNAKE");
settextstyle(8,0,1);
setcolor(x);
}
void Snake::caught()
{
stp = 0;
sndCgt();
for(int i=0;i<=7;i++)
{if(i%2)
{setcolor(10);
outtextxy(512,250,"GAME OVER");
delay(900);
}
else
{setcolor(0);
outtextxy(512,250,"GAME OVER");
delay(500);
}
}
sleep(1);
}
void Snake::chngDir()
{int clr;
fillsettingstype *p;
char x = getch();
if(x == 72)
now = 8;
else if(x == 77)
now = 4;
else if(x == 80)
now = 2;
else if(x == 75)
now = 1;
else if(x == 'e')
caught();
else if(x == 'p')
{//int y = getcolor();
int twnkl = 1;
settextstyle(11,0,9);
while(1)
{if(kbhit())
{int c = getch();
if(c == 'g')
{clr = getcolor();
setcolor(0);
rectangle(endX+40,endY-10,getmaxx()-35,getmaxy()-160);
outtextxy(endX+60,endY-29,"PAUSE");
break;
}
}
else
{if(twnkl%2)
{clr = getcolor();
setcolor(10);
rectangle(endX+40,endY-10,getmaxx()-35,getmaxy()-160);
outtextxy(endX+60,endY-29,"PAUSE");
setcolor(clr);
delay(1000);
}
else
{
clr = getcolor();
setcolor(0);
rectangle(endX+40,endY-10,getmaxx()-35,getmaxy()-160);
outtextxy(endX+60,endY-29,"PAUSE");
delay(1000);
}
}
twnkl++;
}
settextstyle(8,0,1);
}
}
Snake::Snake(Snake *p)
{
*p=NULL;
}
void Snake::egg()
{ do
{e1 = (rand() % 100) * dsp + strtX;
e2 = (rand() % 100) * dsp + strtY;
}while(test());
int x = getcolor();
setcolor(7);
setfillstyle(1,random(15)+1);
fillellipse(e1,e2,xr+2,xr+2);
setcolor(x);
egGen = 2;
}
int Snake::test()
{ for(int i=0;i<n;i++)
{if(e1 == pos[i][0] && e2 == pos[i][1])
break;
if(v1 == e1 && v2 == e2)
break;
if((e1 >= endX+1) || (e2 >= endY+1))
break;
}
if(i != n)
return 1;
else
return 0;
}
void main()
{Snake snk;
int gd=DETECT,gm,i,j,k,x,y;
clrscr();
initgraph(&gd,&gm,"E:\Turboc3");
snk.init();
snk.move();
closegraph();
restorecrtmode();
}
U25ha2UgR2FtZQoKI2luY2x1ZGU8aW9zdHJlYW0uaD4KI2luY2x1ZGU8Y29uaW8uaD4KI2luY2x1ZGU8Z3JhcGhpY3MuaD4KI2luY2x1ZGU8ZG9zLmg+CiNpbmNsdWRlPHN0ZGxpYi5oPgojaW5jbHVkZTxzdGRpby5oPgojaW5jbHVkZTx0aW1lLmg+CiNpbmNsdWRlPHN0cmluZy5oPgpjbGFzcyBTbmFrZQp7CiBpbnQgcDEscDIsdjEsdjIsdjMsZTEsZTIscHJldixub3csbixjb2xyLGRzcCxjbnQsZGx5LG07CiBpbnQgc3RwLGVnR2VuOwogaW50IHhyLHlyOwogdm9pZCBjYXVnaHQoKTsKIHB1YmxpYzoKICBsb25nIHNjcjsKIGludCBzdHJ0WCxzdHJ0WSxlbmRYLGVuZFk7CiBpbnQgcG9zWzEwMF1bMl07CiB2b2lkIHNob3coKTsKIHZvaWQgaW5pdCgpOwogdm9pZCBlZ2coKTsKIHZvaWQgdHJhbnNwb3NlKCk7CiB2b2lkIGducnRDb25kKCk7CiB2b2lkIGducnRVbkNvbmQoKTsKIHZvaWQgY2hlY2soKTsKIHZvaWQgY2hlY2tFZ2coKTsKIHZvaWQgbW92ZSgpOwogdm9pZCBjaG5nRGlyKCk7CiB2b2lkIHNuZEV0KCk7CiB2b2lkIHNuZENndCgpOwogaW50IHRlc3QoKTsKIHZvaWQgc2NvcmUoKTsKIFNuYWtlKCk7CiBTbmFrZShTbmFrZSopOwogflNuYWtlKCk7CiB9OwpTbmFrZTo6U25ha2UoKQogewogfQpTbmFrZTo6flNuYWtlKCkKewoKfQp2b2lkIFNuYWtlOjpjaGVja0VnZygpCnsKIGlmKChlMSA9PSBwMSkgJiYgKGUyID09IHAyKSkKIHtzbmRFdCgpOwogIGVnZygpOwogIGRseS0tOwogIHNjb3JlKCk7CiAgbisrOwogIH0KfQp2b2lkIFNuYWtlOjpzbmRFdCgpCntub3NvdW5kKCk7CiBzb3VuZCgyNTAwKTsKIGRlbGF5KDIpOwogbm9zb3VuZCgpOwp9CnZvaWQgU25ha2U6OnNuZENndCgpCntub3NvdW5kKCk7CiBmb3IoaW50IHg9MTAwMDt4PjA7eC0tKQoge3NvdW5kKHgpOwogIGRlbGF5KDEpOwogIH0KIG5vc291bmQoKTsKfQp2b2lkIFNuYWtlOjpzY29yZSgpCnsgY2hhciAqcDsKCiAgbHRvYShzY3IscCwxMCk7CiAgc2V0dGV4dHN0eWxlKDgsMCwxKTsKICBzZXRjb2xvcigwKTsKICBvdXR0ZXh0eHkoNTg1LDQwLHApOwogIGlmKGVnR2VuICE9IDEpewogIHNjciA9IHNjciArIGRseSAvIDEwOwogIH0KICBsdG9hKHNjcixwLDEwKTsKICBzZXRjb2xvcigxMCk7CiAgb3V0dGV4dHh5KDU4NSw0MCxwKTsKCn0Kdm9pZCBTbmFrZTo6Z25ydENvbmQoKQp7aWYobiA8IDM2NykKIHtpZihub3cgPT0gOCAmJiAocHJldiAhPSA4ICYmIHByZXYgIT0gMikpCiAge3Bvc1swXVswXSA9IHAxOwogICBwb3NbMF1bMV0gPSBwMiAtIGRzcDsKICAgcHJldiA9IG5vdzsKICAgfQogIGlmKG5vdyA9PSA0ICYmIChwcmV2ICE9IDQgJiYgcHJldiAhPSAxKSkKICB7cG9zWzBdWzBdID0gcDEgKyBkc3A7CiAgIHBvc1swXVsxXSA9IHAyOwogICBwcmV2ID0gbm93OwogICB9CiAgaWYobm93ID09IDIgJiYgKHByZXYgIT0gOCAmJiBwcmV2ICE9IDIpKQogIHtwb3NbMF1bMF0gPSBwMTsKICAgcG9zWzBdWzFdID0gcDIgKyBkc3A7CiAgIHByZXYgPSBub3c7CiAgIH0KICBpZihub3cgPT0gMSAmJiAocHJldiAhPSAxICYmIHByZXYgIT0gNCkpCiAge3Bvc1swXVswXSA9IHAxIC0gZHNwOwogICBwb3NbMF1bMV0gPSBwMjsKICAgcHJldiA9IG5vdzsKICAgfQp9Cn0Kdm9pZCBTbmFrZTo6Z25ydFVuQ29uZCgpCnsKICBpZiggcHJldiA9PSA4ICkKICB7cG9zWzBdWzBdID0gcDE7CiAgIHBvc1swXVsxXSA9IHAyIC0gZHNwOwogICB9CiBpZiggcHJldiA9PSA0ICkKICB7cG9zWzBdWzBdID0gcDEgKyBkc3A7CiAgIHBvc1swXVsxXSA9IHAyOwogICB9CiBpZiggcHJldiA9PSAyICkKICB7cG9zWzBdWzBdID0gcDE7CiAgIHBvc1swXVsxXSA9IHAyICsgZHNwOwogICB9CiBpZiggcHJldiA9PSAxICkKICB7cG9zWzBdWzBdID0gcDEgLSBkc3A7CiAgIHBvc1swXVsxXSA9IHAyOwogICB9CiBwMSA9IHBvc1swXVswXTsKIHAyID0gcG9zWzBdWzFdOwp9CnZvaWQgU25ha2U6OmNoZWNrKCkKewogaWYocDEgPiBlbmRYKQogIHtwMSA9IHN0cnRYO30KIGVsc2UgaWYocDEgPCBzdHJ0WCkKICB7cDEgPSBlbmRYO30KCiBpZihwMiA+IGVuZFkpCiAge3AyID0gc3RydFk7fQogZWxzZSBpZihwMiA8IHN0cnRZKQogIHtwMiA9IGVuZFk7fQoKIHBvc1swXVswXSA9IHAxOwogcG9zWzBdWzFdID0gcDI7CmZvcihpbnQgaSA9IDE7aSA8IG47aSsrKQogIHsgaWYocDEgPT0gcG9zW2ldWzBdICYmIHAyID09IHBvc1tpXVsxXSkKICB7Y2F1Z2h0KCk7CiAgIGJyZWFrOwogIH0KIH0KfQp2b2lkIFNuYWtlOjpzaG93KCkKewogIGludCB4ID0gZ2V0Y29sb3IoKTsKICBpZihlZ0dlbiAhPSAxKQogIHsKICBzZXRjb2xvcihnZXRia2NvbG9yKCkpOwogIHNldGZpbGxzdHlsZSgxLGdldGJrY29sb3IoKSk7CiAgZmlsbGVsbGlwc2UodjEsdjIseXIseXIpOwogICB9CiAgZWxzZQogICBlZ0dlbiA9IDA7CiAgaWYoZWdHZW4gPT0gMikKICAgZWdHZW4tLTsKICBzZXRjb2xvcihjb2xyKTsKICBzZXRmaWxsc3R5bGUoMSw5KTsKICBpZihub3cgPT0gOCB8fCBub3cgPT0gMikKICAgZmlsbGVsbGlwc2UocG9zWzBdWzBdLHBvc1swXVsxXSx4cix5cik7CiAgZWxzZSBpZihub3cgPT0gNCB8fCBub3cgPT0gMSkKICAgZmlsbGVsbGlwc2UocG9zWzBdWzBdLHBvc1swXVsxXSx5cix4cik7CiAgc2V0Y29sb3IoeCk7Cn0Kdm9pZCBTbmFrZTo6dHJhbnNwb3NlKCkKeyBpbnQgaSxqLHgseTsKICAgcDEgPSBwb3NbMF1bMF07CiAgIHAyID0gcG9zWzBdWzFdOwogICBpZighZWdHZW4pewogICB2MSA9IHBvc1tuLTFdWzBdOwogICB2MiA9IHBvc1tuLTFdWzFdOwogICB9CiAgIGVsc2UKICAgIGVnR2VuID0gMDsKICAgZm9yKGkgPSBuLTE7aSA+PSAxO2ktLSkKICAge3Bvc1tpXVswXSA9IHBvc1tpLTFdWzBdOwogICAgcG9zW2ldWzFdID0gcG9zW2ktMV1bMV07CiAgIH0KfQp2b2lkIFNuYWtlOjptb3ZlKCkKeyBpbnQgc3QgPSAwOwogIGRvewogICBpZigha2JoaXQoKSkKICAge2NoZWNrRWdnKCk7CiAgICBpZighc3QpCiAgICAgc2hvdygpOwogICAgZWxzZQogICAgIHN0ID0gMDsKICAgIGRlbGF5KGRseS80KTsKICAgIHRyYW5zcG9zZSgpOwogICAgZGVsYXkoZGx5LzQpOwogICAgZ25ydFVuQ29uZCgpOwogICAgZGVsYXkoZGx5LzQpOwogICAgY2hlY2soKTsKICAgZGVsYXkoZGx5LzQpOwogICAgfQogICBlbHNlIGlmKHN0cCl7CiAgIGNobmdEaXIoKTsKICAgZ25ydENvbmQoKTsKICAgY2hlY2soKTsKICAgc2hvdygpOwogICBzdCA9IDE7CiAgIH0KICAgfXdoaWxlKHN0cCk7Cn0Kdm9pZCBTbmFrZTo6aW5pdCgpCnt0aW1lX3QgdG07CiBzcmFuZCh0aW1lKCZ0bSkpOwogZHNwID0gMjA7CiBuID0gNTsKIHByZXYgPSA0OwogZm9yKGludCBpID0gNDtpID49IDA7aS0tKQoge3Bvc1tpXVswXSA9IDIwMSArIChuIC0gaSAtIDEpICogZHNwOwogIHBvc1tpXVsxXSA9IDMwMTsKICB9CiAgc3RydFggPSAyMTsKICBzdHJ0WSA9IDIxOwogIGVuZFggPSA0ODE7CiAgZW5kWSA9IDM2MTsKICBjb2xyID0gMTQ7CiAgbm93ID0gcHJldjsKICBkc3AgPSAyMDsKICBzdHAgPSAxMTE7CiAgY250ID0gLTE7CiAgc2NyID0gMDsKICBkbHkgPSAxNTA7CiAgIHhyID0gMzsKICAgeXIgPSA5OwogIGVnZygpOwogIGVnR2VuID0gMTsKICBzY29yZSgpOwogIGludCB4ID0gZ2V0Y29sb3IoKTsKICBzZXRsaW5lc3R5bGUoMCwxLDMpOwogIHNldGNvbG9yKDE1KTsKICByZWN0YW5nbGUoc3RydFgtMTUsc3RydFktMTUsZW5kWCsxNSxlbmRZKzE1KTsKICByZWN0YW5nbGUoZW5kWCsyNSxzdHJ0WS0xNSxnZXRtYXh4KCktMTUsZW5kWSsxNSk7CiAgcmVjdGFuZ2xlKHN0cnRYLTE1LGVuZFkrMjUsZ2V0bWF4eCgpLTE1LGdldG1heHkoKS01KTsKICBsaW5lKGVuZFgrMjUsc3RydFkrNzUsZ2V0bWF4eCgpLTE1LHN0cnRZKzc1KTsKICBsaW5lKGVuZFgrMjUsc3RydFkrMjAwLGdldG1heHgoKS0xNSxzdHJ0WSsyMDApOwogIGxpbmUoZW5kWCsyNSxzdHJ0WSsyNzUsZ2V0bWF4eCgpLTE1LHN0cnRZKzI3NSk7CiAgc2V0bGluZXN0eWxlKDAsMSwxKTsKICBzZXR0ZXh0c3R5bGUoOCwwLDEpOwogIHNldGNvbG9yKDExKTsKICBvdXR0ZXh0eHkoNTE0LDQwLCJTQ09SRSIpOwogIHNldGNvbG9yKDE0KTsKICBzZXR0ZXh0c3R5bGUoMTEsMCw1KTsKICBvdXR0ZXh0eHkoNTI0LDExMCwiIENPTlRST0xTICIpOwogIG91dHRleHR4eSg1MjIsMTM1LCJwID0gUEFVU0UiKTsKICBvdXR0ZXh0eHkoNTIyLDE1NSwiZyA9IFJFU1VNRSIpOwogIG91dHRleHR4eSg1MjIsMTc1LCJlID0gRVhJVCIpOwogIG91dHRleHR4eSg1MTMsMTk1LCJBUlJPV1MiKTsKICBvdXR0ZXh0eHkoNTEyLDIwNSwiICAgIC1NT1ZFTUVOVCIpOwogIHNldGNvbG9yKDE0KTsKICBzZXR0ZXh0c3R5bGUoNCwwLDkpOwogIG91dHRleHR4eShnZXRtYXh4KCktNTAwLGdldG1heHkoKS0xMTAsIlNOQUtFIik7CiAgc2V0dGV4dHN0eWxlKDgsMCwxKTsKICBzZXRjb2xvcih4KTsKfQp2b2lkIFNuYWtlOjpjYXVnaHQoKQp7CiBzdHAgPSAwOwogc25kQ2d0KCk7CmZvcihpbnQgaT0wO2k8PTc7aSsrKQoge2lmKGklMikKICB7c2V0Y29sb3IoMTApOwogICBvdXR0ZXh0eHkoNTEyLDI1MCwiR0FNRSBPVkVSIik7CiAgIGRlbGF5KDkwMCk7CiAgIH0KICBlbHNlCiAge3NldGNvbG9yKDApOwogICBvdXR0ZXh0eHkoNTEyLDI1MCwiR0FNRSBPVkVSIik7CiAgIGRlbGF5KDUwMCk7CiAgfQogIH0Kc2xlZXAoMSk7Cn0Kdm9pZCBTbmFrZTo6Y2huZ0RpcigpCntpbnQgY2xyOwogZmlsbHNldHRpbmdzdHlwZSAqcDsKIGNoYXIgeCA9IGdldGNoKCk7CiBpZih4ID09IDcyKQogIG5vdyA9IDg7CiBlbHNlIGlmKHggPT0gNzcpCiAgbm93ID0gNDsKIGVsc2UgaWYoeCA9PSA4MCkKICBub3cgPSAyOwogZWxzZSBpZih4ID09IDc1KQogIG5vdyA9IDE7CiBlbHNlIGlmKHggPT0gJ2UnKQogIGNhdWdodCgpOwogZWxzZSBpZih4ID09ICdwJykKIHsvL2ludCB5ID0gZ2V0Y29sb3IoKTsKICBpbnQgdHdua2wgPSAxOwogIHNldHRleHRzdHlsZSgxMSwwLDkpOwogIHdoaWxlKDEpCiAge2lmKGtiaGl0KCkpCiAgIHtpbnQgYyA9IGdldGNoKCk7CiAgICBpZihjID09ICdnJykKICAgIHtjbHIgPSBnZXRjb2xvcigpOwogICAgIHNldGNvbG9yKDApOwogICAgIHJlY3RhbmdsZShlbmRYKzQwLGVuZFktMTAsZ2V0bWF4eCgpLTM1LGdldG1heHkoKS0xNjApOwogICAgIG91dHRleHR4eShlbmRYKzYwLGVuZFktMjksIlBBVVNFIik7CiAgICAgYnJlYWs7CiAgICAgfQogICAgfQogICBlbHNlCiAgIHtpZih0d25rbCUyKQogICAge2NsciA9IGdldGNvbG9yKCk7CiAgICAgc2V0Y29sb3IoMTApOwogICAgIHJlY3RhbmdsZShlbmRYKzQwLGVuZFktMTAsZ2V0bWF4eCgpLTM1LGdldG1heHkoKS0xNjApOwogICAgIG91dHRleHR4eShlbmRYKzYwLGVuZFktMjksIlBBVVNFIik7CiAgICAgc2V0Y29sb3IoY2xyKTsKICAgICAgZGVsYXkoMTAwMCk7CiAgICAgfQogICAgZWxzZQogICAgewogICAgIGNsciA9IGdldGNvbG9yKCk7CiAgICAgc2V0Y29sb3IoMCk7CiAgICAgcmVjdGFuZ2xlKGVuZFgrNDAsZW5kWS0xMCxnZXRtYXh4KCktMzUsZ2V0bWF4eSgpLTE2MCk7CiAgICAgb3V0dGV4dHh5KGVuZFgrNjAsZW5kWS0yOSwiUEFVU0UiKTsKICAgICBkZWxheSgxMDAwKTsKICAgIH0KICAgfQogICB0d25rbCsrOwogIH0KICAgIHNldHRleHRzdHlsZSg4LDAsMSk7CiB9Cn0KU25ha2U6OlNuYWtlKFNuYWtlICpwKQp7CiAqcD1OVUxMOwp9CnZvaWQgU25ha2U6OmVnZygpCnsgZG8KICB7ZTEgPSAocmFuZCgpICUgMTAwKSAqIGRzcCArIHN0cnRYOwogICBlMiA9IChyYW5kKCkgJSAxMDApICogZHNwICsgc3RydFk7CiAgIH13aGlsZSh0ZXN0KCkpOwogIGludCB4ID0gZ2V0Y29sb3IoKTsKICBzZXRjb2xvcig3KTsKICBzZXRmaWxsc3R5bGUoMSxyYW5kb20oMTUpKzEpOwogIGZpbGxlbGxpcHNlKGUxLGUyLHhyKzIseHIrMik7CiAgc2V0Y29sb3IoeCk7CiAgZWdHZW4gPSAyOwp9CmludCBTbmFrZTo6dGVzdCgpCnsgZm9yKGludCBpPTA7aTxuO2krKykKICB7aWYoZTEgPT0gcG9zW2ldWzBdICYmIGUyID09IHBvc1tpXVsxXSkKICAgIGJyZWFrOwogICBpZih2MSA9PSBlMSAmJiB2MiA9PSBlMikKICAgIGJyZWFrOwogICBpZigoZTEgPj0gZW5kWCsxKSB8fCAoZTIgPj0gZW5kWSsxKSkKICAgIGJyZWFrOwogICB9CiBpZihpICE9IG4pCiAgcmV0dXJuIDE7CiBlbHNlCiAgcmV0dXJuIDA7Cn0KCnZvaWQgbWFpbigpCntTbmFrZSBzbms7CiBpbnQgZ2Q9REVURUNULGdtLGksaixrLHgseTsKIGNscnNjcigpOwogaW5pdGdyYXBoKCZnZCwmZ20sIkU6XFR1cmJvYzMiKTsKIHNuay5pbml0KCk7CiBzbmsubW92ZSgpOwoKIGNsb3NlZ3JhcGgoKTsKIHJlc3RvcmVjcnRtb2RlKCk7CiB9Cg==