diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index d9ea21e..62f45c7 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -2,7 +2,7 @@ name: Deploy to GitHub Pages on: push: branches: - - main + - master jobs: build-and-deploy: runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index df8f073..ec42c0a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -.idea -elm-stuff \ No newline at end of file +js/main.js \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 553c9da..0000000 --- a/LICENSE +++ /dev/null @@ -1,35 +0,0 @@ -VSH Public License v1 - -Copyright (c) 2021 Viktor A. Rozenko Voitenko - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -=== LIABILITY AND WARRANTY - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -=== SOFTWARE VERSION MESSAGE - -SOFTWARE VERSION MESSAGE IS A LINE OF TEXT THAT APPEARS UPON EXECUTION OF THE -"version" COMMAND: - - vsh vX.X.X by Viktor A. Rozenko Voitenko - -ANY PERSON OR GROUP THAT HAS A COPY OF THE SOFTWARE AND USES IT PUBLICALLY -(WHERE "PUBLIC" AFFAIRS INCLUDE BUT ARE NOT LIMITED TO USING A MODIFIED VERSION -OF THIS CODE FOR A PUBLIC WEBSITE, RESEARCH, OR DEMONSTRATION OF ANY KIND) MUST -NOT MODIFY ANY OF THE CODE RELATED TO THE SOFTWARE VERSION MESSAGE, INCLUDING -THE SEMANTIC VERSIONING TAG AND AUTHOR'S NAME. diff --git a/README.md b/README.md deleted file mode 100644 index 0ebeaae..0000000 --- a/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# My Personal Website - -![cli to my <3](img/demo.png) - -**Note:** In order to properly emulate a terminal, I had to ditch `textarea` and -use a plain `div` block, capturing key presses manually. Therefore, this app -will **not** work on mobile devices, unless your phone happens to have a -keyboard connected to it. - -## Change Log - -### v0.1.3 - -- `CTRL + ` combinations no longer result in text being displayed. They - are treated as either special bindings within terminal and produce effect - there or are interpreted as browser bindings and ignored. -- `CTRL + e` = `exit` -- `CTRL + ;` = `clear` - -### v0.1.2 - -- Stylistic changes. -- Rich commands. -- Terminal colours for contrast and clarity. - -### v0.1.1 - -- `top`, `cv`, `jobs` commands added. - -### v0.1.0 - -- Basic functionality -- `whoami`, `help`, `version`, `touch` commands. diff --git a/assets/cv.pdf b/assets/cv.pdf new file mode 100644 index 0000000..c8ceb7f Binary files /dev/null and b/assets/cv.pdf differ diff --git a/dist/assets/github.svg b/assets/github.svg similarity index 100% rename from dist/assets/github.svg rename to assets/github.svg diff --git a/dist/assets/gmail.svg b/assets/gmail.svg similarity index 100% rename from dist/assets/gmail.svg rename to assets/gmail.svg diff --git a/build b/build deleted file mode 100755 index 70fa7ea..0000000 --- a/build +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -LOCAL_DIST_DIR=dist - -elm make src/Main.elm --output $LOCAL_DIST_DIR/js/main.js \ No newline at end of file diff --git a/dist/css/about.css b/css/about.css similarity index 92% rename from dist/css/about.css rename to css/about.css index 9571433..843f7a0 100644 --- a/dist/css/about.css +++ b/css/about.css @@ -14,6 +14,8 @@ background-color: #79db75; color: #006b47; transition: all 0.3s; + display: inline-block; + margin: 15px 10px; } .about-button:hover { -webkit-box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.5); diff --git a/dist/css/common.css b/css/common.css similarity index 89% rename from dist/css/common.css rename to css/common.css index 4328b22..a876af1 100644 --- a/dist/css/common.css +++ b/css/common.css @@ -4,6 +4,7 @@ flex-direction: column; justify-content: center; } + .app-top { padding-top: 25px; min-height: calc(100% - 25px); @@ -24,7 +25,9 @@ -webkit-box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.5); -moz-box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.5); box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.5); + z-index: 500; } + .navbar-icon { display: inline-block; line-height: 60px; @@ -38,10 +41,12 @@ text-decoration: none; position: relative; } + .navbar-icon:hover { background-color: #efefef; transition: background 0.3s; } + .navbar-icon-active::after { content: ""; height: 5px; @@ -54,6 +59,7 @@ background-color: #ccc; transition: background 0.3s; } + .navbar-icon-active:hover::after { background: transparent; transition: background 0.3s; @@ -71,6 +77,16 @@ line-height: 2rem; } +.link { + color: #006b47; + font-weight: 600; + text-decoration: none; +} + +.link:hover { + text-decoration: underline; +} + @media screen and (max-width: 550px) { .h1 { font-size: 32px; @@ -92,3 +108,8 @@ -moz-box-shadow: 0px 3px 7px 0px rgba(0, 0, 0, 0.3); box-shadow: 0px 3px 7px 0px rgba(0, 0, 0, 0.3); } + +.transparent { + opacity: 0 !important; + transition: opacity 0.3s; +} diff --git a/dist/css/main.css b/css/main.css similarity index 73% rename from dist/css/main.css rename to css/main.css index ede3745..1638642 100644 --- a/dist/css/main.css +++ b/css/main.css @@ -1,16 +1,18 @@ @import url("https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@500&display=swap"); + @import "common.css"; @import "about.css"; -@import "skills.css"; @import "vsh.css"; +@import "typer.css"; * { padding: 0; margin: 0; outline: none; - font-family: "Open Sans", Helvetica, Tahoma, Geneva, Verdana, sans-serif; } body { height: 100vh; + font-family: "Open Sans", Helvetica, Tahoma, Geneva, Verdana, sans-serif; } diff --git a/css/typer.css b/css/typer.css new file mode 100644 index 0000000..a85f5bd --- /dev/null +++ b/css/typer.css @@ -0,0 +1,54 @@ +.typer-bg { + padding: 25px 0; + background-color: #efead0; + min-height: calc(100% - 50px); +} + +.typer-info { + height: 140px; + opacity: 1; + transition: opacity 0.3s; +} + +.typer-h1 { + color: #333538; +} + +.typer-h3 { + color: #8f8e84; + line-height: 1.8rem; + margin: 5px 0; +} + +.typer-url { + color: #333538; + text-decoration: underline; +} + +.typer-highlight { + display: inline-block; + padding: 0 8px; + background-color: #333538; + color: #efead0; + border-radius: 5px; +} + +.typer-text { + font-family: "Roboto Mono", monospace; + font-size: 28px; + text-align: left; + width: 95%; + max-width: 750px; + margin: auto; + line-height: 1.5em; +} +.typer-text-grey { + color: #8f8e84; +} +.typer-text-black { + color: #333538; +} +.typer-text-red { + color: #c43c53; + background-color: #ffced3; +} diff --git a/dist/css/vsh.css b/css/vsh.css similarity index 93% rename from dist/css/vsh.css rename to css/vsh.css index 2d3aed9..3148f7b 100644 --- a/dist/css/vsh.css +++ b/css/vsh.css @@ -1,5 +1,3 @@ -@import url("https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@500&display=swap"); - .vsh-bg { background-color: #dce7ff; } diff --git a/dist/.gitignore b/dist/.gitignore deleted file mode 100644 index bc42fd6..0000000 --- a/dist/.gitignore +++ /dev/null @@ -1 +0,0 @@ -js \ No newline at end of file diff --git a/dist/css/skills.css b/dist/css/skills.css deleted file mode 100644 index caa0329..0000000 --- a/dist/css/skills.css +++ /dev/null @@ -1,55 +0,0 @@ -.skills-bg { - background-color: #fff4c4; -} - -.skills-h1 { - color: #ff7700; -} - -.skills-h3 { - color: #ff851b; -} - -.skills-row { - display: flex; - justify-content: space-evenly; -} - -.skills-card { - width: 40%; - min-width: max-content; - max-width: 350px; - padding: 15px; - background-color: white; - border-radius: 10px; - -webkit-box-shadow: 0px 3px 7px 0px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0px 3px 7px 0px rgba(0, 0, 0, 0.3); - box-shadow: 0px 3px 7px 0px rgba(0, 0, 0, 0.3); - margin: 15px 0; -} -.skills-card h2 { - color: #ff7700; -} -.skills-card h3 { - color: #ff851b; - margin-top: 10px; -} -.skills-pill { - display: inline-block; - margin: 15px 10px 0 0; - background-color: #fff4c4; - color: #ff7700; - padding: 5px 10px; - border-radius: 20px; - text-decoration: none; -} - -@media screen and (max-width: 550px) { - .skills-row { - flex-direction: column; - } - .skills-card { - width: 80%; - margin: 10px auto; - } -} diff --git a/dist/index.html b/dist/index.html deleted file mode 100644 index a32ab63..0000000 --- a/dist/index.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - Loading... - - - - -
- - - diff --git a/elm.json b/elm.json deleted file mode 100644 index a0d8b33..0000000 --- a/elm.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "application", - "source-directories": [ - "src" - ], - "elm-version": "0.19.1", - "dependencies": { - "direct": { - "elm/browser": "1.0.2", - "elm/core": "1.0.5", - "elm/html": "1.0.0", - "elm/json": "1.1.3", - "elm/time": "1.0.0", - "elm/url": "1.0.0", - "pilatch/flip": "1.0.0" - }, - "indirect": { - "elm/virtual-dom": "1.0.2" - } - }, - "test-dependencies": { - "direct": {}, - "indirect": {} - } -} diff --git a/img/demo.png b/img/demo.png deleted file mode 100644 index 7b56a85..0000000 Binary files a/img/demo.png and /dev/null differ diff --git a/index.html b/index.html index 5fd3140..9b69e21 100644 --- a/index.html +++ b/index.html @@ -1,28 +1,18 @@ - - - - - Loading... - - - - -
- - - + + + + + + Loading... + + + + + +
+ + + + \ No newline at end of file diff --git a/js/main.js b/js/main.js new file mode 100644 index 0000000..c531f30 --- /dev/null +++ b/js/main.js @@ -0,0 +1,9257 @@ +(function(scope){ +'use strict'; + +function F(arity, fun, wrapper) { + wrapper.a = arity; + wrapper.f = fun; + return wrapper; +} + +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); }; }; + }); +} +function F4(fun) { + return F(4, fun, function(a) { return function(b) { return function(c) { + return function(d) { return fun(a, b, c, d); }; }; }; + }); +} +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); }; }; }; }; + }); +} +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); }; }; }; }; }; + }); +} +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); }; }; }; }; }; }; + }); +} +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); }; }; }; }; }; }; }; + }); +} +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); }; }; }; }; }; }; }; }; + }); +} + +function A2(fun, a, b) { + return fun.a === 2 ? fun.f(a, b) : fun(a)(b); +} +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.a === 4 ? fun.f(a, b, c, d) : fun(a)(b)(c)(d); +} +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.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.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.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.a === 9 ? fun.f(a, b, c, d, e, f, g, h, i) : fun(a)(b)(c)(d)(e)(f)(g)(h)(i); +} + + + + +// EQUALITY + +function _Utils_eq(x, y) +{ + 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 _Utils_eqHelp(x, y, depth, stack) +{ + if (x === y) + { + return true; + } + + if (typeof x !== 'object' || x === null || y === null) + { + typeof x === 'function' && _Debug_crash(5); + return false; + } + + if (depth > 100) + { + stack.push(_Utils_Tuple2(x,y)); + return true; + } + + /**_UNUSED/ + 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') + { + x = $elm$core$Dict$toList(x); + y = $elm$core$Dict$toList(y); + } + //*/ + + /**/ + if (x.$ < 0) + { + x = $elm$core$Dict$toList(x); + y = $elm$core$Dict$toList(y); + } + //*/ + + for (var key in x) + { + 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); }); + + + +// 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 x === y ? /*EQ*/ 0 : x < y ? /*LT*/ -1 : /*GT*/ 1; + } + + /**_UNUSED/ + if (x instanceof String) + { + var a = x.valueOf(); + var b = y.valueOf(); + return a === b ? 0 : a < b ? -1 : 1; + } + //*/ + + /**/ + if (typeof x.$ === 'undefined') + //*/ + /**_UNUSED/ + if (x.$[0] === '#') + //*/ + { + return (ord = _Utils_cmp(x.a, y.a)) + ? ord + : (ord = _Utils_cmp(x.b, y.b)) + ? ord + : _Utils_cmp(x.c, y.c); + } + + // 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); +} + +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; }); + +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; +}); + + +// COMMON VALUES + +var _Utils_Tuple0 = 0; +var _Utils_Tuple0_UNUSED = { $: '#0' }; + +function _Utils_Tuple2(a, b) { return { a: a, b: b }; } +function _Utils_Tuple2_UNUSED(a, b) { return { $: '#2', a: a, b: b }; } + +function _Utils_Tuple3(a, b, c) { return { a: a, b: b, c: c }; } +function _Utils_Tuple3_UNUSED(a, b, c) { return { $: '#3', a: a, b: b, c: c }; } + +function _Utils_chr(c) { return c; } +function _Utils_chr_UNUSED(c) { return new String(c); } + + +// RECORDS + +function _Utils_update(oldRecord, updatedFields) +{ + var newRecord = {}; + + for (var key in oldRecord) + { + newRecord[key] = oldRecord[key]; + } + + for (var key in updatedFields) + { + newRecord[key] = updatedFields[key]; + } + + return newRecord; +} + + +// APPEND + +var _Utils_append = F2(_Utils_ap); + +function _Utils_ap(xs, ys) +{ + // append Strings + if (typeof xs === 'string') + { + return xs + ys; + } + + // append Lists + if (!xs.b) + { + 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; +} + + + +var _List_Nil = { $: 0 }; +var _List_Nil_UNUSED = { $: '[]' }; + +function _List_Cons(hd, tl) { return { $: 1, a: hd, b: tl }; } +function _List_Cons_UNUSED(hd, tl) { return { $: '::', a: hd, b: tl }; } + + +var _List_cons = F2(_List_Cons); + +function _List_fromArray(arr) +{ + var out = _List_Nil; + for (var i = arr.length; i--; ) + { + out = _List_Cons(arr[i], out); + } + return out; +} + +function _List_toArray(xs) +{ + for (var out = []; xs.b; xs = xs.b) // WHILE_CONS + { + out.push(xs.a); + } + return out; +} + +var _List_map2 = F3(function(f, xs, ys) +{ + for (var arr = []; xs.b && ys.b; xs = xs.b, ys = ys.b) // WHILE_CONSES + { + arr.push(A2(f, xs.a, ys.a)); + } + return _List_fromArray(arr); +}); + +var _List_map3 = F4(function(f, xs, ys, zs) +{ + 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) +{ + 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) +{ + 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); +}); + +var _List_sortBy = F2(function(f, xs) +{ + 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 [value]; +} + +function _JsArray_length(array) +{ + return array.length; +} + +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; +}); + +var _JsArray_initializeFromList = F2(function (max, ls) +{ + var result = new Array(max); + + 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 array[index]; +}); + +var _JsArray_unsafeSet = F3(function(index, value, array) +{ + 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) +{ + var length = array.length; + var result = new Array(length + 1); + + for (var i = 0; i < length; i++) + { + result[i] = array[i]; + } + + result[length] = value; + return result; +}); + +var _JsArray_foldl = F3(function(func, acc, array) +{ + var length = array.length; + + for (var i = 0; i < length; i++) + { + acc = A2(func, array[i], acc); + } + + return acc; +}); + +var _JsArray_foldr = F3(function(func, acc, array) +{ + for (var i = array.length - 1; i >= 0; i--) + { + acc = A2(func, array[i], acc); + } + + return acc; +}); + +var _JsArray_map = F2(function(func, array) +{ + 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 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) +{ + return array.slice(from, to); +}); + +var _JsArray_appendN = F3(function(n, dest, source) +{ + var destLen = dest.length; + var itemsToCopy = n - destLen; + + if (itemsToCopy > source.length) + { + itemsToCopy = source.length; + } + + var size = destLen + itemsToCopy; + var result = new Array(size); + + for (var i = 0; i < destLen; i++) + { + result[i] = dest[i]; + } + + for (var i = 0; i < itemsToCopy; i++) + { + result[i + destLen] = source[i]; + } + + return result; +}); + + + +// LOG + +var _Debug_log = F2(function(tag, value) +{ + return value; +}); + +var _Debug_log_UNUSED = 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); + }; +} + + +// TO STRING + +function _Debug_toString(value) +{ + return ''; +} + +function _Debug_toString_UNUSED(value) +{ + return _Debug_toAnsiString(false, value); +} + +function _Debug_toAnsiString(ansi, value) +{ + if (typeof value === 'function') + { + return _Debug_internalColor(ansi, ''); + } + + if (typeof value === 'boolean') + { + return _Debug_ctorColor(ansi, value ? 'True' : 'False'); + } + + if (typeof value === 'number') + { + return _Debug_numberColor(ansi, value + ''); + } + + if (value instanceof String) + { + return _Debug_charColor(ansi, "'" + _Debug_addSlashes(value, true) + "'"); + } + + if (typeof value === 'string') + { + return _Debug_stringColor(ansi, '"' + _Debug_addSlashes(value, false) + '"'); + } + + if (typeof value === 'object' && '$' in value) + { + var tag = value.$; + + if (typeof tag === 'number') + { + return _Debug_internalColor(ansi, ''); + } + + if (tag[0] === '#') + { + var output = []; + for (var k in value) + { + if (k === '$') continue; + output.push(_Debug_toAnsiString(ansi, value[k])); + } + return '(' + output.join(',') + ')'; + } + + if (tag === 'Set_elm_builtin') + { + return _Debug_ctorColor(ansi, 'Set') + + _Debug_fadeColor(ansi, '.fromList') + ' ' + + _Debug_toAnsiString(ansi, $elm$core$Set$toList(value)); + } + + if (tag === 'RBNode_elm_builtin' || tag === 'RBEmpty_elm_builtin') + { + return _Debug_ctorColor(ansi, 'Dict') + + _Debug_fadeColor(ansi, '.fromList') + ' ' + + _Debug_toAnsiString(ansi, $elm$core$Dict$toList(value)); + } + + if (tag === 'Array_elm_builtin') + { + return _Debug_ctorColor(ansi, 'Array') + + _Debug_fadeColor(ansi, '.fromList') + ' ' + + _Debug_toAnsiString(ansi, $elm$core$Array$toList(value)); + } + + if (tag === '::' || tag === '[]') + { + var output = '['; + + value.b && (output += _Debug_toAnsiString(ansi, value.a), value = value.b) + + for (; value.b; value = value.b) // WHILE_CONS + { + output += ',' + _Debug_toAnsiString(ansi, value.a); + } + return output + ']'; + } + + 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; + } + + if (typeof DataView === 'function' && value instanceof DataView) + { + return _Debug_stringColor(ansi, '<' + value.byteLength + ' bytes>'); + } + + if (typeof File !== 'undefined' && value instanceof File) + { + return _Debug_internalColor(ansi, '<' + value.name + '>'); + } + + if (typeof value === 'object') + { + var output = []; + for (var key in value) + { + 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 _Debug_internalColor(ansi, ''); +} + +function _Debug_addSlashes(str, isChar) +{ + 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) + { + return s.replace(/\'/g, '\\\''); + } + else + { + return s.replace(/\"/g, '\\"'); + } +} + +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; +} + +function _Debug_stringColor(ansi, string) +{ + return ansi ? '\x1b[93m' + string + '\x1b[0m' : string; +} + +function _Debug_charColor(ansi, string) +{ + return ansi ? '\x1b[92m' + string + '\x1b[0m' : string; +} + +function _Debug_fadeColor(ansi, string) +{ + return ansi ? '\x1b[37m' + string + '\x1b[0m' : string; +} + +function _Debug_internalColor(ansi, string) +{ + return ansi ? '\x1b[36m' + string + '\x1b[0m' : string; +} + +function _Debug_toHexDigit(n) +{ + return String.fromCharCode(n < 10 ? 48 + n : 55 + n); +} + + +// CRASH + + +function _Debug_crash(identifier) +{ + throw new Error('https://github.com/elm/core/blob/1.0.0/hints/' + identifier + '.md'); +} + + +function _Debug_crash_UNUSED(identifier, fact1, fact2, fact3, fact4) +{ + switch(identifier) + { + 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.'); + + 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.'); + + 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.'); + + case 4: + var portName = fact1; + var problem = fact2; + throw new Error('Trying to send an unexpected type of value through port `' + portName + '`:\n' + problem); + + 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.'); + + 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!'); + + 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.'); + } +} + +function _Debug_regionToString(region) +{ + if (region.O.N === region.M.N) + { + return 'on line ' + region.O.N; + } + return 'on lines ' + region.O.N + ' through ' + region.M.N; +} + + + +// MATH + +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); + +var _Basics_remainderBy = F2(function(b, a) { return a % b; }); + +// 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; +}); + + +// 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); + + +// MORE MATH + +function _Basics_toFloat(x) { return x; } +function _Basics_truncate(n) { return n | 0; } +function _Basics_isInfinite(n) { return n === Infinity || n === -Infinity; } + +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 chr + str; +}); + +function _String_uncons(string) +{ + var word = string.charCodeAt(0); + return !isNaN(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; +} + +var _String_append = F2(function(a, b) +{ + return a + b; +}); + +function _String_length(str) +{ + return str.length; +} + +var _String_map = F2(function(func, string) +{ + var len = string.length; + var array = new Array(len); + var i = 0; + while (i < len) + { + 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 array.join(''); +}); + +var _String_filter = F2(function(isGood, str) +{ + var arr = []; + var len = str.length; + var i = 0; + while (i < len) + { + 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 arr.join(''); +}); + +function _String_reverse(str) +{ + var len = str.length; + var arr = new Array(len); + var i = 0; + while (i < len) + { + 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 arr.join(''); +} + +var _String_foldl = F3(function(func, state, string) +{ + 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 state; +}); + +var _String_foldr = F3(function(func, state, string) +{ + 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 state; +}); + +var _String_split = F2(function(sep, str) +{ + return str.split(sep); +}); + +var _String_join = F2(function(sep, strs) +{ + return strs.join(sep); +}); + +var _String_slice = F3(function(start, end, str) { + return str.slice(start, end); +}); + +function _String_trim(str) +{ + return str.trim(); +} + +function _String_trimLeft(str) +{ + return str.replace(/^\s+/, ''); +} + +function _String_trimRight(str) +{ + return str.replace(/\s+$/, ''); +} + +function _String_words(str) +{ + return _List_fromArray(str.trim().split(/\s+/g)); +} + +function _String_lines(str) +{ + return _List_fromArray(str.split(/\r\n|\r|\n/g)); +} + +function _String_toUpper(str) +{ + return str.toUpperCase(); +} + +function _String_toLower(str) +{ + return str.toLowerCase(); +} + +var _String_any = F2(function(isGood, string) +{ + 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; + } + if (isGood(_Utils_chr(char))) + { + return true; + } + } + return false; +}); + +var _String_all = F2(function(isGood, string) +{ + 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; + } + if (!isGood(_Utils_chr(char))) + { + return false; + } + } + return true; +}); + +var _String_contains = F2(function(sub, str) +{ + return str.indexOf(sub) > -1; +}); + +var _String_startsWith = F2(function(sub, str) +{ + return str.indexOf(sub) === 0; +}); + +var _String_endsWith = F2(function(sub, str) +{ + return str.length >= sub.length && + str.lastIndexOf(sub) === str.length - sub.length; +}); + +var _String_indexes = F2(function(sub, str) +{ + var subLen = sub.length; + + if (subLen < 1) + { + return _List_Nil; + } + + 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 number + ''; +} + + +// INT CONVERSIONS + +function _String_toInt(str) +{ + 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); +} + + +// FLOAT CONVERSIONS + +function _String_toFloat(s) +{ + // 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 _String_fromList(chars) +{ + return _List_toArray(chars).join(''); +} + + + + +function _Char_toCode(char) +{ + var code = char.charCodeAt(0); + if (0xD800 <= code && code <= 0xDBFF) + { + return (code - 0xD800) * 0x400 + char.charCodeAt(1) - 0xDC00 + 0x10000 + } + return code; +} + +function _Char_fromCode(code) +{ + return _Utils_chr( + (code < 0 || 0x10FFFF < code) + ? '\uFFFD' + : + (code <= 0xFFFF) + ? String.fromCharCode(code) + : + (code -= 0x10000, + String.fromCharCode(Math.floor(code / 0x400) + 0xD800, code % 0x400 + 0xDC00) + ) + ); +} + +function _Char_toUpper(char) +{ + return _Utils_chr(char.toUpperCase()); +} + +function _Char_toLower(char) +{ + return _Utils_chr(char.toLowerCase()); +} + +function _Char_toLocaleUpper(char) +{ + return _Utils_chr(char.toLocaleUpperCase()); +} + +function _Char_toLocaleLower(char) +{ + return _Utils_chr(char.toLocaleLowerCase()); +} + + + +/**_UNUSED/ +function _Json_errorToString(error) +{ + return $elm$json$Json$Decode$errorToString(error); +} +//*/ + + +// CORE DECODERS + +function _Json_succeed(msg) +{ + return { + $: 0, + a: msg + }; +} + +function _Json_fail(msg) +{ + return { + $: 1, + a: msg + }; +} + +function _Json_decodePrim(decoder) +{ + return { $: 2, b: decoder }; +} + +var _Json_decodeInt = _Json_decodePrim(function(value) { + return (typeof value !== 'number') + ? _Json_expecting('an INT', value) + : + (-2147483647 < value && value < 2147483647 && (value | 0) === value) + ? $elm$core$Result$Ok(value) + : + (isFinite(value) && !(value % 1)) + ? $elm$core$Result$Ok(value) + : _Json_expecting('an INT', value); +}); + +var _Json_decodeBool = _Json_decodePrim(function(value) { + return (typeof value === 'boolean') + ? $elm$core$Result$Ok(value) + : _Json_expecting('a BOOL', value); +}); + +var _Json_decodeFloat = _Json_decodePrim(function(value) { + return (typeof value === 'number') + ? $elm$core$Result$Ok(value) + : _Json_expecting('a FLOAT', value); +}); + +var _Json_decodeValue = _Json_decodePrim(function(value) { + return $elm$core$Result$Ok(_Json_wrap(value)); +}); + +var _Json_decodeString = _Json_decodePrim(function(value) { + return (typeof value === 'string') + ? $elm$core$Result$Ok(value) + : (value instanceof String) + ? $elm$core$Result$Ok(value + '') + : _Json_expecting('a STRING', value); +}); + +function _Json_decodeList(decoder) { return { $: 3, b: decoder }; } +function _Json_decodeArray(decoder) { return { $: 4, b: decoder }; } + +function _Json_decodeNull(value) { return { $: 5, c: value }; } + +var _Json_decodeField = F2(function(field, decoder) +{ + return { + $: 6, + d: field, + b: decoder + }; +}); + +var _Json_decodeIndex = F2(function(index, decoder) +{ + return { + $: 7, + e: index, + b: decoder + }; +}); + +function _Json_decodeKeyValuePairs(decoder) +{ + return { + $: 8, + b: decoder + }; +} + +function _Json_mapMany(f, decoders) +{ + return { + $: 9, + f: f, + g: decoders + }; +} + +var _Json_andThen = F2(function(callback, decoder) +{ + return { + $: 10, + b: decoder, + h: callback + }; +}); + +function _Json_oneOf(decoders) +{ + return { + $: 11, + g: decoders + }; +} + + +// DECODING OBJECTS + +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]); +}); + +var _Json_map3 = F4(function(f, d1, d2, d3) +{ + return _Json_mapMany(f, [d1, d2, d3]); +}); + +var _Json_map4 = F5(function(f, d1, d2, d3, d4) +{ + return _Json_mapMany(f, [d1, d2, d3, d4]); +}); + +var _Json_map5 = F6(function(f, d1, d2, d3, d4, d5) +{ + return _Json_mapMany(f, [d1, d2, d3, d4, d5]); +}); + +var _Json_map6 = F7(function(f, d1, d2, d3, d4, d5, d6) +{ + return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6]); +}); + +var _Json_map7 = F8(function(f, d1, d2, d3, d4, d5, d6, d7) +{ + return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7]); +}); + +var _Json_map8 = F9(function(f, d1, d2, d3, d4, d5, d6, d7, d8) +{ + return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7, d8]); +}); + + +// DECODE + +var _Json_runOnString = F2(function(decoder, string) +{ + try + { + var value = JSON.parse(string); + return _Json_runHelp(decoder, value); + } + catch (e) + { + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'This is not valid JSON! ' + e.message, _Json_wrap(string))); + } +}); + +var _Json_run = F2(function(decoder, value) +{ + return _Json_runHelp(decoder, _Json_unwrap(value)); +}); + +function _Json_runHelp(decoder, value) +{ + switch (decoder.$) + { + case 2: + return decoder.b(value); + + case 5: + return (value === null) + ? $elm$core$Result$Ok(decoder.c) + : _Json_expecting('null', value); + + case 3: + if (!_Json_isArray(value)) + { + return _Json_expecting('a LIST', value); + } + return _Json_runArrayDecoder(decoder.b, value, _List_fromArray); + + case 4: + if (!_Json_isArray(value)) + { + return _Json_expecting('an ARRAY', value); + } + return _Json_runArrayDecoder(decoder.b, value, _Json_toElmArray); + + case 6: + 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)); + + case 7: + var index = decoder.e; + if (!_Json_isArray(value)) + { + return _Json_expecting('an ARRAY', value); + } + if (index >= value.length) + { + return _Json_expecting('a LONGER array. Need index ' + index + ' but only see ' + value.length + ' entries', value); + } + 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 8: + if (typeof value !== 'object' || value === null || _Json_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)); + } + keyValuePairs = _List_Cons(_Utils_Tuple2(key, result.a), keyValuePairs); + } + } + return $elm$core$Result$Ok($elm$core$List$reverse(keyValuePairs)); + + case 9: + var answer = decoder.f; + var decoders = decoder.g; + for (var i = 0; i < decoders.length; i++) + { + var result = _Json_runHelp(decoders[i], value); + if (!$elm$core$Result$isOk(result)) + { + return result; + } + answer = answer(result.a); + } + return $elm$core$Result$Ok(answer); + + case 10: + var result = _Json_runHelp(decoder.b, value); + return (!$elm$core$Result$isOk(result)) + ? result + : _Json_runHelp(decoder.h(result.a), value); + + case 11: + 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); + } +} + +function _Json_runArrayDecoder(decoder, value, toElmValue) +{ + var len = value.length; + var array = new Array(len); + for (var i = 0; i < len; i++) + { + var result = _Json_runHelp(decoder, value[i]); + if (!$elm$core$Result$isOk(result)) + { + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, i, result.a)); + } + array[i] = result.a; + } + return $elm$core$Result$Ok(toElmValue(array)); +} + +function _Json_isArray(value) +{ + return Array.isArray(value) || (typeof FileList !== 'undefined' && value instanceof FileList); +} + +function _Json_toElmArray(array) +{ + return A2($elm$core$Array$initialize, array.length, function(i) { return array[i]; }); +} + +function _Json_expecting(type, value) +{ + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'Expecting ' + type, _Json_wrap(value))); +} + + +// EQUALITY + +function _Json_equality(x, y) +{ + if (x === y) + { + return true; + } + + if (x.$ !== y.$) + { + return false; + } + + switch (x.$) + { + case 0: + case 1: + return x.a === y.a; + + case 2: + return x.b === y.b; + + case 5: + return x.c === y.c; + + case 3: + case 4: + case 8: + return _Json_equality(x.b, y.b); + + case 6: + return x.d === y.d && _Json_equality(x.b, y.b); + + case 7: + return x.e === y.e && _Json_equality(x.b, y.b); + + case 9: + return x.f === y.f && _Json_listEquality(x.g, y.g); + + case 10: + return x.h === y.h && _Json_equality(x.b, y.b); + + case 11: + return _Json_listEquality(x.g, y.g); + } +} + +function _Json_listEquality(aDecoders, bDecoders) +{ + var len = aDecoders.length; + if (len !== bDecoders.length) + { + return false; + } + for (var i = 0; i < len; i++) + { + if (!_Json_equality(aDecoders[i], bDecoders[i])) + { + return false; + } + } + return true; +} + + +// ENCODE + +var _Json_encode = F2(function(indentLevel, value) +{ + return JSON.stringify(_Json_unwrap(value), null, indentLevel) + ''; +}); + +function _Json_wrap_UNUSED(value) { return { $: 0, a: value }; } +function _Json_unwrap_UNUSED(value) { return value.a; } + +function _Json_wrap(value) { return value; } +function _Json_unwrap(value) { return value; } + +function _Json_emptyArray() { return []; } +function _Json_emptyObject() { return {}; } + +var _Json_addField = F3(function(key, value, object) +{ + object[key] = _Json_unwrap(value); + return object; +}); + +function _Json_addEntry(func) +{ + return F2(function(entry, array) + { + array.push(_Json_unwrap(func(entry))); + return array; + }); +} + +var _Json_encodeNull = _Json_wrap(null); + + + +// TASKS + +function _Scheduler_succeed(value) +{ + return { + $: 0, + a: value + }; +} + +function _Scheduler_fail(error) +{ + return { + $: 1, + a: error + }; +} + +function _Scheduler_binding(callback) +{ + return { + $: 2, + b: callback, + c: null + }; +} + +var _Scheduler_andThen = F2(function(callback, task) +{ + return { + $: 3, + b: callback, + d: task + }; +}); + +var _Scheduler_onError = F2(function(callback, task) +{ + return { + $: 4, + b: callback, + d: task + }; +}); + +function _Scheduler_receive(callback) +{ + return { + $: 5, + b: callback + }; +} + + +// PROCESSES + +var _Scheduler_guid = 0; + +function _Scheduler_rawSpawn(task) +{ + var proc = { + $: 0, + e: _Scheduler_guid++, + f: task, + g: null, + h: [] + }; + + _Scheduler_enqueue(proc); + + return proc; +} + +function _Scheduler_spawn(task) +{ + return _Scheduler_binding(function(callback) { + callback(_Scheduler_succeed(_Scheduler_rawSpawn(task))); + }); +} + +function _Scheduler_rawSend(proc, msg) +{ + proc.h.push(msg); + _Scheduler_enqueue(proc); +} + +var _Scheduler_send = F2(function(proc, msg) +{ + return _Scheduler_binding(function(callback) { + _Scheduler_rawSend(proc, msg); + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +}); + +function _Scheduler_kill(proc) +{ + return _Scheduler_binding(function(callback) { + var task = proc.f; + if (task.$ === 2 && task.c) + { + task.c(); + } + + proc.f = null; + + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +} + + +/* STEP PROCESSES + +type alias Process = + { $ : tag + , id : unique_id + , root : Task + , stack : null | { $: SUCCEED | FAIL, a: callback, b: stack } + , mailbox : [msg] + } + +*/ + + +var _Scheduler_working = false; +var _Scheduler_queue = []; + + +function _Scheduler_enqueue(proc) +{ + _Scheduler_queue.push(proc); + if (_Scheduler_working) + { + return; + } + _Scheduler_working = true; + while (proc = _Scheduler_queue.shift()) + { + _Scheduler_step(proc); + } + _Scheduler_working = false; +} + + +function _Scheduler_step(proc) +{ + while (proc.f) + { + var rootTag = proc.f.$; + if (rootTag === 0 || rootTag === 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; + } + else if (rootTag === 2) + { + proc.f.c = proc.f.b(function(newRoot) { + proc.f = newRoot; + _Scheduler_enqueue(proc); + }); + return; + } + else if (rootTag === 5) + { + if (proc.h.length === 0) + { + return; + } + proc.f = proc.f.b(proc.h.shift()); + } + else // if (rootTag === 3 || rootTag === 4) + { + proc.g = { + $: rootTag === 3 ? 0 : 1, + b: proc.f.b, + i: proc.g + }; + proc.f = proc.f.d; + } + } +} + + + +function _Process_sleep(time) +{ + return _Scheduler_binding(function(callback) { + var id = setTimeout(function() { + callback(_Scheduler_succeed(_Utils_Tuple0)); + }, time); + + return function() { clearTimeout(id); }; + }); +} + + + + +// PROGRAMS + + +var _Platform_worker = F4(function(impl, flagDecoder, debugMetadata, args) +{ + return _Platform_initialize( + flagDecoder, + args, + impl.a6, + impl.bo, + impl.bm, + function() { return function() {} } + ); +}); + + + +// INITIALIZE A PROGRAM + + +function _Platform_initialize(flagDecoder, args, init, update, subscriptions, stepperBuilder) +{ + var result = A2(_Json_run, flagDecoder, _Json_wrap(args ? args['flags'] : undefined)); + $elm$core$Result$isOk(result) || _Debug_crash(2 /**_UNUSED/, _Json_errorToString(result.a) /**/); + var managers = {}; + var initPair = init(result.a); + var model = initPair.a; + var stepper = stepperBuilder(sendToApp, model); + var ports = _Platform_setupEffects(managers, sendToApp); + + function sendToApp(msg, viewMetadata) + { + var pair = A2(update, msg, model); + stepper(model = pair.a, viewMetadata); + _Platform_enqueueEffects(managers, pair.b, subscriptions(model)); + } + + _Platform_enqueueEffects(managers, initPair.b, subscriptions(model)); + + return ports ? { ports: ports } : {}; +} + + + +// 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; + + +function _Platform_registerPreload(url) +{ + _Platform_preload.add(url); +} + + + +// EFFECT MANAGERS + + +var _Platform_effectManagers = {}; + + +function _Platform_setupEffects(managers, sendToApp) +{ + var ports; + + // setup all necessary effect managers + for (var key in _Platform_effectManagers) + { + var manager = _Platform_effectManagers[key]; + + if (manager.a) + { + ports = ports || {}; + ports[key] = manager.a(key, sendToApp); + } + + managers[key] = _Platform_instantiateManager(manager, sendToApp); + } + + return ports; +} + + +function _Platform_createManager(init, onEffects, onSelfMsg, cmdMap, subMap) +{ + return { + b: init, + c: onEffects, + d: onSelfMsg, + e: cmdMap, + f: subMap + }; +} + + +function _Platform_instantiateManager(info, sendToApp) +{ + var router = { + g: sendToApp, + h: undefined + }; + + var onEffects = info.c; + var onSelfMsg = info.d; + var cmdMap = info.e; + var subMap = info.f; + + function loop(state) + { + 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 router.h = _Scheduler_rawSpawn(A2(_Scheduler_andThen, loop, info.b)); +} + + + +// ROUTING + + +var _Platform_sendToApp = F2(function(router, msg) +{ + return _Scheduler_binding(function(callback) + { + router.g(msg); + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +}); + + +var _Platform_sendToSelf = F2(function(router, msg) +{ + return A2(_Scheduler_send, router.h, { + $: 0, + a: msg + }); +}); + + + +// BAGS + + +function _Platform_leaf(home) +{ + return function(value) + { + return { + $: 1, + k: home, + l: value + }; + }; +} + + +function _Platform_batch(list) +{ + return { + $: 2, + m: list + }; +} + + +var _Platform_map = F2(function(tagger, bag) +{ + return { + $: 3, + n: tagger, + o: bag + } +}); + + + +// PIPE BAGS INTO EFFECT MANAGERS +// +// Effects must be queued! +// +// Say your init contains a synchronous command, like Time.now or Time.here +// +// - This will produce a batch of effects (FX_1) +// - The synchronous task triggers the subsequent `update` call +// - This will produce a batch of effects (FX_2) +// +// If we just start dispatching FX_2, subscriptions from FX_2 can be processed +// before subscriptions from FX_1. No good! Earlier versions of this code had +// this problem, leading to these reports: +// +// https://github.com/elm/core/issues/980 +// https://github.com/elm/core/pull/981 +// https://github.com/elm/compiler/issues/1776 +// +// The queue is necessary to avoid ordering issues for synchronous commands. + + +// Why use true/false here? Why not just check the length of the queue? +// The goal is to detect "are we currently dispatching effects?" If we +// are, we need to bail and let the ongoing while loop handle things. +// +// Now say the queue has 1 element. When we dequeue the final element, +// the queue will be empty, but we are still actively dispatching effects. +// So you could get queue jumping in a really tricky category of cases. +// +var _Platform_effectsQueue = []; +var _Platform_effectsActive = false; + + +function _Platform_enqueueEffects(managers, cmdBag, subBag) +{ + _Platform_effectsQueue.push({ p: managers, q: cmdBag, r: subBag }); + + if (_Platform_effectsActive) return; + + _Platform_effectsActive = true; + for (var fx; fx = _Platform_effectsQueue.shift(); ) + { + _Platform_dispatchEffects(fx.p, fx.q, fx.r); + } + _Platform_effectsActive = false; +} + + +function _Platform_dispatchEffects(managers, cmdBag, subBag) +{ + var effectsDict = {}; + _Platform_gatherEffects(true, cmdBag, effectsDict, null); + _Platform_gatherEffects(false, subBag, effectsDict, null); + + for (var home in managers) + { + _Scheduler_rawSend(managers[home], { + $: 'fx', + a: effectsDict[home] || { i: _List_Nil, j: _List_Nil } + }); + } +} + + +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; + + 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, { + s: bag.n, + t: taggers + }); + return; + } +} + + +function _Platform_toEffect(isCmd, home, taggers, value) +{ + function applyTaggers(x) + { + for (var temp = taggers; temp; temp = temp.t) + { + x = temp.s(x); + } + return x; + } + + var map = isCmd + ? _Platform_effectManagers[home].e + : _Platform_effectManagers[home].f; + + return A2(map, applyTaggers, value) +} + + +function _Platform_insert(isCmd, newEffect, effects) +{ + effects = effects || { i: _List_Nil, j: _List_Nil }; + + isCmd + ? (effects.i = _List_Cons(newEffect, effects.i)) + : (effects.j = _List_Cons(newEffect, effects.j)); + + return effects; +} + + + +// PORTS + + +function _Platform_checkPortName(name) +{ + if (_Platform_effectManagers[name]) + { + _Debug_crash(3, name) + } +} + + + +// OUTGOING PORTS + + +function _Platform_outgoingPort(name, converter) +{ + _Platform_checkPortName(name); + _Platform_effectManagers[name] = { + e: _Platform_outgoingPortMap, + u: converter, + a: _Platform_setupOutgoingPort + }; + return _Platform_leaf(name); +} + + +var _Platform_outgoingPortMap = F2(function(tagger, value) { return value; }); + + +function _Platform_setupOutgoingPort(name) +{ + var subs = []; + var converter = _Platform_effectManagers[name].u; + + // CREATE MANAGER + + var init = _Process_sleep(0); + + _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; + }); + + // 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 _Platform_incomingPort(name, converter) +{ + _Platform_checkPortName(name); + _Platform_effectManagers[name] = { + f: _Platform_incomingPortMap, + u: converter, + a: _Platform_setupIncomingPort + }; + return _Platform_leaf(name); +} + + +var _Platform_incomingPortMap = F2(function(tagger, finalTagger) +{ + return function(value) + { + return tagger(finalTagger(value)); + }; +}); + + +function _Platform_setupIncomingPort(name, sendToApp) +{ + var subs = _List_Nil; + var converter = _Platform_effectManagers[name].u; + + // CREATE MANAGER + + var init = _Scheduler_succeed(null); + + _Platform_effectManagers[name].b = init; + _Platform_effectManagers[name].c = F3(function(router, subList, state) + { + subs = subList; + return init; + }); + + // PUBLIC API + + function send(incomingValue) + { + var result = A2(_Json_run, converter, _Json_wrap(incomingValue)); + + $elm$core$Result$isOk(result) || _Debug_crash(4, name, result.a); + + var value = result.a; + for (var temp = subs; temp.b; temp = temp.b) // WHILE_CONS + { + sendToApp(temp.a(value)); + } + } + + return { send: send }; +} + + + +// 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. +// + + +function _Platform_export(exports) +{ + scope['Elm'] + ? _Platform_mergeExportsProd(scope['Elm'], exports) + : scope['Elm'] = exports; +} + + +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]); + } +} + + +function _Platform_export_UNUSED(exports) +{ + scope['Elm'] + ? _Platform_mergeExportsDebug('Elm', scope['Elm'], exports) + : scope['Elm'] = exports; +} + + +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]); + } +} + + + + +// HELPERS + + +var _VirtualDom_divertHrefToApp; + +var _VirtualDom_doc = typeof document !== 'undefined' ? document : {}; + + +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 + + /**/ + var node = args['node']; + //*/ + /**_UNUSED/ + var node = args && args['node'] ? args['node'] : _Debug_crash(0); + //*/ + + node.parentNode.replaceChild( + _VirtualDom_render(virtualNode, function() {}), + node + ); + + return {}; +}); + + + +// TEXT + + +function _VirtualDom_text(string) +{ + return { + $: 0, + a: string + }; +} + + + +// NODE + + +var _VirtualDom_nodeNS = F2(function(namespace, tag) +{ + return F2(function(factList, kidList) + { + for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS + { + var kid = kidList.a; + descendantsCount += (kid.b || 0); + kids.push(kid); + } + descendantsCount += kids.length; + + return { + $: 1, + c: tag, + d: _VirtualDom_organizeFacts(factList), + e: kids, + f: namespace, + b: descendantsCount + }; + }); +}); + + +var _VirtualDom_node = _VirtualDom_nodeNS(undefined); + + + +// KEYED NODE + + +var _VirtualDom_keyedNodeNS = F2(function(namespace, tag) +{ + return F2(function(factList, kidList) + { + for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS + { + var kid = kidList.a; + descendantsCount += (kid.b.b || 0); + kids.push(kid); + } + descendantsCount += kids.length; + + return { + $: 2, + c: tag, + d: _VirtualDom_organizeFacts(factList), + e: kids, + f: namespace, + b: descendantsCount + }; + }); +}); + + +var _VirtualDom_keyedNode = _VirtualDom_keyedNodeNS(undefined); + + + +// CUSTOM + + +function _VirtualDom_custom(factList, model, render, diff) +{ + return { + $: 3, + d: _VirtualDom_organizeFacts(factList), + g: model, + h: render, + i: diff + }; +} + + + +// MAP + + +var _VirtualDom_map = F2(function(tagger, node) +{ + return { + $: 4, + j: tagger, + k: node, + b: 1 + (node.b || 0) + }; +}); + + + +// LAZY + + +function _VirtualDom_thunk(refs, thunk) +{ + return { + $: 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); + }); +}); + +var _VirtualDom_lazy3 = F4(function(func, a, b, c) +{ + 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); + }); +}); + +var _VirtualDom_lazy5 = F6(function(func, a, b, c, d, e) +{ + return _VirtualDom_thunk([func, a, b, c, d, e], function() { + return A5(func, a, b, c, d, e); + }); +}); + +var _VirtualDom_lazy6 = F7(function(func, a, b, c, d, e, f) +{ + return _VirtualDom_thunk([func, a, b, c, d, e, f], function() { + return A6(func, a, b, c, d, e, f); + }); +}); + +var _VirtualDom_lazy7 = F8(function(func, a, b, c, d, e, f, g) +{ + return _VirtualDom_thunk([func, a, b, c, d, e, f, g], function() { + return A7(func, a, b, c, d, e, f, g); + }); +}); + +var _VirtualDom_lazy8 = F9(function(func, a, b, c, d, e, f, g, h) +{ + 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 + + +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) +{ + return { + $: 'a4', + n: key, + o: { f: namespace, o: value } + }; +}); + + + +// XSS ATTACK VECTOR CHECKS + + +function _VirtualDom_noScript(tag) +{ + return tag == 'script' ? 'p' : tag; +} + +function _VirtualDom_noOnOrFormAction(key) +{ + return /^(on|formAction$)/i.test(key) ? 'data-' + key : key; +} + +function _VirtualDom_noInnerHtmlOrFormAction(key) +{ + return key == 'innerHTML' || key == 'formAction' ? 'data-' + key : key; +} + +function _VirtualDom_noJavaScriptUri(value) +{ + return /^javascript:/i.test(value.replace(/\s/g,'')) ? '' : value; +} + +function _VirtualDom_noJavaScriptUri_UNUSED(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(value) +{ + return /^\s*(javascript:|data:text\/html)/i.test(value) ? '' : value; +} + +function _VirtualDom_noJavaScriptOrHtmlUri_UNUSED(value) +{ + return /^\s*(javascript:|data:text\/html)/i.test(value) + ? 'javascript:alert("This is an XSS vector. Please use ports or web components instead.")' + : value; +} + + + +// 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 { + $: 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); +}); + +var _VirtualDom_mapEventRecord = F2(function(func, record) +{ + return { + x: func(record.x), + aa: record.aa, + Z: record.Z + } +}); + + + +// ORGANIZE FACTS + + +function _VirtualDom_organizeFacts(factList) +{ + for (var facts = {}; factList.b; factList = factList.b) // WHILE_CONS + { + 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; + } + + var subFacts = facts[tag] || (facts[tag] = {}); + (tag === 'a3' && key === 'class') + ? _VirtualDom_addClass(subFacts, key, value) + : subFacts[key] = value; + } + + return facts; +} + +function _VirtualDom_addClass(object, key, newClass) +{ + var classes = object[key]; + object[key] = classes ? classes + ' ' + newClass : newClass; +} + + + +// RENDER + + +function _VirtualDom_render(vNode, eventNode) +{ + var tag = vNode.$; + + if (tag === 5) + { + return _VirtualDom_render(vNode.k || (vNode.k = vNode.m()), eventNode); + } + + if (tag === 0) + { + return _VirtualDom_doc.createTextNode(vNode.a); + } + + if (tag === 4) + { + var subNode = vNode.k; + var tagger = vNode.j; + + while (subNode.$ === 4) + { + typeof tagger !== 'object' + ? tagger = [tagger, subNode.j] + : tagger.push(subNode.j); + + subNode = subNode.k; + } + + var subEventRoot = { j: tagger, p: eventNode }; + var domNode = _VirtualDom_render(subNode, subEventRoot); + domNode.elm_event_node_ref = subEventRoot; + return domNode; + } + + if (tag === 3) + { + var domNode = vNode.h(vNode.g); + _VirtualDom_applyFacts(domNode, eventNode, vNode.d); + return domNode; + } + + // at this point `tag` must be 1 or 2 + + var domNode = vNode.f + ? _VirtualDom_doc.createElementNS(vNode.f, vNode.c) + : _VirtualDom_doc.createElement(vNode.c); + + if (_VirtualDom_divertHrefToApp && vNode.c == 'a') + { + domNode.addEventListener('click', _VirtualDom_divertHrefToApp(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 + + +function _VirtualDom_applyFacts(domNode, eventNode, facts) +{ + for (var key in facts) + { + var value = facts[key]; + + 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); + } +} + + + +// APPLY STYLES + + +function _VirtualDom_applyStyles(domNode, styles) +{ + var domNodeStyle = domNode.style; + + for (var key in styles) + { + domNodeStyle[key] = styles[key]; + } +} + + + +// APPLY ATTRS + + +function _VirtualDom_applyAttrs(domNode, attrs) +{ + for (var key in attrs) + { + var value = attrs[key]; + typeof value !== 'undefined' + ? domNode.setAttribute(key, value) + : domNode.removeAttribute(key); + } +} + + + +// APPLY NAMESPACED ATTRS + + +function _VirtualDom_applyAttrsNS(domNode, nsAttrs) +{ + for (var key in nsAttrs) + { + var pair = nsAttrs[key]; + var namespace = pair.f; + var value = pair.o; + + typeof value !== 'undefined' + ? domNode.setAttributeNS(namespace, key, value) + : domNode.removeAttributeNS(namespace, key); + } +} + + + +// APPLY EVENTS + + +function _VirtualDom_applyEvents(domNode, eventNode, events) +{ + var allCallbacks = domNode.elmFs || (domNode.elmFs = {}); + + for (var key in events) + { + var newHandler = events[key]; + var oldCallback = allCallbacks[key]; + + if (!newHandler) + { + domNode.removeEventListener(key, oldCallback); + allCallbacks[key] = undefined; + continue; + } + + if (oldCallback) + { + 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; + } +} + + + +// 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) +{ + function callback(event) + { + var handler = callback.q; + var result = _Json_runHelp(handler.a, event); + + if (!$elm$core$Result$isOk(result)) + { + return; + } + + 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.x; + var stopPropagation = tag == 1 ? value.b : tag == 3 && value.aa; + var currentEventNode = ( + stopPropagation && event.stopPropagation(), + (tag == 2 ? value.b : tag == 3 && value.Z) && event.preventDefault(), + eventNode + ); + var tagger; + var i; + while (tagger = currentEventNode.j) + { + 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 + + +// 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 = []; + _VirtualDom_diffHelp(x, y, patches, 0); + return patches; +} + + +function _VirtualDom_pushPatch(patches, type, index, data) +{ + var patch = { + $: type, + r: index, + s: data, + t: undefined, + u: undefined + }; + patches.push(patch); + return patch; +} + + +function _VirtualDom_diffHelp(x, y, patches, index) +{ + if (x === y) + { + return; + } + + 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 (xType !== yType) + { + 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 $. + switch (yType) + { + case 5: + var xRefs = x.l; + var yRefs = y.l; + var i = xRefs.length; + var same = i === yRefs.length; + while (same && i--) + { + same = xRefs[i] === yRefs[i]; + } + if (same) + { + y.k = x.k; + return; + } + y.k = y.m(); + var subPatches = []; + _VirtualDom_diffHelp(x.k, y.k, subPatches, 0); + subPatches.length > 0 && _VirtualDom_pushPatch(patches, 1, index, subPatches); + return; + + case 4: + // gather nested taggers + var xTaggers = x.j; + var yTaggers = y.j; + var nesting = false; + + var xSubNode = x.k; + while (xSubNode.$ === 4) + { + nesting = true; + + typeof xTaggers !== 'object' + ? xTaggers = [xTaggers, xSubNode.j] + : xTaggers.push(xSubNode.j); + + xSubNode = xSubNode.k; + } + + var ySubNode = y.k; + while (ySubNode.$ === 4) + { + nesting = true; + + typeof yTaggers !== 'object' + ? yTaggers = [yTaggers, ySubNode.j] + : yTaggers.push(ySubNode.j); + + ySubNode = ySubNode.k; + } + + // Just bail if different numbers of taggers. This implies the + // structure of the virtual DOM has changed. + if (nesting && xTaggers.length !== yTaggers.length) + { + _VirtualDom_pushPatch(patches, 0, index, y); + return; + } + + // check if taggers are "the same" + if (nesting ? !_VirtualDom_pairwiseRefEqual(xTaggers, yTaggers) : xTaggers !== yTaggers) + { + _VirtualDom_pushPatch(patches, 2, index, yTaggers); + } + + // diff everything below the taggers + _VirtualDom_diffHelp(xSubNode, ySubNode, patches, index + 1); + return; + + case 0: + if (x.a !== y.a) + { + _VirtualDom_pushPatch(patches, 3, index, y.a); + } + return; + + case 1: + _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKids); + return; + + case 2: + _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKeyedKids); + return; + + case 3: + if (x.h !== y.h) + { + _VirtualDom_pushPatch(patches, 0, index, y); + return; + } + + var factsDiff = _VirtualDom_diffFacts(x.d, y.d); + factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff); + + 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 _VirtualDom_pairwiseRefEqual(as, bs) +{ + for (var i = 0; i < as.length; i++) + { + if (as[i] !== bs[i]) + { + return false; + } + } + + 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 _VirtualDom_diffFacts(x, y, category) +{ + var diff; + + // look for changes and removals + for (var xKey in x) + { + if (xKey === 'a1' || xKey === 'a0' || xKey === 'a3' || xKey === 'a4') + { + var subDiff = _VirtualDom_diffFacts(x[xKey], y[xKey] || {}, xKey); + if (subDiff) + { + diff = diff || {}; + diff[xKey] = subDiff; + } + continue; + } + + // remove if not in the new facts + if (!(xKey in y)) + { + diff = diff || {}; + diff[xKey] = + !category + ? (typeof x[xKey] === 'string' ? '' : null) + : + (category === 'a1') + ? '' + : + (category === 'a0' || category === 'a3') + ? undefined + : + { f: x[xKey].f, o: undefined }; + + continue; + } + + var xValue = x[xKey]; + var yValue = y[xKey]; + + // reference equal, so don't worry about it + if (xValue === yValue && xKey !== 'value' && xKey !== 'checked' + || category === 'a0' && _VirtualDom_equalEvents(xValue, yValue)) + { + continue; + } + + diff = diff || {}; + diff[xKey] = yValue; + } + + // add new stuff + for (var yKey in y) + { + if (!(yKey in x)) + { + diff = diff || {}; + diff[yKey] = y[yKey]; + } + } + + return diff; +} + + + +// DIFF KIDS + + +function _VirtualDom_diffKids(xParent, yParent, patches, index) +{ + var xKids = xParent.e; + var yKids = yParent.e; + + var xLen = xKids.length; + var yLen = yKids.length; + + // FIGURE OUT IF THERE ARE INSERTS OR REMOVALS + + if (xLen > yLen) + { + _VirtualDom_pushPatch(patches, 6, index, { + v: yLen, + i: xLen - yLen + }); + } + else if (xLen < yLen) + { + _VirtualDom_pushPatch(patches, 7, index, { + v: xLen, + e: yKids + }); + } + + // PAIRWISE DIFF EVERYTHING ELSE + + for (var minLen = xLen < yLen ? xLen : yLen, i = 0; i < minLen; i++) + { + var xKid = xKids[i]; + _VirtualDom_diffHelp(xKid, yKids[i], patches, ++index); + index += xKid.b || 0; + } +} + + + +// KEYED DIFF + + +function _VirtualDom_diffKeyedKids(xParent, yParent, patches, rootIndex) +{ + var localPatches = []; + + var changes = {}; // Dict String Entry + var inserts = []; // Array { index : Int, entry : Entry } + // type Entry = { tag : String, vnode : VNode, index : Int, data : _ } + + 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 (xIndex < xLen && yIndex < yLen) + { + var x = xKids[xIndex]; + var y = yKids[yIndex]; + + var xKey = x.a; + var yKey = y.a; + var xNode = x.b; + var yNode = y.b; + + var newMatch = undefined; + var oldMatch = undefined; + + // check if keys match + + if (xKey === yKey) + { + index++; + _VirtualDom_diffHelp(xNode, yNode, localPatches, index); + index += xNode.b || 0; + + xIndex++; + yIndex++; + continue; + } + + // look ahead 1 to detect insertions and removals. + + var xNext = xKids[xIndex + 1]; + var yNext = yKids[yIndex + 1]; + + if (xNext) + { + var xNextKey = xNext.a; + var xNextNode = xNext.b; + oldMatch = yKey === xNextKey; + } + + if (yNext) + { + var yNextKey = yNext.a; + var yNextNode = yNext.b; + newMatch = xKey === yNextKey; + } + + + // swap x and y + if (newMatch && oldMatch) + { + index++; + _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index); + _VirtualDom_insertNode(changes, localPatches, xKey, yNode, yIndex, inserts); + index += xNode.b || 0; + + index++; + _VirtualDom_removeNode(changes, localPatches, xKey, xNextNode, index); + index += xNextNode.b || 0; + + xIndex += 2; + yIndex += 2; + continue; + } + + // insert y + if (newMatch) + { + index++; + _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts); + _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index); + index += xNode.b || 0; + + xIndex += 1; + yIndex += 2; + continue; + } + + // remove x + if (oldMatch) + { + index++; + _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index); + index += xNode.b || 0; + + index++; + _VirtualDom_diffHelp(xNextNode, yNode, localPatches, index); + index += xNextNode.b || 0; + + xIndex += 2; + yIndex += 1; + continue; + } + + // remove x, insert y + if (xNext && xNextKey === yNextKey) + { + index++; + _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index); + _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts); + index += xNode.b || 0; + + index++; + _VirtualDom_diffHelp(xNextNode, yNextNode, localPatches, index); + index += xNextNode.b || 0; + + xIndex += 2; + yIndex += 2; + continue; + } + + break; + } + + // eat up any remaining nodes with removeNode and insertNode + + while (xIndex < xLen) + { + index++; + var x = xKids[xIndex]; + var xNode = x.b; + _VirtualDom_removeNode(changes, localPatches, x.a, xNode, index); + index += xNode.b || 0; + xIndex++; + } + + while (yIndex < yLen) + { + 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 || endInserts) + { + _VirtualDom_pushPatch(patches, 8, rootIndex, { + w: localPatches, + x: inserts, + y: endInserts + }); + } +} + + + +// CHANGES FROM KEYED DIFF + + +var _VirtualDom_POSTFIX = '_elmW6BL'; + + +function _VirtualDom_insertNode(changes, localPatches, key, vnode, yIndex, inserts) +{ + var entry = changes[key]; + + // never seen this key before + if (!entry) + { + entry = { + c: 0, + z: vnode, + r: yIndex, + s: undefined + }; + + inserts.push({ r: yIndex, A: entry }); + changes[key] = entry; + + return; + } + + // this key was removed earlier, a match! + if (entry.c === 1) + { + inserts.push({ r: yIndex, A: entry }); + + entry.c = 2; + var subPatches = []; + _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! + _VirtualDom_insertNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, yIndex, inserts); +} + + +function _VirtualDom_removeNode(changes, localPatches, key, vnode, index) +{ + var entry = changes[key]; + + // never seen this key before + if (!entry) + { + var patch = _VirtualDom_pushPatch(localPatches, 9, index, undefined); + + changes[key] = { + c: 1, + z: vnode, + r: index, + s: patch + }; + + return; + } + + // this key was inserted earlier, a match! + if (entry.c === 0) + { + entry.c = 2; + var subPatches = []; + _VirtualDom_diffHelp(vnode, entry.z, subPatches, index); + + _VirtualDom_pushPatch(localPatches, 9, index, { + w: subPatches, + A: entry + }); + + return; + } + + // this key has already been removed or moved, a duplicate! + _VirtualDom_removeNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, index); +} + + + +// 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 +// descendantsCount of virtual nodes) let us skip touching entire subtrees of +// the DOM if we know there are no patches there. + + +function _VirtualDom_addDomNodes(domNode, vNode, patches, eventNode) +{ + _VirtualDom_addDomNodesHelp(domNode, vNode, patches, 0, 0, vNode.b, eventNode); +} + + +// assumes `patches` is non-empty and indexes increase monotonically. +function _VirtualDom_addDomNodesHelp(domNode, vNode, patches, i, low, high, eventNode) +{ + var patch = patches[i]; + var index = patch.r; + + while (index === low) + { + var patchType = patch.$; + + if (patchType === 1) + { + _VirtualDom_addDomNodes(domNode, vNode.k, patch.s, eventNode); + } + else if (patchType === 8) + { + patch.t = domNode; + patch.u = eventNode; + + var subPatches = patch.s.w; + if (subPatches.length > 0) + { + _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); + } + } + else if (patchType === 9) + { + patch.t = domNode; + patch.u = eventNode; + + var data = patch.s; + if (data) + { + data.A.s = domNode; + var subPatches = data.w; + if (subPatches.length > 0) + { + _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); + } + } + } + else + { + patch.t = domNode; + patch.u = eventNode; + } + + i++; + + if (!(patch = patches[i]) || (index = patch.r) > high) + { + return i; + } + } + + var tag = vNode.$; + + if (tag === 4) + { + var subNode = vNode.k; + + while (subNode.$ === 4) + { + subNode = subNode.k; + } + + return _VirtualDom_addDomNodesHelp(domNode, subNode, patches, i, low + 1, high, domNode.elm_event_node_ref); + } + + // tag must be 1 or 2 at this point + + 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 + + +function _VirtualDom_applyPatches(rootDomNode, oldVirtualNode, patches, eventNode) +{ + if (patches.length === 0) + { + return rootDomNode; + } + + _VirtualDom_addDomNodes(rootDomNode, oldVirtualNode, patches, eventNode); + return _VirtualDom_applyPatchesHelp(rootDomNode, patches); +} + +function _VirtualDom_applyPatchesHelp(rootDomNode, patches) +{ + for (var i = 0; i < patches.length; i++) + { + var patch = patches[i]; + var localDomNode = patch.t + var newNode = _VirtualDom_applyPatch(localDomNode, patch); + if (localDomNode === rootDomNode) + { + rootDomNode = newNode; + } + } + return rootDomNode; +} + +function _VirtualDom_applyPatch(domNode, patch) +{ + switch (patch.$) + { + case 0: + return _VirtualDom_applyPatchRedraw(domNode, patch.s, patch.u); + + case 4: + _VirtualDom_applyFacts(domNode, patch.u, patch.s); + return domNode; + + case 3: + domNode.replaceData(0, domNode.length, patch.s); + return domNode; + + case 1: + return _VirtualDom_applyPatchesHelp(domNode, patch.s); + + case 2: + if (domNode.elm_event_node_ref) + { + domNode.elm_event_node_ref.j = patch.s; + } + else + { + domNode.elm_event_node_ref = { j: patch.s, p: patch.u }; + } + return domNode; + + case 6: + var data = patch.s; + for (var i = 0; i < data.i; i++) + { + domNode.removeChild(domNode.childNodes[data.v]); + } + return domNode; + + 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.insertBefore(_VirtualDom_render(kids[i], patch.u), theEnd); + } + return domNode; + + case 9: + var data = patch.s; + if (!data) + { + domNode.parentNode.removeChild(domNode); + return domNode; + } + var entry = data.A; + if (typeof entry.r !== 'undefined') + { + domNode.parentNode.removeChild(domNode); + } + entry.s = _VirtualDom_applyPatchesHelp(domNode, data.w); + return domNode; + + case 8: + return _VirtualDom_applyPatchReorder(domNode, patch); + + case 5: + return patch.s(domNode); + + default: + _Debug_crash(10); // 'Ran into an unknown patch!' + } +} + + +function _VirtualDom_applyPatchRedraw(domNode, vNode, eventNode) +{ + var parentNode = domNode.parentNode; + var newNode = _VirtualDom_render(vNode, eventNode); + + if (!newNode.elm_event_node_ref) + { + newNode.elm_event_node_ref = domNode.elm_event_node_ref; + } + + if (parentNode && newNode !== domNode) + { + parentNode.replaceChild(newNode, domNode); + } + return newNode; +} + + +function _VirtualDom_applyPatchReorder(domNode, patch) +{ + var data = patch.s; + + // remove end inserts + var frag = _VirtualDom_applyPatchReorderEndInsertsHelp(data.y, patch); + + // removals + domNode = _VirtualDom_applyPatchesHelp(domNode, data.w); + + // inserts + var inserts = data.x; + for (var i = 0; i < inserts.length; i++) + { + var insert = inserts[i]; + 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 (frag) + { + _VirtualDom_appendChild(domNode, frag); + } + + return domNode; +} + + +function _VirtualDom_applyPatchReorderEndInsertsHelp(endInserts, patch) +{ + if (!endInserts) + { + return; + } + + var frag = _VirtualDom_doc.createDocumentFragment(); + for (var i = 0; i < endInserts.length; i++) + { + var insert = endInserts[i]; + var entry = insert.A; + _VirtualDom_appendChild(frag, entry.c === 2 + ? entry.s + : _VirtualDom_render(entry.z, patch.u) + ); + } + return frag; +} + + +function _VirtualDom_virtualize(node) +{ + // TEXT NODES + + if (node.nodeType === 3) + { + return _VirtualDom_text(node.textContent); + } + + + // WEIRD NODES + + if (node.nodeType !== 1) + { + return _VirtualDom_text(''); + } + + + // ELEMENT NODES + + var attrList = _List_Nil; + var attrs = node.attributes; + for (var i = attrs.length; i--; ) + { + var attr = attrs[i]; + var name = attr.name; + var value = attr.value; + attrList = _List_Cons( A2(_VirtualDom_attribute, name, value), attrList ); + } + + var tag = node.tagName.toLowerCase(); + var kidList = _List_Nil; + var kids = node.childNodes; + + for (var i = kids.length; i--; ) + { + kidList = _List_Cons(_VirtualDom_virtualize(kids[i]), kidList); + } + return A3(_VirtualDom_node, tag, attrList, kidList); +} + +function _VirtualDom_dekey(keyedNode) +{ + var keyedKids = keyedNode.e; + var len = keyedKids.length; + var kids = new Array(len); + for (var i = 0; i < len; i++) + { + kids[i] = keyedKids[i].b; + } + + return { + $: 1, + c: keyedNode.c, + d: keyedNode.d, + e: kids, + f: keyedNode.f, + b: keyedNode.b + }; +} + + + + +// ELEMENT + + +var _Debugger_element; + +var _Browser_element = _Debugger_element || F4(function(impl, flagDecoder, debugMetadata, args) +{ + return _Platform_initialize( + flagDecoder, + args, + impl.a6, + impl.bo, + impl.bm, + function(sendToApp, initialModel) { + var view = impl.bq; + /**/ + var domNode = args['node']; + //*/ + /**_UNUSED/ + 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; + }); + } + ); +}); + + + +// DOCUMENT + + +var _Debugger_document; + +var _Browser_document = _Debugger_document || F4(function(impl, flagDecoder, debugMetadata, args) +{ + return _Platform_initialize( + flagDecoder, + args, + impl.a6, + impl.bo, + impl.bm, + function(sendToApp, initialModel) { + var divertHrefToApp = impl._ && impl._(sendToApp) + var view = impl.bq; + 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.ae); + var patches = _VirtualDom_diff(currNode, nextNode); + bodyNode = _VirtualDom_applyPatches(bodyNode, currNode, patches, sendToApp); + currNode = nextNode; + _VirtualDom_divertHrefToApp = 0; + (title !== doc.aM) && (_VirtualDom_doc.title = title = doc.aM); + }); + } + ); +}); + + + +// ANIMATION + + +var _Browser_cancelAnimationFrame = + typeof cancelAnimationFrame !== 'undefined' + ? cancelAnimationFrame + : function(id) { clearTimeout(id); }; + +var _Browser_requestAnimationFrame = + typeof requestAnimationFrame !== 'undefined' + ? requestAnimationFrame + : function(callback) { return setTimeout(callback, 1000 / 60); }; + + +function _Browser_makeAnimator(model, draw) +{ + draw(model); + + var state = 0; + + function updateIfNeeded() + { + 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 + ); + }; +} + + + +// APPLICATION + + +function _Browser_application(impl) +{ + var onUrlChange = impl.ba; + var onUrlRequest = impl.bb; + var key = function() { key.a(onUrlChange(_Browser_getUrl())); }; + + return _Browser_document({ + _: function(sendToApp) + { + 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.hasAttribute('download')) + { + event.preventDefault(); + var href = domNode.href; + var curr = _Browser_getUrl(); + var next = $elm$url$Url$fromString(href).a; + sendToApp(onUrlRequest( + (next + && curr.bf === next.bf + && curr.a4 === next.a4 + && curr.be.a === next.be.a + ) + ? $elm$browser$Browser$Internal(next) + : $elm$browser$Browser$External(href) + )); + } + }); + }, + a6: function(flags) + { + return A3(impl.a6, flags, _Browser_getUrl(), key); + }, + bq: impl.bq, + bo: impl.bo, + bm: impl.bm + }); +} + +function _Browser_getUrl() +{ + return $elm$url$Url$fromString(_VirtualDom_doc.location.href).a || _Debug_crash(1); +} + +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(); + })); +}); + +var _Browser_pushUrl = F2(function(key, url) +{ + 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 + + +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) + { + 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') + ? { a3: 'hidden', aY: 'visibilitychange' } + : + (typeof _VirtualDom_doc.mozHidden !== 'undefined') + ? { a3: 'mozHidden', aY: 'mozvisibilitychange' } + : + (typeof _VirtualDom_doc.msHidden !== 'undefined') + ? { a3: 'msHidden', aY: 'msvisibilitychange' } + : + (typeof _VirtualDom_doc.webkitHidden !== 'undefined') + ? { a3: 'webkitHidden', aY: 'webkitvisibilitychange' } + : { a3: 'hidden', aY: 'visibilitychange' }; +} + + + +// ANIMATION FRAMES + + +function _Browser_rAF() +{ + return _Scheduler_binding(function(callback) + { + var id = _Browser_requestAnimationFrame(function() { + callback(_Scheduler_succeed(Date.now())); + }); + + return function() { + _Browser_cancelAnimationFrame(id); + }; + }); +} + + +function _Browser_now() +{ + return _Scheduler_binding(function(callback) + { + callback(_Scheduler_succeed(Date.now())); + }); +} + + + +// DOM STUFF + + +function _Browser_withNode(id, doStuff) +{ + return _Scheduler_binding(function(callback) + { + _Browser_requestAnimationFrame(function() { + var node = document.getElementById(id); + callback(node + ? _Scheduler_succeed(doStuff(node)) + : _Scheduler_fail($elm$browser$Browser$Dom$NotFound(id)) + ); + }); + }); +} + + +function _Browser_withWindow(doStuff) +{ + return _Scheduler_binding(function(callback) + { + _Browser_requestAnimationFrame(function() { + callback(_Scheduler_succeed(doStuff())); + }); + }); +} + + +// FOCUS and BLUR + + +var _Browser_call = F2(function(functionName, id) +{ + return _Browser_withNode(id, function(node) { + node[functionName](); + return _Utils_Tuple0; + }); +}); + + + +// WINDOW VIEWPORT + + +function _Browser_getViewport() +{ + return { + aG: _Browser_getScene(), + aP: { + aT: _Browser_window.pageXOffset, + aU: _Browser_window.pageYOffset, + aS: _Browser_doc.documentElement.clientWidth, + ao: _Browser_doc.documentElement.clientHeight + } + }; +} + +function _Browser_getScene() +{ + var body = _Browser_doc.body; + var elem = _Browser_doc.documentElement; + return { + aS: Math.max(body.scrollWidth, body.offsetWidth, elem.scrollWidth, elem.offsetWidth, elem.clientWidth), + ao: Math.max(body.scrollHeight, body.offsetHeight, elem.scrollHeight, elem.offsetHeight, elem.clientHeight) + }; +} + +var _Browser_setViewport = F2(function(x, y) +{ + return _Browser_withWindow(function() + { + _Browser_window.scroll(x, y); + return _Utils_Tuple0; + }); +}); + + + +// ELEMENT VIEWPORT + + +function _Browser_getViewportOf(id) +{ + return _Browser_withNode(id, function(node) + { + return { + aG: { + aS: node.scrollWidth, + ao: node.scrollHeight + }, + aP: { + aT: node.scrollLeft, + aU: node.scrollTop, + aS: node.clientWidth, + ao: node.clientHeight + } + }; + }); +} + + +var _Browser_setViewportOf = F3(function(id, x, y) +{ + return _Browser_withNode(id, function(node) + { + node.scrollLeft = x; + node.scrollTop = y; + return _Utils_Tuple0; + }); +}); + + + +// ELEMENT + + +function _Browser_getElement(id) +{ + return _Browser_withNode(id, function(node) + { + var rect = node.getBoundingClientRect(); + var x = _Browser_window.pageXOffset; + var y = _Browser_window.pageYOffset; + return { + aG: _Browser_getScene(), + aP: { + aT: x, + aU: y, + aS: _Browser_doc.documentElement.clientWidth, + ao: _Browser_doc.documentElement.clientHeight + }, + a0: { + aT: x + rect.left, + aU: y + rect.top, + aS: rect.width, + ao: rect.height + } + }; + }); +} + + + +// LOAD and RELOAD + + +function _Browser_reload(skipCache) +{ + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback) + { + _VirtualDom_doc.location.reload(skipCache); + })); +} + +function _Browser_load(url) +{ + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback) + { + try + { + _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); + } + })); +} + + +function _Url_percentEncode(string) +{ + return encodeURIComponent(string); +} + +function _Url_percentDecode(string) +{ + try + { + return $elm$core$Maybe$Just(decodeURIComponent(string)); + } + catch (e) + { + return $elm$core$Maybe$Nothing; + } +} + + +var _Bitwise_and = F2(function(a, b) +{ + return a & b; +}); + +var _Bitwise_or = F2(function(a, b) +{ + return a | b; +}); + +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 _Bitwise_shiftRightZfBy = F2(function(offset, a) +{ + return a >>> offset; +}); + + + +function _Time_now(millisToPosix) +{ + return _Scheduler_binding(function(callback) + { + callback(_Scheduler_succeed(millisToPosix(Date.now()))); + }); +} + +var _Time_setInterval = F2(function(interval, task) +{ + return _Scheduler_binding(function(callback) + { + var id = setInterval(function() { _Scheduler_rawSpawn(task); }, interval); + return function() { clearInterval(id); }; + }); +}); + +function _Time_here() +{ + return _Scheduler_binding(function(callback) + { + callback(_Scheduler_succeed( + A2($elm$time$Time$customZone, -(new Date().getTimezoneOffset()), _List_Nil) + )); + }); +} + + +function _Time_getZoneName() +{ + return _Scheduler_binding(function(callback) + { + try + { + var name = $elm$time$Time$Name(Intl.DateTimeFormat().resolvedOptions().timeZone); + } + catch (e) + { + var name = $elm$time$Time$Offset(new Date().getTimezoneOffset()); + } + callback(_Scheduler_succeed(name)); + }); +} + + + +// SEND REQUEST + +var _Http_toTask = F3(function(router, toTask, request) +{ + return _Scheduler_binding(function(callback) + { + function done(response) { + callback(toTask(request.a1.a(response))); + } + + var xhr = new XMLHttpRequest(); + xhr.addEventListener('error', function() { done($elm$http$Http$NetworkError_); }); + xhr.addEventListener('timeout', function() { done($elm$http$Http$Timeout_); }); + xhr.addEventListener('load', function() { done(_Http_toResponse(request.a1.b, xhr)); }); + $elm$core$Maybe$isJust(request.aN) && _Http_track(router, xhr, request.aN.a); + + try { + xhr.open(request.a8, request.bp, true); + } catch (e) { + return done($elm$http$Http$BadUrl_(request.bp)); + } + + _Http_configureRequest(xhr, request); + + request.ae.a && xhr.setRequestHeader('Content-Type', request.ae.a); + xhr.send(request.ae.b); + + return function() { xhr.c = true; xhr.abort(); }; + }); +}); + + +// CONFIGURE + +function _Http_configureRequest(xhr, request) +{ + for (var headers = request.an; headers.b; headers = headers.b) // WHILE_CONS + { + xhr.setRequestHeader(headers.a.a, headers.a.b); + } + xhr.timeout = request.bn.a || 0; + xhr.responseType = request.a1.d; + xhr.withCredentials = request.aW; +} + + +// RESPONSES + +function _Http_toResponse(toBody, xhr) +{ + return A2( + 200 <= xhr.status && xhr.status < 300 ? $elm$http$Http$GoodStatus_ : $elm$http$Http$BadStatus_, + _Http_toMetadata(xhr), + toBody(xhr.response) + ); +} + + +// METADATA + +function _Http_toMetadata(xhr) +{ + return { + bp: xhr.responseURL, + bk: xhr.status, + bl: xhr.statusText, + an: _Http_parseHeaders(xhr.getAllResponseHeaders()) + }; +} + + +// HEADERS + +function _Http_parseHeaders(rawHeaders) +{ + if (!rawHeaders) + { + return $elm$core$Dict$empty; + } + + var headers = $elm$core$Dict$empty; + var headerPairs = rawHeaders.split('\r\n'); + for (var i = headerPairs.length; i--; ) + { + var headerPair = headerPairs[i]; + var index = headerPair.indexOf(': '); + if (index > 0) + { + var key = headerPair.substring(0, index); + var value = headerPair.substring(index + 2); + + headers = A3($elm$core$Dict$update, key, function(oldValue) { + return $elm$core$Maybe$Just($elm$core$Maybe$isJust(oldValue) + ? value + ', ' + oldValue.a + : value + ); + }, headers); + } + } + return headers; +} + + +// EXPECT + +var _Http_expect = F3(function(type, toBody, toValue) +{ + return { + $: 0, + d: type, + b: toBody, + a: toValue + }; +}); + +var _Http_mapExpect = F2(function(func, expect) +{ + return { + $: 0, + d: expect.d, + b: expect.b, + a: function(x) { return func(expect.a(x)); } + }; +}); + +function _Http_toDataView(arrayBuffer) +{ + return new DataView(arrayBuffer); +} + + +// BODY and PARTS + +var _Http_emptyBody = { $: 0 }; +var _Http_pair = F2(function(a, b) { return { $: 0, a: a, b: b }; }); + +function _Http_toFormData(parts) +{ + for (var formData = new FormData(); parts.b; parts = parts.b) // WHILE_CONS + { + var part = parts.a; + formData.append(part.a, part.b); + } + return formData; +} + +var _Http_bytesToBlob = F2(function(mime, bytes) +{ + return new Blob([bytes], { type: mime }); +}); + + +// PROGRESS + +function _Http_track(router, xhr, tracker) +{ + // TODO check out lengthComputable on loadstart event + + xhr.upload.addEventListener('progress', function(event) { + if (xhr.c) { return; } + _Scheduler_rawSpawn(A2($elm$core$Platform$sendToSelf, router, _Utils_Tuple2(tracker, $elm$http$Http$Sending({ + bj: event.loaded, + aI: event.total + })))); + }); + xhr.addEventListener('progress', function(event) { + if (xhr.c) { return; } + _Scheduler_rawSpawn(A2($elm$core$Platform$sendToSelf, router, _Utils_Tuple2(tracker, $elm$http$Http$Receiving({ + bh: event.loaded, + aI: event.lengthComputable ? $elm$core$Maybe$Just(event.total) : $elm$core$Maybe$Nothing + })))); + }); +}var $author$project$Main$LinkChanged = function (a) { + return {$: 4, a: a}; +}; +var $author$project$Main$LinkClicked = function (a) { + return {$: 3, a: a}; +}; +var $elm$core$Basics$EQ = 1; +var $elm$core$Basics$GT = 2; +var $elm$core$Basics$LT = 0; +var $elm$core$List$cons = _List_cons; +var $elm$core$Dict$foldr = F3( + function (func, acc, t) { + foldr: + while (true) { + if (t.$ === -2) { + 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$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$core$Set$toList = function (_v0) { + var dict = _v0; + return $elm$core$Dict$keys(dict); +}; +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.$) { + 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$core$Array$toList = function (array) { + return A3($elm$core$Array$foldr, $elm$core$List$cons, _List_Nil, array); +}; +var $elm$core$Result$Err = function (a) { + return {$: 1, a: a}; +}; +var $elm$json$Json$Decode$Failure = F2( + function (a, b) { + return {$: 3, a: a, b: b}; + }); +var $elm$json$Json$Decode$Field = F2( + function (a, b) { + return {$: 0, a: a, b: b}; + }); +var $elm$json$Json$Decode$Index = F2( + function (a, b) { + return {$: 1, a: a, b: b}; + }); +var $elm$core$Result$Ok = function (a) { + return {$: 0, a: a}; +}; +var $elm$json$Json$Decode$OneOf = function (a) { + return {$: 2, a: a}; +}; +var $elm$core$Basics$False = 1; +var $elm$core$Basics$add = _Basics_add; +var $elm$core$Maybe$Just = function (a) { + return {$: 0, a: a}; +}; +var $elm$core$Maybe$Nothing = {$: 1}; +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( + _String_join, + sep, + _List_toArray(chunks)); + }); +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$core$String$join, + '\n ', + A2($elm$core$String$split, '\n', str)); +}; +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$core$List$length = function (xs) { + return A3( + $elm$core$List$foldl, + F2( + function (_v0, i) { + return i + 1; + }), + 0, + xs); +}; +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$core$Char$isUpper = function (_char) { + var code = $elm$core$Char$toCode(_char); + return (code <= 90) && (65 <= code); +}; +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$core$Char$isDigit = function (_char) { + var code = $elm$core$Char$toCode(_char); + return (code <= 57) && (48 <= code); +}; +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$core$List$reverse = function (list) { + return A3($elm$core$List$foldl, $elm$core$List$cons, _List_Nil, 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$json$Json$Decode$errorToStringHelp = F2( + function (error, context) { + errorToStringHelp: + while (true) { + switch (error.$) { + case 0: + var f = error.a; + var err = error.b; + var isSimple = function () { + var _v1 = $elm$core$String$uncons(f); + if (_v1.$ === 1) { + 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 1: + 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 2: + 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)); + } + } + }); +var $elm$core$Array$branchFactor = 32; +var $elm$core$Array$Array_elm_builtin = F4( + function (a, b, c, d) { + return {$: 0, 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 {$: 1, 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 {$: 0, 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; + } + } + }); +var $elm$core$Tuple$first = function (_v0) { + var x = _v0.a; + return x; +}; +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 $elm$core$Array$builderToArray = F2( + function (reverseNodeList, builder) { + if (!builder.e) { + return A4( + $elm$core$Array$Array_elm_builtin, + $elm$core$Elm$JsArray$length(builder.g), + $elm$core$Array$shiftStep, + $elm$core$Elm$JsArray$empty, + builder.g); + } else { + var treeLen = builder.e * $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.h) : builder.h; + var tree = A2($elm$core$Array$treeFromBuilder, correctNodeList, builder.e); + return A4( + $elm$core$Array$Array_elm_builtin, + $elm$core$Elm$JsArray$length(builder.g) + treeLen, + A2($elm$core$Basics$max, 5, depth * $elm$core$Array$shiftStep), + tree, + builder.g); + } + }); +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, + {h: nodeList, e: (len / $elm$core$Array$branchFactor) | 0, g: 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 = 0; +var $elm$core$Result$isOk = function (result) { + if (!result.$) { + return true; + } else { + return false; + } +}; +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 0: + return 0; + case 1: + return 1; + case 2: + return 2; + default: + return 3; + } +}; +var $elm$browser$Browser$External = function (a) { + return {$: 1, a: a}; +}; +var $elm$browser$Browser$Internal = function (a) { + return {$: 0, a: a}; +}; +var $elm$core$Basics$identity = function (x) { + return x; +}; +var $elm$browser$Browser$Dom$NotFound = $elm$core$Basics$identity; +var $elm$url$Url$Http = 0; +var $elm$url$Url$Https = 1; +var $elm$url$Url$Url = F6( + function (protocol, host, port_, path, query, fragment) { + return {am: fragment, a4: host, bd: path, be: port_, bf: protocol, bg: 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.$ === 1) { + 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)); + } + } else { + return $elm$core$Maybe$Nothing; + } + } + } + }); +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 $elm$url$Url$chompBeforeFragment = F3( + function (protocol, 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 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 $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, + 0, + A2($elm$core$String$dropLeft, 7, str)) : (A2($elm$core$String$startsWith, 'https://', str) ? A2( + $elm$url$Url$chompAfterProtocol, + 1, + A2($elm$core$String$dropLeft, 8, str)) : $elm$core$Maybe$Nothing); +}; +var $elm$core$Basics$never = function (_v0) { + never: + while (true) { + var nvr = _v0; + var $temp$_v0 = nvr; + _v0 = $temp$_v0; + continue never; + } +}; +var $elm$core$Task$Perform = $elm$core$Basics$identity; +var $elm$core$Task$succeed = _Scheduler_succeed; +var $elm$core$Task$init = $elm$core$Task$succeed(0); +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)))); + } + } + } + } + }); +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)); + }, + 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; + 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 0; + }, + $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(0); + }); +var $elm$core$Task$cmdMap = F2( + function (tagger, _v0) { + var task = _v0; + return 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( + A2($elm$core$Task$map, toMessage, task)); + }); +var $elm$browser$Browser$application = _Browser_application; +var $author$project$Main$AboutModel = F2( + function (a, b) { + return {$: 0, a: a, b: b}; + }); +var $author$project$About$Main$NoModel = 0; +var $author$project$About$Main$initModel = 0; +var $author$project$Main$GotAboutMsg = function (a) { + return {$: 0, a: a}; +}; +var $author$project$Main$GotTyperMsg = function (a) { + return {$: 2, a: a}; +}; +var $author$project$Main$GotVshMsg = function (a) { + return {$: 1, a: a}; +}; +var $author$project$Main$TyperModel = F2( + function (a, b) { + return {$: 2, a: a, b: b}; + }); +var $author$project$Main$VshModel = F2( + function (a, b) { + return {$: 1, a: a, b: b}; + }); +var $author$project$Route$AboutRoute = 0; +var $elm$core$Maybe$withDefault = F2( + function (_default, maybe) { + if (!maybe.$) { + var value = maybe.a; + return value; + } else { + return _default; + } + }); +var $author$project$Route$fake = function (path) { + return { + am: $elm$core$Maybe$Nothing, + a4: 'sharpvik.github.io', + bd: A2($elm$core$Maybe$withDefault, '/#/about', path.am), + be: $elm$core$Maybe$Nothing, + bf: 1, + bg: $elm$core$Maybe$Nothing + }; +}; +var $elm$url$Url$Parser$State = F5( + function (visited, unvisited, params, frag, value) { + return {B: frag, C: params, z: unvisited, u: value, F: visited}; + }); +var $elm$url$Url$Parser$getFirstMatch = function (states) { + getFirstMatch: + while (true) { + if (!states.b) { + return $elm$core$Maybe$Nothing; + } else { + var state = states.a; + var rest = states.b; + var _v1 = state.z; + if (!_v1.b) { + return $elm$core$Maybe$Just(state.u); + } else { + if ((_v1.a === '') && (!_v1.b.b)) { + return $elm$core$Maybe$Just(state.u); + } else { + var $temp$states = rest; + states = $temp$states; + continue getFirstMatch; + } + } + } + } +}; +var $elm$url$Url$Parser$removeFinalEmpty = function (segments) { + if (!segments.b) { + return _List_Nil; + } else { + if ((segments.a === '') && (!segments.b.b)) { + return _List_Nil; + } else { + var segment = segments.a; + var rest = segments.b; + return A2( + $elm$core$List$cons, + segment, + $elm$url$Url$Parser$removeFinalEmpty(rest)); + } + } +}; +var $elm$url$Url$Parser$preparePath = function (path) { + var _v0 = A2($elm$core$String$split, '/', path); + if (_v0.b && (_v0.a === '')) { + var segments = _v0.b; + return $elm$url$Url$Parser$removeFinalEmpty(segments); + } else { + var segments = _v0; + return $elm$url$Url$Parser$removeFinalEmpty(segments); + } +}; +var $elm$url$Url$Parser$addToParametersHelp = F2( + function (value, maybeList) { + if (maybeList.$ === 1) { + return $elm$core$Maybe$Just( + _List_fromArray( + [value])); + } else { + var list = maybeList.a; + return $elm$core$Maybe$Just( + A2($elm$core$List$cons, value, list)); + } + }); +var $elm$url$Url$percentDecode = _Url_percentDecode; +var $elm$core$Basics$compare = _Utils_compare; +var $elm$core$Dict$get = F2( + function (targetKey, dict) { + get: + while (true) { + if (dict.$ === -2) { + return $elm$core$Maybe$Nothing; + } else { + var key = dict.b; + var value = dict.c; + var left = dict.d; + var right = dict.e; + var _v1 = A2($elm$core$Basics$compare, targetKey, key); + switch (_v1) { + case 0: + var $temp$targetKey = targetKey, + $temp$dict = left; + targetKey = $temp$targetKey; + dict = $temp$dict; + continue get; + case 1: + return $elm$core$Maybe$Just(value); + default: + var $temp$targetKey = targetKey, + $temp$dict = right; + targetKey = $temp$targetKey; + dict = $temp$dict; + continue get; + } + } + } + }); +var $elm$core$Dict$Black = 1; +var $elm$core$Dict$RBNode_elm_builtin = F5( + function (a, b, c, d, e) { + return {$: -1, a: a, b: b, c: c, d: d, e: e}; + }); +var $elm$core$Dict$RBEmpty_elm_builtin = {$: -2}; +var $elm$core$Dict$Red = 0; +var $elm$core$Dict$balance = F5( + function (color, key, value, left, right) { + if ((right.$ === -1) && (!right.a)) { + var _v1 = right.a; + var rK = right.b; + var rV = right.c; + var rLeft = right.d; + var rRight = right.e; + if ((left.$ === -1) && (!left.a)) { + var _v3 = left.a; + var lK = left.b; + var lV = left.c; + var lLeft = left.d; + var lRight = left.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + 0, + key, + value, + A5($elm$core$Dict$RBNode_elm_builtin, 1, lK, lV, lLeft, lRight), + A5($elm$core$Dict$RBNode_elm_builtin, 1, rK, rV, rLeft, rRight)); + } else { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + rK, + rV, + A5($elm$core$Dict$RBNode_elm_builtin, 0, key, value, left, rLeft), + rRight); + } + } else { + if ((((left.$ === -1) && (!left.a)) && (left.d.$ === -1)) && (!left.d.a)) { + var _v5 = left.a; + var lK = left.b; + var lV = left.c; + var _v6 = left.d; + var _v7 = _v6.a; + var llK = _v6.b; + var llV = _v6.c; + var llLeft = _v6.d; + var llRight = _v6.e; + var lRight = left.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + 0, + lK, + lV, + A5($elm$core$Dict$RBNode_elm_builtin, 1, llK, llV, llLeft, llRight), + A5($elm$core$Dict$RBNode_elm_builtin, 1, key, value, lRight, right)); + } else { + return A5($elm$core$Dict$RBNode_elm_builtin, color, key, value, left, right); + } + } + }); +var $elm$core$Dict$insertHelp = F3( + function (key, value, dict) { + if (dict.$ === -2) { + return A5($elm$core$Dict$RBNode_elm_builtin, 0, key, value, $elm$core$Dict$RBEmpty_elm_builtin, $elm$core$Dict$RBEmpty_elm_builtin); + } else { + var nColor = dict.a; + var nKey = dict.b; + var nValue = dict.c; + var nLeft = dict.d; + var nRight = dict.e; + var _v1 = A2($elm$core$Basics$compare, key, nKey); + switch (_v1) { + case 0: + return A5( + $elm$core$Dict$balance, + nColor, + nKey, + nValue, + A3($elm$core$Dict$insertHelp, key, value, nLeft), + nRight); + case 1: + return A5($elm$core$Dict$RBNode_elm_builtin, nColor, nKey, value, nLeft, nRight); + default: + return A5( + $elm$core$Dict$balance, + nColor, + nKey, + nValue, + nLeft, + A3($elm$core$Dict$insertHelp, key, value, nRight)); + } + } + }); +var $elm$core$Dict$insert = F3( + function (key, value, dict) { + var _v0 = A3($elm$core$Dict$insertHelp, key, value, dict); + if ((_v0.$ === -1) && (!_v0.a)) { + var _v1 = _v0.a; + var k = _v0.b; + var v = _v0.c; + var l = _v0.d; + var r = _v0.e; + return A5($elm$core$Dict$RBNode_elm_builtin, 1, k, v, l, r); + } else { + var x = _v0; + return x; + } + }); +var $elm$core$Dict$getMin = function (dict) { + getMin: + while (true) { + if ((dict.$ === -1) && (dict.d.$ === -1)) { + var left = dict.d; + var $temp$dict = left; + dict = $temp$dict; + continue getMin; + } else { + return dict; + } + } +}; +var $elm$core$Dict$moveRedLeft = function (dict) { + if (((dict.$ === -1) && (dict.d.$ === -1)) && (dict.e.$ === -1)) { + if ((dict.e.d.$ === -1) && (!dict.e.d.a)) { + var clr = dict.a; + var k = dict.b; + var v = dict.c; + var _v1 = dict.d; + var lClr = _v1.a; + var lK = _v1.b; + var lV = _v1.c; + var lLeft = _v1.d; + var lRight = _v1.e; + var _v2 = dict.e; + var rClr = _v2.a; + var rK = _v2.b; + var rV = _v2.c; + var rLeft = _v2.d; + var _v3 = rLeft.a; + var rlK = rLeft.b; + var rlV = rLeft.c; + var rlL = rLeft.d; + var rlR = rLeft.e; + var rRight = _v2.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + 0, + rlK, + rlV, + A5( + $elm$core$Dict$RBNode_elm_builtin, + 1, + k, + v, + A5($elm$core$Dict$RBNode_elm_builtin, 0, lK, lV, lLeft, lRight), + rlL), + A5($elm$core$Dict$RBNode_elm_builtin, 1, rK, rV, rlR, rRight)); + } else { + var clr = dict.a; + var k = dict.b; + var v = dict.c; + var _v4 = dict.d; + var lClr = _v4.a; + var lK = _v4.b; + var lV = _v4.c; + var lLeft = _v4.d; + var lRight = _v4.e; + var _v5 = dict.e; + var rClr = _v5.a; + var rK = _v5.b; + var rV = _v5.c; + var rLeft = _v5.d; + var rRight = _v5.e; + if (clr === 1) { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + 1, + k, + v, + A5($elm$core$Dict$RBNode_elm_builtin, 0, lK, lV, lLeft, lRight), + A5($elm$core$Dict$RBNode_elm_builtin, 0, rK, rV, rLeft, rRight)); + } else { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + 1, + k, + v, + A5($elm$core$Dict$RBNode_elm_builtin, 0, lK, lV, lLeft, lRight), + A5($elm$core$Dict$RBNode_elm_builtin, 0, rK, rV, rLeft, rRight)); + } + } + } else { + return dict; + } +}; +var $elm$core$Dict$moveRedRight = function (dict) { + if (((dict.$ === -1) && (dict.d.$ === -1)) && (dict.e.$ === -1)) { + if ((dict.d.d.$ === -1) && (!dict.d.d.a)) { + var clr = dict.a; + var k = dict.b; + var v = dict.c; + var _v1 = dict.d; + var lClr = _v1.a; + var lK = _v1.b; + var lV = _v1.c; + var _v2 = _v1.d; + var _v3 = _v2.a; + var llK = _v2.b; + var llV = _v2.c; + var llLeft = _v2.d; + var llRight = _v2.e; + var lRight = _v1.e; + var _v4 = dict.e; + var rClr = _v4.a; + var rK = _v4.b; + var rV = _v4.c; + var rLeft = _v4.d; + var rRight = _v4.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + 0, + lK, + lV, + A5($elm$core$Dict$RBNode_elm_builtin, 1, llK, llV, llLeft, llRight), + A5( + $elm$core$Dict$RBNode_elm_builtin, + 1, + k, + v, + lRight, + A5($elm$core$Dict$RBNode_elm_builtin, 0, rK, rV, rLeft, rRight))); + } else { + var clr = dict.a; + var k = dict.b; + var v = dict.c; + var _v5 = dict.d; + var lClr = _v5.a; + var lK = _v5.b; + var lV = _v5.c; + var lLeft = _v5.d; + var lRight = _v5.e; + var _v6 = dict.e; + var rClr = _v6.a; + var rK = _v6.b; + var rV = _v6.c; + var rLeft = _v6.d; + var rRight = _v6.e; + if (clr === 1) { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + 1, + k, + v, + A5($elm$core$Dict$RBNode_elm_builtin, 0, lK, lV, lLeft, lRight), + A5($elm$core$Dict$RBNode_elm_builtin, 0, rK, rV, rLeft, rRight)); + } else { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + 1, + k, + v, + A5($elm$core$Dict$RBNode_elm_builtin, 0, lK, lV, lLeft, lRight), + A5($elm$core$Dict$RBNode_elm_builtin, 0, rK, rV, rLeft, rRight)); + } + } + } else { + return dict; + } +}; +var $elm$core$Dict$removeHelpPrepEQGT = F7( + function (targetKey, dict, color, key, value, left, right) { + if ((left.$ === -1) && (!left.a)) { + var _v1 = left.a; + var lK = left.b; + var lV = left.c; + var lLeft = left.d; + var lRight = left.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + lK, + lV, + lLeft, + A5($elm$core$Dict$RBNode_elm_builtin, 0, key, value, lRight, right)); + } else { + _v2$2: + while (true) { + if ((right.$ === -1) && (right.a === 1)) { + if (right.d.$ === -1) { + if (right.d.a === 1) { + var _v3 = right.a; + var _v4 = right.d; + var _v5 = _v4.a; + return $elm$core$Dict$moveRedRight(dict); + } else { + break _v2$2; + } + } else { + var _v6 = right.a; + var _v7 = right.d; + return $elm$core$Dict$moveRedRight(dict); + } + } else { + break _v2$2; + } + } + return dict; + } + }); +var $elm$core$Dict$removeMin = function (dict) { + if ((dict.$ === -1) && (dict.d.$ === -1)) { + var color = dict.a; + var key = dict.b; + var value = dict.c; + var left = dict.d; + var lColor = left.a; + var lLeft = left.d; + var right = dict.e; + if (lColor === 1) { + if ((lLeft.$ === -1) && (!lLeft.a)) { + var _v3 = lLeft.a; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + key, + value, + $elm$core$Dict$removeMin(left), + right); + } else { + var _v4 = $elm$core$Dict$moveRedLeft(dict); + if (_v4.$ === -1) { + var nColor = _v4.a; + var nKey = _v4.b; + var nValue = _v4.c; + var nLeft = _v4.d; + var nRight = _v4.e; + return A5( + $elm$core$Dict$balance, + nColor, + nKey, + nValue, + $elm$core$Dict$removeMin(nLeft), + nRight); + } else { + return $elm$core$Dict$RBEmpty_elm_builtin; + } + } + } else { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + key, + value, + $elm$core$Dict$removeMin(left), + right); + } + } else { + return $elm$core$Dict$RBEmpty_elm_builtin; + } +}; +var $elm$core$Dict$removeHelp = F2( + function (targetKey, dict) { + if (dict.$ === -2) { + return $elm$core$Dict$RBEmpty_elm_builtin; + } else { + var color = dict.a; + var key = dict.b; + var value = dict.c; + var left = dict.d; + var right = dict.e; + if (_Utils_cmp(targetKey, key) < 0) { + if ((left.$ === -1) && (left.a === 1)) { + var _v4 = left.a; + var lLeft = left.d; + if ((lLeft.$ === -1) && (!lLeft.a)) { + var _v6 = lLeft.a; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + key, + value, + A2($elm$core$Dict$removeHelp, targetKey, left), + right); + } else { + var _v7 = $elm$core$Dict$moveRedLeft(dict); + if (_v7.$ === -1) { + var nColor = _v7.a; + var nKey = _v7.b; + var nValue = _v7.c; + var nLeft = _v7.d; + var nRight = _v7.e; + return A5( + $elm$core$Dict$balance, + nColor, + nKey, + nValue, + A2($elm$core$Dict$removeHelp, targetKey, nLeft), + nRight); + } else { + return $elm$core$Dict$RBEmpty_elm_builtin; + } + } + } else { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + key, + value, + A2($elm$core$Dict$removeHelp, targetKey, left), + right); + } + } else { + return A2( + $elm$core$Dict$removeHelpEQGT, + targetKey, + A7($elm$core$Dict$removeHelpPrepEQGT, targetKey, dict, color, key, value, left, right)); + } + } + }); +var $elm$core$Dict$removeHelpEQGT = F2( + function (targetKey, dict) { + if (dict.$ === -1) { + var color = dict.a; + var key = dict.b; + var value = dict.c; + var left = dict.d; + var right = dict.e; + if (_Utils_eq(targetKey, key)) { + var _v1 = $elm$core$Dict$getMin(right); + if (_v1.$ === -1) { + var minKey = _v1.b; + var minValue = _v1.c; + return A5( + $elm$core$Dict$balance, + color, + minKey, + minValue, + left, + $elm$core$Dict$removeMin(right)); + } else { + return $elm$core$Dict$RBEmpty_elm_builtin; + } + } else { + return A5( + $elm$core$Dict$balance, + color, + key, + value, + left, + A2($elm$core$Dict$removeHelp, targetKey, right)); + } + } else { + return $elm$core$Dict$RBEmpty_elm_builtin; + } + }); +var $elm$core$Dict$remove = F2( + function (key, dict) { + var _v0 = A2($elm$core$Dict$removeHelp, key, dict); + if ((_v0.$ === -1) && (!_v0.a)) { + var _v1 = _v0.a; + var k = _v0.b; + var v = _v0.c; + var l = _v0.d; + var r = _v0.e; + return A5($elm$core$Dict$RBNode_elm_builtin, 1, k, v, l, r); + } else { + var x = _v0; + return x; + } + }); +var $elm$core$Dict$update = F3( + function (targetKey, alter, dictionary) { + var _v0 = alter( + A2($elm$core$Dict$get, targetKey, dictionary)); + if (!_v0.$) { + var value = _v0.a; + return A3($elm$core$Dict$insert, targetKey, value, dictionary); + } else { + return A2($elm$core$Dict$remove, targetKey, dictionary); + } + }); +var $elm$url$Url$Parser$addParam = F2( + function (segment, dict) { + var _v0 = A2($elm$core$String$split, '=', segment); + if ((_v0.b && _v0.b.b) && (!_v0.b.b.b)) { + var rawKey = _v0.a; + var _v1 = _v0.b; + var rawValue = _v1.a; + var _v2 = $elm$url$Url$percentDecode(rawKey); + if (_v2.$ === 1) { + return dict; + } else { + var key = _v2.a; + var _v3 = $elm$url$Url$percentDecode(rawValue); + if (_v3.$ === 1) { + return dict; + } else { + var value = _v3.a; + return A3( + $elm$core$Dict$update, + key, + $elm$url$Url$Parser$addToParametersHelp(value), + dict); + } + } + } else { + return dict; + } + }); +var $elm$core$Dict$empty = $elm$core$Dict$RBEmpty_elm_builtin; +var $elm$url$Url$Parser$prepareQuery = function (maybeQuery) { + if (maybeQuery.$ === 1) { + return $elm$core$Dict$empty; + } else { + var qry = maybeQuery.a; + return A3( + $elm$core$List$foldr, + $elm$url$Url$Parser$addParam, + $elm$core$Dict$empty, + A2($elm$core$String$split, '&', qry)); + } +}; +var $elm$url$Url$Parser$parse = F2( + function (_v0, url) { + var parser = _v0; + return $elm$url$Url$Parser$getFirstMatch( + parser( + A5( + $elm$url$Url$Parser$State, + _List_Nil, + $elm$url$Url$Parser$preparePath(url.bd), + $elm$url$Url$Parser$prepareQuery(url.bg), + url.am, + $elm$core$Basics$identity))); + }); +var $elm$url$Url$Parser$Parser = $elm$core$Basics$identity; +var $elm$url$Url$Parser$mapState = F2( + function (func, _v0) { + var visited = _v0.F; + var unvisited = _v0.z; + var params = _v0.C; + var frag = _v0.B; + var value = _v0.u; + return A5( + $elm$url$Url$Parser$State, + visited, + unvisited, + params, + frag, + func(value)); + }); +var $elm$url$Url$Parser$map = F2( + function (subValue, _v0) { + var parseArg = _v0; + return function (_v1) { + var visited = _v1.F; + var unvisited = _v1.z; + var params = _v1.C; + var frag = _v1.B; + var value = _v1.u; + return A2( + $elm$core$List$map, + $elm$url$Url$Parser$mapState(value), + parseArg( + A5($elm$url$Url$Parser$State, visited, unvisited, params, frag, subValue))); + }; + }); +var $elm$core$List$append = F2( + function (xs, ys) { + if (!ys.b) { + return xs; + } else { + return A3($elm$core$List$foldr, $elm$core$List$cons, ys, xs); + } + }); +var $elm$core$List$concat = function (lists) { + return A3($elm$core$List$foldr, $elm$core$List$append, _List_Nil, lists); +}; +var $elm$core$List$concatMap = F2( + function (f, list) { + return $elm$core$List$concat( + A2($elm$core$List$map, f, list)); + }); +var $elm$url$Url$Parser$oneOf = function (parsers) { + return function (state) { + return A2( + $elm$core$List$concatMap, + function (_v0) { + var parser = _v0; + return parser(state); + }, + parsers); + }; +}; +var $author$project$Route$repr = function (route) { + switch (route) { + case 0: + return 'about'; + case 1: + return 'vsh'; + default: + return 'typer'; + } +}; +var $author$project$Route$TyperRoute = 2; +var $author$project$Route$VshRoute = 1; +var $author$project$Route$routes = _List_fromArray( + [0, 1, 2]); +var $elm$url$Url$Parser$s = function (str) { + return function (_v0) { + var visited = _v0.F; + var unvisited = _v0.z; + var params = _v0.C; + var frag = _v0.B; + var value = _v0.u; + if (!unvisited.b) { + return _List_Nil; + } else { + var next = unvisited.a; + var rest = unvisited.b; + return _Utils_eq(next, str) ? _List_fromArray( + [ + A5( + $elm$url$Url$Parser$State, + A2($elm$core$List$cons, next, visited), + rest, + params, + frag, + value) + ]) : _List_Nil; + } + }; +}; +var $elm$url$Url$Parser$top = function (state) { + return _List_fromArray( + [state]); +}; +var $author$project$Route$urlParser = function () { + var mapper = function (route) { + return A2( + $elm$url$Url$Parser$map, + route, + $elm$url$Url$Parser$s( + $author$project$Route$repr(route))); + }; + return $elm$url$Url$Parser$oneOf( + A2( + $elm$core$List$cons, + A2($elm$url$Url$Parser$map, 0, $elm$url$Url$Parser$top), + A2($elm$core$List$map, mapper, $author$project$Route$routes))); +}(); +var $author$project$Route$fromUrl = function (url) { + return A2( + $elm$core$Maybe$withDefault, + 0, + A2( + $elm$url$Url$Parser$parse, + $author$project$Route$urlParser, + $author$project$Route$fake(url))); +}; +var $elm$core$Platform$Cmd$batch = _Platform_batch; +var $elm$core$Platform$Cmd$none = $elm$core$Platform$Cmd$batch(_List_Nil); +var $author$project$About$Main$init = _Utils_Tuple2($author$project$About$Main$initModel, $elm$core$Platform$Cmd$none); +var $author$project$Typer$Main$Loading = {$: 0}; +var $author$project$Typer$Main$Failure = {$: 1}; +var $author$project$Typer$Main$Words = function (a) { + return {$: 2, a: a}; +}; +var $author$project$Typer$Text$Text = F3( + function (pointer, correct, symbols) { + return {ah: correct, t: pointer, q: symbols}; + }); +var $author$project$Typer$Text$Unknown = function (a) { + return {$: 0, a: a}; +}; +var $elm$core$Basics$composeR = F3( + function (f, g, x) { + return g( + f(x)); + }); +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, + {h: nodeList, e: nodeListSize, g: 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 $elm$core$String$foldr = _String_foldr; +var $elm$core$String$toList = function (string) { + return A3($elm$core$String$foldr, $elm$core$List$cons, _List_Nil, string); +}; +var $author$project$Typer$Text$fromString = A2( + $elm$core$Basics$composeR, + $elm$core$String$toList, + A2( + $elm$core$Basics$composeR, + $elm$core$List$map($author$project$Typer$Text$Unknown), + A2( + $elm$core$Basics$composeR, + $elm$core$Array$fromList, + A2($author$project$Typer$Text$Text, 0, 0)))); +var $author$project$Typer$Main$GotWordIndices = function (a) { + return {$: 8, a: a}; +}; +var $elm$random$Random$Generate = $elm$core$Basics$identity; +var $elm$random$Random$Seed = F2( + function (a, b) { + return {$: 0, a: a, b: b}; + }); +var $elm$core$Bitwise$shiftRightZfBy = _Bitwise_shiftRightZfBy; +var $elm$random$Random$next = function (_v0) { + var state0 = _v0.a; + var incr = _v0.b; + return A2($elm$random$Random$Seed, ((state0 * 1664525) + incr) >>> 0, incr); +}; +var $elm$random$Random$initialSeed = function (x) { + var _v0 = $elm$random$Random$next( + A2($elm$random$Random$Seed, 0, 1013904223)); + var state1 = _v0.a; + var incr = _v0.b; + var state2 = (state1 + x) >>> 0; + return $elm$random$Random$next( + A2($elm$random$Random$Seed, state2, incr)); +}; +var $elm$time$Time$Name = function (a) { + return {$: 0, a: a}; +}; +var $elm$time$Time$Offset = function (a) { + return {$: 1, a: a}; +}; +var $elm$time$Time$Zone = F2( + function (a, b) { + return {$: 0, a: a, b: b}; + }); +var $elm$time$Time$customZone = $elm$time$Time$Zone; +var $elm$time$Time$Posix = $elm$core$Basics$identity; +var $elm$time$Time$millisToPosix = $elm$core$Basics$identity; +var $elm$time$Time$now = _Time_now($elm$time$Time$millisToPosix); +var $elm$time$Time$posixToMillis = function (_v0) { + var millis = _v0; + return millis; +}; +var $elm$random$Random$init = A2( + $elm$core$Task$andThen, + function (time) { + return $elm$core$Task$succeed( + $elm$random$Random$initialSeed( + $elm$time$Time$posixToMillis(time))); + }, + $elm$time$Time$now); +var $elm$random$Random$step = F2( + function (_v0, seed) { + var generator = _v0; + return generator(seed); + }); +var $elm$random$Random$onEffects = F3( + function (router, commands, seed) { + if (!commands.b) { + return $elm$core$Task$succeed(seed); + } else { + var generator = commands.a; + var rest = commands.b; + var _v1 = A2($elm$random$Random$step, generator, seed); + var value = _v1.a; + var newSeed = _v1.b; + return A2( + $elm$core$Task$andThen, + function (_v2) { + return A3($elm$random$Random$onEffects, router, rest, newSeed); + }, + A2($elm$core$Platform$sendToApp, router, value)); + } + }); +var $elm$random$Random$onSelfMsg = F3( + function (_v0, _v1, seed) { + return $elm$core$Task$succeed(seed); + }); +var $elm$random$Random$Generator = $elm$core$Basics$identity; +var $elm$random$Random$map = F2( + function (func, _v0) { + var genA = _v0; + return function (seed0) { + var _v1 = genA(seed0); + var a = _v1.a; + var seed1 = _v1.b; + return _Utils_Tuple2( + func(a), + seed1); + }; + }); +var $elm$random$Random$cmdMap = F2( + function (func, _v0) { + var generator = _v0; + return A2($elm$random$Random$map, func, generator); + }); +_Platform_effectManagers['Random'] = _Platform_createManager($elm$random$Random$init, $elm$random$Random$onEffects, $elm$random$Random$onSelfMsg, $elm$random$Random$cmdMap); +var $elm$random$Random$command = _Platform_leaf('Random'); +var $elm$random$Random$generate = F2( + function (tagger, generator) { + return $elm$random$Random$command( + A2($elm$random$Random$map, tagger, generator)); + }); +var $elm$core$Bitwise$and = _Bitwise_and; +var $elm$core$Basics$negate = function (n) { + return -n; +}; +var $elm$core$Bitwise$xor = _Bitwise_xor; +var $elm$random$Random$peel = function (_v0) { + var state = _v0.a; + var word = (state ^ (state >>> ((state >>> 28) + 4))) * 277803737; + return ((word >>> 22) ^ word) >>> 0; +}; +var $elm$random$Random$int = F2( + function (a, b) { + return function (seed0) { + var _v0 = (_Utils_cmp(a, b) < 0) ? _Utils_Tuple2(a, b) : _Utils_Tuple2(b, a); + var lo = _v0.a; + var hi = _v0.b; + var range = (hi - lo) + 1; + if (!((range - 1) & range)) { + return _Utils_Tuple2( + (((range - 1) & $elm$random$Random$peel(seed0)) >>> 0) + lo, + $elm$random$Random$next(seed0)); + } else { + var threshhold = (((-range) >>> 0) % range) >>> 0; + var accountForBias = function (seed) { + accountForBias: + while (true) { + var x = $elm$random$Random$peel(seed); + var seedN = $elm$random$Random$next(seed); + if (_Utils_cmp(x, threshhold) < 0) { + var $temp$seed = seedN; + seed = $temp$seed; + continue accountForBias; + } else { + return _Utils_Tuple2((x % range) + lo, seedN); + } + } + }; + return accountForBias(seed0); + } + }; + }); +var $elm$core$Array$length = function (_v0) { + var len = _v0.a; + return len; +}; +var $elm$random$Random$listHelp = F4( + function (revList, n, gen, seed) { + listHelp: + while (true) { + if (n < 1) { + return _Utils_Tuple2(revList, seed); + } else { + var _v0 = gen(seed); + var value = _v0.a; + var newSeed = _v0.b; + var $temp$revList = A2($elm$core$List$cons, value, revList), + $temp$n = n - 1, + $temp$gen = gen, + $temp$seed = newSeed; + revList = $temp$revList; + n = $temp$n; + gen = $temp$gen; + seed = $temp$seed; + continue listHelp; + } + } + }); +var $elm$random$Random$list = F2( + function (n, _v0) { + var gen = _v0; + return function (seed) { + return A4($elm$random$Random$listHelp, _List_Nil, n, gen, seed); + }; + }); +var $author$project$Typer$Config$wordsPerBatch = 25; +var $author$project$Typer$Main$getRandomWordIndices = function (words) { + return A2( + $elm$random$Random$generate, + $author$project$Typer$Main$GotWordIndices, + A2( + $elm$random$Random$list, + $author$project$Typer$Config$wordsPerBatch, + A2( + $elm$random$Random$int, + 0, + $elm$core$Array$length(words)))); +}; +var $author$project$Typer$Main$GotWords = function (a) { + return {$: 7, a: a}; +}; +var $elm$http$Http$BadStatus_ = F2( + function (a, b) { + return {$: 3, a: a, b: b}; + }); +var $elm$http$Http$BadUrl_ = function (a) { + return {$: 0, a: a}; +}; +var $elm$http$Http$GoodStatus_ = F2( + function (a, b) { + return {$: 4, a: a, b: b}; + }); +var $elm$http$Http$NetworkError_ = {$: 2}; +var $elm$http$Http$Receiving = function (a) { + return {$: 1, a: a}; +}; +var $elm$http$Http$Sending = function (a) { + return {$: 0, a: a}; +}; +var $elm$http$Http$Timeout_ = {$: 1}; +var $elm$core$Maybe$isJust = function (maybe) { + if (!maybe.$) { + return true; + } else { + return false; + } +}; +var $elm$core$Platform$sendToSelf = _Platform_sendToSelf; +var $elm$http$Http$expectStringResponse = F2( + function (toMsg, toResult) { + return A3( + _Http_expect, + '', + $elm$core$Basics$identity, + A2($elm$core$Basics$composeR, toResult, toMsg)); + }); +var $elm$http$Http$BadBody = function (a) { + return {$: 4, a: a}; +}; +var $elm$http$Http$BadStatus = function (a) { + return {$: 3, a: a}; +}; +var $elm$http$Http$BadUrl = function (a) { + return {$: 0, a: a}; +}; +var $elm$http$Http$NetworkError = {$: 2}; +var $elm$http$Http$Timeout = {$: 1}; +var $elm$core$Result$mapError = F2( + function (f, result) { + if (!result.$) { + var v = result.a; + return $elm$core$Result$Ok(v); + } else { + var e = result.a; + return $elm$core$Result$Err( + f(e)); + } + }); +var $elm$http$Http$resolve = F2( + function (toResult, response) { + switch (response.$) { + case 0: + var url = response.a; + return $elm$core$Result$Err( + $elm$http$Http$BadUrl(url)); + case 1: + return $elm$core$Result$Err($elm$http$Http$Timeout); + case 2: + return $elm$core$Result$Err($elm$http$Http$NetworkError); + case 3: + var metadata = response.a; + return $elm$core$Result$Err( + $elm$http$Http$BadStatus(metadata.bk)); + default: + var body = response.b; + return A2( + $elm$core$Result$mapError, + $elm$http$Http$BadBody, + toResult(body)); + } + }); +var $elm$http$Http$expectString = function (toMsg) { + return A2( + $elm$http$Http$expectStringResponse, + toMsg, + $elm$http$Http$resolve($elm$core$Result$Ok)); +}; +var $elm$http$Http$emptyBody = _Http_emptyBody; +var $elm$http$Http$Request = function (a) { + return {$: 1, a: a}; +}; +var $elm$http$Http$State = F2( + function (reqs, subs) { + return {aB: reqs, aK: subs}; + }); +var $elm$http$Http$init = $elm$core$Task$succeed( + A2($elm$http$Http$State, $elm$core$Dict$empty, _List_Nil)); +var $elm$core$Process$kill = _Scheduler_kill; +var $elm$core$Process$spawn = _Scheduler_spawn; +var $elm$http$Http$updateReqs = F3( + function (router, cmds, reqs) { + updateReqs: + while (true) { + if (!cmds.b) { + return $elm$core$Task$succeed(reqs); + } else { + var cmd = cmds.a; + var otherCmds = cmds.b; + if (!cmd.$) { + var tracker = cmd.a; + var _v2 = A2($elm$core$Dict$get, tracker, reqs); + if (_v2.$ === 1) { + var $temp$router = router, + $temp$cmds = otherCmds, + $temp$reqs = reqs; + router = $temp$router; + cmds = $temp$cmds; + reqs = $temp$reqs; + continue updateReqs; + } else { + var pid = _v2.a; + return A2( + $elm$core$Task$andThen, + function (_v3) { + return A3( + $elm$http$Http$updateReqs, + router, + otherCmds, + A2($elm$core$Dict$remove, tracker, reqs)); + }, + $elm$core$Process$kill(pid)); + } + } else { + var req = cmd.a; + return A2( + $elm$core$Task$andThen, + function (pid) { + var _v4 = req.aN; + if (_v4.$ === 1) { + return A3($elm$http$Http$updateReqs, router, otherCmds, reqs); + } else { + var tracker = _v4.a; + return A3( + $elm$http$Http$updateReqs, + router, + otherCmds, + A3($elm$core$Dict$insert, tracker, pid, reqs)); + } + }, + $elm$core$Process$spawn( + A3( + _Http_toTask, + router, + $elm$core$Platform$sendToApp(router), + req))); + } + } + } + }); +var $elm$http$Http$onEffects = F4( + function (router, cmds, subs, state) { + return A2( + $elm$core$Task$andThen, + function (reqs) { + return $elm$core$Task$succeed( + A2($elm$http$Http$State, reqs, subs)); + }, + A3($elm$http$Http$updateReqs, router, cmds, state.aB)); + }); +var $elm$core$List$maybeCons = F3( + function (f, mx, xs) { + var _v0 = f(mx); + if (!_v0.$) { + var x = _v0.a; + return A2($elm$core$List$cons, x, xs); + } else { + return xs; + } + }); +var $elm$core$List$filterMap = F2( + function (f, xs) { + return A3( + $elm$core$List$foldr, + $elm$core$List$maybeCons(f), + _List_Nil, + xs); + }); +var $elm$http$Http$maybeSend = F4( + function (router, desiredTracker, progress, _v0) { + var actualTracker = _v0.a; + var toMsg = _v0.b; + return _Utils_eq(desiredTracker, actualTracker) ? $elm$core$Maybe$Just( + A2( + $elm$core$Platform$sendToApp, + router, + toMsg(progress))) : $elm$core$Maybe$Nothing; + }); +var $elm$http$Http$onSelfMsg = F3( + function (router, _v0, state) { + var tracker = _v0.a; + var progress = _v0.b; + return A2( + $elm$core$Task$andThen, + function (_v1) { + return $elm$core$Task$succeed(state); + }, + $elm$core$Task$sequence( + A2( + $elm$core$List$filterMap, + A3($elm$http$Http$maybeSend, router, tracker, progress), + state.aK))); + }); +var $elm$http$Http$Cancel = function (a) { + return {$: 0, a: a}; +}; +var $elm$http$Http$cmdMap = F2( + function (func, cmd) { + if (!cmd.$) { + var tracker = cmd.a; + return $elm$http$Http$Cancel(tracker); + } else { + var r = cmd.a; + return $elm$http$Http$Request( + { + aW: r.aW, + ae: r.ae, + a1: A2(_Http_mapExpect, func, r.a1), + an: r.an, + a8: r.a8, + bn: r.bn, + aN: r.aN, + bp: r.bp + }); + } + }); +var $elm$http$Http$MySub = F2( + function (a, b) { + return {$: 0, a: a, b: b}; + }); +var $elm$http$Http$subMap = F2( + function (func, _v0) { + var tracker = _v0.a; + var toMsg = _v0.b; + return A2( + $elm$http$Http$MySub, + tracker, + A2($elm$core$Basics$composeR, toMsg, func)); + }); +_Platform_effectManagers['Http'] = _Platform_createManager($elm$http$Http$init, $elm$http$Http$onEffects, $elm$http$Http$onSelfMsg, $elm$http$Http$cmdMap, $elm$http$Http$subMap); +var $elm$http$Http$command = _Platform_leaf('Http'); +var $elm$http$Http$subscription = _Platform_leaf('Http'); +var $elm$http$Http$request = function (r) { + return $elm$http$Http$command( + $elm$http$Http$Request( + {aW: false, ae: r.ae, a1: r.a1, an: r.an, a8: r.a8, bn: r.bn, aN: r.aN, bp: r.bp})); +}; +var $elm$http$Http$get = function (r) { + return $elm$http$Http$request( + {ae: $elm$http$Http$emptyBody, a1: r.a1, an: _List_Nil, a8: 'GET', bn: $elm$core$Maybe$Nothing, aN: $elm$core$Maybe$Nothing, bp: r.bp}); +}; +var $author$project$Typer$Link$words = 'https://gist.githubusercontent.com/deekayen/4148741/raw/98d35708fa344717d8eee15d11987de6c8e26d7d/1-1000.txt'; +var $author$project$Typer$Main$getWords = $elm$http$Http$get( + { + a1: $elm$http$Http$expectString($author$project$Typer$Main$GotWords), + bp: $author$project$Typer$Link$words + }); +var $author$project$Typer$Stopwatch$init = {a_: 0, M: $elm$core$Maybe$Nothing, O: $elm$core$Maybe$Nothing}; +var $author$project$Typer$Main$initModel = { + n: $author$project$Typer$Stopwatch$init, + i: $author$project$Typer$Text$fromString('Loading words...'), + A: $author$project$Typer$Main$Loading +}; +var $author$project$Typer$Main$initModelWithWords = function (words) { + switch (words.$) { + case 0: + return _Utils_Tuple2($author$project$Typer$Main$initModel, $author$project$Typer$Main$getWords); + case 1: + return _Utils_Tuple2( + _Utils_update( + $author$project$Typer$Main$initModel, + { + i: $author$project$Typer$Text$fromString('Failed to load words...'), + A: $author$project$Typer$Main$Failure + }), + $elm$core$Platform$Cmd$none); + default: + var list = words.a; + return _Utils_Tuple2( + _Utils_update( + $author$project$Typer$Main$initModel, + { + A: $author$project$Typer$Main$Words(list) + }), + $author$project$Typer$Main$getRandomWordIndices(list)); + } +}; +var $author$project$Typer$Main$init = $author$project$Typer$Main$initModelWithWords($author$project$Typer$Main$Loading); +var $author$project$Vsh$History$History = F2( + function (history, ptr) { + return {w: history, D: ptr}; + }); +var $author$project$Vsh$History$empty = A2($author$project$Vsh$History$History, $elm$core$Array$empty, 0); +var $author$project$Vsh$Text$Green = 1; +var $author$project$Vsh$Text$Yellow = 0; +var $elm$json$Json$Encode$string = _Json_wrap; +var $elm$html$Html$Attributes$stringProperty = F2( + function (key, string) { + return A2( + _VirtualDom_property, + key, + $elm$json$Json$Encode$string(string)); + }); +var $elm$html$Html$Attributes$class = $elm$html$Html$Attributes$stringProperty('className'); +var $author$project$Vsh$Text$colorToClass = function (c) { + return 'vsh-' + function () { + switch (c) { + case 0: + return 'yellow'; + case 1: + return 'green'; + default: + return 'magenta'; + } + }(); +}; +var $elm$html$Html$span = _VirtualDom_node('span'); +var $elm$virtual_dom$VirtualDom$text = _VirtualDom_text; +var $elm$html$Html$text = $elm$virtual_dom$VirtualDom$text; +var $author$project$Vsh$Text$ctext = F2( + function (color, message) { + return A2( + $elm$html$Html$span, + _List_fromArray( + [ + $elm$html$Html$Attributes$class( + 'vsh-text ' + $author$project$Vsh$Text$colorToClass(color)) + ]), + _List_fromArray( + [ + $elm$html$Html$text(message) + ])); + }); +var $author$project$Vsh$Text$Magenta = 2; +var $author$project$Vsh$Main$prompt = _List_fromArray( + [ + A2($author$project$Vsh$Text$ctext, 0, 'guest'), + $elm$html$Html$text(' at '), + A2($author$project$Vsh$Text$ctext, 2, 'sharpvik'), + $elm$html$Html$text('\n❯ ') + ]); +var $author$project$Vsh$Command$version = F2( + function (_v0, display) { + return _Utils_ap( + display, + _List_fromArray( + [ + $elm$html$Html$text('vsh v0.1.3 by Viktor A. Rozenko Voitenko ') + ])); + }); +var $author$project$Vsh$Main$greeting = _Utils_ap( + A2($author$project$Vsh$Command$version, 'version', _List_Nil), + _Utils_ap( + _List_fromArray( + [ + $elm$html$Html$text('\nEnter '), + A2($author$project$Vsh$Text$ctext, 1, 'help'), + $elm$html$Html$text(' to see available commands!\n'), + A2($author$project$Vsh$Text$ctext, 0, 'VSH does not support mobile devices.\n\n') + ]), + $author$project$Vsh$Main$prompt)); +var $author$project$Vsh$Main$initModel = {r: '', L: $author$project$Vsh$Main$greeting, w: $author$project$Vsh$History$empty}; +var $author$project$Vsh$Main$init = _Utils_Tuple2($author$project$Vsh$Main$initModel, $elm$core$Platform$Cmd$none); +var $elm$core$Platform$Cmd$map = _Platform_map; +var $author$project$Main$toKey = function (model) { + switch (model.$) { + case 0: + var key = model.a; + return key; + case 1: + var key = model.a; + return key; + default: + var key = model.a; + return key; + } +}; +var $author$project$Main$mux = F2( + function (model, url) { + var route = $author$project$Route$fromUrl(url); + var norm = F3( + function (toModel, toMsg, _v1) { + var subModel = _v1.a; + var cmd = _v1.b; + return _Utils_Tuple2( + toModel(subModel), + A2($elm$core$Platform$Cmd$map, toMsg, cmd)); + }); + var key = $author$project$Main$toKey(model); + switch (route) { + case 0: + return A3( + norm, + $author$project$Main$AboutModel(key), + $author$project$Main$GotAboutMsg, + $author$project$About$Main$init); + case 1: + return A3( + norm, + $author$project$Main$VshModel(key), + $author$project$Main$GotVshMsg, + $author$project$Vsh$Main$init); + default: + return A3( + norm, + $author$project$Main$TyperModel(key), + $author$project$Main$GotTyperMsg, + $author$project$Typer$Main$init); + } + }); +var $author$project$Main$init = F3( + function (_v0, url, key) { + return A2( + $author$project$Main$mux, + A2($author$project$Main$AboutModel, key, $author$project$About$Main$initModel), + url); + }); +var $elm$core$Platform$Sub$map = _Platform_map; +var $elm$core$Platform$Sub$batch = _Platform_batch; +var $elm$core$Platform$Sub$none = $elm$core$Platform$Sub$batch(_List_Nil); +var $author$project$About$Main$subscriptions = function (_v0) { + return $elm$core$Platform$Sub$none; +}; +var $author$project$Typer$Main$Tick = function (a) { + return {$: 4, a: a}; +}; +var $elm$time$Time$Every = F2( + function (a, b) { + return {$: 0, a: a, b: b}; + }); +var $elm$time$Time$State = F2( + function (taggers, processes) { + return {az: processes, aL: taggers}; + }); +var $elm$time$Time$init = $elm$core$Task$succeed( + A2($elm$time$Time$State, $elm$core$Dict$empty, $elm$core$Dict$empty)); +var $elm$time$Time$addMySub = F2( + function (_v0, state) { + var interval = _v0.a; + var tagger = _v0.b; + var _v1 = A2($elm$core$Dict$get, interval, state); + if (_v1.$ === 1) { + return A3( + $elm$core$Dict$insert, + interval, + _List_fromArray( + [tagger]), + state); + } else { + var taggers = _v1.a; + return A3( + $elm$core$Dict$insert, + interval, + A2($elm$core$List$cons, tagger, taggers), + state); + } + }); +var $elm$core$Dict$foldl = F3( + function (func, acc, dict) { + foldl: + while (true) { + if (dict.$ === -2) { + return acc; + } else { + var key = dict.b; + var value = dict.c; + var left = dict.d; + var right = dict.e; + var $temp$func = func, + $temp$acc = A3( + func, + key, + value, + A3($elm$core$Dict$foldl, func, acc, left)), + $temp$dict = right; + func = $temp$func; + acc = $temp$acc; + dict = $temp$dict; + continue foldl; + } + } + }); +var $elm$core$Dict$merge = F6( + function (leftStep, bothStep, rightStep, leftDict, rightDict, initialResult) { + var stepState = F3( + function (rKey, rValue, _v0) { + stepState: + while (true) { + var list = _v0.a; + var result = _v0.b; + if (!list.b) { + return _Utils_Tuple2( + list, + A3(rightStep, rKey, rValue, result)); + } else { + var _v2 = list.a; + var lKey = _v2.a; + var lValue = _v2.b; + var rest = list.b; + if (_Utils_cmp(lKey, rKey) < 0) { + var $temp$rKey = rKey, + $temp$rValue = rValue, + $temp$_v0 = _Utils_Tuple2( + rest, + A3(leftStep, lKey, lValue, result)); + rKey = $temp$rKey; + rValue = $temp$rValue; + _v0 = $temp$_v0; + continue stepState; + } else { + if (_Utils_cmp(lKey, rKey) > 0) { + return _Utils_Tuple2( + list, + A3(rightStep, rKey, rValue, result)); + } else { + return _Utils_Tuple2( + rest, + A4(bothStep, lKey, lValue, rValue, result)); + } + } + } + } + }); + var _v3 = A3( + $elm$core$Dict$foldl, + stepState, + _Utils_Tuple2( + $elm$core$Dict$toList(leftDict), + initialResult), + rightDict); + var leftovers = _v3.a; + var intermediateResult = _v3.b; + return A3( + $elm$core$List$foldl, + F2( + function (_v4, result) { + var k = _v4.a; + var v = _v4.b; + return A3(leftStep, k, v, result); + }), + intermediateResult, + leftovers); + }); +var $elm$time$Time$setInterval = _Time_setInterval; +var $elm$time$Time$spawnHelp = F3( + function (router, intervals, processes) { + if (!intervals.b) { + return $elm$core$Task$succeed(processes); + } else { + var interval = intervals.a; + var rest = intervals.b; + var spawnTimer = $elm$core$Process$spawn( + A2( + $elm$time$Time$setInterval, + interval, + A2($elm$core$Platform$sendToSelf, router, interval))); + var spawnRest = function (id) { + return A3( + $elm$time$Time$spawnHelp, + router, + rest, + A3($elm$core$Dict$insert, interval, id, processes)); + }; + return A2($elm$core$Task$andThen, spawnRest, spawnTimer); + } + }); +var $elm$time$Time$onEffects = F3( + function (router, subs, _v0) { + var processes = _v0.az; + var rightStep = F3( + function (_v6, id, _v7) { + var spawns = _v7.a; + var existing = _v7.b; + var kills = _v7.c; + return _Utils_Tuple3( + spawns, + existing, + A2( + $elm$core$Task$andThen, + function (_v5) { + return kills; + }, + $elm$core$Process$kill(id))); + }); + var newTaggers = A3($elm$core$List$foldl, $elm$time$Time$addMySub, $elm$core$Dict$empty, subs); + var leftStep = F3( + function (interval, taggers, _v4) { + var spawns = _v4.a; + var existing = _v4.b; + var kills = _v4.c; + return _Utils_Tuple3( + A2($elm$core$List$cons, interval, spawns), + existing, + kills); + }); + var bothStep = F4( + function (interval, taggers, id, _v3) { + var spawns = _v3.a; + var existing = _v3.b; + var kills = _v3.c; + return _Utils_Tuple3( + spawns, + A3($elm$core$Dict$insert, interval, id, existing), + kills); + }); + var _v1 = A6( + $elm$core$Dict$merge, + leftStep, + bothStep, + rightStep, + newTaggers, + processes, + _Utils_Tuple3( + _List_Nil, + $elm$core$Dict$empty, + $elm$core$Task$succeed(0))); + var spawnList = _v1.a; + var existingDict = _v1.b; + var killTask = _v1.c; + return A2( + $elm$core$Task$andThen, + function (newProcesses) { + return $elm$core$Task$succeed( + A2($elm$time$Time$State, newTaggers, newProcesses)); + }, + A2( + $elm$core$Task$andThen, + function (_v2) { + return A3($elm$time$Time$spawnHelp, router, spawnList, existingDict); + }, + killTask)); + }); +var $elm$time$Time$onSelfMsg = F3( + function (router, interval, state) { + var _v0 = A2($elm$core$Dict$get, interval, state.aL); + if (_v0.$ === 1) { + return $elm$core$Task$succeed(state); + } else { + var taggers = _v0.a; + var tellTaggers = function (time) { + return $elm$core$Task$sequence( + A2( + $elm$core$List$map, + function (tagger) { + return A2( + $elm$core$Platform$sendToApp, + router, + tagger(time)); + }, + taggers)); + }; + return A2( + $elm$core$Task$andThen, + function (_v1) { + return $elm$core$Task$succeed(state); + }, + A2($elm$core$Task$andThen, tellTaggers, $elm$time$Time$now)); + } + }); +var $elm$core$Basics$composeL = F3( + function (g, f, x) { + return g( + f(x)); + }); +var $elm$time$Time$subMap = F2( + function (f, _v0) { + var interval = _v0.a; + var tagger = _v0.b; + return A2( + $elm$time$Time$Every, + interval, + A2($elm$core$Basics$composeL, f, tagger)); + }); +_Platform_effectManagers['Time'] = _Platform_createManager($elm$time$Time$init, $elm$time$Time$onEffects, $elm$time$Time$onSelfMsg, 0, $elm$time$Time$subMap); +var $elm$time$Time$subscription = _Platform_leaf('Time'); +var $elm$time$Time$every = F2( + function (interval, tagger) { + return $elm$time$Time$subscription( + A2($elm$time$Time$Every, interval, tagger)); + }); +var $elm$core$Basics$ge = _Utils_ge; +var $author$project$Typer$Text$isComplete = function (txt) { + return _Utils_cmp( + txt.t, + $elm$core$Array$length(txt.q)) > -1; +}; +var $author$project$Typer$Text$isUntouched = function (txt) { + return !txt.t; +}; +var $elm$json$Json$Decode$bool = _Json_decodeBool; +var $author$project$Typer$Main$Alt = function (a) { + return {$: 5, a: a}; +}; +var $author$project$Typer$Main$Backspace = {$: 3}; +var $author$project$Typer$Main$Ctrl = function (a) { + return {$: 4, a: a}; +}; +var $author$project$Typer$Main$Enter = {$: 2}; +var $author$project$Typer$Main$Symbol = function (a) { + return {$: 0, a: a}; +}; +var $author$project$Typer$Main$Tab = {$: 1}; +var $author$project$Typer$Main$Other = {$: 6}; +var $elm$core$Basics$neq = _Utils_notEqual; +var $author$project$Typer$Main$specialKeyEvent = F2( + function (event, key) { + if ($elm$core$String$length(key) !== 1) { + return $author$project$Typer$Main$Other; + } else { + var _v0 = $elm$core$String$uncons(key); + if (!_v0.$) { + var _v1 = _v0.a; + var _char = _v1.a; + return event(_char); + } else { + return $author$project$Typer$Main$Other; + } + } + }); +var $author$project$Typer$Main$eventConstructor = F3( + function (ctrl, alt, key) { + if (ctrl) { + return A2($author$project$Typer$Main$specialKeyEvent, $author$project$Typer$Main$Ctrl, key); + } else { + if (alt) { + return A2($author$project$Typer$Main$specialKeyEvent, $author$project$Typer$Main$Alt, key); + } else { + switch (key) { + case 'Tab': + return $author$project$Typer$Main$Tab; + case 'Enter': + return $author$project$Typer$Main$Enter; + case 'Backspace': + return $author$project$Typer$Main$Backspace; + default: + var _char = key; + return A2($author$project$Typer$Main$specialKeyEvent, $author$project$Typer$Main$Symbol, _char); + } + } + } + }); +var $elm$json$Json$Decode$field = _Json_decodeField; +var $elm$json$Json$Decode$map3 = _Json_map3; +var $elm$json$Json$Decode$string = _Json_decodeString; +var $author$project$Typer$Main$eventDecoder = A4( + $elm$json$Json$Decode$map3, + $author$project$Typer$Main$eventConstructor, + A2($elm$json$Json$Decode$field, 'ctrlKey', $elm$json$Json$Decode$bool), + A2($elm$json$Json$Decode$field, 'altKey', $elm$json$Json$Decode$bool), + A2($elm$json$Json$Decode$field, 'key', $elm$json$Json$Decode$string)); +var $author$project$Typer$Main$GotEraseSignal = {$: 6}; +var $author$project$Typer$Main$GotResetSignal = {$: 5}; +var $author$project$Typer$Main$GotSymbol = function (a) { + return {$: 1, a: a}; +}; +var $author$project$Typer$Main$Ignore = {$: 0}; +var $author$project$Typer$Main$toKeyDownMsg = function (event) { + switch (event.$) { + case 0: + var letter = event.a; + return $author$project$Typer$Main$GotSymbol(letter); + case 1: + return $author$project$Typer$Main$GotResetSignal; + case 3: + return $author$project$Typer$Main$GotEraseSignal; + default: + return $author$project$Typer$Main$Ignore; + } +}; +var $author$project$Typer$Main$keydownHandler = A2($elm$json$Json$Decode$map, $author$project$Typer$Main$toKeyDownMsg, $author$project$Typer$Main$eventDecoder); +var $author$project$Typer$Config$millisBetweenTicks = 100; +var $elm$browser$Browser$Events$Document = 0; +var $elm$browser$Browser$Events$MySub = F3( + function (a, b, c) { + return {$: 0, a: a, b: b, c: c}; + }); +var $elm$browser$Browser$Events$State = F2( + function (subs, pids) { + return {aw: pids, aK: subs}; + }); +var $elm$browser$Browser$Events$init = $elm$core$Task$succeed( + A2($elm$browser$Browser$Events$State, _List_Nil, $elm$core$Dict$empty)); +var $elm$browser$Browser$Events$nodeToKey = function (node) { + if (!node) { + return 'd_'; + } else { + return 'w_'; + } +}; +var $elm$browser$Browser$Events$addKey = function (sub) { + var node = sub.a; + var name = sub.b; + return _Utils_Tuple2( + _Utils_ap( + $elm$browser$Browser$Events$nodeToKey(node), + name), + sub); +}; +var $elm$core$Dict$fromList = function (assocs) { + return A3( + $elm$core$List$foldl, + F2( + function (_v0, dict) { + var key = _v0.a; + var value = _v0.b; + return A3($elm$core$Dict$insert, key, value, dict); + }), + $elm$core$Dict$empty, + assocs); +}; +var $elm$browser$Browser$Events$Event = F2( + function (key, event) { + return {aj: event, at: key}; + }); +var $elm$browser$Browser$Events$spawn = F3( + function (router, key, _v0) { + var node = _v0.a; + var name = _v0.b; + var actualNode = function () { + if (!node) { + return _Browser_doc; + } else { + return _Browser_window; + } + }(); + return A2( + $elm$core$Task$map, + function (value) { + return _Utils_Tuple2(key, value); + }, + A3( + _Browser_on, + actualNode, + name, + function (event) { + return A2( + $elm$core$Platform$sendToSelf, + router, + A2($elm$browser$Browser$Events$Event, key, event)); + })); + }); +var $elm$core$Dict$union = F2( + function (t1, t2) { + return A3($elm$core$Dict$foldl, $elm$core$Dict$insert, t2, t1); + }); +var $elm$browser$Browser$Events$onEffects = F3( + function (router, subs, state) { + var stepRight = F3( + function (key, sub, _v6) { + var deads = _v6.a; + var lives = _v6.b; + var news = _v6.c; + return _Utils_Tuple3( + deads, + lives, + A2( + $elm$core$List$cons, + A3($elm$browser$Browser$Events$spawn, router, key, sub), + news)); + }); + var stepLeft = F3( + function (_v4, pid, _v5) { + var deads = _v5.a; + var lives = _v5.b; + var news = _v5.c; + return _Utils_Tuple3( + A2($elm$core$List$cons, pid, deads), + lives, + news); + }); + var stepBoth = F4( + function (key, pid, _v2, _v3) { + var deads = _v3.a; + var lives = _v3.b; + var news = _v3.c; + return _Utils_Tuple3( + deads, + A3($elm$core$Dict$insert, key, pid, lives), + news); + }); + var newSubs = A2($elm$core$List$map, $elm$browser$Browser$Events$addKey, subs); + var _v0 = A6( + $elm$core$Dict$merge, + stepLeft, + stepBoth, + stepRight, + state.aw, + $elm$core$Dict$fromList(newSubs), + _Utils_Tuple3(_List_Nil, $elm$core$Dict$empty, _List_Nil)); + var deadPids = _v0.a; + var livePids = _v0.b; + var makeNewPids = _v0.c; + return A2( + $elm$core$Task$andThen, + function (pids) { + return $elm$core$Task$succeed( + A2( + $elm$browser$Browser$Events$State, + newSubs, + A2( + $elm$core$Dict$union, + livePids, + $elm$core$Dict$fromList(pids)))); + }, + A2( + $elm$core$Task$andThen, + function (_v1) { + return $elm$core$Task$sequence(makeNewPids); + }, + $elm$core$Task$sequence( + A2($elm$core$List$map, $elm$core$Process$kill, deadPids)))); + }); +var $elm$browser$Browser$Events$onSelfMsg = F3( + function (router, _v0, state) { + var key = _v0.at; + var event = _v0.aj; + var toMessage = function (_v2) { + var subKey = _v2.a; + var _v3 = _v2.b; + var node = _v3.a; + var name = _v3.b; + var decoder = _v3.c; + return _Utils_eq(subKey, key) ? A2(_Browser_decodeEvent, decoder, event) : $elm$core$Maybe$Nothing; + }; + var messages = A2($elm$core$List$filterMap, toMessage, state.aK); + return A2( + $elm$core$Task$andThen, + function (_v1) { + return $elm$core$Task$succeed(state); + }, + $elm$core$Task$sequence( + A2( + $elm$core$List$map, + $elm$core$Platform$sendToApp(router), + messages))); + }); +var $elm$browser$Browser$Events$subMap = F2( + function (func, _v0) { + var node = _v0.a; + var name = _v0.b; + var decoder = _v0.c; + return A3( + $elm$browser$Browser$Events$MySub, + node, + name, + A2($elm$json$Json$Decode$map, func, decoder)); + }); +_Platform_effectManagers['Browser.Events'] = _Platform_createManager($elm$browser$Browser$Events$init, $elm$browser$Browser$Events$onEffects, $elm$browser$Browser$Events$onSelfMsg, 0, $elm$browser$Browser$Events$subMap); +var $elm$browser$Browser$Events$subscription = _Platform_leaf('Browser.Events'); +var $elm$browser$Browser$Events$on = F3( + function (node, name, decoder) { + return $elm$browser$Browser$Events$subscription( + A3($elm$browser$Browser$Events$MySub, node, name, decoder)); + }); +var $elm$browser$Browser$Events$onKeyDown = A2($elm$browser$Browser$Events$on, 0, 'keydown'); +var $author$project$Typer$Main$subscriptions = function (model) { + var handleKeydownEvents = $elm$browser$Browser$Events$onKeyDown($author$project$Typer$Main$keydownHandler); + return ($author$project$Typer$Text$isUntouched(model.i) || $author$project$Typer$Text$isComplete(model.i)) ? handleKeydownEvents : $elm$core$Platform$Sub$batch( + _List_fromArray( + [ + handleKeydownEvents, + A2($elm$time$Time$every, $author$project$Typer$Config$millisBetweenTicks, $author$project$Typer$Main$Tick) + ])); +}; +var $author$project$Vsh$Main$Alt = function (a) { + return {$: 7, a: a}; +}; +var $author$project$Vsh$Main$ArrowDown = {$: 5}; +var $author$project$Vsh$Main$ArrowUp = {$: 4}; +var $author$project$Vsh$Main$Backspace = {$: 3}; +var $author$project$Vsh$Main$Ctrl = function (a) { + return {$: 6, a: a}; +}; +var $author$project$Vsh$Main$Enter = {$: 2}; +var $author$project$Vsh$Main$Symbol = function (a) { + return {$: 0, a: a}; +}; +var $author$project$Vsh$Main$Tab = {$: 1}; +var $author$project$Vsh$Main$Other = {$: 8}; +var $author$project$Vsh$Main$specialKeyEvent = F2( + function (event, key) { + if ($elm$core$String$length(key) !== 1) { + return $author$project$Vsh$Main$Other; + } else { + var _v0 = $elm$core$String$uncons(key); + if (!_v0.$) { + var _v1 = _v0.a; + var _char = _v1.a; + return event(_char); + } else { + return $author$project$Vsh$Main$Other; + } + } + }); +var $author$project$Vsh$Main$eventConstructor = F3( + function (ctrl, alt, key) { + if (ctrl) { + return A2($author$project$Vsh$Main$specialKeyEvent, $author$project$Vsh$Main$Ctrl, key); + } else { + if (alt) { + return A2($author$project$Vsh$Main$specialKeyEvent, $author$project$Vsh$Main$Alt, key); + } else { + switch (key) { + case 'Tab': + return $author$project$Vsh$Main$Tab; + case 'Enter': + return $author$project$Vsh$Main$Enter; + case 'Backspace': + return $author$project$Vsh$Main$Backspace; + case 'ArrowUp': + return $author$project$Vsh$Main$ArrowUp; + case 'ArrowDown': + return $author$project$Vsh$Main$ArrowDown; + default: + var _char = key; + return A2($author$project$Vsh$Main$specialKeyEvent, $author$project$Vsh$Main$Symbol, _char); + } + } + } + }); +var $author$project$Vsh$Main$eventDecoder = A4( + $elm$json$Json$Decode$map3, + $author$project$Vsh$Main$eventConstructor, + A2($elm$json$Json$Decode$field, 'ctrlKey', $elm$json$Json$Decode$bool), + A2($elm$json$Json$Decode$field, 'altKey', $elm$json$Json$Decode$bool), + A2($elm$json$Json$Decode$field, 'key', $elm$json$Json$Decode$string)); +var $author$project$Vsh$Main$Clear = {$: 1}; +var $author$project$Vsh$Main$Exit = {$: 2}; +var $author$project$Vsh$Main$Ignore = {$: 3}; +var $author$project$Vsh$Main$KeyDown = function (a) { + return {$: 0, a: a}; +}; +var $author$project$Vsh$Main$toKeyDownMsg = function (event) { + _v0$3: + while (true) { + switch (event.$) { + case 6: + switch (event.a) { + case ';': + return $author$project$Vsh$Main$Clear; + case 'e': + return $author$project$Vsh$Main$Exit; + default: + break _v0$3; + } + case 8: + return $author$project$Vsh$Main$Ignore; + default: + break _v0$3; + } + } + var e = event; + return $author$project$Vsh$Main$KeyDown(e); +}; +var $author$project$Vsh$Main$keydownHandler = A2($elm$json$Json$Decode$map, $author$project$Vsh$Main$toKeyDownMsg, $author$project$Vsh$Main$eventDecoder); +var $author$project$Vsh$Main$subscriptions = function (_v0) { + return $elm$browser$Browser$Events$onKeyDown($author$project$Vsh$Main$keydownHandler); +}; +var $author$project$Main$subscriptions = function (model) { + switch (model.$) { + case 0: + var mo = model.b; + return A2( + $elm$core$Platform$Sub$map, + $author$project$Main$GotAboutMsg, + $author$project$About$Main$subscriptions(mo)); + case 1: + var mo = model.b; + return A2( + $elm$core$Platform$Sub$map, + $author$project$Main$GotVshMsg, + $author$project$Vsh$Main$subscriptions(mo)); + default: + var mo = model.b; + return A2( + $elm$core$Platform$Sub$map, + $author$project$Main$GotTyperMsg, + $author$project$Typer$Main$subscriptions(mo)); + } +}; +var $elm$browser$Browser$Navigation$load = _Browser_load; +var $elm$browser$Browser$Navigation$pushUrl = _Browser_pushUrl; +var $elm$url$Url$addPort = F2( + function (maybePort, starter) { + if (maybePort.$ === 1) { + return starter; + } else { + var port_ = maybePort.a; + return starter + (':' + $elm$core$String$fromInt(port_)); + } + }); +var $elm$url$Url$addPrefixed = F3( + function (prefix, maybeSegment, starter) { + if (maybeSegment.$ === 1) { + return starter; + } else { + var segment = maybeSegment.a; + return _Utils_ap( + starter, + _Utils_ap(prefix, segment)); + } + }); +var $elm$url$Url$toString = function (url) { + var http = function () { + var _v0 = url.bf; + if (!_v0) { + return 'http://'; + } else { + return 'https://'; + } + }(); + return A3( + $elm$url$Url$addPrefixed, + '#', + url.am, + A3( + $elm$url$Url$addPrefixed, + '?', + url.bg, + _Utils_ap( + A2( + $elm$url$Url$addPort, + url.be, + _Utils_ap(http, url.a4)), + url.bd))); +}; +var $author$project$About$Main$update = F2( + function (_v0, model) { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + }); +var $author$project$Typer$Stopwatch$diff = F2( + function (a, b) { + return $elm$time$Time$posixToMillis(b) - $elm$time$Time$posixToMillis(a); + }); +var $author$project$Typer$Stopwatch$end = F2( + function (stopwatch, time) { + var _v0 = stopwatch.O; + if (!_v0.$) { + var from = _v0.a; + return _Utils_update( + stopwatch, + { + a_: A2($author$project$Typer$Stopwatch$diff, from, time), + M: $elm$core$Maybe$Just(time) + }); + } else { + return stopwatch; + } + }); +var $author$project$Typer$Text$boolToInt = function (bool) { + return bool ? 1 : 0; +}; +var $elm$core$Array$bitMask = 4294967295 >>> (32 - $elm$core$Array$shiftStep); +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.$) { + 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 $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$Elm$JsArray$unsafeSet = _JsArray_unsafeSet; +var $elm$core$Array$setHelp = F4( + function (shift, index, value, tree) { + var pos = $elm$core$Array$bitMask & (index >>> shift); + var _v0 = A2($elm$core$Elm$JsArray$unsafeGet, pos, tree); + if (!_v0.$) { + var subTree = _v0.a; + var newSub = A4($elm$core$Array$setHelp, shift - $elm$core$Array$shiftStep, index, value, subTree); + return A3( + $elm$core$Elm$JsArray$unsafeSet, + pos, + $elm$core$Array$SubTree(newSub), + tree); + } else { + var values = _v0.a; + var newLeaf = A3($elm$core$Elm$JsArray$unsafeSet, $elm$core$Array$bitMask & index, value, values); + return A3( + $elm$core$Elm$JsArray$unsafeSet, + pos, + $elm$core$Array$Leaf(newLeaf), + tree); + } + }); +var $elm$core$Array$set = F3( + function (index, value, array) { + var len = array.a; + var startShift = array.b; + var tree = array.c; + var tail = array.d; + return ((index < 0) || (_Utils_cmp(index, len) > -1)) ? array : ((_Utils_cmp( + index, + $elm$core$Array$tailIndex(len)) > -1) ? A4( + $elm$core$Array$Array_elm_builtin, + len, + startShift, + tree, + A3($elm$core$Elm$JsArray$unsafeSet, $elm$core$Array$bitMask & index, value, tail)) : A4( + $elm$core$Array$Array_elm_builtin, + len, + startShift, + A4($elm$core$Array$setHelp, startShift, index, value, tree), + tail)); + }); +var $author$project$Typer$Text$symbolIsGood = function (symbol) { + if (symbol.$ === 1) { + return true; + } else { + return false; + } +}; +var $author$project$Typer$Text$symbolToChar = function (symbol) { + switch (symbol.$) { + case 0: + var _char = symbol.a; + return _char; + case 1: + var _char = symbol.a; + return _char; + default: + var _char = symbol.a; + return _char; + } +}; +var $author$project$Typer$Text$symbolToUnknown = A2($elm$core$Basics$composeR, $author$project$Typer$Text$symbolToChar, $author$project$Typer$Text$Unknown); +var $author$project$Typer$Text$erase = function (txt) { + var pointerLeftShift = txt.t - 1; + var lastEnteredSymbol = A2( + $elm$core$Maybe$withDefault, + $author$project$Typer$Text$Unknown('?'), + A2($elm$core$Array$get, pointerLeftShift, txt.q)); + var lastEnteredSymbolAsUnkown = $author$project$Typer$Text$symbolToUnknown(lastEnteredSymbol); + return ($author$project$Typer$Text$isUntouched(txt) || $author$project$Typer$Text$isComplete(txt)) ? txt : { + ah: txt.ah - $author$project$Typer$Text$boolToInt( + $author$project$Typer$Text$symbolIsGood(lastEnteredSymbol)), + t: pointerLeftShift, + q: A3($elm$core$Array$set, pointerLeftShift, lastEnteredSymbolAsUnkown, txt.q) + }; +}; +var $pilatch$flip$Flip$flip = F3( + function (_function, argB, argA) { + return A2(_function, argA, argB); + }); +var $author$project$Typer$Text$fromWords = function (words) { + var pick = A2( + $elm$core$Basics$composeR, + A2($pilatch$flip$Flip$flip, $elm$core$Array$get, words), + $elm$core$Maybe$withDefault('default')); + return A2( + $elm$core$Basics$composeR, + $elm$core$List$map(pick), + A2( + $elm$core$Basics$composeR, + $elm$core$String$join(' '), + $author$project$Typer$Text$fromString)); +}; +var $elm$core$String$lines = _String_lines; +var $author$project$Typer$Stopwatch$start = F2( + function (stopwatch, time) { + return _Utils_update( + stopwatch, + { + O: $elm$core$Maybe$Just(time) + }); + }); +var $author$project$Typer$Stopwatch$update = F2( + function (stopwatch, time) { + var _v0 = _Utils_Tuple2(stopwatch.O, stopwatch.M); + if ((!_v0.a.$) && (_v0.b.$ === 1)) { + var from = _v0.a.a; + var _v1 = _v0.b; + return _Utils_update( + stopwatch, + { + a_: A2($author$project$Typer$Stopwatch$diff, from, time) + }); + } else { + return stopwatch; + } + }); +var $author$project$Typer$Main$GotEndTime = function (a) { + return {$: 3, a: a}; +}; +var $author$project$Typer$Main$GotStartTime = function (a) { + return {$: 2, a: a}; +}; +var $elm_community$maybe_extra$Maybe$Extra$isNothing = function (m) { + if (m.$ === 1) { + return true; + } else { + return false; + } +}; +var $author$project$Typer$Stopwatch$isRunning = function (stopwatch) { + return $elm_community$maybe_extra$Maybe$Extra$isNothing(stopwatch.M); +}; +var $elm$core$Maybe$map = F2( + function (f, maybe) { + if (!maybe.$) { + var value = maybe.a; + return $elm$core$Maybe$Just( + f(value)); + } else { + return $elm$core$Maybe$Nothing; + } + }); +var $author$project$Typer$Text$expectedChar = function (txt) { + return A2( + $elm$core$Maybe$map, + $author$project$Typer$Text$symbolToChar, + A2($elm$core$Array$get, txt.t, txt.q)); +}; +var $author$project$Typer$Text$Bad = function (a) { + return {$: 2, a: a}; +}; +var $author$project$Typer$Text$Good = function (a) { + return {$: 1, a: a}; +}; +var $author$project$Typer$Text$symbolFromBool = function (isGood) { + return isGood ? $author$project$Typer$Text$Good : $author$project$Typer$Text$Bad; +}; +var $author$project$Typer$Text$updateWithRatedSymbol = F3( + function (txt, expect, isGood) { + return { + ah: txt.ah + $author$project$Typer$Text$boolToInt(isGood), + t: txt.t + 1, + q: A3( + $elm$core$Array$set, + txt.t, + A2($author$project$Typer$Text$symbolFromBool, isGood, expect), + txt.q) + }; + }); +var $author$project$Typer$Text$update = F2( + function (txt, _char) { + var _v0 = $author$project$Typer$Text$expectedChar(txt); + if (_v0.$ === 1) { + return txt; + } else { + var expect = _v0.a; + return A3( + $author$project$Typer$Text$updateWithRatedSymbol, + txt, + expect, + _Utils_eq(expect, _char)); + } + }); +var $author$project$Typer$Main$updateWithSymbol = F2( + function (model, _char) { + var newText = A2($author$project$Typer$Text$update, model.i, _char); + var maybeRequestTime = $author$project$Typer$Text$isUntouched(model.i) ? A2($elm$core$Task$perform, $author$project$Typer$Main$GotStartTime, $elm$time$Time$now) : (($author$project$Typer$Stopwatch$isRunning(model.n) && $author$project$Typer$Text$isComplete(newText)) ? A2($elm$core$Task$perform, $author$project$Typer$Main$GotEndTime, $elm$time$Time$now) : $elm$core$Platform$Cmd$none); + return _Utils_Tuple2( + _Utils_update( + model, + {i: newText}), + maybeRequestTime); + }); +var $author$project$Typer$Main$update = F2( + function (msg, model) { + switch (msg.$) { + case 1: + var _char = msg.a; + return A2($author$project$Typer$Main$updateWithSymbol, model, _char); + case 0: + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + case 2: + var time = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + n: A2($author$project$Typer$Stopwatch$start, model.n, time) + }), + $elm$core$Platform$Cmd$none); + case 3: + var time = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + n: A2($author$project$Typer$Stopwatch$end, model.n, time) + }), + $elm$core$Platform$Cmd$none); + case 4: + var time = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + n: A2($author$project$Typer$Stopwatch$update, model.n, time) + }), + $elm$core$Platform$Cmd$none); + case 5: + return $author$project$Typer$Main$initModelWithWords(model.A); + case 6: + return _Utils_Tuple2( + _Utils_update( + model, + { + i: $author$project$Typer$Text$erase(model.i) + }), + $elm$core$Platform$Cmd$none); + case 7: + var resp = msg.a; + if (!resp.$) { + var body = resp.a; + var words = $elm$core$Array$fromList( + $elm$core$String$lines(body)); + return _Utils_Tuple2( + _Utils_update( + model, + { + A: $author$project$Typer$Main$Words(words) + }), + $author$project$Typer$Main$getRandomWordIndices(words)); + } else { + return _Utils_Tuple2( + _Utils_update( + model, + {A: $author$project$Typer$Main$Failure}), + $elm$core$Platform$Cmd$none); + } + default: + var indices = msg.a; + var _v2 = model.A; + if (_v2.$ === 2) { + var words = _v2.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + i: A2($author$project$Typer$Text$fromWords, words, indices) + }), + $elm$core$Platform$Cmd$none); + } else { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } + } + }); +var $elm$core$String$dropRight = F2( + function (n, string) { + return (n < 1) ? string : A3($elm$core$String$slice, 0, -n, string); + }); +var $elm$core$String$cons = _String_cons; +var $elm$core$String$fromChar = function (_char) { + return A2($elm$core$String$cons, _char, ''); +}; +var $elm$core$Array$isEmpty = function (_v0) { + var len = _v0.a; + return !len; +}; +var $author$project$Vsh$History$lookup = F2( + function (getptr, history) { + var ptr = getptr(history); + return $elm$core$Array$isEmpty(history.w) ? $elm$core$Maybe$Nothing : $elm$core$Maybe$Just( + _Utils_Tuple2( + A2( + $elm$core$Maybe$withDefault, + '', + A2($elm$core$Array$get, ptr, history.w)), + _Utils_update( + history, + {D: ptr}))); + }); +var $author$project$Vsh$Main$maybeLookupHistory = F2( + function (getptr, model) { + var _v0 = A2($author$project$Vsh$History$lookup, getptr, model.w); + if (_v0.$ === 1) { + return model; + } else { + var _v1 = _v0.a; + var command = _v1.a; + var history = _v1.b; + return _Utils_update( + model, + {r: command, w: history}); + } + }); +var $author$project$Vsh$History$next = function (history) { + return (_Utils_cmp( + $elm$core$Array$length(history.w), + history.D + 1) > 0) ? (history.D + 1) : 0; +}; +var $author$project$Vsh$History$prev = function (history) { + return (!history.D) ? ($elm$core$Array$length(history.w) - 1) : (history.D - 1); +}; +var $elm$json$Json$Encode$null = _Json_encodeNull; +var $author$project$Vsh$Main$scroll = _Platform_outgoingPort( + 'scroll', + function ($) { + return $elm$json$Json$Encode$null; + }); +var $elm$url$Url$Builder$toQueryPair = function (_v0) { + var key = _v0.a; + var value = _v0.b; + return key + ('=' + value); +}; +var $elm$url$Url$Builder$toQuery = function (parameters) { + if (!parameters.b) { + return ''; + } else { + return '?' + A2( + $elm$core$String$join, + '&', + A2($elm$core$List$map, $elm$url$Url$Builder$toQueryPair, parameters)); + } +}; +var $elm$url$Url$Builder$absolute = F2( + function (pathSegments, parameters) { + return '/' + (A2($elm$core$String$join, '/', pathSegments) + $elm$url$Url$Builder$toQuery(parameters)); + }); +var $author$project$Route$toString = function (route) { + return '/#' + A2( + $elm$url$Url$Builder$absolute, + _List_fromArray( + [ + $author$project$Route$repr(route) + ]), + _List_Nil); +}; +var $author$project$Vsh$Command$ahegao = F2( + function (_v0, display) { + return _Utils_ap( + display, + _List_fromArray( + [ + $elm$html$Html$text('⠄⠄⠄⢰⣧⣼⣯⠄⣸⣠⣶⣶⣦⣾⠄⠄⠄⠄⡀⠄⢀⣿⣿⠄⠄⠄⢸⡇⠄⠄\n⠄⠄⠄⣾⣿⠿⠿⠶⠿⢿⣿⣿⣿⣿⣦⣤⣄⢀⡅⢠⣾⣛⡉⠄⠄⠄⠸⢀⣿⠄\n⠄⠄⢀⡋⣡⣴⣶⣶⡀⠄⠄⠙⢿⣿⣿⣿⣿⣿⣴⣿⣿⣿⢃⣤⣄⣀⣥⣿⣿⠄\n⠄⠄⢸⣇⠻⣿⣿⣿⣧⣀⢀⣠⡌⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠿⣿⣿⣿⠄\n⠄⢀⢸⣿⣷⣤⣤⣤⣬⣙⣛⢿⣿⣿⣿⣿⣿⣿⡿⣿⣿⡍⠄⠄⢀⣤⣄⠉⠋⣰\n⠄⣼⣖⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿⣿⣿⣿⣿⣿⢇⣿⣿⡷⠶⠶⢿⣿⣿⠇⢀⣤\n⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣽⣿⣿⣿⡇⣿⣿⣿⣿⣿⣿⣷⣶⣥⣴⣿⡗\n⢀⠈⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠄\n⢸⣿⣦⣌⣛⣻⣿⣿⣧⠙⠛⠛⡭⠅⠒⠦⠭⣭⡻⣿⣿⣿⣿⣿⣿⣿⣿⡿⠃⠄\n⠘⣿⣿⣿⣿⣿⣿⣿⣿⡆⠄⠄⠄⠄⠄⠄⠄⠄⠹⠈⢋⣽⣿⣿⣿⣿⣵⣾⠃⠄\n⠄⠘⣿⣿⣿⣿⣿⣿⣿⣿⠄⣴⣿⣶⣄⠄⣴⣶⠄⢀⣾⣿⣿⣿⣿⣿⣿⠃⠄⠄\n⠄⠄⠈⠻⣿⣿⣿⣿⣿⣿⡄⢻⣿⣿⣿⠄⣿⣿⡀⣾⣿⣿⣿⣿⣛⠛⠁⠄⠄⠄\n⠄⠄⠄⠄⠈⠛⢿⣿⣿⣿⠁⠞⢿⣿⣿⡄⢿⣿⡇⣸⣿⣿⠿⠛⠁⠄⠄⠄⠄⠄\n⠄⠄⠄⠄⠄⠄⠄⠉⠻⣿⣿⣾⣦⡙⠻⣷⣾⣿⠃⠿⠋⠁⠄⠄⠄⠄⠄⢀⣠⣴\n⣿⣿⣿⣶⣶⣮⣥⣒⠲⢮⣝⡿⣿⣿⡆⣿⡿⠃⠄⠄⠄⠄⠄⠄⠄⣠⣴⣿⣿⣿') + ])); + }); +var $author$project$Vsh$Command$clear = F2( + function (_v0, _v1) { + return _List_Nil; + }); +var $elm$core$Bitwise$shiftRightBy = _Bitwise_shiftRightBy; +var $elm$core$String$repeatHelp = F3( + function (n, chunk, result) { + return (n <= 0) ? result : A3( + $elm$core$String$repeatHelp, + n >> 1, + _Utils_ap(chunk, chunk), + (!(n & 1)) ? result : _Utils_ap(result, chunk)); + }); +var $elm$core$String$repeat = F2( + function (n, chunk) { + return A3($elm$core$String$repeatHelp, n, chunk, ''); + }); +var $elm$core$String$padRight = F3( + function (n, _char, string) { + return _Utils_ap( + string, + A2( + $elm$core$String$repeat, + n - $elm$core$String$length(string), + $elm$core$String$fromChar(_char))); + }); +var $author$project$Vsh$Command$cut = F2( + function (_v0, display) { + var entry = F2( + function (command, description) { + return _List_fromArray( + [ + $elm$html$Html$text('\n '), + A2( + $author$project$Vsh$Text$ctext, + 1, + A3($elm$core$String$padRight, 8, ' ', command)), + $elm$html$Html$text('-- ' + description) + ]); + }); + return _Utils_ap( + display, + _Utils_ap( + A2(entry, 'CTRL+e', 'quit vsh'), + A2(entry, 'CTRL+;', 'clear screen'))); + }); +var $author$project$Vsh$Command$exit = F2( + function (_v0, display) { + return _Utils_ap( + display, + _List_fromArray( + [ + $elm$html$Html$text('Shutting down...') + ])); + }); +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 $author$project$Common$Link$repo = 'https://github.com/sharpvik/sharpvik.github.io'; +var $author$project$Vsh$Command$git = F2( + function (_v0, display) { + return _Utils_ap( + display, + _List_fromArray( + [ + $elm$html$Html$text('vsh on GitHub: '), + A2( + $elm$html$Html$a, + _List_fromArray( + [ + $elm$html$Html$Attributes$href($author$project$Common$Link$repo) + ]), + _List_fromArray( + [ + $elm$html$Html$text($author$project$Common$Link$repo) + ])) + ])); + }); +var $author$project$Vsh$Command$help = F2( + function (_v0, display) { + var entry = F2( + function (command, description) { + return _List_fromArray( + [ + $elm$html$Html$text('\n '), + A2( + $author$project$Vsh$Text$ctext, + 1, + A3($elm$core$String$padRight, 8, ' ', command)), + $elm$html$Html$text('-- ' + description) + ]); + }); + return _Utils_ap( + display, + _Utils_ap( + _List_fromArray( + [ + $elm$html$Html$text('VSH is a terminal emulator that helps you learn about me.\nUse up and down arrow keys to browse command history.\nAnd most importantly -- have fun!\n\nAvailable commands:\n') + ]), + _Utils_ap( + A2(entry, 'whoami', 'a bit about myself'), + _Utils_ap( + A2(entry, 'top', 'my top skills'), + _Utils_ap( + A2(entry, 'touch', 'ways to get in touch'), + _Utils_ap( + A2(entry, 'help', 'display this message again'), + _Utils_ap( + A2(entry, 'version', 'display vsh version'), + _Utils_ap( + A2(entry, 'cut', 'keyboard shortcuts cheatsheet'), + _Utils_ap( + A2(entry, 'git', 'explore vsh source code'), + _Utils_ap( + A2(entry, 'clear', 'clear screen'), + A2(entry, 'exit', 'exit vsh session'))))))))))); + }); +var $elm$core$Basics$min = F2( + function (x, y) { + return (_Utils_cmp(x, y) < 0) ? x : y; + }); +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$Vsh$Command$top = F2( + function (_v0, display) { + var bars = F2( + function (m, n) { + return A2($elm$core$Basics$min, m, n); + }); + var coloredLevel = F3( + function (color, m, n) { + return A2( + $author$project$Vsh$Text$ctext, + color, + A2( + $elm$core$String$join, + '', + A2( + $elm$core$List$repeat, + A2(bars, n, m), + '|'))); + }); + var elementary = A2(coloredLevel, 1, 12); + var intermediate = function (n20) { + return A3(coloredLevel, 0, 5, n20 - 12); + }; + var advanced = function (n20) { + return A3(coloredLevel, 2, 3, n20 - 17); + }; + var level = function (n) { + var n20 = A2($elm$core$Basics$min, n, 20); + var offset = A2( + $elm$core$String$join, + '', + A2($elm$core$List$repeat, 20 - n20, ' ')); + return _List_fromArray( + [ + elementary(n20), + intermediate(n20), + advanced(n20), + $elm$html$Html$text(offset) + ]); + }; + var skill = F2( + function (name, lvl) { + return A2( + $elm$core$List$cons, + $elm$html$Html$text( + '\n ' + (A3($elm$core$String$padRight, 11, ' ', name) + '[')), + _Utils_ap( + level(lvl), + _List_fromArray( + [ + $elm$html$Html$text(']') + ]))); + }); + return _Utils_ap( + display, + _Utils_ap( + _List_fromArray( + [ + $elm$html$Html$text('My top skills:\n') + ]), + _Utils_ap( + A2(skill, 'Go', 20), + _Utils_ap( + A2(skill, 'Python', 20), + _Utils_ap( + A2(skill, 'JavaScript', 19), + _Utils_ap( + A2(skill, 'Docker', 19), + _Utils_ap( + A2(skill, 'Elm', 17), + _Utils_ap( + A2(skill, 'Rust', 15), + A2(skill, 'Haskell', 12))))))))); + }); +var $author$project$Common$Link$email = 'sharp.vik@gmail.com'; +var $author$project$Common$Link$github = 'https://github.com/sharpvik'; +var $author$project$Common$Link$linkedin = 'https://www.linkedin.com/in/sharpvik'; +var $elm$html$Html$Attributes$target = $elm$html$Html$Attributes$stringProperty('target'); +var $author$project$Vsh$Command$touch = F2( + function (_v0, display) { + var mailTo = function (email) { + return A2( + $elm$html$Html$a, + _List_fromArray( + [ + $elm$html$Html$Attributes$href('mailto:' + email) + ]), + _List_fromArray( + [ + $elm$html$Html$text(email) + ])); + }; + var linkTo = function (url) { + return A2( + $elm$html$Html$a, + _List_fromArray( + [ + $elm$html$Html$Attributes$href(url), + $elm$html$Html$Attributes$target('_blank') + ]), + _List_fromArray( + [ + $elm$html$Html$text(url) + ])); + }; + var entry = F2( + function (description, link) { + return _List_fromArray( + [ + $elm$html$Html$text('\n '), + $elm$html$Html$text( + A3($elm$core$String$padRight, 11, ' ', description + ':')), + link + ]); + }); + return _Utils_ap( + display, + _Utils_ap( + _List_fromArray( + [ + $elm$html$Html$text('Ways to get in touch:\n') + ]), + _Utils_ap( + A2( + entry, + 'email', + mailTo($author$project$Common$Link$email)), + _Utils_ap( + A2( + entry, + 'github', + linkTo($author$project$Common$Link$github)), + A2( + entry, + 'linkedin', + linkTo($author$project$Common$Link$linkedin)))))); + }); +var $author$project$Vsh$Command$whoami = F2( + function (_v0, display) { + return _Utils_ap( + display, + _List_fromArray( + [ + $elm$html$Html$text('Hey, my name is Viktor! \nI am a Software Engineer with a Bachelor\'s degree in Computer Science from\nUniversity of Southampton.\n\nMy primary tech stack is Go, Python, PostgreSQL, Redis, RabbitMQ and Docker.\nI use these tools to create server applications, high throughput microservices,\nand APIs (REST-ful or gRPC based).\n\nHowever, I also enjoy playing around with Rust, Haskell, Elm, and Vue.js.\n\nIn my spare time, I dabble in compiler design and implementation. I love\ncreating new programming languages! Given a chance, I\'d like to do some\nprofessional research into deterministic garbage collection within pure\nfunctional languages.') + ])); + }); +var $author$project$Vsh$Command$eval = function (command) { + switch (command) { + case 'whoami': + return $elm$core$Maybe$Just($author$project$Vsh$Command$whoami); + case 'top': + return $elm$core$Maybe$Just($author$project$Vsh$Command$top); + case 'touch': + return $elm$core$Maybe$Just($author$project$Vsh$Command$touch); + case 'help': + return $elm$core$Maybe$Just($author$project$Vsh$Command$help); + case 'version': + return $elm$core$Maybe$Just($author$project$Vsh$Command$version); + case 'cut': + return $elm$core$Maybe$Just($author$project$Vsh$Command$cut); + case 'git': + return $elm$core$Maybe$Just($author$project$Vsh$Command$git); + case 'clear': + return $elm$core$Maybe$Just($author$project$Vsh$Command$clear); + case 'exit': + return $elm$core$Maybe$Just($author$project$Vsh$Command$exit); + case 'ahegao': + return $elm$core$Maybe$Just($author$project$Vsh$Command$ahegao); + default: + return $elm$core$Maybe$Nothing; + } +}; +var $elm$core$List$head = function (list) { + if (list.b) { + var x = list.a; + var xs = list.b; + return $elm$core$Maybe$Just(x); + } else { + return $elm$core$Maybe$Nothing; + } +}; +var $elm$core$String$words = _String_words; +var $author$project$Vsh$Command$exec = F2( + function (command, display) { + var wrongCommand = F2( + function (label, string) { + return _List_fromArray( + [ + $elm$html$Html$text(label + ' command: '), + A2($author$project$Vsh$Text$ctext, 2, string) + ]); + }); + var maybeCommand = $elm$core$List$head( + $elm$core$String$words(command)); + if (maybeCommand.$ === 1) { + return _Utils_ap( + display, + A2(wrongCommand, 'Weird', command)); + } else { + var cmd = maybeCommand.a; + var _v1 = $author$project$Vsh$Command$eval(cmd); + if (_v1.$ === 1) { + return _Utils_ap( + display, + A2(wrongCommand, 'Unknown', command)); + } else { + var c = _v1.a; + return A2(c, command, display); + } + } + }); +var $elm$core$List$isEmpty = function (xs) { + if (!xs.b) { + return true; + } else { + return false; + } +}; +var $elm$core$Elm$JsArray$push = _JsArray_push; +var $elm$core$Elm$JsArray$singleton = _JsArray_singleton; +var $elm$core$Array$insertTailInTree = F4( + function (shift, index, tail, tree) { + var pos = $elm$core$Array$bitMask & (index >>> shift); + if (_Utils_cmp( + pos, + $elm$core$Elm$JsArray$length(tree)) > -1) { + if (shift === 5) { + return A2( + $elm$core$Elm$JsArray$push, + $elm$core$Array$Leaf(tail), + tree); + } else { + var newSub = $elm$core$Array$SubTree( + A4($elm$core$Array$insertTailInTree, shift - $elm$core$Array$shiftStep, index, tail, $elm$core$Elm$JsArray$empty)); + return A2($elm$core$Elm$JsArray$push, newSub, tree); + } + } else { + var value = A2($elm$core$Elm$JsArray$unsafeGet, pos, tree); + if (!value.$) { + var subTree = value.a; + var newSub = $elm$core$Array$SubTree( + A4($elm$core$Array$insertTailInTree, shift - $elm$core$Array$shiftStep, index, tail, subTree)); + return A3($elm$core$Elm$JsArray$unsafeSet, pos, newSub, tree); + } else { + var newSub = $elm$core$Array$SubTree( + A4( + $elm$core$Array$insertTailInTree, + shift - $elm$core$Array$shiftStep, + index, + tail, + $elm$core$Elm$JsArray$singleton(value))); + return A3($elm$core$Elm$JsArray$unsafeSet, pos, newSub, tree); + } + } + }); +var $elm$core$Array$unsafeReplaceTail = F2( + function (newTail, _v0) { + var len = _v0.a; + var startShift = _v0.b; + var tree = _v0.c; + var tail = _v0.d; + var originalTailLen = $elm$core$Elm$JsArray$length(tail); + var newTailLen = $elm$core$Elm$JsArray$length(newTail); + var newArrayLen = len + (newTailLen - originalTailLen); + if (_Utils_eq(newTailLen, $elm$core$Array$branchFactor)) { + var overflow = _Utils_cmp(newArrayLen >>> $elm$core$Array$shiftStep, 1 << startShift) > 0; + if (overflow) { + var newShift = startShift + $elm$core$Array$shiftStep; + var newTree = A4( + $elm$core$Array$insertTailInTree, + newShift, + len, + newTail, + $elm$core$Elm$JsArray$singleton( + $elm$core$Array$SubTree(tree))); + return A4($elm$core$Array$Array_elm_builtin, newArrayLen, newShift, newTree, $elm$core$Elm$JsArray$empty); + } else { + return A4( + $elm$core$Array$Array_elm_builtin, + newArrayLen, + startShift, + A4($elm$core$Array$insertTailInTree, startShift, len, newTail, tree), + $elm$core$Elm$JsArray$empty); + } + } else { + return A4($elm$core$Array$Array_elm_builtin, newArrayLen, startShift, tree, newTail); + } + }); +var $elm$core$Array$push = F2( + function (a, array) { + var tail = array.d; + return A2( + $elm$core$Array$unsafeReplaceTail, + A2($elm$core$Elm$JsArray$push, a, tail), + array); + }); +var $author$project$Vsh$History$update = F2( + function (command, history) { + return _Utils_update( + history, + { + w: A2($elm$core$Array$push, command, history.w), + D: $elm$core$Array$length(history.w) + 1 + }); + }); +var $author$project$Vsh$Main$updateOnCommand = F2( + function (model, command) { + var display = A2( + $author$project$Vsh$Command$exec, + command, + _Utils_ap( + model.L, + _List_fromArray( + [ + $elm$html$Html$text(command + '\n') + ]))); + var promptWithOffset = A2( + $elm$core$List$cons, + $elm$html$Html$text( + $elm$core$List$isEmpty(display) ? '' : '\n\n'), + $author$project$Vsh$Main$prompt); + return { + r: '', + L: _Utils_ap(display, promptWithOffset), + w: A2($author$project$Vsh$History$update, command, model.w) + }; + }); +var $author$project$Vsh$Main$updateOnKeydown = F3( + function (msg, model, command) { + _v0$8: + while (true) { + switch (msg.$) { + case 0: + switch (msg.a.$) { + case 0: + var _char = msg.a.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + r: _Utils_ap( + command, + $elm$core$String$fromChar(_char)) + }), + $elm$core$Platform$Cmd$none); + case 1: + var _v1 = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + {r: command + ' '}), + $elm$core$Platform$Cmd$none); + case 2: + var _v2 = msg.a; + return _Utils_Tuple2( + A2($author$project$Vsh$Main$updateOnCommand, model, command), + $author$project$Vsh$Main$scroll(0)); + case 3: + var _v3 = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + r: A2($elm$core$String$dropRight, 1, command) + }), + $elm$core$Platform$Cmd$none); + case 4: + var _v4 = msg.a; + return _Utils_Tuple2( + A2($author$project$Vsh$Main$maybeLookupHistory, $author$project$Vsh$History$prev, model), + $elm$core$Platform$Cmd$none); + case 5: + var _v5 = msg.a; + return _Utils_Tuple2( + A2($author$project$Vsh$Main$maybeLookupHistory, $author$project$Vsh$History$next, model), + $elm$core$Platform$Cmd$none); + default: + break _v0$8; + } + case 1: + return _Utils_Tuple2( + A2($author$project$Vsh$Main$updateOnCommand, model, 'clear'), + $elm$core$Platform$Cmd$none); + case 2: + return _Utils_Tuple2( + model, + $elm$browser$Browser$Navigation$load( + $author$project$Route$toString(0))); + default: + break _v0$8; + } + } + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + }); +var $author$project$Vsh$Main$update = F2( + function (msg, model) { + return A3($author$project$Vsh$Main$updateOnKeydown, msg, model, model.r); + }); +var $author$project$Main$update = F2( + function (msg, model) { + var norm = F3( + function (toModel, toMsg, _v5) { + var subModel = _v5.a; + var cmd = _v5.b; + return _Utils_Tuple2( + toModel(subModel), + A2($elm$core$Platform$Cmd$map, toMsg, cmd)); + }); + var key = $author$project$Main$toKey(model); + var _v0 = _Utils_Tuple2(msg, model); + _v0$5: + while (true) { + switch (_v0.a.$) { + case 0: + if (!_v0.b.$) { + var ms = _v0.a.a; + var _v1 = _v0.b; + var mo = _v1.b; + return A3( + norm, + $author$project$Main$AboutModel(key), + $author$project$Main$GotAboutMsg, + A2($author$project$About$Main$update, ms, mo)); + } else { + break _v0$5; + } + case 1: + if (_v0.b.$ === 1) { + var ms = _v0.a.a; + var _v2 = _v0.b; + var mo = _v2.b; + return A3( + norm, + $author$project$Main$VshModel(key), + $author$project$Main$GotVshMsg, + A2($author$project$Vsh$Main$update, ms, mo)); + } else { + break _v0$5; + } + case 2: + if (_v0.b.$ === 2) { + var ms = _v0.a.a; + var _v3 = _v0.b; + var mo = _v3.b; + return A3( + norm, + $author$project$Main$TyperModel(key), + $author$project$Main$GotTyperMsg, + A2($author$project$Typer$Main$update, ms, mo)); + } else { + break _v0$5; + } + case 4: + var url = _v0.a.a; + return A2($author$project$Main$mux, model, url); + default: + var urlRequest = _v0.a.a; + if (!urlRequest.$) { + var url = urlRequest.a; + return _Utils_Tuple2( + model, + A2( + $elm$browser$Browser$Navigation$pushUrl, + key, + $elm$url$Url$toString(url))); + } else { + var href = urlRequest.a; + return _Utils_Tuple2( + model, + $elm$browser$Browser$Navigation$load(href)); + } + } + } + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + }); +var $elm$virtual_dom$VirtualDom$map = _VirtualDom_map; +var $elm$html$Html$map = $elm$virtual_dom$VirtualDom$map; +var $elm$html$Html$nav = _VirtualDom_node('nav'); +var $author$project$Common$Class$navbar = $elm$html$Html$Attributes$class('navbar'); +var $author$project$Common$Class$navbarIcon = $elm$html$Html$Attributes$class('navbar-icon'); +var $author$project$Common$Class$navbarIconActive = $elm$html$Html$Attributes$class('navbar-icon-active'); +var $elm$core$Tuple$second = function (_v0) { + var y = _v0.b; + return y; +}; +var $author$project$Common$Element$navbar = function (active) { + var sections = _List_fromArray( + [ + _Utils_Tuple2(0, '👽'), + _Utils_Tuple2(1, '⌨️'), + _Utils_Tuple2(2, '⚡') + ]); + var activated = function (id) { + return _Utils_eq(id, active) ? _List_fromArray( + [$author$project$Common$Class$navbarIconActive]) : _List_Nil; + }; + var mark = F2( + function (id, s) { + return A2( + $elm$html$Html$a, + _Utils_ap( + activated(id), + _List_fromArray( + [ + $author$project$Common$Class$navbarIcon, + $elm$html$Html$Attributes$href( + $author$project$Route$toString(s.a)) + ])), + _List_fromArray( + [ + $elm$html$Html$text(s.b) + ])); + }); + var result = A2($elm$core$List$indexedMap, mark, sections); + return A2( + $elm$html$Html$nav, + _List_fromArray( + [$author$project$Common$Class$navbar]), + result); +}; +var $author$project$Main$toActiveIndex = function (model) { + switch (model.$) { + case 0: + return 0; + case 1: + return 1; + default: + return 2; + } +}; +var $elm$browser$Browser$Document = F2( + function (title, body) { + return {ae: body, aM: title}; + }); +var $author$project$Common$Class$appCenter = $elm$html$Html$Attributes$class('app-center'); +var $author$project$Common$Link$attr = $elm$html$Html$Attributes$href; +var $author$project$Common$Class$bg = $elm$html$Html$Attributes$class('bg'); +var $author$project$About$Class$bg = _List_fromArray( + [ + $author$project$Common$Class$bg, + $elm$html$Html$Attributes$class('about-bg') + ]); +var $author$project$Common$Class$button = $elm$html$Html$Attributes$class('button'); +var $author$project$About$Class$button = _List_fromArray( + [ + $author$project$Common$Class$button, + $elm$html$Html$Attributes$class('about-button') + ]); +var $author$project$Common$Element$button_ = F3( + function (elem, attrs, txt) { + return A2( + elem, + A2($elm$core$List$cons, $author$project$Common$Class$button, attrs), + _List_fromArray( + [ + $elm$html$Html$text(txt) + ])); + }); +var $author$project$About$Asset$asset = function (path) { + return A2( + $elm$url$Url$Builder$absolute, + A2($elm$core$List$cons, 'assets', path), + _List_Nil); +}; +var $author$project$About$Asset$cv = $author$project$About$Asset$asset( + _List_fromArray( + ['cv.pdf'])); +var $elm$html$Html$div = _VirtualDom_node('div'); +var $author$project$About$Asset$github = $author$project$About$Asset$asset( + _List_fromArray( + ['github.svg'])); +var $author$project$About$Class$github = $elm$html$Html$Attributes$class('about-github'); +var $author$project$Common$Class$h1 = $elm$html$Html$Attributes$class('h1'); +var $author$project$About$Class$h1 = _List_fromArray( + [ + $author$project$Common$Class$h1, + $elm$html$Html$Attributes$class('about-h1') + ]); +var $elm$html$Html$h1 = _VirtualDom_node('h1'); +var $author$project$Common$Class$h3 = $elm$html$Html$Attributes$class('h3'); +var $author$project$About$Class$h3 = _List_fromArray( + [ + $author$project$Common$Class$h3, + $elm$html$Html$Attributes$class('about-h3') + ]); +var $elm$html$Html$h3 = _VirtualDom_node('h3'); +var $elm$html$Html$img = _VirtualDom_node('img'); +var $author$project$Common$Class$link = $elm$html$Html$Attributes$class('link'); +var $author$project$Common$Link$mailto = 'mailto:' + $author$project$Common$Link$email; +var $elm$html$Html$Attributes$src = function (url) { + return A2( + $elm$html$Html$Attributes$stringProperty, + 'src', + _VirtualDom_noJavaScriptOrHtmlUri(url)); +}; +var $elm$virtual_dom$VirtualDom$style = _VirtualDom_style; +var $elm$html$Html$Attributes$style = $elm$virtual_dom$VirtualDom$style; +var $author$project$Common$Element$textCenter = $elm$html$Html$div( + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'text-align', 'center') + ])); +var $author$project$About$Main$view = function (_v0) { + var general = $elm$core$Basics$append( + _List_fromArray( + [ + A2( + $elm$html$Html$h1, + $author$project$About$Class$h1, + _List_fromArray( + [ + $elm$html$Html$text('Hey, I\'m Viktor!') + ])), + A2( + $elm$html$Html$h3, + $author$project$About$Class$h3, + _List_fromArray( + [ + $elm$html$Html$text('💻 Senior Software Engineer') + ])), + A2( + $elm$html$Html$h3, + $author$project$About$Class$h3, + _List_fromArray( + [ + $elm$html$Html$text('🎓 University of Southampton') + ])), + A2( + $elm$html$Html$h3, + $author$project$About$Class$h3, + _List_fromArray( + [ + A2( + $elm$html$Html$a, + _List_fromArray( + [ + $author$project$Common$Class$link, + $elm$html$Html$Attributes$href('https://uw.co.uk/') + ]), + _List_fromArray( + [ + $elm$html$Html$text('@utilitywarehouse') + ])), + $elm$html$Html$text(' '), + A2( + $elm$html$Html$a, + _List_fromArray( + [ + $author$project$Common$Class$link, + $elm$html$Html$Attributes$href('https://aquilex.org/') + ]), + _List_fromArray( + [ + $elm$html$Html$text('@aquilex') + ])) + ])) + ])); + var entitled = $elm$browser$Browser$Document('👽 About Me'); + var app = function (items) { + return _List_fromArray( + [ + A2( + $elm$html$Html$div, + A2($elm$core$List$cons, $author$project$Common$Class$appCenter, $author$project$About$Class$bg), + general(items)) + ]); + }; + return entitled( + app( + _List_fromArray( + [ + A2( + $elm$html$Html$a, + _List_fromArray( + [ + $author$project$Common$Link$attr($author$project$Common$Link$github), + $elm$html$Html$Attributes$target('_blank'), + $author$project$About$Class$github + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$img, + _List_fromArray( + [ + $elm$html$Html$Attributes$src($author$project$About$Asset$github) + ]), + _List_Nil) + ])), + $author$project$Common$Element$textCenter( + _List_fromArray( + [ + A3( + $author$project$Common$Element$button_, + $elm$html$Html$a, + _Utils_ap( + _List_fromArray( + [ + $author$project$Common$Link$attr($author$project$Common$Link$mailto), + $elm$html$Html$Attributes$target('_blank') + ]), + $author$project$About$Class$button), + 'EMAIL ME!'), + A3( + $author$project$Common$Element$button_, + $elm$html$Html$a, + _Utils_ap( + _List_fromArray( + [ + $author$project$Common$Link$attr($author$project$About$Asset$cv), + $elm$html$Html$Attributes$target('_blank') + ]), + $author$project$About$Class$button), + 'VIEW CV') + ])) + ]))); +}; +var $author$project$Typer$Class$bg = _List_fromArray( + [ + $author$project$Common$Class$bg, + $elm$html$Html$Attributes$class('typer-bg') + ]); +var $elm$core$List$singleton = function (value) { + return _List_fromArray( + [value]); +}; +var $author$project$Typer$Class$Black = 1; +var $author$project$Typer$Class$colorToClass = function (color) { + switch (color) { + case 0: + return $elm$html$Html$Attributes$class('typer-text-grey'); + case 1: + return $elm$html$Html$Attributes$class('typer-text-black'); + default: + return $elm$html$Html$Attributes$class('typer-text-red'); + } +}; +var $author$project$Typer$Stopwatch$deltaInSeconds = function (stopwatch) { + return stopwatch.a_ / 1000; +}; +var $author$project$Typer$Text$errors = function (txt) { + return $elm$core$Array$length(txt.q) - txt.ah; +}; +var $elm$html$Html$footer = _VirtualDom_node('footer'); +var $elm$core$String$fromFloat = _String_fromNumber; +var $author$project$Typer$Class$h1 = _List_fromArray( + [ + $author$project$Common$Class$h1, + $elm$html$Html$Attributes$class('typer-h1') + ]); +var $author$project$Typer$Class$h3 = _List_fromArray( + [ + $author$project$Common$Class$h3, + $elm$html$Html$Attributes$class('typer-h3') + ]); +var $elm$html$Html$header = _VirtualDom_node('header'); +var $author$project$Typer$Class$highlight = $elm$html$Html$Attributes$class('typer-highlight'); +var $author$project$Typer$Class$info = $elm$html$Html$Attributes$class('typer-info'); +var $elm$html$Html$p = _VirtualDom_node('p'); +var $elm$core$Basics$round = _Basics_round; +var $author$project$Typer$Class$text = $elm$html$Html$Attributes$class('typer-text'); +var $author$project$Common$Class$transparent = $elm$html$Html$Attributes$class('transparent'); +var $author$project$Typer$Text$symbols = function (txt) { + return $elm$core$Array$toList(txt.q); +}; +var $author$project$Typer$Class$Grey = 0; +var $author$project$Typer$Class$Red = 2; +var $author$project$Typer$Text$symbolToColor = function (symbol) { + switch (symbol.$) { + case 0: + return 0; + case 1: + return 1; + default: + return 2; + } +}; +var $author$project$Typer$Text$viewSymbol = function (symbol) { + var symbolBody = $elm$html$Html$text( + $elm$core$String$fromChar( + $author$project$Typer$Text$symbolToChar(symbol))); + var colorClass = $author$project$Typer$Class$colorToClass( + $author$project$Typer$Text$symbolToColor(symbol)); + return A2( + $elm$html$Html$span, + _List_fromArray( + [colorClass]), + _List_fromArray( + [symbolBody])); +}; +var $author$project$Typer$Text$view = A2( + $elm$core$Basics$composeL, + $elm$core$List$map($author$project$Typer$Text$viewSymbol), + $author$project$Typer$Text$symbols); +var $author$project$Typer$Main$viewBody = function (model) { + var isTransparent = $author$project$Typer$Text$isUntouched(model.i) ? _List_Nil : _List_fromArray( + [$author$project$Common$Class$transparent]); + var header_ = _List_fromArray( + [ + A2( + $elm$html$Html$h1, + $author$project$Typer$Class$h1, + _List_fromArray( + [ + $elm$html$Html$text('Type Fast') + ])), + A2( + $elm$html$Html$h3, + $author$project$Typer$Class$h3, + _List_fromArray( + [ + $elm$html$Html$text('Physical keyboards only') + ])) + ]); + var footer_ = _List_fromArray( + [ + A2( + $elm$html$Html$h3, + $author$project$Typer$Class$h3, + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [$author$project$Typer$Class$highlight]), + _List_fromArray( + [ + $elm$html$Html$text('tab ⇥') + ])), + $elm$html$Html$text(' to restart') + ])), + A2( + $elm$html$Html$h3, + $author$project$Typer$Class$h3, + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [$author$project$Typer$Class$highlight]), + _List_fromArray( + [ + $elm$html$Html$text('❮ backspace') + ])), + $elm$html$Html$text(' to erase last symbol') + ])) + ]); + var charsPerMinute = $elm$core$Basics$round(((model.i.ah / model.n.a_) * 1000) * 60); + var txt = $author$project$Typer$Text$isComplete(model.i) ? A2( + $elm$html$Html$div, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$p, + _List_fromArray( + [ + $author$project$Typer$Class$text, + $author$project$Typer$Class$colorToClass(1) + ]), + _List_fromArray( + [ + $elm$html$Html$text( + $elm$core$String$fromInt(charsPerMinute) + ' chars/min.') + ])), + A2( + $elm$html$Html$p, + _List_fromArray( + [ + $author$project$Typer$Class$text, + $author$project$Typer$Class$colorToClass(1) + ]), + _List_fromArray( + [ + $elm$html$Html$text( + $elm$core$String$fromInt(model.i.ah) + ' correct') + ])), + A2( + $elm$html$Html$p, + _List_fromArray( + [ + $author$project$Typer$Class$text, + $author$project$Typer$Class$colorToClass(1) + ]), + _List_fromArray( + [ + $elm$html$Html$text( + $elm$core$String$fromInt( + $author$project$Typer$Text$errors(model.i)) + ' incorrect') + ])), + A2( + $elm$html$Html$p, + _List_fromArray( + [ + $author$project$Typer$Class$text, + $author$project$Typer$Class$colorToClass(1) + ]), + _List_fromArray( + [ + $elm$html$Html$text( + $elm$core$String$fromFloat( + $author$project$Typer$Stopwatch$deltaInSeconds(model.n)) + ' sec. in total') + ])) + ])) : A2( + $elm$html$Html$p, + _List_fromArray( + [$author$project$Typer$Class$text]), + $author$project$Typer$Text$view(model.i)); + return _List_fromArray( + [ + A2( + $elm$html$Html$header, + A2($elm$core$List$cons, $author$project$Typer$Class$info, isTransparent), + header_), + txt, + A2( + $elm$html$Html$footer, + A2($elm$core$List$cons, $author$project$Typer$Class$info, isTransparent), + footer_) + ]); +}; +var $author$project$Typer$Main$view = function () { + var entitled = $elm$browser$Browser$Document('⚡ Typer'); + var app = A2( + $elm$core$Basics$composeR, + $elm$html$Html$div( + A2($elm$core$List$cons, $author$project$Common$Class$appCenter, $author$project$Typer$Class$bg)), + $elm$core$List$singleton); + return A2( + $elm$core$Basics$composeR, + $author$project$Typer$Main$viewBody, + A2($elm$core$Basics$composeR, app, entitled)); +}(); +var $author$project$Common$Class$appTop = $elm$html$Html$Attributes$class('app-top'); +var $author$project$Vsh$Class$bg = _List_fromArray( + [ + $author$project$Common$Class$bg, + $elm$html$Html$Attributes$class('vsh-bg') + ]); +var $author$project$Vsh$Class$h1 = _List_fromArray( + [ + $author$project$Common$Class$h1, + $elm$html$Html$Attributes$class('vsh-h1') + ]); +var $author$project$Vsh$Class$close = $elm$html$Html$Attributes$class('vsh-close'); +var $elm$html$Html$pre = _VirtualDom_node('pre'); +var $author$project$Vsh$Class$textarea = $elm$html$Html$Attributes$class('vsh-textarea'); +var $author$project$Vsh$Class$topbar = $elm$html$Html$Attributes$class('vsh-topbar'); +var $author$project$Vsh$Class$window = $elm$html$Html$Attributes$class('vsh-window'); +var $author$project$Vsh$Main$vshDisplay = function (display) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [$author$project$Vsh$Class$window]), + _List_fromArray( + [ + A2( + $elm$html$Html$header, + _List_fromArray( + [$author$project$Vsh$Class$topbar]), + _List_fromArray( + [ + A2( + $elm$html$Html$p, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('vsh shell') + ])), + A2( + $elm$html$Html$a, + _List_fromArray( + [ + $author$project$Vsh$Class$close, + $elm$html$Html$Attributes$href( + $author$project$Route$toString(0)) + ]), + _List_Nil) + ])), + A2( + $elm$html$Html$pre, + _List_fromArray( + [$author$project$Vsh$Class$textarea]), + _Utils_ap( + display, + _List_fromArray( + [ + $elm$html$Html$text('█') + ]))) + ])); +}; +var $author$project$Vsh$Main$view = function (model) { + return { + ae: _List_fromArray( + [ + A2( + $elm$html$Html$div, + A2($elm$core$List$cons, $author$project$Common$Class$appTop, $author$project$Vsh$Class$bg), + _List_fromArray( + [ + A2( + $elm$html$Html$h1, + $author$project$Vsh$Class$h1, + _List_fromArray( + [ + $elm$html$Html$text('Hack Me 🤓') + ])), + $author$project$Vsh$Main$vshDisplay( + _Utils_ap( + model.L, + _List_fromArray( + [ + $elm$html$Html$text(model.r) + ]))) + ])) + ]), + aM: '💻 ️VSH Shell' + }; +}; +var $author$project$Main$view = function (model) { + var norm = F2( + function (toMsg, _v1) { + var title = _v1.aM; + var body = _v1.ae; + return { + ae: A2( + $elm$core$List$cons, + $author$project$Common$Element$navbar( + $author$project$Main$toActiveIndex(model)), + A2( + $elm$core$List$map, + $elm$html$Html$map(toMsg), + body)), + aM: title + }; + }); + switch (model.$) { + case 0: + var mo = model.b; + return A2( + norm, + $author$project$Main$GotAboutMsg, + $author$project$About$Main$view(mo)); + case 1: + var mo = model.b; + return A2( + norm, + $author$project$Main$GotVshMsg, + $author$project$Vsh$Main$view(mo)); + default: + var mo = model.b; + return A2( + norm, + $author$project$Main$GotTyperMsg, + $author$project$Typer$Main$view(mo)); + } +}; +var $author$project$Main$main = $elm$browser$Browser$application( + {a6: $author$project$Main$init, ba: $author$project$Main$LinkChanged, bb: $author$project$Main$LinkClicked, bm: $author$project$Main$subscriptions, bo: $author$project$Main$update, bq: $author$project$Main$view}); +_Platform_export({'Main':{'init':$author$project$Main$main( + $elm$json$Json$Decode$succeed(0))(0)}});}(this)); \ No newline at end of file diff --git a/js/setup.js b/js/setup.js new file mode 100644 index 0000000..c1c0a5a --- /dev/null +++ b/js/setup.js @@ -0,0 +1,12 @@ +document.onkeydown = e => { + if (!e.altKey && !e.ctrlKey) e.preventDefault() +} +const app = Elm.Main.init({ + node: document.getElementById("app") +}) +app.ports.scroll.subscribe(e => + setTimeout(() => { + const area = document.querySelector(".vsh-textarea") + area.scrollTop = area.scrollHeight + }, 50) +) diff --git a/release b/release deleted file mode 100755 index effd651..0000000 --- a/release +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -LOCAL_DIST_DIR=dist - -elm make src/Main.elm --optimize --output $LOCAL_DIST_DIR/js/main.js \ No newline at end of file diff --git a/src/About/Asset.elm b/src/About/Asset.elm deleted file mode 100644 index 25cfebd..0000000 --- a/src/About/Asset.elm +++ /dev/null @@ -1,13 +0,0 @@ -module About.Asset exposing (github) - -import Url.Builder exposing (absolute) - - -asset : List String -> String -asset path = - absolute ("assets" :: path) [] - - -github : String -github = - asset [ "github.svg" ] diff --git a/src/About/Class.elm b/src/About/Class.elm deleted file mode 100644 index 5649223..0000000 --- a/src/About/Class.elm +++ /dev/null @@ -1,30 +0,0 @@ -module About.Class exposing (..) - -import Common.Class as Class -import Html exposing (Attribute) -import Html.Attributes exposing (class) - - -bg : List (Attribute msg) -bg = - [ class Class.bg, class "about-bg" ] - - -h1 : List (Attribute msg) -h1 = - [ class Class.h1, class "about-h1" ] - - -h3 : List (Attribute msg) -h3 = - [ class Class.h3, class "about-h3" ] - - -button : List (Attribute msg) -button = - [ class Class.button, class "about-button" ] - - -github : Attribute msg -github = - class "about-github" diff --git a/src/About/Main.elm b/src/About/Main.elm deleted file mode 100644 index e026bd9..0000000 --- a/src/About/Main.elm +++ /dev/null @@ -1,106 +0,0 @@ -module About.Main exposing (..) - -import About.Asset as Asset -import About.Class -import Browser exposing (Document) -import Common.Class as Class -import Common.Element as Element -import Common.Link as Link -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (..) -import Route exposing (Route(..)) - - - --- FLAGS - - -type alias Flags = - () - - - --- MODEL - - -type Model - = NoModel - - - --- MSG - - -type Msg - = NoMsg - - - --- INIT - - -init : ( Model, Cmd Msg ) -init = - ( initModel, Cmd.none ) - - -initModel : Model -initModel = - NoModel - - - ---VIEW - - -view : Model -> Document Msg -view _ = - let - entitled = - Document "👽 About Me" - - app items = - [ div (class Class.appCenter :: About.Class.bg) <| general items ] - - general = - (++) - [ h1 About.Class.h1 [ text "Hey, I'm Viktor!" ] - , h3 About.Class.h3 [ text "💻 Full Stack Web Developer" ] - , h3 About.Class.h3 [ text "🎓 University of Southampton" ] - ] - in - entitled <| - app - [ a - [ Link.github - , target "_blank" - , About.Class.github - ] - [ img [ src Asset.github ] [] ] - , Element.button_ a - ([ Link.mailto - , target "_blank" - ] - ++ About.Class.button - ) - "SAY HI!" - ] - - - --- UPDATE - - -update : Msg -> Model -> ( Model, Cmd Msg ) -update _ model = - ( model, Cmd.none ) - - - --- SUBSCRIPTIONS - - -subscriptions : Model -> Sub Msg -subscriptions _ = - Sub.none diff --git a/src/Common/Class.elm b/src/Common/Class.elm deleted file mode 100644 index dd0486d..0000000 --- a/src/Common/Class.elm +++ /dev/null @@ -1,60 +0,0 @@ -module Common.Class exposing (..) - --- APP - - -appCenter : String -appCenter = - "app-center" - - -appTop : String -appTop = - "app-top" - - - --- ELEMENTS - - -bg : String -bg = - "bg" - - -h1 : String -h1 = - "h1" - - -h3 : String -h3 = - "h3" - - - --- BUTTON - - -button : String -button = - "button" - - - --- NAVBAR - - -navbar : String -navbar = - "navbar" - - -navbarIcon : String -navbarIcon = - "navbar-icon" - - -navbarIconActive : String -navbarIconActive = - "navbar-icon-active" diff --git a/src/Common/Element.elm b/src/Common/Element.elm deleted file mode 100644 index ba4652f..0000000 --- a/src/Common/Element.elm +++ /dev/null @@ -1,47 +0,0 @@ -module Common.Element exposing (..) - -import Common.Class as Class -import Html exposing (..) -import Html.Attributes exposing (..) -import Route exposing (Route(..)) - - -navbar : Int -> Html msg -navbar active = - let - sections = - [ ( AboutRoute, "👽" ) - , ( SkillsRoute, "💡" ) - , ( VshRoute, "⌨️" ) - ] - - mark id s = - a - ((if id == active then - [ class Class.navbarIconActive ] - - else - [] - ) - ++ [ class Class.navbarIcon - , href <| Route.toString <| Tuple.first s - ] - ) - [ text <| Tuple.second s ] - - result = - List.indexedMap mark sections - in - nav [ class Class.navbar ] result - - -button_ : - (List (Attribute msg) - -> List (Html msg) - -> Html msg - ) - -> List (Attribute msg) - -> String - -> Html msg -button_ elem attrs txt = - elem (class Class.button :: attrs) [ text txt ] diff --git a/src/Common/Link.elm b/src/Common/Link.elm deleted file mode 100644 index 4f4b845..0000000 --- a/src/Common/Link.elm +++ /dev/null @@ -1,42 +0,0 @@ -module Common.Link exposing (..) - -import Html exposing (Attribute) -import Html.Attributes exposing (href) - - -mailto : Attribute msg -mailto = - href "mailto:sharp.vik@gmail.com" - - -github : Attribute msg -github = - href "https://github.com/sharpvik" - - -go : Attribute msg -go = - href "https://golang.org" - - -python : Attribute msg -python = - href "https://www.python.org/about" - - -elm : Attribute msg -elm = - href "https://elm-lang.org" - - -vuejs : Attribute msg -vuejs = - href "https://vuejs.org" - - -docker = - href "https://www.docker.com" - - -ansible = - href "https://www.ansible.com/" diff --git a/src/Main.elm b/src/Main.elm deleted file mode 100644 index 06cd8bd..0000000 --- a/src/Main.elm +++ /dev/null @@ -1,209 +0,0 @@ -module Main exposing (..) - -import About.Main as About -import Browser exposing (Document, UrlRequest(..)) -import Browser.Navigation as Nav -import Common.Element as Element -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (..) -import Route exposing (Route(..)) -import Skills.Main as Contact -import Url exposing (Url) -import Vsh.Main as Vsh - - - --- MAIN - - -main : Program Flags Model Msg -main = - Browser.application - { init = init - , view = view - , update = update - , subscriptions = subscriptions - , onUrlRequest = LinkClicked - , onUrlChange = LinkChanged - } - - - --- FLAGS - - -type alias Flags = - () - - - --- MODEL - - -type Model - = AboutModel Nav.Key About.Model - | ContactModel Nav.Key Contact.Model - | VshModel Nav.Key Vsh.Model - - -toKey : Model -> Nav.Key -toKey model = - case model of - AboutModel key _ -> - key - - ContactModel key _ -> - key - - VshModel key _ -> - key - - -toActiveIndex : Model -> Int -toActiveIndex model = - case model of - AboutModel _ _ -> - 0 - - ContactModel _ _ -> - 1 - - VshModel _ _ -> - 2 - - - --- MSG - - -type Msg - = GotAboutMsg About.Msg - | GotContactMsg Contact.Msg - | GotVshMsg Vsh.Msg - | LinkClicked UrlRequest - | LinkChanged Url - - - --- INIT - - -init : Flags -> Url -> Nav.Key -> ( Model, Cmd Msg ) -init _ url key = - mux (AboutModel key About.initModel) url - - -mux : Model -> Url -> ( Model, Cmd Msg ) -mux model url = - let - norm : - (subModel -> model) - -> (subMsg -> msg) - -> ( subModel, Cmd subMsg ) - -> ( model, Cmd msg ) - norm toModel toMsg ( subModel, cmd ) = - ( toModel subModel, Cmd.map toMsg cmd ) - - key = - toKey model - - route = - Route.fromUrl url - in - case route of - AboutRoute -> - norm (AboutModel key) GotAboutMsg About.init - - SkillsRoute -> - norm (ContactModel key) GotContactMsg Contact.init - - VshRoute -> - norm (VshModel key) GotVshMsg Vsh.init - - - --- VIEW - - -view : Model -> Document Msg -view model = - let - norm : (msg -> a) -> Document msg -> Document a - norm toMsg { title, body } = - { title = title - , body = - Element.navbar (toActiveIndex model) - :: List.map (Html.map toMsg) body - } - in - case model of - AboutModel _ mo -> - norm GotAboutMsg <| About.view mo - - ContactModel _ mo -> - norm GotContactMsg <| Contact.view mo - - VshModel _ mo -> - norm GotVshMsg <| Vsh.view mo - - - --- UPDATE - - -update : Msg -> Model -> ( Model, Cmd Msg ) -update msg model = - let - norm : - (subModel -> model) - -> (subMsg -> msg) - -> ( subModel, Cmd subMsg ) - -> ( model, Cmd msg ) - norm toModel toMsg ( subModel, cmd ) = - ( toModel subModel, Cmd.map toMsg cmd ) - - key = - toKey model - in - case ( msg, model ) of - ( GotVshMsg ms, VshModel _ mo ) -> - norm (VshModel key) GotVshMsg <| Vsh.update ms mo - - ( GotAboutMsg ms, AboutModel _ mo ) -> - norm (AboutModel key) GotAboutMsg <| About.update ms mo - - ( LinkChanged url, _ ) -> - mux model url - - ( LinkClicked urlRequest, _ ) -> - case urlRequest of - Internal url -> - ( model - , Nav.pushUrl key (Url.toString url) - ) - - External href -> - ( model - , Nav.load href - ) - - ( _, _ ) -> - ( model, Cmd.none ) - - - --- SUBSCRIPTIONS - - -subscriptions : Model -> Sub Msg -subscriptions model = - case model of - AboutModel _ mo -> - Sub.map GotAboutMsg <| About.subscriptions mo - - ContactModel _ mo -> - Sub.map GotContactMsg <| Contact.subscriptions mo - - VshModel _ mo -> - Sub.map GotVshMsg <| Vsh.subscriptions mo diff --git a/src/Route.elm b/src/Route.elm deleted file mode 100644 index a33676c..0000000 --- a/src/Route.elm +++ /dev/null @@ -1,93 +0,0 @@ -module Route exposing (Route(..), fromUrl, toString) - -import Url exposing (Protocol(..), Url) -import Url.Builder exposing (absolute) -import Url.Parser exposing (Parser, map, oneOf, parse, s, top) - - -type alias UrlParser a = - Parser (Route -> a) a - - -type Route - = AboutRoute - | SkillsRoute - | VshRoute - - -repr : Route -> String -repr route = - case route of - AboutRoute -> - "about" - - SkillsRoute -> - "contact" - - VshRoute -> - "vsh" - - -routes : List Route -routes = - let - {- This check will prevent you from forgetting to update routes - upon new Route creation. - -} - check route = - case route of - AboutRoute -> - () - - SkillsRoute -> - () - - VshRoute -> - () - in - [ AboutRoute - , SkillsRoute - , VshRoute - ] - - - --- EXPOSED - - -fromUrl : Url -> Route -fromUrl url = - Maybe.withDefault AboutRoute <| - parse urlParser <| - fake url - - -toString : Route -> String -toString route = - "/#" ++ absolute [ repr route ] [] - - - --- LOCAL - - -urlParser : UrlParser a -urlParser = - let - mapper route = - map route <| s <| repr route - in - oneOf <| - map AboutRoute top - :: List.map mapper routes - - -fake : Url -> Url -fake path = - { protocol = Https - , host = "sharpvik.github.com" - , port_ = Nothing - , path = Maybe.withDefault "/about" path.fragment - , query = Nothing - , fragment = Nothing - } diff --git a/src/Skills/Asset.elm b/src/Skills/Asset.elm deleted file mode 100644 index 624834c..0000000 --- a/src/Skills/Asset.elm +++ /dev/null @@ -1,18 +0,0 @@ -module Skills.Asset exposing (github, gmail) - -import Url.Builder exposing (absolute) - - -asset : List String -> String -asset path = - absolute ("assets" :: path) [] - - -github : String -github = - asset [ "github.svg" ] - - -gmail : String -gmail = - asset [ "gmail.svg" ] diff --git a/src/Skills/Class.elm b/src/Skills/Class.elm deleted file mode 100644 index ea78ec8..0000000 --- a/src/Skills/Class.elm +++ /dev/null @@ -1,35 +0,0 @@ -module Skills.Class exposing (..) - -import Common.Class as Class -import Html exposing (Attribute) -import Html.Attributes exposing (class) - - -bg : List (Attribute msg) -bg = - [ class Class.bg, class "skills-bg" ] - - -h1 : List (Attribute msg) -h1 = - [ class Class.h1, class "skills-h1" ] - - -h3 : List (Attribute msg) -h3 = - [ class Class.h3, class "skills-h3" ] - - -row : Attribute msg -row = - class "skills-row" - - -card : Attribute msg -card = - class "skills-card" - - -pill : Attribute msg -pill = - class "skills-pill" diff --git a/src/Skills/Main.elm b/src/Skills/Main.elm deleted file mode 100644 index 6391478..0000000 --- a/src/Skills/Main.elm +++ /dev/null @@ -1,123 +0,0 @@ -module Skills.Main exposing (..) - -import Browser exposing (Document) -import Common.Class as Class -import Common.Link as Link -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (..) -import Route exposing (Route(..)) -import Skills.Class - - - --- FLAGS - - -type alias Flags = - () - - - --- MODEL - - -type Model - = NoModel - - - --- MSG - - -type Msg - = NoMsg - - - --- INIT - - -init : ( Model, Cmd Msg ) -init = - ( initModel, Cmd.none ) - - -initModel : Model -initModel = - NoModel - - - ---VIEW - - -view : Model -> Document Msg -view _ = - let - entitled = - Document "💡 My Skills" - - app items = - [ div (class Class.appTop :: Skills.Class.bg) - items - ] - in - entitled <| - app - [ h1 Skills.Class.h1 [ text "What I Do" ] - , div [ Skills.Class.row ] - [ div [ Skills.Class.card ] - [ h2 [] [ text "Back End" ] - , p [] [ text "RESTful Microservices" ] - , p [] - [ a [ Link.go, Skills.Class.pill ] [ text "Go" ] - , a [ Link.python, Skills.Class.pill ] [ text "Python" ] - ] - ] - , div [ Skills.Class.card ] - [ h2 [] [ text "DevOps " ] - , p [] [ text "CI/CD, Server Management" ] - , p [] - [ a [ Link.docker, Skills.Class.pill ] [ text "Docker" ] - , a [ Link.ansible, Skills.Class.pill ] [ text "Ansible" ] - ] - ] - ] - , div [ Skills.Class.row ] - [ div [ Skills.Class.card ] - [ h2 [] [ text "Front End" ] - , p [] [ text "Web Apps" ] - , p [] - [ a [ Link.elm, Skills.Class.pill ] [ text "Elm" ] - , a [ Link.vuejs, Skills.Class.pill ] [ text "Vue.js" ] - ] - ] - , div [ Skills.Class.card ] - [ h2 [] [ text "Tutoring" ] - , p [] [ text "Zero-to-hero in programming" ] - , p [] - [ a [ Link.go, Skills.Class.pill ] [ text "Go" ] - , a [ Link.python, Skills.Class.pill ] [ text "Python" ] - ] - ] - ] - ] - - - --- UPDATE - - -update : Msg -> Model -> ( Model, Cmd Msg ) -update _ model = - ( model, Cmd.none ) - - - --- SUBSCRIPTIONS - - -subscriptions : Model -> Sub Msg -subscriptions _ = - Sub.none diff --git a/src/Vsh/Class.elm b/src/Vsh/Class.elm deleted file mode 100644 index 048baa9..0000000 --- a/src/Vsh/Class.elm +++ /dev/null @@ -1,40 +0,0 @@ -module Vsh.Class exposing (..) - -import Common.Class as Class -import Html exposing (Attribute) -import Html.Attributes exposing (class) - - -h1 : List (Attribute msg) -h1 = - [ class Class.h1, class "vsh-h1" ] - - -bg : List (Attribute msg) -bg = - [ class Class.bg, class "vsh-bg" ] - - -window : String -window = - "vsh-window" - - -topbar : String -topbar = - "vsh-topbar" - - -close : String -close = - "vsh-close" - - -textarea : String -textarea = - "vsh-textarea" - - -text : String -text = - "vsh-text" diff --git a/src/Vsh/Command.elm b/src/Vsh/Command.elm deleted file mode 100644 index eb0a9ac..0000000 --- a/src/Vsh/Command.elm +++ /dev/null @@ -1,258 +0,0 @@ -module Vsh.Command exposing (..) - -import Html exposing (..) -import Html.Attributes exposing (href) -import Vsh.Text exposing (Color(..), ctext) - - -type alias Command msg = - String -> List (Html msg) -> List (Html msg) - - -exec : Command msg -exec command display = - let - maybeCommand = - List.head <| String.words command - - wrongCommand label string = - [ text <| label ++ " command: ", ctext Magenta string ] - in - case maybeCommand of - Nothing -> - display ++ wrongCommand "Weird" command - - Just cmd -> - case eval cmd of - Nothing -> - display ++ wrongCommand "Unknown" command - - Just c -> - c command display - - -eval : String -> Maybe (Command msg) -eval command = - case command of - "whoami" -> - Just whoami - - "top" -> - Just top - - "cv" -> - Just cv - - "jobs" -> - Just jobs - - "touch" -> - Just touch - - "help" -> - Just help - - "version" -> - Just version - - "cut" -> - Just cut - - "git" -> - Just git - - "clear" -> - Just clear - - "exit" -> - Just exit - - _ -> - Nothing - - -whoami : Command msg -whoami _ display = - display - ++ [ text - """Hey, my name is Viktor! -I study Computer Science in the University of Southampton. - -At work, I currently specialise in high-throughput microservices. I build them -with Go and Python. However, I also enjoy playing around with Haskell, Elm, -Vue.js, and Rust. - -In my spare time, I dabble in compiler design and implementation. I love -creating new programming languages! Given a chance, I'd like to do some -professional research into deterministic garbage collection within pure -functional languages.""" - ] - - -top : Command msg -top _ display = - let - bars m n = - -- m = max bars for this level; n = actual bars - min m n - - coloredLevel color m n = - Vsh.Text.ctext color <| - String.join "" <| - List.repeat (bars n m) "|" - - elementary = - coloredLevel Green 12 - - intermediate n20 = - coloredLevel Yellow 5 (n20 - 12) - - advanced n20 = - coloredLevel Magenta 3 (n20 - 17) - - level n = - let - n20 = - min n 20 - - offset = - String.join "" <| List.repeat (20 - n20) " " - in - [ elementary n20, intermediate n20, advanced n20, text offset ] - - skill name lvl = - (text <| - "\n " - ++ String.padRight 11 ' ' name - ++ "[" - ) - :: level lvl - ++ [ text "]" ] - in - display - ++ [ text "My top skills:\n" ] - ++ skill "Go" 20 - ++ skill "Python" 19 - ++ skill "Docker" 18 - ++ skill "Vue.js" 16 - ++ skill "JavaScript" 14 - ++ skill "Haskell" 12 - ++ skill "Elm" 9 - - -cv : Command msg -cv _ display = - display - ++ [ text "My curriculum vitae: " - , a - [ href "https://docs.google.com/document/d/1stYuixTXS9gbvcs2KKHLZBax8JRrnxkKxXqT7A9d9RA/edit?usp=sharing" ] - [ text "Google Docs" ] - ] - - -jobs : Command msg -jobs _ display = - display - ++ [ text - """Before you offer me a job, I'd like to tell you a few things: - - 1. I specialise in cloud services and web development, but I'm open to - interesting offers! - 2. I am a uni student; during my term time, I can only work 20 hr./week. - 3. Nevertheless, full-time work is possible during the term breaks. - -Use the """ - , Vsh.Text.ctext Green "touch" - , text " command to get in touch." - ] - - -touch : Command msg -touch _ display = - let - linkWithTheSameText url = - a [ href url ] [ text <| url ] - - entry description link = - [ text "\n " - , text <| String.padRight 11 ' ' <| description ++ ":" - , link - ] - in - display - ++ [ text "Ways to get in touch:\n" ] - ++ entry "email" - (a [ href "mailto:sharp.vik@gmail.com" ] [ text "sharp.vik@gmail.com" ]) - ++ entry "github" - (linkWithTheSameText "https://github.com/sharpvik") - ++ entry "linkedin" - (linkWithTheSameText "https://www.linkedin.com/in/sharpvik") - - -help : Command msg -help _ display = - let - entry command description = - [ text "\n " - , Vsh.Text.ctext Green <| String.padRight 8 ' ' command - , text <| "-- " ++ description - ] - in - display - ++ [ text """VSH is a terminal emulator that helps you learn about me. -Use up and down arrow keys to browse command history (unless it's empty). -And most importantly -- have fun! - -Available commands: -""" ] - ++ entry "whoami" "a bit about myself" - ++ entry "top" "my top skills" - ++ entry "cv" "my curriculum vitae" - ++ entry "jobs" "hire me if you're really impressed" - ++ entry "touch" "ways to get in touch\n" - ++ entry "help" "display this message again" - ++ entry "version" "display vsh version" - ++ entry "cut" "keyboard shortcuts cheatsheet" - ++ entry "git" "explore vsh source code" - ++ entry "clear" "clear screen" - ++ entry "exit" "exit vsh session" - - -version : Command msg -version _ display = - display - ++ [ text "vsh v0.1.3 by Viktor A. Rozenko Voitenko " ] - - -cut : Command msg -cut _ display = - let - entry command description = - [ text "\n " - , Vsh.Text.ctext Green <| String.padRight 8 ' ' command - , text <| "-- " ++ description - ] - in - display - ++ entry "CTRL+e" "quit vsh" - ++ entry "CTRL+;" "clear screen" - - -git : Command msg -git _ display = - display - ++ [ text "vsh on GitHub: " - , a - [ href "https://github.com/sharpvik/sharpvik.github.io" ] - [ text "https://github.com/sharpvik/sharpvik.github.io" ] - ] - - -clear : Command msg -clear _ _ = - [] - - -exit : Command msg -exit _ display = - display ++ [ text "Shutting down..." ] diff --git a/src/Vsh/History.elm b/src/Vsh/History.elm deleted file mode 100644 index 2d0dce5..0000000 --- a/src/Vsh/History.elm +++ /dev/null @@ -1,54 +0,0 @@ -module Vsh.History exposing (..) - -import Array exposing (Array) - - -type alias History = - { history : Array String, ptr : Int } - - -empty : History -empty = - History Array.empty 0 - - -update : String -> History -> History -update command history = - { history - | history = Array.push command history.history - , ptr = Array.length history.history + 1 - } - - -lookup : (History -> Int) -> History -> Maybe ( String, History ) -lookup getptr history = - let - ptr = - getptr history - in - if Array.isEmpty history.history then - Nothing - - else - Just <| - ( Maybe.withDefault "" <| Array.get ptr history.history - , { history | ptr = ptr } - ) - - -next : History -> Int -next history = - if Array.length history.history > history.ptr + 1 then - history.ptr + 1 - - else - 0 - - -prev : History -> Int -prev history = - if history.ptr == 0 then - Array.length history.history - 1 - - else - history.ptr - 1 diff --git a/src/Vsh/Main.elm b/src/Vsh/Main.elm deleted file mode 100644 index 9871d4e..0000000 --- a/src/Vsh/Main.elm +++ /dev/null @@ -1,296 +0,0 @@ -port module Vsh.Main exposing (..) - -import Browser exposing (Document) -import Browser.Events as Events -import Browser.Navigation as Nav -import Common.Class as Class -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (..) -import Json.Decode as Decode -import Route exposing (Route(..)) -import Vsh.Class -import Vsh.Command -import Vsh.History exposing (History) -import Vsh.Text exposing (Color(..), ctext) - - - --- FLAGS - - -type alias Flags = - () - - - --- MODEL - - -type alias Model = - { display : List (Html Msg) - , command : String - , history : History - } - - - --- MSG - - -type Msg - = KeyDown KeyboardEvent - | Clear - | Exit - | Ignore - - -type KeyboardEvent - = Symbol Char - | Tab - | Enter - | Backspace - | ArrowUp - | ArrowDown - | Ctrl Char - | Alt Char - | Other - - - --- INIT - - -init : ( Model, Cmd Msg ) -init = - ( initModel, Cmd.none ) - - -initModel : Model -initModel = - { display = greeting - , command = "" - , history = Vsh.History.empty - } - - -greeting : List (Html Msg) -greeting = - Vsh.Command.version "version" [] - ++ [ text "\nEnter " - , ctext Green "help" - , text " to see available commands!\n" - , ctext Yellow "VSH does not support mobile devices.\n\n" - ] - ++ prompt - - -prompt : List (Html Msg) -prompt = - [ ctext Yellow "guest" - , text " at " - , ctext Magenta "sharpvik" - , text "\n❯ " - ] - - - --- VIEW - - -view : Model -> Document Msg -view model = - { title = "💻 ️VSH Shell" - , body = - [ div (class Class.appTop :: Vsh.Class.bg) - [ h1 Vsh.Class.h1 [ text "Hack Me 🤓" ] - , vshDisplay <| model.display ++ [ text model.command ] - ] - ] - } - - -vshDisplay : List (Html Msg) -> Html Msg -vshDisplay display = - div - [ class Vsh.Class.window - ] - [ header - [ class Vsh.Class.topbar ] - [ p [] - [ text "vsh shell" ] - , a - [ class Vsh.Class.close - , href <| Route.toString AboutRoute - ] - [] - ] - , pre - [ class Vsh.Class.textarea ] - (display ++ [ text "█" ]) - ] - - - --- UPDATE - - -update : Msg -> Model -> ( Model, Cmd Msg ) -update msg model = - updateOnKeydown msg model model.command - - -updateOnKeydown : Msg -> Model -> String -> ( Model, Cmd Msg ) -updateOnKeydown msg model command = - case msg of - KeyDown (Symbol char) -> - ( { model | command = command ++ String.fromChar char }, Cmd.none ) - - KeyDown Tab -> - ( { model | command = command ++ " " }, Cmd.none ) - - KeyDown Enter -> - ( updateOnCommand model command, scroll () ) - - KeyDown Backspace -> - ( { model | command = String.dropRight 1 command }, Cmd.none ) - - KeyDown ArrowUp -> - ( maybeLookupHistory Vsh.History.prev model, Cmd.none ) - - KeyDown ArrowDown -> - ( maybeLookupHistory Vsh.History.next model, Cmd.none ) - - Clear -> - ( updateOnCommand model "clear", Cmd.none ) - - Exit -> - ( model - , Nav.load <| Route.toString AboutRoute - ) - - _ -> - ( model, Cmd.none ) - - -maybeLookupHistory : (History -> Int) -> Model -> Model -maybeLookupHistory getptr model = - case Vsh.History.lookup getptr model.history of - Nothing -> - model - - Just ( command, history ) -> - { model | command = command, history = history } - - -updateOnCommand : Model -> String -> Model -updateOnCommand model command = - let - display = - Vsh.Command.exec command <| - model.display - ++ [ text (command ++ "\n") ] - - promptWithOffset = - (text <| - if List.isEmpty display then - "" - - else - "\n\n" - ) - :: prompt - in - { display = display ++ promptWithOffset - , command = "" - , history = Vsh.History.update command model.history - } - - - --- SUBSCRIPTIONS - - -subscriptions : Model -> Sub Msg -subscriptions _ = - Events.onKeyDown keydownHandler - - -eventDecoder : Decode.Decoder KeyboardEvent -eventDecoder = - Decode.map3 - eventConstructor - (Decode.field "ctrlKey" Decode.bool) - (Decode.field "altKey" Decode.bool) - (Decode.field "key" Decode.string) - - -eventConstructor : Bool -> Bool -> String -> KeyboardEvent -eventConstructor ctrl alt key = - if ctrl then - specialKeyEvent Ctrl key - - else if alt then - specialKeyEvent Alt key - - else - case key of - "Tab" -> - Tab - - "Enter" -> - Enter - - "Backspace" -> - Backspace - - "ArrowUp" -> - ArrowUp - - "ArrowDown" -> - ArrowDown - - char -> - specialKeyEvent Symbol char - - -specialKeyEvent : (Char -> KeyboardEvent) -> String -> KeyboardEvent -specialKeyEvent event key = - if String.length key /= 1 then - Other - - else - case String.uncons key of - Just ( char, _ ) -> - event char - - Nothing -> - Other - - -keydownHandler : Decode.Decoder Msg -keydownHandler = - Decode.map toKeyDownMsg eventDecoder - - -toKeyDownMsg : KeyboardEvent -> Msg -toKeyDownMsg event = - case event of - Ctrl ';' -> - Clear - - Ctrl 'e' -> - Exit - - Other -> - Ignore - - e -> - KeyDown e - - - --- PORTS - - -port scroll : () -> Cmd msg diff --git a/src/Vsh/Text.elm b/src/Vsh/Text.elm deleted file mode 100644 index eff3780..0000000 --- a/src/Vsh/Text.elm +++ /dev/null @@ -1,32 +0,0 @@ -module Vsh.Text exposing (..) - -import Html exposing (..) -import Html.Attributes exposing (..) - - -ctext : Color -> String -> Html msg -ctext color message = - span - [ class <| "vsh-text " ++ colorToClass color ] - [ Html.text message ] - - -type Color - = Yellow - | Green - | Magenta - - -colorToClass : Color -> String -colorToClass c = - "vsh-" - ++ (case c of - Yellow -> - "yellow" - - Green -> - "green" - - Magenta -> - "magenta" - )