diff --git a/Makefile b/Makefile index f588f37..71d8c84 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,7 @@ -build: install - elm make src/Main.elm --output=build/main.js +.PHONY: all build clean -install: - elm package install +build: + elm make src/Main.elm --output=build/main.js run: - elm live src/Main.elm --output=build/main.js --open --debug + elm-live src/Main.elm --open --debug -- --output=build/main.js diff --git a/README.md b/README.md index b87916c..92e2dde 100644 --- a/README.md +++ b/README.md @@ -6,5 +6,9 @@ nice [intro](http://www.hevanet.com/cristofd/brainfuck/epistle.html) and [Fabian](https://copy.sh/) for the great [art](https://copy.sh/brainfuck/) that came prior to mine. +**You need to have [Elm](https://guide.elm-lang.org/install/elm.html) and +[elm-live](https://www.elm-live.com/) installed.** + To play around with the debugger, go to [my site](http://minond.xyz/brainfuck/) -or run locally by downloading this repo and running `make install run`. +or run locally by downloading this repo and running `make run`. Use `make build` +to update `build/main.js` accordingly. diff --git a/build/main.js b/build/main.js index 3d3f76d..84a2c38 100644 --- a/build/main.js +++ b/build/main.js @@ -1,7506 +1,2793 @@ - -(function() { +(function(scope){ 'use strict'; -function F2(fun) -{ - function wrapper(a) { return function(b) { return fun(a,b); }; } - wrapper.arity = 2; - wrapper.func = fun; +function F(arity, fun, wrapper) { + wrapper.a = arity; + wrapper.f = fun; return wrapper; } -function F3(fun) -{ - function wrapper(a) { +function F2(fun) { + return F(2, fun, function(a) { return function(b) { return fun(a,b); }; }) +} +function F3(fun) { + return F(3, fun, function(a) { return function(b) { return function(c) { return fun(a, b, c); }; }; - } - wrapper.arity = 3; - wrapper.func = fun; - return wrapper; + }); } - -function F4(fun) -{ - function wrapper(a) { return function(b) { return function(c) { +function F4(fun) { + return F(4, fun, function(a) { return function(b) { return function(c) { return function(d) { return fun(a, b, c, d); }; }; }; - } - wrapper.arity = 4; - wrapper.func = fun; - return wrapper; + }); } - -function F5(fun) -{ - function wrapper(a) { return function(b) { return function(c) { +function F5(fun) { + return F(5, fun, function(a) { return function(b) { return function(c) { return function(d) { return function(e) { return fun(a, b, c, d, e); }; }; }; }; - } - wrapper.arity = 5; - wrapper.func = fun; - return wrapper; + }); } - -function F6(fun) -{ - function wrapper(a) { return function(b) { return function(c) { +function F6(fun) { + return F(6, fun, function(a) { return function(b) { return function(c) { return function(d) { return function(e) { return function(f) { return fun(a, b, c, d, e, f); }; }; }; }; }; - } - wrapper.arity = 6; - wrapper.func = fun; - return wrapper; + }); } - -function F7(fun) -{ - function wrapper(a) { return function(b) { return function(c) { +function F7(fun) { + return F(7, fun, function(a) { return function(b) { return function(c) { return function(d) { return function(e) { return function(f) { return function(g) { return fun(a, b, c, d, e, f, g); }; }; }; }; }; }; - } - wrapper.arity = 7; - wrapper.func = fun; - return wrapper; + }); } - -function F8(fun) -{ - function wrapper(a) { return function(b) { return function(c) { +function F8(fun) { + return F(8, fun, function(a) { return function(b) { return function(c) { return function(d) { return function(e) { return function(f) { return function(g) { return function(h) { return fun(a, b, c, d, e, f, g, h); }; }; }; }; }; }; }; - } - wrapper.arity = 8; - wrapper.func = fun; - return wrapper; + }); } - -function F9(fun) -{ - function wrapper(a) { return function(b) { return function(c) { +function F9(fun) { + return F(9, fun, function(a) { return function(b) { return function(c) { return function(d) { return function(e) { return function(f) { return function(g) { return function(h) { return function(i) { return fun(a, b, c, d, e, f, g, h, i); }; }; }; }; }; }; }; }; - } - wrapper.arity = 9; - wrapper.func = fun; - return wrapper; + }); } -function A2(fun, a, b) -{ - return fun.arity === 2 - ? fun.func(a, b) - : fun(a)(b); +function A2(fun, a, b) { + return fun.a === 2 ? fun.f(a, b) : fun(a)(b); } -function A3(fun, a, b, c) -{ - return fun.arity === 3 - ? fun.func(a, b, c) - : fun(a)(b)(c); +function A3(fun, a, b, c) { + return fun.a === 3 ? fun.f(a, b, c) : fun(a)(b)(c); } -function A4(fun, a, b, c, d) -{ - return fun.arity === 4 - ? fun.func(a, b, c, d) - : fun(a)(b)(c)(d); +function A4(fun, a, b, c, d) { + return fun.a === 4 ? fun.f(a, b, c, d) : fun(a)(b)(c)(d); } -function A5(fun, a, b, c, d, e) -{ - return fun.arity === 5 - ? fun.func(a, b, c, d, e) - : fun(a)(b)(c)(d)(e); +function A5(fun, a, b, c, d, e) { + return fun.a === 5 ? fun.f(a, b, c, d, e) : fun(a)(b)(c)(d)(e); } -function A6(fun, a, b, c, d, e, f) -{ - return fun.arity === 6 - ? fun.func(a, b, c, d, e, f) - : fun(a)(b)(c)(d)(e)(f); +function A6(fun, a, b, c, d, e, f) { + return fun.a === 6 ? fun.f(a, b, c, d, e, f) : fun(a)(b)(c)(d)(e)(f); } -function A7(fun, a, b, c, d, e, f, g) -{ - return fun.arity === 7 - ? fun.func(a, b, c, d, e, f, g) - : fun(a)(b)(c)(d)(e)(f)(g); +function A7(fun, a, b, c, d, e, f, g) { + return fun.a === 7 ? fun.f(a, b, c, d, e, f, g) : fun(a)(b)(c)(d)(e)(f)(g); } -function A8(fun, a, b, c, d, e, f, g, h) -{ - return fun.arity === 8 - ? fun.func(a, b, c, d, e, f, g, h) - : fun(a)(b)(c)(d)(e)(f)(g)(h); +function A8(fun, a, b, c, d, e, f, g, h) { + return fun.a === 8 ? fun.f(a, b, c, d, e, f, g, h) : fun(a)(b)(c)(d)(e)(f)(g)(h); } -function A9(fun, a, b, c, d, e, f, g, h, i) -{ - return fun.arity === 9 - ? fun.func(a, b, c, d, e, f, g, h, i) - : fun(a)(b)(c)(d)(e)(f)(g)(h)(i); +function A9(fun, a, b, c, d, e, f, g, h, i) { + 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); } -//import Native.Utils // +console.warn('Compiled in DEV mode. Follow the advice at https://elm-lang.org/0.19.1/optimize for better performance and smaller assets.'); + + +var _List_Nil_UNUSED = { $: 0 }; +var _List_Nil = { $: '[]' }; -var _elm_lang$core$Native_Basics = function() { +function _List_Cons_UNUSED(hd, tl) { return { $: 1, a: hd, b: tl }; } +function _List_Cons(hd, tl) { return { $: '::', a: hd, b: tl }; } -function div(a, b) + +var _List_cons = F2(_List_Cons); + +function _List_fromArray(arr) { - return (a / b) | 0; + var out = _List_Nil; + for (var i = arr.length; i--; ) + { + out = _List_Cons(arr[i], out); + } + return out; } -function rem(a, b) + +function _List_toArray(xs) { - return a % b; + for (var out = []; xs.b; xs = xs.b) // WHILE_CONS + { + out.push(xs.a); + } + return out; } -function mod(a, b) + +var _List_map2 = F3(function(f, xs, ys) { - if (b === 0) + for (var arr = []; xs.b && ys.b; xs = xs.b, ys = ys.b) // WHILE_CONSES { - throw new Error('Cannot perform mod 0. Division by zero error.'); + arr.push(A2(f, xs.a, ys.a)); } - var r = a % b; - var m = a === 0 ? 0 : (b > 0 ? (a >= 0 ? r : r + b) : -mod(-a, -b)); + return _List_fromArray(arr); +}); - return m === b ? 0 : m; -} -function logBase(base, n) +var _List_map3 = F4(function(f, xs, ys, zs) { - return Math.log(n) / Math.log(base); -} -function negate(n) + for (var arr = []; xs.b && ys.b && zs.b; xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES + { + arr.push(A3(f, xs.a, ys.a, zs.a)); + } + return _List_fromArray(arr); +}); + +var _List_map4 = F5(function(f, ws, xs, ys, zs) { - return -n; -} -function abs(n) + 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 + { + arr.push(A4(f, ws.a, xs.a, ys.a, zs.a)); + } + return _List_fromArray(arr); +}); + +var _List_map5 = F6(function(f, vs, ws, xs, ys, zs) { - return n < 0 ? -n : n; -} + 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 + { + arr.push(A5(f, vs.a, ws.a, xs.a, ys.a, zs.a)); + } + return _List_fromArray(arr); +}); -function min(a, b) +var _List_sortBy = F2(function(f, xs) { - return _elm_lang$core$Native_Utils.cmp(a, b) < 0 ? a : b; -} -function max(a, b) + return _List_fromArray(_List_toArray(xs).sort(function(a, b) { + return _Utils_cmp(f(a), f(b)); + })); +}); + +var _List_sortWith = F2(function(f, xs) +{ + return _List_fromArray(_List_toArray(xs).sort(function(a, b) { + var ord = A2(f, a, b); + return ord === $elm$core$Basics$EQ ? 0 : ord === $elm$core$Basics$LT ? -1 : 1; + })); +}); + + + +var _JsArray_empty = []; + +function _JsArray_singleton(value) { - return _elm_lang$core$Native_Utils.cmp(a, b) > 0 ? a : b; + return [value]; } -function clamp(lo, hi, n) + +function _JsArray_length(array) { - return _elm_lang$core$Native_Utils.cmp(n, lo) < 0 - ? lo - : _elm_lang$core$Native_Utils.cmp(n, hi) > 0 - ? hi - : n; + return array.length; } -var ord = ['LT', 'EQ', 'GT']; +var _JsArray_initialize = F3(function(size, offset, func) +{ + var result = new Array(size); + + for (var i = 0; i < size; i++) + { + result[i] = func(offset + i); + } + + return result; +}); -function compare(x, y) +var _JsArray_initializeFromList = F2(function (max, ls) { - return { ctor: ord[_elm_lang$core$Native_Utils.cmp(x, y) + 1] }; -} + var result = new Array(max); -function xor(a, b) + for (var i = 0; i < max && ls.b; i++) + { + result[i] = ls.a; + ls = ls.b; + } + + result.length = i; + return _Utils_Tuple2(result, ls); +}); + +var _JsArray_unsafeGet = F2(function(index, array) { - return a !== b; -} -function not(b) + return array[index]; +}); + +var _JsArray_unsafeSet = F3(function(index, value, array) { - return !b; -} -function isInfinite(n) + var length = array.length; + var result = new Array(length); + + for (var i = 0; i < length; i++) + { + result[i] = array[i]; + } + + result[index] = value; + return result; +}); + +var _JsArray_push = F2(function(value, array) { - return n === Infinity || n === -Infinity; -} + var length = array.length; + var result = new Array(length + 1); -function truncate(n) + for (var i = 0; i < length; i++) + { + result[i] = array[i]; + } + + result[length] = value; + return result; +}); + +var _JsArray_foldl = F3(function(func, acc, array) { - return n | 0; -} + var length = array.length; -function degrees(d) + for (var i = 0; i < length; i++) + { + acc = A2(func, array[i], acc); + } + + return acc; +}); + +var _JsArray_foldr = F3(function(func, acc, array) { - return d * Math.PI / 180; -} -function turns(t) + for (var i = array.length - 1; i >= 0; i--) + { + acc = A2(func, array[i], acc); + } + + return acc; +}); + +var _JsArray_map = F2(function(func, array) { - return 2 * Math.PI * t; -} -function fromPolar(point) + var length = array.length; + var result = new Array(length); + + for (var i = 0; i < length; i++) + { + result[i] = func(array[i]); + } + + return result; +}); + +var _JsArray_indexedMap = F3(function(func, offset, array) { - var r = point._0; - var t = point._1; - return _elm_lang$core$Native_Utils.Tuple2(r * Math.cos(t), r * Math.sin(t)); -} -function toPolar(point) + var length = array.length; + var result = new Array(length); + + for (var i = 0; i < length; i++) + { + result[i] = A2(func, offset + i, array[i]); + } + + return result; +}); + +var _JsArray_slice = F3(function(from, to, array) { - var x = point._0; - var y = point._1; - return _elm_lang$core$Native_Utils.Tuple2(Math.sqrt(x * x + y * y), Math.atan2(y, x)); -} + return array.slice(from, to); +}); -return { - div: F2(div), - rem: F2(rem), - mod: F2(mod), +var _JsArray_appendN = F3(function(n, dest, source) +{ + var destLen = dest.length; + var itemsToCopy = n - destLen; - pi: Math.PI, - e: Math.E, - cos: Math.cos, - sin: Math.sin, - tan: Math.tan, - acos: Math.acos, - asin: Math.asin, - atan: Math.atan, - atan2: F2(Math.atan2), + if (itemsToCopy > source.length) + { + itemsToCopy = source.length; + } - degrees: degrees, - turns: turns, - fromPolar: fromPolar, - toPolar: toPolar, + var size = destLen + itemsToCopy; + var result = new Array(size); - sqrt: Math.sqrt, - logBase: F2(logBase), - negate: negate, - abs: abs, - min: F2(min), - max: F2(max), - clamp: F3(clamp), - compare: F2(compare), + for (var i = 0; i < destLen; i++) + { + result[i] = dest[i]; + } - xor: F2(xor), - not: not, + for (var i = 0; i < itemsToCopy; i++) + { + result[i + destLen] = source[i]; + } - truncate: truncate, - ceiling: Math.ceil, - floor: Math.floor, - round: Math.round, - toFloat: function(x) { return x; }, - isNaN: isNaN, - isInfinite: isInfinite -}; + return result; +}); -}(); -//import // -var _elm_lang$core$Native_Utils = function() { -// COMPARISONS +// LOG -function eq(x, y) +var _Debug_log_UNUSED = F2(function(tag, value) { - var stack = []; - var isEqual = eqHelp(x, y, 0, stack); - var pair; - while (isEqual && (pair = stack.pop())) - { - isEqual = eqHelp(pair.x, pair.y, 0, stack); - } - return isEqual; + return value; +}); + +var _Debug_log = F2(function(tag, value) +{ + console.log(tag + ': ' + _Debug_toString(value)); + return value; +}); + + +// TODOS + +function _Debug_todo(moduleName, region) +{ + return function(message) { + _Debug_crash(8, moduleName, region, message); + }; +} + +function _Debug_todoCase(moduleName, region, value) +{ + return function(message) { + _Debug_crash(9, moduleName, region, value, message); + }; } -function eqHelp(x, y, depth, stack) +// TO STRING + +function _Debug_toString_UNUSED(value) { - if (depth > 100) + return ''; +} + +function _Debug_toString(value) +{ + return _Debug_toAnsiString(false, value); +} + +function _Debug_toAnsiString(ansi, value) +{ + if (typeof value === 'function') { - stack.push({ x: x, y: y }); - return true; + return _Debug_internalColor(ansi, ''); } - if (x === y) + if (typeof value === 'boolean') { - return true; + return _Debug_ctorColor(ansi, value ? 'True' : 'False'); } - if (typeof x !== 'object') + if (typeof value === 'number') { - if (typeof x === 'function') - { - throw new Error( - 'Trying to use `(==)` on functions. There is no way to know if functions are "the same" in the Elm sense.' - + ' Read more about this at http://package.elm-lang.org/packages/elm-lang/core/latest/Basics#==' - + ' which describes why it is this way and what the better version will look like.' - ); - } - return false; + return _Debug_numberColor(ansi, value + ''); } - if (x === null || y === null) + if (value instanceof String) { - return false + return _Debug_charColor(ansi, "'" + _Debug_addSlashes(value, true) + "'"); } - if (x instanceof Date) + if (typeof value === 'string') { - return x.getTime() === y.getTime(); + return _Debug_stringColor(ansi, '"' + _Debug_addSlashes(value, false) + '"'); } - if (!('ctor' in x)) + if (typeof value === 'object' && '$' in value) { - for (var key in x) + var tag = value.$; + + if (typeof tag === 'number') + { + return _Debug_internalColor(ansi, ''); + } + + if (tag[0] === '#') { - if (!eqHelp(x[key], y[key], depth + 1, stack)) + var output = []; + for (var k in value) { - return false; + if (k === '$') continue; + output.push(_Debug_toAnsiString(ansi, value[k])); } + return '(' + output.join(',') + ')'; } - return true; - } - // convert Dicts and Sets to lists - if (x.ctor === 'RBNode_elm_builtin' || x.ctor === 'RBEmpty_elm_builtin') - { - x = _elm_lang$core$Dict$toList(x); - y = _elm_lang$core$Dict$toList(y); - } - if (x.ctor === 'Set_elm_builtin') - { - x = _elm_lang$core$Set$toList(x); - y = _elm_lang$core$Set$toList(y); - } + if (tag === 'Set_elm_builtin') + { + return _Debug_ctorColor(ansi, 'Set') + + _Debug_fadeColor(ansi, '.fromList') + ' ' + + _Debug_toAnsiString(ansi, $elm$core$Set$toList(value)); + } - // check if lists are equal without recursion - if (x.ctor === '::') - { - var a = x; - var b = y; - while (a.ctor === '::' && b.ctor === '::') + if (tag === 'RBNode_elm_builtin' || tag === 'RBEmpty_elm_builtin') { - if (!eqHelp(a._0, b._0, depth + 1, stack)) - { - return false; - } - a = a._1; - b = b._1; + return _Debug_ctorColor(ansi, 'Dict') + + _Debug_fadeColor(ansi, '.fromList') + ' ' + + _Debug_toAnsiString(ansi, $elm$core$Dict$toList(value)); } - return a.ctor === b.ctor; - } - // check if Arrays are equal - if (x.ctor === '_Array') - { - var xs = _elm_lang$core$Native_Array.toJSArray(x); - var ys = _elm_lang$core$Native_Array.toJSArray(y); - if (xs.length !== ys.length) + if (tag === 'Array_elm_builtin') { - return false; + return _Debug_ctorColor(ansi, 'Array') + + _Debug_fadeColor(ansi, '.fromList') + ' ' + + _Debug_toAnsiString(ansi, $elm$core$Array$toList(value)); } - for (var i = 0; i < xs.length; i++) + + if (tag === '::' || tag === '[]') { - if (!eqHelp(xs[i], ys[i], depth + 1, stack)) + var output = '['; + + value.b && (output += _Debug_toAnsiString(ansi, value.a), value = value.b) + + for (; value.b; value = value.b) // WHILE_CONS { - return false; + output += ',' + _Debug_toAnsiString(ansi, value.a); } + return output + ']'; } - return true; - } - if (!eqHelp(x.ctor, y.ctor, depth + 1, stack)) - { - return false; + var output = ''; + for (var i in value) + { + if (i === '$') continue; + var str = _Debug_toAnsiString(ansi, value[i]); + var c0 = str[0]; + var parenless = c0 === '{' || c0 === '(' || c0 === '[' || c0 === '<' || c0 === '"' || str.indexOf(' ') < 0; + output += ' ' + (parenless ? str : '(' + str + ')'); + } + return _Debug_ctorColor(ansi, tag) + output; } - for (var key in x) + if (typeof value === 'object') { - if (!eqHelp(x[key], y[key], depth + 1, stack)) + var output = []; + for (var key in value) { - return false; + var field = key[0] === '_' ? key.slice(1) : key; + output.push(_Debug_fadeColor(ansi, field) + ' = ' + _Debug_toAnsiString(ansi, value[key])); + } + if (output.length === 0) + { + return '{}'; } + return '{ ' + output.join(', ') + ' }'; } - return true; -} -// Code in Generate/JavaScript.hs, Basics.js, and List.js depends on -// the particular integer values assigned to LT, EQ, and GT. - -var LT = -1, EQ = 0, GT = 1; + return _Debug_internalColor(ansi, ''); +} -function cmp(x, y) +function _Debug_addSlashes(str, isChar) { - if (typeof x !== 'object') - { - return x === y ? EQ : x < y ? LT : GT; - } + var s = str + .replace(/\\/g, '\\\\') + .replace(/\n/g, '\\n') + .replace(/\t/g, '\\t') + .replace(/\r/g, '\\r') + .replace(/\v/g, '\\v') + .replace(/\0/g, '\\0'); - if (x instanceof String) + if (isChar) { - var a = x.valueOf(); - var b = y.valueOf(); - return a === b ? EQ : a < b ? LT : GT; + return s.replace(/\'/g, '\\\''); } - - if (x.ctor === '::' || x.ctor === '[]') + else { - while (x.ctor === '::' && y.ctor === '::') - { - var ord = cmp(x._0, y._0); - if (ord !== EQ) - { - return ord; - } - x = x._1; - y = y._1; - } - return x.ctor === y.ctor ? EQ : x.ctor === '[]' ? LT : GT; - } - - if (x.ctor.slice(0, 6) === '_Tuple') - { - var ord; - var n = x.ctor.slice(6) - 0; - var err = 'cannot compare tuples with more than 6 elements.'; - if (n === 0) return EQ; - if (n >= 1) { ord = cmp(x._0, y._0); if (ord !== EQ) return ord; - if (n >= 2) { ord = cmp(x._1, y._1); if (ord !== EQ) return ord; - if (n >= 3) { ord = cmp(x._2, y._2); if (ord !== EQ) return ord; - if (n >= 4) { ord = cmp(x._3, y._3); if (ord !== EQ) return ord; - if (n >= 5) { ord = cmp(x._4, y._4); if (ord !== EQ) return ord; - if (n >= 6) { ord = cmp(x._5, y._5); if (ord !== EQ) return ord; - if (n >= 7) throw new Error('Comparison error: ' + err); } } } } } } - return EQ; + return s.replace(/\"/g, '\\"'); } +} - throw new Error( - 'Comparison error: comparison is only defined on ints, ' - + 'floats, times, chars, strings, lists of comparable values, ' - + 'and tuples of comparable values.' - ); +function _Debug_ctorColor(ansi, string) +{ + return ansi ? '\x1b[96m' + string + '\x1b[0m' : string; } +function _Debug_numberColor(ansi, string) +{ + return ansi ? '\x1b[95m' + string + '\x1b[0m' : string; +} -// COMMON VALUES +function _Debug_stringColor(ansi, string) +{ + return ansi ? '\x1b[93m' + string + '\x1b[0m' : string; +} -var Tuple0 = { - ctor: '_Tuple0' -}; +function _Debug_charColor(ansi, string) +{ + return ansi ? '\x1b[92m' + string + '\x1b[0m' : string; +} -function Tuple2(x, y) +function _Debug_fadeColor(ansi, string) { - return { - ctor: '_Tuple2', - _0: x, - _1: y - }; + return ansi ? '\x1b[37m' + string + '\x1b[0m' : string; } -function chr(c) +function _Debug_internalColor(ansi, string) { - return new String(c); + return ansi ? '\x1b[94m' + string + '\x1b[0m' : string; } -// GUID -var count = 0; -function guid(_) +// CRASH + + +function _Debug_crash_UNUSED(identifier) { - return count++; + throw new Error('https://github.com/elm/core/blob/1.0.0/hints/' + identifier + '.md'); } -// RECORDS - -function update(oldRecord, updatedFields) +function _Debug_crash(identifier, fact1, fact2, fact3, fact4) { - var newRecord = {}; - - for (var key in oldRecord) + switch(identifier) { - newRecord[key] = oldRecord[key]; - } + case 0: + 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.'); - for (var key in updatedFields) - { - newRecord[key] = updatedFields[key]; - } + case 1: + 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.'); - return newRecord; -} + case 2: + var jsonErrorString = fact1; + throw new Error('Problem with the flags given to your Elm program on initialization.\n\n' + jsonErrorString); + case 3: + var portName = fact1; + throw new Error('There can only be one port named `' + portName + '`, but your program has multiple.'); -//// LIST STUFF //// + case 4: + var portName = fact1; + var problem = fact2; + throw new Error('Trying to send an unexpected type of value through port `' + portName + '`:\n' + problem); -var Nil = { ctor: '[]' }; + case 5: + 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.'); -function Cons(hd, tl) -{ - return { - ctor: '::', - _0: hd, - _1: tl - }; -} + case 6: + var moduleName = fact1; + 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!'); -function append(xs, ys) -{ - // append Strings - if (typeof xs === 'string') - { - return xs + ys; + case 8: + var moduleName = fact1; + var region = fact2; + var message = fact3; + throw new Error('TODO in module `' + moduleName + '` ' + _Debug_regionToString(region) + '\n\n' + message); + + case 9: + var moduleName = fact1; + var region = fact2; + var value = fact3; + var message = fact4; + throw new Error( + 'TODO in module `' + moduleName + '` from the `case` expression ' + + _Debug_regionToString(region) + '\n\nIt received the following value:\n\n ' + + _Debug_toString(value).replace('\n', '\n ') + + '\n\nBut the branch that handles it says:\n\n ' + message.replace('\n', '\n ') + ); + + case 10: + throw new Error('Bug in https://github.com/elm/virtual-dom/issues'); + + case 11: + throw new Error('Cannot perform mod 0. Division by zero error.'); } +} - // append Lists - if (xs.ctor === '[]') +function _Debug_regionToString(region) +{ + if (region.start.line === region.end.line) { - return ys; - } - var root = Cons(xs._0, Nil); - var curr = root; - xs = xs._1; - while (xs.ctor !== '[]') - { - curr._1 = Cons(xs._0, Nil); - xs = xs._1; - curr = curr._1; + return 'on line ' + region.start.line; } - curr._1 = ys; - return root; + return 'on lines ' + region.start.line + ' through ' + region.end.line; } -// CRASHES -function crash(moduleName, region) -{ - return function(message) { - throw new Error( - 'Ran into a `Debug.crash` in module `' + moduleName + '` ' + regionToString(region) + '\n' - + 'The message provided by the code author is:\n\n ' - + message - ); - }; -} +// EQUALITY -function crashCase(moduleName, region, value) +function _Utils_eq(x, y) { - return function(message) { - throw new Error( - 'Ran into a `Debug.crash` in module `' + moduleName + '`\n\n' - + 'This was caused by the `case` expression ' + regionToString(region) + '.\n' - + 'One of the branches ended with a crash and the following value got through:\n\n ' + toString(value) + '\n\n' - + 'The message provided by the code author is:\n\n ' - + message - ); - }; + for ( + var pair, stack = [], isEqual = _Utils_eqHelp(x, y, 0, stack); + isEqual && (pair = stack.pop()); + isEqual = _Utils_eqHelp(pair.a, pair.b, 0, stack) + ) + {} + + return isEqual; } -function regionToString(region) +function _Utils_eqHelp(x, y, depth, stack) { - if (region.start.line == region.end.line) + if (depth > 100) { - return 'on line ' + region.start.line; + stack.push(_Utils_Tuple2(x,y)); + return true; } - return 'between lines ' + region.start.line + ' and ' + region.end.line; -} - -// TO STRING + if (x === y) + { + return true; + } -function toString(v) -{ - var type = typeof v; - if (type === 'function') + if (typeof x !== 'object' || x === null || y === null) { - return ''; + typeof x === 'function' && _Debug_crash(5); + return false; } - if (type === 'boolean') + /**/ + if (x.$ === 'Set_elm_builtin') + { + x = $elm$core$Set$toList(x); + y = $elm$core$Set$toList(y); + } + if (x.$ === 'RBNode_elm_builtin' || x.$ === 'RBEmpty_elm_builtin') { - return v ? 'True' : 'False'; + x = $elm$core$Dict$toList(x); + y = $elm$core$Dict$toList(y); } + //*/ - if (type === 'number') + /**_UNUSED/ + if (x.$ < 0) { - return v + ''; + x = $elm$core$Dict$toList(x); + y = $elm$core$Dict$toList(y); } + //*/ - if (v instanceof String) + for (var key in x) { - return '\'' + addSlashes(v, true) + '\''; + if (!_Utils_eqHelp(x[key], y[key], depth + 1, stack)) + { + return false; + } } + return true; +} + +var _Utils_equal = F2(_Utils_eq); +var _Utils_notEqual = F2(function(a, b) { return !_Utils_eq(a,b); }); + + - if (type === 'string') +// COMPARISONS + +// Code in Generate/JavaScript.hs, Basics.js, and List.js depends on +// the particular integer values assigned to LT, EQ, and GT. + +function _Utils_cmp(x, y, ord) +{ + if (typeof x !== 'object') { - return '"' + addSlashes(v, false) + '"'; + return x === y ? /*EQ*/ 0 : x < y ? /*LT*/ -1 : /*GT*/ 1; } - if (v === null) + /**/ + if (x instanceof String) { - return 'null'; + var a = x.valueOf(); + var b = y.valueOf(); + return a === b ? 0 : a < b ? -1 : 1; } + //*/ - if (type === 'object' && 'ctor' in v) + /**_UNUSED/ + if (!x.$) + //*/ + /**/ + if (x.$[0] === '#') + //*/ { - var ctorStarter = v.ctor.substring(0, 5); + return (ord = _Utils_cmp(x.a, y.a)) + ? ord + : (ord = _Utils_cmp(x.b, y.b)) + ? ord + : _Utils_cmp(x.c, y.c); + } - if (ctorStarter === '_Tupl') - { - var output = []; - for (var k in v) - { - if (k === 'ctor') continue; - output.push(toString(v[k])); - } - return '(' + output.join(',') + ')'; - } + // traverse conses until end of a list or a mismatch + for (; x.b && y.b && !(ord = _Utils_cmp(x.a, y.a)); x = x.b, y = y.b) {} // WHILE_CONSES + return ord || (x.b ? /*GT*/ 1 : y.b ? /*LT*/ -1 : /*EQ*/ 0); +} - if (ctorStarter === '_Task') - { - return '' - } +var _Utils_lt = F2(function(a, b) { return _Utils_cmp(a, b) < 0; }); +var _Utils_le = F2(function(a, b) { return _Utils_cmp(a, b) < 1; }); +var _Utils_gt = F2(function(a, b) { return _Utils_cmp(a, b) > 0; }); +var _Utils_ge = F2(function(a, b) { return _Utils_cmp(a, b) >= 0; }); - if (v.ctor === '_Array') - { - var list = _elm_lang$core$Array$toList(v); - return 'Array.fromList ' + toString(list); - } +var _Utils_compare = F2(function(x, y) +{ + var n = _Utils_cmp(x, y); + return n < 0 ? $elm$core$Basics$LT : n ? $elm$core$Basics$GT : $elm$core$Basics$EQ; +}); - if (v.ctor === '') - { - return ''; - } - if (v.ctor === '_Process') - { - return ''; - } +// COMMON VALUES - if (v.ctor === '::') - { - var output = '[' + toString(v._0); - v = v._1; - while (v.ctor === '::') - { - output += ',' + toString(v._0); - v = v._1; - } - return output + ']'; - } +var _Utils_Tuple0_UNUSED = 0; +var _Utils_Tuple0 = { $: '#0' }; - if (v.ctor === '[]') - { - return '[]'; - } +function _Utils_Tuple2_UNUSED(a, b) { return { a: a, b: b }; } +function _Utils_Tuple2(a, b) { return { $: '#2', a: a, b: b }; } - if (v.ctor === 'Set_elm_builtin') - { - return 'Set.fromList ' + toString(_elm_lang$core$Set$toList(v)); - } +function _Utils_Tuple3_UNUSED(a, b, c) { return { a: a, b: b, c: c }; } +function _Utils_Tuple3(a, b, c) { return { $: '#3', a: a, b: b, c: c }; } - if (v.ctor === 'RBNode_elm_builtin' || v.ctor === 'RBEmpty_elm_builtin') - { - return 'Dict.fromList ' + toString(_elm_lang$core$Dict$toList(v)); - } +function _Utils_chr_UNUSED(c) { return c; } +function _Utils_chr(c) { return new String(c); } - var output = ''; - for (var i in v) - { - if (i === 'ctor') continue; - var str = toString(v[i]); - var c0 = str[0]; - var parenless = c0 === '{' || c0 === '(' || c0 === '<' || c0 === '"' || str.indexOf(' ') < 0; - output += ' ' + (parenless ? str : '(' + str + ')'); - } - return v.ctor + output; - } - if (type === 'object') - { - if (v instanceof Date) - { - return '<' + v.toString() + '>'; - } +// RECORDS - if (v.elm_web_socket) - { - return ''; - } +function _Utils_update(oldRecord, updatedFields) +{ + var newRecord = {}; - var output = []; - for (var k in v) - { - output.push(k + ' = ' + toString(v[k])); - } - if (output.length === 0) - { - return '{}'; - } - return '{ ' + output.join(', ') + ' }'; + for (var key in oldRecord) + { + newRecord[key] = oldRecord[key]; + } + + for (var key in updatedFields) + { + newRecord[key] = updatedFields[key]; } - return ''; + return newRecord; } -function addSlashes(str, isChar) + +// APPEND + +var _Utils_append = F2(_Utils_ap); + +function _Utils_ap(xs, ys) { - var s = str.replace(/\\/g, '\\\\') - .replace(/\n/g, '\\n') - .replace(/\t/g, '\\t') - .replace(/\r/g, '\\r') - .replace(/\v/g, '\\v') - .replace(/\0/g, '\\0'); - if (isChar) + // append Strings + if (typeof xs === 'string') { - return s.replace(/\'/g, '\\\''); + return xs + ys; } - else + + // append Lists + if (!xs.b) { - return s.replace(/\"/g, '\\"'); + return ys; } + var root = _List_Cons(xs.a, ys); + xs = xs.b + for (var curr = root; xs.b; xs = xs.b) // WHILE_CONS + { + curr = curr.b = _List_Cons(xs.a, ys); + } + return root; } -return { - eq: eq, - cmp: cmp, - Tuple0: Tuple0, - Tuple2: Tuple2, - chr: chr, - update: update, - guid: guid, - append: F2(append), +// MATH - crash: crash, - crashCase: crashCase, +var _Basics_add = F2(function(a, b) { return a + b; }); +var _Basics_sub = F2(function(a, b) { return a - b; }); +var _Basics_mul = F2(function(a, b) { return a * b; }); +var _Basics_fdiv = F2(function(a, b) { return a / b; }); +var _Basics_idiv = F2(function(a, b) { return (a / b) | 0; }); +var _Basics_pow = F2(Math.pow); - toString: toString -}; +var _Basics_remainderBy = F2(function(b, a) { return a % b; }); -}(); -var _elm_lang$core$Basics$never = function (_p0) { - never: - while (true) { - var _p1 = _p0; - var _v1 = _p1._0; - _p0 = _v1; - continue never; - } -}; -var _elm_lang$core$Basics$uncurry = F2( - function (f, _p2) { - var _p3 = _p2; - return A2(f, _p3._0, _p3._1); - }); -var _elm_lang$core$Basics$curry = F3( - function (f, a, b) { - return f( - {ctor: '_Tuple2', _0: a, _1: b}); - }); -var _elm_lang$core$Basics$flip = F3( - function (f, b, a) { - return A2(f, a, b); - }); -var _elm_lang$core$Basics$always = F2( - function (a, _p4) { - return a; - }); -var _elm_lang$core$Basics$identity = function (x) { - return x; -}; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['<|'] = F2( - function (f, x) { - return f(x); - }); -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['|>'] = F2( - function (x, f) { - return f(x); - }); -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['>>'] = F3( - function (f, g, x) { - return g( - f(x)); - }); -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['<<'] = F3( - function (g, f, x) { - return g( - f(x)); - }); -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['++'] = _elm_lang$core$Native_Utils.append; -var _elm_lang$core$Basics$toString = _elm_lang$core$Native_Utils.toString; -var _elm_lang$core$Basics$isInfinite = _elm_lang$core$Native_Basics.isInfinite; -var _elm_lang$core$Basics$isNaN = _elm_lang$core$Native_Basics.isNaN; -var _elm_lang$core$Basics$toFloat = _elm_lang$core$Native_Basics.toFloat; -var _elm_lang$core$Basics$ceiling = _elm_lang$core$Native_Basics.ceiling; -var _elm_lang$core$Basics$floor = _elm_lang$core$Native_Basics.floor; -var _elm_lang$core$Basics$truncate = _elm_lang$core$Native_Basics.truncate; -var _elm_lang$core$Basics$round = _elm_lang$core$Native_Basics.round; -var _elm_lang$core$Basics$not = _elm_lang$core$Native_Basics.not; -var _elm_lang$core$Basics$xor = _elm_lang$core$Native_Basics.xor; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['||'] = _elm_lang$core$Native_Basics.or; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['&&'] = _elm_lang$core$Native_Basics.and; -var _elm_lang$core$Basics$max = _elm_lang$core$Native_Basics.max; -var _elm_lang$core$Basics$min = _elm_lang$core$Native_Basics.min; -var _elm_lang$core$Basics$compare = _elm_lang$core$Native_Basics.compare; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['>='] = _elm_lang$core$Native_Basics.ge; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['<='] = _elm_lang$core$Native_Basics.le; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['>'] = _elm_lang$core$Native_Basics.gt; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['<'] = _elm_lang$core$Native_Basics.lt; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['/='] = _elm_lang$core$Native_Basics.neq; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['=='] = _elm_lang$core$Native_Basics.eq; -var _elm_lang$core$Basics$e = _elm_lang$core$Native_Basics.e; -var _elm_lang$core$Basics$pi = _elm_lang$core$Native_Basics.pi; -var _elm_lang$core$Basics$clamp = _elm_lang$core$Native_Basics.clamp; -var _elm_lang$core$Basics$logBase = _elm_lang$core$Native_Basics.logBase; -var _elm_lang$core$Basics$abs = _elm_lang$core$Native_Basics.abs; -var _elm_lang$core$Basics$negate = _elm_lang$core$Native_Basics.negate; -var _elm_lang$core$Basics$sqrt = _elm_lang$core$Native_Basics.sqrt; -var _elm_lang$core$Basics$atan2 = _elm_lang$core$Native_Basics.atan2; -var _elm_lang$core$Basics$atan = _elm_lang$core$Native_Basics.atan; -var _elm_lang$core$Basics$asin = _elm_lang$core$Native_Basics.asin; -var _elm_lang$core$Basics$acos = _elm_lang$core$Native_Basics.acos; -var _elm_lang$core$Basics$tan = _elm_lang$core$Native_Basics.tan; -var _elm_lang$core$Basics$sin = _elm_lang$core$Native_Basics.sin; -var _elm_lang$core$Basics$cos = _elm_lang$core$Native_Basics.cos; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['^'] = _elm_lang$core$Native_Basics.exp; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['%'] = _elm_lang$core$Native_Basics.mod; -var _elm_lang$core$Basics$rem = _elm_lang$core$Native_Basics.rem; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['//'] = _elm_lang$core$Native_Basics.div; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['/'] = _elm_lang$core$Native_Basics.floatDiv; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['*'] = _elm_lang$core$Native_Basics.mul; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['-'] = _elm_lang$core$Native_Basics.sub; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['+'] = _elm_lang$core$Native_Basics.add; -var _elm_lang$core$Basics$toPolar = _elm_lang$core$Native_Basics.toPolar; -var _elm_lang$core$Basics$fromPolar = _elm_lang$core$Native_Basics.fromPolar; -var _elm_lang$core$Basics$turns = _elm_lang$core$Native_Basics.turns; -var _elm_lang$core$Basics$degrees = _elm_lang$core$Native_Basics.degrees; -var _elm_lang$core$Basics$radians = function (t) { - return t; -}; -var _elm_lang$core$Basics$GT = {ctor: 'GT'}; -var _elm_lang$core$Basics$EQ = {ctor: 'EQ'}; -var _elm_lang$core$Basics$LT = {ctor: 'LT'}; -var _elm_lang$core$Basics$JustOneMore = function (a) { - return {ctor: 'JustOneMore', _0: a}; -}; +// https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/divmodnote-letter.pdf +var _Basics_modBy = F2(function(modulus, x) +{ + var answer = x % modulus; + return modulus === 0 + ? _Debug_crash(11) + : + ((answer > 0 && modulus < 0) || (answer < 0 && modulus > 0)) + ? answer + modulus + : answer; +}); -var _elm_lang$core$Maybe$withDefault = F2( - function ($default, maybe) { - var _p0 = maybe; - if (_p0.ctor === 'Just') { - return _p0._0; - } else { - return $default; - } - }); -var _elm_lang$core$Maybe$Nothing = {ctor: 'Nothing'}; -var _elm_lang$core$Maybe$andThen = F2( - function (callback, maybeValue) { - var _p1 = maybeValue; - if (_p1.ctor === 'Just') { - return callback(_p1._0); - } else { - return _elm_lang$core$Maybe$Nothing; - } - }); -var _elm_lang$core$Maybe$Just = function (a) { - return {ctor: 'Just', _0: a}; -}; -var _elm_lang$core$Maybe$map = F2( - function (f, maybe) { - var _p2 = maybe; - if (_p2.ctor === 'Just') { - return _elm_lang$core$Maybe$Just( - f(_p2._0)); - } else { - return _elm_lang$core$Maybe$Nothing; - } - }); -var _elm_lang$core$Maybe$map2 = F3( - function (func, ma, mb) { - var _p3 = {ctor: '_Tuple2', _0: ma, _1: mb}; - if (((_p3.ctor === '_Tuple2') && (_p3._0.ctor === 'Just')) && (_p3._1.ctor === 'Just')) { - return _elm_lang$core$Maybe$Just( - A2(func, _p3._0._0, _p3._1._0)); - } else { - return _elm_lang$core$Maybe$Nothing; - } - }); -var _elm_lang$core$Maybe$map3 = F4( - function (func, ma, mb, mc) { - var _p4 = {ctor: '_Tuple3', _0: ma, _1: mb, _2: mc}; - if ((((_p4.ctor === '_Tuple3') && (_p4._0.ctor === 'Just')) && (_p4._1.ctor === 'Just')) && (_p4._2.ctor === 'Just')) { - return _elm_lang$core$Maybe$Just( - A3(func, _p4._0._0, _p4._1._0, _p4._2._0)); - } else { - return _elm_lang$core$Maybe$Nothing; - } - }); -var _elm_lang$core$Maybe$map4 = F5( - function (func, ma, mb, mc, md) { - var _p5 = {ctor: '_Tuple4', _0: ma, _1: mb, _2: mc, _3: md}; - if (((((_p5.ctor === '_Tuple4') && (_p5._0.ctor === 'Just')) && (_p5._1.ctor === 'Just')) && (_p5._2.ctor === 'Just')) && (_p5._3.ctor === 'Just')) { - return _elm_lang$core$Maybe$Just( - A4(func, _p5._0._0, _p5._1._0, _p5._2._0, _p5._3._0)); - } else { - return _elm_lang$core$Maybe$Nothing; - } - }); -var _elm_lang$core$Maybe$map5 = F6( - function (func, ma, mb, mc, md, me) { - var _p6 = {ctor: '_Tuple5', _0: ma, _1: mb, _2: mc, _3: md, _4: me}; - if ((((((_p6.ctor === '_Tuple5') && (_p6._0.ctor === 'Just')) && (_p6._1.ctor === 'Just')) && (_p6._2.ctor === 'Just')) && (_p6._3.ctor === 'Just')) && (_p6._4.ctor === 'Just')) { - return _elm_lang$core$Maybe$Just( - A5(func, _p6._0._0, _p6._1._0, _p6._2._0, _p6._3._0, _p6._4._0)); - } else { - return _elm_lang$core$Maybe$Nothing; - } - }); -//import Native.Utils // +// TRIGONOMETRY + +var _Basics_pi = Math.PI; +var _Basics_e = Math.E; +var _Basics_cos = Math.cos; +var _Basics_sin = Math.sin; +var _Basics_tan = Math.tan; +var _Basics_acos = Math.acos; +var _Basics_asin = Math.asin; +var _Basics_atan = Math.atan; +var _Basics_atan2 = F2(Math.atan2); + -var _elm_lang$core$Native_List = function() { +// MORE MATH -var Nil = { ctor: '[]' }; +function _Basics_toFloat(x) { return x; } +function _Basics_truncate(n) { return n | 0; } +function _Basics_isInfinite(n) { return n === Infinity || n === -Infinity; } -function Cons(hd, tl) +var _Basics_ceiling = Math.ceil; +var _Basics_floor = Math.floor; +var _Basics_round = Math.round; +var _Basics_sqrt = Math.sqrt; +var _Basics_log = Math.log; +var _Basics_isNaN = isNaN; + + +// BOOLEANS + +function _Basics_not(bool) { return !bool; } +var _Basics_and = F2(function(a, b) { return a && b; }); +var _Basics_or = F2(function(a, b) { return a || b; }); +var _Basics_xor = F2(function(a, b) { return a !== b; }); + + + +var _String_cons = F2(function(chr, str) { - return { ctor: '::', _0: hd, _1: tl }; -} + return chr + str; +}); -function fromArray(arr) +function _String_uncons(string) { - var out = Nil; - for (var i = arr.length; i--; ) - { - out = Cons(arr[i], out); - } - return out; + var word = string.charCodeAt(0); + return word + ? $elm$core$Maybe$Just( + 0xD800 <= word && word <= 0xDBFF + ? _Utils_Tuple2(_Utils_chr(string[0] + string[1]), string.slice(2)) + : _Utils_Tuple2(_Utils_chr(string[0]), string.slice(1)) + ) + : $elm$core$Maybe$Nothing; } -function toArray(xs) +var _String_append = F2(function(a, b) { - var out = []; - while (xs.ctor !== '[]') - { - out.push(xs._0); - xs = xs._1; - } - return out; + return a + b; +}); + +function _String_length(str) +{ + return str.length; } -function foldr(f, b, xs) +var _String_map = F2(function(func, string) { - var arr = toArray(xs); - var acc = b; - for (var i = arr.length; i--; ) + var len = string.length; + var array = new Array(len); + var i = 0; + while (i < len) { - acc = A2(f, arr[i], acc); + var word = string.charCodeAt(i); + if (0xD800 <= word && word <= 0xDBFF) + { + array[i] = func(_Utils_chr(string[i] + string[i+1])); + i += 2; + continue; + } + array[i] = func(_Utils_chr(string[i])); + i++; } - return acc; -} + return array.join(''); +}); -function map2(f, xs, ys) +var _String_filter = F2(function(isGood, str) { var arr = []; - while (xs.ctor !== '[]' && ys.ctor !== '[]') + var len = str.length; + var i = 0; + while (i < len) { - arr.push(A2(f, xs._0, ys._0)); - xs = xs._1; - ys = ys._1; + var char = str[i]; + var word = str.charCodeAt(i); + i++; + if (0xD800 <= word && word <= 0xDBFF) + { + char += str[i]; + i++; + } + + if (isGood(_Utils_chr(char))) + { + arr.push(char); + } } - return fromArray(arr); -} + return arr.join(''); +}); -function map3(f, xs, ys, zs) +function _String_reverse(str) { - var arr = []; - while (xs.ctor !== '[]' && ys.ctor !== '[]' && zs.ctor !== '[]') + var len = str.length; + var arr = new Array(len); + var i = 0; + while (i < len) { - arr.push(A3(f, xs._0, ys._0, zs._0)); - xs = xs._1; - ys = ys._1; - zs = zs._1; + var word = str.charCodeAt(i); + if (0xD800 <= word && word <= 0xDBFF) + { + arr[len - i] = str[i + 1]; + i++; + arr[len - i] = str[i - 1]; + i++; + } + else + { + arr[len - i] = str[i]; + i++; + } } - return fromArray(arr); + return arr.join(''); } -function map4(f, ws, xs, ys, zs) +var _String_foldl = F3(function(func, state, string) { - var arr = []; - while ( ws.ctor !== '[]' - && xs.ctor !== '[]' - && ys.ctor !== '[]' - && zs.ctor !== '[]') - { - arr.push(A4(f, ws._0, xs._0, ys._0, zs._0)); - ws = ws._1; - xs = xs._1; - ys = ys._1; - zs = zs._1; + var len = string.length; + var i = 0; + while (i < len) + { + var char = string[i]; + var word = string.charCodeAt(i); + i++; + if (0xD800 <= word && word <= 0xDBFF) + { + char += string[i]; + i++; + } + state = A2(func, _Utils_chr(char), state); } - return fromArray(arr); -} + return state; +}); -function map5(f, vs, ws, xs, ys, zs) +var _String_foldr = F3(function(func, state, string) { - var arr = []; - while ( vs.ctor !== '[]' - && ws.ctor !== '[]' - && xs.ctor !== '[]' - && ys.ctor !== '[]' - && zs.ctor !== '[]') - { - arr.push(A5(f, vs._0, ws._0, xs._0, ys._0, zs._0)); - vs = vs._1; - ws = ws._1; - xs = xs._1; - ys = ys._1; - zs = zs._1; + var i = string.length; + while (i--) + { + var char = string[i]; + var word = string.charCodeAt(i); + if (0xDC00 <= word && word <= 0xDFFF) + { + i--; + char = string[i] + char; + } + state = A2(func, _Utils_chr(char), state); } - return fromArray(arr); -} + return state; +}); -function sortBy(f, xs) +var _String_split = F2(function(sep, str) { - return fromArray(toArray(xs).sort(function(a, b) { - return _elm_lang$core$Native_Utils.cmp(f(a), f(b)); - })); -} + return str.split(sep); +}); -function sortWith(f, xs) +var _String_join = F2(function(sep, strs) { - return fromArray(toArray(xs).sort(function(a, b) { - var ord = f(a)(b).ctor; - return ord === 'EQ' ? 0 : ord === 'LT' ? -1 : 1; - })); -} - -return { - Nil: Nil, - Cons: Cons, - cons: F2(Cons), - toArray: toArray, - fromArray: fromArray, - - foldr: F3(foldr), - - map2: F3(map2), - map3: F4(map3), - map4: F5(map4), - map5: F6(map5), - sortBy: F2(sortBy), - sortWith: F2(sortWith) -}; - -}(); -var _elm_lang$core$List$sortWith = _elm_lang$core$Native_List.sortWith; -var _elm_lang$core$List$sortBy = _elm_lang$core$Native_List.sortBy; -var _elm_lang$core$List$sort = function (xs) { - return A2(_elm_lang$core$List$sortBy, _elm_lang$core$Basics$identity, xs); -}; -var _elm_lang$core$List$singleton = function (value) { - return { - ctor: '::', - _0: value, - _1: {ctor: '[]'} - }; -}; -var _elm_lang$core$List$drop = F2( - function (n, list) { - drop: - while (true) { - if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { - return list; - } else { - var _p0 = list; - if (_p0.ctor === '[]') { - return list; - } else { - var _v1 = n - 1, - _v2 = _p0._1; - n = _v1; - list = _v2; - continue drop; - } - } - } - }); -var _elm_lang$core$List$map5 = _elm_lang$core$Native_List.map5; -var _elm_lang$core$List$map4 = _elm_lang$core$Native_List.map4; -var _elm_lang$core$List$map3 = _elm_lang$core$Native_List.map3; -var _elm_lang$core$List$map2 = _elm_lang$core$Native_List.map2; -var _elm_lang$core$List$any = F2( - function (isOkay, list) { - any: - while (true) { - var _p1 = list; - if (_p1.ctor === '[]') { - return false; - } else { - if (isOkay(_p1._0)) { - return true; - } else { - var _v4 = isOkay, - _v5 = _p1._1; - isOkay = _v4; - list = _v5; - continue any; - } - } - } - }); -var _elm_lang$core$List$all = F2( - function (isOkay, list) { - return !A2( - _elm_lang$core$List$any, - function (_p2) { - return !isOkay(_p2); - }, - list); - }); -var _elm_lang$core$List$foldr = _elm_lang$core$Native_List.foldr; -var _elm_lang$core$List$foldl = F3( - function (func, acc, list) { - foldl: - while (true) { - var _p3 = list; - if (_p3.ctor === '[]') { - return acc; - } else { - var _v7 = func, - _v8 = A2(func, _p3._0, acc), - _v9 = _p3._1; - func = _v7; - acc = _v8; - list = _v9; - continue foldl; - } - } - }); -var _elm_lang$core$List$length = function (xs) { - return A3( - _elm_lang$core$List$foldl, - F2( - function (_p4, i) { - return i + 1; - }), - 0, - xs); -}; -var _elm_lang$core$List$sum = function (numbers) { - return A3( - _elm_lang$core$List$foldl, - F2( - function (x, y) { - return x + y; - }), - 0, - numbers); -}; -var _elm_lang$core$List$product = function (numbers) { - return A3( - _elm_lang$core$List$foldl, - F2( - function (x, y) { - return x * y; - }), - 1, - numbers); -}; -var _elm_lang$core$List$maximum = function (list) { - var _p5 = list; - if (_p5.ctor === '::') { - return _elm_lang$core$Maybe$Just( - A3(_elm_lang$core$List$foldl, _elm_lang$core$Basics$max, _p5._0, _p5._1)); - } else { - return _elm_lang$core$Maybe$Nothing; - } -}; -var _elm_lang$core$List$minimum = function (list) { - var _p6 = list; - if (_p6.ctor === '::') { - return _elm_lang$core$Maybe$Just( - A3(_elm_lang$core$List$foldl, _elm_lang$core$Basics$min, _p6._0, _p6._1)); - } else { - return _elm_lang$core$Maybe$Nothing; - } -}; -var _elm_lang$core$List$member = F2( - function (x, xs) { - return A2( - _elm_lang$core$List$any, - function (a) { - return _elm_lang$core$Native_Utils.eq(a, x); - }, - xs); - }); -var _elm_lang$core$List$isEmpty = function (xs) { - var _p7 = xs; - if (_p7.ctor === '[]') { - return true; - } else { - return false; - } -}; -var _elm_lang$core$List$tail = function (list) { - var _p8 = list; - if (_p8.ctor === '::') { - return _elm_lang$core$Maybe$Just(_p8._1); - } else { - return _elm_lang$core$Maybe$Nothing; - } -}; -var _elm_lang$core$List$head = function (list) { - var _p9 = list; - if (_p9.ctor === '::') { - return _elm_lang$core$Maybe$Just(_p9._0); - } else { - return _elm_lang$core$Maybe$Nothing; - } -}; -var _elm_lang$core$List_ops = _elm_lang$core$List_ops || {}; -_elm_lang$core$List_ops['::'] = _elm_lang$core$Native_List.cons; -var _elm_lang$core$List$map = F2( - function (f, xs) { - return A3( - _elm_lang$core$List$foldr, - F2( - function (x, acc) { - return { - ctor: '::', - _0: f(x), - _1: acc - }; - }), - {ctor: '[]'}, - xs); - }); -var _elm_lang$core$List$filter = F2( - function (pred, xs) { - var conditionalCons = F2( - function (front, back) { - return pred(front) ? {ctor: '::', _0: front, _1: back} : back; - }); - return A3( - _elm_lang$core$List$foldr, - conditionalCons, - {ctor: '[]'}, - xs); - }); -var _elm_lang$core$List$maybeCons = F3( - function (f, mx, xs) { - var _p10 = f(mx); - if (_p10.ctor === 'Just') { - return {ctor: '::', _0: _p10._0, _1: xs}; - } else { - return xs; - } - }); -var _elm_lang$core$List$filterMap = F2( - function (f, xs) { - return A3( - _elm_lang$core$List$foldr, - _elm_lang$core$List$maybeCons(f), - {ctor: '[]'}, - xs); - }); -var _elm_lang$core$List$reverse = function (list) { - return A3( - _elm_lang$core$List$foldl, - F2( - function (x, y) { - return {ctor: '::', _0: x, _1: y}; - }), - {ctor: '[]'}, - list); -}; -var _elm_lang$core$List$scanl = F3( - function (f, b, xs) { - var scan1 = F2( - function (x, accAcc) { - var _p11 = accAcc; - if (_p11.ctor === '::') { - return { - ctor: '::', - _0: A2(f, x, _p11._0), - _1: accAcc - }; - } else { - return {ctor: '[]'}; - } - }); - return _elm_lang$core$List$reverse( - A3( - _elm_lang$core$List$foldl, - scan1, - { - ctor: '::', - _0: b, - _1: {ctor: '[]'} - }, - xs)); - }); -var _elm_lang$core$List$append = F2( - function (xs, ys) { - var _p12 = ys; - if (_p12.ctor === '[]') { - return xs; - } else { - return A3( - _elm_lang$core$List$foldr, - F2( - function (x, y) { - return {ctor: '::', _0: x, _1: y}; - }), - ys, - xs); - } - }); -var _elm_lang$core$List$concat = function (lists) { - return A3( - _elm_lang$core$List$foldr, - _elm_lang$core$List$append, - {ctor: '[]'}, - lists); -}; -var _elm_lang$core$List$concatMap = F2( - function (f, list) { - return _elm_lang$core$List$concat( - A2(_elm_lang$core$List$map, f, list)); - }); -var _elm_lang$core$List$partition = F2( - function (pred, list) { - var step = F2( - function (x, _p13) { - var _p14 = _p13; - var _p16 = _p14._0; - var _p15 = _p14._1; - return pred(x) ? { - ctor: '_Tuple2', - _0: {ctor: '::', _0: x, _1: _p16}, - _1: _p15 - } : { - ctor: '_Tuple2', - _0: _p16, - _1: {ctor: '::', _0: x, _1: _p15} - }; - }); - return A3( - _elm_lang$core$List$foldr, - step, - { - ctor: '_Tuple2', - _0: {ctor: '[]'}, - _1: {ctor: '[]'} - }, - list); - }); -var _elm_lang$core$List$unzip = function (pairs) { - var step = F2( - function (_p18, _p17) { - var _p19 = _p18; - var _p20 = _p17; - return { - ctor: '_Tuple2', - _0: {ctor: '::', _0: _p19._0, _1: _p20._0}, - _1: {ctor: '::', _0: _p19._1, _1: _p20._1} - }; - }); - return A3( - _elm_lang$core$List$foldr, - step, - { - ctor: '_Tuple2', - _0: {ctor: '[]'}, - _1: {ctor: '[]'} - }, - pairs); -}; -var _elm_lang$core$List$intersperse = F2( - function (sep, xs) { - var _p21 = xs; - if (_p21.ctor === '[]') { - return {ctor: '[]'}; - } else { - var step = F2( - function (x, rest) { - return { - ctor: '::', - _0: sep, - _1: {ctor: '::', _0: x, _1: rest} - }; - }); - var spersed = A3( - _elm_lang$core$List$foldr, - step, - {ctor: '[]'}, - _p21._1); - return {ctor: '::', _0: _p21._0, _1: spersed}; - } - }); -var _elm_lang$core$List$takeReverse = F3( - function (n, list, taken) { - takeReverse: - while (true) { - if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { - return taken; - } else { - var _p22 = list; - if (_p22.ctor === '[]') { - return taken; - } else { - var _v23 = n - 1, - _v24 = _p22._1, - _v25 = {ctor: '::', _0: _p22._0, _1: taken}; - n = _v23; - list = _v24; - taken = _v25; - continue takeReverse; - } - } - } - }); -var _elm_lang$core$List$takeTailRec = F2( - function (n, list) { - return _elm_lang$core$List$reverse( - A3( - _elm_lang$core$List$takeReverse, - n, - list, - {ctor: '[]'})); - }); -var _elm_lang$core$List$takeFast = F3( - function (ctr, n, list) { - if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { - return {ctor: '[]'}; - } else { - var _p23 = {ctor: '_Tuple2', _0: n, _1: list}; - _v26_5: - do { - _v26_1: - do { - if (_p23.ctor === '_Tuple2') { - if (_p23._1.ctor === '[]') { - return list; - } else { - if (_p23._1._1.ctor === '::') { - switch (_p23._0) { - case 1: - break _v26_1; - case 2: - return { - ctor: '::', - _0: _p23._1._0, - _1: { - ctor: '::', - _0: _p23._1._1._0, - _1: {ctor: '[]'} - } - }; - case 3: - if (_p23._1._1._1.ctor === '::') { - return { - ctor: '::', - _0: _p23._1._0, - _1: { - ctor: '::', - _0: _p23._1._1._0, - _1: { - ctor: '::', - _0: _p23._1._1._1._0, - _1: {ctor: '[]'} - } - } - }; - } else { - break _v26_5; - } - default: - if ((_p23._1._1._1.ctor === '::') && (_p23._1._1._1._1.ctor === '::')) { - var _p28 = _p23._1._1._1._0; - var _p27 = _p23._1._1._0; - var _p26 = _p23._1._0; - var _p25 = _p23._1._1._1._1._0; - var _p24 = _p23._1._1._1._1._1; - return (_elm_lang$core$Native_Utils.cmp(ctr, 1000) > 0) ? { - ctor: '::', - _0: _p26, - _1: { - ctor: '::', - _0: _p27, - _1: { - ctor: '::', - _0: _p28, - _1: { - ctor: '::', - _0: _p25, - _1: A2(_elm_lang$core$List$takeTailRec, n - 4, _p24) - } - } - } - } : { - ctor: '::', - _0: _p26, - _1: { - ctor: '::', - _0: _p27, - _1: { - ctor: '::', - _0: _p28, - _1: { - ctor: '::', - _0: _p25, - _1: A3(_elm_lang$core$List$takeFast, ctr + 1, n - 4, _p24) - } - } - } - }; - } else { - break _v26_5; - } - } - } else { - if (_p23._0 === 1) { - break _v26_1; - } else { - break _v26_5; - } - } - } - } else { - break _v26_5; - } - } while(false); - return { - ctor: '::', - _0: _p23._1._0, - _1: {ctor: '[]'} - }; - } while(false); - return list; - } - }); -var _elm_lang$core$List$take = F2( - function (n, list) { - return A3(_elm_lang$core$List$takeFast, 0, n, list); - }); -var _elm_lang$core$List$repeatHelp = F3( - function (result, n, value) { - repeatHelp: - while (true) { - if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { - return result; - } else { - var _v27 = {ctor: '::', _0: value, _1: result}, - _v28 = n - 1, - _v29 = value; - result = _v27; - n = _v28; - value = _v29; - continue repeatHelp; - } - } - }); -var _elm_lang$core$List$repeat = F2( - function (n, value) { - return A3( - _elm_lang$core$List$repeatHelp, - {ctor: '[]'}, - n, - value); - }); -var _elm_lang$core$List$rangeHelp = F3( - function (lo, hi, list) { - rangeHelp: - while (true) { - if (_elm_lang$core$Native_Utils.cmp(lo, hi) < 1) { - var _v30 = lo, - _v31 = hi - 1, - _v32 = {ctor: '::', _0: hi, _1: list}; - lo = _v30; - hi = _v31; - list = _v32; - continue rangeHelp; - } else { - return list; - } - } - }); -var _elm_lang$core$List$range = F2( - function (lo, hi) { - return A3( - _elm_lang$core$List$rangeHelp, - lo, - hi, - {ctor: '[]'}); - }); -var _elm_lang$core$List$indexedMap = F2( - function (f, xs) { - return A3( - _elm_lang$core$List$map2, - f, - A2( - _elm_lang$core$List$range, - 0, - _elm_lang$core$List$length(xs) - 1), - xs); - }); - -//import Native.Utils // + return strs.join(sep); +}); -var _elm_lang$core$Native_Debug = function() { +var _String_slice = F3(function(start, end, str) { + return str.slice(start, end); +}); -function log(tag, value) +function _String_trim(str) { - var msg = tag + ': ' + _elm_lang$core$Native_Utils.toString(value); - var process = process || {}; - if (process.stdout) - { - process.stdout.write(msg); - } - else - { - console.log(msg); - } - return value; + return str.trim(); } -function crash(message) +function _String_trimLeft(str) { - throw new Error(message); + return str.replace(/^\s+/, ''); } -return { - crash: crash, - log: F2(log) -}; - -}(); -//import Maybe, Native.List, Native.Utils, Result // - -var _elm_lang$core$Native_String = function() { - -function isEmpty(str) +function _String_trimRight(str) { - return str.length === 0; -} -function cons(chr, str) -{ - return chr + str; + return str.replace(/\s+$/, ''); } -function uncons(str) + +function _String_words(str) { - var hd = str[0]; - if (hd) - { - return _elm_lang$core$Maybe$Just(_elm_lang$core$Native_Utils.Tuple2(_elm_lang$core$Native_Utils.chr(hd), str.slice(1))); - } - return _elm_lang$core$Maybe$Nothing; + return _List_fromArray(str.trim().split(/\s+/g)); } -function append(a, b) + +function _String_lines(str) { - return a + b; + return _List_fromArray(str.split(/\r\n|\r|\n/g)); } -function concat(strs) + +function _String_toUpper(str) { - return _elm_lang$core$Native_List.toArray(strs).join(''); + return str.toUpperCase(); } -function length(str) + +function _String_toLower(str) { - return str.length; + return str.toLowerCase(); } -function map(f, str) + +var _String_any = F2(function(isGood, string) { - var out = str.split(''); - for (var i = out.length; i--; ) + var i = string.length; + while (i--) { - out[i] = f(_elm_lang$core$Native_Utils.chr(out[i])); + var char = string[i]; + var word = string.charCodeAt(i); + if (0xDC00 <= word && word <= 0xDFFF) + { + i--; + char = string[i] + char; + } + if (isGood(_Utils_chr(char))) + { + return true; + } } - return out.join(''); -} -function filter(pred, str) -{ - return str.split('').map(_elm_lang$core$Native_Utils.chr).filter(pred).join(''); -} -function reverse(str) -{ - return str.split('').reverse().join(''); -} -function foldl(f, b, str) + return false; +}); + +var _String_all = F2(function(isGood, string) { - var len = str.length; - for (var i = 0; i < len; ++i) + var i = string.length; + while (i--) { - b = A2(f, _elm_lang$core$Native_Utils.chr(str[i]), b); + var char = string[i]; + var word = string.charCodeAt(i); + if (0xDC00 <= word && word <= 0xDFFF) + { + i--; + char = string[i] + char; + } + if (!isGood(_Utils_chr(char))) + { + return false; + } } - return b; -} -function foldr(f, b, str) + return true; +}); + +var _String_contains = F2(function(sub, str) { - for (var i = str.length; i--; ) - { - b = A2(f, _elm_lang$core$Native_Utils.chr(str[i]), b); - } - return b; -} -function split(sep, str) + return str.indexOf(sub) > -1; +}); + +var _String_startsWith = F2(function(sub, str) { - return _elm_lang$core$Native_List.fromArray(str.split(sep)); -} -function join(sep, strs) + return str.indexOf(sub) === 0; +}); + +var _String_endsWith = F2(function(sub, str) { - return _elm_lang$core$Native_List.toArray(strs).join(sep); -} -function repeat(n, str) + return str.length >= sub.length && + str.lastIndexOf(sub) === str.length - sub.length; +}); + +var _String_indexes = F2(function(sub, str) { - var result = ''; - while (n > 0) + var subLen = sub.length; + + if (subLen < 1) { - if (n & 1) - { - result += str; - } - n >>= 1, str += str; + return _List_Nil; } - return result; -} -function slice(start, end, str) -{ - return str.slice(start, end); -} -function left(n, str) + + var i = 0; + var is = []; + + while ((i = str.indexOf(sub, i)) > -1) + { + is.push(i); + i = i + subLen; + } + + return _List_fromArray(is); +}); + + +// TO STRING + +function _String_fromNumber(number) { - return n < 1 ? '' : str.slice(0, n); + return number + ''; } -function right(n, str) + + +// INT CONVERSIONS + +function _String_toInt(str) { - return n < 1 ? '' : str.slice(-n); + var total = 0; + var code0 = str.charCodeAt(0); + var start = code0 == 0x2B /* + */ || code0 == 0x2D /* - */ ? 1 : 0; + + for (var i = start; i < str.length; ++i) + { + var code = str.charCodeAt(i); + if (code < 0x30 || 0x39 < code) + { + return $elm$core$Maybe$Nothing; + } + total = 10 * total + code - 0x30; + } + + return i == start + ? $elm$core$Maybe$Nothing + : $elm$core$Maybe$Just(code0 == 0x2D ? -total : total); } -function dropLeft(n, str) + + +// FLOAT CONVERSIONS + +function _String_toFloat(s) { - return n < 1 ? str : str.slice(n); + // check if it is a hex, octal, or binary number + if (s.length === 0 || /[\sxbo]/.test(s)) + { + return $elm$core$Maybe$Nothing; + } + var n = +s; + // faster isNaN check + return n === n ? $elm$core$Maybe$Just(n) : $elm$core$Maybe$Nothing; } -function dropRight(n, str) + +function _String_fromList(chars) { - return n < 1 ? str : str.slice(0, -n); + return _List_toArray(chars).join(''); } -function pad(n, chr, str) + + + + +function _Char_toCode(char) { - var half = (n - str.length) / 2; - return repeat(Math.ceil(half), chr) + str + repeat(half | 0, chr); + var code = char.charCodeAt(0); + if (0xD800 <= code && code <= 0xDBFF) + { + return (code - 0xD800) * 0x400 + char.charCodeAt(1) - 0xDC00 + 0x10000 + } + return code; } -function padRight(n, chr, str) + +function _Char_fromCode(code) { - return str + repeat(n - str.length, chr); + return _Utils_chr( + (code < 0 || 0x10FFFF < code) + ? '\uFFFD' + : + (code <= 0xFFFF) + ? String.fromCharCode(code) + : + (code -= 0x10000, + String.fromCharCode(Math.floor(code / 0x400) + 0xD800) + + + String.fromCharCode(code % 0x400 + 0xDC00) + ) + ); } -function padLeft(n, chr, str) + +function _Char_toUpper(char) { - return repeat(n - str.length, chr) + str; + return _Utils_chr(char.toUpperCase()); } -function trim(str) +function _Char_toLower(char) { - return str.trim(); + return _Utils_chr(char.toLowerCase()); } -function trimLeft(str) + +function _Char_toLocaleUpper(char) { - return str.replace(/^\s+/, ''); + return _Utils_chr(char.toLocaleUpperCase()); } -function trimRight(str) + +function _Char_toLocaleLower(char) { - return str.replace(/\s+$/, ''); + return _Utils_chr(char.toLocaleLowerCase()); } -function words(str) + + +/**/ +function _Json_errorToString(error) { - return _elm_lang$core$Native_List.fromArray(str.trim().split(/\s+/g)); + return $elm$json$Json$Decode$errorToString(error); } -function lines(str) +//*/ + + +// CORE DECODERS + +function _Json_succeed(msg) { - return _elm_lang$core$Native_List.fromArray(str.split(/\r\n|\r|\n/g)); + return { + $: 0, + a: msg + }; } -function toUpper(str) +function _Json_fail(msg) { - return str.toUpperCase(); + return { + $: 1, + a: msg + }; } -function toLower(str) + +var _Json_decodeInt = { $: 2 }; +var _Json_decodeBool = { $: 3 }; +var _Json_decodeFloat = { $: 4 }; +var _Json_decodeValue = { $: 5 }; +var _Json_decodeString = { $: 6 }; + +function _Json_decodeList(decoder) { return { $: 7, b: decoder }; } +function _Json_decodeArray(decoder) { return { $: 8, b: decoder }; } + +function _Json_decodeNull(value) { return { $: 9, c: value }; } + +var _Json_decodeField = F2(function(field, decoder) { - return str.toLowerCase(); -} + return { + $: 10, + d: field, + b: decoder + }; +}); -function any(pred, str) +var _Json_decodeIndex = F2(function(index, decoder) { - for (var i = str.length; i--; ) - { - if (pred(_elm_lang$core$Native_Utils.chr(str[i]))) - { - return true; - } - } - return false; -} -function all(pred, str) + return { + $: 11, + e: index, + b: decoder + }; +}); + +function _Json_decodeKeyValuePairs(decoder) { - for (var i = str.length; i--; ) - { - if (!pred(_elm_lang$core$Native_Utils.chr(str[i]))) - { - return false; - } - } - return true; + return { + $: 12, + b: decoder + }; } -function contains(sub, str) +function _Json_mapMany(f, decoders) { - return str.indexOf(sub) > -1; + return { + $: 13, + f: f, + g: decoders + }; } -function startsWith(sub, str) + +var _Json_andThen = F2(function(callback, decoder) { - return str.indexOf(sub) === 0; -} -function endsWith(sub, str) + return { + $: 14, + b: decoder, + h: callback + }; +}); + +function _Json_oneOf(decoders) { - return str.length >= sub.length && - str.lastIndexOf(sub) === str.length - sub.length; + return { + $: 15, + g: decoders + }; } -function indexes(sub, str) -{ - var subLen = sub.length; - - if (subLen < 1) - { - return _elm_lang$core$Native_List.Nil; - } - var i = 0; - var is = []; - while ((i = str.indexOf(sub, i)) > -1) - { - is.push(i); - i = i + subLen; - } +// DECODING OBJECTS - return _elm_lang$core$Native_List.fromArray(is); -} +var _Json_map1 = F2(function(f, d1) +{ + return _Json_mapMany(f, [d1]); +}); +var _Json_map2 = F3(function(f, d1, d2) +{ + return _Json_mapMany(f, [d1, d2]); +}); -function toInt(s) +var _Json_map3 = F4(function(f, d1, d2, d3) { - var len = s.length; + return _Json_mapMany(f, [d1, d2, d3]); +}); - // if empty - if (len === 0) - { - return intErr(s); - } +var _Json_map4 = F5(function(f, d1, d2, d3, d4) +{ + return _Json_mapMany(f, [d1, d2, d3, d4]); +}); - // if hex - var c = s[0]; - if (c === '0' && s[1] === 'x') - { - for (var i = 2; i < len; ++i) - { - var c = s[i]; - if (('0' <= c && c <= '9') || ('A' <= c && c <= 'F') || ('a' <= c && c <= 'f')) - { - continue; - } - return intErr(s); - } - return _elm_lang$core$Result$Ok(parseInt(s, 16)); - } +var _Json_map5 = F6(function(f, d1, d2, d3, d4, d5) +{ + return _Json_mapMany(f, [d1, d2, d3, d4, d5]); +}); - // is decimal - if (c > '9' || (c < '0' && c !== '-' && c !== '+')) - { - return intErr(s); - } - for (var i = 1; i < len; ++i) - { - var c = s[i]; - if (c < '0' || '9' < c) - { - return intErr(s); - } - } +var _Json_map6 = F7(function(f, d1, d2, d3, d4, d5, d6) +{ + return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6]); +}); - return _elm_lang$core$Result$Ok(parseInt(s, 10)); -} +var _Json_map7 = F8(function(f, d1, d2, d3, d4, d5, d6, d7) +{ + return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7]); +}); -function intErr(s) +var _Json_map8 = F9(function(f, d1, d2, d3, d4, d5, d6, d7, d8) { - return _elm_lang$core$Result$Err("could not convert string '" + s + "' to an Int"); -} + return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7, d8]); +}); + +// DECODE -function toFloat(s) +var _Json_runOnString = F2(function(decoder, string) { - // check if it is a hex, octal, or binary number - if (s.length === 0 || /[\sxbo]/.test(s)) + try { - return floatErr(s); + var value = JSON.parse(string); + return _Json_runHelp(decoder, value); } - var n = +s; - // faster isNaN check - return n === n ? _elm_lang$core$Result$Ok(n) : floatErr(s); -} + catch (e) + { + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'This is not valid JSON! ' + e.message, _Json_wrap(string))); + } +}); -function floatErr(s) +var _Json_run = F2(function(decoder, value) { - return _elm_lang$core$Result$Err("could not convert string '" + s + "' to a Float"); -} - + return _Json_runHelp(decoder, _Json_unwrap(value)); +}); -function toList(str) +function _Json_runHelp(decoder, value) { - return _elm_lang$core$Native_List.fromArray(str.split('').map(_elm_lang$core$Native_Utils.chr)); -} -function fromList(chars) -{ - return _elm_lang$core$Native_List.toArray(chars).join(''); -} - -return { - isEmpty: isEmpty, - cons: F2(cons), - uncons: uncons, - append: F2(append), - concat: concat, - length: length, - map: F2(map), - filter: F2(filter), - reverse: reverse, - foldl: F3(foldl), - foldr: F3(foldr), - - split: F2(split), - join: F2(join), - repeat: F2(repeat), - - slice: F3(slice), - left: F2(left), - right: F2(right), - dropLeft: F2(dropLeft), - dropRight: F2(dropRight), - - pad: F3(pad), - padLeft: F3(padLeft), - padRight: F3(padRight), + switch (decoder.$) + { + case 3: + return (typeof value === 'boolean') + ? $elm$core$Result$Ok(value) + : _Json_expecting('a BOOL', value); - trim: trim, - trimLeft: trimLeft, - trimRight: trimRight, + case 2: + if (typeof value !== 'number') { + return _Json_expecting('an INT', value); + } - words: words, - lines: lines, + if (-2147483647 < value && value < 2147483647 && (value | 0) === value) { + return $elm$core$Result$Ok(value); + } - toUpper: toUpper, - toLower: toLower, + if (isFinite(value) && !(value % 1)) { + return $elm$core$Result$Ok(value); + } - any: F2(any), - all: F2(all), + return _Json_expecting('an INT', value); - contains: F2(contains), - startsWith: F2(startsWith), - endsWith: F2(endsWith), - indexes: F2(indexes), + case 4: + return (typeof value === 'number') + ? $elm$core$Result$Ok(value) + : _Json_expecting('a FLOAT', value); - toInt: toInt, - toFloat: toFloat, - toList: toList, - fromList: fromList -}; + case 6: + return (typeof value === 'string') + ? $elm$core$Result$Ok(value) + : (value instanceof String) + ? $elm$core$Result$Ok(value + '') + : _Json_expecting('a STRING', value); -}(); + case 9: + return (value === null) + ? $elm$core$Result$Ok(decoder.c) + : _Json_expecting('null', value); -//import Native.Utils // + case 5: + return $elm$core$Result$Ok(_Json_wrap(value)); -var _elm_lang$core$Native_Char = function() { + case 7: + if (!Array.isArray(value)) + { + return _Json_expecting('a LIST', value); + } + return _Json_runArrayDecoder(decoder.b, value, _List_fromArray); -return { - fromCode: function(c) { return _elm_lang$core$Native_Utils.chr(String.fromCharCode(c)); }, - toCode: function(c) { return c.charCodeAt(0); }, - toUpper: function(c) { return _elm_lang$core$Native_Utils.chr(c.toUpperCase()); }, - toLower: function(c) { return _elm_lang$core$Native_Utils.chr(c.toLowerCase()); }, - toLocaleUpper: function(c) { return _elm_lang$core$Native_Utils.chr(c.toLocaleUpperCase()); }, - toLocaleLower: function(c) { return _elm_lang$core$Native_Utils.chr(c.toLocaleLowerCase()); } -}; + case 8: + if (!Array.isArray(value)) + { + return _Json_expecting('an ARRAY', value); + } + return _Json_runArrayDecoder(decoder.b, value, _Json_toElmArray); -}(); -var _elm_lang$core$Char$fromCode = _elm_lang$core$Native_Char.fromCode; -var _elm_lang$core$Char$toCode = _elm_lang$core$Native_Char.toCode; -var _elm_lang$core$Char$toLocaleLower = _elm_lang$core$Native_Char.toLocaleLower; -var _elm_lang$core$Char$toLocaleUpper = _elm_lang$core$Native_Char.toLocaleUpper; -var _elm_lang$core$Char$toLower = _elm_lang$core$Native_Char.toLower; -var _elm_lang$core$Char$toUpper = _elm_lang$core$Native_Char.toUpper; -var _elm_lang$core$Char$isBetween = F3( - function (low, high, $char) { - var code = _elm_lang$core$Char$toCode($char); - return (_elm_lang$core$Native_Utils.cmp( - code, - _elm_lang$core$Char$toCode(low)) > -1) && (_elm_lang$core$Native_Utils.cmp( - code, - _elm_lang$core$Char$toCode(high)) < 1); - }); -var _elm_lang$core$Char$isUpper = A2( - _elm_lang$core$Char$isBetween, - _elm_lang$core$Native_Utils.chr('A'), - _elm_lang$core$Native_Utils.chr('Z')); -var _elm_lang$core$Char$isLower = A2( - _elm_lang$core$Char$isBetween, - _elm_lang$core$Native_Utils.chr('a'), - _elm_lang$core$Native_Utils.chr('z')); -var _elm_lang$core$Char$isDigit = A2( - _elm_lang$core$Char$isBetween, - _elm_lang$core$Native_Utils.chr('0'), - _elm_lang$core$Native_Utils.chr('9')); -var _elm_lang$core$Char$isOctDigit = A2( - _elm_lang$core$Char$isBetween, - _elm_lang$core$Native_Utils.chr('0'), - _elm_lang$core$Native_Utils.chr('7')); -var _elm_lang$core$Char$isHexDigit = function ($char) { - return _elm_lang$core$Char$isDigit($char) || (A3( - _elm_lang$core$Char$isBetween, - _elm_lang$core$Native_Utils.chr('a'), - _elm_lang$core$Native_Utils.chr('f'), - $char) || A3( - _elm_lang$core$Char$isBetween, - _elm_lang$core$Native_Utils.chr('A'), - _elm_lang$core$Native_Utils.chr('F'), - $char)); -}; + case 10: + var field = decoder.d; + if (typeof value !== 'object' || value === null || !(field in value)) + { + return _Json_expecting('an OBJECT with a field named `' + field + '`', value); + } + var result = _Json_runHelp(decoder.b, value[field]); + return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, field, result.a)); -var _elm_lang$core$Result$toMaybe = function (result) { - var _p0 = result; - if (_p0.ctor === 'Ok') { - return _elm_lang$core$Maybe$Just(_p0._0); - } else { - return _elm_lang$core$Maybe$Nothing; - } -}; -var _elm_lang$core$Result$withDefault = F2( - function (def, result) { - var _p1 = result; - if (_p1.ctor === 'Ok') { - return _p1._0; - } else { - return def; - } - }); -var _elm_lang$core$Result$Err = function (a) { - return {ctor: 'Err', _0: a}; -}; -var _elm_lang$core$Result$andThen = F2( - function (callback, result) { - var _p2 = result; - if (_p2.ctor === 'Ok') { - return callback(_p2._0); - } else { - return _elm_lang$core$Result$Err(_p2._0); - } - }); -var _elm_lang$core$Result$Ok = function (a) { - return {ctor: 'Ok', _0: a}; -}; -var _elm_lang$core$Result$map = F2( - function (func, ra) { - var _p3 = ra; - if (_p3.ctor === 'Ok') { - return _elm_lang$core$Result$Ok( - func(_p3._0)); - } else { - return _elm_lang$core$Result$Err(_p3._0); - } - }); -var _elm_lang$core$Result$map2 = F3( - function (func, ra, rb) { - var _p4 = {ctor: '_Tuple2', _0: ra, _1: rb}; - if (_p4._0.ctor === 'Ok') { - if (_p4._1.ctor === 'Ok') { - return _elm_lang$core$Result$Ok( - A2(func, _p4._0._0, _p4._1._0)); - } else { - return _elm_lang$core$Result$Err(_p4._1._0); + case 11: + var index = decoder.e; + if (!Array.isArray(value)) + { + return _Json_expecting('an ARRAY', value); } - } else { - return _elm_lang$core$Result$Err(_p4._0._0); - } - }); -var _elm_lang$core$Result$map3 = F4( - function (func, ra, rb, rc) { - var _p5 = {ctor: '_Tuple3', _0: ra, _1: rb, _2: rc}; - if (_p5._0.ctor === 'Ok') { - if (_p5._1.ctor === 'Ok') { - if (_p5._2.ctor === 'Ok') { - return _elm_lang$core$Result$Ok( - A3(func, _p5._0._0, _p5._1._0, _p5._2._0)); - } else { - return _elm_lang$core$Result$Err(_p5._2._0); - } - } else { - return _elm_lang$core$Result$Err(_p5._1._0); + if (index >= value.length) + { + return _Json_expecting('a LONGER array. Need index ' + index + ' but only see ' + value.length + ' entries', value); } - } else { - return _elm_lang$core$Result$Err(_p5._0._0); - } - }); -var _elm_lang$core$Result$map4 = F5( - function (func, ra, rb, rc, rd) { - var _p6 = {ctor: '_Tuple4', _0: ra, _1: rb, _2: rc, _3: rd}; - if (_p6._0.ctor === 'Ok') { - if (_p6._1.ctor === 'Ok') { - if (_p6._2.ctor === 'Ok') { - if (_p6._3.ctor === 'Ok') { - return _elm_lang$core$Result$Ok( - A4(func, _p6._0._0, _p6._1._0, _p6._2._0, _p6._3._0)); - } else { - return _elm_lang$core$Result$Err(_p6._3._0); + var result = _Json_runHelp(decoder.b, value[index]); + return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, index, result.a)); + + case 12: + if (typeof value !== 'object' || value === null || Array.isArray(value)) + { + return _Json_expecting('an OBJECT', value); + } + + var keyValuePairs = _List_Nil; + // TODO test perf of Object.keys and switch when support is good enough + for (var key in value) + { + if (value.hasOwnProperty(key)) + { + var result = _Json_runHelp(decoder.b, value[key]); + if (!$elm$core$Result$isOk(result)) + { + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, key, result.a)); } - } else { - return _elm_lang$core$Result$Err(_p6._2._0); + keyValuePairs = _List_Cons(_Utils_Tuple2(key, result.a), keyValuePairs); } - } else { - return _elm_lang$core$Result$Err(_p6._1._0); } - } else { - return _elm_lang$core$Result$Err(_p6._0._0); - } - }); -var _elm_lang$core$Result$map5 = F6( - function (func, ra, rb, rc, rd, re) { - var _p7 = {ctor: '_Tuple5', _0: ra, _1: rb, _2: rc, _3: rd, _4: re}; - if (_p7._0.ctor === 'Ok') { - if (_p7._1.ctor === 'Ok') { - if (_p7._2.ctor === 'Ok') { - if (_p7._3.ctor === 'Ok') { - if (_p7._4.ctor === 'Ok') { - return _elm_lang$core$Result$Ok( - A5(func, _p7._0._0, _p7._1._0, _p7._2._0, _p7._3._0, _p7._4._0)); - } else { - return _elm_lang$core$Result$Err(_p7._4._0); - } - } else { - return _elm_lang$core$Result$Err(_p7._3._0); - } - } else { - return _elm_lang$core$Result$Err(_p7._2._0); - } - } else { - return _elm_lang$core$Result$Err(_p7._1._0); - } - } else { - return _elm_lang$core$Result$Err(_p7._0._0); - } - }); -var _elm_lang$core$Result$mapError = F2( - function (f, result) { - var _p8 = result; - if (_p8.ctor === 'Ok') { - return _elm_lang$core$Result$Ok(_p8._0); - } else { - return _elm_lang$core$Result$Err( - f(_p8._0)); - } - }); -var _elm_lang$core$Result$fromMaybe = F2( - function (err, maybe) { - var _p9 = maybe; - if (_p9.ctor === 'Just') { - return _elm_lang$core$Result$Ok(_p9._0); - } else { - return _elm_lang$core$Result$Err(err); - } - }); - -var _elm_lang$core$String$fromList = _elm_lang$core$Native_String.fromList; -var _elm_lang$core$String$toList = _elm_lang$core$Native_String.toList; -var _elm_lang$core$String$toFloat = _elm_lang$core$Native_String.toFloat; -var _elm_lang$core$String$toInt = _elm_lang$core$Native_String.toInt; -var _elm_lang$core$String$indices = _elm_lang$core$Native_String.indexes; -var _elm_lang$core$String$indexes = _elm_lang$core$Native_String.indexes; -var _elm_lang$core$String$endsWith = _elm_lang$core$Native_String.endsWith; -var _elm_lang$core$String$startsWith = _elm_lang$core$Native_String.startsWith; -var _elm_lang$core$String$contains = _elm_lang$core$Native_String.contains; -var _elm_lang$core$String$all = _elm_lang$core$Native_String.all; -var _elm_lang$core$String$any = _elm_lang$core$Native_String.any; -var _elm_lang$core$String$toLower = _elm_lang$core$Native_String.toLower; -var _elm_lang$core$String$toUpper = _elm_lang$core$Native_String.toUpper; -var _elm_lang$core$String$lines = _elm_lang$core$Native_String.lines; -var _elm_lang$core$String$words = _elm_lang$core$Native_String.words; -var _elm_lang$core$String$trimRight = _elm_lang$core$Native_String.trimRight; -var _elm_lang$core$String$trimLeft = _elm_lang$core$Native_String.trimLeft; -var _elm_lang$core$String$trim = _elm_lang$core$Native_String.trim; -var _elm_lang$core$String$padRight = _elm_lang$core$Native_String.padRight; -var _elm_lang$core$String$padLeft = _elm_lang$core$Native_String.padLeft; -var _elm_lang$core$String$pad = _elm_lang$core$Native_String.pad; -var _elm_lang$core$String$dropRight = _elm_lang$core$Native_String.dropRight; -var _elm_lang$core$String$dropLeft = _elm_lang$core$Native_String.dropLeft; -var _elm_lang$core$String$right = _elm_lang$core$Native_String.right; -var _elm_lang$core$String$left = _elm_lang$core$Native_String.left; -var _elm_lang$core$String$slice = _elm_lang$core$Native_String.slice; -var _elm_lang$core$String$repeat = _elm_lang$core$Native_String.repeat; -var _elm_lang$core$String$join = _elm_lang$core$Native_String.join; -var _elm_lang$core$String$split = _elm_lang$core$Native_String.split; -var _elm_lang$core$String$foldr = _elm_lang$core$Native_String.foldr; -var _elm_lang$core$String$foldl = _elm_lang$core$Native_String.foldl; -var _elm_lang$core$String$reverse = _elm_lang$core$Native_String.reverse; -var _elm_lang$core$String$filter = _elm_lang$core$Native_String.filter; -var _elm_lang$core$String$map = _elm_lang$core$Native_String.map; -var _elm_lang$core$String$length = _elm_lang$core$Native_String.length; -var _elm_lang$core$String$concat = _elm_lang$core$Native_String.concat; -var _elm_lang$core$String$append = _elm_lang$core$Native_String.append; -var _elm_lang$core$String$uncons = _elm_lang$core$Native_String.uncons; -var _elm_lang$core$String$cons = _elm_lang$core$Native_String.cons; -var _elm_lang$core$String$fromChar = function ($char) { - return A2(_elm_lang$core$String$cons, $char, ''); -}; -var _elm_lang$core$String$isEmpty = _elm_lang$core$Native_String.isEmpty; - -var _elm_lang$core$Dict$foldr = F3( - function (f, acc, t) { - foldr: - while (true) { - var _p0 = t; - if (_p0.ctor === 'RBEmpty_elm_builtin') { - return acc; - } else { - var _v1 = f, - _v2 = A3( - f, - _p0._1, - _p0._2, - A3(_elm_lang$core$Dict$foldr, f, acc, _p0._4)), - _v3 = _p0._3; - f = _v1; - acc = _v2; - t = _v3; - continue foldr; - } - } - }); -var _elm_lang$core$Dict$keys = function (dict) { - return A3( - _elm_lang$core$Dict$foldr, - F3( - function (key, value, keyList) { - return {ctor: '::', _0: key, _1: keyList}; - }), - {ctor: '[]'}, - dict); -}; -var _elm_lang$core$Dict$values = function (dict) { - return A3( - _elm_lang$core$Dict$foldr, - F3( - function (key, value, valueList) { - return {ctor: '::', _0: value, _1: valueList}; - }), - {ctor: '[]'}, - dict); -}; -var _elm_lang$core$Dict$toList = function (dict) { - return A3( - _elm_lang$core$Dict$foldr, - F3( - function (key, value, list) { - return { - ctor: '::', - _0: {ctor: '_Tuple2', _0: key, _1: value}, - _1: list - }; - }), - {ctor: '[]'}, - dict); -}; -var _elm_lang$core$Dict$foldl = F3( - function (f, acc, dict) { - foldl: - while (true) { - var _p1 = dict; - if (_p1.ctor === 'RBEmpty_elm_builtin') { - return acc; - } else { - var _v5 = f, - _v6 = A3( - f, - _p1._1, - _p1._2, - A3(_elm_lang$core$Dict$foldl, f, acc, _p1._3)), - _v7 = _p1._4; - f = _v5; - acc = _v6; - dict = _v7; - continue foldl; - } - } - }); -var _elm_lang$core$Dict$merge = F6( - function (leftStep, bothStep, rightStep, leftDict, rightDict, initialResult) { - var stepState = F3( - function (rKey, rValue, _p2) { - stepState: - while (true) { - var _p3 = _p2; - var _p9 = _p3._1; - var _p8 = _p3._0; - var _p4 = _p8; - if (_p4.ctor === '[]') { - return { - ctor: '_Tuple2', - _0: _p8, - _1: A3(rightStep, rKey, rValue, _p9) - }; - } else { - var _p7 = _p4._1; - var _p6 = _p4._0._1; - var _p5 = _p4._0._0; - if (_elm_lang$core$Native_Utils.cmp(_p5, rKey) < 0) { - var _v10 = rKey, - _v11 = rValue, - _v12 = { - ctor: '_Tuple2', - _0: _p7, - _1: A3(leftStep, _p5, _p6, _p9) - }; - rKey = _v10; - rValue = _v11; - _p2 = _v12; - continue stepState; - } else { - if (_elm_lang$core$Native_Utils.cmp(_p5, rKey) > 0) { - return { - ctor: '_Tuple2', - _0: _p8, - _1: A3(rightStep, rKey, rValue, _p9) - }; - } else { - return { - ctor: '_Tuple2', - _0: _p7, - _1: A4(bothStep, _p5, _p6, rValue, _p9) - }; - } - } - } - } - }); - var _p10 = A3( - _elm_lang$core$Dict$foldl, - stepState, - { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$toList(leftDict), - _1: initialResult - }, - rightDict); - var leftovers = _p10._0; - var intermediateResult = _p10._1; - return A3( - _elm_lang$core$List$foldl, - F2( - function (_p11, result) { - var _p12 = _p11; - return A3(leftStep, _p12._0, _p12._1, result); - }), - intermediateResult, - leftovers); - }); -var _elm_lang$core$Dict$reportRemBug = F4( - function (msg, c, lgot, rgot) { - return _elm_lang$core$Native_Debug.crash( - _elm_lang$core$String$concat( - { - ctor: '::', - _0: 'Internal red-black tree invariant violated, expected ', - _1: { - ctor: '::', - _0: msg, - _1: { - ctor: '::', - _0: ' and got ', - _1: { - ctor: '::', - _0: _elm_lang$core$Basics$toString(c), - _1: { - ctor: '::', - _0: '/', - _1: { - ctor: '::', - _0: lgot, - _1: { - ctor: '::', - _0: '/', - _1: { - ctor: '::', - _0: rgot, - _1: { - ctor: '::', - _0: '\nPlease report this bug to ', - _1: {ctor: '[]'} - } - } - } - } - } - } - } - } - })); - }); -var _elm_lang$core$Dict$isBBlack = function (dict) { - var _p13 = dict; - _v14_2: - do { - if (_p13.ctor === 'RBNode_elm_builtin') { - if (_p13._0.ctor === 'BBlack') { - return true; - } else { - break _v14_2; - } - } else { - if (_p13._0.ctor === 'LBBlack') { - return true; - } else { - break _v14_2; - } - } - } while(false); - return false; -}; -var _elm_lang$core$Dict$sizeHelp = F2( - function (n, dict) { - sizeHelp: - while (true) { - var _p14 = dict; - if (_p14.ctor === 'RBEmpty_elm_builtin') { - return n; - } else { - var _v16 = A2(_elm_lang$core$Dict$sizeHelp, n + 1, _p14._4), - _v17 = _p14._3; - n = _v16; - dict = _v17; - continue sizeHelp; - } - } - }); -var _elm_lang$core$Dict$size = function (dict) { - return A2(_elm_lang$core$Dict$sizeHelp, 0, dict); -}; -var _elm_lang$core$Dict$get = F2( - function (targetKey, dict) { - get: - while (true) { - var _p15 = dict; - if (_p15.ctor === 'RBEmpty_elm_builtin') { - return _elm_lang$core$Maybe$Nothing; - } else { - var _p16 = A2(_elm_lang$core$Basics$compare, targetKey, _p15._1); - switch (_p16.ctor) { - case 'LT': - var _v20 = targetKey, - _v21 = _p15._3; - targetKey = _v20; - dict = _v21; - continue get; - case 'EQ': - return _elm_lang$core$Maybe$Just(_p15._2); - default: - var _v22 = targetKey, - _v23 = _p15._4; - targetKey = _v22; - dict = _v23; - continue get; - } - } - } - }); -var _elm_lang$core$Dict$member = F2( - function (key, dict) { - var _p17 = A2(_elm_lang$core$Dict$get, key, dict); - if (_p17.ctor === 'Just') { - return true; - } else { - return false; - } - }); -var _elm_lang$core$Dict$maxWithDefault = F3( - function (k, v, r) { - maxWithDefault: - while (true) { - var _p18 = r; - if (_p18.ctor === 'RBEmpty_elm_builtin') { - return {ctor: '_Tuple2', _0: k, _1: v}; - } else { - var _v26 = _p18._1, - _v27 = _p18._2, - _v28 = _p18._4; - k = _v26; - v = _v27; - r = _v28; - continue maxWithDefault; - } - } - }); -var _elm_lang$core$Dict$NBlack = {ctor: 'NBlack'}; -var _elm_lang$core$Dict$BBlack = {ctor: 'BBlack'}; -var _elm_lang$core$Dict$Black = {ctor: 'Black'}; -var _elm_lang$core$Dict$blackish = function (t) { - var _p19 = t; - if (_p19.ctor === 'RBNode_elm_builtin') { - var _p20 = _p19._0; - return _elm_lang$core$Native_Utils.eq(_p20, _elm_lang$core$Dict$Black) || _elm_lang$core$Native_Utils.eq(_p20, _elm_lang$core$Dict$BBlack); - } else { - return true; - } -}; -var _elm_lang$core$Dict$Red = {ctor: 'Red'}; -var _elm_lang$core$Dict$moreBlack = function (color) { - var _p21 = color; - switch (_p21.ctor) { - case 'Black': - return _elm_lang$core$Dict$BBlack; - case 'Red': - return _elm_lang$core$Dict$Black; - case 'NBlack': - return _elm_lang$core$Dict$Red; - default: - return _elm_lang$core$Native_Debug.crash('Can\'t make a double black node more black!'); - } -}; -var _elm_lang$core$Dict$lessBlack = function (color) { - var _p22 = color; - switch (_p22.ctor) { - case 'BBlack': - return _elm_lang$core$Dict$Black; - case 'Black': - return _elm_lang$core$Dict$Red; - case 'Red': - return _elm_lang$core$Dict$NBlack; - default: - return _elm_lang$core$Native_Debug.crash('Can\'t make a negative black node less black!'); - } -}; -var _elm_lang$core$Dict$LBBlack = {ctor: 'LBBlack'}; -var _elm_lang$core$Dict$LBlack = {ctor: 'LBlack'}; -var _elm_lang$core$Dict$RBEmpty_elm_builtin = function (a) { - return {ctor: 'RBEmpty_elm_builtin', _0: a}; -}; -var _elm_lang$core$Dict$empty = _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); -var _elm_lang$core$Dict$isEmpty = function (dict) { - return _elm_lang$core$Native_Utils.eq(dict, _elm_lang$core$Dict$empty); -}; -var _elm_lang$core$Dict$RBNode_elm_builtin = F5( - function (a, b, c, d, e) { - return {ctor: 'RBNode_elm_builtin', _0: a, _1: b, _2: c, _3: d, _4: e}; - }); -var _elm_lang$core$Dict$ensureBlackRoot = function (dict) { - var _p23 = dict; - if ((_p23.ctor === 'RBNode_elm_builtin') && (_p23._0.ctor === 'Red')) { - return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p23._1, _p23._2, _p23._3, _p23._4); - } else { - return dict; - } -}; -var _elm_lang$core$Dict$lessBlackTree = function (dict) { - var _p24 = dict; - if (_p24.ctor === 'RBNode_elm_builtin') { - return A5( - _elm_lang$core$Dict$RBNode_elm_builtin, - _elm_lang$core$Dict$lessBlack(_p24._0), - _p24._1, - _p24._2, - _p24._3, - _p24._4); - } else { - return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); - } -}; -var _elm_lang$core$Dict$balancedTree = function (col) { - return function (xk) { - return function (xv) { - return function (yk) { - return function (yv) { - return function (zk) { - return function (zv) { - return function (a) { - return function (b) { - return function (c) { - return function (d) { - return A5( - _elm_lang$core$Dict$RBNode_elm_builtin, - _elm_lang$core$Dict$lessBlack(col), - yk, - yv, - A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, xk, xv, a, b), - A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, zk, zv, c, d)); - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; -}; -var _elm_lang$core$Dict$blacken = function (t) { - var _p25 = t; - if (_p25.ctor === 'RBEmpty_elm_builtin') { - return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); - } else { - return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p25._1, _p25._2, _p25._3, _p25._4); - } -}; -var _elm_lang$core$Dict$redden = function (t) { - var _p26 = t; - if (_p26.ctor === 'RBEmpty_elm_builtin') { - return _elm_lang$core$Native_Debug.crash('can\'t make a Leaf red'); - } else { - return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Red, _p26._1, _p26._2, _p26._3, _p26._4); - } -}; -var _elm_lang$core$Dict$balanceHelp = function (tree) { - var _p27 = tree; - _v36_6: - do { - _v36_5: - do { - _v36_4: - do { - _v36_3: - do { - _v36_2: - do { - _v36_1: - do { - _v36_0: - do { - if (_p27.ctor === 'RBNode_elm_builtin') { - if (_p27._3.ctor === 'RBNode_elm_builtin') { - if (_p27._4.ctor === 'RBNode_elm_builtin') { - switch (_p27._3._0.ctor) { - case 'Red': - switch (_p27._4._0.ctor) { - case 'Red': - if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { - break _v36_0; - } else { - if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { - break _v36_1; - } else { - if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { - break _v36_2; - } else { - if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { - break _v36_3; - } else { - break _v36_6; - } - } - } - } - case 'NBlack': - if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { - break _v36_0; - } else { - if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { - break _v36_1; - } else { - if (((((_p27._0.ctor === 'BBlack') && (_p27._4._3.ctor === 'RBNode_elm_builtin')) && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { - break _v36_4; - } else { - break _v36_6; - } - } - } - default: - if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { - break _v36_0; - } else { - if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { - break _v36_1; - } else { - break _v36_6; - } - } - } - case 'NBlack': - switch (_p27._4._0.ctor) { - case 'Red': - if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { - break _v36_2; - } else { - if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { - break _v36_3; - } else { - if (((((_p27._0.ctor === 'BBlack') && (_p27._3._3.ctor === 'RBNode_elm_builtin')) && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { - break _v36_5; - } else { - break _v36_6; - } - } - } - case 'NBlack': - if (_p27._0.ctor === 'BBlack') { - if ((((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { - break _v36_4; - } else { - if ((((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { - break _v36_5; - } else { - break _v36_6; - } - } - } else { - break _v36_6; - } - default: - if (((((_p27._0.ctor === 'BBlack') && (_p27._3._3.ctor === 'RBNode_elm_builtin')) && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { - break _v36_5; - } else { - break _v36_6; - } - } - default: - switch (_p27._4._0.ctor) { - case 'Red': - if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { - break _v36_2; - } else { - if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { - break _v36_3; - } else { - break _v36_6; - } - } - case 'NBlack': - if (((((_p27._0.ctor === 'BBlack') && (_p27._4._3.ctor === 'RBNode_elm_builtin')) && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { - break _v36_4; - } else { - break _v36_6; - } - default: - break _v36_6; - } - } - } else { - switch (_p27._3._0.ctor) { - case 'Red': - if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { - break _v36_0; - } else { - if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { - break _v36_1; - } else { - break _v36_6; - } - } - case 'NBlack': - if (((((_p27._0.ctor === 'BBlack') && (_p27._3._3.ctor === 'RBNode_elm_builtin')) && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { - break _v36_5; - } else { - break _v36_6; - } - default: - break _v36_6; - } - } - } else { - if (_p27._4.ctor === 'RBNode_elm_builtin') { - switch (_p27._4._0.ctor) { - case 'Red': - if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { - break _v36_2; - } else { - if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { - break _v36_3; - } else { - break _v36_6; - } - } - case 'NBlack': - if (((((_p27._0.ctor === 'BBlack') && (_p27._4._3.ctor === 'RBNode_elm_builtin')) && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { - break _v36_4; - } else { - break _v36_6; - } - default: - break _v36_6; - } - } else { - break _v36_6; - } - } - } else { - break _v36_6; - } - } while(false); - return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._3._3._1)(_p27._3._3._2)(_p27._3._1)(_p27._3._2)(_p27._1)(_p27._2)(_p27._3._3._3)(_p27._3._3._4)(_p27._3._4)(_p27._4); - } while(false); - return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._3._1)(_p27._3._2)(_p27._3._4._1)(_p27._3._4._2)(_p27._1)(_p27._2)(_p27._3._3)(_p27._3._4._3)(_p27._3._4._4)(_p27._4); - } while(false); - return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._1)(_p27._2)(_p27._4._3._1)(_p27._4._3._2)(_p27._4._1)(_p27._4._2)(_p27._3)(_p27._4._3._3)(_p27._4._3._4)(_p27._4._4); - } while(false); - return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._1)(_p27._2)(_p27._4._1)(_p27._4._2)(_p27._4._4._1)(_p27._4._4._2)(_p27._3)(_p27._4._3)(_p27._4._4._3)(_p27._4._4._4); - } while(false); - return A5( - _elm_lang$core$Dict$RBNode_elm_builtin, - _elm_lang$core$Dict$Black, - _p27._4._3._1, - _p27._4._3._2, - A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p27._1, _p27._2, _p27._3, _p27._4._3._3), - A5( - _elm_lang$core$Dict$balance, - _elm_lang$core$Dict$Black, - _p27._4._1, - _p27._4._2, - _p27._4._3._4, - _elm_lang$core$Dict$redden(_p27._4._4))); - } while(false); - return A5( - _elm_lang$core$Dict$RBNode_elm_builtin, - _elm_lang$core$Dict$Black, - _p27._3._4._1, - _p27._3._4._2, - A5( - _elm_lang$core$Dict$balance, - _elm_lang$core$Dict$Black, - _p27._3._1, - _p27._3._2, - _elm_lang$core$Dict$redden(_p27._3._3), - _p27._3._4._3), - A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p27._1, _p27._2, _p27._3._4._4, _p27._4)); - } while(false); - return tree; -}; -var _elm_lang$core$Dict$balance = F5( - function (c, k, v, l, r) { - var tree = A5(_elm_lang$core$Dict$RBNode_elm_builtin, c, k, v, l, r); - return _elm_lang$core$Dict$blackish(tree) ? _elm_lang$core$Dict$balanceHelp(tree) : tree; - }); -var _elm_lang$core$Dict$bubble = F5( - function (c, k, v, l, r) { - return (_elm_lang$core$Dict$isBBlack(l) || _elm_lang$core$Dict$isBBlack(r)) ? A5( - _elm_lang$core$Dict$balance, - _elm_lang$core$Dict$moreBlack(c), - k, - v, - _elm_lang$core$Dict$lessBlackTree(l), - _elm_lang$core$Dict$lessBlackTree(r)) : A5(_elm_lang$core$Dict$RBNode_elm_builtin, c, k, v, l, r); - }); -var _elm_lang$core$Dict$removeMax = F5( - function (c, k, v, l, r) { - var _p28 = r; - if (_p28.ctor === 'RBEmpty_elm_builtin') { - return A3(_elm_lang$core$Dict$rem, c, l, r); - } else { - return A5( - _elm_lang$core$Dict$bubble, - c, - k, - v, - l, - A5(_elm_lang$core$Dict$removeMax, _p28._0, _p28._1, _p28._2, _p28._3, _p28._4)); - } - }); -var _elm_lang$core$Dict$rem = F3( - function (color, left, right) { - var _p29 = {ctor: '_Tuple2', _0: left, _1: right}; - if (_p29._0.ctor === 'RBEmpty_elm_builtin') { - if (_p29._1.ctor === 'RBEmpty_elm_builtin') { - var _p30 = color; - switch (_p30.ctor) { - case 'Red': - return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); - case 'Black': - return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBBlack); - default: - return _elm_lang$core$Native_Debug.crash('cannot have bblack or nblack nodes at this point'); - } - } else { - var _p33 = _p29._1._0; - var _p32 = _p29._0._0; - var _p31 = {ctor: '_Tuple3', _0: color, _1: _p32, _2: _p33}; - if ((((_p31.ctor === '_Tuple3') && (_p31._0.ctor === 'Black')) && (_p31._1.ctor === 'LBlack')) && (_p31._2.ctor === 'Red')) { - return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p29._1._1, _p29._1._2, _p29._1._3, _p29._1._4); - } else { - return A4( - _elm_lang$core$Dict$reportRemBug, - 'Black/LBlack/Red', - color, - _elm_lang$core$Basics$toString(_p32), - _elm_lang$core$Basics$toString(_p33)); - } - } - } else { - if (_p29._1.ctor === 'RBEmpty_elm_builtin') { - var _p36 = _p29._1._0; - var _p35 = _p29._0._0; - var _p34 = {ctor: '_Tuple3', _0: color, _1: _p35, _2: _p36}; - if ((((_p34.ctor === '_Tuple3') && (_p34._0.ctor === 'Black')) && (_p34._1.ctor === 'Red')) && (_p34._2.ctor === 'LBlack')) { - return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p29._0._1, _p29._0._2, _p29._0._3, _p29._0._4); - } else { - return A4( - _elm_lang$core$Dict$reportRemBug, - 'Black/Red/LBlack', - color, - _elm_lang$core$Basics$toString(_p35), - _elm_lang$core$Basics$toString(_p36)); - } - } else { - var _p40 = _p29._0._2; - var _p39 = _p29._0._4; - var _p38 = _p29._0._1; - var newLeft = A5(_elm_lang$core$Dict$removeMax, _p29._0._0, _p38, _p40, _p29._0._3, _p39); - var _p37 = A3(_elm_lang$core$Dict$maxWithDefault, _p38, _p40, _p39); - var k = _p37._0; - var v = _p37._1; - return A5(_elm_lang$core$Dict$bubble, color, k, v, newLeft, right); - } - } - }); -var _elm_lang$core$Dict$map = F2( - function (f, dict) { - var _p41 = dict; - if (_p41.ctor === 'RBEmpty_elm_builtin') { - return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); - } else { - var _p42 = _p41._1; - return A5( - _elm_lang$core$Dict$RBNode_elm_builtin, - _p41._0, - _p42, - A2(f, _p42, _p41._2), - A2(_elm_lang$core$Dict$map, f, _p41._3), - A2(_elm_lang$core$Dict$map, f, _p41._4)); - } - }); -var _elm_lang$core$Dict$Same = {ctor: 'Same'}; -var _elm_lang$core$Dict$Remove = {ctor: 'Remove'}; -var _elm_lang$core$Dict$Insert = {ctor: 'Insert'}; -var _elm_lang$core$Dict$update = F3( - function (k, alter, dict) { - var up = function (dict) { - var _p43 = dict; - if (_p43.ctor === 'RBEmpty_elm_builtin') { - var _p44 = alter(_elm_lang$core$Maybe$Nothing); - if (_p44.ctor === 'Nothing') { - return {ctor: '_Tuple2', _0: _elm_lang$core$Dict$Same, _1: _elm_lang$core$Dict$empty}; - } else { - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Insert, - _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Red, k, _p44._0, _elm_lang$core$Dict$empty, _elm_lang$core$Dict$empty) - }; - } - } else { - var _p55 = _p43._2; - var _p54 = _p43._4; - var _p53 = _p43._3; - var _p52 = _p43._1; - var _p51 = _p43._0; - var _p45 = A2(_elm_lang$core$Basics$compare, k, _p52); - switch (_p45.ctor) { - case 'EQ': - var _p46 = alter( - _elm_lang$core$Maybe$Just(_p55)); - if (_p46.ctor === 'Nothing') { - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Remove, - _1: A3(_elm_lang$core$Dict$rem, _p51, _p53, _p54) - }; - } else { - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Same, - _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _p51, _p52, _p46._0, _p53, _p54) - }; - } - case 'LT': - var _p47 = up(_p53); - var flag = _p47._0; - var newLeft = _p47._1; - var _p48 = flag; - switch (_p48.ctor) { - case 'Same': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Same, - _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _p51, _p52, _p55, newLeft, _p54) - }; - case 'Insert': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Insert, - _1: A5(_elm_lang$core$Dict$balance, _p51, _p52, _p55, newLeft, _p54) - }; - default: - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Remove, - _1: A5(_elm_lang$core$Dict$bubble, _p51, _p52, _p55, newLeft, _p54) - }; - } - default: - var _p49 = up(_p54); - var flag = _p49._0; - var newRight = _p49._1; - var _p50 = flag; - switch (_p50.ctor) { - case 'Same': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Same, - _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _p51, _p52, _p55, _p53, newRight) - }; - case 'Insert': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Insert, - _1: A5(_elm_lang$core$Dict$balance, _p51, _p52, _p55, _p53, newRight) - }; - default: - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Remove, - _1: A5(_elm_lang$core$Dict$bubble, _p51, _p52, _p55, _p53, newRight) - }; - } - } - } - }; - var _p56 = up(dict); - var flag = _p56._0; - var updatedDict = _p56._1; - var _p57 = flag; - switch (_p57.ctor) { - case 'Same': - return updatedDict; - case 'Insert': - return _elm_lang$core$Dict$ensureBlackRoot(updatedDict); - default: - return _elm_lang$core$Dict$blacken(updatedDict); - } - }); -var _elm_lang$core$Dict$insert = F3( - function (key, value, dict) { - return A3( - _elm_lang$core$Dict$update, - key, - _elm_lang$core$Basics$always( - _elm_lang$core$Maybe$Just(value)), - dict); - }); -var _elm_lang$core$Dict$singleton = F2( - function (key, value) { - return A3(_elm_lang$core$Dict$insert, key, value, _elm_lang$core$Dict$empty); - }); -var _elm_lang$core$Dict$union = F2( - function (t1, t2) { - return A3(_elm_lang$core$Dict$foldl, _elm_lang$core$Dict$insert, t2, t1); - }); -var _elm_lang$core$Dict$filter = F2( - function (predicate, dictionary) { - var add = F3( - function (key, value, dict) { - return A2(predicate, key, value) ? A3(_elm_lang$core$Dict$insert, key, value, dict) : dict; - }); - return A3(_elm_lang$core$Dict$foldl, add, _elm_lang$core$Dict$empty, dictionary); - }); -var _elm_lang$core$Dict$intersect = F2( - function (t1, t2) { - return A2( - _elm_lang$core$Dict$filter, - F2( - function (k, _p58) { - return A2(_elm_lang$core$Dict$member, k, t2); - }), - t1); - }); -var _elm_lang$core$Dict$partition = F2( - function (predicate, dict) { - var add = F3( - function (key, value, _p59) { - var _p60 = _p59; - var _p62 = _p60._1; - var _p61 = _p60._0; - return A2(predicate, key, value) ? { - ctor: '_Tuple2', - _0: A3(_elm_lang$core$Dict$insert, key, value, _p61), - _1: _p62 - } : { - ctor: '_Tuple2', - _0: _p61, - _1: A3(_elm_lang$core$Dict$insert, key, value, _p62) - }; - }); - return A3( - _elm_lang$core$Dict$foldl, - add, - {ctor: '_Tuple2', _0: _elm_lang$core$Dict$empty, _1: _elm_lang$core$Dict$empty}, - dict); - }); -var _elm_lang$core$Dict$fromList = function (assocs) { - return A3( - _elm_lang$core$List$foldl, - F2( - function (_p63, dict) { - var _p64 = _p63; - return A3(_elm_lang$core$Dict$insert, _p64._0, _p64._1, dict); - }), - _elm_lang$core$Dict$empty, - assocs); -}; -var _elm_lang$core$Dict$remove = F2( - function (key, dict) { - return A3( - _elm_lang$core$Dict$update, - key, - _elm_lang$core$Basics$always(_elm_lang$core$Maybe$Nothing), - dict); - }); -var _elm_lang$core$Dict$diff = F2( - function (t1, t2) { - return A3( - _elm_lang$core$Dict$foldl, - F3( - function (k, v, t) { - return A2(_elm_lang$core$Dict$remove, k, t); - }), - t1, - t2); - }); - -var _elm_lang$core$Set$foldr = F3( - function (f, b, _p0) { - var _p1 = _p0; - return A3( - _elm_lang$core$Dict$foldr, - F3( - function (k, _p2, b) { - return A2(f, k, b); - }), - b, - _p1._0); - }); -var _elm_lang$core$Set$foldl = F3( - function (f, b, _p3) { - var _p4 = _p3; - return A3( - _elm_lang$core$Dict$foldl, - F3( - function (k, _p5, b) { - return A2(f, k, b); - }), - b, - _p4._0); - }); -var _elm_lang$core$Set$toList = function (_p6) { - var _p7 = _p6; - return _elm_lang$core$Dict$keys(_p7._0); -}; -var _elm_lang$core$Set$size = function (_p8) { - var _p9 = _p8; - return _elm_lang$core$Dict$size(_p9._0); -}; -var _elm_lang$core$Set$member = F2( - function (k, _p10) { - var _p11 = _p10; - return A2(_elm_lang$core$Dict$member, k, _p11._0); - }); -var _elm_lang$core$Set$isEmpty = function (_p12) { - var _p13 = _p12; - return _elm_lang$core$Dict$isEmpty(_p13._0); -}; -var _elm_lang$core$Set$Set_elm_builtin = function (a) { - return {ctor: 'Set_elm_builtin', _0: a}; -}; -var _elm_lang$core$Set$empty = _elm_lang$core$Set$Set_elm_builtin(_elm_lang$core$Dict$empty); -var _elm_lang$core$Set$singleton = function (k) { - return _elm_lang$core$Set$Set_elm_builtin( - A2( - _elm_lang$core$Dict$singleton, - k, - {ctor: '_Tuple0'})); -}; -var _elm_lang$core$Set$insert = F2( - function (k, _p14) { - var _p15 = _p14; - return _elm_lang$core$Set$Set_elm_builtin( - A3( - _elm_lang$core$Dict$insert, - k, - {ctor: '_Tuple0'}, - _p15._0)); - }); -var _elm_lang$core$Set$fromList = function (xs) { - return A3(_elm_lang$core$List$foldl, _elm_lang$core$Set$insert, _elm_lang$core$Set$empty, xs); -}; -var _elm_lang$core$Set$map = F2( - function (f, s) { - return _elm_lang$core$Set$fromList( - A2( - _elm_lang$core$List$map, - f, - _elm_lang$core$Set$toList(s))); - }); -var _elm_lang$core$Set$remove = F2( - function (k, _p16) { - var _p17 = _p16; - return _elm_lang$core$Set$Set_elm_builtin( - A2(_elm_lang$core$Dict$remove, k, _p17._0)); - }); -var _elm_lang$core$Set$union = F2( - function (_p19, _p18) { - var _p20 = _p19; - var _p21 = _p18; - return _elm_lang$core$Set$Set_elm_builtin( - A2(_elm_lang$core$Dict$union, _p20._0, _p21._0)); - }); -var _elm_lang$core$Set$intersect = F2( - function (_p23, _p22) { - var _p24 = _p23; - var _p25 = _p22; - return _elm_lang$core$Set$Set_elm_builtin( - A2(_elm_lang$core$Dict$intersect, _p24._0, _p25._0)); - }); -var _elm_lang$core$Set$diff = F2( - function (_p27, _p26) { - var _p28 = _p27; - var _p29 = _p26; - return _elm_lang$core$Set$Set_elm_builtin( - A2(_elm_lang$core$Dict$diff, _p28._0, _p29._0)); - }); -var _elm_lang$core$Set$filter = F2( - function (p, _p30) { - var _p31 = _p30; - return _elm_lang$core$Set$Set_elm_builtin( - A2( - _elm_lang$core$Dict$filter, - F2( - function (k, _p32) { - return p(k); - }), - _p31._0)); - }); -var _elm_lang$core$Set$partition = F2( - function (p, _p33) { - var _p34 = _p33; - var _p35 = A2( - _elm_lang$core$Dict$partition, - F2( - function (k, _p36) { - return p(k); - }), - _p34._0); - var p1 = _p35._0; - var p2 = _p35._1; - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Set$Set_elm_builtin(p1), - _1: _elm_lang$core$Set$Set_elm_builtin(p2) - }; - }); - -var _elm_lang$core$Tuple$mapSecond = F2( - function (func, _p0) { - var _p1 = _p0; - return { - ctor: '_Tuple2', - _0: _p1._0, - _1: func(_p1._1) - }; - }); -var _elm_lang$core$Tuple$mapFirst = F2( - function (func, _p2) { - var _p3 = _p2; - return { - ctor: '_Tuple2', - _0: func(_p3._0), - _1: _p3._1 - }; - }); -var _elm_lang$core$Tuple$second = function (_p4) { - var _p5 = _p4; - return _p5._1; -}; -var _elm_lang$core$Tuple$first = function (_p6) { - var _p7 = _p6; - return _p7._0; -}; - -var _elm_lang$core$Debug$crash = _elm_lang$core$Native_Debug.crash; -var _elm_lang$core$Debug$log = _elm_lang$core$Native_Debug.log; - -//import // + return $elm$core$Result$Ok($elm$core$List$reverse(keyValuePairs)); -var _elm_lang$core$Native_Platform = function() { - - -// PROGRAMS - -function program(impl) -{ - return function(flagDecoder) - { - return function(object, moduleName) - { - object['worker'] = function worker(flags) + case 13: + var answer = decoder.f; + var decoders = decoder.g; + for (var i = 0; i < decoders.length; i++) { - if (typeof flags !== 'undefined') + var result = _Json_runHelp(decoders[i], value); + if (!$elm$core$Result$isOk(result)) { - throw new Error( - 'The `' + moduleName + '` module does not need flags.\n' - + 'Call ' + moduleName + '.worker() with no arguments and you should be all set!' - ); - } - - return initialize( - impl.init, - impl.update, - impl.subscriptions, - renderer - ); - }; - }; - }; -} - -function programWithFlags(impl) -{ - return function(flagDecoder) - { - return function(object, moduleName) - { - object['worker'] = function worker(flags) - { - if (typeof flagDecoder === 'undefined') - { - throw new Error( - 'Are you trying to sneak a Never value into Elm? Trickster!\n' - + 'It looks like ' + moduleName + '.main is defined with `programWithFlags` but has type `Program Never`.\n' - + 'Use `program` instead if you do not want flags.' - ); - } - - var result = A2(_elm_lang$core$Native_Json.run, flagDecoder, flags); - if (result.ctor === 'Err') - { - throw new Error( - moduleName + '.worker(...) was called with an unexpected argument.\n' - + 'I tried to convert it to an Elm value, but ran into this problem:\n\n' - + result._0 - ); - } - - return initialize( - impl.init(result._0), - impl.update, - impl.subscriptions, - renderer - ); - }; - }; - }; -} - -function renderer(enqueue, _) -{ - return function(_) {}; -} - - -// HTML TO PROGRAM - -function htmlToProgram(vnode) -{ - var emptyBag = batch(_elm_lang$core$Native_List.Nil); - var noChange = _elm_lang$core$Native_Utils.Tuple2( - _elm_lang$core$Native_Utils.Tuple0, - emptyBag - ); - - return _elm_lang$virtual_dom$VirtualDom$program({ - init: noChange, - view: function(model) { return main; }, - update: F2(function(msg, model) { return noChange; }), - subscriptions: function (model) { return emptyBag; } - }); -} - - -// INITIALIZE A PROGRAM - -function initialize(init, update, subscriptions, renderer) -{ - // ambient state - var managers = {}; - var updateView; - - // init and update state in main process - var initApp = _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) { - var model = init._0; - updateView = renderer(enqueue, model); - var cmds = init._1; - var subs = subscriptions(model); - dispatchEffects(managers, cmds, subs); - callback(_elm_lang$core$Native_Scheduler.succeed(model)); - }); - - function onMessage(msg, model) - { - return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) { - var results = A2(update, msg, model); - model = results._0; - updateView(model); - var cmds = results._1; - var subs = subscriptions(model); - dispatchEffects(managers, cmds, subs); - callback(_elm_lang$core$Native_Scheduler.succeed(model)); - }); - } - - var mainProcess = spawnLoop(initApp, onMessage); - - function enqueue(msg) - { - _elm_lang$core$Native_Scheduler.rawSend(mainProcess, msg); - } - - var ports = setupEffects(managers, enqueue); - - return ports ? { ports: ports } : {}; -} - - -// EFFECT MANAGERS - -var effectManagers = {}; - -function setupEffects(managers, callback) -{ - var ports; - - // setup all necessary effect managers - for (var key in effectManagers) - { - var manager = effectManagers[key]; - - if (manager.isForeign) - { - ports = ports || {}; - ports[key] = manager.tag === 'cmd' - ? setupOutgoingPort(key) - : setupIncomingPort(key, callback); - } - - managers[key] = makeManager(manager, callback); - } - - return ports; -} - -function makeManager(info, callback) -{ - var router = { - main: callback, - self: undefined - }; - - var tag = info.tag; - var onEffects = info.onEffects; - var onSelfMsg = info.onSelfMsg; - - function onMessage(msg, state) - { - if (msg.ctor === 'self') - { - return A3(onSelfMsg, router, msg._0, state); - } - - var fx = msg._0; - switch (tag) - { - case 'cmd': - return A3(onEffects, router, fx.cmds, state); - - case 'sub': - return A3(onEffects, router, fx.subs, state); - - case 'fx': - return A4(onEffects, router, fx.cmds, fx.subs, state); - } - } - - var process = spawnLoop(info.init, onMessage); - router.self = process; - return process; -} - -function sendToApp(router, msg) -{ - return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) - { - router.main(msg); - callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0)); - }); -} - -function sendToSelf(router, msg) -{ - return A2(_elm_lang$core$Native_Scheduler.send, router.self, { - ctor: 'self', - _0: msg - }); -} - - -// HELPER for STATEFUL LOOPS - -function spawnLoop(init, onMessage) -{ - var andThen = _elm_lang$core$Native_Scheduler.andThen; - - function loop(state) - { - var handleMsg = _elm_lang$core$Native_Scheduler.receive(function(msg) { - return onMessage(msg, state); - }); - return A2(andThen, loop, handleMsg); - } - - var task = A2(andThen, loop, init); - - return _elm_lang$core$Native_Scheduler.rawSpawn(task); -} - - -// BAGS - -function leaf(home) -{ - return function(value) - { - return { - type: 'leaf', - home: home, - value: value - }; - }; -} - -function batch(list) -{ - return { - type: 'node', - branches: list - }; -} - -function map(tagger, bag) -{ - return { - type: 'map', - tagger: tagger, - tree: bag - } -} - - -// PIPE BAGS INTO EFFECT MANAGERS - -function dispatchEffects(managers, cmdBag, subBag) -{ - var effectsDict = {}; - gatherEffects(true, cmdBag, effectsDict, null); - gatherEffects(false, subBag, effectsDict, null); - - for (var home in managers) - { - var fx = home in effectsDict - ? effectsDict[home] - : { - cmds: _elm_lang$core$Native_List.Nil, - subs: _elm_lang$core$Native_List.Nil - }; - - _elm_lang$core$Native_Scheduler.rawSend(managers[home], { ctor: 'fx', _0: fx }); - } -} - -function gatherEffects(isCmd, bag, effectsDict, taggers) -{ - switch (bag.type) - { - case 'leaf': - var home = bag.home; - var effect = toEffect(isCmd, home, taggers, bag.value); - effectsDict[home] = insert(isCmd, effect, effectsDict[home]); - return; - - case 'node': - var list = bag.branches; - while (list.ctor !== '[]') - { - gatherEffects(isCmd, list._0, effectsDict, taggers); - list = list._1; - } - return; - - case 'map': - gatherEffects(isCmd, bag.tree, effectsDict, { - tagger: bag.tagger, - rest: taggers - }); - return; - } -} - -function toEffect(isCmd, home, taggers, value) -{ - function applyTaggers(x) - { - var temp = taggers; - while (temp) - { - x = temp.tagger(x); - temp = temp.rest; - } - return x; - } - - var map = isCmd - ? effectManagers[home].cmdMap - : effectManagers[home].subMap; - - return A2(map, applyTaggers, value) -} - -function insert(isCmd, newEffect, effects) -{ - effects = effects || { - cmds: _elm_lang$core$Native_List.Nil, - subs: _elm_lang$core$Native_List.Nil - }; - if (isCmd) - { - effects.cmds = _elm_lang$core$Native_List.Cons(newEffect, effects.cmds); - return effects; - } - effects.subs = _elm_lang$core$Native_List.Cons(newEffect, effects.subs); - return effects; -} - - -// PORTS - -function checkPortName(name) -{ - if (name in effectManagers) - { - throw new Error('There can only be one port named `' + name + '`, but your program has multiple.'); - } -} - - -// OUTGOING PORTS - -function outgoingPort(name, converter) -{ - checkPortName(name); - effectManagers[name] = { - tag: 'cmd', - cmdMap: outgoingPortMap, - converter: converter, - isForeign: true - }; - return leaf(name); -} - -var outgoingPortMap = F2(function cmdMap(tagger, value) { - return value; -}); - -function setupOutgoingPort(name) -{ - var subs = []; - var converter = effectManagers[name].converter; - - // CREATE MANAGER - - var init = _elm_lang$core$Native_Scheduler.succeed(null); - - function onEffects(router, cmdList, state) - { - while (cmdList.ctor !== '[]') - { - // grab a separate reference to subs in case unsubscribe is called - var currentSubs = subs; - var value = converter(cmdList._0); - for (var i = 0; i < currentSubs.length; i++) - { - currentSubs[i](value); - } - cmdList = cmdList._1; - } - return init; - } - - effectManagers[name].init = init; - effectManagers[name].onEffects = F3(onEffects); - - // PUBLIC API - - function subscribe(callback) - { - subs.push(callback); - } - - function unsubscribe(callback) - { - // copy subs into a new array in case unsubscribe is called within a - // subscribed callback - subs = subs.slice(); - var index = subs.indexOf(callback); - if (index >= 0) - { - subs.splice(index, 1); - } - } - - return { - subscribe: subscribe, - unsubscribe: unsubscribe - }; -} - - -// INCOMING PORTS - -function incomingPort(name, converter) -{ - checkPortName(name); - effectManagers[name] = { - tag: 'sub', - subMap: incomingPortMap, - converter: converter, - isForeign: true - }; - return leaf(name); -} - -var incomingPortMap = F2(function subMap(tagger, finalTagger) -{ - return function(value) - { - return tagger(finalTagger(value)); - }; -}); - -function setupIncomingPort(name, callback) -{ - var sentBeforeInit = []; - var subs = _elm_lang$core$Native_List.Nil; - var converter = effectManagers[name].converter; - var currentOnEffects = preInitOnEffects; - var currentSend = preInitSend; - - // CREATE MANAGER - - var init = _elm_lang$core$Native_Scheduler.succeed(null); - - function preInitOnEffects(router, subList, state) - { - var postInitResult = postInitOnEffects(router, subList, state); - - for(var i = 0; i < sentBeforeInit.length; i++) - { - postInitSend(sentBeforeInit[i]); - } - - sentBeforeInit = null; // to release objects held in queue - currentSend = postInitSend; - currentOnEffects = postInitOnEffects; - return postInitResult; - } - - function postInitOnEffects(router, subList, state) - { - subs = subList; - return init; - } - - function onEffects(router, subList, state) - { - return currentOnEffects(router, subList, state); - } - - effectManagers[name].init = init; - effectManagers[name].onEffects = F3(onEffects); - - // PUBLIC API - - function preInitSend(value) - { - sentBeforeInit.push(value); - } - - function postInitSend(value) - { - var temp = subs; - while (temp.ctor !== '[]') - { - callback(temp._0(value)); - temp = temp._1; - } - } - - function send(incomingValue) - { - var result = A2(_elm_lang$core$Json_Decode$decodeValue, converter, incomingValue); - if (result.ctor === 'Err') - { - throw new Error('Trying to send an unexpected type of value through port `' + name + '`:\n' + result._0); - } - - currentSend(result._0); - } - - return { send: send }; -} - -return { - // routers - sendToApp: F2(sendToApp), - sendToSelf: F2(sendToSelf), - - // global setup - effectManagers: effectManagers, - outgoingPort: outgoingPort, - incomingPort: incomingPort, - - htmlToProgram: htmlToProgram, - program: program, - programWithFlags: programWithFlags, - initialize: initialize, - - // effect bags - leaf: leaf, - batch: batch, - map: F2(map) -}; - -}(); - -//import Native.Utils // - -var _elm_lang$core$Native_Scheduler = function() { - -var MAX_STEPS = 10000; - - -// TASKS - -function succeed(value) -{ - return { - ctor: '_Task_succeed', - value: value - }; -} - -function fail(error) -{ - return { - ctor: '_Task_fail', - value: error - }; -} - -function nativeBinding(callback) -{ - return { - ctor: '_Task_nativeBinding', - callback: callback, - cancel: null - }; -} - -function andThen(callback, task) -{ - return { - ctor: '_Task_andThen', - callback: callback, - task: task - }; -} - -function onError(callback, task) -{ - return { - ctor: '_Task_onError', - callback: callback, - task: task - }; -} - -function receive(callback) -{ - return { - ctor: '_Task_receive', - callback: callback - }; -} - - -// PROCESSES - -function rawSpawn(task) -{ - var process = { - ctor: '_Process', - id: _elm_lang$core$Native_Utils.guid(), - root: task, - stack: null, - mailbox: [] - }; - - enqueue(process); - - return process; -} - -function spawn(task) -{ - return nativeBinding(function(callback) { - var process = rawSpawn(task); - callback(succeed(process)); - }); -} - -function rawSend(process, msg) -{ - process.mailbox.push(msg); - enqueue(process); -} - -function send(process, msg) -{ - return nativeBinding(function(callback) { - rawSend(process, msg); - callback(succeed(_elm_lang$core$Native_Utils.Tuple0)); - }); -} - -function kill(process) -{ - return nativeBinding(function(callback) { - var root = process.root; - if (root.ctor === '_Task_nativeBinding' && root.cancel) - { - root.cancel(); - } - - process.root = null; - - callback(succeed(_elm_lang$core$Native_Utils.Tuple0)); - }); -} - -function sleep(time) -{ - return nativeBinding(function(callback) { - var id = setTimeout(function() { - callback(succeed(_elm_lang$core$Native_Utils.Tuple0)); - }, time); - - return function() { clearTimeout(id); }; - }); -} - - -// STEP PROCESSES - -function step(numSteps, process) -{ - while (numSteps < MAX_STEPS) - { - var ctor = process.root.ctor; - - if (ctor === '_Task_succeed') - { - while (process.stack && process.stack.ctor === '_Task_onError') - { - process.stack = process.stack.rest; - } - if (process.stack === null) - { - break; - } - process.root = process.stack.callback(process.root.value); - process.stack = process.stack.rest; - ++numSteps; - continue; - } - - if (ctor === '_Task_fail') - { - while (process.stack && process.stack.ctor === '_Task_andThen') - { - process.stack = process.stack.rest; - } - if (process.stack === null) - { - break; - } - process.root = process.stack.callback(process.root.value); - process.stack = process.stack.rest; - ++numSteps; - continue; - } - - if (ctor === '_Task_andThen') - { - process.stack = { - ctor: '_Task_andThen', - callback: process.root.callback, - rest: process.stack - }; - process.root = process.root.task; - ++numSteps; - continue; - } - - if (ctor === '_Task_onError') - { - process.stack = { - ctor: '_Task_onError', - callback: process.root.callback, - rest: process.stack - }; - process.root = process.root.task; - ++numSteps; - continue; - } - - if (ctor === '_Task_nativeBinding') - { - process.root.cancel = process.root.callback(function(newRoot) { - process.root = newRoot; - enqueue(process); - }); - - break; - } - - if (ctor === '_Task_receive') - { - var mailbox = process.mailbox; - if (mailbox.length === 0) - { - break; - } - - process.root = process.root.callback(mailbox.shift()); - ++numSteps; - continue; - } - - throw new Error(ctor); - } - - if (numSteps < MAX_STEPS) - { - return numSteps + 1; - } - enqueue(process); - - return numSteps; -} - - -// WORK QUEUE - -var working = false; -var workQueue = []; - -function enqueue(process) -{ - workQueue.push(process); - - if (!working) - { - setTimeout(work, 0); - working = true; - } -} - -function work() -{ - var numSteps = 0; - var process; - while (numSteps < MAX_STEPS && (process = workQueue.shift())) - { - if (process.root) - { - numSteps = step(numSteps, process); - } - } - if (!process) - { - working = false; - return; - } - setTimeout(work, 0); -} - - -return { - succeed: succeed, - fail: fail, - nativeBinding: nativeBinding, - andThen: F2(andThen), - onError: F2(onError), - receive: receive, - - spawn: spawn, - kill: kill, - sleep: sleep, - send: F2(send), - - rawSpawn: rawSpawn, - rawSend: rawSend -}; - -}(); -var _elm_lang$core$Platform_Cmd$batch = _elm_lang$core$Native_Platform.batch; -var _elm_lang$core$Platform_Cmd$none = _elm_lang$core$Platform_Cmd$batch( - {ctor: '[]'}); -var _elm_lang$core$Platform_Cmd_ops = _elm_lang$core$Platform_Cmd_ops || {}; -_elm_lang$core$Platform_Cmd_ops['!'] = F2( - function (model, commands) { - return { - ctor: '_Tuple2', - _0: model, - _1: _elm_lang$core$Platform_Cmd$batch(commands) - }; - }); -var _elm_lang$core$Platform_Cmd$map = _elm_lang$core$Native_Platform.map; -var _elm_lang$core$Platform_Cmd$Cmd = {ctor: 'Cmd'}; - -var _elm_lang$core$Platform_Sub$batch = _elm_lang$core$Native_Platform.batch; -var _elm_lang$core$Platform_Sub$none = _elm_lang$core$Platform_Sub$batch( - {ctor: '[]'}); -var _elm_lang$core$Platform_Sub$map = _elm_lang$core$Native_Platform.map; -var _elm_lang$core$Platform_Sub$Sub = {ctor: 'Sub'}; - -var _elm_lang$core$Platform$hack = _elm_lang$core$Native_Scheduler.succeed; -var _elm_lang$core$Platform$sendToSelf = _elm_lang$core$Native_Platform.sendToSelf; -var _elm_lang$core$Platform$sendToApp = _elm_lang$core$Native_Platform.sendToApp; -var _elm_lang$core$Platform$programWithFlags = _elm_lang$core$Native_Platform.programWithFlags; -var _elm_lang$core$Platform$program = _elm_lang$core$Native_Platform.program; -var _elm_lang$core$Platform$Program = {ctor: 'Program'}; -var _elm_lang$core$Platform$Task = {ctor: 'Task'}; -var _elm_lang$core$Platform$ProcessId = {ctor: 'ProcessId'}; -var _elm_lang$core$Platform$Router = {ctor: 'Router'}; - -var _elm_community$list_extra$List_Extra$greedyGroupsOfWithStep = F3( - function (size, step, xs) { - var okayXs = _elm_lang$core$Native_Utils.cmp( - _elm_lang$core$List$length(xs), - 0) > 0; - var okayArgs = (_elm_lang$core$Native_Utils.cmp(size, 0) > 0) && (_elm_lang$core$Native_Utils.cmp(step, 0) > 0); - var xs_ = A2(_elm_lang$core$List$drop, step, xs); - var group = A2(_elm_lang$core$List$take, size, xs); - return (okayArgs && okayXs) ? { - ctor: '::', - _0: group, - _1: A3(_elm_community$list_extra$List_Extra$greedyGroupsOfWithStep, size, step, xs_) - } : {ctor: '[]'}; - }); -var _elm_community$list_extra$List_Extra$greedyGroupsOf = F2( - function (size, xs) { - return A3(_elm_community$list_extra$List_Extra$greedyGroupsOfWithStep, size, size, xs); - }); -var _elm_community$list_extra$List_Extra$groupsOfWithStep = F3( - function (size, step, xs) { - var okayArgs = (_elm_lang$core$Native_Utils.cmp(size, 0) > 0) && (_elm_lang$core$Native_Utils.cmp(step, 0) > 0); - var xs_ = A2(_elm_lang$core$List$drop, step, xs); - var group = A2(_elm_lang$core$List$take, size, xs); - var okayLength = _elm_lang$core$Native_Utils.eq( - size, - _elm_lang$core$List$length(group)); - return (okayArgs && okayLength) ? { - ctor: '::', - _0: group, - _1: A3(_elm_community$list_extra$List_Extra$groupsOfWithStep, size, step, xs_) - } : {ctor: '[]'}; - }); -var _elm_community$list_extra$List_Extra$groupsOf = F2( - function (size, xs) { - return A3(_elm_community$list_extra$List_Extra$groupsOfWithStep, size, size, xs); - }); -var _elm_community$list_extra$List_Extra$zip5 = _elm_lang$core$List$map5( - F5( - function (v0, v1, v2, v3, v4) { - return {ctor: '_Tuple5', _0: v0, _1: v1, _2: v2, _3: v3, _4: v4}; - })); -var _elm_community$list_extra$List_Extra$zip4 = _elm_lang$core$List$map4( - F4( - function (v0, v1, v2, v3) { - return {ctor: '_Tuple4', _0: v0, _1: v1, _2: v2, _3: v3}; - })); -var _elm_community$list_extra$List_Extra$zip3 = _elm_lang$core$List$map3( - F3( - function (v0, v1, v2) { - return {ctor: '_Tuple3', _0: v0, _1: v1, _2: v2}; - })); -var _elm_community$list_extra$List_Extra$zip = _elm_lang$core$List$map2( - F2( - function (v0, v1) { - return {ctor: '_Tuple2', _0: v0, _1: v1}; - })); -var _elm_community$list_extra$List_Extra$isPrefixOf = F2( - function (prefix, xs) { - var _p0 = {ctor: '_Tuple2', _0: prefix, _1: xs}; - if (_p0._0.ctor === '[]') { - return true; - } else { - if (_p0._1.ctor === '[]') { - return false; - } else { - return _elm_lang$core$Native_Utils.eq(_p0._0._0, _p0._1._0) && A2(_elm_community$list_extra$List_Extra$isPrefixOf, _p0._0._1, _p0._1._1); - } - } - }); -var _elm_community$list_extra$List_Extra$isSuffixOf = F2( - function (suffix, xs) { - return A2( - _elm_community$list_extra$List_Extra$isPrefixOf, - _elm_lang$core$List$reverse(suffix), - _elm_lang$core$List$reverse(xs)); - }); -var _elm_community$list_extra$List_Extra$selectSplit = function (xs) { - var _p1 = xs; - if (_p1.ctor === '[]') { - return {ctor: '[]'}; - } else { - var _p5 = _p1._1; - var _p4 = _p1._0; - return { - ctor: '::', - _0: { - ctor: '_Tuple3', - _0: {ctor: '[]'}, - _1: _p4, - _2: _p5 - }, - _1: A2( - _elm_lang$core$List$map, - function (_p2) { - var _p3 = _p2; - return { - ctor: '_Tuple3', - _0: {ctor: '::', _0: _p4, _1: _p3._0}, - _1: _p3._1, - _2: _p3._2 - }; - }, - _elm_community$list_extra$List_Extra$selectSplit(_p5)) - }; - } -}; -var _elm_community$list_extra$List_Extra$select = function (xs) { - var _p6 = xs; - if (_p6.ctor === '[]') { - return {ctor: '[]'}; - } else { - var _p10 = _p6._1; - var _p9 = _p6._0; - return { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _p9, _1: _p10}, - _1: A2( - _elm_lang$core$List$map, - function (_p7) { - var _p8 = _p7; - return { - ctor: '_Tuple2', - _0: _p8._0, - _1: {ctor: '::', _0: _p9, _1: _p8._1} - }; - }, - _elm_community$list_extra$List_Extra$select(_p10)) - }; - } -}; -var _elm_community$list_extra$List_Extra$tailsHelp = F2( - function (e, list) { - var _p11 = list; - if (_p11.ctor === '::') { - var _p12 = _p11._0; - return { - ctor: '::', - _0: {ctor: '::', _0: e, _1: _p12}, - _1: {ctor: '::', _0: _p12, _1: _p11._1} - }; - } else { - return {ctor: '[]'}; - } - }); -var _elm_community$list_extra$List_Extra$tails = A2( - _elm_lang$core$List$foldr, - _elm_community$list_extra$List_Extra$tailsHelp, - { - ctor: '::', - _0: {ctor: '[]'}, - _1: {ctor: '[]'} - }); -var _elm_community$list_extra$List_Extra$isInfixOf = F2( - function (infix, xs) { - return A2( - _elm_lang$core$List$any, - _elm_community$list_extra$List_Extra$isPrefixOf(infix), - _elm_community$list_extra$List_Extra$tails(xs)); - }); -var _elm_community$list_extra$List_Extra$inits = A2( - _elm_lang$core$List$foldr, - F2( - function (e, acc) { - return { - ctor: '::', - _0: {ctor: '[]'}, - _1: A2( - _elm_lang$core$List$map, - F2( - function (x, y) { - return {ctor: '::', _0: x, _1: y}; - })(e), - acc) - }; - }), - { - ctor: '::', - _0: {ctor: '[]'}, - _1: {ctor: '[]'} - }); -var _elm_community$list_extra$List_Extra$groupWhileTransitively = F2( - function (cmp, xs_) { - var _p13 = xs_; - if (_p13.ctor === '[]') { - return {ctor: '[]'}; - } else { - if (_p13._1.ctor === '[]') { - return { - ctor: '::', - _0: { - ctor: '::', - _0: _p13._0, - _1: {ctor: '[]'} - }, - _1: {ctor: '[]'} - }; - } else { - var _p15 = _p13._0; - var _p14 = A2(_elm_community$list_extra$List_Extra$groupWhileTransitively, cmp, _p13._1); - if (_p14.ctor === '::') { - return A2(cmp, _p15, _p13._1._0) ? { - ctor: '::', - _0: {ctor: '::', _0: _p15, _1: _p14._0}, - _1: _p14._1 - } : { - ctor: '::', - _0: { - ctor: '::', - _0: _p15, - _1: {ctor: '[]'} - }, - _1: _p14 - }; - } else { - return {ctor: '[]'}; - } - } - } - }); -var _elm_community$list_extra$List_Extra$stripPrefix = F2( - function (prefix, xs) { - var step = F2( - function (e, m) { - var _p16 = m; - if (_p16.ctor === 'Nothing') { - return _elm_lang$core$Maybe$Nothing; - } else { - if (_p16._0.ctor === '[]') { - return _elm_lang$core$Maybe$Nothing; - } else { - return _elm_lang$core$Native_Utils.eq(e, _p16._0._0) ? _elm_lang$core$Maybe$Just(_p16._0._1) : _elm_lang$core$Maybe$Nothing; - } - } - }); - return A3( - _elm_lang$core$List$foldl, - step, - _elm_lang$core$Maybe$Just(xs), - prefix); - }); -var _elm_community$list_extra$List_Extra$dropWhileRight = function (p) { - return A2( - _elm_lang$core$List$foldr, - F2( - function (x, xs) { - return (p(x) && _elm_lang$core$List$isEmpty(xs)) ? {ctor: '[]'} : {ctor: '::', _0: x, _1: xs}; - }), - {ctor: '[]'}); -}; -var _elm_community$list_extra$List_Extra$takeWhileRight = function (p) { - var step = F2( - function (x, _p17) { - var _p18 = _p17; - var _p19 = _p18._0; - return (p(x) && _p18._1) ? { - ctor: '_Tuple2', - _0: {ctor: '::', _0: x, _1: _p19}, - _1: true - } : {ctor: '_Tuple2', _0: _p19, _1: false}; - }); - return function (_p20) { - return _elm_lang$core$Tuple$first( - A3( - _elm_lang$core$List$foldr, - step, - { - ctor: '_Tuple2', - _0: {ctor: '[]'}, - _1: true - }, - _p20)); - }; -}; -var _elm_community$list_extra$List_Extra$splitAt = F2( - function (n, xs) { - return { - ctor: '_Tuple2', - _0: A2(_elm_lang$core$List$take, n, xs), - _1: A2(_elm_lang$core$List$drop, n, xs) - }; - }); -var _elm_community$list_extra$List_Extra$groupsOfVarying_ = F3( - function (listOflengths, list, accu) { - groupsOfVarying_: - while (true) { - var _p21 = {ctor: '_Tuple2', _0: listOflengths, _1: list}; - if (((_p21.ctor === '_Tuple2') && (_p21._0.ctor === '::')) && (_p21._1.ctor === '::')) { - var _p22 = A2(_elm_community$list_extra$List_Extra$splitAt, _p21._0._0, list); - var head = _p22._0; - var tail = _p22._1; - var _v11 = _p21._0._1, - _v12 = tail, - _v13 = {ctor: '::', _0: head, _1: accu}; - listOflengths = _v11; - list = _v12; - accu = _v13; - continue groupsOfVarying_; - } else { - return _elm_lang$core$List$reverse(accu); - } - } - }); -var _elm_community$list_extra$List_Extra$groupsOfVarying = F2( - function (listOflengths, list) { - return A3( - _elm_community$list_extra$List_Extra$groupsOfVarying_, - listOflengths, - list, - {ctor: '[]'}); - }); -var _elm_community$list_extra$List_Extra$unfoldr = F2( - function (f, seed) { - var _p23 = f(seed); - if (_p23.ctor === 'Nothing') { - return {ctor: '[]'}; - } else { - return { - ctor: '::', - _0: _p23._0._0, - _1: A2(_elm_community$list_extra$List_Extra$unfoldr, f, _p23._0._1) - }; - } - }); -var _elm_community$list_extra$List_Extra$scanr1 = F2( - function (f, xs_) { - var _p24 = xs_; - if (_p24.ctor === '[]') { - return {ctor: '[]'}; - } else { - if (_p24._1.ctor === '[]') { - return { - ctor: '::', - _0: _p24._0, - _1: {ctor: '[]'} - }; - } else { - var _p25 = A2(_elm_community$list_extra$List_Extra$scanr1, f, _p24._1); - if (_p25.ctor === '::') { - return { - ctor: '::', - _0: A2(f, _p24._0, _p25._0), - _1: _p25 - }; - } else { - return {ctor: '[]'}; - } - } - } - }); -var _elm_community$list_extra$List_Extra$scanr = F3( - function (f, acc, xs_) { - var _p26 = xs_; - if (_p26.ctor === '[]') { - return { - ctor: '::', - _0: acc, - _1: {ctor: '[]'} - }; - } else { - var _p27 = A3(_elm_community$list_extra$List_Extra$scanr, f, acc, _p26._1); - if (_p27.ctor === '::') { - return { - ctor: '::', - _0: A2(f, _p26._0, _p27._0), - _1: _p27 - }; - } else { - return {ctor: '[]'}; - } - } - }); -var _elm_community$list_extra$List_Extra$scanl1 = F2( - function (f, xs_) { - var _p28 = xs_; - if (_p28.ctor === '[]') { - return {ctor: '[]'}; - } else { - return A3(_elm_lang$core$List$scanl, f, _p28._0, _p28._1); - } - }); -var _elm_community$list_extra$List_Extra$indexedFoldr = F3( - function (func, acc, list) { - var step = F2( - function (x, _p29) { - var _p30 = _p29; - var _p31 = _p30._0; - return { - ctor: '_Tuple2', - _0: _p31 - 1, - _1: A3(func, _p31, x, _p30._1) - }; - }); - return _elm_lang$core$Tuple$second( - A3( - _elm_lang$core$List$foldr, - step, - { - ctor: '_Tuple2', - _0: _elm_lang$core$List$length(list) - 1, - _1: acc - }, - list)); - }); -var _elm_community$list_extra$List_Extra$indexedFoldl = F3( - function (func, acc, list) { - var step = F2( - function (x, _p32) { - var _p33 = _p32; - var _p34 = _p33._0; - return { - ctor: '_Tuple2', - _0: _p34 + 1, - _1: A3(func, _p34, x, _p33._1) - }; - }); - return _elm_lang$core$Tuple$second( - A3( - _elm_lang$core$List$foldl, - step, - {ctor: '_Tuple2', _0: 0, _1: acc}, - list)); - }); -var _elm_community$list_extra$List_Extra$foldr1 = F2( - function (f, xs) { - var mf = F2( - function (x, m) { - return _elm_lang$core$Maybe$Just( - function () { - var _p35 = m; - if (_p35.ctor === 'Nothing') { - return x; - } else { - return A2(f, x, _p35._0); - } - }()); - }); - return A3(_elm_lang$core$List$foldr, mf, _elm_lang$core$Maybe$Nothing, xs); - }); -var _elm_community$list_extra$List_Extra$foldl1 = F2( - function (f, xs) { - var mf = F2( - function (x, m) { - return _elm_lang$core$Maybe$Just( - function () { - var _p36 = m; - if (_p36.ctor === 'Nothing') { - return x; - } else { - return A2(f, _p36._0, x); - } - }()); - }); - return A3(_elm_lang$core$List$foldl, mf, _elm_lang$core$Maybe$Nothing, xs); - }); -var _elm_community$list_extra$List_Extra$interweaveHelp = F3( - function (l1, l2, acc) { - interweaveHelp: - while (true) { - var _p37 = {ctor: '_Tuple2', _0: l1, _1: l2}; - _v24_1: - do { - if (_p37._0.ctor === '::') { - if (_p37._1.ctor === '::') { - var _v25 = _p37._0._1, - _v26 = _p37._1._1, - _v27 = A2( - _elm_lang$core$Basics_ops['++'], - acc, - { - ctor: '::', - _0: _p37._0._0, - _1: { - ctor: '::', - _0: _p37._1._0, - _1: {ctor: '[]'} - } - }); - l1 = _v25; - l2 = _v26; - acc = _v27; - continue interweaveHelp; - } else { - break _v24_1; - } - } else { - if (_p37._1.ctor === '[]') { - break _v24_1; - } else { - return A2(_elm_lang$core$Basics_ops['++'], acc, _p37._1); - } - } - } while(false); - return A2(_elm_lang$core$Basics_ops['++'], acc, _p37._0); - } - }); -var _elm_community$list_extra$List_Extra$interweave = F2( - function (l1, l2) { - return A3( - _elm_community$list_extra$List_Extra$interweaveHelp, - l1, - l2, - {ctor: '[]'}); - }); -var _elm_community$list_extra$List_Extra$permutations = function (xs_) { - var _p38 = xs_; - if (_p38.ctor === '[]') { - return { - ctor: '::', - _0: {ctor: '[]'}, - _1: {ctor: '[]'} - }; - } else { - var f = function (_p39) { - var _p40 = _p39; - return A2( - _elm_lang$core$List$map, - F2( - function (x, y) { - return {ctor: '::', _0: x, _1: y}; - })(_p40._0), - _elm_community$list_extra$List_Extra$permutations(_p40._1)); - }; - return A2( - _elm_lang$core$List$concatMap, - f, - _elm_community$list_extra$List_Extra$select(_p38)); - } -}; -var _elm_community$list_extra$List_Extra$isPermutationOf = F2( - function (permut, xs) { - return A2( - _elm_lang$core$List$member, - permut, - _elm_community$list_extra$List_Extra$permutations(xs)); - }); -var _elm_community$list_extra$List_Extra$subsequencesNonEmpty = function (xs) { - var _p41 = xs; - if (_p41.ctor === '[]') { - return {ctor: '[]'}; - } else { - var _p42 = _p41._0; - var f = F2( - function (ys, r) { - return { - ctor: '::', - _0: ys, - _1: { - ctor: '::', - _0: {ctor: '::', _0: _p42, _1: ys}, - _1: r - } - }; - }); - return { - ctor: '::', - _0: { - ctor: '::', - _0: _p42, - _1: {ctor: '[]'} - }, - _1: A3( - _elm_lang$core$List$foldr, - f, - {ctor: '[]'}, - _elm_community$list_extra$List_Extra$subsequencesNonEmpty(_p41._1)) - }; - } -}; -var _elm_community$list_extra$List_Extra$subsequences = function (xs) { - return { - ctor: '::', - _0: {ctor: '[]'}, - _1: _elm_community$list_extra$List_Extra$subsequencesNonEmpty(xs) - }; -}; -var _elm_community$list_extra$List_Extra$isSubsequenceOf = F2( - function (subseq, xs) { - return A2( - _elm_lang$core$List$member, - subseq, - _elm_community$list_extra$List_Extra$subsequences(xs)); - }); -var _elm_community$list_extra$List_Extra$transpose = function (ll) { - transpose: - while (true) { - var _p43 = ll; - if (_p43.ctor === '[]') { - return {ctor: '[]'}; - } else { - if (_p43._0.ctor === '[]') { - var _v32 = _p43._1; - ll = _v32; - continue transpose; - } else { - var _p44 = _p43._1; - var tails = A2(_elm_lang$core$List$filterMap, _elm_lang$core$List$tail, _p44); - var heads = A2(_elm_lang$core$List$filterMap, _elm_lang$core$List$head, _p44); - return { - ctor: '::', - _0: {ctor: '::', _0: _p43._0._0, _1: heads}, - _1: _elm_community$list_extra$List_Extra$transpose( - {ctor: '::', _0: _p43._0._1, _1: tails}) - }; - } - } - } -}; -var _elm_community$list_extra$List_Extra$intercalate = function (xs) { - return function (_p45) { - return _elm_lang$core$List$concat( - A2(_elm_lang$core$List$intersperse, xs, _p45)); - }; -}; -var _elm_community$list_extra$List_Extra$filterNot = F2( - function (pred, list) { - return A2( - _elm_lang$core$List$filter, - function (_p46) { - return !pred(_p46); - }, - list); - }); -var _elm_community$list_extra$List_Extra$removeAt = F2( - function (index, l) { - if (_elm_lang$core$Native_Utils.cmp(index, 0) < 0) { - return l; - } else { - var tail = _elm_lang$core$List$tail( - A2(_elm_lang$core$List$drop, index, l)); - var head = A2(_elm_lang$core$List$take, index, l); - var _p47 = tail; - if (_p47.ctor === 'Nothing') { - return l; - } else { - return A2(_elm_lang$core$List$append, head, _p47._0); - } - } - }); -var _elm_community$list_extra$List_Extra$stableSortWith = F2( - function (pred, list) { - var predWithIndex = F2( - function (_p49, _p48) { - var _p50 = _p49; - var _p51 = _p48; - var result = A2(pred, _p50._0, _p51._0); - var _p52 = result; - if (_p52.ctor === 'EQ') { - return A2(_elm_lang$core$Basics$compare, _p50._1, _p51._1); - } else { - return result; - } - }); - var listWithIndex = A2( - _elm_lang$core$List$indexedMap, - F2( - function (i, a) { - return {ctor: '_Tuple2', _0: a, _1: i}; - }), - list); - return A2( - _elm_lang$core$List$map, - _elm_lang$core$Tuple$first, - A2(_elm_lang$core$List$sortWith, predWithIndex, listWithIndex)); - }); -var _elm_community$list_extra$List_Extra$setAt = F3( - function (index, value, l) { - if (_elm_lang$core$Native_Utils.cmp(index, 0) < 0) { - return _elm_lang$core$Maybe$Nothing; - } else { - var tail = _elm_lang$core$List$tail( - A2(_elm_lang$core$List$drop, index, l)); - var head = A2(_elm_lang$core$List$take, index, l); - var _p53 = tail; - if (_p53.ctor === 'Nothing') { - return _elm_lang$core$Maybe$Nothing; - } else { - return _elm_lang$core$Maybe$Just( - A2( - _elm_lang$core$List$append, - head, - {ctor: '::', _0: value, _1: _p53._0})); - } - } - }); -var _elm_community$list_extra$List_Extra$remove = F2( - function (x, xs) { - var _p54 = xs; - if (_p54.ctor === '[]') { - return {ctor: '[]'}; - } else { - var _p56 = _p54._1; - var _p55 = _p54._0; - return _elm_lang$core$Native_Utils.eq(x, _p55) ? _p56 : { - ctor: '::', - _0: _p55, - _1: A2(_elm_community$list_extra$List_Extra$remove, x, _p56) - }; - } - }); -var _elm_community$list_extra$List_Extra$updateIfIndex = F3( - function (predicate, update, list) { - return A2( - _elm_lang$core$List$indexedMap, - F2( - function (i, x) { - return predicate(i) ? update(x) : x; - }), - list); - }); -var _elm_community$list_extra$List_Extra$updateAt = F3( - function (index, update, list) { - return ((_elm_lang$core$Native_Utils.cmp(index, 0) < 0) || (_elm_lang$core$Native_Utils.cmp( - index, - _elm_lang$core$List$length(list)) > -1)) ? _elm_lang$core$Maybe$Nothing : _elm_lang$core$Maybe$Just( - A3( - _elm_community$list_extra$List_Extra$updateIfIndex, - F2( - function (x, y) { - return _elm_lang$core$Native_Utils.eq(x, y); - })(index), - update, - list)); - }); -var _elm_community$list_extra$List_Extra$updateIf = F3( - function (predicate, update, list) { - return A2( - _elm_lang$core$List$map, - function (item) { - return predicate(item) ? update(item) : item; - }, - list); - }); -var _elm_community$list_extra$List_Extra$replaceIf = F3( - function (predicate, replacement, list) { - return A3( - _elm_community$list_extra$List_Extra$updateIf, - predicate, - _elm_lang$core$Basics$always(replacement), - list); - }); -var _elm_community$list_extra$List_Extra$findIndices = function (p) { - return function (_p57) { - return A2( - _elm_lang$core$List$map, - _elm_lang$core$Tuple$first, - A2( - _elm_lang$core$List$filter, - function (_p58) { - var _p59 = _p58; - return p(_p59._1); - }, - A2( - _elm_lang$core$List$indexedMap, - F2( - function (v0, v1) { - return {ctor: '_Tuple2', _0: v0, _1: v1}; - }), - _p57))); - }; -}; -var _elm_community$list_extra$List_Extra$findIndex = function (p) { - return function (_p60) { - return _elm_lang$core$List$head( - A2(_elm_community$list_extra$List_Extra$findIndices, p, _p60)); - }; -}; -var _elm_community$list_extra$List_Extra$splitWhen = F2( - function (predicate, list) { - return A2( - _elm_lang$core$Maybe$map, - function (i) { - return A2(_elm_community$list_extra$List_Extra$splitAt, i, list); - }, - A2(_elm_community$list_extra$List_Extra$findIndex, predicate, list)); - }); -var _elm_community$list_extra$List_Extra$elemIndices = function (x) { - return _elm_community$list_extra$List_Extra$findIndices( - F2( - function (x, y) { - return _elm_lang$core$Native_Utils.eq(x, y); - })(x)); -}; -var _elm_community$list_extra$List_Extra$elemIndex = function (x) { - return _elm_community$list_extra$List_Extra$findIndex( - F2( - function (x, y) { - return _elm_lang$core$Native_Utils.eq(x, y); - })(x)); -}; -var _elm_community$list_extra$List_Extra$find = F2( - function (predicate, list) { - find: - while (true) { - var _p61 = list; - if (_p61.ctor === '[]') { - return _elm_lang$core$Maybe$Nothing; - } else { - var _p62 = _p61._0; - if (predicate(_p62)) { - return _elm_lang$core$Maybe$Just(_p62); - } else { - var _v41 = predicate, - _v42 = _p61._1; - predicate = _v41; - list = _v42; - continue find; - } - } - } - }); -var _elm_community$list_extra$List_Extra$notMember = function (x) { - return function (_p63) { - return !A2(_elm_lang$core$List$member, x, _p63); - }; -}; -var _elm_community$list_extra$List_Extra$andThen = _elm_lang$core$List$concatMap; -var _elm_community$list_extra$List_Extra$lift2 = F3( - function (f, la, lb) { - return A2( - _elm_community$list_extra$List_Extra$andThen, - function (a) { - return A2( - _elm_community$list_extra$List_Extra$andThen, - function (b) { - return { - ctor: '::', - _0: A2(f, a, b), - _1: {ctor: '[]'} - }; - }, - lb); - }, - la); - }); -var _elm_community$list_extra$List_Extra$lift3 = F4( - function (f, la, lb, lc) { - return A2( - _elm_community$list_extra$List_Extra$andThen, - function (a) { - return A2( - _elm_community$list_extra$List_Extra$andThen, - function (b) { - return A2( - _elm_community$list_extra$List_Extra$andThen, - function (c) { - return { - ctor: '::', - _0: A3(f, a, b, c), - _1: {ctor: '[]'} - }; - }, - lc); - }, - lb); - }, - la); - }); -var _elm_community$list_extra$List_Extra$lift4 = F5( - function (f, la, lb, lc, ld) { - return A2( - _elm_community$list_extra$List_Extra$andThen, - function (a) { - return A2( - _elm_community$list_extra$List_Extra$andThen, - function (b) { - return A2( - _elm_community$list_extra$List_Extra$andThen, - function (c) { - return A2( - _elm_community$list_extra$List_Extra$andThen, - function (d) { - return { - ctor: '::', - _0: A4(f, a, b, c, d), - _1: {ctor: '[]'} - }; - }, - ld); - }, - lc); - }, - lb); - }, - la); - }); -var _elm_community$list_extra$List_Extra$andMap = F2( - function (l, fl) { - return A3( - _elm_lang$core$List$map2, - F2( - function (x, y) { - return x(y); - }), - fl, - l); - }); -var _elm_community$list_extra$List_Extra$uniqueHelp = F3( - function (f, existing, remaining) { - uniqueHelp: - while (true) { - var _p64 = remaining; - if (_p64.ctor === '[]') { - return {ctor: '[]'}; - } else { - var _p66 = _p64._1; - var _p65 = _p64._0; - var computedFirst = f(_p65); - if (A2(_elm_lang$core$Set$member, computedFirst, existing)) { - var _v44 = f, - _v45 = existing, - _v46 = _p66; - f = _v44; - existing = _v45; - remaining = _v46; - continue uniqueHelp; - } else { - return { - ctor: '::', - _0: _p65, - _1: A3( - _elm_community$list_extra$List_Extra$uniqueHelp, - f, - A2(_elm_lang$core$Set$insert, computedFirst, existing), - _p66) - }; - } - } - } - }); -var _elm_community$list_extra$List_Extra$uniqueBy = F2( - function (f, list) { - return A3(_elm_community$list_extra$List_Extra$uniqueHelp, f, _elm_lang$core$Set$empty, list); - }); -var _elm_community$list_extra$List_Extra$allDifferentBy = F2( - function (f, list) { - return _elm_lang$core$Native_Utils.eq( - _elm_lang$core$List$length(list), - _elm_lang$core$List$length( - A2(_elm_community$list_extra$List_Extra$uniqueBy, f, list))); - }); -var _elm_community$list_extra$List_Extra$allDifferent = function (list) { - return A2(_elm_community$list_extra$List_Extra$allDifferentBy, _elm_lang$core$Basics$identity, list); -}; -var _elm_community$list_extra$List_Extra$unique = function (list) { - return A3(_elm_community$list_extra$List_Extra$uniqueHelp, _elm_lang$core$Basics$identity, _elm_lang$core$Set$empty, list); -}; -var _elm_community$list_extra$List_Extra$dropWhile = F2( - function (predicate, list) { - dropWhile: - while (true) { - var _p67 = list; - if (_p67.ctor === '[]') { - return {ctor: '[]'}; - } else { - if (predicate(_p67._0)) { - var _v48 = predicate, - _v49 = _p67._1; - predicate = _v48; - list = _v49; - continue dropWhile; - } else { - return list; - } - } - } - }); -var _elm_community$list_extra$List_Extra$takeWhile = function (predicate) { - var takeWhileMemo = F2( - function (memo, list) { - takeWhileMemo: - while (true) { - var _p68 = list; - if (_p68.ctor === '[]') { - return _elm_lang$core$List$reverse(memo); - } else { - var _p69 = _p68._0; - if (predicate(_p69)) { - var _v51 = {ctor: '::', _0: _p69, _1: memo}, - _v52 = _p68._1; - memo = _v51; - list = _v52; - continue takeWhileMemo; - } else { - return _elm_lang$core$List$reverse(memo); - } - } - } - }); - return takeWhileMemo( - {ctor: '[]'}); -}; -var _elm_community$list_extra$List_Extra$span = F2( - function (p, xs) { - return { - ctor: '_Tuple2', - _0: A2(_elm_community$list_extra$List_Extra$takeWhile, p, xs), - _1: A2(_elm_community$list_extra$List_Extra$dropWhile, p, xs) - }; - }); -var _elm_community$list_extra$List_Extra$break = function (p) { - return _elm_community$list_extra$List_Extra$span( - function (_p70) { - return !p(_p70); - }); -}; -var _elm_community$list_extra$List_Extra$groupWhile = F2( - function (eq, xs_) { - var _p71 = xs_; - if (_p71.ctor === '[]') { - return {ctor: '[]'}; - } else { - var _p73 = _p71._0; - var _p72 = A2( - _elm_community$list_extra$List_Extra$span, - eq(_p73), - _p71._1); - var ys = _p72._0; - var zs = _p72._1; - return { - ctor: '::', - _0: {ctor: '::', _0: _p73, _1: ys}, - _1: A2(_elm_community$list_extra$List_Extra$groupWhile, eq, zs) - }; - } - }); -var _elm_community$list_extra$List_Extra$group = _elm_community$list_extra$List_Extra$groupWhile( - F2( - function (x, y) { - return _elm_lang$core$Native_Utils.eq(x, y); - })); -var _elm_community$list_extra$List_Extra$minimumBy = F2( - function (f, ls) { - var minBy = F2( - function (x, _p74) { - var _p75 = _p74; - var _p76 = _p75._1; - var fx = f(x); - return (_elm_lang$core$Native_Utils.cmp(fx, _p76) < 0) ? {ctor: '_Tuple2', _0: x, _1: fx} : {ctor: '_Tuple2', _0: _p75._0, _1: _p76}; - }); - var _p77 = ls; - if (_p77.ctor === '::') { - if (_p77._1.ctor === '[]') { - return _elm_lang$core$Maybe$Just(_p77._0); - } else { - var _p78 = _p77._0; - return _elm_lang$core$Maybe$Just( - _elm_lang$core$Tuple$first( - A3( - _elm_lang$core$List$foldl, - minBy, - { - ctor: '_Tuple2', - _0: _p78, - _1: f(_p78) - }, - _p77._1))); - } - } else { - return _elm_lang$core$Maybe$Nothing; - } - }); -var _elm_community$list_extra$List_Extra$maximumBy = F2( - function (f, ls) { - var maxBy = F2( - function (x, _p79) { - var _p80 = _p79; - var _p81 = _p80._1; - var fx = f(x); - return (_elm_lang$core$Native_Utils.cmp(fx, _p81) > 0) ? {ctor: '_Tuple2', _0: x, _1: fx} : {ctor: '_Tuple2', _0: _p80._0, _1: _p81}; - }); - var _p82 = ls; - if (_p82.ctor === '::') { - if (_p82._1.ctor === '[]') { - return _elm_lang$core$Maybe$Just(_p82._0); - } else { - var _p83 = _p82._0; - return _elm_lang$core$Maybe$Just( - _elm_lang$core$Tuple$first( - A3( - _elm_lang$core$List$foldl, - maxBy, - { - ctor: '_Tuple2', - _0: _p83, - _1: f(_p83) - }, - _p82._1))); - } - } else { - return _elm_lang$core$Maybe$Nothing; - } - }); -var _elm_community$list_extra$List_Extra$uncons = function (xs) { - var _p84 = xs; - if (_p84.ctor === '[]') { - return _elm_lang$core$Maybe$Nothing; - } else { - return _elm_lang$core$Maybe$Just( - {ctor: '_Tuple2', _0: _p84._0, _1: _p84._1}); - } -}; -var _elm_community$list_extra$List_Extra$swapAt = F3( - function (index1, index2, l) { - swapAt: - while (true) { - if (_elm_lang$core$Native_Utils.eq(index1, index2)) { - return _elm_lang$core$Maybe$Just(l); - } else { - if (_elm_lang$core$Native_Utils.cmp(index1, index2) > 0) { - var _v59 = index2, - _v60 = index1, - _v61 = l; - index1 = _v59; - index2 = _v60; - l = _v61; - continue swapAt; - } else { - if (_elm_lang$core$Native_Utils.cmp(index1, 0) < 0) { - return _elm_lang$core$Maybe$Nothing; - } else { - var _p85 = A2(_elm_community$list_extra$List_Extra$splitAt, index1, l); - var part1 = _p85._0; - var tail1 = _p85._1; - var _p86 = A2(_elm_community$list_extra$List_Extra$splitAt, index2 - index1, tail1); - var head2 = _p86._0; - var tail2 = _p86._1; - return A3( - _elm_lang$core$Maybe$map2, - F2( - function (_p88, _p87) { - var _p89 = _p88; - var _p90 = _p87; - return _elm_lang$core$List$concat( - { - ctor: '::', - _0: part1, - _1: { - ctor: '::', - _0: {ctor: '::', _0: _p90._0, _1: _p89._1}, - _1: { - ctor: '::', - _0: {ctor: '::', _0: _p89._0, _1: _p90._1}, - _1: {ctor: '[]'} - } - } - }); - }), - _elm_community$list_extra$List_Extra$uncons(head2), - _elm_community$list_extra$List_Extra$uncons(tail2)); - } - } - } - } - }); -var _elm_community$list_extra$List_Extra$iterate = F2( - function (f, x) { - var _p91 = f(x); - if (_p91.ctor === 'Just') { - return { - ctor: '::', - _0: x, - _1: A2(_elm_community$list_extra$List_Extra$iterate, f, _p91._0) - }; - } else { - return { - ctor: '::', - _0: x, - _1: {ctor: '[]'} - }; - } - }); -var _elm_community$list_extra$List_Extra$getAt = F2( - function (idx, xs) { - return (_elm_lang$core$Native_Utils.cmp(idx, 0) < 0) ? _elm_lang$core$Maybe$Nothing : _elm_lang$core$List$head( - A2(_elm_lang$core$List$drop, idx, xs)); - }); -var _elm_community$list_extra$List_Extra_ops = _elm_community$list_extra$List_Extra_ops || {}; -_elm_community$list_extra$List_Extra_ops['!!'] = _elm_lang$core$Basics$flip(_elm_community$list_extra$List_Extra$getAt); -var _elm_community$list_extra$List_Extra$init = function () { - var maybe = F2( - function (d, f) { - return function (_p92) { - return A2( - _elm_lang$core$Maybe$withDefault, - d, - A2(_elm_lang$core$Maybe$map, f, _p92)); - }; - }); - return A2( - _elm_lang$core$List$foldr, - function (x) { - return function (_p93) { - return _elm_lang$core$Maybe$Just( - A3( - maybe, - {ctor: '[]'}, - F2( - function (x, y) { - return {ctor: '::', _0: x, _1: y}; - })(x), - _p93)); - }; - }, - _elm_lang$core$Maybe$Nothing); -}(); -var _elm_community$list_extra$List_Extra$last = _elm_community$list_extra$List_Extra$foldl1( - _elm_lang$core$Basics$flip(_elm_lang$core$Basics$always)); - -//import Native.List // - -var _elm_lang$core$Native_Array = function() { - -// A RRB-Tree has two distinct data types. -// Leaf -> "height" is always 0 -// "table" is an array of elements -// Node -> "height" is always greater than 0 -// "table" is an array of child nodes -// "lengths" is an array of accumulated lengths of the child nodes - -// M is the maximal table size. 32 seems fast. E is the allowed increase -// of search steps when concatting to find an index. Lower values will -// decrease balancing, but will increase search steps. -var M = 32; -var E = 2; - -// An empty array. -var empty = { - ctor: '_Array', - height: 0, - table: [] -}; + return result; + } + answer = answer(result.a); + } + return $elm$core$Result$Ok(answer); + case 14: + var result = _Json_runHelp(decoder.b, value); + return (!$elm$core$Result$isOk(result)) + ? result + : _Json_runHelp(decoder.h(result.a), value); -function get(i, array) -{ - if (i < 0 || i >= length(array)) - { - throw new Error( - 'Index ' + i + ' is out of range. Check the length of ' + - 'your array first or use getMaybe or getWithDefault.'); + case 15: + var errors = _List_Nil; + for (var temp = decoder.g; temp.b; temp = temp.b) // WHILE_CONS + { + var result = _Json_runHelp(temp.a, value); + if ($elm$core$Result$isOk(result)) + { + return result; + } + errors = _List_Cons(result.a, errors); + } + return $elm$core$Result$Err($elm$json$Json$Decode$OneOf($elm$core$List$reverse(errors))); + + case 1: + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, decoder.a, _Json_wrap(value))); + + case 0: + return $elm$core$Result$Ok(decoder.a); } - return unsafeGet(i, array); } - -function unsafeGet(i, array) +function _Json_runArrayDecoder(decoder, value, toElmValue) { - for (var x = array.height; x > 0; x--) + var len = value.length; + var array = new Array(len); + for (var i = 0; i < len; i++) { - var slot = i >> (x * 5); - while (array.lengths[slot] <= i) - { - slot++; - } - if (slot > 0) + var result = _Json_runHelp(decoder, value[i]); + if (!$elm$core$Result$isOk(result)) { - i -= array.lengths[slot - 1]; + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, i, result.a)); } - array = array.table[slot]; + array[i] = result.a; } - return array.table[i]; + return $elm$core$Result$Ok(toElmValue(array)); } - -// Sets the value at the index i. Only the nodes leading to i will get -// copied and updated. -function set(i, item, array) +function _Json_toElmArray(array) { - if (i < 0 || length(array) <= i) - { - return array; - } - return unsafeSet(i, item, array); + return A2($elm$core$Array$initialize, array.length, function(i) { return array[i]; }); } - -function unsafeSet(i, item, array) +function _Json_expecting(type, value) { - array = nodeCopy(array); - - if (array.height === 0) - { - array.table[i] = item; - } - else - { - var slot = getSlot(i, array); - if (slot > 0) - { - i -= array.lengths[slot - 1]; - } - array.table[slot] = unsafeSet(i, item, array.table[slot]); - } - return array; + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'Expecting ' + type, _Json_wrap(value))); } -function initialize(len, f) -{ - if (len <= 0) - { - return empty; - } - var h = Math.floor( Math.log(len) / Math.log(M) ); - return initialize_(f, h, 0, len); -} +// EQUALITY -function initialize_(f, h, from, to) +function _Json_equality(x, y) { - if (h === 0) + if (x === y) { - var table = new Array((to - from) % (M + 1)); - for (var i = 0; i < table.length; i++) - { - table[i] = f(from + i); - } - return { - ctor: '_Array', - height: 0, - table: table - }; + return true; } - var step = Math.pow(M, h); - var table = new Array(Math.ceil((to - from) / step)); - var lengths = new Array(table.length); - for (var i = 0; i < table.length; i++) + if (x.$ !== y.$) { - table[i] = initialize_(f, h - 1, from + (i * step), Math.min(from + ((i + 1) * step), to)); - lengths[i] = length(table[i]) + (i > 0 ? lengths[i-1] : 0); + return false; } - return { - ctor: '_Array', - height: h, - table: table, - lengths: lengths - }; -} -function fromList(list) -{ - if (list.ctor === '[]') + switch (x.$) { - return empty; - } + case 0: + case 1: + return x.a === y.a; - // Allocate M sized blocks (table) and write list elements to it. - var table = new Array(M); - var nodes = []; - var i = 0; + case 3: + case 2: + case 4: + case 6: + case 5: + return true; - while (list.ctor !== '[]') - { - table[i] = list._0; - list = list._1; - i++; + case 9: + return x.c === y.c; - // table is full, so we can push a leaf containing it into the - // next node. - if (i === M) - { - var leaf = { - ctor: '_Array', - height: 0, - table: table - }; - fromListPush(leaf, nodes); - table = new Array(M); - i = 0; - } - } + case 7: + case 8: + case 12: + return _Json_equality(x.b, y.b); - // Maybe there is something left on the table. - if (i > 0) - { - var leaf = { - ctor: '_Array', - height: 0, - table: table.splice(0, i) - }; - fromListPush(leaf, nodes); - } + case 10: + return x.d === y.d && _Json_equality(x.b, y.b); - // Go through all of the nodes and eventually push them into higher nodes. - for (var h = 0; h < nodes.length - 1; h++) - { - if (nodes[h].table.length > 0) - { - fromListPush(nodes[h], nodes); - } + case 11: + return x.e === y.e && _Json_equality(x.b, y.b); + + case 13: + return x.f === y.f && _Json_listEquality(x.g, y.g); + + case 14: + return x.h === y.h && _Json_equality(x.b, y.b); + + case 15: + return _Json_listEquality(x.g, y.g); } +} - var head = nodes[nodes.length - 1]; - if (head.height > 0 && head.table.length === 1) +function _Json_listEquality(aDecoders, bDecoders) +{ + var len = aDecoders.length; + if (len !== bDecoders.length) { - return head.table[0]; + return false; } - else + for (var i = 0; i < len; i++) { - return head; + if (!_Json_equality(aDecoders[i], bDecoders[i])) + { + return false; + } } + return true; } -// Push a node into a higher node as a child. -function fromListPush(toPush, nodes) + +// ENCODE + +var _Json_encode = F2(function(indentLevel, value) { - var h = toPush.height; + return JSON.stringify(_Json_unwrap(value), null, indentLevel) + ''; +}); - // Maybe the node on this height does not exist. - if (nodes.length === h) - { - var node = { - ctor: '_Array', - height: h + 1, - table: [], - lengths: [] - }; - nodes.push(node); - } +function _Json_wrap(value) { return { $: 0, a: value }; } +function _Json_unwrap(value) { return value.a; } - nodes[h].table.push(toPush); - var len = length(toPush); - if (nodes[h].lengths.length > 0) - { - len += nodes[h].lengths[nodes[h].lengths.length - 1]; - } - nodes[h].lengths.push(len); +function _Json_wrap_UNUSED(value) { return value; } +function _Json_unwrap_UNUSED(value) { return value; } - if (nodes[h].table.length === M) - { - fromListPush(nodes[h], nodes); - nodes[h] = { - ctor: '_Array', - height: h + 1, - table: [], - lengths: [] - }; - } -} +function _Json_emptyArray() { return []; } +function _Json_emptyObject() { return {}; } -// Pushes an item via push_ to the bottom right of a tree. -function push(item, a) +var _Json_addField = F3(function(key, value, object) { - var pushed = push_(item, a); - if (pushed !== null) - { - return pushed; - } - - var newTree = create(item, a.height); - return siblise(a, newTree); -} + object[key] = _Json_unwrap(value); + return object; +}); -// Recursively tries to push an item to the bottom-right most -// tree possible. If there is no space left for the item, -// null will be returned. -function push_(item, a) +function _Json_addEntry(func) { - // Handle resursion stop at leaf level. - if (a.height === 0) + return F2(function(entry, array) { - if (a.table.length < M) - { - var newA = { - ctor: '_Array', - height: 0, - table: a.table.slice() - }; - newA.table.push(item); - return newA; - } - else - { - return null; - } - } + array.push(_Json_unwrap(func(entry))); + return array; + }); +} - // Recursively push - var pushed = push_(item, botRight(a)); +var _Json_encodeNull = _Json_wrap(null); - // There was space in the bottom right tree, so the slot will - // be updated. - if (pushed !== null) - { - var newA = nodeCopy(a); - newA.table[newA.table.length - 1] = pushed; - newA.lengths[newA.lengths.length - 1]++; - return newA; - } - // When there was no space left, check if there is space left - // for a new slot with a tree which contains only the item - // at the bottom. - if (a.table.length < M) - { - var newSlot = create(item, a.height - 1); - var newA = nodeCopy(a); - newA.table.push(newSlot); - newA.lengths.push(newA.lengths[newA.lengths.length - 1] + length(newSlot)); - return newA; - } - else - { - return null; - } -} -// Converts an array into a list of elements. -function toList(a) +// TASKS + +function _Scheduler_succeed(value) { - return toList_(_elm_lang$core$Native_List.Nil, a); + return { + $: 0, + a: value + }; } -function toList_(list, a) +function _Scheduler_fail(error) { - for (var i = a.table.length - 1; i >= 0; i--) - { - list = - a.height === 0 - ? _elm_lang$core$Native_List.Cons(a.table[i], list) - : toList_(list, a.table[i]); - } - return list; + return { + $: 1, + a: error + }; } -// Maps a function over the elements of an array. -function map(f, a) +function _Scheduler_binding(callback) { - var newA = { - ctor: '_Array', - height: a.height, - table: new Array(a.table.length) + return { + $: 2, + b: callback, + c: null }; - if (a.height > 0) - { - newA.lengths = a.lengths; - } - for (var i = 0; i < a.table.length; i++) - { - newA.table[i] = - a.height === 0 - ? f(a.table[i]) - : map(f, a.table[i]); - } - return newA; } -// Maps a function over the elements with their index as first argument. -function indexedMap(f, a) +var _Scheduler_andThen = F2(function(callback, task) { - return indexedMap_(f, a, 0); -} + return { + $: 3, + b: callback, + d: task + }; +}); -function indexedMap_(f, a, from) +var _Scheduler_onError = F2(function(callback, task) { - var newA = { - ctor: '_Array', - height: a.height, - table: new Array(a.table.length) + return { + $: 4, + b: callback, + d: task }; - if (a.height > 0) - { - newA.lengths = a.lengths; - } - for (var i = 0; i < a.table.length; i++) - { - newA.table[i] = - a.height === 0 - ? A2(f, from + i, a.table[i]) - : indexedMap_(f, a.table[i], i == 0 ? from : from + a.lengths[i - 1]); - } - return newA; -} +}); -function foldl(f, b, a) +function _Scheduler_receive(callback) { - if (a.height === 0) - { - for (var i = 0; i < a.table.length; i++) - { - b = A2(f, a.table[i], b); - } - } - else - { - for (var i = 0; i < a.table.length; i++) - { - b = foldl(f, b, a.table[i]); - } - } - return b; + return { + $: 5, + b: callback + }; } -function foldr(f, b, a) + +// PROCESSES + +var _Scheduler_guid = 0; + +function _Scheduler_rawSpawn(task) { - if (a.height === 0) - { - for (var i = a.table.length; i--; ) - { - b = A2(f, a.table[i], b); - } - } - else - { - for (var i = a.table.length; i--; ) - { - b = foldr(f, b, a.table[i]); - } - } - return b; + var proc = { + $: 0, + e: _Scheduler_guid++, + f: task, + g: null, + h: [] + }; + + _Scheduler_enqueue(proc); + + return proc; } -// TODO: currently, it slices the right, then the left. This can be -// optimized. -function slice(from, to, a) +function _Scheduler_spawn(task) { - if (from < 0) - { - from += length(a); - } - if (to < 0) - { - to += length(a); - } - return sliceLeft(from, sliceRight(to, a)); + return _Scheduler_binding(function(callback) { + callback(_Scheduler_succeed(_Scheduler_rawSpawn(task))); + }); } -function sliceRight(to, a) +function _Scheduler_rawSend(proc, msg) { - if (to === length(a)) - { - return a; - } + proc.h.push(msg); + _Scheduler_enqueue(proc); +} - // Handle leaf level. - if (a.height === 0) - { - var newA = { ctor:'_Array', height:0 }; - newA.table = a.table.slice(0, to); - return newA; - } +var _Scheduler_send = F2(function(proc, msg) +{ + return _Scheduler_binding(function(callback) { + _Scheduler_rawSend(proc, msg); + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +}); - // Slice the right recursively. - var right = getSlot(to, a); - var sliced = sliceRight(to - (right > 0 ? a.lengths[right - 1] : 0), a.table[right]); +function _Scheduler_kill(proc) +{ + return _Scheduler_binding(function(callback) { + var task = proc.f; + if (task.$ === 2 && task.c) + { + task.c(); + } - // Maybe the a node is not even needed, as sliced contains the whole slice. - if (right === 0) - { - return sliced; - } + proc.f = null; - // Create new node. - var newA = { - ctor: '_Array', - height: a.height, - table: a.table.slice(0, right), - lengths: a.lengths.slice(0, right) - }; - if (sliced.table.length > 0) - { - newA.table[right] = sliced; - newA.lengths[right] = length(sliced) + (right > 0 ? newA.lengths[right - 1] : 0); - } - return newA; + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); } -function sliceLeft(from, a) -{ - if (from === 0) - { - return a; - } - // Handle leaf level. - if (a.height === 0) - { - var newA = { ctor:'_Array', height:0 }; - newA.table = a.table.slice(from, a.table.length + 1); - return newA; - } +/* STEP PROCESSES - // Slice the left recursively. - var left = getSlot(from, a); - var sliced = sliceLeft(from - (left > 0 ? a.lengths[left - 1] : 0), a.table[left]); +type alias Process = + { $ : tag + , id : unique_id + , root : Task + , stack : null | { $: SUCCEED | FAIL, a: callback, b: stack } + , mailbox : [msg] + } - // Maybe the a node is not even needed, as sliced contains the whole slice. - if (left === a.table.length - 1) - { - return sliced; - } +*/ - // Create new node. - var newA = { - ctor: '_Array', - height: a.height, - table: a.table.slice(left, a.table.length + 1), - lengths: new Array(a.table.length - left) - }; - newA.table[0] = sliced; - var len = 0; - for (var i = 0; i < newA.table.length; i++) - { - len += length(newA.table[i]); - newA.lengths[i] = len; - } - return newA; -} +var _Scheduler_working = false; +var _Scheduler_queue = []; -// Appends two trees. -function append(a,b) + +function _Scheduler_enqueue(proc) { - if (a.table.length === 0) + _Scheduler_queue.push(proc); + if (_Scheduler_working) { - return b; + return; } - if (b.table.length === 0) + _Scheduler_working = true; + while (proc = _Scheduler_queue.shift()) { - return a; + _Scheduler_step(proc); } + _Scheduler_working = false; +} - var c = append_(a, b); - // Check if both nodes can be crunshed together. - if (c[0].table.length + c[1].table.length <= M) +function _Scheduler_step(proc) +{ + while (proc.f) { - if (c[0].table.length === 0) + var rootTag = proc.f.$; + if (rootTag === 0 || rootTag === 1) { - return c[1]; + while (proc.g && proc.g.$ !== rootTag) + { + proc.g = proc.g.i; + } + if (!proc.g) + { + return; + } + proc.f = proc.g.b(proc.f.a); + proc.g = proc.g.i; } - if (c[1].table.length === 0) + else if (rootTag === 2) { - return c[0]; + proc.f.c = proc.f.b(function(newRoot) { + proc.f = newRoot; + _Scheduler_enqueue(proc); + }); + return; } - - // Adjust .table and .lengths - c[0].table = c[0].table.concat(c[1].table); - if (c[0].height > 0) + else if (rootTag === 5) { - var len = length(c[0]); - for (var i = 0; i < c[1].lengths.length; i++) + if (proc.h.length === 0) { - c[1].lengths[i] += len; + return; } - c[0].lengths = c[0].lengths.concat(c[1].lengths); + proc.f = proc.f.b(proc.h.shift()); } - - return c[0]; - } - - if (c[0].height > 0) - { - var toRemove = calcToRemove(a, b); - if (toRemove > E) + else // if (rootTag === 3 || rootTag === 4) { - c = shuffle(c[0], c[1], toRemove); + proc.g = { + $: rootTag === 3 ? 0 : 1, + b: proc.f.b, + i: proc.g + }; + proc.f = proc.f.d; } } - - return siblise(c[0], c[1]); } -// Returns an array of two nodes; right and left. One node _may_ be empty. -function append_(a, b) + + +function _Process_sleep(time) { - if (a.height === 0 && b.height === 0) - { - return [a, b]; - } + return _Scheduler_binding(function(callback) { + var id = setTimeout(function() { + callback(_Scheduler_succeed(_Utils_Tuple0)); + }, time); - if (a.height !== 1 || b.height !== 1) - { - if (a.height === b.height) - { - a = nodeCopy(a); - b = nodeCopy(b); - var appended = append_(botRight(a), botLeft(b)); + return function() { clearTimeout(id); }; + }); +} - insertRight(a, appended[1]); - insertLeft(b, appended[0]); - } - else if (a.height > b.height) - { - a = nodeCopy(a); - var appended = append_(botRight(a), b); - insertRight(a, appended[0]); - b = parentise(appended[1], appended[1].height + 1); - } - else - { - b = nodeCopy(b); - var appended = append_(a, botLeft(b)); - var left = appended[0].table.length === 0 ? 0 : 1; - var right = left === 0 ? 1 : 0; - insertLeft(b, appended[left]); - a = parentise(appended[right], appended[right].height + 1); - } - } - // Check if balancing is needed and return based on that. - if (a.table.length === 0 || b.table.length === 0) - { - return [a, b]; - } +// PROGRAMS - var toRemove = calcToRemove(a, b); - if (toRemove <= E) - { - return [a, b]; - } - return shuffle(a, b, toRemove); -} -// Helperfunctions for append_. Replaces a child node at the side of the parent. -function insertRight(parent, node) +var _Platform_worker = F4(function(impl, flagDecoder, debugMetadata, args) { - var index = parent.table.length - 1; - parent.table[index] = node; - parent.lengths[index] = length(node); - parent.lengths[index] += index > 0 ? parent.lengths[index - 1] : 0; -} + return _Platform_initialize( + flagDecoder, + args, + impl.init, + impl.update, + impl.subscriptions, + function() { return function() {} } + ); +}); -function insertLeft(parent, node) -{ - if (node.table.length > 0) - { - parent.table[0] = node; - parent.lengths[0] = length(node); - var len = length(parent.table[0]); - for (var i = 1; i < parent.lengths.length; i++) - { - len += length(parent.table[i]); - parent.lengths[i] = len; - } - } - else - { - parent.table.shift(); - for (var i = 1; i < parent.lengths.length; i++) - { - parent.lengths[i] = parent.lengths[i] - parent.lengths[0]; - } - parent.lengths.shift(); - } -} -// Returns the extra search steps for E. Refer to the paper. -function calcToRemove(a, b) +// INITIALIZE A PROGRAM + + +function _Platform_initialize(flagDecoder, args, init, update, subscriptions, stepperBuilder) { - var subLengths = 0; - for (var i = 0; i < a.table.length; i++) - { - subLengths += a.table[i].table.length; - } - for (var i = 0; i < b.table.length; i++) + var result = A2(_Json_run, flagDecoder, _Json_wrap(args ? args['flags'] : undefined)); + $elm$core$Result$isOk(result) || _Debug_crash(2 /**/, _Json_errorToString(result.a) /**/); + var managers = {}; + result = init(result.a); + var model = result.a; + var stepper = stepperBuilder(sendToApp, model); + var ports = _Platform_setupEffects(managers, sendToApp); + + function sendToApp(msg, viewMetadata) { - subLengths += b.table[i].table.length; + result = A2(update, msg, model); + stepper(model = result.a, viewMetadata); + _Platform_dispatchEffects(managers, result.b, subscriptions(model)); } - var toRemove = a.table.length + b.table.length; - return toRemove - (Math.floor((subLengths - 1) / M) + 1); -} + _Platform_dispatchEffects(managers, result.b, subscriptions(model)); -// get2, set2 and saveSlot are helpers for accessing elements over two arrays. -function get2(a, b, index) -{ - return index < a.length - ? a[index] - : b[index - a.length]; + return ports ? { ports: ports } : {}; } -function set2(a, b, index, value) -{ - if (index < a.length) - { - a[index] = value; - } - else - { - b[index - a.length] = value; - } -} -function saveSlot(a, b, index, slot) -{ - set2(a.table, b.table, index, slot); - var l = (index === 0 || index === a.lengths.length) - ? 0 - : get2(a.lengths, a.lengths, index - 1); +// TRACK PRELOADS +// +// This is used by code in elm/browser and elm/http +// to register any HTTP requests that are triggered by init. +// + + +var _Platform_preload; - set2(a.lengths, b.lengths, index, l + length(slot)); -} -// Creates a node or leaf with a given length at their arrays for perfomance. -// Is only used by shuffle. -function createNode(h, length) +function _Platform_registerPreload(url) { - if (length < 0) - { - length = 0; - } - var a = { - ctor: '_Array', - height: h, - table: new Array(length) - }; - if (h > 0) - { - a.lengths = new Array(length); - } - return a; + _Platform_preload.add(url); } -// Returns an array of two balanced nodes. -function shuffle(a, b, toRemove) -{ - var newA = createNode(a.height, Math.min(M, a.table.length + b.table.length - toRemove)); - var newB = createNode(a.height, newA.table.length - (a.table.length + b.table.length - toRemove)); - // Skip the slots with size M. More precise: copy the slot references - // to the new node - var read = 0; - while (get2(a.table, b.table, read).table.length % M === 0) - { - set2(newA.table, newB.table, read, get2(a.table, b.table, read)); - set2(newA.lengths, newB.lengths, read, get2(a.lengths, b.lengths, read)); - read++; - } - // Pulling items from left to right, caching in a slot before writing - // it into the new nodes. - var write = read; - var slot = new createNode(a.height - 1, 0); - var from = 0; +// EFFECT MANAGERS - // If the current slot is still containing data, then there will be at - // least one more write, so we do not break this loop yet. - while (read - write - (slot.table.length > 0 ? 1 : 0) < toRemove) - { - // Find out the max possible items for copying. - var source = get2(a.table, b.table, read); - var to = Math.min(M - slot.table.length, source.table.length); - // Copy and adjust size table. - slot.table = slot.table.concat(source.table.slice(from, to)); - if (slot.height > 0) - { - var len = slot.lengths.length; - for (var i = len; i < len + to - from; i++) - { - slot.lengths[i] = length(slot.table[i]); - slot.lengths[i] += (i > 0 ? slot.lengths[i - 1] : 0); - } - } +var _Platform_effectManagers = {}; - from += to; - // Only proceed to next slots[i] if the current one was - // fully copied. - if (source.table.length <= to) - { - read++; from = 0; - } +function _Platform_setupEffects(managers, sendToApp) +{ + var ports; + + // setup all necessary effect managers + for (var key in _Platform_effectManagers) + { + var manager = _Platform_effectManagers[key]; - // Only create a new slot if the current one is filled up. - if (slot.table.length === M) + if (manager.a) { - saveSlot(newA, newB, write, slot); - slot = createNode(a.height - 1, 0); - write++; + ports = ports || {}; + ports[key] = manager.a(key, sendToApp); } - } - - // Cleanup after the loop. Copy the last slot into the new nodes. - if (slot.table.length > 0) - { - saveSlot(newA, newB, write, slot); - write++; - } - // Shift the untouched slots to the left - while (read < a.table.length + b.table.length ) - { - saveSlot(newA, newB, write, get2(a.table, b.table, read)); - read++; - write++; + managers[key] = _Platform_instantiateManager(manager, sendToApp); } - return [newA, newB]; + return ports; } -// Navigation functions -function botRight(a) -{ - return a.table[a.table.length - 1]; -} -function botLeft(a) + +function _Platform_createManager(init, onEffects, onSelfMsg, cmdMap, subMap) { - return a.table[0]; + return { + b: init, + c: onEffects, + d: onSelfMsg, + e: cmdMap, + f: subMap + }; } -// Copies a node for updating. Note that you should not use this if -// only updating only one of "table" or "lengths" for performance reasons. -function nodeCopy(a) + +function _Platform_instantiateManager(info, sendToApp) { - var newA = { - ctor: '_Array', - height: a.height, - table: a.table.slice() + var router = { + g: sendToApp, + h: undefined }; - if (a.height > 0) + + var onEffects = info.c; + var onSelfMsg = info.d; + var cmdMap = info.e; + var subMap = info.f; + + function loop(state) { - newA.lengths = a.lengths.slice(); + return A2(_Scheduler_andThen, loop, _Scheduler_receive(function(msg) + { + var value = msg.a; + + if (msg.$ === 0) + { + return A3(onSelfMsg, router, value, state); + } + + return cmdMap && subMap + ? A4(onEffects, router, value.i, value.j, state) + : A3(onEffects, router, cmdMap ? value.i : value.j, state); + })); } - return newA; + + return router.h = _Scheduler_rawSpawn(A2(_Scheduler_andThen, loop, info.b)); } -// Returns how many items are in the tree. -function length(array) + + +// ROUTING + + +var _Platform_sendToApp = F2(function(router, msg) { - if (array.height === 0) - { - return array.table.length; - } - else + return _Scheduler_binding(function(callback) { - return array.lengths[array.lengths.length - 1]; - } -} + router.g(msg); + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +}); -// Calculates in which slot of "table" the item probably is, then -// find the exact slot via forward searching in "lengths". Returns the index. -function getSlot(i, a) + +var _Platform_sendToSelf = F2(function(router, msg) { - var slot = i >> (5 * a.height); - while (a.lengths[slot] <= i) - { - slot++; - } - return slot; -} + return A2(_Scheduler_send, router.h, { + $: 0, + a: msg + }); +}); + + -// Recursively creates a tree with a given height containing -// only the given item. -function create(item, h) +// BAGS + + +function _Platform_leaf(home) { - if (h === 0) + return function(value) { return { - ctor: '_Array', - height: 0, - table: [item] + $: 1, + k: home, + l: value }; - } - return { - ctor: '_Array', - height: h, - table: [create(item, h - 1)], - lengths: [1] }; } -// Recursively creates a tree that contains the given tree. -function parentise(tree, h) -{ - if (h === tree.height) - { - return tree; - } - - return { - ctor: '_Array', - height: h, - table: [parentise(tree, h - 1)], - lengths: [length(tree)] - }; -} -// Emphasizes blood brotherhood beneath two trees. -function siblise(a, b) +function _Platform_batch(list) { return { - ctor: '_Array', - height: a.height + 1, - table: [a, b], - lengths: [length(a), length(a) + length(b)] + $: 2, + m: list }; } -function toJSArray(a) -{ - var jsArray = new Array(length(a)); - toJSArray_(jsArray, 0, a); - return jsArray; -} -function toJSArray_(jsArray, i, a) +var _Platform_map = F2(function(tagger, bag) { - for (var t = 0; t < a.table.length; t++) - { - if (a.height === 0) - { - jsArray[i + t] = a.table[t]; - } - else - { - var inc = t === 0 ? 0 : a.lengths[t - 1]; - toJSArray_(jsArray, i + inc, a.table[t]); - } + return { + $: 3, + n: tagger, + o: bag } -} +}); -function fromJSArray(jsArray) -{ - if (jsArray.length === 0) - { - return empty; - } - var h = Math.floor(Math.log(jsArray.length) / Math.log(M)); - return fromJSArray_(jsArray, h, 0, jsArray.length); -} -function fromJSArray_(jsArray, h, from, to) + +// PIPE BAGS INTO EFFECT MANAGERS + + +function _Platform_dispatchEffects(managers, cmdBag, subBag) { - if (h === 0) - { - return { - ctor: '_Array', - height: 0, - table: jsArray.slice(from, to) - }; - } + var effectsDict = {}; + _Platform_gatherEffects(true, cmdBag, effectsDict, null); + _Platform_gatherEffects(false, subBag, effectsDict, null); - var step = Math.pow(M, h); - var table = new Array(Math.ceil((to - from) / step)); - var lengths = new Array(table.length); - for (var i = 0; i < table.length; i++) + for (var home in managers) { - table[i] = fromJSArray_(jsArray, h - 1, from + (i * step), Math.min(from + ((i + 1) * step), to)); - lengths[i] = length(table[i]) + (i > 0 ? lengths[i - 1] : 0); + _Scheduler_rawSend(managers[home], { + $: 'fx', + a: effectsDict[home] || { i: _List_Nil, j: _List_Nil } + }); } - return { - ctor: '_Array', - height: h, - table: table, - lengths: lengths - }; } -return { - empty: empty, - fromList: fromList, - toList: toList, - initialize: F2(initialize), - append: F2(append), - push: F2(push), - slice: F3(slice), - get: F2(get), - set: F3(set), - map: F2(map), - indexedMap: F2(indexedMap), - foldl: F3(foldl), - foldr: F3(foldr), - length: length, - - toJSArray: toJSArray, - fromJSArray: fromJSArray -}; - -}(); -var _elm_lang$core$Array$append = _elm_lang$core$Native_Array.append; -var _elm_lang$core$Array$length = _elm_lang$core$Native_Array.length; -var _elm_lang$core$Array$isEmpty = function (array) { - return _elm_lang$core$Native_Utils.eq( - _elm_lang$core$Array$length(array), - 0); -}; -var _elm_lang$core$Array$slice = _elm_lang$core$Native_Array.slice; -var _elm_lang$core$Array$set = _elm_lang$core$Native_Array.set; -var _elm_lang$core$Array$get = F2( - function (i, array) { - return ((_elm_lang$core$Native_Utils.cmp(0, i) < 1) && (_elm_lang$core$Native_Utils.cmp( - i, - _elm_lang$core$Native_Array.length(array)) < 0)) ? _elm_lang$core$Maybe$Just( - A2(_elm_lang$core$Native_Array.get, i, array)) : _elm_lang$core$Maybe$Nothing; - }); -var _elm_lang$core$Array$push = _elm_lang$core$Native_Array.push; -var _elm_lang$core$Array$empty = _elm_lang$core$Native_Array.empty; -var _elm_lang$core$Array$filter = F2( - function (isOkay, arr) { - var update = F2( - function (x, xs) { - return isOkay(x) ? A2(_elm_lang$core$Native_Array.push, x, xs) : xs; - }); - return A3(_elm_lang$core$Native_Array.foldl, update, _elm_lang$core$Native_Array.empty, arr); - }); -var _elm_lang$core$Array$foldr = _elm_lang$core$Native_Array.foldr; -var _elm_lang$core$Array$foldl = _elm_lang$core$Native_Array.foldl; -var _elm_lang$core$Array$indexedMap = _elm_lang$core$Native_Array.indexedMap; -var _elm_lang$core$Array$map = _elm_lang$core$Native_Array.map; -var _elm_lang$core$Array$toIndexedList = function (array) { - return A3( - _elm_lang$core$List$map2, - F2( - function (v0, v1) { - return {ctor: '_Tuple2', _0: v0, _1: v1}; - }), - A2( - _elm_lang$core$List$range, - 0, - _elm_lang$core$Native_Array.length(array) - 1), - _elm_lang$core$Native_Array.toList(array)); -}; -var _elm_lang$core$Array$toList = _elm_lang$core$Native_Array.toList; -var _elm_lang$core$Array$fromList = _elm_lang$core$Native_Array.fromList; -var _elm_lang$core$Array$initialize = _elm_lang$core$Native_Array.initialize; -var _elm_lang$core$Array$repeat = F2( - function (n, e) { - return A2( - _elm_lang$core$Array$initialize, - n, - _elm_lang$core$Basics$always(e)); - }); -var _elm_lang$core$Array$Array = {ctor: 'Array'}; -//import Maybe, Native.Array, Native.List, Native.Utils, Result // +function _Platform_gatherEffects(isCmd, bag, effectsDict, taggers) +{ + switch (bag.$) + { + case 1: + var home = bag.k; + var effect = _Platform_toEffect(isCmd, home, taggers, bag.l); + effectsDict[home] = _Platform_insert(isCmd, effect, effectsDict[home]); + return; -var _elm_lang$core$Native_Json = function() { + case 2: + for (var list = bag.m; list.b; list = list.b) // WHILE_CONS + { + _Platform_gatherEffects(isCmd, list.a, effectsDict, taggers); + } + return; + case 3: + _Platform_gatherEffects(isCmd, bag.o, effectsDict, { + p: bag.n, + q: taggers + }); + return; + } +} -// CORE DECODERS -function succeed(msg) +function _Platform_toEffect(isCmd, home, taggers, value) { - return { - ctor: '', - tag: 'succeed', - msg: msg - }; -} + function applyTaggers(x) + { + for (var temp = taggers; temp; temp = temp.q) + { + x = temp.p(x); + } + return x; + } -function fail(msg) -{ - return { - ctor: '', - tag: 'fail', - msg: msg - }; -} + var map = isCmd + ? _Platform_effectManagers[home].e + : _Platform_effectManagers[home].f; -function decodePrimitive(tag) -{ - return { - ctor: '', - tag: tag - }; + return A2(map, applyTaggers, value) } -function decodeContainer(tag, decoder) -{ - return { - ctor: '', - tag: tag, - decoder: decoder - }; -} -function decodeNull(value) +function _Platform_insert(isCmd, newEffect, effects) { - return { - ctor: '', - tag: 'null', - value: value - }; -} + effects = effects || { i: _List_Nil, j: _List_Nil }; -function decodeField(field, decoder) -{ - return { - ctor: '', - tag: 'field', - field: field, - decoder: decoder - }; -} + isCmd + ? (effects.i = _List_Cons(newEffect, effects.i)) + : (effects.j = _List_Cons(newEffect, effects.j)); -function decodeIndex(index, decoder) -{ - return { - ctor: '', - tag: 'index', - index: index, - decoder: decoder - }; + return effects; } -function decodeKeyValuePairs(decoder) -{ - return { - ctor: '', - tag: 'key-value', - decoder: decoder - }; -} -function mapMany(f, decoders) -{ - return { - ctor: '', - tag: 'map-many', - func: f, - decoders: decoders - }; -} -function andThen(callback, decoder) -{ - return { - ctor: '', - tag: 'andThen', - decoder: decoder, - callback: callback - }; -} +// PORTS + -function oneOf(decoders) +function _Platform_checkPortName(name) { - return { - ctor: '', - tag: 'oneOf', - decoders: decoders - }; + if (_Platform_effectManagers[name]) + { + _Debug_crash(3, name) + } } -// DECODING OBJECTS -function map1(f, d1) -{ - return mapMany(f, [d1]); -} +// OUTGOING PORTS -function map2(f, d1, d2) -{ - return mapMany(f, [d1, d2]); -} -function map3(f, d1, d2, d3) +function _Platform_outgoingPort(name, converter) { - return mapMany(f, [d1, d2, d3]); + _Platform_checkPortName(name); + _Platform_effectManagers[name] = { + e: _Platform_outgoingPortMap, + r: converter, + a: _Platform_setupOutgoingPort + }; + return _Platform_leaf(name); } -function map4(f, d1, d2, d3, d4) -{ - return mapMany(f, [d1, d2, d3, d4]); -} -function map5(f, d1, d2, d3, d4, d5) -{ - return mapMany(f, [d1, d2, d3, d4, d5]); -} +var _Platform_outgoingPortMap = F2(function(tagger, value) { return value; }); -function map6(f, d1, d2, d3, d4, d5, d6) -{ - return mapMany(f, [d1, d2, d3, d4, d5, d6]); -} -function map7(f, d1, d2, d3, d4, d5, d6, d7) +function _Platform_setupOutgoingPort(name) { - return mapMany(f, [d1, d2, d3, d4, d5, d6, d7]); -} + var subs = []; + var converter = _Platform_effectManagers[name].r; -function map8(f, d1, d2, d3, d4, d5, d6, d7, d8) -{ - return mapMany(f, [d1, d2, d3, d4, d5, d6, d7, d8]); -} + // CREATE MANAGER + var init = _Process_sleep(0); -// DECODE HELPERS + _Platform_effectManagers[name].b = init; + _Platform_effectManagers[name].c = F3(function(router, cmdList, state) + { + for ( ; cmdList.b; cmdList = cmdList.b) // WHILE_CONS + { + // grab a separate reference to subs in case unsubscribe is called + var currentSubs = subs; + var value = _Json_unwrap(converter(cmdList.a)); + for (var i = 0; i < currentSubs.length; i++) + { + currentSubs[i](value); + } + } + return init; + }); -function ok(value) -{ - return { tag: 'ok', value: value }; -} + // PUBLIC API -function badPrimitive(type, value) -{ - return { tag: 'primitive', type: type, value: value }; -} + function subscribe(callback) + { + subs.push(callback); + } -function badIndex(index, nestedProblems) -{ - return { tag: 'index', index: index, rest: nestedProblems }; -} + function unsubscribe(callback) + { + // copy subs into a new array in case unsubscribe is called within a + // subscribed callback + subs = subs.slice(); + var index = subs.indexOf(callback); + if (index >= 0) + { + subs.splice(index, 1); + } + } -function badField(field, nestedProblems) -{ - return { tag: 'field', field: field, rest: nestedProblems }; + return { + subscribe: subscribe, + unsubscribe: unsubscribe + }; } -function badIndex(index, nestedProblems) -{ - return { tag: 'index', index: index, rest: nestedProblems }; -} -function badOneOf(problems) -{ - return { tag: 'oneOf', problems: problems }; -} -function bad(msg) -{ - return { tag: 'fail', msg: msg }; -} +// INCOMING PORTS -function badToString(problem) -{ - var context = '_'; - while (problem) - { - switch (problem.tag) - { - case 'primitive': - return 'Expecting ' + problem.type - + (context === '_' ? '' : ' at ' + context) - + ' but instead got: ' + jsToString(problem.value); - - case 'index': - context += '[' + problem.index + ']'; - problem = problem.rest; - break; - - case 'field': - context += '.' + problem.field; - problem = problem.rest; - break; - - case 'oneOf': - var problems = problem.problems; - for (var i = 0; i < problems.length; i++) - { - problems[i] = badToString(problems[i]); - } - return 'I ran into the following problems' - + (context === '_' ? '' : ' at ' + context) - + ':\n\n' + problems.join('\n'); - - case 'fail': - return 'I ran into a `fail` decoder' - + (context === '_' ? '' : ' at ' + context) - + ': ' + problem.msg; - } - } -} -function jsToString(value) +function _Platform_incomingPort(name, converter) { - return value === undefined - ? 'undefined' - : JSON.stringify(value); + _Platform_checkPortName(name); + _Platform_effectManagers[name] = { + f: _Platform_incomingPortMap, + r: converter, + a: _Platform_setupIncomingPort + }; + return _Platform_leaf(name); } -// DECODE - -function runOnString(decoder, string) +var _Platform_incomingPortMap = F2(function(tagger, finalTagger) { - var json; - try - { - json = JSON.parse(string); - } - catch (e) + return function(value) { - return _elm_lang$core$Result$Err('Given an invalid JSON: ' + e.message); - } - return run(decoder, json); -} + return tagger(finalTagger(value)); + }; +}); -function run(decoder, value) -{ - var result = runHelp(decoder, value); - return (result.tag === 'ok') - ? _elm_lang$core$Result$Ok(result.value) - : _elm_lang$core$Result$Err(badToString(result)); -} -function runHelp(decoder, value) +function _Platform_setupIncomingPort(name, sendToApp) { - switch (decoder.tag) - { - case 'bool': - return (typeof value === 'boolean') - ? ok(value) - : badPrimitive('a Bool', value); + var subs = _List_Nil; + var converter = _Platform_effectManagers[name].r; - case 'int': - if (typeof value !== 'number') { - return badPrimitive('an Int', value); - } + // CREATE MANAGER - if (-2147483647 < value && value < 2147483647 && (value | 0) === value) { - return ok(value); - } + var init = _Scheduler_succeed(null); - if (isFinite(value) && !(value % 1)) { - return ok(value); - } + _Platform_effectManagers[name].b = init; + _Platform_effectManagers[name].c = F3(function(router, subList, state) + { + subs = subList; + return init; + }); - return badPrimitive('an Int', value); + // PUBLIC API - case 'float': - return (typeof value === 'number') - ? ok(value) - : badPrimitive('a Float', value); + function send(incomingValue) + { + var result = A2(_Json_run, converter, _Json_wrap(incomingValue)); - case 'string': - return (typeof value === 'string') - ? ok(value) - : (value instanceof String) - ? ok(value + '') - : badPrimitive('a String', value); + $elm$core$Result$isOk(result) || _Debug_crash(4, name, result.a); - case 'null': - return (value === null) - ? ok(decoder.value) - : badPrimitive('null', value); + var value = result.a; + for (var temp = subs; temp.b; temp = temp.b) // WHILE_CONS + { + sendToApp(temp.a(value)); + } + } - case 'value': - return ok(value); + return { send: send }; +} - case 'list': - if (!(value instanceof Array)) - { - return badPrimitive('a List', value); - } - var list = _elm_lang$core$Native_List.Nil; - for (var i = value.length; i--; ) - { - var result = runHelp(decoder.decoder, value[i]); - if (result.tag !== 'ok') - { - return badIndex(i, result) - } - list = _elm_lang$core$Native_List.Cons(result.value, list); - } - return ok(list); - case 'array': - if (!(value instanceof Array)) - { - return badPrimitive('an Array', value); - } +// EXPORT ELM MODULES +// +// Have DEBUG and PROD versions so that we can (1) give nicer errors in +// debug mode and (2) not pay for the bits needed for that in prod mode. +// - var len = value.length; - var array = new Array(len); - for (var i = len; i--; ) - { - var result = runHelp(decoder.decoder, value[i]); - if (result.tag !== 'ok') - { - return badIndex(i, result); - } - array[i] = result.value; - } - return ok(_elm_lang$core$Native_Array.fromJSArray(array)); - case 'maybe': - var result = runHelp(decoder.decoder, value); - return (result.tag === 'ok') - ? ok(_elm_lang$core$Maybe$Just(result.value)) - : ok(_elm_lang$core$Maybe$Nothing); +function _Platform_export_UNUSED(exports) +{ + scope['Elm'] + ? _Platform_mergeExportsProd(scope['Elm'], exports) + : scope['Elm'] = exports; +} - case 'field': - var field = decoder.field; - if (typeof value !== 'object' || value === null || !(field in value)) - { - return badPrimitive('an object with a field named `' + field + '`', value); - } - var result = runHelp(decoder.decoder, value[field]); - return (result.tag === 'ok') ? result : badField(field, result); +function _Platform_mergeExportsProd(obj, exports) +{ + for (var name in exports) + { + (name in obj) + ? (name == 'init') + ? _Debug_crash(6) + : _Platform_mergeExportsProd(obj[name], exports[name]) + : (obj[name] = exports[name]); + } +} - case 'index': - var index = decoder.index; - if (!(value instanceof Array)) - { - return badPrimitive('an array', value); - } - if (index >= value.length) - { - return badPrimitive('a longer array. Need index ' + index + ' but there are only ' + value.length + ' entries', value); - } - var result = runHelp(decoder.decoder, value[index]); - return (result.tag === 'ok') ? result : badIndex(index, result); +function _Platform_export(exports) +{ + scope['Elm'] + ? _Platform_mergeExportsDebug('Elm', scope['Elm'], exports) + : scope['Elm'] = exports; +} - case 'key-value': - if (typeof value !== 'object' || value === null || value instanceof Array) - { - return badPrimitive('an object', value); - } - var keyValuePairs = _elm_lang$core$Native_List.Nil; - for (var key in value) - { - var result = runHelp(decoder.decoder, value[key]); - if (result.tag !== 'ok') - { - return badField(key, result); - } - var pair = _elm_lang$core$Native_Utils.Tuple2(key, result.value); - keyValuePairs = _elm_lang$core$Native_List.Cons(pair, keyValuePairs); - } - return ok(keyValuePairs); +function _Platform_mergeExportsDebug(moduleName, obj, exports) +{ + for (var name in exports) + { + (name in obj) + ? (name == 'init') + ? _Debug_crash(6, moduleName) + : _Platform_mergeExportsDebug(moduleName + '.' + name, obj[name], exports[name]) + : (obj[name] = exports[name]); + } +} - case 'map-many': - var answer = decoder.func; - var decoders = decoder.decoders; - for (var i = 0; i < decoders.length; i++) - { - var result = runHelp(decoders[i], value); - if (result.tag !== 'ok') - { - return result; - } - answer = answer(result.value); - } - return ok(answer); - case 'andThen': - var result = runHelp(decoder.decoder, value); - return (result.tag !== 'ok') - ? result - : runHelp(decoder.callback(result.value), value); - case 'oneOf': - var errors = []; - var temp = decoder.decoders; - while (temp.ctor !== '[]') - { - var result = runHelp(temp._0, value); - if (result.tag === 'ok') - { - return result; - } +// HELPERS - errors.push(result); - temp = temp._1; - } - return badOneOf(errors); +var _VirtualDom_divertHrefToApp; - case 'fail': - return bad(decoder.msg); +var _VirtualDom_doc = typeof document !== 'undefined' ? document : {}; - case 'succeed': - return ok(decoder.msg); - } + +function _VirtualDom_appendChild(parent, child) +{ + parent.appendChild(child); } +var _VirtualDom_init = F4(function(virtualNode, flagDecoder, debugMetadata, args) +{ + // NOTE: this function needs _Platform_export available to work -// EQUALITY + /**_UNUSED/ + var node = args['node']; + //*/ + /**/ + var node = args && args['node'] ? args['node'] : _Debug_crash(0); + //*/ -function equality(a, b) -{ - if (a === b) - { - return true; - } + node.parentNode.replaceChild( + _VirtualDom_render(virtualNode, function() {}), + node + ); - if (a.tag !== b.tag) - { - return false; - } + return {}; +}); - switch (a.tag) - { - case 'succeed': - case 'fail': - return a.msg === b.msg; - case 'bool': - case 'int': - case 'float': - case 'string': - case 'value': - return true; - case 'null': - return a.value === b.value; +// TEXT - case 'list': - case 'array': - case 'maybe': - case 'key-value': - return equality(a.decoder, b.decoder); - case 'field': - return a.field === b.field && equality(a.decoder, b.decoder); +function _VirtualDom_text(string) +{ + return { + $: 0, + a: string + }; +} - case 'index': - return a.index === b.index && equality(a.decoder, b.decoder); - case 'map-many': - if (a.func !== b.func) - { - return false; - } - return listEquality(a.decoders, b.decoders); - case 'andThen': - return a.callback === b.callback && equality(a.decoder, b.decoder); +// NODE - case 'oneOf': - return listEquality(a.decoders, b.decoders); - } -} -function listEquality(aDecoders, bDecoders) +var _VirtualDom_nodeNS = F2(function(namespace, tag) { - var len = aDecoders.length; - if (len !== bDecoders.length) - { - return false; - } - for (var i = 0; i < len; i++) + return F2(function(factList, kidList) { - if (!equality(aDecoders[i], bDecoders[i])) + for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS { - return false; + var kid = kidList.a; + descendantsCount += (kid.b || 0); + kids.push(kid); } - } - return true; -} + descendantsCount += kids.length; + return { + $: 1, + c: tag, + d: _VirtualDom_organizeFacts(factList), + e: kids, + f: namespace, + b: descendantsCount + }; + }); +}); -// ENCODE -function encode(indentLevel, value) -{ - return JSON.stringify(value, null, indentLevel); -} +var _VirtualDom_node = _VirtualDom_nodeNS(undefined); -function identity(value) -{ - return value; -} -function encodeObject(keyValuePairs) -{ - var obj = {}; - while (keyValuePairs.ctor !== '[]') - { - var pair = keyValuePairs._0; - obj[pair._0] = pair._1; - keyValuePairs = keyValuePairs._1; - } - return obj; -} - -return { - encode: F2(encode), - runOnString: F2(runOnString), - run: F2(run), - - decodeNull: decodeNull, - decodePrimitive: decodePrimitive, - decodeContainer: F2(decodeContainer), - - decodeField: F2(decodeField), - decodeIndex: F2(decodeIndex), - - map1: F2(map1), - map2: F3(map2), - map3: F4(map3), - map4: F5(map4), - map5: F6(map5), - map6: F7(map6), - map7: F8(map7), - map8: F9(map8), - decodeKeyValuePairs: decodeKeyValuePairs, - - andThen: F2(andThen), - fail: fail, - succeed: succeed, - oneOf: oneOf, - - identity: identity, - encodeNull: null, - encodeArray: _elm_lang$core$Native_Array.toJSArray, - encodeList: _elm_lang$core$Native_List.toArray, - encodeObject: encodeObject, - - equality: equality -}; -}(); +// KEYED NODE -var _elm_lang$core$Json_Encode$list = _elm_lang$core$Native_Json.encodeList; -var _elm_lang$core$Json_Encode$array = _elm_lang$core$Native_Json.encodeArray; -var _elm_lang$core$Json_Encode$object = _elm_lang$core$Native_Json.encodeObject; -var _elm_lang$core$Json_Encode$null = _elm_lang$core$Native_Json.encodeNull; -var _elm_lang$core$Json_Encode$bool = _elm_lang$core$Native_Json.identity; -var _elm_lang$core$Json_Encode$float = _elm_lang$core$Native_Json.identity; -var _elm_lang$core$Json_Encode$int = _elm_lang$core$Native_Json.identity; -var _elm_lang$core$Json_Encode$string = _elm_lang$core$Native_Json.identity; -var _elm_lang$core$Json_Encode$encode = _elm_lang$core$Native_Json.encode; -var _elm_lang$core$Json_Encode$Value = {ctor: 'Value'}; - -var _elm_lang$core$Json_Decode$null = _elm_lang$core$Native_Json.decodeNull; -var _elm_lang$core$Json_Decode$value = _elm_lang$core$Native_Json.decodePrimitive('value'); -var _elm_lang$core$Json_Decode$andThen = _elm_lang$core$Native_Json.andThen; -var _elm_lang$core$Json_Decode$fail = _elm_lang$core$Native_Json.fail; -var _elm_lang$core$Json_Decode$succeed = _elm_lang$core$Native_Json.succeed; -var _elm_lang$core$Json_Decode$lazy = function (thunk) { - return A2( - _elm_lang$core$Json_Decode$andThen, - thunk, - _elm_lang$core$Json_Decode$succeed( - {ctor: '_Tuple0'})); -}; -var _elm_lang$core$Json_Decode$decodeValue = _elm_lang$core$Native_Json.run; -var _elm_lang$core$Json_Decode$decodeString = _elm_lang$core$Native_Json.runOnString; -var _elm_lang$core$Json_Decode$map8 = _elm_lang$core$Native_Json.map8; -var _elm_lang$core$Json_Decode$map7 = _elm_lang$core$Native_Json.map7; -var _elm_lang$core$Json_Decode$map6 = _elm_lang$core$Native_Json.map6; -var _elm_lang$core$Json_Decode$map5 = _elm_lang$core$Native_Json.map5; -var _elm_lang$core$Json_Decode$map4 = _elm_lang$core$Native_Json.map4; -var _elm_lang$core$Json_Decode$map3 = _elm_lang$core$Native_Json.map3; -var _elm_lang$core$Json_Decode$map2 = _elm_lang$core$Native_Json.map2; -var _elm_lang$core$Json_Decode$map = _elm_lang$core$Native_Json.map1; -var _elm_lang$core$Json_Decode$oneOf = _elm_lang$core$Native_Json.oneOf; -var _elm_lang$core$Json_Decode$maybe = function (decoder) { - return A2(_elm_lang$core$Native_Json.decodeContainer, 'maybe', decoder); -}; -var _elm_lang$core$Json_Decode$index = _elm_lang$core$Native_Json.decodeIndex; -var _elm_lang$core$Json_Decode$field = _elm_lang$core$Native_Json.decodeField; -var _elm_lang$core$Json_Decode$at = F2( - function (fields, decoder) { - return A3(_elm_lang$core$List$foldr, _elm_lang$core$Json_Decode$field, decoder, fields); - }); -var _elm_lang$core$Json_Decode$keyValuePairs = _elm_lang$core$Native_Json.decodeKeyValuePairs; -var _elm_lang$core$Json_Decode$dict = function (decoder) { - return A2( - _elm_lang$core$Json_Decode$map, - _elm_lang$core$Dict$fromList, - _elm_lang$core$Json_Decode$keyValuePairs(decoder)); -}; -var _elm_lang$core$Json_Decode$array = function (decoder) { - return A2(_elm_lang$core$Native_Json.decodeContainer, 'array', decoder); -}; -var _elm_lang$core$Json_Decode$list = function (decoder) { - return A2(_elm_lang$core$Native_Json.decodeContainer, 'list', decoder); -}; -var _elm_lang$core$Json_Decode$nullable = function (decoder) { - return _elm_lang$core$Json_Decode$oneOf( + +var _VirtualDom_keyedNodeNS = F2(function(namespace, tag) +{ + return F2(function(factList, kidList) + { + for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS { - ctor: '::', - _0: _elm_lang$core$Json_Decode$null(_elm_lang$core$Maybe$Nothing), - _1: { - ctor: '::', - _0: A2(_elm_lang$core$Json_Decode$map, _elm_lang$core$Maybe$Just, decoder), - _1: {ctor: '[]'} - } - }); -}; -var _elm_lang$core$Json_Decode$float = _elm_lang$core$Native_Json.decodePrimitive('float'); -var _elm_lang$core$Json_Decode$int = _elm_lang$core$Native_Json.decodePrimitive('int'); -var _elm_lang$core$Json_Decode$bool = _elm_lang$core$Native_Json.decodePrimitive('bool'); -var _elm_lang$core$Json_Decode$string = _elm_lang$core$Native_Json.decodePrimitive('string'); -var _elm_lang$core$Json_Decode$Decoder = {ctor: 'Decoder'}; + var kid = kidList.a; + descendantsCount += (kid.b.b || 0); + kids.push(kid); + } + descendantsCount += kids.length; -var _elm_lang$virtual_dom$VirtualDom_Debug$wrap; -var _elm_lang$virtual_dom$VirtualDom_Debug$wrapWithFlags; + return { + $: 2, + c: tag, + d: _VirtualDom_organizeFacts(factList), + e: kids, + f: namespace, + b: descendantsCount + }; + }); +}); -var _elm_lang$virtual_dom$Native_VirtualDom = function() { -var STYLE_KEY = 'STYLE'; -var EVENT_KEY = 'EVENT'; -var ATTR_KEY = 'ATTR'; -var ATTR_NS_KEY = 'ATTR_NS'; +var _VirtualDom_keyedNode = _VirtualDom_keyedNodeNS(undefined); -var localDoc = typeof document !== 'undefined' ? document : {}; -//////////// VIRTUAL DOM NODES //////////// +// CUSTOM -function text(string) +function _VirtualDom_custom(factList, model, render, diff) { return { - type: 'text', - text: string + $: 3, + d: _VirtualDom_organizeFacts(factList), + g: model, + h: render, + i: diff }; } -function node(tag) -{ - return F2(function(factList, kidList) { - return nodeHelp(tag, factList, kidList); - }); -} - -function nodeHelp(tag, factList, kidList) -{ - var organized = organizeFacts(factList); - var namespace = organized.namespace; - var facts = organized.facts; +// MAP - var children = []; - var descendantsCount = 0; - while (kidList.ctor !== '[]') - { - var kid = kidList._0; - descendantsCount += (kid.descendantsCount || 0); - children.push(kid); - kidList = kidList._1; - } - descendantsCount += children.length; +var _VirtualDom_map = F2(function(tagger, node) +{ return { - type: 'node', - tag: tag, - facts: facts, - children: children, - namespace: namespace, - descendantsCount: descendantsCount + $: 4, + j: tagger, + k: node, + b: 1 + (node.b || 0) }; -} - +}); -function keyedNode(tag, factList, kidList) -{ - var organized = organizeFacts(factList); - var namespace = organized.namespace; - var facts = organized.facts; - var children = []; - var descendantsCount = 0; - while (kidList.ctor !== '[]') - { - var kid = kidList._0; - descendantsCount += (kid._1.descendantsCount || 0); - children.push(kid); - kidList = kidList._1; - } - descendantsCount += children.length; - return { - type: 'keyed-node', - tag: tag, - facts: facts, - children: children, - namespace: namespace, - descendantsCount: descendantsCount - }; -} +// LAZY -function custom(factList, model, impl) +function _VirtualDom_thunk(refs, thunk) { - var facts = organizeFacts(factList).facts; - return { - type: 'custom', - facts: facts, - model: model, - impl: impl + $: 5, + l: refs, + m: thunk, + k: undefined }; } +var _VirtualDom_lazy = F2(function(func, a) +{ + return _VirtualDom_thunk([func, a], function() { + return func(a); + }); +}); + +var _VirtualDom_lazy2 = F3(function(func, a, b) +{ + return _VirtualDom_thunk([func, a, b], function() { + return A2(func, a, b); + }); +}); -function map(tagger, node) +var _VirtualDom_lazy3 = F4(function(func, a, b, c) { - return { - type: 'tagger', - tagger: tagger, - node: node, - descendantsCount: 1 + (node.descendantsCount || 0) - }; -} + return _VirtualDom_thunk([func, a, b, c], function() { + return A3(func, a, b, c); + }); +}); +var _VirtualDom_lazy4 = F5(function(func, a, b, c, d) +{ + return _VirtualDom_thunk([func, a, b, c, d], function() { + return A4(func, a, b, c, d); + }); +}); -function thunk(func, args, thunk) +var _VirtualDom_lazy5 = F6(function(func, a, b, c, d, e) { - return { - type: 'thunk', - func: func, - args: args, - thunk: thunk, - node: undefined - }; -} + return _VirtualDom_thunk([func, a, b, c, d, e], function() { + return A5(func, a, b, c, d, e); + }); +}); -function lazy(fn, a) +var _VirtualDom_lazy6 = F7(function(func, a, b, c, d, e, f) { - return thunk(fn, [a], function() { - return fn(a); + return _VirtualDom_thunk([func, a, b, c, d, e, f], function() { + return A6(func, a, b, c, d, e, f); }); -} +}); -function lazy2(fn, a, b) +var _VirtualDom_lazy7 = F8(function(func, a, b, c, d, e, f, g) { - return thunk(fn, [a,b], function() { - return A2(fn, a, b); + return _VirtualDom_thunk([func, a, b, c, d, e, f, g], function() { + return A7(func, a, b, c, d, e, f, g); }); -} +}); -function lazy3(fn, a, b, c) +var _VirtualDom_lazy8 = F9(function(func, a, b, c, d, e, f, g, h) { - return thunk(fn, [a,b,c], function() { - return A3(fn, a, b, c); + return _VirtualDom_thunk([func, a, b, c, d, e, f, g, h], function() { + return A8(func, a, b, c, d, e, f, g, h); }); -} +}); // FACTS -function organizeFacts(factList) +var _VirtualDom_on = F2(function(key, handler) +{ + return { + $: 'a0', + n: key, + o: handler + }; +}); +var _VirtualDom_style = F2(function(key, value) +{ + return { + $: 'a1', + n: key, + o: value + }; +}); +var _VirtualDom_property = F2(function(key, value) +{ + return { + $: 'a2', + n: key, + o: value + }; +}); +var _VirtualDom_attribute = F2(function(key, value) +{ + return { + $: 'a3', + n: key, + o: value + }; +}); +var _VirtualDom_attributeNS = F3(function(namespace, key, value) { - var namespace, facts = {}; - - while (factList.ctor !== '[]') - { - var entry = factList._0; - var key = entry.key; - - if (key === ATTR_KEY || key === ATTR_NS_KEY || key === EVENT_KEY) - { - var subFacts = facts[key] || {}; - subFacts[entry.realKey] = entry.value; - facts[key] = subFacts; - } - else if (key === STYLE_KEY) - { - var styles = facts[key] || {}; - var styleList = entry.value; - while (styleList.ctor !== '[]') - { - var style = styleList._0; - styles[style._0] = style._1; - styleList = styleList._1; - } - facts[key] = styles; - } - else if (key === 'namespace') - { - namespace = entry.value; - } - else if (key === 'className') - { - var classes = facts[key]; - facts[key] = typeof classes === 'undefined' - ? entry.value - : classes + ' ' + entry.value; - } - else - { - facts[key] = entry.value; - } - factList = factList._1; - } - return { - facts: facts, - namespace: namespace + $: 'a4', + n: key, + o: { f: namespace, o: value } }; -} +}); -//////////// PROPERTIES AND ATTRIBUTES //////////// +// XSS ATTACK VECTOR CHECKS -function style(value) +function _VirtualDom_noScript(tag) { - return { - key: STYLE_KEY, - value: value - }; + return tag == 'script' ? 'p' : tag; } +function _VirtualDom_noOnOrFormAction(key) +{ + return /^(on|formAction$)/i.test(key) ? 'data-' + key : key; +} -function property(key, value) +function _VirtualDom_noInnerHtmlOrFormAction(key) { - return { - key: key, - value: value - }; + return key == 'innerHTML' || key == 'formAction' ? 'data-' + key : key; } +function _VirtualDom_noJavaScriptUri_UNUSED(value) +{ + return /^javascript:/i.test(value.replace(/\s/g,'')) ? '' : value; +} -function attribute(key, value) +function _VirtualDom_noJavaScriptUri(value) { - return { - key: ATTR_KEY, - realKey: key, - value: value - }; + return /^javascript:/i.test(value.replace(/\s/g,'')) + ? 'javascript:alert("This is an XSS vector. Please use ports or web components instead.")' + : value; } +function _VirtualDom_noJavaScriptOrHtmlUri_UNUSED(value) +{ + return /^\s*(javascript:|data:text\/html)/i.test(value) ? '' : value; +} -function attributeNS(namespace, key, value) +function _VirtualDom_noJavaScriptOrHtmlUri(value) { - return { - key: ATTR_NS_KEY, - realKey: key, - value: { - value: value, - namespace: namespace - } - }; + return /^\s*(javascript:|data:text\/html)/i.test(value) + ? 'javascript:alert("This is an XSS vector. Please use ports or web components instead.")' + : value; } -function on(name, options, decoder) + +// MAP FACTS + + +var _VirtualDom_mapAttribute = F2(function(func, attr) +{ + return (attr.$ === 'a0') + ? A2(_VirtualDom_on, attr.n, _VirtualDom_mapHandler(func, attr.o)) + : attr; +}); + +function _VirtualDom_mapHandler(func, handler) { + var tag = $elm$virtual_dom$VirtualDom$toHandlerInt(handler); + + // 0 = Normal + // 1 = MayStopPropagation + // 2 = MayPreventDefault + // 3 = Custom + return { - key: EVENT_KEY, - realKey: name, - value: { - options: options, - decoder: decoder - } + $: handler.$, + a: + !tag + ? A2($elm$json$Json$Decode$map, func, handler.a) + : + A3($elm$json$Json$Decode$map2, + tag < 3 + ? _VirtualDom_mapEventTuple + : _VirtualDom_mapEventRecord, + $elm$json$Json$Decode$succeed(func), + handler.a + ) }; } +var _VirtualDom_mapEventTuple = F2(function(func, tuple) +{ + return _Utils_Tuple2(func(tuple.a), tuple.b); +}); -function equalEvents(a, b) +var _VirtualDom_mapEventRecord = F2(function(func, record) { - if (a.options !== b.options) - { - if (a.options.stopPropagation !== b.options.stopPropagation || a.options.preventDefault !== b.options.preventDefault) - { - return false; - } + return { + message: func(record.message), + stopPropagation: record.stopPropagation, + preventDefault: record.preventDefault } - return _elm_lang$core$Native_Json.equality(a.decoder, b.decoder); -} +}); -function mapProperty(func, property) + +// ORGANIZE FACTS + + +function _VirtualDom_organizeFacts(factList) { - if (property.key !== EVENT_KEY) + for (var facts = {}; factList.b; factList = factList.b) // WHILE_CONS { - return property; - } - return on( - property.realKey, - property.value.options, - A2(_elm_lang$core$Json_Decode$map, func, property.value.decoder) - ); -} + var entry = factList.a; + + var tag = entry.$; + var key = entry.n; + var value = entry.o; + + if (tag === 'a2') + { + (key === 'className') + ? _VirtualDom_addClass(facts, key, _Json_unwrap(value)) + : facts[key] = _Json_unwrap(value); + continue; + } -//////////// RENDER //////////// + var subFacts = facts[tag] || (facts[tag] = {}); + (tag === 'a3' && key === 'class') + ? _VirtualDom_addClass(subFacts, key, value) + : subFacts[key] = value; + } + return facts; +} -function render(vNode, eventNode) +function _VirtualDom_addClass(object, key, newClass) { - switch (vNode.type) - { - case 'thunk': - if (!vNode.node) - { - vNode.node = vNode.thunk(); - } - return render(vNode.node, eventNode); + var classes = object[key]; + object[key] = classes ? classes + ' ' + newClass : newClass; +} - case 'tagger': - var subNode = vNode.node; - var tagger = vNode.tagger; - while (subNode.type === 'tagger') - { - typeof tagger !== 'object' - ? tagger = [tagger, subNode.tagger] - : tagger.push(subNode.tagger); - subNode = subNode.node; - } +// RENDER - var subEventRoot = { tagger: tagger, parent: eventNode }; - var domNode = render(subNode, subEventRoot); - domNode.elm_event_node_ref = subEventRoot; - return domNode; - case 'text': - return localDoc.createTextNode(vNode.text); +function _VirtualDom_render(vNode, eventNode) +{ + var tag = vNode.$; - case 'node': - var domNode = vNode.namespace - ? localDoc.createElementNS(vNode.namespace, vNode.tag) - : localDoc.createElement(vNode.tag); + if (tag === 5) + { + return _VirtualDom_render(vNode.k || (vNode.k = vNode.m()), eventNode); + } - applyFacts(domNode, eventNode, vNode.facts); + if (tag === 0) + { + return _VirtualDom_doc.createTextNode(vNode.a); + } - var children = vNode.children; + if (tag === 4) + { + var subNode = vNode.k; + var tagger = vNode.j; - for (var i = 0; i < children.length; i++) - { - domNode.appendChild(render(children[i], eventNode)); - } + while (subNode.$ === 4) + { + typeof tagger !== 'object' + ? tagger = [tagger, subNode.j] + : tagger.push(subNode.j); - return domNode; + subNode = subNode.k; + } - case 'keyed-node': - var domNode = vNode.namespace - ? localDoc.createElementNS(vNode.namespace, vNode.tag) - : localDoc.createElement(vNode.tag); + var subEventRoot = { j: tagger, p: eventNode }; + var domNode = _VirtualDom_render(subNode, subEventRoot); + domNode.elm_event_node_ref = subEventRoot; + return domNode; + } - applyFacts(domNode, eventNode, vNode.facts); + if (tag === 3) + { + var domNode = vNode.h(vNode.g); + _VirtualDom_applyFacts(domNode, eventNode, vNode.d); + return domNode; + } - var children = vNode.children; + // at this point `tag` must be 1 or 2 - for (var i = 0; i < children.length; i++) - { - domNode.appendChild(render(children[i]._1, eventNode)); - } + var domNode = vNode.f + ? _VirtualDom_doc.createElementNS(vNode.f, vNode.c) + : _VirtualDom_doc.createElement(vNode.c); - return domNode; + if (_VirtualDom_divertHrefToApp && vNode.c == 'a') + { + domNode.addEventListener('click', _VirtualDom_divertHrefToApp(domNode)); + } - case 'custom': - var domNode = vNode.impl.render(vNode.model); - applyFacts(domNode, eventNode, vNode.facts); - return domNode; + _VirtualDom_applyFacts(domNode, eventNode, vNode.d); + + for (var kids = vNode.e, i = 0; i < kids.length; i++) + { + _VirtualDom_appendChild(domNode, _VirtualDom_render(tag === 1 ? kids[i] : kids[i].b, eventNode)); } + + return domNode; } -//////////// APPLY FACTS //////////// +// APPLY FACTS -function applyFacts(domNode, eventNode, facts) +function _VirtualDom_applyFacts(domNode, eventNode, facts) { for (var key in facts) { var value = facts[key]; - switch (key) - { - case STYLE_KEY: - applyStyles(domNode, value); - break; - - case EVENT_KEY: - applyEvents(domNode, eventNode, value); - break; + key === 'a1' + ? _VirtualDom_applyStyles(domNode, value) + : + key === 'a0' + ? _VirtualDom_applyEvents(domNode, eventNode, value) + : + key === 'a3' + ? _VirtualDom_applyAttrs(domNode, value) + : + key === 'a4' + ? _VirtualDom_applyAttrsNS(domNode, value) + : + (key !== 'value' || key !== 'checked' || domNode[key] !== value) && (domNode[key] = value); + } +} - case ATTR_KEY: - applyAttrs(domNode, value); - break; - case ATTR_NS_KEY: - applyAttrsNS(domNode, value); - break; - case 'value': - if (domNode[key] !== value) - { - domNode[key] = value; - } - break; +// APPLY STYLES - default: - domNode[key] = value; - break; - } - } -} -function applyStyles(domNode, styles) +function _VirtualDom_applyStyles(domNode, styles) { var domNodeStyle = domNode.style; @@ -7510,308 +2797,326 @@ function applyStyles(domNode, styles) } } -function applyEvents(domNode, eventNode, events) -{ - var allHandlers = domNode.elm_handlers || {}; - for (var key in events) - { - var handler = allHandlers[key]; - var value = events[key]; - if (typeof value === 'undefined') - { - domNode.removeEventListener(key, handler); - allHandlers[key] = undefined; - } - else if (typeof handler === 'undefined') - { - var handler = makeEventHandler(eventNode, value); - domNode.addEventListener(key, handler); - allHandlers[key] = handler; - } - else - { - handler.info = value; - } - } +// APPLY ATTRS - domNode.elm_handlers = allHandlers; -} -function makeEventHandler(eventNode, info) +function _VirtualDom_applyAttrs(domNode, attrs) { - function eventHandler(event) + for (var key in attrs) { - var info = eventHandler.info; + var value = attrs[key]; + value + ? domNode.setAttribute(key, value) + : domNode.removeAttribute(key); + } +} - var value = A2(_elm_lang$core$Native_Json.run, info.decoder, event); - if (value.ctor === 'Ok') - { - var options = info.options; - if (options.stopPropagation) - { - event.stopPropagation(); - } - if (options.preventDefault) - { - event.preventDefault(); - } - var message = value._0; +// APPLY NAMESPACED ATTRS - var currentEventNode = eventNode; - while (currentEventNode) - { - var tagger = currentEventNode.tagger; - if (typeof tagger === 'function') - { - message = tagger(message); - } - else - { - for (var i = tagger.length; i--; ) - { - message = tagger[i](message); - } - } - currentEventNode = currentEventNode.parent; - } - } - }; - eventHandler.info = info; +function _VirtualDom_applyAttrsNS(domNode, nsAttrs) +{ + for (var key in nsAttrs) + { + var pair = nsAttrs[key]; + var namespace = pair.f; + var value = pair.o; - return eventHandler; + value + ? domNode.setAttributeNS(namespace, key, value) + : domNode.removeAttributeNS(namespace, key); + } } -function applyAttrs(domNode, attrs) + + +// APPLY EVENTS + + +function _VirtualDom_applyEvents(domNode, eventNode, events) { - for (var key in attrs) + var allCallbacks = domNode.elmFs || (domNode.elmFs = {}); + + for (var key in events) { - var value = attrs[key]; - if (typeof value === 'undefined') + var newHandler = events[key]; + var oldCallback = allCallbacks[key]; + + if (!newHandler) { - domNode.removeAttribute(key); + domNode.removeEventListener(key, oldCallback); + allCallbacks[key] = undefined; + continue; } - else + + if (oldCallback) { - domNode.setAttribute(key, value); + var oldHandler = oldCallback.q; + if (oldHandler.$ === newHandler.$) + { + oldCallback.q = newHandler; + continue; + } + domNode.removeEventListener(key, oldCallback); } + + oldCallback = _VirtualDom_makeCallback(eventNode, newHandler); + domNode.addEventListener(key, oldCallback, + _VirtualDom_passiveSupported + && { passive: $elm$virtual_dom$VirtualDom$toHandlerInt(newHandler) < 2 } + ); + allCallbacks[key] = oldCallback; } } -function applyAttrsNS(domNode, nsAttrs) + + +// PASSIVE EVENTS + + +var _VirtualDom_passiveSupported; + +try +{ + window.addEventListener('t', null, Object.defineProperty({}, 'passive', { + get: function() { _VirtualDom_passiveSupported = true; } + })); +} +catch(e) {} + + + +// EVENT HANDLERS + + +function _VirtualDom_makeCallback(eventNode, initialHandler) { - for (var key in nsAttrs) + function callback(event) { - var pair = nsAttrs[key]; - var namespace = pair.namespace; - var value = pair.value; + var handler = callback.q; + var result = _Json_runHelp(handler.a, event); - if (typeof value === 'undefined') + if (!$elm$core$Result$isOk(result)) { - domNode.removeAttributeNS(namespace, key); + return; } - else + + var tag = $elm$virtual_dom$VirtualDom$toHandlerInt(handler); + + // 0 = Normal + // 1 = MayStopPropagation + // 2 = MayPreventDefault + // 3 = Custom + + var value = result.a; + var message = !tag ? value : tag < 3 ? value.a : value.message; + var stopPropagation = tag == 1 ? value.b : tag == 3 && value.stopPropagation; + var currentEventNode = ( + stopPropagation && event.stopPropagation(), + (tag == 2 ? value.b : tag == 3 && value.preventDefault) && event.preventDefault(), + eventNode + ); + var tagger; + var i; + while (tagger = currentEventNode.j) { - domNode.setAttributeNS(namespace, key, value); + if (typeof tagger == 'function') + { + message = tagger(message); + } + else + { + for (var i = tagger.length; i--; ) + { + message = tagger[i](message); + } + } + currentEventNode = currentEventNode.p; } + currentEventNode(message, stopPropagation); // stopPropagation implies isSync } + + callback.q = initialHandler; + + return callback; +} + +function _VirtualDom_equalEvents(x, y) +{ + return x.$ == y.$ && _Json_equality(x.a, y.a); } -//////////// DIFF //////////// +// DIFF -function diff(a, b) +// TODO: Should we do patches like in iOS? +// +// type Patch +// = At Int Patch +// | Batch (List Patch) +// | Change ... +// +// How could it not be better? +// +function _VirtualDom_diff(x, y) { var patches = []; - diffHelp(a, b, patches, 0); + _VirtualDom_diffHelp(x, y, patches, 0); return patches; } -function makePatch(type, index, data) +function _VirtualDom_pushPatch(patches, type, index, data) { - return { - index: index, - type: type, - data: data, - domNode: undefined, - eventNode: undefined + var patch = { + $: type, + r: index, + s: data, + t: undefined, + u: undefined }; + patches.push(patch); + return patch; } -function diffHelp(a, b, patches, index) +function _VirtualDom_diffHelp(x, y, patches, index) { - if (a === b) + if (x === y) { return; } - var aType = a.type; - var bType = b.type; + var xType = x.$; + var yType = y.$; // Bail if you run into different types of nodes. Implies that the // structure has changed significantly and it's not worth a diff. - if (aType !== bType) + if (xType !== yType) { - patches.push(makePatch('p-redraw', index, b)); - return; + if (xType === 1 && yType === 2) + { + y = _VirtualDom_dekey(y); + yType = 1; + } + else + { + _VirtualDom_pushPatch(patches, 0, index, y); + return; + } } - // Now we know that both nodes are the same type. - switch (bType) + // Now we know that both nodes are the same $. + switch (yType) { - case 'thunk': - var aArgs = a.args; - var bArgs = b.args; - var i = aArgs.length; - var same = a.func === b.func && i === bArgs.length; + case 5: + var xRefs = x.l; + var yRefs = y.l; + var i = xRefs.length; + var same = i === yRefs.length; while (same && i--) { - same = aArgs[i] === bArgs[i]; + same = xRefs[i] === yRefs[i]; } if (same) { - b.node = a.node; + y.k = x.k; return; } - b.node = b.thunk(); + y.k = y.m(); var subPatches = []; - diffHelp(a.node, b.node, subPatches, 0); - if (subPatches.length > 0) - { - patches.push(makePatch('p-thunk', index, subPatches)); - } + _VirtualDom_diffHelp(x.k, y.k, subPatches, 0); + subPatches.length > 0 && _VirtualDom_pushPatch(patches, 1, index, subPatches); return; - case 'tagger': + case 4: // gather nested taggers - var aTaggers = a.tagger; - var bTaggers = b.tagger; + var xTaggers = x.j; + var yTaggers = y.j; var nesting = false; - var aSubNode = a.node; - while (aSubNode.type === 'tagger') + var xSubNode = x.k; + while (xSubNode.$ === 4) { nesting = true; - typeof aTaggers !== 'object' - ? aTaggers = [aTaggers, aSubNode.tagger] - : aTaggers.push(aSubNode.tagger); + typeof xTaggers !== 'object' + ? xTaggers = [xTaggers, xSubNode.j] + : xTaggers.push(xSubNode.j); - aSubNode = aSubNode.node; + xSubNode = xSubNode.k; } - var bSubNode = b.node; - while (bSubNode.type === 'tagger') + var ySubNode = y.k; + while (ySubNode.$ === 4) { nesting = true; - typeof bTaggers !== 'object' - ? bTaggers = [bTaggers, bSubNode.tagger] - : bTaggers.push(bSubNode.tagger); + typeof yTaggers !== 'object' + ? yTaggers = [yTaggers, ySubNode.j] + : yTaggers.push(ySubNode.j); - bSubNode = bSubNode.node; + ySubNode = ySubNode.k; } // Just bail if different numbers of taggers. This implies the // structure of the virtual DOM has changed. - if (nesting && aTaggers.length !== bTaggers.length) + if (nesting && xTaggers.length !== yTaggers.length) { - patches.push(makePatch('p-redraw', index, b)); + _VirtualDom_pushPatch(patches, 0, index, y); return; } // check if taggers are "the same" - if (nesting ? !pairwiseRefEqual(aTaggers, bTaggers) : aTaggers !== bTaggers) + if (nesting ? !_VirtualDom_pairwiseRefEqual(xTaggers, yTaggers) : xTaggers !== yTaggers) { - patches.push(makePatch('p-tagger', index, bTaggers)); + _VirtualDom_pushPatch(patches, 2, index, yTaggers); } // diff everything below the taggers - diffHelp(aSubNode, bSubNode, patches, index + 1); + _VirtualDom_diffHelp(xSubNode, ySubNode, patches, index + 1); return; - case 'text': - if (a.text !== b.text) + case 0: + if (x.a !== y.a) { - patches.push(makePatch('p-text', index, b.text)); - return; + _VirtualDom_pushPatch(patches, 3, index, y.a); } - return; - case 'node': - // Bail if obvious indicators have changed. Implies more serious - // structural changes such that it's not worth it to diff. - if (a.tag !== b.tag || a.namespace !== b.namespace) - { - patches.push(makePatch('p-redraw', index, b)); - return; - } - - var factsDiff = diffFacts(a.facts, b.facts); - - if (typeof factsDiff !== 'undefined') - { - patches.push(makePatch('p-facts', index, factsDiff)); - } - - diffChildren(a, b, patches, index); + case 1: + _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKids); return; - case 'keyed-node': - // Bail if obvious indicators have changed. Implies more serious - // structural changes such that it's not worth it to diff. - if (a.tag !== b.tag || a.namespace !== b.namespace) - { - patches.push(makePatch('p-redraw', index, b)); - return; - } - - var factsDiff = diffFacts(a.facts, b.facts); - - if (typeof factsDiff !== 'undefined') - { - patches.push(makePatch('p-facts', index, factsDiff)); - } - - diffKeyedChildren(a, b, patches, index); + case 2: + _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKeyedKids); return; - case 'custom': - if (a.impl !== b.impl) + case 3: + if (x.h !== y.h) { - patches.push(makePatch('p-redraw', index, b)); + _VirtualDom_pushPatch(patches, 0, index, y); return; } - var factsDiff = diffFacts(a.facts, b.facts); - if (typeof factsDiff !== 'undefined') - { - patches.push(makePatch('p-facts', index, factsDiff)); - } + var factsDiff = _VirtualDom_diffFacts(x.d, y.d); + factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff); - var patch = b.impl.diff(a,b); - if (patch) - { - patches.push(makePatch('p-custom', index, patch)); - return; - } + var patch = y.i(x.g, y.g); + patch && _VirtualDom_pushPatch(patches, 5, index, patch); return; } } - // assumes the incoming arrays are the same length -function pairwiseRefEqual(as, bs) +function _VirtualDom_pairwiseRefEqual(as, bs) { for (var i = 0; i < as.length; i++) { @@ -7824,68 +3129,88 @@ function pairwiseRefEqual(as, bs) return true; } +function _VirtualDom_diffNodes(x, y, patches, index, diffKids) +{ + // Bail if obvious indicators have changed. Implies more serious + // structural changes such that it's not worth it to diff. + if (x.c !== y.c || x.f !== y.f) + { + _VirtualDom_pushPatch(patches, 0, index, y); + return; + } + + var factsDiff = _VirtualDom_diffFacts(x.d, y.d); + factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff); + + diffKids(x, y, patches, index); +} + + + +// DIFF FACTS + // TODO Instead of creating a new diff object, it's possible to just test if // there *is* a diff. During the actual patch, do the diff again and make the // modifications directly. This way, there's no new allocations. Worth it? -function diffFacts(a, b, category) +function _VirtualDom_diffFacts(x, y, category) { var diff; // look for changes and removals - for (var aKey in a) + for (var xKey in x) { - if (aKey === STYLE_KEY || aKey === EVENT_KEY || aKey === ATTR_KEY || aKey === ATTR_NS_KEY) + if (xKey === 'a1' || xKey === 'a0' || xKey === 'a3' || xKey === 'a4') { - var subDiff = diffFacts(a[aKey], b[aKey] || {}, aKey); + var subDiff = _VirtualDom_diffFacts(x[xKey], y[xKey] || {}, xKey); if (subDiff) { diff = diff || {}; - diff[aKey] = subDiff; + diff[xKey] = subDiff; } continue; } // remove if not in the new facts - if (!(aKey in b)) + if (!(xKey in y)) { diff = diff || {}; - diff[aKey] = - (typeof category === 'undefined') - ? (typeof a[aKey] === 'string' ? '' : null) + diff[xKey] = + !category + ? (typeof x[xKey] === 'string' ? '' : null) : - (category === STYLE_KEY) + (category === 'a1') ? '' : - (category === EVENT_KEY || category === ATTR_KEY) + (category === 'a0' || category === 'a3') ? undefined : - { namespace: a[aKey].namespace, value: undefined }; + { f: x[xKey].f, o: undefined }; continue; } - var aValue = a[aKey]; - var bValue = b[aKey]; + var xValue = x[xKey]; + var yValue = y[xKey]; // reference equal, so don't worry about it - if (aValue === bValue && aKey !== 'value' - || category === EVENT_KEY && equalEvents(aValue, bValue)) + if (xValue === yValue && xKey !== 'value' && xKey !== 'checked' + || category === 'a0' && _VirtualDom_equalEvents(xValue, yValue)) { continue; } diff = diff || {}; - diff[aKey] = bValue; + diff[xKey] = yValue; } // add new stuff - for (var bKey in b) + for (var yKey in y) { - if (!(bKey in a)) + if (!(yKey in x)) { diff = diff || {}; - diff[bKey] = b[bKey]; + diff[yKey] = y[yKey]; } } @@ -7893,44 +3218,51 @@ function diffFacts(a, b, category) } -function diffChildren(aParent, bParent, patches, rootIndex) + +// DIFF KIDS + + +function _VirtualDom_diffKids(xParent, yParent, patches, index) { - var aChildren = aParent.children; - var bChildren = bParent.children; + var xKids = xParent.e; + var yKids = yParent.e; - var aLen = aChildren.length; - var bLen = bChildren.length; + var xLen = xKids.length; + var yLen = yKids.length; // FIGURE OUT IF THERE ARE INSERTS OR REMOVALS - if (aLen > bLen) + if (xLen > yLen) { - patches.push(makePatch('p-remove-last', rootIndex, aLen - bLen)); + _VirtualDom_pushPatch(patches, 6, index, { + v: yLen, + i: xLen - yLen + }); } - else if (aLen < bLen) + else if (xLen < yLen) { - patches.push(makePatch('p-append', rootIndex, bChildren.slice(aLen))); + _VirtualDom_pushPatch(patches, 7, index, { + v: xLen, + e: yKids + }); } // PAIRWISE DIFF EVERYTHING ELSE - var index = rootIndex; - var minLen = aLen < bLen ? aLen : bLen; - for (var i = 0; i < minLen; i++) + for (var minLen = xLen < yLen ? xLen : yLen, i = 0; i < minLen; i++) { - index++; - var aChild = aChildren[i]; - diffHelp(aChild, bChildren[i], patches, index); - index += aChild.descendantsCount || 0; + var xKid = xKids[i]; + _VirtualDom_diffHelp(xKid, yKids[i], patches, ++index); + index += xKid.b || 0; } } -//////////// KEYED DIFF //////////// +// KEYED DIFF -function diffKeyedChildren(aParent, bParent, patches, rootIndex) +function _VirtualDom_diffKeyedKids(xParent, yParent, patches, rootIndex) { var localPatches = []; @@ -7938,120 +3270,118 @@ function diffKeyedChildren(aParent, bParent, patches, rootIndex) var inserts = []; // Array { index : Int, entry : Entry } // type Entry = { tag : String, vnode : VNode, index : Int, data : _ } - var aChildren = aParent.children; - var bChildren = bParent.children; - var aLen = aChildren.length; - var bLen = bChildren.length; - var aIndex = 0; - var bIndex = 0; + var xKids = xParent.e; + var yKids = yParent.e; + var xLen = xKids.length; + var yLen = yKids.length; + var xIndex = 0; + var yIndex = 0; var index = rootIndex; - while (aIndex < aLen && bIndex < bLen) + while (xIndex < xLen && yIndex < yLen) { - var a = aChildren[aIndex]; - var b = bChildren[bIndex]; + var x = xKids[xIndex]; + var y = yKids[yIndex]; - var aKey = a._0; - var bKey = b._0; - var aNode = a._1; - var bNode = b._1; + var xKey = x.a; + var yKey = y.a; + var xNode = x.b; + var yNode = y.b; // check if keys match - if (aKey === bKey) + if (xKey === yKey) { index++; - diffHelp(aNode, bNode, localPatches, index); - index += aNode.descendantsCount || 0; + _VirtualDom_diffHelp(xNode, yNode, localPatches, index); + index += xNode.b || 0; - aIndex++; - bIndex++; + xIndex++; + yIndex++; continue; } // look ahead 1 to detect insertions and removals. - var aLookAhead = aIndex + 1 < aLen; - var bLookAhead = bIndex + 1 < bLen; + var xNext = xKids[xIndex + 1]; + var yNext = yKids[yIndex + 1]; - if (aLookAhead) + if (xNext) { - var aNext = aChildren[aIndex + 1]; - var aNextKey = aNext._0; - var aNextNode = aNext._1; - var oldMatch = bKey === aNextKey; + var xNextKey = xNext.a; + var xNextNode = xNext.b; + var oldMatch = yKey === xNextKey; } - if (bLookAhead) + if (yNext) { - var bNext = bChildren[bIndex + 1]; - var bNextKey = bNext._0; - var bNextNode = bNext._1; - var newMatch = aKey === bNextKey; + var yNextKey = yNext.a; + var yNextNode = yNext.b; + var newMatch = xKey === yNextKey; } - // swap a and b - if (aLookAhead && bLookAhead && newMatch && oldMatch) + // swap x and y + if (newMatch && oldMatch) { index++; - diffHelp(aNode, bNextNode, localPatches, index); - insertNode(changes, localPatches, aKey, bNode, bIndex, inserts); - index += aNode.descendantsCount || 0; + _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index); + _VirtualDom_insertNode(changes, localPatches, xKey, yNode, yIndex, inserts); + index += xNode.b || 0; index++; - removeNode(changes, localPatches, aKey, aNextNode, index); - index += aNextNode.descendantsCount || 0; + _VirtualDom_removeNode(changes, localPatches, xKey, xNextNode, index); + index += xNextNode.b || 0; - aIndex += 2; - bIndex += 2; + xIndex += 2; + yIndex += 2; continue; } - // insert b - if (bLookAhead && newMatch) + // insert y + if (newMatch) { index++; - insertNode(changes, localPatches, bKey, bNode, bIndex, inserts); - diffHelp(aNode, bNextNode, localPatches, index); - index += aNode.descendantsCount || 0; + _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts); + _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index); + index += xNode.b || 0; - aIndex += 1; - bIndex += 2; + xIndex += 1; + yIndex += 2; continue; } - // remove a - if (aLookAhead && oldMatch) + // remove x + if (oldMatch) { index++; - removeNode(changes, localPatches, aKey, aNode, index); - index += aNode.descendantsCount || 0; + _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index); + index += xNode.b || 0; index++; - diffHelp(aNextNode, bNode, localPatches, index); - index += aNextNode.descendantsCount || 0; + _VirtualDom_diffHelp(xNextNode, yNode, localPatches, index); + index += xNextNode.b || 0; - aIndex += 2; - bIndex += 1; + xIndex += 2; + yIndex += 1; continue; } - // remove a, insert b - if (aLookAhead && bLookAhead && aNextKey === bNextKey) + // remove x, insert y + if (xNext && xNextKey === yNextKey) { index++; - removeNode(changes, localPatches, aKey, aNode, index); - insertNode(changes, localPatches, bKey, bNode, bIndex, inserts); - index += aNode.descendantsCount || 0; + _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index); + _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts); + index += xNode.b || 0; index++; - diffHelp(aNextNode, bNextNode, localPatches, index); - index += aNextNode.descendantsCount || 0; + _VirtualDom_diffHelp(xNextNode, yNextNode, localPatches, index); + index += xNextNode.b || 0; - aIndex += 2; - bIndex += 2; + xIndex += 2; + yIndex += 2; continue; } @@ -8060,128 +3390,125 @@ function diffKeyedChildren(aParent, bParent, patches, rootIndex) // eat up any remaining nodes with removeNode and insertNode - while (aIndex < aLen) + while (xIndex < xLen) { index++; - var a = aChildren[aIndex]; - var aNode = a._1; - removeNode(changes, localPatches, a._0, aNode, index); - index += aNode.descendantsCount || 0; - aIndex++; + var x = xKids[xIndex]; + var xNode = x.b; + _VirtualDom_removeNode(changes, localPatches, x.a, xNode, index); + index += xNode.b || 0; + xIndex++; } - var endInserts; - while (bIndex < bLen) + while (yIndex < yLen) { - endInserts = endInserts || []; - var b = bChildren[bIndex]; - insertNode(changes, localPatches, b._0, b._1, undefined, endInserts); - bIndex++; + var endInserts = endInserts || []; + var y = yKids[yIndex]; + _VirtualDom_insertNode(changes, localPatches, y.a, y.b, undefined, endInserts); + yIndex++; } - if (localPatches.length > 0 || inserts.length > 0 || typeof endInserts !== 'undefined') + if (localPatches.length > 0 || inserts.length > 0 || endInserts) { - patches.push(makePatch('p-reorder', rootIndex, { - patches: localPatches, - inserts: inserts, - endInserts: endInserts - })); + _VirtualDom_pushPatch(patches, 8, rootIndex, { + w: localPatches, + x: inserts, + y: endInserts + }); } } -//////////// CHANGES FROM KEYED DIFF //////////// +// CHANGES FROM KEYED DIFF -var POSTFIX = '_elmW6BL'; +var _VirtualDom_POSTFIX = '_elmW6BL'; -function insertNode(changes, localPatches, key, vnode, bIndex, inserts) +function _VirtualDom_insertNode(changes, localPatches, key, vnode, yIndex, inserts) { var entry = changes[key]; // never seen this key before - if (typeof entry === 'undefined') + if (!entry) { entry = { - tag: 'insert', - vnode: vnode, - index: bIndex, - data: undefined + c: 0, + z: vnode, + r: yIndex, + s: undefined }; - inserts.push({ index: bIndex, entry: entry }); + inserts.push({ r: yIndex, A: entry }); changes[key] = entry; return; } // this key was removed earlier, a match! - if (entry.tag === 'remove') + if (entry.c === 1) { - inserts.push({ index: bIndex, entry: entry }); + inserts.push({ r: yIndex, A: entry }); - entry.tag = 'move'; + entry.c = 2; var subPatches = []; - diffHelp(entry.vnode, vnode, subPatches, entry.index); - entry.index = bIndex; - entry.data.data = { - patches: subPatches, - entry: entry + _VirtualDom_diffHelp(entry.z, vnode, subPatches, entry.r); + entry.r = yIndex; + entry.s.s = { + w: subPatches, + A: entry }; return; } // this key has already been inserted or moved, a duplicate! - insertNode(changes, localPatches, key + POSTFIX, vnode, bIndex, inserts); + _VirtualDom_insertNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, yIndex, inserts); } -function removeNode(changes, localPatches, key, vnode, index) +function _VirtualDom_removeNode(changes, localPatches, key, vnode, index) { var entry = changes[key]; // never seen this key before - if (typeof entry === 'undefined') + if (!entry) { - var patch = makePatch('p-remove', index, undefined); - localPatches.push(patch); + var patch = _VirtualDom_pushPatch(localPatches, 9, index, undefined); changes[key] = { - tag: 'remove', - vnode: vnode, - index: index, - data: patch + c: 1, + z: vnode, + r: index, + s: patch }; return; } // this key was inserted earlier, a match! - if (entry.tag === 'insert') + if (entry.c === 0) { - entry.tag = 'move'; + entry.c = 2; var subPatches = []; - diffHelp(vnode, entry.vnode, subPatches, index); + _VirtualDom_diffHelp(vnode, entry.z, subPatches, index); - var patch = makePatch('p-remove', index, { - patches: subPatches, - entry: entry + _VirtualDom_pushPatch(localPatches, 9, index, { + w: subPatches, + A: entry }); - localPatches.push(patch); return; } // this key has already been removed or moved, a duplicate! - removeNode(changes, localPatches, key + POSTFIX, vnode, index); + _VirtualDom_removeNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, index); } -//////////// ADD DOM NODES //////////// +// ADD DOM NODES // // Each DOM node has an "index" assigned in order of traversal. It is important // to minimize our crawl over the actual DOM, so these indexes (along with the @@ -8189,148 +3516,126 @@ function removeNode(changes, localPatches, key, vnode, index) // the DOM if we know there are no patches there. -function addDomNodes(domNode, vNode, patches, eventNode) +function _VirtualDom_addDomNodes(domNode, vNode, patches, eventNode) { - addDomNodesHelp(domNode, vNode, patches, 0, 0, vNode.descendantsCount, eventNode); + _VirtualDom_addDomNodesHelp(domNode, vNode, patches, 0, 0, vNode.b, eventNode); } // assumes `patches` is non-empty and indexes increase monotonically. -function addDomNodesHelp(domNode, vNode, patches, i, low, high, eventNode) +function _VirtualDom_addDomNodesHelp(domNode, vNode, patches, i, low, high, eventNode) { var patch = patches[i]; - var index = patch.index; + var index = patch.r; while (index === low) { - var patchType = patch.type; + var patchType = patch.$; - if (patchType === 'p-thunk') + if (patchType === 1) { - addDomNodes(domNode, vNode.node, patch.data, eventNode); + _VirtualDom_addDomNodes(domNode, vNode.k, patch.s, eventNode); } - else if (patchType === 'p-reorder') + else if (patchType === 8) { - patch.domNode = domNode; - patch.eventNode = eventNode; + patch.t = domNode; + patch.u = eventNode; - var subPatches = patch.data.patches; + var subPatches = patch.s.w; if (subPatches.length > 0) { - addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); + _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); } } - else if (patchType === 'p-remove') + else if (patchType === 9) { - patch.domNode = domNode; - patch.eventNode = eventNode; + patch.t = domNode; + patch.u = eventNode; - var data = patch.data; - if (typeof data !== 'undefined') + var data = patch.s; + if (data) { - data.entry.data = domNode; - var subPatches = data.patches; + data.A.s = domNode; + var subPatches = data.w; if (subPatches.length > 0) { - addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); + _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); } } } else { - patch.domNode = domNode; - patch.eventNode = eventNode; + patch.t = domNode; + patch.u = eventNode; } i++; - if (!(patch = patches[i]) || (index = patch.index) > high) + if (!(patch = patches[i]) || (index = patch.r) > high) { return i; } } - switch (vNode.type) - { - case 'tagger': - var subNode = vNode.node; + var tag = vNode.$; - while (subNode.type === "tagger") - { - subNode = subNode.node; - } + if (tag === 4) + { + var subNode = vNode.k; - return addDomNodesHelp(domNode, subNode, patches, i, low + 1, high, domNode.elm_event_node_ref); + while (subNode.$ === 4) + { + subNode = subNode.k; + } - case 'node': - var vChildren = vNode.children; - var childNodes = domNode.childNodes; - for (var j = 0; j < vChildren.length; j++) - { - low++; - var vChild = vChildren[j]; - var nextLow = low + (vChild.descendantsCount || 0); - if (low <= index && index <= nextLow) - { - i = addDomNodesHelp(childNodes[j], vChild, patches, i, low, nextLow, eventNode); - if (!(patch = patches[i]) || (index = patch.index) > high) - { - return i; - } - } - low = nextLow; - } - return i; + return _VirtualDom_addDomNodesHelp(domNode, subNode, patches, i, low + 1, high, domNode.elm_event_node_ref); + } - case 'keyed-node': - var vChildren = vNode.children; - var childNodes = domNode.childNodes; - for (var j = 0; j < vChildren.length; j++) - { - low++; - var vChild = vChildren[j]._1; - var nextLow = low + (vChild.descendantsCount || 0); - if (low <= index && index <= nextLow) - { - i = addDomNodesHelp(childNodes[j], vChild, patches, i, low, nextLow, eventNode); - if (!(patch = patches[i]) || (index = patch.index) > high) - { - return i; - } - } - low = nextLow; - } - return i; + // tag must be 1 or 2 at this point - case 'text': - case 'thunk': - throw new Error('should never traverse `text` or `thunk` nodes like this'); + var vKids = vNode.e; + var childNodes = domNode.childNodes; + for (var j = 0; j < vKids.length; j++) + { + low++; + var vKid = tag === 1 ? vKids[j] : vKids[j].b; + var nextLow = low + (vKid.b || 0); + if (low <= index && index <= nextLow) + { + i = _VirtualDom_addDomNodesHelp(childNodes[j], vKid, patches, i, low, nextLow, eventNode); + if (!(patch = patches[i]) || (index = patch.r) > high) + { + return i; + } + } + low = nextLow; } + return i; } -//////////// APPLY PATCHES //////////// +// APPLY PATCHES -function applyPatches(rootDomNode, oldVirtualNode, patches, eventNode) +function _VirtualDom_applyPatches(rootDomNode, oldVirtualNode, patches, eventNode) { if (patches.length === 0) { return rootDomNode; } - addDomNodes(rootDomNode, oldVirtualNode, patches, eventNode); - return applyPatchesHelp(rootDomNode, patches); + _VirtualDom_addDomNodes(rootDomNode, oldVirtualNode, patches, eventNode); + return _VirtualDom_applyPatchesHelp(rootDomNode, patches); } -function applyPatchesHelp(rootDomNode, patches) +function _VirtualDom_applyPatchesHelp(rootDomNode, patches) { for (var i = 0; i < patches.length; i++) { var patch = patches[i]; - var localDomNode = patch.domNode - var newNode = applyPatch(localDomNode, patch); + var localDomNode = patch.t + var newNode = _VirtualDom_applyPatch(localDomNode, patch); if (localDomNode === rootDomNode) { rootDomNode = newNode; @@ -8339,85 +3644,87 @@ function applyPatchesHelp(rootDomNode, patches) return rootDomNode; } -function applyPatch(domNode, patch) +function _VirtualDom_applyPatch(domNode, patch) { - switch (patch.type) + switch (patch.$) { - case 'p-redraw': - return applyPatchRedraw(domNode, patch.data, patch.eventNode); + case 0: + return _VirtualDom_applyPatchRedraw(domNode, patch.s, patch.u); - case 'p-facts': - applyFacts(domNode, patch.eventNode, patch.data); + case 4: + _VirtualDom_applyFacts(domNode, patch.u, patch.s); return domNode; - case 'p-text': - domNode.replaceData(0, domNode.length, patch.data); + case 3: + domNode.replaceData(0, domNode.length, patch.s); return domNode; - case 'p-thunk': - return applyPatchesHelp(domNode, patch.data); + case 1: + return _VirtualDom_applyPatchesHelp(domNode, patch.s); - case 'p-tagger': - if (typeof domNode.elm_event_node_ref !== 'undefined') + case 2: + if (domNode.elm_event_node_ref) { - domNode.elm_event_node_ref.tagger = patch.data; + domNode.elm_event_node_ref.j = patch.s; } else { - domNode.elm_event_node_ref = { tagger: patch.data, parent: patch.eventNode }; + domNode.elm_event_node_ref = { j: patch.s, p: patch.u }; } return domNode; - case 'p-remove-last': - var i = patch.data; - while (i--) + case 6: + var data = patch.s; + for (var i = 0; i < data.i; i++) { - domNode.removeChild(domNode.lastChild); + domNode.removeChild(domNode.childNodes[data.v]); } return domNode; - case 'p-append': - var newNodes = patch.data; - for (var i = 0; i < newNodes.length; i++) + case 7: + var data = patch.s; + var kids = data.e; + var i = data.v; + var theEnd = domNode.childNodes[i]; + for (; i < kids.length; i++) { - domNode.appendChild(render(newNodes[i], patch.eventNode)); + domNode.insertBefore(_VirtualDom_render(kids[i], patch.u), theEnd); } return domNode; - case 'p-remove': - var data = patch.data; - if (typeof data === 'undefined') + case 9: + var data = patch.s; + if (!data) { domNode.parentNode.removeChild(domNode); return domNode; } - var entry = data.entry; - if (typeof entry.index !== 'undefined') + var entry = data.A; + if (typeof entry.r !== 'undefined') { domNode.parentNode.removeChild(domNode); } - entry.data = applyPatchesHelp(domNode, data.patches); + entry.s = _VirtualDom_applyPatchesHelp(domNode, data.w); return domNode; - case 'p-reorder': - return applyPatchReorder(domNode, patch); + case 8: + return _VirtualDom_applyPatchReorder(domNode, patch); - case 'p-custom': - var impl = patch.data; - return impl.applyPatch(domNode, impl.data); + case 5: + return patch.s(domNode); default: - throw new Error('Ran into an unknown patch!'); + _Debug_crash(10); // 'Ran into an unknown patch!' } } -function applyPatchRedraw(domNode, vNode, eventNode) +function _VirtualDom_applyPatchRedraw(domNode, vNode, eventNode) { var parentNode = domNode.parentNode; - var newNode = render(vNode, eventNode); + var newNode = _VirtualDom_render(vNode, eventNode); - if (typeof newNode.elm_event_node_ref === 'undefined') + if (!newNode.elm_event_node_ref) { newNode.elm_event_node_ref = domNode.elm_event_node_ref; } @@ -8430,2436 +3737,2714 @@ function applyPatchRedraw(domNode, vNode, eventNode) } -function applyPatchReorder(domNode, patch) +function _VirtualDom_applyPatchReorder(domNode, patch) { - var data = patch.data; + var data = patch.s; // remove end inserts - var frag = applyPatchReorderEndInsertsHelp(data.endInserts, patch); + var frag = _VirtualDom_applyPatchReorderEndInsertsHelp(data.y, patch); // removals - domNode = applyPatchesHelp(domNode, data.patches); + domNode = _VirtualDom_applyPatchesHelp(domNode, data.w); // inserts - var inserts = data.inserts; + var inserts = data.x; for (var i = 0; i < inserts.length; i++) { var insert = inserts[i]; - var entry = insert.entry; - var node = entry.tag === 'move' - ? entry.data - : render(entry.vnode, patch.eventNode); - domNode.insertBefore(node, domNode.childNodes[insert.index]); + var entry = insert.A; + var node = entry.c === 2 + ? entry.s + : _VirtualDom_render(entry.z, patch.u); + domNode.insertBefore(node, domNode.childNodes[insert.r]); } // add end inserts - if (typeof frag !== 'undefined') + if (frag) { - domNode.appendChild(frag); + _VirtualDom_appendChild(domNode, frag); } return domNode; } -function applyPatchReorderEndInsertsHelp(endInserts, patch) +function _VirtualDom_applyPatchReorderEndInsertsHelp(endInserts, patch) { - if (typeof endInserts === 'undefined') + if (!endInserts) { return; } - var frag = localDoc.createDocumentFragment(); + var frag = _VirtualDom_doc.createDocumentFragment(); for (var i = 0; i < endInserts.length; i++) { var insert = endInserts[i]; - var entry = insert.entry; - frag.appendChild(entry.tag === 'move' - ? entry.data - : render(entry.vnode, patch.eventNode) + var entry = insert.A; + _VirtualDom_appendChild(frag, entry.c === 2 + ? entry.s + : _VirtualDom_render(entry.z, patch.u) ); } return frag; } -// PROGRAMS - -var program = makeProgram(checkNoFlags); -var programWithFlags = makeProgram(checkYesFlags); - -function makeProgram(flagChecker) +function _VirtualDom_virtualize(node) { - return F2(function(debugWrap, impl) - { - return function(flagDecoder) - { - return function(object, moduleName, debugMetadata) - { - var checker = flagChecker(flagDecoder, moduleName); - if (typeof debugMetadata === 'undefined') - { - normalSetup(impl, object, moduleName, checker); - } - else - { - debugSetup(A2(debugWrap, debugMetadata, impl), object, moduleName, checker); - } - }; - }; - }); -} + // TEXT NODES -function staticProgram(vNode) -{ - var nothing = _elm_lang$core$Native_Utils.Tuple2( - _elm_lang$core$Native_Utils.Tuple0, - _elm_lang$core$Platform_Cmd$none - ); - return A2(program, _elm_lang$virtual_dom$VirtualDom_Debug$wrap, { - init: nothing, - view: function() { return vNode; }, - update: F2(function() { return nothing; }), - subscriptions: function() { return _elm_lang$core$Platform_Sub$none; } - })(); -} + if (node.nodeType === 3) + { + return _VirtualDom_text(node.textContent); + } -// FLAG CHECKERS + // WEIRD NODES -function checkNoFlags(flagDecoder, moduleName) -{ - return function(init, flags, domNode) + if (node.nodeType !== 1) { - if (typeof flags === 'undefined') - { - return init; - } + return _VirtualDom_text(''); + } - var errorMessage = - 'The `' + moduleName + '` module does not need flags.\n' - + 'Initialize it with no arguments and you should be all set!'; - crash(errorMessage, domNode); - }; -} + // ELEMENT NODES -function checkYesFlags(flagDecoder, moduleName) -{ - return function(init, flags, domNode) + var attrList = _List_Nil; + var attrs = node.attributes; + for (var i = attrs.length; i--; ) { - if (typeof flagDecoder === 'undefined') - { - var errorMessage = - 'Are you trying to sneak a Never value into Elm? Trickster!\n' - + 'It looks like ' + moduleName + '.main is defined with `programWithFlags` but has type `Program Never`.\n' - + 'Use `program` instead if you do not want flags.' - - crash(errorMessage, domNode); - } - - var result = A2(_elm_lang$core$Native_Json.run, flagDecoder, flags); - if (result.ctor === 'Ok') - { - return init(result._0); - } + var attr = attrs[i]; + var name = attr.name; + var value = attr.value; + attrList = _List_Cons( A2(_VirtualDom_attribute, name, value), attrList ); + } - var errorMessage = - 'Trying to initialize the `' + moduleName + '` module with an unexpected flag.\n' - + 'I tried to convert it to an Elm value, but ran into this problem:\n\n' - + result._0; + var tag = node.tagName.toLowerCase(); + var kidList = _List_Nil; + var kids = node.childNodes; - crash(errorMessage, domNode); - }; + for (var i = kids.length; i--; ) + { + kidList = _List_Cons(_VirtualDom_virtualize(kids[i]), kidList); + } + return A3(_VirtualDom_node, tag, attrList, kidList); } -function crash(errorMessage, domNode) +function _VirtualDom_dekey(keyedNode) { - if (domNode) + var keyedKids = keyedNode.e; + var len = keyedKids.length; + var kids = new Array(len); + for (var i = 0; i < len; i++) { - domNode.innerHTML = - '
' - + '

Oops! Something went wrong when starting your Elm program.

' - + '
' + errorMessage + '
' - + '
'; + kids[i] = keyedKids[i].b; } - throw new Error(errorMessage); + return { + $: 1, + c: keyedNode.c, + d: keyedNode.d, + e: kids, + f: keyedNode.f, + b: keyedNode.b + }; } -// NORMAL SETUP -function normalSetup(impl, object, moduleName, flagChecker) +// ELEMENT + + +var _Debugger_element; + +var _Browser_element = _Debugger_element || F4(function(impl, flagDecoder, debugMetadata, args) { - object['embed'] = function embed(node, flags) - { - while (node.lastChild) - { - node.removeChild(node.lastChild); + return _Platform_initialize( + flagDecoder, + args, + impl.init, + impl.update, + impl.subscriptions, + function(sendToApp, initialModel) { + var view = impl.view; + /**_UNUSED/ + var domNode = args['node']; + //*/ + /**/ + var domNode = args && args['node'] ? args['node'] : _Debug_crash(0); + //*/ + var currNode = _VirtualDom_virtualize(domNode); + + return _Browser_makeAnimator(initialModel, function(model) + { + var nextNode = view(model); + var patches = _VirtualDom_diff(currNode, nextNode); + domNode = _VirtualDom_applyPatches(domNode, currNode, patches, sendToApp); + currNode = nextNode; + }); } + ); +}); - return _elm_lang$core$Native_Platform.initialize( - flagChecker(impl.init, flags, node), - impl.update, - impl.subscriptions, - normalRenderer(node, impl.view) - ); - }; - object['fullscreen'] = function fullscreen(flags) - { - return _elm_lang$core$Native_Platform.initialize( - flagChecker(impl.init, flags, document.body), - impl.update, - impl.subscriptions, - normalRenderer(document.body, impl.view) - ); - }; -} -function normalRenderer(parentNode, view) +// DOCUMENT + + +var _Debugger_document; + +var _Browser_document = _Debugger_document || F4(function(impl, flagDecoder, debugMetadata, args) { - return function(tagger, initialModel) - { - var eventNode = { tagger: tagger, parent: undefined }; - var initialVirtualNode = view(initialModel); - var domNode = render(initialVirtualNode, eventNode); - parentNode.appendChild(domNode); - return makeStepper(domNode, view, initialVirtualNode, eventNode); - }; -} + return _Platform_initialize( + flagDecoder, + args, + impl.init, + impl.update, + impl.subscriptions, + function(sendToApp, initialModel) { + var divertHrefToApp = impl.setup && impl.setup(sendToApp) + var view = impl.view; + var title = _VirtualDom_doc.title; + var bodyNode = _VirtualDom_doc.body; + var currNode = _VirtualDom_virtualize(bodyNode); + return _Browser_makeAnimator(initialModel, function(model) + { + _VirtualDom_divertHrefToApp = divertHrefToApp; + var doc = view(model); + var nextNode = _VirtualDom_node('body')(_List_Nil)(doc.body); + var patches = _VirtualDom_diff(currNode, nextNode); + bodyNode = _VirtualDom_applyPatches(bodyNode, currNode, patches, sendToApp); + currNode = nextNode; + _VirtualDom_divertHrefToApp = 0; + (title !== doc.title) && (_VirtualDom_doc.title = title = doc.title); + }); + } + ); +}); + -// STEPPER +// ANIMATION -var rAF = + +var _Browser_requestAnimationFrame = typeof requestAnimationFrame !== 'undefined' ? requestAnimationFrame : function(callback) { setTimeout(callback, 1000 / 60); }; -function makeStepper(domNode, view, initialVirtualNode, eventNode) + +function _Browser_makeAnimator(model, draw) { - var state = 'NO_REQUEST'; - var currNode = initialVirtualNode; - var nextModel; + draw(model); + + var state = 0; function updateIfNeeded() { - switch (state) - { - case 'NO_REQUEST': - throw new Error( - 'Unexpected draw callback.\n' + - 'Please report this to .' + state = state === 1 + ? 0 + : ( _Browser_requestAnimationFrame(updateIfNeeded), draw(model), 1 ); + } + + return function(nextModel, isSync) + { + model = nextModel; + + isSync + ? ( draw(model), + state === 2 && (state = 1) + ) + : ( state === 0 && _Browser_requestAnimationFrame(updateIfNeeded), + state = 2 ); + }; +} - case 'PENDING_REQUEST': - rAF(updateIfNeeded); - state = 'EXTRA_REQUEST'; - var nextNode = view(nextModel); - var patches = diff(currNode, nextNode); - domNode = applyPatches(domNode, currNode, patches, eventNode); - currNode = nextNode; - return; +// APPLICATION - case 'EXTRA_REQUEST': - state = 'NO_REQUEST'; - return; - } - } - return function stepper(model) - { - if (state === 'NO_REQUEST') +function _Browser_application(impl) +{ + var onUrlChange = impl.onUrlChange; + var onUrlRequest = impl.onUrlRequest; + var key = function() { key.a(onUrlChange(_Browser_getUrl())); }; + + return _Browser_document({ + setup: function(sendToApp) { - rAF(updateIfNeeded); - } - state = 'PENDING_REQUEST'; - nextModel = model; - }; + key.a = sendToApp; + _Browser_window.addEventListener('popstate', key); + _Browser_window.navigator.userAgent.indexOf('Trident') < 0 || _Browser_window.addEventListener('hashchange', key); + + return F2(function(domNode, event) + { + if (!event.ctrlKey && !event.metaKey && !event.shiftKey && event.button < 1 && !domNode.target && !domNode.download) + { + event.preventDefault(); + var href = domNode.href; + var curr = _Browser_getUrl(); + var next = $elm$url$Url$fromString(href).a; + sendToApp(onUrlRequest( + (next + && curr.protocol === next.protocol + && curr.host === next.host + && curr.port_.a === next.port_.a + ) + ? $elm$browser$Browser$Internal(next) + : $elm$browser$Browser$External(href) + )); + } + }); + }, + init: function(flags) + { + return A3(impl.init, flags, _Browser_getUrl(), key); + }, + view: impl.view, + update: impl.update, + subscriptions: impl.subscriptions + }); } +function _Browser_getUrl() +{ + return $elm$url$Url$fromString(_VirtualDom_doc.location.href).a || _Debug_crash(1); +} -// DEBUG SETUP +var _Browser_go = F2(function(key, n) +{ + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() { + n && history.go(n); + key(); + })); +}); -function debugSetup(impl, object, moduleName, flagChecker) +var _Browser_pushUrl = F2(function(key, url) { - object['fullscreen'] = function fullscreen(flags) - { - var popoutRef = { doc: undefined }; - return _elm_lang$core$Native_Platform.initialize( - flagChecker(impl.init, flags, document.body), - impl.update(scrollTask(popoutRef)), - impl.subscriptions, - debugRenderer(moduleName, document.body, popoutRef, impl.view, impl.viewIn, impl.viewOut) - ); - }; + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() { + history.pushState({}, '', url); + key(); + })); +}); + +var _Browser_replaceUrl = F2(function(key, url) +{ + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() { + history.replaceState({}, '', url); + key(); + })); +}); + + + +// GLOBAL EVENTS - object['embed'] = function fullscreen(node, flags) + +var _Browser_fakeNode = { addEventListener: function() {}, removeEventListener: function() {} }; +var _Browser_doc = typeof document !== 'undefined' ? document : _Browser_fakeNode; +var _Browser_window = typeof window !== 'undefined' ? window : _Browser_fakeNode; + +var _Browser_on = F3(function(node, eventName, sendToSelf) +{ + return _Scheduler_spawn(_Scheduler_binding(function(callback) { - var popoutRef = { doc: undefined }; - return _elm_lang$core$Native_Platform.initialize( - flagChecker(impl.init, flags, node), - impl.update(scrollTask(popoutRef)), - impl.subscriptions, - debugRenderer(moduleName, node, popoutRef, impl.view, impl.viewIn, impl.viewOut) - ); - }; + function handler(event) { _Scheduler_rawSpawn(sendToSelf(event)); } + node.addEventListener(eventName, handler, _VirtualDom_passiveSupported && { passive: true }); + return function() { node.removeEventListener(eventName, handler); }; + })); +}); + +var _Browser_decodeEvent = F2(function(decoder, event) +{ + var result = _Json_runHelp(decoder, event); + return $elm$core$Result$isOk(result) ? $elm$core$Maybe$Just(result.a) : $elm$core$Maybe$Nothing; +}); + + + +// PAGE VISIBILITY + + +function _Browser_visibilityInfo() +{ + return (typeof _VirtualDom_doc.hidden !== 'undefined') + ? { hidden: 'hidden', change: 'visibilitychange' } + : + (typeof _VirtualDom_doc.mozHidden !== 'undefined') + ? { hidden: 'mozHidden', change: 'mozvisibilitychange' } + : + (typeof _VirtualDom_doc.msHidden !== 'undefined') + ? { hidden: 'msHidden', change: 'msvisibilitychange' } + : + (typeof _VirtualDom_doc.webkitHidden !== 'undefined') + ? { hidden: 'webkitHidden', change: 'webkitvisibilitychange' } + : { hidden: 'hidden', change: 'visibilitychange' }; } -function scrollTask(popoutRef) + + +// ANIMATION FRAMES + + +function _Browser_rAF() { - return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) + return _Scheduler_binding(function(callback) { - var doc = popoutRef.doc; - if (doc) - { - var msgs = doc.getElementsByClassName('debugger-sidebar-messages')[0]; - if (msgs) - { - msgs.scrollTop = msgs.scrollHeight; - } - } - callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0)); + var id = requestAnimationFrame(function() { + callback(_Scheduler_succeed(Date.now())); + }); + + return function() { + cancelAnimationFrame(id); + }; }); } -function debugRenderer(moduleName, parentNode, popoutRef, view, viewIn, viewOut) +function _Browser_now() { - return function(tagger, initialModel) + return _Scheduler_binding(function(callback) { - var appEventNode = { tagger: tagger, parent: undefined }; - var eventNode = { tagger: tagger, parent: undefined }; + callback(_Scheduler_succeed(Date.now())); + }); +} - // make normal stepper - var appVirtualNode = view(initialModel); - var appNode = render(appVirtualNode, appEventNode); - parentNode.appendChild(appNode); - var appStepper = makeStepper(appNode, view, appVirtualNode, appEventNode); - // make overlay stepper - var overVirtualNode = viewIn(initialModel)._1; - var overNode = render(overVirtualNode, eventNode); - parentNode.appendChild(overNode); - var wrappedViewIn = wrapViewIn(appEventNode, overNode, viewIn); - var overStepper = makeStepper(overNode, wrappedViewIn, overVirtualNode, eventNode); - // make debugger stepper - var debugStepper = makeDebugStepper(initialModel, viewOut, eventNode, parentNode, moduleName, popoutRef); +// DOM STUFF - return function stepper(model) - { - appStepper(model); - overStepper(model); - debugStepper(model); - } - }; -} -function makeDebugStepper(initialModel, view, eventNode, parentNode, moduleName, popoutRef) +function _Browser_withNode(id, doStuff) { - var curr; - var domNode; - - return function stepper(model) + return _Scheduler_binding(function(callback) { - if (!model.isDebuggerOpen) - { - return; - } + _Browser_requestAnimationFrame(function() { + var node = document.getElementById(id); + callback(node + ? _Scheduler_succeed(doStuff(node)) + : _Scheduler_fail($elm$browser$Browser$Dom$NotFound(id)) + ); + }); + }); +} - if (!popoutRef.doc) - { - curr = view(model); - domNode = openDebugWindow(moduleName, popoutRef, curr, eventNode); - return; - } - // switch to document of popout - localDoc = popoutRef.doc; +function _Browser_withWindow(doStuff) +{ + return _Scheduler_binding(function(callback) + { + _Browser_requestAnimationFrame(function() { + callback(_Scheduler_succeed(doStuff())); + }); + }); +} + - var next = view(model); - var patches = diff(curr, next); - domNode = applyPatches(domNode, curr, patches, eventNode); - curr = next; +// FOCUS and BLUR - // switch back to normal document - localDoc = document; - }; -} -function openDebugWindow(moduleName, popoutRef, virtualNode, eventNode) +var _Browser_call = F2(function(functionName, id) { - var w = 900; - var h = 360; - var x = screen.width - w; - var y = screen.height - h; - var debugWindow = window.open('', '', 'width=' + w + ',height=' + h + ',left=' + x + ',top=' + y); + return _Browser_withNode(id, function(node) { + node[functionName](); + return _Utils_Tuple0; + }); +}); - // switch to window document - localDoc = debugWindow.document; - popoutRef.doc = localDoc; - localDoc.title = 'Debugger - ' + moduleName; - localDoc.body.style.margin = '0'; - localDoc.body.style.padding = '0'; - var domNode = render(virtualNode, eventNode); - localDoc.body.appendChild(domNode); - localDoc.addEventListener('keydown', function(event) { - if (event.metaKey && event.which === 82) - { - window.location.reload(); - } - if (event.which === 38) - { - eventNode.tagger({ ctor: 'Up' }); - event.preventDefault(); - } - if (event.which === 40) - { - eventNode.tagger({ ctor: 'Down' }); - event.preventDefault(); +// WINDOW VIEWPORT + + +function _Browser_getViewport() +{ + return { + scene: _Browser_getScene(), + viewport: { + x: _Browser_window.pageXOffset, + y: _Browser_window.pageYOffset, + width: _Browser_doc.documentElement.clientWidth, + height: _Browser_doc.documentElement.clientHeight } - }); + }; +} + +function _Browser_getScene() +{ + var body = _Browser_doc.body; + var elem = _Browser_doc.documentElement; + return { + width: Math.max(body.scrollWidth, body.offsetWidth, elem.scrollWidth, elem.offsetWidth, elem.clientWidth), + height: Math.max(body.scrollHeight, body.offsetHeight, elem.scrollHeight, elem.offsetHeight, elem.clientHeight) + }; +} - function close() +var _Browser_setViewport = F2(function(x, y) +{ + return _Browser_withWindow(function() { - popoutRef.doc = undefined; - debugWindow.close(); - } - window.addEventListener('unload', close); - debugWindow.addEventListener('unload', function() { - popoutRef.doc = undefined; - window.removeEventListener('unload', close); - eventNode.tagger({ ctor: 'Close' }); + _Browser_window.scroll(x, y); + return _Utils_Tuple0; }); +}); - // switch back to the normal document - localDoc = document; - return domNode; -} +// ELEMENT VIEWPORT -// BLOCK EVENTS -function wrapViewIn(appEventNode, overlayNode, viewIn) +function _Browser_getViewportOf(id) { - var ignorer = makeIgnorer(overlayNode); - var blocking = 'Normal'; - var overflow; + return _Browser_withNode(id, function(node) + { + return { + scene: { + width: node.scrollWidth, + height: node.scrollHeight + }, + viewport: { + x: node.scrollLeft, + y: node.scrollTop, + width: node.clientWidth, + height: node.clientHeight + } + }; + }); +} - var normalTagger = appEventNode.tagger; - var blockTagger = function() {}; - return function(model) +var _Browser_setViewportOf = F3(function(id, x, y) +{ + return _Browser_withNode(id, function(node) { - var tuple = viewIn(model); - var newBlocking = tuple._0.ctor; - appEventNode.tagger = newBlocking === 'Normal' ? normalTagger : blockTagger; - if (blocking !== newBlocking) - { - traverse('removeEventListener', ignorer, blocking); - traverse('addEventListener', ignorer, newBlocking); + node.scrollLeft = x; + node.scrollTop = y; + return _Utils_Tuple0; + }); +}); - if (blocking === 'Normal') - { - overflow = document.body.style.overflow; - document.body.style.overflow = 'hidden'; - } - if (newBlocking === 'Normal') - { - document.body.style.overflow = overflow; - } - blocking = newBlocking; - } - return tuple._1; - } -} +// ELEMENT -function traverse(verbEventListener, ignorer, blocking) + +function _Browser_getElement(id) { - switch(blocking) + return _Browser_withNode(id, function(node) { - case 'Normal': - return; + var rect = node.getBoundingClientRect(); + var x = _Browser_window.pageXOffset; + var y = _Browser_window.pageYOffset; + return { + scene: _Browser_getScene(), + viewport: { + x: x, + y: y, + width: _Browser_doc.documentElement.clientWidth, + height: _Browser_doc.documentElement.clientHeight + }, + element: { + x: x + rect.left, + y: y + rect.top, + width: rect.width, + height: rect.height + } + }; + }); +} - case 'Pause': - return traverseHelp(verbEventListener, ignorer, mostEvents); - case 'Message': - return traverseHelp(verbEventListener, ignorer, allEvents); - } -} -function traverseHelp(verbEventListener, handler, eventNames) +// LOAD and RELOAD + + +function _Browser_reload(skipCache) { - for (var i = 0; i < eventNames.length; i++) + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback) { - document.body[verbEventListener](eventNames[i], handler, true); - } + _VirtualDom_doc.location.reload(skipCache); + })); } -function makeIgnorer(overlayNode) +function _Browser_load(url) { - return function(event) + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback) { - if (event.type === 'keydown' && event.metaKey && event.which === 82) + try { - return; + _Browser_window.location = url; + } + catch(err) + { + // Only Firefox can throw a NS_ERROR_MALFORMED_URI exception here. + // Other browsers reload the page, so let's be consistent about that. + _VirtualDom_doc.location.reload(false); } + })); +} - var isScroll = event.type === 'scroll' || event.type === 'wheel'; - var node = event.target; - while (node !== null) - { - if (node.className === 'elm-overlay-message-details' && isScroll) - { - return; - } - if (node === overlayNode && !isScroll) - { - return; - } - node = node.parentNode; - } +var _Bitwise_and = F2(function(a, b) +{ + return a & b; +}); - event.stopPropagation(); - event.preventDefault(); - } -} +var _Bitwise_or = F2(function(a, b) +{ + return a | b; +}); -var mostEvents = [ - 'click', 'dblclick', 'mousemove', - 'mouseup', 'mousedown', 'mouseenter', 'mouseleave', - 'touchstart', 'touchend', 'touchcancel', 'touchmove', - 'pointerdown', 'pointerup', 'pointerover', 'pointerout', - 'pointerenter', 'pointerleave', 'pointermove', 'pointercancel', - 'dragstart', 'drag', 'dragend', 'dragenter', 'dragover', 'dragleave', 'drop', - 'keyup', 'keydown', 'keypress', - 'input', 'change', - 'focus', 'blur' -]; - -var allEvents = mostEvents.concat('wheel', 'scroll'); - - -return { - node: node, - text: text, - custom: custom, - map: F2(map), - - on: F3(on), - style: style, - property: F2(property), - attribute: F2(attribute), - attributeNS: F3(attributeNS), - mapProperty: F2(mapProperty), - - lazy: F2(lazy), - lazy2: F3(lazy2), - lazy3: F4(lazy3), - keyedNode: F3(keyedNode), - - program: program, - programWithFlags: programWithFlags, - staticProgram: staticProgram +var _Bitwise_xor = F2(function(a, b) +{ + return a ^ b; +}); + +function _Bitwise_complement(a) +{ + return ~a; }; -}(); +var _Bitwise_shiftLeftBy = F2(function(offset, a) +{ + return a << offset; +}); + +var _Bitwise_shiftRightBy = F2(function(offset, a) +{ + return a >> offset; +}); -var _elm_lang$virtual_dom$VirtualDom$programWithFlags = function (impl) { - return A2(_elm_lang$virtual_dom$Native_VirtualDom.programWithFlags, _elm_lang$virtual_dom$VirtualDom_Debug$wrapWithFlags, impl); -}; -var _elm_lang$virtual_dom$VirtualDom$program = function (impl) { - return A2(_elm_lang$virtual_dom$Native_VirtualDom.program, _elm_lang$virtual_dom$VirtualDom_Debug$wrap, impl); -}; -var _elm_lang$virtual_dom$VirtualDom$keyedNode = _elm_lang$virtual_dom$Native_VirtualDom.keyedNode; -var _elm_lang$virtual_dom$VirtualDom$lazy3 = _elm_lang$virtual_dom$Native_VirtualDom.lazy3; -var _elm_lang$virtual_dom$VirtualDom$lazy2 = _elm_lang$virtual_dom$Native_VirtualDom.lazy2; -var _elm_lang$virtual_dom$VirtualDom$lazy = _elm_lang$virtual_dom$Native_VirtualDom.lazy; -var _elm_lang$virtual_dom$VirtualDom$defaultOptions = {stopPropagation: false, preventDefault: false}; -var _elm_lang$virtual_dom$VirtualDom$onWithOptions = _elm_lang$virtual_dom$Native_VirtualDom.on; -var _elm_lang$virtual_dom$VirtualDom$on = F2( - function (eventName, decoder) { - return A3(_elm_lang$virtual_dom$VirtualDom$onWithOptions, eventName, _elm_lang$virtual_dom$VirtualDom$defaultOptions, decoder); - }); -var _elm_lang$virtual_dom$VirtualDom$style = _elm_lang$virtual_dom$Native_VirtualDom.style; -var _elm_lang$virtual_dom$VirtualDom$mapProperty = _elm_lang$virtual_dom$Native_VirtualDom.mapProperty; -var _elm_lang$virtual_dom$VirtualDom$attributeNS = _elm_lang$virtual_dom$Native_VirtualDom.attributeNS; -var _elm_lang$virtual_dom$VirtualDom$attribute = _elm_lang$virtual_dom$Native_VirtualDom.attribute; -var _elm_lang$virtual_dom$VirtualDom$property = _elm_lang$virtual_dom$Native_VirtualDom.property; -var _elm_lang$virtual_dom$VirtualDom$map = _elm_lang$virtual_dom$Native_VirtualDom.map; -var _elm_lang$virtual_dom$VirtualDom$text = _elm_lang$virtual_dom$Native_VirtualDom.text; -var _elm_lang$virtual_dom$VirtualDom$node = _elm_lang$virtual_dom$Native_VirtualDom.node; -var _elm_lang$virtual_dom$VirtualDom$Options = F2( - function (a, b) { - return {stopPropagation: a, preventDefault: b}; +var _Bitwise_shiftRightZfBy = F2(function(offset, a) +{ + return a >>> offset; +}); +var $elm$core$Basics$EQ = {$: 'EQ'}; +var $elm$core$Basics$LT = {$: 'LT'}; +var $elm$core$List$cons = _List_cons; +var $elm$core$Elm$JsArray$foldr = _JsArray_foldr; +var $elm$core$Array$foldr = F3( + function (func, baseCase, _v0) { + var tree = _v0.c; + var tail = _v0.d; + var helper = F2( + function (node, acc) { + if (node.$ === 'SubTree') { + var subTree = node.a; + return A3($elm$core$Elm$JsArray$foldr, helper, acc, subTree); + } else { + var values = node.a; + return A3($elm$core$Elm$JsArray$foldr, func, acc, values); + } + }); + return A3( + $elm$core$Elm$JsArray$foldr, + helper, + A3($elm$core$Elm$JsArray$foldr, func, baseCase, tail), + tree); }); -var _elm_lang$virtual_dom$VirtualDom$Node = {ctor: 'Node'}; -var _elm_lang$virtual_dom$VirtualDom$Property = {ctor: 'Property'}; - -var _elm_lang$html$Html$programWithFlags = _elm_lang$virtual_dom$VirtualDom$programWithFlags; -var _elm_lang$html$Html$program = _elm_lang$virtual_dom$VirtualDom$program; -var _elm_lang$html$Html$beginnerProgram = function (_p0) { - var _p1 = _p0; - return _elm_lang$html$Html$program( - { - init: A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _p1.model, - {ctor: '[]'}), - update: F2( - function (msg, model) { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - A2(_p1.update, msg, model), - {ctor: '[]'}); - }), - view: _p1.view, - subscriptions: function (_p2) { - return _elm_lang$core$Platform_Sub$none; - } - }); -}; -var _elm_lang$html$Html$map = _elm_lang$virtual_dom$VirtualDom$map; -var _elm_lang$html$Html$text = _elm_lang$virtual_dom$VirtualDom$text; -var _elm_lang$html$Html$node = _elm_lang$virtual_dom$VirtualDom$node; -var _elm_lang$html$Html$body = _elm_lang$html$Html$node('body'); -var _elm_lang$html$Html$section = _elm_lang$html$Html$node('section'); -var _elm_lang$html$Html$nav = _elm_lang$html$Html$node('nav'); -var _elm_lang$html$Html$article = _elm_lang$html$Html$node('article'); -var _elm_lang$html$Html$aside = _elm_lang$html$Html$node('aside'); -var _elm_lang$html$Html$h1 = _elm_lang$html$Html$node('h1'); -var _elm_lang$html$Html$h2 = _elm_lang$html$Html$node('h2'); -var _elm_lang$html$Html$h3 = _elm_lang$html$Html$node('h3'); -var _elm_lang$html$Html$h4 = _elm_lang$html$Html$node('h4'); -var _elm_lang$html$Html$h5 = _elm_lang$html$Html$node('h5'); -var _elm_lang$html$Html$h6 = _elm_lang$html$Html$node('h6'); -var _elm_lang$html$Html$header = _elm_lang$html$Html$node('header'); -var _elm_lang$html$Html$footer = _elm_lang$html$Html$node('footer'); -var _elm_lang$html$Html$address = _elm_lang$html$Html$node('address'); -var _elm_lang$html$Html$main_ = _elm_lang$html$Html$node('main'); -var _elm_lang$html$Html$p = _elm_lang$html$Html$node('p'); -var _elm_lang$html$Html$hr = _elm_lang$html$Html$node('hr'); -var _elm_lang$html$Html$pre = _elm_lang$html$Html$node('pre'); -var _elm_lang$html$Html$blockquote = _elm_lang$html$Html$node('blockquote'); -var _elm_lang$html$Html$ol = _elm_lang$html$Html$node('ol'); -var _elm_lang$html$Html$ul = _elm_lang$html$Html$node('ul'); -var _elm_lang$html$Html$li = _elm_lang$html$Html$node('li'); -var _elm_lang$html$Html$dl = _elm_lang$html$Html$node('dl'); -var _elm_lang$html$Html$dt = _elm_lang$html$Html$node('dt'); -var _elm_lang$html$Html$dd = _elm_lang$html$Html$node('dd'); -var _elm_lang$html$Html$figure = _elm_lang$html$Html$node('figure'); -var _elm_lang$html$Html$figcaption = _elm_lang$html$Html$node('figcaption'); -var _elm_lang$html$Html$div = _elm_lang$html$Html$node('div'); -var _elm_lang$html$Html$a = _elm_lang$html$Html$node('a'); -var _elm_lang$html$Html$em = _elm_lang$html$Html$node('em'); -var _elm_lang$html$Html$strong = _elm_lang$html$Html$node('strong'); -var _elm_lang$html$Html$small = _elm_lang$html$Html$node('small'); -var _elm_lang$html$Html$s = _elm_lang$html$Html$node('s'); -var _elm_lang$html$Html$cite = _elm_lang$html$Html$node('cite'); -var _elm_lang$html$Html$q = _elm_lang$html$Html$node('q'); -var _elm_lang$html$Html$dfn = _elm_lang$html$Html$node('dfn'); -var _elm_lang$html$Html$abbr = _elm_lang$html$Html$node('abbr'); -var _elm_lang$html$Html$time = _elm_lang$html$Html$node('time'); -var _elm_lang$html$Html$code = _elm_lang$html$Html$node('code'); -var _elm_lang$html$Html$var = _elm_lang$html$Html$node('var'); -var _elm_lang$html$Html$samp = _elm_lang$html$Html$node('samp'); -var _elm_lang$html$Html$kbd = _elm_lang$html$Html$node('kbd'); -var _elm_lang$html$Html$sub = _elm_lang$html$Html$node('sub'); -var _elm_lang$html$Html$sup = _elm_lang$html$Html$node('sup'); -var _elm_lang$html$Html$i = _elm_lang$html$Html$node('i'); -var _elm_lang$html$Html$b = _elm_lang$html$Html$node('b'); -var _elm_lang$html$Html$u = _elm_lang$html$Html$node('u'); -var _elm_lang$html$Html$mark = _elm_lang$html$Html$node('mark'); -var _elm_lang$html$Html$ruby = _elm_lang$html$Html$node('ruby'); -var _elm_lang$html$Html$rt = _elm_lang$html$Html$node('rt'); -var _elm_lang$html$Html$rp = _elm_lang$html$Html$node('rp'); -var _elm_lang$html$Html$bdi = _elm_lang$html$Html$node('bdi'); -var _elm_lang$html$Html$bdo = _elm_lang$html$Html$node('bdo'); -var _elm_lang$html$Html$span = _elm_lang$html$Html$node('span'); -var _elm_lang$html$Html$br = _elm_lang$html$Html$node('br'); -var _elm_lang$html$Html$wbr = _elm_lang$html$Html$node('wbr'); -var _elm_lang$html$Html$ins = _elm_lang$html$Html$node('ins'); -var _elm_lang$html$Html$del = _elm_lang$html$Html$node('del'); -var _elm_lang$html$Html$img = _elm_lang$html$Html$node('img'); -var _elm_lang$html$Html$iframe = _elm_lang$html$Html$node('iframe'); -var _elm_lang$html$Html$embed = _elm_lang$html$Html$node('embed'); -var _elm_lang$html$Html$object = _elm_lang$html$Html$node('object'); -var _elm_lang$html$Html$param = _elm_lang$html$Html$node('param'); -var _elm_lang$html$Html$video = _elm_lang$html$Html$node('video'); -var _elm_lang$html$Html$audio = _elm_lang$html$Html$node('audio'); -var _elm_lang$html$Html$source = _elm_lang$html$Html$node('source'); -var _elm_lang$html$Html$track = _elm_lang$html$Html$node('track'); -var _elm_lang$html$Html$canvas = _elm_lang$html$Html$node('canvas'); -var _elm_lang$html$Html$math = _elm_lang$html$Html$node('math'); -var _elm_lang$html$Html$table = _elm_lang$html$Html$node('table'); -var _elm_lang$html$Html$caption = _elm_lang$html$Html$node('caption'); -var _elm_lang$html$Html$colgroup = _elm_lang$html$Html$node('colgroup'); -var _elm_lang$html$Html$col = _elm_lang$html$Html$node('col'); -var _elm_lang$html$Html$tbody = _elm_lang$html$Html$node('tbody'); -var _elm_lang$html$Html$thead = _elm_lang$html$Html$node('thead'); -var _elm_lang$html$Html$tfoot = _elm_lang$html$Html$node('tfoot'); -var _elm_lang$html$Html$tr = _elm_lang$html$Html$node('tr'); -var _elm_lang$html$Html$td = _elm_lang$html$Html$node('td'); -var _elm_lang$html$Html$th = _elm_lang$html$Html$node('th'); -var _elm_lang$html$Html$form = _elm_lang$html$Html$node('form'); -var _elm_lang$html$Html$fieldset = _elm_lang$html$Html$node('fieldset'); -var _elm_lang$html$Html$legend = _elm_lang$html$Html$node('legend'); -var _elm_lang$html$Html$label = _elm_lang$html$Html$node('label'); -var _elm_lang$html$Html$input = _elm_lang$html$Html$node('input'); -var _elm_lang$html$Html$button = _elm_lang$html$Html$node('button'); -var _elm_lang$html$Html$select = _elm_lang$html$Html$node('select'); -var _elm_lang$html$Html$datalist = _elm_lang$html$Html$node('datalist'); -var _elm_lang$html$Html$optgroup = _elm_lang$html$Html$node('optgroup'); -var _elm_lang$html$Html$option = _elm_lang$html$Html$node('option'); -var _elm_lang$html$Html$textarea = _elm_lang$html$Html$node('textarea'); -var _elm_lang$html$Html$keygen = _elm_lang$html$Html$node('keygen'); -var _elm_lang$html$Html$output = _elm_lang$html$Html$node('output'); -var _elm_lang$html$Html$progress = _elm_lang$html$Html$node('progress'); -var _elm_lang$html$Html$meter = _elm_lang$html$Html$node('meter'); -var _elm_lang$html$Html$details = _elm_lang$html$Html$node('details'); -var _elm_lang$html$Html$summary = _elm_lang$html$Html$node('summary'); -var _elm_lang$html$Html$menuitem = _elm_lang$html$Html$node('menuitem'); -var _elm_lang$html$Html$menu = _elm_lang$html$Html$node('menu'); - -var _elm_lang$html$Html_Attributes$map = _elm_lang$virtual_dom$VirtualDom$mapProperty; -var _elm_lang$html$Html_Attributes$attribute = _elm_lang$virtual_dom$VirtualDom$attribute; -var _elm_lang$html$Html_Attributes$contextmenu = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'contextmenu', value); -}; -var _elm_lang$html$Html_Attributes$draggable = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'draggable', value); -}; -var _elm_lang$html$Html_Attributes$itemprop = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'itemprop', value); -}; -var _elm_lang$html$Html_Attributes$tabindex = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'tabIndex', - _elm_lang$core$Basics$toString(n)); -}; -var _elm_lang$html$Html_Attributes$charset = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'charset', value); -}; -var _elm_lang$html$Html_Attributes$height = function (value) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'height', - _elm_lang$core$Basics$toString(value)); -}; -var _elm_lang$html$Html_Attributes$width = function (value) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'width', - _elm_lang$core$Basics$toString(value)); -}; -var _elm_lang$html$Html_Attributes$formaction = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'formAction', value); -}; -var _elm_lang$html$Html_Attributes$list = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'list', value); -}; -var _elm_lang$html$Html_Attributes$minlength = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'minLength', - _elm_lang$core$Basics$toString(n)); -}; -var _elm_lang$html$Html_Attributes$maxlength = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'maxlength', - _elm_lang$core$Basics$toString(n)); -}; -var _elm_lang$html$Html_Attributes$size = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'size', - _elm_lang$core$Basics$toString(n)); -}; -var _elm_lang$html$Html_Attributes$form = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'form', value); -}; -var _elm_lang$html$Html_Attributes$cols = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'cols', - _elm_lang$core$Basics$toString(n)); -}; -var _elm_lang$html$Html_Attributes$rows = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'rows', - _elm_lang$core$Basics$toString(n)); +var $elm$core$Array$toList = function (array) { + return A3($elm$core$Array$foldr, $elm$core$List$cons, _List_Nil, array); }; -var _elm_lang$html$Html_Attributes$challenge = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'challenge', value); -}; -var _elm_lang$html$Html_Attributes$media = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'media', value); -}; -var _elm_lang$html$Html_Attributes$rel = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'rel', value); +var $elm$core$Dict$foldr = F3( + function (func, acc, t) { + foldr: + while (true) { + if (t.$ === 'RBEmpty_elm_builtin') { + return acc; + } else { + var key = t.b; + var value = t.c; + var left = t.d; + var right = t.e; + var $temp$func = func, + $temp$acc = A3( + func, + key, + value, + A3($elm$core$Dict$foldr, func, acc, right)), + $temp$t = left; + func = $temp$func; + acc = $temp$acc; + t = $temp$t; + continue foldr; + } + } + }); +var $elm$core$Dict$toList = function (dict) { + return A3( + $elm$core$Dict$foldr, + F3( + function (key, value, list) { + return A2( + $elm$core$List$cons, + _Utils_Tuple2(key, value), + list); + }), + _List_Nil, + dict); }; -var _elm_lang$html$Html_Attributes$datetime = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'datetime', value); +var $elm$core$Dict$keys = function (dict) { + return A3( + $elm$core$Dict$foldr, + F3( + function (key, value, keyList) { + return A2($elm$core$List$cons, key, keyList); + }), + _List_Nil, + dict); }; -var _elm_lang$html$Html_Attributes$pubdate = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'pubdate', value); +var $elm$core$Set$toList = function (_v0) { + var dict = _v0.a; + return $elm$core$Dict$keys(dict); }; -var _elm_lang$html$Html_Attributes$colspan = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'colspan', - _elm_lang$core$Basics$toString(n)); +var $elm$core$Basics$GT = {$: 'GT'}; +var $elm$core$Maybe$Just = function (a) { + return {$: 'Just', a: a}; }; -var _elm_lang$html$Html_Attributes$rowspan = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'rowspan', - _elm_lang$core$Basics$toString(n)); +var $elm$core$Maybe$destruct = F3( + function (_default, func, maybe) { + if (maybe.$ === 'Just') { + var a = maybe.a; + return func(a); + } else { + return _default; + } + }); +var $elm$core$Basics$identity = function (x) { + return x; }; -var _elm_lang$html$Html_Attributes$manifest = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'manifest', value); +var $elm$core$Result$Err = function (a) { + return {$: 'Err', a: a}; }; -var _elm_lang$html$Html_Attributes$property = _elm_lang$virtual_dom$VirtualDom$property; -var _elm_lang$html$Html_Attributes$stringProperty = F2( - function (name, string) { +var $elm$json$Json$Decode$Failure = F2( + function (a, b) { + return {$: 'Failure', a: a, b: b}; + }); +var $elm$json$Json$Decode$Field = F2( + function (a, b) { + return {$: 'Field', a: a, b: b}; + }); +var $elm$json$Json$Decode$Index = F2( + function (a, b) { + return {$: 'Index', a: a, b: b}; + }); +var $elm$core$Result$Ok = function (a) { + return {$: 'Ok', a: a}; +}; +var $elm$json$Json$Decode$OneOf = function (a) { + return {$: 'OneOf', a: a}; +}; +var $elm$core$Basics$False = {$: 'False'}; +var $elm$core$Basics$add = _Basics_add; +var $elm$core$Maybe$Nothing = {$: 'Nothing'}; +var $elm$core$String$all = _String_all; +var $elm$core$Basics$and = _Basics_and; +var $elm$core$Basics$append = _Utils_append; +var $elm$json$Json$Encode$encode = _Json_encode; +var $elm$core$String$fromInt = _String_fromNumber; +var $elm$core$String$join = F2( + function (sep, chunks) { return A2( - _elm_lang$html$Html_Attributes$property, - name, - _elm_lang$core$Json_Encode$string(string)); + _String_join, + sep, + _List_toArray(chunks)); }); -var _elm_lang$html$Html_Attributes$class = function (name) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'className', name); -}; -var _elm_lang$html$Html_Attributes$id = function (name) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'id', name); -}; -var _elm_lang$html$Html_Attributes$title = function (name) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'title', name); -}; -var _elm_lang$html$Html_Attributes$accesskey = function ($char) { - return A2( - _elm_lang$html$Html_Attributes$stringProperty, - 'accessKey', - _elm_lang$core$String$fromChar($char)); -}; -var _elm_lang$html$Html_Attributes$dir = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'dir', value); -}; -var _elm_lang$html$Html_Attributes$dropzone = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'dropzone', value); -}; -var _elm_lang$html$Html_Attributes$lang = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'lang', value); -}; -var _elm_lang$html$Html_Attributes$content = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'content', value); -}; -var _elm_lang$html$Html_Attributes$httpEquiv = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'httpEquiv', value); -}; -var _elm_lang$html$Html_Attributes$language = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'language', value); -}; -var _elm_lang$html$Html_Attributes$src = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'src', value); -}; -var _elm_lang$html$Html_Attributes$alt = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'alt', value); -}; -var _elm_lang$html$Html_Attributes$preload = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'preload', value); -}; -var _elm_lang$html$Html_Attributes$poster = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'poster', value); -}; -var _elm_lang$html$Html_Attributes$kind = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'kind', value); -}; -var _elm_lang$html$Html_Attributes$srclang = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'srclang', value); -}; -var _elm_lang$html$Html_Attributes$sandbox = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'sandbox', value); -}; -var _elm_lang$html$Html_Attributes$srcdoc = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'srcdoc', value); -}; -var _elm_lang$html$Html_Attributes$type_ = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'type', value); -}; -var _elm_lang$html$Html_Attributes$value = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'value', value); -}; -var _elm_lang$html$Html_Attributes$defaultValue = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'defaultValue', value); -}; -var _elm_lang$html$Html_Attributes$placeholder = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'placeholder', value); -}; -var _elm_lang$html$Html_Attributes$accept = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'accept', value); -}; -var _elm_lang$html$Html_Attributes$acceptCharset = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'acceptCharset', value); -}; -var _elm_lang$html$Html_Attributes$action = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'action', value); -}; -var _elm_lang$html$Html_Attributes$autocomplete = function (bool) { - return A2( - _elm_lang$html$Html_Attributes$stringProperty, - 'autocomplete', - bool ? 'on' : 'off'); -}; -var _elm_lang$html$Html_Attributes$enctype = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'enctype', value); -}; -var _elm_lang$html$Html_Attributes$method = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'method', value); -}; -var _elm_lang$html$Html_Attributes$name = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'name', value); -}; -var _elm_lang$html$Html_Attributes$pattern = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'pattern', value); -}; -var _elm_lang$html$Html_Attributes$for = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'htmlFor', value); -}; -var _elm_lang$html$Html_Attributes$max = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'max', value); -}; -var _elm_lang$html$Html_Attributes$min = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'min', value); -}; -var _elm_lang$html$Html_Attributes$step = function (n) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'step', n); -}; -var _elm_lang$html$Html_Attributes$wrap = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'wrap', value); -}; -var _elm_lang$html$Html_Attributes$usemap = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'useMap', value); -}; -var _elm_lang$html$Html_Attributes$shape = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'shape', value); -}; -var _elm_lang$html$Html_Attributes$coords = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'coords', value); -}; -var _elm_lang$html$Html_Attributes$keytype = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'keytype', value); -}; -var _elm_lang$html$Html_Attributes$align = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'align', value); -}; -var _elm_lang$html$Html_Attributes$cite = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'cite', value); -}; -var _elm_lang$html$Html_Attributes$href = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'href', value); -}; -var _elm_lang$html$Html_Attributes$target = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'target', value); -}; -var _elm_lang$html$Html_Attributes$downloadAs = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'download', value); -}; -var _elm_lang$html$Html_Attributes$hreflang = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'hreflang', value); -}; -var _elm_lang$html$Html_Attributes$ping = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'ping', value); -}; -var _elm_lang$html$Html_Attributes$start = function (n) { +var $elm$core$String$split = F2( + function (sep, string) { + return _List_fromArray( + A2(_String_split, sep, string)); + }); +var $elm$json$Json$Decode$indent = function (str) { return A2( - _elm_lang$html$Html_Attributes$stringProperty, - 'start', - _elm_lang$core$Basics$toString(n)); -}; -var _elm_lang$html$Html_Attributes$headers = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'headers', value); + $elm$core$String$join, + '\n ', + A2($elm$core$String$split, '\n', str)); }; -var _elm_lang$html$Html_Attributes$scope = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'scope', value); -}; -var _elm_lang$html$Html_Attributes$boolProperty = F2( - function (name, bool) { - return A2( - _elm_lang$html$Html_Attributes$property, - name, - _elm_lang$core$Json_Encode$bool(bool)); +var $elm$core$List$foldl = F3( + function (func, acc, list) { + foldl: + while (true) { + if (!list.b) { + return acc; + } else { + var x = list.a; + var xs = list.b; + var $temp$func = func, + $temp$acc = A2(func, x, acc), + $temp$list = xs; + func = $temp$func; + acc = $temp$acc; + list = $temp$list; + continue foldl; + } + } }); -var _elm_lang$html$Html_Attributes$hidden = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'hidden', bool); -}; -var _elm_lang$html$Html_Attributes$contenteditable = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'contentEditable', bool); -}; -var _elm_lang$html$Html_Attributes$spellcheck = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'spellcheck', bool); -}; -var _elm_lang$html$Html_Attributes$async = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'async', bool); -}; -var _elm_lang$html$Html_Attributes$defer = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'defer', bool); -}; -var _elm_lang$html$Html_Attributes$scoped = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'scoped', bool); -}; -var _elm_lang$html$Html_Attributes$autoplay = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'autoplay', bool); -}; -var _elm_lang$html$Html_Attributes$controls = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'controls', bool); -}; -var _elm_lang$html$Html_Attributes$loop = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'loop', bool); -}; -var _elm_lang$html$Html_Attributes$default = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'default', bool); -}; -var _elm_lang$html$Html_Attributes$seamless = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'seamless', bool); -}; -var _elm_lang$html$Html_Attributes$checked = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'checked', bool); -}; -var _elm_lang$html$Html_Attributes$selected = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'selected', bool); -}; -var _elm_lang$html$Html_Attributes$autofocus = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'autofocus', bool); -}; -var _elm_lang$html$Html_Attributes$disabled = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'disabled', bool); -}; -var _elm_lang$html$Html_Attributes$multiple = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'multiple', bool); +var $elm$core$List$length = function (xs) { + return A3( + $elm$core$List$foldl, + F2( + function (_v0, i) { + return i + 1; + }), + 0, + xs); }; -var _elm_lang$html$Html_Attributes$novalidate = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'noValidate', bool); +var $elm$core$List$map2 = _List_map2; +var $elm$core$Basics$le = _Utils_le; +var $elm$core$Basics$sub = _Basics_sub; +var $elm$core$List$rangeHelp = F3( + function (lo, hi, list) { + rangeHelp: + while (true) { + if (_Utils_cmp(lo, hi) < 1) { + var $temp$lo = lo, + $temp$hi = hi - 1, + $temp$list = A2($elm$core$List$cons, hi, list); + lo = $temp$lo; + hi = $temp$hi; + list = $temp$list; + continue rangeHelp; + } else { + return list; + } + } + }); +var $elm$core$List$range = F2( + function (lo, hi) { + return A3($elm$core$List$rangeHelp, lo, hi, _List_Nil); + }); +var $elm$core$List$indexedMap = F2( + function (f, xs) { + return A3( + $elm$core$List$map2, + f, + A2( + $elm$core$List$range, + 0, + $elm$core$List$length(xs) - 1), + xs); + }); +var $elm$core$Char$toCode = _Char_toCode; +var $elm$core$Char$isLower = function (_char) { + var code = $elm$core$Char$toCode(_char); + return (97 <= code) && (code <= 122); }; -var _elm_lang$html$Html_Attributes$readonly = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'readOnly', bool); +var $elm$core$Char$isUpper = function (_char) { + var code = $elm$core$Char$toCode(_char); + return (code <= 90) && (65 <= code); }; -var _elm_lang$html$Html_Attributes$required = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'required', bool); +var $elm$core$Basics$or = _Basics_or; +var $elm$core$Char$isAlpha = function (_char) { + return $elm$core$Char$isLower(_char) || $elm$core$Char$isUpper(_char); }; -var _elm_lang$html$Html_Attributes$ismap = function (value) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'isMap', value); +var $elm$core$Char$isDigit = function (_char) { + var code = $elm$core$Char$toCode(_char); + return (code <= 57) && (48 <= code); }; -var _elm_lang$html$Html_Attributes$download = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'download', bool); +var $elm$core$Char$isAlphaNum = function (_char) { + return $elm$core$Char$isLower(_char) || ($elm$core$Char$isUpper(_char) || $elm$core$Char$isDigit(_char)); }; -var _elm_lang$html$Html_Attributes$reversed = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'reversed', bool); +var $elm$core$List$reverse = function (list) { + return A3($elm$core$List$foldl, $elm$core$List$cons, _List_Nil, list); }; -var _elm_lang$html$Html_Attributes$classList = function (list) { - return _elm_lang$html$Html_Attributes$class( - A2( - _elm_lang$core$String$join, - ' ', - A2( - _elm_lang$core$List$map, - _elm_lang$core$Tuple$first, - A2(_elm_lang$core$List$filter, _elm_lang$core$Tuple$second, list)))); +var $elm$core$String$uncons = _String_uncons; +var $elm$json$Json$Decode$errorOneOf = F2( + function (i, error) { + return '\n\n(' + ($elm$core$String$fromInt(i + 1) + (') ' + $elm$json$Json$Decode$indent( + $elm$json$Json$Decode$errorToString(error)))); + }); +var $elm$json$Json$Decode$errorToString = function (error) { + return A2($elm$json$Json$Decode$errorToStringHelp, error, _List_Nil); }; -var _elm_lang$html$Html_Attributes$style = _elm_lang$virtual_dom$VirtualDom$style; - -var _elm_lang$html$Html_Events$keyCode = A2(_elm_lang$core$Json_Decode$field, 'keyCode', _elm_lang$core$Json_Decode$int); -var _elm_lang$html$Html_Events$targetChecked = A2( - _elm_lang$core$Json_Decode$at, - { - ctor: '::', - _0: 'target', - _1: { - ctor: '::', - _0: 'checked', - _1: {ctor: '[]'} +var $elm$json$Json$Decode$errorToStringHelp = F2( + function (error, context) { + errorToStringHelp: + while (true) { + switch (error.$) { + case 'Field': + var f = error.a; + var err = error.b; + var isSimple = function () { + var _v1 = $elm$core$String$uncons(f); + if (_v1.$ === 'Nothing') { + return false; + } else { + var _v2 = _v1.a; + var _char = _v2.a; + var rest = _v2.b; + return $elm$core$Char$isAlpha(_char) && A2($elm$core$String$all, $elm$core$Char$isAlphaNum, rest); + } + }(); + var fieldName = isSimple ? ('.' + f) : ('[\'' + (f + '\']')); + var $temp$error = err, + $temp$context = A2($elm$core$List$cons, fieldName, context); + error = $temp$error; + context = $temp$context; + continue errorToStringHelp; + case 'Index': + var i = error.a; + var err = error.b; + var indexName = '[' + ($elm$core$String$fromInt(i) + ']'); + var $temp$error = err, + $temp$context = A2($elm$core$List$cons, indexName, context); + error = $temp$error; + context = $temp$context; + continue errorToStringHelp; + case 'OneOf': + var errors = error.a; + if (!errors.b) { + return 'Ran into a Json.Decode.oneOf with no possibilities' + function () { + if (!context.b) { + return '!'; + } else { + return ' at json' + A2( + $elm$core$String$join, + '', + $elm$core$List$reverse(context)); + } + }(); + } else { + if (!errors.b.b) { + var err = errors.a; + var $temp$error = err, + $temp$context = context; + error = $temp$error; + context = $temp$context; + continue errorToStringHelp; + } else { + var starter = function () { + if (!context.b) { + return 'Json.Decode.oneOf'; + } else { + return 'The Json.Decode.oneOf at json' + A2( + $elm$core$String$join, + '', + $elm$core$List$reverse(context)); + } + }(); + var introduction = starter + (' failed in the following ' + ($elm$core$String$fromInt( + $elm$core$List$length(errors)) + ' ways:')); + return A2( + $elm$core$String$join, + '\n\n', + A2( + $elm$core$List$cons, + introduction, + A2($elm$core$List$indexedMap, $elm$json$Json$Decode$errorOneOf, errors))); + } + } + default: + var msg = error.a; + var json = error.b; + var introduction = function () { + if (!context.b) { + return 'Problem with the given value:\n\n'; + } else { + return 'Problem with the value at json' + (A2( + $elm$core$String$join, + '', + $elm$core$List$reverse(context)) + ':\n\n '); + } + }(); + return introduction + ($elm$json$Json$Decode$indent( + A2($elm$json$Json$Encode$encode, 4, json)) + ('\n\n' + msg)); + } } - }, - _elm_lang$core$Json_Decode$bool); -var _elm_lang$html$Html_Events$targetValue = A2( - _elm_lang$core$Json_Decode$at, - { - ctor: '::', - _0: 'target', - _1: { - ctor: '::', - _0: 'value', - _1: {ctor: '[]'} + }); +var $elm$core$Array$branchFactor = 32; +var $elm$core$Array$Array_elm_builtin = F4( + function (a, b, c, d) { + return {$: 'Array_elm_builtin', a: a, b: b, c: c, d: d}; + }); +var $elm$core$Elm$JsArray$empty = _JsArray_empty; +var $elm$core$Basics$ceiling = _Basics_ceiling; +var $elm$core$Basics$fdiv = _Basics_fdiv; +var $elm$core$Basics$logBase = F2( + function (base, number) { + return _Basics_log(number) / _Basics_log(base); + }); +var $elm$core$Basics$toFloat = _Basics_toFloat; +var $elm$core$Array$shiftStep = $elm$core$Basics$ceiling( + A2($elm$core$Basics$logBase, 2, $elm$core$Array$branchFactor)); +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); +var $elm$core$Elm$JsArray$initialize = _JsArray_initialize; +var $elm$core$Array$Leaf = function (a) { + return {$: 'Leaf', a: a}; +}; +var $elm$core$Basics$apL = F2( + function (f, x) { + return f(x); + }); +var $elm$core$Basics$apR = F2( + function (x, f) { + return f(x); + }); +var $elm$core$Basics$eq = _Utils_equal; +var $elm$core$Basics$floor = _Basics_floor; +var $elm$core$Elm$JsArray$length = _JsArray_length; +var $elm$core$Basics$gt = _Utils_gt; +var $elm$core$Basics$max = F2( + function (x, y) { + return (_Utils_cmp(x, y) > 0) ? x : y; + }); +var $elm$core$Basics$mul = _Basics_mul; +var $elm$core$Array$SubTree = function (a) { + return {$: 'SubTree', a: a}; +}; +var $elm$core$Elm$JsArray$initializeFromList = _JsArray_initializeFromList; +var $elm$core$Array$compressNodes = F2( + function (nodes, acc) { + compressNodes: + while (true) { + var _v0 = A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, nodes); + var node = _v0.a; + var remainingNodes = _v0.b; + var newAcc = A2( + $elm$core$List$cons, + $elm$core$Array$SubTree(node), + acc); + if (!remainingNodes.b) { + return $elm$core$List$reverse(newAcc); + } else { + var $temp$nodes = remainingNodes, + $temp$acc = newAcc; + nodes = $temp$nodes; + acc = $temp$acc; + continue compressNodes; + } } - }, - _elm_lang$core$Json_Decode$string); -var _elm_lang$html$Html_Events$defaultOptions = _elm_lang$virtual_dom$VirtualDom$defaultOptions; -var _elm_lang$html$Html_Events$onWithOptions = _elm_lang$virtual_dom$VirtualDom$onWithOptions; -var _elm_lang$html$Html_Events$on = _elm_lang$virtual_dom$VirtualDom$on; -var _elm_lang$html$Html_Events$onFocus = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'focus', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onBlur = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'blur', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onSubmitOptions = _elm_lang$core$Native_Utils.update( - _elm_lang$html$Html_Events$defaultOptions, - {preventDefault: true}); -var _elm_lang$html$Html_Events$onSubmit = function (msg) { - return A3( - _elm_lang$html$Html_Events$onWithOptions, - 'submit', - _elm_lang$html$Html_Events$onSubmitOptions, - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onCheck = function (tagger) { - return A2( - _elm_lang$html$Html_Events$on, - 'change', - A2(_elm_lang$core$Json_Decode$map, tagger, _elm_lang$html$Html_Events$targetChecked)); -}; -var _elm_lang$html$Html_Events$onInput = function (tagger) { - return A2( - _elm_lang$html$Html_Events$on, - 'input', - A2(_elm_lang$core$Json_Decode$map, tagger, _elm_lang$html$Html_Events$targetValue)); -}; -var _elm_lang$html$Html_Events$onMouseOut = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'mouseout', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onMouseOver = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'mouseover', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onMouseLeave = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'mouseleave', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onMouseEnter = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'mouseenter', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onMouseUp = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'mouseup', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onMouseDown = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'mousedown', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onDoubleClick = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'dblclick', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onClick = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'click', - _elm_lang$core$Json_Decode$succeed(msg)); + }); +var $elm$core$Tuple$first = function (_v0) { + var x = _v0.a; + return x; }; -var _elm_lang$html$Html_Events$Options = F2( - function (a, b) { - return {stopPropagation: a, preventDefault: b}; +var $elm$core$Array$treeFromBuilder = F2( + function (nodeList, nodeListSize) { + treeFromBuilder: + while (true) { + var newNodeSize = $elm$core$Basics$ceiling(nodeListSize / $elm$core$Array$branchFactor); + if (newNodeSize === 1) { + return A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, nodeList).a; + } else { + var $temp$nodeList = A2($elm$core$Array$compressNodes, nodeList, _List_Nil), + $temp$nodeListSize = newNodeSize; + nodeList = $temp$nodeList; + nodeListSize = $temp$nodeListSize; + continue treeFromBuilder; + } + } }); - -var _minond$brainfuck$Programs$programRandom = '>>>++[\n <++++++++[\n <[<++>-]>>[>>]+>>+[\n -[->>+<<<[<[<<]<+>]>[>[>>]]]\n <[>>[-]]>[>[-<<]>[<+<]]+<<\n ]<[>+<-]>>-\n ]<.[-]>>\n]\n\"Random\" byte generator using the Rule 30 automaton.\nDoesn\'t terminate; you will have to kill it.\nTo get x bytes you need 32x+4 cells.\nTurn off any newline translation!\nDaniel B Cristofani (cristofdathevanetdotcom)\nhttp://www.hevanet.com/cristofd/brainfuck/'; -var _minond$brainfuck$Programs$programFib = '>++++++++++>+>+[\n [+++++[>++++++++<-]>.<++++++[>--------<-]+<<<]>.>>[\n [-]<[>+<-]>>[<<+>+>-]<[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-\n [>+<-[>+<-[>+<-[>[-]>+>+<<<-[>+<-]]]]]]]]]]]+>>>\n ]<<<\n]\nThis program doesn\'t terminate; you will have to kill it.\nDaniel B Cristofani (cristofdathevanetdotcom)\nhttp://www.hevanet.com/cristofd/brainfuck/'; -var _minond$brainfuck$Programs$programSquares = '++++[>+++++<-]>[<+++++>-]+<+[\n >[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+\n >>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<]\n <<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-\n]\n[Outputs square numbers from 0 to 10000.\nDaniel B Cristofani (cristofdathevanetdotcom)\nhttp://www.hevanet.com/cristofd/brainfuck/]'; -var _minond$brainfuck$Programs$programHelloWorld = '+++++ +++++ initialize counter (cell #0) to 10\n[ use loop to set 70/100/30/10\n > +++++ ++ add 7 to cell #1\n > +++++ +++++ add 10 to cell #2\n > +++ add 3 to cell #3\n > + add 1 to cell #4\n<<<< - decrement counter (cell #0)\n]\n> ++ . print \'H\'\n> + . print \'e\'\n+++++ ++ . print \'l\'\n. print \'l\'\n+++ . print \'o\'\n> ++ . print \' \'\n<< +++++ +++++ +++++ . print \'W\'\n> . print \'o\'\n+++ . print \'r\'\n----- - . print \'l\'\n----- --- . print \'d\'\n> + . print \'!\'\n> . print \'eol\''; -var _minond$brainfuck$Programs$programCatStream = ',[.,]'; -var _minond$brainfuck$Programs$programCatBuffer = ',[>,]<[<]>[.>]'; -var _minond$brainfuck$Programs$programLoad = function (name) { - var _p0 = name; - switch (_p0) { - case 'squares.bf': - return _minond$brainfuck$Programs$programSquares; - case 'fib.bf': - return _minond$brainfuck$Programs$programFib; - case 'random.bf': - return _minond$brainfuck$Programs$programRandom; - case 'cat-buffer.bf': - return _minond$brainfuck$Programs$programCatBuffer; - case 'cat-stream.bf': - return _minond$brainfuck$Programs$programCatStream; - case 'helloworld.bf': - return _minond$brainfuck$Programs$programHelloWorld; +var $elm$core$Array$builderToArray = F2( + function (reverseNodeList, builder) { + if (!builder.nodeListSize) { + return A4( + $elm$core$Array$Array_elm_builtin, + $elm$core$Elm$JsArray$length(builder.tail), + $elm$core$Array$shiftStep, + $elm$core$Elm$JsArray$empty, + builder.tail); + } else { + var treeLen = builder.nodeListSize * $elm$core$Array$branchFactor; + var depth = $elm$core$Basics$floor( + A2($elm$core$Basics$logBase, $elm$core$Array$branchFactor, treeLen - 1)); + var correctNodeList = reverseNodeList ? $elm$core$List$reverse(builder.nodeList) : builder.nodeList; + var tree = A2($elm$core$Array$treeFromBuilder, correctNodeList, builder.nodeListSize); + return A4( + $elm$core$Array$Array_elm_builtin, + $elm$core$Elm$JsArray$length(builder.tail) + treeLen, + A2($elm$core$Basics$max, 5, depth * $elm$core$Array$shiftStep), + tree, + builder.tail); + } + }); +var $elm$core$Basics$idiv = _Basics_idiv; +var $elm$core$Basics$lt = _Utils_lt; +var $elm$core$Array$initializeHelp = F5( + function (fn, fromIndex, len, nodeList, tail) { + initializeHelp: + while (true) { + if (fromIndex < 0) { + return A2( + $elm$core$Array$builderToArray, + false, + {nodeList: nodeList, nodeListSize: (len / $elm$core$Array$branchFactor) | 0, tail: tail}); + } else { + var leaf = $elm$core$Array$Leaf( + A3($elm$core$Elm$JsArray$initialize, $elm$core$Array$branchFactor, fromIndex, fn)); + var $temp$fn = fn, + $temp$fromIndex = fromIndex - $elm$core$Array$branchFactor, + $temp$len = len, + $temp$nodeList = A2($elm$core$List$cons, leaf, nodeList), + $temp$tail = tail; + fn = $temp$fn; + fromIndex = $temp$fromIndex; + len = $temp$len; + nodeList = $temp$nodeList; + tail = $temp$tail; + continue initializeHelp; + } + } + }); +var $elm$core$Basics$remainderBy = _Basics_remainderBy; +var $elm$core$Array$initialize = F2( + function (len, fn) { + if (len <= 0) { + return $elm$core$Array$empty; + } else { + var tailLen = len % $elm$core$Array$branchFactor; + var tail = A3($elm$core$Elm$JsArray$initialize, tailLen, len - tailLen, fn); + var initialFromIndex = (len - tailLen) - $elm$core$Array$branchFactor; + return A5($elm$core$Array$initializeHelp, fn, initialFromIndex, len, _List_Nil, tail); + } + }); +var $elm$core$Basics$True = {$: 'True'}; +var $elm$core$Result$isOk = function (result) { + if (result.$ === 'Ok') { + return true; + } else { + return false; + } +}; +var $elm$json$Json$Encode$int = _Json_wrap; +var $elm$json$Json$Encode$list = F2( + function (func, entries) { + return _Json_wrap( + A3( + $elm$core$List$foldl, + _Json_addEntry(func), + _Json_emptyArray(_Utils_Tuple0), + entries)); + }); +var $elm$json$Json$Encode$null = _Json_encodeNull; +var $elm$json$Json$Encode$object = function (pairs) { + return _Json_wrap( + A3( + $elm$core$List$foldl, + F2( + function (_v0, obj) { + var k = _v0.a; + var v = _v0.b; + return A3(_Json_addField, k, v, obj); + }), + _Json_emptyObject(_Utils_Tuple0), + pairs)); +}; +var $elm$json$Json$Encode$string = _Json_wrap; +var $author$project$Main$cmd = _Platform_outgoingPort( + 'cmd', + function ($) { + var a = $.a; + var b = $.b; + return A2( + $elm$json$Json$Encode$list, + $elm$core$Basics$identity, + _List_fromArray( + [ + $elm$json$Json$Encode$string(a), + function ($) { + return A3( + $elm$core$Maybe$destruct, + $elm$json$Json$Encode$null, + function ($) { + return $elm$json$Json$Encode$object( + _List_fromArray( + [ + _Utils_Tuple2( + 'breakpoints', + $elm$json$Json$Encode$list($elm$json$Json$Encode$int)($.breakpoints)), + _Utils_Tuple2( + 'idx', + $elm$json$Json$Encode$int($.idx)), + _Utils_Tuple2( + 'input', + $elm$json$Json$Encode$string($.input)), + _Utils_Tuple2( + 'memory', + $elm$json$Json$Encode$list($elm$json$Json$Encode$int)($.memory)), + _Utils_Tuple2( + 'pointer', + $elm$json$Json$Encode$int($.pointer)), + _Utils_Tuple2( + 'program', + $elm$json$Json$Encode$string($.program)), + _Utils_Tuple2( + 'speed', + $elm$json$Json$Encode$int($.speed)), + _Utils_Tuple2( + 'steps', + $elm$json$Json$Encode$int($.steps)) + ])); + }, + $); + }(b) + ])); + }); +var $elm$json$Json$Decode$map = _Json_map1; +var $elm$json$Json$Decode$map2 = _Json_map2; +var $elm$json$Json$Decode$succeed = _Json_succeed; +var $elm$virtual_dom$VirtualDom$toHandlerInt = function (handler) { + switch (handler.$) { + case 'Normal': + return 0; + case 'MayStopPropagation': + return 1; + case 'MayPreventDefault': + return 2; default: - return ''; + return 3; } }; - -var _minond$brainfuck$Main$editorTitle = A2( - _elm_lang$html$Html$h1, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('mt0 f3 f2-m f1-l title fw1 baskerville'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$html$Html$text('Brainfuck'), - _1: {ctor: '[]'} - }); -var _minond$brainfuck$Main$mergeState = F2( - function (_p0, model) { - var _p1 = _p0; - return _elm_lang$core$Native_Utils.update( - model, - {memory: _p1.memory, idx: _p1.idx, pointer: _p1.pointer, steps: _p1.steps}); - }); -var _minond$brainfuck$Main$toRuntime = function (_p2) { - var _p3 = _p2; - return {program: _p3.program, memory: _p3.memory, breakpoints: _p3.breakpoints, input: _p3.input, idx: _p3.idx, pointer: _p3.pointer, steps: _p3.steps, speed: ((1000 * _p3.delay) / 100) | 0}; +var $elm$browser$Browser$External = function (a) { + return {$: 'External', a: a}; }; -var _minond$brainfuck$Main$cleanState = function (program) { - return { - program: program, - input: '', - output: _elm_lang$core$Maybe$Nothing, - memory: {ctor: '[]'}, - breakpoints: {ctor: '[]'}, - idx: 0, - pointer: 0, - steps: 0, - delay: 10 - }; +var $elm$browser$Browser$Internal = function (a) { + return {$: 'Internal', a: a}; }; -var _minond$brainfuck$Main$lbl = function (txt) { - return A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('f6 mb2 gray i'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$html$Html$text(txt), - _1: {ctor: '[]'} - }); +var $elm$browser$Browser$Dom$NotFound = function (a) { + return {$: 'NotFound', a: a}; }; -var _minond$brainfuck$Main$editorMemory = function (_p4) { - var _p5 = _p4; - var _p6 = _p5.memory; - var memSize = _elm_lang$core$List$length(_p6); - var pageSize = 10; - var padded = (_elm_lang$core$Native_Utils.cmp(memSize, pageSize) < 0) ? A2( - _elm_lang$core$Basics_ops['++'], - _p6, - A2(_elm_lang$core$List$repeat, pageSize - memSize, 0)) : _p6; - var isActive = F2( - function (offset, index) { - return _elm_lang$core$Native_Utils.eq((pageSize * offset) + index, _p5.pointer); - }); - var asCell = F3( - function (offset, index, val) { - return A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('memcell'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( - { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'selected', - _1: A2(isActive, offset, index) - }, - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} +var $elm$url$Url$Http = {$: 'Http'}; +var $elm$url$Url$Https = {$: 'Https'}; +var $elm$url$Url$Url = F6( + function (protocol, host, port_, path, query, fragment) { + return {fragment: fragment, host: host, path: path, port_: port_, protocol: protocol, query: query}; + }); +var $elm$core$String$contains = _String_contains; +var $elm$core$String$length = _String_length; +var $elm$core$String$slice = _String_slice; +var $elm$core$String$dropLeft = F2( + function (n, string) { + return (n < 1) ? string : A3( + $elm$core$String$slice, + n, + $elm$core$String$length(string), + string); + }); +var $elm$core$String$indexes = _String_indexes; +var $elm$core$String$isEmpty = function (string) { + return string === ''; +}; +var $elm$core$String$left = F2( + function (n, string) { + return (n < 1) ? '' : A3($elm$core$String$slice, 0, n, string); + }); +var $elm$core$String$toInt = _String_toInt; +var $elm$url$Url$chompBeforePath = F5( + function (protocol, path, params, frag, str) { + if ($elm$core$String$isEmpty(str) || A2($elm$core$String$contains, '@', str)) { + return $elm$core$Maybe$Nothing; + } else { + var _v0 = A2($elm$core$String$indexes, ':', str); + if (!_v0.b) { + return $elm$core$Maybe$Just( + A6($elm$url$Url$Url, protocol, str, $elm$core$Maybe$Nothing, path, params, frag)); + } else { + if (!_v0.b.b) { + var i = _v0.a; + var _v1 = $elm$core$String$toInt( + A2($elm$core$String$dropLeft, i + 1, str)); + if (_v1.$ === 'Nothing') { + return $elm$core$Maybe$Nothing; + } else { + var port_ = _v1; + return $elm$core$Maybe$Just( + A6( + $elm$url$Url$Url, + protocol, + A2($elm$core$String$left, i, str), + port_, + path, + params, + frag)); } - }, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$span, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text( - _elm_lang$core$Basics$toString(val)), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - }); - }); - var asRow = F2( - function (index, vals) { - return A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('cellrow'), - _1: {ctor: '[]'} - }, - A2( - _elm_lang$core$List$indexedMap, - asCell(index), - vals)); - }); - return { - ctor: '::', - _0: _minond$brainfuck$Main$lbl('Program memory'), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('mb3'), - _1: {ctor: '[]'} - }, - A2( - _elm_lang$core$List$indexedMap, - asRow, - A2(_elm_community$list_extra$List_Extra$greedyGroupsOf, pageSize, padded))), - _1: {ctor: '[]'} + } else { + return $elm$core$Maybe$Nothing; + } + } } - }; -}; -var _minond$brainfuck$Main$btn = F2( - function (attrs, val) { - return A2( - _elm_lang$html$Html$button, - A2( - _elm_lang$core$Basics_ops['++'], - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('mr2 mb2 pointer'), - _1: {ctor: '[]'} - }, - attrs), - { - ctor: '::', - _0: _elm_lang$html$Html$text(val), - _1: {ctor: '[]'} - }); }); -var _minond$brainfuck$Main$link = F2( - function (title, shref) { - return A2( - _elm_lang$html$Html$a, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$href(shref), - _1: { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('link blue'), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: _elm_lang$html$Html$text(title), - _1: {ctor: '[]'} - }); +var $elm$url$Url$chompBeforeQuery = F4( + function (protocol, params, frag, str) { + if ($elm$core$String$isEmpty(str)) { + return $elm$core$Maybe$Nothing; + } else { + var _v0 = A2($elm$core$String$indexes, '/', str); + if (!_v0.b) { + return A5($elm$url$Url$chompBeforePath, protocol, '/', params, frag, str); + } else { + var i = _v0.a; + return A5( + $elm$url$Url$chompBeforePath, + protocol, + A2($elm$core$String$dropLeft, i, str), + params, + frag, + A2($elm$core$String$left, i, str)); + } + } }); -var _minond$brainfuck$Main$mono = function (str) { - return A2( - _elm_lang$html$Html$code, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('f6 ph1 tc bg-light-gray word-wrap'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$html$Html$text(str), - _1: {ctor: '[]'} - }); -}; -var _minond$brainfuck$Main$editorInformation = function (_p7) { - var _p8 = _p7; - var _p11 = _p8.program; - var _p10 = _p8.idx; - var outputMessage = function () { - var _p9 = _p8.output; - if (_p9.ctor === 'Nothing') { - return _elm_lang$html$Html$text('The program has had no output yet.'); +var $elm$url$Url$chompBeforeFragment = F3( + function (protocol, frag, str) { + if ($elm$core$String$isEmpty(str)) { + return $elm$core$Maybe$Nothing; } else { - return A2( - _elm_lang$html$Html$span, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text('Output length is '), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$mono( - _elm_lang$core$Basics$toString( - _elm_lang$core$String$length(_p9._0))), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' characters long.'), - _1: {ctor: '[]'} - } - } - }); + var _v0 = A2($elm$core$String$indexes, '?', str); + if (!_v0.b) { + return A4($elm$url$Url$chompBeforeQuery, protocol, $elm$core$Maybe$Nothing, frag, str); + } else { + var i = _v0.a; + return A4( + $elm$url$Url$chompBeforeQuery, + protocol, + $elm$core$Maybe$Just( + A2($elm$core$String$dropLeft, i + 1, str)), + frag, + A2($elm$core$String$left, i, str)); + } } - }(); - var programSize = _elm_lang$core$String$length(_p11); - var isOptcode = function (opt) { - return A2(_elm_lang$core$String$contains, opt, '+-[]<>,.'); - }; - var opts = A2( - _elm_lang$core$Array$filter, - isOptcode, - _elm_lang$core$Array$fromList( - A2(_elm_lang$core$String$split, '', _p11))); - var opt = A2( - _elm_lang$core$Maybe$withDefault, - ' ', - A2(_elm_lang$core$Array$get, _p10, opts)); - var codeSize = _elm_lang$core$Array$length(opts); - return { - ctor: '::', - _0: A2( - _elm_lang$html$Html$p, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('lh-copy'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$html$Html$text('Here’s some information about your program: it is '), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$mono( - _elm_lang$core$Basics$toString(programSize)), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' bytes, '), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$mono( - _elm_lang$core$Basics$toString(codeSize)), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' of which are valid commands. The interpreter is going to interpret the character at index '), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$mono( - _elm_lang$core$Basics$toString(_p10)), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(', which is '), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$mono(opt), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(', and has taken a total of '), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$mono( - _elm_lang$core$Basics$toString(_p8.steps)), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' steps so far. '), - _1: { - ctor: '::', - _0: outputMessage, - _1: {ctor: '[]'} - } - } - } - } - } - } - } - } - } - } - } - }), - _1: {ctor: '[]'} - }; + }); +var $elm$url$Url$chompAfterProtocol = F2( + function (protocol, str) { + if ($elm$core$String$isEmpty(str)) { + return $elm$core$Maybe$Nothing; + } else { + var _v0 = A2($elm$core$String$indexes, '#', str); + if (!_v0.b) { + return A3($elm$url$Url$chompBeforeFragment, protocol, $elm$core$Maybe$Nothing, str); + } else { + var i = _v0.a; + return A3( + $elm$url$Url$chompBeforeFragment, + protocol, + $elm$core$Maybe$Just( + A2($elm$core$String$dropLeft, i + 1, str)), + A2($elm$core$String$left, i, str)); + } + } + }); +var $elm$core$String$startsWith = _String_startsWith; +var $elm$url$Url$fromString = function (str) { + return A2($elm$core$String$startsWith, 'http://', str) ? A2( + $elm$url$Url$chompAfterProtocol, + $elm$url$Url$Http, + A2($elm$core$String$dropLeft, 7, str)) : (A2($elm$core$String$startsWith, 'https://', str) ? A2( + $elm$url$Url$chompAfterProtocol, + $elm$url$Url$Https, + A2($elm$core$String$dropLeft, 8, str)) : $elm$core$Maybe$Nothing); }; -var _minond$brainfuck$Main$editorIntroduction = { - ctor: '::', - _0: A2( - _elm_lang$html$Html$p, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('mt0 lh-copy'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2(_minond$brainfuck$Main$link, 'Brainfuck', 'https://esolangs.org/wiki/Brainfuck'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(', one of the '), - _1: { - ctor: '::', - _0: A2(_minond$brainfuck$Main$link, 'esoteric programming languages', 'https://esolangs.org/wiki/Esoteric_programming_language'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' you’ve probably heard of. Partly because of its minimal instruction set but most likely because it has the word '), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$span, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('i'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$html$Html$text('fuck'), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' in its name. That said this language doesn’t have to leave you thinking '), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$span, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('i'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$html$Html$text('wtf?'), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text('. My intention for building this Brainfuck debugger is to have a tool for learning this language and do it in a visual way, where you can see what your program is doing step by step.'), - _1: {ctor: '[]'} - } - } - } - } +var $elm$core$Basics$never = function (_v0) { + never: + while (true) { + var nvr = _v0.a; + var $temp$_v0 = nvr; + _v0 = $temp$_v0; + continue never; + } +}; +var $elm$core$Task$Perform = function (a) { + return {$: 'Perform', a: a}; +}; +var $elm$core$Task$succeed = _Scheduler_succeed; +var $elm$core$Task$init = $elm$core$Task$succeed(_Utils_Tuple0); +var $elm$core$List$foldrHelper = F4( + function (fn, acc, ctr, ls) { + if (!ls.b) { + return acc; + } else { + var a = ls.a; + var r1 = ls.b; + if (!r1.b) { + return A2(fn, a, acc); + } else { + var b = r1.a; + var r2 = r1.b; + if (!r2.b) { + return A2( + fn, + a, + A2(fn, b, acc)); + } else { + var c = r2.a; + var r3 = r2.b; + if (!r3.b) { + return A2( + fn, + a, + A2( + fn, + b, + A2(fn, c, acc))); + } else { + var d = r3.a; + var r4 = r3.b; + var res = (ctr > 500) ? A3( + $elm$core$List$foldl, + fn, + acc, + $elm$core$List$reverse(r4)) : A4($elm$core$List$foldrHelper, fn, acc, ctr + 1, r4); + return A2( + fn, + a, + A2( + fn, + b, + A2( + fn, + c, + A2(fn, d, res)))); } } } - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$p, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('lh-copy'), - _1: {ctor: '[]'} + } + }); +var $elm$core$List$foldr = F3( + function (fn, acc, ls) { + return A4($elm$core$List$foldrHelper, fn, acc, 0, ls); + }); +var $elm$core$List$map = F2( + function (f, xs) { + return A3( + $elm$core$List$foldr, + F2( + function (x, acc) { + return A2( + $elm$core$List$cons, + f(x), + acc); + }), + _List_Nil, + xs); + }); +var $elm$core$Task$andThen = _Scheduler_andThen; +var $elm$core$Task$map = F2( + function (func, taskA) { + return A2( + $elm$core$Task$andThen, + function (a) { + return $elm$core$Task$succeed( + func(a)); }, - { - ctor: '::', - _0: _elm_lang$html$Html$text('Besides this text you’ll see buttons you can use to execute your program, which can be done in continuation or one command at a time, and as your program is running you can slide the range input field to alter the speed at which the code runs. Below those controls you’ll notice a table filled with 0’s (at least before you run a program), this is the internal memory. And finally your code editor, where you can set breakpoints by clicking on commands that will halt your program’s execution. Now for a quick introduction to the language: '), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$ul, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('pl4 lh-copy'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$li, - {ctor: '[]'}, - { - ctor: '::', - _0: _minond$brainfuck$Main$mono('<'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' and '), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$mono('>'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' move the pointer to the left and to the right. Keep an on the memory cells to the right -- the cell that has a black background color is the active cell and the one where increment, decrement, and loops will act on or check.'), - _1: {ctor: '[]'} - } - } - } - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$li, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('pt2'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _minond$brainfuck$Main$mono('+'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' and '), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$mono('-'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' increment and decrement the active cell. Note that incrementing above 255 will ‘wrap’ the value back around to 0, and decrementing below 0 will take you to 255.'), - _1: {ctor: '[]'} - } - } - } - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$li, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('pt2'), - _1: {ctor: '[]'} + taskA); + }); +var $elm$core$Task$map2 = F3( + function (func, taskA, taskB) { + return A2( + $elm$core$Task$andThen, + function (a) { + return A2( + $elm$core$Task$andThen, + function (b) { + return $elm$core$Task$succeed( + A2(func, a, b)); + }, + taskB); + }, + taskA); + }); +var $elm$core$Task$sequence = function (tasks) { + return A3( + $elm$core$List$foldr, + $elm$core$Task$map2($elm$core$List$cons), + $elm$core$Task$succeed(_List_Nil), + tasks); +}; +var $elm$core$Platform$sendToApp = _Platform_sendToApp; +var $elm$core$Task$spawnCmd = F2( + function (router, _v0) { + var task = _v0.a; + return _Scheduler_spawn( + A2( + $elm$core$Task$andThen, + $elm$core$Platform$sendToApp(router), + task)); + }); +var $elm$core$Task$onEffects = F3( + function (router, commands, state) { + return A2( + $elm$core$Task$map, + function (_v0) { + return _Utils_Tuple0; + }, + $elm$core$Task$sequence( + A2( + $elm$core$List$map, + $elm$core$Task$spawnCmd(router), + commands))); + }); +var $elm$core$Task$onSelfMsg = F3( + function (_v0, _v1, _v2) { + return $elm$core$Task$succeed(_Utils_Tuple0); + }); +var $elm$core$Task$cmdMap = F2( + function (tagger, _v0) { + var task = _v0.a; + return $elm$core$Task$Perform( + A2($elm$core$Task$map, tagger, task)); + }); +_Platform_effectManagers['Task'] = _Platform_createManager($elm$core$Task$init, $elm$core$Task$onEffects, $elm$core$Task$onSelfMsg, $elm$core$Task$cmdMap); +var $elm$core$Task$command = _Platform_leaf('Task'); +var $elm$core$Task$perform = F2( + function (toMessage, task) { + return $elm$core$Task$command( + $elm$core$Task$Perform( + A2($elm$core$Task$map, toMessage, task))); + }); +var $elm$browser$Browser$document = _Browser_document; +var $author$project$Main$cleanState = function (program) { + return {breakpoints: _List_Nil, delay: 10, idx: 0, input: '', memory: _List_Nil, output_: $elm$core$Maybe$Nothing, pointer: 0, program: program, steps: 0}; +}; +var $author$project$Programs$programHelloWorld = '+++++ +++++ initialize counter (cell #0) to 10\n[ use loop to set 70/100/30/10\n > +++++ ++ add 7 to cell #1\n > +++++ +++++ add 10 to cell #2\n > +++ add 3 to cell #3\n > + add 1 to cell #4\n<<<< - decrement counter (cell #0)\n]\n> ++ . print \'H\'\n> + . print \'e\'\n+++++ ++ . print \'l\'\n. print \'l\'\n+++ . print \'o\'\n> ++ . print \' \'\n<< +++++ +++++ +++++ . print \'W\'\n> . print \'o\'\n+++ . print \'r\'\n----- - . print \'l\'\n----- --- . print \'d\'\n> + . print \'!\'\n> . print \'eol\''; +var $author$project$Main$initialModel = $author$project$Main$cleanState($author$project$Programs$programHelloWorld); +var $author$project$Main$Breakpoint = function (a) { + return {$: 'Breakpoint', a: a}; +}; +var $author$project$Main$EditorInput = function (a) { + return {$: 'EditorInput', a: a}; +}; +var $author$project$Main$Output = function (a) { + return {$: 'Output', a: a}; +}; +var $author$project$Main$Tick = function (a) { + return {$: 'Tick', a: a}; +}; +var $elm$core$Platform$Sub$batch = _Platform_batch; +var $elm$json$Json$Decode$int = _Json_decodeInt; +var $author$project$Main$breakpoint = _Platform_incomingPort('breakpoint', $elm$json$Json$Decode$int); +var $elm$json$Json$Decode$string = _Json_decodeString; +var $author$project$Main$output = _Platform_incomingPort('output', $elm$json$Json$Decode$string); +var $elm$json$Json$Decode$andThen = _Json_andThen; +var $elm$json$Json$Decode$field = _Json_decodeField; +var $elm$json$Json$Decode$list = _Json_decodeList; +var $author$project$Main$tick = _Platform_incomingPort( + 'tick', + A2( + $elm$json$Json$Decode$andThen, + function (steps) { + return A2( + $elm$json$Json$Decode$andThen, + function (pointer) { + return A2( + $elm$json$Json$Decode$andThen, + function (memory) { + return A2( + $elm$json$Json$Decode$andThen, + function (idx) { + return $elm$json$Json$Decode$succeed( + {idx: idx, memory: memory, pointer: pointer, steps: steps}); }, - { - ctor: '::', - _0: _minond$brainfuck$Main$mono('['), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' and '), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$mono(']'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' are the language’s only control flow operators. The code inside of the loop is ran as long as that value of the active cell is not zero. Think of it as a '), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$mono('while (ptr != 0) {}'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' loop.'), - _1: {ctor: '[]'} - } - } - } - } - } - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$li, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('pt2'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _minond$brainfuck$Main$mono('.'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' and '), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$mono(','), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' are the io functions. A period will output the character associated with the '), - _1: { - ctor: '::', - _0: A2(_minond$brainfuck$Main$link, 'ASCII', 'https://en.wikipedia.org/wiki/ASCII'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(' in the active cell (so if the active cell has a value of 97 and you output its value, you should get an ‘a’.) You\'ll notice an input field labeled as `input`. This is where you can predefine the input for your program and if this is empty, the editor will prompt for the input intead.'), - _1: {ctor: '[]'} - } - } - } - } - } - }), - _1: {ctor: '[]'} - } - } - } + A2($elm$json$Json$Decode$field, 'idx', $elm$json$Json$Decode$int)); + }, + A2( + $elm$json$Json$Decode$field, + 'memory', + $elm$json$Json$Decode$list($elm$json$Json$Decode$int))); + }, + A2($elm$json$Json$Decode$field, 'pointer', $elm$json$Json$Decode$int)); + }, + A2($elm$json$Json$Decode$field, 'steps', $elm$json$Json$Decode$int))); +var $author$project$Main$unload = _Platform_incomingPort('unload', $elm$json$Json$Decode$string); +var $author$project$Main$subscriptions = function (_v0) { + return $elm$core$Platform$Sub$batch( + _List_fromArray( + [ + $author$project$Main$tick($author$project$Main$Tick), + $author$project$Main$output($author$project$Main$Output), + $author$project$Main$unload($author$project$Main$EditorInput), + $author$project$Main$breakpoint($author$project$Main$Breakpoint) + ])); +}; +var $author$project$Main$toRuntime = function (_v0) { + var program = _v0.program; + var memory = _v0.memory; + var breakpoints = _v0.breakpoints; + var input = _v0.input; + var idx = _v0.idx; + var pointer = _v0.pointer; + var steps = _v0.steps; + var delay = _v0.delay; + return {breakpoints: breakpoints, idx: idx, input: input, memory: memory, pointer: pointer, program: program, speed: ((1000 * delay) / 100) | 0, steps: steps}; +}; +var $elm$core$List$filter = F2( + function (isGood, list) { + return A3( + $elm$core$List$foldr, + F2( + function (x, xs) { + return isGood(x) ? A2($elm$core$List$cons, x, xs) : xs; }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$p, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('lh-copy'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$html$Html$text('So play around with this tool. Start by running the sample code or creating basic programs on your own and see for yourself how with even the most basic control flow and altering commands you can technically accomplish any task. If you’re curious about the code and the interpreter that are running on this page, '), - _1: { - ctor: '::', - _0: A2(_minond$brainfuck$Main$link, 'go here', 'https://github.com/minond/brainfuck'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(', and if you’d like to learn more about Brainfuck and other really interesting esoteric programming languages then I recommend heading over to '), - _1: { - ctor: '::', - _0: A2(_minond$brainfuck$Main$link, 'Esolang', 'https://esolangs.org/wiki/Main_Page'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text('.'), - _1: {ctor: '[]'} - } - } - } - } - }), - _1: {ctor: '[]'} + _List_Nil, + list); + }); +var $elm$core$List$any = F2( + function (isOkay, list) { + any: + while (true) { + if (!list.b) { + return false; + } else { + var x = list.a; + var xs = list.b; + if (isOkay(x)) { + return true; + } else { + var $temp$isOkay = isOkay, + $temp$list = xs; + isOkay = $temp$isOkay; + list = $temp$list; + continue any; + } } } + }); +var $elm$core$List$member = F2( + function (x, xs) { + return A2( + $elm$core$List$any, + function (a) { + return _Utils_eq(a, x); + }, + xs); + }); +var $author$project$Main$mergeState = F2( + function (_v0, model) { + var memory = _v0.memory; + var idx = _v0.idx; + var pointer = _v0.pointer; + var steps = _v0.steps; + return _Utils_update( + model, + {idx: idx, memory: memory, pointer: pointer, steps: steps}); + }); +var $elm$core$Basics$neq = _Utils_notEqual; +var $elm$core$Platform$Cmd$batch = _Platform_batch; +var $elm$core$Platform$Cmd$none = $elm$core$Platform$Cmd$batch(_List_Nil); +var $author$project$Programs$programCatBuffer = ',[>,]<[<]>[.>]'; +var $author$project$Programs$programCatStream = ',[.,]'; +var $author$project$Programs$programFib = '>++++++++++>+>+[\n [+++++[>++++++++<-]>.<++++++[>--------<-]+<<<]>.>>[\n [-]<[>+<-]>>[<<+>+>-]<[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-\n [>+<-[>+<-[>+<-[>[-]>+>+<<<-[>+<-]]]]]]]]]]]+>>>\n ]<<<\n]\nThis program doesn\'t terminate; you will have to kill it.\nDaniel B Cristofani (cristofdathevanetdotcom)\nhttp://www.hevanet.com/cristofd/brainfuck/'; +var $author$project$Programs$programRandom = '>>>++[\n <++++++++[\n <[<++>-]>>[>>]+>>+[\n -[->>+<<<[<[<<]<+>]>[>[>>]]]\n <[>>[-]]>[>[-<<]>[<+<]]+<<\n ]<[>+<-]>>-\n ]<.[-]>>\n]\n"Random" byte generator using the Rule 30 automaton.\nDoesn\'t terminate; you will have to kill it.\nTo get x bytes you need 32x+4 cells.\nTurn off any newline translation!\nDaniel B Cristofani (cristofdathevanetdotcom)\nhttp://www.hevanet.com/cristofd/brainfuck/'; +var $author$project$Programs$programSquares = '++++[>+++++<-]>[<+++++>-]+<+[\n >[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+\n >>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<]\n <<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-\n]\n[Outputs square numbers from 0 to 10000.\nDaniel B Cristofani (cristofdathevanetdotcom)\nhttp://www.hevanet.com/cristofd/brainfuck/]'; +var $author$project$Programs$programLoad = function (name) { + switch (name) { + case 'squares.bf': + return $author$project$Programs$programSquares; + case 'fib.bf': + return $author$project$Programs$programFib; + case 'random.bf': + return $author$project$Programs$programRandom; + case 'cat-buffer.bf': + return $author$project$Programs$programCatBuffer; + case 'cat-stream.bf': + return $author$project$Programs$programCatStream; + case 'helloworld.bf': + return $author$project$Programs$programHelloWorld; + default: + return ''; } }; -var _minond$brainfuck$Main$initialModel = _minond$brainfuck$Main$cleanState(_minond$brainfuck$Programs$programHelloWorld); -var _minond$brainfuck$Main$cmd = _elm_lang$core$Native_Platform.outgoingPort( - 'cmd', - function (v) { - return [ - v._0, - (v._1.ctor === 'Nothing') ? null : { - program: v._1._0.program, - memory: _elm_lang$core$Native_List.toArray(v._1._0.memory).map( - function (v) { - return v; - }), - breakpoints: _elm_lang$core$Native_List.toArray(v._1._0.breakpoints).map( - function (v) { - return v; - }), - input: v._1._0.input, - idx: v._1._0.idx, - pointer: v._1._0.pointer, - steps: v._1._0.steps, - speed: v._1._0.speed +var $elm$core$Maybe$withDefault = F2( + function (_default, maybe) { + if (maybe.$ === 'Just') { + var value = maybe.a; + return value; + } else { + return _default; } - ]; }); -var _minond$brainfuck$Main$update = F2( +var $author$project$Main$update = F2( function (message, model) { - var _p12 = message; - switch (_p12.ctor) { + switch (message.$) { case 'Run': - var clean = _minond$brainfuck$Main$cleanState(model.program); var input = model.input; + var clean = $author$project$Main$cleanState(model.program); var breakpoints = model.breakpoints; - var reset = _elm_lang$core$Native_Utils.update( + var reset = _Utils_update( clean, - {delay: model.delay, breakpoints: breakpoints, input: input}); - var delay = model.delay; - return { - ctor: '_Tuple2', - _0: reset, - _1: _minond$brainfuck$Main$cmd( - { - ctor: '_Tuple2', - _0: 'start', - _1: _elm_lang$core$Maybe$Just( - _minond$brainfuck$Main$toRuntime(reset)) - }) - }; + {breakpoints: breakpoints, delay: model.delay, input: input}); + return _Utils_Tuple2( + reset, + $author$project$Main$cmd( + _Utils_Tuple2( + 'start', + $elm$core$Maybe$Just( + $author$project$Main$toRuntime(reset))))); case 'Step': - return { - ctor: '_Tuple2', - _0: model, - _1: _minond$brainfuck$Main$cmd( - { - ctor: '_Tuple2', - _0: 'step', - _1: _elm_lang$core$Maybe$Just( - _minond$brainfuck$Main$toRuntime(model)) - }) - }; + return _Utils_Tuple2( + model, + $author$project$Main$cmd( + _Utils_Tuple2( + 'step', + $elm$core$Maybe$Just( + $author$project$Main$toRuntime(model))))); case 'Continue': - return { - ctor: '_Tuple2', - _0: model, - _1: _minond$brainfuck$Main$cmd( - { - ctor: '_Tuple2', - _0: 'continue', - _1: _elm_lang$core$Maybe$Just( - _minond$brainfuck$Main$toRuntime(model)) - }) - }; + return _Utils_Tuple2( + model, + $author$project$Main$cmd( + _Utils_Tuple2( + 'continue', + $elm$core$Maybe$Just( + $author$project$Main$toRuntime(model))))); case 'Pause': - return { - ctor: '_Tuple2', - _0: model, - _1: _minond$brainfuck$Main$cmd( - { - ctor: '_Tuple2', - _0: 'pause', - _1: _elm_lang$core$Maybe$Just( - _minond$brainfuck$Main$toRuntime(model)) - }) - }; + return _Utils_Tuple2( + model, + $author$project$Main$cmd( + _Utils_Tuple2( + 'pause', + $elm$core$Maybe$Just( + $author$project$Main$toRuntime(model))))); case 'Output': - var output = A2( - _elm_lang$core$Basics_ops['++'], - A2(_elm_lang$core$Maybe$withDefault, '', model.output), - _p12._0); - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Native_Utils.update( + var addition = message.a; + var output_ = _Utils_ap( + A2($elm$core$Maybe$withDefault, '', model.output_), + addition); + return _Utils_Tuple2( + _Utils_update( model, { - output: _elm_lang$core$Maybe$Just(output) + output_: $elm$core$Maybe$Just(output_) }), - _1: _elm_lang$core$Platform_Cmd$none - }; + $elm$core$Platform$Cmd$none); case 'Tick': - return { - ctor: '_Tuple2', - _0: A2(_minond$brainfuck$Main$mergeState, _p12._0, model), - _1: _elm_lang$core$Platform_Cmd$none - }; + var state = message.a; + return _Utils_Tuple2( + A2($author$project$Main$mergeState, state, model), + $elm$core$Platform$Cmd$none); case 'SetDelay': + var raw = message.a; var delay = function () { - var _p13 = _elm_lang$core$String$toInt(_p12._0); - if (_p13.ctor === 'Err') { + var _v1 = $elm$core$String$toInt(raw); + if (_v1.$ === 'Nothing') { return 50; } else { - return _p13._0; + var val = _v1.a; + return val; } }(); - var update = _elm_lang$core$Native_Utils.update( + var update_ = _Utils_update( model, {delay: delay}); - return { - ctor: '_Tuple2', - _0: update, - _1: _minond$brainfuck$Main$cmd( - { - ctor: '_Tuple2', - _0: 'speed', - _1: _elm_lang$core$Maybe$Just( - _minond$brainfuck$Main$toRuntime(update)) - }) - }; + return _Utils_Tuple2( + update_, + $author$project$Main$cmd( + _Utils_Tuple2( + 'speed', + $elm$core$Maybe$Just( + $author$project$Main$toRuntime(update_))))); case 'SetProgram': - var program = _minond$brainfuck$Programs$programLoad(_p12._0); - var clean = _minond$brainfuck$Main$cleanState(program); - var update = _elm_lang$core$Native_Utils.update( + var name = message.a; + var program = $author$project$Programs$programLoad(name); + var clean = $author$project$Main$cleanState(program); + var update_ = _Utils_update( clean, {input: model.input}); - var runtime = _minond$brainfuck$Main$toRuntime(update); - return { - ctor: '_Tuple2', - _0: update, - _1: _minond$brainfuck$Main$cmd( - { - ctor: '_Tuple2', - _0: 'load', - _1: _elm_lang$core$Maybe$Just(runtime) - }) - }; + var runtime = $author$project$Main$toRuntime(update_); + return _Utils_Tuple2( + update_, + $author$project$Main$cmd( + _Utils_Tuple2( + 'load', + $elm$core$Maybe$Just(runtime)))); case 'EditorInput': - var clean = _minond$brainfuck$Main$cleanState(_p12._0); - var update = _elm_lang$core$Native_Utils.update( + var program = message.a; + var clean = $author$project$Main$cleanState(program); + var update_ = _Utils_update( clean, {input: model.input}); - return {ctor: '_Tuple2', _0: update, _1: _elm_lang$core$Platform_Cmd$none}; + return _Utils_Tuple2(update_, $elm$core$Platform$Cmd$none); case 'UpdateProgramInput': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Native_Utils.update( + var input = message.a; + return _Utils_Tuple2( + _Utils_update( model, - {input: _p12._0}), - _1: _elm_lang$core$Platform_Cmd$none - }; + {input: input}), + $elm$core$Platform$Cmd$none); default: - var _p14 = _p12._0; - var breakpoints = A2(_elm_lang$core$List$member, _p14, model.breakpoints) ? A2( - _elm_lang$core$List$filter, - F2( - function (x, y) { - return !_elm_lang$core$Native_Utils.eq(x, y); - })(_p14), - model.breakpoints) : {ctor: '::', _0: _p14, _1: model.breakpoints}; - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Native_Utils.update( + var pos = message.a; + var breakpoints = A2($elm$core$List$member, pos, model.breakpoints) ? A2( + $elm$core$List$filter, + $elm$core$Basics$neq(pos), + model.breakpoints) : A2($elm$core$List$cons, pos, model.breakpoints); + return _Utils_Tuple2( + _Utils_update( model, - {breakpoints: breakpoints}), - _1: _elm_lang$core$Platform_Cmd$none - }; - } - }); -var _minond$brainfuck$Main$unload = _elm_lang$core$Native_Platform.incomingPort('unload', _elm_lang$core$Json_Decode$string); -var _minond$brainfuck$Main$tick = _elm_lang$core$Native_Platform.incomingPort( - 'tick', - A2( - _elm_lang$core$Json_Decode$andThen, - function (memory) { - return A2( - _elm_lang$core$Json_Decode$andThen, - function (idx) { - return A2( - _elm_lang$core$Json_Decode$andThen, - function (pointer) { - return A2( - _elm_lang$core$Json_Decode$andThen, - function (steps) { - return _elm_lang$core$Json_Decode$succeed( - {memory: memory, idx: idx, pointer: pointer, steps: steps}); - }, - A2(_elm_lang$core$Json_Decode$field, 'steps', _elm_lang$core$Json_Decode$int)); - }, - A2(_elm_lang$core$Json_Decode$field, 'pointer', _elm_lang$core$Json_Decode$int)); - }, - A2(_elm_lang$core$Json_Decode$field, 'idx', _elm_lang$core$Json_Decode$int)); - }, - A2( - _elm_lang$core$Json_Decode$field, - 'memory', - _elm_lang$core$Json_Decode$list(_elm_lang$core$Json_Decode$int)))); -var _minond$brainfuck$Main$output = _elm_lang$core$Native_Platform.incomingPort('output', _elm_lang$core$Json_Decode$string); -var _minond$brainfuck$Main$breakpoint = _elm_lang$core$Native_Platform.incomingPort('breakpoint', _elm_lang$core$Json_Decode$int); -var _minond$brainfuck$Main$Model = F9( - function (a, b, c, d, e, f, g, h, i) { - return {program: a, input: b, output: c, memory: d, breakpoints: e, idx: f, pointer: g, steps: h, delay: i}; - }); -var _minond$brainfuck$Main$ProgramState = F4( - function (a, b, c, d) { - return {memory: a, idx: b, pointer: c, steps: d}; + {breakpoints: breakpoints}), + $elm$core$Platform$Cmd$none); + } }); -var _minond$brainfuck$Main$Runtime = F8( - function (a, b, c, d, e, f, g, h) { - return {program: a, memory: b, breakpoints: c, input: d, idx: e, pointer: f, steps: g, speed: h}; +var $elm$html$Html$Attributes$stringProperty = F2( + function (key, string) { + return A2( + _VirtualDom_property, + key, + $elm$json$Json$Encode$string(string)); }); -var _minond$brainfuck$Main$Breakpoint = function (a) { - return {ctor: 'Breakpoint', _0: a}; +var $elm$html$Html$Attributes$class = $elm$html$Html$Attributes$stringProperty('className'); +var $elm$html$Html$div = _VirtualDom_node('div'); +var $author$project$Main$Continue = {$: 'Continue'}; +var $author$project$Main$Pause = {$: 'Pause'}; +var $author$project$Main$Run = {$: 'Run'}; +var $author$project$Main$SetDelay = function (a) { + return {$: 'SetDelay', a: a}; }; -var _minond$brainfuck$Main$UpdateProgramInput = function (a) { - return {ctor: 'UpdateProgramInput', _0: a}; +var $author$project$Main$SetProgram = function (a) { + return {$: 'SetProgram', a: a}; }; -var _minond$brainfuck$Main$editorOutput = function (model) { - var output = A2(_elm_lang$core$Maybe$withDefault, 'none', model.output); - return { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('mt3'), - _1: {ctor: '[]'} - }, - {ctor: '[]'}), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$lbl('Input'), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('pb2 mb2'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$input, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('w-50 f6 monospace'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$id('readBuffer'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html_Events$onInput(_minond$brainfuck$Main$UpdateProgramInput), - _1: {ctor: '[]'} - } - } - }, - {ctor: '[]'}), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$lbl('Output'), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('pb2 mb2'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _minond$brainfuck$Main$mono(output), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - } - } - } - } - }; +var $author$project$Main$Step = {$: 'Step'}; +var $elm$json$Json$Decode$at = F2( + function (fields, decoder) { + return A3($elm$core$List$foldr, $elm$json$Json$Decode$field, decoder, fields); + }); +var $elm$html$Html$button = _VirtualDom_node('button'); +var $elm$virtual_dom$VirtualDom$text = _VirtualDom_text; +var $elm$html$Html$text = $elm$virtual_dom$VirtualDom$text; +var $author$project$Main$btn = F2( + function (attrs, val) { + return A2( + $elm$html$Html$button, + _Utils_ap( + _List_fromArray( + [ + $elm$html$Html$Attributes$class('mr2 mb2 pointer') + ]), + attrs), + _List_fromArray( + [ + $elm$html$Html$text(val) + ])); + }); +var $elm$html$Html$input = _VirtualDom_node('input'); +var $author$project$Main$lbl = function (txt) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('f6 mb2 gray i') + ]), + _List_fromArray( + [ + $elm$html$Html$text(txt) + ])); +}; +var $elm$virtual_dom$VirtualDom$Normal = function (a) { + return {$: 'Normal', a: a}; +}; +var $elm$virtual_dom$VirtualDom$on = _VirtualDom_on; +var $elm$html$Html$Events$on = F2( + function (event, decoder) { + return A2( + $elm$virtual_dom$VirtualDom$on, + event, + $elm$virtual_dom$VirtualDom$Normal(decoder)); + }); +var $elm$html$Html$Events$onClick = function (msg) { + return A2( + $elm$html$Html$Events$on, + 'click', + $elm$json$Json$Decode$succeed(msg)); }; -var _minond$brainfuck$Main$EditorInput = function (a) { - return {ctor: 'EditorInput', _0: a}; +var $elm$html$Html$Events$alwaysStop = function (x) { + return _Utils_Tuple2(x, true); }; -var _minond$brainfuck$Main$editorProgram = function (_p15) { - var _p16 = _p15; - var getProgram = A2( - _elm_lang$core$Json_Decode$map, +var $elm$virtual_dom$VirtualDom$MayStopPropagation = function (a) { + return {$: 'MayStopPropagation', a: a}; +}; +var $elm$html$Html$Events$stopPropagationOn = F2( + function (event, decoder) { + return A2( + $elm$virtual_dom$VirtualDom$on, + event, + $elm$virtual_dom$VirtualDom$MayStopPropagation(decoder)); + }); +var $elm$html$Html$Events$targetValue = A2( + $elm$json$Json$Decode$at, + _List_fromArray( + ['target', 'value']), + $elm$json$Json$Decode$string); +var $elm$html$Html$Events$onInput = function (tagger) { + return A2( + $elm$html$Html$Events$stopPropagationOn, + 'input', + A2( + $elm$json$Json$Decode$map, + $elm$html$Html$Events$alwaysStop, + A2($elm$json$Json$Decode$map, tagger, $elm$html$Html$Events$targetValue))); +}; +var $elm$html$Html$option = _VirtualDom_node('option'); +var $elm$html$Html$select = _VirtualDom_node('select'); +var $elm$core$Debug$toString = _Debug_toString; +var $elm$html$Html$Attributes$type_ = $elm$html$Html$Attributes$stringProperty('type'); +var $elm$html$Html$Attributes$value = $elm$html$Html$Attributes$stringProperty('value'); +var $author$project$Main$editorControls = function (_v0) { + var delay = _v0.delay; + var setProgram = A2( + $elm$json$Json$Decode$map, function (s) { - return _minond$brainfuck$Main$EditorInput(s); + return $author$project$Main$SetProgram(s); }, A2( - _elm_lang$core$Json_Decode$at, - { - ctor: '::', - _0: 'target', - _1: { - ctor: '::', - _0: 'innerText', - _1: {ctor: '[]'} - } - }, - _elm_lang$core$Json_Decode$string)); - return { - ctor: '::', - _0: A2( - _elm_lang$html$Html$textarea, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$spellcheck(false), - _1: { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('editor'), - _1: { - ctor: '::', - _0: A2(_elm_lang$html$Html_Events$on, 'keyup', getProgram), - _1: {ctor: '[]'} - } - } - }, - { - ctor: '::', - _0: _elm_lang$html$Html$text(_p16.program), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - }; + $elm$json$Json$Decode$at, + _List_fromArray( + ['target', 'value']), + $elm$json$Json$Decode$string)); + return _List_fromArray( + [ + $author$project$Main$lbl('Load a program'), + A2( + $elm$html$Html$select, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('w-50 mb3'), + A2($elm$html$Html$Events$on, 'change', setProgram) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$option, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('helloworld.bf') + ])), + A2( + $elm$html$Html$option, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('cat-buffer.bf') + ])), + A2( + $elm$html$Html$option, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('cat-stream.bf') + ])), + A2( + $elm$html$Html$option, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('squares.bf') + ])), + A2( + $elm$html$Html$option, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('fib.bf') + ])), + A2( + $elm$html$Html$option, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('random.bf') + ])) + ])), + $author$project$Main$lbl( + 'Change evaluation delay (' + ($elm$core$Debug$toString(delay) + ')')), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('w-50 mb3'), + $elm$html$Html$Attributes$type_('range'), + $elm$html$Html$Events$onInput($author$project$Main$SetDelay), + $elm$html$Html$Attributes$value( + $elm$core$Debug$toString(delay)) + ]), + _List_Nil), + $author$project$Main$lbl('Program controls'), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('mb2') + ]), + _List_fromArray( + [ + A2( + $author$project$Main$btn, + _List_fromArray( + [ + $elm$html$Html$Events$onClick($author$project$Main$Run) + ]), + 'Run'), + A2( + $author$project$Main$btn, + _List_fromArray( + [ + $elm$html$Html$Events$onClick($author$project$Main$Pause) + ]), + 'Pause'), + A2( + $author$project$Main$btn, + _List_fromArray( + [ + $elm$html$Html$Events$onClick($author$project$Main$Step) + ]), + 'Step'), + A2( + $author$project$Main$btn, + _List_fromArray( + [ + $elm$html$Html$Events$onClick($author$project$Main$Continue) + ]), + 'Continue') + ])) + ]); +}; +var $elm$core$Array$fromListHelp = F3( + function (list, nodeList, nodeListSize) { + fromListHelp: + while (true) { + var _v0 = A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, list); + var jsArray = _v0.a; + var remainingItems = _v0.b; + if (_Utils_cmp( + $elm$core$Elm$JsArray$length(jsArray), + $elm$core$Array$branchFactor) < 0) { + return A2( + $elm$core$Array$builderToArray, + true, + {nodeList: nodeList, nodeListSize: nodeListSize, tail: jsArray}); + } else { + var $temp$list = remainingItems, + $temp$nodeList = A2( + $elm$core$List$cons, + $elm$core$Array$Leaf(jsArray), + nodeList), + $temp$nodeListSize = nodeListSize + 1; + list = $temp$list; + nodeList = $temp$nodeList; + nodeListSize = $temp$nodeListSize; + continue fromListHelp; + } + } + }); +var $elm$core$Array$fromList = function (list) { + if (!list.b) { + return $elm$core$Array$empty; + } else { + return A3($elm$core$Array$fromListHelp, list, _List_Nil, 0); + } }; -var _minond$brainfuck$Main$SetProgram = function (a) { - return {ctor: 'SetProgram', _0: a}; +var $elm$core$Array$filter = F2( + function (isGood, array) { + return $elm$core$Array$fromList( + A3( + $elm$core$Array$foldr, + F2( + function (x, xs) { + return isGood(x) ? A2($elm$core$List$cons, x, xs) : xs; + }), + _List_Nil, + array)); + }); +var $elm$core$Bitwise$and = _Bitwise_and; +var $elm$core$Bitwise$shiftRightZfBy = _Bitwise_shiftRightZfBy; +var $elm$core$Array$bitMask = 4294967295 >>> (32 - $elm$core$Array$shiftStep); +var $elm$core$Basics$ge = _Utils_ge; +var $elm$core$Elm$JsArray$unsafeGet = _JsArray_unsafeGet; +var $elm$core$Array$getHelp = F3( + function (shift, index, tree) { + getHelp: + while (true) { + var pos = $elm$core$Array$bitMask & (index >>> shift); + var _v0 = A2($elm$core$Elm$JsArray$unsafeGet, pos, tree); + if (_v0.$ === 'SubTree') { + var subTree = _v0.a; + var $temp$shift = shift - $elm$core$Array$shiftStep, + $temp$index = index, + $temp$tree = subTree; + shift = $temp$shift; + index = $temp$index; + tree = $temp$tree; + continue getHelp; + } else { + var values = _v0.a; + return A2($elm$core$Elm$JsArray$unsafeGet, $elm$core$Array$bitMask & index, values); + } + } + }); +var $elm$core$Bitwise$shiftLeftBy = _Bitwise_shiftLeftBy; +var $elm$core$Array$tailIndex = function (len) { + return (len >>> 5) << 5; }; -var _minond$brainfuck$Main$SetDelay = function (a) { - return {ctor: 'SetDelay', _0: a}; +var $elm$core$Array$get = F2( + function (index, _v0) { + var len = _v0.a; + var startShift = _v0.b; + var tree = _v0.c; + var tail = _v0.d; + return ((index < 0) || (_Utils_cmp(index, len) > -1)) ? $elm$core$Maybe$Nothing : ((_Utils_cmp( + index, + $elm$core$Array$tailIndex(len)) > -1) ? $elm$core$Maybe$Just( + A2($elm$core$Elm$JsArray$unsafeGet, $elm$core$Array$bitMask & index, tail)) : $elm$core$Maybe$Just( + A3($elm$core$Array$getHelp, startShift, index, tree))); + }); +var $elm$core$Array$length = function (_v0) { + var len = _v0.a; + return len; }; -var _minond$brainfuck$Main$Output = function (a) { - return {ctor: 'Output', _0: a}; +var $elm$html$Html$code = _VirtualDom_node('code'); +var $author$project$Main$mono = function (str) { + return A2( + $elm$html$Html$code, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('f6 ph1 tc bg-light-gray word-wrap') + ]), + _List_fromArray( + [ + $elm$html$Html$text(str) + ])); +}; +var $elm$html$Html$p = _VirtualDom_node('p'); +var $elm$html$Html$span = _VirtualDom_node('span'); +var $author$project$Main$editorInformation = function (_v0) { + var program = _v0.program; + var output_ = _v0.output_; + var idx = _v0.idx; + var steps = _v0.steps; + var programSize = $elm$core$String$length(program); + var outputMessage = function () { + if (output_.$ === 'Nothing') { + return $elm$html$Html$text('The program has had no output yet.'); + } else { + var str = output_.a; + return A2( + $elm$html$Html$span, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Output length is '), + $author$project$Main$mono( + $elm$core$Debug$toString( + $elm$core$String$length(str))), + $elm$html$Html$text(' characters long.') + ])); + } + }(); + var isOptcode = function (opt_) { + return A2($elm$core$String$contains, opt_, '+-[]<>,.'); + }; + var opts = A2( + $elm$core$Array$filter, + isOptcode, + $elm$core$Array$fromList( + A2($elm$core$String$split, '', program))); + var opt = A2( + $elm$core$Maybe$withDefault, + ' ', + A2($elm$core$Array$get, idx, opts)); + var codeSize = $elm$core$Array$length(opts); + return _List_fromArray( + [ + A2( + $elm$html$Html$p, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('lh-copy') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Here’s some information about your program: it is '), + $author$project$Main$mono( + $elm$core$Debug$toString(programSize)), + $elm$html$Html$text(' bytes, '), + $author$project$Main$mono( + $elm$core$Debug$toString(codeSize)), + $elm$html$Html$text(' of which are valid commands. The interpreter is going to interpret the character at index '), + $author$project$Main$mono( + $elm$core$Debug$toString(idx)), + $elm$html$Html$text(', which is '), + $author$project$Main$mono(opt), + $elm$html$Html$text(', and has taken a total of '), + $author$project$Main$mono( + $elm$core$Debug$toString(steps)), + $elm$html$Html$text(' steps so far. '), + outputMessage + ])) + ]); +}; +var $elm$html$Html$li = _VirtualDom_node('li'); +var $elm$html$Html$a = _VirtualDom_node('a'); +var $elm$html$Html$Attributes$href = function (url) { + return A2( + $elm$html$Html$Attributes$stringProperty, + 'href', + _VirtualDom_noJavaScriptUri(url)); }; -var _minond$brainfuck$Main$Tick = function (a) { - return {ctor: 'Tick', _0: a}; +var $author$project$Main$link = F2( + function (title, shref) { + return A2( + $elm$html$Html$a, + _List_fromArray( + [ + $elm$html$Html$Attributes$href(shref), + $elm$html$Html$Attributes$class('link blue') + ]), + _List_fromArray( + [ + $elm$html$Html$text(title) + ])); + }); +var $elm$html$Html$ul = _VirtualDom_node('ul'); +var $author$project$Main$editorIntroduction = _List_fromArray( + [ + A2( + $elm$html$Html$p, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('mt0 lh-copy') + ]), + _List_fromArray( + [ + A2($author$project$Main$link, 'Brainfuck', 'https://esolangs.org/wiki/Brainfuck'), + $elm$html$Html$text(', one of the '), + A2($author$project$Main$link, 'esoteric programming languages', 'https://esolangs.org/wiki/Esoteric_programming_language'), + $elm$html$Html$text(' you’ve probably heard of. Partly because of its minimal instruction set but most likely because it has the word '), + A2( + $elm$html$Html$span, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('i') + ]), + _List_fromArray( + [ + $elm$html$Html$text('fuck') + ])), + $elm$html$Html$text(' in its name. That said this language doesn’t have to leave you thinking '), + A2( + $elm$html$Html$span, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('i') + ]), + _List_fromArray( + [ + $elm$html$Html$text('wtf?') + ])), + $elm$html$Html$text('. My intention for building this Brainfuck debugger is to have a tool for learning this language and do it in a visual way, where you can see what your program is doing step by step.') + ])), + A2( + $elm$html$Html$p, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('lh-copy') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Besides this text you’ll see buttons you can use to execute your program, which can be done in continuation or one command at a time, and as your program is running you can slide the range input field to alter the speed at which the code runs. Below those controls you’ll notice a table filled with 0’s (at least before you run a program), this is the internal memory. And finally your code editor, where you can set breakpoints by clicking on commands that will halt your program’s execution. Now for a quick introduction to the language: ') + ])), + A2( + $elm$html$Html$ul, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('pl4 lh-copy') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$li, + _List_Nil, + _List_fromArray( + [ + $author$project$Main$mono('<'), + $elm$html$Html$text(' and '), + $author$project$Main$mono('>'), + $elm$html$Html$text(' move the pointer to the left and to the right. Keep an on the memory cells to the right -- the cell that has a black background color is the active cell and the one where increment, decrement, and loops will act on or check.') + ])), + A2( + $elm$html$Html$li, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('pt2') + ]), + _List_fromArray( + [ + $author$project$Main$mono('+'), + $elm$html$Html$text(' and '), + $author$project$Main$mono('-'), + $elm$html$Html$text(' increment and decrement the active cell. Note that incrementing above 255 will ‘wrap’ the value back around to 0, and decrementing below 0 will take you to 255.') + ])), + A2( + $elm$html$Html$li, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('pt2') + ]), + _List_fromArray( + [ + $author$project$Main$mono('['), + $elm$html$Html$text(' and '), + $author$project$Main$mono(']'), + $elm$html$Html$text(' are the language’s only control flow operators. The code inside of the loop is ran as long as that value of the active cell is not zero. Think of it as a '), + $author$project$Main$mono('while (ptr != 0) {}'), + $elm$html$Html$text(' loop.') + ])), + A2( + $elm$html$Html$li, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('pt2') + ]), + _List_fromArray( + [ + $author$project$Main$mono('.'), + $elm$html$Html$text(' and '), + $author$project$Main$mono(','), + $elm$html$Html$text(' are the io functions. A period will output the character associated with the '), + A2($author$project$Main$link, 'ASCII', 'https://en.wikipedia.org/wiki/ASCII'), + $elm$html$Html$text(' in the active cell (so if the active cell has a value of 97 and you output its value, you should get an ‘a’.) You\'ll notice an input field labeled as `input`. This is where you can predefine the input for your program and if this is empty, the editor will prompt for the input intead.') + ])) + ])), + A2( + $elm$html$Html$p, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('lh-copy') + ]), + _List_fromArray( + [ + $elm$html$Html$text('So play around with this tool. Start by running the sample code or creating basic programs on your own and see for yourself how with even the most basic control flow and altering commands you can technically accomplish any task. If you’re curious about the code and the interpreter that are running on this page, '), + A2($author$project$Main$link, 'go here', 'https://github.com/minond/brainfuck'), + $elm$html$Html$text(', and if you’d like to learn more about Brainfuck and other really interesting esoteric programming languages then I recommend heading over to '), + A2($author$project$Main$link, 'Esolang', 'https://esolangs.org/wiki/Main_Page'), + $elm$html$Html$text('.') + ])) + ]); +var $elm$core$Tuple$second = function (_v0) { + var y = _v0.b; + return y; +}; +var $elm$html$Html$Attributes$classList = function (classes) { + return $elm$html$Html$Attributes$class( + A2( + $elm$core$String$join, + ' ', + A2( + $elm$core$List$map, + $elm$core$Tuple$first, + A2($elm$core$List$filter, $elm$core$Tuple$second, classes)))); }; -var _minond$brainfuck$Main$subscriptions = function (model) { - return _elm_lang$core$Platform_Sub$batch( - { - ctor: '::', - _0: _minond$brainfuck$Main$tick(_minond$brainfuck$Main$Tick), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$output(_minond$brainfuck$Main$Output), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$unload(_minond$brainfuck$Main$EditorInput), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$breakpoint(_minond$brainfuck$Main$Breakpoint), - _1: {ctor: '[]'} - } +var $elm$core$List$drop = F2( + function (n, list) { + drop: + while (true) { + if (n <= 0) { + return list; + } else { + if (!list.b) { + return list; + } else { + var x = list.a; + var xs = list.b; + var $temp$n = n - 1, + $temp$list = xs; + n = $temp$n; + list = $temp$list; + continue drop; } } - }); -}; -var _minond$brainfuck$Main$Pause = {ctor: 'Pause'}; -var _minond$brainfuck$Main$Continue = {ctor: 'Continue'}; -var _minond$brainfuck$Main$Step = {ctor: 'Step'}; -var _minond$brainfuck$Main$Run = {ctor: 'Run'}; -var _minond$brainfuck$Main$editorControls = function (_p17) { - var _p18 = _p17; - var _p19 = _p18.delay; - var setProgram = A2( - _elm_lang$core$Json_Decode$map, - function (s) { - return _minond$brainfuck$Main$SetProgram(s); - }, - A2( - _elm_lang$core$Json_Decode$at, - { - ctor: '::', - _0: 'target', - _1: { - ctor: '::', - _0: 'value', - _1: {ctor: '[]'} + } + }); +var $elm$core$List$takeReverse = F3( + function (n, list, kept) { + takeReverse: + while (true) { + if (n <= 0) { + return kept; + } else { + if (!list.b) { + return kept; + } else { + var x = list.a; + var xs = list.b; + var $temp$n = n - 1, + $temp$list = xs, + $temp$kept = A2($elm$core$List$cons, x, kept); + n = $temp$n; + list = $temp$list; + kept = $temp$kept; + continue takeReverse; } - }, - _elm_lang$core$Json_Decode$string)); - return { - ctor: '::', - _0: _minond$brainfuck$Main$lbl('Load a program'), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$select, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('w-50 mb3'), - _1: { - ctor: '::', - _0: A2(_elm_lang$html$Html_Events$on, 'change', setProgram), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$option, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text('helloworld.bf'), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$option, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text('cat-buffer.bf'), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$option, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text('cat-stream.bf'), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$option, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text('squares.bf'), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$option, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text('fib.bf'), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$option, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text('random.bf'), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} + } + } + }); +var $elm$core$List$takeTailRec = F2( + function (n, list) { + return $elm$core$List$reverse( + A3($elm$core$List$takeReverse, n, list, _List_Nil)); + }); +var $elm$core$List$takeFast = F3( + function (ctr, n, list) { + if (n <= 0) { + return _List_Nil; + } else { + var _v0 = _Utils_Tuple2(n, list); + _v0$1: + while (true) { + _v0$5: + while (true) { + if (!_v0.b.b) { + return list; + } else { + if (_v0.b.b.b) { + switch (_v0.a) { + case 1: + break _v0$1; + case 2: + var _v2 = _v0.b; + var x = _v2.a; + var _v3 = _v2.b; + var y = _v3.a; + return _List_fromArray( + [x, y]); + case 3: + if (_v0.b.b.b.b) { + var _v4 = _v0.b; + var x = _v4.a; + var _v5 = _v4.b; + var y = _v5.a; + var _v6 = _v5.b; + var z = _v6.a; + return _List_fromArray( + [x, y, z]); + } else { + break _v0$5; } - } - } - } - } - }), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$lbl( - A2( - _elm_lang$core$Basics_ops['++'], - 'Change evaluation delay (', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString(_p19), - ')'))), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$input, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('w-50 mb3'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$type_('range'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html_Events$onInput(_minond$brainfuck$Main$SetDelay), - _1: { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$value( - _elm_lang$core$Basics$toString(_p19)), - _1: {ctor: '[]'} + default: + if (_v0.b.b.b.b && _v0.b.b.b.b.b) { + var _v7 = _v0.b; + var x = _v7.a; + var _v8 = _v7.b; + var y = _v8.a; + var _v9 = _v8.b; + var z = _v9.a; + var _v10 = _v9.b; + var w = _v10.a; + var tl = _v10.b; + return (ctr > 1000) ? A2( + $elm$core$List$cons, + x, + A2( + $elm$core$List$cons, + y, + A2( + $elm$core$List$cons, + z, + A2( + $elm$core$List$cons, + w, + A2($elm$core$List$takeTailRec, n - 4, tl))))) : A2( + $elm$core$List$cons, + x, + A2( + $elm$core$List$cons, + y, + A2( + $elm$core$List$cons, + z, + A2( + $elm$core$List$cons, + w, + A3($elm$core$List$takeFast, ctr + 1, n - 4, tl))))); + } else { + break _v0$5; } - } } - }, - {ctor: '[]'}), - _1: { - ctor: '::', - _0: _minond$brainfuck$Main$lbl('Program controls'), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('mb2'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _minond$brainfuck$Main$btn, - { - ctor: '::', - _0: _elm_lang$html$Html_Events$onClick(_minond$brainfuck$Main$Run), - _1: {ctor: '[]'} - }, - 'Run'), - _1: { - ctor: '::', - _0: A2( - _minond$brainfuck$Main$btn, - { - ctor: '::', - _0: _elm_lang$html$Html_Events$onClick(_minond$brainfuck$Main$Pause), - _1: {ctor: '[]'} - }, - 'Pause'), - _1: { - ctor: '::', - _0: A2( - _minond$brainfuck$Main$btn, - { - ctor: '::', - _0: _elm_lang$html$Html_Events$onClick(_minond$brainfuck$Main$Step), - _1: {ctor: '[]'} - }, - 'Step'), - _1: { - ctor: '::', - _0: A2( - _minond$brainfuck$Main$btn, - { - ctor: '::', - _0: _elm_lang$html$Html_Events$onClick(_minond$brainfuck$Main$Continue), - _1: {ctor: '[]'} - }, - 'Continue'), - _1: {ctor: '[]'} - } - } - } - }), - _1: {ctor: '[]'} + } else { + if (_v0.a === 1) { + break _v0$1; + } else { + break _v0$5; + } } } } + return list; } + var _v1 = _v0.b; + var x = _v1.a; + return _List_fromArray( + [x]); } - }; -}; -var _minond$brainfuck$Main$view = function (model) { - return A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('cf pa3 pa4-ns container helvetica'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _minond$brainfuck$Main$editorTitle, - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('fl w-100 w-50-ns editor-section'), - _1: {ctor: '[]'} - }, - _minond$brainfuck$Main$editorIntroduction), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('fl w-100 w-50-ns editor-section'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$section, - {ctor: '[]'}, - _minond$brainfuck$Main$editorControls(model)), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$section, - {ctor: '[]'}, - _minond$brainfuck$Main$editorMemory(model)), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$section, - {ctor: '[]'}, - _minond$brainfuck$Main$editorOutput(model)), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$section, - {ctor: '[]'}, - _minond$brainfuck$Main$editorProgram(model)), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$section, - {ctor: '[]'}, - _minond$brainfuck$Main$editorInformation(model)), - _1: {ctor: '[]'} - } - } - } - } - }), - _1: {ctor: '[]'} - } + }); +var $elm$core$List$take = F2( + function (n, list) { + return A3($elm$core$List$takeFast, 0, n, list); + }); +var $elm_community$list_extra$List$Extra$greedyGroupsOfWithStep = F3( + function (size, step, xs) { + var xs_ = A2($elm$core$List$drop, step, xs); + var okayXs = $elm$core$List$length(xs) > 0; + var okayArgs = (size > 0) && (step > 0); + return (okayArgs && okayXs) ? A2( + $elm$core$List$cons, + A2($elm$core$List$take, size, xs), + A3($elm_community$list_extra$List$Extra$greedyGroupsOfWithStep, size, step, xs_)) : _List_Nil; + }); +var $elm_community$list_extra$List$Extra$greedyGroupsOf = F2( + function (size, xs) { + return A3($elm_community$list_extra$List$Extra$greedyGroupsOfWithStep, size, size, xs); + }); +var $elm$core$List$repeatHelp = F3( + function (result, n, value) { + repeatHelp: + while (true) { + if (n <= 0) { + return result; + } else { + var $temp$result = A2($elm$core$List$cons, value, result), + $temp$n = n - 1, + $temp$value = value; + result = $temp$result; + n = $temp$n; + value = $temp$value; + continue repeatHelp; } + } + }); +var $elm$core$List$repeat = F2( + function (n, value) { + return A3($elm$core$List$repeatHelp, _List_Nil, n, value); + }); +var $author$project$Main$editorMemory = function (_v0) { + var memory = _v0.memory; + var pointer = _v0.pointer; + var pageSize = 10; + var memSize = $elm$core$List$length(memory); + var padded = (_Utils_cmp(memSize, pageSize) < 0) ? _Utils_ap( + memory, + A2($elm$core$List$repeat, pageSize - memSize, 0)) : memory; + var isActive = F2( + function (offset, index) { + return _Utils_eq((pageSize * offset) + index, pointer); }); -}; -var _minond$brainfuck$Main$main = function () { - var model = _minond$brainfuck$Main$initialModel; - return _elm_lang$html$Html$program( - { - init: { - ctor: '_Tuple2', - _0: model, - _1: _minond$brainfuck$Main$cmd( - { - ctor: '_Tuple2', - _0: 'init', - _1: _elm_lang$core$Maybe$Just( - _minond$brainfuck$Main$toRuntime(model)) - }) - }, - view: _minond$brainfuck$Main$view, - update: _minond$brainfuck$Main$update, - subscriptions: _minond$brainfuck$Main$subscriptions + var asCell = F3( + function (offset, index, val) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('memcell'), + $elm$html$Html$Attributes$classList( + _List_fromArray( + [ + _Utils_Tuple2( + 'selected', + A2(isActive, offset, index)) + ])) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text( + $elm$core$Debug$toString(val)) + ])) + ])); }); -}()(); - -var Elm = {}; -Elm['Main'] = Elm['Main'] || {}; -if (typeof _minond$brainfuck$Main$main !== 'undefined') { - _minond$brainfuck$Main$main(Elm['Main'], 'Main', undefined); -} - -if (typeof define === "function" && define['amd']) -{ - define([], function() { return Elm; }); - return; -} - -if (typeof module === "object") -{ - module['exports'] = Elm; - return; -} - -var globalElm = this['Elm']; -if (typeof globalElm === "undefined") -{ - this['Elm'] = Elm; - return; -} - -for (var publicModule in Elm) -{ - if (publicModule in globalElm) - { - throw new Error('There are two Elm modules called `' + publicModule + '` on this page! Rename one of them.'); - } - globalElm[publicModule] = Elm[publicModule]; -} - -}).call(this); - + var asRow = F2( + function (index, vals) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('cellrow') + ]), + A2( + $elm$core$List$indexedMap, + asCell(index), + vals)); + }); + return _List_fromArray( + [ + $author$project$Main$lbl('Program memory'), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('mb3') + ]), + A2( + $elm$core$List$indexedMap, + asRow, + A2($elm_community$list_extra$List$Extra$greedyGroupsOf, pageSize, padded))) + ]); +}; +var $author$project$Main$UpdateProgramInput = function (a) { + return {$: 'UpdateProgramInput', a: a}; +}; +var $elm$html$Html$Attributes$id = $elm$html$Html$Attributes$stringProperty('id'); +var $author$project$Main$editorOutput = function (model) { + var output_ = A2($elm$core$Maybe$withDefault, 'none', model.output_); + return _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('mt3') + ]), + _List_Nil), + $author$project$Main$lbl('Input'), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('pb2 mb2') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('w-50 f6 monospace'), + $elm$html$Html$Attributes$id('readBuffer'), + $elm$html$Html$Events$onInput($author$project$Main$UpdateProgramInput) + ]), + _List_Nil) + ])), + $author$project$Main$lbl('Output'), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('pb2 mb2') + ]), + _List_fromArray( + [ + $author$project$Main$mono(output_) + ])) + ]); +}; +var $elm$json$Json$Encode$bool = _Json_wrap; +var $elm$html$Html$Attributes$boolProperty = F2( + function (key, bool) { + return A2( + _VirtualDom_property, + key, + $elm$json$Json$Encode$bool(bool)); + }); +var $elm$html$Html$Attributes$spellcheck = $elm$html$Html$Attributes$boolProperty('spellcheck'); +var $elm$html$Html$textarea = _VirtualDom_node('textarea'); +var $author$project$Main$editorProgram = function (_v0) { + var program = _v0.program; + var getProgram = A2( + $elm$json$Json$Decode$map, + function (s) { + return $author$project$Main$EditorInput(s); + }, + A2( + $elm$json$Json$Decode$at, + _List_fromArray( + ['target', 'innerText']), + $elm$json$Json$Decode$string)); + return _List_fromArray( + [ + A2( + $elm$html$Html$textarea, + _List_fromArray( + [ + $elm$html$Html$Attributes$spellcheck(false), + $elm$html$Html$Attributes$class('editor'), + A2($elm$html$Html$Events$on, 'keyup', getProgram) + ]), + _List_fromArray( + [ + $elm$html$Html$text(program) + ])) + ]); +}; +var $elm$html$Html$h1 = _VirtualDom_node('h1'); +var $author$project$Main$editorTitle = A2( + $elm$html$Html$h1, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('mt0 f3 f2-m f1-l title fw1 baskerville') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Brainfuck') + ])); +var $elm$html$Html$section = _VirtualDom_node('section'); +var $author$project$Main$view = function (model) { + return { + body: _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('cf pa3 pa4-ns container helvetica') + ]), + _List_fromArray( + [ + $author$project$Main$editorTitle, + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('fl w-100 w-50-ns editor-section') + ]), + $author$project$Main$editorIntroduction), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('fl w-100 w-50-ns editor-section') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$section, + _List_Nil, + $author$project$Main$editorControls(model)), + A2( + $elm$html$Html$section, + _List_Nil, + $author$project$Main$editorMemory(model)), + A2( + $elm$html$Html$section, + _List_Nil, + $author$project$Main$editorOutput(model)), + A2( + $elm$html$Html$section, + _List_Nil, + $author$project$Main$editorProgram(model)), + A2( + $elm$html$Html$section, + _List_Nil, + $author$project$Main$editorInformation(model)) + ])) + ])) + ]), + title: 'Brainfuck' + }; +}; +var $author$project$Main$main = function () { + var model = $author$project$Main$initialModel; + var init = function (_v0) { + return _Utils_Tuple2( + model, + $author$project$Main$cmd( + _Utils_Tuple2( + 'init', + $elm$core$Maybe$Just( + $author$project$Main$toRuntime(model))))); + }; + return $elm$browser$Browser$document( + {init: init, subscriptions: $author$project$Main$subscriptions, update: $author$project$Main$update, view: $author$project$Main$view}); +}(); +_Platform_export({'Main':{'init':$author$project$Main$main( + $elm$json$Json$Decode$succeed(_Utils_Tuple0))(0)}});}(this)); \ No newline at end of file diff --git a/elm-package.json b/elm-package.json deleted file mode 100644 index d1ff4b6..0000000 --- a/elm-package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "1.0.0", - "summary": "A Brainfuck debugger and memory visualizer in your browser.", - "repository": "https://github.com/minond/brainfuck.git", - "license": "BSD3", - "source-directories": [ - ".", - "src" - ], - "exposed-modules": [], - "dependencies": { - "elm-community/list-extra": "6.1.0 <= v < 7.0.0", - "elm-lang/core": "5.1.1 <= v < 6.0.0", - "elm-lang/html": "2.0.0 <= v < 3.0.0" - }, - "elm-version": "0.18.0 <= v < 0.19.0" -} diff --git a/elm.json b/elm.json new file mode 100644 index 0000000..04b1b1a --- /dev/null +++ b/elm.json @@ -0,0 +1,25 @@ +{ + "type": "application", + "source-directories": [ + "src" + ], + "elm-version": "0.19.1", + "dependencies": { + "direct": { + "elm/browser": "1.0.0", + "elm/core": "1.0.0", + "elm/html": "1.0.0", + "elm/json": "1.0.0", + "elm-community/list-extra": "8.5.1" + }, + "indirect": { + "elm/time": "1.0.0", + "elm/url": "1.0.0", + "elm/virtual-dom": "1.0.0" + } + }, + "test-dependencies": { + "direct": {}, + "indirect": {} + } +} diff --git a/index.html b/index.html index a7bdfa8..4699329 100644 --- a/index.html +++ b/index.html @@ -146,7 +146,7 @@ border: 1px solid #c0c0c0; outline: 0; height: 300px; - overflow: auto; + overflow: hidden; font-family: monospace; padding: .75rem; } @@ -186,7 +186,7 @@