@@ -1,2969 +1,90 @@
1−
2−var Guid = function() {
3− var counter = 0;
4− var guid = function() { counter += 1; return counter; };
5− return {guid : guid};
6−}();
7−var Foreign = function() {
8− var JavaScript = function() {
9− function castJSBoolToBool(b) { return b; }
10− function castBoolToJSBool(b) { return b; }
11−
12− function castJSNumberToFloat(n) { return n; }
13− function castFloatToJSNumber(n) { return n; }
14−
15− function castJSNumberToInt(n) { return ~~n; }
16− function castIntToJSNumber(n) { return n; }
17−
18− function castJSElementToElement(w) {
19− return function(h) {
20− return function(node) {
21− return ["Element",Guid.guid(),
22− ["EExternalHtml",node],
23− w,h,1,Nothing,Nothing];
24− }
25− }
26− }
27− function castElementToJSElement(elem) { return Render.render(elem); }
28−
29− function castJSArrayToList(arr) {
30− var list = ["Nil"];
31− for (var i = arr.length; i--; ) {
32− list = [ "Cons", arr[i], list ];
33− }
34− return list;
35− }
36− function castListToJSArray(list) {
37− var a = [];
38− while (list[0] === "Cons") {
39− a.push(list[1]);
40− list = list[2];
41− }
42− return a;
43− }
44−
45− var castJSStringToString = castJSArrayToList;
46− function castStringToJSString(str) {
47− if (typeof str === "string") return str;
48− return castListToJSArray(str).join('');
49− }
50−
51− function fromTuple(t) { return t.slice(1); }
52− function toTuple(a) { return ["Tuple" + a.length].concat(a); }
53−
54− return {castJSBoolToBool:castJSBoolToBool,
55− castBoolToJSBool:castBoolToJSBool,
56− castJSNumberToFloat:castJSNumberToFloat,
57− castFloatToJSNumber:castFloatToJSNumber,
58− castJSNumberToInt:castJSNumberToInt,
59− castIntToJSNumber:castIntToJSNumber,
60− Experimental : {castJSElementToElement:castJSElementToElement,
61− castElementToJSElement:castElementToJSElement},
62− castJSArrayToList:castJSArrayToList,
63− castListToJSArray:castListToJSArray,
64− castJSStringToString:castJSStringToString,
65− castStringToJSString:castStringToJSString,
66− castTupleToJSTuple2:fromTuple,
67− castTupleToJSTuple3:fromTuple,
68− castTupleToJSTuple4:fromTuple,
69− castTupleToJSTuple5:fromTuple,
70− castJSTupleToTuple2:toTuple,
71− castJSTupleToTuple3:toTuple,
72− castJSTupleToTuple4:toTuple,
73− castJSTupleToTuple5:toTuple
74− };
75− }();
76− return {JavaScript:JavaScript};
77−}();
78−var ElmJSON = function() {
79− var JS = Foreign.JavaScript;
80− var empty = ['JSON',{}];
81− function singleton(k) { return function(v) {
82− var obj = {};
83− obj[JS.castStringToJSString(k)] = v;
84− return ['JSON', obj ];
85− };
86− }
87− function insert(k) { return function(v) { return function(inObj) {
88− var obj = inObj[1];
89− var outObj = {};
90− for (var i in obj) {
91− outObj[i] = obj[i];
92− }
93− outObj[JS.castStringToJSString(k)] = v;
94− return ['JSON', outObj ];
95− };
96− };
97− }
98− function lookup(key) { return function(obj) {
99− var k = JS.castStringToJSString(key);
100− return obj[1].hasOwnProperty(k) ? Just(obj[1][k]) : Nothing ;
101− };
102− }
103− function lookupWithDefault(base) { return function(key) { return function(obj) {
104− var k = JS.castStringToJSString(key);
105− return obj[1].hasOwnProperty(k) ? obj[1][k] : base ;
106− };
107− };
108− }
109− function remove(k) { return function(inObj) {
110− var obj = inObj[1];
111− var outObj = {};
112− for (var i in obj) {
113− outObj[i] = obj[i];
114− }
115− delete outObj[JS.castStringToJSString(k)];
116− return ['JSON', outObj];
117− };
118− }
119−
120− function JsonString(v) { return [ "JsonString", v ]; }
121− function JsonNumber(v) { return [ "JsonNumber", v ]; }
122− function JsonBool(v) { return [ "JsonBool", v ]; }
123− var JsonNull = [ "JsonNull" ];
124− function JsonArray(v) { return [ "JsonArray", v ]; }
125− function JsonObject(v) { return [ "JsonObject", v ]; }
126−
127− function toList(json) {
128− var obj = json[1];
129− var arr = [];
130− for (var i in obj) {
131− arr.push(Value.Tuple(JS.castJSStringToString(i), obj[i]));
132− }
133− return JS.castJSArrayToList(arr);
134− }
135− function fromList(list) {
136− var arr = JS.castListToJSArray(list);
137− var obj = {};
138− for (var i = arr.length; i--; ) {
139− obj[JS.castStringToJSString(arr[i][1])] = arr[i][2];
140− }
141− return [ "JSON", obj ];
142− }
143−
144− function toPrettyJSString(sep) { return function (obj) {
145− function fromValue(v) {
146− switch (v[0]) {
147− case 'JsonNull' : return null;
148− case 'JsonString' : return JS.castStringToJSString(v[1]);
149− case 'JsonObject' :
150− var o = {};
151− var from = v[1][1];
152− for (var i in from) {
153− o[i] = fromValue(from[i]);
154− }
155− return o;
156− case 'JsonArray' :
157− var a = JS.castListToJSArray(v[1]);
158− for (var i = a.length; i--; ) {
159− a[i] = fromValue(a[i]);
160− }
161− return a;
162− default :
163− return v[1];
164− }
165− }
166− return JSON.stringify(fromValue([ 'JsonObject', obj ]), null, JS.castStringToJSString(sep));
167− };
168− }
169− function fromJSString(str) {
170− var obj = JSON.parse(str);
171− function toValue(v) {
172− switch (typeof v) {
173− case 'string' : return [ "JsonString", JS.castJSStringToString(v) ];
174− case 'number' : return [ "JsonNumber", JS.castJSNumberToFloat(v) ];
175− case 'boolean' : return [ "JsonBool", JS.castJSBoolToBool(v) ];
176− case 'object' :
177− if (v === null) return [ "JsonNull" ];
178− for (var i in v) {
179− v[i] = toValue(v[i]);
180− }
181− if (v instanceof Array) return [ "JsonArray", JS.castJSArrayToList(v) ];
182− return [ "JsonObject", [ "JSON", v ] ];
183− }
184− }
185− for (var i in obj) {
186− obj[i] = toValue(obj[i]);
187− }
188− return ['JSON',obj];
189− }
190− return {empty : empty,
191− singleton : singleton,
192− insert : insert,
193− lookup : lookup,
194− findWithDefault : lookupWithDefault,
195− remove : remove,
196− toPrettyJSString : toPrettyJSString,
197− toJSString : toPrettyJSString(''),
198− fromJSString : fromJSString,
199− toPrettyString : function(sep) { return function(v) {
200− return JS.castJSStringToString(toPrettyJSString(sep)(v)); }; },
201− toString : function(v) { return JS.castJSStringToString(toPrettyJSString('')(v)); },
202− fromString : function(v) { return fromJSString(JS.castStringToJSString(v)); },
203− toList : toList,
204− fromList : fromList,
205− JsonString : JsonString,
206− JsonNumber : JsonNumber,
207− JsonBool : JsonBool,
208− JsonNull : JsonNull,
209− JsonArray : JsonArray,
210− JsonObject : JsonObject
211− };
212−}();
213−
214−Foreign.JavaScript.JSON = ElmJSON;
215−var Value = function(){
216−
217− var eq = function(x,y) {
218− if (typeof x === "object") {
219− if (x === y) return true;
220− if (x.length !== y.length) return false;
221− for (var i = x.length; i--; ) {
222− if (!eq(x[i],y[i])) return false;
223− }
224− return true;
225− }
226− return x === y;
227− };
228−
229− var Tuple = function() {
230− var len = arguments.length;
231− var arr = new Array(len+1);
232− arr[0] = "Tuple" + arguments.length;
233− for (var i = len; i--; ) {
234− arr[i+1] = arguments[i];
235− }
236− return arr;
237− };
238−
239− var listToArray = function(list) {
240− var arr = [];
241− while (list[0] === "Cons") {
242− arr.push(list[1]);
243− list = list[2];
244− }
245− return arr;
246− };
247−
248− function makeSpaces(s) {
249− if (s.length == 0) { return s; }
250− var arr = s.split('');
251− if (arr[0] == ' ') { arr[0] = " " }
252− for (var i = arr.length; --i; ) {
253− if (arr[i][0] == ' ' && arr[i-1] == ' ') {
254− arr[i-1] = arr[i-1] + arr[i];
255− arr[i] = '';
256− }
257− }
258− for (var i = arr.length; i--; ) {
259− if (arr[i].length > 1 && arr[i][0] == ' ') {
260− var spaces = arr[i].split('');
261− for (var j = spaces.length - 2; j >= 0; j -= 2) {
262− spaces[j] = ' ';
263− }
264− arr[i] = spaces.join('');
265− }
266− }
267− return arr.join('');
268− }
269−
270− function properEscape(str) {
271− if (str.length == 0) return str;
272− str = str //.replace(/&/g, "&")
273− .replace(/"/g, /*"*/ """)
274− .replace(/'/g, /*'*/ "'")
275− .replace(/</g, "<")
276− .replace(/>/g, ">")
277− .replace(/\n/g, "<br/>");
278− var arr = str.split('<br/>');
279− for (var i = arr.length; i--; ) {
280− arr[i] = makeSpaces(arr[i]);
281− }
282− return arr.join('<br/>');
283− }
284−
285− var toText = function(elmList) {
286− if (typeof elmList === "string") return properEscape(elmList);
287− var a = [];
288− while (elmList[0] === "Cons") {
289− a.push(elmList[1]);
290− elmList = elmList[2];
291− }
292− return properEscape(a.join(''));
293− };
294−
295− function getTextSize(w,h,txt) {
296− var t = document.createElement('div');
297− t.innerHTML = txt;
298− t.style.textAlign = 'left';
299− if (w > 0) { t.style.width = w + "px"; }
300−
301− t.style.visibility = "hidden";
302− t.style.styleFloat = "left";
303− t.style.cssFloat = "left";
304−
305− document.body.appendChild(t);
306− var cStyle = window.getComputedStyle(t);
307− var realW = cStyle.getPropertyValue("width").slice(0,-2) - 0;
308− var realH = cStyle.getPropertyValue("height").slice(0,-2) - 0;
309− document.body.removeChild(t);
310− delete t;
311− return [Math.ceil(realW),Math.ceil(Math.max(h,realH))];
312− }
313−
314− function getSize(e) {
315− var t = e.cloneNode(true);
316−
317− t.style.visibility = "hidden";
318− t.style.styleFloat = "left";
319− t.style.cssFloat = "left";
320−
321− document.body.appendChild(t);
322− var w = t.offsetWidth;
323− var h = t.offsetHeight;
324− document.body.removeChild(t);
325− delete t;
326− return [w,h];
327− }
328−
329− function getExcess(e) {
330− var t = e.cloneNode(true);
331−
332− t.style.visibility = "hidden";
333− t.style.styleFloat = "left";
334− t.style.cssFloat = "left";
335−
336− document.body.appendChild(t);
337− var ow = t.offsetWidth;
338− var oh = t.offsetHeight;
339− var cStyle = window.getComputedStyle(t);
340− var w = cStyle.getPropertyValue("width").slice(0,-2) - 0;
341− var h = cStyle.getPropertyValue("height").slice(0,-2) - 0;
342− document.body.removeChild(t);
343− delete t;
344− return [ow-w,oh-h];
345− }
346−
347−
348− function groupForms(forms) {
349− forms = Foreign.JavaScript.castListToJSArray(forms);
350− var groups = [];
351− var arr = [];
352− for (var i = forms.length; i--; ) {
353− var f = forms[i];
354− switch(f[4][0]) {
355− case "FElement":
356− if (arr.length > 0) {
357− groups.push(arr);
358− arr = [];
359− }
360− groups.push(f);
361− break;
362− default:
363− arr.push(f);
364− }
365− }
366− if (arr.length > 0) groups.push(arr);
367− return groups;
368− }
369−
370− var toString = function(v) {
371− if (typeof v === "boolean") {
372− return v ? "True" : "False";
373− } else if (typeof v === "number") {
374− return v+"";
375− } else if (typeof v === "string" && v.length < 2) {
376− return "'"+v+"'";
377− } else if (v[0]) {
378− if (v[0].substring(0,5) === "Tuple") {
379− var output = "";
380− for (var i = v.length; --i; ) {
381− output = "," + toString(v[i]) + output;
382− }
383− if (output[0] === ",") output = output.substring(1);
384− return "("+output+")";
385− } else if (v[0] === "Cons") {
386− var start = (typeof v[1] === "string") ? '"' : "[";
387− var end = (typeof v[1] === "string") ? '"' : "]";
388− var div = (typeof v[1] === "string") ? "" : ",";
389− var f = (typeof v[1] === "string") ? function(x){return x} : toString;
390− var output = start + f(v[1]);
391− v = v[2];
392− while (true) {
393− if (v[0] === "Cons") {
394− output += div + f(v[1]);
395− v = v[2];
396− } else {
397− return output + end;
398− }
399− }
400− } else if (v[0] === "Nil") {
401− return "[]";
402− } else if (v[0] === "JSON") {
403− return "(JSON.fromList " + toString(ElmJSON.toList(v)) + ")";
404− } else {
405− var output = "";
406− for (var i = v.length; --i; ) {
407− output = " " + toString(v[i]) + output
408− }
409− output = v[0] + output;
410− return (v.length > 1) ? "(" + output + ")" : output;
411− }
412− }
413− return v+"";
414− };
415− var show = function(v) {
416− return Text.monospace(properEscape(toString(v)));
417− };
418− var append = function(xs,ys) {
419− if (typeof xs === "string" && typeof ys === "string") {
420− return xs.concat(ys);
421− }
422− if (xs[0] === "Nil") {
423− return ys;
424− }
425− var root = ["Cons", xs[1], ["Nil"]];
426− var curr = root;
427− xs = xs[2];
428− while (xs[0]==="Cons") {
429− curr[2] = ["Cons", xs[1], ["Nil"]];
430− xs = xs[2];
431− curr = curr[2];
432− }
433− curr[2] = ys;
434− return root;
435− };
436−
437− var str = function(s) {
438− var out = ["Nil"];
439− for (var i = s.length; i--; ) {
440− out = ["Cons", s[i], out];
441− }
442− return out;
443− };
444−
445− return {eq:eq,
446− str:str,
447− show:show,
448− Tuple:Tuple,
449− append:append,
450− listToArray:listToArray,
451− toText : toText,
452− properEscape : properEscape,
453− getTextSize : getTextSize,
454− getSize : getSize,
455− getExcess : getExcess,
456− groupForms : groupForms };
457−}();var List = function() {
458−
459− var throwError = function(f) {
460− throw "Function '" + f + "' expecting a list!";
461− }
462−
463− function length(xs) {
464− var out = 0;
465− while (xs[0] === "Cons") {
466− out += 1;
467− xs = xs[2];
468− }
469− return out;
470− };
471− var reverse = foldl(function(x_72) {
472− return function(y_73) {
473− return["Cons", x_72, y_73]
474− }
475− })(["Nil"]);
476− var concat = foldr(function(x_74) {
477− return function(y_75) {
478− return Value.append(x_74, y_75)
479− }
480− })(["Nil"]);
481− var and = foldl(function(x_77) {
482− return function(y_78) {
483− return x_77 && y_78
484− }
485− })(true);
486− var or = foldl(function(x_79) {
487− return function(y_80) {
488− return x_79 || y_80
489− }
490− })(false);
491− var sum = foldl(function(x_89) {
492− return function(y_90) {
493− return x_89 + y_90
494− }
495− })(0);
496− var product = foldl(function(x_91) {
497− return function(y_92) {
498− return x_91 * y_92
499− }
500− })(1);
501− var maximum = foldl1(function(x) { return function(y) { return Math.max(x,y) } });
502− var minimum = foldl1(function(x) { return function(y) { return Math.min(x,y) } });
503− function head(v) {
504− if (v[0] !== "Cons") {
505− throw "Error: 'head' only accepts lists of length greater than one.";
506− }
507− return v[1];
508− }
509− function tail(v) {
510− if (v[0] !== "Cons") {
511− throw "Error: 'tail' only accepts lists of length greater than one.";
512− }
513− return v[2];
514− }
515− function last(v) {
516− if (v[0] !== "Cons") {
517− throw "Error: 'last' only accepts lists of length greater than one.";
518− }
519− var out = v[1];
520− while (v[0] === "Cons") {
521− out = v[1];
522− v = v[2];
523− }
524− return out;
525− }
526− function map(f) {
527− return function(xs) {
528− if (xs[0] === "Nil") { return xs; }
529− if (xs[0] !== "Cons") { throwError('map'); }
530− var root = ["Cons", f(xs[1]), ["Nil"]];
531− var curr = root;
532− xs = xs[2];
533− while (xs[0]==="Cons") {
534− curr[2] = ["Cons", f(xs[1]), ["Nil"]];
535− xs = xs[2];
536− curr = curr[2];
537− }
538− return root;
539− }
540− }
541− function foldl(f) {
542− return function(b) {
543− return function(xs) {
544− var acc = b;
545− if (xs[0] === "Nil") { return acc; }
546− if (xs[0] !== "Cons") { throwError('foldl'); }
547− while (xs[0] === "Cons") {
548− acc = f(xs[1])(acc);
549− xs = xs[2];
550− }
551− return acc;
552− }
553− }
554− }
555− function foldr(f) {
556− return function(b) {
557− return function(xs) {
558− var acc = b;
559− if (xs[0] === "Nil") { return acc; }
560− if (xs[0] !== "Cons") { throwError('foldr'); }
561− var arr = [];
562− while (xs[0] === "Cons") {
563− arr.push(xs[1]);
564− xs = xs[2];
565− }
566− for (var i = arr.length; i--; ) {
567− acc = f(arr[i])(acc);
568− }
569− return acc;
570− }
571− }
572− }
573− function foldl1(f_49) {
574− return function(_temp_50) {
575− return function(v) {
576− if("Cons" !== v[0]) {
577− return undefined
578− }else {
579− var x_51 = v[1];
580− var xs_52 = v[2];
581− return foldl(f_49)(x_51)(xs_52)
582− }
583− }(_temp_50)
584− }
585− }
586− function foldr1(f) {
587− return function(xs) {
588− if (xs[0] === "Nil") { throw "'foldr1' requires an non-empty list." }
589− if (xs[0] !== "Cons") { throwError('foldr1'); }
590− var arr = [];
591− while (xs[0] === "Cons") {
592− arr.push(xs[1]);
593− xs = xs[2];
594− }
595− var acc = arr.pop();
596− for (var i = arr.length; i--; ) {
597− acc = f(arr[i])(acc);
598− }
599− return acc;
600− }
601− }
602− function scanl(f) {
603− return function(b) {
604− return function(xs) {
605− if (xs[0] === "Nil") { return ["Cons",b,["Nil"]]; }
606− if (xs[0] !== "Cons") { throwError('scanl'); }
607− var arr = [b];
608− while (xs[0] === "Cons") {
609− b = f(xs[1])(b);
610− arr.push(b);
611− xs = xs[2];
612− }
613− var out = ["Nil"];
614− for (var i = arr.length; i--; ) {
615− out = ["Cons", arr[i], out];
616− }
617− return out;
618− }
619− }
620− }
621− function scanl1(f) {
622− return function(xs) {
623− if (xs[0] !== "Cons") {
624− throw "Error: 'scanl1' requires a list of at least length 1.";
625− }
626− return scanl(f)(xs[1])(xs[2]);
627− }
628− }
629− function filter(pred) {
630− return function(xs) {
631− if (xs[0] === "Nil") { return xs; }
632− if (xs[0] !== "Cons") { throwError('filter'); }
633− var arr = [];
634− while (xs[0] === "Cons") {
635− if (pred(xs[1])) { arr.push(xs[1]); }
636− xs = xs[2];
637− }
638− var out = ["Nil"];
639− for (var i = arr.length; i--; ) {
640− out = ["Cons", arr[i], out];
641− }
642− return out;
643− }
644− }
645− function concatMap(f_76) {
646− return function(x) {
647− return concat(map(f_76)(x))
648− }
649− }
650− function forall(pred) {
651− return foldl(function(x) { return function(acc) {
652− return acc && pred(x);
653− };})(true);
654− }
655− function exists(pred) {
656− return foldl(function(x) { return function(acc) {
657− return acc || pred(x);
658− };})(false);
659− }
660− function partition(pred_93) {
661− return function(lst_94) {
662− return function() {
663− var v = lst_94;
664− var c = [function(v) {
665− if("Nil" !== v[0]) {
666− return undefined
667− }else {
668− return["Tuple2", ["Nil"], ["Nil"]]
669− }
670− }, function(v) {
671− if("Cons" !== v[0]) {
672− return undefined
673− }else {
674− var x_95 = v[1];
675− var xs_96 = v[2];
676− return function(v) {
677− if("Tuple2" !== v[0]) {
678− return undefined
679− }else {
680− var as_97 = v[1];
681− var bs_98 = v[2];
682− return pred_93(x_95) ? ["Tuple2", ["Cons", x_95, as_97], bs_98] : ["Tuple2", as_97, ["Cons", x_95, bs_98]]
683− }
684− }(partition(pred_93)(xs_96))
685− }
686− }];
687− for(var i = c.length;i--;) {
688− var r = c[i](v);
689− if(r !== undefined) {
690− return r
691− }
692− }
693− }()
694− }
695− }
696− function zipWith(f) {
697− return function(listA) {
698− return function(listB) {
699− if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
700− if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zipWith'); }
701− var arr = [];
702− while (listA[0] === "Cons" && listB[0] === "Cons") {
703− arr.push(f(listA[1])(listB[1]));
704− listA = listA[2];
705− listB = listB[2];
706− }
707− var out = ["Nil"];
708− for (var i = arr.length; i--; ) {
709− out = ["Cons", arr[i], out];
710− }
711− return out;
712− }
713− }
714− }
715− function zip(listA) {
716− return function(listB) {
717− if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
718− if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zip'); }
719− var arr = [];
720− while (listA[0] === "Cons" && listB[0] === "Cons") {
721− arr.push(["Tuple2", listA[1], listB[1]]);
722− listA = listA[2];
723− listB = listB[2];
724− }
725− var out = ["Nil"];
726− for (var i = arr.length; i--; ) {
727− out = ["Cons", arr[i], out];
728− }
729− return out;
730− }
731− }
732− function unzip(pairs_112) {
733− return function() {
734− var v = pairs_112;
735− var c = [function(v) {
736− if("Nil" !== v[0]) {
737− return undefined
738− }else {
739− return["Tuple2", ["Nil"], ["Nil"]]
740− }
741− }, function(v) {
742− if("Cons" !== v[0]) {
743− return undefined
744− }else {
745− var p_113 = v[1];
746− var ps_114 = v[2];
747− return function(v) {
748− if("Tuple2" !== v[0]) {
749− return undefined
750− }else {
751− if("Tuple2" !== v[1][0]) {
752− return undefined
753− }else {
754− var x_115 = v[1][1];
755− var y_116 = v[1][2];
756− if("Tuple2" !== v[2][0]) {
757− return undefined
758− }else {
759− var xs_117 = v[2][1];
760− var ys_118 = v[2][2];
761− return["Tuple2", ["Cons", x_115, xs_117], ["Cons", y_116, ys_118]]
762− }
763− }
764− }
765− }(["Tuple2", p_113, unzip(ps_114)])
766− }
767− }];
768− for(var i = c.length;i--;) {
769− var r = c[i](v);
770− if(r !== undefined) {
771− return r
772− }
773− }
774− }()
775− }
776− function intersperse(sep_119) {
777− return function(xs_120) {
778− return function() {
779− var v = xs_120;
780− var c = [function(v) {
781− if("Nil" !== v[0]) {
782− return undefined
783− }else {
784− return["Nil"]
785− }
786− }, function(v) {
787− if("Cons" !== v[0]) {
788− return undefined
789− }else {
790− var a_124 = v[1];
791− if("Nil" !== v[2][0]) {
792− return undefined
793− }else {
794− return["Cons", a_124, ["Nil"]]
795− }
796− }
797− }, function(v) {
798− if("Cons" !== v[0]) {
799− return undefined
800− }else {
801− var a_121 = v[1];
802− if("Cons" !== v[2][0]) {
803− return undefined
804− }else {
805− var b_122 = v[2][1];
806− var cs_123 = v[2][2];
807− return["Cons", a_121, ["Cons", sep_119, intersperse(sep_119)(["Cons", b_122, cs_123])]]
808− }
809− }
810− }];
811− for(var i = c.length;i--;) {
812− var r = c[i](v);
813− if(r !== undefined) {
814− return r
815− }
816− }
817− }()
818− }
819− }
820− function intercalate(sep_125) {
821− return function(xs_126) {
822− return function() {
823− var v = xs_126;
824− var c = [function(v) {
825− if("Nil" !== v[0]) {
826− return undefined
827− }else {
828− return["Nil"]
829− }
830− }, function(v) {
831− if("Cons" !== v[0]) {
832− return undefined
833− }else {
834− var a_130 = v[1];
835− if("Nil" !== v[2][0]) {
836− return undefined
837− }else {
838− return a_130
839− }
840− }
841− }, function(v) {
842− if("Cons" !== v[0]) {
843− return undefined
844− }else {
845− var a_127 = v[1];
846− if("Cons" !== v[2][0]) {
847− return undefined
848− }else {
849− var b_128 = v[2][1];
850− var cs_129 = v[2][2];
851− return Value.append(a_127, Value.append(sep_125, intercalate(sep_125)(["Cons", b_128, cs_129])))
852− }
853− }
854− }];
855− for(var i = c.length;i--;) {
856− var r = c[i](v);
857− if(r !== undefined) {
858− return r
859− }
860− }
861− }()
862− }
863− }
864− function sort(xs) {
865− if (xs[0] === "Nil") { return xs; }
866− if (xs[0] !== "Cons") { throwError('sort'); }
867− var arr = [];
868− while (xs[0] === "Cons") {
869− arr.push(xs[1]);
870− xs = xs[2];
871− }
872− arr.sort(function(a,b) { return a - b});
873− var out = ["Nil"];
874− for (var i = arr.length; i--; ) {
875− out = [ "Cons", arr[i], out ];
876− }
877− return out;
878− }
879− function take(n) { return function(xs) {
880− if (n <= 0) { return ["Nil"]; }
881− if (xs[0] === "Nil") { return xs; }
882− if (xs[0] !== "Cons") { throwError('take'); }
883− var out = [ "Cons", xs[1], ["Nil"] ];
884− var temp = out;
885− xs = xs[2];
886− --n;
887− while (xs[0] === "Cons" && n > 0) {
888− temp[2] = [ "Cons", xs[1], ["Nil"] ];
889− temp = temp[2];
890− xs = xs[2];
891− --n;
892− }
893− return out;
894− };
895− }
896− function drop(n) { return function(xs) {
897− if (xs[0] === "Nil") { return xs; }
898− if (xs[0] !== "Cons") { throwError('drop'); }
899− while (xs[0] === "Cons" && n > 0) {
900− xs = xs[2];
901− --n;
902− }
903− return xs;
904− };
905− }
906− return {head:head,
907− tail:tail,
908− last:last,
909− map:map,
910− foldl:foldl,
911− foldr:foldr,
912− foldl1:foldl1,
913− foldr1:foldr1,
914− scanl:scanl,
915− scanl1:scanl1,
916− filter:filter,
917− length:length,
918− reverse:reverse,
919− concat:concat,
920− concatMap:concatMap,
921− and:and,
922− or:or,
923− forall:forall,
924− exists:exists,
925− sum:sum,
926− product:product,
927− maximum:maximum,
928− minimum:minimum,
929− partition:partition,
930− zipWith:zipWith,
931− zip:zip,
932− unzip:unzip,
933− intersperse:intersperse,
934− intercalate:intercalate,
935− sort:sort,
936− take:take,
937− drop:drop};
938−}();
939−var Data = function() {
940−
941−var Char = function() {
942− return {fromCode : function(c) { return String.fromCharCode(c); },
943− toCode : function(c) { return c.charCodeAt(0); },
944− toUpper : function(c) { return c.toUpperCase(); },
945− toLower : function(c) { return c.toLowerCase(); },
946− toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },
947− toLocaleLower : function(c) { return c.toLocaleLowerCase(); }
948− };
949−}();
950−
951−var Maybe = function() {
952− function consMaybe(x) { return function(xs) {
953− if (x[0] === "Just") return ["Cons", x[1], xs];
954− return xs;
955− };
956− }
957− function fromMaybe(b) { return function(m) {
958− if (m[0] === "Just") return m[1];
959− return b;
960− };
961− }
962− function mapCons(f) { return function(y) { return function(xs) {
963− var x = f(y);
964− if (x[0] === "Just") return ["Cons", x[1], xs];
965− return xs;
966− };
967− };
968− }
969− function maybe(b) { return function(f) { return function(m) {
970− if (m[0] === "Just") return f(m[1]);
971− return b;
972− };
973− };
974− }
975−
976− return {Just : function(x) { return ["Just",x]; },
977− Nothing : ["Nothing"],
978− catMaybes : List.foldr(consMaybe)(["Nil"]),
979− isJust : function(m) { return m[0] === "Just"; },
980− isNothing : function(m) { return m[0] === "Nothing"; },
981− fromMaybe : fromMaybe,
982− consMaybe : consMaybe,
983− mapMaybe : function(f) { return List.foldr(mapCons(f))(["Nil"]); },
984− maybe : maybe
985− };
986−}();
987−
988−/*
989−var String = function() {
990−
991− function append(s1) { return function(s2) {
992− return s1.concat(s2);
993− };
994− }
995− function map(f) { return function(s) {
996− for (var i = s.length; i--; ) { s[i] = f(s[i]); }
997− };
998− }
999−
1000− function intercalate(sep) { return function(ss) {
1001− return Value.listToArray(ss).join(sep);
1002− };
1003− }
1004− function intersperse(sep) { return function(s) {
1005− return s.split("").join(sep);
1006− };
1007− }
1008−
1009− function foldl(f) { return function(b) { return function(s) {
1010− var acc = b;
1011− for (var i = 0, len = s.length; i < len; ++i) { acc = f(s[i])(acc); }
1012− return acc;
1013− };
1014− };
1015− }
1016− function foldr(f) { return function(b) { return function(s) {
1017− var acc = b;
1018− for (var i = s.length; i--; ) { acc = f(s[i])(acc); }
1019− return acc;
1020− };
1021− };
1022− }
1023−
1024− function concatMap(f) { return function(s) {
1025− var a = s.split("");
1026− for (var i = a.length; i--; ) { a[i] = f(a[i]); }
1027− return a.join("");
1028− };
1029− }
1030−
1031− function forall(pred) { return function(s) {
1032− for (var i = s.length; i--; ) { if (!pred(s[i])) {return false}; }
1033− return true;
1034− };
1035− }
1036− function exists(pred) { return function(s) {
1037− for (var i = s.length; i--; ) { if (pred(s[i])) {return true}; }
1038− return false;
1039− };
1040− }
1041−
1042− return {cons : append,
1043− snoc : append,
1044− head : function(s) { return s[0]; },
1045− last : function(s) { return s[s.length-1]; },
1046− tail : function(s) { return s.slice(1); },
1047− length : function(s) { return s.length; },
1048− map : map,
1049− intercalate : intercalate,
1050− intersperse : intersperse,
1051− reverse : function(s) { return s.split("").reverse().join(""); },
1052− toLower : function(s) { return s.toLowerCase(); },
1053− toUpper : function(s) { return s.toUpperCase(); },
1054− foldl : foldl,
1055− foldr : foldr,
1056− concat : function(ss) { return Value.listToArray(ss).join(""); },
1057− concatMap : concatMap,
1058− forall : forall,
1059− exists : exists,
1060− //filter : filter,
1061− //take:,
1062− //drop:,
1063− toText : Value.toText,
1064− properEscape : Value.properEscape
1065− };
1066−}();
1067−*/
1068−return {String: {toText:Value.toText, properEscape:Value.properEscape},
1069− Char:Char,
1070− Maybe:Maybe,
1071− List:List
1072− };
1073−}();var ElmCode = ElmCode || {};
1074−ElmCode.Graphics = ElmCode.Graphics || {};
1075−ElmCode.Graphics.Color = function() {
1076− function Color_0(a1) {
1077− return function(a2) {
1078− return function(a3) {
1079− return function(a4) {
1080− return["Color", a1, a2, a3, a4]
1081− }
1082− }
1083− }
1084− }
1085− var rgba_1 = Color_0;
1086− var red_3 = ["Color",255,0,0,1];
1087− var green_4 = ["Color",0,255,0,1];
1088− var blue_5 = ["Color",0,0,255,1];
1089− var yellow_6 = ["Color",255,255,0,1];
1090− var cyan_7 = ["Color",0,255,255,1];
1091− var magenta_8 = ["Color",255,0,255,1];
1092− var black_9 = ["Color",0,0,0,1];
1093− var white_10 = ["Color",255,255,255,1];
1094− var gray_11 = ["Color",128,128,128,1];
1095− var grey_12 = ["Color",128,128,128,1];
1096− function rgb_2(r_13) {
1097− return function(g_14) {
1098− return function(b_15) {
1099− return ["Color",r_13,g_14,b_15,1]
1100− }
1101− }
1102− }
1103− function extract(c) {
1104− if (c[4] === 1) { return 'rgb(' + c[1] + ',' + c[2] + ',' + c[3] + ')'; }
1105− return 'rgba(' + c[1] + ',' + c[2] + ',' + c[3] + ',' + c[4] + ')';
1106− }
1107− return{rgba:rgba_1, rgb:rgb_2, red:red_3, green:green_4, blue:blue_5, yellow:yellow_6, cyan:cyan_7, magenta:magenta_8, black:black_9, white:white_10, gray:gray_11, grey:grey_12,extract:extract}
1108−}();
1109−var Collage = function() {
1110−
1111−function tracePoints(ctx,points) {
1112− var i = points.length - 1;
1113− if (i <= 0) return;
1114− ctx.moveTo(points[i][1], points[i][2]);
1115− while (i--) { ctx.lineTo(points[i][1], points[i][2]); }
1116−}
1117−
1118−function solid(ctx,color,points) {
1119− tracePoints(ctx,points);
1120− ctx.strokeStyle = ElmCode.Graphics.Color.extract(color);
1121− ctx.stroke();
1122−};
1123−
1124−function filled(ctx,color,points) {
1125− tracePoints(ctx,points);
1126− ctx.fillStyle = ElmCode.Graphics.Color.extract(color);
1127− ctx.fill();
1128−}
1129−
1130−function textured(redo,ctx,src,points) {
1131− var img = new Image();
1132− img.src = Foreign.JavaScript.castStringToJSString(src);
1133− img.onload = redo;
1134−
1135− tracePoints(ctx,points);
1136− ctx.fillStyle = ctx.createPattern(img,'repeat');
1137− ctx.fill();
1138−}
1139−
1140−function customLine(pattern,ctx,color,points) {
1141− if (pattern.length === 0) { pattern = [8,4]; }
1142− customLineHelp(ctx, pattern, points);
1143− ctx.strokeStyle = ElmCode.Graphics.Color.extract(color);
1144− ctx.stroke();
1145−};
1146−
1147−var customLineHelp = function(ctx, pattern, points) {
1148− var i = points.length - 1;
1149− if (i <= 0) return;
1150− var x0 = points[i][1], y0 = points[i][2];
1151− var x1=0, y1=0, dx=0, dy=0, remaining=0, nx=0, ny=0;
1152− var pindex = 0, plen = pattern.length;
1153− var draw = true, segmentLength = pattern[0];
1154− ctx.moveTo(x0,y0);
1155− while (i--) {
1156− x1 = points[i][1]; y1 = points[i][2];
1157− dx = x1 - x0; dy = y1 - y0;
1158− remaining = Math.sqrt(dx * dx + dy * dy);
1159− while (segmentLength <= remaining) {
1160− x0 += dx * segmentLength / remaining;
1161− y0 += dy * segmentLength / remaining;
1162− ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);
1163− // update starting position
1164− dx = x1 - x0; dy = y1 - y0;
1165− remaining = Math.sqrt(dx * dx + dy * dy);
1166− // update pattern
1167− draw = !draw;
1168− pindex = (pindex + 1) % plen;
1169− segmentLength = pattern[pindex];
1170− }
1171− if (remaining > 0) {
1172− ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);
1173− segmentLength -= remaining;
1174− }
1175− x0 = x1; y0 = y1;
1176− }
1177−};
1178−
1179−function drawLine(ctx,form) {
1180− var points = form[3][1];
1181− switch(form[1][0]) {
1182− case "Solid" : return solid(ctx,form[2],points);
1183− case "Dotted": return customLine([3,3],ctx,form[2],points);
1184− case "Dashed": return customLine([8,4],ctx,form[2],points);
1185− case "Custom": return customLine(form[1][1],ctx,form[2],points);
1186− }
1187−};
1188−
1189−function drawShape(redo,ctx,shapeStyle,color,points) {
1190− switch(shapeStyle[0]) {
1191− case "Filled": return filled(ctx,color,points);
1192− case "Outlined": return solid(ctx,color,points);
1193− case "Textured": return textured(redo,ctx,shapeStyle[1],points);
1194− case "CustomOutline":
1195− return customLine(shapeStyle[1],ctx,color,points);
1196− }
1197−};
1198−
1199−function drawImage(redo,ctx,w,h,src) {
1200− var img = new Image();
1201− img.onload = redo;
1202− img.src = Foreign.JavaScript.castStringToJSString(src);
1203− ctx.drawImage(img,-w/2,-h/2,w,h);
1204−}
1205−
1206−function renderForm(redo,ctx,theta,scale,x,y,form) {
1207− ctx.save();
1208− if (x !== 0 || y !== 0) ctx.translate(x,y);
1209− if (theta !== ~~theta) ctx.rotate(2*Math.PI*theta);
1210− if (scale !== 1) ctx.scale(scale,scale);
1211− ctx.beginPath();
1212− switch(form[0]) {
1213− case "FLine": drawLine(ctx,form); break;
1214− case "FShape": drawShape(redo,ctx,form[1],form[2],form[3][1]); break;
1215− case "FImage": drawImage(redo,ctx,form[1],form[2],form[3]); break;
1216− }
1217− ctx.restore();
1218−};
1219−
1220−function renderForms(redo,ctx,w,h,forms) {
1221− ctx.clearRect(0,0,w,h);
1222− for (var i = forms.length; i--; ) {
1223− var f = forms[i];
1224− renderForm(redo,ctx,f[1],f[2],f[3][1],f[3][2],f[4]);
1225− }
1226−}
1227−
1228−function collageForms(w,h,forms) {
1229− var canvas = Render.newElement('canvas');
1230− canvas.style.width = (~~w) + 'px';
1231− canvas.style.height = (~~h) + 'px';
1232− canvas.style.display = "block";
1233− canvas.width = ~~w;
1234− canvas.height = ~~h;
1235− if (canvas.getContext) {
1236− var ctx = canvas.getContext('2d');
1237− var w = canvas.width, h = canvas.height;
1238− function redo() { renderForms(this,ctx,w,h,forms); }
1239− renderForms(redo,ctx,w,h,forms);
1240− return canvas;
1241− }
1242− canvas.innerHTML = "Your browser does not support the canvas element.";
1243− return canvas;
1244−};
1245−
1246−function collageElement(w,h,theta,scale,x,y,elem) {
1247− var e = Render.render(elem);
1248− var t = "translate(" + (x - elem[3] / 2) + "px,"+ (y - elem[4] / 2) + "px)";
1249− var r = theta === (~~theta) ? "" : "rotate(" + theta*360 + "deg)";
1250− var s = scale === 1 ? "" : "scale(" + scale + "," + scale + ")";
1251− var transforms = t + " " + s + " " + r;
1252− e.style.transform = transforms;
1253− e.style.msTransform = transforms;
1254− e.style.MozTransform = transforms;
1255− e.style.webkitTransform = transforms;
1256− e.style.OTransform = transforms;
1257− var div = Render.newElement('div');
1258− Render.addTo(div,e);
1259− div.style.width = (~~w) + "px";
1260− div.style.height = (~~h) + "px";
1261− div.style.overflow = "hidden";
1262− return div;
1263−}
1264−
1265−function collage(w,h,formss) {
1266− if (formss.length === 0) { return collageForms(w,h,[]); }
1267− var elems = new Array(formss.length);
1268− for (var i = formss.length; i--; ) {
1269− var f = formss[i];
1270− if (typeof f[0] === "string") {
1271− elems[i] = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1272− } else {
1273− elems[i] = collageForms(w,h,f);
1274− }
1275− }
1276− if (formss.length === 1) { return elems[0]; }
1277− return Render.flowWith(Render.goIn,function(x){return x},elems);
1278−}
1279−
1280−function updateFormSet(node,currSet,nextSet) {
1281− if (Value.eq(nextSet,currSet)) return;
1282− var w = node.style.width.slice(0,-2) - 0;
1283− var h = node.style.height.slice(0,-2) - 0;
1284− if (typeof nextSet[0] === "object") {
1285− if (typeof currSet[0] === "object") {
1286− if (node.getContext) {
1287− var ctx = node.getContext('2d');
1288− function redo() { renderForms(this,ctx,w,h,nextSet); }
1289− return renderForms(redo,ctx,w,h,nextSet);
1290− }
1291− }
1292− var newNode = collageForms(w,h,nextSet);
1293− newNode.style.position = 'absolute';
1294− return node.parentNode.replaceChild(newNode,node);
1295− }
1296− var f = nextSet;
1297− var newNode = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1298− newNode.style.position = 'absolute';
1299− return node.parentNode.replaceChild(newNode,node);
1300−}
1301−
1302−// assumes that the form sets are the same length.
1303−function updateCollage(node,currs,nexts) {
1304− if (nexts.length === 1) {
1305− return updateFormSet(node,currs[0],nexts[0]);
1306− }
1307− var kids = node.childNodes;
1308− var len = kids.length;
1309− for (var i = len; i--; ) {
1310− updateFormSet(kids[len-i-1], currs[i], nexts[i]);
1311− }
1312−}
1313−
1314−function style(clr,n,list) {
1315− return ["Tuple2",
1316− '<span style="font-size:100%;color:' + clr + ';">' + n + '</span>',
1317− list];
1318−}
1319−
1320−function insideForm(point) { return function(form) {
1321− if (!inBoundsOf(point[1],point[2],form)) return false;
1322− var hw, hh;
1323− switch (form[4][0]) {
1324− case "FShape": return insideShape(point,form[1],form[2],form[3],form[4][3][1]);
1325− case "FLine": return false;
1326− case "FImage":
1327− hw = form[4][1] / 2;
1328− hh = form[4][2] / 2;
1329− break;
1330− case "FElement":
1331− hw = form[4][1][3] / 2;
1332− hh = form[4][1][4] / 2;
1333− break;
1334− }
1335− return insideShape(point,form[1],form[2],form[3],
1336− [ [null, hw, hh],
1337− [null,-hw, hh],
1338− [null,-hw,-hh],
1339− [null, hw,-hh],
1340− [null, hw, hh] ]);
1341− };
1342−}
1343−
1344−function inBoundsOf(px,py,form) {
1345− if (form.length < 6) {
1346− var fx = form[3][1], fy = form[3][2];
1347− var radiusSquared = 0;
1348− var scale = form[2];
1349− switch (form[4][0]) {
1350− case "FShape":
1351− var points = form[4][3][1];
1352− for (var i = points.length; --i; ) {
1353− var p = points[i];
1354− radiusSquared = Math.max(radiusSquared, p[1]*p[1] + p[2]*p[2]);
1355− }
1356− radiusSquared *= scale * scale;
1357− break;
1358− case "FLine":
1359− break;
1360− case "FImage":
1361− var x = scale * form[4][1] / 2;
1362− var y = scale * form[4][2] / 2;
1363− radiusSquared = x*x + y*y;
1364− break;
1365− case "FElement":
1366− var x = scale * form[4][1][3] / 2;
1367− var y = scale * form[4][1][4] / 2;
1368− radiusSquared = x*x + y*y;
1369− break;
1370− }
1371− form.push(function(px,py) {
1372− var dx = px - fx;
1373− var dy = py - fy;
1374− return dx*dx + dy*dy < radiusSquared + 1;
1375− });
1376− }
1377− return form[5](px,py);
1378−}
1379−
1380−function insideShape(point,theta,scale,pos,points) {
1381− var counter = 0;
1382− var list = ["Nil"];
1383− var p1,p2;
1384−
1385− var x = (point[1] - pos[1]) / scale;
1386− var y = (point[2] - pos[2]) / scale;
1387− if (theta !== 0) {
1388− var angle = 2 * Math.PI * theta;
1389− var t = x === 0 ? (y > 0 ? Math.PI/2 : -Math.PI/2) - angle
1390− : (Math.atan(y/x) + (x > 0 ? 0 : Math.PI)) - angle;
1391− var r = Math.sqrt(x*x + y*y);
1392− x = r * Math.cos(t);
1393− y = r * Math.sin(t);
1394− }
1395−
1396− if (points.length === 0) { return false; }
1397− p1 = points[0];
1398− for (var i = points.length - 1; i--; ) {
1399− p2 = points[i];
1400− var p1x = p1[1], p1y = p1[2], p2x = p2[1], p2y = p2[2];
1401−
1402− if (p1y < p2y) {var ymin=p1y, ymax=p2y;} else {var ymin=p2y, ymax=p1y;}
1403− if (p1x < p2x) {var xmin=p1x, xmax=p2x;} else {var xmin=p2x, xmax=p1x;}
1404−
1405− if (ymin < y && y <= ymax && x <= xmax) {
1406− if (x <= xmin || x <= ((y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x)) {
1407− ++counter;
1408− }
1409− }
1410− p1 = p2;
1411− }
1412− return (counter % 2) === 1;
1413−}
1414−
1415−return {collage:collage, updateCollage:updateCollage, insideForm:insideForm};
1416−
1417−}();var ElmCode = ElmCode || {};
1418−ElmCode.Graphics = ElmCode.Graphics || {};
1419−ElmCode.Graphics.Element = function() {
1420− var DLeft_0 = ["DLeft"];
1421− var DRight_1 = ["DRight"];
1422− var DUp_2 = ["DUp"];
1423− var DDown_3 = ["DDown"];
1424− var DIn_4 = ["DIn"];
1425− var DOut_5 = ["DOut"];
1426− function Absolute_12(a1) {
1427− return["Absolute", a1]
1428− }
1429− function Relative_13(a1) {
1430− return["Relative", a1]
1431− }
1432− var Near_14 = ["Near"];
1433− var Mid_15 = ["Mid"];
1434− var Far_16 = ["Far"];
1435− function Position_17(a1) {
1436− return function(a2) {
1437− return["Position", a1, a2]
1438− }
1439− }
1440− function PositionTL_18(a1) {
1441− return function(a2) {
1442− return["PositionTL", a1, a2]
1443− }
1444− }
1445− function PositionTR_19(a1) {
1446− return function(a2) {
1447− return["PositionTR", a1, a2]
1448− }
1449− }
1450− function PositionBL_20(a1) {
1451− return function(a2) {
1452− return["PositionBL", a1, a2]
1453− }
1454− }
1455− function PositionBR_21(a1) {
1456− return function(a2) {
1457− return["PositionBR", a1, a2]
1458− }
1459− }
1460− function Element_37(id,e,w,h,o,c,l) {
1461− return["Element", id, e, w, h, o, c, l ]
1462− }
1463− function EText_39(a1) {
1464− return function(a2) {
1465− return["EText", a1, a2]
1466− }
1467− }
1468− function EImage_40(a1) {
1469− return["EImage", Foreign.JavaScript.castStringToJSString(a1)]
1470− }
1471− function EVideo_41(a1) {
1472− return["EVideo", Foreign.JavaScript.castStringToJSString(a1)]
1473− }
1474− function EFittedImage_42(a1) {
1475− return["EFittedImage", Foreign.JavaScript.castStringToJSString(a1)]
1476− }
1477− function EFlow_43(a1) {
1478− return function(a2) {
1479− return["EFlow", a1, Foreign.JavaScript.castListToJSArray(a2)]
1480− }
1481− }
1482− function ECollage_44(a1) {
1483− return function(a2) {
1484− return function(a3) {
1485− return["ECollage", a1, a2, Value.groupForms(a3)]
1486− }
1487− }
1488− }
1489− var EEmpty_45 = ["EEmpty"];
1490− function EContainer_46(a1) {
1491− return function(a2) {
1492− return["EContainer", a1, a2]
1493− }
1494− }
1495− var Solid_68 = ["Solid"];
1496− var Dotted_69 = ["Dotted"];
1497− var Dashed_70 = ["Dashed"];
1498− function Custom_71(a1) {
1499− return["Custom", Foreign.JavaScript.castListToJSArray(a1)]
1500− }
1501− var Filled_72 = ["Filled"];
1502− var Outlined_73 = ["Outlined"];
1503− function CustomOutline_74(a1) {
1504− return["CustomOutline", Foreign.JavaScript.castListToJSArray(a1)]
1505− }
1506− function Line_75(a1) {
1507− return["Line", Foreign.JavaScript.castListToJSArray(a1)]
1508− }
1509− function Shape_78(a1) {
1510− return function(a2) {
1511− var points = Foreign.JavaScript.castListToJSArray(a1);
1512− if (points.length > 0) { points.push(points[0]); }
1513− return["Shape", points, a2];
1514− }
1515− }
1516− function Form_84(a1) {
1517− return function(a2) {
1518− return function(a3) {
1519− return function(a4) {
1520− return["Form", a1, a2, a3, a4]
1521− }
1522− }
1523− }
1524− }
1525− function FLine_85(a1) {
1526− return function(a2) {
1527− return function(a3) {
1528− return["FLine", a1, a2, a3]
1529− }
1530− }
1531− }
1532− function FShape_86(a1) {
1533− return function(a2) {
1534− return function(a3) {
1535− return["FShape", a1, a2, a3]
1536− }
1537− }
1538− }
1539− function FImage_87(a1) {
1540− return function(a2) {
1541− return function(a3) {
1542− return["FImage", a1, a2, Foreign.JavaScript.castStringToJSString(a3)]
1543− }
1544− }
1545− }
1546− function FElement_88(a1) {
1547− return["FElement", a1]
1548− }
1549− var left_6 = DLeft_0;
1550− var right_7 = DRight_1;
1551− var down_8 = DDown_3;
1552− var up_9 = DUp_2;
1553− var inward_10 = DIn_4;
1554− var outward_11 = DOut_5;
1555− var topLeft_22 = Position_17(Near_14)(Near_14);
1556− var topRight_23 = Position_17(Far_16)(Near_14);
1557− var bottomLeft_24 = Position_17(Near_14)(Far_16);
1558− var bottomRight_25 = Position_17(Far_16)(Far_16);
1559− var midLeft_26 = Position_17(Near_14)(Mid_15);
1560− var midRight_27 = Position_17(Far_16)(Mid_15);
1561− var midTop_28 = Position_17(Mid_15)(Near_14);
1562− var midBottom_29 = Position_17(Mid_15)(Far_16);
1563− var middle_30 = Position_17(Mid_15)(Mid_15);
1564− function middleAt(a1) {
1565− return function(a2) {
1566− return["PositionAt", a1, a2]
1567− }
1568− }
1569− var topLeftAt_31 = PositionTL_18;
1570− var topRightAt_32 = PositionTR_19;
1571− var bottomLeftAt_33 = PositionBL_20;
1572− var bottomRightAt_34 = PositionBR_21;
1573− var absolute_35 = Absolute_12;
1574− var relative_36 = Relative_13;
1575− function newElement_38(e,w,h,o,c,l) { return Element_37(Guid.guid(),e,w,h,o,c,l); }
1576− function basicNewElement(e,w,h) { return Element_37(Guid.guid(),e,w,h,1,Nothing,Nothing); }
1577− var line_76 = Line_75;
1578− var polygon_79 = Shape_78;
1579− function sprite_96(src) {
1580− return function(w) {
1581− return function(h) {
1582− return function(pos) {
1583− return Form_84(0)(1)(pos)(FImage_87(w)(h)(src))
1584− }
1585− }
1586− }
1587− }
1588− function toForm_97(pos) {
1589− return function(e) {
1590− return Form_84(0)(1)(pos)(FElement_88(e))
1591− }
1592− }
1593− function width_47(w__101) {
1594− return function(e) {
1595− var be = e[2];
1596− switch(be[0]) {
1597− case "EImage":
1598− case "EVideo":
1599− return newElement_38(e[2],w__101,e[4] * w__101 / e[3], e[5], e[6], e[7]);
1600− case "EText":
1601− var p = Value.getTextSize(w__101,e[4],be[2]);
1602− return newElement_38(e[2], w__101, p[1], e[5], e[6], e[7]);
1603− }
1604− return newElement_38(e[2], w__101, e[4], e[5], e[6], e[7]);
1605− }
1606− }
1607− function height_48(h__108) {
1608− return function(e) {
1609− var be = e[2];
1610− switch(be[0]) {
1611− case "EImage":
1612− case "EVideo":
1613− return newElement_38(e[2], e[3] * h__108 / e[4], h__108, e[5], e[6], e[7]);
1614− }
1615− return newElement_38(e[2], e[3], h__108, e[5], e[6], e[7]);
1616− }
1617− }
1618− function size_49(w) {
1619− return function(h) {
1620− return function(e) {
1621− return newElement_38(e[2], w, h, e[5], e[6], e[7]);
1622− }
1623− }
1624− }
1625− function opacity_50(o) {
1626− return function(e) {
1627− return newElement_38(e[2], e[3], e[4], o, e[6], e[7]);
1628− }
1629− }
1630− function color_51(c) {
1631− return function(e) {
1632− return newElement_38(e[2], e[3], e[4], e[5], Just(c), e[7]);
1633− }
1634− }
1635− function link(lnk) {
1636− return function(e) {
1637− return newElement_38(e[2], e[3], e[4], e[5], e[6], Just(Foreign.JavaScript.castStringToJSString(lnk)));
1638− }
1639− }
1640− function widthOf_52(e) { return ~~e[3]; }
1641− function heightOf_53(e) { return ~~e[4]; }
1642− function sizeOf_54(e) { return["Tuple2", ~~e[3], ~~e[4]] }
1643− function text_56(txt) {
1644− var p = Value.getTextSize(0,0,txt);
1645− return basicNewElement(EText_39("left")(txt), p[0], p[1])
1646− }
1647− function plainText(str) {
1648− var txt = Value.toText(str);
1649− var p = Value.getTextSize(0,0,txt);
1650− return basicNewElement(EText_39("left")(txt),p[0],p[1])
1651− }
1652− function asText(v) {
1653− var txt = Value.show(v);
1654− var p = Value.getTextSize(0,0,txt);
1655− return basicNewElement(EText_39("left")(txt),p[0],p[1])
1656− }
1657− function centeredText(txt) {
1658− var p = Value.getTextSize(0,0,txt);
1659− return basicNewElement(EText_39("center")(txt),p[0],p[1])
1660− }
1661− function justifiedText(txt) {
1662− var p = Value.getTextSize(0,0,txt);
1663− return basicNewElement(EText_39("justify")(txt),p[0],p[1])
1664− }
1665− function rightedText(txt) {
1666− var p = Value.getTextSize(0,0,txt);
1667− return basicNewElement(EText_39("right")(txt),p[0],p[1])
1668− }
1669− function image_57(w) {
1670− return function(h) {
1671− return function(src) {
1672− return basicNewElement(EImage_40(src),w,h)
1673− }
1674− }
1675− }
1676− function images(srcs) {
1677− var pics = Elm.Input(spacer_66(0)(0));
1678− var update = Elm.Lift(function(src) {
1679− src = Foreign.JavaScript.castStringToJSString(src);
1680− var img = new Image();
1681− img.onload = function() {
1682− console.log('loaded');
1683− Dispatcher.notify(pics.id,
1684− image_57(this.width)(this.height)(src));
1685− };
1686− img.src = src;
1687− }, [srcs]);
1688− var combine = Elm.Lift(function(x) { return function(y) { return x; } },
1689− [pics,update]);
1690− return combine;
1691− }
1692− function video_58(w) {
1693− return function(h) {
1694− return function(src) {
1695− return basicNewElement(EVideo_41(src),w,h)
1696− }
1697− }
1698− }
1699− function fittedImage_59(w_147) {
1700− return function(h_148) {
1701− return function(s_149) {
1702− return basicNewElement(EFittedImage_42(s_149),w_147,h_148)
1703− }
1704− }
1705− }
1706− function flow_60(dir_150) {
1707− return function(es_151) {
1708− return function() {
1709− var w_152 = function() {
1710− var ws_154 = map(widthOf_52)(es_151);
1711− return function(case1) {
1712− var case0 = case1;
1713− switch(case0[0]) {
1714− case "DLeft":
1715− return sum(ws_154);
1716− case "DRight":
1717− return sum(ws_154)
1718− }
1719− return maximum(ws_154)
1720− }(dir_150)
1721− }();
1722− var h_153 = function() {
1723− var hs_155 = map(heightOf_53)(es_151);
1724− return function(case3) {
1725− var case2 = case3;
1726− switch(case2[0]) {
1727− case "DDown":
1728− return sum(hs_155);
1729− case "DUp":
1730− return sum(hs_155)
1731− }
1732− return maximum(hs_155)
1733− }(dir_150)
1734− }();
1735− return basicNewElement(EFlow_43(dir_150)(es_151), w_152, h_153)
1736− }()
1737− }
1738− }
1739− function above_61(e1_156) {
1740− return function(e2_157) {
1741− return basicNewElement(EFlow_43(DDown_3)(["Cons", e1_156, ["Cons", e2_157, ["Nil"]]]), max(widthOf_52(e1_156))(widthOf_52(e2_157)), heightOf_53(e1_156) + heightOf_53(e2_157))
1742− }
1743− }
1744− function below_62(e1_158) {
1745− return function(e2_159) {
1746− return basicNewElement(EFlow_43(DDown_3)(["Cons", e2_159, ["Cons", e1_158, ["Nil"]]]), max(widthOf_52(e1_158))(widthOf_52(e2_159)), heightOf_53(e1_158) + heightOf_53(e2_159))
1747− }
1748− }
1749− function beside_63(e1_160) {
1750− return function(e2_161) {
1751− return basicNewElement(EFlow_43(DRight_1)(["Cons", e1_160, ["Cons", e2_161, ["Nil"]]]), widthOf_52(e1_160) + widthOf_52(e2_161), max(heightOf_53(e1_160))(heightOf_53(e2_161)))
1752− }
1753− }
1754− function layers_64(es_162) {
1755− return basicNewElement(EFlow_43(DOut_5)(es_162), maximum(map(widthOf_52)(es_162)), maximum(map(heightOf_53)(es_162)))
1756− }
1757− function collage_65(w_163) {
1758− return function(h_164) {
1759− return function(forms_165) {
1760− return basicNewElement(ECollage_44(w_163)(h_164)(forms_165),w_163,h_164)
1761− }
1762− }
1763− }
1764− function spacer_66(w_166) {
1765− return function(h_167) {
1766− return basicNewElement(EEmpty_45,w_166,h_167)
1767− }
1768− }
1769− function container_67(w_169) {
1770− return function(h_170) {
1771− return function(pos_168) {
1772− return function(e_171) {
1773− return basicNewElement(EContainer_46(pos_168)(e_171),w_169,h_170)
1774− }
1775− }
1776− }
1777− }
1778− function segment_77(p1_172) {
1779− return function(p2_173) {
1780− return Line_75(["Cons", p1_172, ["Cons", p2_173, ["Nil"]]])
1781− }
1782− }
1783− function rect_80(w_174) {
1784− return function(h_175) {
1785− return function(pos_176) {
1786− return Shape_78(["Cons", ["Tuple2", 0 - w_174 / 2, 0 - h_175 / 2],
1787− ["Cons", ["Tuple2", 0 - w_174 / 2, h_175 / 2],
1788− ["Cons", ["Tuple2", w_174 / 2, h_175 / 2],
1789− ["Cons", ["Tuple2", w_174 / 2, 0 - h_175 / 2], ["Nil"]]]]])(pos_176)
1790− }
1791− }
1792− }
1793− function oval_81(w_177) {
1794− return function(h_178) {
1795− return function(pos_179) {
1796− return function() {
1797− var n_180 = 50;
1798− return function() {
1799− function f_181(i_182) {
1800− return["Tuple2", w_177 / 2 * cos(2 * (pi / n_180) * i_182), h_178 / 2 * sin(2 * (pi / n_180) * i_182)]
1801− }
1802− return Shape_78(map(f_181)(function() {
1803− var lo = 0;
1804− var hi = n_180 - 1;
1805− var lst = ["Nil"];
1806− if(lo <= hi) {
1807− do {
1808− var lst = ["Cons", hi, lst]
1809− }while(hi-- > lo)
1810− }
1811− return lst
1812− }()))(pos_179)
1813− }()
1814− }()
1815− }
1816− }
1817− }
1818− function circle_82(r_183) {
1819− return oval_81(2 * r_183)(2 * r_183)
1820− }
1821− function ngon_83(n_184) {
1822− return function(r_185) {
1823− return function(pos_186) {
1824− return function() {
1825− var m_187 = toFloat(n_184);
1826− return function() {
1827− function f_188(i_189) {
1828− return["Tuple2", r_185 * cos(2 * (pi / m_187) * i_189), r_185 * sin(2 * (pi / m_187) * i_189)]
1829− }
1830− return Shape_78(map(f_188)(function() {
1831− var lo = 0;
1832− var hi = n_184 - 1;
1833− var lst = ["Nil"];
1834− if(lo <= hi) {
1835− do {
1836− var lst = ["Cons", hi, lst]
1837− }while(hi-- > lo)
1838− }
1839− return lst
1840− }()))(pos_186)
1841− }()
1842− }()
1843− }
1844− }
1845− }
1846− function solid_89(clr_190) {
1847− return function(ln_191) {
1848− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Solid_68)(clr_190)(ln_191))
1849− }
1850− }
1851− function dotted_90(clr_192) {
1852− return function(ln_193) {
1853− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dotted_69)(clr_192)(ln_193))
1854− }
1855− }
1856− function dashed_91(clr_194) {
1857− return function(ln_195) {
1858− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dashed_70)(clr_194)(ln_195))
1859− }
1860− }
1861− function customLine_92(pattern_196) {
1862− return function(clr_197) {
1863− return function(ln_198) {
1864− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Custom_71(pattern_196))(clr_197)(ln_198))
1865− }
1866− }
1867− }
1868− function filled_93(clr) {
1869− return function(shape) {
1870− return Form_84(0)(1)(shape[2])(FShape_86(Filled_72)(clr)(shape));
1871− }
1872− }
1873− function outlined_94(clr) {
1874− return function(shape) {
1875− return Form_84(0)(1)(shape[2])(FShape_86(Outlined_73)(clr)(shape));
1876− }
1877− }
1878− function customOutline_95(pattern) {
1879− return function(clr) {
1880− return function(shape) {
1881− return Form_84(0)(1)(shape[2])(FShape_86(CustomOutline_74(pattern))(clr)(shape));
1882− }
1883− }
1884− }
1885− function textured(src) {
1886− return function(shape) {
1887− return Form_84(0)(1)(shape[2])(FShape_86(["Textured",src])(null)(shape));
1888− }
1889− }
1890− function rotate_98(t_212) {
1891− return function(Form$thetascaleposform_213) {
1892− return function(case5) {
1893− var case0 = case5;
1894− switch(case0[0]) {
1895− case "Form":
1896− var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1897− return Form_84(t_212 + case1)(case2)(case3)(case4)
1898− }
1899− throw"Non-exhaustive pattern match in case";
1900− }(Form$thetascaleposform_213)
1901− }
1902− }
1903− function scale_99(s) {
1904− return function(form) {
1905− return Form_84(form[1])(s * form[2])(form[3])(form[4])
1906− }
1907− }
1908− function move_100(x_224) {
1909− return function(y_225) {
1910− return function(Form$thetascaleTuple2$pxpyform_226) {
1911− return function(case7) {
1912− var case0 = case7;
1913− switch(case0[0]) {
1914− case "Form":
1915− var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1916− switch(case3[0]) {
1917− case "Tuple2":
1918− var case5 = case3[1], case6 = case3[2];
1919− return Form_84(case1)(case2)(["Tuple2", x_224 + case5, y_225 + case6])(case4)
1920− }
1921− break
1922− }
1923− throw"Non-exhaustive pattern match in case";
1924− }(Form$thetascaleTuple2$pxpyform_226)
1925− }
1926− }
1927− }
1928− return{left:left_6, right:right_7, down:down_8, up:up_9, inward:inward_10, outward:outward_11, topLeft:topLeft_22, topRight:topRight_23, bottomLeft:bottomLeft_24, bottomRight:bottomRight_25, midLeft:midLeft_26, midRight:midRight_27, midTop:midTop_28, midBottom:midBottom_29, middle:middle_30, middleAt:middleAt, topLeftAt:topLeftAt_31, topRightAt:topRightAt_32, bottomLeftAt:bottomLeftAt_33, bottomRightAt:bottomRightAt_34, absolute:absolute_35, relative:relative_36, width:width_47, height:height_48, size:size_49, opacity:opacity_50,
1929− color:color_51, link:link, widthOf:widthOf_52, heightOf:heightOf_53, sizeOf:sizeOf_54, text:text_56, asText:asText, plainText:plainText, centeredText:centeredText, justifiedText:justifiedText, rightedText:rightedText, image:image_57, images:images, video:video_58, fittedImage:fittedImage_59, flow:flow_60, above:above_61, below:below_62, beside:beside_63, layers:layers_64, collage:collage_65, spacer:spacer_66, container:container_67, line:line_76, segment:segment_77, polygon:polygon_79, rect:rect_80, oval:oval_81, circle:circle_82, ngon:ngon_83, solid:solid_89, dotted:dotted_90, dashed:dashed_91, customLine:customLine_92, filled:filled_93,
1930− outlined:outlined_94, customOutline:customOutline_95, textured:textured, sprite:sprite_96, toForm:toForm_97, rotate:rotate_98, scale:scale_99, move:move_100,
1931− isWithin: Collage.insideForm}
1932−}();
1933−var Text = function() {
1934− function fromString(s) { return Value.toText(s); }
1935−
1936− var addTag = function(tag) { return function(text) {
1937− return '<' + tag + ' style="padding:0;margin:0">' + text + '</' + tag + '>';
1938− };
1939− };
1940− var addStyle = function(style, value) { return function(text) {
1941− return "<span style='" + style + ":" + value + "'>" + text + "</span>";
1942− };
1943− };
1944−
1945− var typeface = function(name) {
1946− name = Foreign.JavaScript.castStringToJSString(name);
1947− return addStyle('font-family', name);
1948− };
1949− var size = function(px) {
1950− return addStyle('font-size', px + 'px');
1951− };
1952− var header = addTag('h1');
1953− var height = function(h) { return addStyle('font-size', h+'em'); }
1954− var italic = addStyle('font-style', 'italic');
1955− var bold = addTag('b');
1956− var color = function(c) {
1957− return addStyle('color', ElmCode.Graphics.Color.extract(c));
1958− };
1959− var underline = addStyle('text-decoration', 'underline');
1960− var overline = addStyle('text-decoration', 'overline');
1961− var strikeThrough = addStyle('text-decoration', 'line-through');
1962− var link = function(href) { return function(text) {
1963− return "<a href='" + fromString(href) + "'>" + text + "</a>";
1964− };
1965− };
1966−
1967− return {fromString : fromString,
1968− toText: fromString,
1969− header : header,
1970− height : height,
1971− italic : italic,
1972− bold : bold,
1973− underline : underline,
1974− overline : overline,
1975− strikeThrough : strikeThrough,
1976− monospace : typeface('monospace'),
1977− typeface : typeface,
1978− color : color,
1979− link : link };
1980−}();
1981−var Render = function(){
1982−
1983−function newElement(elementType) {
1984− var e = document.createElement(elementType);
1985− e.style.padding = "0";
1986− e.style.margin = "0";
1987− return e;
1988−};
1989−
1990−function addTo(container, elem) {
1991− container.appendChild(elem);
1992−};
1993−
1994−function makeText(pos,txt) {
1995− var e = newElement('div');
1996− e.innerHTML = txt;
1997− e.style.textAlign = pos;
1998− return e;
1999−};
2000−
2001−function image(src) {
2002− var img = newElement('img');
2003− img.src = src;
2004− img.name = src;
2005− img.style.display = "block";
2006− return img;
2007−}
2008−
2009−function fittedImage(w,h,src) {
2010− var canvas = newElement('canvas');
2011− canvas.style.display = "block";
2012− canvas.style.width = w + 'px';
2013− canvas.style.height = h + 'px';
2014− canvas.width = w;
2015− canvas.height = h;
2016− canvas.innerHTML = "Your browser does not support the canvas element.";
2017−
2018− var img = newElement('img');
2019− img.onload = function() {
2020− if (canvas.getContext) {
2021− var ctx = canvas.getContext('2d');
2022− var sx = 0, sy = 0, sWidth = this.width, sHeight = this.height;
2023− if (w / h > this.width / this.height) {
2024− sHeight = this.width * h / w;
2025− sy = (this.height - sHeight) / 2;
2026− } else {
2027− sWidth = this.height * w / h;
2028− sx = (this.width - sWidth) / 2;
2029− }
2030− ctx.drawImage(img, sx, sy, sWidth, sHeight,
2031− 0,0, canvas.width, canvas.height);
2032− }
2033− };
2034− img.src = src;
2035− return canvas;
2036−};
2037−
2038−var video = function(src) {
2039− var e = newElement('video');
2040− e.controls = "controls";
2041− var source = newElement('source');
2042− source.src = src;
2043− var segs = src.split('.');
2044− source.type = "video/" + segs[segs.length-1];
2045− addTo(e, source);
2046− e.style.display = "block";
2047− return e;
2048−};
2049−
2050−function divify(e) {
2051− var div = newElement('div');
2052− addTo(div, e);
2053− return div;
2054−};
2055−function goDown(e) {
2056− return e //.tagName === "DIV" ? e : divify(e);
2057−};
2058−function goRight(e) {
2059− e.style.styleFloat = "left";
2060− e.style.cssFloat = "left";
2061− return e;
2062−};
2063−function goIn(e) {
2064− e.style.position = 'absolute';
2065− return e;
2066−};
2067−function flowWith(f, prep, elist) {
2068− var container = newElement('div');
2069− for (var i = elist.length; i--; ) {
2070− addTo(container, f(prep(elist[i])));
2071− }
2072− return container;
2073−};
2074−
2075−function flow(dir,elist) {
2076− switch(dir) {
2077− case "DDown": elist = elist.slice(0).reverse();
2078− case "DUp": return flowWith(goDown,render,elist);
2079− case "DRight": elist = elist.slice(0).reverse();
2080− case "DLeft": return flowWith(goRight,render,elist);
2081− case "DOut": elist = elist.slice(0).reverse();
2082− case "DIn": return flowWith(goIn,render,elist);
2083− };
2084−};
2085−
2086−function toPos(pos) {
2087− switch(pos[0]) {
2088− case "Absolute": return pos[1] + "px";
2089− case "Relative": return (pos[1] * 100) + "%";
2090− }
2091−}
2092−
2093−function setPos(pos,e) {
2094− e.style.position = 'absolute';
2095− e.style.margin = 'auto';
2096− switch(pos[0]) {
2097− case "Position":
2098− if (pos[1][0] !== "Far") e.style.left = 0;
2099− if (pos[1][0] !== "Near") e.style.right = 0;
2100− if (pos[2][0] !== "Far") e.style.top = 0;
2101− if (pos[2][0] !== "Near") e.style.bottom = 0;
2102− break;
2103− case "PositionAt":
2104− e.style.top = toPos(pos[2]);
2105− e.style.left = toPos(pos[1]);
2106− var shift = "translate(" + (-elem[3]/2) + "px," + (-elem[4]/2) + "px)";
2107− e.style.transform = shift;
2108− e.style.msTransform = shift;
2109− e.style.MozTransform = shift;
2110− e.style.webkitTransform = shift;
2111− e.style.OTransform = shift;
2112− break;
2113− default:
2114− var p = pos[0].slice(-2);
2115− e.style[p[0] === "T" ? 'top' : 'bottom'] = toPos(pos[2]);
2116− e.style[p[1] === "L" ? 'left' : 'right'] = toPos(pos[1]);
2117− }
2118−}
2119−
2120−function container(pos,elem) {
2121− var e = render(elem);
2122− setPos(pos,e);
2123− var div = newElement('div');
2124− div.style.position = "relative";
2125− div.style.overflow = "hidden";
2126− addTo(div,e);
2127− return div;
2128−};
2129−
2130−function render(elem) {
2131− var e = {};
2132− switch(elem[2][0]) {
2133− case "EText": e = makeText(elem[2][1],elem[2][2]); break;
2134− case "EImage": e = image(elem[2][1]); break;
2135− case "EVideo": e = video(elem[2][1]); break;
2136− case "EFittedImage": e = fittedImage(elem[3],elem[4],elem[2][1]); break;
2137− case "EFlow": e = flow(elem[2][1][0],elem[2][2]); break;
2138− case "ECollage": e = Collage.collage(elem[2][1],elem[2][2],elem[2][3]); break;
2139− case "EEmpty": e = newElement('div'); break;
2140− case "EContainer": e = container(elem[2][1],elem[2][2]); break;
2141− case "EHtml":
2142− e = elem[2][1];
2143− if (e.type !== 'button') {
2144− var p = Value.getExcess(e);
2145− elem[3] -= p[0];
2146− elem[4] -= p[1];
2147− }
2148− break;
2149− case "EExternalHtml":
2150− e = newElement('div');
2151− addTo(e, elem[2][1]);
2152− break;
2153− }
2154− e.id = elem[1];
2155− e.style.width = (~~elem[3]) + 'px';
2156− e.style.height = (~~elem[4]) + 'px';
2157− if (elem[5] !== 1) { e.style.opacity = elem[5]; }
2158− if (elem[6][0] === "Just") {
2159− e.style.backgroundColor = ElmCode.Graphics.Color.extract(elem[6][1]);
2160− }
2161− if (elem[7][0] === "Just") {
2162− var a = newElement('a');
2163− a.href = elem[7][1];
2164− addTo(a,e);
2165− return a;
2166− }
2167− return e;
2168−};
2169−
2170−function update(node,curr,next) {
2171− if (node.tagName === 'A') { node = node.firstChild; }
2172− if (curr[1] === next[1]) return;
2173− if (curr[2][0] !== next[2][0]) {
2174− return node.parentNode.replaceChild(render(next),node);
2175− }
2176− var nextE = next[2], currE = curr[2];
2177− switch(nextE[0]) {
2178− case "EText":
2179− if (nextE[1] !== currE[1]) node.style.textAlign = nextE[1];
2180− if (nextE[2] !== currE[2]) node.innerHTML = nextE[2];
2181− break;
2182− case "EImage":
2183− if (nextE[1] !== currE[1]) node.src = nextE[1];
2184− break;
2185− case "EVideo":
2186− case "EFittedImage":
2187− if (!Value.eq(nextE,currE) || next[3]!==curr[3] || next[4]!==curr[4]) {
2188− return node.parentNode.replaceChild(render(next),node);
2189− }
2190− break;
2191− case "ECollage":
2192− if (nextE[1] !== currE[1] || nextE[2] !== currE[2] || nextE[3].length !== currE[3].length) {
2193− return node.parentNode.replaceChild(render(next),node);
2194− }
2195− Collage.updateCollage(node,currE[3],nextE[3]);
2196− break;
2197− case "EFlow":
2198− if (nextE[1] !== currE[1]) {
2199− return node.parentNode.replaceChild(render(next),node);
2200− }
2201− var nexts = nextE[2];
2202− var kids = node.childNodes;
2203− if (nexts.length !== kids.length) {
2204− return node.parentNode.replaceChild(render(next),node);
2205− }
2206− var currs = currE[2];
2207− var goDir = {};
2208− switch(nextE[1][0]) {
2209− case "DDown": case "DUp": goDir = goDown; break;
2210− case "DRight": case "DLeft": goDir = goRight; break;
2211− case "DOut": case "DIn": goDir = goIn; break;
2212− }
2213− for (var i = kids.length; i-- ;) {
2214− update(kids[i],currs[i],nexts[i]);
2215− goDir(kids[i]);
2216− }
2217− break;
2218− case "EContainer":
2219− update(node.childNodes[0],currE[2],nextE[2]);
2220− setPos(nextE[1],node.childNodes[0]);
2221− break;
2222− case "EEmpty":
2223− break;
2224− case "EHtml":
2225− if (next[1] !== curr[1]) {
2226− var e = render(next);
2227− node.parentNode.replaceChild(e,node);
2228− node = e;
2229− }
2230− if (e.type !== 'button') {
2231− var p = Value.getExcess(node);
2232− next[3] -= p[0];
2233− next[4] -= p[1];
2234− }
2235− break;
2236− case "EExternalHtml":
2237− if (next[1] !== curr[1])
2238− node.parentNode.replaceChild(render(next),node);
2239− break;
2240− }
2241− if (next[3] !== curr[3]) node.style.width = (~~next[3]) + 'px';
2242− if (next[4] !== curr[4]) node.style.height = (~~next[4]) + 'px';
2243− if (next[5] !== curr[5]) node.style.opacity = next[5];
2244− if (next[6].length === 2) {
2245− var clr = ElmCode.Graphics.Color.extract(next[6][1]);
2246− if (clr !== node.style.backgroundColor) node.style.backgroundColor = clr;
2247− }
2248− if (next[7].length === 2) {
2249− if (curr[7].length === 1 || next[7][1] !== curr[7][1]) node.parentNode.href = next[7][1];
2250− }
2251− next[1] = curr[1];
2252−}
2253−
2254−return {render:render,update:update,addTo:addTo,newElement:newElement,flowWith:flowWith,goIn:goIn};
2255−
2256−}();
2257−var Elm = function() {
2258− var send = function(node, timestep, changed) {
2259− var kids = node.kids;
2260− for (var i = kids.length; i--; ) {
2261− kids[i].recv(timestep, changed, node.id);
2262− }
2263− };
2264− var input = function(base) {
2265− this.id = Guid.guid();
2266− this.value = base;
2267− this.kids = [];
2268− this.defaultNumberOfKids = 0;
2269− this.recv = function(timestep, eid, v) {
2270− var changed = eid === this.id;
2271− if (changed) { this.value = v; }
2272− send(this, timestep, changed);
2273− return changed;
2274− };
2275− Dispatcher.inputs.push(this);
2276− };
2277− var lift = function(func,args) {
2278− this.id = Guid.guid();
2279− this.value = null;
2280− this.kids = [];
2281− this.count = 0;
2282− this.changed = false;
2283−
2284− args.reverse();
2285− this.recalc = function() {
2286− var f = func;
2287− for (var i = args.length; i--; ) {
2288− f = f(args[i].value);
2289− }
2290− this.value = f;
2291− };
2292− this.recalc();
2293−
2294− this.recv = function(timestep, changed, parentID) {
2295− this.count += 1;
2296− if (changed) { this.changed = true; }
2297− if (this.count == args.length) {
2298− if (this.changed) { this.recalc() }
2299− send(this, timestep, this.changed);
2300− this.changed = false;
2301− this.count = 0;
2302− }
2303− };
2304− for (var i = args.length; i--; ) {
2305− args[i].kids.push(this);
2306− }
2307− };
2308− var fold = function(func,base,baseIsFunc,input) {
2309− this.id = Guid.guid();
2310− this.value = baseIsFunc ? base(input.value) : base;
2311− this.kids = [];
2312− this.recv = function(timestep, changed, parentID) {
2313− if (changed) { this.value = func(input.value)(this.value); }
2314− send(this, timestep, changed);
2315− };
2316− input.kids.push(this);
2317− };
2318−
2319− var dropIf = function(pred,base,input) {
2320− this.id = Guid.guid();
2321− this.value = pred(input.value) ? base : input.value;
2322− this.kids = [];
2323− this.recv = function(timestep, changed, parentID) {
2324− var chng = changed && !pred(input.value);
2325− if (chng) { this.value = input.value; }
2326− send(this, timestep, chng);
2327− };
2328− input.kids.push(this);
2329− };
2330− var dropRepeats = function(input) {
2331− this.id = Guid.guid();
2332− this.value = input.value;
2333− this.kids = [];
2334− this.recv = function(timestep, changed, parentID) {
2335− var chng = changed && !eq(this.value,input.value);
2336− if (chng) { this.value = input.value; }
2337− send(this, timestep, chng);
2338− };
2339− input.kids.push(this);
2340− };
2341−
2342− var dropWhen = function(s1) { return function(b) { return function(s2) {
2343− var pairs = new lift(function(x){return function(y){return [x,y];};},[s1,s2]);
2344− var dropped = new dropIf(function(p){return p[0];},[true,b],pairs);
2345− return new lift(function(p){return p[1];},[dropped]); }; };
2346− };
2347−
2348− var sampleOn = function(s1,s2) {
2349− this.id = Guid.guid();
2350− this.value = s2.value;
2351− this.kids = [];
2352− this.count = 0;
2353− this.changed = false;
2354−
2355− this.recv = function(timestep, changed, parentID) {
2356− if (parentID === s1.id) this.changed = changed;
2357− this.count += 1;
2358− if (this.count == 2) {
2359− if (this.changed) { this.value = s2.value; }
2360− send(this, timestep, this.changed);
2361− this.count = 0;
2362− this.changed = false;
2363− }
2364− };
2365− s1.kids.push(this);
2366− s2.kids.push(this);
2367− };
2368−
2369− return {Input: function(x) {return new input(x);},
2370− Lift: function(f,xs){return new lift(f,xs);},
2371− Fold: function(f,b,x){return new fold(f,b,false,x);},
2372− Fold1: function(f,b,x){return new fold(f,b,true,x);},
2373− keepIf : function(pred) { return function(base) { return function(sig) {
2374− return new dropIf(function(x) { return !pred(x)},base,sig); }; }; },
2375− dropIf : function(pred) { return function(base) { return function(sig) {
2376− return new dropIf(pred,base,sig); }; }; },
2377− keepWhen : function(s) { return dropWhen(new lift(function(b){return !b;},[s])); },
2378− dropWhen : dropWhen,
2379− dropRepeats : function(s) { return new dropRepeats(s);},
2380− sampleOn : function(s1) { return function(s2) { return new sampleOn(s1,s2); }; }
2381− };
2382−}();
2383−
2384−var Dispatcher = function() {
2385− var program = null;
2386− var timestep = 0;
2387− var inputs = [];
2388− var currentElement = null;
2389−
2390− var initialize = function() {
2391− program = ElmCode.main();
2392− if (!program.hasOwnProperty('recv')) {
2393− program = Elm.Input(program);
2394− }
2395−
2396− currentElement = program.value;
2397− filterDeadInputs();
2398−
2399− var content = document.getElementById('content');
2400− content.appendChild(Render.render(currentElement));
2401− var w = document.getElementById('widthChecker').offsetWidth;
2402− if (w !== window.innerWidth) {
2403− Dispatcher.notify(Window.dimensions.id, Value.Tuple(w, window.innerHeight));
2404− }
2405− program = Elm.Lift(function(value) {
2406− var content = document.getElementById('content');
2407− Render.update(content.firstChild,currentElement,value);
2408− currentElement = value;
2409− return value;
2410− }, [program]);
2411− };
2412− var notify = function(id, v) {
2413− timestep += 1;
2414− //console.log(timestep);
2415− var hasListener = false;
2416− for (var i = inputs.length; i--; ) {
2417− hasListener = inputs[i].recv(timestep, id, v) || hasListener;
2418− }
2419− return hasListener;
2420− };
2421−
2422− function isAlive(input) {
2423− if (!input.hasOwnProperty('defaultNumberOfKids')) return true;
2424− var len = input.kids.length;
2425− if (len == 0) return false;
2426− if (len > input.defaultNumberOfKids) return true;
2427− var alive = false;
2428− for (var i = len; i--; ) {
2429− alive = alive || isAlive(input.kids[i]);
2430− }
2431− return alive;
2432− }
2433− function filterDeadInputs() {
2434− var temp = [];
2435− for (var i = inputs.length; i--; ) {
2436− if (isAlive(inputs[i])) temp.push(inputs[i]);
2437− }
2438− inputs = temp;
2439− }
2440−
2441− return {initialize:initialize, notify:notify, inputs:inputs};
2442−}();
2443−var Signal = function() {
2444− function wrap(elem) {
2445− var p = Value.getSize(elem);
2446− return ["Element", Guid.guid(), ["EHtml",elem], p[0], p[1], 1, Nothing, Nothing];
2447− }
2448− function toElmString(str) {
2449− var out = ["Nil"];
2450− for (var i = str.length; i--; ) {
2451− out = ["Cons", str[i], out];
2452− }
2453− return out;
2454− }
2455− var addListener = function() {
2456− if(document.addEventListener) {
2457− return function(element, event, handler) {
2458− element.addEventListener(event, handler, false);
2459− };
2460− }
2461− else {
2462− return function(element, event, handler) {
2463− element.attachEvent('on' + event, handler);
2464− };
2465− }
2466− }();
2467−
2468− var Mouse = function() {
2469− var position = Elm.Input(Value.Tuple(0,0));
2470− position.defaultNumberOfKids = 2;
2471−
2472− var x = Elm.Lift(function(p){return p[1];},[position]);
2473− x.defaultNumberOfKids = 0;
2474− var y = Elm.Lift(function(p){return p[2];},[position]);
2475− y.defaultNumberOfKids = 0;
2476−
2477− var isDown = Elm.Input(false);
2478− var isClicked = Elm.Input(false);
2479− var clicks = Elm.Input(Value.Tuple());
2480−
2481− function getXY(e) {
2482− var posx = 0;
2483− var posy = 0;
2484− if (!e) var e = window.event;
2485− if (e.pageX || e.pageY) {
2486− posx = e.pageX;
2487− posy = e.pageY;
2488− } else if (e.clientX || e.clientY) {
2489− posx = e.clientX + document.body.scrollLeft +
2490− document.documentElement.scrollLeft;
2491− posy = e.clientY + document.body.scrollTop +
2492− document.documentElement.scrollTop;
2493− }
2494− return Value.Tuple(posx, posy);
2495− }
2496−
2497− addListener(document, 'click', function(e) {
2498− var hasListener1 = Dispatcher.notify(isClicked.id, true);
2499− var hasListener2 = Dispatcher.notify(clicks.id, Value.Tuple());
2500− Dispatcher.notify(isClicked.id, false);
2501− if (!hasListener1 && !hasListener2)
2502− this.removeEventListener('click',arguments.callee,false);
2503− });
2504− addListener(document, 'mousedown', function(e) {
2505− var hasListener = Dispatcher.notify(isDown.id, true);
2506− if (!hasListener)
2507− this.removeEventListener('mousedown',arguments.callee,false);
2508− });
2509− addListener(document, 'mouseup', function(e) {
2510− var hasListener = Dispatcher.notify(isDown.id, false);
2511− if (!hasListener)
2512− this.removeEventListener('mouseup',arguments.callee,false);
2513− });
2514− addListener(document, 'mousemove', function(e) {
2515− var hasListener = Dispatcher.notify(position.id, getXY(e));
2516− if (!hasListener)
2517− this.removeEventListener('mousemove',arguments.callee,false);
2518− });
2519− var clickedOn = function(elem) {
2520− var node = Render.render(elem);
2521− var click = Elm.Input(false);
2522− addListener(node, 'click', function(e) {
2523− Dispatcher.notify(click.id, true);
2524− Dispatcher.notify(click.id, false);
2525− });
2526− return Value.Tuple(wrap(node), click);
2527− };
2528− return {position: position,
2529− x:x,
2530− y:y,
2531− isClicked: isClicked,
2532− isDown: isDown,
2533− clicks: clicks,
2534− isClickedOn: clickedOn
2535− };
2536− }();
2537−
2538− var Time = function() {
2539− var every = function(t) {
2540− t *= 1000;
2541− var clock = Elm.Input(0);
2542− var time = 0;
2543− setInterval(function() {
2544− time += t;
2545− Dispatcher.notify(clock.id, time/1000);
2546− }, t);
2547− return clock;
2548− };
2549− var after = function(t) {
2550− t *= 1000;
2551− var thread = Elm.Input(false);
2552− setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
2553− return thread;
2554− };
2555− var before = function(t) {
2556− t *= 1000;
2557− var thread = Elm.Input(true);
2558− setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
2559− return thread;
2560− };
2561− return {every:every,after:after,before:before};
2562− }();
2563−
2564− var Window = function() {
2565− var dimensions = Elm.Input(Value.Tuple(window.innerWidth,window.innerHeight));
2566− dimensions.defaultNumberOfKids = 2;
2567−
2568− var width = Elm.Lift(function(p){return p[1];},[dimensions]);
2569− width.defaultNumberOfKids = 0;
2570− var height = Elm.Lift(function(p){return p[2];},[dimensions]);
2571− height.defaultNumberOfKids = 0;
2572−
2573− addListener(window, 'resize', function(e) {
2574− var w = document.getElementById('widthChecker').offsetWidth;
2575− var hasListener = Dispatcher.notify(dimensions.id, Value.Tuple(w, window.innerHeight));
2576− if (!hasListener)
2577− this.removeEventListener('resize',arguments.callee,false);
2578− });
2579− return {dimensions:dimensions,width:width,height:height};
2580− }();
2581−
2582− var Keyboard = { Raw : function() {
2583− var keysDown = Elm.Input(["Nil"]);
2584− var charPressed = Elm.Input(["Nothing"]);
2585− function remove(x,xs) {
2586− if (xs[0] === "Nil") return xs;
2587− if (xs[1] === x) return xs[2];
2588− return ["Cons", xs[1], remove(x,xs[2])];
2589− }
2590− function has(x,xs) {
2591− while (xs[0] !== "Nil") {
2592− if (xs[1] === x) return true;
2593− xs = xs[2];
2594− }
2595− return false;
2596− }
2597− addListener(document, 'keydown', function(e) {
2598− if (has(e.keyCode, keysDown.value)) return;
2599− var hasListener = Dispatcher.notify(keysDown.id, ["Cons", e.keyCode, keysDown.value]);
2600− if (!hasListener)
2601− this.removeEventListener('keydown',arguments.callee,false);
2602− });
2603− addListener(document, 'keyup', function(e) {
2604− var codes = remove(e.keyCode, keysDown.value);
2605− var hasListener = Dispatcher.notify(keysDown.id, codes);
2606− if (!hasListener)
2607− this.removeEventListener('keyup',arguments.callee,false);
2608− });
2609− addListener(window, 'blur', function(e) {
2610− var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
2611− if (!hasListener)
2612− this.removeEventListener('blur',arguments.callee,false);
2613− });
2614− addListener(document, 'keypress', function(e) {
2615− var hasListener = Dispatcher.notify(charPressed.id, ["Just",e.charCode || e.keyCode]);
2616− Dispatcher.notify(charPressed.id, ["Nothing"]);
2617− if (!hasListener)
2618− this.removeEventListener('keypress',arguments.callee,false);
2619− });
2620− return {keysDown:keysDown,
2621− charPressed:charPressed};
2622− }()
2623− };
2624−
2625− var HTTP = function() {
2626− var fetch = function(how) { return function(url) {
2627− var thread = Elm.Input(["Waiting"]);
2628− var request = {};
2629− if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }
2630− else if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); }
2631− request.onreadystatechange = function(e) {
2632− if (request.readyState === 4) {
2633− Dispatcher.notify(thread.id,
2634− request.status === 200
2635− ? ["Success", toElmString(request.responseText)]
2636− : ["Failure", request.status, toElmString(request.statusText)]);
2637− }
2638− };
2639− request.open(how, Value.toText(url), true);
2640− request.send(null);
2641− return thread;
2642− };
2643− };
2644− var fetches = function(how) { return function(input) {
2645− var output = Elm.Input(["Nothing"]);
2646− var fetcher = Elm.Lift(update, [input]);
2647− var combine = Elm.Lift(function(x) { return function(y) { return x; } }, [output,fetcher]);
2648− function update(strOpt) {
2649− if (strOpt[0] !== "Just") {
2650− try { Dispatcher.notify(output.id, ["Nothing"]); } catch(e) {}
2651− return [];
2652− }
2653− try {
2654− Dispatcher.notify(output.id, ["Just", ["Waiting"]]);
2655− } catch(e) { output.value = ["Just", ["Waiting"]]; }
2656− var request = {};
2657− if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }
2658− else if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); }
2659− request.onreadystatechange = function(e) {
2660− if (request.readyState === 4) {
2661− Dispatcher.notify(output.id,
2662− ["Just", request.status === 200
2663− ? ["Success", toElmString(request.responseText)]
2664− : ["Failure", request.status, toElmString(request.statusText)]]);
2665− }
2666− };
2667− request.open(how, Value.toText(strOpt[1]), true);
2668− request.send(null);
2669− return [];
2670− }
2671− return combine;
2672− };
2673− };
2674− return {get : fetch("GET"), post : fetch("POST"),
2675− gets : fetches("GET"), posts : fetches("POST")
2676− };
2677− }();
2678− var Random = function() {
2679− var inRange = function(min) { return function(max) {
2680− return Elm.Input(Math.floor(Math.random() * (max-min+1)) + min);
2681− };
2682− };
2683− var randomize = function(min) { return function(max) { return function(signal) {
2684− return Elm.Lift(function(x) { return Math.floor(Math.random() * (max-min+1)) + min;},[signal]);
2685− };
2686− };
2687− };
2688− return { inRange:inRange, randomize:randomize };
2689− }();
2690− var Input = function() {
2691− var newTextInput = function(elem, ghostText) {
2692− elem.placeholder = Foreign.JavaScript.castStringToJSString(ghostText);
2693− var str = Elm.Input(["Nil"]);
2694− addListener(elem, 'keyup', function(e) {
2695− Dispatcher.notify(str.id, toElmString(elem.value));
2696− elem.focus();
2697− });
2698− elem.style.padding = "1px";
2699− return Value.Tuple(wrap(elem), str);
2700− };
2701− var newElement = function(name) {
2702− var e = document.createElement(name);
2703− e.style.padding = "0";
2704− e.style.margin = "0";
2705− return e;
2706− };
2707− var textArea = function(cols) { return function(rows) {
2708− var textarea = newElement('textarea');
2709− textarea.rows = rows;
2710− textarea.cols = cols;
2711− return newTextInput(textarea, "");
2712− };
2713− };
2714− var textField = function(ghostText) {
2715− var field = newElement('input');
2716− field.type = 'text';
2717− return newTextInput(field, ghostText);
2718− };
2719− var password = function(ghostText) {
2720− var field = newElement('input');
2721− field.type = 'password';
2722− return newTextInput(field, ghostText);
2723− };
2724− var checkbox = function(checked) {
2725− var box = newElement('input');
2726− box.type = 'checkbox';
2727− box.checked = checked;
2728− var status = Elm.Input(checked);
2729− addListener(box, 'change', function(e) {
2730− Dispatcher.notify(status.id, box.checked);
2731− });
2732− return Value.Tuple(wrap(box), status);
2733− };
2734− var dropDown = function(options) {
2735− var slct = newElement('select');
2736− var opts = [];
2737− while (options[0] === "Cons") {
2738− var opt = newElement('option');
2739− var str = Text.toText(options[1][1]);
2740− opt.value = str;
2741− opt.innerHTML = str;
2742− slct.appendChild(opt);
2743− opts.push(options[1][2]);
2744− options = options[2];
2745− }
2746− var status = Elm.Input(opts[0]);
2747− addListener(slct, 'change', function(e) {
2748− Dispatcher.notify(status.id, opts[slct.selectedIndex]);
2749− });
2750− return Value.Tuple(wrap(slct), status);
2751− };
2752− var stringDropDown = function(opts) {
2753− return dropDown(List.map (function(x) {return Value.Tuple(x,x);}) (opts));
2754− };
2755− var button = function(name) {
2756− var b = newElement('input');
2757− b.type = "button";
2758− b.value = Foreign.JavaScript.castStringToJSString(name);
2759− var press = Elm.Input(false);
2760− addListener(b, 'click', function(e) {
2761− Dispatcher.notify(press.id, true);
2762− Dispatcher.notify(press.id, false);
2763− });
2764− return Value.Tuple(wrap(b),press);
2765− };
2766− return {textArea:textArea, textField:textField,
2767− password:password, checkbox:checkbox,
2768− dropDown:dropDown, stringDropDown:stringDropDown,
2769− button:button};
2770− }();
2771−
2772− return {addListener:addListener,
2773− Mouse:Mouse,
2774− Keyboard:Keyboard,
2775− Time:Time,
2776− Window:Window,
2777− HTTP:HTTP,
2778− Random:Random,
2779− Input:Input,
2780− constant : function(v) { return Elm.Input(v); },
2781− lift : function(f){return function(e){return Elm.Lift(f,[e]);};},
2782− lift2 : function(f) { return function(e1) { return function(e2) {
2783− return Elm.Lift(f, [e1,e2]); }; }; },
2784− lift3 : function(f) { return function(e1) { return function(e2) {
2785− return function(e3){return Elm.Lift(f,[e1,e2,e3]);};};};},
2786− lift4 : function(f) { return function(e1) { return function(e2) {
2787− return function(e3) { return function(e4) {
2788− return Elm.Lift(f, [e1,e2,e3,e4]); }; }; }; }; },
2789− foldp : function(f) { return function(b) { return function(e) {
2790− return Elm.Fold(f,b,e); }; }; },
2791− foldp_ : function(f) { return function(b) { return function(e) {
2792− return Elm.Fold1(f,b,e); }; }; },
2793− foldp1 : function(f) { return function(e) {
2794− return Elm.Fold1(f,function(x){return x;},e); }; },
2795− count : function(sig){return Elm.Fold(function(_){return function(c){return c+1;};},0,sig)},
2796− keepIf : Elm.keepIf,
2797− dropIf : Elm.dropIf,
2798− keepWhen : Elm.keepWhen,
2799− dropWhen : Elm.dropWhen,
2800− dropRepeats : Elm.dropRepeats,
2801− sampleOn : Elm.sampleOn
2802− };
2803−}();
2804−var Prelude = function() {
2805− var mod = function(x) { return function(y) {
2806− var r = x % y;
2807− var m = x==0 ? 0 : (y>0 ? (x>=0 ? r : r+y) : -mod(-x)(-y));
2808− return m == y ? 0 : m;
2809− }; };
2810−
2811− var min = function(x) { return function(y) { return Math.min(x,y); }; };
2812− var max = function(x) { return function(y) { return Math.max(x,y); }; };
2813−
2814− var flip=function(f){return function(x){return function(y){return f(y)(x);};};};
2815− var clamp = function(lo) { return function(hi) {
2816− return function(x) { return Math.min(hi, Math.max(lo, x)); };
2817− };
2818− };
2819− var curry = function(f) { return function(x) { return function(y) {
2820− return f(["Tuple2",x,y]); }; };
2821− };
2822− var uncurry = function(f) { return function(p) {
2823− if (p[0] !== "Tuple2") {
2824− throw "Function was uncurry'd but was not given a pair.";
2825− }
2826− return f(p[1])(p[2]); };
2827− };
2828−
2829− var logBase=function(b){return function(x){return Math.log(x)/Math.log(b);};};
2830−
2831− return {id : function(x) { return x; },
2832− not : function(b) { return !b; },
2833− fst : function(p) { return p[1]; },
2834− snd : function(p) { return p[2]; },
2835− rem : function(x) { return function(y) { return x % y; }; },
2836− div : function(x) { return function(y) { return ~~(x / y); }; },
2837− compare : function(x) { return function (y) {
2838− x = (typeof x === "object") ? toText(x) : x;
2839− y = (typeof y === "object") ? toText(y) : y;
2840− return [ x === y ? 'EQ' : (x < y ? 'LT' : 'GT') ];
2841− };
2842− },
2843− toFloat : function(x) { return x; },
2844− round : function(n) { return Math.round(n); },
2845− floor : function(n) { return Math.floor(n); },
2846− ceiling : function(n) { return Math.ceil(n); },
2847− truncate : function(n) { return ~~n; },
2848− sqrt : Math.sqrt,
2849− abs : Math.abs,
2850− pi : Math.PI,
2851− e : Math.E,
2852− sin : Math.sin,
2853− cos : Math.cos,
2854− tan : Math.tan,
2855− asin : Math.asin,
2856− acos : Math.acos,
2857− atan : Math.atan,
2858− mod : mod,
2859− min : min,
2860− max : max,
2861− flip : flip,
2862− clamp : clamp,
2863− curry : curry,
2864− uncurry : uncurry,
2865− logBase : logBase,
2866− Just : Data.Maybe.Just,
2867− Nothing : Data.Maybe.Nothing,
2868− maybe : Data.Maybe.maybe,
2869− map : Data.List.map,
2870− filter : Data.List.filter,
2871− head : Data.List.head,
2872− tail : Data.List.tail,
2873− last : Data.List.last,
2874− length : Data.List.length,
2875− reverse : Data.List.reverse,
2876− foldr : Data.List.foldr,
2877− foldr1 : Data.List.foldr1,
2878− foldl : Data.List.foldl,
2879− foldl1 : Data.List.foldl1,
2880− and : Data.List.and,
2881− or : Data.List.or,
2882− forall : Data.List.forall,
2883− exists : Data.List.exists,
2884− sum : Data.List.sum,
2885− product : Data.List.product,
2886− concat : Data.List.concat,
2887− concatMap : Data.List.concatMap,
2888− maximum : Data.List.maximum,
2889− minimum : Data.List.minimum,
2890− scanl : Data.List.scanl,
2891− scanl1 : Data.List.scanl1,
2892− take : Data.List.take,
2893− drop : Data.List.drop,
2894− lift : Signal.lift,
2895− lift2 : Signal.lift2,
2896− lift3 : Signal.lift3,
2897− lift4 : Signal.lift4,
2898− foldp : Signal.foldp,
2899− foldp1 : Signal.foldp1,
2900− foldp_ : Signal.foldp_,
2901− constant : Signal.constant,
2902− count : Signal.count,
2903− keepIf : Signal.keepIf,
2904− dropIf : Signal.dropIf,
2905− keepWhen : Signal.keepWhen,
2906− dropWhen : Signal.dropWhen,
2907− dropRepeats : Signal.dropRepeats,
2908− sampleOn : Signal.sampleOn
2909− };
2910−}();
2911−var eq = Value.eq;
2912−
2913−Signal.addListener(document, 'elm_log', function(e) { console.log(e.value); });
2914−Signal.addListener(document, 'elm_title', function(e) { document.title = e.value; });
2915−Signal.addListener(document, 'elm_redirect', function(e) {
2916− if (e.value.length > 0) { window.location = e.value; }
2917− });
2918−
2919−var includeGlobal = this;
2920−(function() {
2921− var include = function(library) {
2922− for (var i in library) {
2923− if (i === 'Internal') continue;
2924− try {
2925− includeGlobal[i] = library[i];
2926− } catch (err) {
2927− if (i === 'length') {
2928− includeGlobal.execScript('var length;');
2929− length = library[i];
2930− continue;
2931− }
2932− }
2933− }
2934− };
2935− var includeAs = function(name) { return function(library) {
2936− includeGlobal[name] = includeGlobal[name] || {};
2937− for (var i in library) {
2938− if (i === 'Internal') continue;
2939− includeGlobal[name][i] = library[i];
2940− }
2941− };
2942− };
2943− include (Element);
2944− include (Text);
2945−
2946− color = Element.color;
2947− height = Element.height;
2948− show = Value.show;
2949−
2950− include (ElmCode.Graphics.Color);
2951− include (ElmCode.Graphics.Element);
2952−
2953− includeAs ('Time') (Signal.Time);
2954− includeAs ('Mouse') (Signal.Mouse);
2955− includeAs ('Keyboard') (Signal.Keyboard);
2956− includeAs ('Window') (Signal.Window);
2957− includeAs ('HTTP') (Signal.HTTP);
2958− includeAs ('Input') (Signal.Input);
2959− includeAs ('Random') (Signal.Random);
2960−
2961−}());
2962−
2963−var ElmCode = ElmCode || {};
2964−ElmCode.Data = Data;
2965−ElmCode.Signal = Signal;
2966−ElmCode.Data.List = List;
2967−ElmCode.Foreign = Foreign;
2968−ElmCode.Prelude = Prelude;
2969−ElmCode.Graphics.Text = Text;
1+var Guid=function(){var g=0;return{guid:function(){return g+=1}}}(),Foreign=function(){var g=function(a){for(var b=["Nil"],c=a.length;c--;)b=["Cons",a[c],b];return b},c=function(a){for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];return b},b=function(a){return a.slice(1)},a=function(a){return["Tuple"+a.length].concat(a)};return{JavaScript:{castJSBoolToBool:function(a){return a},castBoolToJSBool:function(a){return a},castJSNumberToFloat:function(a){return a},castFloatToJSNumber:function(a){return a},
2+castJSNumberToInt:function(a){return~~a},castIntToJSNumber:function(a){return a},Experimental:{castJSElementToElement:function(a){return function(b){return function(c){return["Element",Guid.guid(),["EExternalHtml",c],a,b,1,Nothing,Nothing]}}},castElementToJSElement:function(a){return Render.render(a)}},castJSArrayToList:g,castListToJSArray:c,castJSStringToString:g,castStringToJSString:function(a){return"string"===typeof a?a:c(a).join("")},castTupleToJSTuple2:b,castTupleToJSTuple3:b,castTupleToJSTuple4:b,
3+castTupleToJSTuple5:b,castJSTupleToTuple2:a,castJSTupleToTuple3:a,castJSTupleToTuple4:a,castJSTupleToTuple5:a}}}(),ElmJSON=function(){function g(a){return function(h){function f(a){switch(a[0]){case "JsonNull":return null;case "JsonString":return b.castStringToJSString(a[1]);case "JsonObject":var j={},a=a[1][1],l;for(l in a)j[l]=f(a[l]);return j;case "JsonArray":j=b.castListToJSArray(a[1]);for(l=j.length;l--;)j[l]=f(j[l]);return j;default:return a[1]}}return JSON.stringify(f(["JsonObject",h]),null,
4+b.castStringToJSString(a))}}function c(a){function h(a){switch(typeof a){case "string":return["JsonString",b.castJSStringToString(a)];case "number":return["JsonNumber",b.castJSNumberToFloat(a)];case "boolean":return["JsonBool",b.castJSBoolToBool(a)];case "object":if(null===a)return["JsonNull"];for(var j in a)a[j]=h(a[j]);return a instanceof Array?["JsonArray",b.castJSArrayToList(a)]:["JsonObject",["JSON",a]]}}var a=JSON.parse(a),f;for(f in a)a[f]=h(a[f]);return["JSON",a]}var b=Foreign.JavaScript;
5+return{empty:["JSON",{}],singleton:function(a){return function(h){var f={};f[b.castStringToJSString(a)]=h;return["JSON",f]}},insert:function(a){return function(h){return function(f){var f=f[1],c={},j;for(j in f)c[j]=f[j];c[b.castStringToJSString(a)]=h;return["JSON",c]}}},lookup:function(a){return function(c){var f=b.castStringToJSString(a);return c[1].hasOwnProperty(f)?Just(c[1][f]):Nothing}},findWithDefault:function(a){return function(c){return function(f){var g=b.castStringToJSString(c);return f[1].hasOwnProperty(g)?
6+f[1][g]:a}}},remove:function(a){return function(c){var c=c[1],f={},g;for(g in c)f[g]=c[g];delete f[b.castStringToJSString(a)];return["JSON",f]}},toPrettyJSString:g,toJSString:g(""),fromJSString:c,toPrettyString:function(a){return function(c){return b.castJSStringToString(g(a)(c))}},toString:function(a){return b.castJSStringToString(g("")(a))},fromString:function(a){return c(b.castStringToJSString(a))},toList:function(a){var a=a[1],c=[],f;for(f in a)c.push(Value.Tuple(b.castJSStringToString(f),a[f]));
7+return b.castJSArrayToList(c)},fromList:function(a){for(var a=b.castListToJSArray(a),c={},f=a.length;f--;)c[b.castStringToJSString(a[f][1])]=a[f][2];return["JSON",c]},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]}}}();Foreign.JavaScript.JSON=ElmJSON;
8+var Value=function(){function g(a){if(0==a.length)return a;for(var a=a.replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/\n/g,"<br/>"),a=a.split("<br/>"),b=a.length;b--;){var c=a,g=b,j;j=a[b];if(0!=j.length){j=j.split("");" "==j[0]&&(j[0]=" ");for(var l=j.length;--l;)" "==j[l][0]&&" "==j[l-1]&&(j[l-1]+=j[l],j[l]="");for(l=j.length;l--;)if(1<j[l].length&&" "==j[l][0]){for(var d=j[l].split(""),e=d.length-2;0<=e;e-=2)d[e]=" ";j[l]=d.join("")}j=
9+j.join("")}c[g]=j}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 f=a.length;f--;)if(!c(a[f],b[f]))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="",f=a.length;--f;)c=","+b(a[f])+c;","===c[0]&&(c=c.substring(1));return"("+c+")"}if("Cons"===a[0])for(var f=
10+"string"===typeof a[1]?'"':"]",g="string"===typeof a[1]?"":",",j="string"===typeof a[1]?function(a){return a}:b,c=("string"===typeof a[1]?'"':"[")+j(a[1]),a=a[2];;)if("Cons"===a[0])c+=g+j(a[1]),a=a[2];else return c+f;else{if("Nil"===a[0])return"[]";if("JSON"===a[0])return"(JSON.fromList "+b(ElmJSON.toList(a))+")";c="";for(f=a.length;--f;)c=" "+b(a[f])+c;c=a[0]+c;return 1<a.length?"("+c+")":c}}}return a+""};return{eq:c,str:function(a){for(var b=["Nil"],c=a.length;c--;)b=["Cons",a[c],b];return b},show:function(a){return Text.monospace(g(b(a)))},
11+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"]],g=c,a=a[2];"Cons"===a[0];)g[2]=["Cons",a[1],["Nil"]],a=a[2],g=g[2];g[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 g(a);for(var b=[];"Cons"===
12+a[0];)b.push(a[1]),a=a[2];return g(b.join(""))},properEscape:g,getTextSize:function(a,b,c){var g=document.createElement("div");g.innerHTML=c;g.style.textAlign="left";0<a&&(g.style.width=a+"px");g.style.visibility="hidden";g.style.styleFloat="left";g.style.cssFloat="left";document.body.appendChild(g);c=window.getComputedStyle(g);a=c.getPropertyValue("width").slice(0,-2)-0;c=c.getPropertyValue("height").slice(0,-2)-0;document.body.removeChild(g);delete g;return[Math.ceil(a),Math.ceil(Math.max(b,c))]},
13+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);delete 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,g=window.getComputedStyle(a),j=g.getPropertyValue("width").slice(0,-2)-0,g=g.getPropertyValue("height").slice(0,
14+-2)-0;document.body.removeChild(a);delete a;return[b-j,c-g]},groupForms:function(a){for(var a=Foreign.JavaScript.castListToJSArray(a),b=[],c=[],g=a.length;g--;){var j=a[g];switch(j[4][0]){case "FElement":0<c.length&&(b.push(c),c=[]);b.push(j);break;default:c.push(j)}}0<c.length&&b.push(c);return b}}}(),List=function(){function g(a){return function(b){if("Nil"===b[0])return b;"Cons"!==b[0]&&d("map");for(var i=["Cons",a(b[1]),["Nil"]],e=i,b=b[2];"Cons"===b[0];)e[2]=["Cons",a(b[1]),["Nil"]],b=b[2],e=
15+e[2];return i}}function c(a){return function(b){return function(i){var e=b;if("Nil"===i[0])return e;for("Cons"!==i[0]&&d("foldl");"Cons"===i[0];)e=a(i[1])(e),i=i[2];return e}}}function b(a){return function(b){return function(i){var e=b;if("Nil"===i[0])return e;"Cons"!==i[0]&&d("foldr");for(var c=[];"Cons"===i[0];)c.push(i[1]),i=i[2];for(i=c.length;i--;)e=a(c[i])(e);return e}}}function a(a){return function(d){var i;"Cons"!==d[0]?i=void 0:(i=d[1],d=d[2],i=c(a)(i)(d));return i}}function h(a){return function(b){return function(i){if("Nil"===
16+i[0])return["Cons",b,["Nil"]];"Cons"!==i[0]&&d("scanl");for(var e=[b];"Cons"===i[0];)b=a(i[1])(b),e.push(b),i=i[2];for(var i=["Nil"],c=e.length;c--;)i=["Cons",e[c],i];return i}}}function f(a){return function(d){a:{for(var i=[function(a){return"Nil"!==a[0]?void 0:["Tuple2",["Nil"],["Nil"]]},function(d){if("Cons"===d[0]){var b=d[1],d=d[2];var i=f(a)(d);"Tuple2"!==i[0]?b=void 0:(d=i[1],i=i[2],b=a(b)?["Tuple2",["Cons",b,d],i]:["Tuple2",d,["Cons",b,i]]);return b}}],b=i.length;b--;){var e=i[b](d);if(void 0!==
17+e){d=e;break a}}d=void 0}return d}}function n(a){a:{for(var d=[function(a){return"Nil"!==a[0]?void 0:["Tuple2",["Nil"],["Nil"]]},function(a){if("Cons"!==a[0])a=void 0;else if(a=["Tuple2",a[1],n(a[2])],"Tuple2"!==a[0]||"Tuple2"!==a[1][0])a=void 0;else var d=a[1][1],b=a[1][2],a="Tuple2"!==a[2][0]?void 0:["Tuple2",["Cons",d,a[2][1]],["Cons",b,a[2][2]]];return a}],b=d.length;b--;){var e=d[b](a);if(void 0!==e){a=e;break a}}a=void 0}return a}function j(a){return function(d){a:{for(var b=[function(a){return"Nil"!==
18+a[0]?void 0:["Nil"]},function(a){if("Cons"===a[0]){var d=a[1];return"Nil"!==a[2][0]?void 0:["Cons",d,["Nil"]]}},function(d){if("Cons"===d[0]){var b=d[1];if("Cons"===d[2][0]){var i=d[2][1],d=d[2][2];return["Cons",b,["Cons",a,j(a)(["Cons",i,d])]]}}}],e=b.length;e--;){var c=b[e](d);if(void 0!==c){d=c;break a}}d=void 0}return d}}function l(a){return function(d){a:{for(var b=[function(a){return"Nil"!==a[0]?void 0:["Nil"]},function(a){if("Cons"===a[0]){var d=a[1];return"Nil"!==a[2][0]?void 0:d}},function(d){if("Cons"===
19+d[0]){var b=d[1];if("Cons"===d[2][0]){var e=d[2][1],d=d[2][2];return Value.append(b,Value.append(a,l(a)(["Cons",e,d])))}}}],e=b.length;e--;){var c=b[e](d);if(void 0!==c){d=c;break a}}d=void 0}return d}}var d=function(a){throw"Function '"+a+"' expecting a list!";},e=c(function(a){return function(d){return["Cons",a,d]}})(["Nil"]),u=b(function(a){return function(d){return Value.append(a,d)}})(["Nil"]),q=c(function(a){return function(d){return a&&d}})(!0),s=c(function(a){return function(d){return a||
20+d}})(!1),k=c(function(a){return function(d){return a+d}})(0),m=c(function(a){return function(d){return a*d}})(1),r=a(function(a){return function(d){return Math.max(a,d)}}),v=a(function(a){return function(d){return Math.min(a,d)}});return{head:function(a){if("Cons"!==a[0])throw"Error: 'head' only accepts lists of length greater than one.";return a[1]},tail:function(a){if("Cons"!==a[0])throw"Error: 'tail' only accepts lists of length greater than one.";return a[2]},last:function(a){if("Cons"!==a[0])throw"Error: 'last' only accepts lists of length greater than one.";
21+for(var d=a[1];"Cons"===a[0];)d=a[1],a=a[2];return d},map:g,foldl:c,foldr:b,foldl1:a,foldr1:function(a){return function(b){if("Nil"===b[0])throw"'foldr1' requires an non-empty list.";"Cons"!==b[0]&&d("foldr1");for(var e=[];"Cons"===b[0];)e.push(b[1]),b=b[2];for(var b=e.pop(),c=e.length;c--;)b=a(e[c])(b);return b}},scanl:h,scanl1:function(a){return function(d){if("Cons"!==d[0])throw"Error: 'scanl1' requires a list of at least length 1.";return h(a)(d[1])(d[2])}},filter:function(a){return function(b){if("Nil"===
22+b[0])return b;"Cons"!==b[0]&&d("filter");for(var e=[];"Cons"===b[0];)a(b[1])&&e.push(b[1]),b=b[2];for(var b=["Nil"],c=e.length;c--;)b=["Cons",e[c],b];return b}},length:function(a){for(var d=0;"Cons"===a[0];)d+=1,a=a[2];return d},reverse:e,concat:u,concatMap:function(a){return function(d){return u(g(a)(d))}},and:q,or:s,forall:function(a){return c(function(d){return function(b){return b&&a(d)}})(!0)},exists:function(a){return c(function(d){return function(b){return b||a(d)}})(!1)},sum:k,product:m,maximum:r,
23+minimum:v,partition:f,zipWith:function(a){return function(b){return function(e){if("Nil"===b[0]||"Nil"===e[0])return["Nil"];("Cons"!==b[0]||"Cons"!==e[0])&&d("zipWith");for(var c=[];"Cons"===b[0]&&"Cons"===e[0];)c.push(a(b[1])(e[1])),b=b[2],e=e[2];for(var e=["Nil"],l=c.length;l--;)e=["Cons",c[l],e];return e}}},zip:function(a){return function(b){if("Nil"===a[0]||"Nil"===b[0])return["Nil"];("Cons"!==a[0]||"Cons"!==b[0])&&d("zip");for(var e=[];"Cons"===a[0]&&"Cons"===b[0];)e.push(["Tuple2",a[1],b[1]]),
24+a=a[2],b=b[2];for(var b=["Nil"],c=e.length;c--;)b=["Cons",e[c],b];return b}},unzip:n,intersperse:j,intercalate:l,sort:function(a){if("Nil"===a[0])return a;"Cons"!==a[0]&&d("sort");for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];b.sort(function(a,d){return a-d});for(var a=["Nil"],e=b.length;e--;)a=["Cons",b[e],a];return a},take:function(a){return function(b){if(0>=a)return["Nil"];if("Nil"===b[0])return b;"Cons"!==b[0]&&d("take");var e=["Cons",b[1],["Nil"]],c=e,b=b[2];for(--a;"Cons"===b[0]&&0<a;)c[2]=
25+["Cons",b[1],["Nil"]],c=c[2],b=b[2],--a;return e}},drop:function(a){return function(b){if("Nil"===b[0])return b;for("Cons"!==b[0]&&d("drop");"Cons"===b[0]&&0<a;)b=b[2],--a;return b}}}}(),Data=function(){var g;g=function(b){return function(a){return"Just"===b[0]?["Cons",b[1],a]:a}};var c=function(b){return function(a){return function(c){var g=b(a);return"Just"===g[0]?["Cons",g[1],c]:c}}};g={Just:function(b){return["Just",b]},Nothing:["Nothing"],catMaybes:List.foldr(g)(["Nil"]),isJust:function(b){return"Just"===
26+b[0]},isNothing:function(b){return"Nothing"===b[0]},fromMaybe:function(b){return function(a){return"Just"===a[0]?a[1]:b}},consMaybe:g,mapMaybe:function(b){return List.foldr(c(b))(["Nil"])},maybe:function(b){return function(a){return function(c){return"Just"===c[0]?a(c[1]):b}}}};return{String:{toText:Value.toText,properEscape:Value.properEscape},Char:{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()},
27+toLocaleUpper:function(b){return b.toLocaleUpperCase()},toLocaleLower:function(b){return b.toLocaleLowerCase()}},Maybe:g,List:List}}(),ElmCode=ElmCode||{};ElmCode.Graphics=ElmCode.Graphics||{};
28+ElmCode.Graphics.Color=function(){return{rgba:function(g){return function(c){return function(b){return function(a){return["Color",g,c,b,a]}}}},rgb:function(g){return function(c){return function(b){return["Color",g,c,b,1]}}},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],extract:function(g){return 1===
29+g[4]?"rgb("+g[1]+","+g[2]+","+g[3]+")":"rgba("+g[1]+","+g[2]+","+g[3]+","+g[4]+")"}}}();
30+var Collage=function(){function g(a,b){var d=b.length-1;if(!(0>=d))for(a.moveTo(b[d][1],b[d][2]);d--;)a.lineTo(b[d][1],b[d][2])}function c(a,b,d,e){0===a.length&&(a=[8,4]);var c=e.length-1;if(!(0>=c)){var g=e[c][1],s=e[c][2],f=0,m=0,r=0,h=0,p=0,n=0,i=a.length,x=!0,w=a[0];for(b.moveTo(g,s);c--;){f=e[c][1];m=e[c][2];r=f-g;h=m-s;for(p=Math.sqrt(r*r+h*h);w<=p;)g+=r*w/p,s+=h*w/p,b[x?"lineTo":"moveTo"](g,s),r=f-g,h=m-s,p=Math.sqrt(r*r+h*h),x=!x,n=(n+1)%i,w=a[n];0<p&&(b[x?"lineTo":"moveTo"](f,m),w-=p);g=
31+f;s=m}}b.strokeStyle=ElmCode.Graphics.Color.extract(d);b.stroke()}function b(a,b,d,e,u){b.clearRect(0,0,d,e);for(d=u.length;d--;){var q=u[d],f=a,e=b,k=q[1],m=q[2],h=q[3][1],n=q[3][2],q=q[4];e.save();(0!==h||0!==n)&&e.translate(h,n);k!==~~k&&e.rotate(2*Math.PI*k);1!==m&&e.scale(m,m);e.beginPath();switch(q[0]){case "FLine":a:switch(f=e,k=q,q=k[3][1],k[1][0]){case "Solid":k=k[2];g(f,q);f.strokeStyle=ElmCode.Graphics.Color.extract(k);f.stroke();break;case "Dotted":c([3,3],f,k[2],q);break a;case "Dashed":c([8,
32+4],f,k[2],q);break a;case "Custom":c(k[1][1],f,k[2],q)}break;case "FShape":a:switch(h=f,m=e,f=q[1],k=q[2],q=q[3][1],f[0]){case "Filled":f=m;g(f,q);f.fillStyle=ElmCode.Graphics.Color.extract(k);f.fill();break a;case "Outlined":f=m;g(f,q);f.strokeStyle=ElmCode.Graphics.Color.extract(k);f.stroke();break a;case "Textured":k=h;f=f[1];h=new Image;h.src=Foreign.JavaScript.castStringToJSString(f);h.onload=k;g(m,q);m.fillStyle=m.createPattern(h,"repeat");m.fill();break a;case "CustomOutline":c(f[1],m,k,q)}break;
33+case "FImage":k=e,m=q[1],h=q[2],q=q[3],n=new Image,n.onload=f,n.src=Foreign.JavaScript.castStringToJSString(q),k.drawImage(n,-m/2,-h/2,m,h)}e.restore()}}function a(a,c,d){var e=Render.newElement("canvas");e.style.width=~~a+"px";e.style.height=~~c+"px";e.style.display="block";e.width=~~a;e.height=~~c;if(e.getContext){var g=e.getContext("2d"),a=e.width,c=e.height;b(function(){b(this,g,a,c,d)},g,a,c,d);return e}e.innerHTML="Your browser does not support the canvas element.";return e}function h(a,b,d,
34+e,c,g,f){var k=Render.render(f),d="translate("+(c-f[3]/2)+"px,"+(g-f[4]/2)+"px) "+(1===e?"":"scale("+e+","+e+")")+" "+(d===~~d?"":"rotate("+360*d+"deg)");k.style.transform=d;k.style.msTransform=d;k.style.MozTransform=d;k.style.webkitTransform=d;k.style.OTransform=d;d=Render.newElement("div");Render.addTo(d,k);d.style.width=~~a+"px";d.style.height=~~b+"px";d.style.overflow="hidden";return d}function f(c,g,d){if(!Value.eq(d,g)){var e=c.style.width.slice(0,-2)-0,u=c.style.height.slice(0,-2)-0;if("object"===
35+typeof d[0]){if("object"===typeof g[0]&&c.getContext){var f=c.getContext("2d");return b(function(){b(this,f,e,u,d)},f,e,u,d)}g=a(e,u,d);g.style.position="absolute";return c.parentNode.replaceChild(g,c)}g=h(e,u,d[1],d[2],d[3][1],d[3][2],d[4][1]);g.style.position="absolute";return c.parentNode.replaceChild(g,c)}}function n(a,b,d,e,c){var g=0,f,k=(a[1]-e[1])/d,a=(a[2]-e[2])/d;0!==b&&(b*=2*Math.PI,b=0===k?(0<a?Math.PI/2:-Math.PI/2)-b:Math.atan(a/k)+(0<k?0:Math.PI)-b,a=Math.sqrt(k*k+a*a),k=a*Math.cos(b),
36+a*=Math.sin(b));if(0===c.length)return!1;f=c[0];for(d=c.length-1;d--;){b=c[d];e=f[1];f=f[2];var h=b[1],n=b[2];if(f<n)var v=f,p=n;else v=n,p=f;if(e<h)var t=e,i=h;else t=h,i=e;v<a&&a<=p&&k<=i&&(k<=t||k<=(a-f)*(h-e)/(n-f)+e)&&++g;f=b}return 1===g%2}return{collage:function(b,c,d){if(0===d.length)return a(b,c,[]);for(var e=Array(d.length),g=d.length;g--;){var f=d[g];e[g]="string"===typeof f[0]?h(b,c,f[1],f[2],f[3][1],f[3][2],f[4][1]):a(b,c,f)}return 1===d.length?e[0]:Render.flowWith(Render.goIn,function(a){return a},
37+e)},updateCollage:function(a,b,d){if(1===d.length)return f(a,b[0],d[0]);for(var a=a.childNodes,e=a.length,c=e;c--;)f(a[e-c-1],b[c],d[c])},insideForm:function(a){return function(b){var d=a[1],c=a[2];if(6>b.length){var g=b[3][1],f=b[3][2],h=0,k=b[2];switch(b[4][0]){case "FShape":for(var m=b[4][3][1],r=m.length;--r;)var v=m[r],h=Math.max(h,v[1]*v[1]+v[2]*v[2]);h*=k*k;break;case "FImage":m=k*b[4][1]/2;k=k*b[4][2]/2;h=m*m+k*k;break;case "FElement":m=k*b[4][1][3]/2,k=k*b[4][1][4]/2,h=m*m+k*k}b.push(function(a,
38+b){var d=a-g,c=b-f;return d*d+c*c<h+1})}if(!b[5](d,c))return!1;var p,t;switch(b[4][0]){case "FShape":return n(a,b[1],b[2],b[3],b[4][3][1]);case "FLine":return!1;case "FImage":p=b[4][1]/2;t=b[4][2]/2;break;case "FElement":p=b[4][1][3]/2,t=b[4][1][4]/2}return n(a,b[1],b[2],b[3],[[null,p,t],[null,-p,t],[null,-p,-t],[null,p,-t],[null,p,t]])}}}}(),ElmCode=ElmCode||{};ElmCode.Graphics=ElmCode.Graphics||{};
39+ElmCode.Graphics.Element=function(){function g(a){return function(b){return["Position",a,b]}}function c(a){return function(b){return["EText",a,b]}}function b(a){return function(b){return["EFlow",a,Foreign.JavaScript.castListToJSArray(b)]}}function a(a){return["Line",Foreign.JavaScript.castListToJSArray(a)]}function h(a){return function(b){var d=Foreign.JavaScript.castListToJSArray(a);0<d.length&&d.push(d[0]);return["Shape",d,b]}}function f(a){return function(b){return function(d){return function(c){return["Form",
40+a,b,d,c]}}}}function n(a){return function(b){return function(d){return["FLine",a,b,d]}}}function j(a){return function(b){return function(d){return["FShape",a,b,d]}}}function l(a,b,d,c,e,i){return["Element",Guid.guid(),a,b,d,c,e,i]}function d(a,b,d){return["Element",Guid.guid(),a,b,d,1,Nothing,Nothing]}function e(a){return~~a[3]}function u(a){return~~a[4]}function q(a){return function(b){return function(c){return d(["EImage",Foreign.JavaScript.castStringToJSString(c)],a,b)}}}function s(a){return function(b){return d(x,
41+a,b)}}function k(a){return function(b){return function(d){var c=map(function(d){return["Tuple2",a/2*cos(2*(pi/50)*d),b/2*sin(2*(pi/50)*d)]}),e=49,i=["Nil"];if(0<=e){do i=["Cons",e,i];while(0<e--)}return h(c(i))(d)}}}var m=["DRight"],r=["DDown"],v=["DOut"],p=["Near"],t=["Mid"],i=["Far"],x=["EEmpty"],w=["Solid"],y=["Dotted"],z=["Dashed"],A=["Filled"],B=["Outlined"],C=g(p)(p),D=g(i)(p),E=g(p)(i),F=g(i)(i),G=g(p)(t),H=g(i)(t),p=g(t)(p),i=g(t)(i),t=g(t)(t);return{left:["DLeft"],right:m,down:r,up:["DUp"],
42+inward:["DIn"],outward:v,topLeft:C,topRight:D,bottomLeft:E,bottomRight:F,midLeft:G,midRight:H,midTop:p,midBottom:i,middle:t,middleAt:function(a){return function(b){return["PositionAt",a,b]}},topLeftAt:function(a){return function(b){return["PositionTL",a,b]}},topRightAt:function(a){return function(b){return["PositionTR",a,b]}},bottomLeftAt:function(a){return function(b){return["PositionBL",a,b]}},bottomRightAt:function(a){return function(b){return["PositionBR",a,b]}},absolute:function(a){return["Absolute",
43+a]},relative:function(a){return["Relative",a]},width:function(a){return function(b){var d=b[2];switch(d[0]){case "EImage":case "EVideo":return l(b[2],a,b[4]*a/b[3],b[5],b[6],b[7]);case "EText":return d=Value.getTextSize(a,b[4],d[2]),l(b[2],a,d[1],b[5],b[6],b[7])}return l(b[2],a,b[4],b[5],b[6],b[7])}},height:function(a){return function(b){switch(b[2][0]){case "EImage":case "EVideo":return l(b[2],b[3]*a/b[4],a,b[5],b[6],b[7])}return l(b[2],b[3],a,b[5],b[6],b[7])}},size:function(a){return function(b){return function(d){return l(d[2],
44+a,b,d[5],d[6],d[7])}}},opacity:function(a){return function(b){return l(b[2],b[3],b[4],a,b[6],b[7])}},color:function(a){return function(b){return l(b[2],b[3],b[4],b[5],Just(a),b[7])}},link:function(a){return function(b){return l(b[2],b[3],b[4],b[5],b[6],Just(Foreign.JavaScript.castStringToJSString(a)))}},widthOf:e,heightOf:u,sizeOf:function(a){return["Tuple2",~~a[3],~~a[4]]},text:function(a){var b=Value.getTextSize(0,0,a);return d(c("left")(a),b[0],b[1])},asText:function(a){var a=Value.show(a),b=Value.getTextSize(0,
45+0,a);return d(c("left")(a),b[0],b[1])},plainText:function(a){var a=Value.toText(a),b=Value.getTextSize(0,0,a);return d(c("left")(a),b[0],b[1])},centeredText:function(a){var b=Value.getTextSize(0,0,a);return d(c("center")(a),b[0],b[1])},justifiedText:function(a){var b=Value.getTextSize(0,0,a);return d(c("justify")(a),b[0],b[1])},rightedText:function(a){var b=Value.getTextSize(0,0,a);return d(c("right")(a),b[0],b[1])},image:q,images:function(a){var b=Elm.Input(s(0)(0)),a=Elm.Lift(function(a){var a=
46+Foreign.JavaScript.castStringToJSString(a),d=new Image;d.onload=function(){console.log("loaded");Dispatcher.notify(b.id,q(this.width)(this.height)(a))};d.src=a},[a]);return Elm.Lift(function(a){return function(){return a}},[b,a])},video:function(a){return function(b){return function(c){return d(["EVideo",Foreign.JavaScript.castStringToJSString(c)],a,b)}}},fittedImage:function(a){return function(b){return function(c){return d(["EFittedImage",Foreign.JavaScript.castStringToJSString(c)],a,b)}}},flow:function(a){return function(c){var i;
47+i=map(e)(c);a:{switch(a[0]){case "DLeft":i=sum(i);break a;case "DRight":i=sum(i);break a}i=maximum(i)}var g;g=map(u)(c);a:{switch(a[0]){case "DDown":g=sum(g);break a;case "DUp":g=sum(g);break a}g=maximum(g)}return d(b(a)(c),i,g)}},above:function(a){return function(c){return d(b(r)(["Cons",a,["Cons",c,["Nil"]]]),max(~~a[3])(~~c[3]),~~a[4]+~~c[4])}},below:function(a){return function(c){return d(b(r)(["Cons",c,["Cons",a,["Nil"]]]),max(~~a[3])(~~c[3]),~~a[4]+~~c[4])}},beside:function(a){return function(c){return d(b(m)(["Cons",
48+a,["Cons",c,["Nil"]]]),~~a[3]+~~c[3],max(~~a[4])(~~c[4]))}},layers:function(a){return d(b(v)(a),maximum(map(e)(a)),maximum(map(u)(a)))},collage:function(a){return function(b){return function(c){return d(["ECollage",a,b,Value.groupForms(c)],a,b)}}},spacer:s,container:function(a){return function(b){return function(c){return function(e){return d(["EContainer",c,e],a,b)}}}},line:a,segment:function(b){return function(d){return a(["Cons",b,["Cons",d,["Nil"]]])}},polygon:h,rect:function(a){return function(b){return function(d){return h(["Cons",
49+["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"]]]]])(d)}}},oval:k,circle:function(a){return k(2*a)(2*a)},ngon:function(a){return function(b){return function(d){var c=toFloat(a),e=map(function(a){return["Tuple2",b*cos(2*(pi/c)*a),b*sin(2*(pi/c)*a)]}),i=a-1,g=["Nil"];if(0<=i){do g=["Cons",i,g];while(0<i--)}return h(e(g))(d)}}},solid:function(a){return function(b){return f(0)(1)(["Tuple2",0,0])(n(w)(a)(b))}},dotted:function(a){return function(b){return f(0)(1)(["Tuple2",
50+0,0])(n(y)(a)(b))}},dashed:function(a){return function(b){return f(0)(1)(["Tuple2",0,0])(n(z)(a)(b))}},customLine:function(a){return function(b){return function(d){return f(0)(1)(["Tuple2",0,0])(n(["Custom",Foreign.JavaScript.castListToJSArray(a)])(b)(d))}}},filled:function(a){return function(b){return f(0)(1)(b[2])(j(A)(a)(b))}},outlined:function(a){return function(b){return f(0)(1)(b[2])(j(B)(a)(b))}},customOutline:function(a){return function(b){return function(d){return f(0)(1)(d[2])(j(["CustomOutline",
51+Foreign.JavaScript.castListToJSArray(a)])(b)(d))}}},textured:function(a){return function(b){return f(0)(1)(b[2])(j(["Textured",a])(null)(b))}},sprite:function(a){return function(b){return function(d){return function(c){return f(0)(1)(c)(["FImage",b,d,Foreign.JavaScript.castStringToJSString(a)])}}}},toForm:function(a){return function(b){return f(0)(1)(a)(["FElement",b])}},rotate:function(a){return function(b){a:{switch(b[0]){case "Form":var d=b[2],c=b[3],e=b[4],b=f(a+b[1])(d)(c)(e);break a}throw"Non-exhaustive pattern match in case";
52+}return b}},scale:function(a){return function(b){return f(b[1])(a*b[2])(b[3])(b[4])}},move:function(a){return function(b){return function(d){var c;a:{switch(d[0]){case "Form":c=d[1];var e=d[2],i=d[3],d=d[4];switch(i[0]){case "Tuple2":var g=i[1],i=i[2];c=f(c)(e)(["Tuple2",a+g,b+i])(d);break a}}throw"Non-exhaustive pattern match in case";}return c}}},isWithin:Collage.insideForm}}();
53+var Text=function(){function g(a){return Value.toText(a)}var c=function(a){return function(b){return"<"+a+' style="padding:0;margin:0">'+b+"</"+a+">"}},b=function(a,b){return function(c){return"<span style='"+a+":"+b+"'>"+c+"</span>"}},a=function(a){a=Foreign.JavaScript.castStringToJSString(a);return b("font-family",a)},h=c("h1"),f=b("font-style","italic"),c=c("b"),n=b("text-decoration","underline"),j=b("text-decoration","overline"),l=b("text-decoration","line-through");return{fromString:g,toText:g,
54+header:h,height:function(a){return b("font-size",a+"em")},italic:f,bold:c,underline:n,overline:j,strikeThrough:l,monospace:a("monospace"),typeface:a,color:function(a){return b("color",ElmCode.Graphics.Color.extract(a))},link:function(a){return function(b){return"<a href='"+g(a)+"'>"+b+"</a>"}}}}(),Render=function(){function g(a){a=document.createElement(a);a.style.padding="0";a.style.margin="0";return a}function c(a){return a}function b(a){a.style.styleFloat="left";a.style.cssFloat="left";return a}
55+function a(a){a.style.position="absolute";return a}function h(a,b,c){for(var f=g("div"),l=c.length;l--;){var j=a(b(c[l]));f.appendChild(j)}return f}function f(a){switch(a[0]){case "Absolute":return a[1]+"px";case "Relative":return 100*a[1]+"%"}}function n(a,b){b.style.position="absolute";b.style.margin="auto";switch(a[0]){case "Position":"Far"!==a[1][0]&&(b.style.left=0);"Near"!==a[1][0]&&(b.style.right=0);"Far"!==a[2][0]&&(b.style.top=0);"Near"!==a[2][0]&&(b.style.bottom=0);break;case "PositionAt":b.style.top=
56+f(a[2]);b.style.left=f(a[1]);var c="translate("+-elem[3]/2+"px,"+-elem[4]/2+"px)";b.style.transform=c;b.style.msTransform=c;b.style.MozTransform=c;b.style.webkitTransform=c;b.style.OTransform=c;break;default:c=a[0].slice(-2),b.style["T"===c[0]?"top":"bottom"]=f(a[2]),b.style["L"===c[1]?"left":"right"]=f(a[1])}}function j(d){var e={};switch(d[2][0]){case "EText":var e=d[2][1],f=d[2][2],l=g("div");l.innerHTML=f;l.style.textAlign=e;e=l;break;case "EImage":e=d[2][1];f=g("img");f.src=e;f.name=e;f.style.display=
57+"block";e=f;break;case "EVideo":l=d[2][1];e=g("video");e.controls="controls";f=g("source");f.src=l;l=l.split(".");f.type="video/"+l[l.length-1];e.appendChild(f);e.style.display="block";break;case "EFittedImage":var s=d[3],k=d[4],e=d[2][1],m=g("canvas");m.style.display="block";m.style.width=s+"px";m.style.height=k+"px";m.width=s;m.height=k;m.innerHTML="Your browser does not support the canvas element.";var r=g("img");r.onload=function(){if(m.getContext){var a=m.getContext("2d"),b=0,d=0,c=this.width,
58+e=this.height;s/k>this.width/this.height?(e=this.width*k/s,d=(this.height-e)/2):(c=this.height*s/k,b=(this.width-c)/2);a.drawImage(r,b,d,c,e,0,0,m.width,m.height)}};r.src=e;e=m;break;case "EFlow":a:{e=d[2][2];switch(d[2][1][0]){case "DDown":e=e.slice(0).reverse();case "DUp":e=h(c,j,e);break a;case "DRight":e=e.slice(0).reverse();case "DLeft":e=h(b,j,e);break a;case "DOut":e=e.slice(0).reverse();case "DIn":e=h(a,j,e);break a}e=void 0}break;case "ECollage":e=Collage.collage(d[2][1],d[2][2],d[2][3]);
59+break;case "EEmpty":e=g("div");break;case "EContainer":f=d[2][1];e=j(d[2][2]);n(f,e);f=g("div");f.style.position="relative";f.style.overflow="hidden";f.appendChild(e);e=f;break;case "EHtml":e=d[2][1];"button"!==e.type&&(f=Value.getExcess(e),d[3]-=f[0],d[4]-=f[1]);break;case "EExternalHtml":e=g("div"),e.appendChild(d[2][1])}e.id=d[1];e.style.width=~~d[3]+"px";e.style.height=~~d[4]+"px";1!==d[5]&&(e.style.opacity=d[5]);"Just"===d[6][0]&&(e.style.backgroundColor=ElmCode.Graphics.Color.extract(d[6][1]));
60+return"Just"===d[7][0]?(f=g("a"),f.href=d[7][1],f.appendChild(e),f):e}function l(d,e,g){"A"===d.tagName&&(d=d.firstChild);if(e[1]!==g[1]){if(e[2][0]!==g[2][0])return d.parentNode.replaceChild(j(g),d);var f=g[2],h=e[2];switch(f[0]){case "EText":f[1]!==h[1]&&(d.style.textAlign=f[1]);f[2]!==h[2]&&(d.innerHTML=f[2]);break;case "EImage":f[1]!==h[1]&&(d.src=f[1]);break;case "EVideo":case "EFittedImage":if(!Value.eq(f,h)||g[3]!==e[3]||g[4]!==e[4])return d.parentNode.replaceChild(j(g),d);break;case "ECollage":if(f[1]!==
61+h[1]||f[2]!==h[2]||f[3].length!==h[3].length)return d.parentNode.replaceChild(j(g),d);Collage.updateCollage(d,h[3],f[3]);break;case "EFlow":if(f[1]!==h[1])return d.parentNode.replaceChild(j(g),d);var k=f[2],m=d.childNodes;if(k.length!==m.length)return d.parentNode.replaceChild(j(g),d);var h=h[2],r={};switch(f[1][0]){case "DDown":case "DUp":r=c;break;case "DRight":case "DLeft":r=b;break;case "DOut":case "DIn":r=a}for(f=m.length;f--;)l(m[f],h[f],k[f]),r(m[f]);break;case "EContainer":l(d.childNodes[0],
62+h[2],f[2]);n(f[1],d.childNodes[0]);break;case "EHtml":g[1]!==e[1]&&(k=j(g),d.parentNode.replaceChild(k,d),d=k);"button"!==k.type&&(f=Value.getExcess(d),g[3]-=f[0],g[4]-=f[1]);break;case "EExternalHtml":g[1]!==e[1]&&d.parentNode.replaceChild(j(g),d)}g[3]!==e[3]&&(d.style.width=~~g[3]+"px");g[4]!==e[4]&&(d.style.height=~~g[4]+"px");g[5]!==e[5]&&(d.style.opacity=g[5]);2===g[6].length&&(f=ElmCode.Graphics.Color.extract(g[6][1]),f!==d.style.backgroundColor&&(d.style.backgroundColor=f));if(2===g[7].length&&
63+(1===e[7].length||g[7][1]!==e[7][1]))d.parentNode.href=g[7][1];g[1]=e[1]}}return{render:j,update:l,addTo:function(a,b){a.appendChild(b)},newElement:g,flowWith:h,goIn:a}}(),Elm=function(){var g=function(a,b,c){for(var g=a.kids,f=g.length;f--;)g[f].recv(b,c,a.id)},c=function(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;g(this,a,b);return b};Dispatcher.inputs.push(this)},b=function(a,b){this.id=Guid.guid();this.value=
64+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(),g(this,a,this.changed),this.changed=!1,this.count=0)};for(var c=b.length;c--;)b[c].kids.push(this)},a=function(a,b,c,f){this.id=Guid.guid();this.value=c?b(f.value):b;this.kids=[];this.recv=function(b,c){c&&(this.value=a(f.value)(this.value));
65+g(this,b,c)};f.kids.push(this)},h=function(a,b,c){this.id=Guid.guid();this.value=a(c.value)?b:c.value;this.kids=[];this.recv=function(b,d){var f=d&&!a(c.value);f&&(this.value=c.value);g(this,b,f)};c.kids.push(this)},f=function(a){this.id=Guid.guid();this.value=a.value;this.kids=[];this.recv=function(b,c){var f=c&&!eq(this.value,a.value);f&&(this.value=a.value);g(this,b,f)};a.kids.push(this)},n=function(a){return function(c){return function(e){e=new b(function(a){return function(b){return[a,b]}},[a,
66+e]);e=new h(function(a){return a[0]},[!0,c],e);return new b(function(a){return a[1]},[e])}}},j=function(a,b){this.id=Guid.guid();this.value=b.value;this.kids=[];this.count=0;this.changed=!1;this.recv=function(c,f,h){h===a.id&&(this.changed=f);this.count+=1;2==this.count&&(this.changed&&(this.value=b.value),g(this,c,this.changed),this.count=0,this.changed=!1)};a.kids.push(this);b.kids.push(this)};return{Input:function(a){return new c(a)},Lift:function(a,c){return new b(a,c)},Fold:function(b,c,e){return new a(b,
67+c,!1,e)},Fold1:function(b,c,e){return new a(b,c,!0,e)},keepIf:function(a){return function(b){return function(c){return new h(function(b){return!a(b)},b,c)}}},dropIf:function(a){return function(b){return function(c){return new h(a,b,c)}}},keepWhen:function(a){return n(new b(function(a){return!a},[a]))},dropWhen:n,dropRepeats:function(a){return new f(a)},sampleOn:function(a){return function(b){return new j(a,b)}}}}(),Dispatcher=function(){function g(a){if(!a.hasOwnProperty("defaultNumberOfKids"))return!0;
68+var b=a.kids.length;if(0==b)return!1;if(b>a.defaultNumberOfKids)return!0;for(var c=!1;b--;)c=c||g(a.kids[b]);return c}var c=null,b=0,a=[],h=null;return{initialize:function(){c=ElmCode.main();c.hasOwnProperty("recv")||(c=Elm.Input(c));h=c.value;for(var b=[],n=a.length;n--;)g(a[n])&&b.push(a[n]);a=b;document.getElementById("content").appendChild(Render.render(h));b=document.getElementById("widthChecker").offsetWidth;b!==window.innerWidth&&Dispatcher.notify(Window.dimensions.id,Value.Tuple(b,window.innerHeight));
69+c=Elm.Lift(function(a){var b=document.getElementById("content");Render.update(b.firstChild,h,a);return h=a},[c])},notify:function(c,g){b+=1;for(var h=!1,l=a.length;l--;)h=a[l].recv(b,c,g)||h;return h},inputs:a}}(),Signal=function(){function g(a){var b=Value.getSize(a);return["Element",Guid.guid(),["EHtml",a],b[0],b[1],1,Nothing,Nothing]}function c(a){for(var b=["Nil"],c=a.length;c--;)b=["Cons",a[c],b];return b}var b;b=document.addEventListener?function(a,b,c){a.addEventListener(b,c,!1)}:function(a,
70+b,c){a.attachEvent("on"+b,c)};var a,h=function(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)},f=Elm.Input(Value.Tuple(0,0));f.defaultNumberOfKids=2;a=Elm.Lift(function(a){return a[1]},[f]);a.defaultNumberOfKids=0;var n=Elm.Lift(function(a){return a[2]},[f]);n.defaultNumberOfKids=
71+0;var j=Elm.Input(!1),l=Elm.Input(!1),d=Elm.Input(Value.Tuple());b(document,"click",function(a){var b=Dispatcher.notify(l.id,!0),c=Dispatcher.notify(d.id,Value.Tuple());Dispatcher.notify(l.id,!1);!b&&!c&&this.removeEventListener("click",arguments.callee,!1)});b(document,"mousedown",function(a){Dispatcher.notify(j.id,!0)||this.removeEventListener("mousedown",arguments.callee,!1)});b(document,"mouseup",function(a){Dispatcher.notify(j.id,!1)||this.removeEventListener("mouseup",arguments.callee,!1)});
72+b(document,"mousemove",function(a){Dispatcher.notify(f.id,h(a))||this.removeEventListener("mousemove",arguments.callee,!1)});a={position:f,x:a,y:n,isClicked:l,isDown:j,clicks:d,isClickedOn:function(a){var a=Render.render(a),c=Elm.Input(!1);b(a,"click",function(){Dispatcher.notify(c.id,!0);Dispatcher.notify(c.id,!1)});return Value.Tuple(g(a),c)}};var e=Elm.Input(Value.Tuple(window.innerWidth,window.innerHeight));e.defaultNumberOfKids=2;n=Elm.Lift(function(a){return a[1]},[e]);n.defaultNumberOfKids=
73+0;var u=Elm.Lift(function(a){return a[2]},[e]);u.defaultNumberOfKids=0;b(window,"resize",function(a){var b=document.getElementById("widthChecker").offsetWidth;Dispatcher.notify(e.id,Value.Tuple(b,window.innerHeight))||this.removeEventListener("resize",arguments.callee,!1)});var n={dimensions:e,width:n,height:u},q=function(a,b){return"Nil"===b[0]?b:b[1]===a?b[2]:["Cons",b[1],q(a,b[2])]},s=Elm.Input(["Nil"]),k=Elm.Input(["Nothing"]);b(document,"keydown",function(a){var b;a:{for(b=s.value;"Nil"!==b[0];){if(b[1]===
74+a.keyCode){b=!0;break a}b=b[2]}b=!1}b||Dispatcher.notify(s.id,["Cons",a.keyCode,s.value])||this.removeEventListener("keydown",arguments.callee,!1)});b(document,"keyup",function(a){var b=q(a.keyCode,s.value);Dispatcher.notify(s.id,b)||this.removeEventListener("keyup",arguments.callee,!1)});b(window,"blur",function(a){Dispatcher.notify(s.id,["Nil"])||this.removeEventListener("blur",arguments.callee,!1)});b(document,"keypress",function(a){var b=Dispatcher.notify(k.id,["Just",a.charCode||a.keyCode]);
75+Dispatcher.notify(k.id,["Nothing"]);b||this.removeEventListener("keypress",arguments.callee,!1)});var u={Raw:{keysDown:s,charPressed:k}},m;m=function(a){return function(b){var d=Elm.Input(["Waiting"]),e={};window.XMLHttpRequest?e=new XMLHttpRequest:window.ActiveXObject&&(e=new ActiveXObject("Microsoft.XMLHTTP"));e.onreadystatechange=function(){4===e.readyState&&Dispatcher.notify(d.id,200===e.status?["Success",c(e.responseText)]:["Failure",e.status,c(e.statusText)])};e.open(a,Value.toText(b),!0);e.send(null);
76+return d}};var r=function(a){return function(b){var d=Elm.Input(["Nothing"]),b=Elm.Lift(function(b){if("Just"!==b[0]){try{Dispatcher.notify(d.id,["Nothing"])}catch(e){}return[]}try{Dispatcher.notify(d.id,["Just",["Waiting"]])}catch(g){d.value=["Just",["Waiting"]]}var f={};window.XMLHttpRequest?f=new XMLHttpRequest:window.ActiveXObject&&(f=new ActiveXObject("Microsoft.XMLHTTP"));f.onreadystatechange=function(){4===f.readyState&&Dispatcher.notify(d.id,["Just",200===f.status?["Success",c(f.responseText)]:
77+["Failure",f.status,c(f.statusText)]])};f.open(a,Value.toText(b[1]),!0);f.send(null);return[]},[b]);return Elm.Lift(function(a){return function(){return a}},[d,b])}};m={get:m("GET"),post:m("POST"),gets:r("GET"),posts:r("POST")};var v=function(a,d){a.placeholder=Foreign.JavaScript.castStringToJSString(d);var e=Elm.Input(["Nil"]);b(a,"keyup",function(){Dispatcher.notify(e.id,c(a.value));a.focus()});a.style.padding="1px";return Value.Tuple(g(a),e)},p=function(a){a=document.createElement(a);a.style.padding=
78+"0";a.style.margin="0";return a},t=function(a){for(var c=p("select"),d=[];"Cons"===a[0];){var e=p("option"),f=Text.toText(a[1][1]);e.value=f;e.innerHTML=f;c.appendChild(e);d.push(a[1][2]);a=a[2]}var h=Elm.Input(d[0]);b(c,"change",function(){Dispatcher.notify(h.id,d[c.selectedIndex])});return Value.Tuple(g(c),h)};return{addListener:b,Mouse:a,Keyboard:u,Time:{every:function(a){var a=1E3*a,b=Elm.Input(0),c=0;setInterval(function(){c+=a;Dispatcher.notify(b.id,c/1E3)},a);return b},after:function(a){var a=
79+1E3*a,b=Elm.Input(!1);setTimeout(function(){Dispatcher.notify(b.id,!0)},a);return b},before:function(a){var a=1E3*a,b=Elm.Input(!0);setTimeout(function(){Dispatcher.notify(b.id,!1)},a);return b}},Window:n,HTTP:m,Random:{inRange:function(a){return function(b){return Elm.Input(Math.floor(Math.random()*(b-a+1))+a)}},randomize:function(a){return function(b){return function(c){return Elm.Lift(function(){return Math.floor(Math.random()*(b-a+1))+a},[c])}}}},Input:{textArea:function(a){return function(b){var c=
80+p("textarea");c.rows=b;c.cols=a;return v(c,"")}},textField:function(a){var b=p("input");b.type="text";return v(b,a)},password:function(a){var b=p("input");b.type="password";return v(b,a)},checkbox:function(a){var c=p("input");c.type="checkbox";c.checked=a;var d=Elm.Input(a);b(c,"change",function(){Dispatcher.notify(d.id,c.checked)});return Value.Tuple(g(c),d)},dropDown:t,stringDropDown:function(a){return t(List.map(function(a){return Value.Tuple(a,a)})(a))},button:function(a){var c=p("input");c.type=
81+"button";c.value=Foreign.JavaScript.castStringToJSString(a);var d=Elm.Input(!1);b(c,"click",function(){Dispatcher.notify(d.id,!0);Dispatcher.notify(d.id,!1)});return Value.Tuple(g(c),d)}},constant:function(a){return Elm.Input(a)},lift:function(a){return function(b){return Elm.Lift(a,[b])}},lift2:function(a){return function(b){return function(c){return Elm.Lift(a,[b,c])}}},lift3:function(a){return function(b){return function(c){return function(d){return Elm.Lift(a,[b,c,d])}}}},lift4:function(a){return function(b){return function(c){return function(d){return function(e){return Elm.Lift(a,
82+[b,c,d,e])}}}}},foldp:function(a){return function(b){return function(c){return Elm.Fold(a,b,c)}}},foldp_:function(a){return function(b){return function(c){return Elm.Fold1(a,b,c)}}},foldp1:function(a){return function(b){return Elm.Fold1(a,function(a){return a},b)}},count:function(a){return Elm.Fold(function(){return function(a){return a+1}},0,a)},keepIf:Elm.keepIf,dropIf:Elm.dropIf,keepWhen:Elm.keepWhen,dropWhen:Elm.dropWhen,dropRepeats:Elm.dropRepeats,sampleOn:Elm.sampleOn}}(),Prelude=function(){var g=
83+function(c){return function(b){var a=c%b,a=0==c?0:0<b?0<=c?a:a+b:-g(-c)(-b);return a==b?0:a}};return{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)}},compare:function(c){return function(b){c="object"===typeof c?toText(c):c;b="object"===typeof b?toText(b):b;return[c===b?"EQ":c<b?"LT":"GT"]}},toFloat:function(c){return c},round:function(c){return Math.round(c)},
84+floor:function(c){return Math.floor(c)},ceiling:function(c){return Math.ceil(c)},truncate:function(c){return~~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,mod:g,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(a){return c(a)(b)}}},clamp:function(c){return function(b){return function(a){return Math.min(b,
85+Math.max(c,a))}}},curry:function(c){return function(b){return function(a){return c(["Tuple2",b,a])}}},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:Data.Maybe.Just,Nothing:Data.Maybe.Nothing,maybe:Data.Maybe.maybe,map:Data.List.map,filter:Data.List.filter,head:Data.List.head,tail:Data.List.tail,last:Data.List.last,length:Data.List.length,
86+reverse:Data.List.reverse,foldr:Data.List.foldr,foldr1:Data.List.foldr1,foldl:Data.List.foldl,foldl1:Data.List.foldl1,and:Data.List.and,or:Data.List.or,forall:Data.List.forall,exists:Data.List.exists,sum:Data.List.sum,product:Data.List.product,concat:Data.List.concat,concatMap:Data.List.concatMap,maximum:Data.List.maximum,minimum:Data.List.minimum,scanl:Data.List.scanl,scanl1:Data.List.scanl1,take:Data.List.take,drop:Data.List.drop,lift:Signal.lift,lift2:Signal.lift2,lift3:Signal.lift3,lift4:Signal.lift4,
87+foldp:Signal.foldp,foldp1:Signal.foldp1,foldp_:Signal.foldp_,constant:Signal.constant,count:Signal.count,keepIf:Signal.keepIf,dropIf:Signal.dropIf,keepWhen:Signal.keepWhen,dropWhen:Signal.dropWhen,dropRepeats:Signal.dropRepeats,sampleOn:Signal.sampleOn}}(),eq=Value.eq;Signal.addListener(document,"elm_log",function(g){console.log(g.value)});Signal.addListener(document,"elm_title",function(g){document.title=g.value});
88+Signal.addListener(document,"elm_redirect",function(g){0<g.value.length&&(window.location=g.value)});var includeGlobal=this;
89+(function(){var g=function(b){for(var a in b)if("Internal"!==a)try{includeGlobal[a]=b[a]}catch(c){"length"===a&&(includeGlobal.execScript("var length;"),length=b[a])}},c=function(b){return function(a){includeGlobal[b]=includeGlobal[b]||{};for(var c in a)"Internal"!==c&&(includeGlobal[b][c]=a[c])}};g(Element);g(Text);color=Element.color;height=Element.height;show=Value.show;g(ElmCode.Graphics.Color);g(ElmCode.Graphics.Element);c("Time")(Signal.Time);c("Mouse")(Signal.Mouse);c("Keyboard")(Signal.Keyboard);
90+c("Window")(Signal.Window);c("HTTP")(Signal.HTTP);c("Input")(Signal.Input);c("Random")(Signal.Random)})();ElmCode=ElmCode||{};ElmCode.Data=Data;ElmCode.Signal=Signal;ElmCode.Data.List=List;ElmCode.Foreign=Foreign;ElmCode.Prelude=Prelude;ElmCode.Graphics.Text=Text;