@@ -0,0 +1,5214 @@
1+<!DOCTYPE html>
2+<html>
3+<head>
4+<meta charset="UTF-8">
5+<meta name="viewport" content="width=device-width, initial-scale=1">
6+<title>LynxJS-Elm</title>
7+<style>
8+*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
9+body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; }
10+</style>
11+</head>
12+<body>
13+<script>
14+
15+// LynxJS PAPI-to-DOM polyfill for browser preview
16+(function() {
17+ var tagMap = {
18+ 'view': 'div',
19+ 'text': 'span',
20+ 'image': 'img',
21+ 'scroll-view': 'div',
22+ 'input': 'input',
23+ 'textarea': 'textarea',
24+ 'list': 'div'
25+ };
26+
27+ var eventMap = {
28+ 'tap': 'click',
29+ 'longpress': 'contextmenu',
30+ 'touchstart': 'touchstart',
31+ 'touchmove': 'touchmove',
32+ 'touchend': 'touchend',
33+ 'touchcancel': 'touchcancel',
34+ 'input': 'input'
35+ };
36+
37+ var g = typeof globalThis !== 'undefined' ? globalThis : window;
38+
39+ g.__CreatePage = function() {
40+ var page = document.createElement('div');
41+ page.id = 'lynx-page';
42+ document.body.appendChild(page);
43+ return page;
44+ };
45+
46+ g.__createElement = function(tag) {
47+ var domTag = tagMap[tag] || 'div';
48+ var el = document.createElement(domTag);
49+ if (tag === 'scroll-view') { el.style.overflow = 'auto'; }
50+ el.setAttribute('data-lynx-tag', tag);
51+ return el;
52+ };
53+
54+ g.__AppendElement = function(parent, child) {
55+ parent.appendChild(child);
56+ };
57+
58+ g.__RemoveElement = function(parent, child) {
59+ parent.removeChild(child);
60+ };
61+
62+ g.__ReplaceElement = function(parent, newEl, oldEl) {
63+ parent.replaceChild(newEl, oldEl);
64+ };
65+
66+ g.__InsertElementBefore = function(parent, child, ref) {
67+ parent.insertBefore(child, ref);
68+ };
69+
70+ g.__SetAttribute = function(el, key, value) {
71+ if (key === 'content' && el.getAttribute('data-lynx-tag') === 'text') {
72+ el.textContent = value;
73+ } else if (key === 'src' && el.tagName === 'IMG') {
74+ el.src = value;
75+ } else {
76+ el.setAttribute(key, value);
77+ }
78+ };
79+
80+ g.__AddEvent = function(el, bindingName, eventName, callback) {
81+ var domEvent = eventMap[eventName] || eventName;
82+ el.addEventListener(domEvent, function(e) {
83+ callback(e);
84+ });
85+ };
86+
87+ g.__SetInlineStyles = function(el, styles) {
88+ Object.assign(el.style, styles);
89+ };
90+
91+ g.__AddInlineStyle = function(el, key, value) {
92+ el.style[key] = value;
93+ };
94+
95+ g.__GetChildren = function(el) {
96+ return Array.from(el.children);
97+ };
98+
99+ g.__GetParent = function(el) {
100+ return el.parentNode;
101+ };
102+})();
103+
104+</script>
105+<script>
106+(function(scope){
107+'use strict';
108+
109+function F(arity, fun, wrapper) {
110+ wrapper.a = arity;
111+ wrapper.f = fun;
112+ return wrapper;
113+}
114+
115+function F2(fun) {
116+ return F(2, fun, function(a) { return function(b) { return fun(a,b); }; })
117+}
118+function F3(fun) {
119+ return F(3, fun, function(a) {
120+ return function(b) { return function(c) { return fun(a, b, c); }; };
121+ });
122+}
123+function F4(fun) {
124+ return F(4, fun, function(a) { return function(b) { return function(c) {
125+ return function(d) { return fun(a, b, c, d); }; }; };
126+ });
127+}
128+function F5(fun) {
129+ return F(5, fun, function(a) { return function(b) { return function(c) {
130+ return function(d) { return function(e) { return fun(a, b, c, d, e); }; }; }; };
131+ });
132+}
133+function F6(fun) {
134+ return F(6, fun, function(a) { return function(b) { return function(c) {
135+ return function(d) { return function(e) { return function(f) {
136+ return fun(a, b, c, d, e, f); }; }; }; }; };
137+ });
138+}
139+function F7(fun) {
140+ return F(7, fun, function(a) { return function(b) { return function(c) {
141+ return function(d) { return function(e) { return function(f) {
142+ return function(g) { return fun(a, b, c, d, e, f, g); }; }; }; }; }; };
143+ });
144+}
145+function F8(fun) {
146+ return F(8, fun, function(a) { return function(b) { return function(c) {
147+ return function(d) { return function(e) { return function(f) {
148+ return function(g) { return function(h) {
149+ return fun(a, b, c, d, e, f, g, h); }; }; }; }; }; }; };
150+ });
151+}
152+function F9(fun) {
153+ return F(9, fun, function(a) { return function(b) { return function(c) {
154+ return function(d) { return function(e) { return function(f) {
155+ return function(g) { return function(h) { return function(i) {
156+ return fun(a, b, c, d, e, f, g, h, i); }; }; }; }; }; }; }; };
157+ });
158+}
159+
160+function A2(fun, a, b) {
161+ return fun.a === 2 ? fun.f(a, b) : fun(a)(b);
162+}
163+function A3(fun, a, b, c) {
164+ return fun.a === 3 ? fun.f(a, b, c) : fun(a)(b)(c);
165+}
166+function A4(fun, a, b, c, d) {
167+ return fun.a === 4 ? fun.f(a, b, c, d) : fun(a)(b)(c)(d);
168+}
169+function A5(fun, a, b, c, d, e) {
170+ return fun.a === 5 ? fun.f(a, b, c, d, e) : fun(a)(b)(c)(d)(e);
171+}
172+function A6(fun, a, b, c, d, e, f) {
173+ return fun.a === 6 ? fun.f(a, b, c, d, e, f) : fun(a)(b)(c)(d)(e)(f);
174+}
175+function A7(fun, a, b, c, d, e, f, g) {
176+ return fun.a === 7 ? fun.f(a, b, c, d, e, f, g) : fun(a)(b)(c)(d)(e)(f)(g);
177+}
178+function A8(fun, a, b, c, d, e, f, g, h) {
179+ return fun.a === 8 ? fun.f(a, b, c, d, e, f, g, h) : fun(a)(b)(c)(d)(e)(f)(g)(h);
180+}
181+function A9(fun, a, b, c, d, e, f, g, h, i) {
182+ return fun.a === 9 ? fun.f(a, b, c, d, e, f, g, h, i) : fun(a)(b)(c)(d)(e)(f)(g)(h)(i);
183+}
184+
185+console.warn('Compiled in DEV mode. Follow the advice at https://elm-lang.org/0.19.1/optimize for better performance and smaller assets.');
186+
187+
188+var _JsArray_empty = [];
189+
190+function _JsArray_singleton(value)
191+{
192+ return [value];
193+}
194+
195+function _JsArray_length(array)
196+{
197+ return array.length;
198+}
199+
200+var _JsArray_initialize = F3(function(size, offset, func)
201+{
202+ var result = new Array(size);
203+
204+ for (var i = 0; i < size; i++)
205+ {
206+ result[i] = func(offset + i);
207+ }
208+
209+ return result;
210+});
211+
212+var _JsArray_initializeFromList = F2(function (max, ls)
213+{
214+ var result = new Array(max);
215+
216+ for (var i = 0; i < max && ls.b; i++)
217+ {
218+ result[i] = ls.a;
219+ ls = ls.b;
220+ }
221+
222+ result.length = i;
223+ return _Utils_Tuple2(result, ls);
224+});
225+
226+var _JsArray_unsafeGet = F2(function(index, array)
227+{
228+ return array[index];
229+});
230+
231+var _JsArray_unsafeSet = F3(function(index, value, array)
232+{
233+ var length = array.length;
234+ var result = new Array(length);
235+
236+ for (var i = 0; i < length; i++)
237+ {
238+ result[i] = array[i];
239+ }
240+
241+ result[index] = value;
242+ return result;
243+});
244+
245+var _JsArray_push = F2(function(value, array)
246+{
247+ var length = array.length;
248+ var result = new Array(length + 1);
249+
250+ for (var i = 0; i < length; i++)
251+ {
252+ result[i] = array[i];
253+ }
254+
255+ result[length] = value;
256+ return result;
257+});
258+
259+var _JsArray_foldl = F3(function(func, acc, array)
260+{
261+ var length = array.length;
262+
263+ for (var i = 0; i < length; i++)
264+ {
265+ acc = A2(func, array[i], acc);
266+ }
267+
268+ return acc;
269+});
270+
271+var _JsArray_foldr = F3(function(func, acc, array)
272+{
273+ for (var i = array.length - 1; i >= 0; i--)
274+ {
275+ acc = A2(func, array[i], acc);
276+ }
277+
278+ return acc;
279+});
280+
281+var _JsArray_map = F2(function(func, array)
282+{
283+ var length = array.length;
284+ var result = new Array(length);
285+
286+ for (var i = 0; i < length; i++)
287+ {
288+ result[i] = func(array[i]);
289+ }
290+
291+ return result;
292+});
293+
294+var _JsArray_indexedMap = F3(function(func, offset, array)
295+{
296+ var length = array.length;
297+ var result = new Array(length);
298+
299+ for (var i = 0; i < length; i++)
300+ {
301+ result[i] = A2(func, offset + i, array[i]);
302+ }
303+
304+ return result;
305+});
306+
307+var _JsArray_slice = F3(function(from, to, array)
308+{
309+ return array.slice(from, to);
310+});
311+
312+var _JsArray_appendN = F3(function(n, dest, source)
313+{
314+ var destLen = dest.length;
315+ var itemsToCopy = n - destLen;
316+
317+ if (itemsToCopy > source.length)
318+ {
319+ itemsToCopy = source.length;
320+ }
321+
322+ var size = destLen + itemsToCopy;
323+ var result = new Array(size);
324+
325+ for (var i = 0; i < destLen; i++)
326+ {
327+ result[i] = dest[i];
328+ }
329+
330+ for (var i = 0; i < itemsToCopy; i++)
331+ {
332+ result[i + destLen] = source[i];
333+ }
334+
335+ return result;
336+});
337+
338+
339+
340+// LOG
341+
342+var _Debug_log_UNUSED = F2(function(tag, value)
343+{
344+ return value;
345+});
346+
347+var _Debug_log = F2(function(tag, value)
348+{
349+ console.log(tag + ': ' + _Debug_toString(value));
350+ return value;
351+});
352+
353+
354+// TODOS
355+
356+function _Debug_todo(moduleName, region)
357+{
358+ return function(message) {
359+ _Debug_crash(8, moduleName, region, message);
360+ };
361+}
362+
363+function _Debug_todoCase(moduleName, region, value)
364+{
365+ return function(message) {
366+ _Debug_crash(9, moduleName, region, value, message);
367+ };
368+}
369+
370+
371+// TO STRING
372+
373+function _Debug_toString_UNUSED(value)
374+{
375+ return '<internals>';
376+}
377+
378+function _Debug_toString(value)
379+{
380+ return _Debug_toAnsiString(false, value);
381+}
382+
383+function _Debug_toAnsiString(ansi, value)
384+{
385+ if (typeof value === 'function')
386+ {
387+ return _Debug_internalColor(ansi, '<function>');
388+ }
389+
390+ if (typeof value === 'boolean')
391+ {
392+ return _Debug_ctorColor(ansi, value ? 'True' : 'False');
393+ }
394+
395+ if (typeof value === 'number')
396+ {
397+ return _Debug_numberColor(ansi, value + '');
398+ }
399+
400+ if (value instanceof String)
401+ {
402+ return _Debug_charColor(ansi, "'" + _Debug_addSlashes(value, true) + "'");
403+ }
404+
405+ if (typeof value === 'string')
406+ {
407+ return _Debug_stringColor(ansi, '"' + _Debug_addSlashes(value, false) + '"');
408+ }
409+
410+ if (typeof value === 'object' && '$' in value)
411+ {
412+ var tag = value.$;
413+
414+ if (typeof tag === 'number')
415+ {
416+ return _Debug_internalColor(ansi, '<internals>');
417+ }
418+
419+ if (tag[0] === '#')
420+ {
421+ var output = [];
422+ for (var k in value)
423+ {
424+ if (k === '$') continue;
425+ output.push(_Debug_toAnsiString(ansi, value[k]));
426+ }
427+ return '(' + output.join(',') + ')';
428+ }
429+
430+ if (tag === 'Set_elm_builtin')
431+ {
432+ return _Debug_ctorColor(ansi, 'Set')
433+ + _Debug_fadeColor(ansi, '.fromList') + ' '
434+ + _Debug_toAnsiString(ansi, $elm$core$Set$toList(value));
435+ }
436+
437+ if (tag === 'RBNode_elm_builtin' || tag === 'RBEmpty_elm_builtin')
438+ {
439+ return _Debug_ctorColor(ansi, 'Dict')
440+ + _Debug_fadeColor(ansi, '.fromList') + ' '
441+ + _Debug_toAnsiString(ansi, $elm$core$Dict$toList(value));
442+ }
443+
444+ if (tag === 'Array_elm_builtin')
445+ {
446+ return _Debug_ctorColor(ansi, 'Array')
447+ + _Debug_fadeColor(ansi, '.fromList') + ' '
448+ + _Debug_toAnsiString(ansi, $elm$core$Array$toList(value));
449+ }
450+
451+ if (tag === '::' || tag === '[]')
452+ {
453+ var output = '[';
454+
455+ value.b && (output += _Debug_toAnsiString(ansi, value.a), value = value.b)
456+
457+ for (; value.b; value = value.b) // WHILE_CONS
458+ {
459+ output += ',' + _Debug_toAnsiString(ansi, value.a);
460+ }
461+ return output + ']';
462+ }
463+
464+ var output = '';
465+ for (var i in value)
466+ {
467+ if (i === '$') continue;
468+ var str = _Debug_toAnsiString(ansi, value[i]);
469+ var c0 = str[0];
470+ var parenless = c0 === '{' || c0 === '(' || c0 === '[' || c0 === '<' || c0 === '"' || str.indexOf(' ') < 0;
471+ output += ' ' + (parenless ? str : '(' + str + ')');
472+ }
473+ return _Debug_ctorColor(ansi, tag) + output;
474+ }
475+
476+ if (typeof DataView === 'function' && value instanceof DataView)
477+ {
478+ return _Debug_stringColor(ansi, '<' + value.byteLength + ' bytes>');
479+ }
480+
481+ if (typeof File !== 'undefined' && value instanceof File)
482+ {
483+ return _Debug_internalColor(ansi, '<' + value.name + '>');
484+ }
485+
486+ if (typeof value === 'object')
487+ {
488+ var output = [];
489+ for (var key in value)
490+ {
491+ var field = key[0] === '_' ? key.slice(1) : key;
492+ output.push(_Debug_fadeColor(ansi, field) + ' = ' + _Debug_toAnsiString(ansi, value[key]));
493+ }
494+ if (output.length === 0)
495+ {
496+ return '{}';
497+ }
498+ return '{ ' + output.join(', ') + ' }';
499+ }
500+
501+ return _Debug_internalColor(ansi, '<internals>');
502+}
503+
504+function _Debug_addSlashes(str, isChar)
505+{
506+ var s = str
507+ .replace(/\\/g, '\\\\')
508+ .replace(/\n/g, '\\n')
509+ .replace(/\t/g, '\\t')
510+ .replace(/\r/g, '\\r')
511+ .replace(/\v/g, '\\v')
512+ .replace(/\0/g, '\\0');
513+
514+ if (isChar)
515+ {
516+ return s.replace(/\'/g, '\\\'');
517+ }
518+ else
519+ {
520+ return s.replace(/\"/g, '\\"');
521+ }
522+}
523+
524+function _Debug_ctorColor(ansi, string)
525+{
526+ return ansi ? '\x1b[96m' + string + '\x1b[0m' : string;
527+}
528+
529+function _Debug_numberColor(ansi, string)
530+{
531+ return ansi ? '\x1b[95m' + string + '\x1b[0m' : string;
532+}
533+
534+function _Debug_stringColor(ansi, string)
535+{
536+ return ansi ? '\x1b[93m' + string + '\x1b[0m' : string;
537+}
538+
539+function _Debug_charColor(ansi, string)
540+{
541+ return ansi ? '\x1b[92m' + string + '\x1b[0m' : string;
542+}
543+
544+function _Debug_fadeColor(ansi, string)
545+{
546+ return ansi ? '\x1b[37m' + string + '\x1b[0m' : string;
547+}
548+
549+function _Debug_internalColor(ansi, string)
550+{
551+ return ansi ? '\x1b[36m' + string + '\x1b[0m' : string;
552+}
553+
554+function _Debug_toHexDigit(n)
555+{
556+ return String.fromCharCode(n < 10 ? 48 + n : 55 + n);
557+}
558+
559+
560+// CRASH
561+
562+
563+function _Debug_crash_UNUSED(identifier)
564+{
565+ throw new Error('https://github.com/elm/core/blob/1.0.0/hints/' + identifier + '.md');
566+}
567+
568+
569+function _Debug_crash(identifier, fact1, fact2, fact3, fact4)
570+{
571+ switch(identifier)
572+ {
573+ case 0:
574+ throw new Error('What node should I take over? In JavaScript I need something like:\n\n Elm.Main.init({\n node: document.getElementById("elm-node")\n })\n\nYou need to do this with any Browser.sandbox or Browser.element program.');
575+
576+ case 1:
577+ throw new Error('Browser.application programs cannot handle URLs like this:\n\n ' + document.location.href + '\n\nWhat is the root? The root of your file system? Try looking at this program with `elm reactor` or some other server.');
578+
579+ case 2:
580+ var jsonErrorString = fact1;
581+ throw new Error('Problem with the flags given to your Elm program on initialization.\n\n' + jsonErrorString);
582+
583+ case 3:
584+ var portName = fact1;
585+ throw new Error('There can only be one port named `' + portName + '`, but your program has multiple.');
586+
587+ case 4:
588+ var portName = fact1;
589+ var problem = fact2;
590+ throw new Error('Trying to send an unexpected type of value through port `' + portName + '`:\n' + problem);
591+
592+ case 5:
593+ throw new Error('Trying to use `(==)` on functions.\nThere is no way to know if functions are "the same" in the Elm sense.\nRead more about this at https://package.elm-lang.org/packages/elm/core/latest/Basics#== which describes why it is this way and what the better version will look like.');
594+
595+ case 6:
596+ var moduleName = fact1;
597+ throw new Error('Your page is loading multiple Elm scripts with a module named ' + moduleName + '. Maybe a duplicate script is getting loaded accidentally? If not, rename one of them so I know which is which!');
598+
599+ case 8:
600+ var moduleName = fact1;
601+ var region = fact2;
602+ var message = fact3;
603+ throw new Error('TODO in module `' + moduleName + '` ' + _Debug_regionToString(region) + '\n\n' + message);
604+
605+ case 9:
606+ var moduleName = fact1;
607+ var region = fact2;
608+ var value = fact3;
609+ var message = fact4;
610+ throw new Error(
611+ 'TODO in module `' + moduleName + '` from the `case` expression '
612+ + _Debug_regionToString(region) + '\n\nIt received the following value:\n\n '
613+ + _Debug_toString(value).replace('\n', '\n ')
614+ + '\n\nBut the branch that handles it says:\n\n ' + message.replace('\n', '\n ')
615+ );
616+
617+ case 10:
618+ throw new Error('Bug in https://github.com/elm/virtual-dom/issues');
619+
620+ case 11:
621+ throw new Error('Cannot perform mod 0. Division by zero error.');
622+ }
623+}
624+
625+function _Debug_regionToString(region)
626+{
627+ if (region.start.line === region.end.line)
628+ {
629+ return 'on line ' + region.start.line;
630+ }
631+ return 'on lines ' + region.start.line + ' through ' + region.end.line;
632+}
633+
634+
635+
636+// EQUALITY
637+
638+function _Utils_eq(x, y)
639+{
640+ for (
641+ var pair, stack = [], isEqual = _Utils_eqHelp(x, y, 0, stack);
642+ isEqual && (pair = stack.pop());
643+ isEqual = _Utils_eqHelp(pair.a, pair.b, 0, stack)
644+ )
645+ {}
646+
647+ return isEqual;
648+}
649+
650+function _Utils_eqHelp(x, y, depth, stack)
651+{
652+ if (x === y)
653+ {
654+ return true;
655+ }
656+
657+ if (typeof x !== 'object' || x === null || y === null)
658+ {
659+ typeof x === 'function' && _Debug_crash(5);
660+ return false;
661+ }
662+
663+ if (depth > 100)
664+ {
665+ stack.push(_Utils_Tuple2(x,y));
666+ return true;
667+ }
668+
669+ /**/
670+ if (x.$ === 'Set_elm_builtin')
671+ {
672+ x = $elm$core$Set$toList(x);
673+ y = $elm$core$Set$toList(y);
674+ }
675+ if (x.$ === 'RBNode_elm_builtin' || x.$ === 'RBEmpty_elm_builtin')
676+ {
677+ x = $elm$core$Dict$toList(x);
678+ y = $elm$core$Dict$toList(y);
679+ }
680+ //*/
681+
682+ /**_UNUSED/
683+ if (x.$ < 0)
684+ {
685+ x = $elm$core$Dict$toList(x);
686+ y = $elm$core$Dict$toList(y);
687+ }
688+ //*/
689+
690+ for (var key in x)
691+ {
692+ if (!_Utils_eqHelp(x[key], y[key], depth + 1, stack))
693+ {
694+ return false;
695+ }
696+ }
697+ return true;
698+}
699+
700+var _Utils_equal = F2(_Utils_eq);
701+var _Utils_notEqual = F2(function(a, b) { return !_Utils_eq(a,b); });
702+
703+
704+
705+// COMPARISONS
706+
707+// Code in Generate/JavaScript.hs, Basics.js, and List.js depends on
708+// the particular integer values assigned to LT, EQ, and GT.
709+
710+function _Utils_cmp(x, y, ord)
711+{
712+ if (typeof x !== 'object')
713+ {
714+ return x === y ? /*EQ*/ 0 : x < y ? /*LT*/ -1 : /*GT*/ 1;
715+ }
716+
717+ /**/
718+ if (x instanceof String)
719+ {
720+ var a = x.valueOf();
721+ var b = y.valueOf();
722+ return a === b ? 0 : a < b ? -1 : 1;
723+ }
724+ //*/
725+
726+ /**_UNUSED/
727+ if (typeof x.$ === 'undefined')
728+ //*/
729+ /**/
730+ if (x.$[0] === '#')
731+ //*/
732+ {
733+ return (ord = _Utils_cmp(x.a, y.a))
734+ ? ord
735+ : (ord = _Utils_cmp(x.b, y.b))
736+ ? ord
737+ : _Utils_cmp(x.c, y.c);
738+ }
739+
740+ // traverse conses until end of a list or a mismatch
741+ for (; x.b && y.b && !(ord = _Utils_cmp(x.a, y.a)); x = x.b, y = y.b) {} // WHILE_CONSES
742+ return ord || (x.b ? /*GT*/ 1 : y.b ? /*LT*/ -1 : /*EQ*/ 0);
743+}
744+
745+var _Utils_lt = F2(function(a, b) { return _Utils_cmp(a, b) < 0; });
746+var _Utils_le = F2(function(a, b) { return _Utils_cmp(a, b) < 1; });
747+var _Utils_gt = F2(function(a, b) { return _Utils_cmp(a, b) > 0; });
748+var _Utils_ge = F2(function(a, b) { return _Utils_cmp(a, b) >= 0; });
749+
750+var _Utils_compare = F2(function(x, y)
751+{
752+ var n = _Utils_cmp(x, y);
753+ return n < 0 ? $elm$core$Basics$LT : n ? $elm$core$Basics$GT : $elm$core$Basics$EQ;
754+});
755+
756+
757+// COMMON VALUES
758+
759+var _Utils_Tuple0_UNUSED = 0;
760+var _Utils_Tuple0 = { $: '#0' };
761+
762+function _Utils_Tuple2_UNUSED(a, b) { return { a: a, b: b }; }
763+function _Utils_Tuple2(a, b) { return { $: '#2', a: a, b: b }; }
764+
765+function _Utils_Tuple3_UNUSED(a, b, c) { return { a: a, b: b, c: c }; }
766+function _Utils_Tuple3(a, b, c) { return { $: '#3', a: a, b: b, c: c }; }
767+
768+function _Utils_chr_UNUSED(c) { return c; }
769+function _Utils_chr(c) { return new String(c); }
770+
771+
772+// RECORDS
773+
774+function _Utils_update(oldRecord, updatedFields)
775+{
776+ var newRecord = {};
777+
778+ for (var key in oldRecord)
779+ {
780+ newRecord[key] = oldRecord[key];
781+ }
782+
783+ for (var key in updatedFields)
784+ {
785+ newRecord[key] = updatedFields[key];
786+ }
787+
788+ return newRecord;
789+}
790+
791+
792+// APPEND
793+
794+var _Utils_append = F2(_Utils_ap);
795+
796+function _Utils_ap(xs, ys)
797+{
798+ // append Strings
799+ if (typeof xs === 'string')
800+ {
801+ return xs + ys;
802+ }
803+
804+ // append Lists
805+ if (!xs.b)
806+ {
807+ return ys;
808+ }
809+ var root = _List_Cons(xs.a, ys);
810+ xs = xs.b
811+ for (var curr = root; xs.b; xs = xs.b) // WHILE_CONS
812+ {
813+ curr = curr.b = _List_Cons(xs.a, ys);
814+ }
815+ return root;
816+}
817+
818+
819+
820+var _List_Nil_UNUSED = { $: 0 };
821+var _List_Nil = { $: '[]' };
822+
823+function _List_Cons_UNUSED(hd, tl) { return { $: 1, a: hd, b: tl }; }
824+function _List_Cons(hd, tl) { return { $: '::', a: hd, b: tl }; }
825+
826+
827+var _List_cons = F2(_List_Cons);
828+
829+function _List_fromArray(arr)
830+{
831+ var out = _List_Nil;
832+ for (var i = arr.length; i--; )
833+ {
834+ out = _List_Cons(arr[i], out);
835+ }
836+ return out;
837+}
838+
839+function _List_toArray(xs)
840+{
841+ for (var out = []; xs.b; xs = xs.b) // WHILE_CONS
842+ {
843+ out.push(xs.a);
844+ }
845+ return out;
846+}
847+
848+var _List_map2 = F3(function(f, xs, ys)
849+{
850+ for (var arr = []; xs.b && ys.b; xs = xs.b, ys = ys.b) // WHILE_CONSES
851+ {
852+ arr.push(A2(f, xs.a, ys.a));
853+ }
854+ return _List_fromArray(arr);
855+});
856+
857+var _List_map3 = F4(function(f, xs, ys, zs)
858+{
859+ for (var arr = []; xs.b && ys.b && zs.b; xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES
860+ {
861+ arr.push(A3(f, xs.a, ys.a, zs.a));
862+ }
863+ return _List_fromArray(arr);
864+});
865+
866+var _List_map4 = F5(function(f, ws, xs, ys, zs)
867+{
868+ for (var arr = []; ws.b && xs.b && ys.b && zs.b; ws = ws.b, xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES
869+ {
870+ arr.push(A4(f, ws.a, xs.a, ys.a, zs.a));
871+ }
872+ return _List_fromArray(arr);
873+});
874+
875+var _List_map5 = F6(function(f, vs, ws, xs, ys, zs)
876+{
877+ for (var arr = []; vs.b && ws.b && xs.b && ys.b && zs.b; vs = vs.b, ws = ws.b, xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES
878+ {
879+ arr.push(A5(f, vs.a, ws.a, xs.a, ys.a, zs.a));
880+ }
881+ return _List_fromArray(arr);
882+});
883+
884+var _List_sortBy = F2(function(f, xs)
885+{
886+ return _List_fromArray(_List_toArray(xs).sort(function(a, b) {
887+ return _Utils_cmp(f(a), f(b));
888+ }));
889+});
890+
891+var _List_sortWith = F2(function(f, xs)
892+{
893+ return _List_fromArray(_List_toArray(xs).sort(function(a, b) {
894+ var ord = A2(f, a, b);
895+ return ord === $elm$core$Basics$EQ ? 0 : ord === $elm$core$Basics$LT ? -1 : 1;
896+ }));
897+});
898+
899+
900+
901+// MATH
902+
903+var _Basics_add = F2(function(a, b) { return a + b; });
904+var _Basics_sub = F2(function(a, b) { return a - b; });
905+var _Basics_mul = F2(function(a, b) { return a * b; });
906+var _Basics_fdiv = F2(function(a, b) { return a / b; });
907+var _Basics_idiv = F2(function(a, b) { return (a / b) | 0; });
908+var _Basics_pow = F2(Math.pow);
909+
910+var _Basics_remainderBy = F2(function(b, a) { return a % b; });
911+
912+// https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/divmodnote-letter.pdf
913+var _Basics_modBy = F2(function(modulus, x)
914+{
915+ var answer = x % modulus;
916+ return modulus === 0
917+ ? _Debug_crash(11)
918+ :
919+ ((answer > 0 && modulus < 0) || (answer < 0 && modulus > 0))
920+ ? answer + modulus
921+ : answer;
922+});
923+
924+
925+// TRIGONOMETRY
926+
927+var _Basics_pi = Math.PI;
928+var _Basics_e = Math.E;
929+var _Basics_cos = Math.cos;
930+var _Basics_sin = Math.sin;
931+var _Basics_tan = Math.tan;
932+var _Basics_acos = Math.acos;
933+var _Basics_asin = Math.asin;
934+var _Basics_atan = Math.atan;
935+var _Basics_atan2 = F2(Math.atan2);
936+
937+
938+// MORE MATH
939+
940+function _Basics_toFloat(x) { return x; }
941+function _Basics_truncate(n) { return n | 0; }
942+function _Basics_isInfinite(n) { return n === Infinity || n === -Infinity; }
943+
944+var _Basics_ceiling = Math.ceil;
945+var _Basics_floor = Math.floor;
946+var _Basics_round = Math.round;
947+var _Basics_sqrt = Math.sqrt;
948+var _Basics_log = Math.log;
949+var _Basics_isNaN = isNaN;
950+
951+
952+// BOOLEANS
953+
954+function _Basics_not(bool) { return !bool; }
955+var _Basics_and = F2(function(a, b) { return a && b; });
956+var _Basics_or = F2(function(a, b) { return a || b; });
957+var _Basics_xor = F2(function(a, b) { return a !== b; });
958+
959+
960+
961+var _String_cons = F2(function(chr, str)
962+{
963+ return chr + str;
964+});
965+
966+function _String_uncons(string)
967+{
968+ var word = string.charCodeAt(0);
969+ return !isNaN(word)
970+ ? $elm$core$Maybe$Just(
971+ 0xD800 <= word && word <= 0xDBFF
972+ ? _Utils_Tuple2(_Utils_chr(string[0] + string[1]), string.slice(2))
973+ : _Utils_Tuple2(_Utils_chr(string[0]), string.slice(1))
974+ )
975+ : $elm$core$Maybe$Nothing;
976+}
977+
978+var _String_append = F2(function(a, b)
979+{
980+ return a + b;
981+});
982+
983+function _String_length(str)
984+{
985+ return str.length;
986+}
987+
988+var _String_map = F2(function(func, string)
989+{
990+ var len = string.length;
991+ var array = new Array(len);
992+ var i = 0;
993+ while (i < len)
994+ {
995+ var word = string.charCodeAt(i);
996+ if (0xD800 <= word && word <= 0xDBFF)
997+ {
998+ array[i] = func(_Utils_chr(string[i] + string[i+1]));
999+ i += 2;
1000+ continue;
1001+ }
1002+ array[i] = func(_Utils_chr(string[i]));
1003+ i++;
1004+ }
1005+ return array.join('');
1006+});
1007+
1008+var _String_filter = F2(function(isGood, str)
1009+{
1010+ var arr = [];
1011+ var len = str.length;
1012+ var i = 0;
1013+ while (i < len)
1014+ {
1015+ var char = str[i];
1016+ var word = str.charCodeAt(i);
1017+ i++;
1018+ if (0xD800 <= word && word <= 0xDBFF)
1019+ {
1020+ char += str[i];
1021+ i++;
1022+ }
1023+
1024+ if (isGood(_Utils_chr(char)))
1025+ {
1026+ arr.push(char);
1027+ }
1028+ }
1029+ return arr.join('');
1030+});
1031+
1032+function _String_reverse(str)
1033+{
1034+ var len = str.length;
1035+ var arr = new Array(len);
1036+ var i = 0;
1037+ while (i < len)
1038+ {
1039+ var word = str.charCodeAt(i);
1040+ if (0xD800 <= word && word <= 0xDBFF)
1041+ {
1042+ arr[len - i] = str[i + 1];
1043+ i++;
1044+ arr[len - i] = str[i - 1];
1045+ i++;
1046+ }
1047+ else
1048+ {
1049+ arr[len - i] = str[i];
1050+ i++;
1051+ }
1052+ }
1053+ return arr.join('');
1054+}
1055+
1056+var _String_foldl = F3(function(func, state, string)
1057+{
1058+ var len = string.length;
1059+ var i = 0;
1060+ while (i < len)
1061+ {
1062+ var char = string[i];
1063+ var word = string.charCodeAt(i);
1064+ i++;
1065+ if (0xD800 <= word && word <= 0xDBFF)
1066+ {
1067+ char += string[i];
1068+ i++;
1069+ }
1070+ state = A2(func, _Utils_chr(char), state);
1071+ }
1072+ return state;
1073+});
1074+
1075+var _String_foldr = F3(function(func, state, string)
1076+{
1077+ var i = string.length;
1078+ while (i--)
1079+ {
1080+ var char = string[i];
1081+ var word = string.charCodeAt(i);
1082+ if (0xDC00 <= word && word <= 0xDFFF)
1083+ {
1084+ i--;
1085+ char = string[i] + char;
1086+ }
1087+ state = A2(func, _Utils_chr(char), state);
1088+ }
1089+ return state;
1090+});
1091+
1092+var _String_split = F2(function(sep, str)
1093+{
1094+ return str.split(sep);
1095+});
1096+
1097+var _String_join = F2(function(sep, strs)
1098+{
1099+ return strs.join(sep);
1100+});
1101+
1102+var _String_slice = F3(function(start, end, str) {
1103+ return str.slice(start, end);
1104+});
1105+
1106+function _String_trim(str)
1107+{
1108+ return str.trim();
1109+}
1110+
1111+function _String_trimLeft(str)
1112+{
1113+ return str.replace(/^\s+/, '');
1114+}
1115+
1116+function _String_trimRight(str)
1117+{
1118+ return str.replace(/\s+$/, '');
1119+}
1120+
1121+function _String_words(str)
1122+{
1123+ return _List_fromArray(str.trim().split(/\s+/g));
1124+}
1125+
1126+function _String_lines(str)
1127+{
1128+ return _List_fromArray(str.split(/\r\n|\r|\n/g));
1129+}
1130+
1131+function _String_toUpper(str)
1132+{
1133+ return str.toUpperCase();
1134+}
1135+
1136+function _String_toLower(str)
1137+{
1138+ return str.toLowerCase();
1139+}
1140+
1141+var _String_any = F2(function(isGood, string)
1142+{
1143+ var i = string.length;
1144+ while (i--)
1145+ {
1146+ var char = string[i];
1147+ var word = string.charCodeAt(i);
1148+ if (0xDC00 <= word && word <= 0xDFFF)
1149+ {
1150+ i--;
1151+ char = string[i] + char;
1152+ }
1153+ if (isGood(_Utils_chr(char)))
1154+ {
1155+ return true;
1156+ }
1157+ }
1158+ return false;
1159+});
1160+
1161+var _String_all = F2(function(isGood, string)
1162+{
1163+ var i = string.length;
1164+ while (i--)
1165+ {
1166+ var char = string[i];
1167+ var word = string.charCodeAt(i);
1168+ if (0xDC00 <= word && word <= 0xDFFF)
1169+ {
1170+ i--;
1171+ char = string[i] + char;
1172+ }
1173+ if (!isGood(_Utils_chr(char)))
1174+ {
1175+ return false;
1176+ }
1177+ }
1178+ return true;
1179+});
1180+
1181+var _String_contains = F2(function(sub, str)
1182+{
1183+ return str.indexOf(sub) > -1;
1184+});
1185+
1186+var _String_startsWith = F2(function(sub, str)
1187+{
1188+ return str.indexOf(sub) === 0;
1189+});
1190+
1191+var _String_endsWith = F2(function(sub, str)
1192+{
1193+ return str.length >= sub.length &&
1194+ str.lastIndexOf(sub) === str.length - sub.length;
1195+});
1196+
1197+var _String_indexes = F2(function(sub, str)
1198+{
1199+ var subLen = sub.length;
1200+
1201+ if (subLen < 1)
1202+ {
1203+ return _List_Nil;
1204+ }
1205+
1206+ var i = 0;
1207+ var is = [];
1208+
1209+ while ((i = str.indexOf(sub, i)) > -1)
1210+ {
1211+ is.push(i);
1212+ i = i + subLen;
1213+ }
1214+
1215+ return _List_fromArray(is);
1216+});
1217+
1218+
1219+// TO STRING
1220+
1221+function _String_fromNumber(number)
1222+{
1223+ return number + '';
1224+}
1225+
1226+
1227+// INT CONVERSIONS
1228+
1229+function _String_toInt(str)
1230+{
1231+ var total = 0;
1232+ var code0 = str.charCodeAt(0);
1233+ var start = code0 == 0x2B /* + */ || code0 == 0x2D /* - */ ? 1 : 0;
1234+
1235+ for (var i = start; i < str.length; ++i)
1236+ {
1237+ var code = str.charCodeAt(i);
1238+ if (code < 0x30 || 0x39 < code)
1239+ {
1240+ return $elm$core$Maybe$Nothing;
1241+ }
1242+ total = 10 * total + code - 0x30;
1243+ }
1244+
1245+ return i == start
1246+ ? $elm$core$Maybe$Nothing
1247+ : $elm$core$Maybe$Just(code0 == 0x2D ? -total : total);
1248+}
1249+
1250+
1251+// FLOAT CONVERSIONS
1252+
1253+function _String_toFloat(s)
1254+{
1255+ // check if it is a hex, octal, or binary number
1256+ if (s.length === 0 || /[\sxbo]/.test(s))
1257+ {
1258+ return $elm$core$Maybe$Nothing;
1259+ }
1260+ var n = +s;
1261+ // faster isNaN check
1262+ return n === n ? $elm$core$Maybe$Just(n) : $elm$core$Maybe$Nothing;
1263+}
1264+
1265+function _String_fromList(chars)
1266+{
1267+ return _List_toArray(chars).join('');
1268+}
1269+
1270+
1271+
1272+
1273+function _Char_toCode(char)
1274+{
1275+ var code = char.charCodeAt(0);
1276+ if (0xD800 <= code && code <= 0xDBFF)
1277+ {
1278+ return (code - 0xD800) * 0x400 + char.charCodeAt(1) - 0xDC00 + 0x10000
1279+ }
1280+ return code;
1281+}
1282+
1283+function _Char_fromCode(code)
1284+{
1285+ return _Utils_chr(
1286+ (code < 0 || 0x10FFFF < code)
1287+ ? '\uFFFD'
1288+ :
1289+ (code <= 0xFFFF)
1290+ ? String.fromCharCode(code)
1291+ :
1292+ (code -= 0x10000,
1293+ String.fromCharCode(Math.floor(code / 0x400) + 0xD800, code % 0x400 + 0xDC00)
1294+ )
1295+ );
1296+}
1297+
1298+function _Char_toUpper(char)
1299+{
1300+ return _Utils_chr(char.toUpperCase());
1301+}
1302+
1303+function _Char_toLower(char)
1304+{
1305+ return _Utils_chr(char.toLowerCase());
1306+}
1307+
1308+function _Char_toLocaleUpper(char)
1309+{
1310+ return _Utils_chr(char.toLocaleUpperCase());
1311+}
1312+
1313+function _Char_toLocaleLower(char)
1314+{
1315+ return _Utils_chr(char.toLocaleLowerCase());
1316+}
1317+
1318+
1319+
1320+/**/
1321+function _Json_errorToString(error)
1322+{
1323+ return $elm$json$Json$Decode$errorToString(error);
1324+}
1325+//*/
1326+
1327+
1328+// CORE DECODERS
1329+
1330+function _Json_succeed(msg)
1331+{
1332+ return {
1333+ $: 0,
1334+ a: msg
1335+ };
1336+}
1337+
1338+function _Json_fail(msg)
1339+{
1340+ return {
1341+ $: 1,
1342+ a: msg
1343+ };
1344+}
1345+
1346+function _Json_decodePrim(decoder)
1347+{
1348+ return { $: 2, b: decoder };
1349+}
1350+
1351+var _Json_decodeInt = _Json_decodePrim(function(value) {
1352+ return (typeof value !== 'number')
1353+ ? _Json_expecting('an INT', value)
1354+ :
1355+ (-2147483647 < value && value < 2147483647 && (value | 0) === value)
1356+ ? $elm$core$Result$Ok(value)
1357+ :
1358+ (isFinite(value) && !(value % 1))
1359+ ? $elm$core$Result$Ok(value)
1360+ : _Json_expecting('an INT', value);
1361+});
1362+
1363+var _Json_decodeBool = _Json_decodePrim(function(value) {
1364+ return (typeof value === 'boolean')
1365+ ? $elm$core$Result$Ok(value)
1366+ : _Json_expecting('a BOOL', value);
1367+});
1368+
1369+var _Json_decodeFloat = _Json_decodePrim(function(value) {
1370+ return (typeof value === 'number')
1371+ ? $elm$core$Result$Ok(value)
1372+ : _Json_expecting('a FLOAT', value);
1373+});
1374+
1375+var _Json_decodeValue = _Json_decodePrim(function(value) {
1376+ return $elm$core$Result$Ok(_Json_wrap(value));
1377+});
1378+
1379+var _Json_decodeString = _Json_decodePrim(function(value) {
1380+ return (typeof value === 'string')
1381+ ? $elm$core$Result$Ok(value)
1382+ : (value instanceof String)
1383+ ? $elm$core$Result$Ok(value + '')
1384+ : _Json_expecting('a STRING', value);
1385+});
1386+
1387+function _Json_decodeList(decoder) { return { $: 3, b: decoder }; }
1388+function _Json_decodeArray(decoder) { return { $: 4, b: decoder }; }
1389+
1390+function _Json_decodeNull(value) { return { $: 5, c: value }; }
1391+
1392+var _Json_decodeField = F2(function(field, decoder)
1393+{
1394+ return {
1395+ $: 6,
1396+ d: field,
1397+ b: decoder
1398+ };
1399+});
1400+
1401+var _Json_decodeIndex = F2(function(index, decoder)
1402+{
1403+ return {
1404+ $: 7,
1405+ e: index,
1406+ b: decoder
1407+ };
1408+});
1409+
1410+function _Json_decodeKeyValuePairs(decoder)
1411+{
1412+ return {
1413+ $: 8,
1414+ b: decoder
1415+ };
1416+}
1417+
1418+function _Json_mapMany(f, decoders)
1419+{
1420+ return {
1421+ $: 9,
1422+ f: f,
1423+ g: decoders
1424+ };
1425+}
1426+
1427+var _Json_andThen = F2(function(callback, decoder)
1428+{
1429+ return {
1430+ $: 10,
1431+ b: decoder,
1432+ h: callback
1433+ };
1434+});
1435+
1436+function _Json_oneOf(decoders)
1437+{
1438+ return {
1439+ $: 11,
1440+ g: decoders
1441+ };
1442+}
1443+
1444+
1445+// DECODING OBJECTS
1446+
1447+var _Json_map1 = F2(function(f, d1)
1448+{
1449+ return _Json_mapMany(f, [d1]);
1450+});
1451+
1452+var _Json_map2 = F3(function(f, d1, d2)
1453+{
1454+ return _Json_mapMany(f, [d1, d2]);
1455+});
1456+
1457+var _Json_map3 = F4(function(f, d1, d2, d3)
1458+{
1459+ return _Json_mapMany(f, [d1, d2, d3]);
1460+});
1461+
1462+var _Json_map4 = F5(function(f, d1, d2, d3, d4)
1463+{
1464+ return _Json_mapMany(f, [d1, d2, d3, d4]);
1465+});
1466+
1467+var _Json_map5 = F6(function(f, d1, d2, d3, d4, d5)
1468+{
1469+ return _Json_mapMany(f, [d1, d2, d3, d4, d5]);
1470+});
1471+
1472+var _Json_map6 = F7(function(f, d1, d2, d3, d4, d5, d6)
1473+{
1474+ return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6]);
1475+});
1476+
1477+var _Json_map7 = F8(function(f, d1, d2, d3, d4, d5, d6, d7)
1478+{
1479+ return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7]);
1480+});
1481+
1482+var _Json_map8 = F9(function(f, d1, d2, d3, d4, d5, d6, d7, d8)
1483+{
1484+ return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7, d8]);
1485+});
1486+
1487+
1488+// DECODE
1489+
1490+var _Json_runOnString = F2(function(decoder, string)
1491+{
1492+ try
1493+ {
1494+ var value = JSON.parse(string);
1495+ return _Json_runHelp(decoder, value);
1496+ }
1497+ catch (e)
1498+ {
1499+ return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'This is not valid JSON! ' + e.message, _Json_wrap(string)));
1500+ }
1501+});
1502+
1503+var _Json_run = F2(function(decoder, value)
1504+{
1505+ return _Json_runHelp(decoder, _Json_unwrap(value));
1506+});
1507+
1508+function _Json_runHelp(decoder, value)
1509+{
1510+ switch (decoder.$)
1511+ {
1512+ case 2:
1513+ return decoder.b(value);
1514+
1515+ case 5:
1516+ return (value === null)
1517+ ? $elm$core$Result$Ok(decoder.c)
1518+ : _Json_expecting('null', value);
1519+
1520+ case 3:
1521+ if (!_Json_isArray(value))
1522+ {
1523+ return _Json_expecting('a LIST', value);
1524+ }
1525+ return _Json_runArrayDecoder(decoder.b, value, _List_fromArray);
1526+
1527+ case 4:
1528+ if (!_Json_isArray(value))
1529+ {
1530+ return _Json_expecting('an ARRAY', value);
1531+ }
1532+ return _Json_runArrayDecoder(decoder.b, value, _Json_toElmArray);
1533+
1534+ case 6:
1535+ var field = decoder.d;
1536+ if (typeof value !== 'object' || value === null || !(field in value))
1537+ {
1538+ return _Json_expecting('an OBJECT with a field named `' + field + '`', value);
1539+ }
1540+ var result = _Json_runHelp(decoder.b, value[field]);
1541+ return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, field, result.a));
1542+
1543+ case 7:
1544+ var index = decoder.e;
1545+ if (!_Json_isArray(value))
1546+ {
1547+ return _Json_expecting('an ARRAY', value);
1548+ }
1549+ if (index >= value.length)
1550+ {
1551+ return _Json_expecting('a LONGER array. Need index ' + index + ' but only see ' + value.length + ' entries', value);
1552+ }
1553+ var result = _Json_runHelp(decoder.b, value[index]);
1554+ return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, index, result.a));
1555+
1556+ case 8:
1557+ if (typeof value !== 'object' || value === null || _Json_isArray(value))
1558+ {
1559+ return _Json_expecting('an OBJECT', value);
1560+ }
1561+
1562+ var keyValuePairs = _List_Nil;
1563+ // TODO test perf of Object.keys and switch when support is good enough
1564+ for (var key in value)
1565+ {
1566+ if (value.hasOwnProperty(key))
1567+ {
1568+ var result = _Json_runHelp(decoder.b, value[key]);
1569+ if (!$elm$core$Result$isOk(result))
1570+ {
1571+ return $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, key, result.a));
1572+ }
1573+ keyValuePairs = _List_Cons(_Utils_Tuple2(key, result.a), keyValuePairs);
1574+ }
1575+ }
1576+ return $elm$core$Result$Ok($elm$core$List$reverse(keyValuePairs));
1577+
1578+ case 9:
1579+ var answer = decoder.f;
1580+ var decoders = decoder.g;
1581+ for (var i = 0; i < decoders.length; i++)
1582+ {
1583+ var result = _Json_runHelp(decoders[i], value);
1584+ if (!$elm$core$Result$isOk(result))
1585+ {
1586+ return result;
1587+ }
1588+ answer = answer(result.a);
1589+ }
1590+ return $elm$core$Result$Ok(answer);
1591+
1592+ case 10:
1593+ var result = _Json_runHelp(decoder.b, value);
1594+ return (!$elm$core$Result$isOk(result))
1595+ ? result
1596+ : _Json_runHelp(decoder.h(result.a), value);
1597+
1598+ case 11:
1599+ var errors = _List_Nil;
1600+ for (var temp = decoder.g; temp.b; temp = temp.b) // WHILE_CONS
1601+ {
1602+ var result = _Json_runHelp(temp.a, value);
1603+ if ($elm$core$Result$isOk(result))
1604+ {
1605+ return result;
1606+ }
1607+ errors = _List_Cons(result.a, errors);
1608+ }
1609+ return $elm$core$Result$Err($elm$json$Json$Decode$OneOf($elm$core$List$reverse(errors)));
1610+
1611+ case 1:
1612+ return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, decoder.a, _Json_wrap(value)));
1613+
1614+ case 0:
1615+ return $elm$core$Result$Ok(decoder.a);
1616+ }
1617+}
1618+
1619+function _Json_runArrayDecoder(decoder, value, toElmValue)
1620+{
1621+ var len = value.length;
1622+ var array = new Array(len);
1623+ for (var i = 0; i < len; i++)
1624+ {
1625+ var result = _Json_runHelp(decoder, value[i]);
1626+ if (!$elm$core$Result$isOk(result))
1627+ {
1628+ return $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, i, result.a));
1629+ }
1630+ array[i] = result.a;
1631+ }
1632+ return $elm$core$Result$Ok(toElmValue(array));
1633+}
1634+
1635+function _Json_isArray(value)
1636+{
1637+ return Array.isArray(value) || (typeof FileList !== 'undefined' && value instanceof FileList);
1638+}
1639+
1640+function _Json_toElmArray(array)
1641+{
1642+ return A2($elm$core$Array$initialize, array.length, function(i) { return array[i]; });
1643+}
1644+
1645+function _Json_expecting(type, value)
1646+{
1647+ return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'Expecting ' + type, _Json_wrap(value)));
1648+}
1649+
1650+
1651+// EQUALITY
1652+
1653+function _Json_equality(x, y)
1654+{
1655+ if (x === y)
1656+ {
1657+ return true;
1658+ }
1659+
1660+ if (x.$ !== y.$)
1661+ {
1662+ return false;
1663+ }
1664+
1665+ switch (x.$)
1666+ {
1667+ case 0:
1668+ case 1:
1669+ return x.a === y.a;
1670+
1671+ case 2:
1672+ return x.b === y.b;
1673+
1674+ case 5:
1675+ return x.c === y.c;
1676+
1677+ case 3:
1678+ case 4:
1679+ case 8:
1680+ return _Json_equality(x.b, y.b);
1681+
1682+ case 6:
1683+ return x.d === y.d && _Json_equality(x.b, y.b);
1684+
1685+ case 7:
1686+ return x.e === y.e && _Json_equality(x.b, y.b);
1687+
1688+ case 9:
1689+ return x.f === y.f && _Json_listEquality(x.g, y.g);
1690+
1691+ case 10:
1692+ return x.h === y.h && _Json_equality(x.b, y.b);
1693+
1694+ case 11:
1695+ return _Json_listEquality(x.g, y.g);
1696+ }
1697+}
1698+
1699+function _Json_listEquality(aDecoders, bDecoders)
1700+{
1701+ var len = aDecoders.length;
1702+ if (len !== bDecoders.length)
1703+ {
1704+ return false;
1705+ }
1706+ for (var i = 0; i < len; i++)
1707+ {
1708+ if (!_Json_equality(aDecoders[i], bDecoders[i]))
1709+ {
1710+ return false;
1711+ }
1712+ }
1713+ return true;
1714+}
1715+
1716+
1717+// ENCODE
1718+
1719+var _Json_encode = F2(function(indentLevel, value)
1720+{
1721+ return JSON.stringify(_Json_unwrap(value), null, indentLevel) + '';
1722+});
1723+
1724+function _Json_wrap(value) { return { $: 0, a: value }; }
1725+function _Json_unwrap(value) { return value.a; }
1726+
1727+function _Json_wrap_UNUSED(value) { return value; }
1728+function _Json_unwrap_UNUSED(value) { return value; }
1729+
1730+function _Json_emptyArray() { return []; }
1731+function _Json_emptyObject() { return {}; }
1732+
1733+var _Json_addField = F3(function(key, value, object)
1734+{
1735+ object[key] = _Json_unwrap(value);
1736+ return object;
1737+});
1738+
1739+function _Json_addEntry(func)
1740+{
1741+ return F2(function(entry, array)
1742+ {
1743+ array.push(_Json_unwrap(func(entry)));
1744+ return array;
1745+ });
1746+}
1747+
1748+var _Json_encodeNull = _Json_wrap(null);
1749+
1750+
1751+
1752+// TASKS
1753+
1754+function _Scheduler_succeed(value)
1755+{
1756+ return {
1757+ $: 0,
1758+ a: value
1759+ };
1760+}
1761+
1762+function _Scheduler_fail(error)
1763+{
1764+ return {
1765+ $: 1,
1766+ a: error
1767+ };
1768+}
1769+
1770+function _Scheduler_binding(callback)
1771+{
1772+ return {
1773+ $: 2,
1774+ b: callback,
1775+ c: null
1776+ };
1777+}
1778+
1779+var _Scheduler_andThen = F2(function(callback, task)
1780+{
1781+ return {
1782+ $: 3,
1783+ b: callback,
1784+ d: task
1785+ };
1786+});
1787+
1788+var _Scheduler_onError = F2(function(callback, task)
1789+{
1790+ return {
1791+ $: 4,
1792+ b: callback,
1793+ d: task
1794+ };
1795+});
1796+
1797+function _Scheduler_receive(callback)
1798+{
1799+ return {
1800+ $: 5,
1801+ b: callback
1802+ };
1803+}
1804+
1805+
1806+// PROCESSES
1807+
1808+var _Scheduler_guid = 0;
1809+
1810+function _Scheduler_rawSpawn(task)
1811+{
1812+ var proc = {
1813+ $: 0,
1814+ e: _Scheduler_guid++,
1815+ f: task,
1816+ g: null,
1817+ h: []
1818+ };
1819+
1820+ _Scheduler_enqueue(proc);
1821+
1822+ return proc;
1823+}
1824+
1825+function _Scheduler_spawn(task)
1826+{
1827+ return _Scheduler_binding(function(callback) {
1828+ callback(_Scheduler_succeed(_Scheduler_rawSpawn(task)));
1829+ });
1830+}
1831+
1832+function _Scheduler_rawSend(proc, msg)
1833+{
1834+ proc.h.push(msg);
1835+ _Scheduler_enqueue(proc);
1836+}
1837+
1838+var _Scheduler_send = F2(function(proc, msg)
1839+{
1840+ return _Scheduler_binding(function(callback) {
1841+ _Scheduler_rawSend(proc, msg);
1842+ callback(_Scheduler_succeed(_Utils_Tuple0));
1843+ });
1844+});
1845+
1846+function _Scheduler_kill(proc)
1847+{
1848+ return _Scheduler_binding(function(callback) {
1849+ var task = proc.f;
1850+ if (task.$ === 2 && task.c)
1851+ {
1852+ task.c();
1853+ }
1854+
1855+ proc.f = null;
1856+
1857+ callback(_Scheduler_succeed(_Utils_Tuple0));
1858+ });
1859+}
1860+
1861+
1862+/* STEP PROCESSES
1863+
1864+type alias Process =
1865+ { $ : tag
1866+ , id : unique_id
1867+ , root : Task
1868+ , stack : null | { $: SUCCEED | FAIL, a: callback, b: stack }
1869+ , mailbox : [msg]
1870+ }
1871+
1872+*/
1873+
1874+
1875+var _Scheduler_working = false;
1876+var _Scheduler_queue = [];
1877+
1878+
1879+function _Scheduler_enqueue(proc)
1880+{
1881+ _Scheduler_queue.push(proc);
1882+ if (_Scheduler_working)
1883+ {
1884+ return;
1885+ }
1886+ _Scheduler_working = true;
1887+ while (proc = _Scheduler_queue.shift())
1888+ {
1889+ _Scheduler_step(proc);
1890+ }
1891+ _Scheduler_working = false;
1892+}
1893+
1894+
1895+function _Scheduler_step(proc)
1896+{
1897+ while (proc.f)
1898+ {
1899+ var rootTag = proc.f.$;
1900+ if (rootTag === 0 || rootTag === 1)
1901+ {
1902+ while (proc.g && proc.g.$ !== rootTag)
1903+ {
1904+ proc.g = proc.g.i;
1905+ }
1906+ if (!proc.g)
1907+ {
1908+ return;
1909+ }
1910+ proc.f = proc.g.b(proc.f.a);
1911+ proc.g = proc.g.i;
1912+ }
1913+ else if (rootTag === 2)
1914+ {
1915+ proc.f.c = proc.f.b(function(newRoot) {
1916+ proc.f = newRoot;
1917+ _Scheduler_enqueue(proc);
1918+ });
1919+ return;
1920+ }
1921+ else if (rootTag === 5)
1922+ {
1923+ if (proc.h.length === 0)
1924+ {
1925+ return;
1926+ }
1927+ proc.f = proc.f.b(proc.h.shift());
1928+ }
1929+ else // if (rootTag === 3 || rootTag === 4)
1930+ {
1931+ proc.g = {
1932+ $: rootTag === 3 ? 0 : 1,
1933+ b: proc.f.b,
1934+ i: proc.g
1935+ };
1936+ proc.f = proc.f.d;
1937+ }
1938+ }
1939+}
1940+
1941+
1942+
1943+function _Process_sleep(time)
1944+{
1945+ return _Scheduler_binding(function(callback) {
1946+ var id = setTimeout(function() {
1947+ callback(_Scheduler_succeed(_Utils_Tuple0));
1948+ }, time);
1949+
1950+ return function() { clearTimeout(id); };
1951+ });
1952+}
1953+
1954+
1955+
1956+
1957+// PROGRAMS
1958+
1959+
1960+var _Platform_worker = F4(function(impl, flagDecoder, debugMetadata, args)
1961+{
1962+ return _Platform_initialize(
1963+ flagDecoder,
1964+ args,
1965+ impl.init,
1966+ impl.update,
1967+ impl.subscriptions,
1968+ function() { return function() {} }
1969+ );
1970+});
1971+
1972+
1973+
1974+// INITIALIZE A PROGRAM
1975+
1976+
1977+function _Platform_initialize(flagDecoder, args, init, update, subscriptions, stepperBuilder)
1978+{
1979+ var result = A2(_Json_run, flagDecoder, _Json_wrap(args ? args['flags'] : undefined));
1980+ $elm$core$Result$isOk(result) || _Debug_crash(2 /**/, _Json_errorToString(result.a) /**/);
1981+ var managers = {};
1982+ var initPair = init(result.a);
1983+ var model = initPair.a;
1984+ var stepper = stepperBuilder(sendToApp, model);
1985+ var ports = _Platform_setupEffects(managers, sendToApp);
1986+
1987+ function sendToApp(msg, viewMetadata)
1988+ {
1989+ var pair = A2(update, msg, model);
1990+ stepper(model = pair.a, viewMetadata);
1991+ _Platform_enqueueEffects(managers, pair.b, subscriptions(model));
1992+ }
1993+
1994+ _Platform_enqueueEffects(managers, initPair.b, subscriptions(model));
1995+
1996+ return ports ? { ports: ports } : {};
1997+}
1998+
1999+
2000+
2001+// TRACK PRELOADS
2002+//
2003+// This is used by code in elm/browser and elm/http
2004+// to register any HTTP requests that are triggered by init.
2005+//
2006+
2007+
2008+var _Platform_preload;
2009+
2010+
2011+function _Platform_registerPreload(url)
2012+{
2013+ _Platform_preload.add(url);
2014+}
2015+
2016+
2017+
2018+// EFFECT MANAGERS
2019+
2020+
2021+var _Platform_effectManagers = {};
2022+
2023+
2024+function _Platform_setupEffects(managers, sendToApp)
2025+{
2026+ var ports;
2027+
2028+ // setup all necessary effect managers
2029+ for (var key in _Platform_effectManagers)
2030+ {
2031+ var manager = _Platform_effectManagers[key];
2032+
2033+ if (manager.a)
2034+ {
2035+ ports = ports || {};
2036+ ports[key] = manager.a(key, sendToApp);
2037+ }
2038+
2039+ managers[key] = _Platform_instantiateManager(manager, sendToApp);
2040+ }
2041+
2042+ return ports;
2043+}
2044+
2045+
2046+function _Platform_createManager(init, onEffects, onSelfMsg, cmdMap, subMap)
2047+{
2048+ return {
2049+ b: init,
2050+ c: onEffects,
2051+ d: onSelfMsg,
2052+ e: cmdMap,
2053+ f: subMap
2054+ };
2055+}
2056+
2057+
2058+function _Platform_instantiateManager(info, sendToApp)
2059+{
2060+ var router = {
2061+ g: sendToApp,
2062+ h: undefined
2063+ };
2064+
2065+ var onEffects = info.c;
2066+ var onSelfMsg = info.d;
2067+ var cmdMap = info.e;
2068+ var subMap = info.f;
2069+
2070+ function loop(state)
2071+ {
2072+ return A2(_Scheduler_andThen, loop, _Scheduler_receive(function(msg)
2073+ {
2074+ var value = msg.a;
2075+
2076+ if (msg.$ === 0)
2077+ {
2078+ return A3(onSelfMsg, router, value, state);
2079+ }
2080+
2081+ return cmdMap && subMap
2082+ ? A4(onEffects, router, value.i, value.j, state)
2083+ : A3(onEffects, router, cmdMap ? value.i : value.j, state);
2084+ }));
2085+ }
2086+
2087+ return router.h = _Scheduler_rawSpawn(A2(_Scheduler_andThen, loop, info.b));
2088+}
2089+
2090+
2091+
2092+// ROUTING
2093+
2094+
2095+var _Platform_sendToApp = F2(function(router, msg)
2096+{
2097+ return _Scheduler_binding(function(callback)
2098+ {
2099+ router.g(msg);
2100+ callback(_Scheduler_succeed(_Utils_Tuple0));
2101+ });
2102+});
2103+
2104+
2105+var _Platform_sendToSelf = F2(function(router, msg)
2106+{
2107+ return A2(_Scheduler_send, router.h, {
2108+ $: 0,
2109+ a: msg
2110+ });
2111+});
2112+
2113+
2114+
2115+// BAGS
2116+
2117+
2118+function _Platform_leaf(home)
2119+{
2120+ return function(value)
2121+ {
2122+ return {
2123+ $: 1,
2124+ k: home,
2125+ l: value
2126+ };
2127+ };
2128+}
2129+
2130+
2131+function _Platform_batch(list)
2132+{
2133+ return {
2134+ $: 2,
2135+ m: list
2136+ };
2137+}
2138+
2139+
2140+var _Platform_map = F2(function(tagger, bag)
2141+{
2142+ return {
2143+ $: 3,
2144+ n: tagger,
2145+ o: bag
2146+ }
2147+});
2148+
2149+
2150+
2151+// PIPE BAGS INTO EFFECT MANAGERS
2152+//
2153+// Effects must be queued!
2154+//
2155+// Say your init contains a synchronous command, like Time.now or Time.here
2156+//
2157+// - This will produce a batch of effects (FX_1)
2158+// - The synchronous task triggers the subsequent `update` call
2159+// - This will produce a batch of effects (FX_2)
2160+//
2161+// If we just start dispatching FX_2, subscriptions from FX_2 can be processed
2162+// before subscriptions from FX_1. No good! Earlier versions of this code had
2163+// this problem, leading to these reports:
2164+//
2165+// https://github.com/elm/core/issues/980
2166+// https://github.com/elm/core/pull/981
2167+// https://github.com/elm/compiler/issues/1776
2168+//
2169+// The queue is necessary to avoid ordering issues for synchronous commands.
2170+
2171+
2172+// Why use true/false here? Why not just check the length of the queue?
2173+// The goal is to detect "are we currently dispatching effects?" If we
2174+// are, we need to bail and let the ongoing while loop handle things.
2175+//
2176+// Now say the queue has 1 element. When we dequeue the final element,
2177+// the queue will be empty, but we are still actively dispatching effects.
2178+// So you could get queue jumping in a really tricky category of cases.
2179+//
2180+var _Platform_effectsQueue = [];
2181+var _Platform_effectsActive = false;
2182+
2183+
2184+function _Platform_enqueueEffects(managers, cmdBag, subBag)
2185+{
2186+ _Platform_effectsQueue.push({ p: managers, q: cmdBag, r: subBag });
2187+
2188+ if (_Platform_effectsActive) return;
2189+
2190+ _Platform_effectsActive = true;
2191+ for (var fx; fx = _Platform_effectsQueue.shift(); )
2192+ {
2193+ _Platform_dispatchEffects(fx.p, fx.q, fx.r);
2194+ }
2195+ _Platform_effectsActive = false;
2196+}
2197+
2198+
2199+function _Platform_dispatchEffects(managers, cmdBag, subBag)
2200+{
2201+ var effectsDict = {};
2202+ _Platform_gatherEffects(true, cmdBag, effectsDict, null);
2203+ _Platform_gatherEffects(false, subBag, effectsDict, null);
2204+
2205+ for (var home in managers)
2206+ {
2207+ _Scheduler_rawSend(managers[home], {
2208+ $: 'fx',
2209+ a: effectsDict[home] || { i: _List_Nil, j: _List_Nil }
2210+ });
2211+ }
2212+}
2213+
2214+
2215+function _Platform_gatherEffects(isCmd, bag, effectsDict, taggers)
2216+{
2217+ switch (bag.$)
2218+ {
2219+ case 1:
2220+ var home = bag.k;
2221+ var effect = _Platform_toEffect(isCmd, home, taggers, bag.l);
2222+ effectsDict[home] = _Platform_insert(isCmd, effect, effectsDict[home]);
2223+ return;
2224+
2225+ case 2:
2226+ for (var list = bag.m; list.b; list = list.b) // WHILE_CONS
2227+ {
2228+ _Platform_gatherEffects(isCmd, list.a, effectsDict, taggers);
2229+ }
2230+ return;
2231+
2232+ case 3:
2233+ _Platform_gatherEffects(isCmd, bag.o, effectsDict, {
2234+ s: bag.n,
2235+ t: taggers
2236+ });
2237+ return;
2238+ }
2239+}
2240+
2241+
2242+function _Platform_toEffect(isCmd, home, taggers, value)
2243+{
2244+ function applyTaggers(x)
2245+ {
2246+ for (var temp = taggers; temp; temp = temp.t)
2247+ {
2248+ x = temp.s(x);
2249+ }
2250+ return x;
2251+ }
2252+
2253+ var map = isCmd
2254+ ? _Platform_effectManagers[home].e
2255+ : _Platform_effectManagers[home].f;
2256+
2257+ return A2(map, applyTaggers, value)
2258+}
2259+
2260+
2261+function _Platform_insert(isCmd, newEffect, effects)
2262+{
2263+ effects = effects || { i: _List_Nil, j: _List_Nil };
2264+
2265+ isCmd
2266+ ? (effects.i = _List_Cons(newEffect, effects.i))
2267+ : (effects.j = _List_Cons(newEffect, effects.j));
2268+
2269+ return effects;
2270+}
2271+
2272+
2273+
2274+// PORTS
2275+
2276+
2277+function _Platform_checkPortName(name)
2278+{
2279+ if (_Platform_effectManagers[name])
2280+ {
2281+ _Debug_crash(3, name)
2282+ }
2283+}
2284+
2285+
2286+
2287+// OUTGOING PORTS
2288+
2289+
2290+function _Platform_outgoingPort(name, converter)
2291+{
2292+ _Platform_checkPortName(name);
2293+ _Platform_effectManagers[name] = {
2294+ e: _Platform_outgoingPortMap,
2295+ u: converter,
2296+ a: _Platform_setupOutgoingPort
2297+ };
2298+ return _Platform_leaf(name);
2299+}
2300+
2301+
2302+var _Platform_outgoingPortMap = F2(function(tagger, value) { return value; });
2303+
2304+
2305+function _Platform_setupOutgoingPort(name)
2306+{
2307+ var subs = [];
2308+ var converter = _Platform_effectManagers[name].u;
2309+
2310+ // CREATE MANAGER
2311+
2312+ var init = _Process_sleep(0);
2313+
2314+ _Platform_effectManagers[name].b = init;
2315+ _Platform_effectManagers[name].c = F3(function(router, cmdList, state)
2316+ {
2317+ for ( ; cmdList.b; cmdList = cmdList.b) // WHILE_CONS
2318+ {
2319+ // grab a separate reference to subs in case unsubscribe is called
2320+ var currentSubs = subs;
2321+ var value = _Json_unwrap(converter(cmdList.a));
2322+ for (var i = 0; i < currentSubs.length; i++)
2323+ {
2324+ currentSubs[i](value);
2325+ }
2326+ }
2327+ return init;
2328+ });
2329+
2330+ // PUBLIC API
2331+
2332+ function subscribe(callback)
2333+ {
2334+ subs.push(callback);
2335+ }
2336+
2337+ function unsubscribe(callback)
2338+ {
2339+ // copy subs into a new array in case unsubscribe is called within a
2340+ // subscribed callback
2341+ subs = subs.slice();
2342+ var index = subs.indexOf(callback);
2343+ if (index >= 0)
2344+ {
2345+ subs.splice(index, 1);
2346+ }
2347+ }
2348+
2349+ return {
2350+ subscribe: subscribe,
2351+ unsubscribe: unsubscribe
2352+ };
2353+}
2354+
2355+
2356+
2357+// INCOMING PORTS
2358+
2359+
2360+function _Platform_incomingPort(name, converter)
2361+{
2362+ _Platform_checkPortName(name);
2363+ _Platform_effectManagers[name] = {
2364+ f: _Platform_incomingPortMap,
2365+ u: converter,
2366+ a: _Platform_setupIncomingPort
2367+ };
2368+ return _Platform_leaf(name);
2369+}
2370+
2371+
2372+var _Platform_incomingPortMap = F2(function(tagger, finalTagger)
2373+{
2374+ return function(value)
2375+ {
2376+ return tagger(finalTagger(value));
2377+ };
2378+});
2379+
2380+
2381+function _Platform_setupIncomingPort(name, sendToApp)
2382+{
2383+ var subs = _List_Nil;
2384+ var converter = _Platform_effectManagers[name].u;
2385+
2386+ // CREATE MANAGER
2387+
2388+ var init = _Scheduler_succeed(null);
2389+
2390+ _Platform_effectManagers[name].b = init;
2391+ _Platform_effectManagers[name].c = F3(function(router, subList, state)
2392+ {
2393+ subs = subList;
2394+ return init;
2395+ });
2396+
2397+ // PUBLIC API
2398+
2399+ function send(incomingValue)
2400+ {
2401+ var result = A2(_Json_run, converter, _Json_wrap(incomingValue));
2402+
2403+ $elm$core$Result$isOk(result) || _Debug_crash(4, name, result.a);
2404+
2405+ var value = result.a;
2406+ for (var temp = subs; temp.b; temp = temp.b) // WHILE_CONS
2407+ {
2408+ sendToApp(temp.a(value));
2409+ }
2410+ }
2411+
2412+ return { send: send };
2413+}
2414+
2415+
2416+
2417+// EXPORT ELM MODULES
2418+//
2419+// Have DEBUG and PROD versions so that we can (1) give nicer errors in
2420+// debug mode and (2) not pay for the bits needed for that in prod mode.
2421+//
2422+
2423+
2424+function _Platform_export_UNUSED(exports)
2425+{
2426+ scope['Elm']
2427+ ? _Platform_mergeExportsProd(scope['Elm'], exports)
2428+ : scope['Elm'] = exports;
2429+}
2430+
2431+
2432+function _Platform_mergeExportsProd(obj, exports)
2433+{
2434+ for (var name in exports)
2435+ {
2436+ (name in obj)
2437+ ? (name == 'init')
2438+ ? _Debug_crash(6)
2439+ : _Platform_mergeExportsProd(obj[name], exports[name])
2440+ : (obj[name] = exports[name]);
2441+ }
2442+}
2443+
2444+
2445+function _Platform_export(exports)
2446+{
2447+ scope['Elm']
2448+ ? _Platform_mergeExportsDebug('Elm', scope['Elm'], exports)
2449+ : scope['Elm'] = exports;
2450+}
2451+
2452+
2453+function _Platform_mergeExportsDebug(moduleName, obj, exports)
2454+{
2455+ for (var name in exports)
2456+ {
2457+ (name in obj)
2458+ ? (name == 'init')
2459+ ? _Debug_crash(6, moduleName)
2460+ : _Platform_mergeExportsDebug(moduleName + '.' + name, obj[name], exports[name])
2461+ : (obj[name] = exports[name]);
2462+ }
2463+}
2464+
2465+
2466+
2467+var _Lynx_g = (typeof globalThis !== 'undefined' ? globalThis : scope);
2468+function _Lynx_papi(name) { return _Lynx_g['_' + '_' + name] || function() {}; }
2469+var _Lynx_createElement = _Lynx_papi('createElement');
2470+var _Lynx_createPage = _Lynx_papi('CreatePage');
2471+var _Lynx_appendChild = _Lynx_papi('AppendElement');
2472+var _Lynx_removeElement = _Lynx_papi('RemoveElement');
2473+var _Lynx_replaceElement = _Lynx_papi('ReplaceElement');
2474+var _Lynx_insertBefore = _Lynx_papi('InsertElementBefore');
2475+var _Lynx_setAttribute = _Lynx_papi('SetAttribute');
2476+var _Lynx_getChildren = _Lynx_g['_' + '_GetChildren'] || function() { return []; };
2477+var _Lynx_getParent = _Lynx_g['_' + '_GetParent'] || function() { return null; };
2478+var _Lynx_addEvent = _Lynx_papi('AddEvent');
2479+var _Lynx_setInlineStyles = _Lynx_g['_' + '_SetInlineStyles'];
2480+var _Lynx_addInlineStyle = _Lynx_papi('AddInlineStyle');
2481+
2482+var _VirtualDom_elementMeta = new Map();
2483+function _VirtualDom_getMeta(el) {
2484+ var meta = _VirtualDom_elementMeta.get(el);
2485+ if (!meta) { meta = {}; _VirtualDom_elementMeta.set(el, meta); }
2486+ return meta;
2487+}
2488+
2489+
2490+// HELPERS
2491+
2492+
2493+
2494+
2495+
2496+function _VirtualDom_appendChild(parent, child)
2497+{
2498+ _Lynx_appendChild(parent, child);
2499+}
2500+
2501+var _VirtualDom_init = F4(function(virtualNode, flagDecoder, debugMetadata, args)
2502+{
2503+ // NOTE: this function needs _Platform_export available to work
2504+ var rootPage = args['node'] || _Lynx_createPage();
2505+ var tree = _VirtualDom_render(virtualNode, function() {});
2506+ _Lynx_appendChild(rootPage, tree);
2507+ return {};
2508+});
2509+
2510+
2511+
2512+// TEXT
2513+
2514+
2515+function _VirtualDom_text(string)
2516+{
2517+ return {
2518+ $: 0,
2519+ a: string
2520+ };
2521+}
2522+
2523+
2524+
2525+// NODE
2526+
2527+
2528+var _VirtualDom_nodeNS = F2(function(namespace, tag)
2529+{
2530+ return F2(function(factList, kidList)
2531+ {
2532+ for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS
2533+ {
2534+ var kid = kidList.a;
2535+ descendantsCount += (kid.b || 0);
2536+ kids.push(kid);
2537+ }
2538+ descendantsCount += kids.length;
2539+
2540+ return {
2541+ $: 1,
2542+ c: tag,
2543+ d: _VirtualDom_organizeFacts(factList),
2544+ e: kids,
2545+ f: namespace,
2546+ b: descendantsCount
2547+ };
2548+ });
2549+});
2550+
2551+
2552+var _VirtualDom_node = _VirtualDom_nodeNS(undefined);
2553+
2554+
2555+
2556+// KEYED NODE
2557+
2558+
2559+var _VirtualDom_keyedNodeNS = F2(function(namespace, tag)
2560+{
2561+ return F2(function(factList, kidList)
2562+ {
2563+ for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS
2564+ {
2565+ var kid = kidList.a;
2566+ descendantsCount += (kid.b.b || 0);
2567+ kids.push(kid);
2568+ }
2569+ descendantsCount += kids.length;
2570+
2571+ return {
2572+ $: 2,
2573+ c: tag,
2574+ d: _VirtualDom_organizeFacts(factList),
2575+ e: kids,
2576+ f: namespace,
2577+ b: descendantsCount
2578+ };
2579+ });
2580+});
2581+
2582+
2583+var _VirtualDom_keyedNode = _VirtualDom_keyedNodeNS(undefined);
2584+
2585+
2586+
2587+// CUSTOM
2588+
2589+
2590+function _VirtualDom_custom(factList, model, render, diff)
2591+{
2592+ return {
2593+ $: 3,
2594+ d: _VirtualDom_organizeFacts(factList),
2595+ g: model,
2596+ h: render,
2597+ i: diff
2598+ };
2599+}
2600+
2601+
2602+
2603+// MAP
2604+
2605+
2606+var _VirtualDom_map = F2(function(tagger, node)
2607+{
2608+ return {
2609+ $: 4,
2610+ j: tagger,
2611+ k: node,
2612+ b: 1 + (node.b || 0)
2613+ };
2614+});
2615+
2616+
2617+
2618+// LAZY
2619+
2620+
2621+function _VirtualDom_thunk(refs, thunk)
2622+{
2623+ return {
2624+ $: 5,
2625+ l: refs,
2626+ m: thunk,
2627+ k: undefined
2628+ };
2629+}
2630+
2631+var _VirtualDom_lazy = F2(function(func, a)
2632+{
2633+ return _VirtualDom_thunk([func, a], function() {
2634+ return func(a);
2635+ });
2636+});
2637+
2638+var _VirtualDom_lazy2 = F3(function(func, a, b)
2639+{
2640+ return _VirtualDom_thunk([func, a, b], function() {
2641+ return A2(func, a, b);
2642+ });
2643+});
2644+
2645+var _VirtualDom_lazy3 = F4(function(func, a, b, c)
2646+{
2647+ return _VirtualDom_thunk([func, a, b, c], function() {
2648+ return A3(func, a, b, c);
2649+ });
2650+});
2651+
2652+var _VirtualDom_lazy4 = F5(function(func, a, b, c, d)
2653+{
2654+ return _VirtualDom_thunk([func, a, b, c, d], function() {
2655+ return A4(func, a, b, c, d);
2656+ });
2657+});
2658+
2659+var _VirtualDom_lazy5 = F6(function(func, a, b, c, d, e)
2660+{
2661+ return _VirtualDom_thunk([func, a, b, c, d, e], function() {
2662+ return A5(func, a, b, c, d, e);
2663+ });
2664+});
2665+
2666+var _VirtualDom_lazy6 = F7(function(func, a, b, c, d, e, f)
2667+{
2668+ return _VirtualDom_thunk([func, a, b, c, d, e, f], function() {
2669+ return A6(func, a, b, c, d, e, f);
2670+ });
2671+});
2672+
2673+var _VirtualDom_lazy7 = F8(function(func, a, b, c, d, e, f, g)
2674+{
2675+ return _VirtualDom_thunk([func, a, b, c, d, e, f, g], function() {
2676+ return A7(func, a, b, c, d, e, f, g);
2677+ });
2678+});
2679+
2680+var _VirtualDom_lazy8 = F9(function(func, a, b, c, d, e, f, g, h)
2681+{
2682+ return _VirtualDom_thunk([func, a, b, c, d, e, f, g, h], function() {
2683+ return A8(func, a, b, c, d, e, f, g, h);
2684+ });
2685+});
2686+
2687+
2688+
2689+// FACTS
2690+
2691+
2692+var _VirtualDom_on = F2(function(key, handler)
2693+{
2694+ return {
2695+ $: 'a0',
2696+ n: key,
2697+ o: handler
2698+ };
2699+});
2700+var _VirtualDom_style = F2(function(key, value)
2701+{
2702+ return {
2703+ $: 'a1',
2704+ n: key,
2705+ o: value
2706+ };
2707+});
2708+var _VirtualDom_property = F2(function(key, value)
2709+{
2710+ return {
2711+ $: 'a2',
2712+ n: key,
2713+ o: value
2714+ };
2715+});
2716+var _VirtualDom_attribute = F2(function(key, value)
2717+{
2718+ return {
2719+ $: 'a3',
2720+ n: key,
2721+ o: value
2722+ };
2723+});
2724+var _VirtualDom_attributeNS = F3(function(namespace, key, value)
2725+{
2726+ return {
2727+ $: 'a4',
2728+ n: key,
2729+ o: { f: namespace, o: value }
2730+ };
2731+});
2732+
2733+
2734+
2735+// XSS ATTACK VECTOR CHECKS
2736+//
2737+// For some reason, tabs can appear in href protocols and it still works.
2738+// So '\tjava\tSCRIPT:alert("!!!")' and 'javascript:alert("!!!")' are the same
2739+// in practice. That is why _VirtualDom_RE_js and _VirtualDom_RE_js_html look
2740+// so freaky.
2741+//
2742+// Pulling the regular expressions out to the top level gives a slight speed
2743+// boost in small benchmarks (4-10%) but hoisting values to reduce allocation
2744+// can be unpredictable in large programs where JIT may have a harder time with
2745+// functions are not fully self-contained. The benefit is more that the js and
2746+// js_html ones are so weird that I prefer to see them near each other.
2747+
2748+
2749+
2750+
2751+
2752+function _VirtualDom_noScript(tag)
2753+{
2754+ return tag;
2755+}
2756+
2757+function _VirtualDom_noOnOrFormAction(key)
2758+{
2759+ return key;
2760+}
2761+
2762+function _VirtualDom_noInnerHtmlOrFormAction(key)
2763+{
2764+ return key;
2765+}
2766+
2767+function _VirtualDom_noJavaScriptUri(value)
2768+{
2769+ return value;
2770+}
2771+
2772+function _VirtualDom_noJavaScriptOrHtmlUri(value)
2773+{
2774+ return value;
2775+}
2776+
2777+function _VirtualDom_noJavaScriptOrHtmlJson(value)
2778+{
2779+ return value;
2780+}
2781+
2782+
2783+
2784+// MAP FACTS
2785+
2786+
2787+var _VirtualDom_mapAttribute = F2(function(func, attr)
2788+{
2789+ return (attr.$ === 'a0')
2790+ ? A2(_VirtualDom_on, attr.n, _VirtualDom_mapHandler(func, attr.o))
2791+ : attr;
2792+});
2793+
2794+function _VirtualDom_mapHandler(func, handler)
2795+{
2796+ var tag = $elm$virtual_dom$VirtualDom$toHandlerInt(handler);
2797+
2798+ // 0 = Normal
2799+ // 1 = MayStopPropagation
2800+ // 2 = MayPreventDefault
2801+ // 3 = Custom
2802+
2803+ return {
2804+ $: handler.$,
2805+ a:
2806+ !tag
2807+ ? A2($elm$json$Json$Decode$map, func, handler.a)
2808+ :
2809+ A3($elm$json$Json$Decode$map2,
2810+ tag < 3
2811+ ? _VirtualDom_mapEventTuple
2812+ : _VirtualDom_mapEventRecord,
2813+ $elm$json$Json$Decode$succeed(func),
2814+ handler.a
2815+ )
2816+ };
2817+}
2818+
2819+var _VirtualDom_mapEventTuple = F2(function(func, tuple)
2820+{
2821+ return _Utils_Tuple2(func(tuple.a), tuple.b);
2822+});
2823+
2824+var _VirtualDom_mapEventRecord = F2(function(func, record)
2825+{
2826+ return {
2827+ message: func(record.message),
2828+ stopPropagation: record.stopPropagation,
2829+ preventDefault: record.preventDefault
2830+ }
2831+});
2832+
2833+
2834+
2835+// ORGANIZE FACTS
2836+
2837+
2838+function _VirtualDom_organizeFacts(factList)
2839+{
2840+ for (var facts = {}; factList.b; factList = factList.b) // WHILE_CONS
2841+ {
2842+ var entry = factList.a;
2843+
2844+ var tag = entry.$;
2845+ var key = entry.n;
2846+ var value = entry.o;
2847+
2848+ if (tag === 'a2')
2849+ {
2850+ (key === 'className')
2851+ ? _VirtualDom_addClass(facts, key, _Json_unwrap(value))
2852+ : facts[key] = _Json_unwrap(value);
2853+
2854+ continue;
2855+ }
2856+
2857+ var subFacts = facts[tag] || (facts[tag] = {});
2858+ (tag === 'a3' && key === 'class')
2859+ ? _VirtualDom_addClass(subFacts, key, value)
2860+ : subFacts[key] = value;
2861+ }
2862+
2863+ return facts;
2864+}
2865+
2866+function _VirtualDom_addClass(object, key, newClass)
2867+{
2868+ var classes = object[key];
2869+ object[key] = classes ? classes + ' ' + newClass : newClass;
2870+}
2871+
2872+
2873+
2874+// RENDER
2875+
2876+
2877+function _VirtualDom_render(vNode, eventNode)
2878+{
2879+ var tag = vNode.$;
2880+
2881+ if (tag === 5)
2882+ {
2883+ return _VirtualDom_render(vNode.k || (vNode.k = vNode.m()), eventNode);
2884+ }
2885+
2886+ if (tag === 0)
2887+ {
2888+ var textEl = _Lynx_createElement('text', 0, {});
2889+ _Lynx_setAttribute(textEl, 'content', vNode.a);
2890+ return textEl;
2891+ }
2892+
2893+ if (tag === 4)
2894+ {
2895+ var subNode = vNode.k;
2896+ var tagger = vNode.j;
2897+
2898+ while (subNode.$ === 4)
2899+ {
2900+ typeof tagger !== 'object'
2901+ ? tagger = [tagger, subNode.j]
2902+ : tagger.push(subNode.j);
2903+
2904+ subNode = subNode.k;
2905+ }
2906+
2907+ var subEventRoot = { j: tagger, p: eventNode };
2908+ var domNode = _VirtualDom_render(subNode, subEventRoot);
2909+ _VirtualDom_getMeta(domNode).elm_event_node_ref = subEventRoot;
2910+ return domNode;
2911+ }
2912+
2913+ if (tag === 3)
2914+ {
2915+ var domNode = vNode.h(vNode.g);
2916+ _VirtualDom_applyFacts(domNode, eventNode, vNode.d);
2917+ return domNode;
2918+ }
2919+
2920+ // at this point `tag` must be 1 or 2
2921+
2922+ var domNode = _Lynx_createElement(vNode.c, 0, {});
2923+
2924+ _VirtualDom_applyFacts(domNode, eventNode, vNode.d);
2925+
2926+ for (var kids = vNode.e, i = 0; i < kids.length; i++)
2927+ {
2928+ _VirtualDom_appendChild(domNode, _VirtualDom_render(tag === 1 ? kids[i] : kids[i].b, eventNode));
2929+ }
2930+
2931+ return domNode;
2932+}
2933+
2934+
2935+
2936+// APPLY FACTS
2937+
2938+
2939+function _VirtualDom_applyFacts(domNode, eventNode, facts)
2940+{
2941+ for (var key in facts)
2942+ {
2943+ var value = facts[key];
2944+
2945+ key === 'a1'
2946+ ? _VirtualDom_applyStyles(domNode, value)
2947+ :
2948+ key === 'a0'
2949+ ? _VirtualDom_applyEvents(domNode, eventNode, value)
2950+ :
2951+ key === 'a3'
2952+ ? _VirtualDom_applyAttrs(domNode, value)
2953+ :
2954+ key === 'a4'
2955+ ? _VirtualDom_applyAttrsNS(domNode, value)
2956+ :
2957+ (key !== 'value' && key !== 'checked' || domNode[key] !== value) && _Lynx_setAttribute(domNode, key === 'className' ? 'class' : key, String(value));
2958+ }
2959+}
2960+
2961+
2962+
2963+// APPLY STYLES
2964+
2965+
2966+function _VirtualDom_applyStyles(domNode, styles)
2967+{
2968+ if (_Lynx_setInlineStyles)
2969+ {
2970+ _Lynx_setInlineStyles(domNode, styles);
2971+ }
2972+ else
2973+ {
2974+ for (var key in styles)
2975+ {
2976+ _Lynx_addInlineStyle(domNode, key, styles[key]);
2977+ }
2978+ }
2979+}
2980+
2981+
2982+
2983+// APPLY ATTRS
2984+
2985+
2986+function _VirtualDom_applyAttrs(domNode, attrs)
2987+{
2988+ for (var key in attrs)
2989+ {
2990+ var value = attrs[key];
2991+ if (typeof value !== 'undefined')
2992+ {
2993+ _Lynx_setAttribute(domNode, key, value);
2994+ }
2995+ }
2996+}
2997+
2998+
2999+
3000+// APPLY NAMESPACED ATTRS
3001+
3002+
3003+function _VirtualDom_applyAttrsNS(domNode, nsAttrs)
3004+{
3005+ for (var key in nsAttrs)
3006+ {
3007+ var pair = nsAttrs[key];
3008+ var value = pair.o;
3009+
3010+ if (typeof value !== 'undefined')
3011+ {
3012+ _Lynx_setAttribute(domNode, key, value);
3013+ }
3014+ }
3015+}
3016+
3017+
3018+
3019+// APPLY EVENTS
3020+
3021+
3022+function _VirtualDom_applyEvents(domNode, eventNode, events)
3023+{
3024+ var meta = _VirtualDom_getMeta(domNode);
3025+ var allCallbacks = meta.elmFs || (meta.elmFs = {});
3026+
3027+ for (var key in events)
3028+ {
3029+ var newHandler = events[key];
3030+ var oldCallback = allCallbacks[key];
3031+
3032+ if (!newHandler)
3033+ {
3034+ allCallbacks[key] = undefined;
3035+ continue;
3036+ }
3037+
3038+ if (oldCallback)
3039+ {
3040+ var oldHandler = oldCallback.q;
3041+ if (oldHandler.$ === newHandler.$)
3042+ {
3043+ oldCallback.q = newHandler;
3044+ continue;
3045+ }
3046+ }
3047+
3048+ oldCallback = _VirtualDom_makeCallback(eventNode, newHandler);
3049+ allCallbacks[key] = oldCallback;
3050+
3051+ var lynxEventName = _VirtualDom_mapEventName(key);
3052+ var handlerType = $elm$virtual_dom$VirtualDom$toHandlerInt(newHandler);
3053+ var prefix = (handlerType === 1) ? 'catch' : 'bind';
3054+ _Lynx_addEvent(domNode, prefix + lynxEventName, lynxEventName, oldCallback);
3055+ }
3056+}
3057+
3058+function _VirtualDom_mapEventName(name)
3059+{
3060+ switch (name)
3061+ {
3062+ case 'click': return 'tap';
3063+ case 'dblclick': return 'tap';
3064+ case 'mousedown': return 'touchstart';
3065+ case 'mousemove': return 'touchmove';
3066+ case 'mouseup': return 'touchend';
3067+ default: return name;
3068+ }
3069+}
3070+
3071+
3072+
3073+// PASSIVE EVENTS
3074+
3075+
3076+
3077+// EVENT HANDLERS
3078+
3079+
3080+function _VirtualDom_makeCallback(eventNode, initialHandler)
3081+{
3082+ function callback(event)
3083+ {
3084+ var handler = callback.q;
3085+ var result = _Json_runHelp(handler.a, event);
3086+
3087+ if (!$elm$core$Result$isOk(result))
3088+ {
3089+ return;
3090+ }
3091+
3092+ var tag = $elm$virtual_dom$VirtualDom$toHandlerInt(handler);
3093+
3094+ // 0 = Normal
3095+ // 1 = MayStopPropagation
3096+ // 2 = MayPreventDefault
3097+ // 3 = Custom
3098+
3099+ var value = result.a;
3100+ var message = !tag ? value : tag < 3 ? value.a : value.message;
3101+ var stopPropagation = tag == 1 ? value.b : tag == 3 && value.stopPropagation;
3102+ var currentEventNode = eventNode;
3103+ var tagger;
3104+ var i;
3105+ while (tagger = currentEventNode.j)
3106+ {
3107+ if (typeof tagger == 'function')
3108+ {
3109+ message = tagger(message);
3110+ }
3111+ else
3112+ {
3113+ for (var i = tagger.length; i--; )
3114+ {
3115+ message = tagger[i](message);
3116+ }
3117+ }
3118+ currentEventNode = currentEventNode.p;
3119+ }
3120+ currentEventNode(message, stopPropagation); // stopPropagation implies isSync
3121+ }
3122+
3123+ callback.q = initialHandler;
3124+
3125+ return callback;
3126+}
3127+
3128+function _VirtualDom_equalEvents(x, y)
3129+{
3130+ return x.$ == y.$ && _Json_equality(x.a, y.a);
3131+}
3132+
3133+
3134+
3135+// DIFF
3136+
3137+
3138+// TODO: Should we do patches like in iOS?
3139+//
3140+// type Patch
3141+// = At Int Patch
3142+// | Batch (List Patch)
3143+// | Change ...
3144+//
3145+// How could it not be better?
3146+//
3147+function _VirtualDom_diff(x, y)
3148+{
3149+ var patches = [];
3150+ _VirtualDom_diffHelp(x, y, patches, 0);
3151+ return patches;
3152+}
3153+
3154+
3155+function _VirtualDom_pushPatch(patches, type, index, data)
3156+{
3157+ var patch = {
3158+ $: type,
3159+ r: index,
3160+ s: data,
3161+ t: undefined,
3162+ u: undefined
3163+ };
3164+ patches.push(patch);
3165+ return patch;
3166+}
3167+
3168+
3169+function _VirtualDom_diffHelp(x, y, patches, index)
3170+{
3171+ if (x === y)
3172+ {
3173+ return;
3174+ }
3175+
3176+ var xType = x.$;
3177+ var yType = y.$;
3178+
3179+ // Bail if you run into different types of nodes. Implies that the
3180+ // structure has changed significantly and it's not worth a diff.
3181+ if (xType !== yType)
3182+ {
3183+ if (xType === 1 && yType === 2)
3184+ {
3185+ y = _VirtualDom_dekey(y);
3186+ yType = 1;
3187+ }
3188+ else
3189+ {
3190+ _VirtualDom_pushPatch(patches, 0, index, y);
3191+ return;
3192+ }
3193+ }
3194+
3195+ // Now we know that both nodes are the same $.
3196+ switch (yType)
3197+ {
3198+ case 5:
3199+ var xRefs = x.l;
3200+ var yRefs = y.l;
3201+ var i = xRefs.length;
3202+ var same = i === yRefs.length;
3203+ while (same && i--)
3204+ {
3205+ same = xRefs[i] === yRefs[i];
3206+ }
3207+ if (same)
3208+ {
3209+ y.k = x.k;
3210+ return;
3211+ }
3212+ y.k = y.m();
3213+ var subPatches = [];
3214+ _VirtualDom_diffHelp(x.k, y.k, subPatches, 0);
3215+ subPatches.length > 0 && _VirtualDom_pushPatch(patches, 1, index, subPatches);
3216+ return;
3217+
3218+ case 4:
3219+ // gather nested taggers
3220+ var xTaggers = x.j;
3221+ var yTaggers = y.j;
3222+ var nesting = false;
3223+
3224+ var xSubNode = x.k;
3225+ while (xSubNode.$ === 4)
3226+ {
3227+ nesting = true;
3228+
3229+ typeof xTaggers !== 'object'
3230+ ? xTaggers = [xTaggers, xSubNode.j]
3231+ : xTaggers.push(xSubNode.j);
3232+
3233+ xSubNode = xSubNode.k;
3234+ }
3235+
3236+ var ySubNode = y.k;
3237+ while (ySubNode.$ === 4)
3238+ {
3239+ nesting = true;
3240+
3241+ typeof yTaggers !== 'object'
3242+ ? yTaggers = [yTaggers, ySubNode.j]
3243+ : yTaggers.push(ySubNode.j);
3244+
3245+ ySubNode = ySubNode.k;
3246+ }
3247+
3248+ // Just bail if different numbers of taggers. This implies the
3249+ // structure of the virtual DOM has changed.
3250+ if (nesting && xTaggers.length !== yTaggers.length)
3251+ {
3252+ _VirtualDom_pushPatch(patches, 0, index, y);
3253+ return;
3254+ }
3255+
3256+ // check if taggers are "the same"
3257+ if (nesting ? !_VirtualDom_pairwiseRefEqual(xTaggers, yTaggers) : xTaggers !== yTaggers)
3258+ {
3259+ _VirtualDom_pushPatch(patches, 2, index, yTaggers);
3260+ }
3261+
3262+ // diff everything below the taggers
3263+ _VirtualDom_diffHelp(xSubNode, ySubNode, patches, index + 1);
3264+ return;
3265+
3266+ case 0:
3267+ if (x.a !== y.a)
3268+ {
3269+ _VirtualDom_pushPatch(patches, 3, index, y.a);
3270+ }
3271+ return;
3272+
3273+ case 1:
3274+ _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKids);
3275+ return;
3276+
3277+ case 2:
3278+ _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKeyedKids);
3279+ return;
3280+
3281+ case 3:
3282+ if (x.h !== y.h)
3283+ {
3284+ _VirtualDom_pushPatch(patches, 0, index, y);
3285+ return;
3286+ }
3287+
3288+ var factsDiff = _VirtualDom_diffFacts(x.d, y.d);
3289+ factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff);
3290+
3291+ var patch = y.i(x.g, y.g);
3292+ patch && _VirtualDom_pushPatch(patches, 5, index, patch);
3293+
3294+ return;
3295+ }
3296+}
3297+
3298+// assumes the incoming arrays are the same length
3299+function _VirtualDom_pairwiseRefEqual(as, bs)
3300+{
3301+ for (var i = 0; i < as.length; i++)
3302+ {
3303+ if (as[i] !== bs[i])
3304+ {
3305+ return false;
3306+ }
3307+ }
3308+
3309+ return true;
3310+}
3311+
3312+function _VirtualDom_diffNodes(x, y, patches, index, diffKids)
3313+{
3314+ // Bail if obvious indicators have changed. Implies more serious
3315+ // structural changes such that it's not worth it to diff.
3316+ if (x.c !== y.c || x.f !== y.f)
3317+ {
3318+ _VirtualDom_pushPatch(patches, 0, index, y);
3319+ return;
3320+ }
3321+
3322+ var factsDiff = _VirtualDom_diffFacts(x.d, y.d);
3323+ factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff);
3324+
3325+ diffKids(x, y, patches, index);
3326+}
3327+
3328+
3329+
3330+// DIFF FACTS
3331+
3332+
3333+// TODO Instead of creating a new diff object, it's possible to just test if
3334+// there *is* a diff. During the actual patch, do the diff again and make the
3335+// modifications directly. This way, there's no new allocations. Worth it?
3336+function _VirtualDom_diffFacts(x, y, category)
3337+{
3338+ var diff;
3339+
3340+ // look for changes and removals
3341+ for (var xKey in x)
3342+ {
3343+ if (xKey === 'a1' || xKey === 'a0' || xKey === 'a3' || xKey === 'a4')
3344+ {
3345+ var subDiff = _VirtualDom_diffFacts(x[xKey], y[xKey] || {}, xKey);
3346+ if (subDiff)
3347+ {
3348+ diff = diff || {};
3349+ diff[xKey] = subDiff;
3350+ }
3351+ continue;
3352+ }
3353+
3354+ // remove if not in the new facts
3355+ if (!(xKey in y))
3356+ {
3357+ diff = diff || {};
3358+ diff[xKey] =
3359+ !category
3360+ ? (typeof x[xKey] === 'string' ? '' : null)
3361+ :
3362+ (category === 'a1')
3363+ ? ''
3364+ :
3365+ (category === 'a0' || category === 'a3')
3366+ ? undefined
3367+ :
3368+ { f: x[xKey].f, o: undefined };
3369+
3370+ continue;
3371+ }
3372+
3373+ var xValue = x[xKey];
3374+ var yValue = y[xKey];
3375+
3376+ // reference equal, so don't worry about it
3377+ if (xValue === yValue && xKey !== 'value' && xKey !== 'checked'
3378+ || category === 'a0' && _VirtualDom_equalEvents(xValue, yValue))
3379+ {
3380+ continue;
3381+ }
3382+
3383+ diff = diff || {};
3384+ diff[xKey] = yValue;
3385+ }
3386+
3387+ // add new stuff
3388+ for (var yKey in y)
3389+ {
3390+ if (!(yKey in x))
3391+ {
3392+ diff = diff || {};
3393+ diff[yKey] = y[yKey];
3394+ }
3395+ }
3396+
3397+ return diff;
3398+}
3399+
3400+
3401+
3402+// DIFF KIDS
3403+
3404+
3405+function _VirtualDom_diffKids(xParent, yParent, patches, index)
3406+{
3407+ var xKids = xParent.e;
3408+ var yKids = yParent.e;
3409+
3410+ var xLen = xKids.length;
3411+ var yLen = yKids.length;
3412+
3413+ // FIGURE OUT IF THERE ARE INSERTS OR REMOVALS
3414+
3415+ if (xLen > yLen)
3416+ {
3417+ _VirtualDom_pushPatch(patches, 6, index, {
3418+ v: yLen,
3419+ i: xLen - yLen
3420+ });
3421+ }
3422+ else if (xLen < yLen)
3423+ {
3424+ _VirtualDom_pushPatch(patches, 7, index, {
3425+ v: xLen,
3426+ e: yKids
3427+ });
3428+ }
3429+
3430+ // PAIRWISE DIFF EVERYTHING ELSE
3431+
3432+ for (var minLen = xLen < yLen ? xLen : yLen, i = 0; i < minLen; i++)
3433+ {
3434+ var xKid = xKids[i];
3435+ _VirtualDom_diffHelp(xKid, yKids[i], patches, ++index);
3436+ index += xKid.b || 0;
3437+ }
3438+}
3439+
3440+
3441+
3442+// KEYED DIFF
3443+
3444+
3445+function _VirtualDom_diffKeyedKids(xParent, yParent, patches, rootIndex)
3446+{
3447+ var localPatches = [];
3448+
3449+ var changes = {}; // Dict String Entry
3450+ var inserts = []; // Array { index : Int, entry : Entry }
3451+ // type Entry = { tag : String, vnode : VNode, index : Int, data : _ }
3452+
3453+ var xKids = xParent.e;
3454+ var yKids = yParent.e;
3455+ var xLen = xKids.length;
3456+ var yLen = yKids.length;
3457+ var xIndex = 0;
3458+ var yIndex = 0;
3459+
3460+ var index = rootIndex;
3461+
3462+ while (xIndex < xLen && yIndex < yLen)
3463+ {
3464+ var x = xKids[xIndex];
3465+ var y = yKids[yIndex];
3466+
3467+ var xKey = x.a;
3468+ var yKey = y.a;
3469+ var xNode = x.b;
3470+ var yNode = y.b;
3471+
3472+ var newMatch = undefined;
3473+ var oldMatch = undefined;
3474+
3475+ // check if keys match
3476+
3477+ if (xKey === yKey)
3478+ {
3479+ index++;
3480+ _VirtualDom_diffHelp(xNode, yNode, localPatches, index);
3481+ index += xNode.b || 0;
3482+
3483+ xIndex++;
3484+ yIndex++;
3485+ continue;
3486+ }
3487+
3488+ // look ahead 1 to detect insertions and removals.
3489+
3490+ var xNext = xKids[xIndex + 1];
3491+ var yNext = yKids[yIndex + 1];
3492+
3493+ if (xNext)
3494+ {
3495+ var xNextKey = xNext.a;
3496+ var xNextNode = xNext.b;
3497+ oldMatch = yKey === xNextKey;
3498+ }
3499+
3500+ if (yNext)
3501+ {
3502+ var yNextKey = yNext.a;
3503+ var yNextNode = yNext.b;
3504+ newMatch = xKey === yNextKey;
3505+ }
3506+
3507+
3508+ // swap x and y
3509+ if (newMatch && oldMatch)
3510+ {
3511+ index++;
3512+ _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index);
3513+ _VirtualDom_insertNode(changes, localPatches, xKey, yNode, yIndex, inserts);
3514+ index += xNode.b || 0;
3515+
3516+ index++;
3517+ _VirtualDom_removeNode(changes, localPatches, xKey, xNextNode, index);
3518+ index += xNextNode.b || 0;
3519+
3520+ xIndex += 2;
3521+ yIndex += 2;
3522+ continue;
3523+ }
3524+
3525+ // insert y
3526+ if (newMatch)
3527+ {
3528+ index++;
3529+ _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts);
3530+ _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index);
3531+ index += xNode.b || 0;
3532+
3533+ xIndex += 1;
3534+ yIndex += 2;
3535+ continue;
3536+ }
3537+
3538+ // remove x
3539+ if (oldMatch)
3540+ {
3541+ index++;
3542+ _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index);
3543+ index += xNode.b || 0;
3544+
3545+ index++;
3546+ _VirtualDom_diffHelp(xNextNode, yNode, localPatches, index);
3547+ index += xNextNode.b || 0;
3548+
3549+ xIndex += 2;
3550+ yIndex += 1;
3551+ continue;
3552+ }
3553+
3554+ // remove x, insert y
3555+ if (xNext && xNextKey === yNextKey)
3556+ {
3557+ index++;
3558+ _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index);
3559+ _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts);
3560+ index += xNode.b || 0;
3561+
3562+ index++;
3563+ _VirtualDom_diffHelp(xNextNode, yNextNode, localPatches, index);
3564+ index += xNextNode.b || 0;
3565+
3566+ xIndex += 2;
3567+ yIndex += 2;
3568+ continue;
3569+ }
3570+
3571+ break;
3572+ }
3573+
3574+ // eat up any remaining nodes with removeNode and insertNode
3575+
3576+ while (xIndex < xLen)
3577+ {
3578+ index++;
3579+ var x = xKids[xIndex];
3580+ var xNode = x.b;
3581+ _VirtualDom_removeNode(changes, localPatches, x.a, xNode, index);
3582+ index += xNode.b || 0;
3583+ xIndex++;
3584+ }
3585+
3586+ while (yIndex < yLen)
3587+ {
3588+ var endInserts = endInserts || [];
3589+ var y = yKids[yIndex];
3590+ _VirtualDom_insertNode(changes, localPatches, y.a, y.b, undefined, endInserts);
3591+ yIndex++;
3592+ }
3593+
3594+ if (localPatches.length > 0 || inserts.length > 0 || endInserts)
3595+ {
3596+ _VirtualDom_pushPatch(patches, 8, rootIndex, {
3597+ w: localPatches,
3598+ x: inserts,
3599+ y: endInserts
3600+ });
3601+ }
3602+}
3603+
3604+
3605+
3606+// CHANGES FROM KEYED DIFF
3607+
3608+
3609+var _VirtualDom_POSTFIX = '_elmW6BL';
3610+
3611+
3612+function _VirtualDom_insertNode(changes, localPatches, key, vnode, yIndex, inserts)
3613+{
3614+ var entry = changes[key];
3615+
3616+ // never seen this key before
3617+ if (!entry)
3618+ {
3619+ entry = {
3620+ c: 0,
3621+ z: vnode,
3622+ r: yIndex,
3623+ s: undefined
3624+ };
3625+
3626+ inserts.push({ r: yIndex, A: entry });
3627+ changes[key] = entry;
3628+
3629+ return;
3630+ }
3631+
3632+ // this key was removed earlier, a match!
3633+ if (entry.c === 1)
3634+ {
3635+ inserts.push({ r: yIndex, A: entry });
3636+
3637+ entry.c = 2;
3638+ var subPatches = [];
3639+ _VirtualDom_diffHelp(entry.z, vnode, subPatches, entry.r);
3640+ entry.r = yIndex;
3641+ entry.s.s = {
3642+ w: subPatches,
3643+ A: entry
3644+ };
3645+
3646+ return;
3647+ }
3648+
3649+ // this key has already been inserted or moved, a duplicate!
3650+ _VirtualDom_insertNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, yIndex, inserts);
3651+}
3652+
3653+
3654+function _VirtualDom_removeNode(changes, localPatches, key, vnode, index)
3655+{
3656+ var entry = changes[key];
3657+
3658+ // never seen this key before
3659+ if (!entry)
3660+ {
3661+ var patch = _VirtualDom_pushPatch(localPatches, 9, index, undefined);
3662+
3663+ changes[key] = {
3664+ c: 1,
3665+ z: vnode,
3666+ r: index,
3667+ s: patch
3668+ };
3669+
3670+ return;
3671+ }
3672+
3673+ // this key was inserted earlier, a match!
3674+ if (entry.c === 0)
3675+ {
3676+ entry.c = 2;
3677+ var subPatches = [];
3678+ _VirtualDom_diffHelp(vnode, entry.z, subPatches, index);
3679+
3680+ _VirtualDom_pushPatch(localPatches, 9, index, {
3681+ w: subPatches,
3682+ A: entry
3683+ });
3684+
3685+ return;
3686+ }
3687+
3688+ // this key has already been removed or moved, a duplicate!
3689+ _VirtualDom_removeNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, index);
3690+}
3691+
3692+
3693+
3694+// ADD DOM NODES
3695+//
3696+// Each DOM node has an "index" assigned in order of traversal. It is important
3697+// to minimize our crawl over the actual DOM, so these indexes (along with the
3698+// descendantsCount of virtual nodes) let us skip touching entire subtrees of
3699+// the DOM if we know there are no patches there.
3700+
3701+
3702+function _VirtualDom_addDomNodes(domNode, vNode, patches, eventNode)
3703+{
3704+ _VirtualDom_addDomNodesHelp(domNode, vNode, patches, 0, 0, vNode.b, eventNode);
3705+}
3706+
3707+
3708+// assumes `patches` is non-empty and indexes increase monotonically.
3709+function _VirtualDom_addDomNodesHelp(domNode, vNode, patches, i, low, high, eventNode)
3710+{
3711+ var patch = patches[i];
3712+ var index = patch.r;
3713+
3714+ while (index === low)
3715+ {
3716+ var patchType = patch.$;
3717+
3718+ if (patchType === 1)
3719+ {
3720+ _VirtualDom_addDomNodes(domNode, vNode.k, patch.s, eventNode);
3721+ }
3722+ else if (patchType === 8)
3723+ {
3724+ patch.t = domNode;
3725+ patch.u = eventNode;
3726+
3727+ var subPatches = patch.s.w;
3728+ if (subPatches.length > 0)
3729+ {
3730+ _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode);
3731+ }
3732+ }
3733+ else if (patchType === 9)
3734+ {
3735+ patch.t = domNode;
3736+ patch.u = eventNode;
3737+
3738+ var data = patch.s;
3739+ if (data)
3740+ {
3741+ data.A.s = domNode;
3742+ var subPatches = data.w;
3743+ if (subPatches.length > 0)
3744+ {
3745+ _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode);
3746+ }
3747+ }
3748+ }
3749+ else
3750+ {
3751+ patch.t = domNode;
3752+ patch.u = eventNode;
3753+ }
3754+
3755+ i++;
3756+
3757+ if (!(patch = patches[i]) || (index = patch.r) > high)
3758+ {
3759+ return i;
3760+ }
3761+ }
3762+
3763+ var tag = vNode.$;
3764+
3765+ if (tag === 4)
3766+ {
3767+ var subNode = vNode.k;
3768+
3769+ while (subNode.$ === 4)
3770+ {
3771+ subNode = subNode.k;
3772+ }
3773+
3774+ return _VirtualDom_addDomNodesHelp(domNode, subNode, patches, i, low + 1, high, _VirtualDom_getMeta(domNode).elm_event_node_ref);
3775+ }
3776+
3777+ // tag must be 1 or 2 at this point
3778+
3779+ var vKids = vNode.e;
3780+ var childNodes = _Lynx_getChildren(domNode);
3781+ for (var j = 0; j < vKids.length; j++)
3782+ {
3783+ low++;
3784+ var vKid = tag === 1 ? vKids[j] : vKids[j].b;
3785+ var nextLow = low + (vKid.b || 0);
3786+ if (low <= index && index <= nextLow)
3787+ {
3788+ i = _VirtualDom_addDomNodesHelp(childNodes[j], vKid, patches, i, low, nextLow, eventNode);
3789+ if (!(patch = patches[i]) || (index = patch.r) > high)
3790+ {
3791+ return i;
3792+ }
3793+ }
3794+ low = nextLow;
3795+ }
3796+ return i;
3797+}
3798+
3799+
3800+
3801+// APPLY PATCHES
3802+
3803+
3804+function _VirtualDom_applyPatches(rootDomNode, oldVirtualNode, patches, eventNode)
3805+{
3806+ if (patches.length === 0)
3807+ {
3808+ return rootDomNode;
3809+ }
3810+
3811+ _VirtualDom_addDomNodes(rootDomNode, oldVirtualNode, patches, eventNode);
3812+ return _VirtualDom_applyPatchesHelp(rootDomNode, patches);
3813+}
3814+
3815+function _VirtualDom_applyPatchesHelp(rootDomNode, patches)
3816+{
3817+ for (var i = 0; i < patches.length; i++)
3818+ {
3819+ var patch = patches[i];
3820+ var localDomNode = patch.t
3821+ var newNode = _VirtualDom_applyPatch(localDomNode, patch);
3822+ if (localDomNode === rootDomNode)
3823+ {
3824+ rootDomNode = newNode;
3825+ }
3826+ }
3827+ return rootDomNode;
3828+}
3829+
3830+function _VirtualDom_applyPatch(domNode, patch)
3831+{
3832+ switch (patch.$)
3833+ {
3834+ case 0:
3835+ return _VirtualDom_applyPatchRedraw(domNode, patch.s, patch.u);
3836+
3837+ case 4:
3838+ _VirtualDom_applyFacts(domNode, patch.u, patch.s);
3839+ return domNode;
3840+
3841+ case 3:
3842+ _Lynx_setAttribute(domNode, 'content', patch.s);
3843+ return domNode;
3844+
3845+ case 1:
3846+ return _VirtualDom_applyPatchesHelp(domNode, patch.s);
3847+
3848+ case 2:
3849+ if (_VirtualDom_getMeta(domNode).elm_event_node_ref)
3850+ {
3851+ _VirtualDom_getMeta(domNode).elm_event_node_ref.j = patch.s;
3852+ }
3853+ else
3854+ {
3855+ _VirtualDom_getMeta(domNode).elm_event_node_ref = { j: patch.s, p: patch.u };
3856+ }
3857+ return domNode;
3858+
3859+ case 6:
3860+ var data = patch.s;
3861+ for (var i = 0; i < data.i; i++)
3862+ {
3863+ var children = _Lynx_getChildren(domNode);
3864+ _Lynx_removeElement(domNode, children[data.v]);
3865+ }
3866+ return domNode;
3867+
3868+ case 7:
3869+ var data = patch.s;
3870+ var kids = data.e;
3871+ for (var i = data.v; i < kids.length; i++)
3872+ {
3873+ _Lynx_appendChild(domNode, _VirtualDom_render(kids[i], patch.u));
3874+ }
3875+ return domNode;
3876+
3877+ case 9:
3878+ var data = patch.s;
3879+ if (!data)
3880+ {
3881+ _Lynx_removeElement(_Lynx_getParent(domNode), domNode);
3882+ return domNode;
3883+ }
3884+ var entry = data.A;
3885+ if (typeof entry.r !== 'undefined')
3886+ {
3887+ _Lynx_removeElement(_Lynx_getParent(domNode), domNode);
3888+ }
3889+ entry.s = _VirtualDom_applyPatchesHelp(domNode, data.w);
3890+ return domNode;
3891+
3892+ case 8:
3893+ return _VirtualDom_applyPatchReorder(domNode, patch);
3894+
3895+ case 5:
3896+ return patch.s(domNode);
3897+
3898+ default:
3899+ _Debug_crash(10); // 'Ran into an unknown patch!'
3900+ }
3901+}
3902+
3903+
3904+function _VirtualDom_applyPatchRedraw(domNode, vNode, eventNode)
3905+{
3906+ var parentNode = _Lynx_getParent(domNode);
3907+ var newNode = _VirtualDom_render(vNode, eventNode);
3908+
3909+ if (!_VirtualDom_getMeta(newNode).elm_event_node_ref)
3910+ {
3911+ _VirtualDom_getMeta(newNode).elm_event_node_ref = _VirtualDom_getMeta(domNode).elm_event_node_ref;
3912+ }
3913+
3914+ if (parentNode && newNode !== domNode)
3915+ {
3916+ _Lynx_replaceElement(parentNode, newNode, domNode);
3917+ }
3918+ return newNode;
3919+}
3920+
3921+
3922+function _VirtualDom_applyPatchReorder(domNode, patch)
3923+{
3924+ var data = patch.s;
3925+
3926+ // remove end inserts
3927+ var endInsertNodes = _VirtualDom_applyPatchReorderEndInsertsHelp(data.y, patch);
3928+
3929+ // removals
3930+ domNode = _VirtualDom_applyPatchesHelp(domNode, data.w);
3931+
3932+ // inserts
3933+ var inserts = data.x;
3934+ for (var i = 0; i < inserts.length; i++)
3935+ {
3936+ var insert = inserts[i];
3937+ var entry = insert.A;
3938+ var node = entry.c === 2
3939+ ? entry.s
3940+ : _VirtualDom_render(entry.z, patch.u);
3941+ var children = _Lynx_getChildren(domNode);
3942+ _Lynx_insertBefore(domNode, node, children[insert.r]);
3943+ }
3944+
3945+ // add end inserts
3946+ if (endInsertNodes)
3947+ {
3948+ for (var i = 0; i < endInsertNodes.length; i++)
3949+ {
3950+ _Lynx_appendChild(domNode, endInsertNodes[i]);
3951+ }
3952+ }
3953+
3954+ return domNode;
3955+}
3956+
3957+
3958+function _VirtualDom_applyPatchReorderEndInsertsHelp(endInserts, patch)
3959+{
3960+ if (!endInserts)
3961+ {
3962+ return;
3963+ }
3964+
3965+ var nodes = [];
3966+ for (var i = 0; i < endInserts.length; i++)
3967+ {
3968+ var insert = endInserts[i];
3969+ var entry = insert.A;
3970+ nodes.push(entry.c === 2
3971+ ? entry.s
3972+ : _VirtualDom_render(entry.z, patch.u)
3973+ );
3974+ }
3975+ return nodes;
3976+}
3977+
3978+
3979+function _VirtualDom_dekey(keyedNode)
3980+{
3981+ var keyedKids = keyedNode.e;
3982+ var len = keyedKids.length;
3983+ var kids = new Array(len);
3984+ for (var i = 0; i < len; i++)
3985+ {
3986+ kids[i] = keyedKids[i].b;
3987+ }
3988+
3989+ return {
3990+ $: 1,
3991+ c: keyedNode.c,
3992+ d: keyedNode.d,
3993+ e: kids,
3994+ f: keyedNode.f,
3995+ b: keyedNode.b
3996+ };
3997+}
3998+
3999+
4000+
4001+// LYNXJS PAPI WRAPPERS
4002+var _Browser_lynx = (typeof globalThis !== 'undefined' ? globalThis : scope);
4003+var _Browser_createPage = _Browser_lynx['_' + '_CreatePage'] || function() { return {}; };
4004+
4005+
4006+
4007+// ELEMENT
4008+
4009+
4010+var _Debugger_element;
4011+
4012+var _Browser_element = _Debugger_element || F4(function(impl, flagDecoder, debugMetadata, args)
4013+{
4014+ return _Platform_initialize(
4015+ flagDecoder,
4016+ args,
4017+ impl.init,
4018+ impl.update,
4019+ impl.subscriptions,
4020+ function(sendToApp, initialModel) {
4021+ var view = impl.view;
4022+ var domNode = args['node'] || _Browser_createPage();
4023+ var currNode = view(initialModel);
4024+ var currDomNode = _VirtualDom_render(currNode, sendToApp);
4025+ _VirtualDom_appendChild(domNode, currDomNode);
4026+
4027+ return _Browser_makeAnimator(initialModel, function(model)
4028+ {
4029+ var nextNode = view(model);
4030+ var patches = _VirtualDom_diff(currNode, nextNode);
4031+ currDomNode = _VirtualDom_applyPatches(currDomNode, currNode, patches, sendToApp);
4032+ currNode = nextNode;
4033+ });
4034+ }
4035+ );
4036+});
4037+
4038+
4039+
4040+// DOCUMENT
4041+
4042+
4043+var _Debugger_document;
4044+
4045+var _Browser_document = _Debugger_document || F4(function(impl, flagDecoder, debugMetadata, args)
4046+{
4047+ return _Platform_initialize(
4048+ flagDecoder,
4049+ args,
4050+ impl.init,
4051+ impl.update,
4052+ impl.subscriptions,
4053+ function(sendToApp, initialModel) {
4054+ var view = impl.view;
4055+ var rootNode = args['node'] || _Browser_createPage();
4056+ var doc = view(initialModel);
4057+ var currNode = _VirtualDom_node('view')(_List_Nil)(doc.body);
4058+ var currDomNode = _VirtualDom_render(currNode, sendToApp);
4059+ _VirtualDom_appendChild(rootNode, currDomNode);
4060+
4061+ return _Browser_makeAnimator(initialModel, function(model)
4062+ {
4063+ var doc = view(model);
4064+ var nextNode = _VirtualDom_node('view')(_List_Nil)(doc.body);
4065+ var patches = _VirtualDom_diff(currNode, nextNode);
4066+ currDomNode = _VirtualDom_applyPatches(currDomNode, currNode, patches, sendToApp);
4067+ currNode = nextNode;
4068+ });
4069+ }
4070+ );
4071+});
4072+
4073+
4074+
4075+// ANIMATION
4076+
4077+
4078+var _Browser_cancelAnimationFrame =
4079+ function(id) { clearTimeout(id); };
4080+
4081+var _Browser_requestAnimationFrame =
4082+ function(callback) { return setTimeout(callback, 1000 / 60); };
4083+
4084+
4085+function _Browser_makeAnimator(model, draw)
4086+{
4087+ draw(model);
4088+
4089+ var state = 0;
4090+
4091+ function updateIfNeeded()
4092+ {
4093+ state = state === 1
4094+ ? 0
4095+ : ( _Browser_requestAnimationFrame(updateIfNeeded), draw(model), 1 );
4096+ }
4097+
4098+ return function(nextModel, isSync)
4099+ {
4100+ model = nextModel;
4101+
4102+ isSync
4103+ ? ( draw(model),
4104+ state === 2 && (state = 1)
4105+ )
4106+ : ( state === 0 && _Browser_requestAnimationFrame(updateIfNeeded),
4107+ state = 2
4108+ );
4109+ };
4110+}
4111+
4112+
4113+
4114+// APPLICATION
4115+
4116+
4117+function _Browser_application(impl)
4118+{
4119+ return _Browser_document({
4120+ init: function(flags)
4121+ {
4122+ return A3(impl.init, flags, _Browser_fakeUrl(), {});
4123+ },
4124+ view: impl.view,
4125+ update: impl.update,
4126+ subscriptions: impl.subscriptions
4127+ });
4128+}
4129+
4130+function _Browser_fakeUrl()
4131+{
4132+ return {
4133+ protocol: { $: 0 },
4134+ host: 'localhost',
4135+ port_: { $: 1 },
4136+ path: '/',
4137+ query: { $: 1 },
4138+ fragment: { $: 1 }
4139+ };
4140+}
4141+
4142+
4143+
4144+var _Browser_go = F2(function(key, n)
4145+{
4146+ return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() {
4147+ // no-op in LynxJS
4148+ key();
4149+ }));
4150+});
4151+
4152+var _Browser_pushUrl = F2(function(key, url)
4153+{
4154+ return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() {
4155+ // no-op in LynxJS
4156+ key();
4157+ }));
4158+});
4159+
4160+var _Browser_replaceUrl = F2(function(key, url)
4161+{
4162+ return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() {
4163+ // no-op in LynxJS
4164+ key();
4165+ }));
4166+});
4167+
4168+
4169+
4170+// GLOBAL EVENTS
4171+
4172+
4173+var _Browser_fakeNode = { addEventListener: function() {}, removeEventListener: function() {} };
4174+var _Browser_doc = typeof document !== 'undefined' ? document : _Browser_fakeNode;
4175+var _Browser_window = typeof window !== 'undefined' ? window : _Browser_fakeNode;
4176+
4177+var _Browser_on = F3(function(node, eventName, sendToSelf)
4178+{
4179+ return _Scheduler_spawn(_Scheduler_binding(function(callback)
4180+ {
4181+ return function() {};
4182+ }));
4183+});
4184+
4185+var _Browser_decodeEvent = F2(function(decoder, event)
4186+{
4187+ var result = _Json_runHelp(decoder, event);
4188+ return $elm$core$Result$isOk(result) ? $elm$core$Maybe$Just(result.a) : $elm$core$Maybe$Nothing;
4189+});
4190+
4191+
4192+
4193+// PAGE VISIBILITY
4194+
4195+
4196+function _Browser_visibilityInfo()
4197+{
4198+ return (typeof _VirtualDom_doc.hidden !== 'undefined')
4199+ ? { hidden: 'hidden', change: 'visibilitychange' }
4200+ :
4201+ (typeof _VirtualDom_doc.mozHidden !== 'undefined')
4202+ ? { hidden: 'mozHidden', change: 'mozvisibilitychange' }
4203+ :
4204+ (typeof _VirtualDom_doc.msHidden !== 'undefined')
4205+ ? { hidden: 'msHidden', change: 'msvisibilitychange' }
4206+ :
4207+ (typeof _VirtualDom_doc.webkitHidden !== 'undefined')
4208+ ? { hidden: 'webkitHidden', change: 'webkitvisibilitychange' }
4209+ : { hidden: 'hidden', change: 'visibilitychange' };
4210+}
4211+
4212+
4213+
4214+// ANIMATION FRAMES
4215+
4216+
4217+function _Browser_rAF()
4218+{
4219+ return _Scheduler_binding(function(callback)
4220+ {
4221+ var id = _Browser_requestAnimationFrame(function() {
4222+ callback(_Scheduler_succeed(Date.now()));
4223+ });
4224+
4225+ return function() {
4226+ _Browser_cancelAnimationFrame(id);
4227+ };
4228+ });
4229+}
4230+
4231+
4232+function _Browser_now()
4233+{
4234+ return _Scheduler_binding(function(callback)
4235+ {
4236+ callback(_Scheduler_succeed(Date.now()));
4237+ });
4238+}
4239+
4240+
4241+
4242+// DOM STUFF
4243+
4244+
4245+function _Browser_withNode(id, doStuff)
4246+{
4247+ return _Scheduler_binding(function(callback)
4248+ {
4249+ callback(_Scheduler_fail($elm$browser$Browser$Dom$NotFound(id)));
4250+ });
4251+}
4252+
4253+
4254+function _Browser_withWindow(doStuff)
4255+{
4256+ return _Scheduler_binding(function(callback)
4257+ {
4258+ _Browser_requestAnimationFrame(function() {
4259+ callback(_Scheduler_succeed(doStuff()));
4260+ });
4261+ });
4262+}
4263+
4264+
4265+// FOCUS and BLUR
4266+
4267+
4268+var _Browser_call = F2(function(functionName, id)
4269+{
4270+ return _Browser_withNode(id, function(node) {
4271+ node[functionName]();
4272+ return _Utils_Tuple0;
4273+ });
4274+});
4275+
4276+
4277+
4278+// WINDOW VIEWPORT
4279+
4280+
4281+function _Browser_getViewport()
4282+{
4283+ return {
4284+ scene: _Browser_getScene(),
4285+ viewport: {
4286+ x: _Browser_window.pageXOffset,
4287+ y: _Browser_window.pageYOffset,
4288+ width: _Browser_doc.documentElement.clientWidth,
4289+ height: _Browser_doc.documentElement.clientHeight
4290+ }
4291+ };
4292+}
4293+
4294+function _Browser_getScene()
4295+{
4296+ var body = _Browser_doc.body;
4297+ var elem = _Browser_doc.documentElement;
4298+ return {
4299+ width: Math.max(body.scrollWidth, body.offsetWidth, elem.scrollWidth, elem.offsetWidth, elem.clientWidth),
4300+ height: Math.max(body.scrollHeight, body.offsetHeight, elem.scrollHeight, elem.offsetHeight, elem.clientHeight)
4301+ };
4302+}
4303+
4304+var _Browser_setViewport = F2(function(x, y)
4305+{
4306+ return _Browser_withWindow(function()
4307+ {
4308+ _Browser_window.scroll(x, y);
4309+ return _Utils_Tuple0;
4310+ });
4311+});
4312+
4313+
4314+
4315+// ELEMENT VIEWPORT
4316+
4317+
4318+function _Browser_getViewportOf(id)
4319+{
4320+ return _Browser_withNode(id, function(node)
4321+ {
4322+ return {
4323+ scene: {
4324+ width: node.scrollWidth,
4325+ height: node.scrollHeight
4326+ },
4327+ viewport: {
4328+ x: node.scrollLeft,
4329+ y: node.scrollTop,
4330+ width: node.clientWidth,
4331+ height: node.clientHeight
4332+ }
4333+ };
4334+ });
4335+}
4336+
4337+
4338+var _Browser_setViewportOf = F3(function(id, x, y)
4339+{
4340+ return _Browser_withNode(id, function(node)
4341+ {
4342+ node.scrollLeft = x;
4343+ node.scrollTop = y;
4344+ return _Utils_Tuple0;
4345+ });
4346+});
4347+
4348+
4349+
4350+// ELEMENT
4351+
4352+
4353+function _Browser_getElement(id)
4354+{
4355+ return _Browser_withNode(id, function(node)
4356+ {
4357+ var rect = node.getBoundingClientRect();
4358+ var x = _Browser_window.pageXOffset;
4359+ var y = _Browser_window.pageYOffset;
4360+ return {
4361+ scene: _Browser_getScene(),
4362+ viewport: {
4363+ x: x,
4364+ y: y,
4365+ width: _Browser_doc.documentElement.clientWidth,
4366+ height: _Browser_doc.documentElement.clientHeight
4367+ },
4368+ element: {
4369+ x: x + rect.left,
4370+ y: y + rect.top,
4371+ width: rect.width,
4372+ height: rect.height
4373+ }
4374+ };
4375+ });
4376+}
4377+
4378+
4379+
4380+// LOAD and RELOAD
4381+
4382+
4383+function _Browser_reload(skipCache)
4384+{
4385+ return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback)
4386+ {
4387+ // no-op in LynxJS
4388+ }));
4389+}
4390+
4391+function _Browser_load(url)
4392+{
4393+ return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback)
4394+ {
4395+ try
4396+ {
4397+ // no-op in LynxJS
4398+ }
4399+ catch(err)
4400+ {
4401+ // Only Firefox can throw a NS_ERROR_MALFORMED_URI exception here.
4402+ // Other browsers reload the page, so let's be consistent about that.
4403+ // no-op in LynxJS
4404+ }
4405+ }));
4406+}
4407+var $author$project$Main$init = {count: 0};
4408+var $elm$core$List$cons = _List_cons;
4409+var $elm$core$Elm$JsArray$foldr = _JsArray_foldr;
4410+var $elm$core$Array$foldr = F3(
4411+ function (func, baseCase, _v0) {
4412+ var tree = _v0.c;
4413+ var tail = _v0.d;
4414+ var helper = F2(
4415+ function (node, acc) {
4416+ if (node.$ === 'SubTree') {
4417+ var subTree = node.a;
4418+ return A3($elm$core$Elm$JsArray$foldr, helper, acc, subTree);
4419+ } else {
4420+ var values = node.a;
4421+ return A3($elm$core$Elm$JsArray$foldr, func, acc, values);
4422+ }
4423+ });
4424+ return A3(
4425+ $elm$core$Elm$JsArray$foldr,
4426+ helper,
4427+ A3($elm$core$Elm$JsArray$foldr, func, baseCase, tail),
4428+ tree);
4429+ });
4430+var $elm$core$Array$toList = function (array) {
4431+ return A3($elm$core$Array$foldr, $elm$core$List$cons, _List_Nil, array);
4432+};
4433+var $elm$core$Dict$foldr = F3(
4434+ function (func, acc, t) {
4435+ foldr:
4436+ while (true) {
4437+ if (t.$ === 'RBEmpty_elm_builtin') {
4438+ return acc;
4439+ } else {
4440+ var key = t.b;
4441+ var value = t.c;
4442+ var left = t.d;
4443+ var right = t.e;
4444+ var $temp$func = func,
4445+ $temp$acc = A3(
4446+ func,
4447+ key,
4448+ value,
4449+ A3($elm$core$Dict$foldr, func, acc, right)),
4450+ $temp$t = left;
4451+ func = $temp$func;
4452+ acc = $temp$acc;
4453+ t = $temp$t;
4454+ continue foldr;
4455+ }
4456+ }
4457+ });
4458+var $elm$core$Dict$toList = function (dict) {
4459+ return A3(
4460+ $elm$core$Dict$foldr,
4461+ F3(
4462+ function (key, value, list) {
4463+ return A2(
4464+ $elm$core$List$cons,
4465+ _Utils_Tuple2(key, value),
4466+ list);
4467+ }),
4468+ _List_Nil,
4469+ dict);
4470+};
4471+var $elm$core$Dict$keys = function (dict) {
4472+ return A3(
4473+ $elm$core$Dict$foldr,
4474+ F3(
4475+ function (key, value, keyList) {
4476+ return A2($elm$core$List$cons, key, keyList);
4477+ }),
4478+ _List_Nil,
4479+ dict);
4480+};
4481+var $elm$core$Set$toList = function (_v0) {
4482+ var dict = _v0.a;
4483+ return $elm$core$Dict$keys(dict);
4484+};
4485+var $elm$core$Basics$EQ = {$: 'EQ'};
4486+var $elm$core$Basics$GT = {$: 'GT'};
4487+var $elm$core$Basics$LT = {$: 'LT'};
4488+var $elm$core$Result$Err = function (a) {
4489+ return {$: 'Err', a: a};
4490+};
4491+var $elm$json$Json$Decode$Failure = F2(
4492+ function (a, b) {
4493+ return {$: 'Failure', a: a, b: b};
4494+ });
4495+var $elm$json$Json$Decode$Field = F2(
4496+ function (a, b) {
4497+ return {$: 'Field', a: a, b: b};
4498+ });
4499+var $elm$json$Json$Decode$Index = F2(
4500+ function (a, b) {
4501+ return {$: 'Index', a: a, b: b};
4502+ });
4503+var $elm$core$Result$Ok = function (a) {
4504+ return {$: 'Ok', a: a};
4505+};
4506+var $elm$json$Json$Decode$OneOf = function (a) {
4507+ return {$: 'OneOf', a: a};
4508+};
4509+var $elm$core$Basics$False = {$: 'False'};
4510+var $elm$core$Basics$add = _Basics_add;
4511+var $elm$core$Maybe$Just = function (a) {
4512+ return {$: 'Just', a: a};
4513+};
4514+var $elm$core$Maybe$Nothing = {$: 'Nothing'};
4515+var $elm$core$String$all = _String_all;
4516+var $elm$core$Basics$and = _Basics_and;
4517+var $elm$core$Basics$append = _Utils_append;
4518+var $elm$json$Json$Encode$encode = _Json_encode;
4519+var $elm$core$String$fromInt = _String_fromNumber;
4520+var $elm$core$String$join = F2(
4521+ function (sep, chunks) {
4522+ return A2(
4523+ _String_join,
4524+ sep,
4525+ _List_toArray(chunks));
4526+ });
4527+var $elm$core$String$split = F2(
4528+ function (sep, string) {
4529+ return _List_fromArray(
4530+ A2(_String_split, sep, string));
4531+ });
4532+var $elm$json$Json$Decode$indent = function (str) {
4533+ return A2(
4534+ $elm$core$String$join,
4535+ '\n ',
4536+ A2($elm$core$String$split, '\n', str));
4537+};
4538+var $elm$core$List$foldl = F3(
4539+ function (func, acc, list) {
4540+ foldl:
4541+ while (true) {
4542+ if (!list.b) {
4543+ return acc;
4544+ } else {
4545+ var x = list.a;
4546+ var xs = list.b;
4547+ var $temp$func = func,
4548+ $temp$acc = A2(func, x, acc),
4549+ $temp$list = xs;
4550+ func = $temp$func;
4551+ acc = $temp$acc;
4552+ list = $temp$list;
4553+ continue foldl;
4554+ }
4555+ }
4556+ });
4557+var $elm$core$List$length = function (xs) {
4558+ return A3(
4559+ $elm$core$List$foldl,
4560+ F2(
4561+ function (_v0, i) {
4562+ return i + 1;
4563+ }),
4564+ 0,
4565+ xs);
4566+};
4567+var $elm$core$List$map2 = _List_map2;
4568+var $elm$core$Basics$le = _Utils_le;
4569+var $elm$core$Basics$sub = _Basics_sub;
4570+var $elm$core$List$rangeHelp = F3(
4571+ function (lo, hi, list) {
4572+ rangeHelp:
4573+ while (true) {
4574+ if (_Utils_cmp(lo, hi) < 1) {
4575+ var $temp$lo = lo,
4576+ $temp$hi = hi - 1,
4577+ $temp$list = A2($elm$core$List$cons, hi, list);
4578+ lo = $temp$lo;
4579+ hi = $temp$hi;
4580+ list = $temp$list;
4581+ continue rangeHelp;
4582+ } else {
4583+ return list;
4584+ }
4585+ }
4586+ });
4587+var $elm$core$List$range = F2(
4588+ function (lo, hi) {
4589+ return A3($elm$core$List$rangeHelp, lo, hi, _List_Nil);
4590+ });
4591+var $elm$core$List$indexedMap = F2(
4592+ function (f, xs) {
4593+ return A3(
4594+ $elm$core$List$map2,
4595+ f,
4596+ A2(
4597+ $elm$core$List$range,
4598+ 0,
4599+ $elm$core$List$length(xs) - 1),
4600+ xs);
4601+ });
4602+var $elm$core$Char$toCode = _Char_toCode;
4603+var $elm$core$Char$isLower = function (_char) {
4604+ var code = $elm$core$Char$toCode(_char);
4605+ return (97 <= code) && (code <= 122);
4606+};
4607+var $elm$core$Char$isUpper = function (_char) {
4608+ var code = $elm$core$Char$toCode(_char);
4609+ return (code <= 90) && (65 <= code);
4610+};
4611+var $elm$core$Basics$or = _Basics_or;
4612+var $elm$core$Char$isAlpha = function (_char) {
4613+ return $elm$core$Char$isLower(_char) || $elm$core$Char$isUpper(_char);
4614+};
4615+var $elm$core$Char$isDigit = function (_char) {
4616+ var code = $elm$core$Char$toCode(_char);
4617+ return (code <= 57) && (48 <= code);
4618+};
4619+var $elm$core$Char$isAlphaNum = function (_char) {
4620+ return $elm$core$Char$isLower(_char) || ($elm$core$Char$isUpper(_char) || $elm$core$Char$isDigit(_char));
4621+};
4622+var $elm$core$List$reverse = function (list) {
4623+ return A3($elm$core$List$foldl, $elm$core$List$cons, _List_Nil, list);
4624+};
4625+var $elm$core$String$uncons = _String_uncons;
4626+var $elm$json$Json$Decode$errorOneOf = F2(
4627+ function (i, error) {
4628+ return '\n\n(' + ($elm$core$String$fromInt(i + 1) + (') ' + $elm$json$Json$Decode$indent(
4629+ $elm$json$Json$Decode$errorToString(error))));
4630+ });
4631+var $elm$json$Json$Decode$errorToString = function (error) {
4632+ return A2($elm$json$Json$Decode$errorToStringHelp, error, _List_Nil);
4633+};
4634+var $elm$json$Json$Decode$errorToStringHelp = F2(
4635+ function (error, context) {
4636+ errorToStringHelp:
4637+ while (true) {
4638+ switch (error.$) {
4639+ case 'Field':
4640+ var f = error.a;
4641+ var err = error.b;
4642+ var isSimple = function () {
4643+ var _v1 = $elm$core$String$uncons(f);
4644+ if (_v1.$ === 'Nothing') {
4645+ return false;
4646+ } else {
4647+ var _v2 = _v1.a;
4648+ var _char = _v2.a;
4649+ var rest = _v2.b;
4650+ return $elm$core$Char$isAlpha(_char) && A2($elm$core$String$all, $elm$core$Char$isAlphaNum, rest);
4651+ }
4652+ }();
4653+ var fieldName = isSimple ? ('.' + f) : ('[\'' + (f + '\']'));
4654+ var $temp$error = err,
4655+ $temp$context = A2($elm$core$List$cons, fieldName, context);
4656+ error = $temp$error;
4657+ context = $temp$context;
4658+ continue errorToStringHelp;
4659+ case 'Index':
4660+ var i = error.a;
4661+ var err = error.b;
4662+ var indexName = '[' + ($elm$core$String$fromInt(i) + ']');
4663+ var $temp$error = err,
4664+ $temp$context = A2($elm$core$List$cons, indexName, context);
4665+ error = $temp$error;
4666+ context = $temp$context;
4667+ continue errorToStringHelp;
4668+ case 'OneOf':
4669+ var errors = error.a;
4670+ if (!errors.b) {
4671+ return 'Ran into a Json.Decode.oneOf with no possibilities' + function () {
4672+ if (!context.b) {
4673+ return '!';
4674+ } else {
4675+ return ' at json' + A2(
4676+ $elm$core$String$join,
4677+ '',
4678+ $elm$core$List$reverse(context));
4679+ }
4680+ }();
4681+ } else {
4682+ if (!errors.b.b) {
4683+ var err = errors.a;
4684+ var $temp$error = err,
4685+ $temp$context = context;
4686+ error = $temp$error;
4687+ context = $temp$context;
4688+ continue errorToStringHelp;
4689+ } else {
4690+ var starter = function () {
4691+ if (!context.b) {
4692+ return 'Json.Decode.oneOf';
4693+ } else {
4694+ return 'The Json.Decode.oneOf at json' + A2(
4695+ $elm$core$String$join,
4696+ '',
4697+ $elm$core$List$reverse(context));
4698+ }
4699+ }();
4700+ var introduction = starter + (' failed in the following ' + ($elm$core$String$fromInt(
4701+ $elm$core$List$length(errors)) + ' ways:'));
4702+ return A2(
4703+ $elm$core$String$join,
4704+ '\n\n',
4705+ A2(
4706+ $elm$core$List$cons,
4707+ introduction,
4708+ A2($elm$core$List$indexedMap, $elm$json$Json$Decode$errorOneOf, errors)));
4709+ }
4710+ }
4711+ default:
4712+ var msg = error.a;
4713+ var json = error.b;
4714+ var introduction = function () {
4715+ if (!context.b) {
4716+ return 'Problem with the given value:\n\n';
4717+ } else {
4718+ return 'Problem with the value at json' + (A2(
4719+ $elm$core$String$join,
4720+ '',
4721+ $elm$core$List$reverse(context)) + ':\n\n ');
4722+ }
4723+ }();
4724+ return introduction + ($elm$json$Json$Decode$indent(
4725+ A2($elm$json$Json$Encode$encode, 4, json)) + ('\n\n' + msg));
4726+ }
4727+ }
4728+ });
4729+var $elm$core$Array$branchFactor = 32;
4730+var $elm$core$Array$Array_elm_builtin = F4(
4731+ function (a, b, c, d) {
4732+ return {$: 'Array_elm_builtin', a: a, b: b, c: c, d: d};
4733+ });
4734+var $elm$core$Elm$JsArray$empty = _JsArray_empty;
4735+var $elm$core$Basics$ceiling = _Basics_ceiling;
4736+var $elm$core$Basics$fdiv = _Basics_fdiv;
4737+var $elm$core$Basics$logBase = F2(
4738+ function (base, number) {
4739+ return _Basics_log(number) / _Basics_log(base);
4740+ });
4741+var $elm$core$Basics$toFloat = _Basics_toFloat;
4742+var $elm$core$Array$shiftStep = $elm$core$Basics$ceiling(
4743+ A2($elm$core$Basics$logBase, 2, $elm$core$Array$branchFactor));
4744+var $elm$core$Array$empty = A4($elm$core$Array$Array_elm_builtin, 0, $elm$core$Array$shiftStep, $elm$core$Elm$JsArray$empty, $elm$core$Elm$JsArray$empty);
4745+var $elm$core$Elm$JsArray$initialize = _JsArray_initialize;
4746+var $elm$core$Array$Leaf = function (a) {
4747+ return {$: 'Leaf', a: a};
4748+};
4749+var $elm$core$Basics$apL = F2(
4750+ function (f, x) {
4751+ return f(x);
4752+ });
4753+var $elm$core$Basics$apR = F2(
4754+ function (x, f) {
4755+ return f(x);
4756+ });
4757+var $elm$core$Basics$eq = _Utils_equal;
4758+var $elm$core$Basics$floor = _Basics_floor;
4759+var $elm$core$Elm$JsArray$length = _JsArray_length;
4760+var $elm$core$Basics$gt = _Utils_gt;
4761+var $elm$core$Basics$max = F2(
4762+ function (x, y) {
4763+ return (_Utils_cmp(x, y) > 0) ? x : y;
4764+ });
4765+var $elm$core$Basics$mul = _Basics_mul;
4766+var $elm$core$Array$SubTree = function (a) {
4767+ return {$: 'SubTree', a: a};
4768+};
4769+var $elm$core$Elm$JsArray$initializeFromList = _JsArray_initializeFromList;
4770+var $elm$core$Array$compressNodes = F2(
4771+ function (nodes, acc) {
4772+ compressNodes:
4773+ while (true) {
4774+ var _v0 = A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, nodes);
4775+ var node = _v0.a;
4776+ var remainingNodes = _v0.b;
4777+ var newAcc = A2(
4778+ $elm$core$List$cons,
4779+ $elm$core$Array$SubTree(node),
4780+ acc);
4781+ if (!remainingNodes.b) {
4782+ return $elm$core$List$reverse(newAcc);
4783+ } else {
4784+ var $temp$nodes = remainingNodes,
4785+ $temp$acc = newAcc;
4786+ nodes = $temp$nodes;
4787+ acc = $temp$acc;
4788+ continue compressNodes;
4789+ }
4790+ }
4791+ });
4792+var $elm$core$Tuple$first = function (_v0) {
4793+ var x = _v0.a;
4794+ return x;
4795+};
4796+var $elm$core$Array$treeFromBuilder = F2(
4797+ function (nodeList, nodeListSize) {
4798+ treeFromBuilder:
4799+ while (true) {
4800+ var newNodeSize = $elm$core$Basics$ceiling(nodeListSize / $elm$core$Array$branchFactor);
4801+ if (newNodeSize === 1) {
4802+ return A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, nodeList).a;
4803+ } else {
4804+ var $temp$nodeList = A2($elm$core$Array$compressNodes, nodeList, _List_Nil),
4805+ $temp$nodeListSize = newNodeSize;
4806+ nodeList = $temp$nodeList;
4807+ nodeListSize = $temp$nodeListSize;
4808+ continue treeFromBuilder;
4809+ }
4810+ }
4811+ });
4812+var $elm$core$Array$builderToArray = F2(
4813+ function (reverseNodeList, builder) {
4814+ if (!builder.nodeListSize) {
4815+ return A4(
4816+ $elm$core$Array$Array_elm_builtin,
4817+ $elm$core$Elm$JsArray$length(builder.tail),
4818+ $elm$core$Array$shiftStep,
4819+ $elm$core$Elm$JsArray$empty,
4820+ builder.tail);
4821+ } else {
4822+ var treeLen = builder.nodeListSize * $elm$core$Array$branchFactor;
4823+ var depth = $elm$core$Basics$floor(
4824+ A2($elm$core$Basics$logBase, $elm$core$Array$branchFactor, treeLen - 1));
4825+ var correctNodeList = reverseNodeList ? $elm$core$List$reverse(builder.nodeList) : builder.nodeList;
4826+ var tree = A2($elm$core$Array$treeFromBuilder, correctNodeList, builder.nodeListSize);
4827+ return A4(
4828+ $elm$core$Array$Array_elm_builtin,
4829+ $elm$core$Elm$JsArray$length(builder.tail) + treeLen,
4830+ A2($elm$core$Basics$max, 5, depth * $elm$core$Array$shiftStep),
4831+ tree,
4832+ builder.tail);
4833+ }
4834+ });
4835+var $elm$core$Basics$idiv = _Basics_idiv;
4836+var $elm$core$Basics$lt = _Utils_lt;
4837+var $elm$core$Array$initializeHelp = F5(
4838+ function (fn, fromIndex, len, nodeList, tail) {
4839+ initializeHelp:
4840+ while (true) {
4841+ if (fromIndex < 0) {
4842+ return A2(
4843+ $elm$core$Array$builderToArray,
4844+ false,
4845+ {nodeList: nodeList, nodeListSize: (len / $elm$core$Array$branchFactor) | 0, tail: tail});
4846+ } else {
4847+ var leaf = $elm$core$Array$Leaf(
4848+ A3($elm$core$Elm$JsArray$initialize, $elm$core$Array$branchFactor, fromIndex, fn));
4849+ var $temp$fn = fn,
4850+ $temp$fromIndex = fromIndex - $elm$core$Array$branchFactor,
4851+ $temp$len = len,
4852+ $temp$nodeList = A2($elm$core$List$cons, leaf, nodeList),
4853+ $temp$tail = tail;
4854+ fn = $temp$fn;
4855+ fromIndex = $temp$fromIndex;
4856+ len = $temp$len;
4857+ nodeList = $temp$nodeList;
4858+ tail = $temp$tail;
4859+ continue initializeHelp;
4860+ }
4861+ }
4862+ });
4863+var $elm$core$Basics$remainderBy = _Basics_remainderBy;
4864+var $elm$core$Array$initialize = F2(
4865+ function (len, fn) {
4866+ if (len <= 0) {
4867+ return $elm$core$Array$empty;
4868+ } else {
4869+ var tailLen = len % $elm$core$Array$branchFactor;
4870+ var tail = A3($elm$core$Elm$JsArray$initialize, tailLen, len - tailLen, fn);
4871+ var initialFromIndex = (len - tailLen) - $elm$core$Array$branchFactor;
4872+ return A5($elm$core$Array$initializeHelp, fn, initialFromIndex, len, _List_Nil, tail);
4873+ }
4874+ });
4875+var $elm$core$Basics$True = {$: 'True'};
4876+var $elm$core$Result$isOk = function (result) {
4877+ if (result.$ === 'Ok') {
4878+ return true;
4879+ } else {
4880+ return false;
4881+ }
4882+};
4883+var $elm$json$Json$Decode$map = _Json_map1;
4884+var $elm$json$Json$Decode$map2 = _Json_map2;
4885+var $elm$json$Json$Decode$succeed = _Json_succeed;
4886+var $elm$virtual_dom$VirtualDom$toHandlerInt = function (handler) {
4887+ switch (handler.$) {
4888+ case 'Normal':
4889+ return 0;
4890+ case 'MayStopPropagation':
4891+ return 1;
4892+ case 'MayPreventDefault':
4893+ return 2;
4894+ default:
4895+ return 3;
4896+ }
4897+};
4898+var $elm$core$Basics$identity = function (x) {
4899+ return x;
4900+};
4901+var $elm$browser$Browser$Dom$NotFound = function (a) {
4902+ return {$: 'NotFound', a: a};
4903+};
4904+var $elm$core$Basics$never = function (_v0) {
4905+ never:
4906+ while (true) {
4907+ var nvr = _v0.a;
4908+ var $temp$_v0 = nvr;
4909+ _v0 = $temp$_v0;
4910+ continue never;
4911+ }
4912+};
4913+var $elm$core$Task$Perform = function (a) {
4914+ return {$: 'Perform', a: a};
4915+};
4916+var $elm$core$Task$succeed = _Scheduler_succeed;
4917+var $elm$core$Task$init = $elm$core$Task$succeed(_Utils_Tuple0);
4918+var $elm$core$List$foldrHelper = F4(
4919+ function (fn, acc, ctr, ls) {
4920+ if (!ls.b) {
4921+ return acc;
4922+ } else {
4923+ var a = ls.a;
4924+ var r1 = ls.b;
4925+ if (!r1.b) {
4926+ return A2(fn, a, acc);
4927+ } else {
4928+ var b = r1.a;
4929+ var r2 = r1.b;
4930+ if (!r2.b) {
4931+ return A2(
4932+ fn,
4933+ a,
4934+ A2(fn, b, acc));
4935+ } else {
4936+ var c = r2.a;
4937+ var r3 = r2.b;
4938+ if (!r3.b) {
4939+ return A2(
4940+ fn,
4941+ a,
4942+ A2(
4943+ fn,
4944+ b,
4945+ A2(fn, c, acc)));
4946+ } else {
4947+ var d = r3.a;
4948+ var r4 = r3.b;
4949+ var res = (ctr > 500) ? A3(
4950+ $elm$core$List$foldl,
4951+ fn,
4952+ acc,
4953+ $elm$core$List$reverse(r4)) : A4($elm$core$List$foldrHelper, fn, acc, ctr + 1, r4);
4954+ return A2(
4955+ fn,
4956+ a,
4957+ A2(
4958+ fn,
4959+ b,
4960+ A2(
4961+ fn,
4962+ c,
4963+ A2(fn, d, res))));
4964+ }
4965+ }
4966+ }
4967+ }
4968+ });
4969+var $elm$core$List$foldr = F3(
4970+ function (fn, acc, ls) {
4971+ return A4($elm$core$List$foldrHelper, fn, acc, 0, ls);
4972+ });
4973+var $elm$core$List$map = F2(
4974+ function (f, xs) {
4975+ return A3(
4976+ $elm$core$List$foldr,
4977+ F2(
4978+ function (x, acc) {
4979+ return A2(
4980+ $elm$core$List$cons,
4981+ f(x),
4982+ acc);
4983+ }),
4984+ _List_Nil,
4985+ xs);
4986+ });
4987+var $elm$core$Task$andThen = _Scheduler_andThen;
4988+var $elm$core$Task$map = F2(
4989+ function (func, taskA) {
4990+ return A2(
4991+ $elm$core$Task$andThen,
4992+ function (a) {
4993+ return $elm$core$Task$succeed(
4994+ func(a));
4995+ },
4996+ taskA);
4997+ });
4998+var $elm$core$Task$map2 = F3(
4999+ function (func, taskA, taskB) {
5000+ return A2(
5001+ $elm$core$Task$andThen,
5002+ function (a) {
5003+ return A2(
5004+ $elm$core$Task$andThen,
5005+ function (b) {
5006+ return $elm$core$Task$succeed(
5007+ A2(func, a, b));
5008+ },
5009+ taskB);
5010+ },
5011+ taskA);
5012+ });
5013+var $elm$core$Task$sequence = function (tasks) {
5014+ return A3(
5015+ $elm$core$List$foldr,
5016+ $elm$core$Task$map2($elm$core$List$cons),
5017+ $elm$core$Task$succeed(_List_Nil),
5018+ tasks);
5019+};
5020+var $elm$core$Platform$sendToApp = _Platform_sendToApp;
5021+var $elm$core$Task$spawnCmd = F2(
5022+ function (router, _v0) {
5023+ var task = _v0.a;
5024+ return _Scheduler_spawn(
5025+ A2(
5026+ $elm$core$Task$andThen,
5027+ $elm$core$Platform$sendToApp(router),
5028+ task));
5029+ });
5030+var $elm$core$Task$onEffects = F3(
5031+ function (router, commands, state) {
5032+ return A2(
5033+ $elm$core$Task$map,
5034+ function (_v0) {
5035+ return _Utils_Tuple0;
5036+ },
5037+ $elm$core$Task$sequence(
5038+ A2(
5039+ $elm$core$List$map,
5040+ $elm$core$Task$spawnCmd(router),
5041+ commands)));
5042+ });
5043+var $elm$core$Task$onSelfMsg = F3(
5044+ function (_v0, _v1, _v2) {
5045+ return $elm$core$Task$succeed(_Utils_Tuple0);
5046+ });
5047+var $elm$core$Task$cmdMap = F2(
5048+ function (tagger, _v0) {
5049+ var task = _v0.a;
5050+ return $elm$core$Task$Perform(
5051+ A2($elm$core$Task$map, tagger, task));
5052+ });
5053+_Platform_effectManagers['Task'] = _Platform_createManager($elm$core$Task$init, $elm$core$Task$onEffects, $elm$core$Task$onSelfMsg, $elm$core$Task$cmdMap);
5054+var $elm$core$Task$command = _Platform_leaf('Task');
5055+var $elm$core$Task$perform = F2(
5056+ function (toMessage, task) {
5057+ return $elm$core$Task$command(
5058+ $elm$core$Task$Perform(
5059+ A2($elm$core$Task$map, toMessage, task)));
5060+ });
5061+var $elm$core$Platform$Cmd$batch = _Platform_batch;
5062+var $elm$core$Platform$Cmd$none = $elm$core$Platform$Cmd$batch(_List_Nil);
5063+var $elm$core$Platform$Sub$batch = _Platform_batch;
5064+var $elm$core$Platform$Sub$none = $elm$core$Platform$Sub$batch(_List_Nil);
5065+var $elm$browser$Browser$sandbox = function (impl) {
5066+ return _Browser_element(
5067+ {
5068+ init: function (_v0) {
5069+ return _Utils_Tuple2(impl.init, $elm$core$Platform$Cmd$none);
5070+ },
5071+ subscriptions: function (_v1) {
5072+ return $elm$core$Platform$Sub$none;
5073+ },
5074+ update: F2(
5075+ function (msg, model) {
5076+ return _Utils_Tuple2(
5077+ A2(impl.update, msg, model),
5078+ $elm$core$Platform$Cmd$none);
5079+ }),
5080+ view: impl.view
5081+ });
5082+};
5083+var $author$project$Main$update = F2(
5084+ function (msg, model) {
5085+ if (msg.$ === 'Increment') {
5086+ return _Utils_update(
5087+ model,
5088+ {count: model.count + 1});
5089+ } else {
5090+ return _Utils_update(
5091+ model,
5092+ {count: model.count - 1});
5093+ }
5094+ });
5095+var $author$project$Main$Decrement = {$: 'Decrement'};
5096+var $author$project$Main$Increment = {$: 'Increment'};
5097+var $elm$virtual_dom$VirtualDom$style = _VirtualDom_style;
5098+var $author$project$Lynx$Attributes$style = $elm$virtual_dom$VirtualDom$style;
5099+var $author$project$Lynx$Attributes$alignItems = $author$project$Lynx$Attributes$style('alignItems');
5100+var $author$project$Lynx$Attributes$backgroundColor = $author$project$Lynx$Attributes$style('backgroundColor');
5101+var $author$project$Lynx$Attributes$intStyle = F2(
5102+ function (key, val) {
5103+ return A2(
5104+ $elm$virtual_dom$VirtualDom$style,
5105+ key,
5106+ $elm$core$String$fromInt(val));
5107+ });
5108+var $author$project$Lynx$Attributes$borderRadius = $author$project$Lynx$Attributes$intStyle('borderRadius');
5109+var $author$project$Lynx$Attributes$color = $author$project$Lynx$Attributes$style('color');
5110+var $author$project$Lynx$Attributes$fontSize = $author$project$Lynx$Attributes$intStyle('fontSize');
5111+var $elm$virtual_dom$VirtualDom$Normal = function (a) {
5112+ return {$: 'Normal', a: a};
5113+};
5114+var $elm$virtual_dom$VirtualDom$on = _VirtualDom_on;
5115+var $author$project$Lynx$Events$onTap = function (msg) {
5116+ return A2(
5117+ $elm$virtual_dom$VirtualDom$on,
5118+ 'tap',
5119+ $elm$virtual_dom$VirtualDom$Normal(
5120+ $elm$json$Json$Decode$succeed(msg)));
5121+};
5122+var $author$project$Lynx$Attributes$paddingBottom = $author$project$Lynx$Attributes$intStyle('paddingBottom');
5123+var $author$project$Lynx$Attributes$paddingLeft = $author$project$Lynx$Attributes$intStyle('paddingLeft');
5124+var $author$project$Lynx$Attributes$paddingRight = $author$project$Lynx$Attributes$intStyle('paddingRight');
5125+var $author$project$Lynx$Attributes$paddingTop = $author$project$Lynx$Attributes$intStyle('paddingTop');
5126+var $elm$virtual_dom$VirtualDom$node = function (tag) {
5127+ return _VirtualDom_node(
5128+ _VirtualDom_noScript(tag));
5129+};
5130+var $author$project$Lynx$text = $elm$virtual_dom$VirtualDom$node('text');
5131+var $elm$virtual_dom$VirtualDom$text = _VirtualDom_text;
5132+var $author$project$Lynx$textContent = $elm$virtual_dom$VirtualDom$text;
5133+var $author$project$Lynx$view = $elm$virtual_dom$VirtualDom$node('view');
5134+var $author$project$Main$button = F2(
5135+ function (msg, label) {
5136+ return A2(
5137+ $author$project$Lynx$view,
5138+ _List_fromArray(
5139+ [
5140+ $author$project$Lynx$Events$onTap(msg),
5141+ $author$project$Lynx$Attributes$backgroundColor('#4a90d9'),
5142+ $author$project$Lynx$Attributes$borderRadius(8),
5143+ $author$project$Lynx$Attributes$paddingTop(12),
5144+ $author$project$Lynx$Attributes$paddingBottom(12),
5145+ $author$project$Lynx$Attributes$paddingLeft(24),
5146+ $author$project$Lynx$Attributes$paddingRight(24)
5147+ ]),
5148+ _List_fromArray(
5149+ [
5150+ A2(
5151+ $author$project$Lynx$text,
5152+ _List_fromArray(
5153+ [
5154+ $author$project$Lynx$Attributes$color('#ffffff'),
5155+ $author$project$Lynx$Attributes$fontSize(24)
5156+ ]),
5157+ _List_fromArray(
5158+ [
5159+ $author$project$Lynx$textContent(label)
5160+ ]))
5161+ ]));
5162+ });
5163+var $author$project$Lynx$Attributes$flex = $author$project$Lynx$Attributes$intStyle('flex');
5164+var $author$project$Lynx$Attributes$flexDirection = $author$project$Lynx$Attributes$style('flexDirection');
5165+var $author$project$Lynx$Attributes$justifyContent = $author$project$Lynx$Attributes$style('justifyContent');
5166+var $author$project$Lynx$Attributes$marginLeft = $author$project$Lynx$Attributes$intStyle('marginLeft');
5167+var $author$project$Lynx$Attributes$marginRight = $author$project$Lynx$Attributes$intStyle('marginRight');
5168+var $author$project$Main$view = function (model) {
5169+ return A2(
5170+ $author$project$Lynx$view,
5171+ _List_fromArray(
5172+ [
5173+ $author$project$Lynx$Attributes$flexDirection('column'),
5174+ $author$project$Lynx$Attributes$alignItems('center'),
5175+ $author$project$Lynx$Attributes$justifyContent('center'),
5176+ $author$project$Lynx$Attributes$flex(1)
5177+ ]),
5178+ _List_fromArray(
5179+ [
5180+ A2(
5181+ $author$project$Lynx$view,
5182+ _List_fromArray(
5183+ [
5184+ $author$project$Lynx$Attributes$flexDirection('row'),
5185+ $author$project$Lynx$Attributes$alignItems('center')
5186+ ]),
5187+ _List_fromArray(
5188+ [
5189+ A2($author$project$Main$button, $author$project$Main$Decrement, '-'),
5190+ A2(
5191+ $author$project$Lynx$text,
5192+ _List_fromArray(
5193+ [
5194+ $author$project$Lynx$Attributes$fontSize(32),
5195+ $author$project$Lynx$Attributes$marginLeft(20),
5196+ $author$project$Lynx$Attributes$marginRight(20)
5197+ ]),
5198+ _List_fromArray(
5199+ [
5200+ $author$project$Lynx$textContent(
5201+ $elm$core$String$fromInt(model.count))
5202+ ])),
5203+ A2($author$project$Main$button, $author$project$Main$Increment, '+')
5204+ ]))
5205+ ]));
5206+};
5207+var $author$project$Main$main = $elm$browser$Browser$sandbox(
5208+ {init: $author$project$Main$init, update: $author$project$Main$update, view: $author$project$Main$view});
5209+_Platform_export({'Main':{'init':$author$project$Main$main(
5210+ $elm$json$Json$Decode$succeed(_Utils_Tuple0))(0)}});}(this));
5211+var app = Elm.Main.init({});
5212+</script>
5213+</body>
5214+</html>