New version of Pong. Update version numbers.

This commit is contained in:
evancz 2012-12-08 12:53:16 -08:00
parent 5dcb6f7c31
commit 28c3a711ed
9 changed files with 216 additions and 4022 deletions

View file

@ -57,41 +57,17 @@ module Pong where
import JavaScript
import Keyboard.Raw
import Window as Win
-- Set the frames per second (FPS) to 60, calculate the deltas (the
-- difference between the two latest times, the amount of time since
-- the last frame), and convert the time into a number of seconds.
delta = lift inSeconds (fps 60)
------------------------------------------------------------------------
------ Extracting timesteps from JavaScript ------
------------------------------------------------------------------------
-- Export our desired FPS to JavaScript. We just want a steady 30 frames
-- per second for this game.
desiredFPS = constant (castIntToJSNumber 30)
foreign export jsevent "desiredFPS"
desiredFPS :: Signal JSNumber
-- Import the current time from JavaScript. Events will come in roughly
-- 30 times per second.
foreign import jsevent "trigger" (castIntToJSNumber 0)
jsTime :: Signal JSNumber
time = lift castJSNumberToFloat jsTime
-- Determine the time that has elapsed since the last event. This is
-- our timestep, telling us how far everything should move in the next
-- frame.
delta = lift snd $ foldp (\t1 (t0,d) -> (t1, t1-t0)) (0,0) time
------------------------------------------------------------------------
------ Modelling user input ------
------ Modelling User Input ------
------------------------------------------------------------------------
-- Each paddle can be moving up, down, or not at all. We'll call this
@ -117,11 +93,11 @@ defaultKeyInput = KeyInput False Neutral Neutral
updateDirection upKey downKey key direction =
case direction of
{ Up -> if key == downKey then Neutral else Up
; Down -> if key == upKey then Neutral else Down
; Neutral -> if key == upKey then Up else
Up -> if key == downKey then Neutral else Up
Down -> if key == upKey then Neutral else Down
Neutral -> if key == upKey then Up else
if key == downKey then Down else Neutral
}
updateDirection1 = updateDirection 87 83 -- 'w' for up and 's' for down
updateDirection2 = updateDirection 38 40 -- 'UP' for up and 'DOWN' for down
@ -216,10 +192,9 @@ defaultGame = GameState BetweenRounds
stepPaddle delta dir (Paddle y) =
case dir of
{ Up -> Paddle $ clamp 20 (gameHeight-20) (y - 200 * delta)
; Down -> Paddle $ clamp 20 (gameHeight-20) (y + 200 * delta)
; Neutral -> Paddle y
}
Up -> Paddle $ clamp 20 (gameHeight-20) (y - 200 * delta)
Down -> Paddle $ clamp 20 (gameHeight-20) (y + 200 * delta)
Neutral -> Paddle y
-- We must also step the ball forward. This is more complicated due to
@ -241,14 +216,13 @@ stepVelocity velocity lowerCollision upperCollision =
if upperCollision then makeNegative velocity else velocity
stepBall delta (Ball (x,y) (vx,vy)) (Paddle y1) (Paddle y2) =
let { hitPaddle1 = within 20 y1 y && within 8 25 x
; hitPaddle2 = within 20 y2 y && within 8 (gameWidth - 25) x
; vx' = stepVelocity vx hitPaddle1 hitPaddle2
; vy' = stepVelocity vy (y < 7) (y > gameHeight - 7)
; scored = x > gameWidth || x < 0
; x' = if scored then halfWidth else x + vx' * delta
; y' = if scored then halfHeight else y + vy' * delta
}
let hitPaddle1 = within 20 y1 y && within 8 25 x
hitPaddle2 = within 20 y2 y && within 8 (gameWidth - 25) x
vx' = stepVelocity vx hitPaddle1 hitPaddle2
vy' = stepVelocity vy (y < 7) (y > gameHeight - 7)
scored = x > gameWidth || x < 0
x' = if scored then halfWidth else x + vx' * delta
y' = if scored then halfHeight else y + vy' * delta
in ( Ball (x',y') (vx',vy')
, if x > gameWidth then 1 else 0
, if x < 0 then 1 else 0 )
@ -259,15 +233,16 @@ stepBall delta (Ball (x,y) (vx,vy)) (Paddle y1) (Paddle y2) =
stepGame (Input delta (KeyInput space dir1 dir2))
(GameState state (Score s1 s2) ball paddle1 paddle2) =
let { (ball',s1',s2') = if state == Play then stepBall delta ball paddle1 paddle2
else (ball, 0, 0)
; state' = case state of { Play -> if s1' /= s2' then BetweenRounds else state
; BetweenRounds -> if space then Play else state }
} in GameState state'
(Score (s1+s1') (s2+s2'))
ball'
(stepPaddle delta dir1 paddle1)
(stepPaddle delta dir2 paddle2)
let (ball',s1',s2') = if state == Play then stepBall delta ball paddle1 paddle2
else (ball, 0, 0)
state' = case state of
Play -> if s1' /= s2' then BetweenRounds else state
BetweenRounds -> if space then Play else state
in GameState state'
(Score (s1+s1') (s2+s2'))
ball'
(stepPaddle delta dir1 paddle1)
(stepPaddle delta dir2 paddle2)
-- Now we put it all together. We have a signal of inputs that changes whenever there
@ -296,14 +271,13 @@ gameState = foldp stepGame defaultGame input
-- This function displays the current score and directions.
scoreBoard w inPlay p1 p2 =
let { code = text . monospace . toText
; stack top bottom = flow down [ code " ", code top, code bottom ]
; msg = width w . centeredText . monospace $ toText "Press SPACE to begin"
; board = flow right [ stack "W" "S", spacer 20 1
, text . Text.height 4 . toText $ show p1 ++ " " ++ show p2
, spacer 20 1, stack "&uarr;" "&darr;" ]
; score = container w (heightOf board) midTop board
}
let code = text . monospace . toText
stack top bottom = flow down [ code " ", code top, code bottom ]
msg = width w . centeredText . monospace $ toText "Press SPACE to begin"
board = flow right [ stack "W" "S", spacer 20 1
, text . Text.height 4 . toText $ show p1 ++ " " ++ show p2
, spacer 20 1, stack "&uarr;" "&darr;" ]
score = container w (heightOf board) midTop board
in if inPlay then score else score `above` msg
@ -324,18 +298,4 @@ display (w,h) (GameState state (Score p1 p2) (Ball pos _) (Paddle y1) (Paddle y2
-- We can now define a view of the game (a signal of Elements) that changes
-- as the GameState changes. This is what the users will see.
view = lift2 display Win.dimensions gameState
-- Here we tell the JavaScript FPS manager that all of the computations for
-- this frame are complete. This allows the manager to calculate when the next
-- step should happen.
done = lift (\_ -> castBoolToJSBool True) view
foreign export jsevent "finished"
done :: Signal JSBool
-- And finally, we display the view of the game to the user: Pong in Elm!
main = view
main = lift2 display Window.dimensions gameState

View file

@ -33,27 +33,27 @@ Elm.Prelude = function() {
var logBase=function(b){return function(x){return Math.log(x)/Math.log(b);};};
function readInt(str) {
var s = JavaScript.castStringToJSString(str);
var s = Elm.JavaScript.castStringToJSString(str);
var len = s.length;
if (len === 0) { return Nothing; }
if (len === 0) { return ["Nothing"]; }
var start = 0;
if (s[0] == '-') {
if (len === 1) { return Nothing; }
if (len === 1) { return ["Nothing"]; }
start = 1;
}
for (var i = start; i < len; ++i) {
if (!Char.isDigit(s[i])) { return Nothing; }
if (!Char.isDigit(s[i])) { return ["Nothing"]; }
}
return ["Just", parseInt(s)];
}
function readFloat(str) {
var s = JavaScript.castStringToJSString(str);
var s = Elm.JavaScript.castStringToJSString(str);
var len = s.length;
if (len === 0) { return Nothing; }
if (len === 0) { return ["Nothing"]; }
var start = 0;
if (s[0] == '-') {
if (len === 1) { return Nothing; }
if (len === 1) { return ["Nothing"]; }
start = 1;
}
var dotCount = 0;
@ -63,7 +63,7 @@ Elm.Prelude = function() {
dotCount += 1;
if (dotCount <= 1) { continue; }
}
return Nothing;
return ["Nothing"];
}
return ["Just", parseFloat(s)];
}
@ -77,8 +77,17 @@ Elm.Prelude = function() {
div : function(x) { return function(y) { return ~~(x / y); }; },
otherwise : true,
compare : function(x) { return function (y) {
x = (typeof x === "object") ? toText(x) : x;
y = (typeof y === "object") ? toText(y) : y;
if (x instanceof Array && y instanceof Array) {
var len = x.length;
if (len == y.length) {
for (var i = 0; i < len; ++i) {
var cmp = compare(x[i])(y[i]);
if (cmp[0] === 'EQ') continue;
return cmp;
}
return ['EQ'];
}
}
return [ x === y ? 'EQ' : (x < y ? 'LT' : 'GT') ];
};
},
@ -144,6 +153,10 @@ Elm.Prelude = function() {
lift2 : Elm.Signal.lift2,
lift3 : Elm.Signal.lift3,
lift4 : Elm.Signal.lift4,
lift5 : Elm.Signal.lift5,
lift6 : Elm.Signal.lift6,
lift7 : Elm.Signal.lift7,
lift8 : Elm.Signal.lift8,
foldp : Elm.Signal.foldp,
foldp1 : Elm.Signal.foldp1,
foldp_ : Elm.Signal.foldp_,

View file

@ -2,4 +2,4 @@ copy /B Guid.js+foreign\JavaScript.js+foreign\JSON.js+Value.js+List.js+Maybe.js+
cd ..\elm
copy /B ..\elm-mini.js elm-runtime-0.5.5.js
copy /B ..\elm-mini.js elm-runtime-0.6.js

View file

@ -192,6 +192,11 @@ Elm.Signal = function() {
s2.kids.push(this);
};
function merges(ss) {
function mrg(x) { return function(y) { return new merge(x,y); }; }
return Elm.List.foldl1(mrg)(ss);
}
function average(sampleSize) { return function(s) {
var sample = new Array(sampleSize);
var i = sampleSize;
@ -250,6 +255,7 @@ Elm.Signal = function() {
return new fold(f,function(x){return x;},true,e); }; },
delay : delay,
merge : function(s1) { return function(s2) { return new merge(s1,s2)}; },
merges : merges,
average : average,
count : function(sig) {
var incr = function(_){return function(c){return c+1;};};

View file

@ -7,12 +7,12 @@ import Data.List (isPrefixOf, isSuffixOf)
import Data.Version (showVersion)
import Happstack.Server
import Happstack.Server.Compression
import System.Directory (makeRelativeToCurrentDirectory)
import System.Environment
import System.FilePath
import qualified Language.Elm as Elm
import Paths_elm_server
runtime = "elm-" ++ showVersion version ++ ".js"
runtime = "/elm-" ++ showVersion version ++ ".js"
serve :: String -> IO ()
serve libLoc = do
@ -25,17 +25,15 @@ serve libLoc = do
]
pageTitle :: String -> String
pageTitle fp =
reverse . takeWhile (/='/') . drop 1 . dropWhile (/='.') $ reverse fp
pageTitle = dropExtension . takeBaseName
serveElm fp = do
let ('/':filePath) = fp
guard (".elm" `isSuffixOf` filePath)
content <- liftIO (readFile filePath)
ok . toResponse $ Elm.toHtml runtime (pageTitle filePath) content
guard (takeExtension fp == ".elm")
content <- liftIO (readFile (tail fp))
ok . toResponse $ Elm.toHtml runtime (pageTitle fp) content
serveLib libLoc fp = do
guard (fp == '/' : runtime)
guard (fp == runtime)
serveFile (asContentType "application/javascript") libLoc
main :: IO ()

View file

@ -1,5 +1,5 @@
Name: elm-server
Version: 0.5.0
Version: 0.6
Synopsis: The Elm language server.
Description: This package provides a standalone, Happstack-based Elm server.
@ -34,5 +34,5 @@ Executable elm-server
HTTP >= 4000,
happstack-server == 7.0.2,
deepseq,
directory,
Elm >= 0.5.0
filepath,
Elm >= 0.6

View file

@ -1,6 +1,6 @@
Name: Elm
Version: 0.5.5
Version: 0.6
Synopsis: The Elm language module.
Description: Elm aims to make client-side web-development more pleasant.
It is a statically/strongly typed, functional reactive
@ -22,7 +22,7 @@ Category: Compiler, Language
Build-type: Simple
Extra-source-files: changelog.txt
Data-files: elm-runtime-0.5.5.js
Data-files: elm-runtime-0.6.js
Cabal-version: >=1.8
source-repository head

File diff suppressed because it is too large Load diff

134
elm/elm-runtime-0.6.js Normal file
View file

@ -0,0 +1,134 @@
Elm={};var Guid=function(){var d=0;return{guid:function(){return d+=1}}}();
Elm.JavaScript=function(){function d(b){for(var a=["Nil"],c=b.length;c--;)a=["Cons",b[c],a];return a}function c(b){for(var a=[];"Cons"===b[0];)a.push(b[1]),b=b[2];return a}function b(b){return b.slice(1)}function e(b){return["Tuple"+b.length].concat(b)}return{castJSBoolToBool:function(b){return b},castBoolToJSBool:function(b){return b},castJSNumberToFloat:function(b){return b},castFloatToJSNumber:function(b){return b},castJSNumberToInt:function(b){return~~b},castIntToJSNumber:function(b){return b},
Experimental:{castJSElementToElement:function(b){return function(a){return function(c){return["Element",Guid.guid(),["EExternalHtml",c],b,a,1,Nothing,Nothing]}}},castElementToJSElement:function(b){return Render.render(b)}},castJSArrayToList:d,castListToJSArray:c,castJSStringToString:d,castStringToJSString:function(b){return"string"===typeof b?b:c(b).join("")},castTupleToJSTuple2:b,castTupleToJSTuple3:b,castTupleToJSTuple4:b,castTupleToJSTuple5:b,castJSTupleToTuple2:e,castJSTupleToTuple3:e,castJSTupleToTuple4:e,
castJSTupleToTuple5:e}}();var JSjson=window.JSON;
Elm.JSON=function(){function d(a,b){return function(c){return function(n){var h=e.castStringToJSString(c);return n[1].hasOwnProperty(h)&&(n=n[1][h],n[0]===a)?n[1]:b}}}function c(a){return function(b){function c(a){switch(a[0]){case "JsonNull":return null;case "JsonString":return e.castStringToJSString(a[1]);case "JsonObject":var h={},a=a[1][1],f;for(f in a)h[f]=c(a[f]);return h;case "JsonArray":h=e.castListToJSArray(a[1]);for(f=h.length;f--;)h[f]=c(h[f]);return h;default:return a[1]}}return JSjson.stringify(c(["JsonObject",
b]),null,e.castStringToJSString(a))}}function b(a){function b(a){switch(typeof a){case "string":return["JsonString",e.castJSStringToString(a)];case "number":return["JsonNumber",e.castJSNumberToFloat(a)];case "boolean":return["JsonBool",e.castJSBoolToBool(a)];case "object":if(null===a)return["JsonNull"];for(var h in a)a[h]=b(a[h]);return a instanceof Array?["JsonArray",e.castJSArrayToList(a)]:["JsonObject",["JSON",a]]}}var a=JSjson.parse(a),c;for(c in a)a[c]=b(a[c]);return["JSON",a]}var e=Elm.JavaScript,
i=["JSON",{}];return{empty:i,singleton:function(a){return function(b){var c={};c[e.castStringToJSString(a)]=b;return["JSON",c]}},insert:function(a){return function(b){return function(c){var c=c[1],n={},h;for(h in c)n[h]=c[h];n[e.castStringToJSString(a)]=b;return["JSON",n]}}},lookup:function(a){return function(b){var c=e.castStringToJSString(a);return b[1].hasOwnProperty(c)?["Just",b[1][c]]:["Nothing"]}},findString:d("JsonString",["Nil"]),findObject:d("JsonObject",i),findArray:d("JsonArray",["Nil"]),
findWithDefault:function(a){return function(b){return function(c){var n=e.castStringToJSString(b);return c[1].hasOwnProperty(n)?c[1][n]:a}}},remove:function(a){return function(b){var b=b[1],c={},n;for(n in b)c[n]=b[n];delete c[e.castStringToJSString(a)];return["JSON",c]}},toPrettyJSString:c,toJSString:c(""),fromJSString:b,toPrettyString:function(a){return function(b){return e.castJSStringToString(c(a)(b))}},toString:function(a){return e.castJSStringToString(c("")(a))},fromString:function(a){return b(e.castStringToJSString(a))},
toList:function(a){var a=a[1],b=[],c;for(c in a)b.push(Value.Tuple(e.castJSStringToString(c),a[c]));return e.castJSArrayToList(b)},fromList:function(a){for(var a=e.castListToJSArray(a),b={},c=a.length;c--;)b[e.castStringToJSString(a[c][1])]=a[c][2];return["JSON",b]},JsonString:function(a){return["JsonString",a]},JsonNumber:function(a){return["JsonNumber",a]},JsonBool:function(a){return["JsonBool",a]},JsonNull:["JsonNull"],JsonArray:function(a){return["JsonArray",a]},JsonObject:function(a){return["JsonObject",
a]}}}();
var Value=function(){function d(a){if(0==a.length)return a;for(var a=a.replace(/"/g,"&#34;").replace(/'/g,"&#39;").replace(/</g,"&#60;").replace(/>/g,"&#62;").replace(/\n/g,"<br/>"),a=a.split("<br/>"),b=a.length;b--;){var c=a,n=b,h;h=a[b];if(0!=h.length){h=h.split("");" "==h[0]&&(h[0]="&nbsp;");for(var f=h.length;--f;)" "==h[f][0]&&" "==h[f-1]&&(h[f-1]+=h[f],h[f]="");for(f=h.length;f--;)if(1<h[f].length&&" "==h[f][0]){for(var g=h[f].split(""),e=g.length-2;0<=e;e-=2)g[e]="&nbsp;";h[f]=g.join("")}h=h.join("");
h=" "===h[h.length-1]?h.slice(0,-1)+"&nbsp;":h}c[n]=h}return a.join("<br/>")}var c=function(a,b){if("object"===typeof a){if(a===b)return!0;if(a.length!==b.length)return!1;for(var e=a.length;e--;)if(!c(a[e],b[e]))return!1;return!0}return a===b},b=function(a){if("boolean"===typeof a)return a?"True":"False";if("number"!==typeof a){if("string"===typeof a&&2>a.length)return"'"+a+"'";if(a[0]){if("Tuple"===a[0].substring(0,5)){for(var c="",e=a.length;--e;)c=","+b(a[e])+c;","===c[0]&&(c=c.substring(1));return"("+
c+")"}if("Cons"===a[0])for(var e="string"===typeof a[1]?'"':"]",n="string"===typeof a[1]?"":",",h="string"===typeof a[1]?function(a){return a}:b,c=("string"===typeof a[1]?'"':"[")+h(a[1]),a=a[2];;)if("Cons"===a[0])c+=n+h(a[1]),a=a[2];else return c+e;else{if("Nil"===a[0])return"[]";if("JSON"===a[0])return"(JSON.fromList "+b(Elm.JSON.toList(a))+")";if("RBNode"===a[0]||"RBEmpty"===a[0])return a=Elm.Dict.foldr(function(a){return function(h){return function(b){return["Cons",["Tuple2",a,h],b]}}})(["Nil"])(a),
c="Dict","Cons"===a[0]&&"Tuple0"===a[1][2][0]&&(c="Set",a=Elm.List.map(function(a){return a[1]})(a)),"("+c+".fromList "+b(a)+")";c="";for(e=a.length;--e;)c=" "+b(a[e])+c;c=a[0]+c;return 1<a.length?"("+c+")":c}}}return a+""},e=function(a){for(var b=["Nil"],c=a.length;c--;)b=["Cons",a[c],b];return b},i;i=document.addEventListener?function(a,b,c){a.addEventListener(b,c,!1)}:function(a,b,c){a.attachEvent("on"+b,c)};return{eq:c,str:e,show:function(a){return e(b(a))},Tuple:function(){var a=arguments.length,
b=Array(a+1);for(b[0]="Tuple"+arguments.length;a--;)b[a+1]=arguments[a];return b},append:function(a,b){if("string"===typeof a&&"string"===typeof b)return a.concat(b);if("Nil"===a[0])return b;for(var c=["Cons",a[1],["Nil"]],e=c,a=a[2];"Cons"===a[0];)e[2]=["Cons",a[1],["Nil"]],a=a[2],e=e[2];e[2]=b;return c},listToArray:function(a){for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];return b},toText:function(a){if("string"===typeof a)return d(a);for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];return d(b.join(""))},
properEscape:d,getTextSize:function(a,b,c){var e=document.createElement("div");e.innerHTML=c;e.style.textAlign="left";0<a&&(e.style.width=a+"px");e.style.visibility="hidden";e.style.styleFloat="left";e.style.cssFloat="left";document.body.appendChild(e);c=window.getComputedStyle(e,null);a=c.getPropertyValue("width").slice(0,-2)-0;c=c.getPropertyValue("height").slice(0,-2)-0;document.body.removeChild(e);return[Math.ceil(a),Math.ceil(Math.max(b,c))]},getSize:function(a){a=a.cloneNode(!0);a.style.visibility=
"hidden";a.style.styleFloat="left";a.style.cssFloat="left";document.body.appendChild(a);var b=a.offsetWidth,c=a.offsetHeight;document.body.removeChild(a);return[b,c]},getExcess:function(a){a=a.cloneNode(!0);a.style.visibility="hidden";a.style.styleFloat="left";a.style.cssFloat="left";document.body.appendChild(a);var b=a.offsetWidth,c=a.offsetHeight,e=window.getComputedStyle(a,null),h=e.getPropertyValue("width").slice(0,-2)-0,e=e.getPropertyValue("height").slice(0,-2)-0;document.body.removeChild(a);
return[b-h,c-e]},groupForms:function(a){for(var a=Elm.JavaScript.castListToJSArray(a),b=[],c=[],e=a.length;e--;){var h=a[e];switch(h[4][0]){case "FElement":0<c.length&&(b.push(c),c=[]);b.push(h);break;default:c.push(h)}}0<c.length&&b.push(c);return b},wrap:function(a){var b=Value.getSize(a);return["Element",Guid.guid(),["EHtml",a],b[0],b[1],1,["Nothing"],["Nothing"]]},addListener:i}}();
Elm.List=function(){function d(b){return function(a){if("Nil"===a[0])return a;"Cons"!==a[0]&&h("map");for(var c=["Cons",b(a[1]),["Nil"]],f=c,a=a[2];"Cons"===a[0];)f[2]=["Cons",b(a[1]),["Nil"]],a=a[2],f=f[2];return c}}function c(a){return function(b){return function(c){var f=b;if("Nil"===c[0])return f;for("Cons"!==c[0]&&h("foldl");"Cons"===c[0];)f=a(c[1])(f),c=c[2];return f}}}function b(a){return function(b){return function(c){var f=b;if("Nil"===c[0])return f;"Cons"!==c[0]&&h("foldr");for(var g=[];"Cons"===
c[0];)g.push(c[1]),c=c[2];for(c=g.length;c--;)f=a(g[c])(f);return f}}}function e(a){return function(b){var h;"Cons"!==b[0]?h=void 0:(h=b[1],b=b[2],h=c(a)(h)(b));return h}}function i(a){return function(b){return function(c){if("Nil"===c[0])return["Cons",b,["Nil"]];"Cons"!==c[0]&&h("scanl");for(var f=[b];"Cons"===c[0];)b=a(c[1])(b),f.push(b),c=c[2];for(var c=["Nil"],g=f.length;g--;)c=["Cons",f[g],c];return c}}}function a(b){return function(c){a:{for(var h=[function(b){return"Nil"!==b[0]?void 0:["Tuple2",
["Nil"],["Nil"]]},function(c){if("Cons"===c[0]){var h=c[1],c=c[2];var f=a(b)(c);"Tuple2"!==f[0]?h=void 0:(c=f[1],f=f[2],h=b(h)?["Tuple2",["Cons",h,c],f]:["Tuple2",c,["Cons",h,f]]);return h}}],f=h.length;f--;){var g=h[f](c);if(void 0!==g){c=g;break a}}c=void 0}return c}}function j(b){a:{for(var a=[function(b){return"Nil"!==b[0]?void 0:["Tuple2",["Nil"],["Nil"]]},function(b){if("Cons"!==b[0])b=void 0;else if(b=["Tuple2",b[1],j(b[2])],"Tuple2"!==b[0]||"Tuple2"!==b[1][0])b=void 0;else var a=b[1][1],c=
b[1][2],b="Tuple2"!==b[2][0]?void 0:["Tuple2",["Cons",a,b[2][1]],["Cons",c,b[2][2]]];return b}],c=a.length;c--;){var h=a[c](b);if(void 0!==h){b=h;break a}}b=void 0}return b}function l(b){return function(a){a:{for(var c=[function(b){return"Nil"!==b[0]?void 0:["Nil"]},function(b){if("Cons"===b[0]){var a=b[1];return"Nil"!==b[2][0]?void 0:["Cons",a,["Nil"]]}},function(a){if("Cons"===a[0]){var c=a[1];if("Cons"===a[2][0]){var h=a[2][1],a=a[2][2];return["Cons",c,["Cons",b,l(b)(["Cons",h,a])]]}}}],h=c.length;h--;){var f=
c[h](a);if(void 0!==f){a=f;break a}}a=void 0}return a}}function n(b){return function(a){a:{for(var c=[function(b){return"Nil"!==b[0]?void 0:["Nil"]},function(b){if("Cons"===b[0]){var a=b[1];return"Nil"!==b[2][0]?void 0:a}},function(a){if("Cons"===a[0]){var c=a[1];if("Cons"===a[2][0]){var h=a[2][1],a=a[2][2];return Value.append(c,Value.append(b,n(b)(["Cons",h,a])))}}}],h=c.length;h--;){var f=c[h](a);if(void 0!==f){a=f;break a}}a=void 0}return a}}var h=function(b){throw"Function '"+b+"' expecting a list!";
},f=c(function(b){return function(a){return["Cons",b,a]}})(["Nil"]),g=b(function(b){return function(a){return Value.append(b,a)}})(["Nil"]),s=c(function(b){return function(a){return b&&a}})(!0),k=c(function(b){return function(a){return b||a}})(!1),p=c(function(b){return function(a){return b+a}})(0),m=c(function(b){return function(a){return b*a}})(1),x=e(function(b){return function(a){return Math.max(b,a)}}),u=e(function(b){return function(a){return Math.min(b,a)}});return{head:function(b){if("Cons"!==
b[0])throw"Error: 'head' only accepts lists of length greater than one.";return b[1]},tail:function(b){if("Cons"!==b[0])throw"Error: 'tail' only accepts lists of length greater than one.";return b[2]},last:function(b){if("Cons"!==b[0])throw"Error: 'last' only accepts lists of length greater than one.";for(var a=b[1];"Cons"===b[0];)a=b[1],b=b[2];return a},map:d,foldl:c,foldr:b,foldl1:e,foldr1:function(b){return function(a){if("Nil"===a[0])throw"'foldr1' requires an non-empty list.";"Cons"!==a[0]&&
h("foldr1");for(var c=[];"Cons"===a[0];)c.push(a[1]),a=a[2];for(var a=c.pop(),f=c.length;f--;)a=b(c[f])(a);return a}},scanl:i,scanl1:function(b){return function(a){if("Cons"!==a[0])throw"Error: 'scanl1' requires a list of at least length 1.";return i(b)(a[1])(a[2])}},filter:function(b){return function(a){if("Nil"===a[0])return a;"Cons"!==a[0]&&h("filter");for(var c=[];"Cons"===a[0];)b(a[1])&&c.push(a[1]),a=a[2];for(var a=["Nil"],f=c.length;f--;)a=["Cons",c[f],a];return a}},length:function(b){for(var a=
0;"Cons"===b[0];)a+=1,b=b[2];return a},reverse:f,concat:g,concatMap:function(b){return function(a){return g(d(b)(a))}},and:s,or:k,all:function(b){return c(function(a){return function(c){return c&&b(a)}})(!0)},any:function(b){return c(function(a){return function(c){return c||b(a)}})(!1)},sum:p,product:m,maximum:x,minimum:u,partition:a,zipWith:function(b){return function(a){return function(c){if("Nil"===a[0]||"Nil"===c[0])return["Nil"];("Cons"!==a[0]||"Cons"!==c[0])&&h("zipWith");for(var f=[];"Cons"===
a[0]&&"Cons"===c[0];)f.push(b(a[1])(c[1])),a=a[2],c=c[2];for(var c=["Nil"],g=f.length;g--;)c=["Cons",f[g],c];return c}}},zip:function(a){return function(b){if("Nil"===a[0]||"Nil"===b[0])return["Nil"];("Cons"!==a[0]||"Cons"!==b[0])&&h("zip");for(var c=[];"Cons"===a[0]&&"Cons"===b[0];)c.push(["Tuple2",a[1],b[1]]),a=a[2],b=b[2];for(var b=["Nil"],f=c.length;f--;)b=["Cons",c[f],b];return b}},unzip:j,intersperse:l,intercalate:n,sort:function(b){if("Nil"===b[0])return b;"Cons"!==b[0]&&h("sort");for(var a=
[];"Cons"===b[0];)a.push(b[1]),b=b[2];a.sort(function(b,a){return b-a});for(var b=["Nil"],c=a.length;c--;)b=["Cons",a[c],b];return b},take:function(b){return function(a){if(0>=b)return["Nil"];if("Nil"===a[0])return a;"Cons"!==a[0]&&h("take");var c=["Cons",a[1],["Nil"]],f=c,a=a[2];for(--b;"Cons"===a[0]&&0<b;)f[2]=["Cons",a[1],["Nil"]],f=f[2],a=a[2],--b;return c}},drop:function(b){return function(a){if("Nil"===a[0])return a;for("Cons"!==a[0]&&h("drop");"Cons"===a[0]&&0<b;)a=a[2],--b;return a}}}}();
Elm.Maybe=function(){function d(b){return function(c){return"Just"===b[0]?["Cons",b[1],c]:c}}function c(b){return function(c){return function(d){var a=b(c);return"Just"===a[0]?["Cons",a[1],d]:d}}}return{Just:function(b){return["Just",b]},Nothing:["Nothing"],catMaybes:Elm.List.foldr(d)(["Nil"]),isJust:function(b){return"Just"===b[0]},isNothing:function(b){return"Nothing"===b[0]},fromMaybe:function(b){return function(c){return"Just"===c[0]?c[1]:b}},consMaybe:d,mapMaybe:function(b){return Elm.List.foldr(c(b))(["Nil"])},
maybe:function(b){return function(c){return function(d){return"Just"===d[0]?c(d[1]):b}}}}}();
Elm.Char=function(){function d(b,a){return function(c){c=c.charCodeAt(0);return b<=c&&c<=a}}var c=d(48,57),b=d(97,102),e=d(65,70);return{fromCode:function(b){return String.fromCharCode(b)},toCode:function(b){return b.charCodeAt(0)},toUpper:function(b){return b.toUpperCase()},toLower:function(b){return b.toLowerCase()},toLocaleUpper:function(b){return b.toLocaleUpperCase()},toLocaleLower:function(b){return b.toLocaleLowerCase()},isLower:d(97,122),isUpper:d(65,90),isDigit:c,isOctDigit:d(48,55),isHexDigit:function(d){return c(d)||
b(d)||e(d)}}}();
Elm.Color=function(){function d(c){var b=c.value*c.saturation,e=c.hue/60,d=b*(1-Math.abs(e%2-1)),a=0,j=0,l=0;0<=e&&1>e?(a=b,j=d,l=0):1<=e&&2>e?(a=d,j=b,l=0):2<=e&&3>e?(a=0,j=b,l=d):3<=e&&4>e?(a=0,j=d,l=b):4<=e&&5>e?(a=d,j=0,l=b):5<=e&&6>e&&(a=b,j=0,l=d);c=c.value-b;return["Color",Math.round(255*(a+c)),Math.round(255*(j+c)),Math.round(255*(l+c)),1]}return{rgba:function(c){return function(b){return function(e){return function(d){return["Color",c,b,e,d]}}}},rgb:function(c){return function(b){return function(e){return["Color",c,
b,e,1]}}},hsva:function(c){return function(b){return function(e){return function(i){var a=d({hue:c,saturation:b,value:e});a[4]=i;return a}}}},hsv:function(c){return function(b){return function(e){return d({hue:c,saturation:b,value:e})}}},red:["Color",255,0,0,1],green:["Color",0,255,0,1],blue:["Color",0,0,255,1],yellow:["Color",255,255,0,1],cyan:["Color",0,255,255,1],magenta:["Color",255,0,255,1],black:["Color",0,0,0,1],white:["Color",255,255,255,1],gray:["Color",128,128,128,1],grey:["Color",128,128,
128,1],complement:function(c){var b;b=c[1]/255;var e=c[2]/255,c=c[3]/255,i=Math.max(b,e,c),a=Math.min(b,e,c),a=i-a,j=0;0===a?j=0:i===b?j=(e-c)/a%6:i===e?j=(c-b)/a+2:i===c&&(j=(b-e)/a+4);b={value:i,hue:60*j,saturation:0===i?0:a/i};b.hue=(b.hue+180)%360;return d(b)},extract:function(c){return 1===c[4]?"rgb("+c[1]+","+c[2]+","+c[3]+")":"rgba("+c[1]+","+c[2]+","+c[3]+","+c[4]+")"}}}();
var Collage=function(){function d(b,a){var c=a.length-1;if(!(0>=c))for(b.moveTo(a[c][1],a[c][2]);c--;)b.lineTo(a[c][1],a[c][2])}function c(b,a,c,g){0===b.length&&(b=[8,4]);var e=g.length-1;if(!(0>=e)){var k=g[e][1],d=g[e][2],m=0,l=0,i=0,j=0,q=0,r=0,v=b.length,w=!0,y=b[0];for(a.moveTo(k,d);e--;){m=g[e][1];l=g[e][2];i=m-k;j=l-d;for(q=Math.sqrt(i*i+j*j);y<=q;)k+=i*y/q,d+=j*y/q,a[w?"lineTo":"moveTo"](k,d),i=m-k,j=l-d,q=Math.sqrt(i*i+j*j),w=!w,r=(r+1)%v,y=b[r];0<q&&(a[w?"lineTo":"moveTo"](m,l),y-=q);k=
m;d=l}}a.strokeStyle=Elm.Color.extract(c);a.stroke()}function b(b,a,f,g,e){a.clearRect(0,0,f,g);for(f=e.length;f--;){var k=e[f],p=b,g=a,m=k[1],i=k[2],j=k[3][1],t=k[3][2],k=k[4];g.save();(0!==j||0!==t)&&g.translate(j,t);m!==~~m&&g.rotate(2*Math.PI*m);1!==i&&g.scale(i,i);g.beginPath();switch(k[0]){case "FLine":a:switch(p=g,m=k,k=m[3][1],m[1][0]){case "Solid":m=m[2];d(p,k);p.strokeStyle=Elm.Color.extract(m);p.stroke();break;case "Dotted":c([3,3],p,m[2],k);break a;case "Dashed":c([8,4],p,m[2],k);break a;
case "Custom":c(m[1][1],p,m[2],k)}break;case "FShape":a:switch(j=p,i=g,p=k[1],m=k[2],k=k[3][1],p[0]){case "Filled":p=i;d(p,k);p.fillStyle=Elm.Color.extract(m);p.fill();break a;case "Outlined":p=i;d(p,k);p.strokeStyle=Elm.Color.extract(m);p.stroke();break a;case "Textured":m=j;p=p[1];j=new Image;j.src=l.castStringToJSString(p);j.onload=m;d(i,k);i.fillStyle=i.createPattern(j,"repeat");i.fill();break a;case "CustomOutline":c(p[1],i,m,k)}break;case "FImage":m=g,i=k[1],j=k[2],k=k[3],t=new Image,t.onload=
p,t.src=l.castStringToJSString(k),m.drawImage(t,-i/2,-j/2,i,j)}g.restore()}}function e(a,c,f){var g=Render.newElement("canvas"),a=~~a,c=~~c;g.style.width=a+"px";g.style.height=c+"px";g.style.display="block";g.width=a;g.height=c;if(g.getContext){var e=g.getContext("2d");b(function(){b(this,e,a,c,f)},e,a,c,f);return g}g.innerHTML="Your browser does not support the canvas element.";return g}function i(a,b,c,g,e,k,d){var m=Render.render(d),c="translate("+(e-d[3]/2)+"px,"+(k-d[4]/2)+"px) "+(1===g?"":"scale("+
g+","+g+")")+" "+(c===~~c?"":"rotate("+360*c+"deg)");m.style.transform=c;m.style.msTransform=c;m.style.MozTransform=c;m.style.webkitTransform=c;m.style.OTransform=c;c=Render.newElement("div");Render.addTo(c,m);c.style.width=~~a+"px";c.style.height=~~b+"px";c.style.overflow="hidden";return c}function a(a,c,f){if(!Value.eq(f,c)){var g=a.style.width.slice(0,-2)-0,d=a.style.height.slice(0,-2)-0;if("object"===typeof f[0]){if("object"===typeof c[0]&&a.getContext){var k=a.getContext("2d");return b(function(){b(this,
k,g,d,f)},k,g,d,f)}c=e(g,d,f);c.style.position="absolute";return a.parentNode.replaceChild(c,a)}c=i(g,d,f[1],f[2],f[3][1],f[3][2],f[4][1]);c.style.position="absolute";return a.parentNode.replaceChild(c,a)}}function j(a,b,c,g,e){var k=0,d,m=(a[1]-g[1])/c,a=(a[2]-g[2])/c;0!==b&&(b*=-2*Math.PI,c=m*Math.cos(b)-a*Math.sin(b),a=m*Math.sin(b)+a*Math.cos(b),m=c);if(0===e.length)return!1;d=e[0];for(c=e.length-1;c--;){b=e[c];g=d[1];d=d[2];var i=b[1],l=b[2];if(d<l)var j=d,q=l;else j=l,q=d;if(g<i)var r=g,v=i;
else r=i,v=g;j<a&&a<=q&&m<=v&&(m<=r||m<=(a-d)*(i-g)/(l-d)+g)&&++k;d=b}return 1===k%2}var l=Elm.JavaScript;return{collage:function(a,b,c){if(0===c.length)return e(a,b,[]);for(var g=Array(c.length),d=c.length;d--;){var k=c[d];g[d]="string"===typeof k[0]?i(a,b,k[1],k[2],k[3][1],k[3][2],k[4][1]):e(a,b,k)}return 1===c.length?g[0]:Render.flowWith(Render.goIn,function(a){return a},g)},updateCollage:function(b,c,f){if(1===f.length)return a(b,c[0],f[0]);for(var b=b.childNodes,g=b.length,e=g;e--;)a(b[g-e-1],
c[e],f[e])},insideForm:function(a){return function(b){var c=a[1],g=a[2];if(6>b.length){var e=b[3][1],d=b[3][2],p=0,i=b[2];switch(b[4][0]){case "FShape":for(var l=b[4][3][1],u=l.length;--u;)var t=l[u],p=Math.max(p,t[1]*t[1]+t[2]*t[2]);p*=i*i;break;case "FImage":l=i*b[4][1]/2;i=i*b[4][2]/2;p=l*l+i*i;break;case "FElement":l=i*b[4][1][3]/2,i=i*b[4][1][4]/2,p=l*l+i*i}b.push(function(b,a){var c=b-e,f=a-d;return c*c+f*f<p+1})}if(!b[5](c,g))return!1;var q,r;switch(b[4][0]){case "FShape":return j(a,b[1],b[2],
b[3],b[4][3][1]);case "FLine":return!1;case "FImage":q=b[4][1]/2;r=b[4][2]/2;break;case "FElement":q=b[4][1][3]/2,r=b[4][1][4]/2}return j(a,b[1],b[2],b[3],[[null,q,r],[null,-q,r],[null,-q,-r],[null,q,-r],[null,q,r]])}}}}();
Elm.Graphics=function(){function d(b){return function(a){return["Position",b,a]}}function c(b){return function(a){return["EText",b,a]}}function b(b){return function(a){return["EFlow",b,m.castListToJSArray(a)]}}function e(b){return["Line",m.castListToJSArray(b)]}function i(b){return function(a){var c=m.castListToJSArray(b);0<c.length&&c.push(c[0]);return["Shape",c,a]}}function a(b){return function(a){return function(c){return function(f){return["Form",b,a,c,f]}}}}function j(b){return function(a){return function(c){return["FLine",
b,a,c]}}}function l(b){return function(a){return function(c){return["FShape",b,a,c]}}}function n(b,a,c,f,h,g){return["Element",Guid.guid(),b,a,c,f,h,g]}function h(b,a,c){return["Element",Guid.guid(),b,a,c,1,["Nothing"],["Nothing"]]}function f(b){return~~b[3]}function g(b){return~~b[4]}function s(b){return function(a){return function(c){return h(["EImage",m.castStringToJSString(c)],b,a)}}}function k(b){return function(a){return h(w,b,a)}}function p(b){return function(a){return function(c){var f=map(function(c){return["Tuple2",
b/2*Math.cos(2*(Math.PI/50)*c),a/2*Math.sin(2*(Math.PI/50)*c)]}),h=49,g=["Nil"];if(0<=h){do g=["Cons",h,g];while(0<h--)}return i(f(g))(c)}}}for(this.i in Elm.List)eval("var "+this.i+" = Elm.List[this.i];");var m=Elm.JavaScript,x=["DRight"],u=["DDown"],t=["DOut"],q=["Near"],r=["Mid"],v=["Far"],w=["EEmpty"],y=["Solid"],z=["Dotted"],A=["Dashed"],B=["Filled"],C=["Outlined"],D=d(q)(q),E=d(v)(q),F=d(q)(v),G=d(v)(v),H=d(q)(r),I=d(v)(r),q=d(r)(q),v=d(r)(v),r=d(r)(r);return{left:["DLeft"],right:x,down:u,up:["DUp"],
inward:["DIn"],outward:t,topLeft:D,topRight:E,bottomLeft:F,bottomRight:G,midLeft:H,midRight:I,midTop:q,midBottom:v,middle:r,middleAt:function(b){return function(a){return["PositionAt",b,a]}},topLeftAt:function(b){return function(a){return["PositionTL",b,a]}},topRightAt:function(b){return function(a){return["PositionTR",b,a]}},bottomLeftAt:function(b){return function(a){return["PositionBL",b,a]}},bottomRightAt:function(b){return function(a){return["PositionBR",b,a]}},absolute:function(b){return["Absolute",
b]},relative:function(b){return["Relative",b]},width:function(b){return function(a){var c=a[2];switch(c[0]){case "EImage":case "EVideo":return n(a[2],b,a[4]*b/a[3],a[5],a[6],a[7]);case "EText":return c=Value.getTextSize(b,a[4],c[2]),n(a[2],b,c[1],a[5],a[6],a[7])}return n(a[2],b,a[4],a[5],a[6],a[7])}},height:function(b){return function(a){switch(a[2][0]){case "EImage":case "EVideo":return n(a[2],a[3]*b/a[4],b,a[5],a[6],a[7])}return n(a[2],a[3],b,a[5],a[6],a[7])}},size:function(b){return function(a){return function(c){return n(c[2],
b,a,c[5],c[6],c[7])}}},opacity:function(b){return function(a){return n(a[2],a[3],a[4],b,a[6],a[7])}},color:function(b){return function(a){return n(a[2],a[3],a[4],a[5],["Just",b],a[7])}},link:function(a){return function(b){return n(b[2],b[3],b[4],b[5],b[6],["Just",m.castStringToJSString(a)])}},widthOf:f,heightOf:g,sizeOf:function(b){return["Tuple2",~~b[3],~~b[4]]},text:function(b){var a=Value.getTextSize(0,0,b);return h(c("left")(b),a[0],a[1])},asText:function(b){var b=Elm.Text.monospace(Value.toText(Value.show(b))),
a=Value.getTextSize(0,0,b);return h(c("left")(b),a[0],a[1])},plainText:function(b){var b=Value.toText(b),a=Value.getTextSize(0,0,b);return h(c("left")(b),a[0],a[1])},centeredText:function(b){var a=Value.getTextSize(0,0,b);return h(c("center")(b),a[0],a[1])},justifiedText:function(b){var a=Value.getTextSize(0,0,b);return h(c("justify")(b),a[0],a[1])},rightedText:function(b){var a=Value.getTextSize(0,0,b);return h(c("right")(b),a[0],a[1])},image:s,images:function(b){var a=Elm.Signal.constant(k(0)(0)),
b=Elm.Signal.lift(function(b){var b=m.castStringToJSString(b),c=new Image;c.onload=function(){Dispatcher.notify(a.id,s(this.width)(this.height)(b))};c.src=b})(b);return Elm.Signal.lift2(function(b){return function(){return b}})(a)(b)},video:function(b){return function(a){return function(c){return h(["EVideo",m.castStringToJSString(c)],b,a)}}},fittedImage:function(b){return function(a){return function(c){return h(["EFittedImage",m.castStringToJSString(c)],b,a)}}},flow:function(a){return function(c){var e;
e=map(f)(c);a:{switch(a[0]){case "DLeft":e=sum(e);break a;case "DRight":e=sum(e);break a}e=maximum(e)}var d;d=map(g)(c);a:{switch(a[0]){case "DDown":d=sum(d);break a;case "DUp":d=sum(d);break a}d=maximum(d)}return h(b(a)(c),e,d)}},above:function(a){return function(c){return h(b(u)(["Cons",a,["Cons",c,["Nil"]]]),Math.max(~~a[3],~~c[3]),~~a[4]+~~c[4])}},below:function(a){return function(c){return h(b(u)(["Cons",c,["Cons",a,["Nil"]]]),Math.max(~~a[3],~~c[3]),~~a[4]+~~c[4])}},beside:function(a){return function(c){return h(b(x)(["Cons",
a,["Cons",c,["Nil"]]]),~~a[3]+~~c[3],Math.max(~~a[4],~~c[4]))}},layers:function(a){return h(b(t)(a),maximum(map(f)(a)),maximum(map(g)(a)))},collage:function(a){return function(b){return function(c){return h(["ECollage",a,b,Value.groupForms(c)],a,b)}}},spacer:k,container:function(a){return function(b){return function(c){return function(f){return h(["EContainer",c,f],a,b)}}}},line:e,segment:function(a){return function(b){return e(["Cons",a,["Cons",b,["Nil"]]])}},polygon:i,rect:function(a){return function(b){return function(c){return i(["Cons",
["Tuple2",0-a/2,0-b/2],["Cons",["Tuple2",0-a/2,b/2],["Cons",["Tuple2",a/2,b/2],["Cons",["Tuple2",a/2,0-b/2],["Nil"]]]]])(c)}}},oval:p,circle:function(a){return p(2*a)(2*a)},ngon:function(a){return function(b){return function(c){var f=map(function(c){return["Tuple2",b*Math.cos(2*(Math.PI/a)*c),b*Math.sin(2*(Math.PI/a)*c)]}),h=a-1,g=["Nil"];if(0<=h){do g=["Cons",h,g];while(0<h--)}return i(f(g))(c)}}},solid:function(b){return function(c){return a(0)(1)(["Tuple2",0,0])(j(y)(b)(c))}},dotted:function(b){return function(c){return a(0)(1)(["Tuple2",
0,0])(j(z)(b)(c))}},dashed:function(b){return function(c){return a(0)(1)(["Tuple2",0,0])(j(A)(b)(c))}},customLine:function(b){return function(c){return function(f){return a(0)(1)(["Tuple2",0,0])(j(["Custom",m.castListToJSArray(b)])(c)(f))}}},filled:function(b){return function(c){return a(0)(1)(c[2])(l(B)(b)(c))}},outlined:function(b){return function(c){return a(0)(1)(c[2])(l(C)(b)(c))}},customOutline:function(b){return function(c){return function(f){return a(0)(1)(f[2])(l(["CustomOutline",m.castListToJSArray(b)])(c)(f))}}},
textured:function(b){return function(c){return a(0)(1)(c[2])(l(["Textured",b])(null)(c))}},sprite:function(b){return function(c){return function(f){return function(h){return a(0)(1)(h)(["FImage",c,f,m.castStringToJSString(b)])}}}},toForm:function(b){return function(c){return a(0)(1)(b)(["FElement",c])}},rotate:function(b){return function(c){a:{switch(c[0]){case "Form":var f=c[2],h=c[3],g=c[4],c=a(b+c[1])(f)(h)(g);break a}throw"Non-exhaustive pattern match in case";}return c}},scale:function(b){return function(c){return a(c[1])(b*
c[2])(c[3])(c[4])}},move:function(b){return function(c){return function(f){var h;a:{switch(f[0]){case "Form":h=f[1];var g=f[2],e=f[3],f=f[4];switch(e[0]){case "Tuple2":var d=e[1],e=e[2];h=a(h)(g)(["Tuple2",b+d,c+e])(f);break a}}throw"Non-exhaustive pattern match in case";}return h}}},isWithin:Collage.insideForm}}();
Elm.Text=function(){function d(b){return Value.toText(b)}var c=function(b){return function(a){return"<"+b+' style="padding:0;margin:0">'+a+"</"+b+">"}},b=function(b,a){return function(c){return"<span style='"+b+":"+a+"'>"+c+"</span>"}},e=function(a){a=Elm.JavaScript.castStringToJSString(a);return b("font-family",a)},i=c("h1"),a=b("font-style","italic"),c=c("b"),j=b("text-decoration","underline"),l=b("text-decoration","overline"),n=b("text-decoration","line-through");return{fromString:d,toText:d,header:i,
height:function(a){return b("font-size",a+"em")},italic:a,bold:c,underline:j,overline:l,strikeThrough:n,monospace:e("monospace"),typeface:e,color:function(a){return b("color",Elm.Color.extract(a))},link:function(b){return function(a){return"<a href='"+d(b)+"'>"+a+"</a>"}}}}();
var Render=function(){function d(b){b=document.createElement(b);b.style.padding="0";b.style.margin="0";return b}function c(b){return b}function b(b){b.style.styleFloat="left";b.style.cssFloat="left";return b}function e(b){b.style.position="absolute";return b}function i(b,a,c){for(var e=d("div"),k=c.length;k--;){var i=b(a(c[k]));e.appendChild(i)}return e}function a(b){switch(b[0]){case "Absolute":return b[1]+"px";case "Relative":return 100*b[1]+"%"}}function j(b,c){c.style.position="absolute";c.style.margin=
"auto";switch(b[0]){case "Position":"Far"!==b[1][0]&&(c.style.left=0);"Near"!==b[1][0]&&(c.style.right=0);"Far"!==b[2][0]&&(c.style.top=0);"Near"!==b[2][0]&&(c.style.bottom=0);break;case "PositionAt":c.style.top=a(b[2]);c.style.left=a(b[1]);var g="translate("+~~(-c.style.width.slice(0,-2)/2)+"px,"+~~(-c.style.height.slice(0,-2)/2)+"px)";c.style.transform=g;c.style.msTransform=g;c.style.MozTransform=g;c.style.webkitTransform=g;c.style.OTransform=g;break;default:g=b[0].slice(-2),c.style["T"===g[0]?
"top":"bottom"]=a(b[2]),c.style["L"===g[1]?"left":"right"]=a(b[1])}}function l(a){var f={};switch(a[2][0]){case "EText":var f=a[2][1],g=a[2][2],s=d("div");s.innerHTML=g;s.style.textAlign=f;f=s;break;case "EImage":f=a[2][1];g=d("img");g.src=f;g.name=f;g.style.display="block";f=g;break;case "EVideo":s=a[2][1];f=d("video");f.controls="controls";g=d("source");g.src=s;s=s.split(".");g.type="video/"+s[s.length-1];f.appendChild(g);f.style.display="block";break;case "EFittedImage":var k=a[3],p=a[4],f=a[2][1],
g=d("div");g.style.width=k+"px";g.style.height=p+"px";g.style.position="relative";g.style.overflow="hidden";var m=d("img");m.onload=function(){m.style.position="absolute";m.style.margin="auto";var b=k,a=p;k/p>this.width/this.height?a=Math.round(this.height*k/this.width):b=Math.round(this.width*p/this.height);m.style.width=b+"px";m.style.height=a+"px";m.style.left=(k-b)/2+"px";m.style.top=(p-a)/2+"px"};m.src=f;m.name=f;g.appendChild(m);f=g;break;case "EFlow":a:{f=a[2][2];switch(a[2][1][0]){case "DDown":f=
f.slice(0).reverse();case "DUp":f=i(c,l,f);break a;case "DRight":f=f.slice(0).reverse();case "DLeft":f=i(b,l,f);break a;case "DOut":f=f.slice(0).reverse();case "DIn":f=i(e,l,f);break a}f=void 0}break;case "ECollage":f=Collage.collage(a[2][1],a[2][2],a[2][3]);break;case "EEmpty":f=d("div");break;case "EContainer":g=a[2][1];f=l(a[2][2]);j(g,f);g=d("div");g.style.position="relative";g.style.overflow="hidden";g.appendChild(f);f=g;break;case "EHtml":f=a[2][1];"button"!==f.type&&(g=Value.getExcess(f),a[3]-=
g[0],a[4]-=g[1]);break;case "EExternalHtml":f=d("div"),f.appendChild(a[2][1])}f.id=a[1];f.style.width=~~a[3]+"px";f.style.height=~~a[4]+"px";1!==a[5]&&(f.style.opacity=a[5]);"Just"===a[6][0]&&(f.style.backgroundColor=Elm.Color.extract(a[6][1]));return"Just"===a[7][0]?(g=d("a"),g.href=a[7][1],g.appendChild(f),g):f}function n(a,f,g){"A"===a.tagName&&(a=a.firstChild);if(f[1]!==g[1]){if(f[2][0]!==g[2][0])return a.parentNode.replaceChild(l(g),a);var d=g[2],k=f[2];switch(d[0]){case "EText":d[1]!==k[1]&&
(a.style.textAlign=d[1]);d[2]!==k[2]&&(a.innerHTML=d[2]);break;case "EImage":d[1]!==k[1]&&(a.src=d[1]);break;case "EVideo":case "EFittedImage":if(!Value.eq(d,k)||g[3]!==f[3]||g[4]!==f[4])return a.parentNode.replaceChild(l(g),a);break;case "ECollage":if(d[1]!==k[1]||d[2]!==k[2]||d[3].length!==k[3].length)return a.parentNode.replaceChild(l(g),a);Collage.updateCollage(a,k[3],d[3]);break;case "EFlow":if(d[1]!==k[1])return a.parentNode.replaceChild(l(g),a);var i=d[2],m=a.childNodes;if(i.length!==m.length)return a.parentNode.replaceChild(l(g),
a);var k=k[2],x=function(a){return a};switch(d[1][0]){case "DDown":case "DUp":x=c;break;case "DRight":case "DLeft":x=b;break;case "DOut":case "DIn":x=e}for(d=m.length;d--;)n(m[d],k[d],i[d]),x(m[d]);break;case "EContainer":n(a.childNodes[0],k[2],d[2]);j(d[1],a.childNodes[0]);break;case "EHtml":g[1]!==f[1]&&(i=l(g),a.parentNode.replaceChild(i,a),a=i);"button"!==i.type&&(d=Value.getExcess(a),g[3]-=d[0],g[4]-=d[1]);break;case "EExternalHtml":g[1]!==f[1]&&a.parentNode.replaceChild(l(g),a)}g[3]!==f[3]&&
(a.style.width=~~g[3]+"px");g[4]!==f[4]&&(a.style.height=~~g[4]+"px");g[5]!==f[5]&&(a.style.opacity=g[5]);2===g[6].length&&(d=Elm.Color.extract(g[6][1]),d!==a.style.backgroundColor&&(a.style.backgroundColor=d));if(2===g[7].length&&(1===f[7].length||g[7][1]!==f[7][1]))a.parentNode.href=g[7][1];g[1]=f[1]}}return{render:l,update:n,addTo:function(a,b){a.appendChild(b)},newElement:d,flowWith:i,goIn:e}}();
Elm.Signal=function(){function d(a){this.id=Guid.guid();this.value=a;this.kids=[];this.defaultNumberOfKids=0;this.recv=function(a,b,c){if(b=b===this.id)this.value=c;n(this,a,b);return b};Dispatcher.inputs.push(this)}function c(a,b){this.id=Guid.guid();this.value=null;this.kids=[];this.count=0;this.changed=!1;b.reverse();this.recalc=function(){for(var c=a,e=b.length;e--;)c=c(b[e].value);this.value=c};this.recalc();this.recv=function(a,c){this.count+=1;c&&(this.changed=!0);this.count==b.length&&(this.changed&&
this.recalc(),n(this,a,this.changed),this.changed=!1,this.count=0)};for(var c=b.length;c--;)b[c].kids.push(this)}function b(a,b,c,e){this.id=Guid.guid();this.value=c?b(e.value):b;this.kids=[];this.recv=function(b,c){c&&(this.value=a(e.value)(this.value));n(this,b,c)};e.kids.push(this)}function e(a,b,c){this.id=Guid.guid();this.value=a(c.value)?b:c.value;this.kids=[];this.recv=function(b,e){var g=e&&!a(c.value);g&&(this.value=c.value);n(this,b,g)};c.kids.push(this)}function i(a){this.id=Guid.guid();
this.value=a.value;this.kids=[];this.recv=function(b,c){var e=c&&!Value.eq(this.value,a.value);e&&(this.value=a.value);n(this,b,e)};a.kids.push(this)}function a(a,b){this.id=Guid.guid();var c=(new window.Date).getTime();this.value=a?Value.Tuple(c,b.value):c;this.kids=[];this.recv=function(c,e){e&&(this.value=a?Value.Tuple(c,b.value):c);n(this,c,e)};b.kids.push(this)}function j(a,b){this.id=Guid.guid();this.value=b.value;this.kids=[];this.count=0;this.changed=!1;this.recv=function(c,e,d){d===a.id&&
(this.changed=e);this.count+=1;2==this.count&&(this.changed&&(this.value=b.value),n(this,c,this.changed),this.count=0,this.changed=!1)};a.kids.push(this);b.kids.push(this)}function l(a,b){this.id=Guid.guid();this.value=a.value;this.kids=[];this.next=null;this.count=0;this.changed=!1;this.recv=function(c,e,d){this.count+=1;e&&(this.changed=!0,d==b.id&&null===this.next&&(this.next=b.value),d==a.id&&(this.next=a.value));2==this.count&&(this.changed&&(this.value=this.next,this.next=null),n(this,c,this.changed),
this.changed=!1,this.count=0)};a.kids.push(this);b.kids.push(this)}var n=function(a,b,c){for(var e=a.kids,d=e.length;d--;)e[d].recv(b,c,a.id)},h=function(a){return function(b){return function(d){d=new c(function(a){return function(b){return[a,b]}},[a,d]);d=new e(function(a){return a[0]},[!0,b],d);return new c(function(a){return a[1]},[d])}}};return{constant:function(a){return new d(a)},lift:function(a){return function(b){return new c(a,[b])}},lift2:function(a){return function(b){return function(e){return new c(a,
[b,e])}}},lift3:function(a){return function(b){return function(e){return function(d){return new c(a,[b,e,d])}}}},lift4:function(a){return function(b){return function(e){return function(d){return function(h){return new c(a,[b,e,d,h])}}}}},lift5:function(a){return function(b){return function(e){return function(d){return function(h){return function(i){return new c(a,[b,e,d,h,i])}}}}}},lift6:function(a){return function(b){return function(e){return function(d){return function(h){return function(i){return function(l){return new c(a,
[b,e,d,h,i,l])}}}}}}},lift7:function(a){return function(b){return function(e){return function(d){return function(h){return function(i){return function(l){return function(j){return new c(a,[b,e,d,h,i,l,j])}}}}}}}},lift8:function(a){return function(b){return function(e){return function(d){return function(h){return function(i){return function(l){return function(j){return function(n){return new c(a,[b,e,d,h,i,l,j,n])}}}}}}}}},foldp:function(a){return function(c){return function(e){return new b(a,c,!1,
e)}}},foldp_:function(a){return function(c){return function(e){return new b(a,c,!0,e)}}},foldp1:function(a){return function(c){return new b(a,function(a){return a},!0,c)}},delay:function(a){return function(b){var e=new d(b.value),h=!0,b=new j(e,new c(function(a){return function(){return a}},[e,new c(function(b){h||setTimeout(function(){Dispatcher.notify(e.id,b)},a)},[b])])),h=!1;return b}},merge:function(a){return function(b){return new l(a,b)}},merges:function(a){return Elm.List.foldl1(function(a){return function(b){return new l(a,
b)}})(a)},average:function(a){return function(b){for(var e=Array(a),d=a;d--;)e[d]=0;var d=0,h=!1,i=0;return new c(function(b){i+=b-e[d];e[d]=b;b=i/Math.max(1,h?a:d);++d==a&&(h=!0,d=0);return b},[b])}},count:function(a){return new b(function(){return function(a){return a+1}},0,!1,a)},countIf:function(a){return function(c){return new b(function(b){return function(c){return a(b)?c+1:c}},0,!1,c)}},keepIf:function(a){return function(b){return function(c){return new e(function(b){return!a(b)},b,c)}}},dropIf:function(a){return function(b){return function(c){return new e(a,
b,c)}}},keepWhen:function(a){return h(new c(function(a){return!a},[a]))},dropWhen:h,dropRepeats:function(a){return new i(a)},sampleOn:function(a){return function(b){return new j(a,b)}},timestamp:function(b){return new a(!0,b)},timeOf:function(b){return new a(!1,b)}}}();
var Dispatcher=function(){function d(b){if(!b.hasOwnProperty("defaultNumberOfKids"))return!0;var a=b.kids.length;if(0==a)return!1;if(a>b.defaultNumberOfKids)return!0;for(var c=!1;a--;)c=c||d(b.kids[a]);return c}var c=null,b=[],e=null;return{initialize:function(){c=Elm.main();c.hasOwnProperty("recv")||(c=Elm.Signal.constant(c));e=c.value;for(var i=[],a=b.length;a--;)d(b[a])&&i.push(b[a]);b=i;document.getElementById("content").appendChild(Render.render(e));i=document.getElementById("widthChecker").offsetWidth;
i!==window.innerWidth&&Dispatcher.notify(Elm.Window.dimensions.id,Value.Tuple(i,window.innerHeight));c=Elm.Signal.lift(function(a){var b=document.getElementById("content");Render.update(b.firstChild,e,a);return e=a})(c)},notify:function(c,a){for(var e=(new window.Date).getTime(),d=!1,n=b.length;n--;)d=b[n].recv(e,c,a)||d;return d},inputs:b}}();
Elm.HTTP=function(){function d(b){return function(c){return function(e){return function(d){return{"0":"Request",length:1,verb:a.castStringToJSString(b),url:a.castStringToJSString(c),data:null===e?null:a.castStringToJSString(e),headers:d}}}}}function c(a){return d("GET")(a)(null)(["Nil"])}function b(b,c){return function(d){if(""!==d.url){var f={value:["Waiting"]};b.push(f);var g=null;window.ActiveXObject&&(g=new ActiveXObject("Microsoft.XMLHTTP"));window.XMLHttpRequest&&(g=new XMLHttpRequest);g.onreadystatechange=
function(){4===g.readyState&&(f.value=200===g.status?["Success",j(g.responseText)]:["Failure",g.status,j(g.statusText)],setTimeout(function(){e(b,c)},0))};g.open(d.verb,d.url,!0);Elm.List.map(function(b){g.setRequestHeader(a.castStringToJSString(b[1]),a.castStringToJSString(b[2]))})(d.headers);g.send(d.data)}}}function e(a,b){0<a.length&&(Dispatcher.notify(b.id,a[0].value),"Waiting"!==a[0].value[0]&&(a.shift(),setTimeout(function(){e(a,b)},0)))}function i(a){var c=Elm.Signal.constant(["Waiting"]),
a=Elm.Signal.lift(b([],c))(a);return Elm.Signal.lift2(function(a){return function(){return a}})(c)(a)}var a=Elm.JavaScript,j=Elm.JavaScript.castJSStringToString;return{get:c,post:function(a){return function(b){return d("POST")(a)(b)(["Nil"])}},request:d,send:i,sendGet:function(a){return i(Elm.Signal.lift(c)(a))}}}();
Elm.Input=function(){var d=Elm.JavaScript,c=Elm.JavaScript.castJSStringToString,b=function(a,b){a.placeholder=d.castStringToJSString(b);var e=Elm.Signal.constant(["Nil"]);Value.addListener(a,"keyup",function(){Dispatcher.notify(e.id,c(a.value));a.focus()});a.style.padding="1px";return Value.Tuple(Value.wrap(a),e)},e=function(a){a=document.createElement(a);a.style.padding="0";a.style.margin="0";return a},i=function(a){for(var b=e("select"),c=[];"Cons"===a[0];){var d=e("option"),h=Value.toText(a[1][1]);
d.value=h;d.innerHTML=h;b.appendChild(d);c.push(a[1][2]);a=a[2]}var f=Elm.Signal.constant(c[0]);Value.addListener(b,"change",function(){Dispatcher.notify(f.id,c[b.selectedIndex])});return Value.Tuple(Value.wrap(b),f)};return{textArea:function(a){return function(c){var d=e("textarea");d.rows=c;d.cols=a;return b(d,"")}},textField:function(a){var c=e("input");c.type="text";return b(c,a)},password:function(a){var c=e("input");c.type="password";return b(c,a)},checkbox:function(a){var b=e("input");b.type=
"checkbox";b.checked=a;var c=Elm.Signal.constant(a);Value.addListener(b,"change",function(){Dispatcher.notify(c.id,b.checked)});return Value.Tuple(Value.wrap(b),c)},dropDown:i,stringDropDown:function(a){return i(Elm.List.map(function(a){return Value.Tuple(a,a)})(a))},button:function(a){var b=e("input");b.type="button";b.value=d.castStringToJSString(a);var c=Elm.Signal.constant(!1);Value.addListener(b,"click",function(){Dispatcher.notify(c.id,!0);Dispatcher.notify(c.id,!1)});return Value.Tuple(Value.wrap(b),
c)}}}();
Elm.Keyboard={Raw:function(){function d(b,c){return"Nil"===c[0]?c:c[1]===b?c[2]:["Cons",c[1],d(b,c[2])]}var c=Elm.Signal.constant(["Nil"]),b=Elm.Signal.constant(["Nothing"]);Value.addListener(document,"keydown",function(b){var d;a:{for(d=c.value;"Nil"!==d[0];){if(d[1]===b.keyCode){d=!0;break a}d=d[2]}d=!1}d||Dispatcher.notify(c.id,["Cons",b.keyCode,c.value])||this.removeEventListener("keydown",arguments.callee,!1)});Value.addListener(document,"keyup",function(b){var i=d(b.keyCode,c.value);Dispatcher.notify(c.id,
i)||this.removeEventListener("keyup",arguments.callee,!1)});Value.addListener(window,"blur",function(b){Dispatcher.notify(c.id,["Nil"])||this.removeEventListener("blur",arguments.callee,!1)});Value.addListener(document,"keypress",function(c){var d=Dispatcher.notify(b.id,["Just",c.charCode||c.keyCode]);Dispatcher.notify(b.id,["Nothing"]);d||this.removeEventListener("keypress",arguments.callee,!1)});return{keysDown:c,charPressed:b}}()};
Elm.Mouse=function(){function d(a){var b=0,c=0;a||(a=window.event);if(a.pageX||a.pageY)b=a.pageX,c=a.pageY;else if(a.clientX||a.clientY)b=a.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,c=a.clientY+document.body.scrollTop+document.documentElement.scrollTop;return Value.Tuple(b,c)}var c=Elm.Signal.constant(Value.Tuple(0,0));c.defaultNumberOfKids=2;var b=Elm.Signal.lift(function(a){return a[1]})(c);b.defaultNumberOfKids=0;var e=Elm.Signal.lift(function(a){return a[2]})(c);e.defaultNumberOfKids=
0;var i=Elm.Signal.constant(!1),a=Elm.Signal.constant(!1),j=Elm.Signal.constant(Value.Tuple());Value.addListener(document,"click",function(b){var c=Dispatcher.notify(a.id,!0),d=Dispatcher.notify(j.id,Value.Tuple());Dispatcher.notify(a.id,!1);!c&&!d&&this.removeEventListener("click",arguments.callee,!1)});Value.addListener(document,"mousedown",function(a){Dispatcher.notify(i.id,!0)||this.removeEventListener("mousedown",arguments.callee,!1)});Value.addListener(document,"mouseup",function(a){Dispatcher.notify(i.id,
!1)||this.removeEventListener("mouseup",arguments.callee,!1)});Value.addListener(document,"mousemove",function(a){Dispatcher.notify(c.id,d(a))||this.removeEventListener("mousemove",arguments.callee,!1)});return{position:c,x:b,y:e,isClicked:a,isDown:i,clicks:j,isClickedOn:function(a){var a=Render.render(a),b=Elm.Signal.constant(!1);Value.addListener(a,"click",function(){Dispatcher.notify(b.id,!0);Dispatcher.notify(b.id,!1)});return Value.Tuple(Value.wrap(a),b)}}}();
Elm.Random=function(){return{inRange:function(d){return function(c){return Elm.Signal.constant(Math.floor(Math.random()*(c-d+1))+d)}},randomize:function(d){return function(c){return function(b){return Elm.Signal.lift(function(){return Math.floor(Math.random()*(c-d+1))+d})(b)}}}}}();
Elm.Time=function(){function d(){return(new window.Date).getTime()}function c(b){return function(c){var i=1E3/b,a=d(),j=a,l=0,n=!0,h=Elm.Signal.constant(l),f=0;return Elm.Signal.lift2(function(b){return function(c){if(b){var e=!n&&b;f=setTimeout(function(){j=d();l=e?0:j-a;a=j;Dispatcher.notify(h.id,l)},i)}else n&&clearTimeout(f);n=b;return c}})(c)(h)}}Elm.Signal.constant(!0);return{fpsWhen:c,fps:function(b){return c(b)(Elm.Signal.constant(!0))},every:function(b){var c=Elm.Signal.constant(d());setInterval(function(){Dispatcher.notify(c.id,
d())},b);return c},delay:Elm.Signal.delay,since:function(b){return function(c){var d=Elm.Signal.count(Elm.Signal.delay(b)(c));return Elm.Signal.lift2(function(a){return function(b){return!Value.eq(a,b)}})(Elm.Signal.count(c))(d)}},after:function(b){var b=1E3*b,c=Elm.Signal.constant(!1);setTimeout(function(){Dispatcher.notify(c.id,!0)},b);return c},before:function(b){var b=1E3*b,c=Elm.Signal.constant(!0);setTimeout(function(){Dispatcher.notify(c.id,!1)},b);return c},hour:36E5,minute:6E4,second:1E3,
ms:1,inHours:function(b){return b/36E5},inMinutes:function(b){return b/6E4},inSeconds:function(b){return b/1E3},inMss:function(b){return b},toDate:function(b){return new window.Date(b)},read:function(b){b=window.Date.parse(b);return isNaN(b)?["Nothing"]:["Just",b]}}}();
Elm.Window=function(){var d=Elm.Signal.constant(Value.Tuple(window.innerWidth,window.innerHeight));d.defaultNumberOfKids=2;var c=Elm.Signal.lift(function(b){return b[1]})(d);c.defaultNumberOfKids=0;var b=Elm.Signal.lift(function(b){return b[2]})(d);b.defaultNumberOfKids=0;Value.addListener(window,"resize",function(b){var c=document.getElementById("widthChecker").offsetWidth;Dispatcher.notify(d.id,Value.Tuple(c,window.innerHeight))||this.removeEventListener("resize",arguments.callee,!1)});return{dimensions:d,
width:c,height:b}}();
Elm.Date=function(){var d="Sun Mon Tue Wed Thu Fri Sat".split(" "),c="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" ");return{read:function(b){b=new window.Date(Elm.JavaScript.castStringToJSString(b));return isNaN(b.getTime())?["Nothing"]:["Just",b]},year:function(b){return b.getFullYear()},month:function(b){return[c[b.getMonth()]]},day:function(b){return b.getDate()},hour:function(b){return b.getHours()},minute:function(b){return b.getMinutes()},second:function(b){return b.getSeconds()},dayOfWeek:function(b){return[d[b.getDay()]]},
toTime:function(b){return b.getTime()},Mon:["Mon"],Tue:["Tue"],Wed:["Wed"],Thu:["Thu"],Fri:["Fri"],Sat:["Sat"],Sun:["Sun"],Jan:["Jan"],Feb:["Feb"],Mar:["Mar"],Apr:["Apr"],May:["May"],Jun:["Jun"],Jul:["Jul"],Aug:["Aug"],Sep:["Sep"],Oct:["Oct"],Nov:["Nov"],Dec:["Dec"]}}();Value.addListener(document,"elm_log",function(d){console.log(d.value)});Value.addListener(document,"elm_title",function(d){document.title=d.value});
Value.addListener(document,"elm_redirect",function(d){0<d.value.length&&(window.location=d.value)});
Elm.Prelude=function(){var d=function(c){return function(b){var e=c%b,e=0==c?0:0<b?0<=c?e:e+b:-d(-c)(-b);return e==b?0:e}};return{eq:Value.eq,id:function(c){return c},not:function(c){return!c},fst:function(c){return c[1]},snd:function(c){return c[2]},rem:function(c){return function(b){return c%b}},div:function(c){return function(b){return~~(c/b)}},otherwise:!0,compare:function(c){return function(b){if(c instanceof Array&&b instanceof Array){var d=c.length;if(d==b.length){for(var i=0;i<d;++i){var a=
compare(c[i])(b[i]);if("EQ"!==a[0])return a}return["EQ"]}}return[c===b?"EQ":c<b?"LT":"GT"]}},toFloat:function(c){return c},round:function(c){return Math.round(c)},floor:function(c){return Math.floor(c)},ceiling:function(c){return Math.ceil(c)},truncate:function(c){return~~c},readInt:function(c){var c=Elm.JavaScript.castStringToJSString(c),b=c.length;if(0===b)return["Nothing"];var d=0;if("-"==c[0]){if(1===b)return["Nothing"];d=1}for(;d<b;++d)if(!Char.isDigit(c[d]))return["Nothing"];return["Just",parseInt(c)]},
readFloat:function(c){var c=Elm.JavaScript.castStringToJSString(c),b=c.length;if(0===b)return["Nothing"];var d=0;if("-"==c[0]){if(1===b)return["Nothing"];d=1}for(var i=0;d<b;++d)if(!Char.isDigit(c[d])){if("."===c[d]&&(i+=1,1>=i))continue;return["Nothing"]}return["Just",parseFloat(c)]},sqrt:Math.sqrt,abs:Math.abs,pi:Math.PI,e:Math.E,sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:Math.asin,acos:Math.acos,atan:Math.atan,atan2:function(c){return function(b){return Math.atan2(c,b)}},mod:d,min:function(c){return function(b){return Math.min(c,
b)}},max:function(c){return function(b){return Math.max(c,b)}},flip:function(c){return function(b){return function(d){return c(d)(b)}}},clamp:function(c){return function(b){return function(d){return Math.min(b,Math.max(c,d))}}},curry:function(c){return function(b){return function(d){return c(["Tuple2",b,d])}}},uncurry:function(c){return function(b){if("Tuple2"!==b[0])throw"Function was uncurry'd but was not given a pair.";return c(b[1])(b[2])}},logBase:function(c){return function(b){return Math.log(b)/
Math.log(c)}},Just:Elm.Maybe.Just,Nothing:Elm.Maybe.Nothing,maybe:Elm.Maybe.maybe,map:Elm.List.map,zip:Elm.List.zip,zipWith:Elm.List.zipWith,filter:Elm.List.filter,head:Elm.List.head,tail:Elm.List.tail,last:Elm.List.last,length:Elm.List.length,reverse:Elm.List.reverse,foldr:Elm.List.foldr,foldr1:Elm.List.foldr1,foldl:Elm.List.foldl,foldl1:Elm.List.foldl1,and:Elm.List.and,or:Elm.List.or,all:Elm.List.all,any:Elm.List.any,sum:Elm.List.sum,product:Elm.List.product,concat:Elm.List.concat,concatMap:Elm.List.concatMap,
maximum:Elm.List.maximum,minimum:Elm.List.minimum,scanl:Elm.List.scanl,scanl1:Elm.List.scanl1,take:Elm.List.take,drop:Elm.List.drop,zip:Elm.List.zip,unzip:Elm.List.unzip,lift:Elm.Signal.lift,lift2:Elm.Signal.lift2,lift3:Elm.Signal.lift3,lift4:Elm.Signal.lift4,lift5:Elm.Signal.lift5,lift6:Elm.Signal.lift6,lift7:Elm.Signal.lift7,lift8:Elm.Signal.lift8,foldp:Elm.Signal.foldp,foldp1:Elm.Signal.foldp1,foldp_:Elm.Signal.foldp_,constant:Elm.Signal.constant,merge:Elm.Signal.merge,count:Elm.Signal.count,countIf:Elm.Signal.countIf,
average:Elm.Signal.average,keepIf:Elm.Signal.keepIf,dropIf:Elm.Signal.dropIf,keepWhen:Elm.Signal.keepWhen,dropWhen:Elm.Signal.dropWhen,dropRepeats:Elm.Signal.dropRepeats,sampleOn:Elm.Signal.sampleOn,timestamp:Elm.Signal.timestamp,timeOf:Elm.Signal.timeOf}}();(function(){var d=function(c){for(var b in c)Elm.Prelude[b]=c[b]};d(Elm.Color);d(Elm.Text);d(Elm.Graphics);d(Elm.Time);show=Value.show})();
Elm.Dict=function(){function d(a){return function(b){return function(c){return function(d){return function(e){return["RBNode",a,b,c,d,e]}}}}}function c(a){return function(){switch(a[0]){case "RBEmpty":return z(Value.str("(min RBEmpty) is not defined"));case "RBNode":switch(a[4][0]){case "RBEmpty":return["Tuple2",a[2],a[3]]}return c(a[4])}throw"Non-exhaustive pattern match in case";}()}function b(a){return function(c){var d;a:{switch(c[0]){case "RBEmpty":d=Nothing;break a;case "RBNode":d=function(){switch(compare(a)(c[2])[0]){case "EQ":return Just(c[3]);
case "GT":return b(a)(c[5]);case "LT":return b(a)(c[4])}throw"Non-exhaustive pattern match in case";}();break a}throw"Non-exhaustive pattern match in case";}return d}}function e(a){return function(b){return function(c){var d;a:{switch(c[0]){case "RBEmpty":d=a;break a;case "RBNode":d=function(){switch(compare(b)(c[2])[0]){case "EQ":return c[3];case "GT":return e(a)(b)(c[5]);case "LT":return e(a)(b)(c[4])}throw"Non-exhaustive pattern match in case";}();break a}throw"Non-exhaustive pattern match in case";
}return d}}}function i(a){return function(c){return q(b(a)(c))}}function a(a){a:{switch(a[0]){case "RBNode":switch(a[5][0]){case "RBNode":a=d(a[1])(a[5][2])(a[5][3])(d(r)(a[2])(a[3])(a[4])(a[5][4]))(a[5][5]);break a}}a=z(Value.str("rotateLeft of a node without enough children"))}return a}function j(a){a:{switch(a[0]){case "RBNode":switch(a[4][0]){case "RBNode":a=d(a[1])(a[4][2])(a[4][3])(a[4][4])(d(r)(a[2])(a[3])(a[4][5])(a[5]));break a}}a=z(Value.str("rotateRight of a node without enough children"))}return a}
function l(a){a:{switch(a[0]){case "Black":a=r;break a;case "Red":a=v;break a}throw"Non-exhaustive pattern match in case";}return a}function n(a){a:{switch(a[0]){case "RBNode":switch(a[4][0]){case "RBNode":switch(a[5][0]){case "RBNode":a=d(l(a[1]))(a[2])(a[3])(d(l(a[4][1]))(a[4][2])(a[4][3])(a[4][4])(a[4][5]))(d(l(a[5][1]))(a[5][2])(a[5][3])(a[5][4])(a[5][5]));break a}}}a=z(Value.str("color_flip called on a RBEmpty or RBNode with a RBEmpty child"))}return a}function h(b){a:switch(b[0]){case "RBNode":switch(b[5][0]){case "RBNode":switch(b[5][1][0]){case "Red":b=
a(b);break a}}}a:switch(b[0]){case "RBNode":switch(b[4][0]){case "RBNode":switch(b[4][1][0]){case "Red":switch(b[4][4][0]){case "RBNode":switch(b[4][4][1][0]){case "Red":b=j(b);break a}}}}}a:switch(b[0]){case "RBNode":switch(b[4][0]){case "RBNode":switch(b[4][1][0]){case "Red":switch(b[5][0]){case "RBNode":switch(b[5][1][0]){case "Red":b=n(b);break a}}}}}return b}function f(a){a:switch(a[0]){case "RBNode":switch(a[1][0]){case "Red":a=d(v)(a[2])(a[3])(a[4])(a[5]);break a}}return a}function g(a){return function(b){return function(c){var e=
function(c){var f;a:{switch(c[0]){case "RBEmpty":f=d(r)(a)(b)(w)(w);break a;case "RBNode":f=function(){switch(compare(a)(c[2])[0]){case "EQ":return d(c[1])(c[2])(b)(c[4])(c[5]);case "GT":return d(c[1])(c[2])(c[3])(c[4])(e(c[5]));case "LT":return d(c[1])(c[2])(c[3])(e(c[4]))(c[5])}throw"Non-exhaustive pattern match in case";}();f=h(f);break a}throw"Non-exhaustive pattern match in case";}return f};return f(e(c))}}}function s(a){a:{switch(a[0]){case "RBNode":switch(a[4][0]){case "RBNode":switch(a[4][1][0]){case "Red":a=
!0;break a}}}a=!1}return a}function k(a){a:{switch(a[0]){case "RBNode":switch(a[4][0]){case "RBNode":switch(a[4][4][0]){case "RBNode":switch(a[4][4][1][0]){case "Red":a=!0;break a}}}}a=!1}return a}function p(b){if(not(s(b))&&not(k(b))){b=n(b);a:switch(b[0]){case "RBNode":b:switch(b[5][0]){case "RBNode":switch(b[5][4][0]){case "RBNode":switch(b[5][4][1][0]){case "Red":b=n(a(d(b[1])(b[2])(b[3])(b[4])(j(b[5]))));break b}}}break a}}return b}function m(a){return function(b){var e;a:{switch(b[0]){case "RBEmpty":e=
w;break a;case "RBNode":if("LT"===compare(a)(b[2])[0]){e=p(b);b:{switch(e[0]){case "RBEmpty":e=z(Value.str("delLT on RBEmpty"));break b;case "RBNode":e=h(d(e[1])(e[2])(e[3])(del(e[4]))(e[5]));break b}break}}else{b=s(b)?j(b):b;b:{switch(b[0]){case "RBNode":switch(b[5][0]){case "RBEmpty":b=eq(a,b[2]);break b}}b=!1}if(b)e=w;else{var b=not,g;b:{switch(e[0]){case "RBNode":switch(e[5][0]){case "RBNode":switch(e[5][1][0]){case "Red":g=!0;break b}}}g=!1}if(b=b(g)){b=not;b:{switch(e[0]){case "RBNode":switch(e[5][0]){case "RBNode":switch(e[5][4][0]){case "RBNode":switch(e[5][4][1][0]){case "Red":g=
!0;break b}}}}g=!1}b=b(g)}b&&(e=n(e),e=k(e)?n(j(e)):e);b:{switch(e[0]){case "RBNode":b=eq(a,e[2]);break b}b=!1}if(b)b:{switch(e[0]){case "RBEmpty":e=z(Value.str("delEQ called on a RBEmpty"));break b;case "RBNode":g=c(e[5]);c:{switch(g[0]){case "Tuple2":b=g[1];break c}break}c:{switch(g[0]){case "Tuple2":g=g[2];break c}break}var b=d(e[1])(b)(g)(e[4]),i=function(a){a:{switch(a[0]){case "RBNode":switch(a[4][0]){case "RBEmpty":a=w;break a}}a=p(a);b:{switch(a[0]){case "RBEmpty":a=w;break b;case "RBNode":a=
h(d(a[1])(a[2])(a[3])(i(a[4]))(a[5]));break b}throw"Non-exhaustive pattern match in case";}}return a};e=f(i(e[5]));e=h(b(e));break b}break}else b:{switch(e[0]){case "RBEmpty":e=z(Value.str("delGT called on a RBEmpty"));break b;case "RBNode":e=h(d(e[1])(e[2])(e[3])(e[4])(del(e[5])));break b}break}}}break a}throw"Non-exhaustive pattern match in case";}return f(e)}}function x(a){return function(b){a:{switch(b[0]){case "RBEmpty":b=w;break a;case "RBNode":b=d(b[1])(b[2])(a(b[3]))(x(a)(b[4]))(x(a)(b[5]));
break a}throw"Non-exhaustive pattern match in case";}return b}}function u(a){return function(b){return function(c){a:{switch(c[0]){case "RBEmpty":c=b;break a;case "RBNode":c=u(a)(a(c[2])(c[3])(u(a)(b)(c[4])))(c[5]);break a}throw"Non-exhaustive pattern match in case";}return c}}}function t(a){return function(b){return function(c){a:{switch(c[0]){case "RBEmpty":c=b;break a;case "RBNode":c=t(a)(a(c[2])(c[3])(t(a)(b)(c[5])))(c[4]);break a}throw"Non-exhaustive pattern match in case";}return c}}}for(this.i in Elm.Prelude)eval("var "+
this.i+"=Elm.Prelude[this.i];");var q=Elm.Maybe.isJust,r=["Red"],v=["Black"],w=["RBEmpty"],y=w,z=function(a){return a};return{empty:y,lookup:b,findWithDefault:e,member:i,insert:g,singleton:function(a){return function(b){return g(a)(b)(w)}},remove:m,map:x,foldl:u,foldr:t,union:function(a){return function(b){return u(g)(b)(a)}},intersect:function(a){return function(b){return u(function(a){return function(c){return function(d){return i(a)(b)?g(a)(c)(d):d}}})(y)(a)}},diff:function(a){return function(b){return u(function(a){return function(){return function(b){return m(a)(b)}}})(a)(b)}},
keys:function(a){return u(function(a){return function(){return function(b){return["Cons",a,b]}}})(["Nil"])(a)},values:function(a){return u(function(){return function(a){return function(b){return["Cons",a,b]}}})(["Nil"])(a)},toList:function(a){return u(function(a){return function(b){return function(c){return["Cons",["Tuple2",a,b],c]}}})(["Nil"])(a)},fromList:function(a){return List.foldl(uncurry(g))(y)(a)}}}();
Elm.Set=function(){var d=Elm.Dict.empty,c=Elm.Dict.remove,b=Elm.Dict.member,e=Elm.Dict.union,i=Elm.Dict.intersect,a=Elm.Dict.diff,j=Elm.Dict.keys,l=Elm.List.foldl(function(a){return function(b){return Elm.Dict.insert(a)(["Tuple0"])(b)}})(d);return{empty:d,singleton:function(a){return Elm.Dict.singleton(a)(["Tuple0"])},insert:function(a){return Elm.Dict.insert(a)(["Tuple0"])},remove:c,member:b,union:e,intersect:i,diff:a,toList:j,fromList:l,foldl:function(a){return Elm.Dict.foldl(function(b){return function(){return function(c){return a(b)(c)}}})},
foldr:function(a){return Elm.Dict.foldr(function(b){return function(){return function(c){return a(b)(c)}}})},map:function(a){return function(b){b=j(b);return l(Elm.List.map(a)(b))}}}}();
(function(){try{var d={};for(this.i in Elm)eval("var "+this.i+"=Elm[this.i];");if(Elm.Automaton)throw"Module name collision, 'Automaton' is already defined.";Elm.Automaton=function(){function b(a){return["Automaton",a]}function c(a){return b(function(b){var d=unzip(map(function(a){a:{switch(a[0]){case "Automaton":a=a[1](b);break a}throw"Non-exhaustive pattern match in case";}return a})(a)),f;a:{switch(d[0]){case "Tuple2":f=d[1];break a}throw"Non-exhaustive pattern match in case";}a:{switch(d[0]){case "Tuple2":d=
d[2];break a}throw"Non-exhaustive pattern match in case";}return["Tuple2",f,c(d)]})}function i(a){return b(function(b){return["Tuple2",a(b),i(a)]})}function a(c){return function(d){return b(function(b){b=d(b)(c);return["Tuple2",b,a(b)(d)]})}}function j(a){return function(c){return b(function(b){var d=c(b)(a);a:{switch(d[0]){case "Tuple2":b=d[1];break a}throw"Non-exhaustive pattern match in case";}a:{switch(d[0]){case "Tuple2":d=d[2];break a}throw"Non-exhaustive pattern match in case";}return["Tuple2",
b,j(d)(c)]})}}function l(a){return function(b){a:{switch(a[0]){case "Tuple2":b:{switch(b[0]){case "Tuple2":b=["Tuple2",a[1]-b[1],a[2]-b[2]];break b}break}break a}throw"Non-exhaustive pattern match in case";}return b}}function n(a){return function(b){var c;a:{switch(a[0]){case "Tuple2":b:{switch(b[0]){case "Tuple2":var d=function(a){return["Tuple2",b[2],["Tuple2",a,b[2]]]};c=function(){switch(b[1][0]){case "DragFrom":var c;a[1]?c=["Tuple2",uncurry(move)(l(a[2])(b[1][1]))(b[2]),["Tuple2",["DragFrom",
b[1][1]],b[2]]]:(c=uncurry(move)(l(a[2])(b[1][1]))(b[2]),c=["Tuple2",c,["Tuple2",g,c]]);return c;case "Ignore":return d(a[1]?s:g);case "Listen":return d(not(a[1])?g:isWithin(a[2])(b[2])?["DragFrom",a[2]]:s)}throw"Non-exhaustive pattern match in case";}();break b}break}break a}throw"Non-exhaustive pattern match in case";}return c}}try{if(!(Elm.Prelude instanceof Object))throw"module not found";}catch(h){throw"Module 'Prelude' is missing. Compile with --make flag or load missing module in a separate JavaScript file.";
}var f={};for(this.i in Elm.Prelude)f[this.i]||eval("var "+this.i+" = Elm.Prelude[this.i];");var g=["Listen"],s=["Ignore"];d[">>>"]=function(a){return function(c){var e;a:{switch(a[0]){case "Automaton":e=a[1];break a}throw"Non-exhaustive pattern match in case";}var f;a:{switch(c[0]){case "Automaton":f=c[1];break a}throw"Non-exhaustive pattern match in case";}return b(function(a){var a=e(a),b;a:{switch(a[0]){case "Tuple2":b=a[1];break a}throw"Non-exhaustive pattern match in case";}a:{switch(a[0]){case "Tuple2":a=
a[2];break a}throw"Non-exhaustive pattern match in case";}var c=f(b);a:{switch(c[0]){case "Tuple2":b=c[1];break a}throw"Non-exhaustive pattern match in case";}a:{switch(c[0]){case "Tuple2":c=c[2];break a}throw"Non-exhaustive pattern match in case";}return["Tuple2",b,d[">>>"](a)(c)]})}};d["<<<"]=function(a){return function(b){return d[">>>"](b)(a)}};d["^>>"]=function(a){return function(b){return d[">>>"](i(a))(b)}};d[">>^"]=function(a){return function(b){return d[">>>"](a)(i(b))}};d["^<<"]=function(a){return function(b){return d[">>>"](b)(i(a))}};
d["<<^"]=function(a){return function(b){return d[">>>"](i(b))(a)}};f=a(0)(function(){return function(a){return 1+a}});return{$op:{">>>":d[">>>"],"<<<":d["<<<"],"^>>":d["^>>"],">>^":d[">>^"],"^<<":d["^<<"],"<<^":d["<<^"]},run:function(a){return function(b){a:{switch(a[0]){case "Automaton":b=lift(fst)(foldp_(function(a){return function(b){a:{switch(b[0]){case "Tuple2":switch(b[2][0]){case "Automaton":b=b[2][1](a);break a}}throw"Non-exhaustive pattern match in case";}return b}})(a[1])(b));break a}throw"Non-exhaustive pattern match in case";
}return b}},step:function(a){return function(b){a:{switch(a[0]){case "Automaton":b=a[1](b);break a}throw"Non-exhaustive pattern match in case";}return b}},combine:c,pure:i,init:a,init_:j,count:f,draggable:function(a){return j(["Tuple2",g,a])(n)}}}();Elm.main=function(){return Elm.Automaton.main}}catch(c){Elm.main=function(){document.body.innerHTML=Elm.Text.monospace('<br/><h2>Your browser may not be supported. Are you using a modern browser?</h2><br/><span style="color:grey">Runtime Error in Automaton module:<br/>'+
c+"</span>");throw c;}}})();