diff --git a/.gitignore b/.gitignore
index 8841523a..976b5854 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,4 +6,4 @@ db.sqlite3
*.pyc
venv/
environment_settings.py
-
+elm-stuff/
diff --git a/schedule/Makefile b/schedule/Makefile
new file mode 100644
index 00000000..d093dced
--- /dev/null
+++ b/schedule/Makefile
@@ -0,0 +1,5 @@
+all:
+ elm-make src/Main.elm --warn --output ../src/program/static/js/elm_based_schedule.js
+
+debug:
+ elm-make src/Main.elm --debug --warn --output ../src/program/static/js/elm_based_schedule.js
diff --git a/schedule/elm-package.json b/schedule/elm-package.json
new file mode 100644
index 00000000..4fa748ae
--- /dev/null
+++ b/schedule/elm-package.json
@@ -0,0 +1,22 @@
+{
+ "version": "1.0.0",
+ "summary": "helpful summary of your project, less than 80 characters",
+ "repository": "https://github.com/user/project.git",
+ "license": "BSD3",
+ "source-directories": [
+ "src/"
+ ],
+ "exposed-modules": [],
+ "dependencies": {
+ "NoRedInk/elm-decode-pipeline": "3.0.0 <= v < 4.0.0",
+ "elm-community/list-extra": "6.1.0 <= v < 7.0.0",
+ "elm-lang/core": "5.1.1 <= v < 6.0.0",
+ "elm-lang/html": "2.0.0 <= v < 3.0.0",
+ "elm-lang/navigation": "2.1.0 <= v < 3.0.0",
+ "elm-lang/websocket": "1.0.2 <= v < 2.0.0",
+ "evancz/elm-markdown": "3.0.2 <= v < 4.0.0",
+ "evancz/url-parser": "2.0.1 <= v < 3.0.0",
+ "justinmimbs/elm-date-extra": "2.0.3 <= v < 3.0.0"
+ },
+ "elm-version": "0.18.0 <= v < 0.19.0"
+}
diff --git a/schedule/src/Decoders.elm b/schedule/src/Decoders.elm
new file mode 100644
index 00000000..b574794c
--- /dev/null
+++ b/schedule/src/Decoders.elm
@@ -0,0 +1,122 @@
+module Decoders exposing (..)
+
+-- Local modules
+
+import Models exposing (Day, Speaker, Event, EventInstance, Model, Flags, Filter, Route(..), FilterType(..))
+
+
+-- Core modules
+
+import Json.Decode exposing (int, string, float, list, bool, dict, Decoder, nullable)
+import Json.Decode.Pipeline exposing (decode, required, optional, hardcoded)
+import Date exposing (Date, Month(..))
+
+
+-- External modules
+
+import Date.Extra
+import Navigation exposing (Location)
+
+
+-- DECODERS
+
+
+type alias WebSocketAction =
+ { action : String
+ }
+
+
+webSocketActionDecoder : Decoder WebSocketAction
+webSocketActionDecoder =
+ decode WebSocketAction
+ |> required "action" string
+
+
+dayDecoder : Decoder Day
+dayDecoder =
+ decode Day
+ |> required "day_name" string
+ |> required "iso" dateDecoder
+ |> required "repr" string
+
+
+speakerDecoder : Decoder Speaker
+speakerDecoder =
+ decode Speaker
+ |> required "name" string
+ |> required "slug" string
+ |> required "biography" string
+ |> optional "large_picture_url" (nullable string) Nothing
+ |> optional "small_picture_url" (nullable string) Nothing
+
+
+eventDecoder : Decoder Event
+eventDecoder =
+ decode Event
+ |> required "title" string
+ |> required "slug" string
+ |> required "abstract" string
+ |> required "speaker_slugs" (list string)
+ |> required "video_state" string
+ |> optional "video_url" (nullable string) Nothing
+ |> required "event_type" string
+
+
+dateDecoder : Decoder Date
+dateDecoder =
+ let
+ unpacked isoString =
+ isoString
+ |> Date.Extra.fromIsoString
+ |> Maybe.withDefault (Date.Extra.fromParts 1970 Jan 1 0 0 0 0)
+ in
+ Json.Decode.map unpacked string
+
+
+eventInstanceDecoder : Decoder EventInstance
+eventInstanceDecoder =
+ decode EventInstance
+ |> required "title" string
+ |> required "slug" string
+ |> required "id" int
+ |> required "url" string
+ |> required "event_slug" string
+ |> required "event_type" string
+ |> required "bg-color" string
+ |> required "fg-color" string
+ |> required "from" dateDecoder
+ |> required "to" dateDecoder
+ |> required "timeslots" float
+ |> required "location" string
+ |> required "location_icon" string
+ |> required "video_state" string
+ |> optional "video_url" (nullable string) Nothing
+ |> optional "is_favorited" (nullable bool) Nothing
+
+
+eventLocationDecoder : Decoder FilterType
+eventLocationDecoder =
+ decode LocationFilter
+ |> required "name" string
+ |> required "slug" string
+ |> required "icon" string
+
+
+eventTypeDecoder : Decoder FilterType
+eventTypeDecoder =
+ decode TypeFilter
+ |> required "name" string
+ |> required "slug" string
+ |> required "color" string
+ |> required "light_text" bool
+
+
+initDataDecoder : Decoder (Flags -> Filter -> Location -> Route -> Bool -> Model)
+initDataDecoder =
+ decode Model
+ |> required "days" (list dayDecoder)
+ |> required "events" (list eventDecoder)
+ |> required "event_instances" (list eventInstanceDecoder)
+ |> required "event_locations" (list eventLocationDecoder)
+ |> required "event_types" (list eventTypeDecoder)
+ |> required "speakers" (list speakerDecoder)
diff --git a/schedule/src/Main.elm b/schedule/src/Main.elm
new file mode 100644
index 00000000..7b03faeb
--- /dev/null
+++ b/schedule/src/Main.elm
@@ -0,0 +1,51 @@
+module Main exposing (..)
+
+-- Local modules
+
+import Models exposing (..)
+import Routing exposing (parseLocation)
+import Update exposing (update)
+import Messages exposing (Msg(..))
+import WebSocketCalls exposing (sendInitMessage)
+import Views exposing (view)
+
+
+-- External modules
+
+import WebSocket exposing (listen)
+import Navigation exposing (Location)
+
+
+main : Program Flags Model Msg
+main =
+ Navigation.programWithFlags
+ OnLocationChange
+ { init = init
+ , view = view
+ , update = update
+ , subscriptions = subscriptions
+ }
+
+
+init : Flags -> Location -> ( Model, Cmd Msg )
+init flags location =
+ let
+ currentRoute =
+ parseLocation location
+
+ emptyFilter =
+ Filter [] [] []
+
+ model =
+ Model [] [] [] [] [] [] flags emptyFilter location currentRoute False
+ in
+ model ! [ sendInitMessage flags.camp_slug flags.websocket_server ]
+
+
+
+-- SUBSCRIPTIONS
+
+
+subscriptions : Model -> Sub Msg
+subscriptions model =
+ WebSocket.listen model.flags.websocket_server WebSocketPayload
diff --git a/schedule/src/Messages.elm b/schedule/src/Messages.elm
new file mode 100644
index 00000000..414a6f79
--- /dev/null
+++ b/schedule/src/Messages.elm
@@ -0,0 +1,18 @@
+module Messages exposing (Msg(..))
+
+-- Local modules
+
+import Models exposing (Day, EventInstance, FilterType)
+
+
+-- External modules
+
+import Navigation exposing (Location)
+
+
+type Msg
+ = NoOp
+ | WebSocketPayload String
+ | ToggleFilter FilterType
+ | OnLocationChange Location
+ | BackInHistory
diff --git a/schedule/src/Models.elm b/schedule/src/Models.elm
new file mode 100644
index 00000000..9f60f394
--- /dev/null
+++ b/schedule/src/Models.elm
@@ -0,0 +1,179 @@
+module Models exposing (..)
+
+-- Core modules
+
+import Date exposing (Date, now)
+
+
+-- External modules
+
+import Navigation exposing (Location)
+
+
+type alias EventSlug =
+ String
+
+
+type alias EventInstanceSlug =
+ String
+
+
+type alias SpeakerSlug =
+ String
+
+
+type alias DaySlug =
+ String
+
+
+type alias FilterQuery =
+ String
+
+
+
+-- Route is defined here rather than in Routing.elm due to it being used in Model. If it were in Routing.elm we would have a circular dependency.
+
+
+type Route
+ = OverviewRoute
+ | OverviewFilteredRoute FilterQuery
+ | DayRoute DaySlug
+ | EventRoute EventSlug
+ | SpeakerRoute SpeakerSlug
+ | NotFoundRoute
+
+
+type alias Model =
+ { days : List Day
+ , events : List Event
+ , eventInstances : List EventInstance
+ , eventLocations : List FilterType
+ , eventTypes : List FilterType
+ , speakers : List Speaker
+ , flags : Flags
+ , filter : Filter
+ , location : Location
+ , route : Route
+ , dataLoaded : Bool
+ }
+
+
+type alias Day =
+ { day_name : String
+ , date : Date
+ , repr : String
+ }
+
+
+type alias Speaker =
+ { name : String
+ , slug : SpeakerSlug
+ , biography : String
+ , largePictureUrl : Maybe String
+ , smallPictureUrl : Maybe String
+ }
+
+
+type alias EventInstance =
+ { title : String
+ , slug : EventInstanceSlug
+ , id : Int
+ , url : String
+ , eventSlug : EventSlug
+ , eventType : String
+ , backgroundColor : String
+ , forgroundColor : String
+ , from : Date
+ , to : Date
+ , timeslots : Float
+ , location : String
+ , locationIcon : String
+ , videoState : String
+ , videoUrl : Maybe String
+ , isFavorited : Maybe Bool
+ }
+
+
+type alias Event =
+ { title : String
+ , slug : EventSlug
+ , abstract : String
+ , speakerSlugs : List SpeakerSlug
+ , videoState : String
+ , videoUrl : Maybe String
+ , eventType : String
+ }
+
+
+type alias Flags =
+ { schedule_timeslot_length_minutes : Int
+ , schedule_midnight_offset_hours : Int
+ , ics_button_href : String
+ , camp_slug : String
+ , websocket_server : String
+ }
+
+
+
+-- FILTERS
+
+
+type alias FilterName =
+ String
+
+
+type alias FilterSlug =
+ String
+
+
+type alias LocationIcon =
+ String
+
+
+type alias TypeColor =
+ String
+
+
+type alias TypeLightText =
+ Bool
+
+
+type FilterType
+ = TypeFilter FilterName FilterSlug TypeColor TypeLightText
+ | LocationFilter FilterName FilterSlug LocationIcon
+ | VideoFilter FilterName FilterSlug
+
+
+type alias Filter =
+ { eventTypes : List FilterType
+ , eventLocations : List FilterType
+ , videoRecording : List FilterType
+ }
+
+
+unpackFilterType filter =
+ case filter of
+ TypeFilter name slug _ _ ->
+ ( name, slug )
+
+ LocationFilter name slug _ ->
+ ( name, slug )
+
+ VideoFilter name slug ->
+ ( name, slug )
+
+
+getSlugFromFilterType filter =
+ let
+ ( _, slug ) =
+ unpackFilterType filter
+ in
+ slug
+
+
+getNameFromFilterType filter =
+ let
+ ( name, slug ) =
+ unpackFilterType filter
+ in
+ name
diff --git a/schedule/src/Routing.elm b/schedule/src/Routing.elm
new file mode 100644
index 00000000..653edde5
--- /dev/null
+++ b/schedule/src/Routing.elm
@@ -0,0 +1,72 @@
+module Routing exposing (..)
+
+-- Local modules
+
+import Models exposing (Route(..))
+
+
+-- External modules
+
+import Navigation exposing (Location)
+import UrlParser exposing (Parser, (>), oneOf, map, top, s, string, parseHash)
+
+
+{--
+URLs to support:
+
+- #/
+ This show the overview of the schedule
+
+- #/?type={types},location={locations},video={not-to-be-recorded,to-be-recorded,has-recording}
+ This is the overview, just with filters enable
+
+- #/day/{year}-{month}-{day}
+ Show a particular day
+
+- #/event/{slug}
+ Show a particular event
+
+--}
+
+
+matchers : Parser (Route -> a) a
+matchers =
+ oneOf
+ [ map OverviewRoute top
+ , map OverviewFilteredRoute (top > string)
+ , map DayRoute (s "day" > string)
+ , map EventRoute (s "event" > string)
+ , map SpeakerRoute (s "speaker" > string)
+ ]
+
+
+parseLocation : Location -> Route
+parseLocation location =
+ parseHash matchers location
+ |> Maybe.withDefault NotFoundRoute
+
+
+routeToString : Route -> String
+routeToString route =
+ let
+ parts =
+ case route of
+ OverviewRoute ->
+ []
+
+ OverviewFilteredRoute query ->
+ [ query ]
+
+ DayRoute iso ->
+ [ "day", iso ]
+
+ EventRoute slug ->
+ [ "event", slug ]
+
+ SpeakerRoute slug ->
+ [ "speaker", slug ]
+
+ NotFoundRoute ->
+ []
+ in
+ "#/" ++ String.join "/" parts
diff --git a/schedule/src/Update.elm b/schedule/src/Update.elm
new file mode 100644
index 00000000..8d2ad964
--- /dev/null
+++ b/schedule/src/Update.elm
@@ -0,0 +1,123 @@
+module Update exposing (update)
+
+-- Local modules
+
+import Models exposing (Model, Route(..), Filter, FilterType(..))
+import Messages exposing (Msg(..))
+import Decoders exposing (webSocketActionDecoder, initDataDecoder, eventDecoder)
+import Routing exposing (parseLocation)
+import Views.FilterView exposing (parseFilterFromQuery, filterToQuery)
+
+
+-- Core modules
+
+import Json.Decode
+
+
+-- External modules
+
+import Navigation
+
+
+update : Msg -> Model -> ( Model, Cmd Msg )
+update msg model =
+ case msg of
+ NoOp ->
+ ( model, Cmd.none )
+
+ WebSocketPayload str ->
+ let
+ newModel =
+ case Json.Decode.decodeString webSocketActionDecoder str of
+ Ok webSocketAction ->
+ case webSocketAction.action of
+ "init" ->
+ case Json.Decode.decodeString initDataDecoder str of
+ Ok m ->
+ m model.flags model.filter model.location model.route True
+
+ Err error ->
+ model
+
+ _ ->
+ model
+
+ Err error ->
+ model
+
+ ( newModel_, _ ) =
+ update (OnLocationChange model.location) newModel
+ in
+ newModel_ ! []
+
+ ToggleFilter filter ->
+ let
+ currentFilter =
+ model.filter
+
+ newFilter =
+ case filter of
+ TypeFilter name slug color lightText ->
+ let
+ eventType =
+ TypeFilter name slug color lightText
+ in
+ { currentFilter
+ | eventTypes =
+ if List.member eventType model.filter.eventTypes then
+ List.filter (\x -> x /= eventType) model.filter.eventTypes
+ else
+ eventType :: model.filter.eventTypes
+ }
+
+ LocationFilter name slug icon ->
+ let
+ eventLocation =
+ LocationFilter name slug icon
+ in
+ { currentFilter
+ | eventLocations =
+ if List.member eventLocation model.filter.eventLocations then
+ List.filter (\x -> x /= eventLocation) model.filter.eventLocations
+ else
+ eventLocation :: model.filter.eventLocations
+ }
+
+ VideoFilter name slug ->
+ let
+ videoRecording =
+ VideoFilter name slug
+ in
+ { currentFilter
+ | videoRecording =
+ if List.member videoRecording model.filter.videoRecording then
+ List.filter (\x -> x /= videoRecording) model.filter.videoRecording
+ else
+ videoRecording :: model.filter.videoRecording
+ }
+
+ query =
+ filterToQuery newFilter
+
+ cmd =
+ Navigation.newUrl query
+ in
+ { model | filter = newFilter } ! [ cmd ]
+
+ OnLocationChange location ->
+ let
+ newRoute =
+ parseLocation location
+
+ newFilter =
+ case newRoute of
+ OverviewFilteredRoute query ->
+ parseFilterFromQuery query model
+
+ _ ->
+ model.filter
+ in
+ { model | filter = newFilter, route = newRoute, location = location } ! []
+
+ BackInHistory ->
+ model ! [ Navigation.back 1 ]
diff --git a/schedule/src/Views.elm b/schedule/src/Views.elm
new file mode 100644
index 00000000..2da55990
--- /dev/null
+++ b/schedule/src/Views.elm
@@ -0,0 +1,60 @@
+module Views exposing (..)
+
+-- Local modules
+
+import Models exposing (..)
+import Messages exposing (Msg(..))
+import Views.DayPicker exposing (dayPicker)
+import Views.DayView exposing (dayView)
+import Views.EventDetail exposing (eventDetailView)
+import Views.SpeakerDetail exposing (speakerDetailView)
+import Views.ScheduleOverview exposing (scheduleOverviewView)
+
+
+-- Core modules
+
+import Date exposing (Month(..))
+
+
+-- External modules
+
+import Html exposing (Html, Attribute, div, input, text, li, ul, a, h4, label, i, span, hr, small, p)
+import Date.Extra
+
+
+view : Model -> Html Msg
+view model =
+ case model.dataLoaded of
+ True ->
+ div []
+ [ dayPicker model
+ , hr [] []
+ , case model.route of
+ OverviewRoute ->
+ scheduleOverviewView model
+
+ OverviewFilteredRoute _ ->
+ scheduleOverviewView model
+
+ DayRoute dayIso ->
+ let
+ day =
+ model.days
+ |> List.filter (\x -> (Date.Extra.toFormattedString "y-MM-dd" x.date) == dayIso)
+ |> List.head
+ |> Maybe.withDefault (Day "" (Date.Extra.fromParts 1970 Jan 1 0 0 0 0) "")
+ in
+ dayView day model
+
+ EventRoute eventSlug ->
+ eventDetailView eventSlug model
+
+ SpeakerRoute speakerSlug ->
+ speakerDetailView speakerSlug model
+
+ NotFoundRoute ->
+ div [] [ text "Not found!" ]
+ ]
+
+ False ->
+ h4 [] [ text "Loading schedule..." ]
diff --git a/schedule/src/Views/DayPicker.elm b/schedule/src/Views/DayPicker.elm
new file mode 100644
index 00000000..b22297d1
--- /dev/null
+++ b/schedule/src/Views/DayPicker.elm
@@ -0,0 +1,86 @@
+module Views.DayPicker exposing (..)
+
+-- Local modules
+
+import Models exposing (..)
+import Messages exposing (Msg(..))
+import Routing exposing (routeToString)
+import Views.FilterView exposing (maybeFilteredOverviewRoute)
+
+
+-- Core modules
+
+import Date exposing (Date)
+
+
+-- External modules
+
+import Html exposing (Html, text, a, div)
+import Html.Attributes exposing (class, classList, href, id)
+import Date.Extra
+
+
+dayPicker : Model -> Html Msg
+dayPicker model =
+ let
+ activeDate =
+ case model.route of
+ DayRoute iso ->
+ Date.Extra.fromIsoString iso
+
+ _ ->
+ Nothing
+
+ isAllDaysActive =
+ case activeDate of
+ Just _ ->
+ False
+
+ Nothing ->
+ True
+ in
+ div
+ [ classList
+ [ ( "row", True )
+ , ( "sticky", True )
+ ]
+ , id "daypicker"
+ ]
+ [ div [ id "schedule-days", class "btn-group" ]
+ ([ a
+ [ classList
+ [ ( "btn", True )
+ , ( "btn-default", not isAllDaysActive )
+ , ( "btn-primary", isAllDaysActive )
+ ]
+ , href <| routeToString <| maybeFilteredOverviewRoute model
+ ]
+ [ text "All Days"
+ ]
+ ]
+ ++ (List.map (\day -> dayButton day activeDate) model.days)
+ )
+ ]
+
+
+dayButton : Day -> Maybe Date -> Html Msg
+dayButton day activeDate =
+ let
+ isActive =
+ case activeDate of
+ Just activeDate ->
+ day.date == activeDate
+
+ Nothing ->
+ False
+ in
+ a
+ [ classList
+ [ ( "btn", True )
+ , ( "btn-default", not isActive )
+ , ( "btn-primary", isActive )
+ ]
+ , href <| routeToString <| DayRoute <| Date.Extra.toFormattedString "y-MM-dd" day.date
+ ]
+ [ text day.day_name
+ ]
diff --git a/schedule/src/Views/DayView.elm b/schedule/src/Views/DayView.elm
new file mode 100644
index 00000000..1d96af77
--- /dev/null
+++ b/schedule/src/Views/DayView.elm
@@ -0,0 +1,280 @@
+module Views.DayView exposing (dayView)
+
+-- Local modules
+
+import Messages exposing (Msg(..))
+import Models exposing (Model, Day, EventInstance, Route(EventRoute), FilterType(..), getSlugFromFilterType, getNameFromFilterType)
+import Routing exposing (routeToString)
+
+
+-- Core modules
+
+import Date exposing (Date)
+
+
+-- External modules
+
+import Html exposing (Html, text, div, ul, li, span, i, h4, table, p, a)
+import Html.Attributes exposing (classList, style, href)
+import Date.Extra
+import List.Extra
+
+
+blockHeight : Int
+blockHeight =
+ 15
+
+
+headerHeight : Int
+headerHeight =
+ 50
+
+
+px : Int -> String
+px value =
+ (toString value) ++ "px"
+
+
+dayView : Day -> Model -> Html Msg
+dayView day model =
+ let
+ start =
+ Date.Extra.add Date.Extra.Hour model.flags.schedule_midnight_offset_hours day.date
+
+ lastHour =
+ Date.Extra.add Date.Extra.Day 1 start
+
+ minutes =
+ Date.Extra.range Date.Extra.Minute 15 start lastHour
+
+ filteredEventInstances =
+ List.filter (\x -> Date.Extra.equalBy Date.Extra.Day x.from day.date) model.eventInstances
+ in
+ div
+ [ classList [ ( "row", True ) ] ]
+ [ gutter minutes
+ , locationColumns filteredEventInstances model.eventLocations model.flags.schedule_midnight_offset_hours minutes
+ ]
+
+
+locationColumns : List EventInstance -> List FilterType -> Int -> List Date -> Html Msg
+locationColumns eventInstances eventLocations offset minutes =
+ let
+ columnWidth =
+ 100.0 / toFloat (List.length eventLocations)
+ in
+ div
+ [ style
+ [ ( "display", "flex" )
+ , ( "justify-content", "space-around" )
+ ]
+ , classList
+ [ ( "col-sm-11", True )
+ ]
+ ]
+ (List.map (\location -> locationColumn columnWidth eventInstances offset minutes location) eventLocations)
+
+
+locationColumn : Float -> List EventInstance -> Int -> List Date -> FilterType -> Html Msg
+locationColumn columnWidth eventInstances offset minutes location =
+ let
+ locationInstances =
+ List.filter (\instance -> instance.location == getSlugFromFilterType location) eventInstances
+
+ overlappingGroups =
+ List.Extra.groupWhile
+ (\instanceA instanceB ->
+ (Date.Extra.isBetween instanceB.from instanceB.to instanceA.from) && not (Date.Extra.equal instanceA.from instanceB.to)
+ )
+ locationInstances
+ in
+ div
+ [ style
+ [ ( "width", (toString columnWidth) ++ "%" )
+ ]
+ , classList
+ [ ( "location-column", True ) ]
+ ]
+ ([ div
+ [ style
+ [ ( "height", px headerHeight )
+ ]
+ , classList
+ [ ( "location-column-header", True )
+ ]
+ ]
+ [ text <| getNameFromFilterType location ]
+ ]
+ ++ (List.map
+ (\x ->
+ div
+ [ style
+ [ ( "backgroundColor"
+ , if Date.minute x == 30 || Date.minute x == 45 then
+ "#f8f8f8"
+ else
+ "#fff"
+ )
+ , ( "height", px blockHeight )
+ ]
+ ]
+ []
+ )
+ minutes
+ )
+ ++ (List.map (\group -> renderGroup offset group) overlappingGroups)
+ )
+
+
+renderGroup : Int -> List EventInstance -> Html Msg
+renderGroup offset group =
+ let
+ sortedGroup =
+ List.sortWith
+ (\x y ->
+ case Date.Extra.compare x.from y.from of
+ z ->
+ z
+ )
+ group
+
+ findLefts instanceA =
+ ( instanceA
+ , List.foldl
+ (+)
+ 0
+ (List.map
+ (\instanceB ->
+ if instanceA == instanceB then
+ 0
+ else if (Date.Extra.equal instanceB.from instanceA.from) && (Date.Extra.equal instanceB.to instanceA.to) then
+ -- Set to 0 and then fix it further down in the code
+ 0
+ else if (Date.Extra.equal instanceB.from instanceA.from) && not (Date.Extra.equal instanceB.to instanceA.to) then
+ -- Set to 0 and then fix it further down in the code
+ 0
+ else if (Date.Extra.isBetween instanceB.from instanceB.to instanceA.from) then
+ 1
+ else
+ 0
+ )
+ sortedGroup
+ )
+ )
+
+ lefts =
+ List.map findLefts sortedGroup
+
+ numberInGroup =
+ lefts
+ |> List.map (\( _, left ) -> left)
+ |> List.maximum
+ |> Maybe.withDefault 1
+
+ fixedLefts =
+ if numberInGroup == 0 then
+ List.map
+ (\( instance, x ) ->
+ ( instance
+ , lefts
+ |> List.Extra.elemIndex ( instance, x )
+ |> Maybe.withDefault 0
+ )
+ )
+ lefts
+ else
+ lefts
+
+ fixedNumberInGroup =
+ fixedLefts
+ |> List.map (\( _, left ) -> left)
+ |> List.maximum
+ |> Maybe.withDefault 1
+ in
+ div
+ [ style
+ [ ( "display", "flex" )
+ ]
+ ]
+ (List.map (\instance -> eventInstanceBlock offset fixedNumberInGroup instance) fixedLefts)
+
+
+eventInstanceBlock : Int -> Int -> ( EventInstance, Int ) -> Html Msg
+eventInstanceBlock offset numberInGroup ( eventInstance, lefts ) =
+ let
+ length =
+ (toFloat (Date.Extra.diff Date.Extra.Minute eventInstance.from eventInstance.to)) / 15
+
+ height =
+ (toString (length * toFloat blockHeight)) ++ "px"
+
+ hourInMinutes =
+ (Date.hour eventInstance.from) * 60
+
+ minutes =
+ Date.minute eventInstance.from
+
+ topOffset =
+ ((((toFloat (hourInMinutes + minutes)) / 60)
+ - (toFloat offset)
+ )
+ * 4.0
+ * (toFloat blockHeight)
+ )
+ + (toFloat headerHeight)
+
+ width =
+ 100 / (toFloat (numberInGroup + 1))
+ in
+ a
+ [ classList
+ [ ( "event", True )
+ , ( "event-in-dayview", True )
+ ]
+ , style
+ [ ( "height", height )
+ , ( "width", (toString width) ++ "%" )
+ , ( "top", (toString topOffset) ++ "px" )
+ , ( "left", (toString (toFloat (lefts) * width)) ++ "%" )
+ , ( "background-color", eventInstance.backgroundColor )
+ , ( "color", eventInstance.forgroundColor )
+ ]
+ , href <| routeToString <| EventRoute eventInstance.eventSlug
+ ]
+ [ p [] [ text ((Date.Extra.toFormattedString "HH:mm" eventInstance.from) ++ " " ++ eventInstance.title) ]
+ ]
+
+
+gutter : List Date -> Html Msg
+gutter hours =
+ div
+ [ classList
+ [ ( "col-sm-1", True )
+ , ( "day-view-gutter", True )
+ ]
+ ]
+ ([ div [ style [ ( "height", px headerHeight ) ] ]
+ [ text ""
+ ]
+ ]
+ ++ (List.map gutterHour hours)
+ )
+
+
+gutterHour : Date -> Html Msg
+gutterHour date =
+ let
+ textToShow =
+ case Date.minute date of
+ 0 ->
+ (Date.Extra.toFormattedString "HH:mm" date)
+
+ 30 ->
+ (Date.Extra.toFormattedString "HH:mm" date)
+
+ _ ->
+ ""
+ in
+ div [ style [ ( "height", px blockHeight ) ] ]
+ [ text textToShow
+ ]
diff --git a/schedule/src/Views/EventDetail.elm b/schedule/src/Views/EventDetail.elm
new file mode 100644
index 00000000..93e35451
--- /dev/null
+++ b/schedule/src/Views/EventDetail.elm
@@ -0,0 +1,206 @@
+module Views.EventDetail exposing (eventDetailView)
+
+-- Local modules
+
+import Messages exposing (Msg(..))
+import Models exposing (..)
+import Routing exposing (routeToString)
+
+
+-- Core modules
+
+import Date
+
+
+-- External modules
+
+import Html exposing (Html, text, div, ul, li, span, i, h3, h4, a, p, hr, strong)
+import Html.Attributes exposing (class, classList, href)
+import Html.Events exposing (onClick)
+import Markdown
+import Date.Extra
+
+
+eventDetailView : EventSlug -> Model -> Html Msg
+eventDetailView eventSlug model =
+ let
+ event =
+ model.events
+ |> List.filter (\e -> e.slug == eventSlug)
+ |> List.head
+ in
+ case event of
+ Just event ->
+ div [ class "row" ]
+ [ eventDetailContent event
+ , eventDetailSidebar event model
+ ]
+
+ Nothing ->
+ div [ class "row" ]
+ [ h4 [] [ text "Event not found." ]
+ , a [ href "#" ] [ text "Click here to go the schedule overview." ]
+ ]
+
+
+eventDetailContent : Event -> Html Msg
+eventDetailContent event =
+ div [ class "col-sm-9" ]
+ [ a [ onClick BackInHistory, classList [ ( "btn", True ), ( "btn-default", True ) ] ]
+ [ i [ classList [ ( "fa", True ), ( "fa-chevron-left", True ) ] ] []
+ , text " Back"
+ ]
+ , h3 [] [ text event.title ]
+ , div [] [ Markdown.toHtml [] event.abstract ]
+ ]
+
+
+getSpeakersFromSlugs : List Speaker -> List SpeakerSlug -> List Speaker -> List Speaker
+getSpeakersFromSlugs speakers slugs collectedSpeakers =
+ case speakers of
+ [] ->
+ collectedSpeakers
+
+ speaker :: rest ->
+ let
+ foundSlug =
+ slugs
+ |> List.filter (\slug -> slug == speaker.slug)
+ |> List.head
+
+ foundSpeaker =
+ case foundSlug of
+ Just slug ->
+ [ speaker ]
+
+ Nothing ->
+ []
+
+ newSlugs =
+ case foundSlug of
+ Just slug ->
+ List.filter (\x -> x /= slug) slugs
+
+ Nothing ->
+ slugs
+
+ newCollectedSpeakers =
+ collectedSpeakers ++ foundSpeaker
+ in
+ case slugs of
+ [] ->
+ collectedSpeakers
+
+ _ ->
+ getSpeakersFromSlugs rest newSlugs newCollectedSpeakers
+
+
+eventDetailSidebar : Event -> Model -> Html Msg
+eventDetailSidebar event model =
+ let
+ videoRecordingLink =
+ case event.videoUrl of
+ Nothing ->
+ []
+
+ Just url ->
+ [ a [ href url, classList [ ( "btn", True ), ( "btn-success", True ) ] ]
+ [ i [ classList [ ( "fa", True ), ( "fa-film", True ) ] ] []
+ , text " Watch recording here!"
+ ]
+ ]
+
+ eventInstances =
+ List.filter (\instance -> instance.eventSlug == event.slug) model.eventInstances
+
+ speakers =
+ getSpeakersFromSlugs model.speakers event.speakerSlugs []
+ in
+ div
+ [ classList
+ [ ( "col-sm-3", True )
+ ]
+ ]
+ (videoRecordingLink
+ ++ [ speakerSidebar speakers
+ , eventMetaDataSidebar event
+ , eventInstancesSidebar eventInstances
+ ]
+ )
+
+
+eventMetaDataSidebar : Event -> Html Msg
+eventMetaDataSidebar event =
+ let
+ ( showVideoRecoring, videoRecording ) =
+ case event.videoState of
+ "to-be-recorded" ->
+ ( True, "Yes" )
+
+ "not-to-be-recorded" ->
+ ( True, "No" )
+
+ _ ->
+ ( False, "" )
+ in
+ div []
+ [ h4 [] [ text "Metadata" ]
+ , ul []
+ ([ li [] [ strong [] [ text "Type: " ], text event.eventType ]
+ ]
+ ++ (case showVideoRecoring of
+ True ->
+ [ li [] [ strong [] [ text "Recording: " ], text videoRecording ] ]
+
+ False ->
+ []
+ )
+ )
+ ]
+
+
+speakerSidebar : List Speaker -> Html Msg
+speakerSidebar speakers =
+ div []
+ [ h4 []
+ [ text "Speakers" ]
+ , ul
+ []
+ (List.map speakerDetail speakers)
+ ]
+
+
+speakerDetail : Speaker -> Html Msg
+speakerDetail speaker =
+ li []
+ [ a [ href <| routeToString <| SpeakerRoute speaker.slug ] [ text speaker.name ]
+ ]
+
+
+eventInstancesSidebar : List EventInstance -> Html Msg
+eventInstancesSidebar eventInstances =
+ div []
+ [ h4 []
+ [ text "This event will occur at:" ]
+ , ul
+ []
+ (List.map eventInstanceItem eventInstances)
+ ]
+
+
+eventInstanceItem : EventInstance -> Html Msg
+eventInstanceItem eventInstance =
+ let
+ toFormat =
+ if Date.day eventInstance.from == Date.day eventInstance.to then
+ "HH:mm"
+ else
+ "E HH:mm"
+ in
+ li []
+ [ text
+ ((Date.Extra.toFormattedString "E HH:mm" eventInstance.from)
+ ++ " to "
+ ++ (Date.Extra.toFormattedString toFormat eventInstance.to)
+ )
+ ]
diff --git a/schedule/src/Views/FilterView.elm b/schedule/src/Views/FilterView.elm
new file mode 100644
index 00000000..8a641868
--- /dev/null
+++ b/schedule/src/Views/FilterView.elm
@@ -0,0 +1,367 @@
+module Views.FilterView exposing (filterSidebar, applyFilters, parseFilterFromQuery, filterToQuery, maybeFilteredOverviewRoute)
+
+-- Local modules
+
+import Messages exposing (Msg(..))
+import Models exposing (Model, EventInstance, Filter, Day, FilterQuery, Route(OverviewRoute, OverviewFilteredRoute), FilterType(..), unpackFilterType, getSlugFromFilterType)
+import Routing exposing (routeToString)
+
+
+-- Core modules
+
+import Regex
+
+
+-- External modules
+
+import Html exposing (Html, text, div, ul, li, span, i, h4, small, a)
+import Html.Attributes exposing (class, classList, style, href)
+import Html.Events exposing (onClick)
+import Date.Extra exposing (Interval(..), equalBy)
+
+
+applyFilters : Day -> Model -> List EventInstance
+applyFilters day model =
+ let
+ slugs default filters =
+ List.map getSlugFromFilterType
+ (if List.isEmpty filters then
+ default
+ else
+ filters
+ )
+
+ types =
+ slugs model.eventTypes model.filter.eventTypes
+
+ locations =
+ slugs model.eventLocations model.filter.eventLocations
+
+ videoFilters =
+ slugs videoRecordingFilters model.filter.videoRecording
+
+ filteredEventInstances =
+ List.filter
+ (\eventInstance ->
+ (Date.Extra.equalBy Month eventInstance.from day.date)
+ && (Date.Extra.equalBy Date.Extra.Day eventInstance.from day.date)
+ && List.member eventInstance.location locations
+ && List.member eventInstance.eventType types
+ && List.member eventInstance.videoState videoFilters
+ )
+ model.eventInstances
+ in
+ filteredEventInstances
+
+
+filterSidebar : Model -> Html Msg
+filterSidebar model =
+ div
+ [ classList
+ [ ( "col-sm-3", True )
+ , ( "col-sm-push-9", True )
+ , ( "schedule-filter", True )
+ ]
+ ]
+ [ h4 [] [ text "Filter" ]
+ , div [ class "form-group" ]
+ [ filterView
+ "Type"
+ model.eventTypes
+ model.filter.eventTypes
+ model.eventInstances
+ .eventType
+ , filterView
+ "Location"
+ model.eventLocations
+ model.filter.eventLocations
+ model.eventInstances
+ .location
+ , filterView
+ "Video"
+ videoRecordingFilters
+ model.filter.videoRecording
+ model.eventInstances
+ .videoState
+ ]
+ , icsButton model
+ ]
+
+
+icsButton : Model -> Html Msg
+icsButton model =
+ let
+ filterString =
+ case filterToString model.filter of
+ "" ->
+ ""
+
+ filter ->
+ "?" ++ filter
+
+ icsURL =
+ model.flags.ics_button_href ++ filterString
+ in
+ a
+ [ classList
+ [ ( "btn", True )
+ , ( "btn-default", True )
+ ]
+ , href <| icsURL
+ ]
+ [ i [ classList [ ( "fa", True ), ( "fa-calendar", True ) ] ]
+ []
+ , text " ICS file with these filters"
+ ]
+
+
+videoRecordingFilters : List FilterType
+videoRecordingFilters =
+ [ VideoFilter "Will not be recorded" "not-to-be-recorded"
+ , VideoFilter "Will be recorded" "to-be-recorded"
+ , VideoFilter "Has recording" "has-recording"
+ ]
+
+
+filterView :
+ String
+ -> List FilterType
+ -> List FilterType
+ -> List EventInstance
+ -> (EventInstance -> String)
+ -> Html Msg
+filterView name possibleFilters currentFilters eventInstances slugLike =
+ div []
+ [ text (name ++ ":")
+ , ul []
+ (possibleFilters
+ |> List.map
+ (\filter ->
+ filterChoiceView
+ filter
+ currentFilters
+ eventInstances
+ slugLike
+ )
+ )
+ ]
+
+
+filterChoiceView :
+ FilterType
+ -> List FilterType
+ -> List EventInstance
+ -> (EventInstance -> String)
+ -> Html Msg
+filterChoiceView filter currentFilters eventInstances slugLike =
+ let
+ active =
+ List.member filter currentFilters
+
+ notActive =
+ not active
+
+ ( name, slug ) =
+ unpackFilterType filter
+
+ eventInstanceCount =
+ eventInstances
+ |> List.filter (\eventInstance -> slugLike eventInstance == slug)
+ |> List.length
+
+ buttonStyle =
+ case filter of
+ TypeFilter _ _ color lightText ->
+ [ style
+ [ ( "backgroundColor", color )
+ , ( "color"
+ , if lightText then
+ "#fff"
+ else
+ "#000"
+ )
+ , ( "border", "1px solid black" )
+ , ( "margin-bottom", "2px" )
+ ]
+ ]
+
+ _ ->
+ []
+
+ locationIcon =
+ case filter of
+ LocationFilter _ _ icon ->
+ [ i
+ [ classList
+ [ ( "fa", True )
+ , ( "fa-" ++ icon, True )
+ , ( "pull-right", True )
+ ]
+ ]
+ []
+ ]
+
+ _ ->
+ []
+
+ videoIcon =
+ case filter of
+ VideoFilter _ slug ->
+ let
+ icon =
+ case slug of
+ "has-recording" ->
+ "film"
+
+ "to-be-recorded" ->
+ "video-camera"
+
+ "not-to-be-recorded" ->
+ "ban"
+
+ _ ->
+ ""
+ in
+ [ i
+ [ classList
+ [ ( "fa", True )
+ , ( "fa-" ++ icon, True )
+ , ( "pull-right", True )
+ ]
+ ]
+ []
+ ]
+
+ _ ->
+ []
+ in
+ li
+ []
+ [ div
+ ([ classList
+ [ ( "btn", True )
+ , ( "btn-default", True )
+ , ( "filter-choice-active", active )
+ ]
+ , onClick (ToggleFilter filter)
+ ]
+ ++ buttonStyle
+ )
+ [ span []
+ ([ span [ classList [ ( "pull-left", True ) ] ]
+ [ i
+ [ classList
+ [ ( "fa", True )
+ , ( "fa-minus", active )
+ , ( "fa-plus", notActive )
+ ]
+ ]
+ []
+ , text (" " ++ name)
+ , small [] [ text <| " (" ++ (toString eventInstanceCount) ++ ")" ]
+ ]
+ ]
+ ++ locationIcon
+ ++ videoIcon
+ )
+ ]
+ ]
+
+
+findFilter : List FilterType -> String -> Maybe FilterType
+findFilter modelItems filterSlug =
+ List.head
+ (List.filter
+ (\x ->
+ let
+ ( _, slug ) =
+ unpackFilterType x
+ in
+ slug == filterSlug
+ )
+ modelItems
+ )
+
+
+getFilter : String -> List FilterType -> String -> List FilterType
+getFilter filterType modelItems query =
+ let
+ filterMatch =
+ query
+ |> Regex.find (Regex.AtMost 1) (Regex.regex (filterType ++ "=([\\w,_-]+)&*"))
+ |> List.concatMap .submatches
+ |> List.head
+ |> Maybe.withDefault Nothing
+ |> Maybe.withDefault ""
+
+ filterSlugs =
+ String.split "," filterMatch
+ in
+ List.filterMap (\x -> findFilter modelItems x) filterSlugs
+
+
+parseFilterFromQuery : FilterQuery -> Model -> Filter
+parseFilterFromQuery query model =
+ let
+ types =
+ getFilter "type" model.eventTypes query
+
+ locations =
+ getFilter "location" model.eventLocations query
+
+ videoFilters =
+ getFilter "video" videoRecordingFilters query
+ in
+ { eventTypes = types
+ , eventLocations = locations
+ , videoRecording = videoFilters
+ }
+
+
+filterToString : Filter -> String
+filterToString filter =
+ let
+ typePart =
+ case String.join "," (List.map getSlugFromFilterType filter.eventTypes) of
+ "" ->
+ ""
+
+ types ->
+ "type=" ++ types
+
+ locationPart =
+ case String.join "," (List.map getSlugFromFilterType filter.eventLocations) of
+ "" ->
+ ""
+
+ locations ->
+ "location=" ++ locations
+
+ videoPart =
+ case String.join "," (List.map getSlugFromFilterType filter.videoRecording) of
+ "" ->
+ ""
+
+ video ->
+ "video=" ++ video
+ in
+ String.join "&" (List.filter (\x -> x /= "") [ typePart, locationPart, videoPart ])
+
+
+filterToQuery : Filter -> FilterQuery
+filterToQuery filter =
+ let
+ result =
+ filterToString filter
+ in
+ routeToString <| OverviewFilteredRoute result
+
+
+maybeFilteredOverviewRoute : Model -> Route
+maybeFilteredOverviewRoute model =
+ case filterToString model.filter of
+ "" ->
+ OverviewRoute
+
+ query ->
+ OverviewFilteredRoute query
diff --git a/schedule/src/Views/ScheduleOverview.elm b/schedule/src/Views/ScheduleOverview.elm
new file mode 100644
index 00000000..8e1f7fe9
--- /dev/null
+++ b/schedule/src/Views/ScheduleOverview.elm
@@ -0,0 +1,104 @@
+module Views.ScheduleOverview exposing (scheduleOverviewView)
+
+-- Local modules
+
+import Messages exposing (Msg(..))
+import Models exposing (Model, Day, EventInstance, Filter, Route(EventRoute))
+import Views.FilterView exposing (filterSidebar, applyFilters, parseFilterFromQuery)
+import Routing exposing (routeToString)
+
+
+-- External modules
+
+import Html exposing (Html, text, div, ul, li, span, i, h4, p, small, a)
+import Html.Lazy exposing (lazy, lazy2)
+import Html.Attributes exposing (class, classList, href, style)
+import Date.Extra
+
+
+scheduleOverviewView : Model -> Html Msg
+scheduleOverviewView model =
+ div [ class "row" ]
+ [ filterSidebar model
+ , div
+ [ classList
+ [ ( "col-sm-9", True )
+ , ( "col-sm-pull-3", True )
+ ]
+ ]
+ (List.map (\day -> lazy2 dayRowView day model) model.days)
+ ]
+
+
+dayRowView : Day -> Model -> Html Msg
+dayRowView day model =
+ let
+ filteredEventInstances =
+ applyFilters day model
+ in
+ div []
+ [ h4 []
+ [ text day.repr ]
+ , div [ class "schedule-day-row" ]
+ (List.map (lazy dayEventInstanceView) filteredEventInstances)
+ ]
+
+
+dayEventInstanceView : EventInstance -> Html Msg
+dayEventInstanceView eventInstance =
+ a
+ [ classList
+ [ ( "event", True )
+ , ( "event-in-overview", True )
+ ]
+ , href <| routeToString <| EventRoute eventInstance.eventSlug
+ , style
+ [ ( "background-color", eventInstance.backgroundColor )
+ , ( "color", eventInstance.forgroundColor )
+ ]
+ ]
+ ([ small []
+ [ text
+ ((Date.Extra.toFormattedString "HH:mm" eventInstance.from)
+ ++ " - "
+ ++ (Date.Extra.toFormattedString "HH:mm" eventInstance.to)
+ )
+ ]
+ ]
+ ++ (dayEventInstanceIcons eventInstance)
+ ++ [ p
+ []
+ [ text eventInstance.title ]
+ ]
+ )
+
+
+dayEventInstanceIcons : EventInstance -> List (Html Msg)
+dayEventInstanceIcons eventInstance =
+ let
+ videoIcon =
+ case eventInstance.videoState of
+ "has-recording" ->
+ [ i
+ [ classList [ ( "fa", True ), ( "fa-film", True ), ( "pull-right", True ) ] ]
+ []
+ ]
+
+ "to-be-recorded" ->
+ [ i
+ [ classList [ ( "fa", True ), ( "fa-video-camera", True ), ( "pull-right", True ) ] ]
+ []
+ ]
+
+ "not-to-be-recorded" ->
+ [ i
+ [ classList [ ( "fa", True ), ( "fa-ban", True ), ( "pull-right", True ) ] ]
+ []
+ ]
+
+ _ ->
+ []
+ in
+ [ i [ classList [ ( "fa", True ), ( "fa-" ++ eventInstance.locationIcon, True ), ( "pull-right", True ) ] ] []
+ ]
+ ++ videoIcon
diff --git a/schedule/src/Views/SpeakerDetail.elm b/schedule/src/Views/SpeakerDetail.elm
new file mode 100644
index 00000000..4c13f2b7
--- /dev/null
+++ b/schedule/src/Views/SpeakerDetail.elm
@@ -0,0 +1,82 @@
+module Views.SpeakerDetail exposing (..)
+
+-- Local modules
+
+import Messages exposing (Msg(BackInHistory))
+import Models exposing (Model, SpeakerSlug, Speaker, Route(EventRoute), Event)
+import Routing exposing (routeToString)
+
+
+-- External modules
+
+import Html exposing (Html, div, text, a, i, h3, img, ul, li, p)
+import Html.Attributes exposing (classList, src, href)
+import Html.Events exposing (onClick)
+import Markdown
+
+
+speakerDetailView : SpeakerSlug -> Model -> Html Msg
+speakerDetailView speakerSlug model =
+ let
+ speaker =
+ model.speakers
+ |> List.filter (\speaker -> speaker.slug == speakerSlug)
+ |> List.head
+
+ image =
+ case speaker of
+ Just speaker ->
+ case speaker.smallPictureUrl of
+ Just smallPictureUrl ->
+ [ img [ src smallPictureUrl ] [] ]
+
+ Nothing ->
+ []
+
+ Nothing ->
+ []
+ in
+ case speaker of
+ Just speaker ->
+ div []
+ ([ a [ onClick BackInHistory, classList [ ( "btn", True ), ( "btn-default", True ) ] ]
+ [ i [ classList [ ( "fa", True ), ( "fa-chevron-left", True ) ] ] []
+ , text " Back"
+ ]
+ , h3 [] [ text speaker.name ]
+ , div [] [ Markdown.toHtml [] speaker.biography ]
+ , speakerEvents speaker model
+ ]
+ ++ image
+ )
+
+ Nothing ->
+ div [] [ text "Unknown speaker..." ]
+
+
+speakerEvents : Speaker -> Model -> Html Msg
+speakerEvents speaker model =
+ let
+ events =
+ model.events
+ |> List.filter (\event -> List.member speaker.slug event.speakerSlugs)
+ in
+ case events of
+ [] ->
+ p [] [ text "This speaker has no events!" ]
+
+ events ->
+ div []
+ [ h3 [] [ text "Events:" ]
+ , ul []
+ (List.map
+ eventItem
+ events
+ )
+ ]
+
+
+eventItem : Event -> Html Msg
+eventItem event =
+ li []
+ [ a [ href <| routeToString <| EventRoute event.slug ] [ text event.title ] ]
diff --git a/schedule/src/WebSocketCalls.elm b/schedule/src/WebSocketCalls.elm
new file mode 100644
index 00000000..3d499cff
--- /dev/null
+++ b/schedule/src/WebSocketCalls.elm
@@ -0,0 +1,23 @@
+module WebSocketCalls exposing (sendInitMessage)
+
+-- Internal modules
+
+import Messages exposing (Msg)
+
+
+-- External modules
+
+import WebSocket
+import Json.Encode
+
+
+sendInitMessage : String -> String -> Cmd Msg
+sendInitMessage camp_slug scheduleServer =
+ WebSocket.send scheduleServer
+ (Json.Encode.encode 0
+ (Json.Encode.object
+ [ ( "action", Json.Encode.string "init" )
+ , ( "camp_slug", Json.Encode.string camp_slug )
+ ]
+ )
+ )
diff --git a/src/bornhack/environment_settings.py.dist b/src/bornhack/environment_settings.py.dist
index 09b56c8f..07400c5b 100644
--- a/src/bornhack/environment_settings.py.dist
+++ b/src/bornhack/environment_settings.py.dist
@@ -68,7 +68,7 @@ BANKACCOUNT_ACCOUNT='{{ accountno }}'
TICKET_CATEGORY_NAME='Tickets'
# schedule settings
-SCHEDULE_MIDNIGHT_OFFSET_HOURS=6
+SCHEDULE_MIDNIGHT_OFFSET_HOURS=9
SCHEDULE_TIMESLOT_LENGTH_MINUTES=30
SCHEDULE_EVENT_NOTIFICATION_MINUTES=10
diff --git a/src/bornhack/settings.py b/src/bornhack/settings.py
index d8c3e20d..1ea67e0d 100644
--- a/src/bornhack/settings.py
+++ b/src/bornhack/settings.py
@@ -42,6 +42,7 @@ INSTALLED_APPS = [
'ircbot',
'teams',
'people',
+ 'tickets',
'allauth',
'allauth.account',
diff --git a/src/bornhack/urls.py b/src/bornhack/urls.py
index 1f5116b5..aa3eec00 100644
--- a/src/bornhack/urls.py
+++ b/src/bornhack/urls.py
@@ -127,16 +127,16 @@ urlpatterns = [
url(
r'^program/', include([
- url(
- r'^(?P\d{4})-(?P\d{2})-(?P\d{2})/$',
- ScheduleView.as_view(),
- name='schedule_day'
- ),
url(
r'^$',
ScheduleView.as_view(),
name='schedule_index'
),
+ url(
+ r'^noscript/$',
+ NoScriptScheduleView.as_view(),
+ name='noscript_schedule_index'
+ ),
url(
r'^ics/', ICSView.as_view(), name="ics_view"
),
diff --git a/src/program/consumers.py b/src/program/consumers.py
index 9d141e87..4c659066 100644
--- a/src/program/consumers.py
+++ b/src/program/consumers.py
@@ -1,7 +1,7 @@
from channels.generic.websockets import JsonWebsocketConsumer
from camps.models import Camp
-from .models import EventInstance, Favorite
+from .models import Event, EventInstance, Favorite, EventLocation, EventType, Speaker
class ScheduleConsumer(JsonWebsocketConsumer):
@@ -10,34 +10,52 @@ class ScheduleConsumer(JsonWebsocketConsumer):
def connection_groups(self, **kwargs):
return ['schedule_users']
- def connect(self, message, **kwargs):
- camp_slug = message.http_session['campslug']
- try:
- camp = Camp.objects.get(slug=camp_slug)
- days = list(map(
- lambda day:
- { 'repr': day.lower.strftime('%A %Y-%m-%d')
- , 'iso': day.lower.strftime('%Y-%m-%d')
- , 'day_name': day.lower.strftime('%A')
- },
- camp.get_days('camp')
- ))
- event_instances_query_set = EventInstance.objects.filter(event__camp=camp)
- event_instances = list(map(lambda x: x.to_json(user=message.user), event_instances_query_set))
- self.send({
- "accept": True,
- "event_instances": event_instances,
- "days": days,
- "action": "init"
- })
- except Camp.DoesNotExist:
- pass
-
def raw_receive(self, message, **kwargs):
content = self.decode_json(message['text'])
action = content.get('action')
data = {}
+ if action == 'init':
+ camp_slug = content.get('camp_slug')
+ try:
+ camp = Camp.objects.get(slug=camp_slug)
+ days = list(map(
+ lambda day:
+ {
+ 'repr': day.lower.strftime('%A %Y-%m-%d'),
+ 'iso': day.lower.strftime('%Y-%m-%d'),
+ 'day_name': day.lower.strftime('%A'),
+ },
+ camp.get_days('camp')
+ ))
+
+ events_query_set = Event.objects.filter(camp=camp)
+ events = list([x.serialize() for x in events_query_set])
+
+ event_instances_query_set = EventInstance.objects.filter(event__camp=camp)
+ event_instances = list([x.serialize(user=message.user) for x in event_instances_query_set])
+
+ event_locations_query_set = EventLocation.objects.filter(camp=camp)
+ event_locations = list([x.serialize() for x in event_locations_query_set])
+
+ event_types_query_set = EventType.objects.filter()
+ event_types = list([x.serialize() for x in event_types_query_set])
+
+ speakers_query_set = Speaker.objects.filter(camp=camp)
+ speakers = list([x.serialize() for x in speakers_query_set])
+
+ data = {
+ "action": "init",
+ "events": events,
+ "event_instances": event_instances,
+ "event_locations": event_locations,
+ "event_types": event_types,
+ "speakers": speakers,
+ "days": days,
+ }
+ except Camp.DoesNotExist:
+ pass
+
if action == 'favorite':
event_instance_id = content.get('event_instance_id')
event_instance = EventInstance.objects.get(id=event_instance_id)
@@ -52,7 +70,8 @@ class ScheduleConsumer(JsonWebsocketConsumer):
favorite = Favorite.objects.get(event_instance=event_instance, user=message.user)
favorite.delete()
- self.send(data)
+ if data:
+ self.send(data)
def disconnect(self, message, **kwargs):
pass
diff --git a/src/program/models.py b/src/program/models.py
index 9eb9c176..1dc7c270 100644
--- a/src/program/models.py
+++ b/src/program/models.py
@@ -14,6 +14,8 @@ from django.dispatch import receiver
from django.utils.text import slugify
from django.conf import settings
from django.core.urlresolvers import reverse_lazy
+from django.core.exceptions import ValidationError
+from django.core.urlresolvers import reverse_lazy, reverse
from django.core.files.storage import FileSystemStorage
from django.urls import reverse
from django.apps import apps
@@ -311,6 +313,13 @@ class EventLocation(CampRelatedModel):
class Meta:
unique_together = (('camp', 'slug'), ('camp', 'name'))
+ def serialize(self):
+ return {
+ "name": self.name,
+ "slug": self.slug,
+ "icon": self.icon,
+ }
+
class EventType(CreatedUpdatedModel):
""" Every event needs to have a type. """
@@ -350,6 +359,14 @@ class EventType(CreatedUpdatedModel):
def __str__(self):
return self.name
+ def serialize(self):
+ return {
+ "name": self.name,
+ "slug": self.slug,
+ "color": self.color,
+ "light_text": self.light_text,
+ }
+
class Event(CampRelatedModel):
""" Something that is on the program one or more times. """
@@ -413,6 +430,30 @@ class Event(CampRelatedModel):
def get_absolute_url(self):
return reverse_lazy('event_detail', kwargs={'camp_slug': self.camp.slug, 'slug': self.slug})
+ def serialize(self):
+ data = {
+ 'title': self.title,
+ 'slug': self.slug,
+ 'abstract': self.abstract,
+ 'speaker_slugs': [
+ speaker.slug
+ for speaker in self.speakers.all()
+ ],
+ 'event_type': self.event_type.name,
+ }
+
+ if self.video_url:
+ video_state = 'has-recording'
+ data['video_url'] = self.video_url
+ elif self.video_recording:
+ video_state = 'to-be-recorded'
+ elif not self.video_recording:
+ video_state = 'not-to-be-recorded'
+
+ data['video_state'] = video_state
+
+ return data
+
class EventInstance(CampRelatedModel):
""" An instance of an event """
@@ -475,35 +516,32 @@ class EventInstance(CampRelatedModel):
ievent['location'] = icalendar.vText(self.location.name)
return ievent
- def to_json(self, user=None):
- parser = CommonMark.Parser()
- renderer = CommonMark.HtmlRenderer()
- ast = parser.parse(self.event.abstract)
- abstract = renderer.render(ast)
-
+ def serialize(self, user=None):
data = {
'title': self.event.title,
+ 'slug': self.event.slug + '-' + str(self.id),
'event_slug': self.event.slug,
- 'abstract': abstract,
'from': self.when.lower.astimezone().isoformat(),
'to': self.when.upper.astimezone().isoformat(),
'url': str(self.event.get_absolute_url()),
'id': self.id,
- 'speakers': [
- {'name': speaker.name, 'url': str(speaker.get_absolute_url())}
- for speaker in self.event.speakers.all()
- ],
'bg-color': self.event.event_type.color,
'fg-color': '#fff' if self.event.event_type.light_text else '#000',
'event_type': self.event.event_type.slug,
'location': self.location.slug,
'location_icon': self.location.icon,
'timeslots': self.timeslots,
- 'video_recording': self.event.video_recording,
}
if self.event.video_url:
+ video_state = 'has-recording'
data['video_url'] = self.event.video_url
+ elif self.event.video_recording:
+ video_state = 'to-be-recorded'
+ elif not self.event.video_recording:
+ video_state = 'not-to-be-recorded'
+
+ data['video_state'] = video_state
if user and user.is_authenticated:
is_favorited = user.favorites.filter(event_instance=self).exists()
@@ -589,6 +627,29 @@ class Speaker(CampRelatedModel):
def get_absolute_url(self):
return reverse_lazy('speaker_detail', kwargs={'camp_slug': self.camp.slug, 'slug': self.slug})
+ def get_picture_url(self, size):
+ return reverse('speaker_picture', kwargs={'camp_slug': self.camp.slug, 'slug': self.slug, 'picture': size})
+
+ def get_small_picture_url(self):
+ return self.get_picture_url('thumbnail')
+
+ def get_large_picture_url(self):
+ return self.get_picture_url('large')
+
+
+ def serialize(self):
+ data = {
+ 'name': self.name,
+ 'slug': self.slug,
+ 'biography': self.biography,
+ }
+
+ if self.picture_small and self.picture_large:
+ data['large_picture_url'] = self.get_large_picture_url()
+ data['small_picture_url'] = self.get_small_picture_url()
+
+ return data
+
class Favorite(models.Model):
user = models.ForeignKey('auth.User', related_name='favorites')
diff --git a/src/program/static/js/elm_based_schedule.js b/src/program/static/js/elm_based_schedule.js
new file mode 100644
index 00000000..f81c3f2e
--- /dev/null
+++ b/src/program/static/js/elm_based_schedule.js
@@ -0,0 +1,16758 @@
+
+(function() {
+'use strict';
+
+function F2(fun)
+{
+ function wrapper(a) { return function(b) { return fun(a,b); }; }
+ wrapper.arity = 2;
+ wrapper.func = fun;
+ return wrapper;
+}
+
+function F3(fun)
+{
+ function wrapper(a) {
+ return function(b) { return function(c) { return fun(a, b, c); }; };
+ }
+ wrapper.arity = 3;
+ wrapper.func = fun;
+ return wrapper;
+}
+
+function F4(fun)
+{
+ function wrapper(a) { return function(b) { return function(c) {
+ return function(d) { return fun(a, b, c, d); }; }; };
+ }
+ wrapper.arity = 4;
+ wrapper.func = fun;
+ return wrapper;
+}
+
+function F5(fun)
+{
+ function wrapper(a) { return function(b) { return function(c) {
+ return function(d) { return function(e) { return fun(a, b, c, d, e); }; }; }; };
+ }
+ wrapper.arity = 5;
+ wrapper.func = fun;
+ return wrapper;
+}
+
+function F6(fun)
+{
+ function wrapper(a) { return function(b) { return function(c) {
+ return function(d) { return function(e) { return function(f) {
+ return fun(a, b, c, d, e, f); }; }; }; }; };
+ }
+ wrapper.arity = 6;
+ wrapper.func = fun;
+ return wrapper;
+}
+
+function F7(fun)
+{
+ function wrapper(a) { return function(b) { return function(c) {
+ return function(d) { return function(e) { return function(f) {
+ return function(g) { return fun(a, b, c, d, e, f, g); }; }; }; }; }; };
+ }
+ wrapper.arity = 7;
+ wrapper.func = fun;
+ return wrapper;
+}
+
+function F8(fun)
+{
+ function wrapper(a) { return function(b) { return function(c) {
+ return function(d) { return function(e) { return function(f) {
+ return function(g) { return function(h) {
+ return fun(a, b, c, d, e, f, g, h); }; }; }; }; }; }; };
+ }
+ wrapper.arity = 8;
+ wrapper.func = fun;
+ return wrapper;
+}
+
+function F9(fun)
+{
+ function wrapper(a) { return function(b) { return function(c) {
+ return function(d) { return function(e) { return function(f) {
+ return function(g) { return function(h) { return function(i) {
+ return fun(a, b, c, d, e, f, g, h, i); }; }; }; }; }; }; }; };
+ }
+ wrapper.arity = 9;
+ wrapper.func = fun;
+ return wrapper;
+}
+
+function A2(fun, a, b)
+{
+ return fun.arity === 2
+ ? fun.func(a, b)
+ : fun(a)(b);
+}
+function A3(fun, a, b, c)
+{
+ return fun.arity === 3
+ ? fun.func(a, b, c)
+ : fun(a)(b)(c);
+}
+function A4(fun, a, b, c, d)
+{
+ return fun.arity === 4
+ ? fun.func(a, b, c, d)
+ : fun(a)(b)(c)(d);
+}
+function A5(fun, a, b, c, d, e)
+{
+ return fun.arity === 5
+ ? fun.func(a, b, c, d, e)
+ : fun(a)(b)(c)(d)(e);
+}
+function A6(fun, a, b, c, d, e, f)
+{
+ return fun.arity === 6
+ ? fun.func(a, b, c, d, e, f)
+ : fun(a)(b)(c)(d)(e)(f);
+}
+function A7(fun, a, b, c, d, e, f, g)
+{
+ return fun.arity === 7
+ ? fun.func(a, b, c, d, e, f, g)
+ : fun(a)(b)(c)(d)(e)(f)(g);
+}
+function A8(fun, a, b, c, d, e, f, g, h)
+{
+ return fun.arity === 8
+ ? fun.func(a, b, c, d, e, f, g, h)
+ : fun(a)(b)(c)(d)(e)(f)(g)(h);
+}
+function A9(fun, a, b, c, d, e, f, g, h, i)
+{
+ return fun.arity === 9
+ ? fun.func(a, b, c, d, e, f, g, h, i)
+ : fun(a)(b)(c)(d)(e)(f)(g)(h)(i);
+}
+
+//import Native.List //
+
+var _elm_lang$core$Native_Array = function() {
+
+// A RRB-Tree has two distinct data types.
+// Leaf -> "height" is always 0
+// "table" is an array of elements
+// Node -> "height" is always greater than 0
+// "table" is an array of child nodes
+// "lengths" is an array of accumulated lengths of the child nodes
+
+// M is the maximal table size. 32 seems fast. E is the allowed increase
+// of search steps when concatting to find an index. Lower values will
+// decrease balancing, but will increase search steps.
+var M = 32;
+var E = 2;
+
+// An empty array.
+var empty = {
+ ctor: '_Array',
+ height: 0,
+ table: []
+};
+
+
+function get(i, array)
+{
+ if (i < 0 || i >= length(array))
+ {
+ throw new Error(
+ 'Index ' + i + ' is out of range. Check the length of ' +
+ 'your array first or use getMaybe or getWithDefault.');
+ }
+ return unsafeGet(i, array);
+}
+
+
+function unsafeGet(i, array)
+{
+ for (var x = array.height; x > 0; x--)
+ {
+ var slot = i >> (x * 5);
+ while (array.lengths[slot] <= i)
+ {
+ slot++;
+ }
+ if (slot > 0)
+ {
+ i -= array.lengths[slot - 1];
+ }
+ array = array.table[slot];
+ }
+ return array.table[i];
+}
+
+
+// Sets the value at the index i. Only the nodes leading to i will get
+// copied and updated.
+function set(i, item, array)
+{
+ if (i < 0 || length(array) <= i)
+ {
+ return array;
+ }
+ return unsafeSet(i, item, array);
+}
+
+
+function unsafeSet(i, item, array)
+{
+ array = nodeCopy(array);
+
+ if (array.height === 0)
+ {
+ array.table[i] = item;
+ }
+ else
+ {
+ var slot = getSlot(i, array);
+ if (slot > 0)
+ {
+ i -= array.lengths[slot - 1];
+ }
+ array.table[slot] = unsafeSet(i, item, array.table[slot]);
+ }
+ return array;
+}
+
+
+function initialize(len, f)
+{
+ if (len <= 0)
+ {
+ return empty;
+ }
+ var h = Math.floor( Math.log(len) / Math.log(M) );
+ return initialize_(f, h, 0, len);
+}
+
+function initialize_(f, h, from, to)
+{
+ if (h === 0)
+ {
+ var table = new Array((to - from) % (M + 1));
+ for (var i = 0; i < table.length; i++)
+ {
+ table[i] = f(from + i);
+ }
+ return {
+ ctor: '_Array',
+ height: 0,
+ table: table
+ };
+ }
+
+ var step = Math.pow(M, h);
+ var table = new Array(Math.ceil((to - from) / step));
+ var lengths = new Array(table.length);
+ for (var i = 0; i < table.length; i++)
+ {
+ table[i] = initialize_(f, h - 1, from + (i * step), Math.min(from + ((i + 1) * step), to));
+ lengths[i] = length(table[i]) + (i > 0 ? lengths[i-1] : 0);
+ }
+ return {
+ ctor: '_Array',
+ height: h,
+ table: table,
+ lengths: lengths
+ };
+}
+
+function fromList(list)
+{
+ if (list.ctor === '[]')
+ {
+ return empty;
+ }
+
+ // Allocate M sized blocks (table) and write list elements to it.
+ var table = new Array(M);
+ var nodes = [];
+ var i = 0;
+
+ while (list.ctor !== '[]')
+ {
+ table[i] = list._0;
+ list = list._1;
+ i++;
+
+ // table is full, so we can push a leaf containing it into the
+ // next node.
+ if (i === M)
+ {
+ var leaf = {
+ ctor: '_Array',
+ height: 0,
+ table: table
+ };
+ fromListPush(leaf, nodes);
+ table = new Array(M);
+ i = 0;
+ }
+ }
+
+ // Maybe there is something left on the table.
+ if (i > 0)
+ {
+ var leaf = {
+ ctor: '_Array',
+ height: 0,
+ table: table.splice(0, i)
+ };
+ fromListPush(leaf, nodes);
+ }
+
+ // Go through all of the nodes and eventually push them into higher nodes.
+ for (var h = 0; h < nodes.length - 1; h++)
+ {
+ if (nodes[h].table.length > 0)
+ {
+ fromListPush(nodes[h], nodes);
+ }
+ }
+
+ var head = nodes[nodes.length - 1];
+ if (head.height > 0 && head.table.length === 1)
+ {
+ return head.table[0];
+ }
+ else
+ {
+ return head;
+ }
+}
+
+// Push a node into a higher node as a child.
+function fromListPush(toPush, nodes)
+{
+ var h = toPush.height;
+
+ // Maybe the node on this height does not exist.
+ if (nodes.length === h)
+ {
+ var node = {
+ ctor: '_Array',
+ height: h + 1,
+ table: [],
+ lengths: []
+ };
+ nodes.push(node);
+ }
+
+ nodes[h].table.push(toPush);
+ var len = length(toPush);
+ if (nodes[h].lengths.length > 0)
+ {
+ len += nodes[h].lengths[nodes[h].lengths.length - 1];
+ }
+ nodes[h].lengths.push(len);
+
+ if (nodes[h].table.length === M)
+ {
+ fromListPush(nodes[h], nodes);
+ nodes[h] = {
+ ctor: '_Array',
+ height: h + 1,
+ table: [],
+ lengths: []
+ };
+ }
+}
+
+// Pushes an item via push_ to the bottom right of a tree.
+function push(item, a)
+{
+ var pushed = push_(item, a);
+ if (pushed !== null)
+ {
+ return pushed;
+ }
+
+ var newTree = create(item, a.height);
+ return siblise(a, newTree);
+}
+
+// Recursively tries to push an item to the bottom-right most
+// tree possible. If there is no space left for the item,
+// null will be returned.
+function push_(item, a)
+{
+ // Handle resursion stop at leaf level.
+ if (a.height === 0)
+ {
+ if (a.table.length < M)
+ {
+ var newA = {
+ ctor: '_Array',
+ height: 0,
+ table: a.table.slice()
+ };
+ newA.table.push(item);
+ return newA;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ // Recursively push
+ var pushed = push_(item, botRight(a));
+
+ // There was space in the bottom right tree, so the slot will
+ // be updated.
+ if (pushed !== null)
+ {
+ var newA = nodeCopy(a);
+ newA.table[newA.table.length - 1] = pushed;
+ newA.lengths[newA.lengths.length - 1]++;
+ return newA;
+ }
+
+ // When there was no space left, check if there is space left
+ // for a new slot with a tree which contains only the item
+ // at the bottom.
+ if (a.table.length < M)
+ {
+ var newSlot = create(item, a.height - 1);
+ var newA = nodeCopy(a);
+ newA.table.push(newSlot);
+ newA.lengths.push(newA.lengths[newA.lengths.length - 1] + length(newSlot));
+ return newA;
+ }
+ else
+ {
+ return null;
+ }
+}
+
+// Converts an array into a list of elements.
+function toList(a)
+{
+ return toList_(_elm_lang$core$Native_List.Nil, a);
+}
+
+function toList_(list, a)
+{
+ for (var i = a.table.length - 1; i >= 0; i--)
+ {
+ list =
+ a.height === 0
+ ? _elm_lang$core$Native_List.Cons(a.table[i], list)
+ : toList_(list, a.table[i]);
+ }
+ return list;
+}
+
+// Maps a function over the elements of an array.
+function map(f, a)
+{
+ var newA = {
+ ctor: '_Array',
+ height: a.height,
+ table: new Array(a.table.length)
+ };
+ if (a.height > 0)
+ {
+ newA.lengths = a.lengths;
+ }
+ for (var i = 0; i < a.table.length; i++)
+ {
+ newA.table[i] =
+ a.height === 0
+ ? f(a.table[i])
+ : map(f, a.table[i]);
+ }
+ return newA;
+}
+
+// Maps a function over the elements with their index as first argument.
+function indexedMap(f, a)
+{
+ return indexedMap_(f, a, 0);
+}
+
+function indexedMap_(f, a, from)
+{
+ var newA = {
+ ctor: '_Array',
+ height: a.height,
+ table: new Array(a.table.length)
+ };
+ if (a.height > 0)
+ {
+ newA.lengths = a.lengths;
+ }
+ for (var i = 0; i < a.table.length; i++)
+ {
+ newA.table[i] =
+ a.height === 0
+ ? A2(f, from + i, a.table[i])
+ : indexedMap_(f, a.table[i], i == 0 ? from : from + a.lengths[i - 1]);
+ }
+ return newA;
+}
+
+function foldl(f, b, a)
+{
+ if (a.height === 0)
+ {
+ for (var i = 0; i < a.table.length; i++)
+ {
+ b = A2(f, a.table[i], b);
+ }
+ }
+ else
+ {
+ for (var i = 0; i < a.table.length; i++)
+ {
+ b = foldl(f, b, a.table[i]);
+ }
+ }
+ return b;
+}
+
+function foldr(f, b, a)
+{
+ if (a.height === 0)
+ {
+ for (var i = a.table.length; i--; )
+ {
+ b = A2(f, a.table[i], b);
+ }
+ }
+ else
+ {
+ for (var i = a.table.length; i--; )
+ {
+ b = foldr(f, b, a.table[i]);
+ }
+ }
+ return b;
+}
+
+// TODO: currently, it slices the right, then the left. This can be
+// optimized.
+function slice(from, to, a)
+{
+ if (from < 0)
+ {
+ from += length(a);
+ }
+ if (to < 0)
+ {
+ to += length(a);
+ }
+ return sliceLeft(from, sliceRight(to, a));
+}
+
+function sliceRight(to, a)
+{
+ if (to === length(a))
+ {
+ return a;
+ }
+
+ // Handle leaf level.
+ if (a.height === 0)
+ {
+ var newA = { ctor:'_Array', height:0 };
+ newA.table = a.table.slice(0, to);
+ return newA;
+ }
+
+ // Slice the right recursively.
+ var right = getSlot(to, a);
+ var sliced = sliceRight(to - (right > 0 ? a.lengths[right - 1] : 0), a.table[right]);
+
+ // Maybe the a node is not even needed, as sliced contains the whole slice.
+ if (right === 0)
+ {
+ return sliced;
+ }
+
+ // Create new node.
+ var newA = {
+ ctor: '_Array',
+ height: a.height,
+ table: a.table.slice(0, right),
+ lengths: a.lengths.slice(0, right)
+ };
+ if (sliced.table.length > 0)
+ {
+ newA.table[right] = sliced;
+ newA.lengths[right] = length(sliced) + (right > 0 ? newA.lengths[right - 1] : 0);
+ }
+ return newA;
+}
+
+function sliceLeft(from, a)
+{
+ if (from === 0)
+ {
+ return a;
+ }
+
+ // Handle leaf level.
+ if (a.height === 0)
+ {
+ var newA = { ctor:'_Array', height:0 };
+ newA.table = a.table.slice(from, a.table.length + 1);
+ return newA;
+ }
+
+ // Slice the left recursively.
+ var left = getSlot(from, a);
+ var sliced = sliceLeft(from - (left > 0 ? a.lengths[left - 1] : 0), a.table[left]);
+
+ // Maybe the a node is not even needed, as sliced contains the whole slice.
+ if (left === a.table.length - 1)
+ {
+ return sliced;
+ }
+
+ // Create new node.
+ var newA = {
+ ctor: '_Array',
+ height: a.height,
+ table: a.table.slice(left, a.table.length + 1),
+ lengths: new Array(a.table.length - left)
+ };
+ newA.table[0] = sliced;
+ var len = 0;
+ for (var i = 0; i < newA.table.length; i++)
+ {
+ len += length(newA.table[i]);
+ newA.lengths[i] = len;
+ }
+
+ return newA;
+}
+
+// Appends two trees.
+function append(a,b)
+{
+ if (a.table.length === 0)
+ {
+ return b;
+ }
+ if (b.table.length === 0)
+ {
+ return a;
+ }
+
+ var c = append_(a, b);
+
+ // Check if both nodes can be crunshed together.
+ if (c[0].table.length + c[1].table.length <= M)
+ {
+ if (c[0].table.length === 0)
+ {
+ return c[1];
+ }
+ if (c[1].table.length === 0)
+ {
+ return c[0];
+ }
+
+ // Adjust .table and .lengths
+ c[0].table = c[0].table.concat(c[1].table);
+ if (c[0].height > 0)
+ {
+ var len = length(c[0]);
+ for (var i = 0; i < c[1].lengths.length; i++)
+ {
+ c[1].lengths[i] += len;
+ }
+ c[0].lengths = c[0].lengths.concat(c[1].lengths);
+ }
+
+ return c[0];
+ }
+
+ if (c[0].height > 0)
+ {
+ var toRemove = calcToRemove(a, b);
+ if (toRemove > E)
+ {
+ c = shuffle(c[0], c[1], toRemove);
+ }
+ }
+
+ return siblise(c[0], c[1]);
+}
+
+// Returns an array of two nodes; right and left. One node _may_ be empty.
+function append_(a, b)
+{
+ if (a.height === 0 && b.height === 0)
+ {
+ return [a, b];
+ }
+
+ if (a.height !== 1 || b.height !== 1)
+ {
+ if (a.height === b.height)
+ {
+ a = nodeCopy(a);
+ b = nodeCopy(b);
+ var appended = append_(botRight(a), botLeft(b));
+
+ insertRight(a, appended[1]);
+ insertLeft(b, appended[0]);
+ }
+ else if (a.height > b.height)
+ {
+ a = nodeCopy(a);
+ var appended = append_(botRight(a), b);
+
+ insertRight(a, appended[0]);
+ b = parentise(appended[1], appended[1].height + 1);
+ }
+ else
+ {
+ b = nodeCopy(b);
+ var appended = append_(a, botLeft(b));
+
+ var left = appended[0].table.length === 0 ? 0 : 1;
+ var right = left === 0 ? 1 : 0;
+ insertLeft(b, appended[left]);
+ a = parentise(appended[right], appended[right].height + 1);
+ }
+ }
+
+ // Check if balancing is needed and return based on that.
+ if (a.table.length === 0 || b.table.length === 0)
+ {
+ return [a, b];
+ }
+
+ var toRemove = calcToRemove(a, b);
+ if (toRemove <= E)
+ {
+ return [a, b];
+ }
+ return shuffle(a, b, toRemove);
+}
+
+// Helperfunctions for append_. Replaces a child node at the side of the parent.
+function insertRight(parent, node)
+{
+ var index = parent.table.length - 1;
+ parent.table[index] = node;
+ parent.lengths[index] = length(node);
+ parent.lengths[index] += index > 0 ? parent.lengths[index - 1] : 0;
+}
+
+function insertLeft(parent, node)
+{
+ if (node.table.length > 0)
+ {
+ parent.table[0] = node;
+ parent.lengths[0] = length(node);
+
+ var len = length(parent.table[0]);
+ for (var i = 1; i < parent.lengths.length; i++)
+ {
+ len += length(parent.table[i]);
+ parent.lengths[i] = len;
+ }
+ }
+ else
+ {
+ parent.table.shift();
+ for (var i = 1; i < parent.lengths.length; i++)
+ {
+ parent.lengths[i] = parent.lengths[i] - parent.lengths[0];
+ }
+ parent.lengths.shift();
+ }
+}
+
+// Returns the extra search steps for E. Refer to the paper.
+function calcToRemove(a, b)
+{
+ var subLengths = 0;
+ for (var i = 0; i < a.table.length; i++)
+ {
+ subLengths += a.table[i].table.length;
+ }
+ for (var i = 0; i < b.table.length; i++)
+ {
+ subLengths += b.table[i].table.length;
+ }
+
+ var toRemove = a.table.length + b.table.length;
+ return toRemove - (Math.floor((subLengths - 1) / M) + 1);
+}
+
+// get2, set2 and saveSlot are helpers for accessing elements over two arrays.
+function get2(a, b, index)
+{
+ return index < a.length
+ ? a[index]
+ : b[index - a.length];
+}
+
+function set2(a, b, index, value)
+{
+ if (index < a.length)
+ {
+ a[index] = value;
+ }
+ else
+ {
+ b[index - a.length] = value;
+ }
+}
+
+function saveSlot(a, b, index, slot)
+{
+ set2(a.table, b.table, index, slot);
+
+ var l = (index === 0 || index === a.lengths.length)
+ ? 0
+ : get2(a.lengths, a.lengths, index - 1);
+
+ set2(a.lengths, b.lengths, index, l + length(slot));
+}
+
+// Creates a node or leaf with a given length at their arrays for perfomance.
+// Is only used by shuffle.
+function createNode(h, length)
+{
+ if (length < 0)
+ {
+ length = 0;
+ }
+ var a = {
+ ctor: '_Array',
+ height: h,
+ table: new Array(length)
+ };
+ if (h > 0)
+ {
+ a.lengths = new Array(length);
+ }
+ return a;
+}
+
+// Returns an array of two balanced nodes.
+function shuffle(a, b, toRemove)
+{
+ var newA = createNode(a.height, Math.min(M, a.table.length + b.table.length - toRemove));
+ var newB = createNode(a.height, newA.table.length - (a.table.length + b.table.length - toRemove));
+
+ // Skip the slots with size M. More precise: copy the slot references
+ // to the new node
+ var read = 0;
+ while (get2(a.table, b.table, read).table.length % M === 0)
+ {
+ set2(newA.table, newB.table, read, get2(a.table, b.table, read));
+ set2(newA.lengths, newB.lengths, read, get2(a.lengths, b.lengths, read));
+ read++;
+ }
+
+ // Pulling items from left to right, caching in a slot before writing
+ // it into the new nodes.
+ var write = read;
+ var slot = new createNode(a.height - 1, 0);
+ var from = 0;
+
+ // If the current slot is still containing data, then there will be at
+ // least one more write, so we do not break this loop yet.
+ while (read - write - (slot.table.length > 0 ? 1 : 0) < toRemove)
+ {
+ // Find out the max possible items for copying.
+ var source = get2(a.table, b.table, read);
+ var to = Math.min(M - slot.table.length, source.table.length);
+
+ // Copy and adjust size table.
+ slot.table = slot.table.concat(source.table.slice(from, to));
+ if (slot.height > 0)
+ {
+ var len = slot.lengths.length;
+ for (var i = len; i < len + to - from; i++)
+ {
+ slot.lengths[i] = length(slot.table[i]);
+ slot.lengths[i] += (i > 0 ? slot.lengths[i - 1] : 0);
+ }
+ }
+
+ from += to;
+
+ // Only proceed to next slots[i] if the current one was
+ // fully copied.
+ if (source.table.length <= to)
+ {
+ read++; from = 0;
+ }
+
+ // Only create a new slot if the current one is filled up.
+ if (slot.table.length === M)
+ {
+ saveSlot(newA, newB, write, slot);
+ slot = createNode(a.height - 1, 0);
+ write++;
+ }
+ }
+
+ // Cleanup after the loop. Copy the last slot into the new nodes.
+ if (slot.table.length > 0)
+ {
+ saveSlot(newA, newB, write, slot);
+ write++;
+ }
+
+ // Shift the untouched slots to the left
+ while (read < a.table.length + b.table.length )
+ {
+ saveSlot(newA, newB, write, get2(a.table, b.table, read));
+ read++;
+ write++;
+ }
+
+ return [newA, newB];
+}
+
+// Navigation functions
+function botRight(a)
+{
+ return a.table[a.table.length - 1];
+}
+function botLeft(a)
+{
+ return a.table[0];
+}
+
+// Copies a node for updating. Note that you should not use this if
+// only updating only one of "table" or "lengths" for performance reasons.
+function nodeCopy(a)
+{
+ var newA = {
+ ctor: '_Array',
+ height: a.height,
+ table: a.table.slice()
+ };
+ if (a.height > 0)
+ {
+ newA.lengths = a.lengths.slice();
+ }
+ return newA;
+}
+
+// Returns how many items are in the tree.
+function length(array)
+{
+ if (array.height === 0)
+ {
+ return array.table.length;
+ }
+ else
+ {
+ return array.lengths[array.lengths.length - 1];
+ }
+}
+
+// Calculates in which slot of "table" the item probably is, then
+// find the exact slot via forward searching in "lengths". Returns the index.
+function getSlot(i, a)
+{
+ var slot = i >> (5 * a.height);
+ while (a.lengths[slot] <= i)
+ {
+ slot++;
+ }
+ return slot;
+}
+
+// Recursively creates a tree with a given height containing
+// only the given item.
+function create(item, h)
+{
+ if (h === 0)
+ {
+ return {
+ ctor: '_Array',
+ height: 0,
+ table: [item]
+ };
+ }
+ return {
+ ctor: '_Array',
+ height: h,
+ table: [create(item, h - 1)],
+ lengths: [1]
+ };
+}
+
+// Recursively creates a tree that contains the given tree.
+function parentise(tree, h)
+{
+ if (h === tree.height)
+ {
+ return tree;
+ }
+
+ return {
+ ctor: '_Array',
+ height: h,
+ table: [parentise(tree, h - 1)],
+ lengths: [length(tree)]
+ };
+}
+
+// Emphasizes blood brotherhood beneath two trees.
+function siblise(a, b)
+{
+ return {
+ ctor: '_Array',
+ height: a.height + 1,
+ table: [a, b],
+ lengths: [length(a), length(a) + length(b)]
+ };
+}
+
+function toJSArray(a)
+{
+ var jsArray = new Array(length(a));
+ toJSArray_(jsArray, 0, a);
+ return jsArray;
+}
+
+function toJSArray_(jsArray, i, a)
+{
+ for (var t = 0; t < a.table.length; t++)
+ {
+ if (a.height === 0)
+ {
+ jsArray[i + t] = a.table[t];
+ }
+ else
+ {
+ var inc = t === 0 ? 0 : a.lengths[t - 1];
+ toJSArray_(jsArray, i + inc, a.table[t]);
+ }
+ }
+}
+
+function fromJSArray(jsArray)
+{
+ if (jsArray.length === 0)
+ {
+ return empty;
+ }
+ var h = Math.floor(Math.log(jsArray.length) / Math.log(M));
+ return fromJSArray_(jsArray, h, 0, jsArray.length);
+}
+
+function fromJSArray_(jsArray, h, from, to)
+{
+ if (h === 0)
+ {
+ return {
+ ctor: '_Array',
+ height: 0,
+ table: jsArray.slice(from, to)
+ };
+ }
+
+ var step = Math.pow(M, h);
+ var table = new Array(Math.ceil((to - from) / step));
+ var lengths = new Array(table.length);
+ for (var i = 0; i < table.length; i++)
+ {
+ table[i] = fromJSArray_(jsArray, h - 1, from + (i * step), Math.min(from + ((i + 1) * step), to));
+ lengths[i] = length(table[i]) + (i > 0 ? lengths[i - 1] : 0);
+ }
+ return {
+ ctor: '_Array',
+ height: h,
+ table: table,
+ lengths: lengths
+ };
+}
+
+return {
+ empty: empty,
+ fromList: fromList,
+ toList: toList,
+ initialize: F2(initialize),
+ append: F2(append),
+ push: F2(push),
+ slice: F3(slice),
+ get: F2(get),
+ set: F3(set),
+ map: F2(map),
+ indexedMap: F2(indexedMap),
+ foldl: F3(foldl),
+ foldr: F3(foldr),
+ length: length,
+
+ toJSArray: toJSArray,
+ fromJSArray: fromJSArray
+};
+
+}();
+//import Native.Utils //
+
+var _elm_lang$core$Native_Basics = function() {
+
+function div(a, b)
+{
+ return (a / b) | 0;
+}
+function rem(a, b)
+{
+ return a % b;
+}
+function mod(a, b)
+{
+ if (b === 0)
+ {
+ throw new Error('Cannot perform mod 0. Division by zero error.');
+ }
+ var r = a % b;
+ var m = a === 0 ? 0 : (b > 0 ? (a >= 0 ? r : r + b) : -mod(-a, -b));
+
+ return m === b ? 0 : m;
+}
+function logBase(base, n)
+{
+ return Math.log(n) / Math.log(base);
+}
+function negate(n)
+{
+ return -n;
+}
+function abs(n)
+{
+ return n < 0 ? -n : n;
+}
+
+function min(a, b)
+{
+ return _elm_lang$core$Native_Utils.cmp(a, b) < 0 ? a : b;
+}
+function max(a, b)
+{
+ return _elm_lang$core$Native_Utils.cmp(a, b) > 0 ? a : b;
+}
+function clamp(lo, hi, n)
+{
+ return _elm_lang$core$Native_Utils.cmp(n, lo) < 0
+ ? lo
+ : _elm_lang$core$Native_Utils.cmp(n, hi) > 0
+ ? hi
+ : n;
+}
+
+var ord = ['LT', 'EQ', 'GT'];
+
+function compare(x, y)
+{
+ return { ctor: ord[_elm_lang$core$Native_Utils.cmp(x, y) + 1] };
+}
+
+function xor(a, b)
+{
+ return a !== b;
+}
+function not(b)
+{
+ return !b;
+}
+function isInfinite(n)
+{
+ return n === Infinity || n === -Infinity;
+}
+
+function truncate(n)
+{
+ return n | 0;
+}
+
+function degrees(d)
+{
+ return d * Math.PI / 180;
+}
+function turns(t)
+{
+ return 2 * Math.PI * t;
+}
+function fromPolar(point)
+{
+ var r = point._0;
+ var t = point._1;
+ return _elm_lang$core$Native_Utils.Tuple2(r * Math.cos(t), r * Math.sin(t));
+}
+function toPolar(point)
+{
+ var x = point._0;
+ var y = point._1;
+ return _elm_lang$core$Native_Utils.Tuple2(Math.sqrt(x * x + y * y), Math.atan2(y, x));
+}
+
+return {
+ div: F2(div),
+ rem: F2(rem),
+ mod: F2(mod),
+
+ pi: Math.PI,
+ e: Math.E,
+ cos: Math.cos,
+ sin: Math.sin,
+ tan: Math.tan,
+ acos: Math.acos,
+ asin: Math.asin,
+ atan: Math.atan,
+ atan2: F2(Math.atan2),
+
+ degrees: degrees,
+ turns: turns,
+ fromPolar: fromPolar,
+ toPolar: toPolar,
+
+ sqrt: Math.sqrt,
+ logBase: F2(logBase),
+ negate: negate,
+ abs: abs,
+ min: F2(min),
+ max: F2(max),
+ clamp: F3(clamp),
+ compare: F2(compare),
+
+ xor: F2(xor),
+ not: not,
+
+ truncate: truncate,
+ ceiling: Math.ceil,
+ floor: Math.floor,
+ round: Math.round,
+ toFloat: function(x) { return x; },
+ isNaN: isNaN,
+ isInfinite: isInfinite
+};
+
+}();
+//import //
+
+var _elm_lang$core$Native_Utils = function() {
+
+// COMPARISONS
+
+function eq(x, y)
+{
+ var stack = [];
+ var isEqual = eqHelp(x, y, 0, stack);
+ var pair;
+ while (isEqual && (pair = stack.pop()))
+ {
+ isEqual = eqHelp(pair.x, pair.y, 0, stack);
+ }
+ return isEqual;
+}
+
+
+function eqHelp(x, y, depth, stack)
+{
+ if (depth > 100)
+ {
+ stack.push({ x: x, y: y });
+ return true;
+ }
+
+ if (x === y)
+ {
+ return true;
+ }
+
+ if (typeof x !== 'object')
+ {
+ if (typeof x === 'function')
+ {
+ throw new Error(
+ 'Trying to use `(==)` on functions. There is no way to know if functions are "the same" in the Elm sense.'
+ + ' Read more about this at http://package.elm-lang.org/packages/elm-lang/core/latest/Basics#=='
+ + ' which describes why it is this way and what the better version will look like.'
+ );
+ }
+ return false;
+ }
+
+ if (x === null || y === null)
+ {
+ return false
+ }
+
+ if (x instanceof Date)
+ {
+ return x.getTime() === y.getTime();
+ }
+
+ if (!('ctor' in x))
+ {
+ for (var key in x)
+ {
+ if (!eqHelp(x[key], y[key], depth + 1, stack))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ // convert Dicts and Sets to lists
+ if (x.ctor === 'RBNode_elm_builtin' || x.ctor === 'RBEmpty_elm_builtin')
+ {
+ x = _elm_lang$core$Dict$toList(x);
+ y = _elm_lang$core$Dict$toList(y);
+ }
+ if (x.ctor === 'Set_elm_builtin')
+ {
+ x = _elm_lang$core$Set$toList(x);
+ y = _elm_lang$core$Set$toList(y);
+ }
+
+ // check if lists are equal without recursion
+ if (x.ctor === '::')
+ {
+ var a = x;
+ var b = y;
+ while (a.ctor === '::' && b.ctor === '::')
+ {
+ if (!eqHelp(a._0, b._0, depth + 1, stack))
+ {
+ return false;
+ }
+ a = a._1;
+ b = b._1;
+ }
+ return a.ctor === b.ctor;
+ }
+
+ // check if Arrays are equal
+ if (x.ctor === '_Array')
+ {
+ var xs = _elm_lang$core$Native_Array.toJSArray(x);
+ var ys = _elm_lang$core$Native_Array.toJSArray(y);
+ if (xs.length !== ys.length)
+ {
+ return false;
+ }
+ for (var i = 0; i < xs.length; i++)
+ {
+ if (!eqHelp(xs[i], ys[i], depth + 1, stack))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ if (!eqHelp(x.ctor, y.ctor, depth + 1, stack))
+ {
+ return false;
+ }
+
+ for (var key in x)
+ {
+ if (!eqHelp(x[key], y[key], depth + 1, stack))
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+// Code in Generate/JavaScript.hs, Basics.js, and List.js depends on
+// the particular integer values assigned to LT, EQ, and GT.
+
+var LT = -1, EQ = 0, GT = 1;
+
+function cmp(x, y)
+{
+ if (typeof x !== 'object')
+ {
+ return x === y ? EQ : x < y ? LT : GT;
+ }
+
+ if (x instanceof String)
+ {
+ var a = x.valueOf();
+ var b = y.valueOf();
+ return a === b ? EQ : a < b ? LT : GT;
+ }
+
+ if (x.ctor === '::' || x.ctor === '[]')
+ {
+ while (x.ctor === '::' && y.ctor === '::')
+ {
+ var ord = cmp(x._0, y._0);
+ if (ord !== EQ)
+ {
+ return ord;
+ }
+ x = x._1;
+ y = y._1;
+ }
+ return x.ctor === y.ctor ? EQ : x.ctor === '[]' ? LT : GT;
+ }
+
+ if (x.ctor.slice(0, 6) === '_Tuple')
+ {
+ var ord;
+ var n = x.ctor.slice(6) - 0;
+ var err = 'cannot compare tuples with more than 6 elements.';
+ if (n === 0) return EQ;
+ if (n >= 1) { ord = cmp(x._0, y._0); if (ord !== EQ) return ord;
+ if (n >= 2) { ord = cmp(x._1, y._1); if (ord !== EQ) return ord;
+ if (n >= 3) { ord = cmp(x._2, y._2); if (ord !== EQ) return ord;
+ if (n >= 4) { ord = cmp(x._3, y._3); if (ord !== EQ) return ord;
+ if (n >= 5) { ord = cmp(x._4, y._4); if (ord !== EQ) return ord;
+ if (n >= 6) { ord = cmp(x._5, y._5); if (ord !== EQ) return ord;
+ if (n >= 7) throw new Error('Comparison error: ' + err); } } } } } }
+ return EQ;
+ }
+
+ throw new Error(
+ 'Comparison error: comparison is only defined on ints, '
+ + 'floats, times, chars, strings, lists of comparable values, '
+ + 'and tuples of comparable values.'
+ );
+}
+
+
+// COMMON VALUES
+
+var Tuple0 = {
+ ctor: '_Tuple0'
+};
+
+function Tuple2(x, y)
+{
+ return {
+ ctor: '_Tuple2',
+ _0: x,
+ _1: y
+ };
+}
+
+function chr(c)
+{
+ return new String(c);
+}
+
+
+// GUID
+
+var count = 0;
+function guid(_)
+{
+ return count++;
+}
+
+
+// RECORDS
+
+function 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;
+}
+
+
+//// LIST STUFF ////
+
+var Nil = { ctor: '[]' };
+
+function Cons(hd, tl)
+{
+ return {
+ ctor: '::',
+ _0: hd,
+ _1: tl
+ };
+}
+
+function append(xs, ys)
+{
+ // append Strings
+ if (typeof xs === 'string')
+ {
+ return xs + ys;
+ }
+
+ // append Lists
+ if (xs.ctor === '[]')
+ {
+ return ys;
+ }
+ var root = Cons(xs._0, Nil);
+ var curr = root;
+ xs = xs._1;
+ while (xs.ctor !== '[]')
+ {
+ curr._1 = Cons(xs._0, Nil);
+ xs = xs._1;
+ curr = curr._1;
+ }
+ curr._1 = ys;
+ return root;
+}
+
+
+// CRASHES
+
+function crash(moduleName, region)
+{
+ return function(message) {
+ throw new Error(
+ 'Ran into a `Debug.crash` in module `' + moduleName + '` ' + regionToString(region) + '\n'
+ + 'The message provided by the code author is:\n\n '
+ + message
+ );
+ };
+}
+
+function crashCase(moduleName, region, value)
+{
+ return function(message) {
+ throw new Error(
+ 'Ran into a `Debug.crash` in module `' + moduleName + '`\n\n'
+ + 'This was caused by the `case` expression ' + regionToString(region) + '.\n'
+ + 'One of the branches ended with a crash and the following value got through:\n\n ' + toString(value) + '\n\n'
+ + 'The message provided by the code author is:\n\n '
+ + message
+ );
+ };
+}
+
+function regionToString(region)
+{
+ if (region.start.line == region.end.line)
+ {
+ return 'on line ' + region.start.line;
+ }
+ return 'between lines ' + region.start.line + ' and ' + region.end.line;
+}
+
+
+// TO STRING
+
+function toString(v)
+{
+ var type = typeof v;
+ if (type === 'function')
+ {
+ return '';
+ }
+
+ if (type === 'boolean')
+ {
+ return v ? 'True' : 'False';
+ }
+
+ if (type === 'number')
+ {
+ return v + '';
+ }
+
+ if (v instanceof String)
+ {
+ return '\'' + addSlashes(v, true) + '\'';
+ }
+
+ if (type === 'string')
+ {
+ return '"' + addSlashes(v, false) + '"';
+ }
+
+ if (v === null)
+ {
+ return 'null';
+ }
+
+ if (type === 'object' && 'ctor' in v)
+ {
+ var ctorStarter = v.ctor.substring(0, 5);
+
+ if (ctorStarter === '_Tupl')
+ {
+ var output = [];
+ for (var k in v)
+ {
+ if (k === 'ctor') continue;
+ output.push(toString(v[k]));
+ }
+ return '(' + output.join(',') + ')';
+ }
+
+ if (ctorStarter === '_Task')
+ {
+ return ''
+ }
+
+ if (v.ctor === '_Array')
+ {
+ var list = _elm_lang$core$Array$toList(v);
+ return 'Array.fromList ' + toString(list);
+ }
+
+ if (v.ctor === '')
+ {
+ return '';
+ }
+
+ if (v.ctor === '_Process')
+ {
+ return '';
+ }
+
+ if (v.ctor === '::')
+ {
+ var output = '[' + toString(v._0);
+ v = v._1;
+ while (v.ctor === '::')
+ {
+ output += ',' + toString(v._0);
+ v = v._1;
+ }
+ return output + ']';
+ }
+
+ if (v.ctor === '[]')
+ {
+ return '[]';
+ }
+
+ if (v.ctor === 'Set_elm_builtin')
+ {
+ return 'Set.fromList ' + toString(_elm_lang$core$Set$toList(v));
+ }
+
+ if (v.ctor === 'RBNode_elm_builtin' || v.ctor === 'RBEmpty_elm_builtin')
+ {
+ return 'Dict.fromList ' + toString(_elm_lang$core$Dict$toList(v));
+ }
+
+ var output = '';
+ for (var i in v)
+ {
+ if (i === 'ctor') continue;
+ var str = toString(v[i]);
+ var c0 = str[0];
+ var parenless = c0 === '{' || c0 === '(' || c0 === '<' || c0 === '"' || str.indexOf(' ') < 0;
+ output += ' ' + (parenless ? str : '(' + str + ')');
+ }
+ return v.ctor + output;
+ }
+
+ if (type === 'object')
+ {
+ if (v instanceof Date)
+ {
+ return '<' + v.toString() + '>';
+ }
+
+ if (v.elm_web_socket)
+ {
+ return '';
+ }
+
+ var output = [];
+ for (var k in v)
+ {
+ output.push(k + ' = ' + toString(v[k]));
+ }
+ if (output.length === 0)
+ {
+ return '{}';
+ }
+ return '{ ' + output.join(', ') + ' }';
+ }
+
+ return '';
+}
+
+function 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, '\\"');
+ }
+}
+
+
+return {
+ eq: eq,
+ cmp: cmp,
+ Tuple0: Tuple0,
+ Tuple2: Tuple2,
+ chr: chr,
+ update: update,
+ guid: guid,
+
+ append: F2(append),
+
+ crash: crash,
+ crashCase: crashCase,
+
+ toString: toString
+};
+
+}();
+var _elm_lang$core$Basics$never = function (_p0) {
+ never:
+ while (true) {
+ var _p1 = _p0;
+ var _v1 = _p1._0;
+ _p0 = _v1;
+ continue never;
+ }
+};
+var _elm_lang$core$Basics$uncurry = F2(
+ function (f, _p2) {
+ var _p3 = _p2;
+ return A2(f, _p3._0, _p3._1);
+ });
+var _elm_lang$core$Basics$curry = F3(
+ function (f, a, b) {
+ return f(
+ {ctor: '_Tuple2', _0: a, _1: b});
+ });
+var _elm_lang$core$Basics$flip = F3(
+ function (f, b, a) {
+ return A2(f, a, b);
+ });
+var _elm_lang$core$Basics$always = F2(
+ function (a, _p4) {
+ return a;
+ });
+var _elm_lang$core$Basics$identity = function (x) {
+ return x;
+};
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['<|'] = F2(
+ function (f, x) {
+ return f(x);
+ });
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['|>'] = F2(
+ function (x, f) {
+ return f(x);
+ });
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['>>'] = F3(
+ function (f, g, x) {
+ return g(
+ f(x));
+ });
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['<<'] = F3(
+ function (g, f, x) {
+ return g(
+ f(x));
+ });
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['++'] = _elm_lang$core$Native_Utils.append;
+var _elm_lang$core$Basics$toString = _elm_lang$core$Native_Utils.toString;
+var _elm_lang$core$Basics$isInfinite = _elm_lang$core$Native_Basics.isInfinite;
+var _elm_lang$core$Basics$isNaN = _elm_lang$core$Native_Basics.isNaN;
+var _elm_lang$core$Basics$toFloat = _elm_lang$core$Native_Basics.toFloat;
+var _elm_lang$core$Basics$ceiling = _elm_lang$core$Native_Basics.ceiling;
+var _elm_lang$core$Basics$floor = _elm_lang$core$Native_Basics.floor;
+var _elm_lang$core$Basics$truncate = _elm_lang$core$Native_Basics.truncate;
+var _elm_lang$core$Basics$round = _elm_lang$core$Native_Basics.round;
+var _elm_lang$core$Basics$not = _elm_lang$core$Native_Basics.not;
+var _elm_lang$core$Basics$xor = _elm_lang$core$Native_Basics.xor;
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['||'] = _elm_lang$core$Native_Basics.or;
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['&&'] = _elm_lang$core$Native_Basics.and;
+var _elm_lang$core$Basics$max = _elm_lang$core$Native_Basics.max;
+var _elm_lang$core$Basics$min = _elm_lang$core$Native_Basics.min;
+var _elm_lang$core$Basics$compare = _elm_lang$core$Native_Basics.compare;
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['>='] = _elm_lang$core$Native_Basics.ge;
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['<='] = _elm_lang$core$Native_Basics.le;
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['>'] = _elm_lang$core$Native_Basics.gt;
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['<'] = _elm_lang$core$Native_Basics.lt;
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['/='] = _elm_lang$core$Native_Basics.neq;
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['=='] = _elm_lang$core$Native_Basics.eq;
+var _elm_lang$core$Basics$e = _elm_lang$core$Native_Basics.e;
+var _elm_lang$core$Basics$pi = _elm_lang$core$Native_Basics.pi;
+var _elm_lang$core$Basics$clamp = _elm_lang$core$Native_Basics.clamp;
+var _elm_lang$core$Basics$logBase = _elm_lang$core$Native_Basics.logBase;
+var _elm_lang$core$Basics$abs = _elm_lang$core$Native_Basics.abs;
+var _elm_lang$core$Basics$negate = _elm_lang$core$Native_Basics.negate;
+var _elm_lang$core$Basics$sqrt = _elm_lang$core$Native_Basics.sqrt;
+var _elm_lang$core$Basics$atan2 = _elm_lang$core$Native_Basics.atan2;
+var _elm_lang$core$Basics$atan = _elm_lang$core$Native_Basics.atan;
+var _elm_lang$core$Basics$asin = _elm_lang$core$Native_Basics.asin;
+var _elm_lang$core$Basics$acos = _elm_lang$core$Native_Basics.acos;
+var _elm_lang$core$Basics$tan = _elm_lang$core$Native_Basics.tan;
+var _elm_lang$core$Basics$sin = _elm_lang$core$Native_Basics.sin;
+var _elm_lang$core$Basics$cos = _elm_lang$core$Native_Basics.cos;
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['^'] = _elm_lang$core$Native_Basics.exp;
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['%'] = _elm_lang$core$Native_Basics.mod;
+var _elm_lang$core$Basics$rem = _elm_lang$core$Native_Basics.rem;
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['//'] = _elm_lang$core$Native_Basics.div;
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['/'] = _elm_lang$core$Native_Basics.floatDiv;
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['*'] = _elm_lang$core$Native_Basics.mul;
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['-'] = _elm_lang$core$Native_Basics.sub;
+var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {};
+_elm_lang$core$Basics_ops['+'] = _elm_lang$core$Native_Basics.add;
+var _elm_lang$core$Basics$toPolar = _elm_lang$core$Native_Basics.toPolar;
+var _elm_lang$core$Basics$fromPolar = _elm_lang$core$Native_Basics.fromPolar;
+var _elm_lang$core$Basics$turns = _elm_lang$core$Native_Basics.turns;
+var _elm_lang$core$Basics$degrees = _elm_lang$core$Native_Basics.degrees;
+var _elm_lang$core$Basics$radians = function (t) {
+ return t;
+};
+var _elm_lang$core$Basics$GT = {ctor: 'GT'};
+var _elm_lang$core$Basics$EQ = {ctor: 'EQ'};
+var _elm_lang$core$Basics$LT = {ctor: 'LT'};
+var _elm_lang$core$Basics$JustOneMore = function (a) {
+ return {ctor: 'JustOneMore', _0: a};
+};
+
+var _elm_lang$core$Maybe$withDefault = F2(
+ function ($default, maybe) {
+ var _p0 = maybe;
+ if (_p0.ctor === 'Just') {
+ return _p0._0;
+ } else {
+ return $default;
+ }
+ });
+var _elm_lang$core$Maybe$Nothing = {ctor: 'Nothing'};
+var _elm_lang$core$Maybe$andThen = F2(
+ function (callback, maybeValue) {
+ var _p1 = maybeValue;
+ if (_p1.ctor === 'Just') {
+ return callback(_p1._0);
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+ });
+var _elm_lang$core$Maybe$Just = function (a) {
+ return {ctor: 'Just', _0: a};
+};
+var _elm_lang$core$Maybe$map = F2(
+ function (f, maybe) {
+ var _p2 = maybe;
+ if (_p2.ctor === 'Just') {
+ return _elm_lang$core$Maybe$Just(
+ f(_p2._0));
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+ });
+var _elm_lang$core$Maybe$map2 = F3(
+ function (func, ma, mb) {
+ var _p3 = {ctor: '_Tuple2', _0: ma, _1: mb};
+ if (((_p3.ctor === '_Tuple2') && (_p3._0.ctor === 'Just')) && (_p3._1.ctor === 'Just')) {
+ return _elm_lang$core$Maybe$Just(
+ A2(func, _p3._0._0, _p3._1._0));
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+ });
+var _elm_lang$core$Maybe$map3 = F4(
+ function (func, ma, mb, mc) {
+ var _p4 = {ctor: '_Tuple3', _0: ma, _1: mb, _2: mc};
+ if ((((_p4.ctor === '_Tuple3') && (_p4._0.ctor === 'Just')) && (_p4._1.ctor === 'Just')) && (_p4._2.ctor === 'Just')) {
+ return _elm_lang$core$Maybe$Just(
+ A3(func, _p4._0._0, _p4._1._0, _p4._2._0));
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+ });
+var _elm_lang$core$Maybe$map4 = F5(
+ function (func, ma, mb, mc, md) {
+ var _p5 = {ctor: '_Tuple4', _0: ma, _1: mb, _2: mc, _3: md};
+ if (((((_p5.ctor === '_Tuple4') && (_p5._0.ctor === 'Just')) && (_p5._1.ctor === 'Just')) && (_p5._2.ctor === 'Just')) && (_p5._3.ctor === 'Just')) {
+ return _elm_lang$core$Maybe$Just(
+ A4(func, _p5._0._0, _p5._1._0, _p5._2._0, _p5._3._0));
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+ });
+var _elm_lang$core$Maybe$map5 = F6(
+ function (func, ma, mb, mc, md, me) {
+ var _p6 = {ctor: '_Tuple5', _0: ma, _1: mb, _2: mc, _3: md, _4: me};
+ if ((((((_p6.ctor === '_Tuple5') && (_p6._0.ctor === 'Just')) && (_p6._1.ctor === 'Just')) && (_p6._2.ctor === 'Just')) && (_p6._3.ctor === 'Just')) && (_p6._4.ctor === 'Just')) {
+ return _elm_lang$core$Maybe$Just(
+ A5(func, _p6._0._0, _p6._1._0, _p6._2._0, _p6._3._0, _p6._4._0));
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+ });
+
+//import Native.Utils //
+
+var _elm_lang$core$Native_List = function() {
+
+var Nil = { ctor: '[]' };
+
+function Cons(hd, tl)
+{
+ return { ctor: '::', _0: hd, _1: tl };
+}
+
+function fromArray(arr)
+{
+ var out = Nil;
+ for (var i = arr.length; i--; )
+ {
+ out = Cons(arr[i], out);
+ }
+ return out;
+}
+
+function toArray(xs)
+{
+ var out = [];
+ while (xs.ctor !== '[]')
+ {
+ out.push(xs._0);
+ xs = xs._1;
+ }
+ return out;
+}
+
+function foldr(f, b, xs)
+{
+ var arr = toArray(xs);
+ var acc = b;
+ for (var i = arr.length; i--; )
+ {
+ acc = A2(f, arr[i], acc);
+ }
+ return acc;
+}
+
+function map2(f, xs, ys)
+{
+ var arr = [];
+ while (xs.ctor !== '[]' && ys.ctor !== '[]')
+ {
+ arr.push(A2(f, xs._0, ys._0));
+ xs = xs._1;
+ ys = ys._1;
+ }
+ return fromArray(arr);
+}
+
+function map3(f, xs, ys, zs)
+{
+ var arr = [];
+ while (xs.ctor !== '[]' && ys.ctor !== '[]' && zs.ctor !== '[]')
+ {
+ arr.push(A3(f, xs._0, ys._0, zs._0));
+ xs = xs._1;
+ ys = ys._1;
+ zs = zs._1;
+ }
+ return fromArray(arr);
+}
+
+function map4(f, ws, xs, ys, zs)
+{
+ var arr = [];
+ while ( ws.ctor !== '[]'
+ && xs.ctor !== '[]'
+ && ys.ctor !== '[]'
+ && zs.ctor !== '[]')
+ {
+ arr.push(A4(f, ws._0, xs._0, ys._0, zs._0));
+ ws = ws._1;
+ xs = xs._1;
+ ys = ys._1;
+ zs = zs._1;
+ }
+ return fromArray(arr);
+}
+
+function map5(f, vs, ws, xs, ys, zs)
+{
+ var arr = [];
+ while ( vs.ctor !== '[]'
+ && ws.ctor !== '[]'
+ && xs.ctor !== '[]'
+ && ys.ctor !== '[]'
+ && zs.ctor !== '[]')
+ {
+ arr.push(A5(f, vs._0, ws._0, xs._0, ys._0, zs._0));
+ vs = vs._1;
+ ws = ws._1;
+ xs = xs._1;
+ ys = ys._1;
+ zs = zs._1;
+ }
+ return fromArray(arr);
+}
+
+function sortBy(f, xs)
+{
+ return fromArray(toArray(xs).sort(function(a, b) {
+ return _elm_lang$core$Native_Utils.cmp(f(a), f(b));
+ }));
+}
+
+function sortWith(f, xs)
+{
+ return fromArray(toArray(xs).sort(function(a, b) {
+ var ord = f(a)(b).ctor;
+ return ord === 'EQ' ? 0 : ord === 'LT' ? -1 : 1;
+ }));
+}
+
+return {
+ Nil: Nil,
+ Cons: Cons,
+ cons: F2(Cons),
+ toArray: toArray,
+ fromArray: fromArray,
+
+ foldr: F3(foldr),
+
+ map2: F3(map2),
+ map3: F4(map3),
+ map4: F5(map4),
+ map5: F6(map5),
+ sortBy: F2(sortBy),
+ sortWith: F2(sortWith)
+};
+
+}();
+var _elm_lang$core$List$sortWith = _elm_lang$core$Native_List.sortWith;
+var _elm_lang$core$List$sortBy = _elm_lang$core$Native_List.sortBy;
+var _elm_lang$core$List$sort = function (xs) {
+ return A2(_elm_lang$core$List$sortBy, _elm_lang$core$Basics$identity, xs);
+};
+var _elm_lang$core$List$singleton = function (value) {
+ return {
+ ctor: '::',
+ _0: value,
+ _1: {ctor: '[]'}
+ };
+};
+var _elm_lang$core$List$drop = F2(
+ function (n, list) {
+ drop:
+ while (true) {
+ if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) {
+ return list;
+ } else {
+ var _p0 = list;
+ if (_p0.ctor === '[]') {
+ return list;
+ } else {
+ var _v1 = n - 1,
+ _v2 = _p0._1;
+ n = _v1;
+ list = _v2;
+ continue drop;
+ }
+ }
+ }
+ });
+var _elm_lang$core$List$map5 = _elm_lang$core$Native_List.map5;
+var _elm_lang$core$List$map4 = _elm_lang$core$Native_List.map4;
+var _elm_lang$core$List$map3 = _elm_lang$core$Native_List.map3;
+var _elm_lang$core$List$map2 = _elm_lang$core$Native_List.map2;
+var _elm_lang$core$List$any = F2(
+ function (isOkay, list) {
+ any:
+ while (true) {
+ var _p1 = list;
+ if (_p1.ctor === '[]') {
+ return false;
+ } else {
+ if (isOkay(_p1._0)) {
+ return true;
+ } else {
+ var _v4 = isOkay,
+ _v5 = _p1._1;
+ isOkay = _v4;
+ list = _v5;
+ continue any;
+ }
+ }
+ }
+ });
+var _elm_lang$core$List$all = F2(
+ function (isOkay, list) {
+ return !A2(
+ _elm_lang$core$List$any,
+ function (_p2) {
+ return !isOkay(_p2);
+ },
+ list);
+ });
+var _elm_lang$core$List$foldr = _elm_lang$core$Native_List.foldr;
+var _elm_lang$core$List$foldl = F3(
+ function (func, acc, list) {
+ foldl:
+ while (true) {
+ var _p3 = list;
+ if (_p3.ctor === '[]') {
+ return acc;
+ } else {
+ var _v7 = func,
+ _v8 = A2(func, _p3._0, acc),
+ _v9 = _p3._1;
+ func = _v7;
+ acc = _v8;
+ list = _v9;
+ continue foldl;
+ }
+ }
+ });
+var _elm_lang$core$List$length = function (xs) {
+ return A3(
+ _elm_lang$core$List$foldl,
+ F2(
+ function (_p4, i) {
+ return i + 1;
+ }),
+ 0,
+ xs);
+};
+var _elm_lang$core$List$sum = function (numbers) {
+ return A3(
+ _elm_lang$core$List$foldl,
+ F2(
+ function (x, y) {
+ return x + y;
+ }),
+ 0,
+ numbers);
+};
+var _elm_lang$core$List$product = function (numbers) {
+ return A3(
+ _elm_lang$core$List$foldl,
+ F2(
+ function (x, y) {
+ return x * y;
+ }),
+ 1,
+ numbers);
+};
+var _elm_lang$core$List$maximum = function (list) {
+ var _p5 = list;
+ if (_p5.ctor === '::') {
+ return _elm_lang$core$Maybe$Just(
+ A3(_elm_lang$core$List$foldl, _elm_lang$core$Basics$max, _p5._0, _p5._1));
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+};
+var _elm_lang$core$List$minimum = function (list) {
+ var _p6 = list;
+ if (_p6.ctor === '::') {
+ return _elm_lang$core$Maybe$Just(
+ A3(_elm_lang$core$List$foldl, _elm_lang$core$Basics$min, _p6._0, _p6._1));
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+};
+var _elm_lang$core$List$member = F2(
+ function (x, xs) {
+ return A2(
+ _elm_lang$core$List$any,
+ function (a) {
+ return _elm_lang$core$Native_Utils.eq(a, x);
+ },
+ xs);
+ });
+var _elm_lang$core$List$isEmpty = function (xs) {
+ var _p7 = xs;
+ if (_p7.ctor === '[]') {
+ return true;
+ } else {
+ return false;
+ }
+};
+var _elm_lang$core$List$tail = function (list) {
+ var _p8 = list;
+ if (_p8.ctor === '::') {
+ return _elm_lang$core$Maybe$Just(_p8._1);
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+};
+var _elm_lang$core$List$head = function (list) {
+ var _p9 = list;
+ if (_p9.ctor === '::') {
+ return _elm_lang$core$Maybe$Just(_p9._0);
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+};
+var _elm_lang$core$List_ops = _elm_lang$core$List_ops || {};
+_elm_lang$core$List_ops['::'] = _elm_lang$core$Native_List.cons;
+var _elm_lang$core$List$map = F2(
+ function (f, xs) {
+ return A3(
+ _elm_lang$core$List$foldr,
+ F2(
+ function (x, acc) {
+ return {
+ ctor: '::',
+ _0: f(x),
+ _1: acc
+ };
+ }),
+ {ctor: '[]'},
+ xs);
+ });
+var _elm_lang$core$List$filter = F2(
+ function (pred, xs) {
+ var conditionalCons = F2(
+ function (front, back) {
+ return pred(front) ? {ctor: '::', _0: front, _1: back} : back;
+ });
+ return A3(
+ _elm_lang$core$List$foldr,
+ conditionalCons,
+ {ctor: '[]'},
+ xs);
+ });
+var _elm_lang$core$List$maybeCons = F3(
+ function (f, mx, xs) {
+ var _p10 = f(mx);
+ if (_p10.ctor === 'Just') {
+ return {ctor: '::', _0: _p10._0, _1: xs};
+ } else {
+ return xs;
+ }
+ });
+var _elm_lang$core$List$filterMap = F2(
+ function (f, xs) {
+ return A3(
+ _elm_lang$core$List$foldr,
+ _elm_lang$core$List$maybeCons(f),
+ {ctor: '[]'},
+ xs);
+ });
+var _elm_lang$core$List$reverse = function (list) {
+ return A3(
+ _elm_lang$core$List$foldl,
+ F2(
+ function (x, y) {
+ return {ctor: '::', _0: x, _1: y};
+ }),
+ {ctor: '[]'},
+ list);
+};
+var _elm_lang$core$List$scanl = F3(
+ function (f, b, xs) {
+ var scan1 = F2(
+ function (x, accAcc) {
+ var _p11 = accAcc;
+ if (_p11.ctor === '::') {
+ return {
+ ctor: '::',
+ _0: A2(f, x, _p11._0),
+ _1: accAcc
+ };
+ } else {
+ return {ctor: '[]'};
+ }
+ });
+ return _elm_lang$core$List$reverse(
+ A3(
+ _elm_lang$core$List$foldl,
+ scan1,
+ {
+ ctor: '::',
+ _0: b,
+ _1: {ctor: '[]'}
+ },
+ xs));
+ });
+var _elm_lang$core$List$append = F2(
+ function (xs, ys) {
+ var _p12 = ys;
+ if (_p12.ctor === '[]') {
+ return xs;
+ } else {
+ return A3(
+ _elm_lang$core$List$foldr,
+ F2(
+ function (x, y) {
+ return {ctor: '::', _0: x, _1: y};
+ }),
+ ys,
+ xs);
+ }
+ });
+var _elm_lang$core$List$concat = function (lists) {
+ return A3(
+ _elm_lang$core$List$foldr,
+ _elm_lang$core$List$append,
+ {ctor: '[]'},
+ lists);
+};
+var _elm_lang$core$List$concatMap = F2(
+ function (f, list) {
+ return _elm_lang$core$List$concat(
+ A2(_elm_lang$core$List$map, f, list));
+ });
+var _elm_lang$core$List$partition = F2(
+ function (pred, list) {
+ var step = F2(
+ function (x, _p13) {
+ var _p14 = _p13;
+ var _p16 = _p14._0;
+ var _p15 = _p14._1;
+ return pred(x) ? {
+ ctor: '_Tuple2',
+ _0: {ctor: '::', _0: x, _1: _p16},
+ _1: _p15
+ } : {
+ ctor: '_Tuple2',
+ _0: _p16,
+ _1: {ctor: '::', _0: x, _1: _p15}
+ };
+ });
+ return A3(
+ _elm_lang$core$List$foldr,
+ step,
+ {
+ ctor: '_Tuple2',
+ _0: {ctor: '[]'},
+ _1: {ctor: '[]'}
+ },
+ list);
+ });
+var _elm_lang$core$List$unzip = function (pairs) {
+ var step = F2(
+ function (_p18, _p17) {
+ var _p19 = _p18;
+ var _p20 = _p17;
+ return {
+ ctor: '_Tuple2',
+ _0: {ctor: '::', _0: _p19._0, _1: _p20._0},
+ _1: {ctor: '::', _0: _p19._1, _1: _p20._1}
+ };
+ });
+ return A3(
+ _elm_lang$core$List$foldr,
+ step,
+ {
+ ctor: '_Tuple2',
+ _0: {ctor: '[]'},
+ _1: {ctor: '[]'}
+ },
+ pairs);
+};
+var _elm_lang$core$List$intersperse = F2(
+ function (sep, xs) {
+ var _p21 = xs;
+ if (_p21.ctor === '[]') {
+ return {ctor: '[]'};
+ } else {
+ var step = F2(
+ function (x, rest) {
+ return {
+ ctor: '::',
+ _0: sep,
+ _1: {ctor: '::', _0: x, _1: rest}
+ };
+ });
+ var spersed = A3(
+ _elm_lang$core$List$foldr,
+ step,
+ {ctor: '[]'},
+ _p21._1);
+ return {ctor: '::', _0: _p21._0, _1: spersed};
+ }
+ });
+var _elm_lang$core$List$takeReverse = F3(
+ function (n, list, taken) {
+ takeReverse:
+ while (true) {
+ if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) {
+ return taken;
+ } else {
+ var _p22 = list;
+ if (_p22.ctor === '[]') {
+ return taken;
+ } else {
+ var _v23 = n - 1,
+ _v24 = _p22._1,
+ _v25 = {ctor: '::', _0: _p22._0, _1: taken};
+ n = _v23;
+ list = _v24;
+ taken = _v25;
+ continue takeReverse;
+ }
+ }
+ }
+ });
+var _elm_lang$core$List$takeTailRec = F2(
+ function (n, list) {
+ return _elm_lang$core$List$reverse(
+ A3(
+ _elm_lang$core$List$takeReverse,
+ n,
+ list,
+ {ctor: '[]'}));
+ });
+var _elm_lang$core$List$takeFast = F3(
+ function (ctr, n, list) {
+ if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) {
+ return {ctor: '[]'};
+ } else {
+ var _p23 = {ctor: '_Tuple2', _0: n, _1: list};
+ _v26_5:
+ do {
+ _v26_1:
+ do {
+ if (_p23.ctor === '_Tuple2') {
+ if (_p23._1.ctor === '[]') {
+ return list;
+ } else {
+ if (_p23._1._1.ctor === '::') {
+ switch (_p23._0) {
+ case 1:
+ break _v26_1;
+ case 2:
+ return {
+ ctor: '::',
+ _0: _p23._1._0,
+ _1: {
+ ctor: '::',
+ _0: _p23._1._1._0,
+ _1: {ctor: '[]'}
+ }
+ };
+ case 3:
+ if (_p23._1._1._1.ctor === '::') {
+ return {
+ ctor: '::',
+ _0: _p23._1._0,
+ _1: {
+ ctor: '::',
+ _0: _p23._1._1._0,
+ _1: {
+ ctor: '::',
+ _0: _p23._1._1._1._0,
+ _1: {ctor: '[]'}
+ }
+ }
+ };
+ } else {
+ break _v26_5;
+ }
+ default:
+ if ((_p23._1._1._1.ctor === '::') && (_p23._1._1._1._1.ctor === '::')) {
+ var _p28 = _p23._1._1._1._0;
+ var _p27 = _p23._1._1._0;
+ var _p26 = _p23._1._0;
+ var _p25 = _p23._1._1._1._1._0;
+ var _p24 = _p23._1._1._1._1._1;
+ return (_elm_lang$core$Native_Utils.cmp(ctr, 1000) > 0) ? {
+ ctor: '::',
+ _0: _p26,
+ _1: {
+ ctor: '::',
+ _0: _p27,
+ _1: {
+ ctor: '::',
+ _0: _p28,
+ _1: {
+ ctor: '::',
+ _0: _p25,
+ _1: A2(_elm_lang$core$List$takeTailRec, n - 4, _p24)
+ }
+ }
+ }
+ } : {
+ ctor: '::',
+ _0: _p26,
+ _1: {
+ ctor: '::',
+ _0: _p27,
+ _1: {
+ ctor: '::',
+ _0: _p28,
+ _1: {
+ ctor: '::',
+ _0: _p25,
+ _1: A3(_elm_lang$core$List$takeFast, ctr + 1, n - 4, _p24)
+ }
+ }
+ }
+ };
+ } else {
+ break _v26_5;
+ }
+ }
+ } else {
+ if (_p23._0 === 1) {
+ break _v26_1;
+ } else {
+ break _v26_5;
+ }
+ }
+ }
+ } else {
+ break _v26_5;
+ }
+ } while(false);
+ return {
+ ctor: '::',
+ _0: _p23._1._0,
+ _1: {ctor: '[]'}
+ };
+ } while(false);
+ return list;
+ }
+ });
+var _elm_lang$core$List$take = F2(
+ function (n, list) {
+ return A3(_elm_lang$core$List$takeFast, 0, n, list);
+ });
+var _elm_lang$core$List$repeatHelp = F3(
+ function (result, n, value) {
+ repeatHelp:
+ while (true) {
+ if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) {
+ return result;
+ } else {
+ var _v27 = {ctor: '::', _0: value, _1: result},
+ _v28 = n - 1,
+ _v29 = value;
+ result = _v27;
+ n = _v28;
+ value = _v29;
+ continue repeatHelp;
+ }
+ }
+ });
+var _elm_lang$core$List$repeat = F2(
+ function (n, value) {
+ return A3(
+ _elm_lang$core$List$repeatHelp,
+ {ctor: '[]'},
+ n,
+ value);
+ });
+var _elm_lang$core$List$rangeHelp = F3(
+ function (lo, hi, list) {
+ rangeHelp:
+ while (true) {
+ if (_elm_lang$core$Native_Utils.cmp(lo, hi) < 1) {
+ var _v30 = lo,
+ _v31 = hi - 1,
+ _v32 = {ctor: '::', _0: hi, _1: list};
+ lo = _v30;
+ hi = _v31;
+ list = _v32;
+ continue rangeHelp;
+ } else {
+ return list;
+ }
+ }
+ });
+var _elm_lang$core$List$range = F2(
+ function (lo, hi) {
+ return A3(
+ _elm_lang$core$List$rangeHelp,
+ lo,
+ hi,
+ {ctor: '[]'});
+ });
+var _elm_lang$core$List$indexedMap = F2(
+ function (f, xs) {
+ return A3(
+ _elm_lang$core$List$map2,
+ f,
+ A2(
+ _elm_lang$core$List$range,
+ 0,
+ _elm_lang$core$List$length(xs) - 1),
+ xs);
+ });
+
+var _elm_lang$core$Array$append = _elm_lang$core$Native_Array.append;
+var _elm_lang$core$Array$length = _elm_lang$core$Native_Array.length;
+var _elm_lang$core$Array$isEmpty = function (array) {
+ return _elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Array$length(array),
+ 0);
+};
+var _elm_lang$core$Array$slice = _elm_lang$core$Native_Array.slice;
+var _elm_lang$core$Array$set = _elm_lang$core$Native_Array.set;
+var _elm_lang$core$Array$get = F2(
+ function (i, array) {
+ return ((_elm_lang$core$Native_Utils.cmp(0, i) < 1) && (_elm_lang$core$Native_Utils.cmp(
+ i,
+ _elm_lang$core$Native_Array.length(array)) < 0)) ? _elm_lang$core$Maybe$Just(
+ A2(_elm_lang$core$Native_Array.get, i, array)) : _elm_lang$core$Maybe$Nothing;
+ });
+var _elm_lang$core$Array$push = _elm_lang$core$Native_Array.push;
+var _elm_lang$core$Array$empty = _elm_lang$core$Native_Array.empty;
+var _elm_lang$core$Array$filter = F2(
+ function (isOkay, arr) {
+ var update = F2(
+ function (x, xs) {
+ return isOkay(x) ? A2(_elm_lang$core$Native_Array.push, x, xs) : xs;
+ });
+ return A3(_elm_lang$core$Native_Array.foldl, update, _elm_lang$core$Native_Array.empty, arr);
+ });
+var _elm_lang$core$Array$foldr = _elm_lang$core$Native_Array.foldr;
+var _elm_lang$core$Array$foldl = _elm_lang$core$Native_Array.foldl;
+var _elm_lang$core$Array$indexedMap = _elm_lang$core$Native_Array.indexedMap;
+var _elm_lang$core$Array$map = _elm_lang$core$Native_Array.map;
+var _elm_lang$core$Array$toIndexedList = function (array) {
+ return A3(
+ _elm_lang$core$List$map2,
+ F2(
+ function (v0, v1) {
+ return {ctor: '_Tuple2', _0: v0, _1: v1};
+ }),
+ A2(
+ _elm_lang$core$List$range,
+ 0,
+ _elm_lang$core$Native_Array.length(array) - 1),
+ _elm_lang$core$Native_Array.toList(array));
+};
+var _elm_lang$core$Array$toList = _elm_lang$core$Native_Array.toList;
+var _elm_lang$core$Array$fromList = _elm_lang$core$Native_Array.fromList;
+var _elm_lang$core$Array$initialize = _elm_lang$core$Native_Array.initialize;
+var _elm_lang$core$Array$repeat = F2(
+ function (n, e) {
+ return A2(
+ _elm_lang$core$Array$initialize,
+ n,
+ _elm_lang$core$Basics$always(e));
+ });
+var _elm_lang$core$Array$Array = {ctor: 'Array'};
+
+//import Native.Utils //
+
+var _elm_lang$core$Native_Debug = function() {
+
+function log(tag, value)
+{
+ var msg = tag + ': ' + _elm_lang$core$Native_Utils.toString(value);
+ var process = process || {};
+ if (process.stdout)
+ {
+ process.stdout.write(msg);
+ }
+ else
+ {
+ console.log(msg);
+ }
+ return value;
+}
+
+function crash(message)
+{
+ throw new Error(message);
+}
+
+return {
+ crash: crash,
+ log: F2(log)
+};
+
+}();
+//import Maybe, Native.List, Native.Utils, Result //
+
+var _elm_lang$core$Native_String = function() {
+
+function isEmpty(str)
+{
+ return str.length === 0;
+}
+function cons(chr, str)
+{
+ return chr + str;
+}
+function uncons(str)
+{
+ var hd = str[0];
+ if (hd)
+ {
+ return _elm_lang$core$Maybe$Just(_elm_lang$core$Native_Utils.Tuple2(_elm_lang$core$Native_Utils.chr(hd), str.slice(1)));
+ }
+ return _elm_lang$core$Maybe$Nothing;
+}
+function append(a, b)
+{
+ return a + b;
+}
+function concat(strs)
+{
+ return _elm_lang$core$Native_List.toArray(strs).join('');
+}
+function length(str)
+{
+ return str.length;
+}
+function map(f, str)
+{
+ var out = str.split('');
+ for (var i = out.length; i--; )
+ {
+ out[i] = f(_elm_lang$core$Native_Utils.chr(out[i]));
+ }
+ return out.join('');
+}
+function filter(pred, str)
+{
+ return str.split('').map(_elm_lang$core$Native_Utils.chr).filter(pred).join('');
+}
+function reverse(str)
+{
+ return str.split('').reverse().join('');
+}
+function foldl(f, b, str)
+{
+ var len = str.length;
+ for (var i = 0; i < len; ++i)
+ {
+ b = A2(f, _elm_lang$core$Native_Utils.chr(str[i]), b);
+ }
+ return b;
+}
+function foldr(f, b, str)
+{
+ for (var i = str.length; i--; )
+ {
+ b = A2(f, _elm_lang$core$Native_Utils.chr(str[i]), b);
+ }
+ return b;
+}
+function split(sep, str)
+{
+ return _elm_lang$core$Native_List.fromArray(str.split(sep));
+}
+function join(sep, strs)
+{
+ return _elm_lang$core$Native_List.toArray(strs).join(sep);
+}
+function repeat(n, str)
+{
+ var result = '';
+ while (n > 0)
+ {
+ if (n & 1)
+ {
+ result += str;
+ }
+ n >>= 1, str += str;
+ }
+ return result;
+}
+function slice(start, end, str)
+{
+ return str.slice(start, end);
+}
+function left(n, str)
+{
+ return n < 1 ? '' : str.slice(0, n);
+}
+function right(n, str)
+{
+ return n < 1 ? '' : str.slice(-n);
+}
+function dropLeft(n, str)
+{
+ return n < 1 ? str : str.slice(n);
+}
+function dropRight(n, str)
+{
+ return n < 1 ? str : str.slice(0, -n);
+}
+function pad(n, chr, str)
+{
+ var half = (n - str.length) / 2;
+ return repeat(Math.ceil(half), chr) + str + repeat(half | 0, chr);
+}
+function padRight(n, chr, str)
+{
+ return str + repeat(n - str.length, chr);
+}
+function padLeft(n, chr, str)
+{
+ return repeat(n - str.length, chr) + str;
+}
+
+function trim(str)
+{
+ return str.trim();
+}
+function trimLeft(str)
+{
+ return str.replace(/^\s+/, '');
+}
+function trimRight(str)
+{
+ return str.replace(/\s+$/, '');
+}
+
+function words(str)
+{
+ return _elm_lang$core$Native_List.fromArray(str.trim().split(/\s+/g));
+}
+function lines(str)
+{
+ return _elm_lang$core$Native_List.fromArray(str.split(/\r\n|\r|\n/g));
+}
+
+function toUpper(str)
+{
+ return str.toUpperCase();
+}
+function toLower(str)
+{
+ return str.toLowerCase();
+}
+
+function any(pred, str)
+{
+ for (var i = str.length; i--; )
+ {
+ if (pred(_elm_lang$core$Native_Utils.chr(str[i])))
+ {
+ return true;
+ }
+ }
+ return false;
+}
+function all(pred, str)
+{
+ for (var i = str.length; i--; )
+ {
+ if (!pred(_elm_lang$core$Native_Utils.chr(str[i])))
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+function contains(sub, str)
+{
+ return str.indexOf(sub) > -1;
+}
+function startsWith(sub, str)
+{
+ return str.indexOf(sub) === 0;
+}
+function endsWith(sub, str)
+{
+ return str.length >= sub.length &&
+ str.lastIndexOf(sub) === str.length - sub.length;
+}
+function indexes(sub, str)
+{
+ var subLen = sub.length;
+
+ if (subLen < 1)
+ {
+ return _elm_lang$core$Native_List.Nil;
+ }
+
+ var i = 0;
+ var is = [];
+
+ while ((i = str.indexOf(sub, i)) > -1)
+ {
+ is.push(i);
+ i = i + subLen;
+ }
+
+ return _elm_lang$core$Native_List.fromArray(is);
+}
+
+
+function toInt(s)
+{
+ var len = s.length;
+
+ // if empty
+ if (len === 0)
+ {
+ return intErr(s);
+ }
+
+ // if hex
+ var c = s[0];
+ if (c === '0' && s[1] === 'x')
+ {
+ for (var i = 2; i < len; ++i)
+ {
+ var c = s[i];
+ if (('0' <= c && c <= '9') || ('A' <= c && c <= 'F') || ('a' <= c && c <= 'f'))
+ {
+ continue;
+ }
+ return intErr(s);
+ }
+ return _elm_lang$core$Result$Ok(parseInt(s, 16));
+ }
+
+ // is decimal
+ if (c > '9' || (c < '0' && c !== '-' && c !== '+'))
+ {
+ return intErr(s);
+ }
+ for (var i = 1; i < len; ++i)
+ {
+ var c = s[i];
+ if (c < '0' || '9' < c)
+ {
+ return intErr(s);
+ }
+ }
+
+ return _elm_lang$core$Result$Ok(parseInt(s, 10));
+}
+
+function intErr(s)
+{
+ return _elm_lang$core$Result$Err("could not convert string '" + s + "' to an Int");
+}
+
+
+function toFloat(s)
+{
+ // check if it is a hex, octal, or binary number
+ if (s.length === 0 || /[\sxbo]/.test(s))
+ {
+ return floatErr(s);
+ }
+ var n = +s;
+ // faster isNaN check
+ return n === n ? _elm_lang$core$Result$Ok(n) : floatErr(s);
+}
+
+function floatErr(s)
+{
+ return _elm_lang$core$Result$Err("could not convert string '" + s + "' to a Float");
+}
+
+
+function toList(str)
+{
+ return _elm_lang$core$Native_List.fromArray(str.split('').map(_elm_lang$core$Native_Utils.chr));
+}
+function fromList(chars)
+{
+ return _elm_lang$core$Native_List.toArray(chars).join('');
+}
+
+return {
+ isEmpty: isEmpty,
+ cons: F2(cons),
+ uncons: uncons,
+ append: F2(append),
+ concat: concat,
+ length: length,
+ map: F2(map),
+ filter: F2(filter),
+ reverse: reverse,
+ foldl: F3(foldl),
+ foldr: F3(foldr),
+
+ split: F2(split),
+ join: F2(join),
+ repeat: F2(repeat),
+
+ slice: F3(slice),
+ left: F2(left),
+ right: F2(right),
+ dropLeft: F2(dropLeft),
+ dropRight: F2(dropRight),
+
+ pad: F3(pad),
+ padLeft: F3(padLeft),
+ padRight: F3(padRight),
+
+ trim: trim,
+ trimLeft: trimLeft,
+ trimRight: trimRight,
+
+ words: words,
+ lines: lines,
+
+ toUpper: toUpper,
+ toLower: toLower,
+
+ any: F2(any),
+ all: F2(all),
+
+ contains: F2(contains),
+ startsWith: F2(startsWith),
+ endsWith: F2(endsWith),
+ indexes: F2(indexes),
+
+ toInt: toInt,
+ toFloat: toFloat,
+ toList: toList,
+ fromList: fromList
+};
+
+}();
+
+//import Native.Utils //
+
+var _elm_lang$core$Native_Char = function() {
+
+return {
+ fromCode: function(c) { return _elm_lang$core$Native_Utils.chr(String.fromCharCode(c)); },
+ toCode: function(c) { return c.charCodeAt(0); },
+ toUpper: function(c) { return _elm_lang$core$Native_Utils.chr(c.toUpperCase()); },
+ toLower: function(c) { return _elm_lang$core$Native_Utils.chr(c.toLowerCase()); },
+ toLocaleUpper: function(c) { return _elm_lang$core$Native_Utils.chr(c.toLocaleUpperCase()); },
+ toLocaleLower: function(c) { return _elm_lang$core$Native_Utils.chr(c.toLocaleLowerCase()); }
+};
+
+}();
+var _elm_lang$core$Char$fromCode = _elm_lang$core$Native_Char.fromCode;
+var _elm_lang$core$Char$toCode = _elm_lang$core$Native_Char.toCode;
+var _elm_lang$core$Char$toLocaleLower = _elm_lang$core$Native_Char.toLocaleLower;
+var _elm_lang$core$Char$toLocaleUpper = _elm_lang$core$Native_Char.toLocaleUpper;
+var _elm_lang$core$Char$toLower = _elm_lang$core$Native_Char.toLower;
+var _elm_lang$core$Char$toUpper = _elm_lang$core$Native_Char.toUpper;
+var _elm_lang$core$Char$isBetween = F3(
+ function (low, high, $char) {
+ var code = _elm_lang$core$Char$toCode($char);
+ return (_elm_lang$core$Native_Utils.cmp(
+ code,
+ _elm_lang$core$Char$toCode(low)) > -1) && (_elm_lang$core$Native_Utils.cmp(
+ code,
+ _elm_lang$core$Char$toCode(high)) < 1);
+ });
+var _elm_lang$core$Char$isUpper = A2(
+ _elm_lang$core$Char$isBetween,
+ _elm_lang$core$Native_Utils.chr('A'),
+ _elm_lang$core$Native_Utils.chr('Z'));
+var _elm_lang$core$Char$isLower = A2(
+ _elm_lang$core$Char$isBetween,
+ _elm_lang$core$Native_Utils.chr('a'),
+ _elm_lang$core$Native_Utils.chr('z'));
+var _elm_lang$core$Char$isDigit = A2(
+ _elm_lang$core$Char$isBetween,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Native_Utils.chr('9'));
+var _elm_lang$core$Char$isOctDigit = A2(
+ _elm_lang$core$Char$isBetween,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Native_Utils.chr('7'));
+var _elm_lang$core$Char$isHexDigit = function ($char) {
+ return _elm_lang$core$Char$isDigit($char) || (A3(
+ _elm_lang$core$Char$isBetween,
+ _elm_lang$core$Native_Utils.chr('a'),
+ _elm_lang$core$Native_Utils.chr('f'),
+ $char) || A3(
+ _elm_lang$core$Char$isBetween,
+ _elm_lang$core$Native_Utils.chr('A'),
+ _elm_lang$core$Native_Utils.chr('F'),
+ $char));
+};
+
+var _elm_lang$core$Result$toMaybe = function (result) {
+ var _p0 = result;
+ if (_p0.ctor === 'Ok') {
+ return _elm_lang$core$Maybe$Just(_p0._0);
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+};
+var _elm_lang$core$Result$withDefault = F2(
+ function (def, result) {
+ var _p1 = result;
+ if (_p1.ctor === 'Ok') {
+ return _p1._0;
+ } else {
+ return def;
+ }
+ });
+var _elm_lang$core$Result$Err = function (a) {
+ return {ctor: 'Err', _0: a};
+};
+var _elm_lang$core$Result$andThen = F2(
+ function (callback, result) {
+ var _p2 = result;
+ if (_p2.ctor === 'Ok') {
+ return callback(_p2._0);
+ } else {
+ return _elm_lang$core$Result$Err(_p2._0);
+ }
+ });
+var _elm_lang$core$Result$Ok = function (a) {
+ return {ctor: 'Ok', _0: a};
+};
+var _elm_lang$core$Result$map = F2(
+ function (func, ra) {
+ var _p3 = ra;
+ if (_p3.ctor === 'Ok') {
+ return _elm_lang$core$Result$Ok(
+ func(_p3._0));
+ } else {
+ return _elm_lang$core$Result$Err(_p3._0);
+ }
+ });
+var _elm_lang$core$Result$map2 = F3(
+ function (func, ra, rb) {
+ var _p4 = {ctor: '_Tuple2', _0: ra, _1: rb};
+ if (_p4._0.ctor === 'Ok') {
+ if (_p4._1.ctor === 'Ok') {
+ return _elm_lang$core$Result$Ok(
+ A2(func, _p4._0._0, _p4._1._0));
+ } else {
+ return _elm_lang$core$Result$Err(_p4._1._0);
+ }
+ } else {
+ return _elm_lang$core$Result$Err(_p4._0._0);
+ }
+ });
+var _elm_lang$core$Result$map3 = F4(
+ function (func, ra, rb, rc) {
+ var _p5 = {ctor: '_Tuple3', _0: ra, _1: rb, _2: rc};
+ if (_p5._0.ctor === 'Ok') {
+ if (_p5._1.ctor === 'Ok') {
+ if (_p5._2.ctor === 'Ok') {
+ return _elm_lang$core$Result$Ok(
+ A3(func, _p5._0._0, _p5._1._0, _p5._2._0));
+ } else {
+ return _elm_lang$core$Result$Err(_p5._2._0);
+ }
+ } else {
+ return _elm_lang$core$Result$Err(_p5._1._0);
+ }
+ } else {
+ return _elm_lang$core$Result$Err(_p5._0._0);
+ }
+ });
+var _elm_lang$core$Result$map4 = F5(
+ function (func, ra, rb, rc, rd) {
+ var _p6 = {ctor: '_Tuple4', _0: ra, _1: rb, _2: rc, _3: rd};
+ if (_p6._0.ctor === 'Ok') {
+ if (_p6._1.ctor === 'Ok') {
+ if (_p6._2.ctor === 'Ok') {
+ if (_p6._3.ctor === 'Ok') {
+ return _elm_lang$core$Result$Ok(
+ A4(func, _p6._0._0, _p6._1._0, _p6._2._0, _p6._3._0));
+ } else {
+ return _elm_lang$core$Result$Err(_p6._3._0);
+ }
+ } else {
+ return _elm_lang$core$Result$Err(_p6._2._0);
+ }
+ } else {
+ return _elm_lang$core$Result$Err(_p6._1._0);
+ }
+ } else {
+ return _elm_lang$core$Result$Err(_p6._0._0);
+ }
+ });
+var _elm_lang$core$Result$map5 = F6(
+ function (func, ra, rb, rc, rd, re) {
+ var _p7 = {ctor: '_Tuple5', _0: ra, _1: rb, _2: rc, _3: rd, _4: re};
+ if (_p7._0.ctor === 'Ok') {
+ if (_p7._1.ctor === 'Ok') {
+ if (_p7._2.ctor === 'Ok') {
+ if (_p7._3.ctor === 'Ok') {
+ if (_p7._4.ctor === 'Ok') {
+ return _elm_lang$core$Result$Ok(
+ A5(func, _p7._0._0, _p7._1._0, _p7._2._0, _p7._3._0, _p7._4._0));
+ } else {
+ return _elm_lang$core$Result$Err(_p7._4._0);
+ }
+ } else {
+ return _elm_lang$core$Result$Err(_p7._3._0);
+ }
+ } else {
+ return _elm_lang$core$Result$Err(_p7._2._0);
+ }
+ } else {
+ return _elm_lang$core$Result$Err(_p7._1._0);
+ }
+ } else {
+ return _elm_lang$core$Result$Err(_p7._0._0);
+ }
+ });
+var _elm_lang$core$Result$mapError = F2(
+ function (f, result) {
+ var _p8 = result;
+ if (_p8.ctor === 'Ok') {
+ return _elm_lang$core$Result$Ok(_p8._0);
+ } else {
+ return _elm_lang$core$Result$Err(
+ f(_p8._0));
+ }
+ });
+var _elm_lang$core$Result$fromMaybe = F2(
+ function (err, maybe) {
+ var _p9 = maybe;
+ if (_p9.ctor === 'Just') {
+ return _elm_lang$core$Result$Ok(_p9._0);
+ } else {
+ return _elm_lang$core$Result$Err(err);
+ }
+ });
+
+var _elm_lang$core$String$fromList = _elm_lang$core$Native_String.fromList;
+var _elm_lang$core$String$toList = _elm_lang$core$Native_String.toList;
+var _elm_lang$core$String$toFloat = _elm_lang$core$Native_String.toFloat;
+var _elm_lang$core$String$toInt = _elm_lang$core$Native_String.toInt;
+var _elm_lang$core$String$indices = _elm_lang$core$Native_String.indexes;
+var _elm_lang$core$String$indexes = _elm_lang$core$Native_String.indexes;
+var _elm_lang$core$String$endsWith = _elm_lang$core$Native_String.endsWith;
+var _elm_lang$core$String$startsWith = _elm_lang$core$Native_String.startsWith;
+var _elm_lang$core$String$contains = _elm_lang$core$Native_String.contains;
+var _elm_lang$core$String$all = _elm_lang$core$Native_String.all;
+var _elm_lang$core$String$any = _elm_lang$core$Native_String.any;
+var _elm_lang$core$String$toLower = _elm_lang$core$Native_String.toLower;
+var _elm_lang$core$String$toUpper = _elm_lang$core$Native_String.toUpper;
+var _elm_lang$core$String$lines = _elm_lang$core$Native_String.lines;
+var _elm_lang$core$String$words = _elm_lang$core$Native_String.words;
+var _elm_lang$core$String$trimRight = _elm_lang$core$Native_String.trimRight;
+var _elm_lang$core$String$trimLeft = _elm_lang$core$Native_String.trimLeft;
+var _elm_lang$core$String$trim = _elm_lang$core$Native_String.trim;
+var _elm_lang$core$String$padRight = _elm_lang$core$Native_String.padRight;
+var _elm_lang$core$String$padLeft = _elm_lang$core$Native_String.padLeft;
+var _elm_lang$core$String$pad = _elm_lang$core$Native_String.pad;
+var _elm_lang$core$String$dropRight = _elm_lang$core$Native_String.dropRight;
+var _elm_lang$core$String$dropLeft = _elm_lang$core$Native_String.dropLeft;
+var _elm_lang$core$String$right = _elm_lang$core$Native_String.right;
+var _elm_lang$core$String$left = _elm_lang$core$Native_String.left;
+var _elm_lang$core$String$slice = _elm_lang$core$Native_String.slice;
+var _elm_lang$core$String$repeat = _elm_lang$core$Native_String.repeat;
+var _elm_lang$core$String$join = _elm_lang$core$Native_String.join;
+var _elm_lang$core$String$split = _elm_lang$core$Native_String.split;
+var _elm_lang$core$String$foldr = _elm_lang$core$Native_String.foldr;
+var _elm_lang$core$String$foldl = _elm_lang$core$Native_String.foldl;
+var _elm_lang$core$String$reverse = _elm_lang$core$Native_String.reverse;
+var _elm_lang$core$String$filter = _elm_lang$core$Native_String.filter;
+var _elm_lang$core$String$map = _elm_lang$core$Native_String.map;
+var _elm_lang$core$String$length = _elm_lang$core$Native_String.length;
+var _elm_lang$core$String$concat = _elm_lang$core$Native_String.concat;
+var _elm_lang$core$String$append = _elm_lang$core$Native_String.append;
+var _elm_lang$core$String$uncons = _elm_lang$core$Native_String.uncons;
+var _elm_lang$core$String$cons = _elm_lang$core$Native_String.cons;
+var _elm_lang$core$String$fromChar = function ($char) {
+ return A2(_elm_lang$core$String$cons, $char, '');
+};
+var _elm_lang$core$String$isEmpty = _elm_lang$core$Native_String.isEmpty;
+
+var _elm_lang$core$Dict$foldr = F3(
+ function (f, acc, t) {
+ foldr:
+ while (true) {
+ var _p0 = t;
+ if (_p0.ctor === 'RBEmpty_elm_builtin') {
+ return acc;
+ } else {
+ var _v1 = f,
+ _v2 = A3(
+ f,
+ _p0._1,
+ _p0._2,
+ A3(_elm_lang$core$Dict$foldr, f, acc, _p0._4)),
+ _v3 = _p0._3;
+ f = _v1;
+ acc = _v2;
+ t = _v3;
+ continue foldr;
+ }
+ }
+ });
+var _elm_lang$core$Dict$keys = function (dict) {
+ return A3(
+ _elm_lang$core$Dict$foldr,
+ F3(
+ function (key, value, keyList) {
+ return {ctor: '::', _0: key, _1: keyList};
+ }),
+ {ctor: '[]'},
+ dict);
+};
+var _elm_lang$core$Dict$values = function (dict) {
+ return A3(
+ _elm_lang$core$Dict$foldr,
+ F3(
+ function (key, value, valueList) {
+ return {ctor: '::', _0: value, _1: valueList};
+ }),
+ {ctor: '[]'},
+ dict);
+};
+var _elm_lang$core$Dict$toList = function (dict) {
+ return A3(
+ _elm_lang$core$Dict$foldr,
+ F3(
+ function (key, value, list) {
+ return {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: key, _1: value},
+ _1: list
+ };
+ }),
+ {ctor: '[]'},
+ dict);
+};
+var _elm_lang$core$Dict$foldl = F3(
+ function (f, acc, dict) {
+ foldl:
+ while (true) {
+ var _p1 = dict;
+ if (_p1.ctor === 'RBEmpty_elm_builtin') {
+ return acc;
+ } else {
+ var _v5 = f,
+ _v6 = A3(
+ f,
+ _p1._1,
+ _p1._2,
+ A3(_elm_lang$core$Dict$foldl, f, acc, _p1._3)),
+ _v7 = _p1._4;
+ f = _v5;
+ acc = _v6;
+ dict = _v7;
+ continue foldl;
+ }
+ }
+ });
+var _elm_lang$core$Dict$merge = F6(
+ function (leftStep, bothStep, rightStep, leftDict, rightDict, initialResult) {
+ var stepState = F3(
+ function (rKey, rValue, _p2) {
+ stepState:
+ while (true) {
+ var _p3 = _p2;
+ var _p9 = _p3._1;
+ var _p8 = _p3._0;
+ var _p4 = _p8;
+ if (_p4.ctor === '[]') {
+ return {
+ ctor: '_Tuple2',
+ _0: _p8,
+ _1: A3(rightStep, rKey, rValue, _p9)
+ };
+ } else {
+ var _p7 = _p4._1;
+ var _p6 = _p4._0._1;
+ var _p5 = _p4._0._0;
+ if (_elm_lang$core$Native_Utils.cmp(_p5, rKey) < 0) {
+ var _v10 = rKey,
+ _v11 = rValue,
+ _v12 = {
+ ctor: '_Tuple2',
+ _0: _p7,
+ _1: A3(leftStep, _p5, _p6, _p9)
+ };
+ rKey = _v10;
+ rValue = _v11;
+ _p2 = _v12;
+ continue stepState;
+ } else {
+ if (_elm_lang$core$Native_Utils.cmp(_p5, rKey) > 0) {
+ return {
+ ctor: '_Tuple2',
+ _0: _p8,
+ _1: A3(rightStep, rKey, rValue, _p9)
+ };
+ } else {
+ return {
+ ctor: '_Tuple2',
+ _0: _p7,
+ _1: A4(bothStep, _p5, _p6, rValue, _p9)
+ };
+ }
+ }
+ }
+ }
+ });
+ var _p10 = A3(
+ _elm_lang$core$Dict$foldl,
+ stepState,
+ {
+ ctor: '_Tuple2',
+ _0: _elm_lang$core$Dict$toList(leftDict),
+ _1: initialResult
+ },
+ rightDict);
+ var leftovers = _p10._0;
+ var intermediateResult = _p10._1;
+ return A3(
+ _elm_lang$core$List$foldl,
+ F2(
+ function (_p11, result) {
+ var _p12 = _p11;
+ return A3(leftStep, _p12._0, _p12._1, result);
+ }),
+ intermediateResult,
+ leftovers);
+ });
+var _elm_lang$core$Dict$reportRemBug = F4(
+ function (msg, c, lgot, rgot) {
+ return _elm_lang$core$Native_Debug.crash(
+ _elm_lang$core$String$concat(
+ {
+ ctor: '::',
+ _0: 'Internal red-black tree invariant violated, expected ',
+ _1: {
+ ctor: '::',
+ _0: msg,
+ _1: {
+ ctor: '::',
+ _0: ' and got ',
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$core$Basics$toString(c),
+ _1: {
+ ctor: '::',
+ _0: '/',
+ _1: {
+ ctor: '::',
+ _0: lgot,
+ _1: {
+ ctor: '::',
+ _0: '/',
+ _1: {
+ ctor: '::',
+ _0: rgot,
+ _1: {
+ ctor: '::',
+ _0: '\nPlease report this bug to ',
+ _1: {ctor: '[]'}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }));
+ });
+var _elm_lang$core$Dict$isBBlack = function (dict) {
+ var _p13 = dict;
+ _v14_2:
+ do {
+ if (_p13.ctor === 'RBNode_elm_builtin') {
+ if (_p13._0.ctor === 'BBlack') {
+ return true;
+ } else {
+ break _v14_2;
+ }
+ } else {
+ if (_p13._0.ctor === 'LBBlack') {
+ return true;
+ } else {
+ break _v14_2;
+ }
+ }
+ } while(false);
+ return false;
+};
+var _elm_lang$core$Dict$sizeHelp = F2(
+ function (n, dict) {
+ sizeHelp:
+ while (true) {
+ var _p14 = dict;
+ if (_p14.ctor === 'RBEmpty_elm_builtin') {
+ return n;
+ } else {
+ var _v16 = A2(_elm_lang$core$Dict$sizeHelp, n + 1, _p14._4),
+ _v17 = _p14._3;
+ n = _v16;
+ dict = _v17;
+ continue sizeHelp;
+ }
+ }
+ });
+var _elm_lang$core$Dict$size = function (dict) {
+ return A2(_elm_lang$core$Dict$sizeHelp, 0, dict);
+};
+var _elm_lang$core$Dict$get = F2(
+ function (targetKey, dict) {
+ get:
+ while (true) {
+ var _p15 = dict;
+ if (_p15.ctor === 'RBEmpty_elm_builtin') {
+ return _elm_lang$core$Maybe$Nothing;
+ } else {
+ var _p16 = A2(_elm_lang$core$Basics$compare, targetKey, _p15._1);
+ switch (_p16.ctor) {
+ case 'LT':
+ var _v20 = targetKey,
+ _v21 = _p15._3;
+ targetKey = _v20;
+ dict = _v21;
+ continue get;
+ case 'EQ':
+ return _elm_lang$core$Maybe$Just(_p15._2);
+ default:
+ var _v22 = targetKey,
+ _v23 = _p15._4;
+ targetKey = _v22;
+ dict = _v23;
+ continue get;
+ }
+ }
+ }
+ });
+var _elm_lang$core$Dict$member = F2(
+ function (key, dict) {
+ var _p17 = A2(_elm_lang$core$Dict$get, key, dict);
+ if (_p17.ctor === 'Just') {
+ return true;
+ } else {
+ return false;
+ }
+ });
+var _elm_lang$core$Dict$maxWithDefault = F3(
+ function (k, v, r) {
+ maxWithDefault:
+ while (true) {
+ var _p18 = r;
+ if (_p18.ctor === 'RBEmpty_elm_builtin') {
+ return {ctor: '_Tuple2', _0: k, _1: v};
+ } else {
+ var _v26 = _p18._1,
+ _v27 = _p18._2,
+ _v28 = _p18._4;
+ k = _v26;
+ v = _v27;
+ r = _v28;
+ continue maxWithDefault;
+ }
+ }
+ });
+var _elm_lang$core$Dict$NBlack = {ctor: 'NBlack'};
+var _elm_lang$core$Dict$BBlack = {ctor: 'BBlack'};
+var _elm_lang$core$Dict$Black = {ctor: 'Black'};
+var _elm_lang$core$Dict$blackish = function (t) {
+ var _p19 = t;
+ if (_p19.ctor === 'RBNode_elm_builtin') {
+ var _p20 = _p19._0;
+ return _elm_lang$core$Native_Utils.eq(_p20, _elm_lang$core$Dict$Black) || _elm_lang$core$Native_Utils.eq(_p20, _elm_lang$core$Dict$BBlack);
+ } else {
+ return true;
+ }
+};
+var _elm_lang$core$Dict$Red = {ctor: 'Red'};
+var _elm_lang$core$Dict$moreBlack = function (color) {
+ var _p21 = color;
+ switch (_p21.ctor) {
+ case 'Black':
+ return _elm_lang$core$Dict$BBlack;
+ case 'Red':
+ return _elm_lang$core$Dict$Black;
+ case 'NBlack':
+ return _elm_lang$core$Dict$Red;
+ default:
+ return _elm_lang$core$Native_Debug.crash('Can\'t make a double black node more black!');
+ }
+};
+var _elm_lang$core$Dict$lessBlack = function (color) {
+ var _p22 = color;
+ switch (_p22.ctor) {
+ case 'BBlack':
+ return _elm_lang$core$Dict$Black;
+ case 'Black':
+ return _elm_lang$core$Dict$Red;
+ case 'Red':
+ return _elm_lang$core$Dict$NBlack;
+ default:
+ return _elm_lang$core$Native_Debug.crash('Can\'t make a negative black node less black!');
+ }
+};
+var _elm_lang$core$Dict$LBBlack = {ctor: 'LBBlack'};
+var _elm_lang$core$Dict$LBlack = {ctor: 'LBlack'};
+var _elm_lang$core$Dict$RBEmpty_elm_builtin = function (a) {
+ return {ctor: 'RBEmpty_elm_builtin', _0: a};
+};
+var _elm_lang$core$Dict$empty = _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack);
+var _elm_lang$core$Dict$isEmpty = function (dict) {
+ return _elm_lang$core$Native_Utils.eq(dict, _elm_lang$core$Dict$empty);
+};
+var _elm_lang$core$Dict$RBNode_elm_builtin = F5(
+ function (a, b, c, d, e) {
+ return {ctor: 'RBNode_elm_builtin', _0: a, _1: b, _2: c, _3: d, _4: e};
+ });
+var _elm_lang$core$Dict$ensureBlackRoot = function (dict) {
+ var _p23 = dict;
+ if ((_p23.ctor === 'RBNode_elm_builtin') && (_p23._0.ctor === 'Red')) {
+ return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p23._1, _p23._2, _p23._3, _p23._4);
+ } else {
+ return dict;
+ }
+};
+var _elm_lang$core$Dict$lessBlackTree = function (dict) {
+ var _p24 = dict;
+ if (_p24.ctor === 'RBNode_elm_builtin') {
+ return A5(
+ _elm_lang$core$Dict$RBNode_elm_builtin,
+ _elm_lang$core$Dict$lessBlack(_p24._0),
+ _p24._1,
+ _p24._2,
+ _p24._3,
+ _p24._4);
+ } else {
+ return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack);
+ }
+};
+var _elm_lang$core$Dict$balancedTree = function (col) {
+ return function (xk) {
+ return function (xv) {
+ return function (yk) {
+ return function (yv) {
+ return function (zk) {
+ return function (zv) {
+ return function (a) {
+ return function (b) {
+ return function (c) {
+ return function (d) {
+ return A5(
+ _elm_lang$core$Dict$RBNode_elm_builtin,
+ _elm_lang$core$Dict$lessBlack(col),
+ yk,
+ yv,
+ A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, xk, xv, a, b),
+ A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, zk, zv, c, d));
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+};
+var _elm_lang$core$Dict$blacken = function (t) {
+ var _p25 = t;
+ if (_p25.ctor === 'RBEmpty_elm_builtin') {
+ return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack);
+ } else {
+ return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p25._1, _p25._2, _p25._3, _p25._4);
+ }
+};
+var _elm_lang$core$Dict$redden = function (t) {
+ var _p26 = t;
+ if (_p26.ctor === 'RBEmpty_elm_builtin') {
+ return _elm_lang$core$Native_Debug.crash('can\'t make a Leaf red');
+ } else {
+ return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Red, _p26._1, _p26._2, _p26._3, _p26._4);
+ }
+};
+var _elm_lang$core$Dict$balanceHelp = function (tree) {
+ var _p27 = tree;
+ _v36_6:
+ do {
+ _v36_5:
+ do {
+ _v36_4:
+ do {
+ _v36_3:
+ do {
+ _v36_2:
+ do {
+ _v36_1:
+ do {
+ _v36_0:
+ do {
+ if (_p27.ctor === 'RBNode_elm_builtin') {
+ if (_p27._3.ctor === 'RBNode_elm_builtin') {
+ if (_p27._4.ctor === 'RBNode_elm_builtin') {
+ switch (_p27._3._0.ctor) {
+ case 'Red':
+ switch (_p27._4._0.ctor) {
+ case 'Red':
+ if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) {
+ break _v36_0;
+ } else {
+ if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) {
+ break _v36_1;
+ } else {
+ if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) {
+ break _v36_2;
+ } else {
+ if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) {
+ break _v36_3;
+ } else {
+ break _v36_6;
+ }
+ }
+ }
+ }
+ case 'NBlack':
+ if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) {
+ break _v36_0;
+ } else {
+ if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) {
+ break _v36_1;
+ } else {
+ if (((((_p27._0.ctor === 'BBlack') && (_p27._4._3.ctor === 'RBNode_elm_builtin')) && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) {
+ break _v36_4;
+ } else {
+ break _v36_6;
+ }
+ }
+ }
+ default:
+ if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) {
+ break _v36_0;
+ } else {
+ if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) {
+ break _v36_1;
+ } else {
+ break _v36_6;
+ }
+ }
+ }
+ case 'NBlack':
+ switch (_p27._4._0.ctor) {
+ case 'Red':
+ if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) {
+ break _v36_2;
+ } else {
+ if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) {
+ break _v36_3;
+ } else {
+ if (((((_p27._0.ctor === 'BBlack') && (_p27._3._3.ctor === 'RBNode_elm_builtin')) && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) {
+ break _v36_5;
+ } else {
+ break _v36_6;
+ }
+ }
+ }
+ case 'NBlack':
+ if (_p27._0.ctor === 'BBlack') {
+ if ((((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) {
+ break _v36_4;
+ } else {
+ if ((((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) {
+ break _v36_5;
+ } else {
+ break _v36_6;
+ }
+ }
+ } else {
+ break _v36_6;
+ }
+ default:
+ if (((((_p27._0.ctor === 'BBlack') && (_p27._3._3.ctor === 'RBNode_elm_builtin')) && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) {
+ break _v36_5;
+ } else {
+ break _v36_6;
+ }
+ }
+ default:
+ switch (_p27._4._0.ctor) {
+ case 'Red':
+ if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) {
+ break _v36_2;
+ } else {
+ if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) {
+ break _v36_3;
+ } else {
+ break _v36_6;
+ }
+ }
+ case 'NBlack':
+ if (((((_p27._0.ctor === 'BBlack') && (_p27._4._3.ctor === 'RBNode_elm_builtin')) && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) {
+ break _v36_4;
+ } else {
+ break _v36_6;
+ }
+ default:
+ break _v36_6;
+ }
+ }
+ } else {
+ switch (_p27._3._0.ctor) {
+ case 'Red':
+ if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) {
+ break _v36_0;
+ } else {
+ if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) {
+ break _v36_1;
+ } else {
+ break _v36_6;
+ }
+ }
+ case 'NBlack':
+ if (((((_p27._0.ctor === 'BBlack') && (_p27._3._3.ctor === 'RBNode_elm_builtin')) && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) {
+ break _v36_5;
+ } else {
+ break _v36_6;
+ }
+ default:
+ break _v36_6;
+ }
+ }
+ } else {
+ if (_p27._4.ctor === 'RBNode_elm_builtin') {
+ switch (_p27._4._0.ctor) {
+ case 'Red':
+ if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) {
+ break _v36_2;
+ } else {
+ if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) {
+ break _v36_3;
+ } else {
+ break _v36_6;
+ }
+ }
+ case 'NBlack':
+ if (((((_p27._0.ctor === 'BBlack') && (_p27._4._3.ctor === 'RBNode_elm_builtin')) && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) {
+ break _v36_4;
+ } else {
+ break _v36_6;
+ }
+ default:
+ break _v36_6;
+ }
+ } else {
+ break _v36_6;
+ }
+ }
+ } else {
+ break _v36_6;
+ }
+ } while(false);
+ return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._3._3._1)(_p27._3._3._2)(_p27._3._1)(_p27._3._2)(_p27._1)(_p27._2)(_p27._3._3._3)(_p27._3._3._4)(_p27._3._4)(_p27._4);
+ } while(false);
+ return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._3._1)(_p27._3._2)(_p27._3._4._1)(_p27._3._4._2)(_p27._1)(_p27._2)(_p27._3._3)(_p27._3._4._3)(_p27._3._4._4)(_p27._4);
+ } while(false);
+ return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._1)(_p27._2)(_p27._4._3._1)(_p27._4._3._2)(_p27._4._1)(_p27._4._2)(_p27._3)(_p27._4._3._3)(_p27._4._3._4)(_p27._4._4);
+ } while(false);
+ return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._1)(_p27._2)(_p27._4._1)(_p27._4._2)(_p27._4._4._1)(_p27._4._4._2)(_p27._3)(_p27._4._3)(_p27._4._4._3)(_p27._4._4._4);
+ } while(false);
+ return A5(
+ _elm_lang$core$Dict$RBNode_elm_builtin,
+ _elm_lang$core$Dict$Black,
+ _p27._4._3._1,
+ _p27._4._3._2,
+ A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p27._1, _p27._2, _p27._3, _p27._4._3._3),
+ A5(
+ _elm_lang$core$Dict$balance,
+ _elm_lang$core$Dict$Black,
+ _p27._4._1,
+ _p27._4._2,
+ _p27._4._3._4,
+ _elm_lang$core$Dict$redden(_p27._4._4)));
+ } while(false);
+ return A5(
+ _elm_lang$core$Dict$RBNode_elm_builtin,
+ _elm_lang$core$Dict$Black,
+ _p27._3._4._1,
+ _p27._3._4._2,
+ A5(
+ _elm_lang$core$Dict$balance,
+ _elm_lang$core$Dict$Black,
+ _p27._3._1,
+ _p27._3._2,
+ _elm_lang$core$Dict$redden(_p27._3._3),
+ _p27._3._4._3),
+ A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p27._1, _p27._2, _p27._3._4._4, _p27._4));
+ } while(false);
+ return tree;
+};
+var _elm_lang$core$Dict$balance = F5(
+ function (c, k, v, l, r) {
+ var tree = A5(_elm_lang$core$Dict$RBNode_elm_builtin, c, k, v, l, r);
+ return _elm_lang$core$Dict$blackish(tree) ? _elm_lang$core$Dict$balanceHelp(tree) : tree;
+ });
+var _elm_lang$core$Dict$bubble = F5(
+ function (c, k, v, l, r) {
+ return (_elm_lang$core$Dict$isBBlack(l) || _elm_lang$core$Dict$isBBlack(r)) ? A5(
+ _elm_lang$core$Dict$balance,
+ _elm_lang$core$Dict$moreBlack(c),
+ k,
+ v,
+ _elm_lang$core$Dict$lessBlackTree(l),
+ _elm_lang$core$Dict$lessBlackTree(r)) : A5(_elm_lang$core$Dict$RBNode_elm_builtin, c, k, v, l, r);
+ });
+var _elm_lang$core$Dict$removeMax = F5(
+ function (c, k, v, l, r) {
+ var _p28 = r;
+ if (_p28.ctor === 'RBEmpty_elm_builtin') {
+ return A3(_elm_lang$core$Dict$rem, c, l, r);
+ } else {
+ return A5(
+ _elm_lang$core$Dict$bubble,
+ c,
+ k,
+ v,
+ l,
+ A5(_elm_lang$core$Dict$removeMax, _p28._0, _p28._1, _p28._2, _p28._3, _p28._4));
+ }
+ });
+var _elm_lang$core$Dict$rem = F3(
+ function (color, left, right) {
+ var _p29 = {ctor: '_Tuple2', _0: left, _1: right};
+ if (_p29._0.ctor === 'RBEmpty_elm_builtin') {
+ if (_p29._1.ctor === 'RBEmpty_elm_builtin') {
+ var _p30 = color;
+ switch (_p30.ctor) {
+ case 'Red':
+ return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack);
+ case 'Black':
+ return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBBlack);
+ default:
+ return _elm_lang$core$Native_Debug.crash('cannot have bblack or nblack nodes at this point');
+ }
+ } else {
+ var _p33 = _p29._1._0;
+ var _p32 = _p29._0._0;
+ var _p31 = {ctor: '_Tuple3', _0: color, _1: _p32, _2: _p33};
+ if ((((_p31.ctor === '_Tuple3') && (_p31._0.ctor === 'Black')) && (_p31._1.ctor === 'LBlack')) && (_p31._2.ctor === 'Red')) {
+ return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p29._1._1, _p29._1._2, _p29._1._3, _p29._1._4);
+ } else {
+ return A4(
+ _elm_lang$core$Dict$reportRemBug,
+ 'Black/LBlack/Red',
+ color,
+ _elm_lang$core$Basics$toString(_p32),
+ _elm_lang$core$Basics$toString(_p33));
+ }
+ }
+ } else {
+ if (_p29._1.ctor === 'RBEmpty_elm_builtin') {
+ var _p36 = _p29._1._0;
+ var _p35 = _p29._0._0;
+ var _p34 = {ctor: '_Tuple3', _0: color, _1: _p35, _2: _p36};
+ if ((((_p34.ctor === '_Tuple3') && (_p34._0.ctor === 'Black')) && (_p34._1.ctor === 'Red')) && (_p34._2.ctor === 'LBlack')) {
+ return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p29._0._1, _p29._0._2, _p29._0._3, _p29._0._4);
+ } else {
+ return A4(
+ _elm_lang$core$Dict$reportRemBug,
+ 'Black/Red/LBlack',
+ color,
+ _elm_lang$core$Basics$toString(_p35),
+ _elm_lang$core$Basics$toString(_p36));
+ }
+ } else {
+ var _p40 = _p29._0._2;
+ var _p39 = _p29._0._4;
+ var _p38 = _p29._0._1;
+ var newLeft = A5(_elm_lang$core$Dict$removeMax, _p29._0._0, _p38, _p40, _p29._0._3, _p39);
+ var _p37 = A3(_elm_lang$core$Dict$maxWithDefault, _p38, _p40, _p39);
+ var k = _p37._0;
+ var v = _p37._1;
+ return A5(_elm_lang$core$Dict$bubble, color, k, v, newLeft, right);
+ }
+ }
+ });
+var _elm_lang$core$Dict$map = F2(
+ function (f, dict) {
+ var _p41 = dict;
+ if (_p41.ctor === 'RBEmpty_elm_builtin') {
+ return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack);
+ } else {
+ var _p42 = _p41._1;
+ return A5(
+ _elm_lang$core$Dict$RBNode_elm_builtin,
+ _p41._0,
+ _p42,
+ A2(f, _p42, _p41._2),
+ A2(_elm_lang$core$Dict$map, f, _p41._3),
+ A2(_elm_lang$core$Dict$map, f, _p41._4));
+ }
+ });
+var _elm_lang$core$Dict$Same = {ctor: 'Same'};
+var _elm_lang$core$Dict$Remove = {ctor: 'Remove'};
+var _elm_lang$core$Dict$Insert = {ctor: 'Insert'};
+var _elm_lang$core$Dict$update = F3(
+ function (k, alter, dict) {
+ var up = function (dict) {
+ var _p43 = dict;
+ if (_p43.ctor === 'RBEmpty_elm_builtin') {
+ var _p44 = alter(_elm_lang$core$Maybe$Nothing);
+ if (_p44.ctor === 'Nothing') {
+ return {ctor: '_Tuple2', _0: _elm_lang$core$Dict$Same, _1: _elm_lang$core$Dict$empty};
+ } else {
+ return {
+ ctor: '_Tuple2',
+ _0: _elm_lang$core$Dict$Insert,
+ _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Red, k, _p44._0, _elm_lang$core$Dict$empty, _elm_lang$core$Dict$empty)
+ };
+ }
+ } else {
+ var _p55 = _p43._2;
+ var _p54 = _p43._4;
+ var _p53 = _p43._3;
+ var _p52 = _p43._1;
+ var _p51 = _p43._0;
+ var _p45 = A2(_elm_lang$core$Basics$compare, k, _p52);
+ switch (_p45.ctor) {
+ case 'EQ':
+ var _p46 = alter(
+ _elm_lang$core$Maybe$Just(_p55));
+ if (_p46.ctor === 'Nothing') {
+ return {
+ ctor: '_Tuple2',
+ _0: _elm_lang$core$Dict$Remove,
+ _1: A3(_elm_lang$core$Dict$rem, _p51, _p53, _p54)
+ };
+ } else {
+ return {
+ ctor: '_Tuple2',
+ _0: _elm_lang$core$Dict$Same,
+ _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _p51, _p52, _p46._0, _p53, _p54)
+ };
+ }
+ case 'LT':
+ var _p47 = up(_p53);
+ var flag = _p47._0;
+ var newLeft = _p47._1;
+ var _p48 = flag;
+ switch (_p48.ctor) {
+ case 'Same':
+ return {
+ ctor: '_Tuple2',
+ _0: _elm_lang$core$Dict$Same,
+ _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _p51, _p52, _p55, newLeft, _p54)
+ };
+ case 'Insert':
+ return {
+ ctor: '_Tuple2',
+ _0: _elm_lang$core$Dict$Insert,
+ _1: A5(_elm_lang$core$Dict$balance, _p51, _p52, _p55, newLeft, _p54)
+ };
+ default:
+ return {
+ ctor: '_Tuple2',
+ _0: _elm_lang$core$Dict$Remove,
+ _1: A5(_elm_lang$core$Dict$bubble, _p51, _p52, _p55, newLeft, _p54)
+ };
+ }
+ default:
+ var _p49 = up(_p54);
+ var flag = _p49._0;
+ var newRight = _p49._1;
+ var _p50 = flag;
+ switch (_p50.ctor) {
+ case 'Same':
+ return {
+ ctor: '_Tuple2',
+ _0: _elm_lang$core$Dict$Same,
+ _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _p51, _p52, _p55, _p53, newRight)
+ };
+ case 'Insert':
+ return {
+ ctor: '_Tuple2',
+ _0: _elm_lang$core$Dict$Insert,
+ _1: A5(_elm_lang$core$Dict$balance, _p51, _p52, _p55, _p53, newRight)
+ };
+ default:
+ return {
+ ctor: '_Tuple2',
+ _0: _elm_lang$core$Dict$Remove,
+ _1: A5(_elm_lang$core$Dict$bubble, _p51, _p52, _p55, _p53, newRight)
+ };
+ }
+ }
+ }
+ };
+ var _p56 = up(dict);
+ var flag = _p56._0;
+ var updatedDict = _p56._1;
+ var _p57 = flag;
+ switch (_p57.ctor) {
+ case 'Same':
+ return updatedDict;
+ case 'Insert':
+ return _elm_lang$core$Dict$ensureBlackRoot(updatedDict);
+ default:
+ return _elm_lang$core$Dict$blacken(updatedDict);
+ }
+ });
+var _elm_lang$core$Dict$insert = F3(
+ function (key, value, dict) {
+ return A3(
+ _elm_lang$core$Dict$update,
+ key,
+ _elm_lang$core$Basics$always(
+ _elm_lang$core$Maybe$Just(value)),
+ dict);
+ });
+var _elm_lang$core$Dict$singleton = F2(
+ function (key, value) {
+ return A3(_elm_lang$core$Dict$insert, key, value, _elm_lang$core$Dict$empty);
+ });
+var _elm_lang$core$Dict$union = F2(
+ function (t1, t2) {
+ return A3(_elm_lang$core$Dict$foldl, _elm_lang$core$Dict$insert, t2, t1);
+ });
+var _elm_lang$core$Dict$filter = F2(
+ function (predicate, dictionary) {
+ var add = F3(
+ function (key, value, dict) {
+ return A2(predicate, key, value) ? A3(_elm_lang$core$Dict$insert, key, value, dict) : dict;
+ });
+ return A3(_elm_lang$core$Dict$foldl, add, _elm_lang$core$Dict$empty, dictionary);
+ });
+var _elm_lang$core$Dict$intersect = F2(
+ function (t1, t2) {
+ return A2(
+ _elm_lang$core$Dict$filter,
+ F2(
+ function (k, _p58) {
+ return A2(_elm_lang$core$Dict$member, k, t2);
+ }),
+ t1);
+ });
+var _elm_lang$core$Dict$partition = F2(
+ function (predicate, dict) {
+ var add = F3(
+ function (key, value, _p59) {
+ var _p60 = _p59;
+ var _p62 = _p60._1;
+ var _p61 = _p60._0;
+ return A2(predicate, key, value) ? {
+ ctor: '_Tuple2',
+ _0: A3(_elm_lang$core$Dict$insert, key, value, _p61),
+ _1: _p62
+ } : {
+ ctor: '_Tuple2',
+ _0: _p61,
+ _1: A3(_elm_lang$core$Dict$insert, key, value, _p62)
+ };
+ });
+ return A3(
+ _elm_lang$core$Dict$foldl,
+ add,
+ {ctor: '_Tuple2', _0: _elm_lang$core$Dict$empty, _1: _elm_lang$core$Dict$empty},
+ dict);
+ });
+var _elm_lang$core$Dict$fromList = function (assocs) {
+ return A3(
+ _elm_lang$core$List$foldl,
+ F2(
+ function (_p63, dict) {
+ var _p64 = _p63;
+ return A3(_elm_lang$core$Dict$insert, _p64._0, _p64._1, dict);
+ }),
+ _elm_lang$core$Dict$empty,
+ assocs);
+};
+var _elm_lang$core$Dict$remove = F2(
+ function (key, dict) {
+ return A3(
+ _elm_lang$core$Dict$update,
+ key,
+ _elm_lang$core$Basics$always(_elm_lang$core$Maybe$Nothing),
+ dict);
+ });
+var _elm_lang$core$Dict$diff = F2(
+ function (t1, t2) {
+ return A3(
+ _elm_lang$core$Dict$foldl,
+ F3(
+ function (k, v, t) {
+ return A2(_elm_lang$core$Dict$remove, k, t);
+ }),
+ t1,
+ t2);
+ });
+
+//import Maybe, Native.Array, Native.List, Native.Utils, Result //
+
+var _elm_lang$core$Native_Json = function() {
+
+
+// CORE DECODERS
+
+function succeed(msg)
+{
+ return {
+ ctor: '',
+ tag: 'succeed',
+ msg: msg
+ };
+}
+
+function fail(msg)
+{
+ return {
+ ctor: '',
+ tag: 'fail',
+ msg: msg
+ };
+}
+
+function decodePrimitive(tag)
+{
+ return {
+ ctor: '',
+ tag: tag
+ };
+}
+
+function decodeContainer(tag, decoder)
+{
+ return {
+ ctor: '',
+ tag: tag,
+ decoder: decoder
+ };
+}
+
+function decodeNull(value)
+{
+ return {
+ ctor: '',
+ tag: 'null',
+ value: value
+ };
+}
+
+function decodeField(field, decoder)
+{
+ return {
+ ctor: '',
+ tag: 'field',
+ field: field,
+ decoder: decoder
+ };
+}
+
+function decodeIndex(index, decoder)
+{
+ return {
+ ctor: '',
+ tag: 'index',
+ index: index,
+ decoder: decoder
+ };
+}
+
+function decodeKeyValuePairs(decoder)
+{
+ return {
+ ctor: '',
+ tag: 'key-value',
+ decoder: decoder
+ };
+}
+
+function mapMany(f, decoders)
+{
+ return {
+ ctor: '',
+ tag: 'map-many',
+ func: f,
+ decoders: decoders
+ };
+}
+
+function andThen(callback, decoder)
+{
+ return {
+ ctor: '',
+ tag: 'andThen',
+ decoder: decoder,
+ callback: callback
+ };
+}
+
+function oneOf(decoders)
+{
+ return {
+ ctor: '',
+ tag: 'oneOf',
+ decoders: decoders
+ };
+}
+
+
+// DECODING OBJECTS
+
+function map1(f, d1)
+{
+ return mapMany(f, [d1]);
+}
+
+function map2(f, d1, d2)
+{
+ return mapMany(f, [d1, d2]);
+}
+
+function map3(f, d1, d2, d3)
+{
+ return mapMany(f, [d1, d2, d3]);
+}
+
+function map4(f, d1, d2, d3, d4)
+{
+ return mapMany(f, [d1, d2, d3, d4]);
+}
+
+function map5(f, d1, d2, d3, d4, d5)
+{
+ return mapMany(f, [d1, d2, d3, d4, d5]);
+}
+
+function map6(f, d1, d2, d3, d4, d5, d6)
+{
+ return mapMany(f, [d1, d2, d3, d4, d5, d6]);
+}
+
+function map7(f, d1, d2, d3, d4, d5, d6, d7)
+{
+ return mapMany(f, [d1, d2, d3, d4, d5, d6, d7]);
+}
+
+function map8(f, d1, d2, d3, d4, d5, d6, d7, d8)
+{
+ return mapMany(f, [d1, d2, d3, d4, d5, d6, d7, d8]);
+}
+
+
+// DECODE HELPERS
+
+function ok(value)
+{
+ return { tag: 'ok', value: value };
+}
+
+function badPrimitive(type, value)
+{
+ return { tag: 'primitive', type: type, value: value };
+}
+
+function badIndex(index, nestedProblems)
+{
+ return { tag: 'index', index: index, rest: nestedProblems };
+}
+
+function badField(field, nestedProblems)
+{
+ return { tag: 'field', field: field, rest: nestedProblems };
+}
+
+function badIndex(index, nestedProblems)
+{
+ return { tag: 'index', index: index, rest: nestedProblems };
+}
+
+function badOneOf(problems)
+{
+ return { tag: 'oneOf', problems: problems };
+}
+
+function bad(msg)
+{
+ return { tag: 'fail', msg: msg };
+}
+
+function badToString(problem)
+{
+ var context = '_';
+ while (problem)
+ {
+ switch (problem.tag)
+ {
+ case 'primitive':
+ return 'Expecting ' + problem.type
+ + (context === '_' ? '' : ' at ' + context)
+ + ' but instead got: ' + jsToString(problem.value);
+
+ case 'index':
+ context += '[' + problem.index + ']';
+ problem = problem.rest;
+ break;
+
+ case 'field':
+ context += '.' + problem.field;
+ problem = problem.rest;
+ break;
+
+ case 'oneOf':
+ var problems = problem.problems;
+ for (var i = 0; i < problems.length; i++)
+ {
+ problems[i] = badToString(problems[i]);
+ }
+ return 'I ran into the following problems'
+ + (context === '_' ? '' : ' at ' + context)
+ + ':\n\n' + problems.join('\n');
+
+ case 'fail':
+ return 'I ran into a `fail` decoder'
+ + (context === '_' ? '' : ' at ' + context)
+ + ': ' + problem.msg;
+ }
+ }
+}
+
+function jsToString(value)
+{
+ return value === undefined
+ ? 'undefined'
+ : JSON.stringify(value);
+}
+
+
+// DECODE
+
+function runOnString(decoder, string)
+{
+ var json;
+ try
+ {
+ json = JSON.parse(string);
+ }
+ catch (e)
+ {
+ return _elm_lang$core$Result$Err('Given an invalid JSON: ' + e.message);
+ }
+ return run(decoder, json);
+}
+
+function run(decoder, value)
+{
+ var result = runHelp(decoder, value);
+ return (result.tag === 'ok')
+ ? _elm_lang$core$Result$Ok(result.value)
+ : _elm_lang$core$Result$Err(badToString(result));
+}
+
+function runHelp(decoder, value)
+{
+ switch (decoder.tag)
+ {
+ case 'bool':
+ return (typeof value === 'boolean')
+ ? ok(value)
+ : badPrimitive('a Bool', value);
+
+ case 'int':
+ if (typeof value !== 'number') {
+ return badPrimitive('an Int', value);
+ }
+
+ if (-2147483647 < value && value < 2147483647 && (value | 0) === value) {
+ return ok(value);
+ }
+
+ if (isFinite(value) && !(value % 1)) {
+ return ok(value);
+ }
+
+ return badPrimitive('an Int', value);
+
+ case 'float':
+ return (typeof value === 'number')
+ ? ok(value)
+ : badPrimitive('a Float', value);
+
+ case 'string':
+ return (typeof value === 'string')
+ ? ok(value)
+ : (value instanceof String)
+ ? ok(value + '')
+ : badPrimitive('a String', value);
+
+ case 'null':
+ return (value === null)
+ ? ok(decoder.value)
+ : badPrimitive('null', value);
+
+ case 'value':
+ return ok(value);
+
+ case 'list':
+ if (!(value instanceof Array))
+ {
+ return badPrimitive('a List', value);
+ }
+
+ var list = _elm_lang$core$Native_List.Nil;
+ for (var i = value.length; i--; )
+ {
+ var result = runHelp(decoder.decoder, value[i]);
+ if (result.tag !== 'ok')
+ {
+ return badIndex(i, result)
+ }
+ list = _elm_lang$core$Native_List.Cons(result.value, list);
+ }
+ return ok(list);
+
+ case 'array':
+ if (!(value instanceof Array))
+ {
+ return badPrimitive('an Array', value);
+ }
+
+ var len = value.length;
+ var array = new Array(len);
+ for (var i = len; i--; )
+ {
+ var result = runHelp(decoder.decoder, value[i]);
+ if (result.tag !== 'ok')
+ {
+ return badIndex(i, result);
+ }
+ array[i] = result.value;
+ }
+ return ok(_elm_lang$core$Native_Array.fromJSArray(array));
+
+ case 'maybe':
+ var result = runHelp(decoder.decoder, value);
+ return (result.tag === 'ok')
+ ? ok(_elm_lang$core$Maybe$Just(result.value))
+ : ok(_elm_lang$core$Maybe$Nothing);
+
+ case 'field':
+ var field = decoder.field;
+ if (typeof value !== 'object' || value === null || !(field in value))
+ {
+ return badPrimitive('an object with a field named `' + field + '`', value);
+ }
+
+ var result = runHelp(decoder.decoder, value[field]);
+ return (result.tag === 'ok') ? result : badField(field, result);
+
+ case 'index':
+ var index = decoder.index;
+ if (!(value instanceof Array))
+ {
+ return badPrimitive('an array', value);
+ }
+ if (index >= value.length)
+ {
+ return badPrimitive('a longer array. Need index ' + index + ' but there are only ' + value.length + ' entries', value);
+ }
+
+ var result = runHelp(decoder.decoder, value[index]);
+ return (result.tag === 'ok') ? result : badIndex(index, result);
+
+ case 'key-value':
+ if (typeof value !== 'object' || value === null || value instanceof Array)
+ {
+ return badPrimitive('an object', value);
+ }
+
+ var keyValuePairs = _elm_lang$core$Native_List.Nil;
+ for (var key in value)
+ {
+ var result = runHelp(decoder.decoder, value[key]);
+ if (result.tag !== 'ok')
+ {
+ return badField(key, result);
+ }
+ var pair = _elm_lang$core$Native_Utils.Tuple2(key, result.value);
+ keyValuePairs = _elm_lang$core$Native_List.Cons(pair, keyValuePairs);
+ }
+ return ok(keyValuePairs);
+
+ case 'map-many':
+ var answer = decoder.func;
+ var decoders = decoder.decoders;
+ for (var i = 0; i < decoders.length; i++)
+ {
+ var result = runHelp(decoders[i], value);
+ if (result.tag !== 'ok')
+ {
+ return result;
+ }
+ answer = answer(result.value);
+ }
+ return ok(answer);
+
+ case 'andThen':
+ var result = runHelp(decoder.decoder, value);
+ return (result.tag !== 'ok')
+ ? result
+ : runHelp(decoder.callback(result.value), value);
+
+ case 'oneOf':
+ var errors = [];
+ var temp = decoder.decoders;
+ while (temp.ctor !== '[]')
+ {
+ var result = runHelp(temp._0, value);
+
+ if (result.tag === 'ok')
+ {
+ return result;
+ }
+
+ errors.push(result);
+
+ temp = temp._1;
+ }
+ return badOneOf(errors);
+
+ case 'fail':
+ return bad(decoder.msg);
+
+ case 'succeed':
+ return ok(decoder.msg);
+ }
+}
+
+
+// EQUALITY
+
+function equality(a, b)
+{
+ if (a === b)
+ {
+ return true;
+ }
+
+ if (a.tag !== b.tag)
+ {
+ return false;
+ }
+
+ switch (a.tag)
+ {
+ case 'succeed':
+ case 'fail':
+ return a.msg === b.msg;
+
+ case 'bool':
+ case 'int':
+ case 'float':
+ case 'string':
+ case 'value':
+ return true;
+
+ case 'null':
+ return a.value === b.value;
+
+ case 'list':
+ case 'array':
+ case 'maybe':
+ case 'key-value':
+ return equality(a.decoder, b.decoder);
+
+ case 'field':
+ return a.field === b.field && equality(a.decoder, b.decoder);
+
+ case 'index':
+ return a.index === b.index && equality(a.decoder, b.decoder);
+
+ case 'map-many':
+ if (a.func !== b.func)
+ {
+ return false;
+ }
+ return listEquality(a.decoders, b.decoders);
+
+ case 'andThen':
+ return a.callback === b.callback && equality(a.decoder, b.decoder);
+
+ case 'oneOf':
+ return listEquality(a.decoders, b.decoders);
+ }
+}
+
+function listEquality(aDecoders, bDecoders)
+{
+ var len = aDecoders.length;
+ if (len !== bDecoders.length)
+ {
+ return false;
+ }
+ for (var i = 0; i < len; i++)
+ {
+ if (!equality(aDecoders[i], bDecoders[i]))
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+
+// ENCODE
+
+function encode(indentLevel, value)
+{
+ return JSON.stringify(value, null, indentLevel);
+}
+
+function identity(value)
+{
+ return value;
+}
+
+function encodeObject(keyValuePairs)
+{
+ var obj = {};
+ while (keyValuePairs.ctor !== '[]')
+ {
+ var pair = keyValuePairs._0;
+ obj[pair._0] = pair._1;
+ keyValuePairs = keyValuePairs._1;
+ }
+ return obj;
+}
+
+return {
+ encode: F2(encode),
+ runOnString: F2(runOnString),
+ run: F2(run),
+
+ decodeNull: decodeNull,
+ decodePrimitive: decodePrimitive,
+ decodeContainer: F2(decodeContainer),
+
+ decodeField: F2(decodeField),
+ decodeIndex: F2(decodeIndex),
+
+ map1: F2(map1),
+ map2: F3(map2),
+ map3: F4(map3),
+ map4: F5(map4),
+ map5: F6(map5),
+ map6: F7(map6),
+ map7: F8(map7),
+ map8: F9(map8),
+ decodeKeyValuePairs: decodeKeyValuePairs,
+
+ andThen: F2(andThen),
+ fail: fail,
+ succeed: succeed,
+ oneOf: oneOf,
+
+ identity: identity,
+ encodeNull: null,
+ encodeArray: _elm_lang$core$Native_Array.toJSArray,
+ encodeList: _elm_lang$core$Native_List.toArray,
+ encodeObject: encodeObject,
+
+ equality: equality
+};
+
+}();
+
+var _elm_lang$core$Json_Encode$list = _elm_lang$core$Native_Json.encodeList;
+var _elm_lang$core$Json_Encode$array = _elm_lang$core$Native_Json.encodeArray;
+var _elm_lang$core$Json_Encode$object = _elm_lang$core$Native_Json.encodeObject;
+var _elm_lang$core$Json_Encode$null = _elm_lang$core$Native_Json.encodeNull;
+var _elm_lang$core$Json_Encode$bool = _elm_lang$core$Native_Json.identity;
+var _elm_lang$core$Json_Encode$float = _elm_lang$core$Native_Json.identity;
+var _elm_lang$core$Json_Encode$int = _elm_lang$core$Native_Json.identity;
+var _elm_lang$core$Json_Encode$string = _elm_lang$core$Native_Json.identity;
+var _elm_lang$core$Json_Encode$encode = _elm_lang$core$Native_Json.encode;
+var _elm_lang$core$Json_Encode$Value = {ctor: 'Value'};
+
+var _elm_lang$core$Json_Decode$null = _elm_lang$core$Native_Json.decodeNull;
+var _elm_lang$core$Json_Decode$value = _elm_lang$core$Native_Json.decodePrimitive('value');
+var _elm_lang$core$Json_Decode$andThen = _elm_lang$core$Native_Json.andThen;
+var _elm_lang$core$Json_Decode$fail = _elm_lang$core$Native_Json.fail;
+var _elm_lang$core$Json_Decode$succeed = _elm_lang$core$Native_Json.succeed;
+var _elm_lang$core$Json_Decode$lazy = function (thunk) {
+ return A2(
+ _elm_lang$core$Json_Decode$andThen,
+ thunk,
+ _elm_lang$core$Json_Decode$succeed(
+ {ctor: '_Tuple0'}));
+};
+var _elm_lang$core$Json_Decode$decodeValue = _elm_lang$core$Native_Json.run;
+var _elm_lang$core$Json_Decode$decodeString = _elm_lang$core$Native_Json.runOnString;
+var _elm_lang$core$Json_Decode$map8 = _elm_lang$core$Native_Json.map8;
+var _elm_lang$core$Json_Decode$map7 = _elm_lang$core$Native_Json.map7;
+var _elm_lang$core$Json_Decode$map6 = _elm_lang$core$Native_Json.map6;
+var _elm_lang$core$Json_Decode$map5 = _elm_lang$core$Native_Json.map5;
+var _elm_lang$core$Json_Decode$map4 = _elm_lang$core$Native_Json.map4;
+var _elm_lang$core$Json_Decode$map3 = _elm_lang$core$Native_Json.map3;
+var _elm_lang$core$Json_Decode$map2 = _elm_lang$core$Native_Json.map2;
+var _elm_lang$core$Json_Decode$map = _elm_lang$core$Native_Json.map1;
+var _elm_lang$core$Json_Decode$oneOf = _elm_lang$core$Native_Json.oneOf;
+var _elm_lang$core$Json_Decode$maybe = function (decoder) {
+ return A2(_elm_lang$core$Native_Json.decodeContainer, 'maybe', decoder);
+};
+var _elm_lang$core$Json_Decode$index = _elm_lang$core$Native_Json.decodeIndex;
+var _elm_lang$core$Json_Decode$field = _elm_lang$core$Native_Json.decodeField;
+var _elm_lang$core$Json_Decode$at = F2(
+ function (fields, decoder) {
+ return A3(_elm_lang$core$List$foldr, _elm_lang$core$Json_Decode$field, decoder, fields);
+ });
+var _elm_lang$core$Json_Decode$keyValuePairs = _elm_lang$core$Native_Json.decodeKeyValuePairs;
+var _elm_lang$core$Json_Decode$dict = function (decoder) {
+ return A2(
+ _elm_lang$core$Json_Decode$map,
+ _elm_lang$core$Dict$fromList,
+ _elm_lang$core$Json_Decode$keyValuePairs(decoder));
+};
+var _elm_lang$core$Json_Decode$array = function (decoder) {
+ return A2(_elm_lang$core$Native_Json.decodeContainer, 'array', decoder);
+};
+var _elm_lang$core$Json_Decode$list = function (decoder) {
+ return A2(_elm_lang$core$Native_Json.decodeContainer, 'list', decoder);
+};
+var _elm_lang$core$Json_Decode$nullable = function (decoder) {
+ return _elm_lang$core$Json_Decode$oneOf(
+ {
+ ctor: '::',
+ _0: _elm_lang$core$Json_Decode$null(_elm_lang$core$Maybe$Nothing),
+ _1: {
+ ctor: '::',
+ _0: A2(_elm_lang$core$Json_Decode$map, _elm_lang$core$Maybe$Just, decoder),
+ _1: {ctor: '[]'}
+ }
+ });
+};
+var _elm_lang$core$Json_Decode$float = _elm_lang$core$Native_Json.decodePrimitive('float');
+var _elm_lang$core$Json_Decode$int = _elm_lang$core$Native_Json.decodePrimitive('int');
+var _elm_lang$core$Json_Decode$bool = _elm_lang$core$Native_Json.decodePrimitive('bool');
+var _elm_lang$core$Json_Decode$string = _elm_lang$core$Native_Json.decodePrimitive('string');
+var _elm_lang$core$Json_Decode$Decoder = {ctor: 'Decoder'};
+
+var _elm_lang$core$Debug$crash = _elm_lang$core$Native_Debug.crash;
+var _elm_lang$core$Debug$log = _elm_lang$core$Native_Debug.log;
+
+var _elm_lang$core$Tuple$mapSecond = F2(
+ function (func, _p0) {
+ var _p1 = _p0;
+ return {
+ ctor: '_Tuple2',
+ _0: _p1._0,
+ _1: func(_p1._1)
+ };
+ });
+var _elm_lang$core$Tuple$mapFirst = F2(
+ function (func, _p2) {
+ var _p3 = _p2;
+ return {
+ ctor: '_Tuple2',
+ _0: func(_p3._0),
+ _1: _p3._1
+ };
+ });
+var _elm_lang$core$Tuple$second = function (_p4) {
+ var _p5 = _p4;
+ return _p5._1;
+};
+var _elm_lang$core$Tuple$first = function (_p6) {
+ var _p7 = _p6;
+ return _p7._0;
+};
+
+//import //
+
+var _elm_lang$core$Native_Platform = function() {
+
+
+// PROGRAMS
+
+function program(impl)
+{
+ return function(flagDecoder)
+ {
+ return function(object, moduleName)
+ {
+ object['worker'] = function worker(flags)
+ {
+ if (typeof flags !== 'undefined')
+ {
+ throw new Error(
+ 'The `' + moduleName + '` module does not need flags.\n'
+ + 'Call ' + moduleName + '.worker() with no arguments and you should be all set!'
+ );
+ }
+
+ return initialize(
+ impl.init,
+ impl.update,
+ impl.subscriptions,
+ renderer
+ );
+ };
+ };
+ };
+}
+
+function programWithFlags(impl)
+{
+ return function(flagDecoder)
+ {
+ return function(object, moduleName)
+ {
+ object['worker'] = function worker(flags)
+ {
+ if (typeof flagDecoder === 'undefined')
+ {
+ throw new Error(
+ 'Are you trying to sneak a Never value into Elm? Trickster!\n'
+ + 'It looks like ' + moduleName + '.main is defined with `programWithFlags` but has type `Program Never`.\n'
+ + 'Use `program` instead if you do not want flags.'
+ );
+ }
+
+ var result = A2(_elm_lang$core$Native_Json.run, flagDecoder, flags);
+ if (result.ctor === 'Err')
+ {
+ throw new Error(
+ moduleName + '.worker(...) was called with an unexpected argument.\n'
+ + 'I tried to convert it to an Elm value, but ran into this problem:\n\n'
+ + result._0
+ );
+ }
+
+ return initialize(
+ impl.init(result._0),
+ impl.update,
+ impl.subscriptions,
+ renderer
+ );
+ };
+ };
+ };
+}
+
+function renderer(enqueue, _)
+{
+ return function(_) {};
+}
+
+
+// HTML TO PROGRAM
+
+function htmlToProgram(vnode)
+{
+ var emptyBag = batch(_elm_lang$core$Native_List.Nil);
+ var noChange = _elm_lang$core$Native_Utils.Tuple2(
+ _elm_lang$core$Native_Utils.Tuple0,
+ emptyBag
+ );
+
+ return _elm_lang$virtual_dom$VirtualDom$program({
+ init: noChange,
+ view: function(model) { return main; },
+ update: F2(function(msg, model) { return noChange; }),
+ subscriptions: function (model) { return emptyBag; }
+ });
+}
+
+
+// INITIALIZE A PROGRAM
+
+function initialize(init, update, subscriptions, renderer)
+{
+ // ambient state
+ var managers = {};
+ var updateView;
+
+ // init and update state in main process
+ var initApp = _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) {
+ var model = init._0;
+ updateView = renderer(enqueue, model);
+ var cmds = init._1;
+ var subs = subscriptions(model);
+ dispatchEffects(managers, cmds, subs);
+ callback(_elm_lang$core$Native_Scheduler.succeed(model));
+ });
+
+ function onMessage(msg, model)
+ {
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) {
+ var results = A2(update, msg, model);
+ model = results._0;
+ updateView(model);
+ var cmds = results._1;
+ var subs = subscriptions(model);
+ dispatchEffects(managers, cmds, subs);
+ callback(_elm_lang$core$Native_Scheduler.succeed(model));
+ });
+ }
+
+ var mainProcess = spawnLoop(initApp, onMessage);
+
+ function enqueue(msg)
+ {
+ _elm_lang$core$Native_Scheduler.rawSend(mainProcess, msg);
+ }
+
+ var ports = setupEffects(managers, enqueue);
+
+ return ports ? { ports: ports } : {};
+}
+
+
+// EFFECT MANAGERS
+
+var effectManagers = {};
+
+function setupEffects(managers, callback)
+{
+ var ports;
+
+ // setup all necessary effect managers
+ for (var key in effectManagers)
+ {
+ var manager = effectManagers[key];
+
+ if (manager.isForeign)
+ {
+ ports = ports || {};
+ ports[key] = manager.tag === 'cmd'
+ ? setupOutgoingPort(key)
+ : setupIncomingPort(key, callback);
+ }
+
+ managers[key] = makeManager(manager, callback);
+ }
+
+ return ports;
+}
+
+function makeManager(info, callback)
+{
+ var router = {
+ main: callback,
+ self: undefined
+ };
+
+ var tag = info.tag;
+ var onEffects = info.onEffects;
+ var onSelfMsg = info.onSelfMsg;
+
+ function onMessage(msg, state)
+ {
+ if (msg.ctor === 'self')
+ {
+ return A3(onSelfMsg, router, msg._0, state);
+ }
+
+ var fx = msg._0;
+ switch (tag)
+ {
+ case 'cmd':
+ return A3(onEffects, router, fx.cmds, state);
+
+ case 'sub':
+ return A3(onEffects, router, fx.subs, state);
+
+ case 'fx':
+ return A4(onEffects, router, fx.cmds, fx.subs, state);
+ }
+ }
+
+ var process = spawnLoop(info.init, onMessage);
+ router.self = process;
+ return process;
+}
+
+function sendToApp(router, msg)
+{
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback)
+ {
+ router.main(msg);
+ callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0));
+ });
+}
+
+function sendToSelf(router, msg)
+{
+ return A2(_elm_lang$core$Native_Scheduler.send, router.self, {
+ ctor: 'self',
+ _0: msg
+ });
+}
+
+
+// HELPER for STATEFUL LOOPS
+
+function spawnLoop(init, onMessage)
+{
+ var andThen = _elm_lang$core$Native_Scheduler.andThen;
+
+ function loop(state)
+ {
+ var handleMsg = _elm_lang$core$Native_Scheduler.receive(function(msg) {
+ return onMessage(msg, state);
+ });
+ return A2(andThen, loop, handleMsg);
+ }
+
+ var task = A2(andThen, loop, init);
+
+ return _elm_lang$core$Native_Scheduler.rawSpawn(task);
+}
+
+
+// BAGS
+
+function leaf(home)
+{
+ return function(value)
+ {
+ return {
+ type: 'leaf',
+ home: home,
+ value: value
+ };
+ };
+}
+
+function batch(list)
+{
+ return {
+ type: 'node',
+ branches: list
+ };
+}
+
+function map(tagger, bag)
+{
+ return {
+ type: 'map',
+ tagger: tagger,
+ tree: bag
+ }
+}
+
+
+// PIPE BAGS INTO EFFECT MANAGERS
+
+function dispatchEffects(managers, cmdBag, subBag)
+{
+ var effectsDict = {};
+ gatherEffects(true, cmdBag, effectsDict, null);
+ gatherEffects(false, subBag, effectsDict, null);
+
+ for (var home in managers)
+ {
+ var fx = home in effectsDict
+ ? effectsDict[home]
+ : {
+ cmds: _elm_lang$core$Native_List.Nil,
+ subs: _elm_lang$core$Native_List.Nil
+ };
+
+ _elm_lang$core$Native_Scheduler.rawSend(managers[home], { ctor: 'fx', _0: fx });
+ }
+}
+
+function gatherEffects(isCmd, bag, effectsDict, taggers)
+{
+ switch (bag.type)
+ {
+ case 'leaf':
+ var home = bag.home;
+ var effect = toEffect(isCmd, home, taggers, bag.value);
+ effectsDict[home] = insert(isCmd, effect, effectsDict[home]);
+ return;
+
+ case 'node':
+ var list = bag.branches;
+ while (list.ctor !== '[]')
+ {
+ gatherEffects(isCmd, list._0, effectsDict, taggers);
+ list = list._1;
+ }
+ return;
+
+ case 'map':
+ gatherEffects(isCmd, bag.tree, effectsDict, {
+ tagger: bag.tagger,
+ rest: taggers
+ });
+ return;
+ }
+}
+
+function toEffect(isCmd, home, taggers, value)
+{
+ function applyTaggers(x)
+ {
+ var temp = taggers;
+ while (temp)
+ {
+ x = temp.tagger(x);
+ temp = temp.rest;
+ }
+ return x;
+ }
+
+ var map = isCmd
+ ? effectManagers[home].cmdMap
+ : effectManagers[home].subMap;
+
+ return A2(map, applyTaggers, value)
+}
+
+function insert(isCmd, newEffect, effects)
+{
+ effects = effects || {
+ cmds: _elm_lang$core$Native_List.Nil,
+ subs: _elm_lang$core$Native_List.Nil
+ };
+ if (isCmd)
+ {
+ effects.cmds = _elm_lang$core$Native_List.Cons(newEffect, effects.cmds);
+ return effects;
+ }
+ effects.subs = _elm_lang$core$Native_List.Cons(newEffect, effects.subs);
+ return effects;
+}
+
+
+// PORTS
+
+function checkPortName(name)
+{
+ if (name in effectManagers)
+ {
+ throw new Error('There can only be one port named `' + name + '`, but your program has multiple.');
+ }
+}
+
+
+// OUTGOING PORTS
+
+function outgoingPort(name, converter)
+{
+ checkPortName(name);
+ effectManagers[name] = {
+ tag: 'cmd',
+ cmdMap: outgoingPortMap,
+ converter: converter,
+ isForeign: true
+ };
+ return leaf(name);
+}
+
+var outgoingPortMap = F2(function cmdMap(tagger, value) {
+ return value;
+});
+
+function setupOutgoingPort(name)
+{
+ var subs = [];
+ var converter = effectManagers[name].converter;
+
+ // CREATE MANAGER
+
+ var init = _elm_lang$core$Native_Scheduler.succeed(null);
+
+ function onEffects(router, cmdList, state)
+ {
+ while (cmdList.ctor !== '[]')
+ {
+ // grab a separate reference to subs in case unsubscribe is called
+ var currentSubs = subs;
+ var value = converter(cmdList._0);
+ for (var i = 0; i < currentSubs.length; i++)
+ {
+ currentSubs[i](value);
+ }
+ cmdList = cmdList._1;
+ }
+ return init;
+ }
+
+ effectManagers[name].init = init;
+ effectManagers[name].onEffects = F3(onEffects);
+
+ // PUBLIC API
+
+ function subscribe(callback)
+ {
+ subs.push(callback);
+ }
+
+ function unsubscribe(callback)
+ {
+ // copy subs into a new array in case unsubscribe is called within a
+ // subscribed callback
+ subs = subs.slice();
+ var index = subs.indexOf(callback);
+ if (index >= 0)
+ {
+ subs.splice(index, 1);
+ }
+ }
+
+ return {
+ subscribe: subscribe,
+ unsubscribe: unsubscribe
+ };
+}
+
+
+// INCOMING PORTS
+
+function incomingPort(name, converter)
+{
+ checkPortName(name);
+ effectManagers[name] = {
+ tag: 'sub',
+ subMap: incomingPortMap,
+ converter: converter,
+ isForeign: true
+ };
+ return leaf(name);
+}
+
+var incomingPortMap = F2(function subMap(tagger, finalTagger)
+{
+ return function(value)
+ {
+ return tagger(finalTagger(value));
+ };
+});
+
+function setupIncomingPort(name, callback)
+{
+ var sentBeforeInit = [];
+ var subs = _elm_lang$core$Native_List.Nil;
+ var converter = effectManagers[name].converter;
+ var currentOnEffects = preInitOnEffects;
+ var currentSend = preInitSend;
+
+ // CREATE MANAGER
+
+ var init = _elm_lang$core$Native_Scheduler.succeed(null);
+
+ function preInitOnEffects(router, subList, state)
+ {
+ var postInitResult = postInitOnEffects(router, subList, state);
+
+ for(var i = 0; i < sentBeforeInit.length; i++)
+ {
+ postInitSend(sentBeforeInit[i]);
+ }
+
+ sentBeforeInit = null; // to release objects held in queue
+ currentSend = postInitSend;
+ currentOnEffects = postInitOnEffects;
+ return postInitResult;
+ }
+
+ function postInitOnEffects(router, subList, state)
+ {
+ subs = subList;
+ return init;
+ }
+
+ function onEffects(router, subList, state)
+ {
+ return currentOnEffects(router, subList, state);
+ }
+
+ effectManagers[name].init = init;
+ effectManagers[name].onEffects = F3(onEffects);
+
+ // PUBLIC API
+
+ function preInitSend(value)
+ {
+ sentBeforeInit.push(value);
+ }
+
+ function postInitSend(value)
+ {
+ var temp = subs;
+ while (temp.ctor !== '[]')
+ {
+ callback(temp._0(value));
+ temp = temp._1;
+ }
+ }
+
+ function send(incomingValue)
+ {
+ var result = A2(_elm_lang$core$Json_Decode$decodeValue, converter, incomingValue);
+ if (result.ctor === 'Err')
+ {
+ throw new Error('Trying to send an unexpected type of value through port `' + name + '`:\n' + result._0);
+ }
+
+ currentSend(result._0);
+ }
+
+ return { send: send };
+}
+
+return {
+ // routers
+ sendToApp: F2(sendToApp),
+ sendToSelf: F2(sendToSelf),
+
+ // global setup
+ effectManagers: effectManagers,
+ outgoingPort: outgoingPort,
+ incomingPort: incomingPort,
+
+ htmlToProgram: htmlToProgram,
+ program: program,
+ programWithFlags: programWithFlags,
+ initialize: initialize,
+
+ // effect bags
+ leaf: leaf,
+ batch: batch,
+ map: F2(map)
+};
+
+}();
+
+//import Native.Utils //
+
+var _elm_lang$core$Native_Scheduler = function() {
+
+var MAX_STEPS = 10000;
+
+
+// TASKS
+
+function succeed(value)
+{
+ return {
+ ctor: '_Task_succeed',
+ value: value
+ };
+}
+
+function fail(error)
+{
+ return {
+ ctor: '_Task_fail',
+ value: error
+ };
+}
+
+function nativeBinding(callback)
+{
+ return {
+ ctor: '_Task_nativeBinding',
+ callback: callback,
+ cancel: null
+ };
+}
+
+function andThen(callback, task)
+{
+ return {
+ ctor: '_Task_andThen',
+ callback: callback,
+ task: task
+ };
+}
+
+function onError(callback, task)
+{
+ return {
+ ctor: '_Task_onError',
+ callback: callback,
+ task: task
+ };
+}
+
+function receive(callback)
+{
+ return {
+ ctor: '_Task_receive',
+ callback: callback
+ };
+}
+
+
+// PROCESSES
+
+function rawSpawn(task)
+{
+ var process = {
+ ctor: '_Process',
+ id: _elm_lang$core$Native_Utils.guid(),
+ root: task,
+ stack: null,
+ mailbox: []
+ };
+
+ enqueue(process);
+
+ return process;
+}
+
+function spawn(task)
+{
+ return nativeBinding(function(callback) {
+ var process = rawSpawn(task);
+ callback(succeed(process));
+ });
+}
+
+function rawSend(process, msg)
+{
+ process.mailbox.push(msg);
+ enqueue(process);
+}
+
+function send(process, msg)
+{
+ return nativeBinding(function(callback) {
+ rawSend(process, msg);
+ callback(succeed(_elm_lang$core$Native_Utils.Tuple0));
+ });
+}
+
+function kill(process)
+{
+ return nativeBinding(function(callback) {
+ var root = process.root;
+ if (root.ctor === '_Task_nativeBinding' && root.cancel)
+ {
+ root.cancel();
+ }
+
+ process.root = null;
+
+ callback(succeed(_elm_lang$core$Native_Utils.Tuple0));
+ });
+}
+
+function sleep(time)
+{
+ return nativeBinding(function(callback) {
+ var id = setTimeout(function() {
+ callback(succeed(_elm_lang$core$Native_Utils.Tuple0));
+ }, time);
+
+ return function() { clearTimeout(id); };
+ });
+}
+
+
+// STEP PROCESSES
+
+function step(numSteps, process)
+{
+ while (numSteps < MAX_STEPS)
+ {
+ var ctor = process.root.ctor;
+
+ if (ctor === '_Task_succeed')
+ {
+ while (process.stack && process.stack.ctor === '_Task_onError')
+ {
+ process.stack = process.stack.rest;
+ }
+ if (process.stack === null)
+ {
+ break;
+ }
+ process.root = process.stack.callback(process.root.value);
+ process.stack = process.stack.rest;
+ ++numSteps;
+ continue;
+ }
+
+ if (ctor === '_Task_fail')
+ {
+ while (process.stack && process.stack.ctor === '_Task_andThen')
+ {
+ process.stack = process.stack.rest;
+ }
+ if (process.stack === null)
+ {
+ break;
+ }
+ process.root = process.stack.callback(process.root.value);
+ process.stack = process.stack.rest;
+ ++numSteps;
+ continue;
+ }
+
+ if (ctor === '_Task_andThen')
+ {
+ process.stack = {
+ ctor: '_Task_andThen',
+ callback: process.root.callback,
+ rest: process.stack
+ };
+ process.root = process.root.task;
+ ++numSteps;
+ continue;
+ }
+
+ if (ctor === '_Task_onError')
+ {
+ process.stack = {
+ ctor: '_Task_onError',
+ callback: process.root.callback,
+ rest: process.stack
+ };
+ process.root = process.root.task;
+ ++numSteps;
+ continue;
+ }
+
+ if (ctor === '_Task_nativeBinding')
+ {
+ process.root.cancel = process.root.callback(function(newRoot) {
+ process.root = newRoot;
+ enqueue(process);
+ });
+
+ break;
+ }
+
+ if (ctor === '_Task_receive')
+ {
+ var mailbox = process.mailbox;
+ if (mailbox.length === 0)
+ {
+ break;
+ }
+
+ process.root = process.root.callback(mailbox.shift());
+ ++numSteps;
+ continue;
+ }
+
+ throw new Error(ctor);
+ }
+
+ if (numSteps < MAX_STEPS)
+ {
+ return numSteps + 1;
+ }
+ enqueue(process);
+
+ return numSteps;
+}
+
+
+// WORK QUEUE
+
+var working = false;
+var workQueue = [];
+
+function enqueue(process)
+{
+ workQueue.push(process);
+
+ if (!working)
+ {
+ setTimeout(work, 0);
+ working = true;
+ }
+}
+
+function work()
+{
+ var numSteps = 0;
+ var process;
+ while (numSteps < MAX_STEPS && (process = workQueue.shift()))
+ {
+ if (process.root)
+ {
+ numSteps = step(numSteps, process);
+ }
+ }
+ if (!process)
+ {
+ working = false;
+ return;
+ }
+ setTimeout(work, 0);
+}
+
+
+return {
+ succeed: succeed,
+ fail: fail,
+ nativeBinding: nativeBinding,
+ andThen: F2(andThen),
+ onError: F2(onError),
+ receive: receive,
+
+ spawn: spawn,
+ kill: kill,
+ sleep: sleep,
+ send: F2(send),
+
+ rawSpawn: rawSpawn,
+ rawSend: rawSend
+};
+
+}();
+var _elm_lang$core$Platform_Cmd$batch = _elm_lang$core$Native_Platform.batch;
+var _elm_lang$core$Platform_Cmd$none = _elm_lang$core$Platform_Cmd$batch(
+ {ctor: '[]'});
+var _elm_lang$core$Platform_Cmd_ops = _elm_lang$core$Platform_Cmd_ops || {};
+_elm_lang$core$Platform_Cmd_ops['!'] = F2(
+ function (model, commands) {
+ return {
+ ctor: '_Tuple2',
+ _0: model,
+ _1: _elm_lang$core$Platform_Cmd$batch(commands)
+ };
+ });
+var _elm_lang$core$Platform_Cmd$map = _elm_lang$core$Native_Platform.map;
+var _elm_lang$core$Platform_Cmd$Cmd = {ctor: 'Cmd'};
+
+var _elm_lang$core$Platform_Sub$batch = _elm_lang$core$Native_Platform.batch;
+var _elm_lang$core$Platform_Sub$none = _elm_lang$core$Platform_Sub$batch(
+ {ctor: '[]'});
+var _elm_lang$core$Platform_Sub$map = _elm_lang$core$Native_Platform.map;
+var _elm_lang$core$Platform_Sub$Sub = {ctor: 'Sub'};
+
+var _elm_lang$core$Platform$hack = _elm_lang$core$Native_Scheduler.succeed;
+var _elm_lang$core$Platform$sendToSelf = _elm_lang$core$Native_Platform.sendToSelf;
+var _elm_lang$core$Platform$sendToApp = _elm_lang$core$Native_Platform.sendToApp;
+var _elm_lang$core$Platform$programWithFlags = _elm_lang$core$Native_Platform.programWithFlags;
+var _elm_lang$core$Platform$program = _elm_lang$core$Native_Platform.program;
+var _elm_lang$core$Platform$Program = {ctor: 'Program'};
+var _elm_lang$core$Platform$Task = {ctor: 'Task'};
+var _elm_lang$core$Platform$ProcessId = {ctor: 'ProcessId'};
+var _elm_lang$core$Platform$Router = {ctor: 'Router'};
+
+var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode = _elm_lang$core$Json_Decode$succeed;
+var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$resolve = _elm_lang$core$Json_Decode$andThen(_elm_lang$core$Basics$identity);
+var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom = _elm_lang$core$Json_Decode$map2(
+ F2(
+ function (x, y) {
+ return y(x);
+ }));
+var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$hardcoded = function (_p0) {
+ return _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom(
+ _elm_lang$core$Json_Decode$succeed(_p0));
+};
+var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optionalDecoder = F3(
+ function (pathDecoder, valDecoder, fallback) {
+ var nullOr = function (decoder) {
+ return _elm_lang$core$Json_Decode$oneOf(
+ {
+ ctor: '::',
+ _0: decoder,
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$core$Json_Decode$null(fallback),
+ _1: {ctor: '[]'}
+ }
+ });
+ };
+ var handleResult = function (input) {
+ var _p1 = A2(_elm_lang$core$Json_Decode$decodeValue, pathDecoder, input);
+ if (_p1.ctor === 'Ok') {
+ var _p2 = A2(
+ _elm_lang$core$Json_Decode$decodeValue,
+ nullOr(valDecoder),
+ _p1._0);
+ if (_p2.ctor === 'Ok') {
+ return _elm_lang$core$Json_Decode$succeed(_p2._0);
+ } else {
+ return _elm_lang$core$Json_Decode$fail(_p2._0);
+ }
+ } else {
+ return _elm_lang$core$Json_Decode$succeed(fallback);
+ }
+ };
+ return A2(_elm_lang$core$Json_Decode$andThen, handleResult, _elm_lang$core$Json_Decode$value);
+ });
+var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optionalAt = F4(
+ function (path, valDecoder, fallback, decoder) {
+ return A2(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optionalDecoder,
+ A2(_elm_lang$core$Json_Decode$at, path, _elm_lang$core$Json_Decode$value),
+ valDecoder,
+ fallback),
+ decoder);
+ });
+var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional = F4(
+ function (key, valDecoder, fallback, decoder) {
+ return A2(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optionalDecoder,
+ A2(_elm_lang$core$Json_Decode$field, key, _elm_lang$core$Json_Decode$value),
+ valDecoder,
+ fallback),
+ decoder);
+ });
+var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$requiredAt = F3(
+ function (path, valDecoder, decoder) {
+ return A2(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom,
+ A2(_elm_lang$core$Json_Decode$at, path, valDecoder),
+ decoder);
+ });
+var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required = F3(
+ function (key, valDecoder, decoder) {
+ return A2(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom,
+ A2(_elm_lang$core$Json_Decode$field, key, valDecoder),
+ decoder);
+ });
+
+var _elm_lang$core$Set$foldr = F3(
+ function (f, b, _p0) {
+ var _p1 = _p0;
+ return A3(
+ _elm_lang$core$Dict$foldr,
+ F3(
+ function (k, _p2, b) {
+ return A2(f, k, b);
+ }),
+ b,
+ _p1._0);
+ });
+var _elm_lang$core$Set$foldl = F3(
+ function (f, b, _p3) {
+ var _p4 = _p3;
+ return A3(
+ _elm_lang$core$Dict$foldl,
+ F3(
+ function (k, _p5, b) {
+ return A2(f, k, b);
+ }),
+ b,
+ _p4._0);
+ });
+var _elm_lang$core$Set$toList = function (_p6) {
+ var _p7 = _p6;
+ return _elm_lang$core$Dict$keys(_p7._0);
+};
+var _elm_lang$core$Set$size = function (_p8) {
+ var _p9 = _p8;
+ return _elm_lang$core$Dict$size(_p9._0);
+};
+var _elm_lang$core$Set$member = F2(
+ function (k, _p10) {
+ var _p11 = _p10;
+ return A2(_elm_lang$core$Dict$member, k, _p11._0);
+ });
+var _elm_lang$core$Set$isEmpty = function (_p12) {
+ var _p13 = _p12;
+ return _elm_lang$core$Dict$isEmpty(_p13._0);
+};
+var _elm_lang$core$Set$Set_elm_builtin = function (a) {
+ return {ctor: 'Set_elm_builtin', _0: a};
+};
+var _elm_lang$core$Set$empty = _elm_lang$core$Set$Set_elm_builtin(_elm_lang$core$Dict$empty);
+var _elm_lang$core$Set$singleton = function (k) {
+ return _elm_lang$core$Set$Set_elm_builtin(
+ A2(
+ _elm_lang$core$Dict$singleton,
+ k,
+ {ctor: '_Tuple0'}));
+};
+var _elm_lang$core$Set$insert = F2(
+ function (k, _p14) {
+ var _p15 = _p14;
+ return _elm_lang$core$Set$Set_elm_builtin(
+ A3(
+ _elm_lang$core$Dict$insert,
+ k,
+ {ctor: '_Tuple0'},
+ _p15._0));
+ });
+var _elm_lang$core$Set$fromList = function (xs) {
+ return A3(_elm_lang$core$List$foldl, _elm_lang$core$Set$insert, _elm_lang$core$Set$empty, xs);
+};
+var _elm_lang$core$Set$map = F2(
+ function (f, s) {
+ return _elm_lang$core$Set$fromList(
+ A2(
+ _elm_lang$core$List$map,
+ f,
+ _elm_lang$core$Set$toList(s)));
+ });
+var _elm_lang$core$Set$remove = F2(
+ function (k, _p16) {
+ var _p17 = _p16;
+ return _elm_lang$core$Set$Set_elm_builtin(
+ A2(_elm_lang$core$Dict$remove, k, _p17._0));
+ });
+var _elm_lang$core$Set$union = F2(
+ function (_p19, _p18) {
+ var _p20 = _p19;
+ var _p21 = _p18;
+ return _elm_lang$core$Set$Set_elm_builtin(
+ A2(_elm_lang$core$Dict$union, _p20._0, _p21._0));
+ });
+var _elm_lang$core$Set$intersect = F2(
+ function (_p23, _p22) {
+ var _p24 = _p23;
+ var _p25 = _p22;
+ return _elm_lang$core$Set$Set_elm_builtin(
+ A2(_elm_lang$core$Dict$intersect, _p24._0, _p25._0));
+ });
+var _elm_lang$core$Set$diff = F2(
+ function (_p27, _p26) {
+ var _p28 = _p27;
+ var _p29 = _p26;
+ return _elm_lang$core$Set$Set_elm_builtin(
+ A2(_elm_lang$core$Dict$diff, _p28._0, _p29._0));
+ });
+var _elm_lang$core$Set$filter = F2(
+ function (p, _p30) {
+ var _p31 = _p30;
+ return _elm_lang$core$Set$Set_elm_builtin(
+ A2(
+ _elm_lang$core$Dict$filter,
+ F2(
+ function (k, _p32) {
+ return p(k);
+ }),
+ _p31._0));
+ });
+var _elm_lang$core$Set$partition = F2(
+ function (p, _p33) {
+ var _p34 = _p33;
+ var _p35 = A2(
+ _elm_lang$core$Dict$partition,
+ F2(
+ function (k, _p36) {
+ return p(k);
+ }),
+ _p34._0);
+ var p1 = _p35._0;
+ var p2 = _p35._1;
+ return {
+ ctor: '_Tuple2',
+ _0: _elm_lang$core$Set$Set_elm_builtin(p1),
+ _1: _elm_lang$core$Set$Set_elm_builtin(p2)
+ };
+ });
+
+var _elm_community$list_extra$List_Extra$greedyGroupsOfWithStep = F3(
+ function (size, step, xs) {
+ var okayXs = _elm_lang$core$Native_Utils.cmp(
+ _elm_lang$core$List$length(xs),
+ 0) > 0;
+ var okayArgs = (_elm_lang$core$Native_Utils.cmp(size, 0) > 0) && (_elm_lang$core$Native_Utils.cmp(step, 0) > 0);
+ var xs_ = A2(_elm_lang$core$List$drop, step, xs);
+ var group = A2(_elm_lang$core$List$take, size, xs);
+ return (okayArgs && okayXs) ? {
+ ctor: '::',
+ _0: group,
+ _1: A3(_elm_community$list_extra$List_Extra$greedyGroupsOfWithStep, size, step, xs_)
+ } : {ctor: '[]'};
+ });
+var _elm_community$list_extra$List_Extra$greedyGroupsOf = F2(
+ function (size, xs) {
+ return A3(_elm_community$list_extra$List_Extra$greedyGroupsOfWithStep, size, size, xs);
+ });
+var _elm_community$list_extra$List_Extra$groupsOfWithStep = F3(
+ function (size, step, xs) {
+ var okayArgs = (_elm_lang$core$Native_Utils.cmp(size, 0) > 0) && (_elm_lang$core$Native_Utils.cmp(step, 0) > 0);
+ var xs_ = A2(_elm_lang$core$List$drop, step, xs);
+ var group = A2(_elm_lang$core$List$take, size, xs);
+ var okayLength = _elm_lang$core$Native_Utils.eq(
+ size,
+ _elm_lang$core$List$length(group));
+ return (okayArgs && okayLength) ? {
+ ctor: '::',
+ _0: group,
+ _1: A3(_elm_community$list_extra$List_Extra$groupsOfWithStep, size, step, xs_)
+ } : {ctor: '[]'};
+ });
+var _elm_community$list_extra$List_Extra$groupsOf = F2(
+ function (size, xs) {
+ return A3(_elm_community$list_extra$List_Extra$groupsOfWithStep, size, size, xs);
+ });
+var _elm_community$list_extra$List_Extra$zip5 = _elm_lang$core$List$map5(
+ F5(
+ function (v0, v1, v2, v3, v4) {
+ return {ctor: '_Tuple5', _0: v0, _1: v1, _2: v2, _3: v3, _4: v4};
+ }));
+var _elm_community$list_extra$List_Extra$zip4 = _elm_lang$core$List$map4(
+ F4(
+ function (v0, v1, v2, v3) {
+ return {ctor: '_Tuple4', _0: v0, _1: v1, _2: v2, _3: v3};
+ }));
+var _elm_community$list_extra$List_Extra$zip3 = _elm_lang$core$List$map3(
+ F3(
+ function (v0, v1, v2) {
+ return {ctor: '_Tuple3', _0: v0, _1: v1, _2: v2};
+ }));
+var _elm_community$list_extra$List_Extra$zip = _elm_lang$core$List$map2(
+ F2(
+ function (v0, v1) {
+ return {ctor: '_Tuple2', _0: v0, _1: v1};
+ }));
+var _elm_community$list_extra$List_Extra$isPrefixOf = F2(
+ function (prefix, xs) {
+ var _p0 = {ctor: '_Tuple2', _0: prefix, _1: xs};
+ if (_p0._0.ctor === '[]') {
+ return true;
+ } else {
+ if (_p0._1.ctor === '[]') {
+ return false;
+ } else {
+ return _elm_lang$core$Native_Utils.eq(_p0._0._0, _p0._1._0) && A2(_elm_community$list_extra$List_Extra$isPrefixOf, _p0._0._1, _p0._1._1);
+ }
+ }
+ });
+var _elm_community$list_extra$List_Extra$isSuffixOf = F2(
+ function (suffix, xs) {
+ return A2(
+ _elm_community$list_extra$List_Extra$isPrefixOf,
+ _elm_lang$core$List$reverse(suffix),
+ _elm_lang$core$List$reverse(xs));
+ });
+var _elm_community$list_extra$List_Extra$selectSplit = function (xs) {
+ var _p1 = xs;
+ if (_p1.ctor === '[]') {
+ return {ctor: '[]'};
+ } else {
+ var _p5 = _p1._1;
+ var _p4 = _p1._0;
+ return {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple3',
+ _0: {ctor: '[]'},
+ _1: _p4,
+ _2: _p5
+ },
+ _1: A2(
+ _elm_lang$core$List$map,
+ function (_p2) {
+ var _p3 = _p2;
+ return {
+ ctor: '_Tuple3',
+ _0: {ctor: '::', _0: _p4, _1: _p3._0},
+ _1: _p3._1,
+ _2: _p3._2
+ };
+ },
+ _elm_community$list_extra$List_Extra$selectSplit(_p5))
+ };
+ }
+};
+var _elm_community$list_extra$List_Extra$select = function (xs) {
+ var _p6 = xs;
+ if (_p6.ctor === '[]') {
+ return {ctor: '[]'};
+ } else {
+ var _p10 = _p6._1;
+ var _p9 = _p6._0;
+ return {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: _p9, _1: _p10},
+ _1: A2(
+ _elm_lang$core$List$map,
+ function (_p7) {
+ var _p8 = _p7;
+ return {
+ ctor: '_Tuple2',
+ _0: _p8._0,
+ _1: {ctor: '::', _0: _p9, _1: _p8._1}
+ };
+ },
+ _elm_community$list_extra$List_Extra$select(_p10))
+ };
+ }
+};
+var _elm_community$list_extra$List_Extra$tailsHelp = F2(
+ function (e, list) {
+ var _p11 = list;
+ if (_p11.ctor === '::') {
+ var _p12 = _p11._0;
+ return {
+ ctor: '::',
+ _0: {ctor: '::', _0: e, _1: _p12},
+ _1: {ctor: '::', _0: _p12, _1: _p11._1}
+ };
+ } else {
+ return {ctor: '[]'};
+ }
+ });
+var _elm_community$list_extra$List_Extra$tails = A2(
+ _elm_lang$core$List$foldr,
+ _elm_community$list_extra$List_Extra$tailsHelp,
+ {
+ ctor: '::',
+ _0: {ctor: '[]'},
+ _1: {ctor: '[]'}
+ });
+var _elm_community$list_extra$List_Extra$isInfixOf = F2(
+ function (infix, xs) {
+ return A2(
+ _elm_lang$core$List$any,
+ _elm_community$list_extra$List_Extra$isPrefixOf(infix),
+ _elm_community$list_extra$List_Extra$tails(xs));
+ });
+var _elm_community$list_extra$List_Extra$inits = A2(
+ _elm_lang$core$List$foldr,
+ F2(
+ function (e, acc) {
+ return {
+ ctor: '::',
+ _0: {ctor: '[]'},
+ _1: A2(
+ _elm_lang$core$List$map,
+ F2(
+ function (x, y) {
+ return {ctor: '::', _0: x, _1: y};
+ })(e),
+ acc)
+ };
+ }),
+ {
+ ctor: '::',
+ _0: {ctor: '[]'},
+ _1: {ctor: '[]'}
+ });
+var _elm_community$list_extra$List_Extra$groupWhileTransitively = F2(
+ function (cmp, xs_) {
+ var _p13 = xs_;
+ if (_p13.ctor === '[]') {
+ return {ctor: '[]'};
+ } else {
+ if (_p13._1.ctor === '[]') {
+ return {
+ ctor: '::',
+ _0: {
+ ctor: '::',
+ _0: _p13._0,
+ _1: {ctor: '[]'}
+ },
+ _1: {ctor: '[]'}
+ };
+ } else {
+ var _p15 = _p13._0;
+ var _p14 = A2(_elm_community$list_extra$List_Extra$groupWhileTransitively, cmp, _p13._1);
+ if (_p14.ctor === '::') {
+ return A2(cmp, _p15, _p13._1._0) ? {
+ ctor: '::',
+ _0: {ctor: '::', _0: _p15, _1: _p14._0},
+ _1: _p14._1
+ } : {
+ ctor: '::',
+ _0: {
+ ctor: '::',
+ _0: _p15,
+ _1: {ctor: '[]'}
+ },
+ _1: _p14
+ };
+ } else {
+ return {ctor: '[]'};
+ }
+ }
+ }
+ });
+var _elm_community$list_extra$List_Extra$stripPrefix = F2(
+ function (prefix, xs) {
+ var step = F2(
+ function (e, m) {
+ var _p16 = m;
+ if (_p16.ctor === 'Nothing') {
+ return _elm_lang$core$Maybe$Nothing;
+ } else {
+ if (_p16._0.ctor === '[]') {
+ return _elm_lang$core$Maybe$Nothing;
+ } else {
+ return _elm_lang$core$Native_Utils.eq(e, _p16._0._0) ? _elm_lang$core$Maybe$Just(_p16._0._1) : _elm_lang$core$Maybe$Nothing;
+ }
+ }
+ });
+ return A3(
+ _elm_lang$core$List$foldl,
+ step,
+ _elm_lang$core$Maybe$Just(xs),
+ prefix);
+ });
+var _elm_community$list_extra$List_Extra$dropWhileRight = function (p) {
+ return A2(
+ _elm_lang$core$List$foldr,
+ F2(
+ function (x, xs) {
+ return (p(x) && _elm_lang$core$List$isEmpty(xs)) ? {ctor: '[]'} : {ctor: '::', _0: x, _1: xs};
+ }),
+ {ctor: '[]'});
+};
+var _elm_community$list_extra$List_Extra$takeWhileRight = function (p) {
+ var step = F2(
+ function (x, _p17) {
+ var _p18 = _p17;
+ var _p19 = _p18._0;
+ return (p(x) && _p18._1) ? {
+ ctor: '_Tuple2',
+ _0: {ctor: '::', _0: x, _1: _p19},
+ _1: true
+ } : {ctor: '_Tuple2', _0: _p19, _1: false};
+ });
+ return function (_p20) {
+ return _elm_lang$core$Tuple$first(
+ A3(
+ _elm_lang$core$List$foldr,
+ step,
+ {
+ ctor: '_Tuple2',
+ _0: {ctor: '[]'},
+ _1: true
+ },
+ _p20));
+ };
+};
+var _elm_community$list_extra$List_Extra$splitAt = F2(
+ function (n, xs) {
+ return {
+ ctor: '_Tuple2',
+ _0: A2(_elm_lang$core$List$take, n, xs),
+ _1: A2(_elm_lang$core$List$drop, n, xs)
+ };
+ });
+var _elm_community$list_extra$List_Extra$groupsOfVarying_ = F3(
+ function (listOflengths, list, accu) {
+ groupsOfVarying_:
+ while (true) {
+ var _p21 = {ctor: '_Tuple2', _0: listOflengths, _1: list};
+ if (((_p21.ctor === '_Tuple2') && (_p21._0.ctor === '::')) && (_p21._1.ctor === '::')) {
+ var _p22 = A2(_elm_community$list_extra$List_Extra$splitAt, _p21._0._0, list);
+ var head = _p22._0;
+ var tail = _p22._1;
+ var _v11 = _p21._0._1,
+ _v12 = tail,
+ _v13 = {ctor: '::', _0: head, _1: accu};
+ listOflengths = _v11;
+ list = _v12;
+ accu = _v13;
+ continue groupsOfVarying_;
+ } else {
+ return _elm_lang$core$List$reverse(accu);
+ }
+ }
+ });
+var _elm_community$list_extra$List_Extra$groupsOfVarying = F2(
+ function (listOflengths, list) {
+ return A3(
+ _elm_community$list_extra$List_Extra$groupsOfVarying_,
+ listOflengths,
+ list,
+ {ctor: '[]'});
+ });
+var _elm_community$list_extra$List_Extra$unfoldr = F2(
+ function (f, seed) {
+ var _p23 = f(seed);
+ if (_p23.ctor === 'Nothing') {
+ return {ctor: '[]'};
+ } else {
+ return {
+ ctor: '::',
+ _0: _p23._0._0,
+ _1: A2(_elm_community$list_extra$List_Extra$unfoldr, f, _p23._0._1)
+ };
+ }
+ });
+var _elm_community$list_extra$List_Extra$scanr1 = F2(
+ function (f, xs_) {
+ var _p24 = xs_;
+ if (_p24.ctor === '[]') {
+ return {ctor: '[]'};
+ } else {
+ if (_p24._1.ctor === '[]') {
+ return {
+ ctor: '::',
+ _0: _p24._0,
+ _1: {ctor: '[]'}
+ };
+ } else {
+ var _p25 = A2(_elm_community$list_extra$List_Extra$scanr1, f, _p24._1);
+ if (_p25.ctor === '::') {
+ return {
+ ctor: '::',
+ _0: A2(f, _p24._0, _p25._0),
+ _1: _p25
+ };
+ } else {
+ return {ctor: '[]'};
+ }
+ }
+ }
+ });
+var _elm_community$list_extra$List_Extra$scanr = F3(
+ function (f, acc, xs_) {
+ var _p26 = xs_;
+ if (_p26.ctor === '[]') {
+ return {
+ ctor: '::',
+ _0: acc,
+ _1: {ctor: '[]'}
+ };
+ } else {
+ var _p27 = A3(_elm_community$list_extra$List_Extra$scanr, f, acc, _p26._1);
+ if (_p27.ctor === '::') {
+ return {
+ ctor: '::',
+ _0: A2(f, _p26._0, _p27._0),
+ _1: _p27
+ };
+ } else {
+ return {ctor: '[]'};
+ }
+ }
+ });
+var _elm_community$list_extra$List_Extra$scanl1 = F2(
+ function (f, xs_) {
+ var _p28 = xs_;
+ if (_p28.ctor === '[]') {
+ return {ctor: '[]'};
+ } else {
+ return A3(_elm_lang$core$List$scanl, f, _p28._0, _p28._1);
+ }
+ });
+var _elm_community$list_extra$List_Extra$indexedFoldr = F3(
+ function (func, acc, list) {
+ var step = F2(
+ function (x, _p29) {
+ var _p30 = _p29;
+ var _p31 = _p30._0;
+ return {
+ ctor: '_Tuple2',
+ _0: _p31 - 1,
+ _1: A3(func, _p31, x, _p30._1)
+ };
+ });
+ return _elm_lang$core$Tuple$second(
+ A3(
+ _elm_lang$core$List$foldr,
+ step,
+ {
+ ctor: '_Tuple2',
+ _0: _elm_lang$core$List$length(list) - 1,
+ _1: acc
+ },
+ list));
+ });
+var _elm_community$list_extra$List_Extra$indexedFoldl = F3(
+ function (func, acc, list) {
+ var step = F2(
+ function (x, _p32) {
+ var _p33 = _p32;
+ var _p34 = _p33._0;
+ return {
+ ctor: '_Tuple2',
+ _0: _p34 + 1,
+ _1: A3(func, _p34, x, _p33._1)
+ };
+ });
+ return _elm_lang$core$Tuple$second(
+ A3(
+ _elm_lang$core$List$foldl,
+ step,
+ {ctor: '_Tuple2', _0: 0, _1: acc},
+ list));
+ });
+var _elm_community$list_extra$List_Extra$foldr1 = F2(
+ function (f, xs) {
+ var mf = F2(
+ function (x, m) {
+ return _elm_lang$core$Maybe$Just(
+ function () {
+ var _p35 = m;
+ if (_p35.ctor === 'Nothing') {
+ return x;
+ } else {
+ return A2(f, x, _p35._0);
+ }
+ }());
+ });
+ return A3(_elm_lang$core$List$foldr, mf, _elm_lang$core$Maybe$Nothing, xs);
+ });
+var _elm_community$list_extra$List_Extra$foldl1 = F2(
+ function (f, xs) {
+ var mf = F2(
+ function (x, m) {
+ return _elm_lang$core$Maybe$Just(
+ function () {
+ var _p36 = m;
+ if (_p36.ctor === 'Nothing') {
+ return x;
+ } else {
+ return A2(f, _p36._0, x);
+ }
+ }());
+ });
+ return A3(_elm_lang$core$List$foldl, mf, _elm_lang$core$Maybe$Nothing, xs);
+ });
+var _elm_community$list_extra$List_Extra$interweaveHelp = F3(
+ function (l1, l2, acc) {
+ interweaveHelp:
+ while (true) {
+ var _p37 = {ctor: '_Tuple2', _0: l1, _1: l2};
+ _v24_1:
+ do {
+ if (_p37._0.ctor === '::') {
+ if (_p37._1.ctor === '::') {
+ var _v25 = _p37._0._1,
+ _v26 = _p37._1._1,
+ _v27 = A2(
+ _elm_lang$core$Basics_ops['++'],
+ acc,
+ {
+ ctor: '::',
+ _0: _p37._0._0,
+ _1: {
+ ctor: '::',
+ _0: _p37._1._0,
+ _1: {ctor: '[]'}
+ }
+ });
+ l1 = _v25;
+ l2 = _v26;
+ acc = _v27;
+ continue interweaveHelp;
+ } else {
+ break _v24_1;
+ }
+ } else {
+ if (_p37._1.ctor === '[]') {
+ break _v24_1;
+ } else {
+ return A2(_elm_lang$core$Basics_ops['++'], acc, _p37._1);
+ }
+ }
+ } while(false);
+ return A2(_elm_lang$core$Basics_ops['++'], acc, _p37._0);
+ }
+ });
+var _elm_community$list_extra$List_Extra$interweave = F2(
+ function (l1, l2) {
+ return A3(
+ _elm_community$list_extra$List_Extra$interweaveHelp,
+ l1,
+ l2,
+ {ctor: '[]'});
+ });
+var _elm_community$list_extra$List_Extra$permutations = function (xs_) {
+ var _p38 = xs_;
+ if (_p38.ctor === '[]') {
+ return {
+ ctor: '::',
+ _0: {ctor: '[]'},
+ _1: {ctor: '[]'}
+ };
+ } else {
+ var f = function (_p39) {
+ var _p40 = _p39;
+ return A2(
+ _elm_lang$core$List$map,
+ F2(
+ function (x, y) {
+ return {ctor: '::', _0: x, _1: y};
+ })(_p40._0),
+ _elm_community$list_extra$List_Extra$permutations(_p40._1));
+ };
+ return A2(
+ _elm_lang$core$List$concatMap,
+ f,
+ _elm_community$list_extra$List_Extra$select(_p38));
+ }
+};
+var _elm_community$list_extra$List_Extra$isPermutationOf = F2(
+ function (permut, xs) {
+ return A2(
+ _elm_lang$core$List$member,
+ permut,
+ _elm_community$list_extra$List_Extra$permutations(xs));
+ });
+var _elm_community$list_extra$List_Extra$subsequencesNonEmpty = function (xs) {
+ var _p41 = xs;
+ if (_p41.ctor === '[]') {
+ return {ctor: '[]'};
+ } else {
+ var _p42 = _p41._0;
+ var f = F2(
+ function (ys, r) {
+ return {
+ ctor: '::',
+ _0: ys,
+ _1: {
+ ctor: '::',
+ _0: {ctor: '::', _0: _p42, _1: ys},
+ _1: r
+ }
+ };
+ });
+ return {
+ ctor: '::',
+ _0: {
+ ctor: '::',
+ _0: _p42,
+ _1: {ctor: '[]'}
+ },
+ _1: A3(
+ _elm_lang$core$List$foldr,
+ f,
+ {ctor: '[]'},
+ _elm_community$list_extra$List_Extra$subsequencesNonEmpty(_p41._1))
+ };
+ }
+};
+var _elm_community$list_extra$List_Extra$subsequences = function (xs) {
+ return {
+ ctor: '::',
+ _0: {ctor: '[]'},
+ _1: _elm_community$list_extra$List_Extra$subsequencesNonEmpty(xs)
+ };
+};
+var _elm_community$list_extra$List_Extra$isSubsequenceOf = F2(
+ function (subseq, xs) {
+ return A2(
+ _elm_lang$core$List$member,
+ subseq,
+ _elm_community$list_extra$List_Extra$subsequences(xs));
+ });
+var _elm_community$list_extra$List_Extra$transpose = function (ll) {
+ transpose:
+ while (true) {
+ var _p43 = ll;
+ if (_p43.ctor === '[]') {
+ return {ctor: '[]'};
+ } else {
+ if (_p43._0.ctor === '[]') {
+ var _v32 = _p43._1;
+ ll = _v32;
+ continue transpose;
+ } else {
+ var _p44 = _p43._1;
+ var tails = A2(_elm_lang$core$List$filterMap, _elm_lang$core$List$tail, _p44);
+ var heads = A2(_elm_lang$core$List$filterMap, _elm_lang$core$List$head, _p44);
+ return {
+ ctor: '::',
+ _0: {ctor: '::', _0: _p43._0._0, _1: heads},
+ _1: _elm_community$list_extra$List_Extra$transpose(
+ {ctor: '::', _0: _p43._0._1, _1: tails})
+ };
+ }
+ }
+ }
+};
+var _elm_community$list_extra$List_Extra$intercalate = function (xs) {
+ return function (_p45) {
+ return _elm_lang$core$List$concat(
+ A2(_elm_lang$core$List$intersperse, xs, _p45));
+ };
+};
+var _elm_community$list_extra$List_Extra$filterNot = F2(
+ function (pred, list) {
+ return A2(
+ _elm_lang$core$List$filter,
+ function (_p46) {
+ return !pred(_p46);
+ },
+ list);
+ });
+var _elm_community$list_extra$List_Extra$removeAt = F2(
+ function (index, l) {
+ if (_elm_lang$core$Native_Utils.cmp(index, 0) < 0) {
+ return l;
+ } else {
+ var tail = _elm_lang$core$List$tail(
+ A2(_elm_lang$core$List$drop, index, l));
+ var head = A2(_elm_lang$core$List$take, index, l);
+ var _p47 = tail;
+ if (_p47.ctor === 'Nothing') {
+ return l;
+ } else {
+ return A2(_elm_lang$core$List$append, head, _p47._0);
+ }
+ }
+ });
+var _elm_community$list_extra$List_Extra$stableSortWith = F2(
+ function (pred, list) {
+ var predWithIndex = F2(
+ function (_p49, _p48) {
+ var _p50 = _p49;
+ var _p51 = _p48;
+ var result = A2(pred, _p50._0, _p51._0);
+ var _p52 = result;
+ if (_p52.ctor === 'EQ') {
+ return A2(_elm_lang$core$Basics$compare, _p50._1, _p51._1);
+ } else {
+ return result;
+ }
+ });
+ var listWithIndex = A2(
+ _elm_lang$core$List$indexedMap,
+ F2(
+ function (i, a) {
+ return {ctor: '_Tuple2', _0: a, _1: i};
+ }),
+ list);
+ return A2(
+ _elm_lang$core$List$map,
+ _elm_lang$core$Tuple$first,
+ A2(_elm_lang$core$List$sortWith, predWithIndex, listWithIndex));
+ });
+var _elm_community$list_extra$List_Extra$setAt = F3(
+ function (index, value, l) {
+ if (_elm_lang$core$Native_Utils.cmp(index, 0) < 0) {
+ return _elm_lang$core$Maybe$Nothing;
+ } else {
+ var tail = _elm_lang$core$List$tail(
+ A2(_elm_lang$core$List$drop, index, l));
+ var head = A2(_elm_lang$core$List$take, index, l);
+ var _p53 = tail;
+ if (_p53.ctor === 'Nothing') {
+ return _elm_lang$core$Maybe$Nothing;
+ } else {
+ return _elm_lang$core$Maybe$Just(
+ A2(
+ _elm_lang$core$List$append,
+ head,
+ {ctor: '::', _0: value, _1: _p53._0}));
+ }
+ }
+ });
+var _elm_community$list_extra$List_Extra$remove = F2(
+ function (x, xs) {
+ var _p54 = xs;
+ if (_p54.ctor === '[]') {
+ return {ctor: '[]'};
+ } else {
+ var _p56 = _p54._1;
+ var _p55 = _p54._0;
+ return _elm_lang$core$Native_Utils.eq(x, _p55) ? _p56 : {
+ ctor: '::',
+ _0: _p55,
+ _1: A2(_elm_community$list_extra$List_Extra$remove, x, _p56)
+ };
+ }
+ });
+var _elm_community$list_extra$List_Extra$updateIfIndex = F3(
+ function (predicate, update, list) {
+ return A2(
+ _elm_lang$core$List$indexedMap,
+ F2(
+ function (i, x) {
+ return predicate(i) ? update(x) : x;
+ }),
+ list);
+ });
+var _elm_community$list_extra$List_Extra$updateAt = F3(
+ function (index, update, list) {
+ return ((_elm_lang$core$Native_Utils.cmp(index, 0) < 0) || (_elm_lang$core$Native_Utils.cmp(
+ index,
+ _elm_lang$core$List$length(list)) > -1)) ? _elm_lang$core$Maybe$Nothing : _elm_lang$core$Maybe$Just(
+ A3(
+ _elm_community$list_extra$List_Extra$updateIfIndex,
+ F2(
+ function (x, y) {
+ return _elm_lang$core$Native_Utils.eq(x, y);
+ })(index),
+ update,
+ list));
+ });
+var _elm_community$list_extra$List_Extra$updateIf = F3(
+ function (predicate, update, list) {
+ return A2(
+ _elm_lang$core$List$map,
+ function (item) {
+ return predicate(item) ? update(item) : item;
+ },
+ list);
+ });
+var _elm_community$list_extra$List_Extra$replaceIf = F3(
+ function (predicate, replacement, list) {
+ return A3(
+ _elm_community$list_extra$List_Extra$updateIf,
+ predicate,
+ _elm_lang$core$Basics$always(replacement),
+ list);
+ });
+var _elm_community$list_extra$List_Extra$findIndices = function (p) {
+ return function (_p57) {
+ return A2(
+ _elm_lang$core$List$map,
+ _elm_lang$core$Tuple$first,
+ A2(
+ _elm_lang$core$List$filter,
+ function (_p58) {
+ var _p59 = _p58;
+ return p(_p59._1);
+ },
+ A2(
+ _elm_lang$core$List$indexedMap,
+ F2(
+ function (v0, v1) {
+ return {ctor: '_Tuple2', _0: v0, _1: v1};
+ }),
+ _p57)));
+ };
+};
+var _elm_community$list_extra$List_Extra$findIndex = function (p) {
+ return function (_p60) {
+ return _elm_lang$core$List$head(
+ A2(_elm_community$list_extra$List_Extra$findIndices, p, _p60));
+ };
+};
+var _elm_community$list_extra$List_Extra$splitWhen = F2(
+ function (predicate, list) {
+ return A2(
+ _elm_lang$core$Maybe$map,
+ function (i) {
+ return A2(_elm_community$list_extra$List_Extra$splitAt, i, list);
+ },
+ A2(_elm_community$list_extra$List_Extra$findIndex, predicate, list));
+ });
+var _elm_community$list_extra$List_Extra$elemIndices = function (x) {
+ return _elm_community$list_extra$List_Extra$findIndices(
+ F2(
+ function (x, y) {
+ return _elm_lang$core$Native_Utils.eq(x, y);
+ })(x));
+};
+var _elm_community$list_extra$List_Extra$elemIndex = function (x) {
+ return _elm_community$list_extra$List_Extra$findIndex(
+ F2(
+ function (x, y) {
+ return _elm_lang$core$Native_Utils.eq(x, y);
+ })(x));
+};
+var _elm_community$list_extra$List_Extra$find = F2(
+ function (predicate, list) {
+ find:
+ while (true) {
+ var _p61 = list;
+ if (_p61.ctor === '[]') {
+ return _elm_lang$core$Maybe$Nothing;
+ } else {
+ var _p62 = _p61._0;
+ if (predicate(_p62)) {
+ return _elm_lang$core$Maybe$Just(_p62);
+ } else {
+ var _v41 = predicate,
+ _v42 = _p61._1;
+ predicate = _v41;
+ list = _v42;
+ continue find;
+ }
+ }
+ }
+ });
+var _elm_community$list_extra$List_Extra$notMember = function (x) {
+ return function (_p63) {
+ return !A2(_elm_lang$core$List$member, x, _p63);
+ };
+};
+var _elm_community$list_extra$List_Extra$andThen = _elm_lang$core$List$concatMap;
+var _elm_community$list_extra$List_Extra$lift2 = F3(
+ function (f, la, lb) {
+ return A2(
+ _elm_community$list_extra$List_Extra$andThen,
+ function (a) {
+ return A2(
+ _elm_community$list_extra$List_Extra$andThen,
+ function (b) {
+ return {
+ ctor: '::',
+ _0: A2(f, a, b),
+ _1: {ctor: '[]'}
+ };
+ },
+ lb);
+ },
+ la);
+ });
+var _elm_community$list_extra$List_Extra$lift3 = F4(
+ function (f, la, lb, lc) {
+ return A2(
+ _elm_community$list_extra$List_Extra$andThen,
+ function (a) {
+ return A2(
+ _elm_community$list_extra$List_Extra$andThen,
+ function (b) {
+ return A2(
+ _elm_community$list_extra$List_Extra$andThen,
+ function (c) {
+ return {
+ ctor: '::',
+ _0: A3(f, a, b, c),
+ _1: {ctor: '[]'}
+ };
+ },
+ lc);
+ },
+ lb);
+ },
+ la);
+ });
+var _elm_community$list_extra$List_Extra$lift4 = F5(
+ function (f, la, lb, lc, ld) {
+ return A2(
+ _elm_community$list_extra$List_Extra$andThen,
+ function (a) {
+ return A2(
+ _elm_community$list_extra$List_Extra$andThen,
+ function (b) {
+ return A2(
+ _elm_community$list_extra$List_Extra$andThen,
+ function (c) {
+ return A2(
+ _elm_community$list_extra$List_Extra$andThen,
+ function (d) {
+ return {
+ ctor: '::',
+ _0: A4(f, a, b, c, d),
+ _1: {ctor: '[]'}
+ };
+ },
+ ld);
+ },
+ lc);
+ },
+ lb);
+ },
+ la);
+ });
+var _elm_community$list_extra$List_Extra$andMap = F2(
+ function (l, fl) {
+ return A3(
+ _elm_lang$core$List$map2,
+ F2(
+ function (x, y) {
+ return x(y);
+ }),
+ fl,
+ l);
+ });
+var _elm_community$list_extra$List_Extra$uniqueHelp = F3(
+ function (f, existing, remaining) {
+ uniqueHelp:
+ while (true) {
+ var _p64 = remaining;
+ if (_p64.ctor === '[]') {
+ return {ctor: '[]'};
+ } else {
+ var _p66 = _p64._1;
+ var _p65 = _p64._0;
+ var computedFirst = f(_p65);
+ if (A2(_elm_lang$core$Set$member, computedFirst, existing)) {
+ var _v44 = f,
+ _v45 = existing,
+ _v46 = _p66;
+ f = _v44;
+ existing = _v45;
+ remaining = _v46;
+ continue uniqueHelp;
+ } else {
+ return {
+ ctor: '::',
+ _0: _p65,
+ _1: A3(
+ _elm_community$list_extra$List_Extra$uniqueHelp,
+ f,
+ A2(_elm_lang$core$Set$insert, computedFirst, existing),
+ _p66)
+ };
+ }
+ }
+ }
+ });
+var _elm_community$list_extra$List_Extra$uniqueBy = F2(
+ function (f, list) {
+ return A3(_elm_community$list_extra$List_Extra$uniqueHelp, f, _elm_lang$core$Set$empty, list);
+ });
+var _elm_community$list_extra$List_Extra$allDifferentBy = F2(
+ function (f, list) {
+ return _elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$List$length(list),
+ _elm_lang$core$List$length(
+ A2(_elm_community$list_extra$List_Extra$uniqueBy, f, list)));
+ });
+var _elm_community$list_extra$List_Extra$allDifferent = function (list) {
+ return A2(_elm_community$list_extra$List_Extra$allDifferentBy, _elm_lang$core$Basics$identity, list);
+};
+var _elm_community$list_extra$List_Extra$unique = function (list) {
+ return A3(_elm_community$list_extra$List_Extra$uniqueHelp, _elm_lang$core$Basics$identity, _elm_lang$core$Set$empty, list);
+};
+var _elm_community$list_extra$List_Extra$dropWhile = F2(
+ function (predicate, list) {
+ dropWhile:
+ while (true) {
+ var _p67 = list;
+ if (_p67.ctor === '[]') {
+ return {ctor: '[]'};
+ } else {
+ if (predicate(_p67._0)) {
+ var _v48 = predicate,
+ _v49 = _p67._1;
+ predicate = _v48;
+ list = _v49;
+ continue dropWhile;
+ } else {
+ return list;
+ }
+ }
+ }
+ });
+var _elm_community$list_extra$List_Extra$takeWhile = function (predicate) {
+ var takeWhileMemo = F2(
+ function (memo, list) {
+ takeWhileMemo:
+ while (true) {
+ var _p68 = list;
+ if (_p68.ctor === '[]') {
+ return _elm_lang$core$List$reverse(memo);
+ } else {
+ var _p69 = _p68._0;
+ if (predicate(_p69)) {
+ var _v51 = {ctor: '::', _0: _p69, _1: memo},
+ _v52 = _p68._1;
+ memo = _v51;
+ list = _v52;
+ continue takeWhileMemo;
+ } else {
+ return _elm_lang$core$List$reverse(memo);
+ }
+ }
+ }
+ });
+ return takeWhileMemo(
+ {ctor: '[]'});
+};
+var _elm_community$list_extra$List_Extra$span = F2(
+ function (p, xs) {
+ return {
+ ctor: '_Tuple2',
+ _0: A2(_elm_community$list_extra$List_Extra$takeWhile, p, xs),
+ _1: A2(_elm_community$list_extra$List_Extra$dropWhile, p, xs)
+ };
+ });
+var _elm_community$list_extra$List_Extra$break = function (p) {
+ return _elm_community$list_extra$List_Extra$span(
+ function (_p70) {
+ return !p(_p70);
+ });
+};
+var _elm_community$list_extra$List_Extra$groupWhile = F2(
+ function (eq, xs_) {
+ var _p71 = xs_;
+ if (_p71.ctor === '[]') {
+ return {ctor: '[]'};
+ } else {
+ var _p73 = _p71._0;
+ var _p72 = A2(
+ _elm_community$list_extra$List_Extra$span,
+ eq(_p73),
+ _p71._1);
+ var ys = _p72._0;
+ var zs = _p72._1;
+ return {
+ ctor: '::',
+ _0: {ctor: '::', _0: _p73, _1: ys},
+ _1: A2(_elm_community$list_extra$List_Extra$groupWhile, eq, zs)
+ };
+ }
+ });
+var _elm_community$list_extra$List_Extra$group = _elm_community$list_extra$List_Extra$groupWhile(
+ F2(
+ function (x, y) {
+ return _elm_lang$core$Native_Utils.eq(x, y);
+ }));
+var _elm_community$list_extra$List_Extra$minimumBy = F2(
+ function (f, ls) {
+ var minBy = F2(
+ function (x, _p74) {
+ var _p75 = _p74;
+ var _p76 = _p75._1;
+ var fx = f(x);
+ return (_elm_lang$core$Native_Utils.cmp(fx, _p76) < 0) ? {ctor: '_Tuple2', _0: x, _1: fx} : {ctor: '_Tuple2', _0: _p75._0, _1: _p76};
+ });
+ var _p77 = ls;
+ if (_p77.ctor === '::') {
+ if (_p77._1.ctor === '[]') {
+ return _elm_lang$core$Maybe$Just(_p77._0);
+ } else {
+ var _p78 = _p77._0;
+ return _elm_lang$core$Maybe$Just(
+ _elm_lang$core$Tuple$first(
+ A3(
+ _elm_lang$core$List$foldl,
+ minBy,
+ {
+ ctor: '_Tuple2',
+ _0: _p78,
+ _1: f(_p78)
+ },
+ _p77._1)));
+ }
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+ });
+var _elm_community$list_extra$List_Extra$maximumBy = F2(
+ function (f, ls) {
+ var maxBy = F2(
+ function (x, _p79) {
+ var _p80 = _p79;
+ var _p81 = _p80._1;
+ var fx = f(x);
+ return (_elm_lang$core$Native_Utils.cmp(fx, _p81) > 0) ? {ctor: '_Tuple2', _0: x, _1: fx} : {ctor: '_Tuple2', _0: _p80._0, _1: _p81};
+ });
+ var _p82 = ls;
+ if (_p82.ctor === '::') {
+ if (_p82._1.ctor === '[]') {
+ return _elm_lang$core$Maybe$Just(_p82._0);
+ } else {
+ var _p83 = _p82._0;
+ return _elm_lang$core$Maybe$Just(
+ _elm_lang$core$Tuple$first(
+ A3(
+ _elm_lang$core$List$foldl,
+ maxBy,
+ {
+ ctor: '_Tuple2',
+ _0: _p83,
+ _1: f(_p83)
+ },
+ _p82._1)));
+ }
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+ });
+var _elm_community$list_extra$List_Extra$uncons = function (xs) {
+ var _p84 = xs;
+ if (_p84.ctor === '[]') {
+ return _elm_lang$core$Maybe$Nothing;
+ } else {
+ return _elm_lang$core$Maybe$Just(
+ {ctor: '_Tuple2', _0: _p84._0, _1: _p84._1});
+ }
+};
+var _elm_community$list_extra$List_Extra$swapAt = F3(
+ function (index1, index2, l) {
+ swapAt:
+ while (true) {
+ if (_elm_lang$core$Native_Utils.eq(index1, index2)) {
+ return _elm_lang$core$Maybe$Just(l);
+ } else {
+ if (_elm_lang$core$Native_Utils.cmp(index1, index2) > 0) {
+ var _v59 = index2,
+ _v60 = index1,
+ _v61 = l;
+ index1 = _v59;
+ index2 = _v60;
+ l = _v61;
+ continue swapAt;
+ } else {
+ if (_elm_lang$core$Native_Utils.cmp(index1, 0) < 0) {
+ return _elm_lang$core$Maybe$Nothing;
+ } else {
+ var _p85 = A2(_elm_community$list_extra$List_Extra$splitAt, index1, l);
+ var part1 = _p85._0;
+ var tail1 = _p85._1;
+ var _p86 = A2(_elm_community$list_extra$List_Extra$splitAt, index2 - index1, tail1);
+ var head2 = _p86._0;
+ var tail2 = _p86._1;
+ return A3(
+ _elm_lang$core$Maybe$map2,
+ F2(
+ function (_p88, _p87) {
+ var _p89 = _p88;
+ var _p90 = _p87;
+ return _elm_lang$core$List$concat(
+ {
+ ctor: '::',
+ _0: part1,
+ _1: {
+ ctor: '::',
+ _0: {ctor: '::', _0: _p90._0, _1: _p89._1},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '::', _0: _p89._0, _1: _p90._1},
+ _1: {ctor: '[]'}
+ }
+ }
+ });
+ }),
+ _elm_community$list_extra$List_Extra$uncons(head2),
+ _elm_community$list_extra$List_Extra$uncons(tail2));
+ }
+ }
+ }
+ }
+ });
+var _elm_community$list_extra$List_Extra$iterate = F2(
+ function (f, x) {
+ var _p91 = f(x);
+ if (_p91.ctor === 'Just') {
+ return {
+ ctor: '::',
+ _0: x,
+ _1: A2(_elm_community$list_extra$List_Extra$iterate, f, _p91._0)
+ };
+ } else {
+ return {
+ ctor: '::',
+ _0: x,
+ _1: {ctor: '[]'}
+ };
+ }
+ });
+var _elm_community$list_extra$List_Extra$getAt = F2(
+ function (idx, xs) {
+ return (_elm_lang$core$Native_Utils.cmp(idx, 0) < 0) ? _elm_lang$core$Maybe$Nothing : _elm_lang$core$List$head(
+ A2(_elm_lang$core$List$drop, idx, xs));
+ });
+var _elm_community$list_extra$List_Extra_ops = _elm_community$list_extra$List_Extra_ops || {};
+_elm_community$list_extra$List_Extra_ops['!!'] = _elm_lang$core$Basics$flip(_elm_community$list_extra$List_Extra$getAt);
+var _elm_community$list_extra$List_Extra$init = function () {
+ var maybe = F2(
+ function (d, f) {
+ return function (_p92) {
+ return A2(
+ _elm_lang$core$Maybe$withDefault,
+ d,
+ A2(_elm_lang$core$Maybe$map, f, _p92));
+ };
+ });
+ return A2(
+ _elm_lang$core$List$foldr,
+ function (x) {
+ return function (_p93) {
+ return _elm_lang$core$Maybe$Just(
+ A3(
+ maybe,
+ {ctor: '[]'},
+ F2(
+ function (x, y) {
+ return {ctor: '::', _0: x, _1: y};
+ })(x),
+ _p93));
+ };
+ },
+ _elm_lang$core$Maybe$Nothing);
+}();
+var _elm_community$list_extra$List_Extra$last = _elm_community$list_extra$List_Extra$foldl1(
+ _elm_lang$core$Basics$flip(_elm_lang$core$Basics$always));
+
+//import Result //
+
+var _elm_lang$core$Native_Date = function() {
+
+function fromString(str)
+{
+ var date = new Date(str);
+ return isNaN(date.getTime())
+ ? _elm_lang$core$Result$Err('Unable to parse \'' + str + '\' as a date. Dates must be in the ISO 8601 format.')
+ : _elm_lang$core$Result$Ok(date);
+}
+
+var dayTable = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
+var monthTable =
+ ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
+
+
+return {
+ fromString: fromString,
+ year: function(d) { return d.getFullYear(); },
+ month: function(d) { return { ctor: monthTable[d.getMonth()] }; },
+ day: function(d) { return d.getDate(); },
+ hour: function(d) { return d.getHours(); },
+ minute: function(d) { return d.getMinutes(); },
+ second: function(d) { return d.getSeconds(); },
+ millisecond: function(d) { return d.getMilliseconds(); },
+ toTime: function(d) { return d.getTime(); },
+ fromTime: function(t) { return new Date(t); },
+ dayOfWeek: function(d) { return { ctor: dayTable[d.getDay()] }; }
+};
+
+}();
+var _elm_lang$core$Task$onError = _elm_lang$core$Native_Scheduler.onError;
+var _elm_lang$core$Task$andThen = _elm_lang$core$Native_Scheduler.andThen;
+var _elm_lang$core$Task$spawnCmd = F2(
+ function (router, _p0) {
+ var _p1 = _p0;
+ return _elm_lang$core$Native_Scheduler.spawn(
+ A2(
+ _elm_lang$core$Task$andThen,
+ _elm_lang$core$Platform$sendToApp(router),
+ _p1._0));
+ });
+var _elm_lang$core$Task$fail = _elm_lang$core$Native_Scheduler.fail;
+var _elm_lang$core$Task$mapError = F2(
+ function (convert, task) {
+ return A2(
+ _elm_lang$core$Task$onError,
+ function (_p2) {
+ return _elm_lang$core$Task$fail(
+ convert(_p2));
+ },
+ task);
+ });
+var _elm_lang$core$Task$succeed = _elm_lang$core$Native_Scheduler.succeed;
+var _elm_lang$core$Task$map = F2(
+ function (func, taskA) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (a) {
+ return _elm_lang$core$Task$succeed(
+ func(a));
+ },
+ taskA);
+ });
+var _elm_lang$core$Task$map2 = F3(
+ function (func, taskA, taskB) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (a) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (b) {
+ return _elm_lang$core$Task$succeed(
+ A2(func, a, b));
+ },
+ taskB);
+ },
+ taskA);
+ });
+var _elm_lang$core$Task$map3 = F4(
+ function (func, taskA, taskB, taskC) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (a) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (b) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (c) {
+ return _elm_lang$core$Task$succeed(
+ A3(func, a, b, c));
+ },
+ taskC);
+ },
+ taskB);
+ },
+ taskA);
+ });
+var _elm_lang$core$Task$map4 = F5(
+ function (func, taskA, taskB, taskC, taskD) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (a) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (b) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (c) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (d) {
+ return _elm_lang$core$Task$succeed(
+ A4(func, a, b, c, d));
+ },
+ taskD);
+ },
+ taskC);
+ },
+ taskB);
+ },
+ taskA);
+ });
+var _elm_lang$core$Task$map5 = F6(
+ function (func, taskA, taskB, taskC, taskD, taskE) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (a) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (b) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (c) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (d) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (e) {
+ return _elm_lang$core$Task$succeed(
+ A5(func, a, b, c, d, e));
+ },
+ taskE);
+ },
+ taskD);
+ },
+ taskC);
+ },
+ taskB);
+ },
+ taskA);
+ });
+var _elm_lang$core$Task$sequence = function (tasks) {
+ var _p3 = tasks;
+ if (_p3.ctor === '[]') {
+ return _elm_lang$core$Task$succeed(
+ {ctor: '[]'});
+ } else {
+ return A3(
+ _elm_lang$core$Task$map2,
+ F2(
+ function (x, y) {
+ return {ctor: '::', _0: x, _1: y};
+ }),
+ _p3._0,
+ _elm_lang$core$Task$sequence(_p3._1));
+ }
+};
+var _elm_lang$core$Task$onEffects = F3(
+ function (router, commands, state) {
+ return A2(
+ _elm_lang$core$Task$map,
+ function (_p4) {
+ return {ctor: '_Tuple0'};
+ },
+ _elm_lang$core$Task$sequence(
+ A2(
+ _elm_lang$core$List$map,
+ _elm_lang$core$Task$spawnCmd(router),
+ commands)));
+ });
+var _elm_lang$core$Task$init = _elm_lang$core$Task$succeed(
+ {ctor: '_Tuple0'});
+var _elm_lang$core$Task$onSelfMsg = F3(
+ function (_p7, _p6, _p5) {
+ return _elm_lang$core$Task$succeed(
+ {ctor: '_Tuple0'});
+ });
+var _elm_lang$core$Task$command = _elm_lang$core$Native_Platform.leaf('Task');
+var _elm_lang$core$Task$Perform = function (a) {
+ return {ctor: 'Perform', _0: a};
+};
+var _elm_lang$core$Task$perform = F2(
+ function (toMessage, task) {
+ return _elm_lang$core$Task$command(
+ _elm_lang$core$Task$Perform(
+ A2(_elm_lang$core$Task$map, toMessage, task)));
+ });
+var _elm_lang$core$Task$attempt = F2(
+ function (resultToMessage, task) {
+ return _elm_lang$core$Task$command(
+ _elm_lang$core$Task$Perform(
+ A2(
+ _elm_lang$core$Task$onError,
+ function (_p8) {
+ return _elm_lang$core$Task$succeed(
+ resultToMessage(
+ _elm_lang$core$Result$Err(_p8)));
+ },
+ A2(
+ _elm_lang$core$Task$andThen,
+ function (_p9) {
+ return _elm_lang$core$Task$succeed(
+ resultToMessage(
+ _elm_lang$core$Result$Ok(_p9)));
+ },
+ task))));
+ });
+var _elm_lang$core$Task$cmdMap = F2(
+ function (tagger, _p10) {
+ var _p11 = _p10;
+ return _elm_lang$core$Task$Perform(
+ A2(_elm_lang$core$Task$map, tagger, _p11._0));
+ });
+_elm_lang$core$Native_Platform.effectManagers['Task'] = {pkg: 'elm-lang/core', init: _elm_lang$core$Task$init, onEffects: _elm_lang$core$Task$onEffects, onSelfMsg: _elm_lang$core$Task$onSelfMsg, tag: 'cmd', cmdMap: _elm_lang$core$Task$cmdMap};
+
+//import Native.Scheduler //
+
+var _elm_lang$core$Native_Time = function() {
+
+var now = _elm_lang$core$Native_Scheduler.nativeBinding(function(callback)
+{
+ callback(_elm_lang$core$Native_Scheduler.succeed(Date.now()));
+});
+
+function setInterval_(interval, task)
+{
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback)
+ {
+ var id = setInterval(function() {
+ _elm_lang$core$Native_Scheduler.rawSpawn(task);
+ }, interval);
+
+ return function() { clearInterval(id); };
+ });
+}
+
+return {
+ now: now,
+ setInterval_: F2(setInterval_)
+};
+
+}();
+var _elm_lang$core$Time$setInterval = _elm_lang$core$Native_Time.setInterval_;
+var _elm_lang$core$Time$spawnHelp = F3(
+ function (router, intervals, processes) {
+ var _p0 = intervals;
+ if (_p0.ctor === '[]') {
+ return _elm_lang$core$Task$succeed(processes);
+ } else {
+ var _p1 = _p0._0;
+ var spawnRest = function (id) {
+ return A3(
+ _elm_lang$core$Time$spawnHelp,
+ router,
+ _p0._1,
+ A3(_elm_lang$core$Dict$insert, _p1, id, processes));
+ };
+ var spawnTimer = _elm_lang$core$Native_Scheduler.spawn(
+ A2(
+ _elm_lang$core$Time$setInterval,
+ _p1,
+ A2(_elm_lang$core$Platform$sendToSelf, router, _p1)));
+ return A2(_elm_lang$core$Task$andThen, spawnRest, spawnTimer);
+ }
+ });
+var _elm_lang$core$Time$addMySub = F2(
+ function (_p2, state) {
+ var _p3 = _p2;
+ var _p6 = _p3._1;
+ var _p5 = _p3._0;
+ var _p4 = A2(_elm_lang$core$Dict$get, _p5, state);
+ if (_p4.ctor === 'Nothing') {
+ return A3(
+ _elm_lang$core$Dict$insert,
+ _p5,
+ {
+ ctor: '::',
+ _0: _p6,
+ _1: {ctor: '[]'}
+ },
+ state);
+ } else {
+ return A3(
+ _elm_lang$core$Dict$insert,
+ _p5,
+ {ctor: '::', _0: _p6, _1: _p4._0},
+ state);
+ }
+ });
+var _elm_lang$core$Time$inMilliseconds = function (t) {
+ return t;
+};
+var _elm_lang$core$Time$millisecond = 1;
+var _elm_lang$core$Time$second = 1000 * _elm_lang$core$Time$millisecond;
+var _elm_lang$core$Time$minute = 60 * _elm_lang$core$Time$second;
+var _elm_lang$core$Time$hour = 60 * _elm_lang$core$Time$minute;
+var _elm_lang$core$Time$inHours = function (t) {
+ return t / _elm_lang$core$Time$hour;
+};
+var _elm_lang$core$Time$inMinutes = function (t) {
+ return t / _elm_lang$core$Time$minute;
+};
+var _elm_lang$core$Time$inSeconds = function (t) {
+ return t / _elm_lang$core$Time$second;
+};
+var _elm_lang$core$Time$now = _elm_lang$core$Native_Time.now;
+var _elm_lang$core$Time$onSelfMsg = F3(
+ function (router, interval, state) {
+ var _p7 = A2(_elm_lang$core$Dict$get, interval, state.taggers);
+ if (_p7.ctor === 'Nothing') {
+ return _elm_lang$core$Task$succeed(state);
+ } else {
+ var tellTaggers = function (time) {
+ return _elm_lang$core$Task$sequence(
+ A2(
+ _elm_lang$core$List$map,
+ function (tagger) {
+ return A2(
+ _elm_lang$core$Platform$sendToApp,
+ router,
+ tagger(time));
+ },
+ _p7._0));
+ };
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (_p8) {
+ return _elm_lang$core$Task$succeed(state);
+ },
+ A2(_elm_lang$core$Task$andThen, tellTaggers, _elm_lang$core$Time$now));
+ }
+ });
+var _elm_lang$core$Time$subscription = _elm_lang$core$Native_Platform.leaf('Time');
+var _elm_lang$core$Time$State = F2(
+ function (a, b) {
+ return {taggers: a, processes: b};
+ });
+var _elm_lang$core$Time$init = _elm_lang$core$Task$succeed(
+ A2(_elm_lang$core$Time$State, _elm_lang$core$Dict$empty, _elm_lang$core$Dict$empty));
+var _elm_lang$core$Time$onEffects = F3(
+ function (router, subs, _p9) {
+ var _p10 = _p9;
+ var rightStep = F3(
+ function (_p12, id, _p11) {
+ var _p13 = _p11;
+ return {
+ ctor: '_Tuple3',
+ _0: _p13._0,
+ _1: _p13._1,
+ _2: A2(
+ _elm_lang$core$Task$andThen,
+ function (_p14) {
+ return _p13._2;
+ },
+ _elm_lang$core$Native_Scheduler.kill(id))
+ };
+ });
+ var bothStep = F4(
+ function (interval, taggers, id, _p15) {
+ var _p16 = _p15;
+ return {
+ ctor: '_Tuple3',
+ _0: _p16._0,
+ _1: A3(_elm_lang$core$Dict$insert, interval, id, _p16._1),
+ _2: _p16._2
+ };
+ });
+ var leftStep = F3(
+ function (interval, taggers, _p17) {
+ var _p18 = _p17;
+ return {
+ ctor: '_Tuple3',
+ _0: {ctor: '::', _0: interval, _1: _p18._0},
+ _1: _p18._1,
+ _2: _p18._2
+ };
+ });
+ var newTaggers = A3(_elm_lang$core$List$foldl, _elm_lang$core$Time$addMySub, _elm_lang$core$Dict$empty, subs);
+ var _p19 = A6(
+ _elm_lang$core$Dict$merge,
+ leftStep,
+ bothStep,
+ rightStep,
+ newTaggers,
+ _p10.processes,
+ {
+ ctor: '_Tuple3',
+ _0: {ctor: '[]'},
+ _1: _elm_lang$core$Dict$empty,
+ _2: _elm_lang$core$Task$succeed(
+ {ctor: '_Tuple0'})
+ });
+ var spawnList = _p19._0;
+ var existingDict = _p19._1;
+ var killTask = _p19._2;
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (newProcesses) {
+ return _elm_lang$core$Task$succeed(
+ A2(_elm_lang$core$Time$State, newTaggers, newProcesses));
+ },
+ A2(
+ _elm_lang$core$Task$andThen,
+ function (_p20) {
+ return A3(_elm_lang$core$Time$spawnHelp, router, spawnList, existingDict);
+ },
+ killTask));
+ });
+var _elm_lang$core$Time$Every = F2(
+ function (a, b) {
+ return {ctor: 'Every', _0: a, _1: b};
+ });
+var _elm_lang$core$Time$every = F2(
+ function (interval, tagger) {
+ return _elm_lang$core$Time$subscription(
+ A2(_elm_lang$core$Time$Every, interval, tagger));
+ });
+var _elm_lang$core$Time$subMap = F2(
+ function (f, _p21) {
+ var _p22 = _p21;
+ return A2(
+ _elm_lang$core$Time$Every,
+ _p22._0,
+ function (_p23) {
+ return f(
+ _p22._1(_p23));
+ });
+ });
+_elm_lang$core$Native_Platform.effectManagers['Time'] = {pkg: 'elm-lang/core', init: _elm_lang$core$Time$init, onEffects: _elm_lang$core$Time$onEffects, onSelfMsg: _elm_lang$core$Time$onSelfMsg, tag: 'sub', subMap: _elm_lang$core$Time$subMap};
+
+var _elm_lang$core$Date$millisecond = _elm_lang$core$Native_Date.millisecond;
+var _elm_lang$core$Date$second = _elm_lang$core$Native_Date.second;
+var _elm_lang$core$Date$minute = _elm_lang$core$Native_Date.minute;
+var _elm_lang$core$Date$hour = _elm_lang$core$Native_Date.hour;
+var _elm_lang$core$Date$dayOfWeek = _elm_lang$core$Native_Date.dayOfWeek;
+var _elm_lang$core$Date$day = _elm_lang$core$Native_Date.day;
+var _elm_lang$core$Date$month = _elm_lang$core$Native_Date.month;
+var _elm_lang$core$Date$year = _elm_lang$core$Native_Date.year;
+var _elm_lang$core$Date$fromTime = _elm_lang$core$Native_Date.fromTime;
+var _elm_lang$core$Date$toTime = _elm_lang$core$Native_Date.toTime;
+var _elm_lang$core$Date$fromString = _elm_lang$core$Native_Date.fromString;
+var _elm_lang$core$Date$now = A2(_elm_lang$core$Task$map, _elm_lang$core$Date$fromTime, _elm_lang$core$Time$now);
+var _elm_lang$core$Date$Date = {ctor: 'Date'};
+var _elm_lang$core$Date$Sun = {ctor: 'Sun'};
+var _elm_lang$core$Date$Sat = {ctor: 'Sat'};
+var _elm_lang$core$Date$Fri = {ctor: 'Fri'};
+var _elm_lang$core$Date$Thu = {ctor: 'Thu'};
+var _elm_lang$core$Date$Wed = {ctor: 'Wed'};
+var _elm_lang$core$Date$Tue = {ctor: 'Tue'};
+var _elm_lang$core$Date$Mon = {ctor: 'Mon'};
+var _elm_lang$core$Date$Dec = {ctor: 'Dec'};
+var _elm_lang$core$Date$Nov = {ctor: 'Nov'};
+var _elm_lang$core$Date$Oct = {ctor: 'Oct'};
+var _elm_lang$core$Date$Sep = {ctor: 'Sep'};
+var _elm_lang$core$Date$Aug = {ctor: 'Aug'};
+var _elm_lang$core$Date$Jul = {ctor: 'Jul'};
+var _elm_lang$core$Date$Jun = {ctor: 'Jun'};
+var _elm_lang$core$Date$May = {ctor: 'May'};
+var _elm_lang$core$Date$Apr = {ctor: 'Apr'};
+var _elm_lang$core$Date$Mar = {ctor: 'Mar'};
+var _elm_lang$core$Date$Feb = {ctor: 'Feb'};
+var _elm_lang$core$Date$Jan = {ctor: 'Jan'};
+
+//import Maybe, Native.List //
+
+var _elm_lang$core$Native_Regex = function() {
+
+function escape(str)
+{
+ return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
+}
+function caseInsensitive(re)
+{
+ return new RegExp(re.source, 'gi');
+}
+function regex(raw)
+{
+ return new RegExp(raw, 'g');
+}
+
+function contains(re, string)
+{
+ return string.match(re) !== null;
+}
+
+function find(n, re, str)
+{
+ n = n.ctor === 'All' ? Infinity : n._0;
+ var out = [];
+ var number = 0;
+ var string = str;
+ var lastIndex = re.lastIndex;
+ var prevLastIndex = -1;
+ var result;
+ while (number++ < n && (result = re.exec(string)))
+ {
+ if (prevLastIndex === re.lastIndex) break;
+ var i = result.length - 1;
+ var subs = new Array(i);
+ while (i > 0)
+ {
+ var submatch = result[i];
+ subs[--i] = submatch === undefined
+ ? _elm_lang$core$Maybe$Nothing
+ : _elm_lang$core$Maybe$Just(submatch);
+ }
+ out.push({
+ match: result[0],
+ submatches: _elm_lang$core$Native_List.fromArray(subs),
+ index: result.index,
+ number: number
+ });
+ prevLastIndex = re.lastIndex;
+ }
+ re.lastIndex = lastIndex;
+ return _elm_lang$core$Native_List.fromArray(out);
+}
+
+function replace(n, re, replacer, string)
+{
+ n = n.ctor === 'All' ? Infinity : n._0;
+ var count = 0;
+ function jsReplacer(match)
+ {
+ if (count++ >= n)
+ {
+ return match;
+ }
+ var i = arguments.length - 3;
+ var submatches = new Array(i);
+ while (i > 0)
+ {
+ var submatch = arguments[i];
+ submatches[--i] = submatch === undefined
+ ? _elm_lang$core$Maybe$Nothing
+ : _elm_lang$core$Maybe$Just(submatch);
+ }
+ return replacer({
+ match: match,
+ submatches: _elm_lang$core$Native_List.fromArray(submatches),
+ index: arguments[arguments.length - 2],
+ number: count
+ });
+ }
+ return string.replace(re, jsReplacer);
+}
+
+function split(n, re, str)
+{
+ n = n.ctor === 'All' ? Infinity : n._0;
+ if (n === Infinity)
+ {
+ return _elm_lang$core$Native_List.fromArray(str.split(re));
+ }
+ var string = str;
+ var result;
+ var out = [];
+ var start = re.lastIndex;
+ var restoreLastIndex = re.lastIndex;
+ while (n--)
+ {
+ if (!(result = re.exec(string))) break;
+ out.push(string.slice(start, result.index));
+ start = re.lastIndex;
+ }
+ out.push(string.slice(start));
+ re.lastIndex = restoreLastIndex;
+ return _elm_lang$core$Native_List.fromArray(out);
+}
+
+return {
+ regex: regex,
+ caseInsensitive: caseInsensitive,
+ escape: escape,
+
+ contains: F2(contains),
+ find: F3(find),
+ replace: F4(replace),
+ split: F3(split)
+};
+
+}();
+
+var _elm_lang$core$Process$kill = _elm_lang$core$Native_Scheduler.kill;
+var _elm_lang$core$Process$sleep = _elm_lang$core$Native_Scheduler.sleep;
+var _elm_lang$core$Process$spawn = _elm_lang$core$Native_Scheduler.spawn;
+
+var _elm_lang$core$Regex$split = _elm_lang$core$Native_Regex.split;
+var _elm_lang$core$Regex$replace = _elm_lang$core$Native_Regex.replace;
+var _elm_lang$core$Regex$find = _elm_lang$core$Native_Regex.find;
+var _elm_lang$core$Regex$contains = _elm_lang$core$Native_Regex.contains;
+var _elm_lang$core$Regex$caseInsensitive = _elm_lang$core$Native_Regex.caseInsensitive;
+var _elm_lang$core$Regex$regex = _elm_lang$core$Native_Regex.regex;
+var _elm_lang$core$Regex$escape = _elm_lang$core$Native_Regex.escape;
+var _elm_lang$core$Regex$Match = F4(
+ function (a, b, c, d) {
+ return {match: a, submatches: b, index: c, number: d};
+ });
+var _elm_lang$core$Regex$Regex = {ctor: 'Regex'};
+var _elm_lang$core$Regex$AtMost = function (a) {
+ return {ctor: 'AtMost', _0: a};
+};
+var _elm_lang$core$Regex$All = {ctor: 'All'};
+
+var _elm_lang$dom$Native_Dom = function() {
+
+var fakeNode = {
+ addEventListener: function() {},
+ removeEventListener: function() {}
+};
+
+var onDocument = on(typeof document !== 'undefined' ? document : fakeNode);
+var onWindow = on(typeof window !== 'undefined' ? window : fakeNode);
+
+function on(node)
+{
+ return function(eventName, decoder, toTask)
+ {
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) {
+
+ function performTask(event)
+ {
+ var result = A2(_elm_lang$core$Json_Decode$decodeValue, decoder, event);
+ if (result.ctor === 'Ok')
+ {
+ _elm_lang$core$Native_Scheduler.rawSpawn(toTask(result._0));
+ }
+ }
+
+ node.addEventListener(eventName, performTask);
+
+ return function()
+ {
+ node.removeEventListener(eventName, performTask);
+ };
+ });
+ };
+}
+
+var rAF = typeof requestAnimationFrame !== 'undefined'
+ ? requestAnimationFrame
+ : function(callback) { callback(); };
+
+function withNode(id, doStuff)
+{
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback)
+ {
+ rAF(function()
+ {
+ var node = document.getElementById(id);
+ if (node === null)
+ {
+ callback(_elm_lang$core$Native_Scheduler.fail({ ctor: 'NotFound', _0: id }));
+ return;
+ }
+ callback(_elm_lang$core$Native_Scheduler.succeed(doStuff(node)));
+ });
+ });
+}
+
+
+// FOCUS
+
+function focus(id)
+{
+ return withNode(id, function(node) {
+ node.focus();
+ return _elm_lang$core$Native_Utils.Tuple0;
+ });
+}
+
+function blur(id)
+{
+ return withNode(id, function(node) {
+ node.blur();
+ return _elm_lang$core$Native_Utils.Tuple0;
+ });
+}
+
+
+// SCROLLING
+
+function getScrollTop(id)
+{
+ return withNode(id, function(node) {
+ return node.scrollTop;
+ });
+}
+
+function setScrollTop(id, desiredScrollTop)
+{
+ return withNode(id, function(node) {
+ node.scrollTop = desiredScrollTop;
+ return _elm_lang$core$Native_Utils.Tuple0;
+ });
+}
+
+function toBottom(id)
+{
+ return withNode(id, function(node) {
+ node.scrollTop = node.scrollHeight;
+ return _elm_lang$core$Native_Utils.Tuple0;
+ });
+}
+
+function getScrollLeft(id)
+{
+ return withNode(id, function(node) {
+ return node.scrollLeft;
+ });
+}
+
+function setScrollLeft(id, desiredScrollLeft)
+{
+ return withNode(id, function(node) {
+ node.scrollLeft = desiredScrollLeft;
+ return _elm_lang$core$Native_Utils.Tuple0;
+ });
+}
+
+function toRight(id)
+{
+ return withNode(id, function(node) {
+ node.scrollLeft = node.scrollWidth;
+ return _elm_lang$core$Native_Utils.Tuple0;
+ });
+}
+
+
+// SIZE
+
+function width(options, id)
+{
+ return withNode(id, function(node) {
+ switch (options.ctor)
+ {
+ case 'Content':
+ return node.scrollWidth;
+ case 'VisibleContent':
+ return node.clientWidth;
+ case 'VisibleContentWithBorders':
+ return node.offsetWidth;
+ case 'VisibleContentWithBordersAndMargins':
+ var rect = node.getBoundingClientRect();
+ return rect.right - rect.left;
+ }
+ });
+}
+
+function height(options, id)
+{
+ return withNode(id, function(node) {
+ switch (options.ctor)
+ {
+ case 'Content':
+ return node.scrollHeight;
+ case 'VisibleContent':
+ return node.clientHeight;
+ case 'VisibleContentWithBorders':
+ return node.offsetHeight;
+ case 'VisibleContentWithBordersAndMargins':
+ var rect = node.getBoundingClientRect();
+ return rect.bottom - rect.top;
+ }
+ });
+}
+
+return {
+ onDocument: F3(onDocument),
+ onWindow: F3(onWindow),
+
+ focus: focus,
+ blur: blur,
+
+ getScrollTop: getScrollTop,
+ setScrollTop: F2(setScrollTop),
+ getScrollLeft: getScrollLeft,
+ setScrollLeft: F2(setScrollLeft),
+ toBottom: toBottom,
+ toRight: toRight,
+
+ height: F2(height),
+ width: F2(width)
+};
+
+}();
+
+var _elm_lang$dom$Dom_LowLevel$onWindow = _elm_lang$dom$Native_Dom.onWindow;
+var _elm_lang$dom$Dom_LowLevel$onDocument = _elm_lang$dom$Native_Dom.onDocument;
+
+var _elm_lang$virtual_dom$VirtualDom_Debug$wrap;
+var _elm_lang$virtual_dom$VirtualDom_Debug$wrapWithFlags;
+
+var _elm_lang$virtual_dom$Native_VirtualDom = function() {
+
+var STYLE_KEY = 'STYLE';
+var EVENT_KEY = 'EVENT';
+var ATTR_KEY = 'ATTR';
+var ATTR_NS_KEY = 'ATTR_NS';
+
+var localDoc = typeof document !== 'undefined' ? document : {};
+
+
+//////////// VIRTUAL DOM NODES ////////////
+
+
+function text(string)
+{
+ return {
+ type: 'text',
+ text: string
+ };
+}
+
+
+function node(tag)
+{
+ return F2(function(factList, kidList) {
+ return nodeHelp(tag, factList, kidList);
+ });
+}
+
+
+function nodeHelp(tag, factList, kidList)
+{
+ var organized = organizeFacts(factList);
+ var namespace = organized.namespace;
+ var facts = organized.facts;
+
+ var children = [];
+ var descendantsCount = 0;
+ while (kidList.ctor !== '[]')
+ {
+ var kid = kidList._0;
+ descendantsCount += (kid.descendantsCount || 0);
+ children.push(kid);
+ kidList = kidList._1;
+ }
+ descendantsCount += children.length;
+
+ return {
+ type: 'node',
+ tag: tag,
+ facts: facts,
+ children: children,
+ namespace: namespace,
+ descendantsCount: descendantsCount
+ };
+}
+
+
+function keyedNode(tag, factList, kidList)
+{
+ var organized = organizeFacts(factList);
+ var namespace = organized.namespace;
+ var facts = organized.facts;
+
+ var children = [];
+ var descendantsCount = 0;
+ while (kidList.ctor !== '[]')
+ {
+ var kid = kidList._0;
+ descendantsCount += (kid._1.descendantsCount || 0);
+ children.push(kid);
+ kidList = kidList._1;
+ }
+ descendantsCount += children.length;
+
+ return {
+ type: 'keyed-node',
+ tag: tag,
+ facts: facts,
+ children: children,
+ namespace: namespace,
+ descendantsCount: descendantsCount
+ };
+}
+
+
+function custom(factList, model, impl)
+{
+ var facts = organizeFacts(factList).facts;
+
+ return {
+ type: 'custom',
+ facts: facts,
+ model: model,
+ impl: impl
+ };
+}
+
+
+function map(tagger, node)
+{
+ return {
+ type: 'tagger',
+ tagger: tagger,
+ node: node,
+ descendantsCount: 1 + (node.descendantsCount || 0)
+ };
+}
+
+
+function thunk(func, args, thunk)
+{
+ return {
+ type: 'thunk',
+ func: func,
+ args: args,
+ thunk: thunk,
+ node: undefined
+ };
+}
+
+function lazy(fn, a)
+{
+ return thunk(fn, [a], function() {
+ return fn(a);
+ });
+}
+
+function lazy2(fn, a, b)
+{
+ return thunk(fn, [a,b], function() {
+ return A2(fn, a, b);
+ });
+}
+
+function lazy3(fn, a, b, c)
+{
+ return thunk(fn, [a,b,c], function() {
+ return A3(fn, a, b, c);
+ });
+}
+
+
+
+// FACTS
+
+
+function organizeFacts(factList)
+{
+ var namespace, facts = {};
+
+ while (factList.ctor !== '[]')
+ {
+ var entry = factList._0;
+ var key = entry.key;
+
+ if (key === ATTR_KEY || key === ATTR_NS_KEY || key === EVENT_KEY)
+ {
+ var subFacts = facts[key] || {};
+ subFacts[entry.realKey] = entry.value;
+ facts[key] = subFacts;
+ }
+ else if (key === STYLE_KEY)
+ {
+ var styles = facts[key] || {};
+ var styleList = entry.value;
+ while (styleList.ctor !== '[]')
+ {
+ var style = styleList._0;
+ styles[style._0] = style._1;
+ styleList = styleList._1;
+ }
+ facts[key] = styles;
+ }
+ else if (key === 'namespace')
+ {
+ namespace = entry.value;
+ }
+ else if (key === 'className')
+ {
+ var classes = facts[key];
+ facts[key] = typeof classes === 'undefined'
+ ? entry.value
+ : classes + ' ' + entry.value;
+ }
+ else
+ {
+ facts[key] = entry.value;
+ }
+ factList = factList._1;
+ }
+
+ return {
+ facts: facts,
+ namespace: namespace
+ };
+}
+
+
+
+//////////// PROPERTIES AND ATTRIBUTES ////////////
+
+
+function style(value)
+{
+ return {
+ key: STYLE_KEY,
+ value: value
+ };
+}
+
+
+function property(key, value)
+{
+ return {
+ key: key,
+ value: value
+ };
+}
+
+
+function attribute(key, value)
+{
+ return {
+ key: ATTR_KEY,
+ realKey: key,
+ value: value
+ };
+}
+
+
+function attributeNS(namespace, key, value)
+{
+ return {
+ key: ATTR_NS_KEY,
+ realKey: key,
+ value: {
+ value: value,
+ namespace: namespace
+ }
+ };
+}
+
+
+function on(name, options, decoder)
+{
+ return {
+ key: EVENT_KEY,
+ realKey: name,
+ value: {
+ options: options,
+ decoder: decoder
+ }
+ };
+}
+
+
+function equalEvents(a, b)
+{
+ if (a.options !== b.options)
+ {
+ if (a.options.stopPropagation !== b.options.stopPropagation || a.options.preventDefault !== b.options.preventDefault)
+ {
+ return false;
+ }
+ }
+ return _elm_lang$core$Native_Json.equality(a.decoder, b.decoder);
+}
+
+
+function mapProperty(func, property)
+{
+ if (property.key !== EVENT_KEY)
+ {
+ return property;
+ }
+ return on(
+ property.realKey,
+ property.value.options,
+ A2(_elm_lang$core$Json_Decode$map, func, property.value.decoder)
+ );
+}
+
+
+//////////// RENDER ////////////
+
+
+function render(vNode, eventNode)
+{
+ switch (vNode.type)
+ {
+ case 'thunk':
+ if (!vNode.node)
+ {
+ vNode.node = vNode.thunk();
+ }
+ return render(vNode.node, eventNode);
+
+ case 'tagger':
+ var subNode = vNode.node;
+ var tagger = vNode.tagger;
+
+ while (subNode.type === 'tagger')
+ {
+ typeof tagger !== 'object'
+ ? tagger = [tagger, subNode.tagger]
+ : tagger.push(subNode.tagger);
+
+ subNode = subNode.node;
+ }
+
+ var subEventRoot = { tagger: tagger, parent: eventNode };
+ var domNode = render(subNode, subEventRoot);
+ domNode.elm_event_node_ref = subEventRoot;
+ return domNode;
+
+ case 'text':
+ return localDoc.createTextNode(vNode.text);
+
+ case 'node':
+ var domNode = vNode.namespace
+ ? localDoc.createElementNS(vNode.namespace, vNode.tag)
+ : localDoc.createElement(vNode.tag);
+
+ applyFacts(domNode, eventNode, vNode.facts);
+
+ var children = vNode.children;
+
+ for (var i = 0; i < children.length; i++)
+ {
+ domNode.appendChild(render(children[i], eventNode));
+ }
+
+ return domNode;
+
+ case 'keyed-node':
+ var domNode = vNode.namespace
+ ? localDoc.createElementNS(vNode.namespace, vNode.tag)
+ : localDoc.createElement(vNode.tag);
+
+ applyFacts(domNode, eventNode, vNode.facts);
+
+ var children = vNode.children;
+
+ for (var i = 0; i < children.length; i++)
+ {
+ domNode.appendChild(render(children[i]._1, eventNode));
+ }
+
+ return domNode;
+
+ case 'custom':
+ var domNode = vNode.impl.render(vNode.model);
+ applyFacts(domNode, eventNode, vNode.facts);
+ return domNode;
+ }
+}
+
+
+
+//////////// APPLY FACTS ////////////
+
+
+function applyFacts(domNode, eventNode, facts)
+{
+ for (var key in facts)
+ {
+ var value = facts[key];
+
+ switch (key)
+ {
+ case STYLE_KEY:
+ applyStyles(domNode, value);
+ break;
+
+ case EVENT_KEY:
+ applyEvents(domNode, eventNode, value);
+ break;
+
+ case ATTR_KEY:
+ applyAttrs(domNode, value);
+ break;
+
+ case ATTR_NS_KEY:
+ applyAttrsNS(domNode, value);
+ break;
+
+ case 'value':
+ if (domNode[key] !== value)
+ {
+ domNode[key] = value;
+ }
+ break;
+
+ default:
+ domNode[key] = value;
+ break;
+ }
+ }
+}
+
+function applyStyles(domNode, styles)
+{
+ var domNodeStyle = domNode.style;
+
+ for (var key in styles)
+ {
+ domNodeStyle[key] = styles[key];
+ }
+}
+
+function applyEvents(domNode, eventNode, events)
+{
+ var allHandlers = domNode.elm_handlers || {};
+
+ for (var key in events)
+ {
+ var handler = allHandlers[key];
+ var value = events[key];
+
+ if (typeof value === 'undefined')
+ {
+ domNode.removeEventListener(key, handler);
+ allHandlers[key] = undefined;
+ }
+ else if (typeof handler === 'undefined')
+ {
+ var handler = makeEventHandler(eventNode, value);
+ domNode.addEventListener(key, handler);
+ allHandlers[key] = handler;
+ }
+ else
+ {
+ handler.info = value;
+ }
+ }
+
+ domNode.elm_handlers = allHandlers;
+}
+
+function makeEventHandler(eventNode, info)
+{
+ function eventHandler(event)
+ {
+ var info = eventHandler.info;
+
+ var value = A2(_elm_lang$core$Native_Json.run, info.decoder, event);
+
+ if (value.ctor === 'Ok')
+ {
+ var options = info.options;
+ if (options.stopPropagation)
+ {
+ event.stopPropagation();
+ }
+ if (options.preventDefault)
+ {
+ event.preventDefault();
+ }
+
+ var message = value._0;
+
+ var currentEventNode = eventNode;
+ while (currentEventNode)
+ {
+ var tagger = currentEventNode.tagger;
+ if (typeof tagger === 'function')
+ {
+ message = tagger(message);
+ }
+ else
+ {
+ for (var i = tagger.length; i--; )
+ {
+ message = tagger[i](message);
+ }
+ }
+ currentEventNode = currentEventNode.parent;
+ }
+ }
+ };
+
+ eventHandler.info = info;
+
+ return eventHandler;
+}
+
+function applyAttrs(domNode, attrs)
+{
+ for (var key in attrs)
+ {
+ var value = attrs[key];
+ if (typeof value === 'undefined')
+ {
+ domNode.removeAttribute(key);
+ }
+ else
+ {
+ domNode.setAttribute(key, value);
+ }
+ }
+}
+
+function applyAttrsNS(domNode, nsAttrs)
+{
+ for (var key in nsAttrs)
+ {
+ var pair = nsAttrs[key];
+ var namespace = pair.namespace;
+ var value = pair.value;
+
+ if (typeof value === 'undefined')
+ {
+ domNode.removeAttributeNS(namespace, key);
+ }
+ else
+ {
+ domNode.setAttributeNS(namespace, key, value);
+ }
+ }
+}
+
+
+
+//////////// DIFF ////////////
+
+
+function diff(a, b)
+{
+ var patches = [];
+ diffHelp(a, b, patches, 0);
+ return patches;
+}
+
+
+function makePatch(type, index, data)
+{
+ return {
+ index: index,
+ type: type,
+ data: data,
+ domNode: undefined,
+ eventNode: undefined
+ };
+}
+
+
+function diffHelp(a, b, patches, index)
+{
+ if (a === b)
+ {
+ return;
+ }
+
+ var aType = a.type;
+ var bType = b.type;
+
+ // Bail if you run into different types of nodes. Implies that the
+ // structure has changed significantly and it's not worth a diff.
+ if (aType !== bType)
+ {
+ patches.push(makePatch('p-redraw', index, b));
+ return;
+ }
+
+ // Now we know that both nodes are the same type.
+ switch (bType)
+ {
+ case 'thunk':
+ var aArgs = a.args;
+ var bArgs = b.args;
+ var i = aArgs.length;
+ var same = a.func === b.func && i === bArgs.length;
+ while (same && i--)
+ {
+ same = aArgs[i] === bArgs[i];
+ }
+ if (same)
+ {
+ b.node = a.node;
+ return;
+ }
+ b.node = b.thunk();
+ var subPatches = [];
+ diffHelp(a.node, b.node, subPatches, 0);
+ if (subPatches.length > 0)
+ {
+ patches.push(makePatch('p-thunk', index, subPatches));
+ }
+ return;
+
+ case 'tagger':
+ // gather nested taggers
+ var aTaggers = a.tagger;
+ var bTaggers = b.tagger;
+ var nesting = false;
+
+ var aSubNode = a.node;
+ while (aSubNode.type === 'tagger')
+ {
+ nesting = true;
+
+ typeof aTaggers !== 'object'
+ ? aTaggers = [aTaggers, aSubNode.tagger]
+ : aTaggers.push(aSubNode.tagger);
+
+ aSubNode = aSubNode.node;
+ }
+
+ var bSubNode = b.node;
+ while (bSubNode.type === 'tagger')
+ {
+ nesting = true;
+
+ typeof bTaggers !== 'object'
+ ? bTaggers = [bTaggers, bSubNode.tagger]
+ : bTaggers.push(bSubNode.tagger);
+
+ bSubNode = bSubNode.node;
+ }
+
+ // Just bail if different numbers of taggers. This implies the
+ // structure of the virtual DOM has changed.
+ if (nesting && aTaggers.length !== bTaggers.length)
+ {
+ patches.push(makePatch('p-redraw', index, b));
+ return;
+ }
+
+ // check if taggers are "the same"
+ if (nesting ? !pairwiseRefEqual(aTaggers, bTaggers) : aTaggers !== bTaggers)
+ {
+ patches.push(makePatch('p-tagger', index, bTaggers));
+ }
+
+ // diff everything below the taggers
+ diffHelp(aSubNode, bSubNode, patches, index + 1);
+ return;
+
+ case 'text':
+ if (a.text !== b.text)
+ {
+ patches.push(makePatch('p-text', index, b.text));
+ return;
+ }
+
+ return;
+
+ case 'node':
+ // Bail if obvious indicators have changed. Implies more serious
+ // structural changes such that it's not worth it to diff.
+ if (a.tag !== b.tag || a.namespace !== b.namespace)
+ {
+ patches.push(makePatch('p-redraw', index, b));
+ return;
+ }
+
+ var factsDiff = diffFacts(a.facts, b.facts);
+
+ if (typeof factsDiff !== 'undefined')
+ {
+ patches.push(makePatch('p-facts', index, factsDiff));
+ }
+
+ diffChildren(a, b, patches, index);
+ return;
+
+ case 'keyed-node':
+ // Bail if obvious indicators have changed. Implies more serious
+ // structural changes such that it's not worth it to diff.
+ if (a.tag !== b.tag || a.namespace !== b.namespace)
+ {
+ patches.push(makePatch('p-redraw', index, b));
+ return;
+ }
+
+ var factsDiff = diffFacts(a.facts, b.facts);
+
+ if (typeof factsDiff !== 'undefined')
+ {
+ patches.push(makePatch('p-facts', index, factsDiff));
+ }
+
+ diffKeyedChildren(a, b, patches, index);
+ return;
+
+ case 'custom':
+ if (a.impl !== b.impl)
+ {
+ patches.push(makePatch('p-redraw', index, b));
+ return;
+ }
+
+ var factsDiff = diffFacts(a.facts, b.facts);
+ if (typeof factsDiff !== 'undefined')
+ {
+ patches.push(makePatch('p-facts', index, factsDiff));
+ }
+
+ var patch = b.impl.diff(a,b);
+ if (patch)
+ {
+ patches.push(makePatch('p-custom', index, patch));
+ return;
+ }
+
+ return;
+ }
+}
+
+
+// assumes the incoming arrays are the same length
+function pairwiseRefEqual(as, bs)
+{
+ for (var i = 0; i < as.length; i++)
+ {
+ if (as[i] !== bs[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
+// TODO Instead of creating a new diff object, it's possible to just test if
+// there *is* a diff. During the actual patch, do the diff again and make the
+// modifications directly. This way, there's no new allocations. Worth it?
+function diffFacts(a, b, category)
+{
+ var diff;
+
+ // look for changes and removals
+ for (var aKey in a)
+ {
+ if (aKey === STYLE_KEY || aKey === EVENT_KEY || aKey === ATTR_KEY || aKey === ATTR_NS_KEY)
+ {
+ var subDiff = diffFacts(a[aKey], b[aKey] || {}, aKey);
+ if (subDiff)
+ {
+ diff = diff || {};
+ diff[aKey] = subDiff;
+ }
+ continue;
+ }
+
+ // remove if not in the new facts
+ if (!(aKey in b))
+ {
+ diff = diff || {};
+ diff[aKey] =
+ (typeof category === 'undefined')
+ ? (typeof a[aKey] === 'string' ? '' : null)
+ :
+ (category === STYLE_KEY)
+ ? ''
+ :
+ (category === EVENT_KEY || category === ATTR_KEY)
+ ? undefined
+ :
+ { namespace: a[aKey].namespace, value: undefined };
+
+ continue;
+ }
+
+ var aValue = a[aKey];
+ var bValue = b[aKey];
+
+ // reference equal, so don't worry about it
+ if (aValue === bValue && aKey !== 'value'
+ || category === EVENT_KEY && equalEvents(aValue, bValue))
+ {
+ continue;
+ }
+
+ diff = diff || {};
+ diff[aKey] = bValue;
+ }
+
+ // add new stuff
+ for (var bKey in b)
+ {
+ if (!(bKey in a))
+ {
+ diff = diff || {};
+ diff[bKey] = b[bKey];
+ }
+ }
+
+ return diff;
+}
+
+
+function diffChildren(aParent, bParent, patches, rootIndex)
+{
+ var aChildren = aParent.children;
+ var bChildren = bParent.children;
+
+ var aLen = aChildren.length;
+ var bLen = bChildren.length;
+
+ // FIGURE OUT IF THERE ARE INSERTS OR REMOVALS
+
+ if (aLen > bLen)
+ {
+ patches.push(makePatch('p-remove-last', rootIndex, aLen - bLen));
+ }
+ else if (aLen < bLen)
+ {
+ patches.push(makePatch('p-append', rootIndex, bChildren.slice(aLen)));
+ }
+
+ // PAIRWISE DIFF EVERYTHING ELSE
+
+ var index = rootIndex;
+ var minLen = aLen < bLen ? aLen : bLen;
+ for (var i = 0; i < minLen; i++)
+ {
+ index++;
+ var aChild = aChildren[i];
+ diffHelp(aChild, bChildren[i], patches, index);
+ index += aChild.descendantsCount || 0;
+ }
+}
+
+
+
+//////////// KEYED DIFF ////////////
+
+
+function diffKeyedChildren(aParent, bParent, 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 aChildren = aParent.children;
+ var bChildren = bParent.children;
+ var aLen = aChildren.length;
+ var bLen = bChildren.length;
+ var aIndex = 0;
+ var bIndex = 0;
+
+ var index = rootIndex;
+
+ while (aIndex < aLen && bIndex < bLen)
+ {
+ var a = aChildren[aIndex];
+ var b = bChildren[bIndex];
+
+ var aKey = a._0;
+ var bKey = b._0;
+ var aNode = a._1;
+ var bNode = b._1;
+
+ // check if keys match
+
+ if (aKey === bKey)
+ {
+ index++;
+ diffHelp(aNode, bNode, localPatches, index);
+ index += aNode.descendantsCount || 0;
+
+ aIndex++;
+ bIndex++;
+ continue;
+ }
+
+ // look ahead 1 to detect insertions and removals.
+
+ var aLookAhead = aIndex + 1 < aLen;
+ var bLookAhead = bIndex + 1 < bLen;
+
+ if (aLookAhead)
+ {
+ var aNext = aChildren[aIndex + 1];
+ var aNextKey = aNext._0;
+ var aNextNode = aNext._1;
+ var oldMatch = bKey === aNextKey;
+ }
+
+ if (bLookAhead)
+ {
+ var bNext = bChildren[bIndex + 1];
+ var bNextKey = bNext._0;
+ var bNextNode = bNext._1;
+ var newMatch = aKey === bNextKey;
+ }
+
+
+ // swap a and b
+ if (aLookAhead && bLookAhead && newMatch && oldMatch)
+ {
+ index++;
+ diffHelp(aNode, bNextNode, localPatches, index);
+ insertNode(changes, localPatches, aKey, bNode, bIndex, inserts);
+ index += aNode.descendantsCount || 0;
+
+ index++;
+ removeNode(changes, localPatches, aKey, aNextNode, index);
+ index += aNextNode.descendantsCount || 0;
+
+ aIndex += 2;
+ bIndex += 2;
+ continue;
+ }
+
+ // insert b
+ if (bLookAhead && newMatch)
+ {
+ index++;
+ insertNode(changes, localPatches, bKey, bNode, bIndex, inserts);
+ diffHelp(aNode, bNextNode, localPatches, index);
+ index += aNode.descendantsCount || 0;
+
+ aIndex += 1;
+ bIndex += 2;
+ continue;
+ }
+
+ // remove a
+ if (aLookAhead && oldMatch)
+ {
+ index++;
+ removeNode(changes, localPatches, aKey, aNode, index);
+ index += aNode.descendantsCount || 0;
+
+ index++;
+ diffHelp(aNextNode, bNode, localPatches, index);
+ index += aNextNode.descendantsCount || 0;
+
+ aIndex += 2;
+ bIndex += 1;
+ continue;
+ }
+
+ // remove a, insert b
+ if (aLookAhead && bLookAhead && aNextKey === bNextKey)
+ {
+ index++;
+ removeNode(changes, localPatches, aKey, aNode, index);
+ insertNode(changes, localPatches, bKey, bNode, bIndex, inserts);
+ index += aNode.descendantsCount || 0;
+
+ index++;
+ diffHelp(aNextNode, bNextNode, localPatches, index);
+ index += aNextNode.descendantsCount || 0;
+
+ aIndex += 2;
+ bIndex += 2;
+ continue;
+ }
+
+ break;
+ }
+
+ // eat up any remaining nodes with removeNode and insertNode
+
+ while (aIndex < aLen)
+ {
+ index++;
+ var a = aChildren[aIndex];
+ var aNode = a._1;
+ removeNode(changes, localPatches, a._0, aNode, index);
+ index += aNode.descendantsCount || 0;
+ aIndex++;
+ }
+
+ var endInserts;
+ while (bIndex < bLen)
+ {
+ endInserts = endInserts || [];
+ var b = bChildren[bIndex];
+ insertNode(changes, localPatches, b._0, b._1, undefined, endInserts);
+ bIndex++;
+ }
+
+ if (localPatches.length > 0 || inserts.length > 0 || typeof endInserts !== 'undefined')
+ {
+ patches.push(makePatch('p-reorder', rootIndex, {
+ patches: localPatches,
+ inserts: inserts,
+ endInserts: endInserts
+ }));
+ }
+}
+
+
+
+//////////// CHANGES FROM KEYED DIFF ////////////
+
+
+var POSTFIX = '_elmW6BL';
+
+
+function insertNode(changes, localPatches, key, vnode, bIndex, inserts)
+{
+ var entry = changes[key];
+
+ // never seen this key before
+ if (typeof entry === 'undefined')
+ {
+ entry = {
+ tag: 'insert',
+ vnode: vnode,
+ index: bIndex,
+ data: undefined
+ };
+
+ inserts.push({ index: bIndex, entry: entry });
+ changes[key] = entry;
+
+ return;
+ }
+
+ // this key was removed earlier, a match!
+ if (entry.tag === 'remove')
+ {
+ inserts.push({ index: bIndex, entry: entry });
+
+ entry.tag = 'move';
+ var subPatches = [];
+ diffHelp(entry.vnode, vnode, subPatches, entry.index);
+ entry.index = bIndex;
+ entry.data.data = {
+ patches: subPatches,
+ entry: entry
+ };
+
+ return;
+ }
+
+ // this key has already been inserted or moved, a duplicate!
+ insertNode(changes, localPatches, key + POSTFIX, vnode, bIndex, inserts);
+}
+
+
+function removeNode(changes, localPatches, key, vnode, index)
+{
+ var entry = changes[key];
+
+ // never seen this key before
+ if (typeof entry === 'undefined')
+ {
+ var patch = makePatch('p-remove', index, undefined);
+ localPatches.push(patch);
+
+ changes[key] = {
+ tag: 'remove',
+ vnode: vnode,
+ index: index,
+ data: patch
+ };
+
+ return;
+ }
+
+ // this key was inserted earlier, a match!
+ if (entry.tag === 'insert')
+ {
+ entry.tag = 'move';
+ var subPatches = [];
+ diffHelp(vnode, entry.vnode, subPatches, index);
+
+ var patch = makePatch('p-remove', index, {
+ patches: subPatches,
+ entry: entry
+ });
+ localPatches.push(patch);
+
+ return;
+ }
+
+ // this key has already been removed or moved, a duplicate!
+ removeNode(changes, localPatches, key + 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 addDomNodes(domNode, vNode, patches, eventNode)
+{
+ addDomNodesHelp(domNode, vNode, patches, 0, 0, vNode.descendantsCount, eventNode);
+}
+
+
+// assumes `patches` is non-empty and indexes increase monotonically.
+function addDomNodesHelp(domNode, vNode, patches, i, low, high, eventNode)
+{
+ var patch = patches[i];
+ var index = patch.index;
+
+ while (index === low)
+ {
+ var patchType = patch.type;
+
+ if (patchType === 'p-thunk')
+ {
+ addDomNodes(domNode, vNode.node, patch.data, eventNode);
+ }
+ else if (patchType === 'p-reorder')
+ {
+ patch.domNode = domNode;
+ patch.eventNode = eventNode;
+
+ var subPatches = patch.data.patches;
+ if (subPatches.length > 0)
+ {
+ addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode);
+ }
+ }
+ else if (patchType === 'p-remove')
+ {
+ patch.domNode = domNode;
+ patch.eventNode = eventNode;
+
+ var data = patch.data;
+ if (typeof data !== 'undefined')
+ {
+ data.entry.data = domNode;
+ var subPatches = data.patches;
+ if (subPatches.length > 0)
+ {
+ addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode);
+ }
+ }
+ }
+ else
+ {
+ patch.domNode = domNode;
+ patch.eventNode = eventNode;
+ }
+
+ i++;
+
+ if (!(patch = patches[i]) || (index = patch.index) > high)
+ {
+ return i;
+ }
+ }
+
+ switch (vNode.type)
+ {
+ case 'tagger':
+ var subNode = vNode.node;
+
+ while (subNode.type === "tagger")
+ {
+ subNode = subNode.node;
+ }
+
+ return addDomNodesHelp(domNode, subNode, patches, i, low + 1, high, domNode.elm_event_node_ref);
+
+ case 'node':
+ var vChildren = vNode.children;
+ var childNodes = domNode.childNodes;
+ for (var j = 0; j < vChildren.length; j++)
+ {
+ low++;
+ var vChild = vChildren[j];
+ var nextLow = low + (vChild.descendantsCount || 0);
+ if (low <= index && index <= nextLow)
+ {
+ i = addDomNodesHelp(childNodes[j], vChild, patches, i, low, nextLow, eventNode);
+ if (!(patch = patches[i]) || (index = patch.index) > high)
+ {
+ return i;
+ }
+ }
+ low = nextLow;
+ }
+ return i;
+
+ case 'keyed-node':
+ var vChildren = vNode.children;
+ var childNodes = domNode.childNodes;
+ for (var j = 0; j < vChildren.length; j++)
+ {
+ low++;
+ var vChild = vChildren[j]._1;
+ var nextLow = low + (vChild.descendantsCount || 0);
+ if (low <= index && index <= nextLow)
+ {
+ i = addDomNodesHelp(childNodes[j], vChild, patches, i, low, nextLow, eventNode);
+ if (!(patch = patches[i]) || (index = patch.index) > high)
+ {
+ return i;
+ }
+ }
+ low = nextLow;
+ }
+ return i;
+
+ case 'text':
+ case 'thunk':
+ throw new Error('should never traverse `text` or `thunk` nodes like this');
+ }
+}
+
+
+
+//////////// APPLY PATCHES ////////////
+
+
+function applyPatches(rootDomNode, oldVirtualNode, patches, eventNode)
+{
+ if (patches.length === 0)
+ {
+ return rootDomNode;
+ }
+
+ addDomNodes(rootDomNode, oldVirtualNode, patches, eventNode);
+ return applyPatchesHelp(rootDomNode, patches);
+}
+
+function applyPatchesHelp(rootDomNode, patches)
+{
+ for (var i = 0; i < patches.length; i++)
+ {
+ var patch = patches[i];
+ var localDomNode = patch.domNode
+ var newNode = applyPatch(localDomNode, patch);
+ if (localDomNode === rootDomNode)
+ {
+ rootDomNode = newNode;
+ }
+ }
+ return rootDomNode;
+}
+
+function applyPatch(domNode, patch)
+{
+ switch (patch.type)
+ {
+ case 'p-redraw':
+ return applyPatchRedraw(domNode, patch.data, patch.eventNode);
+
+ case 'p-facts':
+ applyFacts(domNode, patch.eventNode, patch.data);
+ return domNode;
+
+ case 'p-text':
+ domNode.replaceData(0, domNode.length, patch.data);
+ return domNode;
+
+ case 'p-thunk':
+ return applyPatchesHelp(domNode, patch.data);
+
+ case 'p-tagger':
+ if (typeof domNode.elm_event_node_ref !== 'undefined')
+ {
+ domNode.elm_event_node_ref.tagger = patch.data;
+ }
+ else
+ {
+ domNode.elm_event_node_ref = { tagger: patch.data, parent: patch.eventNode };
+ }
+ return domNode;
+
+ case 'p-remove-last':
+ var i = patch.data;
+ while (i--)
+ {
+ domNode.removeChild(domNode.lastChild);
+ }
+ return domNode;
+
+ case 'p-append':
+ var newNodes = patch.data;
+ for (var i = 0; i < newNodes.length; i++)
+ {
+ domNode.appendChild(render(newNodes[i], patch.eventNode));
+ }
+ return domNode;
+
+ case 'p-remove':
+ var data = patch.data;
+ if (typeof data === 'undefined')
+ {
+ domNode.parentNode.removeChild(domNode);
+ return domNode;
+ }
+ var entry = data.entry;
+ if (typeof entry.index !== 'undefined')
+ {
+ domNode.parentNode.removeChild(domNode);
+ }
+ entry.data = applyPatchesHelp(domNode, data.patches);
+ return domNode;
+
+ case 'p-reorder':
+ return applyPatchReorder(domNode, patch);
+
+ case 'p-custom':
+ var impl = patch.data;
+ return impl.applyPatch(domNode, impl.data);
+
+ default:
+ throw new Error('Ran into an unknown patch!');
+ }
+}
+
+
+function applyPatchRedraw(domNode, vNode, eventNode)
+{
+ var parentNode = domNode.parentNode;
+ var newNode = render(vNode, eventNode);
+
+ if (typeof newNode.elm_event_node_ref === 'undefined')
+ {
+ newNode.elm_event_node_ref = domNode.elm_event_node_ref;
+ }
+
+ if (parentNode && newNode !== domNode)
+ {
+ parentNode.replaceChild(newNode, domNode);
+ }
+ return newNode;
+}
+
+
+function applyPatchReorder(domNode, patch)
+{
+ var data = patch.data;
+
+ // remove end inserts
+ var frag = applyPatchReorderEndInsertsHelp(data.endInserts, patch);
+
+ // removals
+ domNode = applyPatchesHelp(domNode, data.patches);
+
+ // inserts
+ var inserts = data.inserts;
+ for (var i = 0; i < inserts.length; i++)
+ {
+ var insert = inserts[i];
+ var entry = insert.entry;
+ var node = entry.tag === 'move'
+ ? entry.data
+ : render(entry.vnode, patch.eventNode);
+ domNode.insertBefore(node, domNode.childNodes[insert.index]);
+ }
+
+ // add end inserts
+ if (typeof frag !== 'undefined')
+ {
+ domNode.appendChild(frag);
+ }
+
+ return domNode;
+}
+
+
+function applyPatchReorderEndInsertsHelp(endInserts, patch)
+{
+ if (typeof endInserts === 'undefined')
+ {
+ return;
+ }
+
+ var frag = localDoc.createDocumentFragment();
+ for (var i = 0; i < endInserts.length; i++)
+ {
+ var insert = endInserts[i];
+ var entry = insert.entry;
+ frag.appendChild(entry.tag === 'move'
+ ? entry.data
+ : render(entry.vnode, patch.eventNode)
+ );
+ }
+ return frag;
+}
+
+
+// PROGRAMS
+
+var program = makeProgram(checkNoFlags);
+var programWithFlags = makeProgram(checkYesFlags);
+
+function makeProgram(flagChecker)
+{
+ return F2(function(debugWrap, impl)
+ {
+ return function(flagDecoder)
+ {
+ return function(object, moduleName, debugMetadata)
+ {
+ var checker = flagChecker(flagDecoder, moduleName);
+ if (typeof debugMetadata === 'undefined')
+ {
+ normalSetup(impl, object, moduleName, checker);
+ }
+ else
+ {
+ debugSetup(A2(debugWrap, debugMetadata, impl), object, moduleName, checker);
+ }
+ };
+ };
+ });
+}
+
+function staticProgram(vNode)
+{
+ var nothing = _elm_lang$core$Native_Utils.Tuple2(
+ _elm_lang$core$Native_Utils.Tuple0,
+ _elm_lang$core$Platform_Cmd$none
+ );
+ return A2(program, _elm_lang$virtual_dom$VirtualDom_Debug$wrap, {
+ init: nothing,
+ view: function() { return vNode; },
+ update: F2(function() { return nothing; }),
+ subscriptions: function() { return _elm_lang$core$Platform_Sub$none; }
+ })();
+}
+
+
+// FLAG CHECKERS
+
+function checkNoFlags(flagDecoder, moduleName)
+{
+ return function(init, flags, domNode)
+ {
+ if (typeof flags === 'undefined')
+ {
+ return init;
+ }
+
+ var errorMessage =
+ 'The `' + moduleName + '` module does not need flags.\n'
+ + 'Initialize it with no arguments and you should be all set!';
+
+ crash(errorMessage, domNode);
+ };
+}
+
+function checkYesFlags(flagDecoder, moduleName)
+{
+ return function(init, flags, domNode)
+ {
+ if (typeof flagDecoder === 'undefined')
+ {
+ var errorMessage =
+ 'Are you trying to sneak a Never value into Elm? Trickster!\n'
+ + 'It looks like ' + moduleName + '.main is defined with `programWithFlags` but has type `Program Never`.\n'
+ + 'Use `program` instead if you do not want flags.'
+
+ crash(errorMessage, domNode);
+ }
+
+ var result = A2(_elm_lang$core$Native_Json.run, flagDecoder, flags);
+ if (result.ctor === 'Ok')
+ {
+ return init(result._0);
+ }
+
+ var errorMessage =
+ 'Trying to initialize the `' + moduleName + '` module with an unexpected flag.\n'
+ + 'I tried to convert it to an Elm value, but ran into this problem:\n\n'
+ + result._0;
+
+ crash(errorMessage, domNode);
+ };
+}
+
+function crash(errorMessage, domNode)
+{
+ if (domNode)
+ {
+ domNode.innerHTML =
+ ''
+ + '
Oops! Something went wrong when starting your Elm program.
'
+ + '
' + errorMessage + '
'
+ + '
';
+ }
+
+ throw new Error(errorMessage);
+}
+
+
+// NORMAL SETUP
+
+function normalSetup(impl, object, moduleName, flagChecker)
+{
+ object['embed'] = function embed(node, flags)
+ {
+ while (node.lastChild)
+ {
+ node.removeChild(node.lastChild);
+ }
+
+ return _elm_lang$core$Native_Platform.initialize(
+ flagChecker(impl.init, flags, node),
+ impl.update,
+ impl.subscriptions,
+ normalRenderer(node, impl.view)
+ );
+ };
+
+ object['fullscreen'] = function fullscreen(flags)
+ {
+ return _elm_lang$core$Native_Platform.initialize(
+ flagChecker(impl.init, flags, document.body),
+ impl.update,
+ impl.subscriptions,
+ normalRenderer(document.body, impl.view)
+ );
+ };
+}
+
+function normalRenderer(parentNode, view)
+{
+ return function(tagger, initialModel)
+ {
+ var eventNode = { tagger: tagger, parent: undefined };
+ var initialVirtualNode = view(initialModel);
+ var domNode = render(initialVirtualNode, eventNode);
+ parentNode.appendChild(domNode);
+ return makeStepper(domNode, view, initialVirtualNode, eventNode);
+ };
+}
+
+
+// STEPPER
+
+var rAF =
+ typeof requestAnimationFrame !== 'undefined'
+ ? requestAnimationFrame
+ : function(callback) { setTimeout(callback, 1000 / 60); };
+
+function makeStepper(domNode, view, initialVirtualNode, eventNode)
+{
+ var state = 'NO_REQUEST';
+ var currNode = initialVirtualNode;
+ var nextModel;
+
+ function updateIfNeeded()
+ {
+ switch (state)
+ {
+ case 'NO_REQUEST':
+ throw new Error(
+ 'Unexpected draw callback.\n' +
+ 'Please report this to .'
+ );
+
+ case 'PENDING_REQUEST':
+ rAF(updateIfNeeded);
+ state = 'EXTRA_REQUEST';
+
+ var nextNode = view(nextModel);
+ var patches = diff(currNode, nextNode);
+ domNode = applyPatches(domNode, currNode, patches, eventNode);
+ currNode = nextNode;
+
+ return;
+
+ case 'EXTRA_REQUEST':
+ state = 'NO_REQUEST';
+ return;
+ }
+ }
+
+ return function stepper(model)
+ {
+ if (state === 'NO_REQUEST')
+ {
+ rAF(updateIfNeeded);
+ }
+ state = 'PENDING_REQUEST';
+ nextModel = model;
+ };
+}
+
+
+// DEBUG SETUP
+
+function debugSetup(impl, object, moduleName, flagChecker)
+{
+ object['fullscreen'] = function fullscreen(flags)
+ {
+ var popoutRef = { doc: undefined };
+ return _elm_lang$core$Native_Platform.initialize(
+ flagChecker(impl.init, flags, document.body),
+ impl.update(scrollTask(popoutRef)),
+ impl.subscriptions,
+ debugRenderer(moduleName, document.body, popoutRef, impl.view, impl.viewIn, impl.viewOut)
+ );
+ };
+
+ object['embed'] = function fullscreen(node, flags)
+ {
+ var popoutRef = { doc: undefined };
+ return _elm_lang$core$Native_Platform.initialize(
+ flagChecker(impl.init, flags, node),
+ impl.update(scrollTask(popoutRef)),
+ impl.subscriptions,
+ debugRenderer(moduleName, node, popoutRef, impl.view, impl.viewIn, impl.viewOut)
+ );
+ };
+}
+
+function scrollTask(popoutRef)
+{
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback)
+ {
+ var doc = popoutRef.doc;
+ if (doc)
+ {
+ var msgs = doc.getElementsByClassName('debugger-sidebar-messages')[0];
+ if (msgs)
+ {
+ msgs.scrollTop = msgs.scrollHeight;
+ }
+ }
+ callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0));
+ });
+}
+
+
+function debugRenderer(moduleName, parentNode, popoutRef, view, viewIn, viewOut)
+{
+ return function(tagger, initialModel)
+ {
+ var appEventNode = { tagger: tagger, parent: undefined };
+ var eventNode = { tagger: tagger, parent: undefined };
+
+ // make normal stepper
+ var appVirtualNode = view(initialModel);
+ var appNode = render(appVirtualNode, appEventNode);
+ parentNode.appendChild(appNode);
+ var appStepper = makeStepper(appNode, view, appVirtualNode, appEventNode);
+
+ // make overlay stepper
+ var overVirtualNode = viewIn(initialModel)._1;
+ var overNode = render(overVirtualNode, eventNode);
+ parentNode.appendChild(overNode);
+ var wrappedViewIn = wrapViewIn(appEventNode, overNode, viewIn);
+ var overStepper = makeStepper(overNode, wrappedViewIn, overVirtualNode, eventNode);
+
+ // make debugger stepper
+ var debugStepper = makeDebugStepper(initialModel, viewOut, eventNode, parentNode, moduleName, popoutRef);
+
+ return function stepper(model)
+ {
+ appStepper(model);
+ overStepper(model);
+ debugStepper(model);
+ }
+ };
+}
+
+function makeDebugStepper(initialModel, view, eventNode, parentNode, moduleName, popoutRef)
+{
+ var curr;
+ var domNode;
+
+ return function stepper(model)
+ {
+ if (!model.isDebuggerOpen)
+ {
+ return;
+ }
+
+ if (!popoutRef.doc)
+ {
+ curr = view(model);
+ domNode = openDebugWindow(moduleName, popoutRef, curr, eventNode);
+ return;
+ }
+
+ // switch to document of popout
+ localDoc = popoutRef.doc;
+
+ var next = view(model);
+ var patches = diff(curr, next);
+ domNode = applyPatches(domNode, curr, patches, eventNode);
+ curr = next;
+
+ // switch back to normal document
+ localDoc = document;
+ };
+}
+
+function openDebugWindow(moduleName, popoutRef, virtualNode, eventNode)
+{
+ var w = 900;
+ var h = 360;
+ var x = screen.width - w;
+ var y = screen.height - h;
+ var debugWindow = window.open('', '', 'width=' + w + ',height=' + h + ',left=' + x + ',top=' + y);
+
+ // switch to window document
+ localDoc = debugWindow.document;
+
+ popoutRef.doc = localDoc;
+ localDoc.title = 'Debugger - ' + moduleName;
+ localDoc.body.style.margin = '0';
+ localDoc.body.style.padding = '0';
+ var domNode = render(virtualNode, eventNode);
+ localDoc.body.appendChild(domNode);
+
+ localDoc.addEventListener('keydown', function(event) {
+ if (event.metaKey && event.which === 82)
+ {
+ window.location.reload();
+ }
+ if (event.which === 38)
+ {
+ eventNode.tagger({ ctor: 'Up' });
+ event.preventDefault();
+ }
+ if (event.which === 40)
+ {
+ eventNode.tagger({ ctor: 'Down' });
+ event.preventDefault();
+ }
+ });
+
+ function close()
+ {
+ popoutRef.doc = undefined;
+ debugWindow.close();
+ }
+ window.addEventListener('unload', close);
+ debugWindow.addEventListener('unload', function() {
+ popoutRef.doc = undefined;
+ window.removeEventListener('unload', close);
+ eventNode.tagger({ ctor: 'Close' });
+ });
+
+ // switch back to the normal document
+ localDoc = document;
+
+ return domNode;
+}
+
+
+// BLOCK EVENTS
+
+function wrapViewIn(appEventNode, overlayNode, viewIn)
+{
+ var ignorer = makeIgnorer(overlayNode);
+ var blocking = 'Normal';
+ var overflow;
+
+ var normalTagger = appEventNode.tagger;
+ var blockTagger = function() {};
+
+ return function(model)
+ {
+ var tuple = viewIn(model);
+ var newBlocking = tuple._0.ctor;
+ appEventNode.tagger = newBlocking === 'Normal' ? normalTagger : blockTagger;
+ if (blocking !== newBlocking)
+ {
+ traverse('removeEventListener', ignorer, blocking);
+ traverse('addEventListener', ignorer, newBlocking);
+
+ if (blocking === 'Normal')
+ {
+ overflow = document.body.style.overflow;
+ document.body.style.overflow = 'hidden';
+ }
+
+ if (newBlocking === 'Normal')
+ {
+ document.body.style.overflow = overflow;
+ }
+
+ blocking = newBlocking;
+ }
+ return tuple._1;
+ }
+}
+
+function traverse(verbEventListener, ignorer, blocking)
+{
+ switch(blocking)
+ {
+ case 'Normal':
+ return;
+
+ case 'Pause':
+ return traverseHelp(verbEventListener, ignorer, mostEvents);
+
+ case 'Message':
+ return traverseHelp(verbEventListener, ignorer, allEvents);
+ }
+}
+
+function traverseHelp(verbEventListener, handler, eventNames)
+{
+ for (var i = 0; i < eventNames.length; i++)
+ {
+ document.body[verbEventListener](eventNames[i], handler, true);
+ }
+}
+
+function makeIgnorer(overlayNode)
+{
+ return function(event)
+ {
+ if (event.type === 'keydown' && event.metaKey && event.which === 82)
+ {
+ return;
+ }
+
+ var isScroll = event.type === 'scroll' || event.type === 'wheel';
+
+ var node = event.target;
+ while (node !== null)
+ {
+ if (node.className === 'elm-overlay-message-details' && isScroll)
+ {
+ return;
+ }
+
+ if (node === overlayNode && !isScroll)
+ {
+ return;
+ }
+ node = node.parentNode;
+ }
+
+ event.stopPropagation();
+ event.preventDefault();
+ }
+}
+
+var mostEvents = [
+ 'click', 'dblclick', 'mousemove',
+ 'mouseup', 'mousedown', 'mouseenter', 'mouseleave',
+ 'touchstart', 'touchend', 'touchcancel', 'touchmove',
+ 'pointerdown', 'pointerup', 'pointerover', 'pointerout',
+ 'pointerenter', 'pointerleave', 'pointermove', 'pointercancel',
+ 'dragstart', 'drag', 'dragend', 'dragenter', 'dragover', 'dragleave', 'drop',
+ 'keyup', 'keydown', 'keypress',
+ 'input', 'change',
+ 'focus', 'blur'
+];
+
+var allEvents = mostEvents.concat('wheel', 'scroll');
+
+
+return {
+ node: node,
+ text: text,
+ custom: custom,
+ map: F2(map),
+
+ on: F3(on),
+ style: style,
+ property: F2(property),
+ attribute: F2(attribute),
+ attributeNS: F3(attributeNS),
+ mapProperty: F2(mapProperty),
+
+ lazy: F2(lazy),
+ lazy2: F3(lazy2),
+ lazy3: F4(lazy3),
+ keyedNode: F3(keyedNode),
+
+ program: program,
+ programWithFlags: programWithFlags,
+ staticProgram: staticProgram
+};
+
+}();
+
+var _elm_lang$virtual_dom$VirtualDom$programWithFlags = function (impl) {
+ return A2(_elm_lang$virtual_dom$Native_VirtualDom.programWithFlags, _elm_lang$virtual_dom$VirtualDom_Debug$wrapWithFlags, impl);
+};
+var _elm_lang$virtual_dom$VirtualDom$program = function (impl) {
+ return A2(_elm_lang$virtual_dom$Native_VirtualDom.program, _elm_lang$virtual_dom$VirtualDom_Debug$wrap, impl);
+};
+var _elm_lang$virtual_dom$VirtualDom$keyedNode = _elm_lang$virtual_dom$Native_VirtualDom.keyedNode;
+var _elm_lang$virtual_dom$VirtualDom$lazy3 = _elm_lang$virtual_dom$Native_VirtualDom.lazy3;
+var _elm_lang$virtual_dom$VirtualDom$lazy2 = _elm_lang$virtual_dom$Native_VirtualDom.lazy2;
+var _elm_lang$virtual_dom$VirtualDom$lazy = _elm_lang$virtual_dom$Native_VirtualDom.lazy;
+var _elm_lang$virtual_dom$VirtualDom$defaultOptions = {stopPropagation: false, preventDefault: false};
+var _elm_lang$virtual_dom$VirtualDom$onWithOptions = _elm_lang$virtual_dom$Native_VirtualDom.on;
+var _elm_lang$virtual_dom$VirtualDom$on = F2(
+ function (eventName, decoder) {
+ return A3(_elm_lang$virtual_dom$VirtualDom$onWithOptions, eventName, _elm_lang$virtual_dom$VirtualDom$defaultOptions, decoder);
+ });
+var _elm_lang$virtual_dom$VirtualDom$style = _elm_lang$virtual_dom$Native_VirtualDom.style;
+var _elm_lang$virtual_dom$VirtualDom$mapProperty = _elm_lang$virtual_dom$Native_VirtualDom.mapProperty;
+var _elm_lang$virtual_dom$VirtualDom$attributeNS = _elm_lang$virtual_dom$Native_VirtualDom.attributeNS;
+var _elm_lang$virtual_dom$VirtualDom$attribute = _elm_lang$virtual_dom$Native_VirtualDom.attribute;
+var _elm_lang$virtual_dom$VirtualDom$property = _elm_lang$virtual_dom$Native_VirtualDom.property;
+var _elm_lang$virtual_dom$VirtualDom$map = _elm_lang$virtual_dom$Native_VirtualDom.map;
+var _elm_lang$virtual_dom$VirtualDom$text = _elm_lang$virtual_dom$Native_VirtualDom.text;
+var _elm_lang$virtual_dom$VirtualDom$node = _elm_lang$virtual_dom$Native_VirtualDom.node;
+var _elm_lang$virtual_dom$VirtualDom$Options = F2(
+ function (a, b) {
+ return {stopPropagation: a, preventDefault: b};
+ });
+var _elm_lang$virtual_dom$VirtualDom$Node = {ctor: 'Node'};
+var _elm_lang$virtual_dom$VirtualDom$Property = {ctor: 'Property'};
+
+var _elm_lang$html$Html$programWithFlags = _elm_lang$virtual_dom$VirtualDom$programWithFlags;
+var _elm_lang$html$Html$program = _elm_lang$virtual_dom$VirtualDom$program;
+var _elm_lang$html$Html$beginnerProgram = function (_p0) {
+ var _p1 = _p0;
+ return _elm_lang$html$Html$program(
+ {
+ init: A2(
+ _elm_lang$core$Platform_Cmd_ops['!'],
+ _p1.model,
+ {ctor: '[]'}),
+ update: F2(
+ function (msg, model) {
+ return A2(
+ _elm_lang$core$Platform_Cmd_ops['!'],
+ A2(_p1.update, msg, model),
+ {ctor: '[]'});
+ }),
+ view: _p1.view,
+ subscriptions: function (_p2) {
+ return _elm_lang$core$Platform_Sub$none;
+ }
+ });
+};
+var _elm_lang$html$Html$map = _elm_lang$virtual_dom$VirtualDom$map;
+var _elm_lang$html$Html$text = _elm_lang$virtual_dom$VirtualDom$text;
+var _elm_lang$html$Html$node = _elm_lang$virtual_dom$VirtualDom$node;
+var _elm_lang$html$Html$body = _elm_lang$html$Html$node('body');
+var _elm_lang$html$Html$section = _elm_lang$html$Html$node('section');
+var _elm_lang$html$Html$nav = _elm_lang$html$Html$node('nav');
+var _elm_lang$html$Html$article = _elm_lang$html$Html$node('article');
+var _elm_lang$html$Html$aside = _elm_lang$html$Html$node('aside');
+var _elm_lang$html$Html$h1 = _elm_lang$html$Html$node('h1');
+var _elm_lang$html$Html$h2 = _elm_lang$html$Html$node('h2');
+var _elm_lang$html$Html$h3 = _elm_lang$html$Html$node('h3');
+var _elm_lang$html$Html$h4 = _elm_lang$html$Html$node('h4');
+var _elm_lang$html$Html$h5 = _elm_lang$html$Html$node('h5');
+var _elm_lang$html$Html$h6 = _elm_lang$html$Html$node('h6');
+var _elm_lang$html$Html$header = _elm_lang$html$Html$node('header');
+var _elm_lang$html$Html$footer = _elm_lang$html$Html$node('footer');
+var _elm_lang$html$Html$address = _elm_lang$html$Html$node('address');
+var _elm_lang$html$Html$main_ = _elm_lang$html$Html$node('main');
+var _elm_lang$html$Html$p = _elm_lang$html$Html$node('p');
+var _elm_lang$html$Html$hr = _elm_lang$html$Html$node('hr');
+var _elm_lang$html$Html$pre = _elm_lang$html$Html$node('pre');
+var _elm_lang$html$Html$blockquote = _elm_lang$html$Html$node('blockquote');
+var _elm_lang$html$Html$ol = _elm_lang$html$Html$node('ol');
+var _elm_lang$html$Html$ul = _elm_lang$html$Html$node('ul');
+var _elm_lang$html$Html$li = _elm_lang$html$Html$node('li');
+var _elm_lang$html$Html$dl = _elm_lang$html$Html$node('dl');
+var _elm_lang$html$Html$dt = _elm_lang$html$Html$node('dt');
+var _elm_lang$html$Html$dd = _elm_lang$html$Html$node('dd');
+var _elm_lang$html$Html$figure = _elm_lang$html$Html$node('figure');
+var _elm_lang$html$Html$figcaption = _elm_lang$html$Html$node('figcaption');
+var _elm_lang$html$Html$div = _elm_lang$html$Html$node('div');
+var _elm_lang$html$Html$a = _elm_lang$html$Html$node('a');
+var _elm_lang$html$Html$em = _elm_lang$html$Html$node('em');
+var _elm_lang$html$Html$strong = _elm_lang$html$Html$node('strong');
+var _elm_lang$html$Html$small = _elm_lang$html$Html$node('small');
+var _elm_lang$html$Html$s = _elm_lang$html$Html$node('s');
+var _elm_lang$html$Html$cite = _elm_lang$html$Html$node('cite');
+var _elm_lang$html$Html$q = _elm_lang$html$Html$node('q');
+var _elm_lang$html$Html$dfn = _elm_lang$html$Html$node('dfn');
+var _elm_lang$html$Html$abbr = _elm_lang$html$Html$node('abbr');
+var _elm_lang$html$Html$time = _elm_lang$html$Html$node('time');
+var _elm_lang$html$Html$code = _elm_lang$html$Html$node('code');
+var _elm_lang$html$Html$var = _elm_lang$html$Html$node('var');
+var _elm_lang$html$Html$samp = _elm_lang$html$Html$node('samp');
+var _elm_lang$html$Html$kbd = _elm_lang$html$Html$node('kbd');
+var _elm_lang$html$Html$sub = _elm_lang$html$Html$node('sub');
+var _elm_lang$html$Html$sup = _elm_lang$html$Html$node('sup');
+var _elm_lang$html$Html$i = _elm_lang$html$Html$node('i');
+var _elm_lang$html$Html$b = _elm_lang$html$Html$node('b');
+var _elm_lang$html$Html$u = _elm_lang$html$Html$node('u');
+var _elm_lang$html$Html$mark = _elm_lang$html$Html$node('mark');
+var _elm_lang$html$Html$ruby = _elm_lang$html$Html$node('ruby');
+var _elm_lang$html$Html$rt = _elm_lang$html$Html$node('rt');
+var _elm_lang$html$Html$rp = _elm_lang$html$Html$node('rp');
+var _elm_lang$html$Html$bdi = _elm_lang$html$Html$node('bdi');
+var _elm_lang$html$Html$bdo = _elm_lang$html$Html$node('bdo');
+var _elm_lang$html$Html$span = _elm_lang$html$Html$node('span');
+var _elm_lang$html$Html$br = _elm_lang$html$Html$node('br');
+var _elm_lang$html$Html$wbr = _elm_lang$html$Html$node('wbr');
+var _elm_lang$html$Html$ins = _elm_lang$html$Html$node('ins');
+var _elm_lang$html$Html$del = _elm_lang$html$Html$node('del');
+var _elm_lang$html$Html$img = _elm_lang$html$Html$node('img');
+var _elm_lang$html$Html$iframe = _elm_lang$html$Html$node('iframe');
+var _elm_lang$html$Html$embed = _elm_lang$html$Html$node('embed');
+var _elm_lang$html$Html$object = _elm_lang$html$Html$node('object');
+var _elm_lang$html$Html$param = _elm_lang$html$Html$node('param');
+var _elm_lang$html$Html$video = _elm_lang$html$Html$node('video');
+var _elm_lang$html$Html$audio = _elm_lang$html$Html$node('audio');
+var _elm_lang$html$Html$source = _elm_lang$html$Html$node('source');
+var _elm_lang$html$Html$track = _elm_lang$html$Html$node('track');
+var _elm_lang$html$Html$canvas = _elm_lang$html$Html$node('canvas');
+var _elm_lang$html$Html$math = _elm_lang$html$Html$node('math');
+var _elm_lang$html$Html$table = _elm_lang$html$Html$node('table');
+var _elm_lang$html$Html$caption = _elm_lang$html$Html$node('caption');
+var _elm_lang$html$Html$colgroup = _elm_lang$html$Html$node('colgroup');
+var _elm_lang$html$Html$col = _elm_lang$html$Html$node('col');
+var _elm_lang$html$Html$tbody = _elm_lang$html$Html$node('tbody');
+var _elm_lang$html$Html$thead = _elm_lang$html$Html$node('thead');
+var _elm_lang$html$Html$tfoot = _elm_lang$html$Html$node('tfoot');
+var _elm_lang$html$Html$tr = _elm_lang$html$Html$node('tr');
+var _elm_lang$html$Html$td = _elm_lang$html$Html$node('td');
+var _elm_lang$html$Html$th = _elm_lang$html$Html$node('th');
+var _elm_lang$html$Html$form = _elm_lang$html$Html$node('form');
+var _elm_lang$html$Html$fieldset = _elm_lang$html$Html$node('fieldset');
+var _elm_lang$html$Html$legend = _elm_lang$html$Html$node('legend');
+var _elm_lang$html$Html$label = _elm_lang$html$Html$node('label');
+var _elm_lang$html$Html$input = _elm_lang$html$Html$node('input');
+var _elm_lang$html$Html$button = _elm_lang$html$Html$node('button');
+var _elm_lang$html$Html$select = _elm_lang$html$Html$node('select');
+var _elm_lang$html$Html$datalist = _elm_lang$html$Html$node('datalist');
+var _elm_lang$html$Html$optgroup = _elm_lang$html$Html$node('optgroup');
+var _elm_lang$html$Html$option = _elm_lang$html$Html$node('option');
+var _elm_lang$html$Html$textarea = _elm_lang$html$Html$node('textarea');
+var _elm_lang$html$Html$keygen = _elm_lang$html$Html$node('keygen');
+var _elm_lang$html$Html$output = _elm_lang$html$Html$node('output');
+var _elm_lang$html$Html$progress = _elm_lang$html$Html$node('progress');
+var _elm_lang$html$Html$meter = _elm_lang$html$Html$node('meter');
+var _elm_lang$html$Html$details = _elm_lang$html$Html$node('details');
+var _elm_lang$html$Html$summary = _elm_lang$html$Html$node('summary');
+var _elm_lang$html$Html$menuitem = _elm_lang$html$Html$node('menuitem');
+var _elm_lang$html$Html$menu = _elm_lang$html$Html$node('menu');
+
+var _elm_lang$html$Html_Attributes$map = _elm_lang$virtual_dom$VirtualDom$mapProperty;
+var _elm_lang$html$Html_Attributes$attribute = _elm_lang$virtual_dom$VirtualDom$attribute;
+var _elm_lang$html$Html_Attributes$contextmenu = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$attribute, 'contextmenu', value);
+};
+var _elm_lang$html$Html_Attributes$draggable = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$attribute, 'draggable', value);
+};
+var _elm_lang$html$Html_Attributes$itemprop = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$attribute, 'itemprop', value);
+};
+var _elm_lang$html$Html_Attributes$tabindex = function (n) {
+ return A2(
+ _elm_lang$html$Html_Attributes$attribute,
+ 'tabIndex',
+ _elm_lang$core$Basics$toString(n));
+};
+var _elm_lang$html$Html_Attributes$charset = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$attribute, 'charset', value);
+};
+var _elm_lang$html$Html_Attributes$height = function (value) {
+ return A2(
+ _elm_lang$html$Html_Attributes$attribute,
+ 'height',
+ _elm_lang$core$Basics$toString(value));
+};
+var _elm_lang$html$Html_Attributes$width = function (value) {
+ return A2(
+ _elm_lang$html$Html_Attributes$attribute,
+ 'width',
+ _elm_lang$core$Basics$toString(value));
+};
+var _elm_lang$html$Html_Attributes$formaction = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$attribute, 'formAction', value);
+};
+var _elm_lang$html$Html_Attributes$list = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$attribute, 'list', value);
+};
+var _elm_lang$html$Html_Attributes$minlength = function (n) {
+ return A2(
+ _elm_lang$html$Html_Attributes$attribute,
+ 'minLength',
+ _elm_lang$core$Basics$toString(n));
+};
+var _elm_lang$html$Html_Attributes$maxlength = function (n) {
+ return A2(
+ _elm_lang$html$Html_Attributes$attribute,
+ 'maxlength',
+ _elm_lang$core$Basics$toString(n));
+};
+var _elm_lang$html$Html_Attributes$size = function (n) {
+ return A2(
+ _elm_lang$html$Html_Attributes$attribute,
+ 'size',
+ _elm_lang$core$Basics$toString(n));
+};
+var _elm_lang$html$Html_Attributes$form = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$attribute, 'form', value);
+};
+var _elm_lang$html$Html_Attributes$cols = function (n) {
+ return A2(
+ _elm_lang$html$Html_Attributes$attribute,
+ 'cols',
+ _elm_lang$core$Basics$toString(n));
+};
+var _elm_lang$html$Html_Attributes$rows = function (n) {
+ return A2(
+ _elm_lang$html$Html_Attributes$attribute,
+ 'rows',
+ _elm_lang$core$Basics$toString(n));
+};
+var _elm_lang$html$Html_Attributes$challenge = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$attribute, 'challenge', value);
+};
+var _elm_lang$html$Html_Attributes$media = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$attribute, 'media', value);
+};
+var _elm_lang$html$Html_Attributes$rel = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$attribute, 'rel', value);
+};
+var _elm_lang$html$Html_Attributes$datetime = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$attribute, 'datetime', value);
+};
+var _elm_lang$html$Html_Attributes$pubdate = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$attribute, 'pubdate', value);
+};
+var _elm_lang$html$Html_Attributes$colspan = function (n) {
+ return A2(
+ _elm_lang$html$Html_Attributes$attribute,
+ 'colspan',
+ _elm_lang$core$Basics$toString(n));
+};
+var _elm_lang$html$Html_Attributes$rowspan = function (n) {
+ return A2(
+ _elm_lang$html$Html_Attributes$attribute,
+ 'rowspan',
+ _elm_lang$core$Basics$toString(n));
+};
+var _elm_lang$html$Html_Attributes$manifest = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$attribute, 'manifest', value);
+};
+var _elm_lang$html$Html_Attributes$property = _elm_lang$virtual_dom$VirtualDom$property;
+var _elm_lang$html$Html_Attributes$stringProperty = F2(
+ function (name, string) {
+ return A2(
+ _elm_lang$html$Html_Attributes$property,
+ name,
+ _elm_lang$core$Json_Encode$string(string));
+ });
+var _elm_lang$html$Html_Attributes$class = function (name) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'className', name);
+};
+var _elm_lang$html$Html_Attributes$id = function (name) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'id', name);
+};
+var _elm_lang$html$Html_Attributes$title = function (name) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'title', name);
+};
+var _elm_lang$html$Html_Attributes$accesskey = function ($char) {
+ return A2(
+ _elm_lang$html$Html_Attributes$stringProperty,
+ 'accessKey',
+ _elm_lang$core$String$fromChar($char));
+};
+var _elm_lang$html$Html_Attributes$dir = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'dir', value);
+};
+var _elm_lang$html$Html_Attributes$dropzone = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'dropzone', value);
+};
+var _elm_lang$html$Html_Attributes$lang = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'lang', value);
+};
+var _elm_lang$html$Html_Attributes$content = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'content', value);
+};
+var _elm_lang$html$Html_Attributes$httpEquiv = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'httpEquiv', value);
+};
+var _elm_lang$html$Html_Attributes$language = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'language', value);
+};
+var _elm_lang$html$Html_Attributes$src = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'src', value);
+};
+var _elm_lang$html$Html_Attributes$alt = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'alt', value);
+};
+var _elm_lang$html$Html_Attributes$preload = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'preload', value);
+};
+var _elm_lang$html$Html_Attributes$poster = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'poster', value);
+};
+var _elm_lang$html$Html_Attributes$kind = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'kind', value);
+};
+var _elm_lang$html$Html_Attributes$srclang = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'srclang', value);
+};
+var _elm_lang$html$Html_Attributes$sandbox = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'sandbox', value);
+};
+var _elm_lang$html$Html_Attributes$srcdoc = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'srcdoc', value);
+};
+var _elm_lang$html$Html_Attributes$type_ = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'type', value);
+};
+var _elm_lang$html$Html_Attributes$value = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'value', value);
+};
+var _elm_lang$html$Html_Attributes$defaultValue = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'defaultValue', value);
+};
+var _elm_lang$html$Html_Attributes$placeholder = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'placeholder', value);
+};
+var _elm_lang$html$Html_Attributes$accept = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'accept', value);
+};
+var _elm_lang$html$Html_Attributes$acceptCharset = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'acceptCharset', value);
+};
+var _elm_lang$html$Html_Attributes$action = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'action', value);
+};
+var _elm_lang$html$Html_Attributes$autocomplete = function (bool) {
+ return A2(
+ _elm_lang$html$Html_Attributes$stringProperty,
+ 'autocomplete',
+ bool ? 'on' : 'off');
+};
+var _elm_lang$html$Html_Attributes$enctype = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'enctype', value);
+};
+var _elm_lang$html$Html_Attributes$method = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'method', value);
+};
+var _elm_lang$html$Html_Attributes$name = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'name', value);
+};
+var _elm_lang$html$Html_Attributes$pattern = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'pattern', value);
+};
+var _elm_lang$html$Html_Attributes$for = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'htmlFor', value);
+};
+var _elm_lang$html$Html_Attributes$max = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'max', value);
+};
+var _elm_lang$html$Html_Attributes$min = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'min', value);
+};
+var _elm_lang$html$Html_Attributes$step = function (n) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'step', n);
+};
+var _elm_lang$html$Html_Attributes$wrap = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'wrap', value);
+};
+var _elm_lang$html$Html_Attributes$usemap = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'useMap', value);
+};
+var _elm_lang$html$Html_Attributes$shape = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'shape', value);
+};
+var _elm_lang$html$Html_Attributes$coords = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'coords', value);
+};
+var _elm_lang$html$Html_Attributes$keytype = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'keytype', value);
+};
+var _elm_lang$html$Html_Attributes$align = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'align', value);
+};
+var _elm_lang$html$Html_Attributes$cite = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'cite', value);
+};
+var _elm_lang$html$Html_Attributes$href = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'href', value);
+};
+var _elm_lang$html$Html_Attributes$target = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'target', value);
+};
+var _elm_lang$html$Html_Attributes$downloadAs = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'download', value);
+};
+var _elm_lang$html$Html_Attributes$hreflang = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'hreflang', value);
+};
+var _elm_lang$html$Html_Attributes$ping = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'ping', value);
+};
+var _elm_lang$html$Html_Attributes$start = function (n) {
+ return A2(
+ _elm_lang$html$Html_Attributes$stringProperty,
+ 'start',
+ _elm_lang$core$Basics$toString(n));
+};
+var _elm_lang$html$Html_Attributes$headers = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'headers', value);
+};
+var _elm_lang$html$Html_Attributes$scope = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$stringProperty, 'scope', value);
+};
+var _elm_lang$html$Html_Attributes$boolProperty = F2(
+ function (name, bool) {
+ return A2(
+ _elm_lang$html$Html_Attributes$property,
+ name,
+ _elm_lang$core$Json_Encode$bool(bool));
+ });
+var _elm_lang$html$Html_Attributes$hidden = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'hidden', bool);
+};
+var _elm_lang$html$Html_Attributes$contenteditable = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'contentEditable', bool);
+};
+var _elm_lang$html$Html_Attributes$spellcheck = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'spellcheck', bool);
+};
+var _elm_lang$html$Html_Attributes$async = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'async', bool);
+};
+var _elm_lang$html$Html_Attributes$defer = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'defer', bool);
+};
+var _elm_lang$html$Html_Attributes$scoped = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'scoped', bool);
+};
+var _elm_lang$html$Html_Attributes$autoplay = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'autoplay', bool);
+};
+var _elm_lang$html$Html_Attributes$controls = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'controls', bool);
+};
+var _elm_lang$html$Html_Attributes$loop = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'loop', bool);
+};
+var _elm_lang$html$Html_Attributes$default = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'default', bool);
+};
+var _elm_lang$html$Html_Attributes$seamless = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'seamless', bool);
+};
+var _elm_lang$html$Html_Attributes$checked = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'checked', bool);
+};
+var _elm_lang$html$Html_Attributes$selected = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'selected', bool);
+};
+var _elm_lang$html$Html_Attributes$autofocus = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'autofocus', bool);
+};
+var _elm_lang$html$Html_Attributes$disabled = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'disabled', bool);
+};
+var _elm_lang$html$Html_Attributes$multiple = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'multiple', bool);
+};
+var _elm_lang$html$Html_Attributes$novalidate = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'noValidate', bool);
+};
+var _elm_lang$html$Html_Attributes$readonly = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'readOnly', bool);
+};
+var _elm_lang$html$Html_Attributes$required = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'required', bool);
+};
+var _elm_lang$html$Html_Attributes$ismap = function (value) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'isMap', value);
+};
+var _elm_lang$html$Html_Attributes$download = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'download', bool);
+};
+var _elm_lang$html$Html_Attributes$reversed = function (bool) {
+ return A2(_elm_lang$html$Html_Attributes$boolProperty, 'reversed', bool);
+};
+var _elm_lang$html$Html_Attributes$classList = function (list) {
+ return _elm_lang$html$Html_Attributes$class(
+ A2(
+ _elm_lang$core$String$join,
+ ' ',
+ A2(
+ _elm_lang$core$List$map,
+ _elm_lang$core$Tuple$first,
+ A2(_elm_lang$core$List$filter, _elm_lang$core$Tuple$second, list))));
+};
+var _elm_lang$html$Html_Attributes$style = _elm_lang$virtual_dom$VirtualDom$style;
+
+var _elm_lang$html$Html_Events$keyCode = A2(_elm_lang$core$Json_Decode$field, 'keyCode', _elm_lang$core$Json_Decode$int);
+var _elm_lang$html$Html_Events$targetChecked = A2(
+ _elm_lang$core$Json_Decode$at,
+ {
+ ctor: '::',
+ _0: 'target',
+ _1: {
+ ctor: '::',
+ _0: 'checked',
+ _1: {ctor: '[]'}
+ }
+ },
+ _elm_lang$core$Json_Decode$bool);
+var _elm_lang$html$Html_Events$targetValue = A2(
+ _elm_lang$core$Json_Decode$at,
+ {
+ ctor: '::',
+ _0: 'target',
+ _1: {
+ ctor: '::',
+ _0: 'value',
+ _1: {ctor: '[]'}
+ }
+ },
+ _elm_lang$core$Json_Decode$string);
+var _elm_lang$html$Html_Events$defaultOptions = _elm_lang$virtual_dom$VirtualDom$defaultOptions;
+var _elm_lang$html$Html_Events$onWithOptions = _elm_lang$virtual_dom$VirtualDom$onWithOptions;
+var _elm_lang$html$Html_Events$on = _elm_lang$virtual_dom$VirtualDom$on;
+var _elm_lang$html$Html_Events$onFocus = function (msg) {
+ return A2(
+ _elm_lang$html$Html_Events$on,
+ 'focus',
+ _elm_lang$core$Json_Decode$succeed(msg));
+};
+var _elm_lang$html$Html_Events$onBlur = function (msg) {
+ return A2(
+ _elm_lang$html$Html_Events$on,
+ 'blur',
+ _elm_lang$core$Json_Decode$succeed(msg));
+};
+var _elm_lang$html$Html_Events$onSubmitOptions = _elm_lang$core$Native_Utils.update(
+ _elm_lang$html$Html_Events$defaultOptions,
+ {preventDefault: true});
+var _elm_lang$html$Html_Events$onSubmit = function (msg) {
+ return A3(
+ _elm_lang$html$Html_Events$onWithOptions,
+ 'submit',
+ _elm_lang$html$Html_Events$onSubmitOptions,
+ _elm_lang$core$Json_Decode$succeed(msg));
+};
+var _elm_lang$html$Html_Events$onCheck = function (tagger) {
+ return A2(
+ _elm_lang$html$Html_Events$on,
+ 'change',
+ A2(_elm_lang$core$Json_Decode$map, tagger, _elm_lang$html$Html_Events$targetChecked));
+};
+var _elm_lang$html$Html_Events$onInput = function (tagger) {
+ return A2(
+ _elm_lang$html$Html_Events$on,
+ 'input',
+ A2(_elm_lang$core$Json_Decode$map, tagger, _elm_lang$html$Html_Events$targetValue));
+};
+var _elm_lang$html$Html_Events$onMouseOut = function (msg) {
+ return A2(
+ _elm_lang$html$Html_Events$on,
+ 'mouseout',
+ _elm_lang$core$Json_Decode$succeed(msg));
+};
+var _elm_lang$html$Html_Events$onMouseOver = function (msg) {
+ return A2(
+ _elm_lang$html$Html_Events$on,
+ 'mouseover',
+ _elm_lang$core$Json_Decode$succeed(msg));
+};
+var _elm_lang$html$Html_Events$onMouseLeave = function (msg) {
+ return A2(
+ _elm_lang$html$Html_Events$on,
+ 'mouseleave',
+ _elm_lang$core$Json_Decode$succeed(msg));
+};
+var _elm_lang$html$Html_Events$onMouseEnter = function (msg) {
+ return A2(
+ _elm_lang$html$Html_Events$on,
+ 'mouseenter',
+ _elm_lang$core$Json_Decode$succeed(msg));
+};
+var _elm_lang$html$Html_Events$onMouseUp = function (msg) {
+ return A2(
+ _elm_lang$html$Html_Events$on,
+ 'mouseup',
+ _elm_lang$core$Json_Decode$succeed(msg));
+};
+var _elm_lang$html$Html_Events$onMouseDown = function (msg) {
+ return A2(
+ _elm_lang$html$Html_Events$on,
+ 'mousedown',
+ _elm_lang$core$Json_Decode$succeed(msg));
+};
+var _elm_lang$html$Html_Events$onDoubleClick = function (msg) {
+ return A2(
+ _elm_lang$html$Html_Events$on,
+ 'dblclick',
+ _elm_lang$core$Json_Decode$succeed(msg));
+};
+var _elm_lang$html$Html_Events$onClick = function (msg) {
+ return A2(
+ _elm_lang$html$Html_Events$on,
+ 'click',
+ _elm_lang$core$Json_Decode$succeed(msg));
+};
+var _elm_lang$html$Html_Events$Options = F2(
+ function (a, b) {
+ return {stopPropagation: a, preventDefault: b};
+ });
+
+var _elm_lang$html$Html_Lazy$lazy3 = _elm_lang$virtual_dom$VirtualDom$lazy3;
+var _elm_lang$html$Html_Lazy$lazy2 = _elm_lang$virtual_dom$VirtualDom$lazy2;
+var _elm_lang$html$Html_Lazy$lazy = _elm_lang$virtual_dom$VirtualDom$lazy;
+
+var _elm_lang$http$Native_Http = function() {
+
+
+// ENCODING AND DECODING
+
+function encodeUri(string)
+{
+ return encodeURIComponent(string);
+}
+
+function decodeUri(string)
+{
+ try
+ {
+ return _elm_lang$core$Maybe$Just(decodeURIComponent(string));
+ }
+ catch(e)
+ {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+}
+
+
+// SEND REQUEST
+
+function toTask(request, maybeProgress)
+{
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback)
+ {
+ var xhr = new XMLHttpRequest();
+
+ configureProgress(xhr, maybeProgress);
+
+ xhr.addEventListener('error', function() {
+ callback(_elm_lang$core$Native_Scheduler.fail({ ctor: 'NetworkError' }));
+ });
+ xhr.addEventListener('timeout', function() {
+ callback(_elm_lang$core$Native_Scheduler.fail({ ctor: 'Timeout' }));
+ });
+ xhr.addEventListener('load', function() {
+ callback(handleResponse(xhr, request.expect.responseToResult));
+ });
+
+ try
+ {
+ xhr.open(request.method, request.url, true);
+ }
+ catch (e)
+ {
+ return callback(_elm_lang$core$Native_Scheduler.fail({ ctor: 'BadUrl', _0: request.url }));
+ }
+
+ configureRequest(xhr, request);
+ send(xhr, request.body);
+
+ return function() { xhr.abort(); };
+ });
+}
+
+function configureProgress(xhr, maybeProgress)
+{
+ if (maybeProgress.ctor === 'Nothing')
+ {
+ return;
+ }
+
+ xhr.addEventListener('progress', function(event) {
+ if (!event.lengthComputable)
+ {
+ return;
+ }
+ _elm_lang$core$Native_Scheduler.rawSpawn(maybeProgress._0({
+ bytes: event.loaded,
+ bytesExpected: event.total
+ }));
+ });
+}
+
+function configureRequest(xhr, request)
+{
+ function setHeader(pair)
+ {
+ xhr.setRequestHeader(pair._0, pair._1);
+ }
+
+ A2(_elm_lang$core$List$map, setHeader, request.headers);
+ xhr.responseType = request.expect.responseType;
+ xhr.withCredentials = request.withCredentials;
+
+ if (request.timeout.ctor === 'Just')
+ {
+ xhr.timeout = request.timeout._0;
+ }
+}
+
+function send(xhr, body)
+{
+ switch (body.ctor)
+ {
+ case 'EmptyBody':
+ xhr.send();
+ return;
+
+ case 'StringBody':
+ xhr.setRequestHeader('Content-Type', body._0);
+ xhr.send(body._1);
+ return;
+
+ case 'FormDataBody':
+ xhr.send(body._0);
+ return;
+ }
+}
+
+
+// RESPONSES
+
+function handleResponse(xhr, responseToResult)
+{
+ var response = toResponse(xhr);
+
+ if (xhr.status < 200 || 300 <= xhr.status)
+ {
+ response.body = xhr.responseText;
+ return _elm_lang$core$Native_Scheduler.fail({
+ ctor: 'BadStatus',
+ _0: response
+ });
+ }
+
+ var result = responseToResult(response);
+
+ if (result.ctor === 'Ok')
+ {
+ return _elm_lang$core$Native_Scheduler.succeed(result._0);
+ }
+ else
+ {
+ response.body = xhr.responseText;
+ return _elm_lang$core$Native_Scheduler.fail({
+ ctor: 'BadPayload',
+ _0: result._0,
+ _1: response
+ });
+ }
+}
+
+function toResponse(xhr)
+{
+ return {
+ status: { code: xhr.status, message: xhr.statusText },
+ headers: parseHeaders(xhr.getAllResponseHeaders()),
+ url: xhr.responseURL,
+ body: xhr.response
+ };
+}
+
+function parseHeaders(rawHeaders)
+{
+ var headers = _elm_lang$core$Dict$empty;
+
+ if (!rawHeaders)
+ {
+ return headers;
+ }
+
+ var headerPairs = rawHeaders.split('\u000d\u000a');
+ for (var i = headerPairs.length; i--; )
+ {
+ var headerPair = headerPairs[i];
+ var index = headerPair.indexOf('\u003a\u0020');
+ if (index > 0)
+ {
+ var key = headerPair.substring(0, index);
+ var value = headerPair.substring(index + 2);
+
+ headers = A3(_elm_lang$core$Dict$update, key, function(oldValue) {
+ if (oldValue.ctor === 'Just')
+ {
+ return _elm_lang$core$Maybe$Just(value + ', ' + oldValue._0);
+ }
+ return _elm_lang$core$Maybe$Just(value);
+ }, headers);
+ }
+ }
+
+ return headers;
+}
+
+
+// EXPECTORS
+
+function expectStringResponse(responseToResult)
+{
+ return {
+ responseType: 'text',
+ responseToResult: responseToResult
+ };
+}
+
+function mapExpect(func, expect)
+{
+ return {
+ responseType: expect.responseType,
+ responseToResult: function(response) {
+ var convertedResponse = expect.responseToResult(response);
+ return A2(_elm_lang$core$Result$map, func, convertedResponse);
+ }
+ };
+}
+
+
+// BODY
+
+function multipart(parts)
+{
+ var formData = new FormData();
+
+ while (parts.ctor !== '[]')
+ {
+ var part = parts._0;
+ formData.append(part._0, part._1);
+ parts = parts._1;
+ }
+
+ return { ctor: 'FormDataBody', _0: formData };
+}
+
+return {
+ toTask: F2(toTask),
+ expectStringResponse: expectStringResponse,
+ mapExpect: F2(mapExpect),
+ multipart: multipart,
+ encodeUri: encodeUri,
+ decodeUri: decodeUri
+};
+
+}();
+
+var _elm_lang$http$Http_Internal$map = F2(
+ function (func, request) {
+ return _elm_lang$core$Native_Utils.update(
+ request,
+ {
+ expect: A2(_elm_lang$http$Native_Http.mapExpect, func, request.expect)
+ });
+ });
+var _elm_lang$http$Http_Internal$RawRequest = F7(
+ function (a, b, c, d, e, f, g) {
+ return {method: a, headers: b, url: c, body: d, expect: e, timeout: f, withCredentials: g};
+ });
+var _elm_lang$http$Http_Internal$Request = function (a) {
+ return {ctor: 'Request', _0: a};
+};
+var _elm_lang$http$Http_Internal$Expect = {ctor: 'Expect'};
+var _elm_lang$http$Http_Internal$FormDataBody = {ctor: 'FormDataBody'};
+var _elm_lang$http$Http_Internal$StringBody = F2(
+ function (a, b) {
+ return {ctor: 'StringBody', _0: a, _1: b};
+ });
+var _elm_lang$http$Http_Internal$EmptyBody = {ctor: 'EmptyBody'};
+var _elm_lang$http$Http_Internal$Header = F2(
+ function (a, b) {
+ return {ctor: 'Header', _0: a, _1: b};
+ });
+
+var _elm_lang$http$Http$decodeUri = _elm_lang$http$Native_Http.decodeUri;
+var _elm_lang$http$Http$encodeUri = _elm_lang$http$Native_Http.encodeUri;
+var _elm_lang$http$Http$expectStringResponse = _elm_lang$http$Native_Http.expectStringResponse;
+var _elm_lang$http$Http$expectJson = function (decoder) {
+ return _elm_lang$http$Http$expectStringResponse(
+ function (response) {
+ return A2(_elm_lang$core$Json_Decode$decodeString, decoder, response.body);
+ });
+};
+var _elm_lang$http$Http$expectString = _elm_lang$http$Http$expectStringResponse(
+ function (response) {
+ return _elm_lang$core$Result$Ok(response.body);
+ });
+var _elm_lang$http$Http$multipartBody = _elm_lang$http$Native_Http.multipart;
+var _elm_lang$http$Http$stringBody = _elm_lang$http$Http_Internal$StringBody;
+var _elm_lang$http$Http$jsonBody = function (value) {
+ return A2(
+ _elm_lang$http$Http_Internal$StringBody,
+ 'application/json',
+ A2(_elm_lang$core$Json_Encode$encode, 0, value));
+};
+var _elm_lang$http$Http$emptyBody = _elm_lang$http$Http_Internal$EmptyBody;
+var _elm_lang$http$Http$header = _elm_lang$http$Http_Internal$Header;
+var _elm_lang$http$Http$request = _elm_lang$http$Http_Internal$Request;
+var _elm_lang$http$Http$post = F3(
+ function (url, body, decoder) {
+ return _elm_lang$http$Http$request(
+ {
+ method: 'POST',
+ headers: {ctor: '[]'},
+ url: url,
+ body: body,
+ expect: _elm_lang$http$Http$expectJson(decoder),
+ timeout: _elm_lang$core$Maybe$Nothing,
+ withCredentials: false
+ });
+ });
+var _elm_lang$http$Http$get = F2(
+ function (url, decoder) {
+ return _elm_lang$http$Http$request(
+ {
+ method: 'GET',
+ headers: {ctor: '[]'},
+ url: url,
+ body: _elm_lang$http$Http$emptyBody,
+ expect: _elm_lang$http$Http$expectJson(decoder),
+ timeout: _elm_lang$core$Maybe$Nothing,
+ withCredentials: false
+ });
+ });
+var _elm_lang$http$Http$getString = function (url) {
+ return _elm_lang$http$Http$request(
+ {
+ method: 'GET',
+ headers: {ctor: '[]'},
+ url: url,
+ body: _elm_lang$http$Http$emptyBody,
+ expect: _elm_lang$http$Http$expectString,
+ timeout: _elm_lang$core$Maybe$Nothing,
+ withCredentials: false
+ });
+};
+var _elm_lang$http$Http$toTask = function (_p0) {
+ var _p1 = _p0;
+ return A2(_elm_lang$http$Native_Http.toTask, _p1._0, _elm_lang$core$Maybe$Nothing);
+};
+var _elm_lang$http$Http$send = F2(
+ function (resultToMessage, request) {
+ return A2(
+ _elm_lang$core$Task$attempt,
+ resultToMessage,
+ _elm_lang$http$Http$toTask(request));
+ });
+var _elm_lang$http$Http$Response = F4(
+ function (a, b, c, d) {
+ return {url: a, status: b, headers: c, body: d};
+ });
+var _elm_lang$http$Http$BadPayload = F2(
+ function (a, b) {
+ return {ctor: 'BadPayload', _0: a, _1: b};
+ });
+var _elm_lang$http$Http$BadStatus = function (a) {
+ return {ctor: 'BadStatus', _0: a};
+};
+var _elm_lang$http$Http$NetworkError = {ctor: 'NetworkError'};
+var _elm_lang$http$Http$Timeout = {ctor: 'Timeout'};
+var _elm_lang$http$Http$BadUrl = function (a) {
+ return {ctor: 'BadUrl', _0: a};
+};
+var _elm_lang$http$Http$StringPart = F2(
+ function (a, b) {
+ return {ctor: 'StringPart', _0: a, _1: b};
+ });
+var _elm_lang$http$Http$stringPart = _elm_lang$http$Http$StringPart;
+
+var _elm_lang$navigation$Native_Navigation = function() {
+
+
+// FAKE NAVIGATION
+
+function go(n)
+{
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback)
+ {
+ if (n !== 0)
+ {
+ history.go(n);
+ }
+ callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0));
+ });
+}
+
+function pushState(url)
+{
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback)
+ {
+ history.pushState({}, '', url);
+ callback(_elm_lang$core$Native_Scheduler.succeed(getLocation()));
+ });
+}
+
+function replaceState(url)
+{
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback)
+ {
+ history.replaceState({}, '', url);
+ callback(_elm_lang$core$Native_Scheduler.succeed(getLocation()));
+ });
+}
+
+
+// REAL NAVIGATION
+
+function reloadPage(skipCache)
+{
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback)
+ {
+ document.location.reload(skipCache);
+ callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0));
+ });
+}
+
+function setLocation(url)
+{
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback)
+ {
+ try
+ {
+ 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.
+ document.location.reload(false);
+ }
+ callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0));
+ });
+}
+
+
+// GET LOCATION
+
+function getLocation()
+{
+ var location = document.location;
+
+ return {
+ href: location.href,
+ host: location.host,
+ hostname: location.hostname,
+ protocol: location.protocol,
+ origin: location.origin,
+ port_: location.port,
+ pathname: location.pathname,
+ search: location.search,
+ hash: location.hash,
+ username: location.username,
+ password: location.password
+ };
+}
+
+
+// DETECT IE11 PROBLEMS
+
+function isInternetExplorer11()
+{
+ return window.navigator.userAgent.indexOf('Trident') !== -1;
+}
+
+
+return {
+ go: go,
+ setLocation: setLocation,
+ reloadPage: reloadPage,
+ pushState: pushState,
+ replaceState: replaceState,
+ getLocation: getLocation,
+ isInternetExplorer11: isInternetExplorer11
+};
+
+}();
+
+var _elm_lang$navigation$Navigation$replaceState = _elm_lang$navigation$Native_Navigation.replaceState;
+var _elm_lang$navigation$Navigation$pushState = _elm_lang$navigation$Native_Navigation.pushState;
+var _elm_lang$navigation$Navigation$go = _elm_lang$navigation$Native_Navigation.go;
+var _elm_lang$navigation$Navigation$reloadPage = _elm_lang$navigation$Native_Navigation.reloadPage;
+var _elm_lang$navigation$Navigation$setLocation = _elm_lang$navigation$Native_Navigation.setLocation;
+var _elm_lang$navigation$Navigation_ops = _elm_lang$navigation$Navigation_ops || {};
+_elm_lang$navigation$Navigation_ops['&>'] = F2(
+ function (task1, task2) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (_p0) {
+ return task2;
+ },
+ task1);
+ });
+var _elm_lang$navigation$Navigation$notify = F3(
+ function (router, subs, location) {
+ var send = function (_p1) {
+ var _p2 = _p1;
+ return A2(
+ _elm_lang$core$Platform$sendToApp,
+ router,
+ _p2._0(location));
+ };
+ return A2(
+ _elm_lang$navigation$Navigation_ops['&>'],
+ _elm_lang$core$Task$sequence(
+ A2(_elm_lang$core$List$map, send, subs)),
+ _elm_lang$core$Task$succeed(
+ {ctor: '_Tuple0'}));
+ });
+var _elm_lang$navigation$Navigation$cmdHelp = F3(
+ function (router, subs, cmd) {
+ var _p3 = cmd;
+ switch (_p3.ctor) {
+ case 'Jump':
+ return _elm_lang$navigation$Navigation$go(_p3._0);
+ case 'New':
+ return A2(
+ _elm_lang$core$Task$andThen,
+ A2(_elm_lang$navigation$Navigation$notify, router, subs),
+ _elm_lang$navigation$Navigation$pushState(_p3._0));
+ case 'Modify':
+ return A2(
+ _elm_lang$core$Task$andThen,
+ A2(_elm_lang$navigation$Navigation$notify, router, subs),
+ _elm_lang$navigation$Navigation$replaceState(_p3._0));
+ case 'Visit':
+ return _elm_lang$navigation$Navigation$setLocation(_p3._0);
+ default:
+ return _elm_lang$navigation$Navigation$reloadPage(_p3._0);
+ }
+ });
+var _elm_lang$navigation$Navigation$killPopWatcher = function (popWatcher) {
+ var _p4 = popWatcher;
+ if (_p4.ctor === 'Normal') {
+ return _elm_lang$core$Process$kill(_p4._0);
+ } else {
+ return A2(
+ _elm_lang$navigation$Navigation_ops['&>'],
+ _elm_lang$core$Process$kill(_p4._0),
+ _elm_lang$core$Process$kill(_p4._1));
+ }
+};
+var _elm_lang$navigation$Navigation$onSelfMsg = F3(
+ function (router, location, state) {
+ return A2(
+ _elm_lang$navigation$Navigation_ops['&>'],
+ A3(_elm_lang$navigation$Navigation$notify, router, state.subs, location),
+ _elm_lang$core$Task$succeed(state));
+ });
+var _elm_lang$navigation$Navigation$subscription = _elm_lang$core$Native_Platform.leaf('Navigation');
+var _elm_lang$navigation$Navigation$command = _elm_lang$core$Native_Platform.leaf('Navigation');
+var _elm_lang$navigation$Navigation$Location = 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 function (j) {
+ return function (k) {
+ return {href: a, host: b, hostname: c, protocol: d, origin: e, port_: f, pathname: g, search: h, hash: i, username: j, password: k};
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+};
+var _elm_lang$navigation$Navigation$State = F2(
+ function (a, b) {
+ return {subs: a, popWatcher: b};
+ });
+var _elm_lang$navigation$Navigation$init = _elm_lang$core$Task$succeed(
+ A2(
+ _elm_lang$navigation$Navigation$State,
+ {ctor: '[]'},
+ _elm_lang$core$Maybe$Nothing));
+var _elm_lang$navigation$Navigation$Reload = function (a) {
+ return {ctor: 'Reload', _0: a};
+};
+var _elm_lang$navigation$Navigation$reload = _elm_lang$navigation$Navigation$command(
+ _elm_lang$navigation$Navigation$Reload(false));
+var _elm_lang$navigation$Navigation$reloadAndSkipCache = _elm_lang$navigation$Navigation$command(
+ _elm_lang$navigation$Navigation$Reload(true));
+var _elm_lang$navigation$Navigation$Visit = function (a) {
+ return {ctor: 'Visit', _0: a};
+};
+var _elm_lang$navigation$Navigation$load = function (url) {
+ return _elm_lang$navigation$Navigation$command(
+ _elm_lang$navigation$Navigation$Visit(url));
+};
+var _elm_lang$navigation$Navigation$Modify = function (a) {
+ return {ctor: 'Modify', _0: a};
+};
+var _elm_lang$navigation$Navigation$modifyUrl = function (url) {
+ return _elm_lang$navigation$Navigation$command(
+ _elm_lang$navigation$Navigation$Modify(url));
+};
+var _elm_lang$navigation$Navigation$New = function (a) {
+ return {ctor: 'New', _0: a};
+};
+var _elm_lang$navigation$Navigation$newUrl = function (url) {
+ return _elm_lang$navigation$Navigation$command(
+ _elm_lang$navigation$Navigation$New(url));
+};
+var _elm_lang$navigation$Navigation$Jump = function (a) {
+ return {ctor: 'Jump', _0: a};
+};
+var _elm_lang$navigation$Navigation$back = function (n) {
+ return _elm_lang$navigation$Navigation$command(
+ _elm_lang$navigation$Navigation$Jump(0 - n));
+};
+var _elm_lang$navigation$Navigation$forward = function (n) {
+ return _elm_lang$navigation$Navigation$command(
+ _elm_lang$navigation$Navigation$Jump(n));
+};
+var _elm_lang$navigation$Navigation$cmdMap = F2(
+ function (_p5, myCmd) {
+ var _p6 = myCmd;
+ switch (_p6.ctor) {
+ case 'Jump':
+ return _elm_lang$navigation$Navigation$Jump(_p6._0);
+ case 'New':
+ return _elm_lang$navigation$Navigation$New(_p6._0);
+ case 'Modify':
+ return _elm_lang$navigation$Navigation$Modify(_p6._0);
+ case 'Visit':
+ return _elm_lang$navigation$Navigation$Visit(_p6._0);
+ default:
+ return _elm_lang$navigation$Navigation$Reload(_p6._0);
+ }
+ });
+var _elm_lang$navigation$Navigation$Monitor = function (a) {
+ return {ctor: 'Monitor', _0: a};
+};
+var _elm_lang$navigation$Navigation$program = F2(
+ function (locationToMessage, stuff) {
+ var init = stuff.init(
+ _elm_lang$navigation$Native_Navigation.getLocation(
+ {ctor: '_Tuple0'}));
+ var subs = function (model) {
+ return _elm_lang$core$Platform_Sub$batch(
+ {
+ ctor: '::',
+ _0: _elm_lang$navigation$Navigation$subscription(
+ _elm_lang$navigation$Navigation$Monitor(locationToMessage)),
+ _1: {
+ ctor: '::',
+ _0: stuff.subscriptions(model),
+ _1: {ctor: '[]'}
+ }
+ });
+ };
+ return _elm_lang$html$Html$program(
+ {init: init, view: stuff.view, update: stuff.update, subscriptions: subs});
+ });
+var _elm_lang$navigation$Navigation$programWithFlags = F2(
+ function (locationToMessage, stuff) {
+ var init = function (flags) {
+ return A2(
+ stuff.init,
+ flags,
+ _elm_lang$navigation$Native_Navigation.getLocation(
+ {ctor: '_Tuple0'}));
+ };
+ var subs = function (model) {
+ return _elm_lang$core$Platform_Sub$batch(
+ {
+ ctor: '::',
+ _0: _elm_lang$navigation$Navigation$subscription(
+ _elm_lang$navigation$Navigation$Monitor(locationToMessage)),
+ _1: {
+ ctor: '::',
+ _0: stuff.subscriptions(model),
+ _1: {ctor: '[]'}
+ }
+ });
+ };
+ return _elm_lang$html$Html$programWithFlags(
+ {init: init, view: stuff.view, update: stuff.update, subscriptions: subs});
+ });
+var _elm_lang$navigation$Navigation$subMap = F2(
+ function (func, _p7) {
+ var _p8 = _p7;
+ return _elm_lang$navigation$Navigation$Monitor(
+ function (_p9) {
+ return func(
+ _p8._0(_p9));
+ });
+ });
+var _elm_lang$navigation$Navigation$InternetExplorer = F2(
+ function (a, b) {
+ return {ctor: 'InternetExplorer', _0: a, _1: b};
+ });
+var _elm_lang$navigation$Navigation$Normal = function (a) {
+ return {ctor: 'Normal', _0: a};
+};
+var _elm_lang$navigation$Navigation$spawnPopWatcher = function (router) {
+ var reportLocation = function (_p10) {
+ return A2(
+ _elm_lang$core$Platform$sendToSelf,
+ router,
+ _elm_lang$navigation$Native_Navigation.getLocation(
+ {ctor: '_Tuple0'}));
+ };
+ return _elm_lang$navigation$Native_Navigation.isInternetExplorer11(
+ {ctor: '_Tuple0'}) ? A3(
+ _elm_lang$core$Task$map2,
+ _elm_lang$navigation$Navigation$InternetExplorer,
+ _elm_lang$core$Process$spawn(
+ A3(_elm_lang$dom$Dom_LowLevel$onWindow, 'popstate', _elm_lang$core$Json_Decode$value, reportLocation)),
+ _elm_lang$core$Process$spawn(
+ A3(_elm_lang$dom$Dom_LowLevel$onWindow, 'hashchange', _elm_lang$core$Json_Decode$value, reportLocation))) : A2(
+ _elm_lang$core$Task$map,
+ _elm_lang$navigation$Navigation$Normal,
+ _elm_lang$core$Process$spawn(
+ A3(_elm_lang$dom$Dom_LowLevel$onWindow, 'popstate', _elm_lang$core$Json_Decode$value, reportLocation)));
+};
+var _elm_lang$navigation$Navigation$onEffects = F4(
+ function (router, cmds, subs, _p11) {
+ var _p12 = _p11;
+ var _p15 = _p12.popWatcher;
+ var stepState = function () {
+ var _p13 = {ctor: '_Tuple2', _0: subs, _1: _p15};
+ _v6_2:
+ do {
+ if (_p13._0.ctor === '[]') {
+ if (_p13._1.ctor === 'Just') {
+ return A2(
+ _elm_lang$navigation$Navigation_ops['&>'],
+ _elm_lang$navigation$Navigation$killPopWatcher(_p13._1._0),
+ _elm_lang$core$Task$succeed(
+ A2(_elm_lang$navigation$Navigation$State, subs, _elm_lang$core$Maybe$Nothing)));
+ } else {
+ break _v6_2;
+ }
+ } else {
+ if (_p13._1.ctor === 'Nothing') {
+ return A2(
+ _elm_lang$core$Task$map,
+ function (_p14) {
+ return A2(
+ _elm_lang$navigation$Navigation$State,
+ subs,
+ _elm_lang$core$Maybe$Just(_p14));
+ },
+ _elm_lang$navigation$Navigation$spawnPopWatcher(router));
+ } else {
+ break _v6_2;
+ }
+ }
+ } while(false);
+ return _elm_lang$core$Task$succeed(
+ A2(_elm_lang$navigation$Navigation$State, subs, _p15));
+ }();
+ return A2(
+ _elm_lang$navigation$Navigation_ops['&>'],
+ _elm_lang$core$Task$sequence(
+ A2(
+ _elm_lang$core$List$map,
+ A2(_elm_lang$navigation$Navigation$cmdHelp, router, subs),
+ cmds)),
+ stepState);
+ });
+_elm_lang$core$Native_Platform.effectManagers['Navigation'] = {pkg: 'elm-lang/navigation', init: _elm_lang$navigation$Navigation$init, onEffects: _elm_lang$navigation$Navigation$onEffects, onSelfMsg: _elm_lang$navigation$Navigation$onSelfMsg, tag: 'fx', cmdMap: _elm_lang$navigation$Navigation$cmdMap, subMap: _elm_lang$navigation$Navigation$subMap};
+
+var _elm_lang$websocket$Native_WebSocket = function() {
+
+function open(url, settings)
+{
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback)
+ {
+ try
+ {
+ var socket = new WebSocket(url);
+ socket.elm_web_socket = true;
+ }
+ catch(err)
+ {
+ return callback(_elm_lang$core$Native_Scheduler.fail({
+ ctor: err.name === 'SecurityError' ? 'BadSecurity' : 'BadArgs',
+ _0: err.message
+ }));
+ }
+
+ socket.addEventListener("open", function(event) {
+ callback(_elm_lang$core$Native_Scheduler.succeed(socket));
+ });
+
+ socket.addEventListener("message", function(event) {
+ _elm_lang$core$Native_Scheduler.rawSpawn(A2(settings.onMessage, socket, event.data));
+ });
+
+ socket.addEventListener("close", function(event) {
+ _elm_lang$core$Native_Scheduler.rawSpawn(settings.onClose({
+ code: event.code,
+ reason: event.reason,
+ wasClean: event.wasClean
+ }));
+ });
+
+ return function()
+ {
+ if (socket && socket.close)
+ {
+ socket.close();
+ }
+ };
+ });
+}
+
+function send(socket, string)
+{
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback)
+ {
+ var result =
+ socket.readyState === WebSocket.OPEN
+ ? _elm_lang$core$Maybe$Nothing
+ : _elm_lang$core$Maybe$Just({ ctor: 'NotOpen' });
+
+ try
+ {
+ socket.send(string);
+ }
+ catch(err)
+ {
+ result = _elm_lang$core$Maybe$Just({ ctor: 'BadString' });
+ }
+
+ callback(_elm_lang$core$Native_Scheduler.succeed(result));
+ });
+}
+
+function close(code, reason, socket)
+{
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) {
+ try
+ {
+ socket.close(code, reason);
+ }
+ catch(err)
+ {
+ return callback(_elm_lang$core$Native_Scheduler.fail(_elm_lang$core$Maybe$Just({
+ ctor: err.name === 'SyntaxError' ? 'BadReason' : 'BadCode'
+ })));
+ }
+ callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Maybe$Nothing));
+ });
+}
+
+function bytesQueued(socket)
+{
+ return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) {
+ callback(_elm_lang$core$Native_Scheduler.succeed(socket.bufferedAmount));
+ });
+}
+
+return {
+ open: F2(open),
+ send: F2(send),
+ close: F3(close),
+ bytesQueued: bytesQueued
+};
+
+}();
+
+var _elm_lang$websocket$WebSocket_LowLevel$bytesQueued = _elm_lang$websocket$Native_WebSocket.bytesQueued;
+var _elm_lang$websocket$WebSocket_LowLevel$send = _elm_lang$websocket$Native_WebSocket.send;
+var _elm_lang$websocket$WebSocket_LowLevel$closeWith = _elm_lang$websocket$Native_WebSocket.close;
+var _elm_lang$websocket$WebSocket_LowLevel$close = function (socket) {
+ return A2(
+ _elm_lang$core$Task$map,
+ _elm_lang$core$Basics$always(
+ {ctor: '_Tuple0'}),
+ A3(_elm_lang$websocket$WebSocket_LowLevel$closeWith, 1000, '', socket));
+};
+var _elm_lang$websocket$WebSocket_LowLevel$open = _elm_lang$websocket$Native_WebSocket.open;
+var _elm_lang$websocket$WebSocket_LowLevel$Settings = F2(
+ function (a, b) {
+ return {onMessage: a, onClose: b};
+ });
+var _elm_lang$websocket$WebSocket_LowLevel$WebSocket = {ctor: 'WebSocket'};
+var _elm_lang$websocket$WebSocket_LowLevel$BadArgs = {ctor: 'BadArgs'};
+var _elm_lang$websocket$WebSocket_LowLevel$BadSecurity = {ctor: 'BadSecurity'};
+var _elm_lang$websocket$WebSocket_LowLevel$BadReason = {ctor: 'BadReason'};
+var _elm_lang$websocket$WebSocket_LowLevel$BadCode = {ctor: 'BadCode'};
+var _elm_lang$websocket$WebSocket_LowLevel$BadString = {ctor: 'BadString'};
+var _elm_lang$websocket$WebSocket_LowLevel$NotOpen = {ctor: 'NotOpen'};
+
+var _elm_lang$websocket$WebSocket$closeConnection = function (connection) {
+ var _p0 = connection;
+ if (_p0.ctor === 'Opening') {
+ return _elm_lang$core$Process$kill(_p0._1);
+ } else {
+ return _elm_lang$websocket$WebSocket_LowLevel$close(_p0._0);
+ }
+};
+var _elm_lang$websocket$WebSocket$after = function (backoff) {
+ return (_elm_lang$core$Native_Utils.cmp(backoff, 1) < 0) ? _elm_lang$core$Task$succeed(
+ {ctor: '_Tuple0'}) : _elm_lang$core$Process$sleep(
+ _elm_lang$core$Basics$toFloat(
+ 10 * Math.pow(2, backoff)));
+};
+var _elm_lang$websocket$WebSocket$removeQueue = F2(
+ function (name, state) {
+ return _elm_lang$core$Native_Utils.update(
+ state,
+ {
+ queues: A2(_elm_lang$core$Dict$remove, name, state.queues)
+ });
+ });
+var _elm_lang$websocket$WebSocket$updateSocket = F3(
+ function (name, connection, state) {
+ return _elm_lang$core$Native_Utils.update(
+ state,
+ {
+ sockets: A3(_elm_lang$core$Dict$insert, name, connection, state.sockets)
+ });
+ });
+var _elm_lang$websocket$WebSocket$add = F2(
+ function (value, maybeList) {
+ var _p1 = maybeList;
+ if (_p1.ctor === 'Nothing') {
+ return _elm_lang$core$Maybe$Just(
+ {
+ ctor: '::',
+ _0: value,
+ _1: {ctor: '[]'}
+ });
+ } else {
+ return _elm_lang$core$Maybe$Just(
+ {ctor: '::', _0: value, _1: _p1._0});
+ }
+ });
+var _elm_lang$websocket$WebSocket$buildSubDict = F2(
+ function (subs, dict) {
+ buildSubDict:
+ while (true) {
+ var _p2 = subs;
+ if (_p2.ctor === '[]') {
+ return dict;
+ } else {
+ if (_p2._0.ctor === 'Listen') {
+ var _v3 = _p2._1,
+ _v4 = A3(
+ _elm_lang$core$Dict$update,
+ _p2._0._0,
+ _elm_lang$websocket$WebSocket$add(_p2._0._1),
+ dict);
+ subs = _v3;
+ dict = _v4;
+ continue buildSubDict;
+ } else {
+ var _v5 = _p2._1,
+ _v6 = A3(
+ _elm_lang$core$Dict$update,
+ _p2._0._0,
+ function (_p3) {
+ return _elm_lang$core$Maybe$Just(
+ A2(
+ _elm_lang$core$Maybe$withDefault,
+ {ctor: '[]'},
+ _p3));
+ },
+ dict);
+ subs = _v5;
+ dict = _v6;
+ continue buildSubDict;
+ }
+ }
+ }
+ });
+var _elm_lang$websocket$WebSocket_ops = _elm_lang$websocket$WebSocket_ops || {};
+_elm_lang$websocket$WebSocket_ops['&>'] = F2(
+ function (t1, t2) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (_p4) {
+ return t2;
+ },
+ t1);
+ });
+var _elm_lang$websocket$WebSocket$sendMessagesHelp = F3(
+ function (cmds, socketsDict, queuesDict) {
+ sendMessagesHelp:
+ while (true) {
+ var _p5 = cmds;
+ if (_p5.ctor === '[]') {
+ return _elm_lang$core$Task$succeed(queuesDict);
+ } else {
+ var _p9 = _p5._1;
+ var _p8 = _p5._0._0;
+ var _p7 = _p5._0._1;
+ var _p6 = A2(_elm_lang$core$Dict$get, _p8, socketsDict);
+ if ((_p6.ctor === 'Just') && (_p6._0.ctor === 'Connected')) {
+ return A2(
+ _elm_lang$websocket$WebSocket_ops['&>'],
+ A2(_elm_lang$websocket$WebSocket_LowLevel$send, _p6._0._0, _p7),
+ A3(_elm_lang$websocket$WebSocket$sendMessagesHelp, _p9, socketsDict, queuesDict));
+ } else {
+ var _v9 = _p9,
+ _v10 = socketsDict,
+ _v11 = A3(
+ _elm_lang$core$Dict$update,
+ _p8,
+ _elm_lang$websocket$WebSocket$add(_p7),
+ queuesDict);
+ cmds = _v9;
+ socketsDict = _v10;
+ queuesDict = _v11;
+ continue sendMessagesHelp;
+ }
+ }
+ }
+ });
+var _elm_lang$websocket$WebSocket$subscription = _elm_lang$core$Native_Platform.leaf('WebSocket');
+var _elm_lang$websocket$WebSocket$command = _elm_lang$core$Native_Platform.leaf('WebSocket');
+var _elm_lang$websocket$WebSocket$State = F3(
+ function (a, b, c) {
+ return {sockets: a, queues: b, subs: c};
+ });
+var _elm_lang$websocket$WebSocket$init = _elm_lang$core$Task$succeed(
+ A3(_elm_lang$websocket$WebSocket$State, _elm_lang$core$Dict$empty, _elm_lang$core$Dict$empty, _elm_lang$core$Dict$empty));
+var _elm_lang$websocket$WebSocket$Send = F2(
+ function (a, b) {
+ return {ctor: 'Send', _0: a, _1: b};
+ });
+var _elm_lang$websocket$WebSocket$send = F2(
+ function (url, message) {
+ return _elm_lang$websocket$WebSocket$command(
+ A2(_elm_lang$websocket$WebSocket$Send, url, message));
+ });
+var _elm_lang$websocket$WebSocket$cmdMap = F2(
+ function (_p11, _p10) {
+ var _p12 = _p10;
+ return A2(_elm_lang$websocket$WebSocket$Send, _p12._0, _p12._1);
+ });
+var _elm_lang$websocket$WebSocket$KeepAlive = function (a) {
+ return {ctor: 'KeepAlive', _0: a};
+};
+var _elm_lang$websocket$WebSocket$keepAlive = function (url) {
+ return _elm_lang$websocket$WebSocket$subscription(
+ _elm_lang$websocket$WebSocket$KeepAlive(url));
+};
+var _elm_lang$websocket$WebSocket$Listen = F2(
+ function (a, b) {
+ return {ctor: 'Listen', _0: a, _1: b};
+ });
+var _elm_lang$websocket$WebSocket$listen = F2(
+ function (url, tagger) {
+ return _elm_lang$websocket$WebSocket$subscription(
+ A2(_elm_lang$websocket$WebSocket$Listen, url, tagger));
+ });
+var _elm_lang$websocket$WebSocket$subMap = F2(
+ function (func, sub) {
+ var _p13 = sub;
+ if (_p13.ctor === 'Listen') {
+ return A2(
+ _elm_lang$websocket$WebSocket$Listen,
+ _p13._0,
+ function (_p14) {
+ return func(
+ _p13._1(_p14));
+ });
+ } else {
+ return _elm_lang$websocket$WebSocket$KeepAlive(_p13._0);
+ }
+ });
+var _elm_lang$websocket$WebSocket$Connected = function (a) {
+ return {ctor: 'Connected', _0: a};
+};
+var _elm_lang$websocket$WebSocket$Opening = F2(
+ function (a, b) {
+ return {ctor: 'Opening', _0: a, _1: b};
+ });
+var _elm_lang$websocket$WebSocket$BadOpen = function (a) {
+ return {ctor: 'BadOpen', _0: a};
+};
+var _elm_lang$websocket$WebSocket$GoodOpen = F2(
+ function (a, b) {
+ return {ctor: 'GoodOpen', _0: a, _1: b};
+ });
+var _elm_lang$websocket$WebSocket$Die = function (a) {
+ return {ctor: 'Die', _0: a};
+};
+var _elm_lang$websocket$WebSocket$Receive = F2(
+ function (a, b) {
+ return {ctor: 'Receive', _0: a, _1: b};
+ });
+var _elm_lang$websocket$WebSocket$open = F2(
+ function (name, router) {
+ return A2(
+ _elm_lang$websocket$WebSocket_LowLevel$open,
+ name,
+ {
+ onMessage: F2(
+ function (_p15, msg) {
+ return A2(
+ _elm_lang$core$Platform$sendToSelf,
+ router,
+ A2(_elm_lang$websocket$WebSocket$Receive, name, msg));
+ }),
+ onClose: function (details) {
+ return A2(
+ _elm_lang$core$Platform$sendToSelf,
+ router,
+ _elm_lang$websocket$WebSocket$Die(name));
+ }
+ });
+ });
+var _elm_lang$websocket$WebSocket$attemptOpen = F3(
+ function (router, backoff, name) {
+ var badOpen = function (_p16) {
+ return A2(
+ _elm_lang$core$Platform$sendToSelf,
+ router,
+ _elm_lang$websocket$WebSocket$BadOpen(name));
+ };
+ var goodOpen = function (ws) {
+ return A2(
+ _elm_lang$core$Platform$sendToSelf,
+ router,
+ A2(_elm_lang$websocket$WebSocket$GoodOpen, name, ws));
+ };
+ var actuallyAttemptOpen = A2(
+ _elm_lang$core$Task$onError,
+ badOpen,
+ A2(
+ _elm_lang$core$Task$andThen,
+ goodOpen,
+ A2(_elm_lang$websocket$WebSocket$open, name, router)));
+ return _elm_lang$core$Process$spawn(
+ A2(
+ _elm_lang$websocket$WebSocket_ops['&>'],
+ _elm_lang$websocket$WebSocket$after(backoff),
+ actuallyAttemptOpen));
+ });
+var _elm_lang$websocket$WebSocket$onEffects = F4(
+ function (router, cmds, subs, state) {
+ var newSubs = A2(_elm_lang$websocket$WebSocket$buildSubDict, subs, _elm_lang$core$Dict$empty);
+ var cleanup = function (newQueues) {
+ var rightStep = F3(
+ function (name, connection, getNewSockets) {
+ return A2(
+ _elm_lang$websocket$WebSocket_ops['&>'],
+ _elm_lang$websocket$WebSocket$closeConnection(connection),
+ getNewSockets);
+ });
+ var bothStep = F4(
+ function (name, _p17, connection, getNewSockets) {
+ return A2(
+ _elm_lang$core$Task$map,
+ A2(_elm_lang$core$Dict$insert, name, connection),
+ getNewSockets);
+ });
+ var leftStep = F3(
+ function (name, _p18, getNewSockets) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (newSockets) {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (pid) {
+ return _elm_lang$core$Task$succeed(
+ A3(
+ _elm_lang$core$Dict$insert,
+ name,
+ A2(_elm_lang$websocket$WebSocket$Opening, 0, pid),
+ newSockets));
+ },
+ A3(_elm_lang$websocket$WebSocket$attemptOpen, router, 0, name));
+ },
+ getNewSockets);
+ });
+ var newEntries = A2(
+ _elm_lang$core$Dict$union,
+ newQueues,
+ A2(
+ _elm_lang$core$Dict$map,
+ F2(
+ function (k, v) {
+ return {ctor: '[]'};
+ }),
+ newSubs));
+ var collectNewSockets = A6(
+ _elm_lang$core$Dict$merge,
+ leftStep,
+ bothStep,
+ rightStep,
+ newEntries,
+ state.sockets,
+ _elm_lang$core$Task$succeed(_elm_lang$core$Dict$empty));
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (newSockets) {
+ return _elm_lang$core$Task$succeed(
+ A3(_elm_lang$websocket$WebSocket$State, newSockets, newQueues, newSubs));
+ },
+ collectNewSockets);
+ };
+ var sendMessagesGetNewQueues = A3(_elm_lang$websocket$WebSocket$sendMessagesHelp, cmds, state.sockets, state.queues);
+ return A2(_elm_lang$core$Task$andThen, cleanup, sendMessagesGetNewQueues);
+ });
+var _elm_lang$websocket$WebSocket$onSelfMsg = F3(
+ function (router, selfMsg, state) {
+ var _p19 = selfMsg;
+ switch (_p19.ctor) {
+ case 'Receive':
+ var sends = A2(
+ _elm_lang$core$List$map,
+ function (tagger) {
+ return A2(
+ _elm_lang$core$Platform$sendToApp,
+ router,
+ tagger(_p19._1));
+ },
+ A2(
+ _elm_lang$core$Maybe$withDefault,
+ {ctor: '[]'},
+ A2(_elm_lang$core$Dict$get, _p19._0, state.subs)));
+ return A2(
+ _elm_lang$websocket$WebSocket_ops['&>'],
+ _elm_lang$core$Task$sequence(sends),
+ _elm_lang$core$Task$succeed(state));
+ case 'Die':
+ var _p21 = _p19._0;
+ var _p20 = A2(_elm_lang$core$Dict$get, _p21, state.sockets);
+ if (_p20.ctor === 'Nothing') {
+ return _elm_lang$core$Task$succeed(state);
+ } else {
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (pid) {
+ return _elm_lang$core$Task$succeed(
+ A3(
+ _elm_lang$websocket$WebSocket$updateSocket,
+ _p21,
+ A2(_elm_lang$websocket$WebSocket$Opening, 0, pid),
+ state));
+ },
+ A3(_elm_lang$websocket$WebSocket$attemptOpen, router, 0, _p21));
+ }
+ case 'GoodOpen':
+ var _p24 = _p19._1;
+ var _p23 = _p19._0;
+ var _p22 = A2(_elm_lang$core$Dict$get, _p23, state.queues);
+ if (_p22.ctor === 'Nothing') {
+ return _elm_lang$core$Task$succeed(
+ A3(
+ _elm_lang$websocket$WebSocket$updateSocket,
+ _p23,
+ _elm_lang$websocket$WebSocket$Connected(_p24),
+ state));
+ } else {
+ return A3(
+ _elm_lang$core$List$foldl,
+ F2(
+ function (msg, task) {
+ return A2(
+ _elm_lang$websocket$WebSocket_ops['&>'],
+ A2(_elm_lang$websocket$WebSocket_LowLevel$send, _p24, msg),
+ task);
+ }),
+ _elm_lang$core$Task$succeed(
+ A2(
+ _elm_lang$websocket$WebSocket$removeQueue,
+ _p23,
+ A3(
+ _elm_lang$websocket$WebSocket$updateSocket,
+ _p23,
+ _elm_lang$websocket$WebSocket$Connected(_p24),
+ state))),
+ _p22._0);
+ }
+ default:
+ var _p27 = _p19._0;
+ var _p25 = A2(_elm_lang$core$Dict$get, _p27, state.sockets);
+ if (_p25.ctor === 'Nothing') {
+ return _elm_lang$core$Task$succeed(state);
+ } else {
+ if (_p25._0.ctor === 'Opening') {
+ var _p26 = _p25._0._0;
+ return A2(
+ _elm_lang$core$Task$andThen,
+ function (pid) {
+ return _elm_lang$core$Task$succeed(
+ A3(
+ _elm_lang$websocket$WebSocket$updateSocket,
+ _p27,
+ A2(_elm_lang$websocket$WebSocket$Opening, _p26 + 1, pid),
+ state));
+ },
+ A3(_elm_lang$websocket$WebSocket$attemptOpen, router, _p26 + 1, _p27));
+ } else {
+ return _elm_lang$core$Task$succeed(state);
+ }
+ }
+ }
+ });
+_elm_lang$core$Native_Platform.effectManagers['WebSocket'] = {pkg: 'elm-lang/websocket', init: _elm_lang$websocket$WebSocket$init, onEffects: _elm_lang$websocket$WebSocket$onEffects, onSelfMsg: _elm_lang$websocket$WebSocket$onSelfMsg, tag: 'fx', cmdMap: _elm_lang$websocket$WebSocket$cmdMap, subMap: _elm_lang$websocket$WebSocket$subMap};
+
+var _evancz$elm_markdown$Native_Markdown = function() {
+
+
+// VIRTUAL-DOM WIDGETS
+
+function toHtml(options, factList, rawMarkdown)
+{
+ var model = {
+ options: options,
+ markdown: rawMarkdown
+ };
+ return _elm_lang$virtual_dom$Native_VirtualDom.custom(factList, model, implementation);
+}
+
+
+// WIDGET IMPLEMENTATION
+
+var implementation = {
+ render: render,
+ diff: diff
+};
+
+function render(model)
+{
+ var html = marked(model.markdown, formatOptions(model.options));
+ var div = document.createElement('div');
+ div.innerHTML = html;
+ return div;
+}
+
+function diff(a, b)
+{
+
+ if (a.model.markdown === b.model.markdown && a.model.options === b.model.options)
+ {
+ return null;
+ }
+
+ return {
+ applyPatch: applyPatch,
+ data: marked(b.model.markdown, formatOptions(b.model.options))
+ };
+}
+
+function applyPatch(domNode, data)
+{
+ domNode.innerHTML = data;
+ return domNode;
+}
+
+
+// ACTUAL MARKDOWN PARSER
+
+var marked = function() {
+ // catch the `marked` object regardless of the outer environment.
+ // (ex. a CommonJS module compatible environment.)
+ // note that this depends on marked's implementation of environment detection.
+ var module = {};
+ var exports = module.exports = {};
+
+ /**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/chjj/marked
+ * commit cd2f6f5b7091154c5526e79b5f3bfb4d15995a51
+ */
+ (function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+block.def.source+")")();block.blockquote=replace(block.blockquote)("def",block.def)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b";block.html=replace(block.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1","\\2")+"|"+block.list.source.replace("\\1","\\3")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm){if(this.options.tables){this.rules=block.tables}else{this.rules=block.gfm}}}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top,bq){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1){this.tokens.push({type:"space"})}}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]||""});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i ?/gm,"");this.token(cap,top,true);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i1&&b.length>1)){src=cap.slice(i+1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item.charAt(item.length-1)==="\n";if(!loose)loose=next}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false,bq);this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&(cap[1]==="pre"||cap[1]==="script"||cap[1]==="style"),text:cap[0]});continue}if(!bq&&top&&(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;this.renderer=this.options.renderer||new Renderer;this.renderer.options=this.options;if(!this.links){throw new Error("Tokens array requires a `links` property.")}if(this.options.gfm){if(this.options.breaks){this.rules=inline.breaks}else{this.rules=inline.gfm}}else if(this.options.pedantic){this.rules=inline.pedantic}}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1].charAt(6)===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+=this.renderer.link(href,null,text);continue}if(!this.inLink&&(cap=this.rules.url.exec(src))){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+=this.renderer.link(href,null,text);continue}if(cap=this.rules.tag.exec(src)){if(!this.inLink&&/^/i.test(cap[0])){this.inLink=false}src=src.substring(cap[0].length);out+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(cap[0]):escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);this.inLink=true;out+=this.outputLink(cap,{href:cap[2],title:cap[3]});this.inLink=false;continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0].charAt(0);src=cap[0].substring(1)+src;continue}this.inLink=true;out+=this.outputLink(cap,link);this.inLink=false;continue}if(cap=this.rules.strong.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.strong(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.em(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.codespan(escape(cap[2],true));continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.br();continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.del(this.output(cap[1]));continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.text(escape(this.smartypants(cap[0])));continue}if(src){throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}}return out};InlineLexer.prototype.outputLink=function(cap,link){var href=escape(link.href),title=link.title?escape(link.title):null;return cap[0].charAt(0)!=="!"?this.renderer.link(href,title,this.output(cap[1])):this.renderer.image(href,title,escape(cap[1]))};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014\/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014\/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…")};InlineLexer.prototype.mangle=function(text){if(!this.options.mangle)return text;var out="",l=text.length,i=0,ch;for(;i.5){ch="x"+ch.toString(16)}out+=""+ch+";"}return out};function Renderer(options){this.options=options||{}}Renderer.prototype.code=function(code,lang,escaped){if(this.options.highlight){var out=this.options.highlight(code,lang);if(out!=null&&out!==code){escaped=true;code=out}}if(!lang){return""+(escaped?code:escape(code,true))+"\n
"}return''+(escaped?code:escape(code,true))+"\n
\n"};Renderer.prototype.blockquote=function(quote){return"\n"+quote+"
\n"};Renderer.prototype.html=function(html){return html};Renderer.prototype.heading=function(text,level,raw){return"\n"};Renderer.prototype.hr=function(){return this.options.xhtml?"
\n":"
\n"};Renderer.prototype.list=function(body,ordered){var type=ordered?"ol":"ul";return"<"+type+">\n"+body+""+type+">\n"};Renderer.prototype.listitem=function(text){return""+text+"\n"};Renderer.prototype.paragraph=function(text){return""+text+"
\n"};Renderer.prototype.table=function(header,body){return"\n"+"\n"+header+"\n"+"\n"+body+"\n"+"
\n"};Renderer.prototype.tablerow=function(content){return"\n"+content+"
\n"};Renderer.prototype.tablecell=function(content,flags){var type=flags.header?"th":"td";var tag=flags.align?"<"+type+' style="text-align:'+flags.align+'">':"<"+type+">";return tag+content+""+type+">\n"};Renderer.prototype.strong=function(text){return""+text+""};Renderer.prototype.em=function(text){return""+text+""};Renderer.prototype.codespan=function(text){return""+text+"
"};Renderer.prototype.br=function(){return this.options.xhtml?"
":"
"};Renderer.prototype.del=function(text){return""+text+""};Renderer.prototype.link=function(href,title,text){if(this.options.sanitize){try{var prot=decodeURIComponent(unescape(href)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return""}if(prot.indexOf("javascript:")===0||prot.indexOf("vbscript:")===0||prot.indexOf("data:")===0){return""}}var out='"+text+"";return out};Renderer.prototype.image=function(href,title,text){var out='":">";return out};Renderer.prototype.text=function(text){return text};function Parser(options){this.tokens=[];this.token=null;this.options=options||marked.defaults;this.options.renderer=this.options.renderer||new Renderer;this.renderer=this.options.renderer;this.renderer.options=this.options}Parser.parse=function(src,options,renderer){var parser=new Parser(options,renderer);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options,this.renderer);this.tokens=src.reverse();var out="";while(this.next()){out+=this.tok()}return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;while(this.peek().type==="text"){body+="\n"+this.next().text}return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case"space":{return""}case"hr":{return this.renderer.hr()}case"heading":{return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text)}case"code":{return this.renderer.code(this.token.text,this.token.lang,this.token.escaped)}case"table":{var header="",body="",i,row,cell,flags,j;cell="";for(i=0;i/g,">").replace(/"/g,""").replace(/'/g,"'")}function unescape(html){return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/g,function(_,n){n=n.toLowerCase();if(n==="colon")return":";if(n.charAt(0)==="#"){return n.charAt(1)==="x"?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1))}return""})}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=1,target,key;for(;iAn error occured:
"+escape(e.message+"",true)+"
"}throw e}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,sanitizer:null,mangle:true,smartLists:false,silent:false,highlight:null,langPrefix:"lang-",smartypants:false,headerPrefix:"",renderer:new Renderer,xhtml:false};marked.Parser=Parser;marked.parser=Parser.parse;marked.Renderer=Renderer;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;marked.parse=marked;if(typeof module!=="undefined"&&typeof exports==="object"){module.exports=marked}else if(typeof define==="function"&&define.amd){define(function(){return marked})}else{this.marked=marked}}).call(function(){return this||(typeof window!=="undefined"?window:global)}());
+
+ return module.exports;
+}();
+
+
+// FORMAT OPTIONS FOR MARKED IMPLEMENTATION
+
+function formatOptions(options)
+{
+ function toHighlight(code, lang)
+ {
+ if (!lang && options.defaultHighlighting.ctor === 'Just')
+ {
+ lang = options.defaultHighlighting._0;
+ }
+
+ if (typeof hljs !== 'undefined' && lang && hljs.listLanguages().indexOf(lang) >= 0)
+ {
+ return hljs.highlight(lang, code, true).value;
+ }
+
+ return code;
+ }
+
+ var gfm = options.githubFlavored;
+ if (gfm.ctor === 'Just')
+ {
+ return {
+ highlight: toHighlight,
+ gfm: true,
+ tables: gfm._0.tables,
+ breaks: gfm._0.breaks,
+ sanitize: options.sanitize,
+ smartypants: options.smartypants
+ };
+ }
+
+ return {
+ highlight: toHighlight,
+ gfm: false,
+ tables: false,
+ breaks: false,
+ sanitize: options.sanitize,
+ smartypants: options.smartypants
+ };
+}
+
+
+// EXPORTS
+
+return {
+ toHtml: F3(toHtml)
+};
+
+}();
+
+var _evancz$elm_markdown$Markdown$toHtmlWith = _evancz$elm_markdown$Native_Markdown.toHtml;
+var _evancz$elm_markdown$Markdown$defaultOptions = {
+ githubFlavored: _elm_lang$core$Maybe$Just(
+ {tables: false, breaks: false}),
+ defaultHighlighting: _elm_lang$core$Maybe$Nothing,
+ sanitize: false,
+ smartypants: false
+};
+var _evancz$elm_markdown$Markdown$toHtml = F2(
+ function (attrs, string) {
+ return A3(_evancz$elm_markdown$Native_Markdown.toHtml, _evancz$elm_markdown$Markdown$defaultOptions, attrs, string);
+ });
+var _evancz$elm_markdown$Markdown$Options = F4(
+ function (a, b, c, d) {
+ return {githubFlavored: a, defaultHighlighting: b, sanitize: c, smartypants: d};
+ });
+
+var _evancz$url_parser$UrlParser$toKeyValuePair = function (segment) {
+ var _p0 = A2(_elm_lang$core$String$split, '=', segment);
+ if (((_p0.ctor === '::') && (_p0._1.ctor === '::')) && (_p0._1._1.ctor === '[]')) {
+ return A3(
+ _elm_lang$core$Maybe$map2,
+ F2(
+ function (v0, v1) {
+ return {ctor: '_Tuple2', _0: v0, _1: v1};
+ }),
+ _elm_lang$http$Http$decodeUri(_p0._0),
+ _elm_lang$http$Http$decodeUri(_p0._1._0));
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+};
+var _evancz$url_parser$UrlParser$parseParams = function (queryString) {
+ return _elm_lang$core$Dict$fromList(
+ A2(
+ _elm_lang$core$List$filterMap,
+ _evancz$url_parser$UrlParser$toKeyValuePair,
+ A2(
+ _elm_lang$core$String$split,
+ '&',
+ A2(_elm_lang$core$String$dropLeft, 1, queryString))));
+};
+var _evancz$url_parser$UrlParser$splitUrl = function (url) {
+ var _p1 = A2(_elm_lang$core$String$split, '/', url);
+ if ((_p1.ctor === '::') && (_p1._0 === '')) {
+ return _p1._1;
+ } else {
+ return _p1;
+ }
+};
+var _evancz$url_parser$UrlParser$parseHelp = function (states) {
+ parseHelp:
+ while (true) {
+ var _p2 = states;
+ if (_p2.ctor === '[]') {
+ return _elm_lang$core$Maybe$Nothing;
+ } else {
+ var _p4 = _p2._0;
+ var _p3 = _p4.unvisited;
+ if (_p3.ctor === '[]') {
+ return _elm_lang$core$Maybe$Just(_p4.value);
+ } else {
+ if ((_p3._0 === '') && (_p3._1.ctor === '[]')) {
+ return _elm_lang$core$Maybe$Just(_p4.value);
+ } else {
+ var _v4 = _p2._1;
+ states = _v4;
+ continue parseHelp;
+ }
+ }
+ }
+ }
+};
+var _evancz$url_parser$UrlParser$parse = F3(
+ function (_p5, url, params) {
+ var _p6 = _p5;
+ return _evancz$url_parser$UrlParser$parseHelp(
+ _p6._0(
+ {
+ visited: {ctor: '[]'},
+ unvisited: _evancz$url_parser$UrlParser$splitUrl(url),
+ params: params,
+ value: _elm_lang$core$Basics$identity
+ }));
+ });
+var _evancz$url_parser$UrlParser$parseHash = F2(
+ function (parser, location) {
+ return A3(
+ _evancz$url_parser$UrlParser$parse,
+ parser,
+ A2(_elm_lang$core$String$dropLeft, 1, location.hash),
+ _evancz$url_parser$UrlParser$parseParams(location.search));
+ });
+var _evancz$url_parser$UrlParser$parsePath = F2(
+ function (parser, location) {
+ return A3(
+ _evancz$url_parser$UrlParser$parse,
+ parser,
+ location.pathname,
+ _evancz$url_parser$UrlParser$parseParams(location.search));
+ });
+var _evancz$url_parser$UrlParser$intParamHelp = function (maybeValue) {
+ var _p7 = maybeValue;
+ if (_p7.ctor === 'Nothing') {
+ return _elm_lang$core$Maybe$Nothing;
+ } else {
+ return _elm_lang$core$Result$toMaybe(
+ _elm_lang$core$String$toInt(_p7._0));
+ }
+};
+var _evancz$url_parser$UrlParser$mapHelp = F2(
+ function (func, _p8) {
+ var _p9 = _p8;
+ return {
+ visited: _p9.visited,
+ unvisited: _p9.unvisited,
+ params: _p9.params,
+ value: func(_p9.value)
+ };
+ });
+var _evancz$url_parser$UrlParser$State = F4(
+ function (a, b, c, d) {
+ return {visited: a, unvisited: b, params: c, value: d};
+ });
+var _evancz$url_parser$UrlParser$Parser = function (a) {
+ return {ctor: 'Parser', _0: a};
+};
+var _evancz$url_parser$UrlParser$s = function (str) {
+ return _evancz$url_parser$UrlParser$Parser(
+ function (_p10) {
+ var _p11 = _p10;
+ var _p12 = _p11.unvisited;
+ if (_p12.ctor === '[]') {
+ return {ctor: '[]'};
+ } else {
+ var _p13 = _p12._0;
+ return _elm_lang$core$Native_Utils.eq(_p13, str) ? {
+ ctor: '::',
+ _0: A4(
+ _evancz$url_parser$UrlParser$State,
+ {ctor: '::', _0: _p13, _1: _p11.visited},
+ _p12._1,
+ _p11.params,
+ _p11.value),
+ _1: {ctor: '[]'}
+ } : {ctor: '[]'};
+ }
+ });
+};
+var _evancz$url_parser$UrlParser$custom = F2(
+ function (tipe, stringToSomething) {
+ return _evancz$url_parser$UrlParser$Parser(
+ function (_p14) {
+ var _p15 = _p14;
+ var _p16 = _p15.unvisited;
+ if (_p16.ctor === '[]') {
+ return {ctor: '[]'};
+ } else {
+ var _p18 = _p16._0;
+ var _p17 = stringToSomething(_p18);
+ if (_p17.ctor === 'Ok') {
+ return {
+ ctor: '::',
+ _0: A4(
+ _evancz$url_parser$UrlParser$State,
+ {ctor: '::', _0: _p18, _1: _p15.visited},
+ _p16._1,
+ _p15.params,
+ _p15.value(_p17._0)),
+ _1: {ctor: '[]'}
+ };
+ } else {
+ return {ctor: '[]'};
+ }
+ }
+ });
+ });
+var _evancz$url_parser$UrlParser$string = A2(_evancz$url_parser$UrlParser$custom, 'STRING', _elm_lang$core$Result$Ok);
+var _evancz$url_parser$UrlParser$int = A2(_evancz$url_parser$UrlParser$custom, 'NUMBER', _elm_lang$core$String$toInt);
+var _evancz$url_parser$UrlParser_ops = _evancz$url_parser$UrlParser_ops || {};
+_evancz$url_parser$UrlParser_ops['>'] = F2(
+ function (_p20, _p19) {
+ var _p21 = _p20;
+ var _p22 = _p19;
+ return _evancz$url_parser$UrlParser$Parser(
+ function (state) {
+ return A2(
+ _elm_lang$core$List$concatMap,
+ _p22._0,
+ _p21._0(state));
+ });
+ });
+var _evancz$url_parser$UrlParser$map = F2(
+ function (subValue, _p23) {
+ var _p24 = _p23;
+ return _evancz$url_parser$UrlParser$Parser(
+ function (_p25) {
+ var _p26 = _p25;
+ return A2(
+ _elm_lang$core$List$map,
+ _evancz$url_parser$UrlParser$mapHelp(_p26.value),
+ _p24._0(
+ {visited: _p26.visited, unvisited: _p26.unvisited, params: _p26.params, value: subValue}));
+ });
+ });
+var _evancz$url_parser$UrlParser$oneOf = function (parsers) {
+ return _evancz$url_parser$UrlParser$Parser(
+ function (state) {
+ return A2(
+ _elm_lang$core$List$concatMap,
+ function (_p27) {
+ var _p28 = _p27;
+ return _p28._0(state);
+ },
+ parsers);
+ });
+};
+var _evancz$url_parser$UrlParser$top = _evancz$url_parser$UrlParser$Parser(
+ function (state) {
+ return {
+ ctor: '::',
+ _0: state,
+ _1: {ctor: '[]'}
+ };
+ });
+var _evancz$url_parser$UrlParser_ops = _evancz$url_parser$UrlParser_ops || {};
+_evancz$url_parser$UrlParser_ops['>'] = F2(
+ function (_p30, _p29) {
+ var _p31 = _p30;
+ var _p32 = _p29;
+ return _evancz$url_parser$UrlParser$Parser(
+ function (state) {
+ return A2(
+ _elm_lang$core$List$concatMap,
+ _p32._0,
+ _p31._0(state));
+ });
+ });
+var _evancz$url_parser$UrlParser$QueryParser = function (a) {
+ return {ctor: 'QueryParser', _0: a};
+};
+var _evancz$url_parser$UrlParser$customParam = F2(
+ function (key, func) {
+ return _evancz$url_parser$UrlParser$QueryParser(
+ function (_p33) {
+ var _p34 = _p33;
+ var _p35 = _p34.params;
+ return {
+ ctor: '::',
+ _0: A4(
+ _evancz$url_parser$UrlParser$State,
+ _p34.visited,
+ _p34.unvisited,
+ _p35,
+ _p34.value(
+ func(
+ A2(_elm_lang$core$Dict$get, key, _p35)))),
+ _1: {ctor: '[]'}
+ };
+ });
+ });
+var _evancz$url_parser$UrlParser$stringParam = function (name) {
+ return A2(_evancz$url_parser$UrlParser$customParam, name, _elm_lang$core$Basics$identity);
+};
+var _evancz$url_parser$UrlParser$intParam = function (name) {
+ return A2(_evancz$url_parser$UrlParser$customParam, name, _evancz$url_parser$UrlParser$intParamHelp);
+};
+
+var _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerSecond = 1000;
+var _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerMinute = 60 * _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerSecond;
+var _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerHour = 60 * _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerMinute;
+var _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerDay = 24 * _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerHour;
+var _justinmimbs$elm_date_extra$Date_Extra_Facts$dayOfWeekFromWeekdayNumber = function (n) {
+ var _p0 = n;
+ switch (_p0) {
+ case 1:
+ return _elm_lang$core$Date$Mon;
+ case 2:
+ return _elm_lang$core$Date$Tue;
+ case 3:
+ return _elm_lang$core$Date$Wed;
+ case 4:
+ return _elm_lang$core$Date$Thu;
+ case 5:
+ return _elm_lang$core$Date$Fri;
+ case 6:
+ return _elm_lang$core$Date$Sat;
+ default:
+ return _elm_lang$core$Date$Sun;
+ }
+};
+var _justinmimbs$elm_date_extra$Date_Extra_Facts$weekdayNumberFromDayOfWeek = function (d) {
+ var _p1 = d;
+ switch (_p1.ctor) {
+ case 'Mon':
+ return 1;
+ case 'Tue':
+ return 2;
+ case 'Wed':
+ return 3;
+ case 'Thu':
+ return 4;
+ case 'Fri':
+ return 5;
+ case 'Sat':
+ return 6;
+ default:
+ return 7;
+ }
+};
+var _justinmimbs$elm_date_extra$Date_Extra_Facts$monthFromMonthNumber = function (n) {
+ var _p2 = n;
+ switch (_p2) {
+ case 1:
+ return _elm_lang$core$Date$Jan;
+ case 2:
+ return _elm_lang$core$Date$Feb;
+ case 3:
+ return _elm_lang$core$Date$Mar;
+ case 4:
+ return _elm_lang$core$Date$Apr;
+ case 5:
+ return _elm_lang$core$Date$May;
+ case 6:
+ return _elm_lang$core$Date$Jun;
+ case 7:
+ return _elm_lang$core$Date$Jul;
+ case 8:
+ return _elm_lang$core$Date$Aug;
+ case 9:
+ return _elm_lang$core$Date$Sep;
+ case 10:
+ return _elm_lang$core$Date$Oct;
+ case 11:
+ return _elm_lang$core$Date$Nov;
+ default:
+ return _elm_lang$core$Date$Dec;
+ }
+};
+var _justinmimbs$elm_date_extra$Date_Extra_Facts$monthNumberFromMonth = function (m) {
+ var _p3 = m;
+ switch (_p3.ctor) {
+ case 'Jan':
+ return 1;
+ case 'Feb':
+ return 2;
+ case 'Mar':
+ return 3;
+ case 'Apr':
+ return 4;
+ case 'May':
+ return 5;
+ case 'Jun':
+ return 6;
+ case 'Jul':
+ return 7;
+ case 'Aug':
+ return 8;
+ case 'Sep':
+ return 9;
+ case 'Oct':
+ return 10;
+ case 'Nov':
+ return 11;
+ default:
+ return 12;
+ }
+};
+var _justinmimbs$elm_date_extra$Date_Extra_Facts$months = {
+ ctor: '::',
+ _0: _elm_lang$core$Date$Jan,
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$core$Date$Feb,
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$core$Date$Mar,
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$core$Date$Apr,
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$core$Date$May,
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$core$Date$Jun,
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$core$Date$Jul,
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$core$Date$Aug,
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$core$Date$Sep,
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$core$Date$Oct,
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$core$Date$Nov,
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$core$Date$Dec,
+ _1: {ctor: '[]'}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+};
+var _justinmimbs$elm_date_extra$Date_Extra_Facts$isLeapYear = function (y) {
+ return (_elm_lang$core$Native_Utils.eq(
+ A2(_elm_lang$core$Basics_ops['%'], y, 4),
+ 0) && (!_elm_lang$core$Native_Utils.eq(
+ A2(_elm_lang$core$Basics_ops['%'], y, 100),
+ 0))) || _elm_lang$core$Native_Utils.eq(
+ A2(_elm_lang$core$Basics_ops['%'], y, 400),
+ 0);
+};
+var _justinmimbs$elm_date_extra$Date_Extra_Facts$daysInMonth = F2(
+ function (y, m) {
+ var _p4 = m;
+ switch (_p4.ctor) {
+ case 'Jan':
+ return 31;
+ case 'Feb':
+ return _justinmimbs$elm_date_extra$Date_Extra_Facts$isLeapYear(y) ? 29 : 28;
+ case 'Mar':
+ return 31;
+ case 'Apr':
+ return 30;
+ case 'May':
+ return 31;
+ case 'Jun':
+ return 30;
+ case 'Jul':
+ return 31;
+ case 'Aug':
+ return 31;
+ case 'Sep':
+ return 30;
+ case 'Oct':
+ return 31;
+ case 'Nov':
+ return 30;
+ default:
+ return 31;
+ }
+ });
+var _justinmimbs$elm_date_extra$Date_Extra_Facts$daysBeforeStartOfMonth = F2(
+ function (y, m) {
+ var _p5 = m;
+ switch (_p5.ctor) {
+ case 'Jan':
+ return 0;
+ case 'Feb':
+ return 31;
+ case 'Mar':
+ return _justinmimbs$elm_date_extra$Date_Extra_Facts$isLeapYear(y) ? 60 : 59;
+ case 'Apr':
+ return _justinmimbs$elm_date_extra$Date_Extra_Facts$isLeapYear(y) ? 91 : 90;
+ case 'May':
+ return _justinmimbs$elm_date_extra$Date_Extra_Facts$isLeapYear(y) ? 121 : 120;
+ case 'Jun':
+ return _justinmimbs$elm_date_extra$Date_Extra_Facts$isLeapYear(y) ? 152 : 151;
+ case 'Jul':
+ return _justinmimbs$elm_date_extra$Date_Extra_Facts$isLeapYear(y) ? 182 : 181;
+ case 'Aug':
+ return _justinmimbs$elm_date_extra$Date_Extra_Facts$isLeapYear(y) ? 213 : 212;
+ case 'Sep':
+ return _justinmimbs$elm_date_extra$Date_Extra_Facts$isLeapYear(y) ? 244 : 243;
+ case 'Oct':
+ return _justinmimbs$elm_date_extra$Date_Extra_Facts$isLeapYear(y) ? 274 : 273;
+ case 'Nov':
+ return _justinmimbs$elm_date_extra$Date_Extra_Facts$isLeapYear(y) ? 305 : 304;
+ default:
+ return _justinmimbs$elm_date_extra$Date_Extra_Facts$isLeapYear(y) ? 335 : 334;
+ }
+ });
+
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$toUnixTime = function (rd) {
+ return (rd - 719163) * _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerDay;
+};
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$weekdayNumber = function (rd) {
+ var _p0 = A2(_elm_lang$core$Basics_ops['%'], rd, 7);
+ if (_p0 === 0) {
+ return 7;
+ } else {
+ return _p0;
+ }
+};
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$leapYearsInCommonEra = function (y) {
+ return (((y / 4) | 0) - ((y / 100) | 0)) + ((y / 400) | 0);
+};
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$rataDieBeforeStartOfYear = function (y) {
+ return (365 * (y - 1)) + _justinmimbs$elm_date_extra$Date_Internal_RataDie$leapYearsInCommonEra(y - 1);
+};
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$fromOrdinalDate = F2(
+ function (y, d) {
+ return _justinmimbs$elm_date_extra$Date_Internal_RataDie$rataDieBeforeStartOfYear(y) + d;
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$week1Day1OfWeekYear = function (y) {
+ var jan4RD = A2(_justinmimbs$elm_date_extra$Date_Internal_RataDie$fromOrdinalDate, y, 4);
+ return (jan4RD - _justinmimbs$elm_date_extra$Date_Internal_RataDie$weekdayNumber(jan4RD)) + 1;
+};
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$fromWeekDate = F3(
+ function (y, w, d) {
+ var week1Day0RD = _justinmimbs$elm_date_extra$Date_Internal_RataDie$week1Day1OfWeekYear(y) - 1;
+ return (week1Day0RD + ((w - 1) * 7)) + d;
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$fromCalendarDate = F3(
+ function (y, m, d) {
+ var md = A2(_justinmimbs$elm_date_extra$Date_Extra_Facts$daysBeforeStartOfMonth, y, m);
+ var yd = _justinmimbs$elm_date_extra$Date_Internal_RataDie$rataDieBeforeStartOfYear(y);
+ return (yd + md) + d;
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$divideInt = F2(
+ function (a, b) {
+ return {
+ ctor: '_Tuple2',
+ _0: (a / b) | 0,
+ _1: A2(_elm_lang$core$Basics$rem, a, b)
+ };
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$year = function (rd) {
+ var _p1 = A2(_justinmimbs$elm_date_extra$Date_Internal_RataDie$divideInt, rd, 146097);
+ var q400 = _p1._0;
+ var r400 = _p1._1;
+ var _p2 = A2(_justinmimbs$elm_date_extra$Date_Internal_RataDie$divideInt, r400, 36524);
+ var q100 = _p2._0;
+ var r100 = _p2._1;
+ var _p3 = A2(_justinmimbs$elm_date_extra$Date_Internal_RataDie$divideInt, r100, 1461);
+ var q4 = _p3._0;
+ var r4 = _p3._1;
+ var _p4 = A2(_justinmimbs$elm_date_extra$Date_Internal_RataDie$divideInt, r4, 365);
+ var q1 = _p4._0;
+ var r1 = _p4._1;
+ var n = _elm_lang$core$Native_Utils.eq(r1, 0) ? 0 : 1;
+ return ((((q400 * 400) + (q100 * 100)) + (q4 * 4)) + q1) + n;
+};
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$ordinalDay = function (rd) {
+ return rd - _justinmimbs$elm_date_extra$Date_Internal_RataDie$rataDieBeforeStartOfYear(
+ _justinmimbs$elm_date_extra$Date_Internal_RataDie$year(rd));
+};
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$weekYear = function (rd) {
+ var daysToThursday = 4 - _justinmimbs$elm_date_extra$Date_Internal_RataDie$weekdayNumber(rd);
+ return _justinmimbs$elm_date_extra$Date_Internal_RataDie$year(rd + daysToThursday);
+};
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$weekNumber = function (rd) {
+ var week1Day1RD = _justinmimbs$elm_date_extra$Date_Internal_RataDie$week1Day1OfWeekYear(
+ _justinmimbs$elm_date_extra$Date_Internal_RataDie$weekYear(rd));
+ return (((rd - week1Day1RD) / 7) | 0) + 1;
+};
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$find = F2(
+ function (pred, list) {
+ find:
+ while (true) {
+ var _p5 = list;
+ if (_p5.ctor === '[]') {
+ return _elm_lang$core$Maybe$Nothing;
+ } else {
+ var _p6 = _p5._0;
+ if (pred(_p6)) {
+ return _elm_lang$core$Maybe$Just(_p6);
+ } else {
+ var _v2 = pred,
+ _v3 = _p5._1;
+ pred = _v2;
+ list = _v3;
+ continue find;
+ }
+ }
+ }
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$month = function (rd) {
+ var od = _justinmimbs$elm_date_extra$Date_Internal_RataDie$ordinalDay(rd);
+ var y = _justinmimbs$elm_date_extra$Date_Internal_RataDie$year(rd);
+ return A2(
+ _elm_lang$core$Maybe$withDefault,
+ _elm_lang$core$Date$Jan,
+ A2(
+ _justinmimbs$elm_date_extra$Date_Internal_RataDie$find,
+ function (m) {
+ return _elm_lang$core$Native_Utils.cmp(
+ A2(_justinmimbs$elm_date_extra$Date_Extra_Facts$daysBeforeStartOfMonth, y, m),
+ od) < 0;
+ },
+ _elm_lang$core$List$reverse(_justinmimbs$elm_date_extra$Date_Extra_Facts$months)));
+};
+var _justinmimbs$elm_date_extra$Date_Internal_RataDie$day = function (rd) {
+ var od = _justinmimbs$elm_date_extra$Date_Internal_RataDie$ordinalDay(rd);
+ var m = _justinmimbs$elm_date_extra$Date_Internal_RataDie$month(rd);
+ var y = _justinmimbs$elm_date_extra$Date_Internal_RataDie$year(rd);
+ return od - A2(_justinmimbs$elm_date_extra$Date_Extra_Facts$daysBeforeStartOfMonth, y, m);
+};
+
+var _justinmimbs$elm_date_extra$Date_Internal_Core$weekNumberFromCalendarDate = F3(
+ function (y, m, d) {
+ return _justinmimbs$elm_date_extra$Date_Internal_RataDie$weekNumber(
+ A3(_justinmimbs$elm_date_extra$Date_Internal_RataDie$fromCalendarDate, y, m, d));
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_Core$weekYearFromCalendarDate = F3(
+ function (y, m, d) {
+ return _justinmimbs$elm_date_extra$Date_Internal_RataDie$weekYear(
+ A3(_justinmimbs$elm_date_extra$Date_Internal_RataDie$fromCalendarDate, y, m, d));
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_Core$unixTimeFromOrdinalDate = F2(
+ function (y, d) {
+ return _justinmimbs$elm_date_extra$Date_Internal_RataDie$toUnixTime(
+ A2(_justinmimbs$elm_date_extra$Date_Internal_RataDie$fromOrdinalDate, y, d));
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_Core$unixTimeFromWeekDate = F3(
+ function (y, w, d) {
+ return _justinmimbs$elm_date_extra$Date_Internal_RataDie$toUnixTime(
+ A3(_justinmimbs$elm_date_extra$Date_Internal_RataDie$fromWeekDate, y, w, d));
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_Core$unixTimeFromCalendarDate = F3(
+ function (y, m, d) {
+ return _justinmimbs$elm_date_extra$Date_Internal_RataDie$toUnixTime(
+ A3(_justinmimbs$elm_date_extra$Date_Internal_RataDie$fromCalendarDate, y, m, d));
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_Core$msFromTimeParts = F4(
+ function (hh, mm, ss, ms) {
+ return ((ms + (_justinmimbs$elm_date_extra$Date_Extra_Facts$msPerSecond * ss)) + (_justinmimbs$elm_date_extra$Date_Extra_Facts$msPerMinute * mm)) + (_justinmimbs$elm_date_extra$Date_Extra_Facts$msPerHour * hh);
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_Core$unixTimeFromParts = F7(
+ function (y, m, d, hh, mm, ss, ms) {
+ return _justinmimbs$elm_date_extra$Date_Internal_RataDie$toUnixTime(
+ A3(_justinmimbs$elm_date_extra$Date_Internal_RataDie$fromCalendarDate, y, m, d)) + A4(_justinmimbs$elm_date_extra$Date_Internal_Core$msFromTimeParts, hh, mm, ss, ms);
+ });
+
+var _justinmimbs$elm_date_extra$Date_Internal_Extract$msOffsetFromUtc = function (date) {
+ var utcTime = _elm_lang$core$Date$toTime(date);
+ var localTime = _elm_lang$core$Basics$toFloat(
+ A7(
+ _justinmimbs$elm_date_extra$Date_Internal_Core$unixTimeFromParts,
+ _elm_lang$core$Date$year(date),
+ _elm_lang$core$Date$month(date),
+ _elm_lang$core$Date$day(date),
+ _elm_lang$core$Date$hour(date),
+ _elm_lang$core$Date$minute(date),
+ _elm_lang$core$Date$second(date),
+ _elm_lang$core$Date$millisecond(date)));
+ return _elm_lang$core$Basics$floor(localTime - utcTime);
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Extract$offsetFromUtc = function (date) {
+ return (_justinmimbs$elm_date_extra$Date_Internal_Extract$msOffsetFromUtc(date) / _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerMinute) | 0;
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Extract$weekYear = function (date) {
+ return A3(
+ _justinmimbs$elm_date_extra$Date_Internal_Core$weekYearFromCalendarDate,
+ _elm_lang$core$Date$year(date),
+ _elm_lang$core$Date$month(date),
+ _elm_lang$core$Date$day(date));
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Extract$weekNumber = function (date) {
+ return A3(
+ _justinmimbs$elm_date_extra$Date_Internal_Core$weekNumberFromCalendarDate,
+ _elm_lang$core$Date$year(date),
+ _elm_lang$core$Date$month(date),
+ _elm_lang$core$Date$day(date));
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Extract$weekdayNumber = function (_p0) {
+ return _justinmimbs$elm_date_extra$Date_Extra_Facts$weekdayNumberFromDayOfWeek(
+ _elm_lang$core$Date$dayOfWeek(_p0));
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Extract$fractionalDay = function (date) {
+ var timeOfDayMS = A4(
+ _justinmimbs$elm_date_extra$Date_Internal_Core$msFromTimeParts,
+ _elm_lang$core$Date$hour(date),
+ _elm_lang$core$Date$minute(date),
+ _elm_lang$core$Date$second(date),
+ _elm_lang$core$Date$millisecond(date));
+ return _elm_lang$core$Basics$toFloat(timeOfDayMS) / _elm_lang$core$Basics$toFloat(_justinmimbs$elm_date_extra$Date_Extra_Facts$msPerDay);
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Extract$ordinalDay = function (date) {
+ return A2(
+ _justinmimbs$elm_date_extra$Date_Extra_Facts$daysBeforeStartOfMonth,
+ _elm_lang$core$Date$year(date),
+ _elm_lang$core$Date$month(date)) + _elm_lang$core$Date$day(date);
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Extract$monthNumber = function (_p1) {
+ return _justinmimbs$elm_date_extra$Date_Extra_Facts$monthNumberFromMonth(
+ _elm_lang$core$Date$month(_p1));
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Extract$quarter = function (date) {
+ return _elm_lang$core$Basics$ceiling(
+ function (n) {
+ return n / 3;
+ }(
+ _elm_lang$core$Basics$toFloat(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$monthNumber(date))));
+};
+
+var _justinmimbs$elm_date_extra$Date_Internal_Format$toUtc = function (date) {
+ return _elm_lang$core$Date$fromTime(
+ _elm_lang$core$Date$toTime(date) - _elm_lang$core$Basics$toFloat(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$offsetFromUtc(date) * _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerMinute));
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Format$nameForm = function (length) {
+ var _p0 = length;
+ switch (_p0) {
+ case 1:
+ return 'abbreviated';
+ case 2:
+ return 'abbreviated';
+ case 3:
+ return 'abbreviated';
+ case 4:
+ return 'full';
+ case 5:
+ return 'narrow';
+ case 6:
+ return 'short';
+ default:
+ return 'invalid';
+ }
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Format$patternMatches = _elm_lang$core$Regex$regex('([yYQMwdDEeabhHmsSXx])\\1*|\'(?:[^\']|\'\')*?\'(?!\')');
+var _justinmimbs$elm_date_extra$Date_Internal_Format$formatTimeOffset = F3(
+ function (separator, minutesOptional, offset) {
+ var mm = A3(
+ _elm_lang$core$String$padLeft,
+ 2,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ A2(
+ _elm_lang$core$Basics_ops['%'],
+ _elm_lang$core$Basics$abs(offset),
+ 60)));
+ var hh = A3(
+ _elm_lang$core$String$padLeft,
+ 2,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ (_elm_lang$core$Basics$abs(offset) / 60) | 0));
+ var sign = (_elm_lang$core$Native_Utils.cmp(offset, 0) > -1) ? '+' : '-';
+ return (minutesOptional && _elm_lang$core$Native_Utils.eq(mm, '00')) ? A2(_elm_lang$core$Basics_ops['++'], sign, hh) : A2(
+ _elm_lang$core$Basics_ops['++'],
+ sign,
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ hh,
+ A2(_elm_lang$core$Basics_ops['++'], separator, mm)));
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_Format$ordinalSuffix = function (n) {
+ var nn = A2(_elm_lang$core$Basics_ops['%'], n, 100);
+ var _p1 = A2(
+ _elm_lang$core$Basics$min,
+ (_elm_lang$core$Native_Utils.cmp(nn, 20) < 0) ? nn : A2(_elm_lang$core$Basics_ops['%'], nn, 10),
+ 4);
+ switch (_p1) {
+ case 0:
+ return 'th';
+ case 1:
+ return 'st';
+ case 2:
+ return 'nd';
+ case 3:
+ return 'rd';
+ case 4:
+ return 'th';
+ default:
+ return '';
+ }
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Format$withOrdinalSuffix = function (n) {
+ return A2(
+ _elm_lang$core$Basics_ops['++'],
+ _elm_lang$core$Basics$toString(n),
+ _justinmimbs$elm_date_extra$Date_Internal_Format$ordinalSuffix(n));
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Format$hour12 = function (date) {
+ var _p2 = A2(
+ _elm_lang$core$Basics_ops['%'],
+ _elm_lang$core$Date$hour(date),
+ 12);
+ if (_p2 === 0) {
+ return 12;
+ } else {
+ return _p2;
+ }
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Format$dayOfWeekName = function (d) {
+ var _p3 = d;
+ switch (_p3.ctor) {
+ case 'Mon':
+ return 'Monday';
+ case 'Tue':
+ return 'Tuesday';
+ case 'Wed':
+ return 'Wednesday';
+ case 'Thu':
+ return 'Thursday';
+ case 'Fri':
+ return 'Friday';
+ case 'Sat':
+ return 'Saturday';
+ default:
+ return 'Sunday';
+ }
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Format$monthName = function (m) {
+ var _p4 = m;
+ switch (_p4.ctor) {
+ case 'Jan':
+ return 'January';
+ case 'Feb':
+ return 'February';
+ case 'Mar':
+ return 'March';
+ case 'Apr':
+ return 'April';
+ case 'May':
+ return 'May';
+ case 'Jun':
+ return 'June';
+ case 'Jul':
+ return 'July';
+ case 'Aug':
+ return 'August';
+ case 'Sep':
+ return 'September';
+ case 'Oct':
+ return 'October';
+ case 'Nov':
+ return 'November';
+ default:
+ return 'December';
+ }
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Format$PM = {ctor: 'PM'};
+var _justinmimbs$elm_date_extra$Date_Internal_Format$Noon = {ctor: 'Noon'};
+var _justinmimbs$elm_date_extra$Date_Internal_Format$AM = {ctor: 'AM'};
+var _justinmimbs$elm_date_extra$Date_Internal_Format$Midnight = {ctor: 'Midnight'};
+var _justinmimbs$elm_date_extra$Date_Internal_Format$dayPeriod = function (date) {
+ var onTheHour = _elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Date$minute(date),
+ 0) && (_elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Date$second(date),
+ 0) && _elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Date$millisecond(date),
+ 0));
+ var hh = _elm_lang$core$Date$hour(date);
+ return (_elm_lang$core$Native_Utils.eq(hh, 0) && onTheHour) ? _justinmimbs$elm_date_extra$Date_Internal_Format$Midnight : ((_elm_lang$core$Native_Utils.cmp(hh, 12) < 0) ? _justinmimbs$elm_date_extra$Date_Internal_Format$AM : ((_elm_lang$core$Native_Utils.eq(hh, 12) && onTheHour) ? _justinmimbs$elm_date_extra$Date_Internal_Format$Noon : _justinmimbs$elm_date_extra$Date_Internal_Format$PM));
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Format$format = F3(
+ function (asUtc, date, match) {
+ format:
+ while (true) {
+ var length = _elm_lang$core$String$length(match);
+ var $char = A2(_elm_lang$core$String$left, 1, match);
+ var _p5 = $char;
+ switch (_p5) {
+ case 'y':
+ var _p6 = length;
+ if (_p6 === 2) {
+ return A2(
+ _elm_lang$core$String$right,
+ 2,
+ A3(
+ _elm_lang$core$String$padLeft,
+ length,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ _elm_lang$core$Date$year(date))));
+ } else {
+ return A3(
+ _elm_lang$core$String$padLeft,
+ length,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ _elm_lang$core$Date$year(date)));
+ }
+ case 'Y':
+ var _p7 = length;
+ if (_p7 === 2) {
+ return A2(
+ _elm_lang$core$String$right,
+ 2,
+ A3(
+ _elm_lang$core$String$padLeft,
+ length,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$weekYear(date))));
+ } else {
+ return A3(
+ _elm_lang$core$String$padLeft,
+ length,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$weekYear(date)));
+ }
+ case 'Q':
+ var _p8 = length;
+ switch (_p8) {
+ case 1:
+ return _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$quarter(date));
+ case 2:
+ return _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$quarter(date));
+ case 3:
+ return A2(
+ F2(
+ function (x, y) {
+ return A2(_elm_lang$core$Basics_ops['++'], x, y);
+ }),
+ 'Q',
+ _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$quarter(date)));
+ case 4:
+ return _justinmimbs$elm_date_extra$Date_Internal_Format$withOrdinalSuffix(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$quarter(date));
+ case 5:
+ return _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$quarter(date));
+ default:
+ return '';
+ }
+ case 'M':
+ var _p9 = length;
+ switch (_p9) {
+ case 1:
+ return _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$monthNumber(date));
+ case 2:
+ return A3(
+ _elm_lang$core$String$padLeft,
+ 2,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$monthNumber(date)));
+ case 3:
+ return A2(
+ _elm_lang$core$String$left,
+ 3,
+ _justinmimbs$elm_date_extra$Date_Internal_Format$monthName(
+ _elm_lang$core$Date$month(date)));
+ case 4:
+ return _justinmimbs$elm_date_extra$Date_Internal_Format$monthName(
+ _elm_lang$core$Date$month(date));
+ case 5:
+ return A2(
+ _elm_lang$core$String$left,
+ 1,
+ _justinmimbs$elm_date_extra$Date_Internal_Format$monthName(
+ _elm_lang$core$Date$month(date)));
+ default:
+ return '';
+ }
+ case 'w':
+ var _p10 = length;
+ switch (_p10) {
+ case 1:
+ return _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$weekNumber(date));
+ case 2:
+ return A3(
+ _elm_lang$core$String$padLeft,
+ 2,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$weekNumber(date)));
+ default:
+ return '';
+ }
+ case 'd':
+ var _p11 = length;
+ switch (_p11) {
+ case 1:
+ return _elm_lang$core$Basics$toString(
+ _elm_lang$core$Date$day(date));
+ case 2:
+ return A3(
+ _elm_lang$core$String$padLeft,
+ 2,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ _elm_lang$core$Date$day(date)));
+ case 3:
+ return _justinmimbs$elm_date_extra$Date_Internal_Format$withOrdinalSuffix(
+ _elm_lang$core$Date$day(date));
+ default:
+ return '';
+ }
+ case 'D':
+ var _p12 = length;
+ switch (_p12) {
+ case 1:
+ return _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$ordinalDay(date));
+ case 2:
+ return A3(
+ _elm_lang$core$String$padLeft,
+ 2,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$ordinalDay(date)));
+ case 3:
+ return A3(
+ _elm_lang$core$String$padLeft,
+ 3,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$ordinalDay(date)));
+ default:
+ return '';
+ }
+ case 'E':
+ var _p13 = _justinmimbs$elm_date_extra$Date_Internal_Format$nameForm(length);
+ switch (_p13) {
+ case 'abbreviated':
+ return A2(
+ _elm_lang$core$String$left,
+ 3,
+ _justinmimbs$elm_date_extra$Date_Internal_Format$dayOfWeekName(
+ _elm_lang$core$Date$dayOfWeek(date)));
+ case 'full':
+ return _justinmimbs$elm_date_extra$Date_Internal_Format$dayOfWeekName(
+ _elm_lang$core$Date$dayOfWeek(date));
+ case 'narrow':
+ return A2(
+ _elm_lang$core$String$left,
+ 1,
+ _justinmimbs$elm_date_extra$Date_Internal_Format$dayOfWeekName(
+ _elm_lang$core$Date$dayOfWeek(date)));
+ case 'short':
+ return A2(
+ _elm_lang$core$String$left,
+ 2,
+ _justinmimbs$elm_date_extra$Date_Internal_Format$dayOfWeekName(
+ _elm_lang$core$Date$dayOfWeek(date)));
+ default:
+ return '';
+ }
+ case 'e':
+ var _p14 = length;
+ switch (_p14) {
+ case 1:
+ return _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$weekdayNumber(date));
+ case 2:
+ return _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$weekdayNumber(date));
+ default:
+ var _v15 = asUtc,
+ _v16 = date,
+ _v17 = _elm_lang$core$String$toUpper(match);
+ asUtc = _v15;
+ date = _v16;
+ match = _v17;
+ continue format;
+ }
+ case 'a':
+ var p = _justinmimbs$elm_date_extra$Date_Internal_Format$dayPeriod(date);
+ var m = (_elm_lang$core$Native_Utils.eq(p, _justinmimbs$elm_date_extra$Date_Internal_Format$Midnight) || _elm_lang$core$Native_Utils.eq(p, _justinmimbs$elm_date_extra$Date_Internal_Format$AM)) ? 'A' : 'P';
+ var _p15 = _justinmimbs$elm_date_extra$Date_Internal_Format$nameForm(length);
+ switch (_p15) {
+ case 'abbreviated':
+ return A2(_elm_lang$core$Basics_ops['++'], m, 'M');
+ case 'full':
+ return A2(_elm_lang$core$Basics_ops['++'], m, '.M.');
+ case 'narrow':
+ return m;
+ default:
+ return '';
+ }
+ case 'b':
+ var _p16 = _justinmimbs$elm_date_extra$Date_Internal_Format$nameForm(length);
+ switch (_p16) {
+ case 'abbreviated':
+ var _p17 = _justinmimbs$elm_date_extra$Date_Internal_Format$dayPeriod(date);
+ switch (_p17.ctor) {
+ case 'Midnight':
+ return 'mid.';
+ case 'AM':
+ return 'am';
+ case 'Noon':
+ return 'noon';
+ default:
+ return 'pm';
+ }
+ case 'full':
+ var _p18 = _justinmimbs$elm_date_extra$Date_Internal_Format$dayPeriod(date);
+ switch (_p18.ctor) {
+ case 'Midnight':
+ return 'midnight';
+ case 'AM':
+ return 'a.m.';
+ case 'Noon':
+ return 'noon';
+ default:
+ return 'p.m.';
+ }
+ case 'narrow':
+ var _p19 = _justinmimbs$elm_date_extra$Date_Internal_Format$dayPeriod(date);
+ switch (_p19.ctor) {
+ case 'Midnight':
+ return 'md';
+ case 'AM':
+ return 'a';
+ case 'Noon':
+ return 'nn';
+ default:
+ return 'p';
+ }
+ default:
+ return '';
+ }
+ case 'h':
+ var _p20 = length;
+ switch (_p20) {
+ case 1:
+ return _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Format$hour12(date));
+ case 2:
+ return A3(
+ _elm_lang$core$String$padLeft,
+ 2,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ _justinmimbs$elm_date_extra$Date_Internal_Format$hour12(date)));
+ default:
+ return '';
+ }
+ case 'H':
+ var _p21 = length;
+ switch (_p21) {
+ case 1:
+ return _elm_lang$core$Basics$toString(
+ _elm_lang$core$Date$hour(date));
+ case 2:
+ return A3(
+ _elm_lang$core$String$padLeft,
+ 2,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ _elm_lang$core$Date$hour(date)));
+ default:
+ return '';
+ }
+ case 'm':
+ var _p22 = length;
+ switch (_p22) {
+ case 1:
+ return _elm_lang$core$Basics$toString(
+ _elm_lang$core$Date$minute(date));
+ case 2:
+ return A3(
+ _elm_lang$core$String$padLeft,
+ 2,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ _elm_lang$core$Date$minute(date)));
+ default:
+ return '';
+ }
+ case 's':
+ var _p23 = length;
+ switch (_p23) {
+ case 1:
+ return _elm_lang$core$Basics$toString(
+ _elm_lang$core$Date$second(date));
+ case 2:
+ return A3(
+ _elm_lang$core$String$padLeft,
+ 2,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ _elm_lang$core$Date$second(date)));
+ default:
+ return '';
+ }
+ case 'S':
+ return A3(
+ _elm_lang$core$String$padRight,
+ length,
+ _elm_lang$core$Native_Utils.chr('0'),
+ A2(
+ _elm_lang$core$String$left,
+ length,
+ A3(
+ _elm_lang$core$String$padLeft,
+ 3,
+ _elm_lang$core$Native_Utils.chr('0'),
+ _elm_lang$core$Basics$toString(
+ _elm_lang$core$Date$millisecond(date)))));
+ case 'X':
+ if ((_elm_lang$core$Native_Utils.cmp(length, 4) < 0) && (asUtc || _elm_lang$core$Native_Utils.eq(
+ _justinmimbs$elm_date_extra$Date_Internal_Extract$offsetFromUtc(date),
+ 0))) {
+ return 'Z';
+ } else {
+ var _v27 = asUtc,
+ _v28 = date,
+ _v29 = _elm_lang$core$String$toLower(match);
+ asUtc = _v27;
+ date = _v28;
+ match = _v29;
+ continue format;
+ }
+ case 'x':
+ var offset = asUtc ? 0 : _justinmimbs$elm_date_extra$Date_Internal_Extract$offsetFromUtc(date);
+ var _p24 = length;
+ switch (_p24) {
+ case 1:
+ return A3(_justinmimbs$elm_date_extra$Date_Internal_Format$formatTimeOffset, '', true, offset);
+ case 2:
+ return A3(_justinmimbs$elm_date_extra$Date_Internal_Format$formatTimeOffset, '', false, offset);
+ case 3:
+ return A3(_justinmimbs$elm_date_extra$Date_Internal_Format$formatTimeOffset, ':', false, offset);
+ default:
+ return '';
+ }
+ case '\'':
+ return _elm_lang$core$Native_Utils.eq(match, '\'\'') ? '\'' : A4(
+ _elm_lang$core$Regex$replace,
+ _elm_lang$core$Regex$All,
+ _elm_lang$core$Regex$regex('\'\''),
+ function (_p25) {
+ return '\'';
+ },
+ A3(_elm_lang$core$String$slice, 1, -1, match));
+ default:
+ return '';
+ }
+ }
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_Format$toFormattedString = F3(
+ function (asUtc, pattern, date) {
+ var date_ = asUtc ? _justinmimbs$elm_date_extra$Date_Internal_Format$toUtc(date) : date;
+ return A4(
+ _elm_lang$core$Regex$replace,
+ _elm_lang$core$Regex$All,
+ _justinmimbs$elm_date_extra$Date_Internal_Format$patternMatches,
+ function (_p26) {
+ return A3(
+ _justinmimbs$elm_date_extra$Date_Internal_Format$format,
+ asUtc,
+ date_,
+ function (_) {
+ return _.match;
+ }(_p26));
+ },
+ pattern);
+ });
+
+var _justinmimbs$elm_date_extra$Date_Internal_Parse$isoDateRegex = function () {
+ var time = 'T(\\d{2})(?:(\\:)?(\\d{2})(?:\\10(\\d{2}))?)?(\\.\\d+)?(?:(Z)|(?:([+\\-])(\\d{2})(?:\\:?(\\d{2}))?))?';
+ var ord = '\\-?(\\d{3})';
+ var week = '(\\-)?W(\\d{2})(?:\\5(\\d))?';
+ var cal = '(\\-)?(\\d{2})(?:\\2(\\d{2}))?';
+ var year = '(\\d{4})';
+ return _elm_lang$core$Regex$regex(
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ '^',
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ year,
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ '(?:',
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ cal,
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ '|',
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ week,
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ '|',
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ ord,
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ ')?',
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ '(?:',
+ A2(_elm_lang$core$Basics_ops['++'], time, ')?$'))))))))))));
+}();
+var _justinmimbs$elm_date_extra$Date_Internal_Parse$stringToFloat = function (_p0) {
+ return _elm_lang$core$Result$toMaybe(
+ _elm_lang$core$String$toFloat(_p0));
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Parse$msFromMatches = F4(
+ function (timeHH, timeMM, timeSS, timeF) {
+ var fractional = A2(
+ _elm_lang$core$Maybe$withDefault,
+ 0.0,
+ A2(_elm_lang$core$Maybe$andThen, _justinmimbs$elm_date_extra$Date_Internal_Parse$stringToFloat, timeF));
+ var _p1 = function () {
+ var _p2 = A2(
+ _elm_lang$core$List$map,
+ _elm_lang$core$Maybe$andThen(_justinmimbs$elm_date_extra$Date_Internal_Parse$stringToFloat),
+ {
+ ctor: '::',
+ _0: timeHH,
+ _1: {
+ ctor: '::',
+ _0: timeMM,
+ _1: {
+ ctor: '::',
+ _0: timeSS,
+ _1: {ctor: '[]'}
+ }
+ }
+ });
+ _v0_3:
+ do {
+ if (((_p2.ctor === '::') && (_p2._0.ctor === 'Just')) && (_p2._1.ctor === '::')) {
+ if (_p2._1._0.ctor === 'Just') {
+ if (_p2._1._1.ctor === '::') {
+ if (_p2._1._1._0.ctor === 'Just') {
+ if (_p2._1._1._1.ctor === '[]') {
+ return {ctor: '_Tuple3', _0: _p2._0._0, _1: _p2._1._0._0, _2: _p2._1._1._0._0 + fractional};
+ } else {
+ break _v0_3;
+ }
+ } else {
+ if (_p2._1._1._1.ctor === '[]') {
+ return {ctor: '_Tuple3', _0: _p2._0._0, _1: _p2._1._0._0 + fractional, _2: 0.0};
+ } else {
+ break _v0_3;
+ }
+ }
+ } else {
+ break _v0_3;
+ }
+ } else {
+ if (((_p2._1._1.ctor === '::') && (_p2._1._1._0.ctor === 'Nothing')) && (_p2._1._1._1.ctor === '[]')) {
+ return {ctor: '_Tuple3', _0: _p2._0._0 + fractional, _1: 0.0, _2: 0.0};
+ } else {
+ break _v0_3;
+ }
+ }
+ } else {
+ break _v0_3;
+ }
+ } while(false);
+ return {ctor: '_Tuple3', _0: 0.0, _1: 0.0, _2: 0.0};
+ }();
+ var hh = _p1._0;
+ var mm = _p1._1;
+ var ss = _p1._2;
+ return _elm_lang$core$Basics$round(
+ ((hh * _elm_lang$core$Basics$toFloat(_justinmimbs$elm_date_extra$Date_Extra_Facts$msPerHour)) + (mm * _elm_lang$core$Basics$toFloat(_justinmimbs$elm_date_extra$Date_Extra_Facts$msPerMinute))) + (ss * _elm_lang$core$Basics$toFloat(_justinmimbs$elm_date_extra$Date_Extra_Facts$msPerSecond)));
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_Parse$stringToInt = function (_p3) {
+ return _elm_lang$core$Result$toMaybe(
+ _elm_lang$core$String$toInt(_p3));
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Parse$unixTimeFromMatches = F6(
+ function (yyyy, calMM, calDD, weekWW, weekD, ordDDD) {
+ var y = A2(
+ _elm_lang$core$Maybe$withDefault,
+ 1,
+ _justinmimbs$elm_date_extra$Date_Internal_Parse$stringToInt(yyyy));
+ var _p4 = {ctor: '_Tuple2', _0: calMM, _1: weekWW};
+ _v1_2:
+ do {
+ if (_p4.ctor === '_Tuple2') {
+ if (_p4._0.ctor === 'Just') {
+ if (_p4._1.ctor === 'Nothing') {
+ return A3(
+ _justinmimbs$elm_date_extra$Date_Internal_Core$unixTimeFromCalendarDate,
+ y,
+ _justinmimbs$elm_date_extra$Date_Extra_Facts$monthFromMonthNumber(
+ A2(
+ _elm_lang$core$Maybe$withDefault,
+ 1,
+ A2(_elm_lang$core$Maybe$andThen, _justinmimbs$elm_date_extra$Date_Internal_Parse$stringToInt, calMM))),
+ A2(
+ _elm_lang$core$Maybe$withDefault,
+ 1,
+ A2(_elm_lang$core$Maybe$andThen, _justinmimbs$elm_date_extra$Date_Internal_Parse$stringToInt, calDD)));
+ } else {
+ break _v1_2;
+ }
+ } else {
+ if (_p4._1.ctor === 'Just') {
+ return A3(
+ _justinmimbs$elm_date_extra$Date_Internal_Core$unixTimeFromWeekDate,
+ y,
+ A2(
+ _elm_lang$core$Maybe$withDefault,
+ 1,
+ A2(_elm_lang$core$Maybe$andThen, _justinmimbs$elm_date_extra$Date_Internal_Parse$stringToInt, weekWW)),
+ A2(
+ _elm_lang$core$Maybe$withDefault,
+ 1,
+ A2(_elm_lang$core$Maybe$andThen, _justinmimbs$elm_date_extra$Date_Internal_Parse$stringToInt, weekD)));
+ } else {
+ break _v1_2;
+ }
+ }
+ } else {
+ break _v1_2;
+ }
+ } while(false);
+ return A2(
+ _justinmimbs$elm_date_extra$Date_Internal_Core$unixTimeFromOrdinalDate,
+ y,
+ A2(
+ _elm_lang$core$Maybe$withDefault,
+ 1,
+ A2(_elm_lang$core$Maybe$andThen, _justinmimbs$elm_date_extra$Date_Internal_Parse$stringToInt, ordDDD)));
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_Parse$offsetFromMatches = F4(
+ function (tzZ, tzSign, tzHH, tzMM) {
+ var _p5 = {ctor: '_Tuple2', _0: tzZ, _1: tzSign};
+ _v2_2:
+ do {
+ if (_p5.ctor === '_Tuple2') {
+ if (_p5._0.ctor === 'Just') {
+ if ((_p5._0._0 === 'Z') && (_p5._1.ctor === 'Nothing')) {
+ return _elm_lang$core$Maybe$Just(0);
+ } else {
+ break _v2_2;
+ }
+ } else {
+ if (_p5._1.ctor === 'Just') {
+ var mm = A2(
+ _elm_lang$core$Maybe$withDefault,
+ 0,
+ A2(_elm_lang$core$Maybe$andThen, _justinmimbs$elm_date_extra$Date_Internal_Parse$stringToInt, tzMM));
+ var hh = A2(
+ _elm_lang$core$Maybe$withDefault,
+ 0,
+ A2(_elm_lang$core$Maybe$andThen, _justinmimbs$elm_date_extra$Date_Internal_Parse$stringToInt, tzHH));
+ return _elm_lang$core$Maybe$Just(
+ (_elm_lang$core$Native_Utils.eq(_p5._1._0, '+') ? 1 : -1) * ((hh * 60) + mm));
+ } else {
+ break _v2_2;
+ }
+ }
+ } else {
+ break _v2_2;
+ }
+ } while(false);
+ return _elm_lang$core$Maybe$Nothing;
+ });
+var _justinmimbs$elm_date_extra$Date_Internal_Parse$offsetTimeFromMatches = function (matches) {
+ var _p6 = matches;
+ if (((((((((((((((((((_p6.ctor === '::') && (_p6._0.ctor === 'Just')) && (_p6._1.ctor === '::')) && (_p6._1._1.ctor === '::')) && (_p6._1._1._1.ctor === '::')) && (_p6._1._1._1._1.ctor === '::')) && (_p6._1._1._1._1._1.ctor === '::')) && (_p6._1._1._1._1._1._1.ctor === '::')) && (_p6._1._1._1._1._1._1._1.ctor === '::')) && (_p6._1._1._1._1._1._1._1._1.ctor === '::')) && (_p6._1._1._1._1._1._1._1._1._1.ctor === '::')) && (_p6._1._1._1._1._1._1._1._1._1._1.ctor === '::')) && (_p6._1._1._1._1._1._1._1._1._1._1._1.ctor === '::')) && (_p6._1._1._1._1._1._1._1._1._1._1._1._1.ctor === '::')) && (_p6._1._1._1._1._1._1._1._1._1._1._1._1._1.ctor === '::')) && (_p6._1._1._1._1._1._1._1._1._1._1._1._1._1._1.ctor === '::')) && (_p6._1._1._1._1._1._1._1._1._1._1._1._1._1._1._1.ctor === '::')) && (_p6._1._1._1._1._1._1._1._1._1._1._1._1._1._1._1._1.ctor === '::')) && (_p6._1._1._1._1._1._1._1._1._1._1._1._1._1._1._1._1._1.ctor === '[]')) {
+ var offset = A4(_justinmimbs$elm_date_extra$Date_Internal_Parse$offsetFromMatches, _p6._1._1._1._1._1._1._1._1._1._1._1._1._1._0, _p6._1._1._1._1._1._1._1._1._1._1._1._1._1._1._0, _p6._1._1._1._1._1._1._1._1._1._1._1._1._1._1._1._0, _p6._1._1._1._1._1._1._1._1._1._1._1._1._1._1._1._1._0);
+ var timeMS = A4(_justinmimbs$elm_date_extra$Date_Internal_Parse$msFromMatches, _p6._1._1._1._1._1._1._1._1._0, _p6._1._1._1._1._1._1._1._1._1._1._0, _p6._1._1._1._1._1._1._1._1._1._1._1._0, _p6._1._1._1._1._1._1._1._1._1._1._1._1._0);
+ var dateMS = A6(_justinmimbs$elm_date_extra$Date_Internal_Parse$unixTimeFromMatches, _p6._0._0, _p6._1._1._0, _p6._1._1._1._0, _p6._1._1._1._1._1._0, _p6._1._1._1._1._1._1._0, _p6._1._1._1._1._1._1._1._0);
+ return _elm_lang$core$Maybe$Just(
+ {ctor: '_Tuple2', _0: offset, _1: dateMS + timeMS});
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+};
+var _justinmimbs$elm_date_extra$Date_Internal_Parse$offsetTimeFromIsoString = function (s) {
+ return A2(
+ _elm_lang$core$Maybe$andThen,
+ _justinmimbs$elm_date_extra$Date_Internal_Parse$offsetTimeFromMatches,
+ A2(
+ _elm_lang$core$Maybe$map,
+ function (_) {
+ return _.submatches;
+ },
+ _elm_lang$core$List$head(
+ A3(
+ _elm_lang$core$Regex$find,
+ _elm_lang$core$Regex$AtMost(1),
+ _justinmimbs$elm_date_extra$Date_Internal_Parse$isoDateRegex,
+ s))));
+};
+
+var _justinmimbs$elm_date_extra$Date_Extra$toParts = function (date) {
+ return {
+ ctor: '_Tuple7',
+ _0: _elm_lang$core$Date$year(date),
+ _1: _elm_lang$core$Date$month(date),
+ _2: _elm_lang$core$Date$day(date),
+ _3: _elm_lang$core$Date$hour(date),
+ _4: _elm_lang$core$Date$minute(date),
+ _5: _elm_lang$core$Date$second(date),
+ _6: _elm_lang$core$Date$millisecond(date)
+ };
+};
+var _justinmimbs$elm_date_extra$Date_Extra$monthFromQuarter = function (q) {
+ var _p0 = q;
+ switch (_p0) {
+ case 1:
+ return _elm_lang$core$Date$Jan;
+ case 2:
+ return _elm_lang$core$Date$Apr;
+ case 3:
+ return _elm_lang$core$Date$Jul;
+ default:
+ return _elm_lang$core$Date$Oct;
+ }
+};
+var _justinmimbs$elm_date_extra$Date_Extra$clamp = F3(
+ function (min, max, date) {
+ return (_elm_lang$core$Native_Utils.cmp(
+ _elm_lang$core$Date$toTime(date),
+ _elm_lang$core$Date$toTime(min)) < 0) ? min : ((_elm_lang$core$Native_Utils.cmp(
+ _elm_lang$core$Date$toTime(date),
+ _elm_lang$core$Date$toTime(max)) > 0) ? max : date);
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$comparableIsBetween = F3(
+ function (a, b, x) {
+ return ((_elm_lang$core$Native_Utils.cmp(a, x) < 1) && (_elm_lang$core$Native_Utils.cmp(x, b) < 1)) || ((_elm_lang$core$Native_Utils.cmp(b, x) < 1) && (_elm_lang$core$Native_Utils.cmp(x, a) < 1));
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$isBetween = F3(
+ function (date1, date2, date) {
+ return A3(
+ _justinmimbs$elm_date_extra$Date_Extra$comparableIsBetween,
+ _elm_lang$core$Date$toTime(date1),
+ _elm_lang$core$Date$toTime(date2),
+ _elm_lang$core$Date$toTime(date));
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$compare = F2(
+ function (a, b) {
+ return A2(
+ _elm_lang$core$Basics$compare,
+ _elm_lang$core$Date$toTime(a),
+ _elm_lang$core$Date$toTime(b));
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$equal = F2(
+ function (a, b) {
+ return _elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Date$toTime(a),
+ _elm_lang$core$Date$toTime(b));
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$offsetFromUtc = _justinmimbs$elm_date_extra$Date_Internal_Extract$offsetFromUtc;
+var _justinmimbs$elm_date_extra$Date_Extra$weekYear = _justinmimbs$elm_date_extra$Date_Internal_Extract$weekYear;
+var _justinmimbs$elm_date_extra$Date_Extra$weekNumber = _justinmimbs$elm_date_extra$Date_Internal_Extract$weekNumber;
+var _justinmimbs$elm_date_extra$Date_Extra$weekdayNumber = _justinmimbs$elm_date_extra$Date_Internal_Extract$weekdayNumber;
+var _justinmimbs$elm_date_extra$Date_Extra$daysToPreviousDayOfWeek = F2(
+ function (d, date) {
+ return _elm_lang$core$Basics$negate(
+ A2(
+ _elm_lang$core$Basics_ops['%'],
+ (_justinmimbs$elm_date_extra$Date_Extra$weekdayNumber(date) - _justinmimbs$elm_date_extra$Date_Extra_Facts$weekdayNumberFromDayOfWeek(d)) + 7,
+ 7));
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$fractionalDay = _justinmimbs$elm_date_extra$Date_Internal_Extract$fractionalDay;
+var _justinmimbs$elm_date_extra$Date_Extra$ordinalDay = _justinmimbs$elm_date_extra$Date_Internal_Extract$ordinalDay;
+var _justinmimbs$elm_date_extra$Date_Extra$quarter = _justinmimbs$elm_date_extra$Date_Internal_Extract$quarter;
+var _justinmimbs$elm_date_extra$Date_Extra$monthNumber = _justinmimbs$elm_date_extra$Date_Internal_Extract$monthNumber;
+var _justinmimbs$elm_date_extra$Date_Extra$ordinalMonth = function (date) {
+ return (_elm_lang$core$Date$year(date) * 12) + _justinmimbs$elm_date_extra$Date_Extra$monthNumber(date);
+};
+var _justinmimbs$elm_date_extra$Date_Extra$diffMonth = F2(
+ function (date1, date2) {
+ var fractionalMonth = function (date) {
+ return (_elm_lang$core$Basics$toFloat(
+ _elm_lang$core$Date$day(date) - 1) + _justinmimbs$elm_date_extra$Date_Extra$fractionalDay(date)) / 31;
+ };
+ var ordinalMonthFloat = function (date) {
+ return _elm_lang$core$Basics$toFloat(
+ _justinmimbs$elm_date_extra$Date_Extra$ordinalMonth(date)) + fractionalMonth(date);
+ };
+ return _elm_lang$core$Basics$truncate(
+ ordinalMonthFloat(date2) - ordinalMonthFloat(date1));
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$toUtcFormattedString = _justinmimbs$elm_date_extra$Date_Internal_Format$toFormattedString(true);
+var _justinmimbs$elm_date_extra$Date_Extra$toUtcIsoString = _justinmimbs$elm_date_extra$Date_Extra$toUtcFormattedString('yyyy-MM-dd\'T\'HH:mm:ss.SSSXXX');
+var _justinmimbs$elm_date_extra$Date_Extra$toFormattedString = _justinmimbs$elm_date_extra$Date_Internal_Format$toFormattedString(false);
+var _justinmimbs$elm_date_extra$Date_Extra$toIsoString = _justinmimbs$elm_date_extra$Date_Extra$toFormattedString('yyyy-MM-dd\'T\'HH:mm:ss.SSSxxx');
+var _justinmimbs$elm_date_extra$Date_Extra$fromTime = function (_p1) {
+ return _elm_lang$core$Date$fromTime(
+ _elm_lang$core$Basics$toFloat(_p1));
+};
+var _justinmimbs$elm_date_extra$Date_Extra$fromOffsetTime = function (_p2) {
+ var _p3 = _p2;
+ var _p5 = _p3._1;
+ var _p4 = _p3._0;
+ if (_p4.ctor === 'Just') {
+ return _justinmimbs$elm_date_extra$Date_Extra$fromTime(_p5 - (_justinmimbs$elm_date_extra$Date_Extra_Facts$msPerMinute * _p4._0));
+ } else {
+ var offset0 = _justinmimbs$elm_date_extra$Date_Extra$offsetFromUtc(
+ _justinmimbs$elm_date_extra$Date_Extra$fromTime(_p5));
+ var date1 = _justinmimbs$elm_date_extra$Date_Extra$fromTime(_p5 - (_justinmimbs$elm_date_extra$Date_Extra_Facts$msPerMinute * offset0));
+ var offset1 = _justinmimbs$elm_date_extra$Date_Extra$offsetFromUtc(date1);
+ if (_elm_lang$core$Native_Utils.eq(offset0, offset1)) {
+ return date1;
+ } else {
+ var date2 = _justinmimbs$elm_date_extra$Date_Extra$fromTime(_p5 - (_justinmimbs$elm_date_extra$Date_Extra_Facts$msPerMinute * offset1));
+ var offset2 = _justinmimbs$elm_date_extra$Date_Extra$offsetFromUtc(date2);
+ return _elm_lang$core$Native_Utils.eq(offset1, offset2) ? date2 : date1;
+ }
+ }
+};
+var _justinmimbs$elm_date_extra$Date_Extra$fromParts = F7(
+ function (y, m, d, hh, mm, ss, ms) {
+ return _justinmimbs$elm_date_extra$Date_Extra$fromOffsetTime(
+ {
+ ctor: '_Tuple2',
+ _0: _elm_lang$core$Maybe$Nothing,
+ _1: A7(_justinmimbs$elm_date_extra$Date_Internal_Core$unixTimeFromParts, y, m, d, hh, mm, ss, ms)
+ });
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$addMonths = F2(
+ function (n, date) {
+ var om = (_justinmimbs$elm_date_extra$Date_Extra$ordinalMonth(date) + n) + -1;
+ var y_ = (om / 12) | 0;
+ var m_ = _justinmimbs$elm_date_extra$Date_Extra_Facts$monthFromMonthNumber(
+ A2(_elm_lang$core$Basics_ops['%'], om, 12) + 1);
+ var _p6 = _justinmimbs$elm_date_extra$Date_Extra$toParts(date);
+ var y = _p6._0;
+ var m = _p6._1;
+ var d = _p6._2;
+ var hh = _p6._3;
+ var mm = _p6._4;
+ var ss = _p6._5;
+ var ms = _p6._6;
+ var d_ = A2(
+ _elm_lang$core$Basics$min,
+ d,
+ A2(_justinmimbs$elm_date_extra$Date_Extra_Facts$daysInMonth, y_, m_));
+ return A7(_justinmimbs$elm_date_extra$Date_Extra$fromParts, y_, m_, d_, hh, mm, ss, ms);
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$add = F3(
+ function (interval, n, date) {
+ var _p7 = _justinmimbs$elm_date_extra$Date_Extra$toParts(date);
+ var y = _p7._0;
+ var m = _p7._1;
+ var d = _p7._2;
+ var hh = _p7._3;
+ var mm = _p7._4;
+ var ss = _p7._5;
+ var ms = _p7._6;
+ var _p8 = interval;
+ switch (_p8.ctor) {
+ case 'Millisecond':
+ return _elm_lang$core$Date$fromTime(
+ _elm_lang$core$Date$toTime(date) + _elm_lang$core$Basics$toFloat(n));
+ case 'Second':
+ return _elm_lang$core$Date$fromTime(
+ _elm_lang$core$Date$toTime(date) + _elm_lang$core$Basics$toFloat(n * _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerSecond));
+ case 'Minute':
+ return _elm_lang$core$Date$fromTime(
+ _elm_lang$core$Date$toTime(date) + _elm_lang$core$Basics$toFloat(n * _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerMinute));
+ case 'Hour':
+ return _elm_lang$core$Date$fromTime(
+ _elm_lang$core$Date$toTime(date) + _elm_lang$core$Basics$toFloat(n * _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerHour));
+ case 'Day':
+ return A7(_justinmimbs$elm_date_extra$Date_Extra$fromParts, y, m, d + n, hh, mm, ss, ms);
+ case 'Month':
+ return A2(_justinmimbs$elm_date_extra$Date_Extra$addMonths, n, date);
+ case 'Year':
+ return A2(_justinmimbs$elm_date_extra$Date_Extra$addMonths, n * 12, date);
+ case 'Quarter':
+ return A2(_justinmimbs$elm_date_extra$Date_Extra$addMonths, n * 3, date);
+ case 'Week':
+ return A7(_justinmimbs$elm_date_extra$Date_Extra$fromParts, y, m, d + (n * 7), hh, mm, ss, ms);
+ default:
+ return A7(_justinmimbs$elm_date_extra$Date_Extra$fromParts, y, m, d + (n * 7), hh, mm, ss, ms);
+ }
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$rangeHelp = F5(
+ function (result, interval, step, start, date) {
+ rangeHelp:
+ while (true) {
+ if (_elm_lang$core$Native_Utils.cmp(
+ _elm_lang$core$Date$toTime(date),
+ _elm_lang$core$Date$toTime(start)) < 0) {
+ return result;
+ } else {
+ var _v4 = {ctor: '::', _0: date, _1: result},
+ _v5 = interval,
+ _v6 = step,
+ _v7 = start,
+ _v8 = A3(_justinmimbs$elm_date_extra$Date_Extra$add, interval, step, date);
+ result = _v4;
+ interval = _v5;
+ step = _v6;
+ start = _v7;
+ date = _v8;
+ continue rangeHelp;
+ }
+ }
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$fromCalendarDate = F3(
+ function (y, m, d) {
+ return _justinmimbs$elm_date_extra$Date_Extra$fromOffsetTime(
+ {
+ ctor: '_Tuple2',
+ _0: _elm_lang$core$Maybe$Nothing,
+ _1: A3(_justinmimbs$elm_date_extra$Date_Internal_Core$unixTimeFromCalendarDate, y, m, d)
+ });
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$floor = F2(
+ function (interval, date) {
+ var _p9 = _justinmimbs$elm_date_extra$Date_Extra$toParts(date);
+ var y = _p9._0;
+ var m = _p9._1;
+ var d = _p9._2;
+ var hh = _p9._3;
+ var mm = _p9._4;
+ var ss = _p9._5;
+ var _p10 = interval;
+ switch (_p10.ctor) {
+ case 'Millisecond':
+ return date;
+ case 'Second':
+ return A7(_justinmimbs$elm_date_extra$Date_Extra$fromParts, y, m, d, hh, mm, ss, 0);
+ case 'Minute':
+ return A7(_justinmimbs$elm_date_extra$Date_Extra$fromParts, y, m, d, hh, mm, 0, 0);
+ case 'Hour':
+ return A7(_justinmimbs$elm_date_extra$Date_Extra$fromParts, y, m, d, hh, 0, 0, 0);
+ case 'Day':
+ return A3(_justinmimbs$elm_date_extra$Date_Extra$fromCalendarDate, y, m, d);
+ case 'Month':
+ return A3(_justinmimbs$elm_date_extra$Date_Extra$fromCalendarDate, y, m, 1);
+ case 'Year':
+ return A3(_justinmimbs$elm_date_extra$Date_Extra$fromCalendarDate, y, _elm_lang$core$Date$Jan, 1);
+ case 'Quarter':
+ return A3(
+ _justinmimbs$elm_date_extra$Date_Extra$fromCalendarDate,
+ y,
+ _justinmimbs$elm_date_extra$Date_Extra$monthFromQuarter(
+ _justinmimbs$elm_date_extra$Date_Extra$quarter(date)),
+ 1);
+ case 'Week':
+ return A3(
+ _justinmimbs$elm_date_extra$Date_Extra$fromCalendarDate,
+ y,
+ m,
+ d + A2(_justinmimbs$elm_date_extra$Date_Extra$daysToPreviousDayOfWeek, _elm_lang$core$Date$Mon, date));
+ case 'Monday':
+ return A3(
+ _justinmimbs$elm_date_extra$Date_Extra$fromCalendarDate,
+ y,
+ m,
+ d + A2(_justinmimbs$elm_date_extra$Date_Extra$daysToPreviousDayOfWeek, _elm_lang$core$Date$Mon, date));
+ case 'Tuesday':
+ return A3(
+ _justinmimbs$elm_date_extra$Date_Extra$fromCalendarDate,
+ y,
+ m,
+ d + A2(_justinmimbs$elm_date_extra$Date_Extra$daysToPreviousDayOfWeek, _elm_lang$core$Date$Tue, date));
+ case 'Wednesday':
+ return A3(
+ _justinmimbs$elm_date_extra$Date_Extra$fromCalendarDate,
+ y,
+ m,
+ d + A2(_justinmimbs$elm_date_extra$Date_Extra$daysToPreviousDayOfWeek, _elm_lang$core$Date$Wed, date));
+ case 'Thursday':
+ return A3(
+ _justinmimbs$elm_date_extra$Date_Extra$fromCalendarDate,
+ y,
+ m,
+ d + A2(_justinmimbs$elm_date_extra$Date_Extra$daysToPreviousDayOfWeek, _elm_lang$core$Date$Thu, date));
+ case 'Friday':
+ return A3(
+ _justinmimbs$elm_date_extra$Date_Extra$fromCalendarDate,
+ y,
+ m,
+ d + A2(_justinmimbs$elm_date_extra$Date_Extra$daysToPreviousDayOfWeek, _elm_lang$core$Date$Fri, date));
+ case 'Saturday':
+ return A3(
+ _justinmimbs$elm_date_extra$Date_Extra$fromCalendarDate,
+ y,
+ m,
+ d + A2(_justinmimbs$elm_date_extra$Date_Extra$daysToPreviousDayOfWeek, _elm_lang$core$Date$Sat, date));
+ default:
+ return A3(
+ _justinmimbs$elm_date_extra$Date_Extra$fromCalendarDate,
+ y,
+ m,
+ d + A2(_justinmimbs$elm_date_extra$Date_Extra$daysToPreviousDayOfWeek, _elm_lang$core$Date$Sun, date));
+ }
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$ceiling = F2(
+ function (interval, date) {
+ var floored = A2(_justinmimbs$elm_date_extra$Date_Extra$floor, interval, date);
+ return _elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Date$toTime(date),
+ _elm_lang$core$Date$toTime(floored)) ? date : A3(_justinmimbs$elm_date_extra$Date_Extra$add, interval, 1, floored);
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$range = F4(
+ function (interval, step, start, end) {
+ var stepBack = _elm_lang$core$Basics$negate(
+ A2(_elm_lang$core$Basics$max, 1, step));
+ return A5(
+ _justinmimbs$elm_date_extra$Date_Extra$rangeHelp,
+ {ctor: '[]'},
+ interval,
+ stepBack,
+ start,
+ A2(
+ _justinmimbs$elm_date_extra$Date_Extra$ceiling,
+ interval,
+ A3(_justinmimbs$elm_date_extra$Date_Extra$add, interval, stepBack, end)));
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$fromIsoString = function (_p11) {
+ return A2(
+ _elm_lang$core$Maybe$map,
+ _justinmimbs$elm_date_extra$Date_Extra$fromOffsetTime,
+ _justinmimbs$elm_date_extra$Date_Internal_Parse$offsetTimeFromIsoString(_p11));
+};
+var _justinmimbs$elm_date_extra$Date_Extra$fromSpec = F3(
+ function (_p14, _p13, _p12) {
+ var _p15 = _p14;
+ var _p16 = _p13;
+ var _p17 = _p12;
+ return _justinmimbs$elm_date_extra$Date_Extra$fromOffsetTime(
+ {ctor: '_Tuple2', _0: _p15._0, _1: _p17._0 + _p16._0});
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$Offset = function (a) {
+ return {ctor: 'Offset', _0: a};
+};
+var _justinmimbs$elm_date_extra$Date_Extra$utc = _justinmimbs$elm_date_extra$Date_Extra$Offset(
+ _elm_lang$core$Maybe$Just(0));
+var _justinmimbs$elm_date_extra$Date_Extra$offset = function (minutes) {
+ return _justinmimbs$elm_date_extra$Date_Extra$Offset(
+ _elm_lang$core$Maybe$Just(minutes));
+};
+var _justinmimbs$elm_date_extra$Date_Extra$local = _justinmimbs$elm_date_extra$Date_Extra$Offset(_elm_lang$core$Maybe$Nothing);
+var _justinmimbs$elm_date_extra$Date_Extra$TimeMS = function (a) {
+ return {ctor: 'TimeMS', _0: a};
+};
+var _justinmimbs$elm_date_extra$Date_Extra$noTime = _justinmimbs$elm_date_extra$Date_Extra$TimeMS(0);
+var _justinmimbs$elm_date_extra$Date_Extra$atTime = F4(
+ function (hh, mm, ss, ms) {
+ return _justinmimbs$elm_date_extra$Date_Extra$TimeMS(
+ A4(_justinmimbs$elm_date_extra$Date_Internal_Core$msFromTimeParts, hh, mm, ss, ms));
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$DateMS = function (a) {
+ return {ctor: 'DateMS', _0: a};
+};
+var _justinmimbs$elm_date_extra$Date_Extra$calendarDate = F3(
+ function (y, m, d) {
+ return _justinmimbs$elm_date_extra$Date_Extra$DateMS(
+ A3(_justinmimbs$elm_date_extra$Date_Internal_Core$unixTimeFromCalendarDate, y, m, d));
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$ordinalDate = F2(
+ function (y, d) {
+ return _justinmimbs$elm_date_extra$Date_Extra$DateMS(
+ A2(_justinmimbs$elm_date_extra$Date_Internal_Core$unixTimeFromOrdinalDate, y, d));
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$weekDate = F3(
+ function (y, w, d) {
+ return _justinmimbs$elm_date_extra$Date_Extra$DateMS(
+ A3(_justinmimbs$elm_date_extra$Date_Internal_Core$unixTimeFromWeekDate, y, w, d));
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$Sunday = {ctor: 'Sunday'};
+var _justinmimbs$elm_date_extra$Date_Extra$Saturday = {ctor: 'Saturday'};
+var _justinmimbs$elm_date_extra$Date_Extra$Friday = {ctor: 'Friday'};
+var _justinmimbs$elm_date_extra$Date_Extra$Thursday = {ctor: 'Thursday'};
+var _justinmimbs$elm_date_extra$Date_Extra$Wednesday = {ctor: 'Wednesday'};
+var _justinmimbs$elm_date_extra$Date_Extra$Tuesday = {ctor: 'Tuesday'};
+var _justinmimbs$elm_date_extra$Date_Extra$Monday = {ctor: 'Monday'};
+var _justinmimbs$elm_date_extra$Date_Extra$Week = {ctor: 'Week'};
+var _justinmimbs$elm_date_extra$Date_Extra$Quarter = {ctor: 'Quarter'};
+var _justinmimbs$elm_date_extra$Date_Extra$Year = {ctor: 'Year'};
+var _justinmimbs$elm_date_extra$Date_Extra$Month = {ctor: 'Month'};
+var _justinmimbs$elm_date_extra$Date_Extra$Day = {ctor: 'Day'};
+var _justinmimbs$elm_date_extra$Date_Extra$diff = F3(
+ function (interval, date1, date2) {
+ var diffMS = _elm_lang$core$Basics$floor(
+ _elm_lang$core$Date$toTime(date2) - _elm_lang$core$Date$toTime(date1));
+ var _p18 = interval;
+ switch (_p18.ctor) {
+ case 'Millisecond':
+ return diffMS;
+ case 'Second':
+ return (diffMS / _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerSecond) | 0;
+ case 'Minute':
+ return (diffMS / _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerMinute) | 0;
+ case 'Hour':
+ return (diffMS / _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerHour) | 0;
+ case 'Day':
+ return (diffMS / _justinmimbs$elm_date_extra$Date_Extra_Facts$msPerDay) | 0;
+ case 'Month':
+ return A2(_justinmimbs$elm_date_extra$Date_Extra$diffMonth, date1, date2);
+ case 'Year':
+ return (A2(_justinmimbs$elm_date_extra$Date_Extra$diffMonth, date1, date2) / 12) | 0;
+ case 'Quarter':
+ return (A2(_justinmimbs$elm_date_extra$Date_Extra$diffMonth, date1, date2) / 3) | 0;
+ case 'Week':
+ return (A3(_justinmimbs$elm_date_extra$Date_Extra$diff, _justinmimbs$elm_date_extra$Date_Extra$Day, date1, date2) / 7) | 0;
+ default:
+ var _p19 = _p18;
+ return (A3(
+ _justinmimbs$elm_date_extra$Date_Extra$diff,
+ _justinmimbs$elm_date_extra$Date_Extra$Day,
+ A2(_justinmimbs$elm_date_extra$Date_Extra$floor, _p19, date1),
+ A2(_justinmimbs$elm_date_extra$Date_Extra$floor, _p19, date2)) / 7) | 0;
+ }
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$Hour = {ctor: 'Hour'};
+var _justinmimbs$elm_date_extra$Date_Extra$Minute = {ctor: 'Minute'};
+var _justinmimbs$elm_date_extra$Date_Extra$equalBy = F3(
+ function (interval, date1, date2) {
+ equalBy:
+ while (true) {
+ var _p20 = interval;
+ switch (_p20.ctor) {
+ case 'Millisecond':
+ return _elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Date$toTime(date1),
+ _elm_lang$core$Date$toTime(date2));
+ case 'Second':
+ return _elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Date$second(date1),
+ _elm_lang$core$Date$second(date2)) && A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Minute, date1, date2);
+ case 'Minute':
+ return _elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Date$minute(date1),
+ _elm_lang$core$Date$minute(date2)) && A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Hour, date1, date2);
+ case 'Hour':
+ return _elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Date$hour(date1),
+ _elm_lang$core$Date$hour(date2)) && A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Day, date1, date2);
+ case 'Day':
+ return _elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Date$day(date1),
+ _elm_lang$core$Date$day(date2)) && A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Month, date1, date2);
+ case 'Month':
+ return _elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Date$month(date1),
+ _elm_lang$core$Date$month(date2)) && A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Year, date1, date2);
+ case 'Year':
+ return _elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Date$year(date1),
+ _elm_lang$core$Date$year(date2));
+ case 'Quarter':
+ return _elm_lang$core$Native_Utils.eq(
+ _justinmimbs$elm_date_extra$Date_Extra$quarter(date1),
+ _justinmimbs$elm_date_extra$Date_Extra$quarter(date2)) && A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Year, date1, date2);
+ case 'Week':
+ return _elm_lang$core$Native_Utils.eq(
+ _justinmimbs$elm_date_extra$Date_Extra$weekNumber(date1),
+ _justinmimbs$elm_date_extra$Date_Extra$weekNumber(date2)) && _elm_lang$core$Native_Utils.eq(
+ _justinmimbs$elm_date_extra$Date_Extra$weekYear(date1),
+ _justinmimbs$elm_date_extra$Date_Extra$weekYear(date2));
+ default:
+ var _p21 = _p20;
+ var _v15 = _justinmimbs$elm_date_extra$Date_Extra$Day,
+ _v16 = A2(_justinmimbs$elm_date_extra$Date_Extra$floor, _p21, date1),
+ _v17 = A2(_justinmimbs$elm_date_extra$Date_Extra$floor, _p21, date2);
+ interval = _v15;
+ date1 = _v16;
+ date2 = _v17;
+ continue equalBy;
+ }
+ }
+ });
+var _justinmimbs$elm_date_extra$Date_Extra$Second = {ctor: 'Second'};
+var _justinmimbs$elm_date_extra$Date_Extra$Millisecond = {ctor: 'Millisecond'};
+
+var _user$project$Models$unpackFilterType = function (filter) {
+ var _p0 = filter;
+ switch (_p0.ctor) {
+ case 'TypeFilter':
+ return {ctor: '_Tuple2', _0: _p0._0, _1: _p0._1};
+ case 'LocationFilter':
+ return {ctor: '_Tuple2', _0: _p0._0, _1: _p0._1};
+ default:
+ return {ctor: '_Tuple2', _0: _p0._0, _1: _p0._1};
+ }
+};
+var _user$project$Models$getSlugFromFilterType = function (filter) {
+ var _p1 = _user$project$Models$unpackFilterType(filter);
+ var slug = _p1._1;
+ return slug;
+};
+var _user$project$Models$getNameFromFilterType = function (filter) {
+ var _p2 = _user$project$Models$unpackFilterType(filter);
+ var name = _p2._0;
+ var slug = _p2._1;
+ return name;
+};
+var _user$project$Models$Model = 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 function (j) {
+ return function (k) {
+ return {days: a, events: b, eventInstances: c, eventLocations: d, eventTypes: e, speakers: f, flags: g, filter: h, location: i, route: j, dataLoaded: k};
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+};
+var _user$project$Models$Day = F3(
+ function (a, b, c) {
+ return {day_name: a, date: b, repr: c};
+ });
+var _user$project$Models$Speaker = F5(
+ function (a, b, c, d, e) {
+ return {name: a, slug: b, biography: c, largePictureUrl: d, smallPictureUrl: e};
+ });
+var _user$project$Models$EventInstance = 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 function (j) {
+ return function (k) {
+ return function (l) {
+ return function (m) {
+ return function (n) {
+ return function (o) {
+ return function (p) {
+ return {title: a, slug: b, id: c, url: d, eventSlug: e, eventType: f, backgroundColor: g, forgroundColor: h, from: i, to: j, timeslots: k, location: l, locationIcon: m, videoState: n, videoUrl: o, isFavorited: p};
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+};
+var _user$project$Models$Event = F7(
+ function (a, b, c, d, e, f, g) {
+ return {title: a, slug: b, $abstract: c, speakerSlugs: d, videoState: e, videoUrl: f, eventType: g};
+ });
+var _user$project$Models$Flags = F5(
+ function (a, b, c, d, e) {
+ return {schedule_timeslot_length_minutes: a, schedule_midnight_offset_hours: b, ics_button_href: c, camp_slug: d, websocket_server: e};
+ });
+var _user$project$Models$Filter = F3(
+ function (a, b, c) {
+ return {eventTypes: a, eventLocations: b, videoRecording: c};
+ });
+var _user$project$Models$NotFoundRoute = {ctor: 'NotFoundRoute'};
+var _user$project$Models$SpeakerRoute = function (a) {
+ return {ctor: 'SpeakerRoute', _0: a};
+};
+var _user$project$Models$EventRoute = function (a) {
+ return {ctor: 'EventRoute', _0: a};
+};
+var _user$project$Models$DayRoute = function (a) {
+ return {ctor: 'DayRoute', _0: a};
+};
+var _user$project$Models$OverviewFilteredRoute = function (a) {
+ return {ctor: 'OverviewFilteredRoute', _0: a};
+};
+var _user$project$Models$OverviewRoute = {ctor: 'OverviewRoute'};
+var _user$project$Models$VideoFilter = F2(
+ function (a, b) {
+ return {ctor: 'VideoFilter', _0: a, _1: b};
+ });
+var _user$project$Models$LocationFilter = F3(
+ function (a, b, c) {
+ return {ctor: 'LocationFilter', _0: a, _1: b, _2: c};
+ });
+var _user$project$Models$TypeFilter = F4(
+ function (a, b, c, d) {
+ return {ctor: 'TypeFilter', _0: a, _1: b, _2: c, _3: d};
+ });
+
+var _user$project$Decoders$eventTypeDecoder = A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'light_text',
+ _elm_lang$core$Json_Decode$bool,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'color',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'slug',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'name',
+ _elm_lang$core$Json_Decode$string,
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$TypeFilter)))));
+var _user$project$Decoders$eventLocationDecoder = A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'icon',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'slug',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'name',
+ _elm_lang$core$Json_Decode$string,
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$LocationFilter))));
+var _user$project$Decoders$dateDecoder = function () {
+ var unpacked = function (isoString) {
+ return A2(
+ _elm_lang$core$Maybe$withDefault,
+ A7(_justinmimbs$elm_date_extra$Date_Extra$fromParts, 1970, _elm_lang$core$Date$Jan, 1, 0, 0, 0, 0),
+ _justinmimbs$elm_date_extra$Date_Extra$fromIsoString(isoString));
+ };
+ return A2(_elm_lang$core$Json_Decode$map, unpacked, _elm_lang$core$Json_Decode$string);
+}();
+var _user$project$Decoders$eventInstanceDecoder = A4(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional,
+ 'is_favorited',
+ _elm_lang$core$Json_Decode$nullable(_elm_lang$core$Json_Decode$bool),
+ _elm_lang$core$Maybe$Nothing,
+ A4(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional,
+ 'video_url',
+ _elm_lang$core$Json_Decode$nullable(_elm_lang$core$Json_Decode$string),
+ _elm_lang$core$Maybe$Nothing,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'video_state',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'location_icon',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'location',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'timeslots',
+ _elm_lang$core$Json_Decode$float,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'to',
+ _user$project$Decoders$dateDecoder,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'from',
+ _user$project$Decoders$dateDecoder,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'fg-color',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'bg-color',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'event_type',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'event_slug',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'url',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'id',
+ _elm_lang$core$Json_Decode$int,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'slug',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'title',
+ _elm_lang$core$Json_Decode$string,
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$EventInstance)))))))))))))))));
+var _user$project$Decoders$eventDecoder = A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'event_type',
+ _elm_lang$core$Json_Decode$string,
+ A4(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional,
+ 'video_url',
+ _elm_lang$core$Json_Decode$nullable(_elm_lang$core$Json_Decode$string),
+ _elm_lang$core$Maybe$Nothing,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'video_state',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'speaker_slugs',
+ _elm_lang$core$Json_Decode$list(_elm_lang$core$Json_Decode$string),
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'abstract',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'slug',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'title',
+ _elm_lang$core$Json_Decode$string,
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$Event))))))));
+var _user$project$Decoders$speakerDecoder = A4(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional,
+ 'small_picture_url',
+ _elm_lang$core$Json_Decode$nullable(_elm_lang$core$Json_Decode$string),
+ _elm_lang$core$Maybe$Nothing,
+ A4(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional,
+ 'large_picture_url',
+ _elm_lang$core$Json_Decode$nullable(_elm_lang$core$Json_Decode$string),
+ _elm_lang$core$Maybe$Nothing,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'biography',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'slug',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'name',
+ _elm_lang$core$Json_Decode$string,
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$Speaker))))));
+var _user$project$Decoders$dayDecoder = A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'repr',
+ _elm_lang$core$Json_Decode$string,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'iso',
+ _user$project$Decoders$dateDecoder,
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'day_name',
+ _elm_lang$core$Json_Decode$string,
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$Day))));
+var _user$project$Decoders$initDataDecoder = A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'speakers',
+ _elm_lang$core$Json_Decode$list(_user$project$Decoders$speakerDecoder),
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'event_types',
+ _elm_lang$core$Json_Decode$list(_user$project$Decoders$eventTypeDecoder),
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'event_locations',
+ _elm_lang$core$Json_Decode$list(_user$project$Decoders$eventLocationDecoder),
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'event_instances',
+ _elm_lang$core$Json_Decode$list(_user$project$Decoders$eventInstanceDecoder),
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'events',
+ _elm_lang$core$Json_Decode$list(_user$project$Decoders$eventDecoder),
+ A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'days',
+ _elm_lang$core$Json_Decode$list(_user$project$Decoders$dayDecoder),
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$Model)))))));
+var _user$project$Decoders$WebSocketAction = function (a) {
+ return {action: a};
+};
+var _user$project$Decoders$webSocketActionDecoder = A3(
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required,
+ 'action',
+ _elm_lang$core$Json_Decode$string,
+ _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Decoders$WebSocketAction));
+
+var _user$project$Routing$routeToString = function (route) {
+ var parts = function () {
+ var _p0 = route;
+ switch (_p0.ctor) {
+ case 'OverviewRoute':
+ return {ctor: '[]'};
+ case 'OverviewFilteredRoute':
+ return {
+ ctor: '::',
+ _0: _p0._0,
+ _1: {ctor: '[]'}
+ };
+ case 'DayRoute':
+ return {
+ ctor: '::',
+ _0: 'day',
+ _1: {
+ ctor: '::',
+ _0: _p0._0,
+ _1: {ctor: '[]'}
+ }
+ };
+ case 'EventRoute':
+ return {
+ ctor: '::',
+ _0: 'event',
+ _1: {
+ ctor: '::',
+ _0: _p0._0,
+ _1: {ctor: '[]'}
+ }
+ };
+ case 'SpeakerRoute':
+ return {
+ ctor: '::',
+ _0: 'speaker',
+ _1: {
+ ctor: '::',
+ _0: _p0._0,
+ _1: {ctor: '[]'}
+ }
+ };
+ default:
+ return {ctor: '[]'};
+ }
+ }();
+ return A2(
+ _elm_lang$core$Basics_ops['++'],
+ '#/',
+ A2(_elm_lang$core$String$join, '/', parts));
+};
+var _user$project$Routing$matchers = _evancz$url_parser$UrlParser$oneOf(
+ {
+ ctor: '::',
+ _0: A2(_evancz$url_parser$UrlParser$map, _user$project$Models$OverviewRoute, _evancz$url_parser$UrlParser$top),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _evancz$url_parser$UrlParser$map,
+ _user$project$Models$OverviewFilteredRoute,
+ A2(_evancz$url_parser$UrlParser_ops['>'], _evancz$url_parser$UrlParser$top, _evancz$url_parser$UrlParser$string)),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _evancz$url_parser$UrlParser$map,
+ _user$project$Models$DayRoute,
+ A2(
+ _evancz$url_parser$UrlParser_ops['>'],
+ _evancz$url_parser$UrlParser$s('day'),
+ _evancz$url_parser$UrlParser$string)),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _evancz$url_parser$UrlParser$map,
+ _user$project$Models$EventRoute,
+ A2(
+ _evancz$url_parser$UrlParser_ops['>'],
+ _evancz$url_parser$UrlParser$s('event'),
+ _evancz$url_parser$UrlParser$string)),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _evancz$url_parser$UrlParser$map,
+ _user$project$Models$SpeakerRoute,
+ A2(
+ _evancz$url_parser$UrlParser_ops['>'],
+ _evancz$url_parser$UrlParser$s('speaker'),
+ _evancz$url_parser$UrlParser$string)),
+ _1: {ctor: '[]'}
+ }
+ }
+ }
+ }
+ });
+var _user$project$Routing$parseLocation = function (location) {
+ return A2(
+ _elm_lang$core$Maybe$withDefault,
+ _user$project$Models$NotFoundRoute,
+ A2(_evancz$url_parser$UrlParser$parseHash, _user$project$Routing$matchers, location));
+};
+
+var _user$project$Messages$BackInHistory = {ctor: 'BackInHistory'};
+var _user$project$Messages$OnLocationChange = function (a) {
+ return {ctor: 'OnLocationChange', _0: a};
+};
+var _user$project$Messages$ToggleFilter = function (a) {
+ return {ctor: 'ToggleFilter', _0: a};
+};
+var _user$project$Messages$WebSocketPayload = function (a) {
+ return {ctor: 'WebSocketPayload', _0: a};
+};
+var _user$project$Messages$NoOp = {ctor: 'NoOp'};
+
+var _user$project$Views_FilterView$filterToString = function (filter) {
+ var videoPart = function () {
+ var _p0 = A2(
+ _elm_lang$core$String$join,
+ ',',
+ A2(_elm_lang$core$List$map, _user$project$Models$getSlugFromFilterType, filter.videoRecording));
+ if (_p0 === '') {
+ return '';
+ } else {
+ return A2(_elm_lang$core$Basics_ops['++'], 'video=', _p0);
+ }
+ }();
+ var locationPart = function () {
+ var _p1 = A2(
+ _elm_lang$core$String$join,
+ ',',
+ A2(_elm_lang$core$List$map, _user$project$Models$getSlugFromFilterType, filter.eventLocations));
+ if (_p1 === '') {
+ return '';
+ } else {
+ return A2(_elm_lang$core$Basics_ops['++'], 'location=', _p1);
+ }
+ }();
+ var typePart = function () {
+ var _p2 = A2(
+ _elm_lang$core$String$join,
+ ',',
+ A2(_elm_lang$core$List$map, _user$project$Models$getSlugFromFilterType, filter.eventTypes));
+ if (_p2 === '') {
+ return '';
+ } else {
+ return A2(_elm_lang$core$Basics_ops['++'], 'type=', _p2);
+ }
+ }();
+ return A2(
+ _elm_lang$core$String$join,
+ '&',
+ A2(
+ _elm_lang$core$List$filter,
+ function (x) {
+ return !_elm_lang$core$Native_Utils.eq(x, '');
+ },
+ {
+ ctor: '::',
+ _0: typePart,
+ _1: {
+ ctor: '::',
+ _0: locationPart,
+ _1: {
+ ctor: '::',
+ _0: videoPart,
+ _1: {ctor: '[]'}
+ }
+ }
+ }));
+};
+var _user$project$Views_FilterView$filterToQuery = function (filter) {
+ var result = _user$project$Views_FilterView$filterToString(filter);
+ return _user$project$Routing$routeToString(
+ _user$project$Models$OverviewFilteredRoute(result));
+};
+var _user$project$Views_FilterView$maybeFilteredOverviewRoute = function (model) {
+ var _p3 = _user$project$Views_FilterView$filterToString(model.filter);
+ if (_p3 === '') {
+ return _user$project$Models$OverviewRoute;
+ } else {
+ return _user$project$Models$OverviewFilteredRoute(_p3);
+ }
+};
+var _user$project$Views_FilterView$findFilter = F2(
+ function (modelItems, filterSlug) {
+ return _elm_lang$core$List$head(
+ A2(
+ _elm_lang$core$List$filter,
+ function (x) {
+ var _p4 = _user$project$Models$unpackFilterType(x);
+ var slug = _p4._1;
+ return _elm_lang$core$Native_Utils.eq(slug, filterSlug);
+ },
+ modelItems));
+ });
+var _user$project$Views_FilterView$getFilter = F3(
+ function (filterType, modelItems, query) {
+ var filterMatch = A2(
+ _elm_lang$core$Maybe$withDefault,
+ '',
+ A2(
+ _elm_lang$core$Maybe$withDefault,
+ _elm_lang$core$Maybe$Nothing,
+ _elm_lang$core$List$head(
+ A2(
+ _elm_lang$core$List$concatMap,
+ function (_) {
+ return _.submatches;
+ },
+ A3(
+ _elm_lang$core$Regex$find,
+ _elm_lang$core$Regex$AtMost(1),
+ _elm_lang$core$Regex$regex(
+ A2(_elm_lang$core$Basics_ops['++'], filterType, '=([\\w,_-]+)&*')),
+ query)))));
+ var filterSlugs = A2(_elm_lang$core$String$split, ',', filterMatch);
+ return A2(
+ _elm_lang$core$List$filterMap,
+ function (x) {
+ return A2(_user$project$Views_FilterView$findFilter, modelItems, x);
+ },
+ filterSlugs);
+ });
+var _user$project$Views_FilterView$filterChoiceView = F4(
+ function (filter, currentFilters, eventInstances, slugLike) {
+ var videoIcon = function () {
+ var _p5 = filter;
+ if (_p5.ctor === 'VideoFilter') {
+ var icon = function () {
+ var _p6 = _p5._1;
+ switch (_p6) {
+ case 'has-recording':
+ return 'film';
+ case 'to-be-recorded':
+ return 'video-camera';
+ case 'not-to-be-recorded':
+ return 'ban';
+ default:
+ return '';
+ }
+ }();
+ return {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$i,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple2',
+ _0: A2(_elm_lang$core$Basics_ops['++'], 'fa-', icon),
+ _1: true
+ },
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'pull-right', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ {ctor: '[]'}),
+ _1: {ctor: '[]'}
+ };
+ } else {
+ return {ctor: '[]'};
+ }
+ }();
+ var locationIcon = function () {
+ var _p7 = filter;
+ if (_p7.ctor === 'LocationFilter') {
+ return {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$i,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple2',
+ _0: A2(_elm_lang$core$Basics_ops['++'], 'fa-', _p7._2),
+ _1: true
+ },
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'pull-right', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ {ctor: '[]'}),
+ _1: {ctor: '[]'}
+ };
+ } else {
+ return {ctor: '[]'};
+ }
+ }();
+ var buttonStyle = function () {
+ var _p8 = filter;
+ if (_p8.ctor === 'TypeFilter') {
+ return {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$style(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'backgroundColor', _1: _p8._2},
+ _1: {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple2',
+ _0: 'color',
+ _1: _p8._3 ? '#fff' : '#000'
+ },
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'border', _1: '1px solid black'},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'margin-bottom', _1: '2px'},
+ _1: {ctor: '[]'}
+ }
+ }
+ }
+ }),
+ _1: {ctor: '[]'}
+ };
+ } else {
+ return {ctor: '[]'};
+ }
+ }();
+ var _p9 = _user$project$Models$unpackFilterType(filter);
+ var name = _p9._0;
+ var slug = _p9._1;
+ var eventInstanceCount = _elm_lang$core$List$length(
+ A2(
+ _elm_lang$core$List$filter,
+ function (eventInstance) {
+ return _elm_lang$core$Native_Utils.eq(
+ slugLike(eventInstance),
+ slug);
+ },
+ eventInstances));
+ var active = A2(_elm_lang$core$List$member, filter, currentFilters);
+ var notActive = !active;
+ return A2(
+ _elm_lang$html$Html$li,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$div,
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn-default', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'filter-choice-active', _1: active},
+ _1: {ctor: '[]'}
+ }
+ }
+ }),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Events$onClick(
+ _user$project$Messages$ToggleFilter(filter)),
+ _1: {ctor: '[]'}
+ }
+ },
+ buttonStyle),
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$span,
+ {ctor: '[]'},
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$span,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'pull-left', _1: true},
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ },
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$i,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa-minus', _1: active},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa-plus', _1: notActive},
+ _1: {ctor: '[]'}
+ }
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ {ctor: '[]'}),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(
+ A2(_elm_lang$core$Basics_ops['++'], ' ', name)),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$small,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ ' (',
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ _elm_lang$core$Basics$toString(eventInstanceCount),
+ ')'))),
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ }
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ A2(_elm_lang$core$Basics_ops['++'], locationIcon, videoIcon))),
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ });
+ });
+var _user$project$Views_FilterView$filterView = F5(
+ function (name, possibleFilters, currentFilters, eventInstances, slugLike) {
+ return A2(
+ _elm_lang$html$Html$div,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(
+ A2(_elm_lang$core$Basics_ops['++'], name, ':')),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$ul,
+ {ctor: '[]'},
+ A2(
+ _elm_lang$core$List$map,
+ function (filter) {
+ return A4(_user$project$Views_FilterView$filterChoiceView, filter, currentFilters, eventInstances, slugLike);
+ },
+ possibleFilters)),
+ _1: {ctor: '[]'}
+ }
+ });
+ });
+var _user$project$Views_FilterView$videoRecordingFilters = {
+ ctor: '::',
+ _0: A2(_user$project$Models$VideoFilter, 'Will not be recorded', 'not-to-be-recorded'),
+ _1: {
+ ctor: '::',
+ _0: A2(_user$project$Models$VideoFilter, 'Will be recorded', 'to-be-recorded'),
+ _1: {
+ ctor: '::',
+ _0: A2(_user$project$Models$VideoFilter, 'Has recording', 'has-recording'),
+ _1: {ctor: '[]'}
+ }
+ }
+};
+var _user$project$Views_FilterView$parseFilterFromQuery = F2(
+ function (query, model) {
+ var videoFilters = A3(_user$project$Views_FilterView$getFilter, 'video', _user$project$Views_FilterView$videoRecordingFilters, query);
+ var locations = A3(_user$project$Views_FilterView$getFilter, 'location', model.eventLocations, query);
+ var types = A3(_user$project$Views_FilterView$getFilter, 'type', model.eventTypes, query);
+ return {eventTypes: types, eventLocations: locations, videoRecording: videoFilters};
+ });
+var _user$project$Views_FilterView$icsButton = function (model) {
+ var filterString = function () {
+ var _p10 = _user$project$Views_FilterView$filterToString(model.filter);
+ if (_p10 === '') {
+ return '';
+ } else {
+ return A2(_elm_lang$core$Basics_ops['++'], '?', _p10);
+ }
+ }();
+ var icsURL = A2(_elm_lang$core$Basics_ops['++'], model.flags.ics_button_href, filterString);
+ return A2(
+ _elm_lang$html$Html$a,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn-default', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$href(icsURL),
+ _1: {ctor: '[]'}
+ }
+ },
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$i,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa-calendar', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ {ctor: '[]'}),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(' ICS file with these filters'),
+ _1: {ctor: '[]'}
+ }
+ });
+};
+var _user$project$Views_FilterView$filterSidebar = function (model) {
+ return A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'col-sm-3', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'col-sm-push-9', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'schedule-filter', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$h4,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text('Filter'),
+ _1: {ctor: '[]'}
+ }),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$class('form-group'),
+ _1: {ctor: '[]'}
+ },
+ {
+ ctor: '::',
+ _0: A5(
+ _user$project$Views_FilterView$filterView,
+ 'Type',
+ model.eventTypes,
+ model.filter.eventTypes,
+ model.eventInstances,
+ function (_) {
+ return _.eventType;
+ }),
+ _1: {
+ ctor: '::',
+ _0: A5(
+ _user$project$Views_FilterView$filterView,
+ 'Location',
+ model.eventLocations,
+ model.filter.eventLocations,
+ model.eventInstances,
+ function (_) {
+ return _.location;
+ }),
+ _1: {
+ ctor: '::',
+ _0: A5(
+ _user$project$Views_FilterView$filterView,
+ 'Video',
+ _user$project$Views_FilterView$videoRecordingFilters,
+ model.filter.videoRecording,
+ model.eventInstances,
+ function (_) {
+ return _.videoState;
+ }),
+ _1: {ctor: '[]'}
+ }
+ }
+ }),
+ _1: {
+ ctor: '::',
+ _0: _user$project$Views_FilterView$icsButton(model),
+ _1: {ctor: '[]'}
+ }
+ }
+ });
+};
+var _user$project$Views_FilterView$applyFilters = F2(
+ function (day, model) {
+ var slugs = F2(
+ function ($default, filters) {
+ return A2(
+ _elm_lang$core$List$map,
+ _user$project$Models$getSlugFromFilterType,
+ _elm_lang$core$List$isEmpty(filters) ? $default : filters);
+ });
+ var types = A2(slugs, model.eventTypes, model.filter.eventTypes);
+ var locations = A2(slugs, model.eventLocations, model.filter.eventLocations);
+ var videoFilters = A2(slugs, _user$project$Views_FilterView$videoRecordingFilters, model.filter.videoRecording);
+ var filteredEventInstances = A2(
+ _elm_lang$core$List$filter,
+ function (eventInstance) {
+ return A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Month, eventInstance.from, day.date) && (A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Day, eventInstance.from, day.date) && (A2(_elm_lang$core$List$member, eventInstance.location, locations) && (A2(_elm_lang$core$List$member, eventInstance.eventType, types) && A2(_elm_lang$core$List$member, eventInstance.videoState, videoFilters))));
+ },
+ model.eventInstances);
+ return filteredEventInstances;
+ });
+
+var _user$project$Update$update = F2(
+ function (msg, model) {
+ var _p0 = msg;
+ switch (_p0.ctor) {
+ case 'NoOp':
+ return {ctor: '_Tuple2', _0: model, _1: _elm_lang$core$Platform_Cmd$none};
+ case 'WebSocketPayload':
+ var _p5 = _p0._0;
+ var newModel = function () {
+ var _p1 = A2(_elm_lang$core$Json_Decode$decodeString, _user$project$Decoders$webSocketActionDecoder, _p5);
+ if (_p1.ctor === 'Ok') {
+ var _p2 = _p1._0.action;
+ if (_p2 === 'init') {
+ var _p3 = A2(_elm_lang$core$Json_Decode$decodeString, _user$project$Decoders$initDataDecoder, _p5);
+ if (_p3.ctor === 'Ok') {
+ return A5(_p3._0, model.flags, model.filter, model.location, model.route, true);
+ } else {
+ return model;
+ }
+ } else {
+ return model;
+ }
+ } else {
+ return model;
+ }
+ }();
+ var _p4 = A2(
+ _user$project$Update$update,
+ _user$project$Messages$OnLocationChange(model.location),
+ newModel);
+ var newModel_ = _p4._0;
+ return A2(
+ _elm_lang$core$Platform_Cmd_ops['!'],
+ newModel_,
+ {ctor: '[]'});
+ case 'ToggleFilter':
+ var currentFilter = model.filter;
+ var newFilter = function () {
+ var _p6 = _p0._0;
+ switch (_p6.ctor) {
+ case 'TypeFilter':
+ var eventType = A4(_user$project$Models$TypeFilter, _p6._0, _p6._1, _p6._2, _p6._3);
+ return _elm_lang$core$Native_Utils.update(
+ currentFilter,
+ {
+ eventTypes: A2(_elm_lang$core$List$member, eventType, model.filter.eventTypes) ? A2(
+ _elm_lang$core$List$filter,
+ function (x) {
+ return !_elm_lang$core$Native_Utils.eq(x, eventType);
+ },
+ model.filter.eventTypes) : {ctor: '::', _0: eventType, _1: model.filter.eventTypes}
+ });
+ case 'LocationFilter':
+ var eventLocation = A3(_user$project$Models$LocationFilter, _p6._0, _p6._1, _p6._2);
+ return _elm_lang$core$Native_Utils.update(
+ currentFilter,
+ {
+ eventLocations: A2(_elm_lang$core$List$member, eventLocation, model.filter.eventLocations) ? A2(
+ _elm_lang$core$List$filter,
+ function (x) {
+ return !_elm_lang$core$Native_Utils.eq(x, eventLocation);
+ },
+ model.filter.eventLocations) : {ctor: '::', _0: eventLocation, _1: model.filter.eventLocations}
+ });
+ default:
+ var videoRecording = A2(_user$project$Models$VideoFilter, _p6._0, _p6._1);
+ return _elm_lang$core$Native_Utils.update(
+ currentFilter,
+ {
+ videoRecording: A2(_elm_lang$core$List$member, videoRecording, model.filter.videoRecording) ? A2(
+ _elm_lang$core$List$filter,
+ function (x) {
+ return !_elm_lang$core$Native_Utils.eq(x, videoRecording);
+ },
+ model.filter.videoRecording) : {ctor: '::', _0: videoRecording, _1: model.filter.videoRecording}
+ });
+ }
+ }();
+ var query = _user$project$Views_FilterView$filterToQuery(newFilter);
+ var cmd = _elm_lang$navigation$Navigation$newUrl(query);
+ return A2(
+ _elm_lang$core$Platform_Cmd_ops['!'],
+ _elm_lang$core$Native_Utils.update(
+ model,
+ {filter: newFilter}),
+ {
+ ctor: '::',
+ _0: cmd,
+ _1: {ctor: '[]'}
+ });
+ case 'OnLocationChange':
+ var _p8 = _p0._0;
+ var newRoute = _user$project$Routing$parseLocation(_p8);
+ var newFilter = function () {
+ var _p7 = newRoute;
+ if (_p7.ctor === 'OverviewFilteredRoute') {
+ return A2(_user$project$Views_FilterView$parseFilterFromQuery, _p7._0, model);
+ } else {
+ return model.filter;
+ }
+ }();
+ return A2(
+ _elm_lang$core$Platform_Cmd_ops['!'],
+ _elm_lang$core$Native_Utils.update(
+ model,
+ {filter: newFilter, route: newRoute, location: _p8}),
+ {ctor: '[]'});
+ default:
+ return A2(
+ _elm_lang$core$Platform_Cmd_ops['!'],
+ model,
+ {
+ ctor: '::',
+ _0: _elm_lang$navigation$Navigation$back(1),
+ _1: {ctor: '[]'}
+ });
+ }
+ });
+
+var _user$project$WebSocketCalls$sendInitMessage = F2(
+ function (camp_slug, scheduleServer) {
+ return A2(
+ _elm_lang$websocket$WebSocket$send,
+ scheduleServer,
+ A2(
+ _elm_lang$core$Json_Encode$encode,
+ 0,
+ _elm_lang$core$Json_Encode$object(
+ {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple2',
+ _0: 'action',
+ _1: _elm_lang$core$Json_Encode$string('init')
+ },
+ _1: {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple2',
+ _0: 'camp_slug',
+ _1: _elm_lang$core$Json_Encode$string(camp_slug)
+ },
+ _1: {ctor: '[]'}
+ }
+ })));
+ });
+
+var _user$project$Views_DayPicker$dayButton = F2(
+ function (day, activeDate) {
+ var isActive = function () {
+ var _p0 = activeDate;
+ if (_p0.ctor === 'Just') {
+ return _elm_lang$core$Native_Utils.eq(day.date, _p0._0);
+ } else {
+ return false;
+ }
+ }();
+ return A2(
+ _elm_lang$html$Html$a,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn-default', _1: !isActive},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn-primary', _1: isActive},
+ _1: {ctor: '[]'}
+ }
+ }
+ }),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$href(
+ _user$project$Routing$routeToString(
+ _user$project$Models$DayRoute(
+ A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'y-MM-dd', day.date)))),
+ _1: {ctor: '[]'}
+ }
+ },
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(day.day_name),
+ _1: {ctor: '[]'}
+ });
+ });
+var _user$project$Views_DayPicker$dayPicker = function (model) {
+ var activeDate = function () {
+ var _p1 = model.route;
+ if (_p1.ctor === 'DayRoute') {
+ return _justinmimbs$elm_date_extra$Date_Extra$fromIsoString(_p1._0);
+ } else {
+ return _elm_lang$core$Maybe$Nothing;
+ }
+ }();
+ var isAllDaysActive = function () {
+ var _p2 = activeDate;
+ if (_p2.ctor === 'Just') {
+ return false;
+ } else {
+ return true;
+ }
+ }();
+ return A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'row', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'sticky', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$id('daypicker'),
+ _1: {ctor: '[]'}
+ }
+ },
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$id('schedule-days'),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$class('btn-group'),
+ _1: {ctor: '[]'}
+ }
+ },
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$a,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn-default', _1: !isAllDaysActive},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn-primary', _1: isAllDaysActive},
+ _1: {ctor: '[]'}
+ }
+ }
+ }),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$href(
+ _user$project$Routing$routeToString(
+ _user$project$Views_FilterView$maybeFilteredOverviewRoute(model))),
+ _1: {ctor: '[]'}
+ }
+ },
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text('All Days'),
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ },
+ A2(
+ _elm_lang$core$List$map,
+ function (day) {
+ return A2(_user$project$Views_DayPicker$dayButton, day, activeDate);
+ },
+ model.days))),
+ _1: {ctor: '[]'}
+ });
+};
+
+var _user$project$Views_DayView$px = function (value) {
+ return A2(
+ _elm_lang$core$Basics_ops['++'],
+ _elm_lang$core$Basics$toString(value),
+ 'px');
+};
+var _user$project$Views_DayView$headerHeight = 50;
+var _user$project$Views_DayView$blockHeight = 15;
+var _user$project$Views_DayView$eventInstanceBlock = F3(
+ function (offset, numberInGroup, _p0) {
+ var _p1 = _p0;
+ var _p2 = _p1._0;
+ var width = 100 / _elm_lang$core$Basics$toFloat(numberInGroup + 1);
+ var minutes = _elm_lang$core$Date$minute(_p2.from);
+ var hourInMinutes = _elm_lang$core$Date$hour(_p2.from) * 60;
+ var topOffset = ((((_elm_lang$core$Basics$toFloat(hourInMinutes + minutes) / 60) - _elm_lang$core$Basics$toFloat(offset)) * 4.0) * _elm_lang$core$Basics$toFloat(_user$project$Views_DayView$blockHeight)) + _elm_lang$core$Basics$toFloat(_user$project$Views_DayView$headerHeight);
+ var length = _elm_lang$core$Basics$toFloat(
+ A3(_justinmimbs$elm_date_extra$Date_Extra$diff, _justinmimbs$elm_date_extra$Date_Extra$Minute, _p2.from, _p2.to)) / 15;
+ var height = A2(
+ _elm_lang$core$Basics_ops['++'],
+ _elm_lang$core$Basics$toString(
+ length * _elm_lang$core$Basics$toFloat(_user$project$Views_DayView$blockHeight)),
+ 'px');
+ return A2(
+ _elm_lang$html$Html$a,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'event', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'event-in-dayview', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$style(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'height', _1: height},
+ _1: {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple2',
+ _0: 'width',
+ _1: A2(
+ _elm_lang$core$Basics_ops['++'],
+ _elm_lang$core$Basics$toString(width),
+ '%')
+ },
+ _1: {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple2',
+ _0: 'top',
+ _1: A2(
+ _elm_lang$core$Basics_ops['++'],
+ _elm_lang$core$Basics$toString(topOffset),
+ 'px')
+ },
+ _1: {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple2',
+ _0: 'left',
+ _1: A2(
+ _elm_lang$core$Basics_ops['++'],
+ _elm_lang$core$Basics$toString(
+ _elm_lang$core$Basics$toFloat(_p1._1) * width),
+ '%')
+ },
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'background-color', _1: _p2.backgroundColor},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'color', _1: _p2.forgroundColor},
+ _1: {ctor: '[]'}
+ }
+ }
+ }
+ }
+ }
+ }),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$href(
+ _user$project$Routing$routeToString(
+ _user$project$Models$EventRoute(_p2.eventSlug))),
+ _1: {ctor: '[]'}
+ }
+ }
+ },
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$p,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'HH:mm', _p2.from),
+ A2(_elm_lang$core$Basics_ops['++'], ' ', _p2.title))),
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ });
+ });
+var _user$project$Views_DayView$renderGroup = F2(
+ function (offset, group) {
+ var sortedGroup = A2(
+ _elm_lang$core$List$sortWith,
+ F2(
+ function (x, y) {
+ var _p3 = A2(_justinmimbs$elm_date_extra$Date_Extra$compare, x.from, y.from);
+ return _p3;
+ }),
+ group);
+ var findLefts = function (instanceA) {
+ return {
+ ctor: '_Tuple2',
+ _0: instanceA,
+ _1: A3(
+ _elm_lang$core$List$foldl,
+ F2(
+ function (x, y) {
+ return x + y;
+ }),
+ 0,
+ A2(
+ _elm_lang$core$List$map,
+ function (instanceB) {
+ return _elm_lang$core$Native_Utils.eq(instanceA, instanceB) ? 0 : ((A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.from, instanceA.from) && A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.to, instanceA.to)) ? 0 : ((A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.from, instanceA.from) && (!A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.to, instanceA.to))) ? 0 : (A3(_justinmimbs$elm_date_extra$Date_Extra$isBetween, instanceB.from, instanceB.to, instanceA.from) ? 1 : 0)));
+ },
+ sortedGroup))
+ };
+ };
+ var lefts = A2(_elm_lang$core$List$map, findLefts, sortedGroup);
+ var numberInGroup = A2(
+ _elm_lang$core$Maybe$withDefault,
+ 1,
+ _elm_lang$core$List$maximum(
+ A2(
+ _elm_lang$core$List$map,
+ function (_p4) {
+ var _p5 = _p4;
+ return _p5._1;
+ },
+ lefts)));
+ var fixedLefts = _elm_lang$core$Native_Utils.eq(numberInGroup, 0) ? A2(
+ _elm_lang$core$List$map,
+ function (_p6) {
+ var _p7 = _p6;
+ var _p8 = _p7._0;
+ return {
+ ctor: '_Tuple2',
+ _0: _p8,
+ _1: A2(
+ _elm_lang$core$Maybe$withDefault,
+ 0,
+ A2(
+ _elm_community$list_extra$List_Extra$elemIndex,
+ {ctor: '_Tuple2', _0: _p8, _1: _p7._1},
+ lefts))
+ };
+ },
+ lefts) : lefts;
+ var fixedNumberInGroup = A2(
+ _elm_lang$core$Maybe$withDefault,
+ 1,
+ _elm_lang$core$List$maximum(
+ A2(
+ _elm_lang$core$List$map,
+ function (_p9) {
+ var _p10 = _p9;
+ return _p10._1;
+ },
+ fixedLefts)));
+ return A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$style(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'display', _1: 'flex'},
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ },
+ A2(
+ _elm_lang$core$List$map,
+ function (instance) {
+ return A3(_user$project$Views_DayView$eventInstanceBlock, offset, fixedNumberInGroup, instance);
+ },
+ fixedLefts));
+ });
+var _user$project$Views_DayView$locationColumn = F5(
+ function (columnWidth, eventInstances, offset, minutes, location) {
+ var locationInstances = A2(
+ _elm_lang$core$List$filter,
+ function (instance) {
+ return _elm_lang$core$Native_Utils.eq(
+ instance.location,
+ _user$project$Models$getSlugFromFilterType(location));
+ },
+ eventInstances);
+ var overlappingGroups = A2(
+ _elm_community$list_extra$List_Extra$groupWhile,
+ F2(
+ function (instanceA, instanceB) {
+ return A3(_justinmimbs$elm_date_extra$Date_Extra$isBetween, instanceB.from, instanceB.to, instanceA.from) && (!A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceA.from, instanceB.to));
+ }),
+ locationInstances);
+ return A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$style(
+ {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple2',
+ _0: 'width',
+ _1: A2(
+ _elm_lang$core$Basics_ops['++'],
+ _elm_lang$core$Basics$toString(columnWidth),
+ '%')
+ },
+ _1: {ctor: '[]'}
+ }),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'location-column', _1: true},
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ }
+ },
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$style(
+ {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple2',
+ _0: 'height',
+ _1: _user$project$Views_DayView$px(_user$project$Views_DayView$headerHeight)
+ },
+ _1: {ctor: '[]'}
+ }),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'location-column-header', _1: true},
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ }
+ },
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(
+ _user$project$Models$getNameFromFilterType(location)),
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ },
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ A2(
+ _elm_lang$core$List$map,
+ function (x) {
+ return A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$style(
+ {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple2',
+ _0: 'backgroundColor',
+ _1: (_elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Date$minute(x),
+ 30) || _elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Date$minute(x),
+ 45)) ? '#f8f8f8' : '#fff'
+ },
+ _1: {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple2',
+ _0: 'height',
+ _1: _user$project$Views_DayView$px(_user$project$Views_DayView$blockHeight)
+ },
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ {ctor: '[]'});
+ },
+ minutes),
+ A2(
+ _elm_lang$core$List$map,
+ function (group) {
+ return A2(_user$project$Views_DayView$renderGroup, offset, group);
+ },
+ overlappingGroups))));
+ });
+var _user$project$Views_DayView$locationColumns = F4(
+ function (eventInstances, eventLocations, offset, minutes) {
+ var columnWidth = 100.0 / _elm_lang$core$Basics$toFloat(
+ _elm_lang$core$List$length(eventLocations));
+ return A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$style(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'display', _1: 'flex'},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'justify-content', _1: 'space-around'},
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'col-sm-11', _1: true},
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ }
+ },
+ A2(
+ _elm_lang$core$List$map,
+ function (location) {
+ return A5(_user$project$Views_DayView$locationColumn, columnWidth, eventInstances, offset, minutes, location);
+ },
+ eventLocations));
+ });
+var _user$project$Views_DayView$gutterHour = function (date) {
+ var textToShow = function () {
+ var _p11 = _elm_lang$core$Date$minute(date);
+ switch (_p11) {
+ case 0:
+ return A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'HH:mm', date);
+ case 30:
+ return A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'HH:mm', date);
+ default:
+ return '';
+ }
+ }();
+ return A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$style(
+ {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple2',
+ _0: 'height',
+ _1: _user$project$Views_DayView$px(_user$project$Views_DayView$blockHeight)
+ },
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ },
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(textToShow),
+ _1: {ctor: '[]'}
+ });
+};
+var _user$project$Views_DayView$gutter = function (hours) {
+ return A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'col-sm-1', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'day-view-gutter', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$style(
+ {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple2',
+ _0: 'height',
+ _1: _user$project$Views_DayView$px(_user$project$Views_DayView$headerHeight)
+ },
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ },
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(''),
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ },
+ A2(_elm_lang$core$List$map, _user$project$Views_DayView$gutterHour, hours)));
+};
+var _user$project$Views_DayView$dayView = F2(
+ function (day, model) {
+ var filteredEventInstances = A2(
+ _elm_lang$core$List$filter,
+ function (x) {
+ return A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Day, x.from, day.date);
+ },
+ model.eventInstances);
+ var start = A3(_justinmimbs$elm_date_extra$Date_Extra$add, _justinmimbs$elm_date_extra$Date_Extra$Hour, model.flags.schedule_midnight_offset_hours, day.date);
+ var lastHour = A3(_justinmimbs$elm_date_extra$Date_Extra$add, _justinmimbs$elm_date_extra$Date_Extra$Day, 1, start);
+ var minutes = A4(_justinmimbs$elm_date_extra$Date_Extra$range, _justinmimbs$elm_date_extra$Date_Extra$Minute, 15, start, lastHour);
+ return A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'row', _1: true},
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ },
+ {
+ ctor: '::',
+ _0: _user$project$Views_DayView$gutter(minutes),
+ _1: {
+ ctor: '::',
+ _0: A4(_user$project$Views_DayView$locationColumns, filteredEventInstances, model.eventLocations, model.flags.schedule_midnight_offset_hours, minutes),
+ _1: {ctor: '[]'}
+ }
+ });
+ });
+
+var _user$project$Views_EventDetail$eventInstanceItem = function (eventInstance) {
+ var toFormat = _elm_lang$core$Native_Utils.eq(
+ _elm_lang$core$Date$day(eventInstance.from),
+ _elm_lang$core$Date$day(eventInstance.to)) ? 'HH:mm' : 'E HH:mm';
+ return A2(
+ _elm_lang$html$Html$li,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'E HH:mm', eventInstance.from),
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ ' to ',
+ A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, toFormat, eventInstance.to)))),
+ _1: {ctor: '[]'}
+ });
+};
+var _user$project$Views_EventDetail$eventInstancesSidebar = function (eventInstances) {
+ return A2(
+ _elm_lang$html$Html$div,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$h4,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text('This event will occur at:'),
+ _1: {ctor: '[]'}
+ }),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$ul,
+ {ctor: '[]'},
+ A2(_elm_lang$core$List$map, _user$project$Views_EventDetail$eventInstanceItem, eventInstances)),
+ _1: {ctor: '[]'}
+ }
+ });
+};
+var _user$project$Views_EventDetail$speakerDetail = function (speaker) {
+ return A2(
+ _elm_lang$html$Html$li,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$a,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$href(
+ _user$project$Routing$routeToString(
+ _user$project$Models$SpeakerRoute(speaker.slug))),
+ _1: {ctor: '[]'}
+ },
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(speaker.name),
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ });
+};
+var _user$project$Views_EventDetail$speakerSidebar = function (speakers) {
+ return A2(
+ _elm_lang$html$Html$div,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$h4,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text('Speakers'),
+ _1: {ctor: '[]'}
+ }),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$ul,
+ {ctor: '[]'},
+ A2(_elm_lang$core$List$map, _user$project$Views_EventDetail$speakerDetail, speakers)),
+ _1: {ctor: '[]'}
+ }
+ });
+};
+var _user$project$Views_EventDetail$eventMetaDataSidebar = function (event) {
+ var _p0 = function () {
+ var _p1 = event.videoState;
+ switch (_p1) {
+ case 'to-be-recorded':
+ return {ctor: '_Tuple2', _0: true, _1: 'Yes'};
+ case 'not-to-be-recorded':
+ return {ctor: '_Tuple2', _0: true, _1: 'No'};
+ default:
+ return {ctor: '_Tuple2', _0: false, _1: ''};
+ }
+ }();
+ var showVideoRecoring = _p0._0;
+ var videoRecording = _p0._1;
+ return A2(
+ _elm_lang$html$Html$div,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$h4,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text('Metadata'),
+ _1: {ctor: '[]'}
+ }),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$ul,
+ {ctor: '[]'},
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$li,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$strong,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text('Type: '),
+ _1: {ctor: '[]'}
+ }),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(event.eventType),
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ function () {
+ var _p2 = showVideoRecoring;
+ if (_p2 === true) {
+ return {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$li,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$strong,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text('Recording: '),
+ _1: {ctor: '[]'}
+ }),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(videoRecording),
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {ctor: '[]'}
+ };
+ } else {
+ return {ctor: '[]'};
+ }
+ }())),
+ _1: {ctor: '[]'}
+ }
+ });
+};
+var _user$project$Views_EventDetail$getSpeakersFromSlugs = F3(
+ function (speakers, slugs, collectedSpeakers) {
+ getSpeakersFromSlugs:
+ while (true) {
+ var _p3 = speakers;
+ if (_p3.ctor === '[]') {
+ return collectedSpeakers;
+ } else {
+ var _p7 = _p3._0;
+ var foundSlug = _elm_lang$core$List$head(
+ A2(
+ _elm_lang$core$List$filter,
+ function (slug) {
+ return _elm_lang$core$Native_Utils.eq(slug, _p7.slug);
+ },
+ slugs));
+ var foundSpeaker = function () {
+ var _p4 = foundSlug;
+ if (_p4.ctor === 'Just') {
+ return {
+ ctor: '::',
+ _0: _p7,
+ _1: {ctor: '[]'}
+ };
+ } else {
+ return {ctor: '[]'};
+ }
+ }();
+ var newCollectedSpeakers = A2(_elm_lang$core$Basics_ops['++'], collectedSpeakers, foundSpeaker);
+ var newSlugs = function () {
+ var _p5 = foundSlug;
+ if (_p5.ctor === 'Just') {
+ return A2(
+ _elm_lang$core$List$filter,
+ function (x) {
+ return !_elm_lang$core$Native_Utils.eq(x, _p5._0);
+ },
+ slugs);
+ } else {
+ return slugs;
+ }
+ }();
+ var _p6 = slugs;
+ if (_p6.ctor === '[]') {
+ return collectedSpeakers;
+ } else {
+ var _v6 = _p3._1,
+ _v7 = newSlugs,
+ _v8 = newCollectedSpeakers;
+ speakers = _v6;
+ slugs = _v7;
+ collectedSpeakers = _v8;
+ continue getSpeakersFromSlugs;
+ }
+ }
+ }
+ });
+var _user$project$Views_EventDetail$eventDetailSidebar = F2(
+ function (event, model) {
+ var speakers = A3(
+ _user$project$Views_EventDetail$getSpeakersFromSlugs,
+ model.speakers,
+ event.speakerSlugs,
+ {ctor: '[]'});
+ var eventInstances = A2(
+ _elm_lang$core$List$filter,
+ function (instance) {
+ return _elm_lang$core$Native_Utils.eq(instance.eventSlug, event.slug);
+ },
+ model.eventInstances);
+ var videoRecordingLink = function () {
+ var _p8 = event.videoUrl;
+ if (_p8.ctor === 'Nothing') {
+ return {ctor: '[]'};
+ } else {
+ return {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$a,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$href(_p8._0),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn-success', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {ctor: '[]'}
+ }
+ },
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$i,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa-film', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ {ctor: '[]'}),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(' Watch recording here!'),
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {ctor: '[]'}
+ };
+ }
+ }();
+ return A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'col-sm-3', _1: true},
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ },
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ videoRecordingLink,
+ {
+ ctor: '::',
+ _0: _user$project$Views_EventDetail$speakerSidebar(speakers),
+ _1: {
+ ctor: '::',
+ _0: _user$project$Views_EventDetail$eventMetaDataSidebar(event),
+ _1: {
+ ctor: '::',
+ _0: _user$project$Views_EventDetail$eventInstancesSidebar(eventInstances),
+ _1: {ctor: '[]'}
+ }
+ }
+ }));
+ });
+var _user$project$Views_EventDetail$eventDetailContent = function (event) {
+ return A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$class('col-sm-9'),
+ _1: {ctor: '[]'}
+ },
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$a,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Events$onClick(_user$project$Messages$BackInHistory),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn-default', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {ctor: '[]'}
+ }
+ },
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$i,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa-chevron-left', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ {ctor: '[]'}),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(' Back'),
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$h3,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(event.title),
+ _1: {ctor: '[]'}
+ }),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$div,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: A2(
+ _evancz$elm_markdown$Markdown$toHtml,
+ {ctor: '[]'},
+ event.$abstract),
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ }
+ }
+ });
+};
+var _user$project$Views_EventDetail$eventDetailView = F2(
+ function (eventSlug, model) {
+ var event = _elm_lang$core$List$head(
+ A2(
+ _elm_lang$core$List$filter,
+ function (e) {
+ return _elm_lang$core$Native_Utils.eq(e.slug, eventSlug);
+ },
+ model.events));
+ var _p9 = event;
+ if (_p9.ctor === 'Just') {
+ var _p10 = _p9._0;
+ return A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$class('row'),
+ _1: {ctor: '[]'}
+ },
+ {
+ ctor: '::',
+ _0: _user$project$Views_EventDetail$eventDetailContent(_p10),
+ _1: {
+ ctor: '::',
+ _0: A2(_user$project$Views_EventDetail$eventDetailSidebar, _p10, model),
+ _1: {ctor: '[]'}
+ }
+ });
+ } else {
+ return A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$class('row'),
+ _1: {ctor: '[]'}
+ },
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$h4,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text('Event not found.'),
+ _1: {ctor: '[]'}
+ }),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$a,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$href('#'),
+ _1: {ctor: '[]'}
+ },
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text('Click here to go the schedule overview.'),
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ }
+ });
+ }
+ });
+
+var _user$project$Views_SpeakerDetail$eventItem = function (event) {
+ return A2(
+ _elm_lang$html$Html$li,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$a,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$href(
+ _user$project$Routing$routeToString(
+ _user$project$Models$EventRoute(event.slug))),
+ _1: {ctor: '[]'}
+ },
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(event.title),
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ });
+};
+var _user$project$Views_SpeakerDetail$speakerEvents = F2(
+ function (speaker, model) {
+ var events = A2(
+ _elm_lang$core$List$filter,
+ function (event) {
+ return A2(_elm_lang$core$List$member, speaker.slug, event.speakerSlugs);
+ },
+ model.events);
+ var _p0 = events;
+ if (_p0.ctor === '[]') {
+ return A2(
+ _elm_lang$html$Html$p,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text('This speaker has no events!'),
+ _1: {ctor: '[]'}
+ });
+ } else {
+ return A2(
+ _elm_lang$html$Html$div,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$h3,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text('Events:'),
+ _1: {ctor: '[]'}
+ }),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$ul,
+ {ctor: '[]'},
+ A2(_elm_lang$core$List$map, _user$project$Views_SpeakerDetail$eventItem, _p0)),
+ _1: {ctor: '[]'}
+ }
+ });
+ }
+ });
+var _user$project$Views_SpeakerDetail$speakerDetailView = F2(
+ function (speakerSlug, model) {
+ var speaker = _elm_lang$core$List$head(
+ A2(
+ _elm_lang$core$List$filter,
+ function (speaker) {
+ return _elm_lang$core$Native_Utils.eq(speaker.slug, speakerSlug);
+ },
+ model.speakers));
+ var image = function () {
+ var _p1 = speaker;
+ if (_p1.ctor === 'Just') {
+ var _p2 = _p1._0.smallPictureUrl;
+ if (_p2.ctor === 'Just') {
+ return {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$img,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$src(_p2._0),
+ _1: {ctor: '[]'}
+ },
+ {ctor: '[]'}),
+ _1: {ctor: '[]'}
+ };
+ } else {
+ return {ctor: '[]'};
+ }
+ } else {
+ return {ctor: '[]'};
+ }
+ }();
+ var _p3 = speaker;
+ if (_p3.ctor === 'Just') {
+ var _p4 = _p3._0;
+ return A2(
+ _elm_lang$html$Html$div,
+ {ctor: '[]'},
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$a,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Events$onClick(_user$project$Messages$BackInHistory),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'btn-default', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {ctor: '[]'}
+ }
+ },
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$i,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa-chevron-left', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ {ctor: '[]'}),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(' Back'),
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$h3,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(_p4.name),
+ _1: {ctor: '[]'}
+ }),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$div,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: A2(
+ _evancz$elm_markdown$Markdown$toHtml,
+ {ctor: '[]'},
+ _p4.biography),
+ _1: {ctor: '[]'}
+ }),
+ _1: {
+ ctor: '::',
+ _0: A2(_user$project$Views_SpeakerDetail$speakerEvents, _p4, model),
+ _1: {ctor: '[]'}
+ }
+ }
+ }
+ },
+ image));
+ } else {
+ return A2(
+ _elm_lang$html$Html$div,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text('Unknown speaker...'),
+ _1: {ctor: '[]'}
+ });
+ }
+ });
+
+var _user$project$Views_ScheduleOverview$dayEventInstanceIcons = function (eventInstance) {
+ var videoIcon = function () {
+ var _p0 = eventInstance.videoState;
+ switch (_p0) {
+ case 'has-recording':
+ return {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$i,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa-film', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'pull-right', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ {ctor: '[]'}),
+ _1: {ctor: '[]'}
+ };
+ case 'to-be-recorded':
+ return {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$i,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa-video-camera', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'pull-right', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ {ctor: '[]'}),
+ _1: {ctor: '[]'}
+ };
+ case 'not-to-be-recorded':
+ return {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$i,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa-ban', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'pull-right', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ {ctor: '[]'}),
+ _1: {ctor: '[]'}
+ };
+ default:
+ return {ctor: '[]'};
+ }
+ }();
+ return A2(
+ _elm_lang$core$Basics_ops['++'],
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$i,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'fa', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {
+ ctor: '_Tuple2',
+ _0: A2(_elm_lang$core$Basics_ops['++'], 'fa-', eventInstance.locationIcon),
+ _1: true
+ },
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'pull-right', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ {ctor: '[]'}),
+ _1: {ctor: '[]'}
+ },
+ videoIcon);
+};
+var _user$project$Views_ScheduleOverview$dayEventInstanceView = function (eventInstance) {
+ return A2(
+ _elm_lang$html$Html$a,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'event', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'event-in-overview', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$href(
+ _user$project$Routing$routeToString(
+ _user$project$Models$EventRoute(eventInstance.eventSlug))),
+ _1: {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$style(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'background-color', _1: eventInstance.backgroundColor},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'color', _1: eventInstance.forgroundColor},
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {ctor: '[]'}
+ }
+ }
+ },
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$small,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'HH:mm', eventInstance.from),
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ ' - ',
+ A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'HH:mm', eventInstance.to)))),
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ },
+ A2(
+ _elm_lang$core$Basics_ops['++'],
+ _user$project$Views_ScheduleOverview$dayEventInstanceIcons(eventInstance),
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$p,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(eventInstance.title),
+ _1: {ctor: '[]'}
+ }),
+ _1: {ctor: '[]'}
+ })));
+};
+var _user$project$Views_ScheduleOverview$dayRowView = F2(
+ function (day, model) {
+ var filteredEventInstances = A2(_user$project$Views_FilterView$applyFilters, day, model);
+ return A2(
+ _elm_lang$html$Html$div,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$h4,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text(day.repr),
+ _1: {ctor: '[]'}
+ }),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$class('schedule-day-row'),
+ _1: {ctor: '[]'}
+ },
+ A2(
+ _elm_lang$core$List$map,
+ _elm_lang$html$Html_Lazy$lazy(_user$project$Views_ScheduleOverview$dayEventInstanceView),
+ filteredEventInstances)),
+ _1: {ctor: '[]'}
+ }
+ });
+ });
+var _user$project$Views_ScheduleOverview$scheduleOverviewView = function (model) {
+ return A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$class('row'),
+ _1: {ctor: '[]'}
+ },
+ {
+ ctor: '::',
+ _0: _user$project$Views_FilterView$filterSidebar(model),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$div,
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html_Attributes$classList(
+ {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'col-sm-9', _1: true},
+ _1: {
+ ctor: '::',
+ _0: {ctor: '_Tuple2', _0: 'col-sm-pull-3', _1: true},
+ _1: {ctor: '[]'}
+ }
+ }),
+ _1: {ctor: '[]'}
+ },
+ A2(
+ _elm_lang$core$List$map,
+ function (day) {
+ return A3(_elm_lang$html$Html_Lazy$lazy2, _user$project$Views_ScheduleOverview$dayRowView, day, model);
+ },
+ model.days)),
+ _1: {ctor: '[]'}
+ }
+ });
+};
+
+var _user$project$Views$view = function (model) {
+ var _p0 = model.dataLoaded;
+ if (_p0 === true) {
+ return A2(
+ _elm_lang$html$Html$div,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _user$project$Views_DayPicker$dayPicker(model),
+ _1: {
+ ctor: '::',
+ _0: A2(
+ _elm_lang$html$Html$hr,
+ {ctor: '[]'},
+ {ctor: '[]'}),
+ _1: {
+ ctor: '::',
+ _0: function () {
+ var _p1 = model.route;
+ switch (_p1.ctor) {
+ case 'OverviewRoute':
+ return _user$project$Views_ScheduleOverview$scheduleOverviewView(model);
+ case 'OverviewFilteredRoute':
+ return _user$project$Views_ScheduleOverview$scheduleOverviewView(model);
+ case 'DayRoute':
+ var day = A2(
+ _elm_lang$core$Maybe$withDefault,
+ A3(
+ _user$project$Models$Day,
+ '',
+ A7(_justinmimbs$elm_date_extra$Date_Extra$fromParts, 1970, _elm_lang$core$Date$Jan, 1, 0, 0, 0, 0),
+ ''),
+ _elm_lang$core$List$head(
+ A2(
+ _elm_lang$core$List$filter,
+ function (x) {
+ return _elm_lang$core$Native_Utils.eq(
+ A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'y-MM-dd', x.date),
+ _p1._0);
+ },
+ model.days)));
+ return A2(_user$project$Views_DayView$dayView, day, model);
+ case 'EventRoute':
+ return A2(_user$project$Views_EventDetail$eventDetailView, _p1._0, model);
+ case 'SpeakerRoute':
+ return A2(_user$project$Views_SpeakerDetail$speakerDetailView, _p1._0, model);
+ default:
+ return A2(
+ _elm_lang$html$Html$div,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text('Not found!'),
+ _1: {ctor: '[]'}
+ });
+ }
+ }(),
+ _1: {ctor: '[]'}
+ }
+ }
+ });
+ } else {
+ return A2(
+ _elm_lang$html$Html$h4,
+ {ctor: '[]'},
+ {
+ ctor: '::',
+ _0: _elm_lang$html$Html$text('Loading schedule...'),
+ _1: {ctor: '[]'}
+ });
+ }
+};
+
+var _user$project$Main$subscriptions = function (model) {
+ return A2(_elm_lang$websocket$WebSocket$listen, model.flags.websocket_server, _user$project$Messages$WebSocketPayload);
+};
+var _user$project$Main$init = F2(
+ function (flags, location) {
+ var emptyFilter = A3(
+ _user$project$Models$Filter,
+ {ctor: '[]'},
+ {ctor: '[]'},
+ {ctor: '[]'});
+ var currentRoute = _user$project$Routing$parseLocation(location);
+ var model = _user$project$Models$Model(
+ {ctor: '[]'})(
+ {ctor: '[]'})(
+ {ctor: '[]'})(
+ {ctor: '[]'})(
+ {ctor: '[]'})(
+ {ctor: '[]'})(flags)(emptyFilter)(location)(currentRoute)(false);
+ return A2(
+ _elm_lang$core$Platform_Cmd_ops['!'],
+ model,
+ {
+ ctor: '::',
+ _0: A2(_user$project$WebSocketCalls$sendInitMessage, flags.camp_slug, flags.websocket_server),
+ _1: {ctor: '[]'}
+ });
+ });
+var _user$project$Main$main = A2(
+ _elm_lang$navigation$Navigation$programWithFlags,
+ _user$project$Messages$OnLocationChange,
+ {init: _user$project$Main$init, view: _user$project$Views$view, update: _user$project$Update$update, subscriptions: _user$project$Main$subscriptions})(
+ A2(
+ _elm_lang$core$Json_Decode$andThen,
+ function (camp_slug) {
+ return A2(
+ _elm_lang$core$Json_Decode$andThen,
+ function (ics_button_href) {
+ return A2(
+ _elm_lang$core$Json_Decode$andThen,
+ function (schedule_midnight_offset_hours) {
+ return A2(
+ _elm_lang$core$Json_Decode$andThen,
+ function (schedule_timeslot_length_minutes) {
+ return A2(
+ _elm_lang$core$Json_Decode$andThen,
+ function (websocket_server) {
+ return _elm_lang$core$Json_Decode$succeed(
+ {camp_slug: camp_slug, ics_button_href: ics_button_href, schedule_midnight_offset_hours: schedule_midnight_offset_hours, schedule_timeslot_length_minutes: schedule_timeslot_length_minutes, websocket_server: websocket_server});
+ },
+ A2(_elm_lang$core$Json_Decode$field, 'websocket_server', _elm_lang$core$Json_Decode$string));
+ },
+ A2(_elm_lang$core$Json_Decode$field, 'schedule_timeslot_length_minutes', _elm_lang$core$Json_Decode$int));
+ },
+ A2(_elm_lang$core$Json_Decode$field, 'schedule_midnight_offset_hours', _elm_lang$core$Json_Decode$int));
+ },
+ A2(_elm_lang$core$Json_Decode$field, 'ics_button_href', _elm_lang$core$Json_Decode$string));
+ },
+ A2(_elm_lang$core$Json_Decode$field, 'camp_slug', _elm_lang$core$Json_Decode$string)));
+
+var Elm = {};
+Elm['Main'] = Elm['Main'] || {};
+if (typeof _user$project$Main$main !== 'undefined') {
+ _user$project$Main$main(Elm['Main'], 'Main', undefined);
+}
+
+if (typeof define === "function" && define['amd'])
+{
+ define([], function() { return Elm; });
+ return;
+}
+
+if (typeof module === "object")
+{
+ module['exports'] = Elm;
+ return;
+}
+
+var globalElm = this['Elm'];
+if (typeof globalElm === "undefined")
+{
+ this['Elm'] = Elm;
+ return;
+}
+
+for (var publicModule in Elm)
+{
+ if (publicModule in globalElm)
+ {
+ throw new Error('There are two Elm modules called `' + publicModule + '` on this page! Rename one of them.');
+ }
+ globalElm[publicModule] = Elm[publicModule];
+}
+
+}).call(this);
+
diff --git a/src/program/static/js/event_instance_websocket.js b/src/program/static/js/event_instance_websocket.js
deleted file mode 100644
index f6ed297b..00000000
--- a/src/program/static/js/event_instance_websocket.js
+++ /dev/null
@@ -1,552 +0,0 @@
-const webSocketBridge = new channels.WebSocketBridge();
-var modals = {};
-var EVENT_INSTANCES = [], DAYS = [], CONFIG = {};
-
-function toggleFavoriteButton(button) {
- if(button.getAttribute('data-state') == 'true') {
- favorite_button.classList.remove('btn-success');
- favorite_button.classList.add('btn-danger');
- favorite_button.innerHTML = ' Remove favorite';
-
- favorite_button.onclick = function(e) {
- button.setAttribute('data-state', 'false')
- webSocketBridge.send({action: 'unfavorite', event_instance_id: event_instance_id});
- toggleFavoriteButton(button)
- }
- } else {
- favorite_button.classList.remove('btn-danger');
- favorite_button.classList.add('btn-success');
- favorite_button.innerHTML = ' Favorite';
-
- favorite_button.onclick = function(e) {
- button.setAttribute('data-state', 'true')
- webSocketBridge.send({action: 'favorite', event_instance_id: event_instance_id});
- toggleFavoriteButton(button)
- }
-
- }
-}
-
-function setup_websocket() {
- webSocketBridge.connect('/schedule/');
- webSocketBridge.listen(function(payload, stream) {
- if(payload['action'] == 'init') {
- EVENT_INSTANCES = payload['event_instances'];
- DAYS = payload['days'];
- render();
- }
- });
-}
-
-function init(config) {
- CONFIG = config;
- setup_websocket();
- render();
-}
-
-function findGetParameter(parameterName) {
- var result = null,
- tmp = [];
- location.search
- .substr(1)
- .split("&")
- .forEach(function (item) {
- tmp = item.split("=");
- if (tmp[0] === parameterName) {
- result = decodeURIComponent(tmp[1]);
- }
- });
- return result;
-}
-
-function get_parameters() {
-
- var day_parameter = findGetParameter('day');
- var filter_day = day_parameter != null ? day_parameter.split(',') : [];
- var type_parameter = findGetParameter('type');
- var filter_types = type_parameter != null ? type_parameter.split(',') : [];
- var location_parameter = findGetParameter('location')
- var filter_locations = location_parameter != null ? location_parameter.split(',') : [];
-
- return {
- 'day': filter_day[0],
- 'types': filter_types,
- 'locations': filter_locations
- }
-}
-
-function render() {
- parameters = get_parameters();
- toggleFilterBoxes(parameters['types'], parameters['locations']);
- render_day_menu(parameters['day']);
- setICSButtonHref(location.search);
-
- if(parameters['day'] != null) {
- render_day(parameters['types'], parameters['locations'], parameters['day']);
- } else {
- render_schedule(parameters['types'], parameters['locations']);
- }
-}
-
-function render_day_menu(active_iso) {
- var container = document.getElementById('schedule-days');
- container.innerHTML = '';
-
- var mobile_container = document.getElementById('schedule-days-mobile');
- mobile_container.innerHTML = '';
-
- function set_btn_type(classList, primary) {
- if(primary == true) {
- classList.add('btn-primary');
- } else {
- classList.add('btn-default');
- }
- }
-
- function dayEvent(e) {
- setHistoryState({
- 'day': this.dataset.iso
- });
- render();
- }
-
- var all_days = document.createElement('a');
- all_days.classList.add('btn');
- set_btn_type(all_days.classList, active_iso == null);
- all_days.innerHTML = 'All days';
- all_days.dataset.iso = 'all-days';
- all_days.addEventListener('click', dayEvent);
- container.appendChild(all_days);
-
- all_days_mobile = all_days.cloneNode(true);
- all_days_mobile.addEventListener('click', dayEvent);
- mobile_container.appendChild(all_days_mobile);
-
- for(var day_id in DAYS) {
- var day_link = document.createElement('a');
- day_link.classList.add('btn');
- set_btn_type(day_link.classList, DAYS[day_id]['iso'] == active_iso);
- day_link.dataset.iso = DAYS[day_id]['iso'];
- day_link.innerHTML = DAYS[day_id]['day_name'];
-
- day_link.addEventListener('click', dayEvent);
- container.appendChild(day_link);
-
- day_link_mobile = day_link.cloneNode(true);
- day_link_mobile.addEventListener('click', dayEvent);
- mobile_container.appendChild(day_link_mobile);
- }
-}
-
-function render_day(types, locations, day) {
-
- function hoursTohhmm(hours){
- var hour = Math.floor(Math.abs(hours));
- var minutes = Math.floor((Math.abs(hours) * 60) % 60);
- if(hour > 24) {
- hour = hour - 24;
- }
- return (hour < 10 ? "0" : "") + hour + ":" + (minutes < 10 ? "0" : "") + minutes;
- }
-
- var event_instances = get_instances(types, locations, day);
- var schedule_container = document.getElementById('schedule-container');
- schedule_container.innerHTML = '';
-
- var day_table = document.createElement('table');
- schedule_container.appendChild(day_table);
- day_table.classList.add('table');
- day_table.classList.add('day-table');
- day_table_body = document.createElement('tbody');
- day_table.appendChild(day_table_body);
-
- var array_length = (24*60)/CONFIG['schedule_timeslot_length_minutes'];
- var timeslots_ = Array(array_length);
- var timeslots = [];
- for(var i=0; i 0) {
- var type_part = 'type=' + types;
- query = query + type_part + "&";
- }
-
- locations = locations == undefined ? findGetParameter('location') : locations.join(',');
- if(locations != null && locations.length > 0) {
- var location_part = 'location=' + locations;
- query = query + location_part;
- }
-
- history.replaceState({}, '', query);
- setICSButtonHref(query);
-}
-
-function setICSButtonHref(query) {
- // Update ICS button as well
- var ics_button = document.querySelector('#ics-button');
- ics_button.setAttribute('href', CONFIG['ics_button_href'] + query);
-}
-
-function toggleFilterBoxes(types, locations) {
- var type_input = Array.prototype.slice.call(document.querySelectorAll('.event-type-checkbox'));
- type_input.map(function(box) {
- if(types.includes(box.value)) {
- box.checked = true;
- }
- return box;
- });
- var location_input = Array.prototype.slice.call(document.querySelectorAll('.location-checkbox'));
- location_input.map(function(box) {
- if(locations.includes(box.value)) {
- box.checked = true;
- }
- return box;
- });
-}
diff --git a/src/program/templates/noscript_schedule_view.html b/src/program/templates/noscript_schedule_view.html
new file mode 100644
index 00000000..c1dfdda5
--- /dev/null
+++ b/src/program/templates/noscript_schedule_view.html
@@ -0,0 +1,39 @@
+{% extends 'program_base.html' %}
+
+{% load commonmark %}
+{% load staticfiles %}
+
+{% block program_content %}
+
+
+
+
+
+ When? |
+ What? |
+ Where? |
+
+
+
+
+ {% for instance in eventinstances %}
+
+ {% ifchanged instance.when.lower.date %}
+
+ {{ instance.when.lower.date|date:"l Y-m-d" }} |
+
+ {% endifchanged %}
+
+
+ {{ instance.when.lower|date:"H:i" }}-{{ instance.when.upper|date:"H:i" }} |
+ {{ instance.event.title }} |
+ {{ instance.location.name }} |
+
+ {% endfor %}
+
+
+
+
+
+{% endblock %}
+
diff --git a/src/program/templates/schedule_event_detail.html b/src/program/templates/schedule_event_detail.html
index 61b95a70..26cda5e7 100644
--- a/src/program/templates/schedule_event_detail.html
+++ b/src/program/templates/schedule_event_detail.html
@@ -2,34 +2,46 @@
{% load commonmark %}
{% block program_content %}
-
-
{{ event.event_type.name }} {{ event.title }}
-
-
- {{ event.abstract|commonmark }}
-
-
+
-
Instances
-
- {% for ei in event.instances.all %}
- - {{ ei.when.lower|date:"l M. d H:i" }} - {{ ei.when.upper|date:"H:i" }}
- {% empty %}
- No instances scheduled yet
- {% endfor %}
-
+
+
+
{{ event.event_type.name }} {{ event.title }}
+
+
+ {{ event.abstract|commonmark }}
+
-
+
- {% if event.speakers.exists %}
-
Speakers
-
- {% for speaker in event.speakers.all %}
-
+
Instances
+
+ {% for ei in event.instances.all %}
+ - {{ ei.when.lower|date:"l M. d H:i" }} - {{ ei.when.upper|date:"H:i" }}
+ {% empty %}
+ No instances scheduled yet
{% endfor %}
-
- {% endif %}
+
+
+
+
+ {% if event.speakers.exists %}
+
Speakers
+
+ {% for speaker in event.speakers.all %}
+
+ {% endfor %}
+
+ {% endif %}
+
{% endblock program_content %}
diff --git a/src/program/templates/schedule_overview.html b/src/program/templates/schedule_overview.html
index d5a587b7..4aba3379 100644
--- a/src/program/templates/schedule_overview.html
+++ b/src/program/templates/schedule_overview.html
@@ -1,22 +1,44 @@
-{% extends 'schedule_base.html' %}
+{% extends 'program_base.html' %}
{% load commonmark %}
{% load staticfiles %}
-{% block schedule_content %}
+{% block extra_head %}
+
+{% endblock %}
+
+{% block program_content %}
+
+
-
-
+
-{% endblock schedule_content %}
+{% endblock %}
diff --git a/src/program/views.py b/src/program/views.py
index 2f5f40fa..0d829125 100644
--- a/src/program/views.py
+++ b/src/program/views.py
@@ -11,6 +11,7 @@ from django.utils.decorators import method_decorator
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib import messages
from django.urls import reverse
+from django.db.models import Q
import icalendar
@@ -37,27 +38,45 @@ logger = logging.getLogger("bornhack.%s" % __name__)
class ICSView(CampViewMixin, View):
def get(self, request, *args, **kwargs):
eventinstances = models.EventInstance.objects.filter(event__camp=self.camp)
- type_ = request.GET.get('type', None)
- location = request.GET.get('location', None)
- if type_:
- try:
- eventtype = models.EventType.objects.get(
- slug=type_
- )
- eventinstances = eventinstances.filter(event__event_type=eventtype)
- except models.EventType.DoesNotExist:
- raise Http404
+ # Type query
+ type_query = request.GET.get('type', None)
+ if type_query:
+ type_slugs = type_query.split(',')
+ types = models.EventType.objects.filter(
+ slug__in=type_slugs
+ )
+ eventinstances = eventinstances.filter(event__event_type__in=types)
- if location:
- try:
- eventlocation = models.EventLocation.objects.get(
- slug=location,
- camp=self.camp,
- )
- eventinstances = eventinstances.filter(location__slug=location)
- except models.EventLocation.DoesNotExist:
- raise Http404
+ # Location query
+ location_query = request.GET.get('location', None)
+ if location_query:
+ location_slugs = location_query.split(',')
+ locations = models.EventLocation.objects.filter(
+ slug__in=location_slugs,
+ camp=self.camp,
+ )
+ eventinstances = eventinstances.filter(location__in=locations)
+
+ # Video recording query
+ video_query = request.GET.get('video', None)
+ if video_query:
+ video_states = video_query.split(',')
+ query_kwargs = {}
+
+ if 'has-recording' in video_states:
+ query_kwargs['event__video_url__isnull'] = False
+
+ if 'to-be-recorded' in video_states:
+ query_kwargs['event__video_recording'] = True
+
+ if 'not-to-be-recorded' in video_states:
+ if 'event__video_recording' in query_kwargs:
+ del query_kwargs['event__video_recording']
+ else:
+ query_kwargs['event__video_recording'] = False
+
+ eventinstances = eventinstances.filter(**query_kwargs)
cal = icalendar.Calendar()
for event_instance in eventinstances:
@@ -263,57 +282,22 @@ class EventDetailView(CampViewMixin, DetailView):
################## schedule #############################################
+class NoScriptScheduleView(CampViewMixin, TemplateView):
+ template_name = "noscript_schedule_view.html"
+
+ def get_context_data(self, *args, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context['eventinstances'] = models.EventInstance.objects.filter(event__camp=self.camp).order_by('when')
+ return context
+
+
+
class ScheduleView(CampViewMixin, TemplateView):
- def get_template_names(self):
- if 'day' in self.kwargs:
- return 'schedule_day.html'
- return 'schedule_overview.html'
+ template_name = 'schedule_overview.html'
def get_context_data(self, *args, **kwargs):
context = super(ScheduleView, self).get_context_data(**kwargs)
-
- # Do stuff if we are dealing with a day schedule
- if 'day' in kwargs:
- when = datetime.datetime(year=int(self.kwargs['year']), month=int(self.kwargs['month']), day=int(self.kwargs['day']))
- eventinstances = models.EventInstance.objects.filter(event__in=self.camp.events.all())
- skip = []
- for ei in eventinstances:
- if ei.schedule_date != when.date():
- skip.append(ei.id)
- else:
- if 'type' in self.request.GET:
- eventtype = models.EventType.objects.get(
- slug=self.request.GET['type']
- )
- if ei.event.event_type != eventtype:
- skip.append(ei.id)
- eventinstances = eventinstances.exclude(id__in=skip).order_by('event__event_type')
- if 'location' in self.request.GET:
- eventlocation = models.EventLocation.objects.get(
- camp=self.camp,
- slug=self.request.GET['location']
- )
- eventinstances = eventinstances.filter(location=eventlocation)
-
- context['eventinstances'] = eventinstances
-
- start = when + datetime.timedelta(hours=settings.SCHEDULE_MIDNIGHT_OFFSET_HOURS)
- timeslots = []
- # calculate how many timeslots we have in the schedule based on the lenght of the timeslots in minutes,
- # and the number of minutes in 24 hours
- for i in range(0,int((24*60)/settings.SCHEDULE_TIMESLOT_LENGTH_MINUTES)):
- timeslot = start + datetime.timedelta(minutes=i*settings.SCHEDULE_TIMESLOT_LENGTH_MINUTES)
- timeslots.append(timeslot)
- context['timeslots'] = timeslots
-
- # include the components to make the urls
- context['urlyear'] = self.kwargs['year']
- context['urlmonth'] = self.kwargs['month']
- context['urlday'] = self.kwargs['day']
-
- context['schedule_timeslot_length_minutes'] = settings.SCHEDULE_TIMESLOT_LENGTH_MINUTES;
context['schedule_midnight_offset_hours'] = settings.SCHEDULE_MIDNIGHT_OFFSET_HOURS;
-
return context
diff --git a/src/shop/admin.py b/src/shop/admin.py
index cb68b1f2..56520184 100644
--- a/src/shop/admin.py
+++ b/src/shop/admin.py
@@ -10,6 +10,7 @@ admin.site.register(models.CoinifyAPIRequest)
admin.site.register(models.Invoice)
admin.site.register(models.CreditNote)
+
@admin.register(models.CustomOrder)
class CustomOrderAdmin(admin.ModelAdmin):
list_display = [
@@ -25,6 +26,7 @@ class CustomOrderAdmin(admin.ModelAdmin):
'paid',
]
+
@admin.register(models.ProductCategory)
class ProductCategoryAdmin(admin.ModelAdmin):
list_display = [
@@ -37,6 +39,7 @@ class ProductAdmin(admin.ModelAdmin):
list_display = [
'name',
'category',
+ 'ticket_type',
'price',
'available_in',
]
@@ -115,7 +118,6 @@ class TicketModelAdmin(admin.ModelAdmin):
list_filter = ['product', 'checked_in']
-
actions = ['mark_as_arrived']
def mark_as_arrived(self, request, queryset):
diff --git a/src/shop/invoiceworker.py b/src/shop/invoiceworker.py
index 52ce8e45..5ada3ff8 100644
--- a/src/shop/invoiceworker.py
+++ b/src/shop/invoiceworker.py
@@ -1,5 +1,5 @@
from django.core.files import File
-from shop.pdf import generate_pdf_letter
+from utils.pdf import generate_pdf_letter
from shop.email import add_invoice_email, add_creditnote_email
from shop.models import Order, CustomOrder, Invoice, CreditNote
import logging
diff --git a/src/shop/migrations/0048_product_ticket_type.py b/src/shop/migrations/0048_product_ticket_type.py
new file mode 100644
index 00000000..97c36ff6
--- /dev/null
+++ b/src/shop/migrations/0048_product_ticket_type.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.5 on 2017-08-17 14:22
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('tickets', '0001_initial'),
+ ('shop', '0047_auto_20170522_1942'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='product',
+ name='ticket_type',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='tickets.TicketType'),
+ ),
+ ]
diff --git a/src/shop/models.py b/src/shop/models.py
index e0d6e687..5b314554 100644
--- a/src/shop/models.py
+++ b/src/shop/models.py
@@ -1,21 +1,28 @@
+import io
+import logging
+import hashlib
+import base64
+import qrcode
+
from django.conf import settings
from django.db import models
from django.db.models.aggregates import Sum
from django.contrib import messages
from django.contrib.postgres.fields import DateTimeRangeField, JSONField
-from django.http import HttpResponse
from django.utils.text import slugify
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
from django.core.urlresolvers import reverse_lazy
-from utils.models import UUIDModel, CreatedUpdatedModel
-from .managers import ProductQuerySet, OrderQuerySet
-import hashlib, io, base64, qrcode
from decimal import Decimal
from datetime import timedelta
from unidecode import unidecode
from django.utils.dateparse import parse_datetime
-from django.utils import timezone
+
+from utils.models import UUIDModel, CreatedUpdatedModel
+from tickets.models import ShopTicket
+from .managers import ProductQuerySet, OrderQuerySet
+
+logger = logging.getLogger("bornhack.%s" % __name__)
class CustomOrder(CreatedUpdatedModel):
@@ -77,7 +84,7 @@ class Order(CreatedUpdatedModel):
CREDIT_CARD = 'credit_card'
BLOCKCHAIN = 'blockchain'
BANK_TRANSFER = 'bank_transfer'
- CASH = 'cash'
+ CASH = 'cash'
PAYMENT_METHODS = [
CREDIT_CARD,
@@ -115,7 +122,6 @@ class Order(CreatedUpdatedModel):
blank=True,
)
-
objects = OrderQuerySet.as_manager()
def __str__(self):
@@ -176,7 +182,8 @@ class Order(CreatedUpdatedModel):
for order_product in self.orderproductrelation_set.all():
if order_product.product.category.name == "Tickets":
for _ in range(0, order_product.quantity):
- ticket = Ticket(
+ ticket = ShopTicket(
+ ticket_type=order_product.product.ticket_type,
order=self,
product=order_product.product,
)
@@ -291,6 +298,12 @@ class Product(CreatedUpdatedModel, UUIDModel):
)
)
+ ticket_type = models.ForeignKey(
+ 'tickets.TicketType',
+ null=True,
+ blank=True
+ )
+
objects = ProductQuerySet.as_manager()
def __str__(self):
@@ -514,4 +527,3 @@ class Ticket(CreatedUpdatedModel, UUIDModel):
def get_absolute_url(self):
return str(reverse_lazy('shop:ticket_detail', kwargs={'pk': self.pk}))
-
diff --git a/src/static_src/css/bornhack.css b/src/static_src/css/bornhack.css
index 4effe2f4..84b3c188 100644
--- a/src/static_src/css/bornhack.css
+++ b/src/static_src/css/bornhack.css
@@ -1,6 +1,7 @@
body {
margin-top: 85px;
margin-bottom: 35px;
+ overflow: scroll;
}
* {
@@ -148,27 +149,43 @@ footer {
.event {
padding: 5px;
vertical-align: top;
- margin: 5px;
- width: 200px;
- max-width: 200px;
- min-width: 200px;
- min-height: 100px;
flex-grow: 1;
border: 1px solid black;
cursor: pointer;
}
-.event-td {
- padding: 5px;
- vertical-align: top;
+.event-in-overview {
+ min-height: 100px;
+ margin: 5px;
max-width: 200px;
min-width: 200px;
- flex-grow: 1;
- cursor: pointer;
}
-.event-td a {
- display: block;
+.location-column {
+ position: relative;
+ margin: 0 2px;
+ background-color: #f5f5f5;
+}
+
+.location-column-header {
+ text-align: center;
+ font-weight: bold;
+ line-height: 50px;
+ font-size: 20px;
+ background-color: #eee;
+ border-bottom: 1px solid #fff;
+}
+
+.location-column-slot {
+ border-bottom: 1px solid #fff;
+}
+
+.day-view-gutter {
+ text-align: right;
+}
+
+.event-in-dayview {
+ position: absolute;
}
@@ -179,16 +196,12 @@ footer {
}
}
-.event:hover, .event-td:hover {
+.event:hover {
background-color: black !important;
color: white !important;
text-decoration: none !important;
}
-.event-td a:hover {
- text-decoration: none !important;
-}
-
.fa-select {
font-family: 'FontAwesome','Helvetica Neue',Helvetica,Arial,sans-serif;
}
@@ -208,13 +221,28 @@ footer {
padding: 0;
}
+.schedule-filter .btn {
+ width: 100%;
+ text-align: left;
+}
+
@media (min-width: 520px) {
- .schedule-filter {
+ .schedule-sidebar {
border-left: 1px solid #eee;
}
}
+.sticky {
+ position: sticky;
+ background-color: #fff;
+ z-index: 9999;
+}
+
+#daypicker {
+ top: 80px;
+}
+
#schedule-days {
list-style: none;
padding: 0;
@@ -231,28 +259,7 @@ footer {
flex-wrap: wrap;
}
-.form-group .schedule-checkbox {
- display: none;
- }
-
-.form-group input[type="checkbox"] + .btn-group > label span {
- width: 20px;
-}
-
-.form-group input[type="checkbox"] + .btn-group > label span i:first-child {
- display: none;
-}
-.form-group input[type="checkbox"] + .btn-group > label span i:last-child {
- display: inline-block;
-}
-
-.form-group input[type="checkbox"]:checked + .btn-group > label span i:first-child {
- display: inline-block;
-}
-.form-group input[type="checkbox"]:checked + .btn-group > label span i:last-child {
- display: none;
-}
-.form-group input[type="checkbox"]:checked + .btn-group > label {
+.filter-choice-active {
color: #333;
background-color: #e6e6e6;
border-color: #adadad;
diff --git a/src/tickets/__init__.py b/src/tickets/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/tickets/admin.py b/src/tickets/admin.py
new file mode 100644
index 00000000..2939c751
--- /dev/null
+++ b/src/tickets/admin.py
@@ -0,0 +1,38 @@
+from django.contrib import admin
+
+from .models import (
+ TicketType,
+ SponsorTicket,
+ DiscountTicket,
+ ShopTicket
+)
+
+
+class BaseTicketAdmin(admin.ModelAdmin):
+ actions = ['generate_pdf']
+ exclude = ['qrcode_base64']
+
+ def generate_pdf(self, request, queryset):
+ for ticket in queryset.all():
+ ticket.generate_pdf()
+ generate_pdf.description = 'Generate PDF for the ticket'
+
+
+@admin.register(TicketType)
+class TicketTypeAdmin(admin.ModelAdmin):
+ pass
+
+
+@admin.register(SponsorTicket)
+class SponsorTicketAdmin(BaseTicketAdmin):
+ pass
+
+
+@admin.register(DiscountTicket)
+class DiscountTicketAdmin(BaseTicketAdmin):
+ pass
+
+
+@admin.register(ShopTicket)
+class ShopTicketAdmin(BaseTicketAdmin):
+ pass
diff --git a/src/tickets/apps.py b/src/tickets/apps.py
new file mode 100644
index 00000000..3ea742ac
--- /dev/null
+++ b/src/tickets/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class TicketsConfig(AppConfig):
+ name = 'tickets'
diff --git a/src/tickets/migrations/0001_initial.py b/src/tickets/migrations/0001_initial.py
new file mode 100644
index 00000000..bd4e36b5
--- /dev/null
+++ b/src/tickets/migrations/0001_initial.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.5 on 2017-08-17 14:22
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+import uuid
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ('shop', '0047_auto_20170522_1942'),
+ ('camps', '0022_camp_colour'),
+ ('sponsors', '0006_auto_20170715_1110'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='BaseTicket',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('qrcode_base64', models.TextField(blank=True, null=True)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='TicketType',
+ fields=[
+ ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
+ ('created', models.DateTimeField(auto_now_add=True)),
+ ('updated', models.DateTimeField(auto_now=True)),
+ ('name', models.TextField()),
+ ],
+ options={
+ 'abstract': False,
+ },
+ ),
+ migrations.CreateModel(
+ name='DiscountTicket',
+ fields=[
+ ('baseticket_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, to='tickets.BaseTicket')),
+ ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
+ ('created', models.DateTimeField(auto_now_add=True)),
+ ('updated', models.DateTimeField(auto_now=True)),
+ ('price', models.IntegerField(help_text='Price of the discounted ticket (in DKK, including VAT).')),
+ ],
+ options={
+ 'abstract': False,
+ },
+ bases=('tickets.baseticket', models.Model),
+ ),
+ migrations.CreateModel(
+ name='ShopTicket',
+ fields=[
+ ('baseticket_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, to='tickets.BaseTicket')),
+ ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
+ ('created', models.DateTimeField(auto_now_add=True)),
+ ('updated', models.DateTimeField(auto_now=True)),
+ ('name', models.CharField(blank=True, help_text='Name of the person this ticket belongs to. This can be different from the buying user.', max_length=100, null=True)),
+ ('email', models.EmailField(blank=True, max_length=254, null=True)),
+ ('checked_in', models.BooleanField(default=False)),
+ ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='shoptickets', to='shop.Order')),
+ ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shop.Product')),
+ ],
+ options={
+ 'abstract': False,
+ },
+ bases=('tickets.baseticket', models.Model),
+ ),
+ migrations.CreateModel(
+ name='SponsorTicket',
+ fields=[
+ ('baseticket_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, to='tickets.BaseTicket')),
+ ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
+ ('created', models.DateTimeField(auto_now_add=True)),
+ ('updated', models.DateTimeField(auto_now=True)),
+ ('sponsor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sponsors.Sponsor')),
+ ],
+ options={
+ 'abstract': False,
+ },
+ bases=('tickets.baseticket', models.Model),
+ ),
+ migrations.AddField(
+ model_name='baseticket',
+ name='camp',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='camps.Camp'),
+ ),
+ migrations.AddField(
+ model_name='baseticket',
+ name='ticket_type',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tickets.TicketType'),
+ ),
+ ]
diff --git a/src/tickets/migrations/__init__.py b/src/tickets/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/tickets/models.py b/src/tickets/models.py
new file mode 100644
index 00000000..1f59a4cb
--- /dev/null
+++ b/src/tickets/models.py
@@ -0,0 +1,128 @@
+import io
+import logging
+import hashlib
+import base64
+import qrcode
+
+from django.db import models
+from django.conf import settings
+from django.core.urlresolvers import reverse_lazy
+from django.utils.translation import ugettext_lazy as _
+
+from utils.models import (
+ UUIDModel,
+ CreatedUpdatedModel
+)
+from utils.pdf import generate_pdf_letter
+
+logger = logging.getLogger("bornhack.%s" % __name__)
+
+
+# TicketType can be full week, one day. etc.
+class TicketType(CreatedUpdatedModel, UUIDModel):
+ name = models.TextField()
+
+ def __str__(self):
+ return '{}'.format(self.name)
+
+
+class BaseTicket(models.Model):
+ qrcode_base64 = models.TextField(null=True, blank=True)
+ ticket_type = models.ForeignKey('TicketType')
+ camp = models.ForeignKey('camps.Camp')
+
+ def save(self, **kwargs):
+ super(BaseTicket, self).save(**kwargs)
+ self.qrcode_base64 = self.get_qr_code()
+ super(BaseTicket, self).save(**kwargs)
+
+ def _get_token(self):
+ return hashlib.sha256(
+ '{_id}{secret_key}'.format(
+ _id=self.pk,
+ secret_key=settings.SECRET_KEY,
+ ).encode('utf-8')
+ ).hexdigest()
+
+ def get_qr_code(self):
+ qr = qrcode.make(
+ self._get_token(),
+ version=1,
+ error_correction=qrcode.constants.ERROR_CORRECT_H
+ ).resize((250, 250))
+ file_like = io.BytesIO()
+ qr.save(file_like, format='png')
+ qrcode_base64 = base64.b64encode(file_like.getvalue())
+ return qrcode_base64
+
+ def get_qr_code_url(self):
+ return 'data:image/png;base64,{}'.format(self.qrcode_base64)
+
+ def generate_pdf(self):
+ generate_pdf_letter(
+ filename='ticket_{}.pdf'.format(self.pk),
+ formatdict={'ticket': self},
+ template='pdf/ticket.html'
+ )
+
+
+class SponsorTicket(BaseTicket, CreatedUpdatedModel, UUIDModel):
+ sponsor = models.ForeignKey('sponsors.Sponsor')
+
+ def __str__(self):
+ return 'SponsorTicket: {}'.format(self.pk)
+
+
+class DiscountTicket(BaseTicket, CreatedUpdatedModel, UUIDModel):
+ price = models.IntegerField(
+ help_text=_('Price of the discounted ticket (in DKK, including VAT).')
+ )
+
+ def __str__(self):
+ return 'DiscountTicket: {}'.format(self.pk)
+
+
+class ShopTicket(BaseTicket, CreatedUpdatedModel, UUIDModel):
+ order = models.ForeignKey('shop.Order', related_name='shoptickets')
+ product = models.ForeignKey('shop.Product')
+
+ name = models.CharField(
+ max_length=100,
+ help_text=(
+ 'Name of the person this ticket belongs to. '
+ 'This can be different from the buying user.'
+ ),
+ null=True,
+ blank=True,
+ )
+
+ email = models.EmailField(
+ null=True,
+ blank=True,
+ )
+
+ checked_in = models.BooleanField(default=False)
+
+ # overwrite the _get_token method because old tickets use the user_id
+ def _get_token(self):
+ return hashlib.sha256(
+ '{_id}{user_id}{secret_key}'.format(
+ _id=self.pk,
+ user_id=self.order.user.pk,
+ secret_key=settings.SECRET_KEY,
+ ).encode('utf-8')
+ ).hexdigest()
+
+ def __str__(self):
+ return 'Ticket {user} {product}'.format(
+ user=self.order.user,
+ product=self.product
+ )
+
+ def save(self, **kwargs):
+ super(ShopTicket, self).save(**kwargs)
+ self.qrcode_base64 = self.get_qr_code()
+ super(ShopTicket, self).save(**kwargs)
+
+ def get_absolute_url(self):
+ return str(reverse_lazy('shop:ticket_detail', kwargs={'pk': self.pk}))
diff --git a/src/tickets/pdf.py b/src/tickets/pdf.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/tickets/templates/pdf/ticket.html b/src/tickets/templates/pdf/ticket.html
new file mode 100644
index 00000000..556c7d4a
--- /dev/null
+++ b/src/tickets/templates/pdf/ticket.html
@@ -0,0 +1,32 @@
+{% load static from staticfiles %}
+
+
+
+
+ |
+
+
+ {{ ticket.created|date:"b jS, Y" }}
+
+ |
+
+
+
+
{{ ticket.camp.title }} Ticket
+
Type: {{ ticket.ticket_type }}
+
+{% if ticket.name %}
+
Participant: {{ ticket.name }}
+
+{% elif ticket.order.user.email %}
+
Participant: {{ ticket.order.user.email }}
+
+{% elif ticket.sponsor %}
+
Sponsor: {{ ticket.sponsor.name }}
+
+{% endif %}
+
+
+
+ Ticket #{{ ticket.pk }}
+
diff --git a/src/tickets/views.py b/src/tickets/views.py
new file mode 100644
index 00000000..91ea44a2
--- /dev/null
+++ b/src/tickets/views.py
@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.
diff --git a/src/utils/management/commands/bootstrap-devsite.py b/src/utils/management/commands/bootstrap-devsite.py
index 7d04cfda..7a6f6c9d 100644
--- a/src/utils/management/commands/bootstrap-devsite.py
+++ b/src/utils/management/commands/bootstrap-devsite.py
@@ -51,6 +51,7 @@ class Command(BaseCommand):
timezone.datetime(2016, 9, 4, 12, 0, tzinfo=timezone.utc),
timezone.datetime(2016, 9, 6, 12, 0, tzinfo=timezone.utc),
),
+ colour='#000000',
)
camp2017 = Camp.objects.create(
@@ -69,6 +70,7 @@ class Command(BaseCommand):
timezone.datetime(2017, 9, 4, 12, 0, tzinfo=timezone.utc),
timezone.datetime(2017, 9, 6, 12, 0, tzinfo=timezone.utc),
),
+ colour='#000000',
)
camp2018 = Camp.objects.create(
@@ -87,6 +89,7 @@ class Command(BaseCommand):
timezone.datetime(2018, 9, 4, 12, 0, tzinfo=timezone.utc),
timezone.datetime(2018, 9, 6, 12, 0, tzinfo=timezone.utc),
),
+ colour='#000000',
)
self.output("Creating users...")
diff --git a/src/shop/pdf.py b/src/utils/pdf.py
similarity index 90%
rename from src/shop/pdf.py
rename to src/utils/pdf.py
index 32cafc92..1d943d94 100644
--- a/src/shop/pdf.py
+++ b/src/utils/pdf.py
@@ -1,11 +1,12 @@
+import logging
+import io
+import os
+
from django.contrib.auth.models import AnonymousUser
from wkhtmltopdf.views import PDFTemplateResponse
from PyPDF2 import PdfFileWriter, PdfFileReader
from django.test.client import RequestFactory
from django.conf import settings
-import logging
-import io
-import os
logger = logging.getLogger("bornhack.%s" % __name__)
@@ -36,7 +37,14 @@ def generate_pdf_letter(filename, template, formatdict):
# get watermark from watermark file
watermark = PdfFileReader(
- open(os.path.join(settings.STATICFILES_DIRS[0], 'pdf', settings.PDF_LETTERHEAD_FILENAME), 'rb')
+ open(
+ os.path.join(
+ settings.STATICFILES_DIRS[0],
+ 'pdf',
+ settings.PDF_LETTERHEAD_FILENAME
+ ),
+ 'rb'
+ )
)
# add the watermark to all pages
@@ -60,4 +68,3 @@ def generate_pdf_letter(filename, template, formatdict):
returnfile = io.BytesIO()
finalpdf.write(returnfile)
return returnfile
-