pico-8 cartridge // http://www.pico-8.com version 39 __lua__ -- setup modules={} real_modules={} frame=0 function _init() -- printh("restarting") music_on() _doall("init") end function _update() frame+=1 if (frame%1==0) _doall("update") end function _draw() _doall("draw") end function music_on() music(0) menuitem(3, "music: on", music_off) end function music_off() music(-1) menuitem(3, "music: off", music_on) end function gsv(s) local ret=split(s,"\n") for i,v in ipairs(ret) do ret[i] = type(v) == "string" and split(v,"`") or {v} end return ret end function cycle(tbl,period) period = period or 1 return tbl[t()%period*#tbl\period+1] end -- fake sprintf function -- %~ for literal "%" -- %v for param -- %! for tostring(param) -- which dumps tables function fmt(f, ...) local out, i = "", 0 for s in all(split(f,"%")) do if i == 0 then -- before first format directive out ..= s i = 1 else local m = s[1] if m == "~" then out ..= "%" else local p = select(i,...) i+=1 if m == "v" then out ..= p elseif m == "!" then out ..= tostring(p) else out ..= "(?!:"..m..":"..tostring(p)..")" end end out ..=sub(s,2) end end return out end mnames={} function names(root) local n=mnames[root] if(n)return all(n) n={root.."0", root, root.."2", root.."3"} mnames[root]=n return all(n) end function _doall(x) for n in names(x) do for mod in all(modules) do local f=mod[n] if (f) f(mod) end end end -- source: https://www.lexaloffle.com/bbs/?pid=78990 gaps=split"57,23,10,4,1" --{701,301,132,57,23,10,4,1} function shellsort(a) for gap in all(gaps) do for i=gap+1,#a do local x,j=a[i],i-gap while j>=1 and a[j].key>x.key do a[j+gap]=a[j] j-=gap end a[j+gap]=x end end end function linefill(ax,ay,bx,by,r,c) if(c) color(c) local dx,dy=bx-ax,by-ay -- avoid overflow -- credits: https://www.lexaloffle.com/bbs/?tid=28999 local n,d=_mnmx(abs(dx),abs(dy)) n/=d d*=sqrt(n*n+1) if(d<0.001) return local ca,sa=dx/d,-dy/d -- polygon points local spans={} local function calcxy(u,v) return ax+u*ca+v*sa,ay-u*sa+v*ca end local x0,y0=calcxy(0,r) for s in all{{0,-r},{d,-r},{d,r},{0,r}} do local x1,y1=calcxy(unpack(s)) local _x1,_y1=x1,y1 if(y0>y1) x0,y0,x1,y1=x1,y1,x0,y0 local dx=(x1-x0)/(y1-y0) if(y0<0) x0-=y0*dx y0=-1 local cy0=y0\1+1 -- sub-pix shift x0+=(cy0-y0)*dx for y=y0\1+1,min(y1\1,127) do -- open span? local span=spans[y] if (span) rectfill(x0,y,span,y) spans[y]=x0 x0+=dx end x0,y0=_x1,_y1 end end function _apply(x,ts,a) local t=deli(ts,1) for k,v in pairs(t) do if (k!="update") x[k]=v end if (t and t.update and not t.update(x,a)) add(ts,t,1) end function sgn0(x) return x!=0 and sgn(x) or 0 end function inorder(tbl) local prev for v in all(tbl) do if (prev and v < prev) return prev = v end return true end function _mnmx(x,y) if (x>y)return y,x return x,y end function _rast( xs,ys,x0,y0,x1,y1 ) local function _add() local n=#xs if (n==0 or xs[n]!=x0 or ys[n]!=y0) add(xs,x0) add(ys,y0) end local dx,dy=abs(x1-x0),abs(y1-y0) local sx=-1 local sy=-1 if (x0dy then err=dx/2.0 while x0!=x1 do _add() err-=dy if (err<0) y0+=sy err+=dx x0+=sx end else err=dy/2.0 while y0!=y1 do _add() err-=dx if (err<0) x0+=sx err+=dy y0+=sy end end _add() end -->8 -- anchor operations (for the rope code) function _anch_eq(a0,a1) if (a0 and a1) return a0[1]==a1[1] and a0[2]==a1[2] return a0==a1 end --[[ function _anch_unpack(anch) assert(anch[1]) assert(anch[2]) return anch[1],anch[2] end ]]-- _anch_unpack=unpack function _anch_new(prev,next,xy) local out={prev=prev,next=next,_anch_unpack(xy)} if (prev) prev.next=out if (next) next.prev=out return out end function _anch_del(n1,xy) local n0,n2=n1.prev,n1.next if (n0) n0.next=n2 if (n2) n2.prev=n0 end function _anch_update(a0,a1) a0[1]=a1[1] a0[2]=a1[2] end -->8 -- input kbd={} add(real_modules,kbd) function kbd:init() self.real=btn() self.state={btn=0} end function kbd:update() -- figure out what keys are _really_ pressed local now_real,was_real=btn(),self.real self.real=now_real -- add keys that are really pressed -- if they weren't really pressed before -- (they may have been force- -- released by :release()) local real_pressed=~was_real&now_real local state=self.state local now_down=state.btn&now_real|real_pressed local was_down=state.btn -- deduce pressed/released by changes in down state.btn,state.btnp,state.btnr= now_down, ~was_down&now_down, ~now_down&was_down end for _kbdi in all(split"btn,btnp,btnr") do kbd[_kbdi]=function(self,i,t) return 1<"..tostring(v).." " end return str.."}" end -->8 -- title screen title={} add(modules,title) blinkcol=10 function title:draw() cls(0) -- this is right for 72x32 spr(96,28,56,9,2) print("pyrex",32,73,7) print("[nyeogmi]",62,73,7) print("kistaro",32,79,7) local lvlstr = fmt("⬅️ %v ➑️",start_level) print(lvlstr,50,91,1) print(lvlstr,51,90,blinkcol) end start_level=0 max_level=31 function title:update() blinkcol=9 if (time()*4\1%2==0) blinkcol=10 if (btnp"0") start_level-=1 if (btnp"1") start_level+=1 start_level%=max_level if (btnp"4" or btnp"5") modules=real_modules _init() music(0) end -->8 --level behaviors level={} add(real_modules,level) function level:init() level:reinit(start_level) end function level:reinit(n) self.hintlevel = 0 self.ix=n self.todo={} self.bigx,self.bigy=n%8,n\8 self.dirty=false self:load_dynobjs() self:recollide_reanchor() self:spawn_exit() end function level:restart() self:reinit(self.ix) end function level:advance() self:reinit(self.ix+1) end normpal = {[1]=0,[8]=0,[14]=0} pitpal = {[8]=0,[13]=3,[4]=3,[7]=3} function level:draw() cls(5) fillp() pal(normpal) map( self.bigx*16,self.bigy*16, 0,0,16,16, 64 -- flag 6: visible ) for _,pit in pairs(self._pits) do local px,py=pit.px,pit.py local pr=self._pits[_mix(px+1,py)] spr(pit.s,px,py) if pit.contents then pal(pitpal) palt(0,false) --spr(pit.contents,pit.px,pit.py) spr(79,pit.px,pit.py) pal() pal(normpal) end palt(8,true) spr(pit.s,px,py) palt() end for _,crate in pairs(self._crates) do spr(crate.s,crate.px,crate.py) end pal() end function level:busy() for _,crate in pairs(self._crates) do if (#crate.todo>0) return true end return end function level:update() _apply(self, self.todo) local remove={} for cix,crate in pairs(self._crates) do _apply(crate, crate.todo) if #crate.todo==0 then local pit=self._pits[_mix(crate.mx,crate.my)] if pit and not pit.contents then add(remove,cix) crate.dead=true pit.contents=crate.s end end end for cix in all(remove) do self._crates[cix]=nil self.dirty=true end if self.dirty then self:recollide_reanchor() self.dirty=false end end function level:load_dynobjs() self._crates={} self._pits={} local crate_id=1 for mx=0,15,1 do for my=0,15,1 do local mxy=_mix(mx,my) local px,py=mx*8,my*8 local s=self:_mget(mx,my) local def=self:_get_cratedef(s) if def then self._crates[mxy]={ s=s,def=def, id=crate_id, mx=mx,my=my, px=px,py=py, todo={} } crate_id+=1 end -- pit if (fget(s,5)) self._pits[mxy]={s=s,mx=mx,my=my,px=px,py=py} end end end function level:recollide_reanchor() self._coll={} for mx=0,15 do for my=0,15 do local mxy=_mix(mx,my) self._coll[mxy]= fget(self:_mget(mx,my),7) or self._crates[mxy] end end local anch_new={} for dxy in all{{-1,-1},{1,-1},{-1,1},{1,1}} do local dx,dy=unpack(dxy) assert(dx!=0 and dy!=0) for mx0=0,15 do for my0=0,15 do local mx1,my1=mx0+dx,my0+dy if ( self:mcoll(mx0,my0) and not self:get_crate(mx0,my0) and not self:mcoll(mx0,my1) and not self:mcoll(mx1,my0) and not self:mcoll(mx1,my1) ) then anch_new[fmt("GEOM%v,%v,%v,%v",mx0,my0,dx,dy)]= { max(mx0,mx1),max(my0,my1),adx=-dx,ady=-dy } end end end for _,cr in pairs(self._crates) do local mx0,my0=cr.mx,cr.my local mx1,my1=mx0+dx,my0+dy anch_new[fmt("CRATE%v,%v,%v",cr.id,dx,dy)]={ max(mx0,mx1),max(my0,my1),adx=-dx,ady=-dy } end end local moves={} for k,new in pairs(anch_new) do local old=(self._anch or {})[k] if old then anch_new[k]=new if (not _anch_eq(old,new)) add(moves,{old,new,key=k}) end end self._anch=anch_new self._anch_keys={} self._anch_by_position={} for k,v in pairs(self._anch) do add(self._anch_keys,{key=k}) local pkey=_mix(_anch_unpack(v)) self._anch_by_position[pkey]=self._anch_by_position[pkey] or v end shellsort(self._anch_keys) shellsort(moves) if player.rope then player.rope:experience_anchor_moves(moves) end for point in self:anchor_points() do point.moved=nil end end function level:win_at(mx,my) return self._wins[_mix(mx,my)] end function level:anchor_points() -- TODO: Return this to using all() local keys=all(self._anch_keys) return function() local k=keys() if (k) return self._anch[k.key] end end function level:anchor_at(point) return self._anch_by_position[_mix(_anch_unpack(point))] end function level:get_open_pit(mx,my) local pit=self._pits[_mix(mx,my)] if (pit and not pit.contents) return pit end function level:spawn_exit() self._wins={} local spawned local spawn_at=function(x,y) if (self:_mget(x,y)!=1) return assert(not spawned,x..","..y) spawned=true player:reinit(x,y) player.orientx=-1 if (x<8) player.orientx=1 end local win_at=function(x,y) if (self:_mget(x,y)!=18) return for nx=x-1,x+1 do for ny=y-1,y+1 do -- next check: is at least one of -- nx or ny out of range [0, 15]? if (nx | ny) & 0xFFF0 ~= 0 then self._wins[_mix(nx,ny)]=true end end end end for f in all{spawn_at,win_at} do for x=1,14 do f(x,0) f(x,15) end for y=0,15 do f(0,y) f(15,y) end end assert(spawned) end function level:mcoll(mx,my) if ((mx | my) & 0xFFF0!=0) return true return self._coll[_mix(mx,my)] end function level:get_crate(mx,my) return self._crates[_mix(mx,my)] end function level:_mget(mx,my) return mget( self.bigx*16+mx, self.bigy*16+my ) end function _mix(mx,my) return mx..","..my end -- crate spec: -- "up" == 1 -- "right" == 2 -- "down" == 4 -- "left" == 8 -- -- +1+ -- 8 2 -- +4+ function level:_get_cratedef(s) if (s<64 or s>=80) return return s & 0x000F end function level:get_latch(dx,dy,px,py) local mx,my=px\8,py\8 local mxy=_mix(mx,my) local crate=self._crates[mxy] local dx1,dy1=-sgn0(dx),-sgn0(dy) if crate then if crate.def & dy1*dy1*(2.5+1.5*dy1)+dx1*dx1*(5-3*dx1) ~= 0 then return { el="crate", dx=dx1,dy=dy1, ax_offset=dx1*0.5, ay_offset=dy1*0.5, rec=crate } end end local m=self:_mget(mx,my) if (m==60 and dy1<0) or (m==61 and dx1>0) or (m==62 and dy1>0) or (m==63 and dx1<0) then return { el="eyehook", dx=dx1,dy=dy1, ax_offset=dx1*0.5, ay_offset=dy1*0.5, rec={mx=mx,my=my,px=mx*8,py=my*8}, } end end ropecheck=split"-0.6,0.4,0.4" function level:can_move( is_player, mx0,my0,dmx,dmy,exclude_src,exclude_dst ) local mx1,my1=mx0+dmx,my0+dmy if (is_player and self:win_at(mx1,my1)) return true if (is_player and self:get_open_pit(mx1,my1)) return wrongbleep:adequately_warned() if (self:mcoll(mx1,my1) or player.x==mx1 and player.y==my1) return if player.rope then local w,h=1.2,0.2 if (dmx==0) w,h=0.2,1.2 if (player.rope:collide_mrect(mx0+ropecheck[dmx+2],my0+ropecheck[dmy+2],w,h,exclude_src,exclude_dst)) return end return true end function level:tug_crate(mx0,my0,dmx,dmy) local mxy0=_mix(mx0,my0) local existing=self._crates[mxy0] if (not existing) return self._crates[mxy0]=nil local mx1,my1=mx0+dmx,my0+dmy local px1,py1=mx1*8,my1*8 existing.todo={ {px=px1+dmx,py=py1+dmy,mx=mx1,my=my1,update=function() self.dirty=true return true end}, {px=px1,py=py1} } self._crates[_mix(mx1,my1)]=existing end -->8 --player handling player={} add(real_modules,player) function player:init() -- don't change this on reinit: -- it stays the same when the level is changed or reloaded self.vanish_frame=0 end function player:reinit(x,y) self.x,self.y=x,y self.px,self.py=0,0 self.todo={} self.cooldown=4 self.rope=nil -- don't elide, needs to be cleared if present self.fall_frame=0 self.orientx,self.orienty=-1,0 end function player:update() -- this is a non-gameplay action that takes precedence over -- all gameplay actions self:_vanish_if_requested() if not (#self.todo>0 or level:busy()) then if level:win_at(self.x,self.y) then level:advance() return end if level:get_open_pit(self.x,self.y) then self.todo={{update=self._fall}} return end if kbd:btn(0) then self.orientx=-1 self.orienty=0 elseif kbd:btn(1) then self.orientx=1 self.orienty=0 elseif kbd:btn(2) then self.orienty=-1 elseif kbd:btn(3) then self.orienty=1 end function btncd(x) return (kbd:btn(x) and self.cooldown==0) or kbd:btnp(x) end if kbd:btn(4) then if kbd:btnp(4) and self.rope then self.rope:destroy() kbd:release(4) end -- wait for user to release it else local x,y=self.x,self.y local function try_move(dx,dy,f) if level:can_move(true,x,y,dx,dy,0,2) then self.todo=f self.cooldown=3 local t=f[#f] t.x=x+dx t.y=y+dy return end wrongbleep:bleep() end if btncd(0) then try_move(-1,0,{{orientx=-1,orienty=0,px=-2,py=0},{px=1}}) elseif btncd(1) then try_move(1,0,{{orientx=1,orienty=0,px=2,py=0},{px=-1}}) elseif btncd(2) then try_move(0,-1,{{orienty=-1,px=0,py=-2},{py=1}}) elseif btncd(3) then try_move(0,1,{{orienty=1,px=0,py=2},{py=-1}}) elseif not self.rope and kbd:btnr(4) then local dx,dy=self.orientx,self.orienty if (dy!=0) dx=0 while not level:mcoll(x,y) do x+=dx y+=dy end self.rope=rope:new( {x+0.5-dx*0.5,y+0.5-dy*0.5}, {self.x+0.5,self.y+0.5}, level:get_latch(dx,dy,x*8,y*8) ) self.todo={{ update=function() return not self.rope or self.rope:latched() end }} elseif kbd:btnp(5) then if (self.rope and not self.rope:tug()) wrongbleep:bleep(9) end end end if (#self.todo==0) self.px=0 self.py=0 _apply(self,self.todo) if (self.cooldown>0) self.cooldown-=1 if self.rope then self.rope:update() if self.rope:done_reeling() then local latch=self.rope.latch self.x=latch.rec.mx+latch.dx self.y=latch.rec.my+latch.dy end self.rope:drag_dst{ self.x+self.px/8+0.5, self.y+self.py/8+0.5 } local tdx,tdy=self.rope:tug_orientxy() if (tdx) self.orientx=tdx if (tdy) self.orienty=tdy if (self.rope:done()) self.rope=nil end end function player:_vanish_if_requested() if kbd:btn(5) then self.vanish_frame+=1 if (self.fall_frame>0 or self.vanish_frame>20) then self.rope=nil level:restart() kbd:release(5) self.vanish_frame=20 end else self.vanish_frame-=1 end self.vanish_frame=max(self.vanish_frame,0) end function player:_fall() if (self.fall_frame<10) self.fall_frame+=1 end function player:draw() local px=self.x*8+self.px+wrongbleep:vibrate() local py=self.y*8+self.py+wrongbleep:vibrate() local head=1-self.orienty local vanish_level=max((self.vanish_frame-4)/16,0) local invis_level=max(self.fall_frame/10,4*(vanish_level-0.75)) if (invis_level>=1.0) return --[[ local HEAD=14--3 local BODY=12--12 local TAIL=14--14 local IRIS=7--9 local PUPIL=0--0 ]] -- in order: head,body,iris,pupil,body again,tail local palette=split"-1,14,14,12,12,-1,-1,-1,7,0,-1,12,14,14,14" local function setpal() --[[ -- head nil,14,14, --body [2]=HEAD, [3]=HEAD, [4]=BODY, [5]=BODY, [9]=IRIS, [10]=PUPIL, [12]=BODY, [13]=TAIL, [14]=TAIL, [15]=TAIL, ]] pal(palette) -- vanish colors local vanish=split"13,15,14,5,4,12,2,3,9,10" for i,ilc in ipairs(vanish) do if (vanish_level>i/#vanish) pal(ilc,5) end if (self.fall_frame>3) local zc=@0x5f00&0xf0 for i=0x5f00,0x5f0c,4 do poke4(i,0x0101.0101) end poke(0x5f00,zc|0x01) end local rx,ry=self.x*8+self.px+1,self.y*8+self.py+2 if (self.orientx==1) rx+=6 if self.rope then local rx_adj,ry_adj=self.rope:affected_src_xy(rx,ry) if rx_adj then local drx,dry=rx_adj-rx,ry_adj-ry rx,ry=rx+drx,ry+dry px,py=px+drx,py+dry end end if self.orientx==-1 then setpal() spr(16,px+6,py-2,1,1) spr(17,px+1,py,1,1) if (self.rope and invis_level<=0.25) pal() self.rope:draw(self.x*8+self.px+1,self.y*8+self.py+2) setpal() spr(head,px-3,py-3,1,1) else setpal() spr(16,px-6,py-2,1,1,true) spr(17,px-1,py,1,1,true) if (self.rope and invis_level<=0.25) pal() self.rope:draw(self.x*8+self.px+7,self.y*8+self.py+2) setpal() spr(head,px+3,py-3,1,1,true) end pal() end -->8 -- rope physics rope={} rope.__index=rope function rope:new( src,dst,latch ) local r={ id=0, state={name="cast",frame=0}, latch=latch, } r.src=src r.dst=dst r.src.next=r.dst r.dst.prev=r.src setmetatable(r,rope) return r end function rope:latched() return self.state.name=="latched" end function rope:done() return self.state.name=="done" end function rope:done_reeling() return self.state.name=="done" and self.state.reelin end function rope:update() if self.state.name=="cast" then self.state.frame+=1 if (self.state.frame>=3) self.state={name="latched"} elseif self.state.name=="latched" then if (not self.latch) wrongbleep:bleep(5) self:destroy() return if self.latch.rec then self:drag_src{ self.latch.rec.mx+0.5+self.latch.ax_offset, self.latch.rec.my+0.5+self.latch.ay_offset } if self.latch.rec.dead==true then self:destroy() end end if (not self:_check_sane()) self:destroy() elseif self.state.name=="destroy" then -- destroy self.state.frame+=1 if (self.state.frame>=4) self.state={name="done",reelin=self.state.reelin} else -- done state end end function rope:destroy(reelin) if (self.state.name=="destroy" or self.state.name=="done") return self.state={name="destroy",frame=0,reelin=reelin} end function rope:affected_src_xy(artificial_px,artificial_py) -- this is the loop from :draw but simplified if (not self.state.reelin) return perc_to_show=(1.0-self.state.frame/8)^2 local points=self:_anchors_simplified() points[#points]={x=artificial_px,y=artificial_py} local len=0 for i=1,#points-1 do len+=distance(points[i],points[i+1]) end local len_to_show=perc_to_show*len local len_cumulative=0 for i=1,#points-1 do local src=points[i] local dst=points[i+1] local x,y=dst.x,dst.y local dx,dy=src.x-x,src.y-y local len_here=len_to_show-len_cumulative local dist_base=distance_dxy(dx,dy) len_cumulative+=dist_base if len_here>0 and dist_base>0 then local coef=min(len_here/dist_base,1.0) return x+dx-dx*coef,y+dy-dy*coef end end return points[1] end function rope:draw(artificial_px,artificial_py) local points,highlight=self:_tug(true) local n,perc_to_show,from_end = self.state.name,1.0 if (n=="done") return if (n=="cast") perc_to_show=self.state.frame/2 if (n=="destroy") perc_to_show=(1.0-self.state.frame/4)^2 if (self.state.reelin) from_end=true points[#points]={x=artificial_px,y=artificial_py} local len=0 for i=1,#points-1 do len+=distance(points[i],points[i+1]) end local len_to_show=perc_to_show*len local len_cumulative=0 local ia,iz,istep=#points-1,1,-1 if (from_end) ia,iz,istep=1,#points-1,1 local function colorh(ix) color(8) if (highlight==ix) color(12) end for i=ia,iz,istep do local src=points[i] local dst=points[i+1] local x,y=dst.x,dst.y local dx,dy=src.x-x,src.y-y local len_here=len_to_show-len_cumulative local dist_base=distance_dxy(dx,dy) len_cumulative+=dist_base if len_here>0 and dist_base>0 then local coef=min(len_here/dist_base,1.0) if from_end then x,y=x+dx-dx*coef,y+dy-dy*coef end dx,dy=dx*coef,dy*coef colorh(i) local function lf(d0,d1,w) linefill(x+d0*dx,y+d0*dy,x+d1*dx,y+d1*dy,w) end lf(0,0.25,1.0) lf(0.25,1,0.5) lf(0.9,1,1.0) circfill(x+dx+0.5,y+dy+0.5,1.0) end end -- draw latch local l=self.latch if l and l.rec and (perc_to_show>=1.0 or from_end) then local function rfsplit(x) rectfill(unpack(split(x))) end local ldx,ldy=l.dx,l.dy colorh(0) camera(-l.rec.px,-l.rec.py) if (ldx==-1) rfsplit"0,3,2,4" if (ldx==1) rfsplit"5,3,7,4" if (ldy==-1) rfsplit"3,0,4,2" if (ldy==1) rfsplit"3,5,4,7" camera() color() end -- debug --[[ local n1=self.src local sy=0 while true do if (n1==nil) break local anch=level:anchor_at(n1) local x=n1.ax*8 local y=n1.ay*8 if anch then if (anch.adx>0) x-=1 if (anch.ady>0) y-=1 end rectfill(x-1,y-1,x+1,y+1,12) print("ax="..n1.ax..",ay="..n1.ay,72,sy) sy+=7 local n0=n1.prev local n2=n1.next if n0!=nil and n2!=nil then if anch then local _,_,_=would_stick(anch,n0.ax,n0.ay,n1.ax,n1.ay,n2.ax,n2.ay) local c=3 if (anch.dropped) c=4 rectfill(x+2,y+2,x+4,y+4,c) else rectfill(x+2,y+2,x+4,y+4,2) end else rectfill(x+2,y+2,x+4,y+4,4) end n1=n1.next end for _,p in pairs(level._anch) do local x,y=p.ax*8,p.ay*8 if (p.adx>0) x-=1 if (p.ady>0) y-=1 pset(x,y,11) pset(x+p.adx,y,11) pset(x,y+p.ady,11) end ]] end function rope:drag_dst(xy) self:drag(self.dst,xy) end function rope:drag_src(xy) self:drag(self.src,xy) end function rope:drag(n1,axy) self:relax() self:_drag(n1,{axy[1],n1[2]}) self:_drag(n1,axy) self:relax() end function rope:relax() local n0=self.src while true do local n1=n0.next if (not n1) break local n2=n1.next if _anch_eq(n0,n1) then _anch_del(n1) else n0=n0.next end end local n0=self.src while n0 do local n1=n0.next if (not n1) return local n2=n1.next if (not n2) return local anch=level:anchor_at(n1) local wouldstick,position_new=would_stick(anch,n0,n1,n2) if not (wouldstick or _anch_eq(n1,position_new)) then self:_drag(n1,position_new,{_anch_unpack(n1)}) _anch_del(n1) else n0=n0.next end end end function rope:_check_sane() if (not self:latched()) return true if (level:busy()) return true local n0=self.src local qxs,qys={},{} while true do local n1=n0.next if (not n1) break local n0ax,n0ay=_anch_unpack(n0) local n1ax,n1ay=_anch_unpack(n1) _rast(qxs,qys,flr(n0ax*2),flr(n0ay*2),flr(n1ax*2),flr(n1ay*2)) n0=n1 end local function _possible_tiles(qx,qy) local mx0=(qx-1)\2 local mx1=qx\2 local my0=(qy-1)\2 local my1=qy\2 local poss={} for mx=mx0,mx1 do for my=my0,my1 do add(poss,{mx=mx,my=my}) end end return poss end local function _blocked(qx,qy) for i in all(_possible_tiles(qx,qy)) do if (not level:mcoll(i.mx,i.my)) return end return true end -- find cases where i move through an impassable zone for i=1,#qxs do if (_blocked(qxs[i],qys[i])) return end -- find cases where i am cut off diagonally for i=3,#qxs do local qx1,qy1=qxs[i-1],qys[i-1] if qx1%2==0 and qy1%2==0 then local ok for m0 in all(_possible_tiles(qxs[i-2],qys[i-2])) do for m2 in all(_possible_tiles(qxs[i],qys[i])) do local mx0,my0=m0.mx,m0.my local mx2,my2=m2.mx,m2.my if not (level:mcoll(mx0,my0) or level:mcoll(mx2,my2)) then local dmx,dmy=abs(mx2-mx0),abs(my2-my0) if dmx==1 and dmy==1 and level:mcoll(mx0,my2) and level:mcoll(mx2,my0) then else ok=true end end end end if (not ok) return end end return true end function would_stick(anchor,xy0,xy1,xy2) local x0,y0=_anch_unpack(xy0) local x1,y1=_anch_unpack(xy1 or anchor) local x2,y2=_anch_unpack(xy2) local dx,dy=x2-x0,y2-y0 local function switch_ends() dx,dy,x0,y0,x2,y2=-dx,-dy,x2,y2,x0,y0 end local function signs(douter,dinner) local adb=sgn0(dinner) return -sgn0(douter)*adb,adb end local adx,ady,x1_new,y1_new if abs(dx)>abs(dy) then if (x0>x2) switch_ends() x1_new,y1_new=x1,y0+(x1-x0)/dx*dy adx,ady=signs(dy,y1_new-y1) else if (y0>y2) switch_ends() x1_new,y1_new=x0+(y1-y0)/dy*dx,y1 ady,adx=signs(dx,x1_new-x1) end return anchor and anchor.adx==adx and anchor.ady==ady, {x1_new,y1_new} end function rope:experience_anchor_moves(moves) self:_be_dragged_by(moves) self:_be_pushed_by(moves) self:relax() end function rope:_be_dragged_by(moves) local n=self.src while n do for t in all(moves) do local xy_old,xy_new=unpack(t) if (_anch_eq(xy_old,n)) n.dest=xy_new break end n=n.next end n=self.src while n do if (n.dest) self:_drag(n,n.dest) n.dest=nil n=n.next end end function rope:_be_pushed_by(moves) for i in all(moves) do self:_be_pushed_by1(unpack(i)) end end function rope:_be_pushed_by1(anch_old,anch_new) local n0=self.src local ax_old,ay_old=_anch_unpack(anch_old) local ax_new,ay_new=_anch_unpack(anch_new) while n0 do n1=n0.next if (not n1) return local nx0,ny0=_anch_unpack(n0) local nx1,ny1=_anch_unpack(n1) local nxmn,nxmx = _mnmx(nx0,nx1) local nymn,nymx = _mnmx(ny0,ny1) if (ax_new!=ax_old or (nxmnx1) x0,x1,mul=-x0,-x1,-mul local i=flr(x0) local top=flr(x1) return function() if (done) return i+=1 if i>top then done = true if (x1!=flr(x1)) return mul*x1 return end return mul*i end end function _which_side(xy,x0y0,x1y1) local x,y=_anch_unpack(xy) local x0,y0=_anch_unpack(x0y0) local x1,y1=_anch_unpack(x1y1) return sgn0((x1-x0)*(y-y0) - (y1-y0)*(x-x0)) end function distance_dxy(dx,dy) return sqrt(dx*dx+dy*dy) end function distance(p1,p2) local dx=p2.x-p1.x local dy=p2.y-p1.y return sqrt(dx*dx+dy*dy) end function rope:collide_mrect(mx0,my0,mw,mh,exclude_src,exclude_dst) local mx1,my1=mx0+mw,my0+mh local n0=self.src while true do local n1=n0.next if (not n1) return local nd=n0 for i=1,exclude_dst do nd=nd.next if (not nd) return end local x1,y1=_anch_unpack(n0) local x2,y2=_anch_unpack(n1) local function _line_line(x3,y3,x4,y4) local denom=(y4-y3)*(x2-x1)-(x4-x3)*(y2-y1) local ua= ((x4-x3)*(y1-y3)-(y4-y3)*(x1-x3))/denom if (ua<0 or ua>1) return local ub= ((x2-x1)*(y1-y3)-(y2-y1)*(x1-x3))/denom if (ub<0 or ub>1) return return true end if exclude_src<=0 then if (_line_line(mx0,my0,mx1,my0) or _line_line(mx0,my0,mx0,my1) or _line_line(mx0,my1,mx1,my1) or _line_line(mx1,my0,mx1,my1)) return true end exclude_src-=1 n0=n1 end end -->8 -- moved here because it's complicated function rope:tug_orientxy() local a1=self.dst local a0=self.dst.prev local ax0,ay0=_anch_unpack(a0) local ax1,ay1=_anch_unpack(a1) local dx=ax0-ax1 local tdx if (dx>3/8) tdx=1 if (dx<-3/8) tdx=-1 local dy=ay0-ay1 local tdy if abs(dy)>abs(dx)/2 then if (dy>3/8) tdy=1 if (dy<-3/8) tdy=-1 end return tdx,tdy end function rope:tug() if (not self:latched()) return return self:_tug() end function rope:_tug(hypothetically) local ancs=self:_anchors_simplified() local touched={} for i=#ancs-1,2,-1 do local ops_before_trash=self:_calc_push(ancs[i+1],ancs[i],ancs[i-1],ancs[i-2]) local ops_to_do,corners={} if #ops_before_trash>0 then ops_to_do=ops_before_trash else local ops_after_trash=self:_calc_push(ancs[i-2],ancs[i-1],ancs[i],ancs[i+1]) ops_to_do=ops_after_trash end local ops=ops_to_do if #ops>0 then if (hypothetically) return ancs,i-1 local dmx,dmy=ops[1].dmx,ops[1].dmy for o in all(ops) do level:tug_crate(o.mx,o.my,o.dmx,o.dmy) end return true end end local latch=self.latch if latch and latch.el=="eyehook" then if (hypothetically) return ancs,0 player.todo={{ update=function(s) if not s.rope or s.rope:done() then return true end end }} self:destroy(true) return true end if latch and latch.el=="crate" then local dmx,dmy= sgn0(latch.dx), sgn0(latch.dy) local obj_anc=ancs[1] local pull_anc=ancs[2] local pull_dx=pull_anc.x-obj_anc.x local pull_dy=pull_anc.y-obj_anc.y local mx0=latch.rec.mx local my0=latch.rec.my local mxa=(pull_anc.x+dmx)\8 local mya=(pull_anc.y+dmy)\8 local invalid_move if (dmx!=0 and sgn0(pull_dx)!=dmx) or (dmy!=0 and sgn0(pull_dy)!=dmy) or sgn0(mx0-mxa)!= sgn0(mx0+dmx-mxa) or sgn0(my0-mya)!= sgn0(my0+dmy-mya) then invalid_move=true end if not invalid_move and level:can_move(false,mx0,my0,dmx,dmy,1,0) then if (hypothetically) return ancs,0 level:tug_crate(mx0,my0,dmx,dmy) return true end end if (hypothetically) return ancs return end function rope:_calc_push( an,a0,a1,af ) local ops={} if (not an) return ops if a0.x==a1.x then -- no far side applying pressure? local y0,y1=_mnmx(a0.y,a1.y) local my0,my1,smy=(y0+1)\8,(y1-1)\8,1 if a0.y>a1.y then my0,my1=my1,my0 smy=-smy end local mx,dmx if a0.x%8==0 and a0.x>an.x+7 then -- push left mx=(a0.x-1)\8 dmx=-1 elseif a0.x%8==7 and a0.xa1.x then mx0,mx1=mx1,mx0 smx=-smx end local my,dmy if a0.y%8==0 and a0.y>an.y+6 then -- push up my=(a0.y-1)\8 dmy=-1 elseif a0.y%8==7 and a0.y8 --wrongbleeps wrongbleep={} add(real_modules,wrongbleep) function wrongbleep:init() self.duration=0 self.continuous=0 end function wrongbleep:update() if (self.duration>5) self.duration=5 if self.duration>0 then sfx(63,3) self.continuous+=1 else self.continuous=0 end self.duration=max(self.duration-1,-4) end function wrongbleep:bleep(duration) self.duration+=duration or 2 end function wrongbleep:vibrate(duration) if (self.continuous<10) return 0 return (rnd()*2-1)*min(self.continuous/10,2) end function wrongbleep:adequately_warned(duration) return self.continuous>45 end -->8 -- text level_text={by_lvl={}} add(real_modules,level_text) level_text_raw={ "0`9`11`\f7\#0press πŸ…ΎοΈ to mlem & unmlem", "0`33`17`\f7\#0❎ to yoink" } function level_text:init() for i=0,32 do level_text.by_lvl[i]={} end for row in all(level_text_raw) do if row then lvlxys=split(row,"`") add(level_text.by_lvl[lvlxys[1]],lvlxys) end end end function level_text:draw() for xys in all(level_text.by_lvl[level.ix]) do print(xys[4],xys[2],xys[3],6) end end -->8 --hint system function rot13(s) local sord = pack(ord(s,1,#s)) for i,c in ipairs(sord) do if (inorder{65, c, 77} or inorder{97, c, 109}) sord[i]=c+13 if (inorder{78, c, 90} or inorder{110, c, 122}) sord[i]=c-13 end return chr(unpack(sord)) end --hint file format: -- each row is one hint. -- 4 or 5 columns -- separated with a -- grave (`) character -- [1] room# -- [2] x coord -- [3] y coord -- [4] message line 1 (rot13) -- [5] message llne 2 (rot13) -- row 5 can be omitted -- for a 1-line hint -- -- multiple hints for the same -- room are revealed in order hints = {} add(real_modules,hints) function hints:init() local h = gsv[[0`42`57`πŸ…ΎοΈ yVPX` β–  0`42`73`❎, ❎ cHYY 1`35`34`⁘ sVYY 1`99`82`β–  cHYY 1`42`98`⁘`VTABER 2`75`65`i <`⁘ 2`104`73` β– `cHYY 2`27`42`⁘ 3`51`106`β–  cHYY 3`27`81`⁘ HAOYBPX ZR 3`91`33`β–  FGNAQ` URER]] for rec in all(h) do rec[4]=rot13(rec[4]) if(rec[5]) rec[5]=rot13(rec[5]) local lh = self[rec[1]] if lh then add(lh,rec) else self[rec[1]] = {rec} end end menuitem(1,"get hint",function() level.hintlevel+=1 end) menuitem(2,"hide hints",function() level.hintlevel=0 end) end function shdprint(txt,x,y,c) print(txt,x-1,y+1,1) print(txt,x,y,c) end hintflicker=split"7,10,9,8,8,9,10,7" function hints:draw2() pal() local c=cycle(hintflicker) for i,h in ipairs(self[level.ix]) do if (i > level.hintlevel) return local _,x,y,txt,txt2=unpack(h) shdprint(txt,x,y,c) if (txt2) shdprint(txt2,x,y+8,c) end end -->8 -- debug mouse support debugmouse = {} -- comment this out to disable debug mode add(real_modules, debugmouse) function debugmouse:init() poke(0x5f2d,1) end debugflicker=split"5,6,7,15,14,8,2,4,9,10,11,3,12,13" debugchs = split" ,x, ,β–‘" function debugmouse:draw3() if (stat(34) == 0) return pal(15,cycle(debugflicker,1.5)) local x, y, c = stat(32), stat(33), cycle(debugchs,2) if (c == " ") spr(50,x,y) print(c,x,y,15) local px, py = mid(0,x,89), mid(0, y > 111 and y - 12 or y + 6, 117) print("("..x..", "..y..")\n["..(x\8)..", "..(y\8).."]",px,py,15) pal() end __gfx__ 000030000000002200003000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeff1ff1ff1fffffff1ffffff1fffffff1dddddddd111111110005000000000000 003333300000332200333330eeffffffffffffffffffffeee5e555e55e555e5eff1ff1ffffffffffffffffffffffffffdddddddd111111110000500000000000 099333990039932009333339effeeeeeeeeeeeeeeeeeeffee5eeeeeeeeeeee5eff1ff1ffff111111ff1111ff111111ffdddddddd111111110000000000000000 09a333a9033a932009333339efee33e3333e333e3333eefee5e333e333333e5eff1ff1ffff1fffffff1ff1fffffff1ffdddddddd111111115005005000000000 023333323333320000222220efe333e3333e333e33333efee5e333e333333e5eff1ff1ffff1fffffff1ff1fffffff1ffdddddddd111111110500500500000000 002222200000220000222220efe33eeeeeeeeeeeeee33efeeee33eeeeee33eeeff1111ffff111111ff1ff1ff111111ffdddddddd111111110000000000000000 000222c002222c0000022200efeeee555e555e55e5eeeefee5eeeeffffeeee5effffffffffffffffff1ff1ffffffffffdddddddd111111110005000000000000 00000cc00000cc0000000cc0efe33e5eeeeeeeeee5e33efee5e33efeefe33e5e1ffffff11fffffffff1ff1fffffffff1dddddddd111111110000500000000000 0000ff000000000000000000efe33e5e11111111e5e33efee5e33efeefe33e5eff1ff1ffffffffffffffffffffffffff88888888555555555555555588888888 000f00f0000000000aa00aa0efe33eee11ffff11eee33efeeee33effffe33e5eff1ff1ffffffffffffffffffffffffff88888888558855885588558888888888 00d0000f000000000aaaaaa0efe33e5e1ff11ff1e5e33efee5e33eeeeee33eeeff1ff1fffff11111ffffffff11111fff88888888888888888888888888888888 00d0d00f00c040500aaaaaa0efeeee5e1f1111f1e5eeeefee5e333e333333e5eff1ff1fffff1ffffff1111ffffff1fff88888888888888888888888888888888 00dd00ee00c4455000999900efe33e5e1f1111f1e5e33efee5e333e333333e5eff1111fffff1ffffff1ff1ffffff1fff88888888888888888888888888888888 00000ee00c44455500aaaa00efe33eee1ff11ff1eee33efeeeeeeeeeeeeeee5efffffffffff11111ff1ff1ff11111fff88888888888888888888888888888888 00eeee000c004005000aa000efe33e5e11ffff11e5e33efee5555e555e555e5effffffffffffffffff1ff1ffffffffff88888888888888888855885588558855 eeee0000cc04405500444400efeeee5e11111111e5eeeefeeeeeeeeeeeeeeeeeffffffffffffffffff1ff1ffffffffff88888888888888885555555555555555 00000000000a90005bbbbbb3efe33eeeeeeeeeeeeee33efeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000 00000aaaaaaa9100bbbbbbbbefe33e5555e555e555e33efeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000 0000aaaaaa1a9110bbb7aabbefe33eeeeeeeeeeeeee33efeff1ff1ff11111111ff1111ff00000000000000000000000000000000000000000000000000000000 0aaaaaaaaa1a9111bbbaabbbefe333e3333e333e33333efeff1ff1ffffffffffff1ff1ff00000000000000000000000000000000000000000000000000000000 0aaaaaaaa41a91a1bbaaabbbefee33e3333e333e3333eefeff1ff1ffffffffffff1ff1ff00000000000000000000000000000000000000000000000000000000 0a000aa4441a91a1bbabbbbbeffeeeeeeeeeeeeeeeeeeffeff1ff1ff11111111ff1111ff00000000000000000000000000000000000000000000000000000000 00a0044449a110a1bbbbbbbbeeffffffffffffffffffffeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000 000aa111991111103bbbbbb3eeeeeeeeeeeeeeeeeeeeeeeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000 0000000099100000f765000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111999999111111111 00000000990000007700000000000000000000000000000000000000000000000000000000000000000000000000000019911991999999911999999119999999 00000000990000006060000000000000000000000000000000000000000000000000000000000000000000000000000019977991999999911999999119999999 00000000090000005005000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999 00000000aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999 0000000077a000000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911997799119999999 00000007777a00000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911991199119999999 00044444444444000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991111111111111111111111111 44444444444004444444444444400444444444444440044444444444444004444444444444400444444444444440044444444444444004444444444444400444 477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774477dd77447711774 47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774 4d7117d44d7117d44d7117104d7117104d7117d44d7117d44d7117104d711710017117d4017117d40171171001711710017117d4017117d40171171001711710 4d7117d44d7117d44d7117104d7117104d7117d44d7117d44d7117104d711710017117d4017117d40171171001711710017117d4017117d40171171001711710 47777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774477777744777777447777774 477dd774477dd774477dd774477dd77447711774477117744771177447711774477dd774477dd774477dd774477dd77447711774477117744771177447711774 44444444444444444444444444444444444004444440044444400444444004444444444444444444444444444444444444400444444004444440044444400444 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000cc0cc0cccccccccccccccccccccccccccccccc0bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000cc0cc0000cc0000000000000000000cc0000000bb0bb0bbbb0bbbbb0bbbbb0bbb000000000000000000000000000000000000000000000000000000000000 000cc0cc0cc0cc0cc0cccccccc0ccccc0cc0ccccc0bb0bb000bb0000bb0bb0bb0bb0b00000000000000000000000000000000000000000000000000000000000 000cc0cc0cc0cc0cc0cc0cc0cc0000cc0cc0cc0cc0bb0bb0bb000bbbbb0bbb000bb0b00000000000000000000000000000000000000000000000000000000000 000cc0cc0cc0cc0cc0cc0cc0cc0ccccc0cc0ccccc0bb0bb0bbbb0bbbbb0bb0bb0bbbb00000000000000000000000000000000000000000000000000000000000 000cc0cc0cc0000cc0cc0cc0cc0cc0cc0cc0cc0000bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000ccccc0ccccc0cc0cc0cc0cc0ccccc0cc0ccccc0bbbbbbbbbbbbbbbbbbbbbbbbbbb00000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 88888888888888888888880aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000000 0088000000088000000000000000000000000aa00000000000000000aa0000000000000000000000000000000000000000000000000000000000000000000000 00880888880880888880880aaa00aaa0aaaa0aa0aaaaa0aa0a0aaaa0aa0aa0aaaaa0aaa000000000000000000000000000000000000000000000000000000000 00880880880880000880880aa0a0aa00aa000aa0aa0aa0aa0a0aa000aa0aa0aa0aa0aa0a00000000000000000000000000000000000000000000000000000000 00880880880880888880880aa0a0aa0000aa0aa0aaa000aa0a0aa000aa0aa0aa0aa0aa0a00000000000000000000000000000000000000000000000000000000 00880880880880880880880aaaa0aaa0aaaa0aa0aa0aa0aaaa0aaaa0aa0aa0aaaaa0aa0a00000000000000000000000000000000000000000000000000000000 00880888880880888880880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000888888800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c021c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c021c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c100c0c000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c1002400c1c100c0c0c0c0c0c0c0c0c0c0c0c0c0c000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c00000e300c00000c0c0c0c0c0c0c0c0c0c0c10000c000c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c000000000c000c0c0c0c0c0c0c0c0c0c000000000c100c100f3c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000001000340000c000c0c0c0c0c0c0c0c0c01000c034c1c1c1c100c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c000000000c100f3c0c0c0c0c0c0c0c0c00000000000000000c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000212000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000313000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0100000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c00000000000000000000000000000c0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0 __label__ 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000777667777776677700000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000777667777776677700000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000000000000000000000000000000000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77766777000000000000000077766777000000000000000000000000000000000000000000000000000000000000000077766777000000000000000077766777 77766777000000000000000077766777000000000000000000000000000000000000000000000000000000000000000077766777000000000000000077766777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000077777777000000000000000000000000000000000000000000000000000000000000000077777777000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000077766777000000000000000077766777000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000077766777000000000000000077766777000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777777000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77766777000000007776677700000000777667770000000000000000000000000000000000000000000000007776677700000000777667770000000077766777 77766777000000007776677700000000777667770000000000000000000000000000000000000000000000007776677700000000777667770000000077766777 77777777000000007777777700000000777777770000000000000000000000000000000000000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000008000000000000000080000000000000007777777700000000777777770000000077777777 77777777000000007777777700000000777777770000000000000088888888888888888888000000000000007777777700000000777777770000000077777777 77777777000000000000000000000000000000000000000000000088888877777778888888800000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777788880000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777708888000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000088877667777776677700888800000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000088777667777776677700088880000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000088777777777777777700008888000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000888000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000008880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000000888000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000000088800000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088777777777777777700000000008880000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000088777667777776677700000000000888000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000088877667777776677700000000000088800000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000088877777777777777700000000000008880000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777700000000000000888000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088877777777777777700000000000000088800000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088880000000000000000000000000000008880000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000088888800000000000000000000000000000888000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000088888000000000000000000000000000088800000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000088880000000000000000000000000000888000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000088880000000000000000000000000888800000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000888880000000000000000000000088880000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000008888880000000000000000000008888000000033000000000000077777777 777777770000000000000000000000000000000000000000000000000000000000000888880000000000000000000008883330003bb300000000000077777777 777777770000000077777777000000007777777700000000000000007777777777777778880000000000000077777777833b33003ab337770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777888800000000000007777777733333300331137770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777788800000000000007777777700883330711337770000000077777777 77766777000000007776677700000000777667770000000000000000777667777776677788800000000000007776677703333333733367770000000077766777 77766777000000007776677700000000777667770000000000000000777667777776677708880000000000007776677700333330333667770000000077766777 77777777000000007777777700000000777777770000000000000000777777777777777700880000000000007777777700033133311777770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777700888000000000007777777700003100317777770000000077777777 77777777000000007777777700000000777777770000000000000000777777777777777700088000000000007777777700033103317777770000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000088800000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000008880000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000000000000888000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000888000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000888800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000088800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000088880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778800000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000077766777000000000000000077766778800000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000077766777000000000000000077766778800000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000077777777000000000000000077777778800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000077777777000000000000000077777778880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000088880000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700000888800000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777700008888000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000777667777776677700088800000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000777667777776677700880000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000777777777777777708800000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777777788000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000777777777777778880000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000888800000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000008888000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000008880000000000000000000000000000000000000000000000000077777777 77766777000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000077766777 77766777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077766777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777777667777776677777766777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 __gff__ 000000c0c0c0c0c0c0c0c0c0c0c00000000000c0c0c0c0c0c0c0c0c0202020200040c0c0c0c0c0c0c008080800000000404000000808080808080808c0c0c0c000000000080808080808080800000008000000000808080808080808000000000008080808080808080808080000000000080808080808080808080800000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __map__ 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1203040404050d0d0d0d010d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d0d0d0d0d0d03043e0a040404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0a0d0d0d0d0a0d0304040405140013004f00150d0d0d1400140d0d0d0d0d0d0d0d0d0d0d0d1400140d0d0d0d0d0304040404040417000026000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d030404043e050d0d0d0d0d0d033e0404040404050d0d0d0d0d0d0d 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d03042604040404260417000000151400001e0000150304040400040404050d0d0d0d0d03040404050003040404050d1300000000000000000018000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0304041700000000150d0d0d0d0d0d134400000000001514140d0d0d0d0d 0d0d0d0d0d0d0d0d0d0a0d0d0d0d0d0d0d14130018000000001800000000001514141300000015130000000000000015030404040513000000160017000000150d1300000000000000421e00000000150d0d0d0d0d0d0d0d0d0a0d0d0d0d0d0d0d0d1300000000000000150d0d0d0d0d12001d0000000000000003040404050d 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d010000001e0000004f000000000000150d031700000015130000000000000015130000001513004200001e43000000150d130000000000000000001a000041150d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d13000000001d1d00150d0d0d0d0d0d131c0000000000150013000000150d 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d1413001a000000001a0000000000150d13000000001513000000000000001513001d1d0000000000000000000000150d232424002424240700002600001e150d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d1346062407471c00150d0d0d0d0d0d231c24241d2424250000000000150d 0d0d0d0d03040404042604050d0d0d0d0d0d232426242424242624071e001e150d13000000001513000000000000001513001f481523242424070006242424250d0304040004040523242408242400250d0d0d0d03040404041804050d0d0d0d0d0d1346150d131c1f0016040404050d0d031f04051c0d030404170000001605 0d14141413000000001800151414140d0d0d0d0d080d0d0d0d080d23240024250d23240000242513000000000000001513000000150d0d0d0d2324250d0d0d0d0d3d001c001c003f03040404040400050d1414141300001d1d1d003f1414140d0d0d13441604171f1a0000000000150d0d130000161f053d44001d1d001d0015 0100000000000000004f0000000000120d0d0304040404050d0d0d0d1400140d0d030400000405130000004f000000151300000015030404050d0d0d030404050d13001c1d1c00151300000000000015010000000000001c1c1c0000000000120d0d13001c000000181d1a1d1a1d150d0d131d1d0000151342001c1c001c003f 0d14141413000000001a00151414140d0d0d1300000000150d0304040400050d0d13001e1e4f15130000001e00000015130000001513000016040404170000150d13001f401f00151300481e000000150d1414141300001f1f1f003f1414140d0d0d13001f0043003f1f181c181f150d0d131f1f0000151300001c1c1d1c4915 0d0d0d0d23242424242624250d0d0d0d0d0d1300000000150d1300000000150d0d130000000015130000150013000015130000431513000000000000000000150d1300000000001523242400242424250d0d0d0d23242424241a24250d0d0d0d0d0d13001a001a1d1a00001f0000150d0d230747000015131e1e1f1f1f1f3e15 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d091b00191b00192727271b1e19270b0d2324240024252324242500232424251300000000004d0000000000000000150d1300000000001503040000040514140d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d131e1800181f18001a00063c250d0d0d2324243c25130040000000000015 0d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d0d1300001e4f1e000000004f00150d0d0d03040004050d0d0d1400140d0d0d232424242513000000000000000000150d130000000000151300001d1d0000140d0d0d0d0d0d0d0d0d260d0d0d0d0d0d0d1413000000000000001800000000120d140304040405130000000000000015 0d0d0d0d0d0d0d0d0d080d0d0d0d0d0d0d0d230024242425141300000000150d0d0d134f1e00151414141400140d0d0d0d0d0d0d0d13000006240024070000150d2324240024242513000040441500140d0d0d0d0d0d0d0d0d080d0d0d0d0d0d0100000000000000062424242514140d0100001d1d483f230024242424242425 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1400140d0d0d0d2324242424250d0d0d13000000000000000000140d0d0d0d0d0d0d0d23242425140014232424250d0d0d1400140d0d13000000001500120d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1423242424243c250d0d0d0d0d0d0d0d14131f1f00000000140d0d0d0d0d0d 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d0d0d0d0d0d0d23242424251414141414140d0d0d0d0d0d0d0d0d0d0d0d0d010d0d0d0d0d0d0d0d0d010d0d0d232424242425140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d23242424251414140d0d0d0d0d0d 0d0d0d0d0d0d0d0d030404040404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d010d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d03040404040405133d00001c00150d0d0d0d0d0d0d0d0d0304043e0404050d0d0d0d0d030404000404050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d130000000000151300001d1f00150d0d0d0d0d0d0d0d0d150000000000150d0d0d0d0317420000004816050d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d13001d1d1e4f000000001c000000010d03040404040405150000000000150d0d0d141300191b1d191b0015140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d13001f1f000015131e1e1f1d1d150d0d13460044004c15150000000000150d0d3d001e0042001f0048001e003f0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d13000000000015130000001c1c150d0d131d1d1e1d1d152324241d2424250d0d140023240700410006242500140d0d0d0d0d0d030404040404050d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0927271b1e1e0015130014001c1c150d0d131c3d001c1c000000001f040404050d1400000023243c2425000000140d0d0d0d0d0d130000001c000000000d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d131c1c00000000000000001c1c150d0d131f1f1e1f1f1514141300280000150d14000000001f1f1f00000000140d0d0d141414130028001c4516050014140d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d131c1c0014001513001e1e1927270b0d1300004100001514141300000000010d144f47411400000014000000140d0d01000000000000001f0000150000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d131c1c00000015130000000000150d0927271b001927270b031741280000150d14434b491400000014000000140d0d0d14141413002800000000151414140d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d131f1f1d1e1e151300001d1d00150d0d131f1c001c1c151f130000004900150d03040404040000000304040405140d0d0d0d0d13000000000006250d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 120000001c000000004f1e1f1f00150d0d13001f001f1f0000131d1d000000150d1300000000000003170000000000120d0d0d0d232424242424250d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d13001d1f000015130000000000150d0d1300000000001500232424242424250d13000000001d1d1d0000000015140d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d13001c00003f15232424242424250d0d1300000000001500140d0d0d0d0d0d0d130000000625031700000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d232424242424250d0d0d0d0d0d0d0d0d2324242424242500140d0d0d0d0d0d0d130000062503170000000000150d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d120d0d0d0d0d0d0d0d232424250d23242424242424250d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __sfx__ 00110000250002500025030250302503000000230350000023030230302303023030230302303023030230302103021030210302103021030210300000000000177401774017740177311e7501e7501e7501e750 00110000290202a0212a0202a0202a0202a02025030250052503025030250302503025030250302503025030250302503025030250302503225030230322504526030260302a040000002d0402d0402d0402d040 001100001e7401e7401e7401e74010730107301073010730157301573015730157301573015730157301573015730157301573015730000000000000000000000000000000000000000019030190300000000000 001100002d0422d0402a0302a0302c0302c0302c0322c0322d0402d0312d0302d0302d0302d0302d0302d0302d0302d0302d0322d03200000000000000000000000000000000000000002b0402c0410000000000 001100001274012740127401274012740127401274012740177301773017730177301773017730177301773014730147301474014740107401074010740000001573015730157301573009720097300973009730 001100002a0402a0412a0412a0402a0402a0402a042290412a0412a0402a0402a0402a0402a0402a0422903128041280402804028040280402804226032000002504025040250402603026030260322803200000 001100000e0300e0300e0300e0300e0300e0300000000000000000000000000000000000000000150301503014030140301403014030120301203012030120300d0200d0200d0200d0200d0200d0200d0200d020 001100002804028040280402804028040280402104000000210402104021040210402104021040150001500014000140001400014000120001200012000240342503125030250302503025030250322503225032 00110000150301503015030150301503015030150301503015030150301503015030150301503015030150300b0200b0200b0200b0200b0200b0200b0200b0200b0200b0200b0200b02000000000000000000000 001100002501425010250102501025010250102501025010250212502025020250202502125020250202502027540275402754027540275402754027540275402703027030270302703027030270302703027030 001100002312023120231202312023120231202312023120231202312023120231202312023120231202212123141231402314023140231402314021140201401e1401e1401e1401e1401c140001001e14020140 00110000000000000006322063250d3320d33209320093200932009325093200932509320000001703017030170300b0200b0200b0200b02017030170300b0301403014030140301403514030140300000014330 0011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b0301b0301b030000001b0301b0301b030000001b0301b0301b03000000 0011000020140201402013020130201302013020130201301d1401e1411e1401e1401c140002001b2401b2401b240000000000022554235512355023550235402354023540235402354023540235402314023140 0011000000000150301503000000000000e0300e0300e0300e0320e0320e0320e0320e0300e0300e030000000d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d0300d030 00110000190331903019030000001a0331a0301a0301a0301a0301a0301a0301a0301a0301a0301a0300000027320273202732027320000000000027320273202732027320273202732000000000000000000000 00110000211402d1402d145000002a1302a1302a1302a1302a1322a1322a1322a1322a1322a13000100000002c3202c3202d3202d3202f320003002d3302d3302d3302d3302c3312c3302a3302a3302833000000 001100000b0300b0300b0000b0000b0300b0300b0300b0300b0300b0300b0300b0300b0300b0300b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001100002704027040000000000027040270402704027040270402704027040270402704027040000000000028020280202a020000002c030000002a0202a02000000000002c0302c0302c0302c0300000000000 001100002a3302a3302c330003002a3302a3302a3302a3302a3302a3322a3322a3322a3322a332283322a3322c3302c3302d330003002f3302f3052d3302d33000300003002f3302f3302f3302f3302804028045 00110000000000000015310153101531015310153101531000000000001032010320103201032010320103200e3200e3200e3200e3200e3200e3200e3200e32000000000000d3200d3200d3200d3200d3200d320 001100003102031022310223102231022310222f0322d0302c030000002a0400000028030000002603026030260302603026030260302603026030000000000029040000002a040000002c040000002d0502d050 0111000034040340403404034042340423404232042310422f040000002d040000002c040000002a0402a0402a0402a0402a0422a0422a0422a042290402a0402c040000002d040000002f040000003104031040 001100001203012030120351230010030100301003010030020200202002020020200202002020020200202002020020200202002020020220202202022020220b0400b040000000000010040100400000000000 0011000000000000002c0402c04000000000002a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a0302a030000002604026040000000000028040280400000000000 0011000000000000002f0402f04000000000002d0402d0402d0422d0422d0422d0422d0422d0422d0402d0402d0402d0402d0402d0402d0402d0402d040000002a0402a04000000000002c0302c0300000000000 001100000932209322093220932209322093220932209322043220432204322043220432204322023220232202322023220232202322023120231204312023120131000000033100000005310000000632006320 00110000250402504025040250402504025040230402104020040000001e040000001c040000001a0401a0401a0401a0401a0401a0401a0400000000000000000000000000000000000000000000000000000000 0011000028030280302803028030280302803026030250402304000000210400000020040000001e0401e0401e0401e0401e0401e0401e040000001d0401e0402004000000210400000023040000002504025040 00110000063200632012310123100431004310103101031002310023100231002310023150200002745017450b7351770017735060001274506000107550400004000107550b7550400004755010000172001722 00110000250502505023040230402304023040250402303021050210502105221050210502105021050210502a030000002d030000003203000000310403104031040310402f0302d0402f0502f0502d0402c040 001100000e7450e7050000012745000000070010740107401074210742107421074210740000000e7400e7400d7450d00500000117450000000000127401274012742127421e7421e7421c7401c7451074010745 001100002a05512005000003205500000000002f0502f0502f0502f0502f0502f0502f050000002c0402a0502905500000000003105500000000002d0402d0402d0402d0402d0402d0402c0402c0402c0402c040 001100000e0400e0400e0400e0400e0400e0400d040000000b0400b0400b0400b0400b0400b040020400000004040040400404004040040400404504040000000404004040040300400001000010000104001030 001100002a0402a0402a0402a0400000000000260302503023030230302303023030320503205232052320523104031040310403104031040310402f040000002f0402f0402f0402f0002a0402c0402a04028040 001100001731517310173151731517020170251033010330103301033010330103300233002325023300232501330013300133501335013300133506330063300633006330063300633004040040400404004040 00110000173601733023030233300b6630b3352a66317330173302a6532c230282302c230282302a6531a230190301903025030250330b6650b6702a6231e0302a7001e7302a6231e730287301c7302a6231c730 001100002634026340263403234032340323402f3402f3402f3422f3422f3422f3422f3422f34228342263402533025330253303135031350313502d3402d3402d3422d3422d3422b3412c3412c3422c34229341 001100000e7300e7300e7300e7300e7300e7300d7300d7300b7400b7400b7400e7400e7400e740100401004010030100300403004030040300403004030040300403004030040300403004030040300403000000 00110000260301a030260301a030260301a03000000000002304017040230402603017030260302a0401c0402a0401c0402a0401c0402a0401c0402a0401c040280401c040280401c04028040000001c04000000 00110000293402a3412a3422a3422a3422a34228350000002634026340263403234032340323402f3502f3502f3522f3522f3522f3422f3422f3422f3422f3422f3422f3422f3422f3422f340000002d3402d345 001100001004010040100401004010040100401004010040100301003010030100301003010030100301003010020100201000010000100051000010000100000000000000000000000000000000000000000000 001100002604028040260302803026040280402603028030260202802026020280202601028010260102801025010250152500028000250052800025000340000d5100d0300d0300000000000125140603006030 001100002d3322d3322d3322d3322d3322d3322d3322d3322d3222d3222d3222d3222d3222d3222d3222d3222d4122d4122d4022d4052d4002d4002d400000003843038430384303843500000000003473034730 001100000601006015000000000000000000000000000000215401a030210400000000000000001c540150301c0400000000000000001e540170301e040000000000000000195401203019040120300d0350d005 0011000034720347203472034720347250000000000001003173031730317302f7352d735001002c7402c7402c7402d7452f745007002d7502d7502d7502c7452a74500700287402874028740007002574500100 001100001a0302a0321a0301a0351a0001a00000000000000000000000000000000000000000000000000000000000000000000000002f0401c0222f04000000000001c0202d0422502019040190401904019040 00110000217302173021710217102171021715217002170021000210002100021000210002100021000210000000000000000001c700387303873038730387300000000000347303473034730347303473034730 0111000025020250202d0402c0402a140022150e0251202012020151250d2152502019020280351a030230251702026030260301703023030200001c000200301c02023040040200402004020040200000000000 001100003403034030317302f7302d7302d7302d7202f72031720001002f7402f7402f740007002d740007002a7502a75032750327502f7402f7402f7402f7422f7422f7422f7422f74500700007001c75000700 00110000253401c34009360093600936009340093401734004340043400434004340043401734002340023400234002340023401a340023400434002340023400134000300033400030005340003000635006350 001100001c567285303453034540345403454032540315402f540255402d540255402c540255402a5402a5402a5402a54021540215402154021540295302a5302c540235402d540255402f540255403155031550 00110000000000000000000000000000000000000000000021440204401e4401e4401e4401e4401e4401e4401a44000000174401a000174401a00012440124401224012240102401024010240102400d0000d000 001100000635006350123401234004350043501034010340023400234002340023400234002340023400234017340230001a3402a0001a340000002d3402d3402d3402d3402c3402a3402c3402c3402d0352c035 0011000031560255602f5602f5602f56025560315602f5602d5602f5602d5602d5602d5602d5602d5602c5601e16000100211500000026130000002514025140251402514023130211402315023155201001e100 011100002804026040280402604028030260302803026030280302603028030260302802026020280202602028020250202802025020280102501028010250102801025010280102501028010250102802025020 001120002d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3202d3112d3102d3102d3102d3102d3102d310014000140001400014000140001400014000140001400 0111000034530345323453234532345323453232532315302f540005002d540005002c540005002a5402a5402a5402a5402a5402a5402a5402a540295402a5402c540005002d540005002f540001003104031040 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 010300000015000250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 __music__ 01 00014140 00 02034340 00 04054540 00 06074740 00 08090a40 00 0b0c0d40 00 0e0f1040 00 11121340 00 14151640 00 17181940 00 1a1b1c40 00 1d1e5e40 00 1f206040 00 21226240 00 23242540 00 26272840 00 292a2b40 00 2c2d6d40 00 2e2f6f40 00 30317140 00 14153940 00 17181940 00 32335472 00 34353640 00 1f204040 00 21224040 00 23242561 00 26272840 02 37387840