#include <iostream>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctime>
#include <cstdlib>
#include <linux/input.h>
#include <linux/uinput.h>
#include <fcntl.h>
#include <sstream>
#include <fstream>
#include <unistd.h>
#include <string>
#include <vector>
#include <string.h>
using namespace std;
bool checkBig(char ourL)
{
if((ourL=='A')) { return(1);}
if((ourL=='B')) { return(1);}
if((ourL=='C')) { return(1);}
if((ourL=='D')) { return(1);}
if((ourL=='E')) { return(1);}
if((ourL=='F')) { return(1);}
if((ourL=='G')) { return(1);}
if((ourL=='H')) { return(1);}
if((ourL=='I')) { return(1);}
if((ourL=='J')) { return(1);}
if((ourL=='K')) { return(1);}
if((ourL=='L')) { return(1);}
if((ourL=='M')) { return(1);}
if((ourL=='N')) { return(1);}
if((ourL=='O')) { return(1);}
if((ourL=='P')) { return(1);}
if((ourL=='Q')) { return(1);}
if((ourL=='R')) { return(1);}
if((ourL=='S')) { return(1);}
if((ourL=='T')) { return(1);}
if((ourL=='U')) { return(1);}
if((ourL=='V')) { return(1);}
if((ourL=='W')) { return(1);}
if((ourL=='X')) { return(1);}
if((ourL=='Y')) { return(1);}
if((ourL=='Z')) { return(1);}
if((ourL==')')) { return(1);}
if((ourL=='!')) { return(1);}
if((ourL=='@')) { return(1);}
if((ourL=='#')) { return(1);}
if((ourL=='$')) { return(1);}
if((ourL=='%')) { return(1);}
if((ourL=='^')) { return(1);}
if((ourL=='&')) { return(1);}
if((ourL=='*')) { return(1);}
if((ourL=='(')) { return(1);}
if((ourL=='>')) { return(1);}
if((ourL=='<')) { return(1);}
if((ourL=='?')) { return(1);}
if((ourL=='|')) { return(1);}
if((ourL=='{')) { return(1);}
if((ourL=='}')) { return(1);}
if((ourL==';')) { return(1);}
return(0);
}
int checkChar (char ourL)
{
if((ourL=='a')||(ourL=='A')) { return(KEY_A);}
if((ourL=='b')||(ourL=='B')) { return(KEY_B);}
if((ourL=='c')||(ourL=='C')) { return(KEY_C);}
if((ourL=='d')||(ourL=='D')) { return(KEY_D);}
if((ourL=='e')||(ourL=='E')) { return(KEY_E);}
if((ourL=='f')||(ourL=='F')) { return(KEY_F);}
if((ourL=='g')||(ourL=='G')) { return(KEY_G);}
if((ourL=='h')||(ourL=='H')) { return(KEY_H);}
if((ourL=='i')||(ourL=='I')) { return(KEY_I);}
if((ourL=='j')||(ourL=='J')) { return(KEY_J);}
if((ourL=='k')||(ourL=='K')) { return(KEY_K);}
if((ourL=='l')||(ourL=='L')) { return(KEY_L);}
if((ourL=='m')||(ourL=='M')) { return(KEY_M);}
if((ourL=='n')||(ourL=='N')) { return(KEY_N);}
if((ourL=='o')||(ourL=='O')) { return(KEY_O);}
if((ourL=='p')||(ourL=='P')) { return(KEY_P);}
if((ourL=='q')||(ourL=='Q')) { return(KEY_Q);}
if((ourL=='r')||(ourL=='R')) { return(KEY_R);}
if((ourL=='s')||(ourL=='S')) { return(KEY_S);}
if((ourL=='t')||(ourL=='T')) { return(KEY_T);}
if((ourL=='u')||(ourL=='U')) { return(KEY_U);}
if((ourL=='v')||(ourL=='V')) { return(KEY_V);}
if((ourL=='w')||(ourL=='W')) { return(KEY_W);}
if((ourL=='x')||(ourL=='X')) { return(KEY_X);}
if((ourL=='y')||(ourL=='Y')) { return(KEY_Y);}
if((ourL=='z')||(ourL=='Z')) { return(KEY_Z);}
if((ourL=='0')||(ourL==')')) { return(KEY_0);}
if((ourL=='1')||(ourL=='!')) { return(KEY_1);}
if((ourL=='2')||(ourL=='@')) { return(KEY_2);}
if((ourL=='3')||(ourL=='#')) { return(KEY_3);}
if((ourL=='4')||(ourL=='$')) { return(KEY_4);}
if((ourL=='5')||(ourL=='%')) { return(KEY_5);}
if((ourL=='6')||(ourL=='^')) { return(KEY_6);}
if((ourL=='7')||(ourL=='&')) { return(KEY_7);}
if((ourL=='8')||(ourL=='*')) { return(KEY_8);}
if((ourL=='9')||(ourL=='(')) { return(KEY_9);}
if(ourL==' ') { return(KEY_SPACE);}
if((ourL=='.')||(ourL=='>')) { return(KEY_DOT);}
if((ourL==',')||(ourL=='<')) { return(KEY_COMMA);}
if((ourL=='/')||(ourL=='?')) { return(KEY_SLASH);}
if((ourL=='\\')||(ourL=='|')) { return(KEY_BACKSLASH);}
if((ourL=='[')||(ourL=='{')) { return(KEY_LEFTBRACE);}
if((ourL==']')||(ourL=='}')) { return(KEY_RIGHTBRACE);}
if((ourL==';')||(ourL==':')) { return(KEY_SEMICOLON);}
return(KEY_SPACE);
}
void KeyPress(uinput_user_dev &uiDev,int &fDev,input_event &inEv,int ktype, int kcode, int kvalue)
{
memset(&inEv,0,sizeof(inEv));
inEv.type = ktype;
inEv.code = kcode;
inEv.value = kvalue;
if (write(fDev,&inEv,sizeof(inEv))<0)
{
cerr<<"write error"<<endl;
exit(1);
}
}
void erMes(string errorMes)
{
cerr<<errorMes<<endl;
exit(1);
}
//void useKey (& )
int main()
{
////////////////////////////////// start ///////////////////////////////////
int fDev; //deklaruje podstawowe zmienne
struct uinput_user_dev uiDev;
struct input_event inEv;
fDev = open("/dev/uinput", O_WRONLY | O_NONBLOCK); //funkcja otwiera mi plik i sprawdza jego poprawnosc
if (fDev<0) { erMes("error cant open");}
//deklaracja eventu
if(ioctl(fDev, UI_SET_EVBIT, EV_KEY) < 0) { erMes("error in ioctl start");} //deklaruje event key
//kazdy event musi byc "zsynchronizowany/ potwierdzony"
if(ioctl(fDev, UI_SET_EVBIT, EV_SYN) < 0) { erMes("error in ioctl");}
//deklaruje wszystkie literki i liczby szuka sie w pliku usr/include/linux/input
int keytab[] = {KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T,
KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_ENTER, KEY_DOT,
KEY_SPACE, KEY_SLASH, KEY_COMMA, KEY_LEFTSHIFT, KEY_BACKSLASH, KEY_LEFTBRACE, KEY_RIGHTBRACE, KEY_SEMICOLON};
for(int i=0;i<sizeof(keytab)/sizeof(int);i++)
{
if(ioctl(fDev, UI_SET_KEYBIT, keytab[i])<0) { erMes("error in ioctl");}
}
//dla myszki na przyszlosc
if(ioctl(fDev, UI_SET_EVBIT, EV_REL) < 0) { erMes("error in ioctl");}
if(ioctl(fDev, UI_SET_RELBIT, REL_X) < 0) { erMes("error im ioctl");}
if(ioctl(fDev, UI_SET_RELBIT, REL_Y) < 0) { erMes("error in ioctl");}
memset(&uiDev, 0, sizeof(uiDev)); //oczyszczam pamiec i przydzielam pewne "charakterystyki", trzeba to zrobic
snprintf(uiDev.name, UINPUT_MAX_NAME_SIZE, "sample");
uiDev.id.bustype = BUS_USB;
uiDev.id.vendor=0x1;
uiDev.id.product=0x1;
uiDev.id.version=1;
//kolejne sprawdziany
if (write(fDev, &uiDev, sizeof(uiDev))<0) { erMes("error in write");}
if ((ioctl(fDev, UI_DEV_CREATE))<0) { erMes("error in ioctl");}
cout<<"zaladowano komendy"<<endl;
//////////////////////////////////////////////////////////////////
//otworz folder z crap tekstem i go zaladuj//
//////////////////////////////////////////////////////////////////
ifstream thisText;
thisText.open("/home/piotr/Dokumenty/C/Moje programy/Doom/Spam1.txt");
if(!thisText.is_open()) { erMes("error in open thisText");} //lepiej sprawdzac z is_open
vector<string> spamStr; //vector z naszym tekstem
{
string tempStr;
while(getline(thisText, tempStr))
{
spamStr.push_back(tempStr);
}
}
thisText.close();
// stare kolory a potem nowe
string strCol[] = {"\\cq", "\\ce", "\\cr", "\\ct", "\\cu", "\\ci", "\\co", "\\cp", "\\ca", "\\cs", "\\cd", "\\cf",
"\\cg", "\\ch", "\\cj", "\\ck", "\\cl", "\\cc", "\\cv", "\\cb", "\\cn", "\\cm",
"\\c[c0]", "\\c[c1]", "\\c[c2]", "\\c[c3]", "\\c[c4]", "\\c[c5]", "\\c[c6]", "\\c[c7]", "\\c[c8]", "\\c[c9]",
"\\c[m0]", "\\c[m1]", "\\c[m2]", "\\c[m3]", "\\c[m4]", "\\c[m5]", "\\c[m6]", "\\c[m7]", "\\c[m8]", "\\c[m9]",
"\\c[g0]", "\\c[g1]", "\\c[g2]", "\\c[g3]", "\\c[g4]", "\\c[g5]", "\\c[g6]", "\\c[g7]", "\\c[g8]", "\\c[g9]",
"\\c[u0]", "\\c[u1]", "\\c[u2]", "\\c[u3]", "\\c[u4]", "\\c[u5]", "\\c[u6]", "\\c[u7]", "\\c[u8]", "\\c[u9]",
"\\c[v0]", "\\c[v1]", "\\c[v2]", "\\c[v3]", "\\c[v4]", "\\c[v5]", "\\c[v6]", "\\c[v7]", "\\c[v8]", "\\c[v9]",
"\\c[q0]", "\\c[q1]", "\\c[q2]", "\\c[q3]", "\\c[q4]", "\\c[q5]", "\\c[q6]", "\\c[q7]", "\\c[q8]", "\\c[q9]",
"\\c[s0]", "\\c[s1]", "\\c[s2]", "\\c[s3]", "\\c[s4]", "\\c[s5]", "\\c[s6]", "\\c[s7]", "\\c[s8]", "\\c[s9]",
"\\c[y0]", "\\c[y1]", "\\c[y2]", "\\c[y3]", "\\c[y4]", "\\c[y5]", "\\c[y6]", "\\c[y7]", "\\c[y8]", "\\c[y9]",
"\\c[e0]", "\\c[e1]", "\\c[e2]", "\\c[e3]", "\\c[e4]", "\\c[e5]", "\\c[e6]", "\\c[e7]", "\\c[e8]", "\\c[e9]",
"\\c[j0]", "\\c[j1]", "\\c[j2]", "\\c[j3]", "\\c[j4]", "\\c[j5]", "\\c[j6]", "\\c[j7]", "\\c[j8]", "\\c[j9]",
"\\c[i0]", "\\c[i1]", "\\c[i2]", "\\c[i3]", "\\c[i4]", "\\c[i5]", "\\c[i6]", "\\c[i7]", "\\c[i8]", "\\c[i9]",
"\\c[d0]", "\\c[d1]", "\\c[d2]", "\\c[d3]", "\\c[d4]", "\\c[d5]", "\\c[d6]", "\\c[d7]", "\\c[d8]", "\\c[d9]",
"\\c[l0]", "\\c[l1]", "\\c[l2]", "\\c[l3]", "\\c[l4]", "\\c[l5]", "\\c[l6]", "\\c[l7]", "\\c[l8]", "\\c[l9]",
"\\c[k0]", "\\c[k1]", "\\c[k2]", "\\c[k3]", "\\c[k4]", "\\c[k5]", "\\c[k6]", "\\c[k7]", "\\c[k8]", "\\c[k9]",
"\\c[n0]", "\\c[n1]", "\\c[n2]", "\\c[n3]", "\\c[n4]", "\\c[n5]", "\\c[n6]", "\\c[n7]", "\\c[n8]", "\\c[n9]",
"\\c[b0]", "\\c[b1]", "\\c[b2]", "\\c[b3]", "\\c[b4]", "\\c[b5]", "\\c[b6]", "\\c[b7]", "\\c[b8]", "\\c[b9]",
"\\c[t0]", "\\c[t1]", "\\c[t2]", "\\c[t3]", "\\c[t4]", "\\c[t5]", "\\c[t6]", "\\c[t7]", "\\c[t8]", "\\c[t9]",
};
cout<<"wczytano spam tekst i kolory, spamowanie za 1 min"<<endl;
sleep(30);
//////////////////////////////////////////////////////////////////////
// rozpocznij spam //
//////////////////////////////////////////////////////////////////////
cout<<"program rozpoczal dzialanie"<<endl;
srand(time(NULL));
int pos,i_key;
int stop = 1;
char somL;
bool big = 0;
while(1)
{
usleep(500000+rand()%2000000);
if(spamStr.size()>0) { pos=rand()%spamStr.size();}
else { break;}
string line = spamStr[pos];
//line.insert(0,strCol[rand()%(sizeof(strCol)/sizeof(string))]);
for(int i =0; i<line.size(); i++)
{
somL=line.at(i);
//get proper key
i_key=checkChar(somL);
//check if big
big = checkBig(somL);
usleep(50000);
if (big) { KeyPress(uiDev,fDev,inEv,EV_KEY,KEY_LEFTSHIFT,1);}
i_key=checkChar(line.at(i)); //sprawdzam jaki klawisz
KeyPress(uiDev,fDev,inEv,EV_KEY,i_key,1);
KeyPress(uiDev,fDev,inEv,EV_KEY,i_key,0);
if (big) { KeyPress(uiDev,fDev,inEv,EV_KEY,KEY_LEFTSHIFT,0); big=0;}
//sync
KeyPress(uiDev,fDev,inEv,EV_SYN,0,0);
}
usleep(500000);
KeyPress(uiDev,fDev,inEv,EV_KEY,KEY_ENTER,1);
KeyPress(uiDev,fDev,inEv,EV_KEY,KEY_ENTER,0);
KeyPress(uiDev,fDev,inEv,EV_SYN,0,0);//powinno sie synchronizowac po dziesieciu najdalej
}
sleep(2);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiNpbmNsdWRlIDxsaW51eC91aW5wdXQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCmJvb2wgY2hlY2tCaWcoY2hhciBvdXJMKQp7CiAgaWYoKG91ckw9PSdBJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdCJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdDJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdEJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdFJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdGJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdHJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdIJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdJJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdKJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdLJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdMJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdNJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdOJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdPJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdQJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdRJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdSJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdTJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdUJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdVJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdWJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdXJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdYJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdZJykpCQl7IHJldHVybigxKTt9CiAgaWYoKG91ckw9PSdaJykpCQl7IHJldHVybigxKTt9CgogIGlmKChvdXJMPT0nKScpKQkJeyByZXR1cm4oMSk7fQogIGlmKChvdXJMPT0nIScpKQkJeyByZXR1cm4oMSk7fQogIGlmKChvdXJMPT0nQCcpKQkJeyByZXR1cm4oMSk7fQogIGlmKChvdXJMPT0nIycpKQkJeyByZXR1cm4oMSk7fQogIGlmKChvdXJMPT0nJCcpKQkJeyByZXR1cm4oMSk7fQogIGlmKChvdXJMPT0nJScpKQkJeyByZXR1cm4oMSk7fQogIGlmKChvdXJMPT0nXicpKQkJeyByZXR1cm4oMSk7fQogIGlmKChvdXJMPT0nJicpKQkJeyByZXR1cm4oMSk7fQogIGlmKChvdXJMPT0nKicpKQkJeyByZXR1cm4oMSk7fQogIGlmKChvdXJMPT0nKCcpKQkJeyByZXR1cm4oMSk7fQogIAogIGlmKChvdXJMPT0nPicpKQkJeyByZXR1cm4oMSk7fQogIGlmKChvdXJMPT0nPCcpKQkJeyByZXR1cm4oMSk7fQogIGlmKChvdXJMPT0nPycpKQkJeyByZXR1cm4oMSk7fQogIGlmKChvdXJMPT0nfCcpKQkJeyByZXR1cm4oMSk7fQogIGlmKChvdXJMPT0neycpKQkJeyByZXR1cm4oMSk7fQogIGlmKChvdXJMPT0nfScpKQkJeyByZXR1cm4oMSk7fQogIGlmKChvdXJMPT0nOycpKQkJeyByZXR1cm4oMSk7fQogIAogIHJldHVybigwKTsKfQoKCgppbnQgY2hlY2tDaGFyIChjaGFyIG91ckwpCnsKICBpZigob3VyTD09J2EnKXx8KG91ckw9PSdBJykpCQl7IHJldHVybihLRVlfQSk7fQogIGlmKChvdXJMPT0nYicpfHwob3VyTD09J0InKSkJCXsgcmV0dXJuKEtFWV9CKTt9CiAgaWYoKG91ckw9PSdjJyl8fChvdXJMPT0nQycpKQkJeyByZXR1cm4oS0VZX0MpO30KICBpZigob3VyTD09J2QnKXx8KG91ckw9PSdEJykpCQl7IHJldHVybihLRVlfRCk7fQogIGlmKChvdXJMPT0nZScpfHwob3VyTD09J0UnKSkJCXsgcmV0dXJuKEtFWV9FKTt9CiAgaWYoKG91ckw9PSdmJyl8fChvdXJMPT0nRicpKQkJeyByZXR1cm4oS0VZX0YpO30KICBpZigob3VyTD09J2cnKXx8KG91ckw9PSdHJykpCQl7IHJldHVybihLRVlfRyk7fQogIGlmKChvdXJMPT0naCcpfHwob3VyTD09J0gnKSkJCXsgcmV0dXJuKEtFWV9IKTt9CiAgaWYoKG91ckw9PSdpJyl8fChvdXJMPT0nSScpKQkJeyByZXR1cm4oS0VZX0kpO30KICBpZigob3VyTD09J2onKXx8KG91ckw9PSdKJykpCQl7IHJldHVybihLRVlfSik7fQogIGlmKChvdXJMPT0naycpfHwob3VyTD09J0snKSkJCXsgcmV0dXJuKEtFWV9LKTt9CiAgaWYoKG91ckw9PSdsJyl8fChvdXJMPT0nTCcpKQkJeyByZXR1cm4oS0VZX0wpO30KICBpZigob3VyTD09J20nKXx8KG91ckw9PSdNJykpCQl7IHJldHVybihLRVlfTSk7fQogIGlmKChvdXJMPT0nbicpfHwob3VyTD09J04nKSkJCXsgcmV0dXJuKEtFWV9OKTt9CiAgaWYoKG91ckw9PSdvJyl8fChvdXJMPT0nTycpKQkJeyByZXR1cm4oS0VZX08pO30KICBpZigob3VyTD09J3AnKXx8KG91ckw9PSdQJykpCQl7IHJldHVybihLRVlfUCk7fQogIGlmKChvdXJMPT0ncScpfHwob3VyTD09J1EnKSkJCXsgcmV0dXJuKEtFWV9RKTt9CiAgaWYoKG91ckw9PSdyJyl8fChvdXJMPT0nUicpKQkJeyByZXR1cm4oS0VZX1IpO30KICBpZigob3VyTD09J3MnKXx8KG91ckw9PSdTJykpCQl7IHJldHVybihLRVlfUyk7fQogIGlmKChvdXJMPT0ndCcpfHwob3VyTD09J1QnKSkJCXsgcmV0dXJuKEtFWV9UKTt9CiAgaWYoKG91ckw9PSd1Jyl8fChvdXJMPT0nVScpKQkJeyByZXR1cm4oS0VZX1UpO30KICBpZigob3VyTD09J3YnKXx8KG91ckw9PSdWJykpCQl7IHJldHVybihLRVlfVik7fQogIGlmKChvdXJMPT0ndycpfHwob3VyTD09J1cnKSkJCXsgcmV0dXJuKEtFWV9XKTt9CiAgaWYoKG91ckw9PSd4Jyl8fChvdXJMPT0nWCcpKQkJeyByZXR1cm4oS0VZX1gpO30KICBpZigob3VyTD09J3knKXx8KG91ckw9PSdZJykpCQl7IHJldHVybihLRVlfWSk7fQogIGlmKChvdXJMPT0neicpfHwob3VyTD09J1onKSkJCXsgcmV0dXJuKEtFWV9aKTt9CgogIGlmKChvdXJMPT0nMCcpfHwob3VyTD09JyknKSkJCXsgcmV0dXJuKEtFWV8wKTt9CiAgaWYoKG91ckw9PScxJyl8fChvdXJMPT0nIScpKQkJeyByZXR1cm4oS0VZXzEpO30KICBpZigob3VyTD09JzInKXx8KG91ckw9PSdAJykpCQl7IHJldHVybihLRVlfMik7fQogIGlmKChvdXJMPT0nMycpfHwob3VyTD09JyMnKSkJCXsgcmV0dXJuKEtFWV8zKTt9CiAgaWYoKG91ckw9PSc0Jyl8fChvdXJMPT0nJCcpKQkJeyByZXR1cm4oS0VZXzQpO30KICBpZigob3VyTD09JzUnKXx8KG91ckw9PSclJykpCQl7IHJldHVybihLRVlfNSk7fQogIGlmKChvdXJMPT0nNicpfHwob3VyTD09J14nKSkJCXsgcmV0dXJuKEtFWV82KTt9CiAgaWYoKG91ckw9PSc3Jyl8fChvdXJMPT0nJicpKQkJeyByZXR1cm4oS0VZXzcpO30KICBpZigob3VyTD09JzgnKXx8KG91ckw9PScqJykpCQl7IHJldHVybihLRVlfOCk7fQogIGlmKChvdXJMPT0nOScpfHwob3VyTD09JygnKSkJCXsgcmV0dXJuKEtFWV85KTt9CiAgCiAgaWYob3VyTD09JyAnKQkJCQl7IHJldHVybihLRVlfU1BBQ0UpO30KICBpZigob3VyTD09Jy4nKXx8KG91ckw9PSc+JykpCQl7IHJldHVybihLRVlfRE9UKTt9CiAgaWYoKG91ckw9PScsJyl8fChvdXJMPT0nPCcpKQkJeyByZXR1cm4oS0VZX0NPTU1BKTt9CiAgaWYoKG91ckw9PScvJyl8fChvdXJMPT0nPycpKQkJeyByZXR1cm4oS0VZX1NMQVNIKTt9CiAgaWYoKG91ckw9PSdcXCcpfHwob3VyTD09J3wnKSkJCXsgcmV0dXJuKEtFWV9CQUNLU0xBU0gpO30KICBpZigob3VyTD09J1snKXx8KG91ckw9PSd7JykpCQl7IHJldHVybihLRVlfTEVGVEJSQUNFKTt9CiAgaWYoKG91ckw9PSddJyl8fChvdXJMPT0nfScpKQkJeyByZXR1cm4oS0VZX1JJR0hUQlJBQ0UpO30KICBpZigob3VyTD09JzsnKXx8KG91ckw9PSc6JykpCQl7IHJldHVybihLRVlfU0VNSUNPTE9OKTt9CiAgCiAgcmV0dXJuKEtFWV9TUEFDRSk7Cn0KCgp2b2lkIEtleVByZXNzKHVpbnB1dF91c2VyX2RldiAmdWlEZXYsaW50ICZmRGV2LGlucHV0X2V2ZW50ICZpbkV2LGludCBrdHlwZSwgaW50IGtjb2RlLCBpbnQga3ZhbHVlKQp7CiAgICBtZW1zZXQoJmluRXYsMCxzaXplb2YoaW5FdikpOwogICAgaW5Fdi50eXBlID0ga3R5cGU7CiAgICBpbkV2LmNvZGUgPSBrY29kZTsKICAgIGluRXYudmFsdWUgPSBrdmFsdWU7CiAgICBpZiAod3JpdGUoZkRldiwmaW5FdixzaXplb2YoaW5FdikpPDApCiAgICB7CiAgICAgIGNlcnI8PCJ3cml0ZSBlcnJvciI8PGVuZGw7CiAgICAgIGV4aXQoMSk7CiAgICB9Cn0KCnZvaWQgZXJNZXMoc3RyaW5nIGVycm9yTWVzKQp7CiAgY2Vycjw8ZXJyb3JNZXM8PGVuZGw7CiAgZXhpdCgxKTsKfQoKLy92b2lkIHVzZUtleSAoJiApCgppbnQgbWFpbigpCnsKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIHN0YXJ0IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgCiAgaW50IAkJCQlmRGV2OyAgLy9kZWtsYXJ1amUgcG9kc3Rhd293ZSB6bWllbm5lCiAgc3RydWN0IHVpbnB1dF91c2VyX2Rldgl1aURldjsKICBzdHJ1Y3QgaW5wdXRfZXZlbnQJCWluRXY7CiAgCiAgZkRldiA9IG9wZW4oIi9kZXYvdWlucHV0IiwgT19XUk9OTFkgfCBPX05PTkJMT0NLKTsgLy9mdW5rY2phIG90d2llcmEgbWkgcGxpayBpIHNwcmF3ZHphIGplZ28gcG9wcmF3bm9zYwogIGlmIChmRGV2PDApCQkJCQl7IGVyTWVzKCJlcnJvciBjYW50IG9wZW4iKTt9CiAgCiAgLy9kZWtsYXJhY2phIGV2ZW50dQogIGlmKGlvY3RsKGZEZXYsIFVJX1NFVF9FVkJJVCwgRVZfS0VZKSA8IDApCXsgZXJNZXMoImVycm9yIGluIGlvY3RsIHN0YXJ0Iik7fSAvL2Rla2xhcnVqZSBldmVudCBrZXkKICAKICAvL2themR5IGV2ZW50IG11c2kgYnljICJ6c3luY2hyb25pem93YW55LyBwb3R3aWVyZHpvbnkiCiAgaWYoaW9jdGwoZkRldiwgVUlfU0VUX0VWQklULCBFVl9TWU4pIDwgMCkJeyBlck1lcygiZXJyb3IgaW4gaW9jdGwiKTt9CiAgCiAgLy9kZWtsYXJ1amUgd3N6eXN0a2llIGxpdGVya2kgaSBsaWN6Ynkgc3p1a2Egc2llIHcgcGxpa3UgdXNyL2luY2x1ZGUvbGludXgvaW5wdXQKICAKICBpbnQga2V5dGFiW10gPSB7S0VZX0EsIEtFWV9CLCBLRVlfQywgS0VZX0QsIEtFWV9FLCBLRVlfRiwgS0VZX0csIEtFWV9ILCBLRVlfSSwgS0VZX0osIEtFWV9LLCBLRVlfTCwgS0VZX00sIEtFWV9OLCBLRVlfTywgS0VZX1AsIEtFWV9RLCBLRVlfUiwgS0VZX1MsIEtFWV9ULAoJCSAgS0VZX1UsIEtFWV9WLCBLRVlfVywgS0VZX1gsIEtFWV9ZLCBLRVlfWiwgS0VZXzAsIEtFWV8xLCBLRVlfMiwgS0VZXzMsIEtFWV80LCBLRVlfNSwgS0VZXzYsIEtFWV83LCBLRVlfOCwgS0VZXzksIEtFWV9FTlRFUiwgS0VZX0RPVCwKCQkgIEtFWV9TUEFDRSwgS0VZX1NMQVNILCBLRVlfQ09NTUEsIEtFWV9MRUZUU0hJRlQsIEtFWV9CQUNLU0xBU0gsIEtFWV9MRUZUQlJBQ0UsIEtFWV9SSUdIVEJSQUNFLCBLRVlfU0VNSUNPTE9OfTsKICAKICBmb3IoaW50IGk9MDtpPHNpemVvZihrZXl0YWIpL3NpemVvZihpbnQpO2krKykKICB7CiAgICBpZihpb2N0bChmRGV2LCBVSV9TRVRfS0VZQklULCBrZXl0YWJbaV0pPDApCXsgZXJNZXMoImVycm9yIGluIGlvY3RsIik7fQogIH0KCiAgLy9kbGEgbXlzemtpIG5hIHByenlzemxvc2MKICBpZihpb2N0bChmRGV2LCBVSV9TRVRfRVZCSVQsIEVWX1JFTCkgPCAwKQl7IGVyTWVzKCJlcnJvciBpbiBpb2N0bCIpO30KICBpZihpb2N0bChmRGV2LCBVSV9TRVRfUkVMQklULCBSRUxfWCkgPCAwKQl7IGVyTWVzKCJlcnJvciBpbSBpb2N0bCIpO30gCiAgaWYoaW9jdGwoZkRldiwgVUlfU0VUX1JFTEJJVCwgUkVMX1kpIDwgMCkJeyBlck1lcygiZXJyb3IgaW4gaW9jdGwiKTt9CgogIAogIG1lbXNldCgmdWlEZXYsIDAsIHNpemVvZih1aURldikpOyAvL29jenlzemN6YW0gcGFtaWVjIGkgcHJ6eWR6aWVsYW0gcGV3bmUgImNoYXJha3RlcnlzdHlraSIsIHRyemViYSB0byB6cm9iaWMKICBzbnByaW50Zih1aURldi5uYW1lLCBVSU5QVVRfTUFYX05BTUVfU0laRSwgInNhbXBsZSIpOwogIHVpRGV2LmlkLmJ1c3R5cGUgPSBCVVNfVVNCOwogIHVpRGV2LmlkLnZlbmRvcj0weDE7CiAgdWlEZXYuaWQucHJvZHVjdD0weDE7CiAgdWlEZXYuaWQudmVyc2lvbj0xOwogIAogIC8va29sZWpuZSBzcHJhd2R6aWFueQogIGlmICh3cml0ZShmRGV2LCAmdWlEZXYsIHNpemVvZih1aURldikpPDApCXsgZXJNZXMoImVycm9yIGluIHdyaXRlIik7fQogIGlmICgoaW9jdGwoZkRldiwgVUlfREVWX0NSRUFURSkpPDApCQl7IGVyTWVzKCJlcnJvciBpbiBpb2N0bCIpO30KICAKICBjb3V0PDwiemFsYWRvd2FubyBrb21lbmR5Ijw8ZW5kbDsKICAKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAJCSAgLy9vdHdvcnogZm9sZGVyIHogY3JhcCB0ZWtzdGVtIGkgZ28gemFsYWR1ai8vCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgCiAgaWZzdHJlYW0gdGhpc1RleHQ7CiAgdGhpc1RleHQub3BlbigiL2hvbWUvcGlvdHIvRG9rdW1lbnR5L0MvTW9qZSBwcm9ncmFteS9Eb29tL1NwYW0xLnR4dCIpOwogIAogIGlmKCF0aGlzVGV4dC5pc19vcGVuKCkpCXsgZXJNZXMoImVycm9yIGluIG9wZW4gdGhpc1RleHQiKTt9IC8vbGVwaWVqIHNwcmF3ZHphYyB6IGlzX29wZW4KICAKICB2ZWN0b3I8c3RyaW5nPiBzcGFtU3RyOyAvL3ZlY3RvciB6IG5hc3p5bSB0ZWtzdGVtCiAgewogICAgc3RyaW5nIHRlbXBTdHI7CiAgICB3aGlsZShnZXRsaW5lKHRoaXNUZXh0LCB0ZW1wU3RyKSkKICAgIHsKICAgICAgc3BhbVN0ci5wdXNoX2JhY2sodGVtcFN0cik7CiAgICB9CiAgfQogIHRoaXNUZXh0LmNsb3NlKCk7CiAgCiAgLy8gc3RhcmUga29sb3J5IGEgcG90ZW0gbm93ZQogIHN0cmluZyBzdHJDb2xbXSA9IHsiXFxjcSIsICJcXGNlIiwgIlxcY3IiLCAiXFxjdCIsICJcXGN1IiwgIlxcY2kiLCAiXFxjbyIsICJcXGNwIiwgIlxcY2EiLCAiXFxjcyIsICJcXGNkIiwgIlxcY2YiLCAKICAiXFxjZyIsICJcXGNoIiwgIlxcY2oiLCAiXFxjayIsICJcXGNsIiwgIlxcY2MiLCAiXFxjdiIsICJcXGNiIiwgIlxcY24iLCAiXFxjbSIsCiAgIlxcY1tjMF0iLCAiXFxjW2MxXSIsICJcXGNbYzJdIiwgIlxcY1tjM10iLCAiXFxjW2M0XSIsICJcXGNbYzVdIiwgIlxcY1tjNl0iLCAiXFxjW2M3XSIsICJcXGNbYzhdIiwgIlxcY1tjOV0iLAogICJcXGNbbTBdIiwgIlxcY1ttMV0iLCAiXFxjW20yXSIsICJcXGNbbTNdIiwgIlxcY1ttNF0iLCAiXFxjW201XSIsICJcXGNbbTZdIiwgIlxcY1ttN10iLCAiXFxjW204XSIsICJcXGNbbTldIiwKICAiXFxjW2cwXSIsICJcXGNbZzFdIiwgIlxcY1tnMl0iLCAiXFxjW2czXSIsICJcXGNbZzRdIiwgIlxcY1tnNV0iLCAiXFxjW2c2XSIsICJcXGNbZzddIiwgIlxcY1tnOF0iLCAiXFxjW2c5XSIsCiAgIlxcY1t1MF0iLCAiXFxjW3UxXSIsICJcXGNbdTJdIiwgIlxcY1t1M10iLCAiXFxjW3U0XSIsICJcXGNbdTVdIiwgIlxcY1t1Nl0iLCAiXFxjW3U3XSIsICJcXGNbdThdIiwgIlxcY1t1OV0iLAogICJcXGNbdjBdIiwgIlxcY1t2MV0iLCAiXFxjW3YyXSIsICJcXGNbdjNdIiwgIlxcY1t2NF0iLCAiXFxjW3Y1XSIsICJcXGNbdjZdIiwgIlxcY1t2N10iLCAiXFxjW3Y4XSIsICJcXGNbdjldIiwKICAiXFxjW3EwXSIsICJcXGNbcTFdIiwgIlxcY1txMl0iLCAiXFxjW3EzXSIsICJcXGNbcTRdIiwgIlxcY1txNV0iLCAiXFxjW3E2XSIsICJcXGNbcTddIiwgIlxcY1txOF0iLCAiXFxjW3E5XSIsCiAgIlxcY1tzMF0iLCAiXFxjW3MxXSIsICJcXGNbczJdIiwgIlxcY1tzM10iLCAiXFxjW3M0XSIsICJcXGNbczVdIiwgIlxcY1tzNl0iLCAiXFxjW3M3XSIsICJcXGNbczhdIiwgIlxcY1tzOV0iLAogICJcXGNbeTBdIiwgIlxcY1t5MV0iLCAiXFxjW3kyXSIsICJcXGNbeTNdIiwgIlxcY1t5NF0iLCAiXFxjW3k1XSIsICJcXGNbeTZdIiwgIlxcY1t5N10iLCAiXFxjW3k4XSIsICJcXGNbeTldIiwKICAiXFxjW2UwXSIsICJcXGNbZTFdIiwgIlxcY1tlMl0iLCAiXFxjW2UzXSIsICJcXGNbZTRdIiwgIlxcY1tlNV0iLCAiXFxjW2U2XSIsICJcXGNbZTddIiwgIlxcY1tlOF0iLCAiXFxjW2U5XSIsCiAgIlxcY1tqMF0iLCAiXFxjW2oxXSIsICJcXGNbajJdIiwgIlxcY1tqM10iLCAiXFxjW2o0XSIsICJcXGNbajVdIiwgIlxcY1tqNl0iLCAiXFxjW2o3XSIsICJcXGNbajhdIiwgIlxcY1tqOV0iLAogICJcXGNbaTBdIiwgIlxcY1tpMV0iLCAiXFxjW2kyXSIsICJcXGNbaTNdIiwgIlxcY1tpNF0iLCAiXFxjW2k1XSIsICJcXGNbaTZdIiwgIlxcY1tpN10iLCAiXFxjW2k4XSIsICJcXGNbaTldIiwKICAiXFxjW2QwXSIsICJcXGNbZDFdIiwgIlxcY1tkMl0iLCAiXFxjW2QzXSIsICJcXGNbZDRdIiwgIlxcY1tkNV0iLCAiXFxjW2Q2XSIsICJcXGNbZDddIiwgIlxcY1tkOF0iLCAiXFxjW2Q5XSIsCiAgIlxcY1tsMF0iLCAiXFxjW2wxXSIsICJcXGNbbDJdIiwgIlxcY1tsM10iLCAiXFxjW2w0XSIsICJcXGNbbDVdIiwgIlxcY1tsNl0iLCAiXFxjW2w3XSIsICJcXGNbbDhdIiwgIlxcY1tsOV0iLAogICJcXGNbazBdIiwgIlxcY1trMV0iLCAiXFxjW2syXSIsICJcXGNbazNdIiwgIlxcY1trNF0iLCAiXFxjW2s1XSIsICJcXGNbazZdIiwgIlxcY1trN10iLCAiXFxjW2s4XSIsICJcXGNbazldIiwKICAiXFxjW24wXSIsICJcXGNbbjFdIiwgIlxcY1tuMl0iLCAiXFxjW24zXSIsICJcXGNbbjRdIiwgIlxcY1tuNV0iLCAiXFxjW242XSIsICJcXGNbbjddIiwgIlxcY1tuOF0iLCAiXFxjW245XSIsCiAgIlxcY1tiMF0iLCAiXFxjW2IxXSIsICJcXGNbYjJdIiwgIlxcY1tiM10iLCAiXFxjW2I0XSIsICJcXGNbYjVdIiwgIlxcY1tiNl0iLCAiXFxjW2I3XSIsICJcXGNbYjhdIiwgIlxcY1tiOV0iLAogICJcXGNbdDBdIiwgIlxcY1t0MV0iLCAiXFxjW3QyXSIsICJcXGNbdDNdIiwgIlxcY1t0NF0iLCAiXFxjW3Q1XSIsICJcXGNbdDZdIiwgIlxcY1t0N10iLCAiXFxjW3Q4XSIsICJcXGNbdDldIiwKICB9OwogIAogIAogIAogIGNvdXQ8PCJ3Y3p5dGFubyBzcGFtIHRla3N0IGkga29sb3J5LCBzcGFtb3dhbmllIHphIDEgbWluIjw8ZW5kbDsKICBzbGVlcCgzMCk7CiAgCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJCS8vICAgICAgICAgIHJvenBvY3puaWogc3BhbSAgICAgICAgICAgICAgLy8KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgY291dDw8InByb2dyYW0gcm96cG9jemFsIGR6aWFsYW5pZSI8PGVuZGw7CiAgc3JhbmQodGltZShOVUxMKSk7CiAgaW50IHBvcyxpX2tleTsKICBpbnQgc3RvcCA9IDE7CiAgY2hhciBzb21MOwogIGJvb2wgYmlnID0gMDsKICB3aGlsZSgxKQogIHsgCiAgICB1c2xlZXAoNTAwMDAwK3JhbmQoKSUyMDAwMDAwKTsKICAgIAogICAgaWYoc3BhbVN0ci5zaXplKCk+MCkJCXsgcG9zPXJhbmQoKSVzcGFtU3RyLnNpemUoKTt9CiAgICBlbHNlCQkJCXsgYnJlYWs7fQogICAgCiAgICBzdHJpbmcgbGluZSA9IHNwYW1TdHJbcG9zXTsKICAgIAogICAgLy9saW5lLmluc2VydCgwLHN0ckNvbFtyYW5kKCklKHNpemVvZihzdHJDb2wpL3NpemVvZihzdHJpbmcpKV0pOwoKICAgIGZvcihpbnQgaSA9MDsgaTxsaW5lLnNpemUoKTsgaSsrKQogICAgewogICAgICBzb21MPWxpbmUuYXQoaSk7CiAgICAgIAogICAgICAvL2dldCBwcm9wZXIga2V5CiAgICAgIGlfa2V5PWNoZWNrQ2hhcihzb21MKTsKICAgICAKICAgICAgLy9jaGVjayBpZiBiaWcKICAgICAgYmlnID0gY2hlY2tCaWcoc29tTCk7CiAgICAgIHVzbGVlcCg1MDAwMCk7CiAgICAgIGlmIChiaWcpCSB7IEtleVByZXNzKHVpRGV2LGZEZXYsaW5FdixFVl9LRVksS0VZX0xFRlRTSElGVCwxKTt9CiAgICAgIAogICAgICBpX2tleT1jaGVja0NoYXIobGluZS5hdChpKSk7IC8vc3ByYXdkemFtIGpha2kga2xhd2lzegogICAgICBLZXlQcmVzcyh1aURldixmRGV2LGluRXYsRVZfS0VZLGlfa2V5LDEpOwogICAgICBLZXlQcmVzcyh1aURldixmRGV2LGluRXYsRVZfS0VZLGlfa2V5LDApOwogICAgICAKICAgICAgaWYgKGJpZykJIHsgS2V5UHJlc3ModWlEZXYsZkRldixpbkV2LEVWX0tFWSxLRVlfTEVGVFNISUZULDApOyBiaWc9MDt9CiAgICAgIAogICAgICAvL3N5bmMKICAgICAgS2V5UHJlc3ModWlEZXYsZkRldixpbkV2LEVWX1NZTiwwLDApOwogICAgfQogICAgdXNsZWVwKDUwMDAwMCk7CiAgICBLZXlQcmVzcyh1aURldixmRGV2LGluRXYsRVZfS0VZLEtFWV9FTlRFUiwxKTsKICAgIEtleVByZXNzKHVpRGV2LGZEZXYsaW5FdixFVl9LRVksS0VZX0VOVEVSLDApOwogICAgS2V5UHJlc3ModWlEZXYsZkRldixpbkV2LEVWX1NZTiwwLDApOy8vcG93aW5ubyBzaWUgc3luY2hyb25pem93YWMgcG8gZHppZXNpZWNpdSBuYWpkYWxlagogICAgCiAgfQogIHNsZWVwKDIpOwp9