-- title: The Right Coin -- author: Fabien Freling, Pascal Batty -- desc: Sell coins for medicine (Ludum Dare 44) -- script: lua t=0 s=8 -- sprite/cell size w=240 mw=w/s h=136 mh=h/s GameState = { start=0, game=1, gameover=2, market=3 } currentState = GameState.start life=100 coinBlue=0 valueBlue=1.0 coinRed=0 valueRed=5.0 coinYellow=0 valueYellow=0.8 MarketOptions = { blue=0, red=1, yellow=2, all=3, done=4 } marketSelection = MarketOptions.blue secondsAlive=0 sickCounter=20 -- how many seconds before the sickness get stronger? sickLapse=20 -- how many ticks before the life decreases? solids={} do local sols={1, 2, 3, 17} for i,v in pairs(sols) do solids[v]=true end end function sol(x,y) return solids[mget(x//8,y//8)] end g = .15 j = -3.1 anis={ idle={257,257,258,258,259,259,260,260}, run= {273,274,275,276}, jump={289}, fall={290}, coin={ blue= {321,321,322,322,323,323,324,324}, red= {337,337,338,338,339,339,340,340}, yellow={353,353,354,354,355,355,356,356}, } } function drawActor(self) self.spr=self.ani[(((t)//4)% #self.ani)+1] local flip if self.isFlipped then flip = 1 else flip = 0 end spr(self.spr, self.x, self.y, 0, 1, flip) end function hitTest(rect1, rect2) return rect1.x < rect2.x + rect2.w and rect1.x + rect1.w > rect2.x and rect1.y < rect2.y + rect2.h and rect1.y + rect1.h > rect2.y end coinCooldown=160 coinTimer=coinCooldown maxCoin=6 initialCoinDrop=4 coinSpawnCount=2 colors={"blue","red","yellow"} spawnLocs={ {x=1*8, y=5*8}, {x=28*8,y=5*8}, {x=6*8, y=5*8}, {x=23*8,y=5*8}, {x=11*8,y=12*8}, {x=18*8,y=12*8}, {x=2*8, y=11*8}, {x=27*8,y=11*8}, {x=4*8, y=15*8}, {x=25*8,y=15*8}, } coins={} do -- Coin Coin={ color=colors[1], ani=anis.coin.red, spr=0, x=0,y=0, w=8,h=8, } function Coin:new(o) o = o or {} self.__index = self setmetatable(o, self) return o end function Coin:setColor(c) self.color = c if c=="red" then self.ani=anis.coin.red elseif c=="blue" then self.ani=anis.coin.blue elseif c=="yellow" then self.ani=anis.coin.yellow end end function Coin:draw() drawActor(self) end end function randomColor() return colors[math.random(#colors)] end function coinAtLoc(loc) for i,v in pairs(coins) do if v.x == loc.x and v.y == loc.y then return true end end return false end function randomValidSpawnLoc() local loc repeat loc=spawnLocs[math.random(#spawnLocs)] until not coinAtLoc(loc) return loc end function canAddCoin() return #coins < maxCoin end function addRandomCoin() if not canAddCoin() then return end local newCoin=Coin:new() local loc=randomValidSpawnLoc() newCoin:setColor(randomColor()) newCoin.x=loc.x newCoin.y=loc.y coins[#coins + 1]=newCoin coinTimer=coinCooldown end function dropInitialCoins() coins={} for i=1, initialCoinDrop do addRandomCoin() end end -- /MOCK do -- Player Player = { spr=0, ani=anis.idle, x=14.5*8,y=8*8, w=8,h=8, vx=0,vy=0, isFlipped=false } local maxSp=2 local accel=0.3 local decel=0.5 function Player:new(o) o = o or {} self.__index = self setmetatable(o, self) return o end function Player:direct() if btn(2) then self:goLeft() elseif btn(3) then self:goRight() else self:stop() end if btnp(4) and self.vy == 0 then sfx(2,54,15,1) self.vy = j end end function Player:goLeft() if self.vx > 0 then self.vx=0 end self.vx=self.vx - accel if self.vx < -maxSp then self.vx=-maxSp end self.isFlipped = true end function Player:goRight() if self.vx < 0 then self.vx=0 end self.vx=self.vx + accel if self.vx > maxSp then self.vx=maxSp end self.isFlipped = false end function Player:stop() if self.vx < 0 then self.vx= self.vx + decel if self.vx > 0 then self.vx=0 end elseif self.vx > 0 then self.vx= self.vx - decel if self.vx < 0 then self.vx=0 end end end function Player:update() self:resolve() self.x = self.x + self.vx self.y = self.y + self.vy self:collectCoin() end function Player:resolve() if sol(self.x + self.vx, self.y + self.h-1) or sol(self.x + self.vx + self.w-1, self.y + self.h-1) then self.vx = 0 end local roof = self:distanceToRoof() local floor = self:distanceToFloor() if self.vy < roof then self.vy = roof end if self.vy >= floor then self.vy = floor else self.vy = self.vy + g end if self.vy < 0 then self.ani = anis.jump elseif self.vy > 0 then self.ani = anis.fall elseif not (self.vx == 0) then self.ani = anis.run else self.ani = anis.idle end end function Player:distanceToFloor() local y = 0 while (not sol(self.x + self.vx, self.y + y + self.h)) and (not sol(self.x + self.vx + self.w-1, self.y + y + self.h)) and (self.y + y < 128) do y = y + 1 end return y end function Player:distanceToRoof() local y = 0 while (not sol(self.x + self.vx, self.y + y - 1)) and (not sol(self.x + self.vx + self.w-1, self.y + y - 1)) and (self.y + y > 0) do y = y - 1 end return y end function Player:collectCoin() for i,v in pairs(coins) do if hitTest(self, v) then sfx(0) table.remove(coins,i) if v.color == "blue" then coinBlue=coinBlue+1 elseif v.color == "red" then coinRed=coinRed+1 elseif v.color == "yellow" then coinYellow=coinYellow+1 end end end end function Player:draw() drawActor(self) end end function drawStart() cls(1) print("The Right Coin",80,20) spr(80, 20, 30, 0, 3) spr(81, 50, 50, 0, 2) spr(82, 40, 70, 0, 1) local yText=35 print("You're dying, and medicine",130,yText,15,false,1,true) print("ain't cheap. Exchange your",130,yText+10,15,false,1,true) print("most valuable coins for life.",130,yText+20,15,false,1,true) print("The market will dictate how",130,yText+30,15,false,1,true) print("much medicine you can buy.",130,yText+40,15,false,1,true) -- A spr(401,60,90,0) print(": JUMP",70,92) print("(keyboard: Z)",60,98,15,false,1,true) -- B spr(402,130,90,0) print(": ENTER MARKET",140,92) print("(keyboard: X)",130,98,15,false,1,true) if t%60 > 20 then print("Press",75,112) spr(401,108,110,0) print("to start",120,112) end print("Fabien Freling & Pascal Batty", 65, 128, 15, false, 1, true) end function drawGameOver() cls(0) map(0,17,30,17) -- Time alive local minutes = secondsAlive // 60 local seconds = secondsAlive % 60 print("You ran out of time",70,36,6) if minutes == 0 then print("You survived for "..seconds.." seconds.",70,50) elseif minutes == 1 then print("You survived for "..minutes.." minute",70,50) print("and "..seconds.." seconds.",70,64) else print("You survived for "..minutes.." minutes",70,50) print("and "..seconds.." seconds.",70,64) end if t > 120 and t%120 > 20 then print("Press",100,100) spr(401,132,98,0) end end function drawGame() map(0,0,30,17) p:draw() for i,v in pairs(coins) do v:draw() end drawLife(0,0,0) if isOnMarket() then spr(385, 14.5*8, 6*8) end -- Coins / market local coinsOff=110 spr(80,coinsOff,0) print("x"..coinBlue,coinsOff+s,2) spr(81,coinsOff+25,0) print("x"..coinRed,coinsOff+25+s,2) spr(82,coinsOff+50,0) print("x"..coinYellow,coinsOff+50+s,2) -- spr(84,190,0) print(valueBlue,190,2,8) print(valueRed,206,2,12) print(valueYellow,222,2,14) -- Time alive local minutes = secondsAlive // 60 local seconds = secondsAlive % 60 if minutes == 0 then print("Time: "..seconds.." sec", 8, 16) else print("Time: "..minutes.." min "..seconds.." sec", 8, 16) end end function drawLife(x,y,next) spr(83,x,y,0) local color=11 -- green if life < 25 then color=6 -- red elseif life < 50 then color=9 -- orange end local xmin=11 local xmax=107 local lifeLimit=(xmax-xmin)*life/100+xmin for i=lifeLimit,xmax do pix(x+i,y+1,0) pix(x+i,y+2,0) pix(x+i,y+3,0) pix(x+i,y+4,0) pix(x+i,y+5,0) pix(x+i,y+6,0) end local blink=30 if t%blink > (blink/3) then local potential=math.min(xmax,lifeLimit+next) for i=lifeLimit,potential do pix(x+i,y+1,8) pix(x+i,y+2,8) pix(x+i,y+3,8) pix(x+i,y+4,8) pix(x+i,y+5,8) pix(x+i,y+6,8) end end for i=xmin,lifeLimit do pix(x+i,y+1,color) pix(x+i,y+2,color) pix(x+i,y+3,color) pix(x+i,y+4,color) pix(x+i,y+5,color) pix(x+i,y+6,color) end spr(85,x+10,y,0) for i=18,100,8 do spr(86,x+i,y,0) end spr(85,x+100,y,0,1,1) end function drawMarket() -- Background xOff=2 yOff=2 for i=xOff+1, mw-2-xOff do spr(64,i*s,yOff*s,0,1,0,1) spr(64,i*s,(mh-1-yOff)*s,0,1,2,1) end for j=yOff+1, mh-2-xOff do spr(64,xOff*s,j*s,0,1,0,0) spr(64,(mw-1-xOff)*s,j*s,0,1,1,0) end spr(65,xOff*s,yOff*s,0,1,0,1) spr(65,(mw-1-xOff)*s,yOff*s,0,1,0,2) spr(65,(mw-1-xOff)*s,(mh-1-yOff)*s,0,1,0,3) spr(65,xOff*s,(mh-1-yOff)*s,0,1,0,0) for i=xOff+1, mw-2-xOff do for j=yOff+1, mh-2-xOff do spr(66,i*s,j*s,0,1,0,1) end end -- Coins spr(80,4*s,4*s,0) print("x"..coinBlue,5*s+4,4*s+2) print("x"..valueBlue,8*s+4,4*s+2,8) print("= "..math.floor(coinBlue*valueBlue),12*s,4*s+2) spr(83,15*s,4*s,0) print("Buy",20*s,4*s+2) spr(81,4*s,6*s,0) print("x"..coinRed,5*s+4,6*s+2) print("x"..valueRed,8*s+4,6*s+2,12) print("= "..math.floor(coinRed*valueRed),12*s,6*s+2) spr(83,15*s,6*s,0) print("Buy",20*s,6*s+2) spr(82,4*s,8*s,0) print("x"..coinYellow,5*s+4,8*s+2) print("x"..valueYellow,8*s+4,8*s+2,14) print("= "..math.floor(coinYellow*valueYellow),12*s,8*s+2) spr(83,15*s,8*s,0) print("Buy",20*s,8*s+2) print("Buy all",19*s,10*s+2) print("Done",20*s,12*s+2) -- Selection local next=0 if marketSelection == MarketOptions.blue then spr(97,19*s,4*s+1,0) spr(97,22*s,4*s+1,0,1,1) next=math.floor(coinBlue*valueBlue) elseif marketSelection == MarketOptions.red then spr(97,19*s,6*s+1,0) spr(97,22*s,6*s+1,0,1,1) next=math.floor(coinRed*valueRed) elseif marketSelection == MarketOptions.yellow then spr(97,19*s,8*s+1,0) spr(97,22*s,8*s+1,0,1,1) next=math.floor(coinYellow*valueYellow) elseif marketSelection == MarketOptions.all then spr(97,18*s,10*s+1,0) spr(97,24*s,10*s+1,0,1,1) next=math.floor(coinBlue*valueBlue) next=next+math.floor(coinRed*valueRed) next=next+math.floor(coinYellow*valueYellow) elseif marketSelection == MarketOptions.done then spr(97,19*s,12*s+1,0) spr(97,23*s,12*s+1,0,1,1) end drawLife(4*s,12*s,next) end function draw(state) if currentState == GameState.start then drawStart() elseif currentState == GameState.game then drawGame() elseif currentState == GameState.market then drawGame() drawMarket() elseif currentState == GameState.gameover then drawGameOver() end end function setInitialGameState() p=Player:new() t=0 secondsAlive=0 life=100 dropInitialCoins() sickCounter=20 -- how many seconds before the sickness get stronger? sickLapse=20 -- how many ticks before the life decreases? coinBlue=0 coinRed=0 coinYellow=0 end function update(state) if currentState == GameState.start then if btnp(4) then -- A (Z key) currentState = GameState.game setInitialGameState() end elseif currentState == GameState.game then updateGame() elseif currentState == GameState.market then updateMarket() elseif currentState == GameState.gameover then if t > 120 and btnp(4) then -- A (Z key) currentState = GameState.start end end end function isOnMarket() return mget(p.x/s,p.y/s) == 48 or mget(p.x/s,p.y/s) == 49 end function updateGame() if life == 0 then sfx(4,20,130) currentState = GameState.gameover t=0 return end if t%sickLapse == 0 then life=life-1 end if t%60 == 0 then sickCounter = sickCounter - 1 secondsAlive = secondsAlive + 1 end if sickCounter==0 and sickLapse>1 then sickLapse=math.max(sickLapse-2,1) sickCounter=20 end p:direct() p:update() if isOnMarket() then if btnp(5) then -- B (X key) if currentState == GameState.game then sfx(1,68,-1,3) end currentState = GameState.market end end if not canAddCoin() then coinTimer=coinCooldown elseif coinTimer>0 then coinTimer=coinTimer-1 end if coinTimer == 0 then for i=1, coinSpawnCount do addRandomCoin() end end -- Coin market, capped to 9.9 valueBlue=math.floor((math.sin(t/200)+1)*50)/10 if t%60 == 0 then valueRed=math.random(0,99)/10 end valueYellow=math.min(.1*coinYellow*coinYellow, 9.9) end function updateMarket() if btnp(0) then -- Up if marketSelection ~= MarketOptions.blue then marketSelection = marketSelection - 1 end elseif btnp(1) then -- Down if marketSelection ~= MarketOptions.done then marketSelection = marketSelection + 1 end elseif btnp(4) then -- A (Z key) if marketSelection == MarketOptions.blue then if coinBlue > 0 then sfx(3,44,-1,1) end life = life + math.floor(coinBlue*valueBlue) coinBlue=0 elseif marketSelection == MarketOptions.red then if coinRed > 0 then sfx(3,44,-1,1) end life = life + math.floor(coinRed*valueRed) coinRed=0 elseif marketSelection == MarketOptions.yellow then if coinYellow > 0 then sfx(3,44,-1,1) end life = life + math.floor(coinYellow*valueYellow) coinYellow=0 elseif marketSelection == MarketOptions.all then if (coinBlue + coinRed + coinYellow) > 0 then sfx(3,44,-1,1) end life = life + math.floor(coinBlue*valueBlue) life = life + math.floor(coinRed*valueRed) life = life + math.floor(coinYellow*valueYellow) coinBlue=0 coinRed=0 coinYellow=0 elseif marketSelection == MarketOptions.done then currentState = GameState.game end life=math.min(life,100) elseif btnp(5) then -- B (X key) currentState = GameState.game end end p=Player function TIC() update(currentState) draw(currentState) t=t+1 end -- -- 001:0bbbbbbbbb5b55b5b54544545444444444444444444444c44c44444444444444 -- 002:bbbbbbbb5b55b55b454454454444444444444444444444c44c44444444444444 -- 003:bbbbbbb0b55b555b544544554444444544444444444444c44c44444444444444 -- 017:444444444444c4444c444444444444c444444444444444c444c4444444444444 -- 032:000000000000ffff0000fff600fffff600fffff600ff666600ff666600fffff6 -- 033:00000000ffff00006fff00006fffff006fffff006666ff006666ff006fffff00 -- 048:00fffff600fffff600ffffff00f3333300f3333300f33ff300f33ff300f33ff3 -- 049:6fffff006fffff00ffffff0033333f0033333f003ff33f003ff33f003ff33f00 -- 064:03aaaa3703aaaa3703aa3a3703aaaa3703aaaa3703aaaa3703a3aa3703aaaa37 -- 065:03aaaa3703aa3a3303aaaaaa03aaaaaa03aaaa3a033aaaaa0033333300000000 -- 066:7777777777777777777777777777777777777777777777777777777777777777 -- 080:0088880008822880082882800828828008288280082882800882288000888800 -- 081:00cccc000cc66cc00c6cc6c00c6cc6c00c6cc6c00c6cc6c00cc66cc000cccc00 -- 082:00eeee000ee99ee00e9ee9e00e9ee9e00e9ee9e00e9ee9e00ee99ee000eeee00 -- 083:0660066066666666666666666666666666666666066666600066660000066000 -- 084:000008880000880000880000008eeeee08ee00008ee666608666006680000000 -- 085:0333333333000000300000003000000030000000300000003300000003333333 -- 086:3333333300000000000000000000000000000000000000000000000033333333 -- 096:7773377777733377777333373333333333333333777333377773337777733777 -- 097:0006660000660000066000000660000006600000066000000066000000066600 -- 192:0000000000000000000000000000000000000000000000000000000000000003 -- 193:0000000000000000000033370033377703377777337777773377777737777777 -- 194:0000000000000000777770007777777077777777777777777777777777777777 -- 195:0000000000000000000000000000000000000000700000007700000077700000 -- 208:0000000300000033000003330000033700000337000003370000033700000337 -- 209:3777777777777777777777777777733377773333777333337733377377337773 -- 210:7777777777777733777773337777733737337337373373333733733337337337 -- 211:7770000037770000337700007377000073770000337700003777000077770000 -- 224:0000033700000337000003370000033700000337000003370000033700000337 -- 225:7733777377333333773333377733733377337733773377777777777777777777 -- 226:3733733777337337773377777733777737777777777777777777777777777777 -- 227:7777000077770000777700007777000077770000777700007770000077000000 -- 240:0000033700000337000003370000033700000337000000000000000000000000 -- 241:7777777777777777777777707777000000000000000000000000000000000000 -- 242:7777777077770000000000000000000000000000000000000000000000000000 -- -- -- 001:000000000000000000001100000111100000cc00000666600006c66c00080080 -- 002:0000000000001100000111100000cc00000666600006c66c0008008000080080 -- 003:0000000000001100000111100000cc000006c66c000666600008008000080080 -- 004:000000000000000000001100000111100000cc000006c66c0006666000080080 -- 017:0000000000001100000111100000cc00000666600006c66c0008008000000080 -- 018:000000000000000000001100000111100000cc00000666600006c66c00080080 -- 019:0000000000001100000111100000cc00000666600006c66c0008008000080000 -- 020:000000000000000000001100000111100000cc00000666600006c66c00080080 -- 033:00001100000111100000cc0c00066c6000066660000800800080008000000000 -- 034:000011000001111000c0cc0c0006666000066660000800880000800000000000 -- 065:0088880008822880082882800828828008288280082882800882288000888800 -- 066:0008800000882200008828000088280000882800008828000088220000088000 -- 067:0008800000288200002882000028820000288200002882000028820000088000 -- 068:0008800000228800008288000082880000828800008288000022880000088000 -- 081:00cccc000cc66cc00c6cc6c00c6cc6c00c6cc6c00c6cc6c00cc66cc000cccc00 -- 082:000cc00000cc660000cc6c0000cc6c0000cc6c0000cc6c0000cc6600000cc000 -- 083:000cc000006cc600006cc600006cc600006cc600006cc600006cc600000cc000 -- 084:000cc0000066cc0000c6cc0000c6cc0000c6cc0000c6cc000066cc00000cc000 -- 097:00eeee000ee99ee00e9ee9e00e9ee9e00e9ee9e00e9ee9e00ee99ee000eeee00 -- 098:000ee00000ee990000ee9e0000ee9e0000ee9e0000ee9e0000ee9900000ee000 -- 099:000ee000009ee900009ee900009ee900009ee900009ee900009ee900000ee000 -- 100:000ee0000099ee0000e9ee0000e9ee0000e9ee0000e9ee000099ee00000ee000 -- 129:0a66aaa0aa6a6aaaaa6666aaaa6aa6aa3a6666a303aaaa30003aa30000033000 -- 145:0000000006666660066006600660066006666660066006600660066000000000 -- 146:0000000006666000066066000666666006600660066006600666666000000000 -- -- -- 001:111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 002:110000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 003:110000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 004:110000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 005:110000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 006:112030000010202030000000000000000000000000102020300000102011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 007:111111000011111100000000000002120000000000001111110000111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 008:110000000000000000000000000003130000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 009:110000000000000000000010202020202020300000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 010:110000000000000000000000111111111111000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 011:110000000000000000000000001111111100000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 012:110010202020300000000000000000000000000000001020202020300011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 013:110011111111000000001030000000000000103000000000111111110011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 014:110000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 015:110000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 016:112020202020202020202020202020202020202020202020202020202011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 021:00000c1c2c3c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 022:00000d1d2d3d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 023:00000e1e2e3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 024:00000f1f2f3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- -- -- 000:00000000ffffffff00000000ffffffff -- 001:0123456789abcdeffedcba9876543210 -- 002:0123456789abcdef0123456789abcdef -- -- -- 000:0040004000a000a000f000f010f020f030f040f050f060f070f080f090f0a0f0b0f0c0f0d0f0e0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0400000000000 -- 001:01f011f021f031f041f061f081f0a1f0c1f0d1f0e1f0f1f0f100010001001100110011002100310041005100610071008100a100c100d100e100f100577000000000 -- 002:02000200020002101210122022303250428062a072d092f0b2f0d2f0e2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0f2f0415000000000 -- 003:0000002010401020204020603040406040805060608060a0708070a080c090a0a0c0c0e0c0c0d0e0e0f0e0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0301000000000 -- 004:01f001f001f001f001f001b001b001b001b001b001700170017001700170010001200100012001000120010001200100012001000100010001000100167000000000 -- -- -- 000:140c1c44243430346d4e4a4e854c30346524d04648757161597dced27d2c8595a16daa2cd2aa996dc2cadad45edeeed6 -- -- -- 000:e4b000007494648393160f00880077000012ffb0e45445353414055423e2033010000000129f40402000ff00c2000000000f0088007841c0c10d6484e4a4e495d7ec2daa99ad4de5d6aac20343d62dd7c2edee6d58c40343564244424300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080ff001040800004021c28004082c58c0b1a3c780132a4c9841b263448507086c1081b3a74f84024218f842d36183950a4aac59c2b5abce830366cc28a0d08dcb98337aecd9c3b7afcf9f3f52d4108053e1830a15822c093034a2d28721102839f4baa551a23562d40ac5bba7dfac3f921dc8847002529902d294201089e8cf8963109c20359e6a48ba695e64f8b7b0a847a815426449629a26cca333128d5cc8b13e41b54bce955b495e6ede8c6dd208acb9d2bc539577a67e1dc95562500c1b86a609f6df6b68a92d03c6002bd022edae837bee0aa47c2a69c9a3e6141ef9137bdcc3c3f21ff867de62ffcbc75e6c5d8abfe2d7d00ef2242c77167c6899511a0ff8dd4ebcfd48c46d86075e0df36664ed91a7b70d15fea0f1db9f527c4a7a7530ece32106f69161b51805974a59873e997c0a36db9f6645954a9c75c166c6d1731e37371d5575681f5b4d75f77a10818db528d6740ed548d743097461db8036c8232c8d1d4775967651a4ddd55c36f8d19200460924e094461964e1984629a4e29c4639e4e390564925e49b421054a594426934a692427914a7904289a088946e596666976e6996679b6e79d6689f6e8917699866d9a6ad9272e9e6ae9072f997ed9082b9e72d918ee9586f978ef92862a48e2ae8a1af822a19a2a6463a09e5a2926a4966ac9e6ae9a5ad928af9ec94ae0a5a23a7a259aaeaaca6baeaeba0b6cffa84a8a4b6aaa96da6a6ea8aaea392eabbefadb6a9eb60bcbeda6b68a7ce8a5c22bbca2b0ca1be7aca2de4b4d65b6de5b646c5e95b4791247f9f80e68b2ee8b4e69b50929a52e7eda56beac7d157bfeed7fda6b6e6db6fedb8fef8092898f5564cd6b871cbf1627316589fe1c8072cf497aa66fbcee3c791cbac50c3075ca0f5c8176c8054ba083c9f1bb30b0cfd6bb5cdcb32b6c827ac6e23965aace2fbc0379b67a79137dc63fdce257a442ecc37fcc3b39e370d24bac8e60934f1d8432ce82fb9473de4f8bc03b9f4f4d45b55c175d8576db21bcd1b6de5f7d00ccc3428d4636da3f8d567ade430da67bd7471d04abd2770db4fec37fdd7374de62edc77cffc757fd087acc570e4876c26b095872e90f9d88b2ee8fdbc63e87fae8f87eb493eb6368d946abc41686f645d165e5f28e5b59b1162557f8dfe5b539786b3a8e3e6372a9db669a716b89d0fae8d19b2bfbe0b78bdbfdb5b7dea9f4a17beeda7d7fb79b1c3de0c51fb977c8cf7eeaf2fcb75fecbde78b1dd9ff76e29eebb5fc328f2cb952123e64308edf8eb2a8f2ee5e5ef96e4a75f45386088e6f7dfd51cda0c2060c20ef300ad4408004ff905608ffb00a20318ff360a00d1820c7c120908b0420240708a0430eb462851c506ae684b0002580bf732c21e20e0812c21a80758dfb61ab0108c2400a4035813ca1aa094813c31e60968f2ca12eec87642d1ab4ff648fa21262e888ea2322b4098f4af12bd2762ba7c94b4821baa5151f958c2922617457542610a0c40a2a2e0b03525c1327a4c8172db549ab80b2d26ca8d88d2bb1419a4ee329caa0e8aa2f51b15f8133d61dbcf60d204de135566443e2ba6617918c9c88658c7983b0881849a9327b8d2b799f1519f747953ba2937c84a6a0a487405a525b589c54a6cee839c75951359e94831cc2d2881c42cc639d5be423beb86bab2e81f59908856004067ac74e5a4799c2a32b25a4cbc44ef23394435558295557c8f0c27996a48d1ff2a9794a6203da9bf293a8fcf80e438164810c007c9a15e48d498883b024e427a2eef6eeb408a3b42beb0cd0eae82f4104a5412bfff4d729421458bde5cd0f9cfcc76f37d9209b0dee8f68eb186c3b0a015f7e742534d1b7639ad66fbc8edf4d67dc4b170f28614a063054ad1c19650f28014d069de389eb2bdffa78035e1aa0f6823d512d436a43552e7dec9c942b1313e8052d9a7d0e94630a2a275a55aa56159299ca5522571543b4b903f69e5caaa3479ae4c69e25d8a352e8e5491ac554b1eda3a36d65e45d95d7369e557e676533e6a2da95547285daa455365a5315b659b5855ca77bb76959ead6533dd51aac756b606969d8b2b6c559a68ddb6e5dd6f4c4cd41bd6993b364fe1b0830c21a82b6eb119744dac852cd16f0549d7e9d13ead3d082351d45a5bd956188e6c63aad6877697dff64f26b57dc2ec6d4bf1118686d2ae6d8a6ade47515c8434f7b99d82276d3bf9dfae7443aa3986e101ab04929095b32f152960014a825a0aa45aba29ce6947cbcd5196a473adc59413dc32f2db96f0f6a93dc1287952deda1eb7d688fd716e4f4b54329cf45a524d9f264efb17c00315d8b17410ba4c1ba55407f7b7bba545928dab116dc227d7bcf54c29672cdbd0ee1bc2bb85bda5b83c01660b8839472e659dbab2033617db62b9ed325aba4c3ad545db2bb7e5791e8dbb8e527958de46b5e2da7f74e1e2ca8baebd2cdfaac09c53521eb8b8c98522f3836c9b5e2a9b80c44a00b2c0bc02c717587f643e3b5a81a9b237e2ac22b0535e25956c71ef2bb2bffcc1c2d4a481ec66d23d985b42c5d714913be3a9aa623c856ed37b934c16675979994276443d9f553663219850c7dd747d114b2960f2f419b596e62c633d39e4a27ab3d48d82f7af777cd15b8f0dc6ae7a94ea7419e4573dab7b0d58573d8cea64ad4f85d8a5c47da3867b6e1d1877d74be5f55cfa0c6b5f17857d76c5a8ab8d2438538ba4dcce4adaad7dd42aea5bfad8dec6b6b372cf32f294bcb72df6b8b3cd4e67028bdcd3e64779b34abeede6ab9ddaee873cb7edeee67b945edef30d6c47fd0fdcfec4dfd6350872950ed4e283fb90e70fbfa2cffdb0f0873c70ef0738fd437dc0ea8b5cf2e04d5c26c73ec1fe8ba2b9a027d0ff8ddc53ea378c94e4881203e9c74ec2739b8cd5e82f59b95fc9e1fa9bdcf6e94a08000b3 --