diff --git a/Makefile b/Makefile index ac5398efe..29e1a324a 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ SOURCES := src/*.c src/elements/*.c -CFLAGS := -w -std=c99 -D_POSIX_C_SOURCE=200112L -Iincludes/ +CFLAGS := -w -std=c99 -D_POSIX_C_SOURCE=200112L -Iincludes/ OFLAGS := -O3 -ffast-math -ftree-vectorize -funsafe-math-optimizations -LFLAGS := -lSDL -lm -lbz2 +LFLAGS := -lSDL -lm -lbz2 LFLAGS_X := -lm -lbz2 -lSDLmain MFLAGS_SSE3 := -march=native -DX86 -DX86_SSE3 -msse3 MFLAGS_SSE2 := -march=native -DX86 -DX86_SSE2 -msse2 @@ -68,10 +68,10 @@ powder-sse.exe: $(SOURCES) powder-res.o chmod 0644 $@ mv $@ build powder-x: $(SOURCES) - gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS_X) $(MFLAGS) $(SOURCES) -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa -framework SDL + gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS_X) $(MFLAGS) $(SOURCES) -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa -framework SDL -framework Python strip $@ mv $@ build/Powder.app/Contents/MacOS/ powder-x-ogl: $(SOURCES) - gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS_X) $(MFLAGS) $(SOURCES) -DOpenGL -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa -framework SDL -framework OpenGL + gcc -o $@ $(CFLAGS) $(OFLAGS) $(LFLAGS_X) $(MFLAGS) $(SOURCES) -DOpenGL -DMACOSX -DPIX32BGRA -arch x86_64 -framework Cocoa -framework SDL -framework OpenGL -framework Python strip $@ mv $@ build diff --git a/build/ext_chat.py b/build/ext_chat.py new file mode 100644 index 000000000..8daa7ca75 --- /dev/null +++ b/build/ext_chat.py @@ -0,0 +1,211 @@ +import tpt +import sys +import time +import socket +import tpt_console + +HOST="irc.freenode.net" +PORT=6667 +name=tpt.get_name() +print "name is %s"%repr(name) +if(name==""): + #fuck. abort? + raise SystemExit("please log in!") + +def raw(s,st): + s.send("%s\n\r"%st) + +def init(): + global frame,s,rec,readbuffer,namelist,typing,typed,IDENT,NICK + global REALNAME,CHANNEL + frame=0 + s=None + rec=([("",0,0,0,255)]*20)+[("connected.",255,0,0,128)] + readbuffer="" + namelist=[] + typing=False + typed="" + NICK=name+"[tpt]" + IDENT=name+"[tpt]" + REALNAME=name + CHANNEL="#foobar7" + readbuffer="" + +def exit(): + raw(s,"QUIT") + s.close() + +def console_handle(txt): + """ + :doxin!~lieuwe@unaffiliated/lieuwe JOIN :#foobar7 + :doxin!~lieuwe@unaffiliated/lieuwe PRIVMSG #foobar7 :there + :doxin!~lieuwe@unaffiliated/lieuwe PRIVMSG #foobar7 :ACTION is fat + """ + lst=txt.split(" ") + if(lst[0]=="/me"): + rec.append(("%s %s"%(NICK,txt[4:]),255,0,255,128)) + raw(s,"PRIVMSG %s :\x01ACTION %s\x01"%(CHANNEL,txt[4:])) + tpt.console_close() + else: + rec.append(("<%s>: %s"%(NICK,txt),255,255,0,128)) + raw(s,"PRIVMSG %s :%s"%(CHANNEL,txt)) + tpt.console_close() + +def key(keyy) : + try: + a=key.pmod + except: + key.pmod=(False,False,False) + global typing,typed + print "got %s"%repr(keyy) + ctrl1,ctrl2,alt1,alt2,shift1,shift2=tpt.get_modifier() + mod=(ctrl1 or ctrl2,alt1 or alt2,shift1 or shift2) + skip=False + if(not key.pmod[0] and mod[0]): + skip=True + if(not key.pmod[1] and mod[1]): + skip=True + if(not key.pmod[2] and mod[2]): + skip=True + key.pmod=mod + if(skip): + return + + if(typing and ord(keyy)>=32 and ord(keyy)<=126): + if(mod[2]): + typed+=keyy.upper()#needs to be fixed for special chars + else: + typed+=keyy + if(keyy=="\x1b" and typing): + typing=False + typed="" + tpt.shortcuts_enable() + if(keyy=="t" and typing==False): + typing=True + tpt.shortcuts_disable() + if(keyy=="\r" and typing==True): + console_handle(typed) + typed="" + typing=False + tpt.shortcuts_enable() + #got '\t' + #got '\x08' + if(keyy=="\x08"): + typed=typed[:-1] + #if(keyy=="\t"): + # startswith= + + +def step(): + global frame,s,rec,readbuffer,namelist + frame+=1 + if(frame==1): + tpt.console_close() + #lets see if we can seize the console: + tpt_console._handle=console_handle + if(frame==2): + tpt.draw_fillrect(0,0,612,384,0,0,0,128) + tpt.draw_text(32,32,"opening connection\nhold on to your pants.",255,255,255) + if(frame==3): + s=socket.socket() + s.settimeout(5) + s.connect((HOST, PORT)) + raw(s,"NICK %s" % NICK) + raw(s,"USER %s %s bla :%s" % (IDENT, HOST, REALNAME)) + s.settimeout(0) + if(frame==120): + raw(s,"JOIN %s"%CHANNEL) + rec.append(("joined",255,0,0,255)) + if(frame>=3): + try: + readbuffer=readbuffer+s.recv(1024) + except IOError: + pass + else: + temp=readbuffer.split("\n") + readbuffer=temp.pop() + + for line in temp: + line=line.strip() + #print repr(line) + line=line.split() + if(line[1]=="PRIVMSG"): + #:doxin!~lieuwe@unaffiliated/lieuwe PRIVMSG doxin[tpt] :some shit + frm=line[0][1:].partition("!")[0] + msg=' '.join(line[3:])[1:] + tmp=["<",frm,"> ",msg] + if(msg[0]=="\x01" and msg[-1]=="\x01"): + msg=msg[8:-1]#ACTION + tmp=[frm," ",msg] + if(line[2]==NICK): + rec.append((''.join(tmp),255,255,255,255)) + else: + rec.append((''.join(tmp),255,255,255,128)) + elif(line[0]=="PING"): + raw(s,"PONG %s"%line[1]) + elif(line[1]=="353"): + #:leguin.freenode.net 353 doxin[tpt] = #powder :doxin[tpt] ZebraineZ _-_Rafael_-_ doxin bildramer BlueMaxima TheRazorsEDGE raj-k webb|AP where @devast8a Merbo FrozenKnight EppyMoon EvilJStoker Mortvert SpitfireWP @frankbro Ares + names=line[4:] + namelist=[] + for item in names: + item=item.strip() + r=255 + g=255 + b=255 + if(item[0]==":"): + item=item[1:] + elif(item[0]=="@"): + g=0 + b=0 + namelist.append((item,r,g,b,128)) + elif(line[1]=="JOIN"): + #':savask!~savask@95-190-25-195-xdsl-dynamic.kuzbass.net JOIN :#powder' + tmp=line[0][1:].partition("!")[0] + namelist.append((tmp,255,255,255,128)) + rec.append(("%s joined"%name,0,255,0,128)) + elif(line[1]=="PART"): + #':savask!~savask@95-190-25-195-xdsl-dynamic.kuzbass.net PART #powder :"Leaving."' + tmp=line[0][1:].partition("!")[0] + msg=' '.join(line[2:])[1:] + rem=None + for item in namelist: + if(item[0]==tmp or item[0]=="@"+tmp): + rem=item + rec.append(("%s parted: %s"%(name,msg),0,255,0,128)) + if(rem!=None): + namelist.remove(rem) + elif(line[1]=="NICK"): + #:doxin!~lieuwe@unaffiliated/lieuwe NICK :d0x1n + tmp=line[0][1:].partition("!")[0] + rem=None + for item in namelist: + if(item[0]==tmp or item[0]=="@"+tmp): + rem=item + rec.append(("%s is now known as %s"%(name,line[2]),0,255,0,128)) + if(rem!=None): + if(rem[0][0]=="@"): + namelist.append(("@"+line[2][1:],rem[1],rem[2],rem[3],rem[4])) + else: + namelist.append((line[2][1:],rem[1],rem[2],rem[3],rem[4])) + namelist.remove(rem) + + + + + yy=32 + if(len(rec)>20): + rec=rec[-20:] + for item in rec: + tpt.draw_text(8,yy,item[0],item[1],item[2],item[3],item[4]) + yy+=8 + if(typing): + if(frame%30<15): + tpt.draw_text(8,yy,typed+"|",255,255,255,255) + else: + tpt.draw_text(8,yy,typed,255,255,255,255) + #print namelist + yy=32 + for item in namelist: + tpt.draw_text(604-tpt.get_width(item[0]),yy,item[0],item[1],item[2],item[3],item[4]) + yy+=8 + diff --git a/build/ext_fun.py b/build/ext_fun.py new file mode 100644 index 000000000..35c93a10f --- /dev/null +++ b/build/ext_fun.py @@ -0,0 +1,9 @@ +import tpt +def init(): + pass +def key(keyy): + pass +def step(): + tpt.draw_text(100,100,"FUCK YEAH!",255,255,255,255) +def exit(): + pass diff --git a/console_README b/console_README new file mode 100644 index 000000000..0171b2a11 --- /dev/null +++ b/console_README @@ -0,0 +1,45 @@ +### CONSOLE ### +the console in this version is a python console and will execute any command you enter. +the api for interacting with the powder toy is contained in the tpt module and is already imported at startup. +currently implemented api functions: + create(x,y,type) create a particle of type at , + reset_velocity() resets all velocity + reset_pressure() resets all pressure + reset_sparks() resets all sparks + +### USING SET COMMANDS ### +the console uses keywords to identify variables of what to set, you can specify x and y coords with x=100 y=100, ect. +i is the particle number +setfrom will change all of setfrom's type to the setto variable. It needs to be a string "dust" ect, "all" for all. +the setto is what the particle(s) will be set to, it is a string for the type/ctype commands, and an int for the rest, there is a settoint for type and ctype command. +you need to set the to* variable and one location/name/coords for it to work. + set_type(x=,y=,i=,setfrom="",setto="") + set_life() + set_temp() + set_tmp() + set_x() + set_y() + set_vx() + set_vy() + set_ctype() + + pause() pause the game(note that closing the console + pauses the game) + unpause() unpause the game(note that closing the console + pauses the game) + toggle_pause() toggle pause(note that closing the console + pauses the game) + close_console() closes the console and pauses the game + open_console() opens the console + toggle_console() toggles the console + +NOTE: these functions don't do bounds checking, which means that they CAN AND + WILL CRASH the powder toy. be carefull. + +### TIPS&TRICKS ### +all functions that need a particle type expect a number. but instead of doing +tpt.set_life(32,life) you can do tpt.set_life(element['uran'],life) + +### COMPILING ### +before you compile you should have python 2.x installed. +you must run the "getheader.py" script to get the correct linking options, add these options to the makefile diff --git a/getheader.py b/getheader.py new file mode 100644 index 000000000..536915e27 --- /dev/null +++ b/getheader.py @@ -0,0 +1,37 @@ +import sys +import os.path +import compileall +path=os.path.join(sys.exec_prefix,"include","python%s"%sys.version[:3]) +#print "headers at ",repr(path) +#-lpython2.3 -lm -L/usr/lib/python2.3/config +args="-lpython%s -lm -L%s"%(sys.version[:3],os.path.join(sys.exec_prefix,"lib","python%s"%sys.version[:3],"config")) +print " linux args are" +print args,"-I%s"%path + +path=os.path.join(sys.exec_prefix,"include") +args="-lpython%s -lm -L%s"%(sys.version[:3],os.path.join(sys.exec_prefix,"lib","config"))#,"python%s"%sys.version[:3] +print "\n windows args are" +print args,"-I%s"%path + +#unsigned char tpt_console_pyc[] = { 0x1B, 0x57}; +lst=[] +compileall.compile_dir("./src/python", force=1) + +print "generating pyconsole.h" + +fname="./src/python/tpt_console.pyc" +try: + fid=open(fname,"r") +except IOError: + fname="./src/python/tpt_console.pyo" +finally: + fid.close() + +with open(fname,"r") as fid: + for char in fid.read(): + lst.append(hex(ord(char))) +tmp=",".join(lst) +out=''.join(["#include \nunsigned char tpt_console_pyc[] = {",tmp,"};"]) +with open("./includes/pyconsole.h","w") as fid: + fid.write(out) +print "done" diff --git a/includes/defines.h b/includes/defines.h index 1c20fb4a0..9ec6905a7 100644 --- a/includes/defines.h +++ b/includes/defines.h @@ -16,6 +16,8 @@ #define THUMB_CACHE_SIZE 256 +//#define pyconsole + #define IMGCONNS 3 #define TIMEOUT 100 #define HTTP_TIMEOUT 10 @@ -65,6 +67,8 @@ extern unsigned char ZSIZE; #define SQUARE_BRUSH 1 #define BRUSH_NUM 2 +#define PYCONSOLE + #ifdef PIX16 typedef unsigned short pixel; #else diff --git a/includes/interface.h b/includes/interface.h index ea1f9a5be..d63770afd 100644 --- a/includes/interface.h +++ b/includes/interface.h @@ -225,7 +225,7 @@ void open_link(char *uri); int report_ui(pixel *vid_buf, char *save_id); -char *console_ui(pixel *vid_buf, char error[255]); +char *console_ui(pixel *vid_buf, char error[255],char console_more); int console_parse_coords(char *txt, int *x, int *y, char *err); int console_parse_type(char *txt, int *element, char *err); int console_parse_partref(char *txt, int *which, char *err); diff --git a/includes/powder.h b/includes/powder.h index d7e4daa0e..0d4ada5e7 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -50,15 +50,15 @@ -#define PT_NONE 0 -#define PT_DUST 1 -#define PT_WATR 2 +#define PT_NONE 0 +#define PT_DUST 1 +#define PT_WATR 2 #define PT_OIL 3 #define PT_FIRE 4 #define PT_STNE 5 #define PT_LAVA 6 -#define PT_GUNP 7 -#define PT_NITR 8 +#define PT_GUNP 7 +#define PT_NITR 8 #define PT_CLNE 9 #define PT_GAS 10 #define PT_PLEX 11 @@ -166,7 +166,7 @@ #define PT_ANAR 113 #define PT_VINE 114 #define PT_INVIS 115 -#define PT_EQUALVEL 116//all particles equal their velocities +#define PT_EQUALVEL 116 //all particles equal their velocities #define PT_SPAWN2 117 #define PT_SPAWN 118 #define PT_SHLD1 119 diff --git a/includes/pyconsole.h b/includes/pyconsole.h new file mode 100644 index 000000000..765e63dbf --- /dev/null +++ b/includes/pyconsole.h @@ -0,0 +1,2 @@ +#include +unsigned char tpt_console_pyc[] = {0x3,0xf3,0xd,0xa,0xde,0x1,0x75,0x4d,0x63,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x73,0xf1,0x4,0x0,0x0,0x64,0x0,0x0,0x64,0x1,0x0,0x6c,0x0,0x0,0x5a,0x0,0x0,0x64,0x0,0x0,0x64,0x2,0x0,0x6c,0x0,0x0,0x54,0x64,0x0,0x0,0x64,0x1,0x0,0x6c,0x1,0x0,0x5a,0x1,0x0,0x64,0x0,0x0,0x64,0x1,0x0,0x6c,0x2,0x0,0x5a,0x2,0x0,0x64,0x0,0x0,0x64,0x1,0x0,0x6c,0x3,0x0,0x5a,0x3,0x0,0x64,0x0,0x0,0x64,0x1,0x0,0x6c,0x4,0x0,0x5a,0x4,0x0,0x65,0x5,0x0,0x5a,0x6,0x0,0x64,0x3,0x0,0x64,0x37,0x1,0x64,0x4,0x0,0x84,0x0,0x0,0x83,0x0,0x0,0x59,0x5a,0x7,0x0,0x65,0x6,0x0,0x65,0x5,0x0,0x6b,0x2,0x0,0x72,0x86,0x0,0x65,0x7,0x0,0x83,0x0,0x0,0x65,0x1,0x0,0x5f,0x8,0x0,0x65,0x7,0x0,0x83,0x0,0x0,0x65,0x1,0x0,0x5f,0x9,0x0,0x6e,0x0,0x0,0x69,0x95,0x0,0x64,0x5,0x0,0x64,0x6,0x0,0x36,0x64,0x7,0x0,0x64,0x8,0x0,0x36,0x64,0x9,0x0,0x64,0xa,0x0,0x36,0x64,0xb,0x0,0x64,0xc,0x0,0x36,0x64,0xd,0x0,0x64,0xe,0x0,0x36,0x64,0xf,0x0,0x64,0x10,0x0,0x36,0x64,0x11,0x0,0x64,0x12,0x0,0x36,0x64,0x13,0x0,0x64,0x14,0x0,0x36,0x64,0x15,0x0,0x64,0x16,0x0,0x36,0x64,0x17,0x0,0x64,0x18,0x0,0x36,0x64,0x19,0x0,0x64,0x1a,0x0,0x36,0x64,0x1b,0x0,0x64,0x1c,0x0,0x36,0x64,0x1d,0x0,0x64,0x1e,0x0,0x36,0x64,0x1f,0x0,0x64,0x20,0x0,0x36,0x64,0x21,0x0,0x64,0x22,0x0,0x36,0x64,0x23,0x0,0x64,0x24,0x0,0x36,0x64,0x25,0x0,0x64,0x26,0x0,0x36,0x64,0x27,0x0,0x64,0x28,0x0,0x36,0x64,0x29,0x0,0x64,0x2a,0x0,0x36,0x64,0x2b,0x0,0x64,0x2c,0x0,0x36,0x64,0x2d,0x0,0x64,0x2e,0x0,0x36,0x64,0x2f,0x0,0x64,0x30,0x0,0x36,0x64,0x31,0x0,0x64,0x32,0x0,0x36,0x64,0x33,0x0,0x64,0x34,0x0,0x36,0x64,0x35,0x0,0x64,0x36,0x0,0x36,0x64,0x37,0x0,0x64,0x38,0x0,0x36,0x64,0x39,0x0,0x64,0x3a,0x0,0x36,0x64,0x3b,0x0,0x64,0x3c,0x0,0x36,0x64,0x3d,0x0,0x64,0x3e,0x0,0x36,0x64,0x3f,0x0,0x64,0x40,0x0,0x36,0x64,0x41,0x0,0x64,0x42,0x0,0x36,0x64,0x43,0x0,0x64,0x44,0x0,0x36,0x64,0x45,0x0,0x64,0x46,0x0,0x36,0x64,0x47,0x0,0x64,0x48,0x0,0x36,0x64,0x49,0x0,0x64,0x4a,0x0,0x36,0x64,0x4b,0x0,0x64,0x4c,0x0,0x36,0x64,0x4d,0x0,0x64,0x4e,0x0,0x36,0x64,0x4f,0x0,0x64,0x50,0x0,0x36,0x64,0x51,0x0,0x64,0x52,0x0,0x36,0x64,0x53,0x0,0x64,0x54,0x0,0x36,0x64,0x55,0x0,0x64,0x56,0x0,0x36,0x64,0x57,0x0,0x64,0x58,0x0,0x36,0x64,0x59,0x0,0x64,0x5a,0x0,0x36,0x64,0x5b,0x0,0x64,0x5c,0x0,0x36,0x64,0x5d,0x0,0x64,0x5e,0x0,0x36,0x64,0x5f,0x0,0x64,0x60,0x0,0x36,0x64,0x61,0x0,0x64,0x62,0x0,0x36,0x64,0x63,0x0,0x64,0x64,0x0,0x36,0x64,0x65,0x0,0x64,0x66,0x0,0x36,0x64,0x67,0x0,0x64,0x68,0x0,0x36,0x64,0x69,0x0,0x64,0x6a,0x0,0x36,0x64,0x6b,0x0,0x64,0x6c,0x0,0x36,0x64,0x6d,0x0,0x64,0x6e,0x0,0x36,0x64,0x6f,0x0,0x64,0x70,0x0,0x36,0x64,0x71,0x0,0x64,0x72,0x0,0x36,0x64,0x73,0x0,0x64,0x74,0x0,0x36,0x64,0x75,0x0,0x64,0x76,0x0,0x36,0x64,0x77,0x0,0x64,0x78,0x0,0x36,0x64,0x79,0x0,0x64,0x7a,0x0,0x36,0x64,0x7b,0x0,0x64,0x7c,0x0,0x36,0x64,0x7d,0x0,0x64,0x7e,0x0,0x36,0x64,0x7f,0x0,0x64,0x80,0x0,0x36,0x64,0x81,0x0,0x64,0x82,0x0,0x36,0x64,0x83,0x0,0x64,0x84,0x0,0x36,0x64,0x85,0x0,0x64,0x86,0x0,0x36,0x64,0x87,0x0,0x64,0x88,0x0,0x36,0x64,0x89,0x0,0x64,0x8a,0x0,0x36,0x64,0x8b,0x0,0x64,0x8c,0x0,0x36,0x64,0x8d,0x0,0x64,0x8e,0x0,0x36,0x64,0x8f,0x0,0x64,0x90,0x0,0x36,0x64,0x91,0x0,0x64,0x92,0x0,0x36,0x64,0x93,0x0,0x64,0x94,0x0,0x36,0x64,0x95,0x0,0x64,0x96,0x0,0x36,0x64,0x97,0x0,0x64,0x98,0x0,0x36,0x64,0x99,0x0,0x64,0x9a,0x0,0x36,0x64,0x9b,0x0,0x64,0x9c,0x0,0x36,0x64,0x9d,0x0,0x64,0x9e,0x0,0x36,0x64,0x9f,0x0,0x64,0xa0,0x0,0x36,0x64,0xa1,0x0,0x64,0xa2,0x0,0x36,0x64,0xa3,0x0,0x64,0xa4,0x0,0x36,0x64,0xa5,0x0,0x64,0xa6,0x0,0x36,0x64,0xa7,0x0,0x64,0xa8,0x0,0x36,0x64,0xa9,0x0,0x64,0xaa,0x0,0x36,0x64,0xab,0x0,0x64,0xac,0x0,0x36,0x64,0xad,0x0,0x64,0xae,0x0,0x36,0x64,0xaf,0x0,0x64,0xb0,0x0,0x36,0x64,0xb1,0x0,0x64,0xb2,0x0,0x36,0x64,0xb3,0x0,0x64,0xb4,0x0,0x36,0x64,0xb5,0x0,0x64,0xb6,0x0,0x36,0x64,0xb7,0x0,0x64,0xb8,0x0,0x36,0x64,0xb9,0x0,0x64,0xba,0x0,0x36,0x64,0xbb,0x0,0x64,0xbc,0x0,0x36,0x64,0xbd,0x0,0x64,0xbe,0x0,0x36,0x64,0xbf,0x0,0x64,0xc0,0x0,0x36,0x64,0xc1,0x0,0x64,0xc2,0x0,0x36,0x64,0xc3,0x0,0x64,0xc4,0x0,0x36,0x64,0xc5,0x0,0x64,0xc6,0x0,0x36,0x64,0xc7,0x0,0x64,0xc8,0x0,0x36,0x64,0xc9,0x0,0x64,0xca,0x0,0x36,0x64,0xcb,0x0,0x64,0xcc,0x0,0x36,0x64,0xcd,0x0,0x64,0xce,0x0,0x36,0x64,0xcf,0x0,0x64,0xd0,0x0,0x36,0x64,0xd1,0x0,0x64,0xd2,0x0,0x36,0x64,0xd3,0x0,0x64,0xd4,0x0,0x36,0x64,0xd5,0x0,0x64,0xd6,0x0,0x36,0x64,0xd7,0x0,0x64,0xd8,0x0,0x36,0x64,0xd9,0x0,0x64,0xda,0x0,0x36,0x64,0xdb,0x0,0x64,0xdc,0x0,0x36,0x64,0xdd,0x0,0x64,0xde,0x0,0x36,0x64,0xdf,0x0,0x64,0xe0,0x0,0x36,0x64,0xe1,0x0,0x64,0xe2,0x0,0x36,0x64,0xe3,0x0,0x64,0xe4,0x0,0x36,0x64,0xe5,0x0,0x64,0xe6,0x0,0x36,0x64,0xe7,0x0,0x64,0xe8,0x0,0x36,0x64,0xe9,0x0,0x64,0xea,0x0,0x36,0x64,0xeb,0x0,0x64,0xec,0x0,0x36,0x64,0xed,0x0,0x64,0xee,0x0,0x36,0x64,0xef,0x0,0x64,0xf0,0x0,0x36,0x64,0xf1,0x0,0x64,0xf2,0x0,0x36,0x64,0xf3,0x0,0x64,0xf4,0x0,0x36,0x64,0xf5,0x0,0x64,0xf6,0x0,0x36,0x64,0xf7,0x0,0x64,0xf8,0x0,0x36,0x64,0xf9,0x0,0x64,0xfa,0x0,0x36,0x64,0xfb,0x0,0x64,0xfc,0x0,0x36,0x64,0xfd,0x0,0x64,0xfe,0x0,0x36,0x64,0xff,0x0,0x64,0x0,0x1,0x36,0x64,0x1,0x1,0x64,0x2,0x1,0x36,0x64,0x3,0x1,0x64,0x4,0x1,0x36,0x64,0x5,0x1,0x64,0x6,0x1,0x36,0x64,0x7,0x1,0x64,0x8,0x1,0x36,0x64,0x9,0x1,0x64,0xa,0x1,0x36,0x64,0xb,0x1,0x64,0xc,0x1,0x36,0x64,0xd,0x1,0x64,0xe,0x1,0x36,0x64,0xf,0x1,0x64,0x10,0x1,0x36,0x64,0x11,0x1,0x64,0x12,0x1,0x36,0x64,0x13,0x1,0x64,0x14,0x1,0x36,0x64,0x15,0x1,0x64,0x16,0x1,0x36,0x64,0x17,0x1,0x64,0x18,0x1,0x36,0x64,0x19,0x1,0x64,0x1a,0x1,0x36,0x64,0x1b,0x1,0x64,0x1c,0x1,0x36,0x64,0x1d,0x1,0x64,0x1e,0x1,0x36,0x64,0x1f,0x1,0x64,0x20,0x1,0x36,0x64,0x21,0x1,0x64,0x22,0x1,0x36,0x64,0x23,0x1,0x64,0x24,0x1,0x36,0x64,0x25,0x1,0x64,0x26,0x1,0x36,0x64,0x27,0x1,0x64,0x28,0x1,0x36,0x64,0x29,0x1,0x64,0x2a,0x1,0x36,0x64,0x2b,0x1,0x64,0x2c,0x1,0x36,0x64,0x2d,0x1,0x64,0x2e,0x1,0x36,0x5a,0xa,0x0,0x64,0x2f,0x1,0x84,0x0,0x0,0x5a,0xb,0x0,0x64,0x30,0x1,0x84,0x0,0x0,0x5a,0xc,0x0,0x64,0x31,0x1,0x84,0x0,0x0,0x5a,0xd,0x0,0x64,0x32,0x1,0x84,0x0,0x0,0x5a,0xe,0x0,0x64,0x33,0x1,0x84,0x0,0x0,0x5a,0xf,0x0,0x67,0x0,0x0,0x5a,0x10,0x0,0x64,0x34,0x1,0x84,0x0,0x0,0x5a,0x11,0x0,0x64,0x35,0x1,0x84,0x0,0x0,0x5a,0x12,0x0,0x64,0x36,0x1,0x84,0x0,0x0,0x5a,0x13,0x0,0x64,0x1,0x0,0x53,0x28,0x38,0x1,0x0,0x0,0x69,0xff,0xff,0xff,0xff,0x4e,0x28,0x1,0x0,0x0,0x0,0x74,0x1,0x0,0x0,0x0,0x2a,0x74,0x6,0x0,0x0,0x0,0x6c,0x6f,0x67,0x67,0x65,0x72,0x63,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x42,0x0,0x0,0x0,0x73,0x11,0x0,0x0,0x0,0x65,0x0,0x0,0x5a,0x1,0x0,0x64,0x0,0x0,0x84,0x0,0x0,0x5a,0x2,0x0,0x52,0x53,0x28,0x1,0x0,0x0,0x0,0x63,0x2,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x43,0x0,0x0,0x0,0x73,0x34,0x0,0x0,0x0,0x7c,0x1,0x0,0x6a,0x0,0x0,0x83,0x0,0x0,0x6a,0x1,0x0,0x64,0x1,0x0,0x83,0x1,0x0,0x64,0x2,0x0,0x19,0x7d,0x1,0x0,0x74,0x2,0x0,0x7c,0x1,0x0,0x83,0x1,0x0,0x1,0x74,0x3,0x0,0x6a,0x4,0x0,0x7c,0x1,0x0,0x83,0x1,0x0,0x1,0x64,0x0,0x0,0x53,0x28,0x3,0x0,0x0,0x0,0x4e,0x73,0x1,0x0,0x0,0x0,0xa,0x69,0xff,0xff,0xff,0xff,0x28,0x5,0x0,0x0,0x0,0x74,0x5,0x0,0x0,0x0,0x73,0x74,0x72,0x69,0x70,0x74,0x5,0x0,0x0,0x0,0x73,0x70,0x6c,0x69,0x74,0x74,0x4,0x0,0x0,0x0,0x72,0x65,0x70,0x72,0x74,0x3,0x0,0x0,0x0,0x74,0x70,0x74,0x74,0x3,0x0,0x0,0x0,0x6c,0x6f,0x67,0x28,0x2,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x65,0x6c,0x66,0x74,0x3,0x0,0x0,0x0,0x74,0x78,0x74,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x73,0x1b,0x0,0x0,0x0,0x2e,0x2f,0x73,0x72,0x63,0x2f,0x70,0x79,0x74,0x68,0x6f,0x6e,0x2f,0x74,0x70,0x74,0x5f,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x70,0x79,0x74,0x5,0x0,0x0,0x0,0x77,0x72,0x69,0x74,0x65,0xc,0x0,0x0,0x0,0x73,0x6,0x0,0x0,0x0,0x0,0x1,0x19,0x1,0xa,0x1,0x28,0x3,0x0,0x0,0x0,0x74,0x8,0x0,0x0,0x0,0x5f,0x5f,0x6e,0x61,0x6d,0x65,0x5f,0x5f,0x74,0xa,0x0,0x0,0x0,0x5f,0x5f,0x6d,0x6f,0x64,0x75,0x6c,0x65,0x5f,0x5f,0x52,0x9,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x73,0x1b,0x0,0x0,0x0,0x2e,0x2f,0x73,0x72,0x63,0x2f,0x70,0x79,0x74,0x68,0x6f,0x6e,0x2f,0x74,0x70,0x74,0x5f,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x70,0x79,0x52,0x1,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x73,0x2,0x0,0x0,0x0,0x6,0x1,0x69,0x0,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6e,0x6f,0x6e,0x65,0x69,0x1,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x64,0x75,0x73,0x74,0x69,0x2,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x77,0x61,0x74,0x72,0x69,0x3,0x0,0x0,0x0,0x74,0x3,0x0,0x0,0x0,0x6f,0x69,0x6c,0x69,0x4,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x66,0x69,0x72,0x65,0x69,0x5,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x74,0x6e,0x65,0x69,0x6,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6c,0x61,0x76,0x61,0x69,0x7,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x67,0x75,0x6e,0x70,0x69,0x8,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6e,0x69,0x74,0x72,0x69,0x9,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x63,0x6c,0x6e,0x65,0x69,0xa,0x0,0x0,0x0,0x74,0x3,0x0,0x0,0x0,0x67,0x61,0x73,0x69,0xb,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x6c,0x65,0x78,0x69,0xc,0x0,0x0,0x0,0x74,0x3,0x0,0x0,0x0,0x67,0x6f,0x6f,0x69,0xd,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x69,0x63,0x65,0x69,0x69,0xe,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6d,0x65,0x74,0x6c,0x69,0xf,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x70,0x72,0x6b,0x69,0x10,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x6e,0x6f,0x77,0x69,0x11,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x77,0x6f,0x6f,0x64,0x69,0x12,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6e,0x65,0x75,0x74,0x69,0x13,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x6c,0x75,0x74,0x69,0x14,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x6c,0x6e,0x74,0x69,0x15,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x61,0x63,0x69,0x64,0x69,0x16,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x76,0x6f,0x69,0x64,0x69,0x17,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x77,0x74,0x72,0x76,0x69,0x18,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x63,0x6e,0x63,0x74,0x69,0x19,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x64,0x73,0x74,0x77,0x69,0x1a,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x61,0x6c,0x74,0x69,0x1b,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x6c,0x74,0x77,0x69,0x1c,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x64,0x6d,0x6e,0x64,0x69,0x1d,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x62,0x6d,0x74,0x6c,0x69,0x1e,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x62,0x72,0x6d,0x74,0x69,0x1f,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x68,0x6f,0x74,0x69,0x20,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x75,0x72,0x61,0x6e,0x69,0x21,0x0,0x0,0x0,0x74,0x3,0x0,0x0,0x0,0x77,0x61,0x78,0x69,0x22,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6d,0x77,0x61,0x78,0x69,0x23,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x73,0x63,0x6e,0x69,0x24,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6e,0x73,0x63,0x6e,0x69,0x25,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6c,0x6e,0x74,0x67,0x69,0x26,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x69,0x6e,0x73,0x6c,0x69,0x27,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x62,0x68,0x6f,0x6c,0x69,0x28,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x77,0x68,0x6f,0x6c,0x69,0x29,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x72,0x62,0x64,0x6d,0x69,0x2a,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6c,0x72,0x62,0x64,0x69,0x2b,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6e,0x74,0x63,0x74,0x69,0x2c,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x61,0x6e,0x64,0x69,0x2d,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x67,0x6c,0x61,0x73,0x69,0x2e,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x74,0x63,0x74,0x69,0x2f,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x62,0x67,0x6c,0x61,0x69,0x30,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x74,0x68,0x64,0x72,0x69,0x31,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x6c,0x73,0x6d,0x69,0x32,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x65,0x74,0x72,0x64,0x69,0x33,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6e,0x69,0x63,0x65,0x69,0x34,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6e,0x62,0x6c,0x65,0x69,0x35,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x62,0x74,0x72,0x79,0x69,0x36,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6c,0x63,0x72,0x79,0x69,0x37,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x74,0x6b,0x6d,0x69,0x38,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x77,0x63,0x68,0x69,0x39,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x6d,0x6b,0x65,0x69,0x3a,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x64,0x65,0x73,0x6c,0x69,0x3b,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x63,0x6f,0x61,0x6c,0x69,0x3c,0x0,0x0,0x0,0x74,0x3,0x0,0x0,0x0,0x6c,0x6f,0x32,0x69,0x3d,0x0,0x0,0x0,0x74,0x2,0x0,0x0,0x0,0x6f,0x32,0x69,0x3e,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x69,0x6e,0x77,0x72,0x69,0x3f,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x79,0x65,0x73,0x74,0x69,0x40,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x64,0x79,0x73,0x74,0x69,0x41,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x74,0x68,0x72,0x6d,0x69,0x42,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x67,0x6c,0x6f,0x77,0x69,0x43,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x62,0x72,0x63,0x6b,0x69,0x44,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x68,0x66,0x6c,0x6d,0x69,0x45,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x66,0x69,0x72,0x77,0x69,0x46,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x66,0x75,0x73,0x65,0x69,0x47,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x66,0x73,0x65,0x70,0x69,0x48,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x61,0x6d,0x74,0x72,0x69,0x49,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x62,0x63,0x6f,0x6c,0x69,0x4a,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x63,0x6c,0x6e,0x69,0x4b,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x68,0x73,0x77,0x63,0x69,0x4c,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x69,0x72,0x6f,0x6e,0x69,0x4d,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6d,0x6f,0x72,0x74,0x69,0x4e,0x0,0x0,0x0,0x74,0x3,0x0,0x0,0x0,0x67,0x6f,0x6c,0x69,0x4f,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x68,0x6c,0x69,0x66,0x69,0x50,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x61,0x73,0x69,0x6d,0x69,0x51,0x0,0x0,0x0,0x74,0x3,0x0,0x0,0x0,0x32,0x78,0x32,0x69,0x52,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x64,0x61,0x6e,0x69,0x69,0x53,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x61,0x6d,0x6f,0x65,0x69,0x54,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6d,0x6f,0x76,0x65,0x69,0x55,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x67,0x6f,0x6c,0x69,0x56,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x64,0x6d,0x6f,0x65,0x69,0x57,0x0,0x0,0x0,0x74,0x2,0x0,0x0,0x0,0x33,0x34,0x69,0x58,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6c,0x6c,0x69,0x66,0x69,0x59,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x74,0x61,0x6e,0x69,0x5a,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x70,0x6e,0x67,0x69,0x5b,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x72,0x69,0x6d,0x65,0x69,0x5c,0x0,0x0,0x0,0x74,0x3,0x0,0x0,0x0,0x66,0x6f,0x67,0x69,0x5d,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x62,0x63,0x6c,0x6e,0x69,0x5e,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6c,0x6f,0x76,0x65,0x69,0x5f,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x64,0x65,0x75,0x74,0x69,0x60,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x77,0x61,0x72,0x70,0x69,0x61,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x75,0x6d,0x70,0x69,0x62,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x66,0x77,0x72,0x6b,0x69,0x63,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x69,0x70,0x65,0x69,0x64,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x66,0x72,0x7a,0x7a,0x69,0x65,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x66,0x72,0x7a,0x77,0x69,0x66,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x67,0x72,0x61,0x76,0x69,0x67,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x62,0x69,0x7a,0x72,0x69,0x68,0x0,0x0,0x0,0x74,0x5,0x0,0x0,0x0,0x62,0x69,0x7a,0x72,0x67,0x69,0x69,0x0,0x0,0x0,0x74,0x5,0x0,0x0,0x0,0x62,0x69,0x7a,0x72,0x73,0x69,0x6a,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x69,0x6e,0x73,0x74,0x69,0x6b,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x69,0x73,0x6f,0x7a,0x69,0x6c,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x69,0x73,0x7a,0x73,0x69,0x6d,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x72,0x74,0x69,0x69,0x6e,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x72,0x74,0x6f,0x69,0x6f,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x73,0x74,0x65,0x69,0x70,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x73,0x74,0x73,0x69,0x71,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x61,0x6e,0x61,0x72,0x69,0x72,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x76,0x69,0x6e,0x65,0x69,0x73,0x0,0x0,0x0,0x74,0x5,0x0,0x0,0x0,0x69,0x6e,0x76,0x69,0x73,0x69,0x74,0x0,0x0,0x0,0x74,0x8,0x0,0x0,0x0,0x65,0x71,0x75,0x61,0x6c,0x76,0x65,0x6c,0x69,0x75,0x0,0x0,0x0,0x74,0x6,0x0,0x0,0x0,0x73,0x70,0x61,0x77,0x6e,0x32,0x69,0x76,0x0,0x0,0x0,0x74,0x5,0x0,0x0,0x0,0x73,0x70,0x61,0x77,0x6e,0x69,0x77,0x0,0x0,0x0,0x74,0x5,0x0,0x0,0x0,0x73,0x68,0x6c,0x64,0x31,0x69,0x78,0x0,0x0,0x0,0x74,0x5,0x0,0x0,0x0,0x73,0x68,0x6c,0x64,0x32,0x69,0x79,0x0,0x0,0x0,0x74,0x5,0x0,0x0,0x0,0x73,0x68,0x6c,0x64,0x33,0x69,0x7a,0x0,0x0,0x0,0x74,0x5,0x0,0x0,0x0,0x73,0x68,0x6c,0x64,0x34,0x69,0x7b,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6c,0x6f,0x6c,0x7a,0x69,0x7c,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x77,0x69,0x66,0x69,0x69,0x7d,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x66,0x69,0x6c,0x74,0x69,0x7e,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x61,0x72,0x61,0x79,0x69,0x7f,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x62,0x72,0x61,0x79,0x69,0x80,0x0,0x0,0x0,0x74,0x5,0x0,0x0,0x0,0x73,0x74,0x6b,0x6d,0x32,0x69,0x81,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x62,0x6f,0x6d,0x62,0x69,0x82,0x0,0x0,0x0,0x74,0x2,0x0,0x0,0x0,0x63,0x35,0x69,0x83,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x69,0x6e,0x67,0x69,0x84,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x71,0x72,0x74,0x7a,0x69,0x85,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x70,0x71,0x72,0x74,0x69,0x86,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x65,0x65,0x64,0x69,0x87,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6d,0x61,0x7a,0x65,0x69,0x88,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x63,0x6f,0x61,0x67,0x69,0x89,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x77,0x61,0x6c,0x6c,0x69,0x8a,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x67,0x6e,0x61,0x72,0x69,0x8b,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x72,0x65,0x70,0x6c,0x69,0x8c,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6d,0x79,0x73,0x74,0x69,0x8d,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x62,0x6f,0x79,0x6c,0x69,0x8e,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x6c,0x6f,0x74,0x65,0x69,0x8f,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x66,0x72,0x67,0x32,0x69,0x90,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x74,0x61,0x72,0x69,0x91,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x66,0x72,0x6f,0x67,0x69,0x92,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x62,0x72,0x61,0x6e,0x69,0x93,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x77,0x69,0x6e,0x64,0x69,0x94,0x0,0x0,0x0,0x74,0x3,0x0,0x0,0x0,0x6e,0x75,0x6d,0x63,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x43,0x0,0x0,0x0,0x73,0x4,0x0,0x0,0x0,0x64,0x0,0x0,0x53,0x28,0x1,0x0,0x0,0x0,0x4e,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x73,0x1b,0x0,0x0,0x0,0x2e,0x2f,0x73,0x72,0x63,0x2f,0x70,0x79,0x74,0x68,0x6f,0x6e,0x2f,0x74,0x70,0x74,0x5f,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x70,0x79,0x74,0xc,0x0,0x0,0x0,0x66,0x6f,0x72,0x6b,0x5f,0x75,0x6e,0x62,0x6c,0x6f,0x63,0x6b,0x2e,0x0,0x0,0x0,0x73,0x2,0x0,0x0,0x0,0x0,0x1,0x63,0x1,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x43,0x0,0x0,0x0,0x73,0x2a,0x0,0x0,0x0,0x74,0x0,0x0,0x6a,0x1,0x0,0x83,0x0,0x0,0x1,0x74,0x0,0x0,0x6a,0x2,0x0,0x83,0x0,0x0,0x7d,0x1,0x0,0x74,0x3,0x0,0x6a,0x4,0x0,0x6a,0x5,0x0,0x7c,0x1,0x0,0x83,0x1,0x0,0x1,0x64,0x0,0x0,0x53,0x28,0x1,0x0,0x0,0x0,0x4e,0x28,0x6,0x0,0x0,0x0,0x74,0x9,0x0,0x0,0x0,0x74,0x72,0x61,0x63,0x65,0x62,0x61,0x63,0x6b,0x74,0x9,0x0,0x0,0x0,0x70,0x72,0x69,0x6e,0x74,0x5f,0x65,0x78,0x63,0x74,0xa,0x0,0x0,0x0,0x66,0x6f,0x72,0x6d,0x61,0x74,0x5f,0x65,0x78,0x63,0x74,0x3,0x0,0x0,0x0,0x73,0x79,0x73,0x74,0x6,0x0,0x0,0x0,0x73,0x74,0x64,0x6f,0x75,0x74,0x52,0x9,0x0,0x0,0x0,0x28,0x2,0x0,0x0,0x0,0x74,0x2,0x0,0x0,0x0,0x65,0x78,0x74,0x3,0x0,0x0,0x0,0x65,0x72,0x72,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x73,0x1b,0x0,0x0,0x0,0x2e,0x2f,0x73,0x72,0x63,0x2f,0x70,0x79,0x74,0x68,0x6f,0x6e,0x2f,0x74,0x70,0x74,0x5f,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x70,0x79,0x74,0x5,0x0,0x0,0x0,0x65,0x72,0x72,0x6f,0x72,0x30,0x0,0x0,0x0,0x73,0x6,0x0,0x0,0x0,0x0,0x1,0xa,0x1,0xc,0x1,0x63,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x43,0x0,0x0,0x0,0x73,0x19,0x0,0x0,0x0,0x74,0x0,0x0,0x83,0x0,0x0,0x74,0x1,0x0,0x5f,0x2,0x0,0x64,0x1,0x0,0x74,0x1,0x0,0x5f,0x3,0x0,0x64,0x2,0x0,0x53,0x28,0x3,0x0,0x0,0x0,0x73,0xde,0x0,0x0,0x0,0x63,0x6f,0x70,0x79,0x3d,0x5b,0x22,0x5f,0x5f,0x62,0x75,0x69,0x6c,0x74,0x69,0x6e,0x73,0x5f,0x5f,0x22,0x2c,0x22,0x5f,0x5f,0x6e,0x61,0x6d,0x65,0x5f,0x5f,0x22,0x2c,0x22,0x5f,0x5f,0x64,0x6f,0x63,0x5f,0x5f,0x22,0x2c,0x22,0x5f,0x5f,0x70,0x61,0x63,0x6b,0x61,0x67,0x65,0x5f,0x5f,0x22,0x2c,0x27,0x74,0x70,0x74,0x27,0x2c,0x27,0x63,0x6c,0x65,0x61,0x6e,0x27,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x27,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x27,0x2c,0x27,0x66,0x6f,0x72,0x6b,0x27,0x2c,0x27,0x5f,0x66,0x6f,0x72,0x6b,0x27,0x2c,0x27,0x66,0x6f,0x72,0x6b,0x5f,0x73,0x74,0x61,0x74,0x75,0x73,0x27,0x2c,0x27,0x66,0x6f,0x72,0x6b,0x5f,0x75,0x6e,0x62,0x6c,0x6f,0x63,0x6b,0x27,0x2c,0x27,0x73,0x79,0x73,0x27,0x5d,0xa,0x20,0x20,0x20,0x20,0x68,0x61,0x6e,0x64,0x6c,0x65,0x2e,0x67,0x6c,0x6f,0x62,0x3d,0x7b,0x7d,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x69,0x74,0x65,0x6d,0x20,0x69,0x6e,0x20,0x63,0x6f,0x70,0x79,0x3a,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x61,0x6e,0x64,0x6c,0x65,0x2e,0x67,0x6c,0x6f,0x62,0x5b,0x69,0x74,0x65,0x6d,0x5d,0x3d,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x73,0x28,0x29,0x5b,0x69,0x74,0x65,0x6d,0x5d,0x74,0x0,0x0,0x0,0x0,0x4e,0x28,0x4,0x0,0x0,0x0,0x74,0x7,0x0,0x0,0x0,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x73,0x74,0x6,0x0,0x0,0x0,0x68,0x61,0x6e,0x64,0x6c,0x65,0x74,0x4,0x0,0x0,0x0,0x67,0x6c,0x6f,0x62,0x74,0x3,0x0,0x0,0x0,0x62,0x75,0x66,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x73,0x1b,0x0,0x0,0x0,0x2e,0x2f,0x73,0x72,0x63,0x2f,0x70,0x79,0x74,0x68,0x6f,0x6e,0x2f,0x74,0x70,0x74,0x5f,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x70,0x79,0x74,0x5,0x0,0x0,0x0,0x63,0x6c,0x65,0x61,0x6e,0x35,0x0,0x0,0x0,0x73,0x4,0x0,0x0,0x0,0x0,0x7,0xc,0x1,0x63,0x1,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x43,0x0,0x0,0x0,0x73,0x50,0x0,0x0,0x0,0x79,0xd,0x0,0x74,0x0,0x0,0x6a,0x1,0x0,0x7d,0x1,0x0,0x57,0x6e,0xe,0x0,0x1,0x1,0x1,0x74,0x2,0x0,0x83,0x0,0x0,0x1,0x6e,0x1,0x0,0x58,0x79,0xe,0x0,0x74,0x3,0x0,0x7c,0x0,0x0,0x83,0x1,0x0,0x1,0x57,0x6e,0x1d,0x0,0x4,0x74,0x4,0x0,0x6b,0xa,0x0,0x72,0x4b,0x0,0x1,0x7d,0x2,0x0,0x1,0x74,0x5,0x0,0x7c,0x2,0x0,0x83,0x1,0x0,0x1,0x6e,0x1,0x0,0x58,0x64,0x0,0x0,0x53,0x28,0x1,0x0,0x0,0x0,0x4e,0x28,0x6,0x0,0x0,0x0,0x52,0xac,0x0,0x0,0x0,0x52,0xad,0x0,0x0,0x0,0x52,0xaf,0x0,0x0,0x0,0x74,0x7,0x0,0x0,0x0,0x5f,0x68,0x61,0x6e,0x64,0x6c,0x65,0x74,0x9,0x0,0x0,0x0,0x45,0x78,0x63,0x65,0x70,0x74,0x69,0x6f,0x6e,0x52,0xa9,0x0,0x0,0x0,0x28,0x3,0x0,0x0,0x0,0x52,0x8,0x0,0x0,0x0,0x74,0x1,0x0,0x0,0x0,0x61,0x52,0xa7,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x73,0x1b,0x0,0x0,0x0,0x2e,0x2f,0x73,0x72,0x63,0x2f,0x70,0x79,0x74,0x68,0x6f,0x6e,0x2f,0x74,0x70,0x74,0x5f,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x70,0x79,0x52,0xac,0x0,0x0,0x0,0x3f,0x0,0x0,0x0,0x73,0x10,0x0,0x0,0x0,0x0,0x1,0x3,0x1,0xd,0x1,0x3,0x1,0xb,0x1,0x3,0x1,0xe,0x1,0xf,0x1,0x63,0x1,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x5,0x0,0x0,0x0,0x42,0x0,0x0,0x0,0x73,0x63,0x0,0x0,0x0,0x79,0x26,0x0,0x65,0x0,0x0,0x6a,0x1,0x0,0x6a,0x2,0x0,0x65,0x3,0x0,0x65,0x4,0x0,0x7c,0x0,0x0,0x65,0x5,0x0,0x6a,0x6,0x0,0x83,0x2,0x0,0x83,0x1,0x0,0x83,0x1,0x0,0x1,0x57,0x6e,0x36,0x0,0x1,0x1,0x1,0x79,0xf,0x0,0x7c,0x0,0x0,0x65,0x5,0x0,0x6a,0x6,0x0,0x4,0x55,0x57,0x71,0x5f,0x0,0x4,0x65,0x7,0x0,0x6b,0xa,0x0,0x72,0x5a,0x0,0x1,0x7d,0x1,0x0,0x1,0x65,0x8,0x0,0x7c,0x1,0x0,0x83,0x1,0x0,0x1,0x71,0x5f,0x0,0x58,0x6e,0x1,0x0,0x58,0x64,0x0,0x0,0x53,0x28,0x1,0x0,0x0,0x0,0x4e,0x28,0x9,0x0,0x0,0x0,0x52,0xa5,0x0,0x0,0x0,0x52,0xa6,0x0,0x0,0x0,0x52,0x9,0x0,0x0,0x0,0x52,0x4,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x65,0x76,0x61,0x6c,0x52,0xac,0x0,0x0,0x0,0x52,0xad,0x0,0x0,0x0,0x52,0xb1,0x0,0x0,0x0,0x52,0xa9,0x0,0x0,0x0,0x28,0x2,0x0,0x0,0x0,0x52,0x8,0x0,0x0,0x0,0x52,0xa7,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x73,0x1b,0x0,0x0,0x0,0x2e,0x2f,0x73,0x72,0x63,0x2f,0x70,0x79,0x74,0x68,0x6f,0x6e,0x2f,0x74,0x70,0x74,0x5f,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x70,0x79,0x52,0xb0,0x0,0x0,0x0,0x49,0x0,0x0,0x0,0x73,0xe,0x0,0x0,0x0,0x0,0x2,0x3,0x1,0x26,0x1,0x3,0x1,0x3,0x1,0xf,0x1,0xf,0x1,0x63,0x1,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x43,0x0,0x0,0x0,0x73,0x27,0x0,0x0,0x0,0x74,0x0,0x0,0x7c,0x0,0x0,0x83,0x1,0x0,0x7d,0x1,0x0,0x7c,0x1,0x0,0x6a,0x1,0x0,0x83,0x0,0x0,0x1,0x74,0x2,0x0,0x6a,0x3,0x0,0x7c,0x1,0x0,0x83,0x1,0x0,0x1,0x64,0x0,0x0,0x53,0x28,0x1,0x0,0x0,0x0,0x4e,0x28,0x4,0x0,0x0,0x0,0x74,0xa,0x0,0x0,0x0,0x5f,0x5f,0x69,0x6d,0x70,0x6f,0x72,0x74,0x5f,0x5f,0x74,0x4,0x0,0x0,0x0,0x69,0x6e,0x69,0x74,0x74,0xb,0x0,0x0,0x0,0x5f,0x65,0x78,0x74,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0x74,0x6,0x0,0x0,0x0,0x61,0x70,0x70,0x65,0x6e,0x64,0x28,0x2,0x0,0x0,0x0,0x74,0x5,0x0,0x0,0x0,0x66,0x6e,0x61,0x6d,0x65,0x74,0x3,0x0,0x0,0x0,0x65,0x78,0x74,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x73,0x1b,0x0,0x0,0x0,0x2e,0x2f,0x73,0x72,0x63,0x2f,0x70,0x79,0x74,0x68,0x6f,0x6e,0x2f,0x74,0x70,0x74,0x5f,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x70,0x79,0x74,0x7,0x0,0x0,0x0,0x6c,0x6f,0x61,0x64,0x65,0x78,0x74,0x55,0x0,0x0,0x0,0x73,0x6,0x0,0x0,0x0,0x0,0x1,0xc,0x1,0xa,0x1,0x63,0x1,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x43,0x0,0x0,0x0,0x73,0x81,0x0,0x0,0x0,0x67,0x0,0x0,0x7d,0x1,0x0,0x78,0x4c,0x0,0x74,0x0,0x0,0x44,0x5d,0x44,0x0,0x7d,0x2,0x0,0x79,0x11,0x0,0x7c,0x2,0x0,0x6a,0x1,0x0,0x7c,0x0,0x0,0x83,0x1,0x0,0x1,0x57,0x71,0xd,0x0,0x4,0x74,0x2,0x0,0x6b,0xa,0x0,0x72,0x50,0x0,0x1,0x7d,0x3,0x0,0x1,0x74,0x3,0x0,0x7c,0x3,0x0,0x83,0x1,0x0,0x1,0x7c,0x1,0x0,0x6a,0x4,0x0,0x7c,0x2,0x0,0x83,0x1,0x0,0x1,0x71,0xd,0x0,0x58,0x71,0xd,0x0,0x57,0x78,0x25,0x0,0x7c,0x1,0x0,0x44,0x5d,0x1d,0x0,0x7d,0x2,0x0,0x7c,0x2,0x0,0x6a,0x5,0x0,0x83,0x0,0x0,0x1,0x74,0x0,0x0,0x6a,0x6,0x0,0x7c,0x2,0x0,0x83,0x1,0x0,0x1,0x71,0x5c,0x0,0x57,0x64,0x0,0x0,0x53,0x28,0x1,0x0,0x0,0x0,0x4e,0x28,0x7,0x0,0x0,0x0,0x52,0xb6,0x0,0x0,0x0,0x74,0x3,0x0,0x0,0x0,0x6b,0x65,0x79,0x52,0xb1,0x0,0x0,0x0,0x52,0xa9,0x0,0x0,0x0,0x52,0xb7,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x65,0x78,0x69,0x74,0x74,0x6,0x0,0x0,0x0,0x72,0x65,0x6d,0x6f,0x76,0x65,0x28,0x4,0x0,0x0,0x0,0x52,0xbb,0x0,0x0,0x0,0x74,0x6,0x0,0x0,0x0,0x75,0x6e,0x6c,0x6f,0x61,0x64,0x74,0x4,0x0,0x0,0x0,0x69,0x74,0x65,0x6d,0x52,0xa7,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x73,0x1b,0x0,0x0,0x0,0x2e,0x2f,0x73,0x72,0x63,0x2f,0x70,0x79,0x74,0x68,0x6f,0x6e,0x2f,0x74,0x70,0x74,0x5f,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x70,0x79,0x74,0x8,0x0,0x0,0x0,0x6b,0x65,0x79,0x70,0x72,0x65,0x73,0x73,0x5a,0x0,0x0,0x0,0x73,0x14,0x0,0x0,0x0,0x0,0x1,0x6,0x1,0xd,0x1,0x3,0x1,0x11,0x1,0xf,0x1,0xa,0x1,0x15,0x1,0xd,0x1,0xa,0x1,0x63,0x0,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x43,0x0,0x0,0x0,0x73,0xa2,0x0,0x0,0x0,0x67,0x0,0x0,0x7d,0x0,0x0,0x78,0x49,0x0,0x74,0x0,0x0,0x44,0x5d,0x41,0x0,0x7d,0x1,0x0,0x79,0xe,0x0,0x7c,0x1,0x0,0x6a,0x1,0x0,0x83,0x0,0x0,0x1,0x57,0x71,0xd,0x0,0x4,0x74,0x2,0x0,0x6b,0xa,0x0,0x72,0x4d,0x0,0x1,0x7d,0x2,0x0,0x1,0x74,0x3,0x0,0x7c,0x2,0x0,0x83,0x1,0x0,0x1,0x7c,0x0,0x0,0x6a,0x4,0x0,0x7c,0x1,0x0,0x83,0x1,0x0,0x1,0x71,0xd,0x0,0x58,0x71,0xd,0x0,0x57,0x78,0x49,0x0,0x7c,0x0,0x0,0x44,0x5d,0x41,0x0,0x7d,0x1,0x0,0x79,0xe,0x0,0x7c,0x1,0x0,0x6a,0x5,0x0,0x83,0x0,0x0,0x1,0x57,0x6e,0x1d,0x0,0x4,0x74,0x2,0x0,0x6b,0xa,0x0,0x72,0x8c,0x0,0x1,0x7d,0x2,0x0,0x1,0x74,0x3,0x0,0x7c,0x2,0x0,0x83,0x1,0x0,0x1,0x6e,0x1,0x0,0x58,0x74,0x0,0x0,0x6a,0x6,0x0,0x7c,0x1,0x0,0x83,0x1,0x0,0x1,0x71,0x59,0x0,0x57,0x64,0x0,0x0,0x53,0x28,0x1,0x0,0x0,0x0,0x4e,0x28,0x7,0x0,0x0,0x0,0x52,0xb6,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x73,0x74,0x65,0x70,0x52,0xb1,0x0,0x0,0x0,0x52,0xa9,0x0,0x0,0x0,0x52,0xb7,0x0,0x0,0x0,0x52,0xbc,0x0,0x0,0x0,0x52,0xbd,0x0,0x0,0x0,0x28,0x3,0x0,0x0,0x0,0x52,0xbe,0x0,0x0,0x0,0x52,0xbf,0x0,0x0,0x0,0x52,0xa7,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x73,0x1b,0x0,0x0,0x0,0x2e,0x2f,0x73,0x72,0x63,0x2f,0x70,0x79,0x74,0x68,0x6f,0x6e,0x2f,0x74,0x70,0x74,0x5f,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x70,0x79,0x52,0xc1,0x0,0x0,0x0,0x67,0x0,0x0,0x0,0x73,0x1a,0x0,0x0,0x0,0x0,0x1,0x6,0x1,0xd,0x1,0x3,0x1,0xe,0x1,0xf,0x1,0xa,0x1,0x15,0x1,0xd,0x1,0x3,0x1,0xe,0x1,0xf,0x1,0xe,0x1,0x28,0x0,0x0,0x0,0x0,0x28,0x14,0x0,0x0,0x0,0x52,0x5,0x0,0x0,0x0,0x52,0xa5,0x0,0x0,0x0,0x74,0x4,0x0,0x0,0x0,0x63,0x6f,0x64,0x65,0x74,0x6,0x0,0x0,0x0,0x63,0x74,0x79,0x70,0x65,0x73,0x52,0xa2,0x0,0x0,0x0,0x74,0x5,0x0,0x0,0x0,0x46,0x61,0x6c,0x73,0x65,0x74,0x5,0x0,0x0,0x0,0x44,0x45,0x42,0x55,0x47,0x52,0x1,0x0,0x0,0x0,0x52,0xa6,0x0,0x0,0x0,0x74,0x6,0x0,0x0,0x0,0x73,0x74,0x64,0x65,0x72,0x72,0x74,0x7,0x0,0x0,0x0,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x52,0xa1,0x0,0x0,0x0,0x52,0xa9,0x0,0x0,0x0,0x52,0xaf,0x0,0x0,0x0,0x52,0xac,0x0,0x0,0x0,0x52,0xb0,0x0,0x0,0x0,0x52,0xb6,0x0,0x0,0x0,0x52,0xba,0x0,0x0,0x0,0x52,0xc0,0x0,0x0,0x0,0x52,0xc1,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x0,0x73,0x1b,0x0,0x0,0x0,0x2e,0x2f,0x73,0x72,0x63,0x2f,0x70,0x79,0x74,0x68,0x6f,0x6e,0x2f,0x74,0x70,0x74,0x5f,0x63,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x2e,0x70,0x79,0x74,0x8,0x0,0x0,0x0,0x3c,0x6d,0x6f,0x64,0x75,0x6c,0x65,0x3e,0x1,0x0,0x0,0x0,0x73,0x54,0x0,0x0,0x0,0xc,0x1,0xa,0x1,0xc,0x1,0xc,0x1,0xc,0x1,0xc,0x1,0x6,0x4,0x13,0x5,0xc,0x1,0xc,0x1,0xf,0x3,0x3b,0x1,0x38,0x1,0x31,0x1,0x31,0x1,0x31,0x1,0x31,0x1,0x31,0x1,0x31,0x1,0x31,0x1,0x31,0x1,0x31,0x1,0x31,0x1,0x31,0x1,0x31,0x1,0x2a,0x1,0x2a,0x1,0x2a,0x1,0x2a,0x1,0x2a,0x1,0x2a,0x1,0x2a,0x1,0x2a,0x1,0xa,0x3,0x9,0x2,0x9,0x5,0x9,0xa,0x9,0xa,0x9,0xb,0x6,0x1,0x9,0x5,0x9,0xd}; \ No newline at end of file diff --git a/src/elements/prto.c b/src/elements/prto.c index 5bf6efef5..fbbd5a13f 100644 --- a/src/elements/prto.c +++ b/src/elements/prto.c @@ -6,8 +6,8 @@ int update_PRTO(UPDATE_FUNC_ARGS) { parts[i].tmp = (int)((parts[i].temp-73.15f)/100+1); if (parts[i].tmp>=CHANNELS) parts[i].tmp = CHANNELS-1; else if (parts[i].tmp<0) parts[i].tmp = 0; - for (rx=-1; rx<2; rx++) - for (ry=-1; ry<2; ry++) + for (rx=1; rx>-2; rx--) + for (ry=1; ry>-2; ry--) if (x+rx>=0 && y+ry>0 && x+rxprev_command = last_command2; + currentcommand2->command = mystrdup(error); + last_command2 = currentcommand2; + + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + cc = 0; while(cc < 80){ fillrect(old_buf, -1, -1+cc, XRES+BARSIZE, 2, 0, 0, 0, 160-(cc*2)); @@ -3900,8 +3912,7 @@ char *console_ui(pixel *vid_buf,char error[255]) { //TODO: error messages, show memcpy(vid_buf,old_buf,(XRES+BARSIZE)*YRES*PIXELSIZE); draw_line(vid_buf, 0, 219, XRES+BARSIZE-1, 219, 228, 228, 228, XRES+BARSIZE); - drawtext(vid_buf, 15, 15, "Welcome to The Powder Toy console v.3 (by cracker64)\n" - "Current commands are quit, set, reset, load, create, file, kill, sound\n" //TODO: help command + drawtext(vid_buf, 15, 15, "Welcome to The Powder Toy console v.3 (by cracker64, python by Doxin)" //TODO: help command ,255, 255, 255, 255); cc = 0; @@ -3926,11 +3937,35 @@ char *console_ui(pixel *vid_buf,char error[255]) { //TODO: error messages, show break; } } + cc = 0; + currentcommand2 = last_command2; + while(cc < 10) + { + if(currentcommand2==NULL) + break; + drawtext(vid_buf, 215, 175-(cc*12), currentcommand2->command, 255, 225, 225, 255); + if(currentcommand2->prev_command!=NULL) + { + if(cc<9) { + currentcommand2 = currentcommand2->prev_command; + } else if(currentcommand2->prev_command!=NULL) { + free(currentcommand2->prev_command); + currentcommand2->prev_command = NULL; + } + cc++; + } + else + { + break; + } + } - if(error && ed.str[0]=='\0') - drawtext(vid_buf, 20, 207, error, 255, 127, 127, 200); - - drawtext(vid_buf, 5, 207, ">", 255, 255, 255, 240); + //if(error && ed.str[0]=='\0') + //drawtext(vid_buf, 20, 207, error, 255, 127, 127, 200); + if(console_more==0) + drawtext(vid_buf, 5, 207, ">", 255, 255, 255, 240); + else + drawtext(vid_buf, 5, 207, "...", 255, 255, 255, 240); ui_edit_draw(vid_buf, &ed); ui_edit_process(mx, my, b, &ed); @@ -3943,12 +3978,14 @@ char *console_ui(pixel *vid_buf,char error[255]) { //TODO: error messages, show currentcommand->command = mystrdup(ed.str); last_command = currentcommand; free(old_buf); + SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL); return currentcommand->command; } if (sdl_key==SDLK_ESCAPE || sdl_key==SDLK_BACKQUOTE) { console_mode = 0; free(old_buf); + SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL); return NULL; } if(sdl_key==SDLK_UP || sdl_key==SDLK_DOWN) @@ -3985,6 +4022,7 @@ char *console_ui(pixel *vid_buf,char error[255]) { //TODO: error messages, show } console_mode = 0; free(old_buf); + SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL); return NULL; } diff --git a/src/main.c b/src/main.c index 2602cfcff..fe8496dee 100644 --- a/src/main.c +++ b/src/main.c @@ -1,12 +1,13 @@ /** * Powder Toy - Main source * - * Copyright (c) 2008 - 2010 Stanislaw Skowronek. - * Copyright (c) 2010 Simon Robertshaw - * Copyright (c) 2010 Skresanov Savely - * Copyright (c) 2010 Bryan Hoyle - * Copyright (c) 2010 Nathan Cousins - * Copyright (c) 2010 cracker64 + * Copyright (c) 2008 - 2011 Stanislaw Skowronek. + * Copyright (c) 2010 - 2011 Simon Robertshaw + * Copyright (c) 2010 - 2011 Skresanov Savely + * Copyright (c) 2010 - 2011 Bryan Hoyle + * Copyright (c) 2010 - 2011 Nathan Cousins + * Copyright (c) 2010 - 2011 cracker64 + * Copyright (c) 2011 jacksonmj * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +24,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +#include + +#ifdef PYCONSOLE +#include "Python.h" +#include "pyconsole.h" +#endif + #include #include #include @@ -41,7 +49,6 @@ #include #include -#include #include #include #include @@ -52,6 +59,8 @@ #include #include +pixel *vid_buf; + #define NUM_SOUNDS 2 struct sample { Uint8 *data; @@ -158,6 +167,7 @@ float mheat = 0.0f; int do_open = 0; int sys_pause = 0; +int sys_shortcuts = 1; int legacy_enable = 0; //Used to disable new features such as heat, will be set by commandline or save. int death = 0, framerender = 0; int amd = 1; @@ -1183,6 +1193,746 @@ char my_uri[] = "http://" SERVER "/Update.api?Action=Download&Architecture=" "SSE" #endif ; + + +char console_error[255] = ""; + +#ifdef PYCONSOLE +/* + * PYTHON FUNCTIONS + * instructions on making a function callable from python: + * first you make a function that accepts (PyObject *self, PyObject *args) as arguments + * then you use PyArg_ParseTuple to parse the arguments, handle everything the function should do. + * register the function by adding a line to static PyMethodDef EmbMethods[] = { + * the line should look like this: + * {"PyFunctionname", Functionname, METH_VARARGS,"short help string"}, + * for more information on the PyWhatever functions look here: + * http://docs.python.org/extending/extending.html + */ + +//functions callable from python: + +static PyObject* +emb_create(PyObject *self, PyObject *args, PyObject *keywds) +{ + int x,y,t; + char *name = ""; + char *kwlist[] = {"x","y","t","name", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "II|Is:create",kwlist, &x,&y,&t,&name)) + return NULL; + // + if(strcmp(name,"")!=0) + console_parse_type(name, &t, console_error); + return Py_BuildValue("i",create_part(-1,x,y,t)); +} +//sys_pause = !sys_pause +emb_pause(PyObject *self, PyObject *args) +{ + int x,y,t; + if(!PyArg_ParseTuple(args, ":unpause")) + return NULL; + // + sys_pause=1; + return Py_BuildValue("i",1); +} + +emb_unpause(PyObject *self, PyObject *args) +{ + int x,y,t; + if(!PyArg_ParseTuple(args, ":pause")) + return NULL; + // + sys_pause=0; + return Py_BuildValue("i",1); +} + +emb_toggle_pause(PyObject *self, PyObject *args) +{ + int x,y,t; + if(!PyArg_ParseTuple(args, ":toggle_pause")) + return NULL; + // + sys_pause=!sys_pause; + return Py_BuildValue("i",1); +} + +//console_mode + +emb_toggle_console(PyObject *self, PyObject *args) +{ + int x,y,t; + if(!PyArg_ParseTuple(args, ":toggle_console")) + return NULL; + // + console_mode=!console_mode; + return Py_BuildValue("i",1); +} + +emb_open_console(PyObject *self, PyObject *args) +{ + int x,y,t; + if(!PyArg_ParseTuple(args, ":toggle_console")) + return NULL; + // + console_mode=1; + return Py_BuildValue("i",1); +} + +emb_close_console(PyObject *self, PyObject *args) +{ + int x,y,t; + if(!PyArg_ParseTuple(args, ":toggle_console")) + return NULL; + // + console_mode=0; + return Py_BuildValue("i",1); +} + + +emb_log(PyObject *self, PyObject *args) +{ + char *buffer; + if(!PyArg_ParseTuple(args, "s:log",&buffer)) + return NULL; + // + strcpy(console_error,buffer); + puts(buffer); + return Py_BuildValue("i",1); +} + +char console_more=0; + +emb_console_more(PyObject *self, PyObject *args) +{ + if(!PyArg_ParseTuple(args, ":log")) + return NULL; + // + console_more=1; + return Py_BuildValue("i",1); +} + +emb_console_less(PyObject *self, PyObject *args) +{ + if(!PyArg_ParseTuple(args, ":log")) + return NULL; + // + console_more=0; + return Py_BuildValue("i",1); +} + +//drawtext(vid_buf, 15, 175-(cc*12), currentcommand->command, 255, 255, 255, 255); + + +emb_reset_pressure(PyObject *self, PyObject *args) +{ + if(!PyArg_ParseTuple(args, ":reset_pressure")) + return NULL; + // + for (int nx = 0; nx=0 && x=0 && y>8].type != PT_NONE) + parts[pmap[y][x]>>8].life = life; + } + return Py_BuildValue("i",1); +} + +emb_set_type(PyObject *self, PyObject *args, PyObject *keywds) +{ + int i = -1,life,j=-1,x=-1,y=-1; + char *name = ""; + char *type = ""; + char *kwlist[] = {"setto", "settoint", "setfrom", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "|sIsIII:set_type",kwlist ,&type,&life,&name,&i,&x,&y)) + return NULL; + // + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1 && j==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + console_parse_type(type, &life, console_error); + if(strcmp(name,"all")==0) + { + for(i=0; i=0 && x=0 && y>8].type != PT_NONE) + parts[pmap[y][x]>>8].type = life; + } + return Py_BuildValue("i",1); +} + +emb_set_temp(PyObject *self, PyObject *args, PyObject *keywds) +{ + int i = -1,life,j,x=-1,y=-1; + char *name = ""; + char *kwlist[] = {"setto", "setfrom", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "I|sIII:set_type",kwlist ,&life,&name,&i,&x,&y)) + return NULL; + // + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + if(strcmp(name,"all")==0) + { + for(i=0; i=0 && x=0 && y>8].type != PT_NONE) + parts[pmap[y][x]>>8].temp = life; + } + return Py_BuildValue("i",1); +} + +emb_set_tmp(PyObject *self, PyObject *args, PyObject *keywds) +{ + int i = -1,life,j,x=-1,y=-1; + char *name = ""; + char *kwlist[] = {"setto", "setfrom", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "I|sIII:set_type",kwlist ,&life,&name,&i,&x,&y)) + return NULL; + // + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + if(strcmp(name,"all")==0) + { + for(i=0; i=0 && x=0 && y>8].type != PT_NONE) + parts[pmap[y][x]>>8].tmp = life; + } + return Py_BuildValue("i",1); +} + +emb_set_x(PyObject *self, PyObject *args, PyObject *keywds) +{ + int i = -1,life,j,x=-1,y=-1; + char *name = ""; + char *type = ""; + char *kwlist[] = {"setto", "setfrom", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "I|sIII:set_type",kwlist ,&life,&name,&i,&x,&y)) + return NULL; + // + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + if(strcmp(name,"all")==0) + { + for(i=0; i=0 && x=0 && y>8].type != PT_NONE) + parts[pmap[y][x]>>8].x = life; + } + return Py_BuildValue("i",1); +} + +emb_set_y(PyObject *self, PyObject *args, PyObject *keywds) +{ + int i = -1,life,j,x=-1,y=-1; + char *name = ""; + char *kwlist[] = {"setto", "setfrom", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "I|sIII:set_type",kwlist ,&life,&name,&i,&x,&y)) + return NULL; + // + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + if(strcmp(name,"all")==0) + { + for(i=0; i=0 && x=0 && y>8].type != PT_NONE) + parts[pmap[y][x]>>8].y = life; + } + return Py_BuildValue("i",1); +} + +emb_set_ctype(PyObject *self, PyObject *args, PyObject *keywds) +{ + int i = -1,life,j,x=-1,y=-1; + char *name = ""; + char *type = ""; + char *kwlist[] = {"setto", "toctypeint", "setfrom", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "s|IsIII:set_type",kwlist ,&type, &life, &name,&i,&x,&y)) + return NULL; + // + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + if(!life) + console_parse_type(type, &life, console_error); + if(strcmp(name,"all")==0) + { + for(i=0; i=0 && x=0 && y>8].type != PT_NONE) + parts[pmap[y][x]>>8].ctype = life; + } + return Py_BuildValue("i",1); +} + +emb_set_vx(PyObject *self, PyObject *args, PyObject *keywds) +{ + int i = -1,life,j,x=-1,y=-1; + char *name = ""; + char *kwlist[] = {"setto", "setfrom", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "I|sIII:set_type",kwlist ,&life,&name,&i,&x,&y)) + return NULL; + // + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + if(strcmp(name,"all")==0) + { + for(i=0; i=0 && x=0 && y>8].type != PT_NONE) + parts[pmap[y][x]>>8].vx = life; + } + return Py_BuildValue("i",1); +} + +emb_set_vy(PyObject *self, PyObject *args, PyObject *keywds) +{ + int i = -1,life,j,x=-1,y=-1; + char *name = ""; + char *kwlist[] = {"setto", "setfrom", "i", "x", "y", NULL}; + if(!PyArg_ParseTupleAndKeywords(args, keywds, "I|sIII:set_type",kwlist ,&life,&name,&i,&x,&y)) + return NULL; + // + if(strcmp(name,"")==0 && x==-1 && y==-1 && i==-1) + return Py_BuildValue("s","Need more args(coords,i,or a particle name)"); + if(strcmp(name,"all")==0) + { + for(i=0; i=0 && x=0 && y>8].type != PT_NONE) + parts[pmap[y][x]>>8].vy = life; + } + return Py_BuildValue("i",1); +} +emb_get_pmap(PyObject *self, PyObject *args) +{ + int x,y; + if(!PyArg_ParseTuple(args, "II:get_pmap",&x,&y)) + return NULL; + // + if(x<0 || y<0 || x>=XRES || y>=YRES) + return Py_BuildValue("i",-1); + + return Py_BuildValue("I",pmap[y][x]); +} +emb_get_prop(PyObject *self, PyObject *args) +{ + int i; + char *prop = ""; + if(!PyArg_ParseTuple(args, "Is:get_pmap",&i,&prop)) + return NULL; + // + if(parts[i].type) + { + if(strcmp(prop,"type")==0) + return Py_BuildValue("i",parts[i].type); + if(strcmp(prop,"life")==0) + return Py_BuildValue("i",parts[i].life); + if(strcmp(prop,"ctype")==0) + return Py_BuildValue("i",parts[i].ctype); + if(strcmp(prop,"temp")==0) + return Py_BuildValue("i",parts[i].temp); + if(strcmp(prop,"tmp")==0) + return Py_BuildValue("i",parts[i].tmp); + if(strcmp(prop,"vy")==0) + return Py_BuildValue("f",parts[i].vy); + if(strcmp(prop,"vx")==0) + return Py_BuildValue("f",parts[i].vx); + if(strcmp(prop,"x")==0) + return Py_BuildValue("i",parts[i].x); + if(strcmp(prop,"y")==0) + return Py_BuildValue("i",parts[i].y); + } + + return Py_BuildValue("i",-1); +} + +emb_draw_pixel(PyObject *self, PyObject *args) +{ + int x,y,r,g,b,a; + a=255; + if(!PyArg_ParseTuple(args, "IIIII|I:draw_pixel",&x,&y,&r,&g,&b,&a)) + return NULL; + + if(vid_buf!=NULL) + { + drawpixel(vid_buf,x,y,r,g,b,a); + return Py_BuildValue("i",1); + } + return Py_BuildValue("i",-1); + +} + +//drawtext(pixel *vid, int x, int y, const char *s, int r, int g, int b, int a) +emb_draw_text(PyObject *self, PyObject *args) +{ + int x,y,r,g,b,a; + char *txt; + a=255; + if(!PyArg_ParseTuple(args, "IIsIII|I:draw_text",&x,&y,&txt,&r,&g,&b,&a)) + return NULL; + if(vid_buf!=NULL) + { + drawtext(vid_buf,x,y,txt,r,g,b,a); + return Py_BuildValue("i",1); + } + return Py_BuildValue("i",-1); +} + +//drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) +emb_draw_rect(PyObject *self, PyObject *args) +{ + int x,y,w,h,r,g,b,a; + a=255; + if(!PyArg_ParseTuple(args, "IIIIIII|I:draw_rect",&x,&y,&w,&h,&r,&g,&b,&a)) + return NULL; + if(vid_buf!=NULL) + { + drawrect(vid_buf,x,y,w,h,r,g,b,a); + //fillrect + return Py_BuildValue("i",1); + } + return Py_BuildValue("i",-1); +} + +emb_draw_fillrect(PyObject *self, PyObject *args) +{ + int x,y,w,h,r,g,b,a; + a=255; + if(!PyArg_ParseTuple(args, "IIIIIII|I:draw_fillrect",&x,&y,&w,&h,&r,&g,&b,&a)) + return NULL; + if(vid_buf!=NULL) + { + fillrect(vid_buf,x,y,w,h,r,g,b,a); + //fillrect + return Py_BuildValue("i",1); + } + return Py_BuildValue("i",-1); +} +//int textwidth(char *s) +emb_get_width(PyObject *self, PyObject *args) +{ + char *txt; + if(!PyArg_ParseTuple(args, "s:get_width",&txt)) + return NULL; + return Py_BuildValue("i",textwidth(txt)); +} + +//SDL_GetMouseState(&x, &y) +emb_get_mouse(PyObject *self, PyObject *args) +{ + int x,y,mask,b1,b2,b3; + if(!PyArg_ParseTuple(args, ":get_mouse")) + return NULL; + mask=SDL_GetMouseState(&x, &y); + b1=mask&SDL_BUTTON(1); + b2=mask&SDL_BUTTON(2); + b3=mask&SDL_BUTTON(3); + return Py_BuildValue("(ii(iii))",x,y,b1,b2,b3); +} + +//svf_name +emb_get_name(PyObject *self, PyObject *args) +{ + if(!PyArg_ParseTuple(args, ":get_name")) + return NULL; + if(svf_login) + return Py_BuildValue("s",svf_user); + else + return Py_BuildValue("s",""); +} + +emb_shortcuts_disable(PyObject *self, PyObject *args) +{ + if(!PyArg_ParseTuple(args, ":shortcuts_disable")) + return NULL; + // + sys_shortcuts=0; + return Py_BuildValue("i",1); +} + +emb_shortcuts_enable(PyObject *self, PyObject *args) +{ + if(!PyArg_ParseTuple(args, ":shortcuts_enable")) + return NULL; + // + sys_shortcuts=1; + return Py_BuildValue("i",1); +} + +emb_get_modifier(PyObject *self, PyObject *args) +{ + if(!PyArg_ParseTuple(args, ":get_modifier")) + return NULL; + return Py_BuildValue("(iiiiii)",sdl_mod&KMOD_LCTRL,sdl_mod&KMOD_RCTRL,sdl_mod&KMOD_LALT,sdl_mod&KMOD_RALT,sdl_mod&KMOD_LSHIFT,sdl_mod&KMOD_RSHIFT); +} + +static PyMethodDef EmbMethods[] = { //WARNING! don't forget to register your function here! + {"create", emb_create, METH_VARARGS|METH_KEYWORDS, "create a particle."}, + {"log", emb_log, METH_VARARGS, "logs an error string to the console."}, + {"reset_pressure", emb_reset_pressure, METH_VARARGS, "resets all the pressure."}, + {"reset_velocity", emb_reset_velocity, METH_VARARGS, "resets all the velocity."}, + {"reset_sparks", emb_reset_sparks, METH_VARARGS, "resets all the sparks."}, + {"set_life", emb_set_life, METH_VARARGS|METH_KEYWORDS, "sets life of a specified particle."}, + {"set_type", emb_set_type, METH_VARARGS|METH_KEYWORDS, "sets type of a specified particle."}, + {"set_temp", emb_set_temp, METH_VARARGS|METH_KEYWORDS, "sets temp of a specified particle."}, + {"set_tmp", emb_set_tmp, METH_VARARGS|METH_KEYWORDS, "sets tmp of a specified particle."}, + {"set_x", emb_set_x, METH_VARARGS|METH_KEYWORDS, "sets x of a specified particle."}, + {"set_y", emb_set_y, METH_VARARGS|METH_KEYWORDS, "sets y of a specified particle."}, + {"set_ctype", emb_set_y, METH_VARARGS|METH_KEYWORDS, "sets ctype of a specified particle."}, + {"set_vx", emb_set_vx, METH_VARARGS|METH_KEYWORDS, "sets vx of a specified particle."}, + {"set_vy", emb_set_vy, METH_VARARGS|METH_KEYWORDS, "sets vy of a specified particle."}, + {"pause", emb_pause, METH_VARARGS, "pause the game."}, + {"unpause", emb_unpause, METH_VARARGS, "unpause the game."}, + {"pause_toggle", emb_toggle_pause, METH_VARARGS, "toggle game pause."}, + {"console_open", emb_open_console, METH_VARARGS, "open the game console."}, + {"console_close", emb_close_console, METH_VARARGS, "close the game console."}, + {"console_toggle", emb_toggle_console, METH_VARARGS, "toggle the game console."}, + {"console_more", emb_console_more, METH_VARARGS, "turns the more indicator on."}, + {"console_less", emb_console_less, METH_VARARGS, "turns the more indicator off."}, + {"get_pmap", emb_get_pmap, METH_VARARGS, "get the pmap value."}, + {"get_prop", emb_get_prop, METH_VARARGS, "get some properties."}, + {"draw_pixel", emb_draw_pixel, METH_VARARGS, "draw a pixel."}, + {"draw_text", emb_draw_text, METH_VARARGS, "draw some text."}, + {"draw_rect", emb_draw_rect, METH_VARARGS, "draw a rect."}, + {"draw_fillrect", emb_draw_fillrect, METH_VARARGS, "draw a rect."}, + {"get_width", emb_get_width, METH_VARARGS, "get string width."}, + {"get_mouse", emb_get_mouse, METH_VARARGS, "get mouse status."}, + {"get_name", emb_get_name, METH_VARARGS, "get name of logged in user"}, + {"shortcuts_disable", emb_shortcuts_disable, METH_VARARGS, "disable keyboard shortcuts"}, + {"shortcuts_enable", emb_shortcuts_enable, METH_VARARGS, "enable keyboard shortcuts"}, + {"get_modifier", emb_get_modifier, METH_VARARGS, "get pressed modifier keys"}, + {NULL, NULL, 0, NULL} +}; +#endif + int main(int argc, char *argv[]) { int hud_enable = 1; @@ -1197,11 +1947,11 @@ int main(int argc, char *argv[]) int FPS = 0; int pastFPS = 0; int past = 0; - pixel *vid_buf=calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); void *http_ver_check; void *http_session_check = NULL; + vid_buf=calloc((XRES+BARSIZE)*(YRES+MENUSIZE), PIXELSIZE); char *ver_data=NULL, *check_data=NULL, *tmp; - char console_error[255] = ""; + //char console_error[255] = ""; int i, j, bq, fire_fc=0, do_check=0, do_s_check=0, old_version=0, http_ret=0,http_s_ret=0, major, minor, old_ver_len; #ifdef INTERNAL int vs = 0; @@ -1218,6 +1968,9 @@ int main(int argc, char *argv[]) int username_flash = 0, username_flash_t = 1; pers_bg = calloc((XRES+BARSIZE)*YRES, PIXELSIZE); GSPEED = 1; + #ifdef PYCONSOLE + PyObject *pname,*pmodule,*pfunc,*pvalue,*pargs,*pstep,*pkey; + #endif /* Set 16-bit stereo audio at 22Khz */ fmt.freq = 22050; @@ -1227,6 +1980,61 @@ int main(int argc, char *argv[]) fmt.callback = mixaudio; fmt.userdata = NULL; + #ifdef PYCONSOLE + //initialise python console + Py_Initialize(); + Py_InitModule("tpt", EmbMethods); + //change the path to find all the correct modules + PyRun_SimpleString("import sys\nsys.path.append('.')"); + PyRun_SimpleString("print 'python present.'"); + //load the console module and whatnot + PyObject *tpt_console_obj = PyMarshal_ReadObjectFromString(tpt_console_pyc+8, sizeof(tpt_console_pyc)-8); + pmodule=PyImport_ExecCodeModule("tpt_console", tpt_console_obj); + if(pmodule!=NULL) + { + pfunc=PyObject_GetAttrString(pmodule,"handle");//get the handler function + if(pfunc && PyCallable_Check(pfunc))//check if it's really a function + { + printf("python console ready to go.\n"); + } + else + { + PyErr_Print(); + printf("unable to find handle function, mangled console.py?\n"); + return -1; + } + + pstep=PyObject_GetAttrString(pmodule,"step");//get the handler function + if(pstep && PyCallable_Check(pstep))//check if it's really a function + { + printf("step function found.\n"); + } + else + { + printf("unable to find step function. ignoring.\n"); + } + + pkey=PyObject_GetAttrString(pmodule,"keypress");//get the handler function + if(pstep && PyCallable_Check(pkey))//check if it's really a function + { + printf("key function found.\n"); + } + else + { + printf("unable to find key function. ignoring.\n"); + } + } + else + { + //sys.stderr + PyErr_Print(); + printf("unable to find console module, missing file or mangled console.py?\n"); + return -1; + } +#else + printf("python console disabled at compile time."); +#endif + #ifdef MT numCores = core_count(); #endif @@ -1489,53 +2297,398 @@ int main(int argc, char *argv[]) } do_s_check = (do_s_check+1) & 15; } + + if(sys_shortcuts==1) + { + if (sdl_key=='q' || sdl_key==SDLK_ESCAPE) + { + if (confirm_ui(vid_buf, "You are about to quit", "Are you sure you want to quit?", "Quit")) + { + break; + } + } + //if(sdl_key=='d' && isplayer) + //{ + // death = 1; + // //death = !(death); + //} + if (sdl_key=='f') + { + framerender = 1; + } + if ((sdl_key=='l' || sdl_key=='k') && stamps[0].name[0]) + { + if (load_mode) + { + free(load_img); + free(load_data); + load_mode = 0; + load_data = NULL; + load_img = NULL; + } + if (it > 50) + it = 50; + if (sdl_key=='k' && stamps[1].name[0]) + { + j = stamp_ui(vid_buf); + if (j>=0) + load_data = stamp_load(j, &load_size); + else + load_data = NULL; + } + else + load_data = stamp_load(0, &load_size); + if (load_data) + { + load_img = prerender_save(load_data, load_size, &load_w, &load_h); + if (load_img) + load_mode = 1; + else + free(load_data); + } + } + if (sdl_key=='s' && (sdl_mod & (KMOD_CTRL)) || (sdl_key=='s' && !isplayer2)) + { + if (it > 50) + it = 50; + save_mode = 1; + } + if (sdl_key=='1') + { + set_cmode(CM_VEL); + } + if (sdl_key=='2') + { + set_cmode(CM_PRESS); + } + if (sdl_key=='3') + { + set_cmode(CM_PERS); + } + if (sdl_key=='4') + { + set_cmode(CM_FIRE); + } + if (sdl_key=='5') + { + set_cmode(CM_BLOB); + } + if (sdl_key=='6') + { + set_cmode(CM_HEAT); + } + if (sdl_key=='7') + { + set_cmode(CM_FANCY); + } + if (sdl_key=='8') + { + set_cmode(CM_NOTHING); + } + if (sdl_key=='9') + { + set_cmode(CM_GRAD); + } + if (sdl_key=='0') + { + set_cmode(CM_CRACK); + } + if (sdl_key=='1'&& (sdl_mod & (KMOD_SHIFT)) && DEBUG_MODE) + { + set_cmode(CM_LIFE); + } + if (sdl_key==SDLK_TAB) + { + CURRENT_BRUSH =(CURRENT_BRUSH + 1)%BRUSH_NUM ; + } + if (sdl_key==SDLK_LEFTBRACKET) { + if (sdl_zoom_trig==1) + { + ZSIZE -= 1; + if (ZSIZE>60) + ZSIZE = 60; + if (ZSIZE<2) + ZSIZE = 2; + ZFACTOR = 256/ZSIZE; + } + else + { + if (sdl_mod & (KMOD_LALT|KMOD_RALT) && !(sdl_mod & (KMOD_SHIFT|KMOD_CTRL))) + { + bsx -= 1; + bsy -= 1; + } + else if (sdl_mod & (KMOD_SHIFT) && !(sdl_mod & (KMOD_CTRL))) + { + bsx -= 1; + } + else if (sdl_mod & (KMOD_CTRL) && !(sdl_mod & (KMOD_SHIFT))) + { + bsy -= 1; + } + else + { + bsx -= ceil((bsx/5)+0.5f); + bsy -= ceil((bsy/5)+0.5f); + } + if (bsx>1180) + bsx = 1180; + if (bsy>1180) + bsy = 1180; + if (bsx<0) + bsx = 0; + if (bsy<0) + bsy = 0; + } + } + if (sdl_key==SDLK_RIGHTBRACKET) { + if (sdl_zoom_trig==1) + { + ZSIZE += 1; + if (ZSIZE>60) + ZSIZE = 60; + if (ZSIZE<2) + ZSIZE = 2; + ZFACTOR = 256/ZSIZE; + } + else + { + if (sdl_mod & (KMOD_LALT|KMOD_RALT) && !(sdl_mod & (KMOD_SHIFT|KMOD_CTRL))) + { + bsx += 1; + bsy += 1; + } + else if (sdl_mod & (KMOD_SHIFT) && !(sdl_mod & (KMOD_CTRL))) + { + bsx += 1; + } + else if (sdl_mod & (KMOD_CTRL) && !(sdl_mod & (KMOD_SHIFT))) + { + bsy += 1; + } + else + { + bsx += ceil((bsx/5)+0.5f); + bsy += ceil((bsy/5)+0.5f); + } + if (bsx>1180) + bsx = 1180; + if (bsy>1180) + bsy = 1180; + if (bsx<0) + bsx = 0; + if (bsy<0) + bsy = 0; + } + } + if (sdl_key=='d'&&(sdl_mod & (KMOD_CTRL)) || (sdl_key=='d' && !isplayer2)) + DEBUG_MODE = !DEBUG_MODE; + if (sdl_key=='i') + { + int nx, ny; + for (nx = 0; nx 50) + it = 50; + } + if (sdl_key=='z'&&(sdl_mod & (KMOD_LCTRL|KMOD_RCTRL))) // Undo + { + int cbx, cby, cbi; + + for (cbi=0; cbi 50) - it = 50; - if (sdl_key=='k' && stamps[1].name[0]) - { - j = stamp_ui(vid_buf); - if (j>=0) - load_data = stamp_load(j, &load_size); + if (sdl_mod & (KMOD_SHIFT)) { + if (vs>=1) + vs = 0; else - load_data = NULL; + vs = 3;//every other frame } else - load_data = stamp_load(0, &load_size); - if (load_data) { - load_img = prerender_save(load_data, load_size, &load_w, &load_h); - if (load_img) - load_mode = 1; + if (vs>=1) + vs = 0; else - free(load_data); + vs = 1; } + counterthing = 0; } if ((sdl_key=='s' && (sdl_mod & (KMOD_CTRL))) || (sdl_key=='s' && !isplayer2)) { @@ -1585,50 +2738,57 @@ int main(int argc, char *argv[]) } if (sdl_key=='1'&& (sdl_mod & (KMOD_SHIFT)) && DEBUG_MODE) { - set_cmode(CM_LIFE); + if (counterthing+1>=vs) + { + dump_frame(vid_buf, XRES, YRES, XRES+BARSIZE); + counterthing = 0; + } + counterthing = (counterthing+1)%3; } - if (sdl_key==SDLK_TAB) +#endif + + if (sdl_wheel) { - CURRENT_BRUSH =(CURRENT_BRUSH + 1)%BRUSH_NUM ; - } - if (sdl_key==SDLK_LEFTBRACKET) { if (sdl_zoom_trig==1) { - ZSIZE -= 1; + ZSIZE += sdl_wheel; if (ZSIZE>60) ZSIZE = 60; if (ZSIZE<2) ZSIZE = 2; ZFACTOR = 256/ZSIZE; + sdl_wheel = 0; } else { - if (sdl_mod & (KMOD_LALT|KMOD_RALT) && !(sdl_mod & (KMOD_SHIFT|KMOD_CTRL))) + if (!(sdl_mod & (KMOD_SHIFT|KMOD_CTRL))) { - bsx -= 1; - bsy -= 1; + bsx += sdl_wheel; + bsy += sdl_wheel; } else if (sdl_mod & (KMOD_SHIFT) && !(sdl_mod & (KMOD_CTRL))) { - bsx -= 1; + bsx += sdl_wheel; } else if (sdl_mod & (KMOD_CTRL) && !(sdl_mod & (KMOD_SHIFT))) { - bsy -= 1; - } - else - { - bsx -= ceil((bsx/5)+0.5f); - bsy -= ceil((bsy/5)+0.5f); + bsy += sdl_wheel; } if (bsx>1180) bsx = 1180; - if (bsy>1180) - bsy = 1180; if (bsx<0) bsx = 0; + if (bsy>1180) + bsy = 1180; if (bsy<0) bsy = 0; + sdl_wheel = 0; + /*if(su >= PT_NUM) { + if(sl < PT_NUM) + su = sl; + if(sr < PT_NUM) + su = sr; + }*/ } } if (sdl_key==SDLK_RIGHTBRACKET) { @@ -2159,7 +3319,7 @@ int main(int argc, char *argv[]) if (!sdl_zoom_trig && zoom_en==1) zoom_en = 0; - if (sdl_key=='z' && zoom_en==2) + if (sdl_key=='z' && zoom_en==2 && sys_shortcuts==1) zoom_en = 1; if (load_mode) @@ -2764,7 +3924,6 @@ int main(int argc, char *argv[]) if(!console_mode) hud_enable = 1; } - sdl_blit(0, 0, XRES+BARSIZE, YRES+MENUSIZE, vid_buf, XRES+BARSIZE); //Setting an element for the stick man @@ -2782,13 +3941,14 @@ int main(int argc, char *argv[]) else player2[2] = PT_DUST; } - } SDL_CloseAudio(); http_done(); + Py_Finalize();//cleanup any python stuff. return 0; } -int process_command(pixel *vid_buf,char *console,char *console_error) { +#ifdef PYCONSOLE +int process_command(pixel *vid_buf,char *console,char *console_error,PyObject *pfunc) { int y,x,nx,ny,i,j,k,m; int do_next = 1; char xcoord[10]; @@ -2797,6 +3957,7 @@ int process_command(pixel *vid_buf,char *console,char *console_error) { char console3[15]; char console4[15]; char console5[15]; + PyObject *pvalue,*pargs; //sprintf(console_error, "%s", console); if(console && strcmp(console, "")!=0 && strncmp(console, " ", 1)!=0) { @@ -3251,4 +4412,4 @@ int process_command(pixel *vid_buf,char *console,char *console_error) { } return 1; } - +#endif diff --git a/src/python/tpt_console.py b/src/python/tpt_console.py new file mode 100644 index 000000000..b26ecef00 --- /dev/null +++ b/src/python/tpt_console.py @@ -0,0 +1,116 @@ +import tpt +from tpt import * +import sys +import code +import ctypes +import traceback +DEBUG=False + +#print "console module loaded." +#redirect stdout like this: +class logger: + def write(self,txt): + txt=txt.strip().split("\n")[-1] + repr(txt) + tpt.log(txt) +if(DEBUG==False): + sys.stdout=logger() + sys.stderr=logger() + + +element={"none":0,"dust":1,"watr":2,"oil":3,"fire":4,"stne":5,"lava":6,"gunp":7, + "nitr":8,"clne":9,"gas":10,"plex":11,"goo":12,"icei":13,"metl":14,"sprk":15, + "snow":16,"wood":17,"neut":18,"plut":19,"plnt":20,"acid":21,"void":22, + "wtrv":23,"cnct":24,"dstw":25,"salt":26,"sltw":27,"dmnd":28,"bmtl":29, + "brmt":30,"phot":31,"uran":32,"wax":33,"mwax":34,"pscn":35,"nscn":36, + "lntg":37,"insl":38,"bhol":39,"whol":40,"rbdm":41,"lrbd":42,"ntct":43, + "sand":44,"glas":45,"ptct":46,"bgla":47,"thdr":48,"plsm":49,"etrd":50, + "nice":51,"nble":52,"btry":53,"lcry":54,"stkm":55,"swch":56,"smke":57, + "desl":58,"coal":59,"lo2":60,"o2":61,"inwr":62,"yest":63,"dyst":64, + "thrm":65,"glow":66,"brck":67,"hflm":68,"firw":69,"fuse":70,"fsep":71, + "amtr":72,"bcol":73,"pcln":74,"hswc":75,"iron":76,"mort":77,"gol":78, + "hlif":79,"asim":80,"2x2":81,"dani":82,"amoe":83,"move":84,"pgol":85, + "dmoe":86,"34":87,"llif":88,"stan":89,"spng":90,"rime":91,"fog":92, + "bcln":93,"love":94,"deut":95,"warp":96,"pump":97,"fwrk":98,"pipe":99, + "frzz":100,"frzw":101,"grav":102,"bizr":103,"bizrg":104,"bizrs":105, + "inst":106,"isoz":107,"iszs":108,"prti":109,"prto":110,"pste":111, + "psts":112,"anar":113,"vine":114,"invis":115,"equalvel":116,"spawn2":117, + "spawn":118,"shld1":119,"shld2":120,"shld3":121,"shld4":122,"lolz":123, + "wifi":124,"filt":125,"aray":126,"bray":127,"stkm2":128,"bomb":129, + "c5":130,"sing":131,"qrtz":132,"pqrt":133,"seed":134,"maze":135, + "coag":136,"wall":137,"gnar":138,"repl":139,"myst":140,"boyl":141, + "lote":142,"frg2":143,"star":144,"frog":145,"bran":146,"wind":147, + "num":148} + + +def fork_unblock(): + pass#i need to implement this some day. +def error(ex): + traceback.print_exc() + err=traceback.format_exc() + sys.stdout.write(err) + +def clean(): + #add any functions that must be reachable here. + """copy=["__builtins__","__name__","__doc__","__package__",'tpt','clean', + 'element','fork','_fork','fork_status','fork_unblock','sys'] + handle.glob={} + for item in copy: + handle.glob[item]=globals()[item]""" + handle.glob=globals() + handle.buf="" + +def handle(txt): + try: + a=handle.glob + except: + clean() + try: + _handle(txt) + except Exception as ex: + error(ex) + +def _handle(txt): + #print "handling '%s'"%txt + try: + sys.stdout.write(repr(eval(txt,handle.glob))) + except: + try: + exec txt in handle.glob + except Exception as ex: + error(ex) + + +_extensions=[] +def loadext(fname): + ext=__import__(fname) + ext.init() + _extensions.append(ext) + +def keypress(key): + unload=[] + for item in _extensions: + try: + item.key(key) + except Exception as ex: + error(ex) + unload.append(item) + for item in unload: + item.exit() + _extensions.remove(item) + + +def step(): + unload=[] + for item in _extensions: + try: + item.step() + except Exception as ex: + error(ex) + unload.append(item) + for item in unload: + try: + item.exit() + except Exception as ex: + error(ex) + _extensions.remove(item)