Coverage Report
Generated on 06 Oct 18 19:42 -0700 with gocov-html
Report Overview
github.com/hunterlong/statup/cmd31.37%48/153
github.com/hunterlong/statup/core53.01%485/915
github.com/hunterlong/statup/core/notifier72.73%152/209
github.com/hunterlong/statup/handlers64.61%617/955
github.com/hunterlong/statup/notifiers7.14%18/252
github.com/hunterlong/statup/plugin33.33%1/3
github.com/hunterlong/statup/source77.71%136/175
github.com/hunterlong/statup/utils55.29%115/208
Report Total54.77%1572/2870
Package Overview: github.com/hunterlong/statup/cmd 31.37%

This is a coverage report created after analysis of the github.com/hunterlong/statup/cmd package. It has been generated with the following command:

gocov test github.com/hunterlong/statup/cmd | gocov-html

Here are the stats. Please select a function name to view its implementation and see what's left for testing.

HelpEcho(...)github.com/hunterlong/statup/cmd/cli.go100.00%17/17
init(...)github.com/hunterlong/statup/cmd/main.go100.00%1/1
LoadDotEnvs(...)github.com/hunterlong/statup/cmd/main.go60.00%3/5
CatchCLI(...)github.com/hunterlong/statup/cmd/cli.go44.26%27/61
main(...)github.com/hunterlong/statup/cmd/main.go0.00%0/22
RunOnce(...)github.com/hunterlong/statup/cmd/cli.go0.00%0/17
mainProcess(...)github.com/hunterlong/statup/cmd/main.go0.00%0/14
CheckGithubUpdates(...)github.com/hunterlong/statup/cmd/cli.go0.00%0/10
parseFlags(...)github.com/hunterlong/statup/cmd/main.go0.00%0/5
ForEachPlugin(...)github.com/hunterlong/statup/cmd/main.go0.00%0/1
LoadPlugins(...)github.com/hunterlong/statup/cmd/main.go0.00%0/0
github.com/hunterlong/statup/cmd31.37%48/153
func HelpEcho
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/cli.go:

152
func HelpEcho() {
153
        fmt.Printf("Statup v%v - Statup.io\n", VERSION)
154
        fmt.Printf("A simple Application Status Monitor that is opensource and lightweight.\n")
155
        fmt.Printf("Commands:\n")
156
        fmt.Println("     statup                    - Main command to run Statup server")
157
        fmt.Println("     statup version            - Returns the current version of Statup")
158
        fmt.Println("     statup run                - Check all services 1 time and then quit")
159
        fmt.Println("     statup test plugins       - Test all plugins for required information")
160
        fmt.Println("     statup assets             - Dump all assets used locally to be edited.")
161
        fmt.Println("     statup sass               - Compile .scss files into the css directory")
162
        fmt.Println("     statup env                - Show all environment variables being used for Statup")
163
        fmt.Println("     statup export             - Exports the index page as a static HTML for pushing")
164
        fmt.Println("     statup update             - Attempts to update to the latest version")
165
        fmt.Println("     statup help               - Shows the user basic information about Statup")
166
        fmt.Printf("Flags:\n")
167
        fmt.Println("     -ip 127.0.0.1             - Run HTTP server on specific IP address (default: localhost)")
168
        fmt.Println("     -port 8080                - Run HTTP server on Port (default: 8080)")
169
        fmt.Println("Give Statup a Star at https://github.com/hunterlong/statup")
170
}
func init
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/main.go:

39
func init() {
40
        core.VERSION = VERSION
41
}
func LoadDotEnvs
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/main.go:

86
func LoadDotEnvs() error {
87
        err := godotenv.Load()
88
        if err == nil {
89
                utils.Log(1, "Environment file '.env' Loaded")
90
                usingEnv = true
91
        }
92
        return err
93
}
func CatchCLI
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/cli.go:

33
func CatchCLI(args []string) error {
34
        dir := utils.Directory
35
        utils.InitLogs()
36
        source.Assets()
37
        LoadDotEnvs()
38
39
        switch args[0] {
40
        case "app":
41
                handlers.DesktopInit(ipAddress, port)
42
        case "version":
43
                if COMMIT != "" {
44
                        fmt.Printf("Statup v%v (%v)\n", VERSION, COMMIT)
45
                } else {
46
                        fmt.Printf("Statup v%v\n", VERSION)
47
                }
48
                return errors.New("end")
49
        case "assets":
50
                err := source.CreateAllAssets(dir)
51
                if err != nil {
52
                        return err
53
                } else {
54
                        return errors.New("end")
55
                }
56
        case "sass":
57
                utils.InitLogs()
58
                source.Assets()
59
                err := source.CompileSASS(dir)
60
                if err == nil {
61
                        return errors.New("end")
62
                }
63
                return err
64
        case "update":
65
                gitCurrent, err := CheckGithubUpdates()
66
                if err != nil {
67
                        return nil
68
                }
69
                fmt.Printf("Statup Version: v%v\nLatest Version: %v\n", VERSION, gitCurrent.TagName)
70
                if VERSION != gitCurrent.TagName[1:] {
71
                        fmt.Printf("You don't have the latest version v%v!\nDownload the latest release at: https://github.com/hunterlong/statup\n", gitCurrent.TagName[1:])
72
                } else {
73
                        fmt.Printf("You have the latest version of Statup!\n")
74
                }
75
                if err == nil {
76
                        return errors.New("end")
77
                }
78
                return nil
79
        case "test":
80
                cmd := args[1]
81
                switch cmd {
82
                case "plugins":
83
                        LoadPlugins(true)
84
                }
85
                return errors.New("end")
86
        case "export":
87
                var err error
88
                fmt.Printf("Statup v%v Exporting Static 'index.html' page...\n", VERSION)
89
                core.Configs, err = core.LoadConfig(dir)
90
                if err != nil {
91
                        utils.Log(4, "config.yml file not found")
92
                        return err
93
                }
94
                indexSource := core.ExportIndexHTML()
95
                err = core.SaveFile("./index.html", []byte(indexSource))
96
                if err != nil {
97
                        utils.Log(4, err)
98
                        return err
99
                }
100
                utils.Log(1, "Exported Statup index page: 'index.html'")
101
        case "help":
102
                HelpEcho()
103
                return errors.New("end")
104
        case "run":
105
                utils.Log(1, "Running 1 time and saving to database...")
106
                RunOnce()
107
                fmt.Println("Check is complete.")
108
                return errors.New("end")
109
        case "env":
110
                fmt.Println("Statup Environment Variables")
111
                envs, err := godotenv.Read(".env")
112
                if err != nil {
113
                        utils.Log(4, "No .env file found in current directory.")
114
                        return err
115
                }
116
                for k, e := range envs {
117
                        fmt.Printf("%v=%v\n", k, e)
118
                }
119
        default:
120
                return nil
121
        }
122
        return errors.New("end")
123
}
func main
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/main.go:

55
func main() {
56
        var err error
57
        parseFlags()
58
        LoadDotEnvs()
59
        source.Assets()
60
        utils.InitLogs()
61
        args := flag.Args()
62
63
        if len(args) >= 1 {
64
                err := CatchCLI(args)
65
                if err != nil {
66
                        if err.Error() == "end" {
67
                                os.Exit(0)
68
                        }
69
                        fmt.Println(err)
70
                        os.Exit(1)
71
                }
72
        }
73
        utils.Log(1, fmt.Sprintf("Starting Statup v%v", VERSION))
74
        core.Configs, err = core.LoadConfig(utils.Directory)
75
        if err != nil {
76
                utils.Log(3, err)
77
                core.SetupMode = true
78
                fmt.Println(handlers.RunHTTPServer(ipAddress, port))
79
                os.Exit(1)
80
        }
81
        defer core.CloseDB()
82
        mainProcess()
83
}
func RunOnce
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/cli.go:

126
func RunOnce() {
127
        var err error
128
        core.Configs, err = core.LoadConfig(utils.Directory)
129
        if err != nil {
130
                utils.Log(4, "config.yml file not found")
131
        }
132
        err = core.Configs.Connect(false, utils.Directory)
133
        if err != nil {
134
                utils.Log(4, err)
135
        }
136
        core.CoreApp, err = core.SelectCore()
137
        if err != nil {
138
                fmt.Println("Core database was not found, Statup is not setup yet.")
139
        }
140
        core.CoreApp.SelectAllServices()
141
        if err != nil {
142
                utils.Log(4, err)
143
        }
144
        for _, out := range core.CoreApp.Services {
145
                service := out.Select()
146
                out.Check(true)
147
                fmt.Printf("    Service %v | URL: %v | Latency: %0.0fms | Online: %v\n", service.Name, service.Domain, (service.Latency * 1000), service.Online)
148
        }
149
}
func mainProcess
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/main.go:

96
func mainProcess() {
97
        dir := utils.Directory
98
        var err error
99
        core.Configs, err = core.LoadConfig(dir)
100
        if err != nil {
101
                utils.Log(4, fmt.Sprintf("could not load config.yml %v", err))
102
        }
103
        err = core.Configs.Connect(false, dir)
104
        if err != nil {
105
                utils.Log(4, fmt.Sprintf("could not connect to database: %v", err))
106
        }
107
        core.Configs.MigrateDatabase()
108
        core.InitApp()
109
        if !core.SetupMode {
110
                LoadPlugins(false)
111
                fmt.Println(handlers.RunHTTPServer(ipAddress, port))
112
                os.Exit(1)
113
        }
114
}
func CheckGithubUpdates
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/cli.go:

306
func CheckGithubUpdates() (GithubResponse, error) {
307
        var gitResp GithubResponse
308
        response, err := http.Get("https://api.github.com/repos/hunterlong/statup/releases/latest")
309
        if err != nil {
310
                return GithubResponse{}, err
311
        }
312
        defer response.Body.Close()
313
        contents, err := ioutil.ReadAll(response.Body)
314
        if err != nil {
315
                return GithubResponse{}, err
316
        }
317
        err = json.Unmarshal(contents, &gitResp)
318
        return gitResp, err
319
}
func parseFlags
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/main.go:

46
func parseFlags() {
47
        ip := flag.String("ip", "0.0.0.0", "IP address to run the Statup HTTP server")
48
        p := flag.Int("port", 8080, "Port to run the HTTP server")
49
        flag.Parse()
50
        ipAddress = *ip
51
        port = *p
52
}
func ForEachPlugin
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/main.go:

116
func ForEachPlugin() {
117
        if len(core.CoreApp.Plugins) > 0 {
118
                //for _, p := range core.Plugins {
119
                //        p.OnShutdown()
120
                //}
121
        }
122
}
func LoadPlugins
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/main.go:

124
func LoadPlugins(debug bool) {
125
        //utils.Log(1, fmt.Sprintf("Loading any available Plugins from /plugins directory"))
126
        //if _, err := os.Stat("./plugins"); os.IsNotExist(err) {
127
        //        os.Mkdir("./plugins", os.ModePerm)
128
        //}
129
        //
130
        ////ForEachPlugin()
131
        //files, err := ioutil.ReadDir("./plugins")
132
        //if err != nil {
133
        //        utils.Log(2, fmt.Sprintf("Plugins directory was not found. Error: %v\n", err))
134
        //        return
135
        //}
136
        //for _, f := range files {
137
        //        utils.Log(1, fmt.Sprintf("Attempting to load plugin '%v'", f.Name()))
138
        //        ext := strings.Split(f.Name(), ".")
139
        //        if len(ext) != 2 {
140
        //                utils.Log(3, fmt.Sprintf("Plugin '%v' must end in .so extension", f.Name()))
141
        //                continue
142
        //        }
143
        //        if ext[1] != "so" {
144
        //                utils.Log(3, fmt.Sprintf("Plugin '%v' must end in .so extension", f.Name()))
145
        //                continue
146
        //        }
147
        //        plug, err := plg.Open("plugins/" + f.Name())
148
        //        if err != nil {
149
        //                utils.Log(3, fmt.Sprintf("Plugin '%v' could not load correctly. %v", f.Name(), err))
150
        //                continue
151
        //        }
152
        //        symPlugin, err := plug.Lookup("Plugin")
153
        //        if err != nil {
154
        //                utils.Log(3, fmt.Sprintf("Plugin '%v' could not load correctly. %v", f.Name(), err))
155
        //                continue
156
        //        }
157
        //
158
        //        if debug {
159
        //                utils.Log(1, fmt.Sprintf("Plugin '%v' struct:", f.Name()))
160
        //                utils.Log(1, structs.Map(symPlugin))
161
        //        }
162
        //
163
        //        var plugActions types.PluginActions
164
        //        plugActions, ok := symPlugin.(types.PluginActions)
165
        //        if !ok {
166
        //                utils.Log(3, fmt.Sprintf("Plugin '%v' could not load correctly, error: %v", f.Name(), err))
167
        //                if debug {
168
        //                        //fmt.Println(symPlugin.(plugin.PluginActions))
169
        //                }
170
        //                continue
171
        //        }
172
        //
173
        //        if debug {
174
        //                TestPlugin(plugActions)
175
        //        } else {
176
        //                plugActions.OnLoad(*core.DbSession)
177
        //                core.CoreApp.Plugins = append(core.CoreApp.Plugins, plugActions.GetInfo())
178
        //                core.CoreApp.AllPlugins = append(core.CoreApp.AllPlugins, plugActions)
179
        //        }
180
        //}
181
        //if !debug {
182
        //        utils.Log(1, fmt.Sprintf("Loaded %v Plugins\n", len(core.CoreApp.Plugins)))
183
        //}
184
}
Package Overview: github.com/hunterlong/statup/core 53.01%

This is a coverage report created after analysis of the github.com/hunterlong/statup/core package. It has been generated with the following command:

gocov test github.com/hunterlong/statup/core | gocov-html

Here are the stats. Please select a function name to view its implementation and see what's left for testing.

InsertLargeSampleData(...)github.com/hunterlong/statup/core/sample.go100.00%27/27
InsertSampleData(...)github.com/hunterlong/statup/core/sample.go100.00%22/22
Service.CheckQueue(...)github.com/hunterlong/statup/core/checker.go100.00%13/13
DbConfig.CreateDatabase(...)github.com/hunterlong/statup/core/database.go100.00%11/11
Service.dnsCheck(...)github.com/hunterlong/statup/core/checker.go100.00%11/11
DbConfig.DropDatabase(...)github.com/hunterlong/statup/core/database.go100.00%10/10
insertHitRecords(...)github.com/hunterlong/statup/core/sample.go100.00%10/10
insertFailureRecords(...)github.com/hunterlong/statup/core/sample.go100.00%8/8
recordSuccess(...)github.com/hunterlong/statup/core/checker.go100.00%6/6
Core.CountOnline(...)github.com/hunterlong/statup/core/services.go100.00%5/5
recordFailure(...)github.com/hunterlong/statup/core/checker.go100.00%5/5
Service.LimitedFailures(...)github.com/hunterlong/statup/core/failures.go100.00%4/4
Service.TotalHitsSince(...)github.com/hunterlong/statup/core/hits.go100.00%4/4
Service.TotalHits(...)github.com/hunterlong/statup/core/hits.go100.00%4/4
Service.TotalFailuresSince(...)github.com/hunterlong/statup/core/failures.go100.00%4/4
Service.Hits(...)github.com/hunterlong/statup/core/hits.go100.00%4/4
User.Update(...)github.com/hunterlong/statup/core/users.go100.00%4/4
Service.LimitedHits(...)github.com/hunterlong/statup/core/hits.go100.00%4/4
insertSampleUsers(...)github.com/hunterlong/statup/core/sample.go100.00%4/4
NewCore(...)github.com/hunterlong/statup/core/core.go100.00%4/4
SelectUsername(...)github.com/hunterlong/statup/core/users.go100.00%4/4
Checkin.Hits(...)github.com/hunterlong/statup/core/checkin.go100.00%3/3
insertSampleCore(...)github.com/hunterlong/statup/core/sample.go100.00%3/3
reverseHits(...)github.com/hunterlong/statup/core/hits.go100.00%3/3
Service.Check(...)github.com/hunterlong/statup/core/checker.go100.00%3/3
SelectUser(...)github.com/hunterlong/statup/core/users.go100.00%3/3
Service.Checkins(...)github.com/hunterlong/statup/core/services.go100.00%3/3
Checkin.Last(...)github.com/hunterlong/statup/core/checkin.go100.00%3/3
Checkin.BeforeCreate(...)github.com/hunterlong/statup/core/database.go100.00%3/3
Failure.AfterFind(...)github.com/hunterlong/statup/core/database.go100.00%2/2
Service.AfterFind(...)github.com/hunterlong/statup/core/database.go100.00%2/2
CheckHash(...)github.com/hunterlong/statup/core/users.go100.00%2/2
User.AfterFind(...)github.com/hunterlong/statup/core/database.go100.00%2/2
CheckinHit.AfterFind(...)github.com/hunterlong/statup/core/database.go100.00%2/2
Checkin.Grace(...)github.com/hunterlong/statup/core/checkin.go100.00%2/2
Checkin.Period(...)github.com/hunterlong/statup/core/checkin.go100.00%2/2
Checkin.AfterFind(...)github.com/hunterlong/statup/core/database.go100.00%2/2
updateService(...)github.com/hunterlong/statup/core/services.go100.00%2/2
init(...)github.com/hunterlong/statup/core/core.go100.00%1/1
ReturnUser(...)github.com/hunterlong/statup/core/users.go100.00%1/1
reorderServices(...)github.com/hunterlong/statup/core/services.go100.00%1/1
ServiceOrder.Swap(...)github.com/hunterlong/statup/core/core.go100.00%1/1
ServiceOrder.Less(...)github.com/hunterlong/statup/core/core.go100.00%1/1
failuresDB(...)github.com/hunterlong/statup/core/database.go100.00%1/1
hitsDB(...)github.com/hunterlong/statup/core/database.go100.00%1/1
servicesDB(...)github.com/hunterlong/statup/core/database.go100.00%1/1
coreDB(...)github.com/hunterlong/statup/core/database.go100.00%1/1
usersDB(...)github.com/hunterlong/statup/core/database.go100.00%1/1
ReturnService(...)github.com/hunterlong/statup/core/services.go100.00%1/1
checkinHitsDB(...)github.com/hunterlong/statup/core/database.go100.00%1/1
Service.Select(...)github.com/hunterlong/statup/core/services.go100.00%1/1
ReturnCheckinHit(...)github.com/hunterlong/statup/core/checkin.go100.00%1/1
DbConfig.Close(...)github.com/hunterlong/statup/core/database.go100.00%1/1
ReturnCheckin(...)github.com/hunterlong/statup/core/checkin.go100.00%1/1
checkinDB(...)github.com/hunterlong/statup/core/database.go100.00%1/1
ServiceOrder.Len(...)github.com/hunterlong/statup/core/core.go100.00%1/1
User.Delete(...)github.com/hunterlong/statup/core/users.go100.00%1/1
Service.parseHost(...)github.com/hunterlong/statup/core/checker.go90.91%10/11
Service.Sum(...)github.com/hunterlong/statup/core/hits.go85.71%6/7
Service.Update(...)github.com/hunterlong/statup/core/services.go84.62%11/13
Core.SelectAllServices(...)github.com/hunterlong/statup/core/services.go84.62%11/13
Service.Delete(...)github.com/hunterlong/statup/core/services.go81.82%9/11
Service.Create(...)github.com/hunterlong/statup/core/services.go81.82%9/11
Service.OnlineSince(...)github.com/hunterlong/statup/core/services.go80.00%12/15
Service.duration(...)github.com/hunterlong/statup/core/checker.go80.00%4/5
SelectAllUsers(...)github.com/hunterlong/statup/core/users.go80.00%4/5
Service.AvgUptime(...)github.com/hunterlong/statup/core/services.go78.57%11/14
Service.AllFailures(...)github.com/hunterlong/statup/core/failures.go77.78%7/9
Service.Downtime(...)github.com/hunterlong/statup/core/services.go75.00%6/8
SelectService(...)github.com/hunterlong/statup/core/services.go75.00%3/4
Service.index(...)github.com/hunterlong/statup/core/services.go75.00%3/4
Service.checkHttp(...)github.com/hunterlong/statup/core/checker.go74.47%35/47
User.Create(...)github.com/hunterlong/statup/core/users.go72.73%8/11
Service.checkTcp(...)github.com/hunterlong/statup/core/checker.go72.00%18/25
DbConfig.Save(...)github.com/hunterlong/statup/core/database.go71.43%10/14
Service.CreateFailure(...)github.com/hunterlong/statup/core/failures.go71.43%5/7
AuthUser(...)github.com/hunterlong/statup/core/users.go71.43%5/7
SelectCore(...)github.com/hunterlong/statup/core/core.go69.23%9/13
DbConfig.MigrateDatabase(...)github.com/hunterlong/statup/core/database.go66.67%8/12
LoadConfig(...)github.com/hunterlong/statup/core/configs.go66.67%8/12
Checkin.Create(...)github.com/hunterlong/statup/core/checkin.go66.67%4/6
User.BeforeCreate(...)github.com/hunterlong/statup/core/database.go66.67%2/3
CheckinHit.BeforeCreate(...)github.com/hunterlong/statup/core/database.go66.67%2/3
Service.BeforeCreate(...)github.com/hunterlong/statup/core/database.go66.67%2/3
Checkin.Update(...)github.com/hunterlong/statup/core/checkin.go60.00%3/5
Service.CreateHit(...)github.com/hunterlong/statup/core/hits.go60.00%3/5
CheckinHit.Create(...)github.com/hunterlong/statup/core/checkin.go57.14%4/7
Service.SmallText(...)github.com/hunterlong/statup/core/services.go50.00%6/12
insertNotifierDB(...)github.com/hunterlong/statup/core/core.go50.00%3/6
@361:8(...)github.com/hunterlong/statup/core/database.go50.00%1/2
DbConfig.Connect(...)github.com/hunterlong/statup/core/database.go46.67%14/30
LoadUsingEnv(...)github.com/hunterlong/statup/core/configs.go0.00%0/40
Failure.ParseError(...)github.com/hunterlong/statup/core/failures.go0.00%0/28
ExportIndexHTML(...)github.com/hunterlong/statup/core/export.go0.00%0/23
GraphDataRaw(...)github.com/hunterlong/statup/core/services.go0.00%0/16
InsertSampleHits(...)github.com/hunterlong/statup/core/sample.go0.00%0/14
DbConfig.Update(...)github.com/hunterlong/statup/core/database.go0.00%0/12
Dbtimestamp(...)github.com/hunterlong/statup/core/services.go0.00%0/12
ExportChartsJs(...)github.com/hunterlong/statup/core/export.go0.00%0/11
Service.TotalUptime(...)github.com/hunterlong/statup/core/services.go0.00%0/10
Service.AvgTime(...)github.com/hunterlong/statup/core/services.go0.00%0/8
DbConfig.CreateCore(...)github.com/hunterlong/statup/core/database.go0.00%0/8
Checkin.RecheckCheckinFailure(...)github.com/hunterlong/statup/core/checkin.go0.00%0/8
Service.GraphData(...)github.com/hunterlong/statup/core/services.go0.00%0/8
InitApp(...)github.com/hunterlong/statup/core/core.go0.00%0/6
CountFailures(...)github.com/hunterlong/statup/core/failures.go0.00%0/6
Core.Count24HFailures(...)github.com/hunterlong/statup/core/failures.go0.00%0/6
DateScanObj.ToString(...)github.com/hunterlong/statup/core/services.go0.00%0/5
DatabaseMaintence(...)github.com/hunterlong/statup/core/database.go0.00%0/5
Checkin.Expected(...)github.com/hunterlong/statup/core/checkin.go0.00%0/5
Service.lastFailure(...)github.com/hunterlong/statup/core/services.go0.00%0/5
Core.AllOnline(...)github.com/hunterlong/statup/core/core.go0.00%0/4
Core.CurrentTime(...)github.com/hunterlong/statup/core/core.go0.00%0/4
Service.DeleteFailures(...)github.com/hunterlong/statup/core/failures.go0.00%0/4
Service.TotalFailures(...)github.com/hunterlong/statup/core/failures.go0.00%0/4
DbConfig.InsertCore(...)github.com/hunterlong/statup/core/database.go0.00%0/4
DeleteAllSince(...)github.com/hunterlong/statup/core/database.go0.00%0/4
Hit.BeforeCreate(...)github.com/hunterlong/statup/core/database.go0.00%0/3
Failure.BeforeCreate(...)github.com/hunterlong/statup/core/database.go0.00%0/3
checkServices(...)github.com/hunterlong/statup/core/checker.go0.00%0/3
Core.BaseSASS(...)github.com/hunterlong/statup/core/core.go0.00%0/3
Core.SassVars(...)github.com/hunterlong/statup/core/core.go0.00%0/3
SelectCheckin(...)github.com/hunterlong/statup/core/checkin.go0.00%0/3
Core.MobileSASS(...)github.com/hunterlong/statup/core/core.go0.00%0/3
DeleteConfig(...)github.com/hunterlong/statup/core/configs.go0.00%0/3
CloseDB(...)github.com/hunterlong/statup/core/database.go0.00%0/2
Service.Online24(...)github.com/hunterlong/statup/core/services.go0.00%0/2
Service.TotalFailures24(...)github.com/hunterlong/statup/core/failures.go0.00%0/2
CheckinHit.Ago(...)github.com/hunterlong/statup/core/checkin.go0.00%0/2
Service.ToJSON(...)github.com/hunterlong/statup/core/services.go0.00%0/2
Failure.Delete(...)github.com/hunterlong/statup/core/failures.go0.00%0/2
UpdateCore(...)github.com/hunterlong/statup/core/core.go0.00%0/2
Failure.Ago(...)github.com/hunterlong/statup/core/failures.go0.00%0/2
SaveFile(...)github.com/hunterlong/statup/core/export.go0.00%0/2
Service.AvgUptime24(...)github.com/hunterlong/statup/core/services.go0.00%0/2
Service.HitsBetween(...)github.com/hunterlong/statup/core/database.go0.00%0/2
DbConfig.waitForDb(...)github.com/hunterlong/statup/core/database.go0.00%0/2
Hit.AfterFind(...)github.com/hunterlong/statup/core/database.go0.00%0/2
@62:14(...)github.com/hunterlong/statup/core/export.go0.00%0/1
@68:10(...)github.com/hunterlong/statup/core/export.go0.00%0/1
Service.UpdateSingle(...)github.com/hunterlong/statup/core/services.go0.00%0/1
@93:11(...)github.com/hunterlong/statup/core/export.go0.00%0/1
@65:17(...)github.com/hunterlong/statup/core/export.go0.00%0/1
Core.ServicesCount(...)github.com/hunterlong/statup/core/services.go0.00%0/1
Core.UsingAssets(...)github.com/hunterlong/statup/core/core.go0.00%0/1
@71:17(...)github.com/hunterlong/statup/core/export.go0.00%0/1
@59:14(...)github.com/hunterlong/statup/core/export.go0.00%0/1
Core.ToCore(...)github.com/hunterlong/statup/core/core.go0.00%0/1
@56:14(...)github.com/hunterlong/statup/core/export.go0.00%0/1
Service.DowntimeText(...)github.com/hunterlong/statup/core/services.go0.00%0/1
injectDatabase(...)github.com/hunterlong/statup/core/export.go0.00%0/1
@53:11(...)github.com/hunterlong/statup/core/export.go0.00%0/1
Checkin.String(...)github.com/hunterlong/statup/core/checkin.go0.00%0/1
@50:9(...)github.com/hunterlong/statup/core/export.go0.00%0/1
github.com/hunterlong/statup/core53.01%485/915
func InsertLargeSampleData
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/sample.go:

179
func InsertLargeSampleData() error {
180
        insertSampleCore()
181
        InsertSampleData()
182
        insertSampleUsers()
183
        s6 := ReturnService(&types.Service{
184
                Name:           "JSON Lint",
185
                Domain:         "https://jsonlint.com",
186
                ExpectedStatus: 200,
187
                Interval:       15,
188
                Type:           "http",
189
                Method:         "GET",
190
                Timeout:        10,
191
                Order:          6,
192
        })
193
194
        s7 := ReturnService(&types.Service{
195
                Name:           "Demo Page",
196
                Domain:         "https://demo.statup.io",
197
                ExpectedStatus: 200,
198
                Interval:       30,
199
                Type:           "http",
200
                Method:         "GET",
201
                Timeout:        15,
202
                Order:          7,
203
        })
204
205
        s8 := ReturnService(&types.Service{
206
                Name:           "Golang",
207
                Domain:         "https://golang.org",
208
                ExpectedStatus: 200,
209
                Interval:       15,
210
                Type:           "http",
211
                Method:         "GET",
212
                Timeout:        10,
213
                Order:          8,
214
        })
215
216
        s9 := ReturnService(&types.Service{
217
                Name:           "Santa Monica",
218
                Domain:         "https://www.santamonica.com",
219
                ExpectedStatus: 200,
220
                Interval:       15,
221
                Type:           "http",
222
                Method:         "GET",
223
                Timeout:        10,
224
                Order:          9,
225
        })
226
227
        s10 := ReturnService(&types.Service{
228
                Name:           "Oeschs Die Dritten",
229
                Domain:         "https://www.oeschs-die-dritten.ch/en/",
230
                ExpectedStatus: 200,
231
                Interval:       15,
232
                Type:           "http",
233
                Method:         "GET",
234
                Timeout:        10,
235
                Order:          10,
236
        })
237
238
        s11 := ReturnService(&types.Service{
239
                Name:           "XS Project - Bochka, Bass, Kolbaser",
240
                Domain:         "https://www.youtube.com/watch?v=VLW1ieY4Izw",
241
                ExpectedStatus: 200,
242
                Interval:       60,
243
                Type:           "http",
244
                Method:         "GET",
245
                Timeout:        20,
246
                Order:          11,
247
        })
248
249
        s12 := ReturnService(&types.Service{
250
                Name:           "Github",
251
                Domain:         "https://github.com/hunterlong",
252
                ExpectedStatus: 200,
253
                Interval:       60,
254
                Type:           "http",
255
                Method:         "GET",
256
                Timeout:        20,
257
                Order:          12,
258
        })
259
260
        s13 := ReturnService(&types.Service{
261
                Name:           "Failing URL",
262
                Domain:         "http://thisdomainisfakeanditsgoingtofail.com",
263
                ExpectedStatus: 200,
264
                Interval:       45,
265
                Type:           "http",
266
                Method:         "GET",
267
                Timeout:        10,
268
                Order:          13,
269
        })
270
271
        s14 := ReturnService(&types.Service{
272
                Name:           "Oesch's die Dritten - Die Jodelsprache",
273
                Domain:         "https://www.youtube.com/watch?v=k3GTxRt4iao",
274
                ExpectedStatus: 200,
275
                Interval:       60,
276
                Type:           "http",
277
                Method:         "GET",
278
                Timeout:        12,
279
                Order:          14,
280
        })
281
282
        s15 := ReturnService(&types.Service{
283
                Name:           "Gorm",
284
                Domain:         "http://gorm.io/",
285
                ExpectedStatus: 200,
286
                Interval:       30,
287
                Type:           "http",
288
                Method:         "GET",
289
                Timeout:        12,
290
                Order:          15,
291
        })
292
293
        s6.Create(false)
294
        s7.Create(false)
295
        s8.Create(false)
296
        s9.Create(false)
297
        s10.Create(false)
298
        s11.Create(false)
299
        s12.Create(false)
300
        s13.Create(false)
301
        s14.Create(false)
302
        s15.Create(false)
303
304
        var dayAgo = time.Now().Add(-24 * time.Hour).Add(-10 * time.Minute)
305
306
        insertHitRecords(dayAgo, 1450)
307
308
        insertFailureRecords(dayAgo, 730)
309
310
        return nil
311
}
func InsertSampleData
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/sample.go:

27
func InsertSampleData() error {
28
        utils.Log(1, "Inserting Sample Data...")
29
        s1 := ReturnService(&types.Service{
30
                Name:           "Google",
31
                Domain:         "https://google.com",
32
                ExpectedStatus: 200,
33
                Interval:       10,
34
                Type:           "http",
35
                Method:         "GET",
36
                Timeout:        10,
37
                Order:          1,
38
        })
39
        s2 := ReturnService(&types.Service{
40
                Name:           "Statup Github",
41
                Domain:         "https://github.com/hunterlong/statup",
42
                ExpectedStatus: 200,
43
                Interval:       30,
44
                Type:           "http",
45
                Method:         "GET",
46
                Timeout:        20,
47
                Order:          2,
48
        })
49
        s3 := ReturnService(&types.Service{
50
                Name:           "JSON Users Test",
51
                Domain:         "https://jsonplaceholder.typicode.com/users",
52
                ExpectedStatus: 200,
53
                Interval:       60,
54
                Type:           "http",
55
                Method:         "GET",
56
                Timeout:        30,
57
                Order:          3,
58
        })
59
        s4 := ReturnService(&types.Service{
60
                Name:           "JSON API Tester",
61
                Domain:         "https://jsonplaceholder.typicode.com/posts",
62
                ExpectedStatus: 201,
63
                Expected:       `(title)": "((\\"|[statup])*)"`,
64
                Interval:       30,
65
                Type:           "http",
66
                Method:         "POST",
67
                PostData:       `{ "title": "statup", "body": "bar", "userId": 19999 }`,
68
                Timeout:        30,
69
                Order:          4,
70
        })
71
        s5 := ReturnService(&types.Service{
72
                Name:     "Google DNS",
73
                Domain:   "8.8.8.8",
74
                Interval: 20,
75
                Type:     "tcp",
76
                Port:     53,
77
                Timeout:  120,
78
                Order:    5,
79
        })
80
81
        s1.Create(false)
82
        s2.Create(false)
83
        s3.Create(false)
84
        s4.Create(false)
85
        s5.Create(false)
86
87
        checkin1 := ReturnCheckin(&types.Checkin{
88
                Service:     s1.Id,
89
                Interval:    300,
90
                GracePeriod: 300,
91
        })
92
        checkin1.Update()
93
94
        checkin2 := ReturnCheckin(&types.Checkin{
95
                Service:     s2.Id,
96
                Interval:    900,
97
                GracePeriod: 300,
98
        })
99
        checkin2.Update()
100
101
        checkTime := time.Now().Add(-24 * time.Hour)
102
        for i := 0; i <= 60; i++ {
103
                checkHit := ReturnCheckinHit(&types.CheckinHit{
104
                        Checkin:   checkin1.Id,
105
                        From:      "192.168.0.1",
106
                        CreatedAt: checkTime.UTC(),
107
                })
108
                checkHit.Create()
109
                checkTime = checkTime.Add(10 * time.Minute)
110
        }
111
112
        utils.Log(1, "Sample data has finished importing")
113
114
        return nil
115
}
func Service.CheckQueue
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go:

43
func (s *Service) CheckQueue(record bool) {
44
        s.Checkpoint = time.Now()
45
        s.SleepDuration = time.Duration((time.Duration(s.Id) * 100) * time.Millisecond)
46
CheckLoop:
47
        for {
48
                select {
49
                case <-s.Running:
50
                        utils.Log(1, fmt.Sprintf("Stopping service: %v", s.Name))
51
                        break CheckLoop
52
                case <-time.After(s.SleepDuration):
53
                        s.Check(record)
54
                        s.Checkpoint = s.Checkpoint.Add(s.duration())
55
                        sleep := s.Checkpoint.Sub(time.Now())
56
                        if !s.Online {
57
                                s.SleepDuration = s.duration()
58
                        } else {
59
                                s.SleepDuration = sleep
60
                        }
61
                }
62
                continue
63
        }
64
}
func DbConfig.CreateDatabase
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

340
func (db *DbConfig) CreateDatabase() error {
341
        utils.Log(1, "Creating Database Tables...")
342
        err := DbSession.CreateTable(&types.Checkin{})
343
        err = DbSession.CreateTable(&types.CheckinHit{})
344
        err = DbSession.CreateTable(&notifier.Notification{})
345
        err = DbSession.Table("core").CreateTable(&types.Core{})
346
        err = DbSession.CreateTable(&types.Failure{})
347
        err = DbSession.CreateTable(&types.Hit{})
348
        err = DbSession.CreateTable(&types.Service{})
349
        err = DbSession.CreateTable(&types.User{})
350
        utils.Log(1, "Statup Database Created")
351
        return err.Error
352
}
func Service.dnsCheck
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go:

96
func (s *Service) dnsCheck() (float64, error) {
97
        var err error
98
        t1 := time.Now()
99
        host := s.parseHost()
100
        if s.Type == "tcp" {
101
                _, err = net.LookupHost(host)
102
        } else {
103
                _, err = net.LookupIP(host)
104
        }
105
        if err != nil {
106
                return 0, err
107
        }
108
        t2 := time.Now()
109
        subTime := t2.Sub(t1).Seconds()
110
        return subTime, err
111
}
func DbConfig.DropDatabase
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

326
func (db *DbConfig) DropDatabase() error {
327
        utils.Log(1, "Dropping Database Tables...")
328
        err := DbSession.DropTableIfExists("checkins")
329
        err = DbSession.DropTableIfExists("checkins_hits")
330
        err = DbSession.DropTableIfExists("notifications")
331
        err = DbSession.DropTableIfExists("core")
332
        err = DbSession.DropTableIfExists("failures")
333
        err = DbSession.DropTableIfExists("hits")
334
        err = DbSession.DropTableIfExists("services")
335
        err = DbSession.DropTableIfExists("users")
336
        return err.Error
337
}
func insertHitRecords
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/sample.go:

335
func insertHitRecords(since time.Time, amount int64) {
336
        for i := int64(1); i <= 15; i++ {
337
                service := SelectService(i)
338
                utils.Log(1, fmt.Sprintf("Adding %v hit records to service %v", amount, service.Name))
339
                createdAt := since
340
341
                for hi := int64(1); hi <= amount; hi++ {
342
                        rand.Seed(time.Now().UnixNano())
343
                        latency := rand.Float64()
344
                        createdAt = createdAt.Add(1 * time.Minute)
345
                        hit := &types.Hit{
346
                                Service:   service.Id,
347
                                CreatedAt: createdAt,
348
                                Latency:   latency,
349
                        }
350
                        service.CreateHit(hit)
351
                }
352
353
        }
354
355
}
func insertFailureRecords
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/sample.go:

314
func insertFailureRecords(since time.Time, amount int64) {
315
        for i := int64(14); i <= 15; i++ {
316
                service := SelectService(i)
317
                utils.Log(1, fmt.Sprintf("Adding %v failure records to service %v", amount, service.Name))
318
                createdAt := since
319
320
                for fi := int64(1); fi <= amount; fi++ {
321
                        createdAt = createdAt.Add(2 * time.Minute)
322
323
                        failure := &types.Failure{
324
                                Service:   service.Id,
325
                                Issue:     "testing right here",
326
                                CreatedAt: createdAt,
327
                        }
328
329
                        service.CreateFailure(failure)
330
                }
331
        }
332
}
func recordSuccess
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go:

232
func recordSuccess(s *Service) {
233
        s.Online = true
234
        s.LastOnline = time.Now()
235
        hit := &types.Hit{
236
                Service:   s.Id,
237
                Latency:   s.Latency,
238
                PingTime:  s.PingTime,
239
                CreatedAt: time.Now(),
240
        }
241
        utils.Log(1, fmt.Sprintf("Service %v Successful Response: %0.2f ms | Lookup in: %0.2f ms", s.Name, hit.Latency*1000, hit.PingTime*1000))
242
        s.CreateHit(hit)
243
        notifier.OnSuccess(s.Service)
244
}
func Core.CountOnline
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

382
func (c *Core) CountOnline() int {
383
        amount := 0
384
        for _, s := range CoreApp.Services {
385
                if s.Select().Online {
386
                        amount++
387
                }
388
        }
389
        return amount
390
}
func recordFailure
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go:

247
func recordFailure(s *Service, issue string) {
248
        s.Online = false
249
        fail := &types.Failure{
250
                Service:   s.Id,
251
                Issue:     issue,
252
                PingTime:  s.PingTime,
253
                CreatedAt: time.Now(),
254
        }
255
        utils.Log(2, fmt.Sprintf("Service %v Failing: %v | Lookup in: %0.2f ms", s.Name, issue, fail.PingTime*1000))
256
        s.CreateFailure(fail)
257
        notifier.OnFailure(s.Service, fail)
258
}
func Service.LimitedFailures
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go:

68
func (s *Service) LimitedFailures() []*Failure {
69
        var failArr []*Failure
70
        col := failuresDB().Where("service = ?", s.Id).Order("id desc").Limit(10)
71
        col.Find(&failArr)
72
        return failArr
73
}
func Service.TotalHitsSince
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/hits.go:

71
func (s *Service) TotalHitsSince(ago time.Time) (uint64, error) {
72
        var count uint64
73
        rows := hitsDB().Where("service = ? AND created_at > ?", s.Id, ago.UTC().Format("2006-01-02 15:04:05"))
74
        err := rows.Count(&count)
75
        return count, err.Error
76
}
func Service.TotalHits
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/hits.go:

63
func (s *Service) TotalHits() (uint64, error) {
64
        var count uint64
65
        col := hitsDB().Where("service = ?", s.Id)
66
        err := col.Count(&count)
67
        return count, err.Error
68
}
func Service.TotalFailuresSince
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go:

124
func (s *Service) TotalFailuresSince(ago time.Time) (uint64, error) {
125
        var count uint64
126
        rows := failuresDB().Where("service = ? AND created_at > ?", s.Id, ago.UTC().Format("2006-01-02 15:04:05"))
127
        err := rows.Count(&count)
128
        return count, err.Error
129
}
func Service.Hits
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/hits.go:

39
func (s *Service) Hits() ([]*types.Hit, error) {
40
        var hits []*types.Hit
41
        col := hitsDB().Where("service = ?", s.Id).Order("id desc")
42
        err := col.Find(&hits)
43
        return hits, err.Error
44
}
func User.Update
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go:

56
func (u *User) Update() error {
57
        u.Password = utils.HashPassword(u.Password)
58
        u.ApiKey = utils.NewSHA1Hash(5)
59
        u.ApiSecret = utils.NewSHA1Hash(10)
60
        return usersDB().Update(u).Error
61
}
func Service.LimitedHits
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/hits.go:

47
func (s *Service) LimitedHits() ([]*types.Hit, error) {
48
        var hits []*types.Hit
49
        col := hitsDB().Where("service = ?", s.Id).Order("id desc").Limit(1024)
50
        err := col.Find(&hits)
51
        return reverseHits(hits), err.Error
52
}
func insertSampleUsers
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/sample.go:

159
func insertSampleUsers() {
160
        u2 := ReturnUser(&types.User{
161
                Username: "testadmin",
162
                Password: "password123",
163
                Email:    "info@betatude.com",
164
                Admin:    true,
165
        })
166
167
        u3 := ReturnUser(&types.User{
168
                Username: "testadmin2",
169
                Password: "password123",
170
                Email:    "info@adminhere.com",
171
                Admin:    true,
172
        })
173
174
        u2.Create()
175
        u3.Create()
176
}
func NewCore
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

47
func NewCore() *Core {
48
        CoreApp = new(Core)
49
        CoreApp.Core = new(types.Core)
50
        CoreApp.Started = time.Now()
51
        return CoreApp
52
}
func SelectUsername
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go:

43
func SelectUsername(username string) (*User, error) {
44
        var user User
45
        res := usersDB().Where("username = ?", username)
46
        err := res.First(&user)
47
        return &user, err.Error
48
}
func Checkin.Hits
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go:

85
func (u *Checkin) Hits() []CheckinHit {
86
        var checkins []CheckinHit
87
        checkinHitsDB().Where("checkin = ?", u.Id).Order("id DESC").Find(&checkins)
88
        return checkins
89
}
func insertSampleCore
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/sample.go:

143
func insertSampleCore() error {
144
        core := &types.Core{
145
                Name:        "Statup Sample Data",
146
                Description: "This data is only used to testing",
147
                ApiKey:      "sample",
148
                ApiSecret:   "samplesecret",
149
                Domain:      "http://localhost:8080",
150
                Version:     "test",
151
                CreatedAt:   time.Now(),
152
                UseCdn:      false,
153
        }
154
        query := coreDB().Create(core)
155
        return query.Error
156
}
func reverseHits
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/hits.go:

55
func reverseHits(input []*types.Hit) []*types.Hit {
56
        if len(input) == 0 {
57
                return input
58
        }
59
        return append(reverseHits(input[1:]), input[0])
60
}
func Service.Check
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go:

222
func (s *Service) Check(record bool) {
223
        switch s.Type {
224
        case "http":
225
                s.checkHttp(record)
226
        case "tcp", "udp":
227
                s.checkTcp(record)
228
        }
229
}
func SelectUser
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go:

36
func SelectUser(id int64) (*User, error) {
37
        var user User
38
        err := usersDB().First(&user, id)
39
        return &user, err.Error
40
}
func Service.Checkins
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

55
func (s *Service) Checkins() []*Checkin {
56
        var checkin []*Checkin
57
        checkinDB().Where("service = ?", s.Id).Find(&checkin)
58
        return checkin
59
}
func Checkin.Last
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go:

78
func (u *Checkin) Last() CheckinHit {
79
        var hit CheckinHit
80
        checkinHitsDB().Where("checkin = ?", u.Id).Last(&hit)
81
        return hit
82
}
func Checkin.BeforeCreate
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

161
func (u *Checkin) BeforeCreate() (err error) {
162
        if u.CreatedAt.IsZero() {
163
                u.CreatedAt = time.Now().UTC()
164
        }
165
        return
166
}
func Failure.AfterFind
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

105
func (f *Failure) AfterFind() (err error) {
106
        f.CreatedAt = utils.Timezoner(f.CreatedAt, CoreApp.Timezone)
107
        return
108
}
func Service.AfterFind
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

93
func (s *Service) AfterFind() (err error) {
94
        s.CreatedAt = utils.Timezoner(s.CreatedAt, CoreApp.Timezone)
95
        return
96
}
func CheckHash
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go:

105
func CheckHash(password, hash string) bool {
106
        err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
107
        return err == nil
108
}
func User.AfterFind
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

111
func (u *User) AfterFind() (err error) {
112
        u.CreatedAt = utils.Timezoner(u.CreatedAt, CoreApp.Timezone)
113
        return
114
}
func CheckinHit.AfterFind
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

123
func (s *CheckinHit) AfterFind() (err error) {
124
        s.CreatedAt = utils.Timezoner(s.CreatedAt, CoreApp.Timezone)
125
        return
126
}
func Checkin.Grace
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go:

63
func (u *Checkin) Grace() time.Duration {
64
        duration, _ := time.ParseDuration(fmt.Sprintf("%vs", u.GracePeriod))
65
        return duration
66
}
func Checkin.Period
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go:

57
func (u *Checkin) Period() time.Duration {
58
        duration, _ := time.ParseDuration(fmt.Sprintf("%vs", u.Interval))
59
        return duration
60
}
func Checkin.AfterFind
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

117
func (s *Checkin) AfterFind() (err error) {
118
        s.CreatedAt = utils.Timezoner(s.CreatedAt, CoreApp.Timezone)
119
        return
120
}
func updateService
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

315
func updateService(service *Service) {
316
        index := service.index()
317
        CoreApp.Services[index] = service
318
}
func init
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

42
func init() {
43
        CoreApp = NewCore()
44
}
func ReturnUser
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go:

31
func ReturnUser(u *types.User) *User {
32
        return &User{u}
33
}
func reorderServices
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

81
func reorderServices() {
82
        sort.Sort(ServiceOrder(CoreApp.Services))
83
}
func ServiceOrder.Swap
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

161
func (c ServiceOrder) Swap(i, j int)      { c[i], c[j] = c[j], c[i] }
func ServiceOrder.Less
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

162
func (c ServiceOrder) Less(i, j int) bool { return c[i].(*Service).Order < c[j].(*Service).Order }
func failuresDB
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

40
func failuresDB() *gorm.DB {
41
        return DbSession.Model(&types.Failure{})
42
}
func hitsDB
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

45
func hitsDB() *gorm.DB {
46
        return DbSession.Model(&types.Hit{})
47
}
func servicesDB
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

50
func servicesDB() *gorm.DB {
51
        return DbSession.Model(&types.Service{})
52
}
func coreDB
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

55
func coreDB() *gorm.DB {
56
        return DbSession.Table("core").Model(&CoreApp)
57
}
func usersDB
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

60
func usersDB() *gorm.DB {
61
        return DbSession.Model(&types.User{})
62
}
func ReturnService
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

40
func ReturnService(s *types.Service) *Service {
41
        return &Service{s}
42
}
func checkinHitsDB
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

70
func checkinHitsDB() *gorm.DB {
71
        return DbSession.Model(&types.CheckinHit{})
72
}
func Service.Select
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

35
func (s *Service) Select() *types.Service {
36
        return s.Service
37
}
func ReturnCheckinHit
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go:

45
func ReturnCheckinHit(h *types.CheckinHit) *CheckinHit {
46
        return &CheckinHit{CheckinHit: h}
47
}
func DbConfig.Close
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

88
func (db *DbConfig) Close() error {
89
        return DbSession.DB().Close()
90
}
func ReturnCheckin
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go:

40
func ReturnCheckin(s *types.Checkin) *Checkin {
41
        return &Checkin{Checkin: s}
42
}
func checkinDB
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

65
func checkinDB() *gorm.DB {
66
        return DbSession.Model(&types.Checkin{})
67
}
func ServiceOrder.Len
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

160
func (c ServiceOrder) Len() int           { return len(c) }
func User.Delete
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go:

51
func (u *User) Delete() error {
52
        return usersDB().Delete(u).Error
53
}
func Service.parseHost
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go:

77
func (s *Service) parseHost() string {
78
        if s.Type == "tcp" || s.Type == "udp" {
79
                return s.Domain
80
        } else {
81
                domain := s.Domain
82
                hasPort, _ := regexp.MatchString(`\:([0-9]+)`, domain)
83
                if hasPort {
84
                        splitDomain := strings.Split(s.Domain, ":")
85
                        domain = splitDomain[len(splitDomain)-2]
86
                }
87
                host, err := url.Parse(domain)
88
                if err != nil {
89
                        return s.Domain
90
                }
91
                return host.Host
92
        }
93
}
func Service.Sum
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/hits.go:

79
func (s *Service) Sum() (float64, error) {
80
        var amount float64
81
        hits, err := s.Hits()
82
        if err != nil {
83
                utils.Log(2, err)
84
        }
85
        for _, h := range hits {
86
                amount += h.Latency
87
        }
88
        return amount, err
89
}
func Service.Update
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

342
func (u *Service) Update(restart bool) error {
343
        err := servicesDB().Update(u)
344
        if err.Error != nil {
345
                utils.Log(3, fmt.Sprintf("Failed to update service %v. %v", u.Name, err))
346
                return err.Error
347
        }
348
        if restart {
349
                u.Close()
350
                u.Start()
351
                u.SleepDuration = time.Duration(u.Interval) * time.Second
352
                go u.CheckQueue(true)
353
        }
354
        reorderServices()
355
        updateService(u)
356
        notifier.OnUpdatedService(u.Service)
357
        return err.Error
358
}
func Core.SelectAllServices
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

62
func (c *Core) SelectAllServices() ([]*Service, error) {
63
        var services []*Service
64
        db := servicesDB().Find(&services).Order("order_id desc")
65
        if db.Error != nil {
66
                utils.Log(3, fmt.Sprintf("service error: %v", db.Error))
67
                return nil, db.Error
68
        }
69
        CoreApp.Services = nil
70
        for _, service := range services {
71
                service.Start()
72
                service.Checkins()
73
                service.AllFailures()
74
                CoreApp.Services = append(CoreApp.Services, service)
75
        }
76
        sort.Sort(ServiceOrder(CoreApp.Services))
77
        return services, db.Error
78
}
func Service.Delete
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

321
func (u *Service) Delete() error {
322
        i := u.index()
323
        err := servicesDB().Delete(u)
324
        if err.Error != nil {
325
                utils.Log(3, fmt.Sprintf("Failed to delete service %v. %v", u.Name, err.Error))
326
                return err.Error
327
        }
328
        u.Close()
329
        slice := CoreApp.Services
330
        CoreApp.Services = append(slice[:i], slice[i+1:]...)
331
        reorderServices()
332
        notifier.OnDeletedService(u.Service)
333
        return err.Error
334
}
func Service.Create
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

361
func (u *Service) Create(check bool) (int64, error) {
362
        u.CreatedAt = time.Now()
363
        db := servicesDB().Create(u)
364
        if db.Error != nil {
365
                utils.Log(3, fmt.Sprintf("Failed to create service %v #%v: %v", u.Name, u.Id, db.Error))
366
                return 0, db.Error
367
        }
368
        u.Start()
369
        go u.CheckQueue(check)
370
        CoreApp.Services = append(CoreApp.Services, u)
371
        reorderServices()
372
        notifier.OnNewService(u.Service)
373
        return u.Id, nil
374
}
func Service.OnlineSince
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

111
func (s *Service) OnlineSince(ago time.Time) float32 {
112
        failed, _ := s.TotalFailuresSince(ago)
113
        if failed == 0 {
114
                s.Online24Hours = 100.00
115
                return s.Online24Hours
116
        }
117
        total, _ := s.TotalHitsSince(ago)
118
        if total == 0 {
119
                s.Online24Hours = 0
120
                return s.Online24Hours
121
        }
122
        avg := float64(failed) / float64(total) * 100
123
        avg = 100 - avg
124
        if avg < 0 {
125
                avg = 0
126
        }
127
        amount, _ := strconv.ParseFloat(fmt.Sprintf("%0.2f", avg), 10)
128
        s.Online24Hours = float32(amount)
129
        return s.Online24Hours
130
}
func Service.duration
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go:

67
func (s *Service) duration() time.Duration {
68
        var amount time.Duration
69
        if s.Interval >= 10000 {
70
                amount = time.Duration(s.Interval) * time.Microsecond
71
        } else {
72
                amount = time.Duration(s.Interval) * time.Second
73
        }
74
        return amount
75
}
func SelectAllUsers
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go:

81
func SelectAllUsers() ([]*User, error) {
82
        var users []*User
83
        db := usersDB().Find(&users)
84
        if db.Error != nil {
85
                utils.Log(3, fmt.Sprintf("Failed to load all users. %v", db.Error))
86
        }
87
        return users, db.Error
88
}
func Service.AvgUptime
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

267
func (s *Service) AvgUptime(ago time.Time) string {
268
        failed, _ := s.TotalFailuresSince(ago)
269
        if failed == 0 {
270
                return "100"
271
        }
272
        total, _ := s.TotalHitsSince(ago)
273
        if total == 0 {
274
                return "0.00"
275
        }
276
        percent := float64(failed) / float64(total) * 100
277
        percent = 100 - percent
278
        if percent < 0 {
279
                percent = 0
280
        }
281
        amount := fmt.Sprintf("%0.2f", percent)
282
        if amount == "100.00" {
283
                amount = "100"
284
        }
285
        return amount
286
}
func Service.AllFailures
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go:

44
func (s *Service) AllFailures() []*Failure {
45
        var fails []*Failure
46
        col := failuresDB().Where("service = ?", s.Id).Order("id desc")
47
        err := col.Find(&fails)
48
        if err.Error != nil {
49
                utils.Log(3, fmt.Sprintf("Issue getting failures for service %v, %v", s.Name, err))
50
                return nil
51
        }
52
        for _, f := range fails {
53
                s.Failures = append(s.Failures, f)
54
        }
55
        return fails
56
}
func Service.Downtime
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

202
func (s *Service) Downtime() time.Duration {
203
        hits, _ := s.Hits()
204
        fails := s.LimitedFailures()
205
        if len(fails) == 0 {
206
                return time.Duration(0)
207
        }
208
        if len(hits) == 0 {
209
                return time.Now().UTC().Sub(fails[len(fails)-1].CreatedAt.UTC())
210
        }
211
        since := fails[0].CreatedAt.UTC().Sub(hits[0].CreatedAt.UTC())
212
        return since
213
}
func SelectService
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

45
func SelectService(id int64) *Service {
46
        for _, s := range CoreApp.Services {
47
                if s.Select().Id == id {
48
                        return s.(*Service)
49
                }
50
        }
51
        return nil
52
}
func Service.index
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

305
func (s *Service) index() int {
306
        for k, service := range CoreApp.Services {
307
                if s.Id == service.(*Service).Id {
308
                        return k
309
                }
310
        }
311
        return 0
312
}
func Service.checkHttp
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go:

151
func (s *Service) checkHttp(record bool) *Service {
152
        dnsLookup, err := s.dnsCheck()
153
        if err != nil {
154
                if record {
155
                        recordFailure(s, fmt.Sprintf("Could not get IP address for domain %v, %v", s.Domain, err))
156
                }
157
                return s
158
        }
159
        s.PingTime = dnsLookup
160
        t1 := time.Now()
161
        timeout := time.Duration(s.Timeout)
162
        client := http.Client{
163
                Timeout: timeout * time.Second,
164
        }
165
166
        var response *http.Response
167
        if s.Method == "POST" {
168
                response, err = client.Post(s.Domain, "application/json", bytes.NewBuffer([]byte(s.PostData)))
169
        } else {
170
                response, err = client.Get(s.Domain)
171
        }
172
        if err != nil {
173
                if record {
174
                        recordFailure(s, fmt.Sprintf("HTTP Error %v", err))
175
                }
176
                return s
177
        }
178
        response.Header.Set("Connection", "close")
179
        response.Header.Set("User-Agent", "StatupMonitor")
180
        t2 := time.Now()
181
        s.Latency = t2.Sub(t1).Seconds()
182
        if err != nil {
183
                if record {
184
                        recordFailure(s, fmt.Sprintf("HTTP Error %v", err))
185
                }
186
                return s
187
        }
188
        defer response.Body.Close()
189
        contents, err := ioutil.ReadAll(response.Body)
190
        s.LastResponse = string(contents)
191
        s.LastStatusCode = response.StatusCode
192
193
        if s.Expected != "" {
194
                if err != nil {
195
                        utils.Log(2, err)
196
                }
197
                match, err := regexp.MatchString(s.Expected, string(contents))
198
                if err != nil {
199
                        utils.Log(2, err)
200
                }
201
                if !match {
202
                        if record {
203
                                recordFailure(s, fmt.Sprintf("HTTP Response Body did not match '%v'", s.Expected))
204
                        }
205
                        return s
206
                }
207
        }
208
        if s.ExpectedStatus != response.StatusCode {
209
                if record {
210
                        recordFailure(s, fmt.Sprintf("HTTP Status Code %v did not match %v", response.StatusCode, s.ExpectedStatus))
211
                }
212
                return s
213
        }
214
        s.Online = true
215
        if record {
216
                recordSuccess(s)
217
        }
218
        return s
219
}
func User.Create
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go:

64
func (u *User) Create() (int64, error) {
65
        u.CreatedAt = time.Now()
66
        u.Password = utils.HashPassword(u.Password)
67
        u.ApiKey = utils.NewSHA1Hash(5)
68
        u.ApiSecret = utils.NewSHA1Hash(10)
69
        db := usersDB().Create(u)
70
        if db.Error != nil {
71
                return 0, db.Error
72
        }
73
        if u.Id == 0 {
74
                utils.Log(3, fmt.Sprintf("Failed to create user %v. %v", u.Username, db.Error))
75
                return 0, db.Error
76
        }
77
        return u.Id, db.Error
78
}
func Service.checkTcp
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go:

114
func (s *Service) checkTcp(record bool) *Service {
115
        dnsLookup, err := s.dnsCheck()
116
        if err != nil {
117
                if record {
118
                        recordFailure(s, fmt.Sprintf("Could not get IP address for TCP service %v, %v", s.Domain, err))
119
                }
120
                return s
121
        }
122
        s.PingTime = dnsLookup
123
        t1 := time.Now()
124
        domain := fmt.Sprintf("%v", s.Domain)
125
        if s.Port != 0 {
126
                domain = fmt.Sprintf("%v:%v", s.Domain, s.Port)
127
        }
128
        conn, err := net.DialTimeout(s.Type, domain, time.Duration(s.Timeout)*time.Second)
129
        if err != nil {
130
                if record {
131
                        recordFailure(s, fmt.Sprintf("%v Dial Error %v", s.Type, err))
132
                }
133
                return s
134
        }
135
        if err := conn.Close(); err != nil {
136
                if record {
137
                        recordFailure(s, fmt.Sprintf("TCP Socket Close Error %v", err))
138
                }
139
                return s
140
        }
141
        t2 := time.Now()
142
        s.Latency = t2.Sub(t1).Seconds()
143
        s.LastResponse = ""
144
        if record {
145
                recordSuccess(s)
146
        }
147
        return s
148
}
func DbConfig.Save
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

284
func (c *DbConfig) Save() (*DbConfig, error) {
285
        var err error
286
        config, err := os.Create(utils.Directory + "/config.yml")
287
        if err != nil {
288
                utils.Log(4, err)
289
                return nil, err
290
        }
291
        c.ApiKey = utils.NewSHA1Hash(16)
292
        c.ApiSecret = utils.NewSHA1Hash(16)
293
        data, err := yaml.Marshal(c)
294
        if err != nil {
295
                utils.Log(3, err)
296
                return nil, err
297
        }
298
        config.WriteString(string(data))
299
        defer config.Close()
300
        return c, err
301
}
func Service.CreateFailure
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go:

32
func (s *Service) CreateFailure(f *types.Failure) (int64, error) {
33
        f.Service = s.Id
34
        s.Failures = append(s.Failures, f)
35
        row := failuresDB().Create(f)
36
        if row.Error != nil {
37
                utils.Log(3, row.Error)
38
                return 0, row.Error
39
        }
40
        return f.Id, row.Error
41
}
func AuthUser
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go:

92
func AuthUser(username, password string) (*User, bool) {
93
        user, err := SelectUsername(username)
94
        if err != nil {
95
                utils.Log(2, err)
96
                return nil, false
97
        }
98
        if CheckHash(password, user.Password) {
99
                return user, true
100
        }
101
        return nil, false
102
}
func SelectCore
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

136
func SelectCore() (*Core, error) {
137
        if DbSession == nil {
138
                return nil, errors.New("database has not been initiated yet.")
139
        }
140
        exists := DbSession.HasTable("core")
141
        if !exists {
142
                return nil, errors.New("core database has not been setup yet.")
143
        }
144
        db := coreDB().First(&CoreApp)
145
        if db.Error != nil {
146
                return nil, db.Error
147
        }
148
        CoreApp.DbConnection = Configs.DbConn
149
        CoreApp.Version = VERSION
150
        if os.Getenv("USE_CDN") == "true" {
151
                CoreApp.UseCdn = true
152
        }
153
        //store = sessions.NewCookieStore([]byte(core.ApiSecret))
154
        return CoreApp, db.Error
155
}
func DbConfig.MigrateDatabase
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

357
func (db *DbConfig) MigrateDatabase() error {
358
        utils.Log(1, "Migrating Database Tables...")
359
360
        tx := DbSession.Begin()
361
        defer func() {
362
                if r := recover(); r != nil {
363
                        tx.Rollback()
364
                }
365
        }()
366
        if tx.Error != nil {
367
                return tx.Error
368
        }
369
        tx = tx.AutoMigrate(&types.Service{}, &types.User{}, &types.Hit{}, &types.Failure{}, &types.Checkin{}, &types.CheckinHit{}, &notifier.Notification{}).Table("core").AutoMigrate(&types.Core{})
370
        if tx.Error != nil {
371
                tx.Rollback()
372
                utils.Log(3, fmt.Sprintf("Statup Database could not be migrated: %v", tx.Error))
373
                return tx.Error
374
        }
375
        utils.Log(1, "Statup Database Migrated")
376
        return tx.Commit().Error
377
}
func LoadConfig
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/configs.go:

34
func LoadConfig(directory string) (*DbConfig, error) {
35
        var configs *DbConfig
36
        if os.Getenv("DB_CONN") != "" {
37
                utils.Log(1, "DB_CONN environment variable was found, waiting for database...")
38
                return LoadUsingEnv()
39
        }
40
        file, err := ioutil.ReadFile(directory + "/config.yml")
41
        if err != nil {
42
                return nil, errors.New("config.yml file not found at " + directory + "/config.yml - starting in setup mode")
43
        }
44
        err = yaml.Unmarshal(file, &configs)
45
        if err != nil {
46
                return nil, err
47
        }
48
        Configs = configs
49
        return Configs, err
50
}
func Checkin.Create
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go:

92
func (u *Checkin) Create() (int64, error) {
93
        u.ApiKey = utils.RandomString(7)
94
        row := checkinDB().Create(&u)
95
        if row.Error != nil {
96
                utils.Log(2, row.Error)
97
                return 0, row.Error
98
        }
99
        return u.Id, row.Error
100
}
func User.BeforeCreate
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

145
func (u *User) BeforeCreate() (err error) {
146
        if u.CreatedAt.IsZero() {
147
                u.CreatedAt = time.Now().UTC()
148
        }
149
        return
150
}
func CheckinHit.BeforeCreate
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

169
func (u *CheckinHit) BeforeCreate() (err error) {
170
        if u.CreatedAt.IsZero() {
171
                u.CreatedAt = time.Now().UTC()
172
        }
173
        return
174
}
func Service.BeforeCreate
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

153
func (u *Service) BeforeCreate() (err error) {
154
        if u.CreatedAt.IsZero() {
155
                u.CreatedAt = time.Now().UTC()
156
        }
157
        return
158
}
func Checkin.Update
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go:

103
func (u *Checkin) Update() (int64, error) {
104
        row := checkinDB().Update(&u)
105
        if row.Error != nil {
106
                utils.Log(2, row.Error)
107
                return 0, row.Error
108
        }
109
        return u.Id, row.Error
110
}
func Service.CreateHit
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/hits.go:

29
func (s *Service) CreateHit(h *types.Hit) (int64, error) {
30
        db := hitsDB().Create(h)
31
        if db.Error != nil {
32
                utils.Log(2, db.Error)
33
                return 0, db.Error
34
        }
35
        return h.Id, db.Error
36
}
func CheckinHit.Create
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go:

113
func (u *CheckinHit) Create() (int64, error) {
114
        if u.CreatedAt.IsZero() {
115
                u.CreatedAt = time.Now()
116
        }
117
        row := checkinHitsDB().Create(u)
118
        if row.Error != nil {
119
                utils.Log(2, row.Error)
120
                return 0, row.Error
121
        }
122
        return u.Id, row.Error
123
}
func Service.SmallText
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

154
func (s *Service) SmallText() string {
155
        last := s.LimitedFailures()
156
        hits, _ := s.LimitedHits()
157
        zone := CoreApp.Timezone
158
        if s.Online {
159
                if len(last) == 0 {
160
                        return fmt.Sprintf("Online since %v", utils.Timezoner(s.CreatedAt, zone).Format("Monday 3:04:05PM, Jan _2 2006"))
161
                } else {
162
                        return fmt.Sprintf("Online, last failure was %v", utils.Timezoner(hits[0].CreatedAt, zone).Format("Monday 3:04:05PM, Jan _2 2006"))
163
                }
164
        }
165
        if len(last) > 0 {
166
                lastFailure := s.lastFailure()
167
                got, _ := timeago.TimeAgoWithTime(time.Now().Add(s.Downtime()), time.Now())
168
                return fmt.Sprintf("Reported offline %v, %v", got, lastFailure.ParseError())
169
        } else {
170
                return fmt.Sprintf("%v is currently offline", s.Name)
171
        }
172
}
func insertNotifierDB
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

70
func insertNotifierDB() error {
71
        if DbSession == nil {
72
                err := Configs.Connect(false, utils.Directory)
73
                if err != nil {
74
                        return errors.New("database connection has not been created")
75
                }
76
        }
77
        notifier.SetDB(DbSession)
78
        return nil
79
}
func @361:8
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

361
func() {
362
                if r := recover(); r != nil {
363
                        tx.Rollback()
364
                }
365
        }
func DbConfig.Connect
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

193
func (db *DbConfig) Connect(retry bool, location string) error {
194
        var err error
195
        if DbSession != nil {
196
                DbSession = nil
197
        }
198
        var conn, dbType string
199
        dbType = Configs.DbConn
200
        switch dbType {
201
        case "sqlite":
202
                conn = utils.Directory + "/statup.db"
203
                dbType = "sqlite3"
204
        case "mysql":
205
                if Configs.DbPort == 0 {
206
                        Configs.DbPort = 3306
207
                }
208
                host := fmt.Sprintf("%v:%v", Configs.DbHost, Configs.DbPort)
209
                conn = fmt.Sprintf("%v:%v@tcp(%v)/%v?charset=utf8&parseTime=True&loc=UTC", Configs.DbUser, Configs.DbPass, host, Configs.DbData)
210
        case "postgres":
211
                if Configs.DbPort == 0 {
212
                        Configs.DbPort = 5432
213
                }
214
                conn = fmt.Sprintf("host=%v port=%v user=%v dbname=%v password=%v sslmode=disable", Configs.DbHost, Configs.DbPort, Configs.DbUser, Configs.DbData, Configs.DbPass)
215
        case "mssql":
216
                if Configs.DbPort == 0 {
217
                        Configs.DbPort = 1433
218
                }
219
                host := fmt.Sprintf("%v:%v", Configs.DbHost, Configs.DbPort)
220
                conn = fmt.Sprintf("sqlserver://%v:%v@%v?database=%v", Configs.DbUser, Configs.DbPass, host, Configs.DbData)
221
        }
222
        DbSession, err = gorm.Open(dbType, conn)
223
        if err != nil {
224
                if retry {
225
                        utils.Log(1, fmt.Sprintf("Database connection to '%v' is not available, trying again in 5 seconds...", conn))
226
                        return db.waitForDb()
227
                } else {
228
                        fmt.Println("ERROR:", err)
229
                        return err
230
                }
231
        }
232
        err = DbSession.DB().Ping()
233
        if err == nil {
234
                utils.Log(1, fmt.Sprintf("Database connection to '%v' was successful.", Configs.DbData))
235
        }
236
        return err
237
}
func LoadUsingEnv
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/configs.go:

53
func LoadUsingEnv() (*DbConfig, error) {
54
        Configs = new(DbConfig)
55
        if os.Getenv("DB_CONN") == "" {
56
                return nil, errors.New("Missing DB_CONN environment variable")
57
        }
58
        if os.Getenv("DB_HOST") == "" {
59
                return nil, errors.New("Missing DB_HOST environment variable")
60
        }
61
        if os.Getenv("DB_USER") == "" {
62
                return nil, errors.New("Missing DB_USER environment variable")
63
        }
64
        if os.Getenv("DB_PASS") == "" {
65
                return nil, errors.New("Missing DB_PASS environment variable")
66
        }
67
        if os.Getenv("DB_DATABASE") == "" {
68
                return nil, errors.New("Missing DB_DATABASE environment variable")
69
        }
70
        Configs.DbConn = os.Getenv("DB_CONN")
71
        Configs.DbHost = os.Getenv("DB_HOST")
72
        Configs.DbPort = int(utils.StringInt(os.Getenv("DB_PORT")))
73
        Configs.DbUser = os.Getenv("DB_USER")
74
        Configs.DbPass = os.Getenv("DB_PASS")
75
        Configs.DbData = os.Getenv("DB_DATABASE")
76
        CoreApp.DbConnection = os.Getenv("DB_CONN")
77
        CoreApp.Name = os.Getenv("NAME")
78
        CoreApp.Domain = os.Getenv("DOMAIN")
79
        if os.Getenv("USE_CDN") == "true" {
80
                CoreApp.UseCdn = true
81
        }
82
83
        dbConfig := &DbConfig{
84
                DbConn:      os.Getenv("DB_CONN"),
85
                DbHost:      os.Getenv("DB_HOST"),
86
                DbUser:      os.Getenv("DB_USER"),
87
                DbPass:      os.Getenv("DB_PASS"),
88
                DbData:      os.Getenv("DB_DATABASE"),
89
                DbPort:      5432,
90
                Project:     "Statup - " + os.Getenv("NAME"),
91
                Description: "New Statup Installation",
92
                Domain:      os.Getenv("DOMAIN"),
93
                Username:    "admin",
94
                Password:    "admin",
95
                Email:       "info@localhost.com",
96
        }
97
98
        err := dbConfig.Connect(true, utils.Directory)
99
        if err != nil {
100
                utils.Log(4, err)
101
                return nil, err
102
        }
103
104
        exists := DbSession.HasTable("core")
105
        if !exists {
106
                utils.Log(1, fmt.Sprintf("Core database does not exist, creating now!"))
107
                dbConfig.DropDatabase()
108
                dbConfig.CreateDatabase()
109
110
                CoreApp, err = dbConfig.InsertCore()
111
                if err != nil {
112
                        utils.Log(3, err)
113
                }
114
115
                admin := &types.User{
116
                        Username: "admin",
117
                        Password: "admin",
118
                        Email:    "info@admin.com",
119
                        Admin:    true,
120
                }
121
                admin.Create()
122
123
                InsertSampleData()
124
125
                return Configs, err
126
127
        }
128
129
        return Configs, nil
130
}
func Failure.ParseError
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go:

132
func (f *Failure) ParseError() string {
133
        err := strings.Contains(f.Issue, "connection reset by peer")
134
        if err {
135
                return fmt.Sprintf("Connection Reset")
136
        }
137
        err = strings.Contains(f.Issue, "operation timed out")
138
        if err {
139
                return fmt.Sprintf("HTTP Request Timed Out")
140
        }
141
        err = strings.Contains(f.Issue, "x509: certificate is valid")
142
        if err {
143
                return fmt.Sprintf("SSL Certificate invalid")
144
        }
145
        err = strings.Contains(f.Issue, "Client.Timeout exceeded while awaiting headers")
146
        if err {
147
                return fmt.Sprintf("Connection Timed Out")
148
        }
149
        err = strings.Contains(f.Issue, "no such host")
150
        if err {
151
                return fmt.Sprintf("Domain is offline or not found")
152
        }
153
        err = strings.Contains(f.Issue, "HTTP Status Code")
154
        if err {
155
                return fmt.Sprintf("Incorrect HTTP Status Code")
156
        }
157
        err = strings.Contains(f.Issue, "connection refused")
158
        if err {
159
                return fmt.Sprintf("Connection Failed")
160
        }
161
        err = strings.Contains(f.Issue, "can't assign requested address")
162
        if err {
163
                return fmt.Sprintf("Unable to Request Address")
164
        }
165
        err = strings.Contains(f.Issue, "no route to host")
166
        if err {
167
                return fmt.Sprintf("Domain is offline or not found")
168
        }
169
        return f.Issue
170
}
func ExportIndexHTML
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go:

31
func ExportIndexHTML() string {
32
        source.Assets()
33
        injectDatabase()
34
        CoreApp.SelectAllServices()
35
        CoreApp.UseCdn = true
36
        for _, srv := range CoreApp.Services {
37
                service := srv.(*Service)
38
                service.Check(true)
39
                fmt.Println(service.Name, service.Online, service.Latency)
40
        }
41
        nav, _ := source.TmplBox.String("nav.html")
42
        footer, _ := source.TmplBox.String("footer.html")
43
        render, err := source.TmplBox.String("index.html")
44
        if err != nil {
45
                utils.Log(3, err)
46
        }
47
48
        t := template.New("message")
49
        t.Funcs(template.FuncMap{
50
                "js": func(html string) template.JS {
51
                        return template.JS(html)
52
                },
53
                "safe": func(html string) template.HTML {
54
                        return template.HTML(html)
55
                },
56
                "VERSION": func() string {
57
                        return VERSION
58
                },
59
                "CoreApp": func() *Core {
60
                        return CoreApp
61
                },
62
                "USE_CDN": func() bool {
63
                        return CoreApp.UseCdn
64
                },
65
                "underscore": func(html string) string {
66
                        return utils.UnderScoreString(html)
67
                },
68
                "URL": func() string {
69
                        return "/"
70
                },
71
                "CHART_DATA": func() string {
72
                        return ExportChartsJs()
73
                },
74
        })
75
        t, _ = t.Parse(nav)
76
        t, _ = t.Parse(footer)
77
        t.Parse(render)
78
        var tpl bytes.Buffer
79
        if err := t.Execute(&tpl, CoreApp); err != nil {
80
                utils.Log(3, err)
81
        }
82
        result := tpl.String()
83
        return result
84
}
func GraphDataRaw
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

216
func GraphDataRaw(service types.ServiceInterface, start, end time.Time, group string, column string) *DateScanObj {
217
        var d []DateScan
218
        model := service.(*Service).HitsBetween(start, end, group, column)
219
        rows, _ := model.Rows()
220
        for rows.Next() {
221
                var gd DateScan
222
                var createdAt string
223
                var value float64
224
                var createdTime time.Time
225
                rows.Scan(&createdAt, &value)
226
                createdTime, _ = time.Parse(types.TIME, createdAt)
227
                if CoreApp.DbConnection == "postgres" {
228
                        createdTime, _ = time.Parse(types.TIME_NANO, createdAt)
229
                }
230
                gd.CreatedAt = utils.Timezoner(createdTime, CoreApp.Timezone).Format(types.TIME)
231
                gd.Value = int64(value * 1000)
232
                d = append(d, gd)
233
        }
234
        return &DateScanObj{d}
235
}
func InsertSampleHits
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/sample.go:

118
func InsertSampleHits() error {
119
        since := time.Now().Add((-24 * 7) * time.Hour).UTC()
120
        for i := int64(1); i <= 5; i++ {
121
                service := SelectService(i)
122
                utils.Log(1, fmt.Sprintf("Adding %v sample hit records to service %v", 360, service.Name))
123
                createdAt := since
124
                alpha := float64(1.05)
125
126
                for hi := int64(1); hi <= 168; hi++ {
127
                        alpha += 0.01
128
                        rand.Seed(time.Now().UnixNano())
129
                        latency := rand.Float64() * alpha
130
                        createdAt = createdAt.Add(1 * time.Hour)
131
                        hit := &types.Hit{
132
                                Service:   service.Id,
133
                                CreatedAt: createdAt,
134
                                Latency:   latency,
135
                        }
136
                        service.CreateHit(hit)
137
                }
138
        }
139
        return nil
140
}
func DbConfig.Update
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

266
func (c *DbConfig) Update() error {
267
        var err error
268
        config, err := os.Create(utils.Directory + "/config.yml")
269
        if err != nil {
270
                utils.Log(4, err)
271
                return err
272
        }
273
        data, err := yaml.Marshal(c)
274
        if err != nil {
275
                utils.Log(3, err)
276
                return err
277
        }
278
        config.WriteString(string(data))
279
        config.Close()
280
        return err
281
}
func Dbtimestamp
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

180
func Dbtimestamp(group string, column string) string {
181
        seconds := 60
182
        if group == "second" {
183
                seconds = 60
184
        } else if group == "hour" {
185
                seconds = 3600
186
        } else if group == "day" {
187
                seconds = 86400
188
        }
189
        switch CoreApp.DbConnection {
190
        case "mysql":
191
                return fmt.Sprintf("CONCAT(date_format(created_at, '%%Y-%%m-%%d %%H:00:00')) AS timeframe, AVG(%v) AS value", column)
192
        case "sqlite":
193
                return fmt.Sprintf("datetime((strftime('%%s', created_at) / %v) * %v, 'unixepoch') AS timeframe, AVG(%v) as value", seconds, seconds, column)
194
        case "postgres":
195
                return fmt.Sprintf("date_trunc('%v', created_at) AS timeframe, AVG(%v) AS value", group, column)
196
        default:
197
                return ""
198
        }
199
}
func ExportChartsJs
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go:

86
func ExportChartsJs() string {
87
        render, err := source.JsBox.String("charts.js")
88
        if err != nil {
89
                utils.Log(4, err)
90
        }
91
        t := template.New("charts")
92
        t.Funcs(template.FuncMap{
93
                "safe": func(html string) template.HTML {
94
                        return template.HTML(html)
95
                },
96
        })
97
        t.Parse(render)
98
        var tpl bytes.Buffer
99
        if err := t.Execute(&tpl, CoreApp.Services); err != nil {
100
                utils.Log(3, err)
101
        }
102
        result := tpl.String()
103
        return result
104
}
func Service.TotalUptime
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

289
func (s *Service) TotalUptime() string {
290
        hits, _ := s.TotalHits()
291
        failures, _ := s.TotalFailures()
292
        percent := float64(failures) / float64(hits) * 100
293
        percent = 100 - percent
294
        if percent < 0 {
295
                percent = 0
296
        }
297
        amount := fmt.Sprintf("%0.2f", percent)
298
        if amount == "100.00" {
299
                amount = "100"
300
        }
301
        return amount
302
}
func Service.AvgTime
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

92
func (s *Service) AvgTime() float64 {
93
        total, _ := s.TotalHits()
94
        if total == 0 {
95
                return float64(0)
96
        }
97
        sum, _ := s.Sum()
98
        avg := sum / float64(total) * 100
99
        amount := fmt.Sprintf("%0.0f", avg*10)
100
        val, _ := strconv.ParseFloat(amount, 10)
101
        return val
102
}
func DbConfig.CreateCore
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

304
func (c *DbConfig) CreateCore() *Core {
305
        newCore := &types.Core{
306
                Name:        c.Project,
307
                Description: c.Description,
308
                Config:      "config.yml",
309
                ApiKey:      c.ApiKey,
310
                ApiSecret:   c.ApiSecret,
311
                Domain:      c.Domain,
312
                MigrationId: time.Now().Unix(),
313
        }
314
        db := coreDB().Create(&newCore)
315
        if db.Error == nil {
316
                CoreApp = &Core{Core: newCore}
317
        }
318
        CoreApp, err := SelectCore()
319
        if err != nil {
320
                utils.Log(4, err)
321
        }
322
        return CoreApp
323
}
func Checkin.RecheckCheckinFailure
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go:

132
func (c *Checkin) RecheckCheckinFailure(guard chan struct{}) {
133
        between := time.Now().Sub(time.Now()).Seconds()
134
        if between > float64(c.Interval) {
135
                fmt.Println("rechecking every 15 seconds!")
136
                time.Sleep(15 * time.Second)
137
                guard <- struct{}{}
138
                c.RecheckCheckinFailure(guard)
139
        } else {
140
                fmt.Println("i recovered!!")
141
        }
142
        <-guard
143
}
func Service.GraphData
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

248
func (s *Service) GraphData() string {
249
        start := time.Now().Add((-24 * 7) * time.Hour)
250
        end := time.Now()
251
        obj := GraphDataRaw(s, start, end, "hour", "latency")
252
        data, err := json.Marshal(obj)
253
        if err != nil {
254
                utils.Log(2, err)
255
                return ""
256
        }
257
        return string(data)
258
}
func InitApp
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

60
func InitApp() {
61
        SelectCore()
62
        insertNotifierDB()
63
        CoreApp.SelectAllServices()
64
        checkServices()
65
        CoreApp.Notifications = notifier.Load()
66
        go DatabaseMaintence()
67
}
func CountFailures
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go:

99
func CountFailures() uint64 {
100
        var count uint64
101
        err := failuresDB().Count(&count)
102
        if err.Error != nil {
103
                utils.Log(2, err.Error)
104
                return 0
105
        }
106
        return count
107
}
func Core.Count24HFailures
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go:

88
func (c *Core) Count24HFailures() uint64 {
89
        var count uint64
90
        for _, s := range CoreApp.Services {
91
                service := s.(*Service)
92
                fails, _ := service.TotalFailures24()
93
                count += fails
94
        }
95
        return count
96
}
func DateScanObj.ToString
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

238
func (d *DateScanObj) ToString() string {
239
        data, err := json.Marshal(d.Array)
240
        if err != nil {
241
                utils.Log(2, err)
242
                return "{}"
243
        }
244
        return string(data)
245
}
func DatabaseMaintence
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

247
func DatabaseMaintence() {
248
        for range time.Tick(60 * time.Minute) {
249
                utils.Log(1, "Checking for database records older than 3 months...")
250
                since := time.Now().AddDate(0, -3, 0).UTC()
251
                DeleteAllSince("failures", since)
252
                DeleteAllSince("hits", since)
253
        }
254
}
func Checkin.Expected
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go:

69
func (u *Checkin) Expected() time.Duration {
70
        last := u.Last().CreatedAt
71
        now := time.Now()
72
        lastDir := now.Sub(last)
73
        sub := time.Duration(u.Period() - lastDir)
74
        return sub
75
}
func Service.lastFailure
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

144
func (s *Service) lastFailure() *Failure {
145
        limited := s.LimitedFailures()
146
        if len(limited) == 0 {
147
                return nil
148
        }
149
        last := limited[len(limited)-1]
150
        return last
151
}
func Core.AllOnline
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

126
func (c Core) AllOnline() bool {
127
        for _, s := range CoreApp.Services {
128
                if !s.Select().Online {
129
                        return false
130
                }
131
        }
132
        return true
133
}
func Core.CurrentTime
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

88
func (c Core) CurrentTime() string {
89
        t := time.Now().UTC()
90
        current := utils.Timezoner(t, c.Timezone)
91
        ansic := "Monday 03:04:05 PM"
92
        return current.Format(ansic)
93
}
func Service.DeleteFailures
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go:

59
func (u *Service) DeleteFailures() {
60
        err := DbSession.Exec(`DELETE FROM failures WHERE service = ?`, u.Id)
61
        if err.Error != nil {
62
                utils.Log(3, fmt.Sprintf("failed to delete all failures: %v", err))
63
        }
64
        u.Failures = nil
65
}
func Service.TotalFailures
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go:

116
func (s *Service) TotalFailures() (uint64, error) {
117
        var count uint64
118
        rows := failuresDB().Where("service = ?", s.Id)
119
        err := rows.Count(&count)
120
        return count, err.Error
121
}
func DbConfig.InsertCore
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

177
func (db *DbConfig) InsertCore() (*Core, error) {
178
        CoreApp = &Core{Core: &types.Core{
179
                Name:        db.Project,
180
                Description: db.Description,
181
                Config:      "config.yml",
182
                ApiKey:      utils.NewSHA1Hash(9),
183
                ApiSecret:   utils.NewSHA1Hash(16),
184
                Domain:      db.Domain,
185
                MigrationId: time.Now().Unix(),
186
        }}
187
        CoreApp.DbConnection = db.DbConn
188
        query := coreDB().Create(&CoreApp)
189
        return CoreApp, query.Error
190
}
func DeleteAllSince
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

257
func DeleteAllSince(table string, date time.Time) {
258
        sql := fmt.Sprintf("DELETE FROM %v WHERE created_at < '%v';", table, date.Format("2006-01-02"))
259
        db := DbSession.Raw(sql)
260
        if db.Error != nil {
261
                utils.Log(2, db.Error)
262
        }
263
}
func Hit.BeforeCreate
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

129
func (u *Hit) BeforeCreate() (err error) {
130
        if u.CreatedAt.IsZero() {
131
                u.CreatedAt = time.Now().UTC()
132
        }
133
        return
134
}
func Failure.BeforeCreate
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

137
func (u *Failure) BeforeCreate() (err error) {
138
        if u.CreatedAt.IsZero() {
139
                u.CreatedAt = time.Now().UTC()
140
        }
141
        return
142
}
func checkServices
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go:

34
func checkServices() {
35
        utils.Log(1, fmt.Sprintf("Starting monitoring process for %v Services", len(CoreApp.Services)))
36
        for _, ser := range CoreApp.Services {
37
                //go obj.StartCheckins()
38
                go ser.CheckQueue(true)
39
        }
40
}
func Core.BaseSASS
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

109
func (c Core) BaseSASS() string {
110
        if !source.UsingAssets(utils.Directory) {
111
                return ""
112
        }
113
        return source.OpenAsset(utils.Directory, "scss/base.scss")
114
}
func Core.SassVars
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

101
func (c Core) SassVars() string {
102
        if !source.UsingAssets(utils.Directory) {
103
                return ""
104
        }
105
        return source.OpenAsset(utils.Directory, "scss/variables.scss")
106
}
func SelectCheckin
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go:

50
func SelectCheckin(api string) *Checkin {
51
        var checkin Checkin
52
        checkinDB().Where("api_key = ?", api).First(&checkin)
53
        return &checkin
54
}
func Core.MobileSASS
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

118
func (c Core) MobileSASS() string {
119
        if !source.UsingAssets(utils.Directory) {
120
                return ""
121
        }
122
        return source.OpenAsset(utils.Directory, "scss/mobile.scss")
123
}
func DeleteConfig
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/configs.go:

133
func DeleteConfig() {
134
        err := os.Remove(utils.Directory + "/config.yml")
135
        if err != nil {
136
                utils.Log(3, err)
137
        }
138
}
func CloseDB
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

81
func CloseDB() {
82
        if DbSession != nil {
83
                DbSession.DB().Close()
84
        }
85
}
func Service.Online24
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

105
func (s *Service) Online24() float32 {
106
        ago := time.Now().Add(-24 * time.Hour)
107
        return s.OnlineSince(ago)
108
}
func Service.TotalFailures24
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go:

110
func (s *Service) TotalFailures24() (uint64, error) {
111
        ago := time.Now().Add(-24 * time.Hour)
112
        return s.TotalFailuresSince(ago)
113
}
func CheckinHit.Ago
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go:

126
func (f *CheckinHit) Ago() string {
127
        got, _ := timeago.TimeAgoWithTime(time.Now(), f.CreatedAt)
128
        return got
129
}
func Service.ToJSON
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

86
func (s *Service) ToJSON() string {
87
        data, _ := json.Marshal(s)
88
        return string(data)
89
}
func Failure.Delete
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go:

82
func (f *Failure) Delete() error {
83
        db := failuresDB().Delete(f)
84
        return db.Error
85
}
func UpdateCore
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

82
func UpdateCore(c *Core) (*Core, error) {
83
        db := coreDB().Update(&c)
84
        return c, db.Error
85
}
func Failure.Ago
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go:

76
func (f *Failure) Ago() string {
77
        got, _ := timeago.TimeAgoWithTime(time.Now(), f.CreatedAt)
78
        return got
79
}
func SaveFile
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go:

106
func SaveFile(filename string, data []byte) error {
107
        err := ioutil.WriteFile(filename, data, 0644)
108
        return err
109
}
func Service.AvgUptime24
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

261
func (s *Service) AvgUptime24() string {
262
        ago := time.Now().Add(-24 * time.Hour)
263
        return s.AvgUptime(ago)
264
}
func Service.HitsBetween
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

75
func (s *Service) HitsBetween(t1, t2 time.Time, group string, column string) *gorm.DB {
76
        selector := Dbtimestamp(group, column)
77
        return DbSession.Model(&types.Hit{}).Select(selector).Where("service = ? AND created_at BETWEEN ? AND ?", s.Id, t1.Format(types.TIME_DAY), t2.Format(types.TIME_DAY)).Order("timeframe asc", false).Group("timeframe")
78
}
func DbConfig.waitForDb
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

240
func (db *DbConfig) waitForDb() error {
241
        time.Sleep(5 * time.Second)
242
        return db.Connect(true, utils.Directory)
243
}
func Hit.AfterFind
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go:

99
func (s *Hit) AfterFind() (err error) {
100
        s.CreatedAt = utils.Timezoner(s.CreatedAt, CoreApp.Timezone)
101
        return
102
}
func @62:14
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go:

62
func() bool {
63
                        return CoreApp.UseCdn
64
                }
func @68:10
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go:

68
func() string {
69
                        return "/"
70
                }
func Service.UpdateSingle
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

337
func (u *Service) UpdateSingle(attr ...interface{}) error {
338
        return servicesDB().Model(u).Update(attr).Error
339
}
func @93:11
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go:

93
func(html string) template.HTML {
94
                        return template.HTML(html)
95
                }
func @65:17
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go:

65
func(html string) string {
66
                        return utils.UnderScoreString(html)
67
                }
func Core.ServicesCount
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

377
func (c *Core) ServicesCount() int {
378
        return len(c.Services)
379
}
func Core.UsingAssets
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

96
func (c Core) UsingAssets() bool {
97
        return source.UsingAssets(utils.Directory)
98
}
func @71:17
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go:

71
func() string {
72
                        return ExportChartsJs()
73
                }
func @59:14
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go:

59
func() *Core {
60
                        return CoreApp
61
                }
func Core.ToCore
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go:

55
func (c *Core) ToCore() *types.Core {
56
        return c.Core
57
}
func @56:14
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go:

56
func() string {
57
                        return VERSION
58
                }
func Service.DowntimeText
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go:

175
func (s *Service) DowntimeText() string {
176
        return fmt.Sprintf("%v has been offline for %v", s.Name, utils.DurationReadable(s.Downtime()))
177
}
func injectDatabase
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go:

27
func injectDatabase() {
28
        Configs.Connect(false, utils.Directory)
29
}
func @53:11
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go:

53
func(html string) template.HTML {
54
                        return template.HTML(html)
55
                }
func Checkin.String
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go:

35
func (c *Checkin) String() string {
36
        return c.ApiKey
37
}
func @50:9
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go:

50
func(html string) template.JS {
51
                        return template.JS(html)
52
                }
Package Overview: github.com/hunterlong/statup/core/notifier 72.73%

This is a coverage report created after analysis of the github.com/hunterlong/statup/core/notifier package. It has been generated with the following command:

gocov test github.com/hunterlong/statup/core/notifier | gocov-html

Here are the stats. Please select a function name to view its implementation and see what's left for testing.

Init(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%7/7
Load(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%7/7
Notification.SentLast(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%6/6
Update(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%6/6
Notification.IsRunning(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%5/5
Notification.LastSent(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%5/5
SelectNotification(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%3/3
OnDeletedService(...)github.com/hunterlong/statup/core/notifier/events.go100.00%3/3
OnNewUser(...)github.com/hunterlong/statup/core/notifier/events.go100.00%3/3
OnUpdatedUser(...)github.com/hunterlong/statup/core/notifier/events.go100.00%3/3
OnDeletedUser(...)github.com/hunterlong/statup/core/notifier/events.go100.00%3/3
OnUpdatedCore(...)github.com/hunterlong/statup/core/notifier/events.go100.00%3/3
inLimits(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%3/3
OnUpdatedService(...)github.com/hunterlong/statup/core/notifier/events.go100.00%3/3
OnUpdatedNotifier(...)github.com/hunterlong/statup/core/notifier/events.go100.00%3/3
OnNewService(...)github.com/hunterlong/statup/core/notifier/events.go100.00%3/3
OnSuccess(...)github.com/hunterlong/statup/core/notifier/events.go100.00%3/3
OnFailure(...)github.com/hunterlong/statup/core/notifier/events.go100.00%3/3
isType(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%3/3
reverseLogs(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%3/3
Notification.makeLog(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%2/2
Notification.SentLastHour(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%2/2
isEnabled(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%2/2
Notification.SentLastMinute(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%2/2
Notification.close(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%2/2
isInDatabase(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%2/2
Notification.CanTest(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%1/1
Notification.Logs(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%1/1
asNotification(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%1/1
modelDb(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%1/1
Notification.AddQueue(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%1/1
Notification.start(...)github.com/hunterlong/statup/core/notifier/notifiers.go100.00%1/1
Queue(...)github.com/hunterlong/statup/core/notifier/notifiers.go94.12%16/17
checkNotifierForm(...)github.com/hunterlong/statup/core/notifier/audit.go83.33%5/6
insertDatabase(...)github.com/hunterlong/statup/core/notifier/notifiers.go80.00%4/5
contains(...)github.com/hunterlong/statup/core/notifier/audit.go75.00%3/4
Notification.WithinLimits(...)github.com/hunterlong/statup/core/notifier/notifiers.go72.73%8/11
install(...)github.com/hunterlong/statup/core/notifier/notifiers.go71.43%5/7
AddNotifier(...)github.com/hunterlong/statup/core/notifier/notifiers.go71.43%5/7
startAllNotifiers(...)github.com/hunterlong/statup/core/notifier/notifiers.go57.14%4/7
Notification.GetValue(...)github.com/hunterlong/statup/core/notifier/notifiers.go30.77%4/13
normalizeType(...)github.com/hunterlong/statup/core/notifier/notifiers.go22.22%2/9
SelectNotifier(...)github.com/hunterlong/statup/core/notifier/notifiers.go0.00%0/8
Notification.removeQueue(...)github.com/hunterlong/statup/core/notifier/notifiers.go0.00%0/6
OnSave(...)github.com/hunterlong/statup/core/notifier/events.go0.00%0/5
OnStart(...)github.com/hunterlong/statup/core/notifier/events.go0.00%0/3
OnNewNotifier(...)github.com/hunterlong/statup/core/notifier/events.go0.00%0/3
SetDB(...)github.com/hunterlong/statup/core/notifier/notifiers.go0.00%0/1
Notification.ResetQueue(...)github.com/hunterlong/statup/core/notifier/notifiers.go0.00%0/1
github.com/hunterlong/statup/core/notifier72.73%152/209
func Init
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

239
func Init(n Notifier) (*Notification, error) {
240
        err := install(n)
241
        var notify *Notification
242
        if err == nil {
243
                notify, _ = SelectNotification(n)
244
                notify.testable = isType(n, new(Tester))
245
                notify.Form = n.Select().Form
246
        }
247
        return notify, err
248
}
func Load
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

122
func Load() []types.AllNotifiers {
123
        var notifiers []types.AllNotifiers
124
        for _, comm := range AllCommunications {
125
                n := comm.(Notifier)
126
                Init(n)
127
                notifiers = append(notifiers, n)
128
        }
129
        startAllNotifiers()
130
        return notifiers
131
}
func Notification.SentLast
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

330
func (f *Notification) SentLast(since time.Time) int {
331
        sent := 0
332
        for _, v := range f.Logs() {
333
                lastTime := time.Time(v.Time)
334
                if lastTime.After(since) {
335
                        sent++
336
                }
337
        }
338
        return sent
339
}
func Update
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

203
func Update(n Notifier, notif *Notification) (*Notification, error) {
204
        err := db.Model(&Notification{}).Update(notif)
205
        if notif.Enabled {
206
                notif.close()
207
                notif.start()
208
                go Queue(n)
209
        }
210
        return notif, err.Error
211
}
func Notification.IsRunning
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

427
func (n *Notification) IsRunning() bool {
428
        if n.Running == nil {
429
                return false
430
        }
431
        select {
432
        case <-n.Running:
433
                return false
434
        default:
435
                return true
436
        }
437
}
func Notification.LastSent
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

308
func (f *Notification) LastSent() time.Duration {
309
        if len(f.logs) == 0 {
310
                return time.Duration(0)
311
        }
312
        last := f.Logs()[0]
313
        since := time.Since(last.Timestamp)
314
        return since
315
}
func SelectNotification
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

196
func SelectNotification(n Notifier) (*Notification, error) {
197
        notifier := n.Select()
198
        err := db.Model(&Notification{}).Where("method = ?", notifier.Method).Scan(&notifier)
199
        return notifier, err.Error
200
}
func OnDeletedService
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go:

69
func OnDeletedService(s *types.Service) {
70
        for _, comm := range AllCommunications {
71
                if isType(comm, new(ServiceEvents)) && isEnabled(comm) && inLimits(comm) {
72
                        comm.(ServiceEvents).OnDeletedService(s)
73
                }
74
        }
75
}
func OnNewUser
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go:

78
func OnNewUser(u *types.User) {
79
        for _, comm := range AllCommunications {
80
                if isType(comm, new(UserEvents)) && isEnabled(comm) && inLimits(comm) {
81
                        comm.(UserEvents).OnNewUser(u)
82
                }
83
        }
84
}
func OnUpdatedUser
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go:

87
func OnUpdatedUser(u *types.User) {
88
        for _, comm := range AllCommunications {
89
                if isType(comm, new(UserEvents)) && isEnabled(comm) && inLimits(comm) {
90
                        comm.(UserEvents).OnUpdatedUser(u)
91
                }
92
        }
93
}
func OnDeletedUser
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go:

96
func OnDeletedUser(u *types.User) {
97
        for _, comm := range AllCommunications {
98
                if isType(comm, new(UserEvents)) && isEnabled(comm) && inLimits(comm) {
99
                        comm.(UserEvents).OnDeletedUser(u)
100
                }
101
        }
102
}
func OnUpdatedCore
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go:

105
func OnUpdatedCore(c *types.Core) {
106
        for _, comm := range AllCommunications {
107
                if isType(comm, new(CoreEvents)) && isEnabled(comm) && inLimits(comm) {
108
                        comm.(CoreEvents).OnUpdatedCore(c)
109
                }
110
        }
111
}
func inLimits
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

383
func inLimits(n interface{}) bool {
384
        notifier := n.(Notifier).Select()
385
        ok, _ := notifier.WithinLimits()
386
        return ok
387
}
func OnUpdatedService
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go:

60
func OnUpdatedService(s *types.Service) {
61
        for _, comm := range AllCommunications {
62
                if isType(comm, new(ServiceEvents)) && isEnabled(comm) && inLimits(comm) {
63
                        comm.(ServiceEvents).OnUpdatedService(s)
64
                }
65
        }
66
}
func OnUpdatedNotifier
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go:

132
func OnUpdatedNotifier(n *Notification) {
133
        for _, comm := range AllCommunications {
134
                if isType(comm, new(NotifierEvents)) && isEnabled(comm) && inLimits(comm) {
135
                        comm.(NotifierEvents).OnUpdatedNotifier(n)
136
                }
137
        }
138
}
func OnNewService
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go:

51
func OnNewService(s *types.Service) {
52
        for _, comm := range AllCommunications {
53
                if isType(comm, new(ServiceEvents)) && isEnabled(comm) && inLimits(comm) {
54
                        comm.(ServiceEvents).OnNewService(s)
55
                }
56
        }
57
}
func OnSuccess
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go:

42
func OnSuccess(s *types.Service) {
43
        for _, comm := range AllCommunications {
44
                if isType(comm, new(BasicEvents)) && isEnabled(comm) && inLimits(comm) {
45
                        comm.(BasicEvents).OnSuccess(s)
46
                }
47
        }
48
}
func OnFailure
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go:

33
func OnFailure(s *types.Service, f *types.Failure) {
34
        for _, comm := range AllCommunications {
35
                if isType(comm, new(BasicEvents)) && isEnabled(comm) && inLimits(comm) {
36
                        comm.(BasicEvents).OnFailure(s, f)
37
                }
38
        }
39
}
func isType
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

370
func isType(n interface{}, obj interface{}) bool {
371
        one := reflect.TypeOf(n)
372
        two := reflect.ValueOf(obj).Elem()
373
        return one.Implements(two.Type())
374
}
func reverseLogs
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

182
func reverseLogs(input []*NotificationLog) []*NotificationLog {
183
        if len(input) == 0 {
184
                return input
185
        }
186
        return append(reverseLogs(input[1:]), input[0])
187
}
func Notification.makeLog
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

167
func (n *Notification) makeLog(msg interface{}) {
168
        log := &NotificationLog{
169
                Message:   normalizeType(msg),
170
                Time:      utils.Timestamp(time.Now()),
171
                Timestamp: time.Now(),
172
        }
173
        n.logs = append(n.logs, log)
174
}
func Notification.SentLastHour
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

318
func (f *Notification) SentLastHour() int {
319
        since := time.Now().Add(-1 * time.Hour)
320
        return f.SentLast(since)
321
}
func isEnabled
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

377
func isEnabled(n interface{}) bool {
378
        notifier, _ := SelectNotification(n.(Notifier))
379
        return notifier.Enabled
380
}
func Notification.SentLastMinute
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

324
func (f *Notification) SentLastMinute() int {
325
        since := time.Now().Add(-1 * time.Minute)
326
        return f.SentLast(since)
327
}
func Notification.close
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

420
func (n *Notification) close() {
421
        if n.IsRunning() {
422
                close(n.Running)
423
        }
424
}
func isInDatabase
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

190
func isInDatabase(n *Notification) bool {
191
        inDb := modelDb(n).RecordNotFound()
192
        return !inDb
193
}
func Notification.CanTest
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

88
func (n *Notification) CanTest() bool {
89
        return n.testable
90
}
func Notification.Logs
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

177
func (n *Notification) Logs() []*NotificationLog {
178
        return reverseLogs(n.logs)
179
}
func asNotification
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

103
func asNotification(n Notifier) *Notification {
104
        return n.Select()
105
}
func modelDb
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

93
func modelDb(n *Notification) *gorm.DB {
94
        return db.Model(&Notification{}).Where("method = ?", n.Method).Find(n)
95
}
func Notification.AddQueue
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

83
func (n *Notification) AddQueue(msg interface{}) {
84
        n.Queue = append(n.Queue, msg)
85
}
func Notification.start
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

415
func (n *Notification) start() {
416
        n.Running = make(chan bool)
417
}
func Queue
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

265
func Queue(n Notifier) {
266
        notification := n.Select()
267
        rateLimit := notification.Delay
268
269
CheckNotifier:
270
        for {
271
                select {
272
                case <-notification.Running:
273
                        break CheckNotifier
274
                case <-time.After(rateLimit):
275
                        notification = n.Select()
276
                        if len(notification.Queue) > 0 {
277
                                ok, _ := notification.WithinLimits()
278
                                if ok {
279
                                        msg := notification.Queue[0]
280
                                        err := n.Send(msg)
281
                                        if err != nil {
282
                                                utils.Log(2, fmt.Sprintf("notifier %v had an error: %v", notification.Method, err))
283
                                        }
284
                                        notification.makeLog(msg)
285
                                        notification.Queue = notification.Queue[1:]
286
                                        rateLimit = notification.Delay
287
                                }
288
                        }
289
                }
290
                continue
291
        }
292
}
func checkNotifierForm
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/audit.go:

28
func checkNotifierForm(n Notifier) error {
29
        notifier := asNotification(n)
30
        for _, f := range notifier.Form {
31
                contains := contains(f.DbField, allowed_vars)
32
                if !contains {
33
                        return errors.New(fmt.Sprintf("the DbField '%v' is not allowed, allowed vars: %v", f.DbField, allowed_vars))
34
                }
35
        }
36
        return nil
37
}
func insertDatabase
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

214
func insertDatabase(n *Notification) (int64, error) {
215
        n.Limits = 3
216
        query := db.Create(n)
217
        if query.Error != nil {
218
                return 0, query.Error
219
        }
220
        return n.Id, query.Error
221
}
func contains
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/audit.go:

39
func contains(s string, arr []string) bool {
40
        for _, v := range arr {
41
                if strings.ToLower(s) == v {
42
                        return true
43
                }
44
        }
45
        return false
46
}
func Notification.WithinLimits
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

390
func (notify *Notification) WithinLimits() (bool, error) {
391
        if notify.SentLastMinute() == 0 {
392
                return true, nil
393
        }
394
        if notify.SentLastMinute() >= notify.Limits {
395
                return false, errors.New(fmt.Sprintf("notifier sent %v out of %v in last minute", notify.SentLastMinute(), notify.Limits))
396
        }
397
        if notify.Delay.Seconds() == 0 {
398
                notify.Delay = time.Duration(500 * time.Millisecond)
399
        }
400
        if notify.LastSent().Seconds() == 0 {
401
                return true, nil
402
        }
403
        if notify.Delay.Seconds() >= notify.LastSent().Seconds() {
404
                return false, errors.New(fmt.Sprintf("notifiers delay (%v) is greater than last message sent (%v)", notify.Delay.Seconds(), notify.LastSent().Seconds()))
405
        }
406
        return true, nil
407
}
func install
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

295
func install(n Notifier) error {
296
        inDb := isInDatabase(n.Select())
297
        if !inDb {
298
                _, err := insertDatabase(n.Select())
299
                if err != nil {
300
                        utils.Log(3, err)
301
                        return err
302
                }
303
        }
304
        return nil
305
}
func AddNotifier
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

108
func AddNotifier(n Notifier) error {
109
        if isType(n, new(Notifier)) {
110
                err := checkNotifierForm(n)
111
                if err != nil {
112
                        return err
113
                }
114
                AllCommunications = append(AllCommunications, n)
115
        } else {
116
                return errors.New("notifier does not have the required methods")
117
        }
118
        return nil
119
}
func startAllNotifiers
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

251
func startAllNotifiers() {
252
        for _, comm := range AllCommunications {
253
                if isType(comm, new(Notifier)) {
254
                        notify := comm.(Notifier)
255
                        if notify.Select().Enabled {
256
                                notify.Select().close()
257
                                notify.Select().start()
258
                                go Queue(notify)
259
                        }
260
                }
261
        }
262
}
func Notification.GetValue
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

342
func (n *Notification) GetValue(dbField string) string {
343
        dbField = strings.ToLower(dbField)
344
        switch dbField {
345
        case "host":
346
                return n.Host
347
        case "port":
348
                return fmt.Sprintf("%v", n.Port)
349
        case "username":
350
                return n.Username
351
        case "password":
352
                if n.Password != "" {
353
                        return "##########"
354
                }
355
        case "var1":
356
                return n.Var1
357
        case "var2":
358
                return n.Var2
359
        case "api_key":
360
                return n.ApiKey
361
        case "api_secret":
362
                return n.ApiSecret
363
        case "limits":
364
                return utils.ToString(int(n.Limits))
365
        }
366
        return ""
367
}
func normalizeType
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

134
func normalizeType(ty interface{}) string {
135
        switch v := ty.(type) {
136
        case int, int32, int64:
137
                return fmt.Sprintf("%v", v)
138
        case float32, float64:
139
                return fmt.Sprintf("%v", v)
140
        case string:
141
                return v
142
        case []byte:
143
                return string(v)
144
        case []string:
145
                return fmt.Sprintf("%v", v)
146
        case interface{}, map[string]interface{}:
147
                j, _ := json.Marshal(v)
148
                return string(j)
149
        default:
150
                return fmt.Sprintf("%v", v)
151
        }
152
}
func SelectNotifier
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

224
func SelectNotifier(method string) (*Notification, Notifier, error) {
225
        for _, comm := range AllCommunications {
226
                n, ok := comm.(Notifier)
227
                if !ok {
228
                        return nil, nil, errors.New(fmt.Sprintf("incorrect notification type: %v", reflect.TypeOf(n).String()))
229
                }
230
                notifier := n.Select()
231
                if notifier.Method == method {
232
                        return notifier, comm.(Notifier), nil
233
                }
234
        }
235
        return nil, nil, nil
236
}
func Notification.removeQueue
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

155
func (n *Notification) removeQueue(msg interface{}) interface{} {
156
        var newArr []interface{}
157
        for _, q := range n.Queue {
158
                if q != msg {
159
                        newArr = append(newArr, q)
160
                }
161
        }
162
        n.Queue = newArr
163
        return newArr
164
}
func OnSave
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go:

21
func OnSave(method string) {
22
        for _, comm := range AllCommunications {
23
                if isType(comm, new(Notifier)) {
24
                        notifier := comm.(Notifier)
25
                        if notifier.Select().Method == method {
26
                                notifier.OnSave()
27
                        }
28
                }
29
        }
30
}
func OnStart
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go:

114
func OnStart(c *types.Core) {
115
        for _, comm := range AllCommunications {
116
                if isType(comm, new(CoreEvents)) && isEnabled(comm) && inLimits(comm) {
117
                        comm.(CoreEvents).OnUpdatedCore(c)
118
                }
119
        }
120
}
func OnNewNotifier
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go:

123
func OnNewNotifier(n *Notification) {
124
        for _, comm := range AllCommunications {
125
                if isType(comm, new(NotifierEvents)) && isEnabled(comm) && inLimits(comm) {
126
                        comm.(NotifierEvents).OnNewNotifier(n)
127
                }
128
        }
129
}
func SetDB
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

98
func SetDB(d *gorm.DB) {
99
        db = d
100
}
func Notification.ResetQueue
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go:

410
func (n *Notification) ResetQueue() {
411
        n.Queue = nil
412
}
Package Overview: github.com/hunterlong/statup/handlers 64.61%

This is a coverage report created after analysis of the github.com/hunterlong/statup/handlers package. It has been generated with the following command:

gocov test github.com/hunterlong/statup/handlers | gocov-html

Here are the stats. Please select a function name to view its implementation and see what's left for testing.

Router(...)github.com/hunterlong/statup/handlers/routes.go100.00%67/67
prometheusHandler(...)github.com/hunterlong/statup/handlers/prometheus.go100.00%22/22
saveSASSHandler(...)github.com/hunterlong/statup/handlers/settings.go100.00%13/13
renderServiceChartsHandler(...)github.com/hunterlong/statup/handlers/services.go100.00%10/10
logsHandler(...)github.com/hunterlong/statup/handlers/dashboard.go100.00%10/10
isAuthorized(...)github.com/hunterlong/statup/handlers/prometheus.go100.00%8/8
usersEditHandler(...)github.com/hunterlong/statup/handlers/users.go100.00%7/7
servicesDeleteFailuresHandler(...)github.com/hunterlong/statup/handlers/services.go100.00%7/7
RunHTTPServer(...)github.com/hunterlong/statup/handlers/handlers.go100.00%6/6
deleteAssetsHandler(...)github.com/hunterlong/statup/handlers/settings.go100.00%6/6
logsLineHandler(...)github.com/hunterlong/statup/handlers/dashboard.go100.00%5/5
helpHandler(...)github.com/hunterlong/statup/handlers/dashboard.go100.00%5/5
usersHandler(...)github.com/hunterlong/statup/handlers/users.go100.00%5/5
settingsHandler(...)github.com/hunterlong/statup/handlers/settings.go100.00%4/4
logoutHandler(...)github.com/hunterlong/statup/handlers/dashboard.go100.00%4/4
servicesHandler(...)github.com/hunterlong/statup/handlers/services.go100.00%4/4
resetRouter(...)github.com/hunterlong/statup/handlers/routes.go100.00%2/2
error404Handler(...)github.com/hunterlong/statup/handlers/handlers.go100.00%2/2
parseForm(...)github.com/hunterlong/statup/handlers/settings.go100.00%2/2
parseGet(...)github.com/hunterlong/statup/handlers/settings.go100.00%2/2
@138:15(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@154:17(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@126:17(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@129:10(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@151:15(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@88:20(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@157:14(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@93:11(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@96:11(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@99:14(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@102:14(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@105:15(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@108:14(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@135:12(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
saveSettingsHandler(...)github.com/hunterlong/statup/handlers/settings.go96.15%25/26
servicesUpdateHandler(...)github.com/hunterlong/statup/handlers/services.go93.55%29/31
loginHandler(...)github.com/hunterlong/statup/handlers/dashboard.go92.86%13/14
createUserHandler(...)github.com/hunterlong/statup/handlers/users.go92.31%12/13
createServiceHandler(...)github.com/hunterlong/statup/handlers/services.go90.91%20/22
servicesViewHandler(...)github.com/hunterlong/statup/handlers/services.go88.24%15/17
saveNotificationHandler(...)github.com/hunterlong/statup/handlers/settings.go86.96%40/46
apiIndexHandler(...)github.com/hunterlong/statup/handlers/api.go84.62%11/13
apiServiceDataHandler(...)github.com/hunterlong/statup/handlers/api.go83.33%10/12
apiAllServicesHandler(...)github.com/hunterlong/statup/handlers/api.go81.82%9/11
setupHandler(...)github.com/hunterlong/statup/handlers/setup.go81.82%9/11
executeResponse(...)github.com/hunterlong/statup/handlers/handlers.go80.00%24/30
servicesDeleteHandler(...)github.com/hunterlong/statup/handlers/services.go80.00%8/10
usersDeleteHandler(...)github.com/hunterlong/statup/handlers/users.go76.92%10/13
resetCookies(...)github.com/hunterlong/statup/handlers/routes.go75.00%3/4
executeJSResponse(...)github.com/hunterlong/statup/handlers/handlers.go72.73%8/11
reorderServiceHandler(...)github.com/hunterlong/statup/handlers/services.go72.73%8/11
saveAssetsHandler(...)github.com/hunterlong/statup/handlers/settings.go71.43%10/14
updateUserHandler(...)github.com/hunterlong/statup/handlers/users.go70.00%14/20
apiServiceUpdateHandler(...)github.com/hunterlong/statup/handlers/api.go70.00%14/20
apiUserUpdateHandler(...)github.com/hunterlong/statup/handlers/api.go68.42%13/19
IsAuthenticated(...)github.com/hunterlong/statup/handlers/handlers.go66.67%8/12
apiAllUsersHandler(...)github.com/hunterlong/statup/handlers/api.go66.67%4/6
processSetupHandler(...)github.com/hunterlong/statup/handlers/setup.go66.07%37/56
apiCreateUsersHandler(...)github.com/hunterlong/statup/handlers/api.go64.71%11/17
apiCreateServiceHandler(...)github.com/hunterlong/statup/handlers/api.go62.50%10/16
apiServiceDeleteHandler(...)github.com/hunterlong/statup/handlers/api.go60.00%9/15
apiUserDeleteHandler(...)github.com/hunterlong/statup/handlers/api.go60.00%9/15
apiServiceHandler(...)github.com/hunterlong/statup/handlers/api.go60.00%6/10
apiUserHandler(...)github.com/hunterlong/statup/handlers/api.go60.00%6/10
dashboardHandler(...)github.com/hunterlong/statup/handlers/dashboard.go60.00%3/5
indexHandler(...)github.com/hunterlong/statup/handlers/index.go50.00%2/4
isAPIAuthorized(...)github.com/hunterlong/statup/handlers/api.go28.57%2/7
testNotificationHandler(...)github.com/hunterlong/statup/handlers/settings.go0.00%0/46
DesktopInit(...)github.com/hunterlong/statup/handlers/index.go0.00%0/42
renderServiceChartHandler(...)github.com/hunterlong/statup/handlers/services.go0.00%0/18
exportHandler(...)github.com/hunterlong/statup/handlers/dashboard.go0.00%0/18
checkinCreateUpdateHandler(...)github.com/hunterlong/statup/handlers/services.go0.00%0/13
apiServicePingDataHandler(...)github.com/hunterlong/statup/handlers/api.go0.00%0/12
apiRenewHandler(...)github.com/hunterlong/statup/handlers/api.go0.00%0/10
pluginSavedHandler(...)github.com/hunterlong/statup/handlers/plugins.go0.00%0/9
@111:11(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/8
checkinUpdateHandler(...)github.com/hunterlong/statup/handlers/services.go0.00%0/7
apiCheckinHandler(...)github.com/hunterlong/statup/handlers/api.go0.00%0/7
pluginsDownloadHandler(...)github.com/hunterlong/statup/handlers/plugins.go0.00%0/5
@144:15(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/2
parseId(...)github.com/hunterlong/statup/handlers/settings.go0.00%0/2
@122:13(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/2
@229:11(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/1
@132:17(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/1
setupResponseError(...)github.com/hunterlong/statup/handlers/setup.go0.00%0/1
@148:13(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/1
@90:9(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/1
@232:15(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/1
trayHandler(...)github.com/hunterlong/statup/handlers/index.go0.00%0/1
@141:10(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/1
github.com/hunterlong/statup/handlers64.61%617/955
func Router
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/routes.go:

34
func Router() *mux.Router {
35
        dir := utils.Directory
36
        r := mux.NewRouter()
37
        r.Handle("/", http.HandlerFunc(indexHandler))
38
        if source.UsingAssets(dir) {
39
                indexHandler := http.FileServer(http.Dir(dir + "/assets/"))
40
                r.PathPrefix("/css/").Handler(http.StripPrefix("/css/", http.FileServer(http.Dir(dir+"/assets/css"))))
41
                r.PathPrefix("/robots.txt").Handler(indexHandler)
42
                r.PathPrefix("/favicon.ico").Handler(indexHandler)
43
                r.PathPrefix("/statup.png").Handler(indexHandler)
44
        } else {
45
                r.PathPrefix("/css/").Handler(http.StripPrefix("/css/", http.FileServer(source.CssBox.HTTPBox())))
46
                r.PathPrefix("/robots.txt").Handler(http.FileServer(source.TmplBox.HTTPBox()))
47
                r.PathPrefix("/favicon.ico").Handler(http.FileServer(source.TmplBox.HTTPBox()))
48
                r.PathPrefix("/statup.png").Handler(http.FileServer(source.TmplBox.HTTPBox()))
49
        }
50
        r.PathPrefix("/js/").Handler(http.StripPrefix("/js/", http.FileServer(source.JsBox.HTTPBox())))
51
        r.Handle("/charts.js", http.HandlerFunc(renderServiceChartsHandler))
52
        r.Handle("/setup", http.HandlerFunc(setupHandler)).Methods("GET")
53
        r.Handle("/setup", http.HandlerFunc(processSetupHandler)).Methods("POST")
54
        r.Handle("/dashboard", http.HandlerFunc(dashboardHandler)).Methods("GET")
55
        r.Handle("/dashboard", http.HandlerFunc(loginHandler)).Methods("POST")
56
        r.Handle("/logout", http.HandlerFunc(logoutHandler))
57
        r.Handle("/plugins/download/{name}", http.HandlerFunc(pluginsDownloadHandler))
58
        r.Handle("/plugins/{name}/save", http.HandlerFunc(pluginSavedHandler)).Methods("POST")
59
        r.Handle("/help", http.HandlerFunc(helpHandler))
60
        r.Handle("/logs", http.HandlerFunc(logsHandler))
61
        r.Handle("/logs/line", http.HandlerFunc(logsLineHandler))
62
63
        // USER Routes
64
        r.Handle("/users", http.HandlerFunc(usersHandler)).Methods("GET")
65
        r.Handle("/users", http.HandlerFunc(createUserHandler)).Methods("POST")
66
        r.Handle("/user/{id}", http.HandlerFunc(usersEditHandler)).Methods("GET")
67
        r.Handle("/user/{id}", http.HandlerFunc(updateUserHandler)).Methods("POST")
68
        r.Handle("/user/{id}/delete", http.HandlerFunc(usersDeleteHandler)).Methods("GET")
69
70
        // SETTINGS Routes
71
        r.Handle("/settings", http.HandlerFunc(settingsHandler)).Methods("GET")
72
        r.Handle("/settings", http.HandlerFunc(saveSettingsHandler)).Methods("POST")
73
        r.Handle("/settings/css", http.HandlerFunc(saveSASSHandler)).Methods("POST")
74
        r.Handle("/settings/build", http.HandlerFunc(saveAssetsHandler)).Methods("GET")
75
        r.Handle("/settings/delete_assets", http.HandlerFunc(deleteAssetsHandler)).Methods("GET")
76
        r.Handle("/settings/notifier/{method}", http.HandlerFunc(saveNotificationHandler)).Methods("POST")
77
        r.Handle("/settings/notifier/{method}/test", http.HandlerFunc(testNotificationHandler)).Methods("POST")
78
        r.Handle("/settings/export", http.HandlerFunc(exportHandler)).Methods("GET")
79
80
        // SERVICE Routes
81
        r.Handle("/services", http.HandlerFunc(servicesHandler)).Methods("GET")
82
        r.Handle("/services", http.HandlerFunc(createServiceHandler)).Methods("POST")
83
        r.Handle("/services/reorder", http.HandlerFunc(reorderServiceHandler)).Methods("POST")
84
        r.Handle("/service/{id}", http.HandlerFunc(servicesViewHandler)).Methods("GET")
85
        r.Handle("/service/{id}", http.HandlerFunc(servicesUpdateHandler)).Methods("POST")
86
        r.Handle("/service/{id}/edit", http.HandlerFunc(servicesViewHandler))
87
        r.Handle("/service/{id}/delete", http.HandlerFunc(servicesDeleteHandler))
88
        r.Handle("/service/{id}/delete_failures", http.HandlerFunc(servicesDeleteFailuresHandler)).Methods("GET")
89
        r.Handle("/service/{id}/checkin", http.HandlerFunc(checkinCreateUpdateHandler)).Methods("POST")
90
        r.Handle("/checkin/{id}", http.HandlerFunc(checkinUpdateHandler))
91
92
        // API SERVICE Routes
93
        r.Handle("/api/services", http.HandlerFunc(apiAllServicesHandler)).Methods("GET")
94
        r.Handle("/api/services", http.HandlerFunc(apiCreateServiceHandler)).Methods("POST")
95
        r.Handle("/api/services/{id}", http.HandlerFunc(apiServiceHandler)).Methods("GET")
96
        r.Handle("/api/services/{id}/data", http.HandlerFunc(apiServiceDataHandler)).Methods("GET")
97
        r.Handle("/api/services/{id}/ping", http.HandlerFunc(apiServicePingDataHandler)).Methods("GET")
98
        r.Handle("/api/services/{id}", http.HandlerFunc(apiServiceUpdateHandler)).Methods("POST")
99
        r.Handle("/api/services/{id}", http.HandlerFunc(apiServiceDeleteHandler)).Methods("DELETE")
100
101
        // API USER Routes
102
        r.Handle("/api/users", http.HandlerFunc(apiAllUsersHandler)).Methods("GET")
103
        r.Handle("/api/users", http.HandlerFunc(apiCreateUsersHandler)).Methods("POST")
104
        r.Handle("/api/users/{id}", http.HandlerFunc(apiUserHandler)).Methods("GET")
105
        r.Handle("/api/users/{id}", http.HandlerFunc(apiUserUpdateHandler)).Methods("POST")
106
        r.Handle("/api/users/{id}", http.HandlerFunc(apiUserDeleteHandler)).Methods("DELETE")
107
108
        // Generic API Routes
109
        r.Handle("/api", http.HandlerFunc(apiIndexHandler))
110
        r.Handle("/api/renew", http.HandlerFunc(apiRenewHandler))
111
        r.Handle("/api/checkin/{api}", http.HandlerFunc(apiCheckinHandler))
112
        r.Handle("/metrics", http.HandlerFunc(prometheusHandler))
113
        r.Handle("/tray", http.HandlerFunc(trayHandler))
114
        r.NotFoundHandler = http.HandlerFunc(error404Handler)
115
        return r
116
}
func prometheusHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/prometheus.go:

36
func prometheusHandler(w http.ResponseWriter, r *http.Request) {
37
        utils.Log(1, fmt.Sprintf("Prometheus /metrics Request From IP: %v\n", r.RemoteAddr))
38
        if !isAuthorized(r) {
39
                http.Redirect(w, r, "/", http.StatusSeeOther)
40
                return
41
        }
42
        metrics := []string{}
43
        system := fmt.Sprintf("statup_total_failures %v\n", core.CountFailures())
44
        system += fmt.Sprintf("statup_total_services %v", len(core.CoreApp.Services))
45
        metrics = append(metrics, system)
46
        for _, ser := range core.CoreApp.Services {
47
                v := ser.(*core.Service)
48
                online := 1
49
                if !v.Online {
50
                        online = 0
51
                }
52
                met := fmt.Sprintf("statup_service_failures{id=\"%v\" name=\"%v\"} %v\n", v.Id, v.Name, len(v.Failures))
53
                met += fmt.Sprintf("statup_service_latency{id=\"%v\" name=\"%v\"} %0.0f\n", v.Id, v.Name, (v.Latency * 100))
54
                met += fmt.Sprintf("statup_service_online{id=\"%v\" name=\"%v\"} %v\n", v.Id, v.Name, online)
55
                met += fmt.Sprintf("statup_service_status_code{id=\"%v\" name=\"%v\"} %v\n", v.Id, v.Name, v.LastStatusCode)
56
                met += fmt.Sprintf("statup_service_response_length{id=\"%v\" name=\"%v\"} %v", v.Id, v.Name, len([]byte(v.LastResponse)))
57
                metrics = append(metrics, met)
58
        }
59
        output := strings.Join(metrics, "\n")
60
        w.WriteHeader(http.StatusOK)
61
        w.Write([]byte(output))
62
}
func saveSASSHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go:

75
func saveSASSHandler(w http.ResponseWriter, r *http.Request) {
76
        if !IsAuthenticated(r) {
77
                http.Redirect(w, r, "/", http.StatusSeeOther)
78
                return
79
        }
80
        r.ParseForm()
81
        theme := r.PostForm.Get("theme")
82
        variables := r.PostForm.Get("variables")
83
        mobile := r.PostForm.Get("mobile")
84
        source.SaveAsset([]byte(theme), utils.Directory, "scss/base.scss")
85
        source.SaveAsset([]byte(variables), utils.Directory, "scss/variables.scss")
86
        source.SaveAsset([]byte(mobile), utils.Directory, "scss/mobile.scss")
87
        source.CompileSASS(utils.Directory)
88
        resetRouter()
89
        executeResponse(w, r, "settings.html", core.CoreApp, "/settings")
90
}
func renderServiceChartsHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go:

64
func renderServiceChartsHandler(w http.ResponseWriter, r *http.Request) {
65
        services := core.CoreApp.Services
66
        w.Header().Set("Content-Type", "text/javascript")
67
        w.Header().Set("Cache-Control", "max-age=60")
68
69
        //var data []string
70
        end := time.Now().UTC()
71
        start := time.Now().Add((-24 * 7) * time.Hour).UTC()
72
        var srvs []*core.Service
73
        for _, s := range services {
74
                srvs = append(srvs, s.(*core.Service))
75
        }
76
        out := struct {
77
                Services []*core.Service
78
                Start    int64
79
                End      int64
80
        }{srvs, start.Unix(), end.Unix()}
81
82
        executeJSResponse(w, r, "charts.js", out)
83
}
func logsHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/dashboard.go:

78
func logsHandler(w http.ResponseWriter, r *http.Request) {
79
        if !IsAuthenticated(r) {
80
                http.Redirect(w, r, "/", http.StatusSeeOther)
81
                return
82
        }
83
        utils.LockLines.Lock()
84
        logs := make([]string, 0)
85
        len := len(utils.LastLines)
86
        // We need string log lines from end to start.
87
        for i := len - 1; i >= 0; i-- {
88
                logs = append(logs, utils.LastLines[i].FormatForHtml()+"\r\n")
89
        }
90
        utils.LockLines.Unlock()
91
        executeResponse(w, r, "logs.html", logs, nil)
92
}
func isAuthorized
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/prometheus.go:

64
func isAuthorized(r *http.Request) bool {
65
        var token string
66
        tokens, ok := r.Header["Authorization"]
67
        if ok && len(tokens) >= 1 {
68
                token = tokens[0]
69
                token = strings.TrimPrefix(token, "Bearer ")
70
        }
71
        if token == core.CoreApp.ApiSecret {
72
                return true
73
        }
74
        return false
75
}
func usersEditHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/users.go:

37
func usersEditHandler(w http.ResponseWriter, r *http.Request) {
38
        if !IsAuthenticated(r) {
39
                http.Redirect(w, r, "/", http.StatusSeeOther)
40
                return
41
        }
42
        vars := mux.Vars(r)
43
        id, _ := strconv.Atoi(vars["id"])
44
        user, _ := core.SelectUser(int64(id))
45
        executeResponse(w, r, "user.html", user, nil)
46
}
func servicesDeleteFailuresHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go:

242
func servicesDeleteFailuresHandler(w http.ResponseWriter, r *http.Request) {
243
        if !IsAuthenticated(r) {
244
                http.Redirect(w, r, "/", http.StatusSeeOther)
245
                return
246
        }
247
        vars := mux.Vars(r)
248
        service := core.SelectService(utils.StringInt(vars["id"]))
249
        service.DeleteFailures()
250
        executeResponse(w, r, "services.html", core.CoreApp.Services, "/services")
251
}
func RunHTTPServer
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

43
func RunHTTPServer(ip string, port int) error {
44
        host := fmt.Sprintf("%v:%v", ip, port)
45
        utils.Log(1, "Statup HTTP Server running on http://"+host)
46
        //for _, p := range core.CoreApp.AllPlugins {
47
        //        info := p.GetInfo()
48
        //        for _, route := range p.Routes() {
49
        //                path := fmt.Sprintf("%v", route.URL)
50
        //                router.Handle(path, http.HandlerFunc(route.Handler)).Methods(route.Method)
51
        //                utils.Log(1, fmt.Sprintf("Added Route %v for plugin %v\n", path, info.Name))
52
        //        }
53
        //}
54
        router = Router()
55
        httpServer = &http.Server{
56
                Addr:         host,
57
                WriteTimeout: time.Second * 60,
58
                ReadTimeout:  time.Second * 60,
59
                IdleTimeout:  time.Second * 60,
60
                Handler:      router,
61
        }
62
        resetCookies()
63
        return httpServer.ListenAndServe()
64
}
func deleteAssetsHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go:

112
func deleteAssetsHandler(w http.ResponseWriter, r *http.Request) {
113
        if !IsAuthenticated(r) {
114
                http.Redirect(w, r, "/", http.StatusSeeOther)
115
                return
116
        }
117
        source.DeleteAllAssets(utils.Directory)
118
        resetRouter()
119
        executeResponse(w, r, "settings.html", core.CoreApp, "/settings")
120
}
func logsLineHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/dashboard.go:

94
func logsLineHandler(w http.ResponseWriter, r *http.Request) {
95
        if !IsAuthenticated(r) {
96
                w.WriteHeader(http.StatusInternalServerError)
97
                return
98
        }
99
        if lastLine := utils.GetLastLine(); lastLine != nil {
100
                w.Write([]byte(lastLine.FormatForHtml()))
101
        }
102
}
func helpHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/dashboard.go:

69
func helpHandler(w http.ResponseWriter, r *http.Request) {
70
        if !IsAuthenticated(r) {
71
                http.Redirect(w, r, "/", http.StatusSeeOther)
72
                return
73
        }
74
        help := source.HelpMarkdown()
75
        executeResponse(w, r, "help.html", help, nil)
76
}
func usersHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/users.go:

28
func usersHandler(w http.ResponseWriter, r *http.Request) {
29
        if !IsAuthenticated(r) {
30
                http.Redirect(w, r, "/", http.StatusSeeOther)
31
                return
32
        }
33
        users, _ := core.SelectAllUsers()
34
        executeResponse(w, r, "users.html", users, nil)
35
}
func settingsHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go:

30
func settingsHandler(w http.ResponseWriter, r *http.Request) {
31
        if !IsAuthenticated(r) {
32
                http.Redirect(w, r, "/", http.StatusSeeOther)
33
                return
34
        }
35
        executeResponse(w, r, "settings.html", core.CoreApp, nil)
36
}
func logoutHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/dashboard.go:

62
func logoutHandler(w http.ResponseWriter, r *http.Request) {
63
        session, _ := sessionStore.Get(r, cookieKey)
64
        session.Values["authenticated"] = false
65
        session.Save(r, w)
66
        http.Redirect(w, r, "/", http.StatusSeeOther)
67
}
func servicesHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go:

85
func servicesHandler(w http.ResponseWriter, r *http.Request) {
86
        if !IsAuthenticated(r) {
87
                http.Redirect(w, r, "/", http.StatusSeeOther)
88
                return
89
        }
90
        executeResponse(w, r, "services.html", core.CoreApp.Services, nil)
91
}
func resetRouter
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/routes.go:

118
func resetRouter() {
119
        router = Router()
120
        httpServer.Handler = router
121
}
func error404Handler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

248
func error404Handler(w http.ResponseWriter, r *http.Request) {
249
        w.WriteHeader(http.StatusNotFound)
250
        executeResponse(w, r, "error_404.html", nil, nil)
251
}
func parseForm
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go:

127
func parseForm(r *http.Request) url.Values {
128
        r.ParseForm()
129
        return r.PostForm
130
}
func parseGet
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go:

132
func parseGet(r *http.Request) url.Values {
133
        r.ParseForm()
134
        return r.Form
135
}
func @138:15
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

138
func(v interface{}) string {
139
                        return utils.ToString(v)
140
                }
func @154:17
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

154
func() *types.Service {
155
                        return new(types.Service)
156
                }
func @126:17
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

126
func(html string) string {
127
                        return utils.UnderScoreString(html)
128
                }
func @129:10
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

129
func() string {
130
                        return r.URL.String()
131
                }
func @151:15
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

151
func(t int64) string {
152
                        return utils.Timezoner(time.Unix(t, 0), core.CoreApp.Timezone).Format("Monday, January 02")
153
                }
func @88:20
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

88
func(w http.ResponseWriter, r *http.Request) template.FuncMap {
89
        return template.FuncMap{
90
                "js": func(html interface{}) template.JS {
91
                        return template.JS(utils.ToString(html))
92
                },
93
                "safe": func(html string) template.HTML {
94
                        return template.HTML(html)
95
                },
96
                "Auth": func() bool {
97
                        return IsAuthenticated(r)
98
                },
99
                "VERSION": func() string {
100
                        return core.VERSION
101
                },
102
                "CoreApp": func() *core.Core {
103
                        return core.CoreApp
104
                },
105
                "Services": func() []types.ServiceInterface {
106
                        return core.CoreApp.Services
107
                },
108
                "USE_CDN": func() bool {
109
                        return core.CoreApp.UseCdn
110
                },
111
                "Type": func(g interface{}) []string {
112
                        fooType := reflect.TypeOf(g)
113
                        var methods []string
114
                        methods = append(methods, fooType.String())
115
                        for i := 0; i < fooType.NumMethod(); i++ {
116
                                method := fooType.Method(i)
117
                                fmt.Println(method.Name)
118
                                methods = append(methods, method.Name)
119
                        }
120
                        return methods
121
                },
122
                "ToJSON": func(g interface{}) template.HTML {
123
                        data, _ := json.Marshal(g)
124
                        return template.HTML(string(data))
125
                },
126
                "underscore": func(html string) string {
127
                        return utils.UnderScoreString(html)
128
                },
129
                "URL": func() string {
130
                        return r.URL.String()
131
                },
132
                "CHART_DATA": func() string {
133
                        return ""
134
                },
135
                "Error": func() string {
136
                        return ""
137
                },
138
                "ToString": func(v interface{}) string {
139
                        return utils.ToString(v)
140
                },
141
                "Ago": func(t time.Time) string {
142
                        return utils.Timestamp(t).Ago()
143
                },
144
                "Duration": func(t time.Duration) string {
145
                        duration, _ := time.ParseDuration(fmt.Sprintf("%vs", t.Seconds()))
146
                        return utils.FormatDuration(duration)
147
                },
148
                "ToUnix": func(t time.Time) int64 {
149
                        return t.UTC().Unix()
150
                },
151
                "FromUnix": func(t int64) string {
152
                        return utils.Timezoner(time.Unix(t, 0), core.CoreApp.Timezone).Format("Monday, January 02")
153
                },
154
                "NewService": func() *types.Service {
155
                        return new(types.Service)
156
                },
157
                "NewUser": func() *types.User {
158
                        return new(types.User)
159
                },
160
        }
161
}
func @157:14
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

157
func() *types.User {
158
                        return new(types.User)
159
                }
func @93:11
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

93
func(html string) template.HTML {
94
                        return template.HTML(html)
95
                }
func @96:11
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

96
func() bool {
97
                        return IsAuthenticated(r)
98
                }
func @99:14
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

99
func() string {
100
                        return core.VERSION
101
                }
func @102:14
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

102
func() *core.Core {
103
                        return core.CoreApp
104
                }
func @105:15
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

105
func() []types.ServiceInterface {
106
                        return core.CoreApp.Services
107
                }
func @108:14
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

108
func() bool {
109
                        return core.CoreApp.UseCdn
110
                }
func @135:12
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

135
func() string {
136
                        return ""
137
                }
func saveSettingsHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go:

38
func saveSettingsHandler(w http.ResponseWriter, r *http.Request) {
39
        if !IsAuthenticated(r) {
40
                http.Redirect(w, r, "/", http.StatusSeeOther)
41
                return
42
        }
43
        r.ParseForm()
44
        app := core.CoreApp
45
        name := r.PostForm.Get("project")
46
        if name != "" {
47
                app.Name = name
48
        }
49
        description := r.PostForm.Get("description")
50
        if description != app.Description {
51
                app.Description = description
52
        }
53
        style := r.PostForm.Get("style")
54
        if style != app.Style {
55
                app.Style = style
56
        }
57
        footer := r.PostForm.Get("footer")
58
        if footer != app.Footer {
59
                app.Footer = footer
60
        }
61
        domain := r.PostForm.Get("domain")
62
        if domain != app.Domain {
63
                app.Domain = domain
64
        }
65
        timezone := r.PostForm.Get("timezone")
66
        timeFloat, _ := strconv.ParseFloat(timezone, 10)
67
        app.Timezone = float32(timeFloat)
68
69
        app.UseCdn = (r.PostForm.Get("enable_cdn") == "on")
70
        core.CoreApp, _ = core.UpdateCore(app)
71
        //notifiers.OnSettingsSaved(core.CoreApp.ToCore())
72
        executeResponse(w, r, "settings.html", core.CoreApp, "/settings")
73
}
func servicesUpdateHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go:

205
func servicesUpdateHandler(w http.ResponseWriter, r *http.Request) {
206
        if !IsAuthenticated(r) {
207
                http.Redirect(w, r, "/", http.StatusSeeOther)
208
                return
209
        }
210
        vars := mux.Vars(r)
211
        service := core.SelectService(utils.StringInt(vars["id"]))
212
        r.ParseForm()
213
        name := r.PostForm.Get("name")
214
        domain := r.PostForm.Get("domain")
215
        method := r.PostForm.Get("method")
216
        expected := r.PostForm.Get("expected")
217
        status, _ := strconv.Atoi(r.PostForm.Get("expected_status"))
218
        interval, _ := strconv.Atoi(r.PostForm.Get("interval"))
219
        port, _ := strconv.Atoi(r.PostForm.Get("port"))
220
        timeout, _ := strconv.Atoi(r.PostForm.Get("timeout"))
221
        checkType := r.PostForm.Get("check_type")
222
        postData := r.PostForm.Get("post_data")
223
        order, _ := strconv.Atoi(r.PostForm.Get("order"))
224
225
        service.Name = name
226
        service.Domain = domain
227
        service.Method = method
228
        service.ExpectedStatus = status
229
        service.Expected = expected
230
        service.Interval = interval
231
        service.Type = checkType
232
        service.Port = port
233
        service.PostData = postData
234
        service.Timeout = timeout
235
        service.Order = order
236
237
        service.Update(true)
238
        service.Check(true)
239
        executeResponse(w, r, "service.html", service, "/services")
240
}
func loginHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/dashboard.go:

42
func loginHandler(w http.ResponseWriter, r *http.Request) {
43
        if sessionStore == nil {
44
                resetCookies()
45
        }
46
        session, _ := sessionStore.Get(r, cookieKey)
47
        r.ParseForm()
48
        username := r.PostForm.Get("username")
49
        password := r.PostForm.Get("password")
50
        user, auth := core.AuthUser(username, password)
51
        if auth {
52
                session.Values["authenticated"] = true
53
                session.Values["user_id"] = user.Id
54
                session.Save(r, w)
55
                http.Redirect(w, r, "/dashboard", http.StatusSeeOther)
56
        } else {
57
                err := core.ErrorResponse{Error: "Incorrect login information submitted, try again."}
58
                executeResponse(w, r, "login.html", err, nil)
59
        }
60
}
func createUserHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/users.go:

75
func createUserHandler(w http.ResponseWriter, r *http.Request) {
76
        if !IsAuthenticated(r) {
77
                http.Redirect(w, r, "/", http.StatusSeeOther)
78
                return
79
        }
80
        r.ParseForm()
81
        username := r.PostForm.Get("username")
82
        password := r.PostForm.Get("password")
83
        email := r.PostForm.Get("email")
84
        admin := r.PostForm.Get("admin")
85
86
        user := core.ReturnUser(&types.User{
87
                Username: username,
88
                Password: password,
89
                Email:    email,
90
                Admin:    (admin == "on"),
91
        })
92
        _, err := user.Create()
93
        if err != nil {
94
                utils.Log(3, err)
95
        }
96
        //notifiers.OnNewUser(user)
97
        executeResponse(w, r, "users.html", user, "/users")
98
}
func createServiceHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go:

114
func createServiceHandler(w http.ResponseWriter, r *http.Request) {
115
        if !IsAuthenticated(r) {
116
                http.Redirect(w, r, "/", http.StatusSeeOther)
117
                return
118
        }
119
        r.ParseForm()
120
        name := r.PostForm.Get("name")
121
        domain := r.PostForm.Get("domain")
122
        method := r.PostForm.Get("method")
123
        expected := r.PostForm.Get("expected")
124
        status, _ := strconv.Atoi(r.PostForm.Get("expected_status"))
125
        interval, _ := strconv.Atoi(r.PostForm.Get("interval"))
126
        port, _ := strconv.Atoi(r.PostForm.Get("port"))
127
        timeout, _ := strconv.Atoi(r.PostForm.Get("timeout"))
128
        checkType := r.PostForm.Get("check_type")
129
        postData := r.PostForm.Get("post_data")
130
        order, _ := strconv.Atoi(r.PostForm.Get("order"))
131
132
        if checkType == "http" && status == 0 {
133
                status = 200
134
        }
135
136
        service := core.ReturnService(&types.Service{
137
                Name:           name,
138
                Domain:         domain,
139
                Method:         method,
140
                Expected:       expected,
141
                ExpectedStatus: status,
142
                Interval:       interval,
143
                Type:           checkType,
144
                Port:           port,
145
                PostData:       postData,
146
                Timeout:        timeout,
147
                Order:          order,
148
        })
149
        _, err := service.Create(true)
150
        if err != nil {
151
                utils.Log(3, fmt.Sprintf("Error starting %v check routine. %v", service.Name, err))
152
        }
153
        //notifiers.OnNewService(core.ReturnService(service.Service))
154
        executeResponse(w, r, "services.html", core.CoreApp.Services, "/services")
155
}
func servicesViewHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go:

172
func servicesViewHandler(w http.ResponseWriter, r *http.Request) {
173
        vars := mux.Vars(r)
174
        fields := parseGet(r)
175
        startField := utils.StringInt(fields.Get("start"))
176
        endField := utils.StringInt(fields.Get("end"))
177
        serv := core.SelectService(utils.StringInt(vars["id"]))
178
        if serv == nil {
179
                w.WriteHeader(http.StatusNotFound)
180
                return
181
        }
182
183
        end := time.Now().UTC()
184
        start := end.Add((-24 * 7) * time.Hour).UTC()
185
186
        if startField != 0 {
187
                start = time.Unix(startField, 0)
188
        }
189
        if endField != 0 {
190
                end = time.Unix(endField, 0)
191
        }
192
193
        data := core.GraphDataRaw(serv, start, end, "hour", "latency")
194
195
        out := struct {
196
                Service *core.Service
197
                Start   int64
198
                End     int64
199
                Data    string
200
        }{serv, start.Unix(), end.Unix(), data.ToString()}
201
202
        executeResponse(w, r, "service.html", out, nil)
203
}
func saveNotificationHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go:

137
func saveNotificationHandler(w http.ResponseWriter, r *http.Request) {
138
        var err error
139
        if !IsAuthenticated(r) {
140
                http.Redirect(w, r, "/", http.StatusSeeOther)
141
                return
142
        }
143
        form := parseForm(r)
144
        vars := mux.Vars(r)
145
        method := vars["method"]
146
        enabled := form.Get("enable")
147
        host := form.Get("host")
148
        port := int(utils.StringInt(form.Get("port")))
149
        username := form.Get("username")
150
        password := form.Get("password")
151
        var1 := form.Get("var1")
152
        var2 := form.Get("var2")
153
        apiKey := form.Get("api_key")
154
        apiSecret := form.Get("api_secret")
155
        limits := int(utils.StringInt(form.Get("limits")))
156
157
        notifer, notif, err := notifier.SelectNotifier(method)
158
        if err != nil {
159
                utils.Log(3, fmt.Sprintf("issue saving notifier %v: %v", method, err))
160
                executeResponse(w, r, "settings.html", core.CoreApp, "/settings")
161
                return
162
        }
163
164
        if host != "" {
165
                notifer.Host = host
166
        }
167
        if port != 0 {
168
                notifer.Port = port
169
        }
170
        if username != "" {
171
                notifer.Username = username
172
        }
173
        if password != "" && password != "##########" {
174
                notifer.Password = password
175
        }
176
        if var1 != "" {
177
                notifer.Var1 = var1
178
        }
179
        if var2 != "" {
180
                notifer.Var2 = var2
181
        }
182
        if apiKey != "" {
183
                notifer.ApiKey = apiKey
184
        }
185
        if apiSecret != "" {
186
                notifer.ApiSecret = apiSecret
187
        }
188
        if limits != 0 {
189
                notifer.Limits = limits
190
        }
191
        notifer.Enabled = enabled == "on"
192
        _, err = notifier.Update(notif, notifer)
193
        if err != nil {
194
                utils.Log(3, fmt.Sprintf("issue updating notifier: %v", err))
195
        }
196
        notifier.OnSave(notifer.Method)
197
        executeResponse(w, r, "settings.html", core.CoreApp, "/settings")
198
}
func apiIndexHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

36
func apiIndexHandler(w http.ResponseWriter, r *http.Request) {
37
        if !isAPIAuthorized(r) {
38
                http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
39
                return
40
        }
41
        var out core.Core
42
        out = *core.CoreApp
43
        var services []types.ServiceInterface
44
        for _, s := range out.Services {
45
                service := s.Select()
46
                service.Failures = nil
47
                services = append(services, core.ReturnService(service))
48
        }
49
        out.Services = services
50
        w.Header().Set("Content-Type", "application/json")
51
        json.NewEncoder(w).Encode(out)
52
}
func apiServiceDataHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

81
func apiServiceDataHandler(w http.ResponseWriter, r *http.Request) {
82
        vars := mux.Vars(r)
83
        service := core.SelectService(utils.StringInt(vars["id"]))
84
        if service == nil {
85
                http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
86
                return
87
        }
88
        fields := parseGet(r)
89
        grouping := fields.Get("group")
90
        startField := utils.StringInt(fields.Get("start"))
91
        endField := utils.StringInt(fields.Get("end"))
92
        obj := core.GraphDataRaw(service, time.Unix(startField, 0), time.Unix(endField, 0), grouping, "latency")
93
94
        w.Header().Set("Content-Type", "application/json")
95
        json.NewEncoder(w).Encode(obj)
96
}
func apiAllServicesHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

205
func apiAllServicesHandler(w http.ResponseWriter, r *http.Request) {
206
        if !isAPIAuthorized(r) {
207
                http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
208
                return
209
        }
210
        allServices := core.CoreApp.Services
211
        var services []types.ServiceInterface
212
        for _, s := range allServices {
213
                service := s.Select()
214
                service.Failures = nil
215
                services = append(services, core.ReturnService(service))
216
        }
217
        w.Header().Set("Content-Type", "application/json")
218
        json.NewEncoder(w).Encode(services)
219
}
func setupHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/setup.go:

28
func setupHandler(w http.ResponseWriter, r *http.Request) {
29
        if core.CoreApp.Services != nil {
30
                http.Redirect(w, r, "/", http.StatusSeeOther)
31
                return
32
        }
33
        w.WriteHeader(http.StatusOK)
34
        port := 5432
35
        if os.Getenv("DB_CONN") == "mysql" {
36
                port = 3306
37
        }
38
        var data interface{}
39
        if os.Getenv("DB_CONN") != "" {
40
                data = &types.DbConfig{
41
                        DbConn:      os.Getenv("DB_CONN"),
42
                        DbHost:      os.Getenv("DB_HOST"),
43
                        DbUser:      os.Getenv("DB_USER"),
44
                        DbPass:      os.Getenv("DB_PASS"),
45
                        DbData:      os.Getenv("DB_DATABASE"),
46
                        DbPort:      port,
47
                        Project:     os.Getenv("NAME"),
48
                        Description: os.Getenv("DESCRIPTION"),
49
                        Email:       "",
50
                        Username:    "admin",
51
                        Password:    "",
52
                }
53
        }
54
        executeResponse(w, r, "setup.html", data, nil)
55
}
func executeResponse
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

166
func executeResponse(w http.ResponseWriter, r *http.Request, file string, data interface{}, redirect interface{}) {
167
        utils.Http(r)
168
        if url, ok := redirect.(string); ok {
169
                http.Redirect(w, r, url, http.StatusSeeOther)
170
                return
171
        }
172
173
        templates := []string{"base.html", "head.html", "nav.html", "footer.html", "scripts.html", "form_service.html", "form_notifier.html", "form_user.html", "form_checkin.html"}
174
175
        javascripts := []string{"charts.js", "chart_index.js"}
176
177
        render, err := source.TmplBox.String(file)
178
        if err != nil {
179
                utils.Log(4, err)
180
        }
181
182
        // setup the main template and handler funcs
183
        t := template.New("main")
184
        t.Funcs(handlerFuncs(w, r))
185
        t, err = t.Parse(mainTmpl)
186
        if err != nil {
187
                utils.Log(4, err)
188
        }
189
190
        // render all templates
191
        for _, temp := range templates {
192
                tmp, _ := source.TmplBox.String(temp)
193
                t, err = t.Parse(tmp)
194
                if err != nil {
195
                        utils.Log(4, err)
196
                }
197
        }
198
199
        // render all javascript files
200
        for _, temp := range javascripts {
201
                tmp, _ := source.JsBox.String(temp)
202
                t, err = t.Parse(tmp)
203
                if err != nil {
204
                        utils.Log(4, err)
205
                }
206
        }
207
208
        // render the page requested
209
        _, err = t.Parse(render)
210
        if err != nil {
211
                utils.Log(4, err)
212
        }
213
214
        // execute the template
215
        err = t.Execute(w, data)
216
        if err != nil {
217
                utils.Log(4, err)
218
        }
219
}
func servicesDeleteHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go:

157
func servicesDeleteHandler(w http.ResponseWriter, r *http.Request) {
158
        if !IsAuthenticated(r) {
159
                http.Redirect(w, r, "/", http.StatusSeeOther)
160
                return
161
        }
162
        vars := mux.Vars(r)
163
        service := core.SelectService(utils.StringInt(vars["id"]))
164
        if service == nil {
165
                w.WriteHeader(http.StatusNotFound)
166
                return
167
        }
168
        service.Delete()
169
        executeResponse(w, r, "services.html", core.CoreApp.Services, "/services")
170
}
func usersDeleteHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/users.go:

100
func usersDeleteHandler(w http.ResponseWriter, r *http.Request) {
101
        if !IsAuthenticated(r) {
102
                http.Redirect(w, r, "/", http.StatusSeeOther)
103
                return
104
        }
105
        vars := mux.Vars(r)
106
        id, _ := strconv.Atoi(vars["id"])
107
        user, _ := core.SelectUser(int64(id))
108
109
        users, _ := core.SelectAllUsers()
110
        if len(users) == 1 {
111
                utils.Log(2, "cannot delete the only user in the system")
112
                http.Redirect(w, r, "/users", http.StatusSeeOther)
113
                return
114
        }
115
        user.Delete()
116
        http.Redirect(w, r, "/users", http.StatusSeeOther)
117
}
func resetCookies
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/routes.go:

123
func resetCookies() {
124
        if core.CoreApp != nil {
125
                cookie := fmt.Sprintf("%v_%v", core.CoreApp.ApiSecret, time.Now().Nanosecond())
126
                sessionStore = sessions.NewCookieStore([]byte(cookie))
127
        } else {
128
                sessionStore = sessions.NewCookieStore([]byte("secretinfo"))
129
        }
130
}
func executeJSResponse
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

222
func executeJSResponse(w http.ResponseWriter, r *http.Request, file string, data interface{}) {
223
        render, err := source.JsBox.String(file)
224
        if err != nil {
225
                utils.Log(4, err)
226
        }
227
        t := template.New("charts")
228
        t.Funcs(template.FuncMap{
229
                "safe": func(html string) template.HTML {
230
                        return template.HTML(html)
231
                },
232
                "Services": func() []types.ServiceInterface {
233
                        return core.CoreApp.Services
234
                },
235
        })
236
        _, err = t.Parse(render)
237
        if err != nil {
238
                utils.Log(4, err)
239
        }
240
241
        err = t.Execute(w, data)
242
        if err != nil {
243
                utils.Log(4, err)
244
        }
245
}
func reorderServiceHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go:

98
func reorderServiceHandler(w http.ResponseWriter, r *http.Request) {
99
        if !IsAuthenticated(r) {
100
                http.Redirect(w, r, "/", http.StatusSeeOther)
101
                return
102
        }
103
        var newOrder []*serviceOrder
104
        decoder := json.NewDecoder(r.Body)
105
        decoder.Decode(&newOrder)
106
        for _, s := range newOrder {
107
                service := core.SelectService(s.Id)
108
                service.Order = s.Order
109
                service.Update(false)
110
        }
111
        w.WriteHeader(http.StatusOK)
112
}
func saveAssetsHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go:

92
func saveAssetsHandler(w http.ResponseWriter, r *http.Request) {
93
        if !IsAuthenticated(r) {
94
                http.Redirect(w, r, "/", http.StatusSeeOther)
95
                return
96
        }
97
        dir := utils.Directory
98
        err := source.CreateAllAssets(dir)
99
        if err != nil {
100
                utils.Log(3, err)
101
                return
102
        }
103
        err = source.CompileSASS(dir)
104
        if err != nil {
105
                source.CopyToPublic(source.CssBox, dir+"/assets/css", "base.css")
106
                utils.Log(2, "Default 'base.css' was insert because SASS did not work.")
107
        }
108
        resetRouter()
109
        executeResponse(w, r, "settings.html", core.CoreApp, "/settings")
110
}
func updateUserHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/users.go:

48
func updateUserHandler(w http.ResponseWriter, r *http.Request) {
49
        if !IsAuthenticated(r) {
50
                http.Redirect(w, r, "/", http.StatusSeeOther)
51
                return
52
        }
53
        r.ParseForm()
54
        vars := mux.Vars(r)
55
        id, _ := strconv.Atoi(vars["id"])
56
        user, err := core.SelectUser(int64(id))
57
        if err != nil {
58
                utils.Log(3, fmt.Sprintf("user error: %v", err))
59
                w.WriteHeader(http.StatusInternalServerError)
60
                return
61
        }
62
63
        user.Username = r.PostForm.Get("username")
64
        user.Email = r.PostForm.Get("email")
65
        user.Admin = (r.PostForm.Get("admin") == "on")
66
        password := r.PostForm.Get("password")
67
        if password != "##########" {
68
                user.Password = utils.HashPassword(password)
69
        }
70
        user.Update()
71
        users, _ := core.SelectAllUsers()
72
        executeResponse(w, r, "users.html", users, "/users")
73
}
func apiServiceUpdateHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

153
func apiServiceUpdateHandler(w http.ResponseWriter, r *http.Request) {
154
        if !isAPIAuthorized(r) {
155
                http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
156
                return
157
        }
158
        vars := mux.Vars(r)
159
        service := core.SelectService(utils.StringInt(vars["id"]))
160
        if service == nil {
161
                http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
162
                return
163
        }
164
        var updatedService *types.Service
165
        decoder := json.NewDecoder(r.Body)
166
        decoder.Decode(&updatedService)
167
        updatedService.Id = service.Id
168
        service = core.ReturnService(updatedService)
169
        err := service.Update(true)
170
        if err != nil {
171
                http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
172
                return
173
        }
174
        service.Check(true)
175
        w.Header().Set("Content-Type", "application/json")
176
        json.NewEncoder(w).Encode(service)
177
}
func apiUserUpdateHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

236
func apiUserUpdateHandler(w http.ResponseWriter, r *http.Request) {
237
        if !isAPIAuthorized(r) {
238
                http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
239
                return
240
        }
241
        vars := mux.Vars(r)
242
        user, err := core.SelectUser(utils.StringInt(vars["id"]))
243
        if err != nil {
244
                http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
245
                return
246
        }
247
        var updateUser *types.User
248
        decoder := json.NewDecoder(r.Body)
249
        decoder.Decode(&updateUser)
250
        updateUser.Id = user.Id
251
        user = core.ReturnUser(updateUser)
252
        err = user.Update()
253
        if err != nil {
254
                http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
255
                return
256
        }
257
        w.Header().Set("Content-Type", "application/json")
258
        json.NewEncoder(w).Encode(user)
259
}
func IsAuthenticated
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

68
func IsAuthenticated(r *http.Request) bool {
69
        if os.Getenv("GO_ENV") == "test" {
70
                return true
71
        }
72
        if core.CoreApp == nil {
73
                return false
74
        }
75
        if sessionStore == nil {
76
                return false
77
        }
78
        session, err := sessionStore.Get(r, cookieKey)
79
        if err != nil {
80
                return false
81
        }
82
        if session.Values["authenticated"] == nil {
83
                return false
84
        }
85
        return session.Values["authenticated"].(bool)
86
}
func apiAllUsersHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

287
func apiAllUsersHandler(w http.ResponseWriter, r *http.Request) {
288
        if !isAPIAuthorized(r) {
289
                http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
290
                return
291
        }
292
        users, _ := core.SelectAllUsers()
293
        w.Header().Set("Content-Type", "application/json")
294
        json.NewEncoder(w).Encode(users)
295
}
func processSetupHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/setup.go:

57
func processSetupHandler(w http.ResponseWriter, r *http.Request) {
58
        var err error
59
        if core.CoreApp.Services != nil {
60
                http.Redirect(w, r, "/", http.StatusSeeOther)
61
                return
62
        }
63
        r.ParseForm()
64
        dbHost := r.PostForm.Get("db_host")
65
        dbUser := r.PostForm.Get("db_user")
66
        dbPass := r.PostForm.Get("db_password")
67
        dbDatabase := r.PostForm.Get("db_database")
68
        dbConn := r.PostForm.Get("db_connection")
69
        dbPort, _ := strconv.Atoi(r.PostForm.Get("db_port"))
70
        project := r.PostForm.Get("project")
71
        username := r.PostForm.Get("username")
72
        password := r.PostForm.Get("password")
73
        sample := r.PostForm.Get("sample_data")
74
        description := r.PostForm.Get("description")
75
        domain := r.PostForm.Get("domain")
76
        email := r.PostForm.Get("email")
77
78
        dir := utils.Directory
79
80
        config := &core.DbConfig{
81
                DbConn:      dbConn,
82
                DbHost:      dbHost,
83
                DbUser:      dbUser,
84
                DbPass:      dbPass,
85
                DbData:      dbDatabase,
86
                DbPort:      dbPort,
87
                Project:     project,
88
                Description: description,
89
                Domain:      domain,
90
                Username:    username,
91
                Password:    password,
92
                Email:       email,
93
                Error:       nil,
94
                Location:    utils.Directory,
95
        }
96
97
        core.Configs, err = config.Save()
98
        if err != nil {
99
                utils.Log(4, err)
100
                config.Error = err
101
                setupResponseError(w, r, config)
102
                return
103
        }
104
105
        core.Configs, err = core.LoadConfig(dir)
106
        if err != nil {
107
                utils.Log(3, err)
108
                config.Error = err
109
                setupResponseError(w, r, config)
110
                return
111
        }
112
113
        err = core.Configs.Connect(false, dir)
114
        if err != nil {
115
                utils.Log(4, err)
116
                core.DeleteConfig()
117
                config.Error = err
118
                setupResponseError(w, r, config)
119
                return
120
        }
121
122
        config.DropDatabase()
123
        config.CreateDatabase()
124
125
        core.CoreApp, err = config.InsertCore()
126
        if err != nil {
127
                utils.Log(4, err)
128
                config.Error = err
129
                setupResponseError(w, r, config)
130
                return
131
        }
132
133
        admin := core.ReturnUser(&types.User{
134
                Username: config.Username,
135
                Password: config.Password,
136
                Email:    config.Email,
137
                Admin:    true,
138
        })
139
        admin.Create()
140
141
        if sample == "on" {
142
                core.InsertSampleData()
143
                core.InsertSampleHits()
144
        }
145
146
        core.InitApp()
147
        resetCookies()
148
        time.Sleep(2 * time.Second)
149
        http.Redirect(w, r, "/", http.StatusSeeOther)
150
}
func apiCreateUsersHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

297
func apiCreateUsersHandler(w http.ResponseWriter, r *http.Request) {
298
        if !isAPIAuthorized(r) {
299
                http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
300
                return
301
        }
302
        var user *types.User
303
        decoder := json.NewDecoder(r.Body)
304
        err := decoder.Decode(&user)
305
        if err != nil {
306
                http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
307
                return
308
        }
309
        newUser := core.ReturnUser(user)
310
        uId, err := newUser.Create()
311
        if err != nil {
312
                http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
313
                return
314
        }
315
        output := apiResponse{
316
                Object: "user",
317
                Method: "create",
318
                Id:     uId,
319
                Status: "success",
320
        }
321
        w.Header().Set("Content-Type", "application/json")
322
        json.NewEncoder(w).Encode(output)
323
}
func apiCreateServiceHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

131
func apiCreateServiceHandler(w http.ResponseWriter, r *http.Request) {
132
        if !isAPIAuthorized(r) {
133
                http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
134
                return
135
        }
136
        var service *types.Service
137
        decoder := json.NewDecoder(r.Body)
138
        err := decoder.Decode(&service)
139
        if err != nil {
140
                http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
141
                return
142
        }
143
        newService := core.ReturnService(service)
144
        _, err = newService.Create(true)
145
        if err != nil {
146
                http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
147
                return
148
        }
149
        w.Header().Set("Content-Type", "application/json")
150
        json.NewEncoder(w).Encode(service)
151
}
func apiServiceDeleteHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

179
func apiServiceDeleteHandler(w http.ResponseWriter, r *http.Request) {
180
        if !isAPIAuthorized(r) {
181
                http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
182
                return
183
        }
184
        vars := mux.Vars(r)
185
        service := core.SelectService(utils.StringInt(vars["id"]))
186
        if service == nil {
187
                http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
188
                return
189
        }
190
        err := service.Delete()
191
        if err != nil {
192
                http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
193
                return
194
        }
195
        output := apiResponse{
196
                Object: "service",
197
                Method: "delete",
198
                Id:     service.Id,
199
                Status: "success",
200
        }
201
        w.Header().Set("Content-Type", "application/json")
202
        json.NewEncoder(w).Encode(output)
203
}
func apiUserDeleteHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

261
func apiUserDeleteHandler(w http.ResponseWriter, r *http.Request) {
262
        if !isAPIAuthorized(r) {
263
                http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
264
                return
265
        }
266
        vars := mux.Vars(r)
267
        user, err := core.SelectUser(utils.StringInt(vars["id"]))
268
        if err != nil {
269
                http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
270
                return
271
        }
272
        err = user.Delete()
273
        if err != nil {
274
                http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
275
                return
276
        }
277
        output := apiResponse{
278
                Object: "user",
279
                Method: "delete",
280
                Id:     user.Id,
281
                Status: "success",
282
        }
283
        w.Header().Set("Content-Type", "application/json")
284
        json.NewEncoder(w).Encode(output)
285
}
func apiServiceHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

115
func apiServiceHandler(w http.ResponseWriter, r *http.Request) {
116
        if !isAPIAuthorized(r) {
117
                http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
118
                return
119
        }
120
        vars := mux.Vars(r)
121
        service := core.SelectService(utils.StringInt(vars["id"]))
122
        if service == nil {
123
                http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
124
                return
125
        }
126
127
        w.Header().Set("Content-Type", "application/json")
128
        json.NewEncoder(w).Encode(service)
129
}
func apiUserHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

221
func apiUserHandler(w http.ResponseWriter, r *http.Request) {
222
        if !isAPIAuthorized(r) {
223
                http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
224
                return
225
        }
226
        vars := mux.Vars(r)
227
        user, err := core.SelectUser(utils.StringInt(vars["id"]))
228
        if err != nil {
229
                http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
230
                return
231
        }
232
        w.Header().Set("Content-Type", "application/json")
233
        json.NewEncoder(w).Encode(user)
234
}
func dashboardHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/dashboard.go:

32
func dashboardHandler(w http.ResponseWriter, r *http.Request) {
33
        fmt.Println()
34
        if !IsAuthenticated(r) {
35
                err := core.ErrorResponse{}
36
                executeResponse(w, r, "login.html", err, nil)
37
        } else {
38
                executeResponse(w, r, "dashboard.html", core.CoreApp, nil)
39
        }
40
}
func indexHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/index.go:

29
func indexHandler(w http.ResponseWriter, r *http.Request) {
30
        if core.Configs == nil {
31
                http.Redirect(w, r, "/setup", http.StatusSeeOther)
32
                return
33
        }
34
        executeResponse(w, r, "index.html", core.CoreApp, nil)
35
}
func isAPIAuthorized
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

325
func isAPIAuthorized(r *http.Request) bool {
326
        if os.Getenv("GO_ENV") == "test" {
327
                return true
328
        }
329
        if IsAuthenticated(r) {
330
                return true
331
        }
332
        if isAuthorized(r) {
333
                return true
334
        }
335
        return false
336
}
func testNotificationHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go:

200
func testNotificationHandler(w http.ResponseWriter, r *http.Request) {
201
        var err error
202
        if !IsAuthenticated(r) {
203
                http.Redirect(w, r, "/", http.StatusSeeOther)
204
                return
205
        }
206
        form := parseForm(r)
207
        vars := mux.Vars(r)
208
        method := vars["method"]
209
        enabled := form.Get("enable")
210
        host := form.Get("host")
211
        port := int(utils.StringInt(form.Get("port")))
212
        username := form.Get("username")
213
        password := form.Get("password")
214
        var1 := form.Get("var1")
215
        var2 := form.Get("var2")
216
        apiKey := form.Get("api_key")
217
        apiSecret := form.Get("api_secret")
218
        limits := int(utils.StringInt(form.Get("limits")))
219
220
        fakeNotifer, notif, err := notifier.SelectNotifier(method)
221
        if err != nil {
222
                utils.Log(3, fmt.Sprintf("issue saving notifier %v: %v", method, err))
223
                executeResponse(w, r, "settings.html", core.CoreApp, "/settings")
224
                return
225
        }
226
227
        notifer := *fakeNotifer
228
229
        if host != "" {
230
                notifer.Host = host
231
        }
232
        if port != 0 {
233
                notifer.Port = port
234
        }
235
        if username != "" {
236
                notifer.Username = username
237
        }
238
        if password != "" && password != "##########" {
239
                notifer.Password = password
240
        }
241
        if var1 != "" {
242
                notifer.Var1 = var1
243
        }
244
        if var2 != "" {
245
                notifer.Var2 = var2
246
        }
247
        if apiKey != "" {
248
                notifer.ApiKey = apiKey
249
        }
250
        if apiSecret != "" {
251
                notifer.ApiSecret = apiSecret
252
        }
253
        if limits != 0 {
254
                notifer.Limits = limits
255
        }
256
        notifer.Enabled = enabled == "on"
257
258
        err = notif.(notifier.Tester).OnTest()
259
        if err == nil {
260
                w.Write([]byte("ok"))
261
        } else {
262
                w.Write([]byte(err.Error()))
263
        }
264
}
func DesktopInit
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/index.go:

41
func DesktopInit(ip string, port int) {
42
        var err error
43
        exists := utils.FileExists(utils.Directory + "/statup.db")
44
        if exists {
45
                core.Configs, err = core.LoadConfig(utils.Directory)
46
                if err != nil {
47
                        utils.Log(3, err)
48
                        return
49
                }
50
                err = core.Configs.Connect(false, utils.Directory)
51
                if err != nil {
52
                        utils.Log(3, err)
53
                        return
54
                }
55
                core.InitApp()
56
                RunHTTPServer(ip, port)
57
        }
58
59
        config := &core.DbConfig{
60
                DbConn:      "sqlite",
61
                Project:     "Statup",
62
                Description: "Statup running as an App!",
63
                Domain:      "http://localhost",
64
                Username:    "admin",
65
                Password:    "admin",
66
                Email:       "user@email.com",
67
                Error:       nil,
68
                Location:    utils.Directory,
69
        }
70
71
        config, err = config.Save()
72
        if err != nil {
73
                utils.Log(4, err)
74
        }
75
76
        config.DropDatabase()
77
        config.CreateDatabase()
78
        core.CoreApp = config.CreateCore()
79
80
        if err != nil {
81
                utils.Log(3, err)
82
                return
83
        }
84
85
        core.Configs, err = core.LoadConfig(utils.Directory)
86
        if err != nil {
87
                utils.Log(3, err)
88
                config.Error = err
89
                return
90
        }
91
92
        err = core.Configs.Connect(false, utils.Directory)
93
        if err != nil {
94
                utils.Log(3, err)
95
                core.DeleteConfig()
96
                config.Error = err
97
                return
98
        }
99
100
        admin := core.ReturnUser(&types.User{
101
                Username: config.Username,
102
                Password: config.Password,
103
                Email:    config.Email,
104
                Admin:    true,
105
        })
106
        admin.Create()
107
108
        core.InsertSampleData()
109
110
        config.ApiKey = core.CoreApp.ApiKey
111
        config.ApiSecret = core.CoreApp.ApiSecret
112
        config.Update()
113
114
        core.InitApp()
115
        RunHTTPServer(ip, port)
116
}
func renderServiceChartHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go:

32
func renderServiceChartHandler(w http.ResponseWriter, r *http.Request) {
33
        vars := mux.Vars(r)
34
        fields := parseGet(r)
35
        w.Header().Set("Content-Type", "text/javascript")
36
        w.Header().Set("Cache-Control", "max-age=30")
37
38
        startField := fields.Get("start")
39
        endField := fields.Get("end")
40
41
        end := now.EndOfDay().UTC()
42
        start := now.BeginningOfDay().UTC()
43
44
        if startField != "" {
45
                start = time.Unix(utils.StringInt(startField), 0)
46
                start = now.New(start).BeginningOfDay().UTC()
47
        }
48
        if endField != "" {
49
                end = time.Unix(utils.StringInt(endField), 0)
50
                end = now.New(end).EndOfDay().UTC()
51
        }
52
53
        service := core.SelectService(utils.StringInt(vars["id"]))
54
        data := core.GraphDataRaw(service, start, end, "hour", "latency").ToString()
55
56
        out := struct {
57
                Services []*core.Service
58
                Data     []string
59
        }{[]*core.Service{service}, []string{data}}
60
61
        executeResponse(w, r, "charts.js", out, nil)
62
}
func exportHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/dashboard.go:

109
func exportHandler(w http.ResponseWriter, r *http.Request) {
110
        if !IsAuthenticated(r) {
111
                w.WriteHeader(http.StatusInternalServerError)
112
                return
113
        }
114
115
        var notifiers []*notifier.Notification
116
        for _, v := range core.CoreApp.Notifications {
117
                notifier := v.(notifier.Notifier)
118
                notifiers = append(notifiers, notifier.Select())
119
        }
120
121
        data := exportData{core.CoreApp, notifiers}
122
123
        export, _ := json.Marshal(data)
124
125
        mime := http.DetectContentType(export)
126
        fileSize := len(string(export))
127
128
        w.Header().Set("Content-Type", mime)
129
        w.Header().Set("Content-Disposition", "attachment; filename=export.json")
130
        w.Header().Set("Expires", "0")
131
        w.Header().Set("Content-Transfer-Encoding", "binary")
132
        w.Header().Set("Content-Length", strconv.Itoa(fileSize))
133
        w.Header().Set("Content-Control", "private, no-transform, no-store, must-revalidate")
134
135
        http.ServeContent(w, r, "export.json", time.Now(), bytes.NewReader(export))
136
137
}
func checkinCreateUpdateHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go:

253
func checkinCreateUpdateHandler(w http.ResponseWriter, r *http.Request) {
254
        if !IsAuthenticated(r) {
255
                http.Redirect(w, r, "/", http.StatusSeeOther)
256
                return
257
        }
258
        vars := mux.Vars(r)
259
        service := core.SelectService(utils.StringInt(vars["id"]))
260
        api := r.PostForm.Get("api")
261
        checkin := core.SelectCheckin(api)
262
263
        interval := utils.StringInt(r.PostForm.Get("interval"))
264
        grace := utils.StringInt(r.PostForm.Get("grace"))
265
        checkin.Interval = interval
266
        checkin.GracePeriod = grace
267
        checkin.Update()
268
        executeResponse(w, r, "service.html", service, fmt.Sprintf("/service/%v", service.Id))
269
}
func apiServicePingDataHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

98
func apiServicePingDataHandler(w http.ResponseWriter, r *http.Request) {
99
        vars := mux.Vars(r)
100
        service := core.SelectService(utils.StringInt(vars["id"]))
101
        if service == nil {
102
                http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
103
                return
104
        }
105
        fields := parseGet(r)
106
        grouping := fields.Get("group")
107
        startField := utils.StringInt(fields.Get("start"))
108
        endField := utils.StringInt(fields.Get("end"))
109
        obj := core.GraphDataRaw(service, time.Unix(startField, 0), time.Unix(endField, 0), grouping, "ping_time")
110
111
        w.Header().Set("Content-Type", "application/json")
112
        json.NewEncoder(w).Encode(obj)
113
}
func apiRenewHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

54
func apiRenewHandler(w http.ResponseWriter, r *http.Request) {
55
        if !isAPIAuthorized(r) {
56
                http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
57
                return
58
        }
59
        var err error
60
        core.CoreApp.ApiKey = utils.NewSHA1Hash(40)
61
        core.CoreApp.ApiSecret = utils.NewSHA1Hash(40)
62
        core.CoreApp, err = core.UpdateCore(core.CoreApp)
63
        if err != nil {
64
                utils.Log(3, err)
65
        }
66
        http.Redirect(w, r, "/settings", http.StatusSeeOther)
67
}
func pluginSavedHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/plugins.go:

29
func pluginSavedHandler(w http.ResponseWriter, r *http.Request) {
30
        auth := IsAuthenticated(r)
31
        if !auth {
32
                http.Redirect(w, r, "/", http.StatusSeeOther)
33
                return
34
        }
35
        r.ParseForm()
36
        //vars := mux.Vars(router)
37
        //plug := SelectPlugin(vars["name"])
38
        data := make(map[string]string)
39
        for k, v := range r.PostForm {
40
                data[k] = strings.Join(v, "")
41
        }
42
        //plug.OnSave(structs.Map(data))
43
        http.Redirect(w, r, "/settings", http.StatusSeeOther)
44
}
func @111:11
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

111
func(g interface{}) []string {
112
                        fooType := reflect.TypeOf(g)
113
                        var methods []string
114
                        methods = append(methods, fooType.String())
115
                        for i := 0; i < fooType.NumMethod(); i++ {
116
                                method := fooType.Method(i)
117
                                fmt.Println(method.Name)
118
                                methods = append(methods, method.Name)
119
                        }
120
                        return methods
121
                }
func checkinUpdateHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go:

271
func checkinUpdateHandler(w http.ResponseWriter, r *http.Request) {
272
        vars := mux.Vars(r)
273
        checkin := core.SelectCheckin(vars["id"])
274
        ip, _, _ := net.SplitHostPort(r.RemoteAddr)
275
        checkinHit := core.ReturnCheckinHit(&types.CheckinHit{
276
                Checkin:   checkin.Id,
277
                From:      ip,
278
                CreatedAt: time.Now().UTC(),
279
        })
280
        checkinHit.Create()
281
        w.Write([]byte("ok"))
282
        w.WriteHeader(http.StatusOK)
283
}
func apiCheckinHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go:

69
func apiCheckinHandler(w http.ResponseWriter, r *http.Request) {
70
        if !isAPIAuthorized(r) {
71
                http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
72
                return
73
        }
74
        vars := mux.Vars(r)
75
        checkin := core.SelectCheckin(vars["api"])
76
        //checkin.Receivehit()
77
        w.WriteHeader(http.StatusOK)
78
        json.NewEncoder(w).Encode(checkin)
79
}
func pluginsDownloadHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/plugins.go:

46
func pluginsDownloadHandler(w http.ResponseWriter, r *http.Request) {
47
        auth := IsAuthenticated(r)
48
        if !auth {
49
                http.Redirect(w, r, "/", http.StatusSeeOther)
50
                return
51
        }
52
        //vars := mux.Vars(router)
53
        //name := vars["name"]
54
        //DownloadPlugin(name)
55
        //core.LoadConfig(utils.Directory)
56
        http.Redirect(w, r, "/plugins", http.StatusSeeOther)
57
}
func @144:15
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

144
func(t time.Duration) string {
145
                        duration, _ := time.ParseDuration(fmt.Sprintf("%vs", t.Seconds()))
146
                        return utils.FormatDuration(duration)
147
                }
func parseId
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go:

122
func parseId(r *http.Request) int64 {
123
        vars := mux.Vars(r)
124
        return utils.StringInt(vars["id"])
125
}
func @122:13
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

122
func(g interface{}) template.HTML {
123
                        data, _ := json.Marshal(g)
124
                        return template.HTML(string(data))
125
                }
func @229:11
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

229
func(html string) template.HTML {
230
                        return template.HTML(html)
231
                }
func @132:17
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

132
func() string {
133
                        return ""
134
                }
func setupResponseError
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/setup.go:

152
func setupResponseError(w http.ResponseWriter, r *http.Request, a interface{}) {
153
        executeResponse(w, r, "setup.html", a, nil)
154
}
func @148:13
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

148
func(t time.Time) int64 {
149
                        return t.UTC().Unix()
150
                }
func @90:9
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

90
func(html interface{}) template.JS {
91
                        return template.JS(utils.ToString(html))
92
                }
func @232:15
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

232
func() []types.ServiceInterface {
233
                        return core.CoreApp.Services
234
                }
func trayHandler
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/index.go:

37
func trayHandler(w http.ResponseWriter, r *http.Request) {
38
        executeResponse(w, r, "tray.html", core.CoreApp, nil)
39
}
func @141:10
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go:

141
func(t time.Time) string {
142
                        return utils.Timestamp(t).Ago()
143
                }
Package Overview: github.com/hunterlong/statup/notifiers 7.14%

This is a coverage report created after analysis of the github.com/hunterlong/statup/notifiers package. It has been generated with the following command:

gocov test github.com/hunterlong/statup/notifiers | gocov-html

Here are the stats. Please select a function name to view its implementation and see what's left for testing.

slack.Select(...)github.com/hunterlong/statup/notifiers/slack.go100.00%1/1
lineNotifier.Select(...)github.com/hunterlong/statup/notifiers/line_notify.go100.00%1/1
discord.Select(...)github.com/hunterlong/statup/notifiers/discord.go100.00%1/1
webhooker.Select(...)github.com/hunterlong/statup/notifiers/webhook.go100.00%1/1
email.Select(...)github.com/hunterlong/statup/notifiers/email.go100.00%1/1
twilio.Select(...)github.com/hunterlong/statup/notifiers/twilio.go100.00%1/1
init(...)github.com/hunterlong/statup/notifiers/webhook.go66.67%2/3
init(...)github.com/hunterlong/statup/notifiers/discord.go66.67%2/3
init(...)github.com/hunterlong/statup/notifiers/email.go66.67%2/3
init(...)github.com/hunterlong/statup/notifiers/twilio.go66.67%2/3
init(...)github.com/hunterlong/statup/notifiers/line_notify.go66.67%2/3
init(...)github.com/hunterlong/statup/notifiers/slack.go66.67%2/3
twilio.Send(...)github.com/hunterlong/statup/notifiers/twilio.go0.00%0/23
webhooker.run(...)github.com/hunterlong/statup/notifiers/webhook.go0.00%0/21
discord.OnTest(...)github.com/hunterlong/statup/notifiers/discord.go0.00%0/20
email.dialSend(...)github.com/hunterlong/statup/notifiers/email.go0.00%0/12
lineNotifier.Send(...)github.com/hunterlong/statup/notifiers/line_notify.go0.00%0/12
webhooker.OnTest(...)github.com/hunterlong/statup/notifiers/webhook.go0.00%0/9
slack.OnTest(...)github.com/hunterlong/statup/notifiers/slack.go0.00%0/9
emailTemplate(...)github.com/hunterlong/statup/notifiers/email.go0.00%0/9
discord.Send(...)github.com/hunterlong/statup/notifiers/discord.go0.00%0/8
parseSlackMessage(...)github.com/hunterlong/statup/notifiers/slack.go0.00%0/7
email.OnTest(...)github.com/hunterlong/statup/notifiers/email.go0.00%0/7
slack.Send(...)github.com/hunterlong/statup/notifiers/slack.go0.00%0/7
replaceBodyText(...)github.com/hunterlong/statup/notifiers/webhook.go0.00%0/7
email.Send(...)github.com/hunterlong/statup/notifiers/email.go0.00%0/6
twilioSuccess(...)github.com/hunterlong/statup/notifiers/twilio.go0.00%0/5
lineNotifier.OnSuccess(...)github.com/hunterlong/statup/notifiers/line_notify.go0.00%0/4
email.OnSuccess(...)github.com/hunterlong/statup/notifiers/email.go0.00%0/4
webhooker.OnSuccess(...)github.com/hunterlong/statup/notifiers/webhook.go0.00%0/4
slack.OnSuccess(...)github.com/hunterlong/statup/notifiers/slack.go0.00%0/4
twilio.OnSuccess(...)github.com/hunterlong/statup/notifiers/twilio.go0.00%0/4
webhooker.Send(...)github.com/hunterlong/statup/notifiers/webhook.go0.00%0/4
discord.OnSuccess(...)github.com/hunterlong/statup/notifiers/discord.go0.00%0/4
email.OnFailure(...)github.com/hunterlong/statup/notifiers/email.go0.00%0/3
slack.OnSave(...)github.com/hunterlong/statup/notifiers/slack.go0.00%0/3
slack.OnFailure(...)github.com/hunterlong/statup/notifiers/slack.go0.00%0/3
webhooker.OnFailure(...)github.com/hunterlong/statup/notifiers/webhook.go0.00%0/3
lineNotifier.OnFailure(...)github.com/hunterlong/statup/notifiers/line_notify.go0.00%0/3
twilioError(...)github.com/hunterlong/statup/notifiers/twilio.go0.00%0/3
twilio.OnFailure(...)github.com/hunterlong/statup/notifiers/twilio.go0.00%0/3
discord.OnSave(...)github.com/hunterlong/statup/notifiers/discord.go0.00%0/3
discord.OnFailure(...)github.com/hunterlong/statup/notifiers/discord.go0.00%0/3
twilio.OnTest(...)github.com/hunterlong/statup/notifiers/twilio.go0.00%0/2
email.OnSave(...)github.com/hunterlong/statup/notifiers/email.go0.00%0/2
lineNotifier.OnSave(...)github.com/hunterlong/statup/notifiers/line_notify.go0.00%0/2
emailSource(...)github.com/hunterlong/statup/notifiers/email.go0.00%0/2
twilio.OnSave(...)github.com/hunterlong/statup/notifiers/twilio.go0.00%0/2
webhooker.OnSave(...)github.com/hunterlong/statup/notifiers/webhook.go0.00%0/1
github.com/hunterlong/statup/notifiers7.14%18/252
func slack.Select
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go:

97
func (u *slack) Select() *notifier.Notification {
98
        return u.Notification
99
}
func lineNotifier.Select
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/line_notify.go:

75
func (u *lineNotifier) Select() *notifier.Notification {
76
        return u.Notification
77
}
func discord.Select
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/discord.go:

71
func (u *discord) Select() *notifier.Notification {
72
        return u.Notification
73
}
func webhooker.Select
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go:

97
func (w *webhooker) Select() *notifier.Notification {
98
        return w.Notification
99
}
func email.Select
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go:

209
func (u *email) Select() *notifier.Notification {
210
        return u.Notification
211
}
func twilio.Select
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go:

78
func (u *twilio) Select() *notifier.Notification {
79
        return u.Notification
80
}
func init
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go:

81
func init() {
82
        err := notifier.AddNotifier(webhook)
83
        if err != nil {
84
                panic(err)
85
        }
86
}
func init
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/discord.go:

51
func init() {
52
        err := notifier.AddNotifier(discorder)
53
        if err != nil {
54
                panic(err)
55
        }
56
}
func init
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go:

153
func init() {
154
        err := notifier.AddNotifier(emailer)
155
        if err != nil {
156
                panic(err)
157
        }
158
}
func init
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go:

71
func init() {
72
        err := notifier.AddNotifier(twilioNotifier)
73
        if err != nil {
74
                panic(err)
75
        }
76
}
func init
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/line_notify.go:

51
func init() {
52
        err := notifier.AddNotifier(lineNotify)
53
        if err != nil {
54
                panic(err)
55
        }
56
}
func init
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go:

77
func init() {
78
        err := notifier.AddNotifier(slacker)
79
        if err != nil {
80
                panic(err)
81
        }
82
}
func twilio.Send
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go:

83
func (u *twilio) Send(msg interface{}) error {
84
        message := msg.(string)
85
        twilioUrl := fmt.Sprintf("https://api.twilio.com/2010-04-01/Accounts/%v/Messages.json", u.GetValue("api_key"))
86
        client := &http.Client{}
87
        v := url.Values{}
88
        v.Set("To", "+"+u.Var1)
89
        v.Set("From", "+"+u.Var2)
90
        v.Set("Body", message)
91
        rb := *strings.NewReader(v.Encode())
92
        req, err := http.NewRequest("POST", twilioUrl, &rb)
93
        req.SetBasicAuth(u.ApiKey, u.ApiSecret)
94
        req.Header.Add("Accept", "application/json")
95
        req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
96
        res, err := client.Do(req)
97
        if err != nil {
98
                return err
99
        }
100
        defer res.Body.Close()
101
        contents, _ := ioutil.ReadAll(res.Body)
102
        success, _ := twilioSuccess(contents)
103
        if !success {
104
                errorOut := twilioError(contents)
105
                out := fmt.Sprintf("Error code %v - %v", errorOut.Code, errorOut.Message)
106
                return errors.New(out)
107
        }
108
        return nil
109
}
func webhooker.run
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go:

113
func (w *webhooker) run(body string) (*http.Response, error) {
114
        utils.Log(1, fmt.Sprintf("sending body: '%v' to %v as a %v request", body, w.Host, w.Var1))
115
        client := new(http.Client)
116
        client.Timeout = time.Duration(10 * time.Second)
117
        var buf *bytes.Buffer
118
        buf = bytes.NewBuffer(nil)
119
        if w.Var2 != "" {
120
                buf = bytes.NewBuffer([]byte(w.Var2))
121
        }
122
        req, err := http.NewRequest(w.Var1, w.Host, buf)
123
        if err != nil {
124
                return nil, err
125
        }
126
        if w.ApiSecret != "" {
127
                splitArray := strings.Split(w.ApiSecret, ",")
128
                for _, a := range splitArray {
129
                        split := strings.Split(a, "=")
130
                        req.Header.Add(split[0], split[1])
131
                }
132
        }
133
        if w.ApiSecret != "" {
134
                req.Header.Add("Content-Type", w.ApiSecret)
135
        }
136
        resp, err := client.Do(req)
137
        if err != nil {
138
                return nil, err
139
        }
140
        return resp, err
141
}
func discord.OnTest
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/discord.go:

99
func (u *discord) OnTest() error {
100
        outError := errors.New("Incorrect discord URL, please confirm URL is correct")
101
        message := `{"content": "Testing the discord notifier"}`
102
        req, _ := http.NewRequest("POST", discorder.Host, bytes.NewBuffer([]byte(message)))
103
        req.Header.Set("Content-Type", "application/json")
104
        client := &http.Client{}
105
        resp, err := client.Do(req)
106
        if err != nil {
107
                return err
108
        }
109
        defer resp.Body.Close()
110
        contents, _ := ioutil.ReadAll(resp.Body)
111
        if string(contents) == "" {
112
                return nil
113
        }
114
        var d discordTestJson
115
        err = json.Unmarshal(contents, &d)
116
        if err != nil {
117
                return outError
118
        }
119
        if d.Code == 0 {
120
                return outError
121
        }
122
        fmt.Println("discord: ", string(contents))
123
        return nil
124
}
func email.dialSend
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go:

232
func (u *email) dialSend(email *emailOutgoing) error {
233
        mailer = mail.NewDialer(emailer.Host, emailer.Port, emailer.Username, emailer.Password)
234
        mailer.TLSConfig = &tls.Config{InsecureSkipVerify: true}
235
        emailSource(email)
236
        m := mail.NewMessage()
237
        m.SetHeader("From", email.From)
238
        m.SetHeader("To", email.To)
239
        m.SetHeader("Subject", email.Subject)
240
        m.SetBody("text/html", email.Source)
241
        if err := mailer.DialAndSend(m); err != nil {
242
                utils.Log(3, fmt.Sprintf("email '%v' sent to: %v using the %v template (size: %v) %v", email.Subject, email.To, email.Template, len([]byte(email.Source)), err))
243
                return err
244
        }
245
        return nil
246
}
func lineNotifier.Send
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/line_notify.go:

59
func (u *lineNotifier) Send(msg interface{}) error {
60
        message := msg.(string)
61
        client := new(http.Client)
62
        v := url.Values{}
63
        v.Set("message", message)
64
        req, err := http.NewRequest("POST", "https://notify-api.line.me/api/notify", strings.NewReader(v.Encode()))
65
        req.Header.Add("Authorization", fmt.Sprintf("Bearer %v", u.GetValue("api_secret")))
66
        req.Header.Add("Accept", "application/json")
67
        req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
68
        _, err = client.Do(req)
69
        if err != nil {
70
                return err
71
        }
72
        return nil
73
}
func webhooker.OnTest
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go:

143
func (w *webhooker) OnTest() error {
144
        service := &types.Service{
145
                Id:             1,
146
                Name:           "Interpol - All The Rage Back Home",
147
                Domain:         "https://www.youtube.com/watch?v=-u6DvRyyKGU",
148
                ExpectedStatus: 200,
149
                Interval:       30,
150
                Type:           "http",
151
                Method:         "GET",
152
                Timeout:        20,
153
                LastStatusCode: 404,
154
                Expected:       "test example",
155
                LastResponse:   "<html>this is an example response</html>",
156
                CreatedAt:      time.Now().Add(-24 * time.Hour),
157
        }
158
        body := replaceBodyText(w.Var2, service, nil)
159
        resp, err := w.run(body)
160
        if err != nil {
161
                return err
162
        }
163
        defer resp.Body.Close()
164
        content, err := ioutil.ReadAll(resp.Body)
165
        utils.Log(1, fmt.Sprintf("webhook notifier received: '%v'", string(content)))
166
        return err
167
}
func slack.OnTest
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go:

101
func (u *slack) OnTest() error {
102
        client := new(http.Client)
103
        res, err := client.Post(u.Host, "application/json", bytes.NewBuffer([]byte(`{"text":"testing message"}`)))
104
        if err != nil {
105
                return err
106
        }
107
        defer res.Body.Close()
108
        contents, _ := ioutil.ReadAll(res.Body)
109
        if string(contents) != "ok" {
110
                return errors.New("The slack response was incorrect, check the URL")
111
        }
112
        return err
113
}
func emailTemplate
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go:

253
func emailTemplate(contents string, data interface{}) string {
254
        t := template.New("email")
255
        t, err := t.Parse(contents)
256
        if err != nil {
257
                utils.Log(3, err)
258
        }
259
        var tpl bytes.Buffer
260
        if err := t.Execute(&tpl, data); err != nil {
261
                utils.Log(2, err)
262
        }
263
        result := tpl.String()
264
        return result
265
}
func discord.Send
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/discord.go:

59
func (u *discord) Send(msg interface{}) error {
60
        message := msg.(string)
61
        req, _ := http.NewRequest("POST", discorder.GetValue("host"), bytes.NewBuffer([]byte(message)))
62
        req.Header.Set("Content-Type", "application/json")
63
        client := &http.Client{}
64
        resp, err := client.Do(req)
65
        if err != nil {
66
                return err
67
        }
68
        return resp.Body.Close()
69
}
func parseSlackMessage
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go:

59
func parseSlackMessage(temp string, data interface{}) error {
60
        buf := new(bytes.Buffer)
61
        slackTemp, _ := template.New("slack").Parse(temp)
62
        err := slackTemp.Execute(buf, data)
63
        if err != nil {
64
                return err
65
        }
66
        slacker.AddQueue(buf.String())
67
        return nil
68
}
func email.OnTest
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go:

221
func (u *email) OnTest() error {
222
        host := fmt.Sprintf("%v:%v", u.Host, u.Port)
223
        dial, err := smtp.Dial(host)
224
        if err != nil {
225
                utils.Log(3, err)
226
                return err
227
        }
228
        auth := smtp.PlainAuth("", u.Username, u.Password, host)
229
        return dial.Auth(auth)
230
}
func slack.Send
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go:

85
func (u *slack) Send(msg interface{}) error {
86
        message := msg.(string)
87
        client := new(http.Client)
88
        res, err := client.Post(u.Host, "application/json", bytes.NewBuffer([]byte(message)))
89
        if err != nil {
90
                return err
91
        }
92
        defer res.Body.Close()
93
        //contents, _ := ioutil.ReadAll(res.Body)
94
        return nil
95
}
func replaceBodyText
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go:

101
func replaceBodyText(body string, s *types.Service, f *types.Failure) string {
102
        if s != nil {
103
                body = strings.Replace(body, "%service.Name", s.Name, -1)
104
                body = strings.Replace(body, "%service.Id", utils.ToString(s.Id), -1)
105
                body = strings.Replace(body, "%service.Online", utils.ToString(s.Online), -1)
106
        }
107
        if f != nil {
108
                body = strings.Replace(body, "%failure.Issue", f.Issue, -1)
109
        }
110
        return body
111
}
func email.Send
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go:

161
func (u *email) Send(msg interface{}) error {
162
        email := msg.(*emailOutgoing)
163
        err := u.dialSend(email)
164
        if err != nil {
165
                utils.Log(3, fmt.Sprintf("email Notifier could not send email: %v", err))
166
                return err
167
        }
168
        return nil
169
}
func twilioSuccess
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go:

142
func twilioSuccess(res []byte) (bool, twilioResponse) {
143
        var obj twilioResponse
144
        json.Unmarshal(res, &obj)
145
        if obj.Status == "queued" {
146
                return true, obj
147
        }
148
        return false, obj
149
}
func lineNotifier.OnSuccess
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/line_notify.go:

87
func (u *lineNotifier) OnSuccess(s *types.Service) {
88
        if !u.Online {
89
                msg := fmt.Sprintf("Your service '%v' is back online!", s.Name)
90
                u.AddQueue(msg)
91
        }
92
        u.Online = true
93
}
func email.OnSuccess
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go:

195
func (u *email) OnSuccess(s *types.Service) {
196
        if !u.Online {
197
                email := &emailOutgoing{
198
                        To:       emailer.GetValue("var2"),
199
                        Subject:  fmt.Sprintf("Service %v is Back Online", s.Name),
200
                        Template: mainEmailTemplate,
201
                        Data:     interface{}(s),
202
                        From:     emailer.GetValue("var1"),
203
                }
204
                u.AddQueue(email)
205
        }
206
        u.Online = true
207
}
func webhooker.OnSuccess
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go:

177
func (w *webhooker) OnSuccess(s *types.Service) {
178
        if !w.Online {
179
                msg := replaceBodyText(w.Var2, s, nil)
180
                webhook.AddQueue(msg)
181
        }
182
        w.Online = true
183
}
func slack.OnSuccess
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go:

127
func (u *slack) OnSuccess(s *types.Service) {
128
        if !u.Online {
129
                message := slackMessage{
130
                        Service:  s,
131
                        Template: successTemplate,
132
                        Time:     time.Now().Unix(),
133
                }
134
                parseSlackMessage(successTemplate, message)
135
        }
136
        u.Online = true
137
}
func twilio.OnSuccess
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go:

119
func (u *twilio) OnSuccess(s *types.Service) {
120
        if !u.Online {
121
                msg := fmt.Sprintf("Your service '%v' is back online!", s.Name)
122
                u.AddQueue(msg)
123
        }
124
        u.Online = true
125
}
func webhooker.Send
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go:

89
func (w *webhooker) Send(msg interface{}) error {
90
        resp, err := w.run(msg.(string))
91
        if err == nil {
92
                resp.Body.Close()
93
        }
94
        return err
95
}
func discord.OnSuccess
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/discord.go:

83
func (u *discord) OnSuccess(s *types.Service) {
84
        if !u.Online {
85
                msg := fmt.Sprintf(`{"content": "Your service '%v' is back online!"}`, s.Name)
86
                u.AddQueue(msg)
87
        }
88
        u.Online = true
89
}
func email.OnFailure
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go:

182
func (u *email) OnFailure(s *types.Service, f *types.Failure) {
183
        email := &emailOutgoing{
184
                To:       emailer.GetValue("var2"),
185
                Subject:  fmt.Sprintf("Service %v is Failing", s.Name),
186
                Template: mainEmailTemplate,
187
                Data:     interface{}(s),
188
                From:     emailer.GetValue("var1"),
189
        }
190
        u.AddQueue(email)
191
        u.Online = false
192
}
func slack.OnSave
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go:

140
func (u *slack) OnSave() error {
141
        message := fmt.Sprintf("Notification %v is receiving updated information.", u.Method)
142
        u.AddQueue(message)
143
        return nil
144
}
func slack.OnFailure
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go:

116
func (u *slack) OnFailure(s *types.Service, f *types.Failure) {
117
        message := slackMessage{
118
                Service:  s,
119
                Template: failingTemplate,
120
                Time:     time.Now().Unix(),
121
        }
122
        parseSlackMessage(failingTemplate, message)
123
        u.Online = false
124
}
func webhooker.OnFailure
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go:

170
func (w *webhooker) OnFailure(s *types.Service, f *types.Failure) {
171
        msg := replaceBodyText(w.Var2, s, f)
172
        webhook.AddQueue(msg)
173
        w.Online = false
174
}
func lineNotifier.OnFailure
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/line_notify.go:

80
func (u *lineNotifier) OnFailure(s *types.Service, f *types.Failure) {
81
        msg := fmt.Sprintf("Your service '%v' is currently offline!", s.Name)
82
        u.AddQueue(msg)
83
        u.Online = false
84
}
func twilioError
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go:

151
func twilioError(res []byte) twilioErrorObj {
152
        var obj twilioErrorObj
153
        json.Unmarshal(res, &obj)
154
        return obj
155
}
func twilio.OnFailure
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go:

112
func (u *twilio) OnFailure(s *types.Service, f *types.Failure) {
113
        msg := fmt.Sprintf("Your service '%v' is currently offline!", s.Name)
114
        u.AddQueue(msg)
115
        u.Online = false
116
}
func discord.OnSave
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/discord.go:

92
func (u *discord) OnSave() error {
93
        msg := fmt.Sprintf(`{"content": "The discord notifier on Statup was just updated."}`)
94
        u.AddQueue(msg)
95
        return nil
96
}
func discord.OnFailure
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/discord.go:

76
func (u *discord) OnFailure(s *types.Service, f *types.Failure) {
77
        msg := fmt.Sprintf(`{"content": "Your service '%v' is currently failing! Reason: %v"}`, s.Name, f.Issue)
78
        u.AddQueue(msg)
79
        u.Online = false
80
}
func twilio.OnTest
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go:

137
func (u *twilio) OnTest() error {
138
        msg := fmt.Sprintf("Testing the Twilio SMS Notifier")
139
        return u.Send(msg)
140
}
func email.OnSave
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go:

214
func (u *email) OnSave() error {
215
        utils.Log(1, fmt.Sprintf("Notification %v is receiving updated information.", u.Method))
216
        // Do updating stuff here
217
        return nil
218
}
func lineNotifier.OnSave
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/line_notify.go:

96
func (u *lineNotifier) OnSave() error {
97
        utils.Log(1, fmt.Sprintf("Notification %v is receiving updated information.", u.Method))
98
        // Do updating stuff here
99
        return nil
100
}
func emailSource
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go:

248
func emailSource(email *emailOutgoing) {
249
        source := emailTemplate(email.Template, email.Data)
250
        email.Source = source
251
}
func twilio.OnSave
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go:

128
func (u *twilio) OnSave() error {
129
        utils.Log(1, fmt.Sprintf("Notification %v is receiving updated information.", u.Method))
130
131
        // Do updating stuff here
132
133
        return nil
134
}
func webhooker.OnSave
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go:

186
func (w *webhooker) OnSave() error {
187
        return nil
188
}
Package Overview: github.com/hunterlong/statup/plugin 33.33%

This is a coverage report created after analysis of the github.com/hunterlong/statup/plugin package. It has been generated with the following command:

gocov test github.com/hunterlong/statup/plugin | gocov-html

Here are the stats. Please select a function name to view its implementation and see what's left for testing.

Add(...)github.com/hunterlong/statup/plugin/main.go100.00%1/1
SetDatabase(...)github.com/hunterlong/statup/plugin/main.go0.00%0/1
PluginInfo.Form(...)github.com/hunterlong/statup/plugin/main.go0.00%0/1
PluginObject.AddRoute(...)github.com/hunterlong/statup/plugin/main.go0.00%0/0
github.com/hunterlong/statup/plugin33.33%1/3
func Add
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/plugin/main.go:

42
func Add(p Pluginer) *PluginObject {
43
        return &PluginObject{}
44
}
func SetDatabase
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/plugin/main.go:

107
func SetDatabase(database *gorm.DB) {
108
        DB = database
109
}
func PluginInfo.Form
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/plugin/main.go:

111
func (p *PluginInfo) Form() string {
112
        return "okkokokkok"
113
}
func PluginObject.AddRoute
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/plugin/main.go:

46
func (p *PluginObject) AddRoute(s string, i string, f http.HandlerFunc) {
47
48
}
Package Overview: github.com/hunterlong/statup/source 77.71%

This is a coverage report created after analysis of the github.com/hunterlong/statup/source package. It has been generated with the following command:

gocov test github.com/hunterlong/statup/source | gocov-html

Here are the stats. Please select a function name to view its implementation and see what's left for testing.

init(...)github.com/hunterlong/statup/source/rice-box.go100.00%29/29
CreateAllAssets(...)github.com/hunterlong/statup/source/source.go100.00%17/17
init(...)github.com/hunterlong/statup/source/rice-box.go100.00%12/12
init(...)github.com/hunterlong/statup/source/rice-box.go100.00%7/7
init(...)github.com/hunterlong/statup/source/rice-box.go100.00%6/6
Assets(...)github.com/hunterlong/statup/source/source.go100.00%4/4
@79:5(...)github.com/hunterlong/statup/source/source.go100.00%1/1
@83:5(...)github.com/hunterlong/statup/source/source.go100.00%1/1
CompileSASS(...)github.com/hunterlong/statup/source/source.go74.19%23/31
MakePublicFolder(...)github.com/hunterlong/statup/source/source.go71.43%5/7
SaveAsset(...)github.com/hunterlong/statup/source/source.go66.67%4/6
DeleteAllAssets(...)github.com/hunterlong/statup/source/source.go66.67%4/6
copyAndCapture(...)github.com/hunterlong/statup/source/source.go64.29%9/14
CopyToPublic(...)github.com/hunterlong/statup/source/source.go63.64%7/11
OpenAsset(...)github.com/hunterlong/statup/source/source.go60.00%3/5
UsingAssets(...)github.com/hunterlong/statup/source/source.go33.33%4/12
HelpMarkdown(...)github.com/hunterlong/statup/source/source.go0.00%0/6
github.com/hunterlong/statup/source77.71%136/175
func init
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/rice-box.go:

99
func init() {
100
101
        // define files
102
        filec := &embedded.EmbeddedFile{
103
                Filename:    "base.html",
104
                FileModTime: time.Unix(1538458071, 0),
105
                Content:     string("{{ define \"base\" }}\n<!doctype html>\n<html lang=\"en\">\n{{block \"head\" .}} {{end}}\n<body>\n    {{template \"content\" .}}\n</body>\n<footer>{{template \"footer\" .}}</footer>\n{{template \"scripts\" .}}\n</html>\n{{end}}\n"),
106
        }
107
        filed := &embedded.EmbeddedFile{
108
                Filename:    "dashboard.html",
109
                FileModTime: time.Unix(1538459427, 0),
110
                Content:     string("{{define \"title\"}}Statup | Dashboard{{end}}\n{{define \"content\"}}\n<div class=\"container col-md-7 col-sm-12 mt-md-5 bg-light\">\n{{template \"nav\" }}\n    <div class=\"col-12 mt-3\">\n        <div class=\"row stats_area mb-5\">\n            <div class=\"col-4\">\n                <span class=\"lg_number\">{{ CoreApp.ServicesCount }}</span>\n                Total Services\n            </div>\n            <div class=\"col-4\">\n                <span class=\"lg_number\">{{ CoreApp.Count24HFailures }}</span>\n                Failures last 24 Hours\n            </div>\n            <div class=\"col-4\">\n                <span class=\"lg_number\">{{ CoreApp.CountOnline }}</span>\n                Online Services\n            </div>\n        </div>\n        <div class=\"row mt-4\">\n            <div class=\"col-12\">\n                <h3>Services</h3>\n                <div class=\"list-group mb-5 mt-3\">\n                {{ range Services }}\n                    <a href=\"#\" class=\"list-group-item list-group-item-action flex-column align-items-start\">\n                        <div class=\"d-flex w-100 justify-content-between\">\n                            <h5 class=\"mb-1\">{{.Name}}</h5>\n                            <small>{{if .Online}} <span class=\"badge badge-success\">ONLINE</span> {{else}} <span class=\"badge badge-danger\">OFFLINE</span> {{end}}</small>\n                        </div>\n                        <p class=\"mb-1\">{{.SmallText}}</p>\n                    </a>\n                {{ end }}\n                </div>\n\n            {{ range Services }}\n            {{ if .LimitedFailures }}\n                <h4 class=\"text-truncate\">{{.Name}} Failures</h4>\n                <div class=\"list-group mt-3 mb-4\">\n                {{ range .LimitedFailures }}\n                    <a href=\"#\" class=\"list-group-item list-group-item-action flex-column align-items-start\">\n                        <div class=\"d-flex w-100 justify-content-between\">\n                            <h5 class=\"mb-1\">{{.ParseError}}</h5>\n                            <small>{{.Ago}}</small>\n                        </div>\n                        <p class=\"mb-1\">{{.Issue}}</p>\n                    </a>\n                {{ end }}\n                </div>\n            {{ end }}\n            {{ end }}\n\n\n            </div>\n        </div>\n    </div>\n</div>\n{{end}}\n"),
111
        }
112
        filee := &embedded.EmbeddedFile{
113
                Filename:    "error_404.html",
114
                FileModTime: time.Unix(1538457906, 0),
115
                Content:     string("{{define \"title\"}}Statup Page Not Found{{end}}\n{{define \"content\"}}\n<div class=\"container col-md-7 col-sm-12 mt-md-5 bg-light\">\n    <div class=\"col-12 mt-3\">\n        <div class=\"alert alert-danger\" role=\"alert\">\n            Sorry, this page doesn't seem to exist.\n        </div>\n    </div>\n</div>\n{{end}}\n"),
116
        }
117
        filef := &embedded.EmbeddedFile{
118
                Filename:    "favicon.ico",
119
                FileModTime: time.Unix(1530546686, 0),
120
                Content:     string("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00@\x00\x00\x00@\b\x06\x00\x00\x00\xaaiq\xde\x00\x00\v\x92IDATx\x9c\xed\x9ak\x8c]Wu\xc7\u007fk\xed3w\xc6\xf3\xcexb\x1c)\t\x89\x89\xa8\t\xe6!C\xa3\xc8T\xd8q\x1d\x9a\x84\x14\xd1\b\x10\xad\xd4\x12\xb5\xa9P\x15\x12\xd3Z\x15TBB\x15\x1f\xe8\a\xaa\xe0\x98\xb4*\x16n\xfb\xa1T\x05җ҄\x94ď@R\nI_\xaa\"\xd7\x19\x9c4$\xe0Lf\xfc\x18\xcf\xe3νg\xaf\xd5\x0f\xe7\xee9\xe7\x9a\xca\xe9=3\xa6\xa8\x9d\xbfd\xcd\xf8\xdes\xd6\xde\xeb?k\xaf\xbd\xd6\u007foX\xc7:ֱ\x8eu\xac\xe3\xff-\xe4R\x0f\xf0\x86\u007f\x19gff\xeez\x11\xb9!\x04\xdeb\xe6W\xbb\xfb\xa6\x10t\xd0\xddUU\x9af,\xaa\xca)w^t\xb7\xe7@\x9f\x0e\xc1\x9e}\xf5\xddf\x97z~\x97\x84\x80\x81\xbf\x83\x91\x91\xb0Ý_\x8e\xd1\xdf\x0fl\x16\x01\x11\x05\fw\x10\x11D\x84\x18\rUp\aU!\xcf\x1dU\x018\v<\f<\xb8\xbc\xec\x0f-\xdcb\xadK1\xd75'`\xec1\xb9-\x04\xf9\x8c\x88l7s\n\xc7\x05w/\x06\x14A\xa4pجpֽ\xf8\x19\xa3\x93e\x82\x99\xe3^<g愠/\xb9\xfb\x01\x11\xff\xc2\xccN[\\\xcb\xf9\xae\x19\x01\x93\xc7t،\x83\xaa\xfaaw\xa7\xf0\xd7W\x9c\x17QD\x9c\x18\x8bϒ\xe3\xe9YU\xc1\xcd\xe1\x02\xc2\x121\xaa\x82\b/\xba\xf3볻\xe2߯ռׄ\x80\x8dG\xc3f3\xff\x06\xb0\r\x04\x91\xc2Ʉ\x14\t@\x85\x90\xee\xa8\x00V\xc8\bA\xc8s#\x04튒\xc26\x06\xfe\x89\xd9]\xf6\xb9\xb5\x98\xfb\xaa\t\x988\"\xa3\xaa\xe1Iw\xdf\xd6\xf1\a\x91\x14\x01e\xb8\x83\xaf\xbc\xa3\xaa]\xa4T\x89\xb0hhЕg\xdd\x1cQ\xadDDa\xcf\xdd\xef>}\x93\xfd\xc1j篯\xfd\xc8kA\x0e\xba\xfb\xb6\x18\x9d\"\xe4\x93äd\x86j\xf1\xbb H\x14l\xc9\xf0%\xc7\xe6\x1d_\x04\x96\x81\b\xe0\x1d\xe7\v\x03f\x8e(\xb8[\xc7\x06\xc4\xe8)\x89\xde7y,\xbb~\xb5\xb3\xcfV\xf3\xf2\xc4\x11\xbd͝\x0f\x81w&\xa8\xb8\x17;WJrn\x0e\x8b\x82\x9dwdA\x88MC\\P\x8adg\xe6H\x00\xed\x13\x18pd\xd4\xd1\x11\xa0Q,\x85\xb4\xfe\xcb\xe8\x12\n\x82\xa4a\xe6\a\x80\x9f]\x8d\x0f\xb5\x97\xc0\xa6o\x06b\xe4\x19w\xdf^]\xef\xe5\xfa\x06o9\xfeC!N;~\x8e\xdcs\x9e\x15\x93g\x89\x9cr\xf3y\\\x16\xdc=C٨\r\xb6H\x9f\xdc\xe0\xfd\xbeY& \\\x01ac\x99\x1b\xca\xe9zW\xceP\x95\x9f\x9e\xd9\x19\x9f\xae\xebG\xed\b\xc8snHΧDU\x9d\x1c9ؔ\xd0\xfe\xbeOiS>\xdb^\xb6\xbf\\\xfeC?{1\x9bW|jT\xcfN\x9f\xbf1\x9b\xd7}\xf1<wp\xad\xa3\xaf\x832\x978\xa1\x93\x1fR\x84\x89\xc8G\x81\xda\x04Ԏ\x80\x89#\xfa\x19U\xf9T\xda\xe2ܽ+c\xe7ρMɟ\xd8R\xfc\x8d\xc5\x034{\xb5?\xb8Wo\xd7I\xfe,\xbc\x99Q\x1d\xa7\xb3#XW\x01\x15\x82`\xe6\xd3ͦ]\xb1x+\xb5\xaa\xc6\xfaI\xd0y\xa7Y\xb15%\xe7W\xfe\xfam!\xfe'_c\xd9~\xad\x8e\xf3\x00\x8b\xfb\xed!='\xb7\xda\U000f4534\xee\v\x98\x19\xaa\xa9`b\xd3\xc0\x80\xbe\xb5\xae\x1b\xb5\t\x10\x917v\x19R]\xd9\xd6X\xa4is~\xf7\xfc~_U-?\xf7\xb9\xf8\x14\xb3\xf2i;\xeb\x95$\xd8]Mv\x8a\xaaw\xd6\x1d\xa36\x01\x16}2msE\x92\xaaD\xc1\b'\x96\x0e\xf8t]\xdbU\xc8R\xf6\xf98\xe3\xd3\ue38a\xe0m\xf0&\xe4s\x8e\x9e\x17|\xd6\xf1i\xa9\x9d\xcb\xeaG\x80\xc9p\n\xfd\xea\xbeo\xe6\xb8\xf8\xb6\xb1Ǻ#\xa4.\xe6\xee[n\xb2(_\xb1\xef\v\xed\x13N<\x01\xf19\x88\xff\x01\xf9\xb3\xd0\xfaWh\xfes\xfd@\xab͜\xb7ܤ!Z\x84\xa4w\xd6e\xc1\xa7\b\x1a\x82|i\xec1n>\xb7\xc7k\xe5\x80*\xe2)9\x12_\xf1;1Nb~\x92\\\xa6<\xe7{&\x9c\xcc\xdb~\xb2\u007f@_\xa8k\xbb\xf6.0\xf6U\xfda\xdf&ٜ\x12\xa1H\x99\x10)\x93\xd6S\xaa\xfa\x91\x99\x9d\xf9T\xddq\x00\x86\xf7\x065\x8b\xb6x`5V\xfe{\xd4&`\xfc\x90>\xa9\xd7ʎ\xb4?\v\x82h\x91\x94R##\x021ZKD\xbel\xc6_\x80\x1d>\xb3\xdb/I__\x17\xf5\x93\xe0\f\xdf\xf1\x96w\x1a\x13\xb0N'\x97j\x013'FÝ\x86\x88\xdc\t\xfe\x88\xaa\xbe:y,{p\xe3\xd1p\xd7ƣ\xe1\xea5\xf4\xa36jG\xc0\xd0o\xeb\x8e\xec-<\x19\xae\xaaV\x82\x1d\xa3\x9dv\xb8\xf8\xfcG;\xbfJ+|\x1c\xf8z\x9e\xfb\xa3\xfd\xfd}O\xbc\xfa\xee֚\x8a\x1d\xff\x13\xd4'\xe0^T^\xa7\xcf\xf4\xbd\x8d\xb73HE\xe0(\xbeO\xff/\x9dMy\x02̊F'EO\xa7\xa6o\xba\xfb\xb7@\x1e\rA\x1e\nA\x8e\x9fzW{-|\xbc(V\xa5\a\f\xed\xd3[\xb2k\xe5\x11\xbdΡ\xd1MB\x8a\b\x8b\xa9\xa5M\xe5l\xec\xa8Ct%\xcc\xd4@%\xb8\xfbT\b\xf2\x90\x88<\xe8nO]*\x81tՂ\xc8\xd0'\xc2\xc1\xf0z\xbf\xab\xefZ\x85\r\x85\a\xd5\xee-\xe9}E\xd5FWEW\n%\x82j\x91?\xd2;\xd5g\x81\x1f\xa8\xcaWD\xf8\xd2\xcc\xce\xf8\ufadds\x15\xab&`|_\u007f#\xcf\xda\u007f\xc5f\xbf-\xbbJ\xd0\xcb\x04\x94ʚ/\x15\xa2\xa2\x89)\xf3Ez&\xe9~\xd5ϊ(*\x96K\xf1\xcc\xca\xefG\xf3<~z\xeef\x9eX\xed\xdca\x8d4\xc1\xa1{\xa5a\x81\xcf\xf6]\xae\xbfŤ\xa1\x1b\x05\x19\x06\xfa\xca\xeaP\xb5\x9b\x80\xaa\xe8ٵd\xec\xc2(J\xd3,e\xb3N\xde8$\x12\xf6\x9e\xbe\xa9=\xbf\x9a\xb9\xaf\xa9,\xbe\xe1c\xb2+\x1b\xd1\xdf\xf7!߮\x97\x81\x8c\x03CN6\xac+5gW\xd7\b\x95\xa6\xa6\x9a\x13\xa0\xaa('hG\x1bL\x89S\x84\xa7ݹ\xf5\xccn\x9b\xa9;\xe75?\x17\x90\xbb\xd0\xc1\xc1\xb0\x9b\x86\xdf\x1d\x06\xf5\xb68\x18\x1b:\x02:&\x84\x11\xc1\xfb\x9d\xb0\xa1\x94\xca\xd3_<EE\xe7\x1c\xa0\xd3cx\xea\xf9\xbbT \x11%\xc6H\x96\x05\xdc\xfd;ͦ\xef\\\xb8\xc5j\x95ܗ\xf4hlxo\x98p\xfc\x0e\xe9烞\xb1+\x8cJC\x86\x81\r\x8e\x8c\x00\x03\x10\x06\x05\x0f\xdd\x11\xb0R]J\x99+RM\x01t\x91\xe3\xee\xe49\xf7\x9f\xdbc{\xeb\xcc\xf1\x92\x9f\r&\f\xef\r\xc3\xc0{\xa2\xda{À\xbc\x87\x86\\)#^\b\xa1C\x82\x8e\x80n\x10d\x03\x18\xa9p\xea^\xfbi\xb9T\x97Lg\x99\xe4\xaa\xfa晝\xf9\x89^\xe7\xf5c#\xa0\x8a\xf1}}\xb4Z\xf1\x8d\x1adO\f~s6 \xbb\xe8\xf7q\x86\x05\x19tt\ftX`\xb0P\x8c\x13\x11\xee\xe9g\xf1Yyt&\xb8\xf3\xf9\xd37\xc5\xdf\xecu.\xff+\x04\\\x88ὒ\xb9\xcbvT\xf6Ȁ\xbfW\x1ar#\xa3\xae:\n:)\xc8\x18H\xf0\xea\x0e\xb0\x92 \xdd%-\x85\x93\xb3\xbb\xe2\x1bz\x1d\xfb'\x82\x80\v1t\xaflr\xe4\x03\xb2\x81\x8f\xe8\xa8\xdc\x10\xae\x84p\x15H\xe8.\xaf/(\x960\xb3\xcb\xcf\xec\xf6\x9ev\x845!`\xfcq\xc9D\xe4:U\xb6\xba3\u007f\xfa&{l-\xec\x02\f~,\xec\x961?ط\x8d-\xe1\x8ab\t\x98\x91\x0eK+J4\x80\xbfcv\x97\xfdS/\xf6{V\x846\x1e\x95a\xd5pG\x9eۛTe\xab\x9bo\x15\x95-f\xde\xe8\x1ci\x1f\x06\u058c\x80\xc5/\xc4Ã\xf7\xe8\xbb\xecE\xf9G\xb9ܯ\x96\xd0\xddHA\x99\x18C\xd0qzT\xc7{\xd6\x03\xe24ט\xf1\xa7\"|\xd2\xdd\xdf/*[E\xa4Q\xa8\u008e\x99\xdf8yL\x1b\xbdڽ\x18\x16\x0f\xd8);\xeb\xfb\xc8\xcbJP\xe8V\x88͌<\x8f=\xfb\xd3\xf3\v\xf6\xbc\x8c\xd3N\xc5K\xd9\xd5\x15g\x82\x82\b\x831rK\xafv_\v}\xed\xeco\x05ZЩ\x17\xa4\xac\a@\bAɖC\xcfjS\xcf\x04\xb4Oq\"\x9e\xabfa*\xe1X$&U\xa9U\x94\\\f\xfd\xbf\xc0\x80\xf4\x17\",\xa4\xf3\x00\xed\x12bZ\xcf\xf9\\\xafv{&`\xe9>\x9b\xb63L\xa5s\x80\x94\x8d\x81\xce>-\x98\xf9\xee\xcb\x0e\xeb\xfbz\xb5}1\xb4Z\xf1W\xcc=+\x1a'\xa5\xdd6܍\x18;\xd2\xdb\"ė\xfd\a\xbdڭ\xa5\t\xda,\x0f{[:엵z\xa7RM\xa75\a'\x8fe\xd7Ա\u007f!&\x8f\x85+U\xf9\xdd2\xf9yg\xac\"\xf4C\x10\xec\f\xd3\xf9\xbc\xf5|\x18S\x8b\x00\x9f\xe5\xab6\x93z\xfcB\xe9Iˡ\x88\x86\xe2\xcc\xceݏ\x8c?.[댑0\xfe\xb8n\x06\x1e\x01&R\xe3\x94\bOw\x8cp\xb0i?\xdc|\xa0w\xfb\xb5\b\x90\x96\u007f\xcb^⸵|\xe5\x92C\xb5\x9bK\n\x8f;\xd7\x00\u07fd\xfc\x89\xec\xe3C_g\xa0\x971&\x8e\xc0\xe4\xb1p{\b\xf2]3\xb6\xa5\xc6\xc8\xccȲ\xf2ʌ\b\xe4\xaf:>-\u007f^˗:/\x01\f}R\xef\xcc\xde\xc4\x1fg\xaf\xaf^\x86\xb2\xceQ9+ˡli\x99v\xf7/\x8b\xf0h\x9e\xf3\xf4\xb9=?\xda\xc3O\x1e\xcb\x06\xddm\x9b;\xbb\xdc\xf9EUy{\xfa\xaej\xb3\x18\xabs_\xa8\r\xadg|\xca^\xe6\xa7\x16\xee\xef]7\xacM\x80\xfe*\xd9\xf0\x96\xf0\x8c^\xefo\xcd6\n\xee\xd2!\xa0HR\xc5\x05\xc8R\xe8\xac\\n\xa2\x13!s\xc0\f\xd02#\x13\xf1q\x90\t@c,[ݴ\xac\ne\xa9T\x8aB\x10<B{\xca\xe1\xa4~p\xee\xf7\xf2\xaf\xd5\xf2\xa3.\x01v\x88<\x9f\xf5\x8f\xdaIr\x9b\x87\xe2\x9eP)kU\xf5\xbej4\xa4\x9b$\xee\x8c\xc6\xe8[\xcc|\xab\b\xd7\x01\x93\x80V5\x80t\x9f\xb0\x10JS\x84\x15\xdf\xc7\xdc\xc9_r\xe2\v\xfc\xb57\xad\x96\xf3\x00\xa1\xee\x8b\x00\xedo\xfbK\xd9\xdbd\x816?'C \xfd\xc9\xd1\xf22S٬$ŷ\xbc\x17X\xaa<\x90\xda\xdbR-\x93\x15\x87S\xd4dY\x87\xc9\x1c\xece\xb0\xef\xc9q\x9f\x93\x9f\x9f\xdf_O\r\x82U\x12\x000\xfa3\xfd\xffО\xb3a_b\a}\x10\x86\x04\x87\x15\xf5&9\x9e\bIW\\\xca\x1dC\xaa\xcd\f\x89\x88\xf4Nq\xbeXl{n\x8e/\x80\xbd\b\xf6\xbc\x1c\x97\xf3z\xf3\xfc\xfe|U\xf7\x10VM\xc0ғ9}\xef\xf0o\xb0\xa4\v\xb2(\xbbc\xcbU3\x90\x06H\xa5.\x80R!N[e\xf1\x1d$\xa7˪N\xa8\n\xa7\xaa\x02K`\xaf@|\x1e\xe2\xcb<\xec\vr\xfb\xfc\xfe\xfc\x95\xd5\xce\u007fM\xf5\x80Ꮗ\x1d>\xe0\u007f\xa4\x97\xb1MƁq'\x1b\x16\xe8\x17\b\xddjpB\xb5vH\xe7\x88f\xc5m\x10ZB>op\x0e\xec4pF\xa6m\xc1\u007f\a\xb3C\v\xf7\xaf͜\xd7\\\x10\x19\xbc\x87LC\xf6Kް\xbd:\xc8v\x19\x13\xe8wd\x03ſ\x06H\x80N\xd5\fBq\xb4\xee\xe0\x06\x9e\x83-9>_\\\x85a\x1eX\x90\x93\xb6\xc4\x03\xb1\x1d\xbf\xd8|\x80U\x9d\x03\\\x88K\xaa\b\rݫף\xbcO\xfae'ʍ\x1e|\\\xfa:$\xf4\t\x8e\xa3\x01,\a\x8f\xa0.X\xd3\xf16-\"\xff\xe6\xcb\x1c&\xf27\xcb\xcb\xf6\xed\xf8\xc5z\xd7\xe0^\v?6Il\xf0\x1eȲl\xb3\xbbl\x01\xdfdf\x138\x03\x0e\x99Eoj\x90y\x119kf/4\x17}\xca\x0f\xf1\x13u\x91b\x1d\xebX\xc7:\xd6\xf1\u007f\x11\xff\x05\x1f2t\x13ȇz\xd2\x00\x00\x00\x00IEND\xaeB`\x82"),
121
        }
122
        fileg := &embedded.EmbeddedFile{
123
                Filename:    "footer.html",
124
                FileModTime: time.Unix(1538458476, 0),
125
                Content:     string("{{ define \"footer\"}}\n<div class=\"footer text-center mb-4\">\n{{ if CoreApp.Footer}}\n    {{ CoreApp.Footer }}\n{{ else }}\n    <a href=\"https://github.com/hunterlong/statup\" target=\"_blank\">Statup {{VERSION}} made with ❤️</a> | <a href=\"/dashboard\">Dashboard</a>\n{{ end }}\n</div>\n{{ end }}\n"),
126
        }
127
        fileh := &embedded.EmbeddedFile{
128
                Filename:    "form_checkin.html",
129
                FileModTime: time.Unix(1538707029, 0),
130
                Content:     string("{{define \"form_checkin\"}}\n<form action=\"/checkin/{{.Id}}\" method=\"POST\">\n    <div class=\"form-group row\">\n        <div class=\"col-md-4 col-sm-4\">\n            <label for=\"checkin_interval\" class=\"col-form-label\">Check Interval (in seconds)</label>\n            <input type=\"number\" name=\"interval\" class=\"form-control\" id=\"checkin_interval\" value=\"{{.Interval}}\" placeholder=\"60\">\n        </div>\n        <div class=\"col-md-4 col-sm-4\">\n            <label for=\"grace_period\" class=\"col-form-label\">Grace Period</label>\n            <input type=\"number\" name=\"grace\" class=\"form-control\" id=\"grace_period\" value=\"{{.GracePeriod}}\" placeholder=\"60\">\n        </div>\n        <div class=\"col-md-4 col-sm-4\">\n            <label for=\"checkin_interval\" class=\"col-form-label\"></label>\n            <button type=\"submit\" class=\"btn btn-success d-block\">Save Checkin</button>\n        </div>\n    </div>\n</form>\n{{end}}\n"),
131
        }
132
        filei := &embedded.EmbeddedFile{
133
                Filename:    "form_notifier.html",
134
                FileModTime: time.Unix(1538552384, 0),
135
                Content:     string("{{define \"form_notifier\"}}\n{{$n := .Select}}\n<form method=\"POST\" class=\"{{underscore $n.Method }}\" action=\"/settings/notifier/{{ $n.Method }}\">\n{{if $n.Title}}<h4>{{$n.Title}}</h4>{{end}}\n{{if $n.Description}}<p class=\"small text-muted\">{{$n.Description}}</p>{{end}}\n\n{{range $n.Form}}\n    <div class=\"form-group\">\n            <label class=\"text-capitalize\" for=\"{{underscore .Title}}\">{{.Title}}</label>\n        {{if eq .Type \"textarea\"}}\n            <textarea rows=\"3\" class=\"form-control\" name=\"{{underscore .DbField}}\" id=\"{{underscore .Title}}\">{{ $n.GetValue .DbField }}</textarea>\n        {{else}}\n            <input type=\"{{.Type}}\" name=\"{{underscore .DbField}}\" class=\"form-control\" value=\"{{ $n.GetValue .DbField }}\" id=\"{{underscore .Title}}\" placeholder=\"{{.Placeholder}}\" {{if .Required}}required{{end}}>\n        {{end}}\n        {{if .SmallText}}\n            <small class=\"form-text text-muted\">{{safe .SmallText}}</small>\n        {{end}}\n    </div>\n{{end}}\n\n    <div class=\"row\">\n        <div class=\"col-9 col-sm-6\">\n            <div class=\"input-group mb-2\">\n                <div class=\"input-group-prepend\">\n                    <div class=\"input-group-text\">Limit</div>\n                </div>\n                <input type=\"text\" class=\"form-control\" name=\"limits\" min=\"1\" max=\"60\" id=\"limits_per_hour_{{underscore $n.Method }}\" value=\"{{$n.Limits}}\" placeholder=\"7\">\n                <div class=\"input-group-append\">\n                    <div class=\"input-group-text\">Per Minute</div>\n                </div>\n            </div>\n        </div>\n\n        <div class=\"col-3 col-sm-2 mt-1\">\n            <span class=\"switch\">\n                <input type=\"checkbox\" name=\"enable\" class=\"switch\" id=\"switch-{{ $n.Method }}\" {{if $n.Enabled}}checked{{end}}>\n                <label for=\"switch-{{ $n.Method }}\"></label>\n            </span>\n        </div>\n\n        <input type=\"hidden\" name=\"notifier\" value=\"{{underscore $n.Method }}\">\n\n        <div class=\"col-12 col-sm-4 mb-2 mb-sm-0 mt-2 mt-sm-0\">\n            <button type=\"submit\" class=\"btn btn-primary btn-block text-capitalize\">Save</button>\n        </div>\n\n    {{if $n.CanTest}}\n        <div class=\"col-12 col-sm-12\">\n            <button class=\"test_notifier btn btn-secondary btn-block text-capitalize col-12 float-right\">Test</button>\n        </div>\n\n        <div class=\"col-12 col-sm-12 mt-2\">\n            <div class=\"alert alert-danger d-none\" id=\"{{underscore $n.Method}}-error\" role=\"alert\">\n            {{$n.Method}} has an error!\n            </div>\n\n            <div class=\"alert alert-success d-none\" id=\"{{underscore $n.Method}}-success\" role=\"alert\">\n                The {{$n.Method}} notifier is working correctly!\n            </div>\n        </div>\n    {{end}}\n\n    </div>\n\n{{if $n.Author}}\n    <span class=\"d-block small text-center mt-3 mb-5\">\n                            {{$n.Title}} Notifier created by <a href=\"{{$n.AuthorUrl}}\" target=\"_blank\">{{$n.Author}}</a>\n                        </span>\n{{ end }}\n</form>\n{{end}}\n"),
136
        }
137
        filej := &embedded.EmbeddedFile{
138
                Filename:    "form_service.html",
139
                FileModTime: time.Unix(1538866310, 0),
140
                Content:     string("{{define \"form_service\"}}\n<form action=\"{{if ne .Id 0}}/service/{{.Id}}{{else}}/services{{end}}\" method=\"POST\">\n    <div class=\"form-group row\">\n        <label for=\"service_name\" class=\"col-sm-4 col-form-label\">Service Name</label>\n        <div class=\"col-sm-8\">\n            <input type=\"text\" name=\"name\" class=\"form-control\" id=\"service_name\" value=\"{{.Name}}\" placeholder=\"Name\" required spellcheck=\"false\">\n        </div>\n    </div>\n    <div class=\"form-group row\">\n        <label for=\"service_type\" class=\"col-sm-4 col-form-label\">Service Check Type</label>\n        <div class=\"col-sm-8\">\n            <select name=\"check_type\" class=\"form-control\" id=\"service_type\" value=\"{{.Type}}\">\n                <option value=\"http\" {{if eq .Type \"http\"}}selected{{end}}>HTTP Service</option>\n                <option value=\"tcp\" {{if eq .Type \"tcp\"}}selected{{end}}>TCP Service</option>\n                <option value=\"tcp\" {{if eq .Type \"udp\"}}selected{{end}}>UDP Service</option>\n            </select>\n        </div>\n    </div>\n    <div class=\"form-group row\">\n        <label for=\"service_url\" class=\"col-sm-4 col-form-label\">Application Endpoint (URL)</label>\n        <div class=\"col-sm-8\">\n            <input type=\"text\" name=\"domain\" class=\"form-control\" id=\"service_url\" value=\"{{.Domain}}\" placeholder=\"https://google.com\" required autocapitalize=\"false\" spellcheck=\"false\">\n        </div>\n    </div>\n    <div class=\"form-group row{{if eq .Type \"tcp\"}} d-none{{end}}\">\n        <label for=\"service_check_type\" class=\"col-sm-4 col-form-label\">Service Check Type</label>\n        <div class=\"col-sm-8\">\n            <select name=\"method\" class=\"form-control\" id=\"service_check_type\" value=\"{{.Method}}\">\n                <option value=\"GET\" {{if eq .Method \"GET\"}}selected{{end}}>GET</option>\n                <option value=\"POST\" {{if eq .Method \"POST\"}}selected{{end}}>POST</option>\n                <option value=\"DELETE\" {{if eq .Method \"DELETE\"}}selected{{end}}>DELETE</option>\n                <option value=\"PATCH\" {{if eq .Method \"PATCH\"}}selected{{end}}>PATCH</option>\n                <option value=\"PUT\" {{if eq .Method \"PUT\"}}selected{{end}}>PUT</option>\n            </select>\n        </div>\n    </div>\n    <div class=\"form-group row{{if ne .Method \"POST\"}} d-none{{end}}\">\n        <label for=\"post_data\" class=\"col-sm-4 col-form-label\">Optional Post Data (JSON)</label>\n        <div class=\"col-sm-8\">\n            <textarea name=\"post_data\" class=\"form-control\" id=\"post_data\" rows=\"3\" autocapitalize=\"false\" spellcheck=\"false\">{{.PostData}}</textarea>\n            <small id=\"emailHelp\" class=\"form-text text-muted\">You can insert <a target=\"_blank\" href=\"https://regex101.com/r/I5bbj9/1\">Regex</a> to validate the response</small>\n        </div>\n    </div>\n    <div class=\"form-group row{{if eq .Type \"tcp\"}} d-none{{end}}\">\n        <label for=\"service_response\" class=\"col-sm-4 col-form-label\">Expected Response (Regex)</label>\n        <div class=\"col-sm-8\">\n            <textarea name=\"expected\" class=\"form-control\" id=\"service_response\" rows=\"3\" autocapitalize=\"false\" spellcheck=\"false\">{{.Expected}}</textarea>\n        </div>\n    </div>\n    <div class=\"form-group row{{if eq .Type \"tcp\"}} d-none{{end}}\">\n        <label for=\"service_response_code\" class=\"col-sm-4 col-form-label\">Expected Status Code</label>\n        <div class=\"col-sm-8\">\n            <input type=\"number\" name=\"expected_status\" class=\"form-control\" value=\"{{if ne .ExpectedStatus 0}}{{.ExpectedStatus}}{{end}}\" placeholder=\"200\" id=\"service_response_code\">\n        </div>\n    </div>\n    <div class=\"form-group row{{if eq .Type \"\"}} d-none{{else if eq .Type \"http\"}} d-none{{end}}\">\n        <label for=\"service_port\" class=\"col-sm-4 col-form-label\">TCP Port</label>\n        <div class=\"col-sm-8\">\n            <input type=\"number\" name=\"port\" class=\"form-control\" value=\"{{if ne .Port 0}}{{.Port}}{{end}}\" id=\"service_port\" placeholder=\"8080\">\n        </div>\n    </div>\n    <div class=\"form-group row\">\n        <label for=\"service_interval\" class=\"col-sm-4 col-form-label\">Check Interval (Seconds)</label>\n        <div class=\"col-sm-8\">\n            <input type=\"number\" name=\"interval\" class=\"form-control\" value=\"{{if ne .Interval 0}}{{.Interval}}{{end}}\" min=\"1\" id=\"service_interval\" required>\n            <small id=\"emailHelp\" class=\"form-text text-muted\">10,000+ will be checked in Microseconds (1 millisecond = 1000 microseconds).</small>\n        </div>\n    </div>\n    <div class=\"form-group row\">\n        <label for=\"service_timeout\" class=\"col-sm-4 col-form-label\">Timeout in Seconds</label>\n        <div class=\"col-sm-8\">\n            <input type=\"number\" name=\"timeout\" class=\"form-control\" value=\"{{if ne .Timeout 0}}{{.Timeout}}{{end}}\" placeholder=\"15\" id=\"service_timeout\" min=\"1\">\n        </div>\n    </div>\n    <div class=\"form-group row\">\n        <label for=\"order\" class=\"col-sm-4 col-form-label\">List Order</label>\n        <div class=\"col-sm-8\">\n            <input type=\"number\" name=\"order\" class=\"form-control\" min=\"0\" value=\"{{.Order}}\" id=\"order\">\n        </div>\n    </div>\n    <div class=\"form-group row\">\n        <div class=\"{{if ne .Id 0}}col-6{{else}}col-12{{end}}\">\n            <button type=\"submit\" class=\"btn btn-success btn-block\">{{if ne .Id 0}}Update Service{{else}}Create Service{{end}}</button>\n        </div>\n        {{if ne .Id 0}}\n        <div class=\"col-6\">\n            <a href=\"/service/{{ .Id }}/delete_failures\" class=\"btn btn-danger btn-block confirm-btn\">Delete All Failures</a>\n        </div>\n        {{end}}\n    </div>\n</form>\n{{end}}\n"),
141
        }
142
        filek := &embedded.EmbeddedFile{
143
                Filename:    "form_user.html",
144
                FileModTime: time.Unix(1538543370, 0),
145
                Content:     string("{{define \"form_user\"}}\n<form action=\"{{if ne .Id 0}}/user/{{.Id}}{{else}}/users{{end}}\" method=\"POST\">\n    <div class=\"form-group row\">\n        <label for=\"username\" class=\"col-sm-4 col-form-label\">Username</label>\n        <div class=\"col-6 col-md-4\">\n            <input type=\"text\" name=\"username\" class=\"form-control\" value=\"{{.Username}}\" id=\"username\" placeholder=\"Username\" required>\n        </div>\n        <div class=\"col-6 col-md-4\">\n          <span class=\"switch\">\n            <input type=\"checkbox\" name=\"admin\" class=\"switch\" id=\"switch-normal\"{{if .Admin}} checked{{end}}>\n            <label for=\"switch-normal\">Administrator</label>\n          </span>\n        </div>\n    </div>\n    <div class=\"form-group row\">\n        <label for=\"email\" class=\"col-sm-4 col-form-label\">Email Address</label>\n        <div class=\"col-sm-8\">\n            <input type=\"email\" name=\"email\" class=\"form-control\" id=\"email\" value=\"{{.Email}}\" placeholder=\"user@domain.com\" required autocapitalize=\"false\" spellcheck=\"false\">\n        </div>\n    </div>\n    <div class=\"form-group row\">\n        <label for=\"password\" class=\"col-sm-4 col-form-label\">Password</label>\n        <div class=\"col-sm-8\">\n            <input type=\"password\" name=\"password\" class=\"form-control\" id=\"password\" value=\"##########\" placeholder=\"Password\" required>\n        </div>\n    </div>\n    <div class=\"form-group row\">\n        <label for=\"password_confirm\" class=\"col-sm-4 col-form-label\">Confirm Password</label>\n        <div class=\"col-sm-8\">\n            <input type=\"password\" name=\"password_confirm\" class=\"form-control\" id=\"password_confirm\" value=\"##########\" placeholder=\"Confirm Password\" required>\n        </div>\n    </div>\n    <div class=\"form-group row\">\n        <div class=\"col-sm-12\">\n            <button type=\"submit\" class=\"btn btn-primary btn-block\">{{if ne .Id 0}}Update User{{else}}Create User{{end}}</button>\n        </div>\n    </div>\n</form>\n{{end}}\n"),
146
        }
147
        filel := &embedded.EmbeddedFile{
148
                Filename:    "head.html",
149
                FileModTime: time.Unix(1538459085, 0),
150
                Content:     string("{{ define \"head\"}}\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no, maximum-scale=1.0, user-scalable=0\">\n{{if USE_CDN}}\n    <link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://assets.statup.io/favicon.ico\">\n    <link rel=\"stylesheet\" href=\"https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css\" integrity=\"sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB\" crossorigin=\"anonymous\">\n    <link rel=\"stylesheet\" href=\"https://assets.statup.io/base.css\">\n{{ else }}\n    <link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/favicon.ico\">\n    <link rel=\"stylesheet\" href=\"/css/bootstrap.min.css\">\n    <link rel=\"stylesheet\" href=\"/css/base.css\">\n{{end}}\n{{block \"extra_css\" .}} {{end}}\n<title>{{block \"title\" .}} {{end}}</title>\n</head>\n{{end}}\n"),
151
        }
152
        filem := &embedded.EmbeddedFile{
153
                Filename:    "help.html",
154
                FileModTime: time.Unix(1538459433, 0),
155
                Content:     string("{{define \"title\"}}Statup | Help{{end}}\n{{define \"content\"}}\n<div class=\"container col-md-7 col-sm-12 mt-md-5 bg-light\">\n{{if Auth}}\n    {{template \"nav\"}}\n{{end}}\n    <div class=\"col-12\">\n    {{ safe . }}\n    </div>\n</div>\n{{end}}\n{{define \"extra_css\"}}\n<style>\n    pre {\n        background-color: white;\n        padding: 10px 15px;\n        border: 1px solid #a2a2a233;\n        border-radius: 7px;\n    }\n    code {\n        color: #d87e1a;\n    }\n</style>\n{{end}}\n"),
156
        }
157
        filen := &embedded.EmbeddedFile{
158
                Filename:    "help.md",
159
                FileModTime: time.Unix(1536974218, 0),
160
                Content:     string("# Statup Help\nStatup is an easy to use Status Page monitor for your websites and applications. Statup is developed in Go Language and you are able to create custom plugins with it!\n\n<p>\n    <a href=\"https://github.com/hunterlong/statup\"><img src=\"https://img.shields.io/github/stars/hunterlong/statup.svg?style=social&label=Stars\"></a>\n    <a href=\"https://github.com/hunterlong/statup\"><img src=\"https://img.shields.io/docker/build/hunterlong/statup.svg\"></a>\n    <a href=\"https://github.com/hunterlong/statup\"><img src=\"https://img.shields.io/github/release/hunterlong/statup.svg\"></a>\n</p>\n\n# Services\nFor each website and application you want to add a new Service. Each Service will require a URL endpoint to test your applications status.\nYou can also add expected HTTP responses (regex allow), expected HTTP response codes, and other fields to make sure your service is online or offline.\n\n# Statup Settings\nYou can change multiple settings in your Statup instance.\n\n# Users\nUsers can access the Statup Dashboard to add, remove, and view services.\n\n# Notifications\n\n\n# Plugins\nCreating a plugin for Statup is not that difficult, if you know a little bit of Go Language you can create any type of application to be embedded into the Status framework.\nCheckout the example plugin that includes all the interfaces, information, and custom HTTP routing at <a href=\"https://github.com/hunterlong/statup_plugin\">https://github.com/hunterlong/statup_plugin</a>.\nAnytime there is an action on your status page, all of your plugins will be notified of the change with the values that were changed or created.\n<p></p>\nUsing the statup/plugin Golang package you can quickly implement the event listeners. Statup uses <a href=\"https://github.com/upper/db\">upper.io/db.v3</a> for the database connection.\nYou can use the database inside of your plugin to create, update, and destroy tables/data. <b>Please only use respectable plugins!</b>\n\n# Custom Stlying\nOn Statup Status Page server can you create your own custom stylesheet to be rendered on the index view of your status page. Go to <a href=\"/settings\">Settings</a> and click on Custom Styling.\n\n# API Endpoints\nStatup includes a RESTFUL API so you can view, update, and edit your services with easy to use routes. You can currently view, update and delete services, view, create, update users, and get detailed information about the Statup instance. To make life easy, try out a Postman or Swagger JSON file and use it on your Statup Server.\n\n<p align=\"center\">\n<a href=\"https://github.com/hunterlong/statup/blob/master/dev/postman.json\">Postman JSON Export</a> | <a href=\"https://github.com/hunterlong/statup/blob/master/dev/swagger.json\">Swagger Export</a>\n</p>\n\n## Authentication\nAuthentication uses the Statup API Secret to accept remote requests. You can find the API Secret in the Settings page of your Statup server. To send requests to your Statup API, include a Authorization Header when you send the request. The API will accept any one of the headers below.\n\n- HTTP Header: `Authorization: API SECRET HERE`\n- HTTP Header: `Authorization: Bearer API SECRET HERE`\n\n## Main Route `/api`\nThe main API route will show you all services and failures along with them.\n\n## Services\nThe services API endpoint will show you detailed information about services and will allow you to edit/delete services with POST/DELETE http methods.\n\n### Viewing All Services\n- Endpoint: `/api/services`\n- Method: `GET`\n- Response: Array of [Services](https://github.com/hunterlong/statup/wiki/API#service-response)\n- Response Type: `application/json`\n- Request Type: `application/json`\n\n### Viewing Service\n- Endpoint: `/api/services/{id}`\n- Method: `GET`\n- Response: [Service](https://github.com/hunterlong/statup/wiki/API#service-response)\n- Response Type: `application/json`\n- Request Type: `application/json`\n\n### Updating Service\n- Endpoint: `/api/services/{id}`\n- Method: `POST`\n- Response: [Service](https://github.com/hunterlong/statup/wiki/API#service-response)\n- Response Type: `application/json`\n- Request Type: `application/json`\n\nPOST Data:\n``` json\n{\n    \"name\": \"Updated Service\",\n    \"domain\": \"https://google.com\",\n    \"expected\": \"\",\n    \"expected_status\": 200,\n    \"check_interval\": 15,\n    \"type\": \"http\",\n    \"method\": \"GET\",\n    \"post_data\": \"\",\n    \"port\": 0,\n    \"timeout\": 10,\n    \"order_id\": 0\n}\n```\n\n### Deleting Service\n- Endpoint: `/api/services/{id}`\n- Method: `DELETE`\n- Response: [Object Response](https://github.com/hunterlong/statup/wiki/API#object-response)\n- Response Type: `application/json`\n- Request Type: `application/json`\n\nResponse:\n``` json\n{\n    \"status\": \"success\",\n    \"id\": 4,\n    \"type\": \"service\",\n    \"method\": \"delete\"\n}\n```\n\n## Users\nThe users API endpoint will show you users that are registered inside your Statup instance.\n\n### View All Users\n- Endpoint: `/api/users`\n- Method: `GET`\n- Response: Array of [Users](https://github.com/hunterlong/statup/wiki/API#user-response)\n- Response Type: `application/json`\n- Request Type: `application/json`\n\n### Viewing User\n- Endpoint: `/api/users/{id}`\n- Method: `GET`\n- Response: [User](https://github.com/hunterlong/statup/wiki/API#user-response)\n- Response Type: `application/json`\n- Request Type: `application/json`\n\n### Creating New User\n- Endpoint: `/api/users`\n- Method: `POST`\n- Response: [User](https://github.com/hunterlong/statup/wiki/API#user-response)\n- Response Type: `application/json`\n- Request Type: `application/json`\n\nPOST Data:\n``` json\n{\n    \"username\": \"newadmin\",\n    \"email\": \"info@email.com\",\n    \"password\": \"password123\",\n    \"admin\": true\n}\n```\n\n### Updating User\n- Endpoint: `/api/users/{id}`\n- Method: `POST`\n- Response: [User](https://github.com/hunterlong/statup/wiki/API#user-response)\n- Response Type: `application/json`\n- Request Type: `application/json`\n\nPOST Data:\n``` json\n{\n    \"username\": \"updatedadmin\",\n    \"email\": \"info@email.com\",\n    \"password\": \"password123\",\n    \"admin\": true\n}\n```\n\n### Deleting User\n- Endpoint: `/api/services/{id}`\n- Method: `DELETE`\n- Response: [Object Response](https://github.com/hunterlong/statup/wiki/API#object-response)\n- Response Type: `application/json`\n- Request Type: `application/json`\n\nResponse:\n``` json\n{\n    \"status\": \"success\",\n    \"id\": 3,\n    \"type\": \"user\",\n    \"method\": \"delete\"\n}\n```\n\n# Service Response\n``` json\n{\n    \"id\": 8,\n    \"name\": \"Test Service 0\",\n    \"domain\": \"https://status.coinapp.io\",\n    \"expected\": \"\",\n    \"expected_status\": 200,\n    \"check_interval\": 1,\n    \"type\": \"http\",\n    \"method\": \"GET\",\n    \"post_data\": \"\",\n    \"port\": 0,\n    \"timeout\": 30,\n    \"order_id\": 0,\n    \"created_at\": \"2018-09-12T09:07:03.045832088-07:00\",\n    \"updated_at\": \"2018-09-12T09:07:03.046114305-07:00\",\n    \"online\": false,\n    \"latency\": 0.031411064,\n    \"24_hours_online\": 0,\n    \"avg_response\": \"\",\n    \"status_code\": 502,\n    \"last_online\": \"0001-01-01T00:00:00Z\",\n    \"dns_lookup_time\": 0.001727175,\n    \"failures\": [\n        {\n            \"id\": 5187,\n            \"issue\": \"HTTP Status Code 502 did not match 200\",\n            \"created_at\": \"2018-09-12T10:41:46.292277471-07:00\"\n        },\n        {\n            \"id\": 5188,\n            \"issue\": \"HTTP Status Code 502 did not match 200\",\n            \"created_at\": \"2018-09-12T10:41:47.337659862-07:00\"\n        }\n    ]\n}\n```\n\n# User Response\n``` json\n{\n    \"id\": 1,\n    \"username\": \"admin\",\n    \"api_key\": \"02f324450a631980121e8fd6ea7dfe4a7c685a2f\",\n    \"admin\": true,\n    \"created_at\": \"2018-09-12T09:06:53.906398511-07:00\",\n    \"updated_at\": \"2018-09-12T09:06:54.972440207-07:00\"\n}\n```\n\n# Object Response\n``` json\n{\n    \"type\": \"service\",\n    \"id\": 19,\n    \"method\": \"delete\",\n    \"status\": \"success\"\n}\n```\n\n# Main API Response\n``` json\n{\n    \"name\": \"Awesome Status\",\n    \"description\": \"An awesome status page by Statup\",\n    \"footer\": \"This is my custom footer\",\n    \"domain\": \"https://demo.statup.io\",\n    \"version\": \"v0.56\",\n    \"migration_id\": 1536768413,\n    \"created_at\": \"2018-09-12T09:06:53.905374829-07:00\",\n    \"updated_at\": \"2018-09-12T09:07:01.654201225-07:00\",\n    \"database\": \"sqlite\",\n    \"started_on\": \"2018-09-12T10:43:07.760729349-07:00\",\n    \"services\": [\n        {\n            \"id\": 1,\n            \"name\": \"Google\",\n            \"domain\": \"https://google.com\",\n            \"expected\": \"\",\n            \"expected_status\": 200,\n            \"check_interval\": 10,\n            \"type\": \"http\",\n            \"method\": \"GET\",\n            \"post_data\": \"\",\n            \"port\": 0,\n            \"timeout\": 10,\n            \"order_id\": 0,\n            \"created_at\": \"2018-09-12T09:06:54.97549122-07:00\",\n            \"updated_at\": \"2018-09-12T09:06:54.975624103-07:00\",\n            \"online\": true,\n            \"latency\": 0.09080986,\n            \"24_hours_online\": 0,\n            \"avg_response\": \"\",\n            \"status_code\": 200,\n            \"last_online\": \"2018-09-12T10:44:07.931990439-07:00\",\n            \"dns_lookup_time\": 0.005543935\n        }\n    ]\n}\n```\n\n# Prometheus Exporter\nStatup includes a prometheus exporter so you can have even more monitoring power with your services. The prometheus exporter can be seen on `/metrics`, simply create another exporter in your prometheus config. Use your Statup API Secret for the Authorization Bearer header, the `/metrics` URL is dedicated for Prometheus and requires the correct API Secret has `Authorization` header.\n\n# Grafana Dashboard\nStatup has a [Grafana Dashboard](https://grafana.com/dashboards/6950) that you can quickly implement if you've added your Statup service to Prometheus. Import Dashboard ID: `6950` into your Grafana dashboard and watch the metrics come in!\n\n<p align=\"center\"><img width=\"80%\" src=\"https://img.cjx.io/statupgrafana.png\"></p>\n\n## Basic Prometheus Exporter\nIf you have Statup and the Prometheus server in the same Docker network, you can use the yaml config below.\n``` yaml\nscrape_configs:\n  - job_name: 'statup'\n    scrape_interval: 30s\n    bearer_token: 'SECRET API KEY HERE'\n    static_configs:\n      - targets: ['statup:8080']\n```\n\n## Remote URL Prometheus Exporter\nThis exporter yaml below has `scheme: https`, which you can remove if you arn't using HTTPS.\n``` yaml\nscrape_configs:\n  - job_name: 'statup'\n    scheme: https\n    scrape_interval: 30s\n    bearer_token: 'SECRET API KEY HERE'\n    static_configs:\n      - targets: ['status.mydomain.com']\n```\n\n### `/metrics` Output\n```\nstatup_total_failures 206\nstatup_total_services 4\nstatup_service_failures{id=\"1\" name=\"Google\"} 0\nstatup_service_latency{id=\"1\" name=\"Google\"} 12\nstatup_service_online{id=\"1\" name=\"Google\"} 1\nstatup_service_status_code{id=\"1\" name=\"Google\"} 200\nstatup_service_response_length{id=\"1\" name=\"Google\"} 10777\nstatup_service_failures{id=\"2\" name=\"Statup.io\"} 0\nstatup_service_latency{id=\"2\" name=\"Statup.io\"} 3\nstatup_service_online{id=\"2\" name=\"Statup.io\"} 1\nstatup_service_status_code{id=\"2\" name=\"Statup.io\"} 200\nstatup_service_response_length{id=\"2\" name=\"Statup.io\"} 2\n```\n\n# Static HTML Exporter\nYou might have a server that won't allow you to run command that run longer for 60 seconds, or maybe you just want to export your status page to a static HTML file. Using the Statup exporter you can easily do this with 1 command.\n\n```\nstatup export\n```\n###### 'index.html' is created in current directory with static CDN url's.\n\n## Push to Github\nOnce you have the `index.html` file, you could technically send it to an FTP server, Email it, Pastebin it, or even push to your Github repo for Status updates directly from repo.\n\n```bash\ngit add index.html\ngit commit -m \"Updated Status Page\"\ngit push -u origin/master\n```\n\n# Config with .env File\nIt may be useful to load your environment using a `.env` file in the root directory of your Statup server. The .env file will be automatically loaded on startup and will overwrite all values you have in config.yml.\n\nIf you have the `DB_CONN` environment variable set Statup will bypass all values in config.yml and will require you to have the other DB_* variables in place. You can pass in these environment variables without requiring a .env file.\n\n## `.env` File\n```bash\nDB_CONN=postgres\nDB_HOST=0.0.0.0\nDB_PORT=5432\nDB_USER=root\nDB_PASS=password123\nDB_DATABASE=root\n\nNAME=Demo\nDESCRIPTION=This is an awesome page\nDOMAIN=https://domain.com\nADMIN_USER=admin\nADMIN_PASS=admin\nADMIN_EMAIL=info@admin.com\nUSE_CDN=true\n\nIS_DOCKER=false\nIS_AWS=false\nSASS=/usr/local/bin/sass\nCMD_FILE=/bin/bash\n```\nThis .env file will include additional variables in the future, subscribe to this repo to keep up-to-date with changes and updates.\n\n# Makefile\nHere's a simple list of Makefile commands you can run using `make`. The [Makefile](https://github.com/hunterlong/statup/blob/master/Makefile) may change often, so i'll try to keep this Wiki up-to-date.\n\n- Ubuntu `apt-get install build-essential`\n- MacOSX `sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer`\n- Windows [Install Guide for GNU make utility](http://gnuwin32.sourceforge.net/packages/make.htm)\n- CentOS/RedHat `yum groupinstall \"Development Tools\"`\n\n### Commands\n``` bash\nmake build                         # build the binary\nmake install\nmake run\nmake test\nmake coverage\nmake docs\n# Building Statup\nmake build-all\nmake build-alpine\nmake docker\nmake docker-run\nmake docker-dev\nmake docker-run-dev\nmake databases\nmake dep\nmake dev-deps\nmake clean\nmake compress\nmake cypress-install\nmake cypress-test\n```\n\n## Testing\n* If you want to test your updates with the current golang testing units, you can follow the guide below to run a full test process. Each test for Statup will run in MySQL, Postgres, and SQlite to make sure all database types work correctly.\n\n## Create Docker Databases\nThe easiest way to run the tests on all 3 databases is by starting temporary databases servers with Docker. Docker is available for Linux, Mac and Windows. You can download/install it by going to the [Docker Installation](https://docs.docker.com/install/) site.\n\n``` bash\ndocker run -it -d \\\n   -p 3306:3306 \\\n   -env MYSQL_ROOT_PASSWORD=password123 \\\n   -env MYSQL_DATABASE=root mysql\n```\n\n``` bash\ndocker run -it -d \\\n   -p 5432:5432 \\\n   -env POSTGRES_PASSWORD=password123 \\\n   -env POSTGRES_USER=root \\\n   -env POSTGRES_DB=root postgres\n```\n\nOnce you have MySQL and Postgres running, you can begin the testing. SQLite database will automatically create a `statup.db` file and will delete after testing.\n\n## Run Tests\nInsert the database environment variables to auto connect the the databases and run the normal test command: `go test -v`. You'll see a verbose output of each test. If all tests pass, make a push request! 💃\n``` bash\nDB_DATABASE=root \\\n   DB_USER=root \\\n   DB_PASS=password123 \\\n   DB_HOST=localhost \\\n   go test -v\n```\n"),
161
        }
162
        fileo := &embedded.EmbeddedFile{
163
                Filename:    "index.html",
164
                FileModTime: time.Unix(1538522506, 0),
165
                Content:     string("{{define \"title\"}}{{CoreApp.Name}} Status{{end}}\n{{define \"content\"}}\n<div class=\"container col-md-7 col-sm-12 mt-2 sm-container\">\n<h1 class=\"col-12 text-center mb-4 mt-sm-3 header-title\">{{.Name}}</h1>\n\n{{ if .Description }}\n<h5 class=\"col-12 text-center mb-5 header-desc\">{{ .Description }}</h5>\n{{ end }}\n\n<div class=\"col-12 full-col-12 mb-5\">\n    <div class=\"list-group online_list\">\n    {{ range Services }}\n        <a href=\"#\" class=\"service_li list-group-item list-group-item-action {{if not .Online}}bg-danger text-white{{ end }}\" data-id=\"{{.Id}}\">\n        {{ .Name }}\n        {{if .Online}}\n            <span class=\"badge bg-success float-right pulse-glow\">ONLINE</span>\n        {{ else }}\n            <span class=\"badge bg-white text-black-50 float-right pulse\">OFFLINE</span>\n        {{end}}\n        </a>\n    {{ end }}\n    </div>\n</div>\n\n<div class=\"col-12 full-col-12\">\n{{ if not Services }}\n    <div class=\"alert alert-danger\" role=\"alert\">\n        <h4 class=\"alert-heading\">No Services to Monitor!</h4>\n        <p>Your Statup Status Page is working correctly, but you don't have any services to monitor. Go to the <b>Dashboard</b> and add a website to begin really using your status page!</p>\n        <hr>\n        <p class=\"mb-0\">If this is a bug, please make an issue in the Statup Github Repo. <a href=\"https://github.com/hunterlong/statup\" class=\"btn btn-sm btn-outline-danger float-right\">Statup Github Repo</a></p>\n    </div>\n{{end}}\n{{ range Services }}\n    <div class=\"mt-4\" id=\"service_id_{{.Id}}\">\n        <div class=\"card\">\n            <div class=\"card-body\">\n                <div class=\"col-12\">\n                    <h4 class=\"mt-3\"><a href=\"/service/{{.Id}}\"{{if not .Online}} class=\"text-danger\"{{end}}>{{ .Name }}</a>\n                    {{if .Online}}\n                        <span class=\"badge bg-success float-right\">ONLINE</span>\n                    {{ else }}\n                        <span class=\"badge bg-danger float-right pulse\">OFFLINE</span>\n                    {{end}}</h4>\n\n                    <div class=\"row stats_area mt-5 mb-5\">\n                        <div class=\"col-4\">\n                            <span class=\"lg_number\">{{.Online24}}%</span>\n                            Online last 24 Hours\n                        </div>\n                        <div class=\"col-4\">\n                            <span class=\"lg_number\">{{.AvgTime}}ms</span>\n                            Average Response\n                        </div>\n                        <div class=\"col-4\">\n                            <span class=\"lg_number\">{{.AvgUptime24}}%</span>\n                            Uptime last 24 Hours\n                        </div>\n                    </div>\n\n                </div>\n            </div>\n        {{ if .AvgUptime24 }}\n            <div class=\"chart-container\">\n                <canvas id=\"service_{{ .Id }}\"></canvas>\n            </div>\n        {{ end }}\n            <div class=\"row lower_canvas full-col-12 text-white{{if not .Online}} bg-danger{{end}}\">\n                <div class=\"col-10 text-truncate\">\n                    <span class=\"d-none d-md-inline\">{{.SmallText}}</span>\n                </div>\n                <div class=\"col-sm-12 col-md-2\">\n                    <a href=\"/service/{{ .Id }}\" class=\"btn {{if .Online}}btn-success{{else}}btn-danger{{end}} btn-sm float-right dyn-dark btn-block\">View Service</a>\n                </div>\n            </div>\n        </div>\n    </div>\n{{ end }}\n</div>\n</div>\n{{end}}\n{{define \"extra_scripts\"}}\n<script src=\"/charts.js\"></script>\n{{end}}\n"),
166
        }
167
        filep := &embedded.EmbeddedFile{
168
                Filename:    "login.html",
169
                FileModTime: time.Unix(1538454764, 0),
170
                Content:     string("{{define \"title\"}}Statup Login{{end}}\n{{define \"content\"}}\n<div class=\"container col-md-7 col-sm-12 mt-md-5 bg-light\">\n    <div class=\"col-10 offset-1 col-md-8 offset-md-2 mt-md-2\">\n        <div class=\"col-12 col-md-8 offset-md-2 mb-4\">\n            <img class=\"col-12 mt-5 mt-md-0\" src=\"/statup.png\">\n        </div>\n    {{ if .Error }}\n        <div class=\"alert alert-danger\" role=\"alert\">\n            Incorrect login information submitted, try again.\n        </div>\n    {{ end }}\n        <form action=\"/dashboard\" method=\"POST\">\n            <div class=\"form-group row\">\n                <label for=\"username\" class=\"col-sm-2 col-form-label\">Username</label>\n                <div class=\"col-sm-10\">\n                    <input type=\"text\" name=\"username\" class=\"form-control\" id=\"username\" placeholder=\"Username\" autocapitalize=\"false\" spellcheck=\"false\">\n                </div>\n            </div>\n            <div class=\"form-group row\">\n                <label for=\"password\" class=\"col-sm-2 col-form-label\">Password</label>\n                <div class=\"col-sm-10\">\n                    <input type=\"password\" name=\"password\" class=\"form-control\" id=\"password\" placeholder=\"Password\">\n                </div>\n            </div>\n            <div class=\"form-group row\">\n                <div class=\"col-sm-12\">\n                    <button type=\"submit\" class=\"btn btn-primary btn-block\">Sign in</button>\n                </div>\n            </div>\n        </form>\n    </div>\n</div>\n{{end}}\n"),
171
        }
172
        fileq := &embedded.EmbeddedFile{
173
                Filename:    "logs.html",
174
                FileModTime: time.Unix(1538460210, 0),
175
                Content:     string("{{define \"title\"}}Statup | Logs{{end}}\n{{define \"content\"}}\n<div class=\"container col-md-7 col-sm-12 mt-md-5 bg-light\">\n{{if Auth}}\n    {{template \"nav\"}}\n{{end}}\n<div class=\"col-12\">\n    <textarea id=\"live_logs\" class=\"form-control\" rows=\"40\" readonly>{{range .}}{{.}}{{end}}</textarea>\n</div>\n</div>\n{{end}}\n{{define \"extra_css\"}}\n<style>\n    @media (max-width: 767px) {\n        #live_logs {\n            font-size: 6pt;\n        }\n    }\n</style>\n{{end}}\n"),
176
        }
177
        filer := &embedded.EmbeddedFile{
178
                Filename:    "nav.html",
179
                FileModTime: time.Unix(1534817721, 0),
180
                Content:     string("{{define \"nav\"}}\n<nav class=\"navbar navbar-expand-lg navbar-light bg-light\">\n    <a class=\"navbar-brand\" href=\"/\">Statup</a>\n    <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\"#navbarText\" aria-controls=\"navbarText\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div class=\"collapse navbar-collapse\" id=\"navbarText\">\n        <ul class=\"navbar-nav mr-auto\">\n            <li class=\"nav-item{{ if eq URL \"/dashboard\" }} active{{ end }}\">\n                <a class=\"nav-link\" href=\"/dashboard\">Dashboard</a>\n            </li>\n            <li class=\"nav-item{{ if eq URL \"/services\" }} active{{ end }}\">\n                <a class=\"nav-link\" href=\"/services\">Services</a>\n            </li>\n            <li class=\"nav-item{{ if eq URL \"/users\" }} active{{ end }}\">\n                <a class=\"nav-link\" href=\"/users\">Users</a>\n            </li>\n            <li class=\"nav-item{{ if eq URL \"/settings\" }} active{{ end }}\">\n                <a class=\"nav-link\" href=\"/settings\">Settings</a>\n            </li>\n            <li class=\"nav-item{{ if eq URL \"/logs\" }} active{{ end }}\">\n                <a class=\"nav-link\" href=\"/logs\">Logs</a>\n            </li>\n            <li class=\"nav-item{{ if eq URL \"/help\" }} active{{ end }}\">\n                <a class=\"nav-link\" href=\"/help\">Help</a>\n            </li>\n        </ul>\n        <span class=\"navbar-text\">\n      <a class=\"nav-link\" href=\"/logout\">Logout</a>\n    </span>\n    </div>\n</nav>\n{{end}}"),
181
        }
182
        files := &embedded.EmbeddedFile{
183
                Filename:    "robots.txt",
184
                FileModTime: time.Unix(1530546686, 0),
185
                Content:     string("User-agent: *\nDisallow: /login\nDisallow: /dashboard"),
186
        }
187
        filet := &embedded.EmbeddedFile{
188
                Filename:    "scripts.html",
189
                FileModTime: time.Unix(1538453657, 0),
190
                Content:     string("{{define \"scripts\"}}\n{{if USE_CDN}}\n<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\"></script>\n<script src=\"https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js\" integrity=\"sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T\" crossorigin=\"anonymous\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.bundle.min.js\"></script>\n<script src=\"https://assets.statup.io/main.js\"></script>\n{{ else }}\n<script src=\"/js/jquery-3.3.1.min.js\"></script>\n<script src=\"/js/bootstrap.min.js\"></script>\n<script src=\"/js/Chart.bundle.min.js\"></script>\n<script src=\"/js/main.js\"></script>\n{{end}}\n{{block \"extra_scripts\" .}} {{end}}\n{{end}}\n"),
191
        }
192
        fileu := &embedded.EmbeddedFile{
193
                Filename:    "service.html",
194
                FileModTime: time.Unix(1538796803, 0),
195
                Content:     string("{{define \"title\"}}{{.Service.Name}} Status{{end}}\n{{ define \"content\" }}\n{{$s := .Service}}\n\n<div class=\"container col-md-7 col-sm-12 mt-md-5 bg-light\">\n\n{{if Auth}}\n    {{template \"nav\"}}\n{{end}}\n\n    <div class=\"col-12 mb-4\">\n\n    {{if $s.Online }}\n        <span class=\"mt-3 mb-3 text-white d-md-none btn bg-success d-block d-md-none\">ONLINE</span>\n    {{ else }}\n        <span class=\"mt-3 mb-3 text-white d-md-none btn bg-danger d-block d-md-none\">OFFLINE</span>\n    {{end}}\n\n        <h4 class=\"mt-2\">{{ $s.Name }}\n        {{if $s.Online }}\n            <span class=\"badge bg-success float-right d-none d-md-block\">ONLINE</span>\n        {{ else }}\n            <span class=\"badge bg-danger float-right d-none d-md-block\">OFFLINE</span>\n        {{end}}</h4>\n\n        <div class=\"row stats_area mt-5 mb-5\">\n\n            <div class=\"col-4\">\n                <span class=\"lg_number\">{{$s.Online24}}%</span>\n                Online last 24 Hours\n            </div>\n\n            <div class=\"col-4\">\n                <span class=\"lg_number\">{{$s.AvgTime}}ms</span>\n                Average Response\n            </div>\n\n            <div class=\"col-4\">\n                <span class=\"lg_number\">{{$s.TotalUptime}}%</span>\n                Total Uptime\n            </div>\n        </div>\n\n        <div class=\"service-chart-container\">\n            <canvas id=\"service\"></canvas>\n        </div>\n\n        <form id=\"service_date_form\" class=\"col-12 mt-2 mb-3\">\n            <span id=\"start_date\" class=\"text-muted small float-left pointer\">{{FromUnix .Start}}</span>\n            <span id=\"end_date\" class=\"text-muted small float-right pointer\" style=\"position: absolute;right: 0;\">{{FromUnix .End}}</span>\n            <input type=\"hidden\" name=\"start\" class=\"form-control\" id=\"service_start\" spellcheck=\"false\">\n            <input type=\"hidden\" name=\"end\" class=\"form-control\" id=\"service_end\" spellcheck=\"false\">\n            <button type=\"submit\" class=\"btn btn-light btn-block btn-sm mt-2\">Set Timeframe</button>\n            <div id=\"start_container\"></div>\n            <div id=\"end_container\"></div>\n        </form>\n\n    {{if not $s.Online}}\n        <div class=\"col-12 small text-center mt-3 text-muted\">{{$s.DowntimeText}}</div>\n    {{end}}\n\n    {{ if $s.LimitedFailures }}\n        <div class=\"list-group mt-3 mb-4\">\n        {{ range $s.LimitedFailures }}\n            <a href=\"#\" class=\"list-group-item list-group-item-action flex-column align-items-start\">\n                <div class=\"d-flex w-100 justify-content-between\">\n                    <h5 class=\"mb-1\">{{.ParseError}}</h5>\n                    <small>{{.Ago}}</small>\n                </div>\n                <p class=\"mb-1\">{{.Issue}}</p>\n            </a>\n        {{ end }}\n        </div>\n    {{ end }}\n\n    </div>\n\n{{if Auth}}\n\n    <div class=\"col-12 mt-4{{if ne $s.Type \"http\"}} d-none{{end}}\">\n        <h3>Last Response</h3>\n        <textarea rows=\"8\" class=\"form-control\" readonly>{{ $s.LastResponse }}</textarea>\n        <div class=\"form-group row mt-2\">\n            <label for=\"last_status_code\" class=\"col-sm-3 col-form-label\">HTTP Status Code</label>\n            <div class=\"col-sm-2\">\n                <input type=\"text\" id=\"last_status_code\" class=\"form-control\" value=\"{{ $s.LastStatusCode }}\" readonly>\n            </div>\n        </div>\n    </div>\n\n    <div class=\"col-12 mt-4\">\n        <h3>Edit Service</h3>\n        {{template \"form_service\" $s}}\n    </div>\n\n    <div class=\"col-12 mt-4\">\n        <h3>Service Checkin</h3>\n        <table class=\"table\">\n            <thead>\n                <tr>\n                    <th scope=\"col\">Checkin</th>\n                    <th scope=\"col\">Report Period<br>Grace Period</th>\n                    <th scope=\"col\">Last Seen</th>\n                    <th scope=\"col\">Expected</th>\n                </tr>\n            </thead>\n            <tbody>\n            {{range $s.Checkins}}\n            {{ $ch := . }}\n            <tr class=\"{{ if lt $ch.Expected 0}}bg-danger text-white{{else}}bg-light{{end}}\">\n                <td>{{CoreApp.Domain}}/checkin/{{$ch.ApiKey}}</td>\n                <td>every {{Duration $ch.Period}}<br>after {{Duration $ch.Grace}}</td>\n                <td>{{Ago $ch.Last.CreatedAt}}</td>\n                <td>{{ if lt $ch.Expected 0}}{{Duration $ch.Expected}} ago{{else}}in {{Duration $ch.Expected}}{{end}}</td>\n            </tr>\n            {{template \"form_checkin\" $ch}}\n            {{end}}\n            </tbody>\n        </table>\n\n    </div>\n\n{{end}}\n</div>\n{{end}}\n{{define \"extra_scripts\"}}\n{{if USE_CDN}}\n<script src=\"https://assets.statup.io/pikaday.js\"></script>\n{{ else }}\n<script src=\"/js/pikaday.js\"></script>\n{{end}}\n{{$s := .Service}}\n<script>\n\n    var ctx = document.getElementById(\"service\").getContext('2d');\n\n    var chartdata = new Chart(ctx, {\n        type: 'line',\n        data: {\n            datasets: [{\n                label: 'Response Time (Milliseconds)',\n                data: [],\n                backgroundColor: [\n                    'rgba(47, 206, 30, 0.92)'\n                ],\n                borderColor: [\n                    'rgb(47, 171, 34)'\n                ],\n                borderWidth: 1\n            }]\n        },\n        options: {\n            legend: {\n                display: false\n            },\n            scales: {\n                yAxes: [{\n                    ticks: {\n                        beginAtZero: true\n                    },\n                    gridLines: {\n                        display: true\n                    }\n                }],\n                xAxes: [{\n                    type: 'time',\n                    distribution: 'series',\n                    time: {\n                        displayFormats: {\n                            'millisecond': 'MMM DD',\n                            'second': 'MMM DD',\n                            'minute': 'MMM DD',\n                            'hour': 'MMM DD hA',\n                            'day': 'MMM DD',\n                            'week': 'MMM DD',\n                            'month': 'MMM DD',\n                            'quarter': 'MMM DD',\n                            'year': 'MMM DD',\n                        }\n                    },\n                    gridLines: {\n                        display: true\n                    },\n                    ticks: {\n                        source: 'auto'\n                    }\n                }],\n            },\n            elements: {\n                point: {\n                    radius: 0\n                }\n            }\n        }\n    });\n\n\n    var startPick = new Pikaday({\n        field: $('#service_start')[0],\n        bound: false,\n        trigger: $(\"#start_date\"),\n        container: $(\"#start_container\")[0],\n        maxDate: new Date(),\n        onSelect: function(date) {\n            $('#service_start')[0].value = Math.round(date.getTime() / 1000);\n            this.hide();\n        }\n    });\n\n    var endPick = new Pikaday({\n        field: $('#service_end')[0],\n        bound: false,\n        trigger: $(\"#end_date\"),\n        container: $(\"#end_container\")[0],\n        maxDate: new Date(),\n        onSelect: function(date) {\n            $('#service_end')[0].value = Math.round(date.getTime() / 1000);\n            this.hide();\n        }\n    });\n\n    startPick.setDate(new Date({{.Start}}*1000));\n    endPick.setDate(new Date({{.End}}*1000));\n\n    startPick.hide()\n    endPick.hide()\n\n    $(\"#start_date\").click(function(e) {\n        startPick.show()\n    })\n\n    $(\"#end_date\").click(function(e) {\n        endPick.show()\n    })\n\n    AjaxChart(chartdata,{{$s.Id}},{{.Start}},{{.End}},\"hour\");\n\n</script>\n{{end}}\n"),
196
        }
197
        filev := &embedded.EmbeddedFile{
198
                Filename:    "services.html",
199
                FileModTime: time.Unix(1538459465, 0),
200
                Content:     string("{{define \"title\"}}Statup | Services{{end}}\n{{define \"content\"}}\n<div class=\"container col-md-7 col-sm-12 mt-md-5 bg-light\">\n{{template \"nav\"}}\n\n    <div class=\"col-12\">\n\n        <h3>Services</h3>\n\n        <table class=\"table\">\n            <thead>\n            <tr>\n                <th scope=\"col\">Name</th>\n                <th scope=\"col\" class=\"d-none d-md-table-cell\">Status</th>\n                <th scope=\"col\"></th>\n            </tr>\n            </thead>\n            <tbody class=\"sortable\">\n            {{range .}}\n            <tr id=\"{{.Id}}\">\n                <td><span class=\"drag_icon d-none d-md-inline\">&#9776;</span> {{.Name}}</td>\n                <td class=\"d-none d-md-table-cell\">{{if .Online}}<span class=\"badge badge-success\">ONLINE</span>{{else}}<span class=\"badge badge-danger\">OFFLINE</span>{{end}} </td>\n                <td class=\"text-right\">\n                    <div class=\"btn-group\">\n                        <a href=\"/service/{{.Id}}\" class=\"btn btn-primary\">View</a>\n                        <a href=\"/service/{{.Id}}/delete\" class=\"btn btn-danger confirm-btn\">Delete</a>\n                    </div>\n                </td>\n            </tr>\n            {{end}}\n            </tbody>\n        </table>\n\n        <h3>Create Service</h3>\n\n        {{template \"form_service\" NewService}}\n\n    </div>\n</div>\n{{end}}\n{{define \"extra_scripts\"}}\n{{if USE_CDN}}\n<script src=\"https://assets.statup.io/sortable.min.js\"></script>\n{{ else }}\n<script src=\"/js/sortable.min.js\"></script>\n{{end}}\n<script>\n    sortable('.sortable', {\n        forcePlaceholderSize: true,\n        hoverClass: 'sortable_drag',\n        handle: '.drag_icon'\n    });\n    sortable('.sortable')[0].addEventListener('sortupdate', function(e) {\n        var i = 0;\n        var newOrder = [];\n        var dest = e.detail.destination.items;\n        dest.forEach(function(d) {\n            i++;\n            var o = {service: parseInt(d.id), order: i}\n            newOrder.push(o);\n        });\n        $.post(\"/services/reorder\", JSON.stringify(newOrder), function(data, status){\n        });\n    });\n</script>\n{{end}}\n"),
201
        }
202
        filew := &embedded.EmbeddedFile{
203
                Filename:    "settings.html",
204
                FileModTime: time.Unix(1538459624, 0),
205
                Content:     string("{{define \"title\"}}Statup | Settings{{end}}\n{{define \"content\"}}\n<div class=\"container col-md-7 col-sm-12 mt-md-5 bg-light\">\n{{template \"nav\"}}\n    <div class=\"col-12\">\n        <div class=\"row\">\n            <div class=\"col-md-3 col-sm-12 mb-4 mb-md-0\">\n                <div class=\"nav flex-column nav-pills\" id=\"v-pills-tab\" role=\"tablist\" aria-orientation=\"vertical\">\n                    <a class=\"nav-link active\" id=\"v-pills-home-tab\" data-toggle=\"pill\" href=\"#v-pills-home\" role=\"tab\" aria-controls=\"v-pills-home\" aria-selected=\"true\">Settings</a>\n                    <a class=\"nav-link\" id=\"v-pills-style-tab\" data-toggle=\"pill\" href=\"#v-pills-style\" role=\"tab\" aria-controls=\"v-pills-style\" aria-selected=\"false\">Theme Editor</a>\n                {{ range .Notifications }}\n                    <a class=\"nav-link text-capitalize\" id=\"v-pills-{{underscore .Select.Method}}-tab\" data-toggle=\"pill\" href=\"#v-pills-{{underscore .Select.Method}}\" role=\"tab\" aria-controls=\"v-pills-{{underscore .Select.Method}}\" aria-selected=\"false\">{{.Select.Method}} <span class=\"badge badge-pill badge-secondary\"></span></a>\n                {{ end }}\n                    <a class=\"nav-link\" id=\"v-pills-browse-tab\" data-toggle=\"pill\" href=\"#v-pills-browse\" role=\"tab\" aria-controls=\"v-pills-home\" aria-selected=\"false\">Browse Plugins</a>\n                    <a class=\"nav-link d-none\" id=\"v-pills-backups-tab\" data-toggle=\"pill\" href=\"#v-pills-backups\" role=\"tab\" aria-controls=\"v-pills-backups\" aria-selected=\"false\">Backups</a>\n                {{ range .Plugins }}\n                    <a class=\"nav-link text-capitalize\" id=\"v-pills-{{underscore .Name}}-tab\" data-toggle=\"pill\" href=\"#v-pills-{{underscore .Name}}\" role=\"tab\" aria-controls=\"v-pills-profile\" aria-selected=\"false\">{{.Name}}</a>\n                {{end}}\n                </div>\n            </div>\n            <div class=\"col-md-8 col-sm-12\">\n            {{if Error}}\n                <div class=\"alert alert-danger\" role=\"alert\">{{Error}}</div>\n            {{end}}\n                <div class=\"tab-content\" id=\"v-pills-tabContent\">\n                    <div class=\"tab-pane fade show active\" id=\"v-pills-home\" role=\"tabpanel\" aria-labelledby=\"v-pills-home-tab\">\n                        <h3>Settings</h3>\n\n                        <form method=\"POST\" action=\"/settings\">\n\n                            <div class=\"form-group\">\n                                <label for=\"project\">Project Name</label>\n                                <input type=\"text\" name=\"project\" class=\"form-control\" value=\"{{ .Name }}\" id=\"project\" placeholder=\"Great Uptime\">\n                            </div>\n\n                            <div class=\"form-group\">\n                                <label for=\"description\">Project Description</label>\n                                <input type=\"text\" name=\"description\" class=\"form-control\" value=\"{{ .Description }}\" id=\"description\" placeholder=\"Great Uptime\">\n                            </div>\n\n                            <div class=\"form-group row\">\n                                <div class=\"col-8 col-sm-9\">\n                                    <label for=\"domain\">Domain</label>\n                                    <input type=\"text\" name=\"domain\" class=\"form-control\" value=\"{{ .Domain }}\" id=\"domain\">\n                                </div>\n                                <div class=\"col-4 col-sm-3 mt-sm-1 mt-0\">\n                                    <label for=\"enable_cdn\" class=\"d-inline d-sm-none\">Enable CDN</label>\n                                    <label for=\"enable_cdn\" class=\"d-none d-sm-block\">Enable CDN</label>\n                                    <span class=\"switch\">\n                                <input type=\"checkbox\" name=\"enable_cdn\" class=\"switch\" id=\"switch-normal\" {{if USE_CDN}}checked{{end}}{{if .UsingAssets}} disabled{{end}}>\n                                <label for=\"switch-normal\" class=\"mt-2 mt-sm-0\"></label>\n                              </span>\n                                </div>\n\n                            </div>\n\n                            <div class=\"form-group\">\n                                <label for=\"footer\">Custom Footer</label>\n                                <textarea rows=\"4\" name=\"footer\" class=\"form-control\" id=\"footer\">{{ .Footer }}</textarea>\n                            </div>\n\n                            <div class=\"form-group\">\n                                <label for=\"timezone\">Timezone</label><span class=\"mt-1 small float-right\">Current: {{.CurrentTime}}</span>\n                                <select class=\"form-control\" name=\"timezone\" id=\"timezone\">\n                                    <option value=\"-12.0\" {{if eq (ToString .Timezone) \"-12\"}}selected{{end}}>(GMT -12:00) Eniwetok, Kwajalein</option>\n                                    <option value=\"-11.0\" {{if eq (ToString .Timezone) \"-11\"}}selected{{end}}>(GMT -11:00) Midway Island, Samoa</option>\n                                    <option value=\"-10.0\" {{if eq (ToString .Timezone) \"-10\"}}selected{{end}}>(GMT -10:00) Hawaii</option>\n                                    <option value=\"-9.0\" {{if eq (ToString .Timezone) \"-9\"}}selected{{end}}>(GMT -9:00) Alaska</option>\n                                    <option value=\"-8.0\" {{if eq (ToString .Timezone) \"-8\"}}selected{{end}}>(GMT -8:00) Pacific Time (US &amp; Canada)</option>\n                                    <option value=\"-7.0\" {{if eq (ToString .Timezone) \"-7\"}}selected{{end}}>(GMT -7:00) Mountain Time (US &amp; Canada)</option>\n                                    <option value=\"-6.0\" {{if eq (ToString .Timezone) \"-6\"}}selected{{end}}>(GMT -6:00) Central Time (US &amp; Canada), Mexico City</option>\n                                    <option value=\"-5.0\" {{if eq (ToString .Timezone) \"-5\"}}selected{{end}}>(GMT -5:00) Eastern Time (US &amp; Canada), Bogota, Lima</option>\n                                    <option value=\"-4.0\" {{if eq (ToString .Timezone) \"-4\"}}selected{{end}}>(GMT -4:00) Atlantic Time (Canada), Caracas, La Paz</option>\n                                    <option value=\"-3.5\" {{if eq (ToString .Timezone) \"-3.5\"}}selected{{end}}>(GMT -3:30) Newfoundland</option>\n                                    <option value=\"-3.0\" {{if eq (ToString .Timezone) \"-3\"}}selected{{end}}>(GMT -3:00) Brazil, Buenos Aires, Georgetown</option>\n                                    <option value=\"-2.0\" {{if eq (ToString .Timezone) \"-2\"}}selected{{end}}>(GMT -2:00) Mid-Atlantic</option>\n                                    <option value=\"-1.0\" {{if eq (ToString .Timezone) \"-1\"}}selected{{end}}>(GMT -1:00 hour) Azores, Cape Verde Islands</option>\n                                    <option value=\"0.0\" {{if eq (ToString .Timezone) \"0\"}}selected{{end}}>(GMT) Western Europe Time, London, Lisbon, Casablanca</option>\n                                    <option value=\"1.0\" {{if eq (ToString .Timezone) \"1\"}}selected{{end}}>(GMT +1:00 hour) Brussels, Copenhagen, Madrid, Paris</option>\n                                    <option value=\"2.0\" {{if eq (ToString .Timezone) \"2\"}}selected{{end}}>(GMT +2:00) Kaliningrad, South Africa</option>\n                                    <option value=\"3.0\" {{if eq (ToString .Timezone) \"3\"}}selected{{end}}>(GMT +3:00) Baghdad, Riyadh, Moscow, St. Petersburg</option>\n                                    <option value=\"3.5\" {{if eq (ToString .Timezone) \"3.5\"}}selected{{end}}>(GMT +3:30) Tehran</option>\n                                    <option value=\"4.0\" {{if eq (ToString .Timezone) \"4\"}}selected{{end}}>(GMT +4:00) Abu Dhabi, Muscat, Baku, Tbilisi</option>\n                                    <option value=\"4.5\" {{if eq (ToString .Timezone) \"4.5\"}}selected{{end}}>(GMT +4:30) Kabul</option>\n                                    <option value=\"5.0\" {{if eq (ToString .Timezone) \"5\"}}selected{{end}}>(GMT +5:00) Ekaterinburg, Islamabad, Karachi, Tashkent</option>\n                                    <option value=\"5.5\" {{if eq (ToString .Timezone) \"5.5\"}}selected{{end}}>(GMT +5:30) Bombay, Calcutta, Madras, New Delhi</option>\n                                    <option value=\"5.75\" {{if eq (ToString .Timezone) \"5.75\"}}selected{{end}}>(GMT +5:45) Kathmandu</option>\n                                    <option value=\"6.0\" {{if eq (ToString .Timezone) \"6\"}}selected{{end}}>(GMT +6:00) Almaty, Dhaka, Colombo</option>\n                                    <option value=\"7.0\" {{if eq (ToString .Timezone) \"7\"}}selected{{end}}>(GMT +7:00) Bangkok, Hanoi, Jakarta</option>\n                                    <option value=\"8.0\" {{if eq (ToString .Timezone) \"8\"}}selected{{end}}>(GMT +8:00) Beijing, Perth, Singapore, Hong Kong</option>\n                                    <option value=\"9.0\" {{if eq (ToString .Timezone) \"9\"}}selected{{end}}>(GMT +9:00) Tokyo, Seoul, Osaka, Sapporo, Yakutsk</option>\n                                    <option value=\"9.5\" {{if eq (ToString .Timezone) \"9.5\"}}selected{{end}}>(GMT +9:30) Adelaide, Darwin</option>\n                                    <option value=\"10.0\" {{if eq (ToString .Timezone) \"10.5\"}}selected{{end}}>(GMT +10:00) Eastern Australia, Guam, Vladivostok</option>\n                                    <option value=\"11.0\" {{if eq (ToString .Timezone) \"11\"}}selected{{end}}>(GMT +11:00) Magadan, Solomon Islands, New Caledonia</option>\n                                    <option value=\"12.0\" {{if eq (ToString .Timezone) \"12\"}}selected{{end}}>(GMT +12:00) Auckland, Wellington, Fiji, Kamchatka</option>\n                                </select>\n                            </div>\n\n                            <button type=\"submit\" class=\"btn btn-primary btn-block\">Save Settings</button>\n\n                            <div class=\"form-group row mt-3\">\n                                <label for=\"api_key\" class=\"col-sm-3 col-form-label\">API Key</label>\n                                <div class=\"col-sm-9\">\n                                    <input type=\"text\" class=\"form-control select-input\" value=\"{{ .ApiKey }}\" id=\"api_key\" readonly>\n                                </div>\n                            </div>\n\n                            <div class=\"form-group row\">\n                                <label for=\"api_secret\" class=\"col-sm-3 col-form-label\">API Secret</label>\n                                <div class=\"col-sm-9\">\n                                    <input type=\"text\" class=\"form-control select-input\" value=\"{{ .ApiSecret }}\" id=\"api_secret\" readonly>\n                                    <small class=\"form-text text-muted\">You can <a href=\"/api/renew\">Regenerate API Keys</a> if you need to.</small>\n                                </div>\n                            </div>\n\n                            <div class=\"row\">\n                                <a href=\"/settings/export\" class=\"btn btn-sm btn-secondary float-right\">Export Settings</a>\n                            </div>\n\n                        </form>\n\n                    </div>\n\n                    <div class=\"tab-pane\" id=\"v-pills-style\" role=\"tabpanel\" aria-labelledby=\"v-pills-style-tab\">\n\n                    {{if not .UsingAssets }}\n                        <a href=\"/settings/build\" class=\"btn btn-primary btn-block\"{{if USE_CDN}} disabled{{end}}>Enable Local Assets</a>\n                    {{ else }}\n                        <form method=\"POST\" action=\"/settings/css\">\n                            <ul class=\"nav nav-pills mb-3\" id=\"pills-tab\" role=\"tablist\">\n                                <li class=\"nav-item col text-center\">\n                                    <a class=\"nav-link active\" id=\"pills-vars-tab\" data-toggle=\"pill\" href=\"#pills-vars\" role=\"tab\" aria-controls=\"pills-vars\" aria-selected=\"true\">Variables</a>\n                                </li>\n                                <li class=\"nav-item col text-center\">\n                                    <a class=\"nav-link\" id=\"pills-theme-tab\" data-toggle=\"pill\" href=\"#pills-theme\" role=\"tab\" aria-controls=\"pills-theme\" aria-selected=\"false\">Base Theme</a>\n                                </li>\n                                <li class=\"nav-item col text-center\">\n                                    <a class=\"nav-link\" id=\"pills-mobile-tab\" data-toggle=\"pill\" href=\"#pills-mobile\" role=\"tab\" aria-controls=\"pills-mobile\" aria-selected=\"false\">Mobile</a>\n                                </li>\n                            </ul>\n                            <div class=\"tab-content\" id=\"pills-tabContent\">\n                                <div class=\"tab-pane show active\" id=\"pills-vars\" role=\"tabpanel\" aria-labelledby=\"pills-vars-tab\">\n                                    <textarea name=\"variables\" id=\"sass_vars\">{{ .SassVars }}</textarea>\n                                </div>\n                                <div class=\"tab-pane\" id=\"pills-theme\" role=\"tabpanel\" aria-labelledby=\"pills-theme-tab\">\n                                    <textarea name=\"theme\" id=\"theme_css\">{{ .BaseSASS }}</textarea>\n                                </div>\n                                <div class=\"tab-pane\" id=\"pills-mobile\" role=\"tabpanel\" aria-labelledby=\"pills-mobile-tab\">\n                                    <textarea name=\"mobile\" id=\"mobile_css\">{{ .MobileSASS }}</textarea>\n                                </div>\n                            </div>\n                            <button type=\"submit\" class=\"btn btn-primary btn-block mt-2\">Save Style</button>\n                            <a href=\"/settings/delete_assets\" class=\"btn btn-danger btn-block confirm-btn\">Delete All Assets</a>\n                        </form>\n                    {{end}}\n                    </div>\n\n                {{ range .Notifications }}\n                {{$n := .Select}}\n                    <div class=\"tab-pane\" id=\"v-pills-{{underscore $n.Method}}\" role=\"tabpanel\" aria-labelledby=\"v-pills-{{underscore $n.Method }}-tab\">\n\n                    {{template \"form_notifier\" .}}\n\n                    {{ if $n.Logs }}\n                        Sent {{$n.SentLastHour}} in the last hour<br>\n                    {{ range $n.Logs }}\n                        <div class=\"card mt-1\">\n                            <div class=\"card-body\">\n                            {{.Message}}\n                                <p class=\"card-text\"><small class=\"text-muted\">Sent {{.Time.Ago}}</small></p>\n                            </div>\n                        </div>\n                    {{ end }}\n                    {{ end }}\n                    </div>\n                {{ end }}\n\n                    <div class=\"tab-pane fade\" id=\"v-pills-browse\" role=\"tabpanel\" aria-labelledby=\"v-pills-browse-tab\">\n                    {{ range .Repos }}\n                        <div class=\"card col-6\" style=\"width: 18rem;\">\n                            <div class=\"card-body\">\n                                <h5 class=\"card-title\">{{ .Name }}</h5>\n                                <p class=\"card-text\">{{ .Description }}</p>\n                                <a href=\"/plugins/download/{{ .Name }}\" class=\"card-link\">Add</a>\n                            </div>\n                        </div>\n                    {{ end }}\n                    </div>\n\n\n                    <div class=\"tab-pane fade\" id=\"v-pills-backups\" role=\"tabpanel\" aria-labelledby=\"v-pills-backups-tab\">\n                        <a href=\"/backups/create\" class=\"btn btn-primary btn-block\">Backup Database</a>\n                    </div>\n\n                {{ range .Plugins }}\n\n                    <div class=\"tab-pane fade\" id=\"v-pills-{{underscore .Name}}\" role=\"tabpanel\" aria-labelledby=\"v-pills-{{underscore .Name}}-tab\">\n\n                        <h4 class=\"text-capitalize\">{{ .Name }}</h4>\n                        <span class=\"text-muted\">{{ .Description }}</span>\n\n                        <div class=\"mt-1\">\n                        {{ safe .Form }}\n                        </div>\n\n                    </div>\n                {{end}}\n\n                </div>\n            </div>\n\n        </div>\n    </div>\n</div>\n{{end}}\n{{define \"extra_css\"}}\n<link rel=\"stylesheet\" href=\"https://assets.statup.io/codemirror.css\">\n<link rel=\"stylesheet\" href=\"https://assets.statup.io/codemirror-colorpicker.css\"/>\n{{end}}\n{{define \"extra_scripts\"}}\n<script src=\"https://assets.statup.io/codemirror.js\"></script>\n<script src=\"https://assets.statup.io/css.js\"></script>\n<script src=\"https://assets.statup.io/codemirror-colorpicker.min.js\"></script>\n{{end}}\n"),
206
        }
207
        filex := &embedded.EmbeddedFile{
208
                Filename:    "setup.html",
209
                FileModTime: time.Unix(1538459628, 0),
210
                Content:     string("{{define \"title\"}}Statup | Setup{{end}}\n{{define \"content\"}}\n<div class=\"container col-md-7 col-sm-12 mt-md-5 bg-light\">\n    <div class=\"col-4 offset-4 mt-2 mb-5\"><img width=\"100%\" src=\"/statup.png\"></div>\n    <div class=\"col-12\">\n    {{ if .Error }}\n        <div class=\"alert alert-danger\" role=\"alert\">\n        {{ .Error }}\n        </div>\n    {{ end }}\n        <form method=\"POST\" id=\"setup_form\" action=\"/setup\">\n            <div class=\"row\">\n                <div class=\"col-6\">\n                    <div class=\"form-group\">\n                        <label for=\"inputState\">Database Connection</label>\n                        <select id=\"database_type\" name=\"db_connection\" class=\"form-control\">\n                            <option selected value=\"postgres\">Postgres</option>\n                            <option value=\"sqlite\">Sqlite</option>\n                            <option value=\"mysql\">MySQL</option>\n                        </select>\n                    </div>\n                    <div class=\"form-group\" id=\"db_host\">\n                        <label for=\"db_host_in\">Host</label>\n                        <input type=\"text\" name=\"db_host\" id=\"db_host_in\" class=\"form-control\" value=\"{{.DbHost}}\" placeholder=\"localhost\">\n                    </div>\n                    <div class=\"form-group\" id=\"db_port\">\n                        <label for=\"db_port_in\">Database Port</label>\n                        <input type=\"text\" name=\"db_port\" id=\"db_port_in\" class=\"form-control\" value=\"{{.DbPort}}\" placeholder=\"localhost\">\n                    </div>\n                    <div class=\"form-group\" id=\"db_user\">\n                        <label for=\"db_user_in\">Username</label>\n                        <input type=\"text\" name=\"db_user\" id=\"db_user_in\" class=\"form-control\" value=\"{{.DbUser}}\" placeholder=\"root\">\n                    </div>\n                    <div class=\"form-group\" id=\"db_password\">\n                        <label for=\"db_password\">Password</label>\n                        <input type=\"password\" name=\"db_password\" class=\"form-control\" value=\"{{.DbPass}}\" id=\"db_password\" placeholder=\"password123\">\n                    </div>\n                    <div class=\"form-group\" id=\"db_database\">\n                        <label for=\"db_database\">Database</label>\n                        <input type=\"text\" name=\"db_database\" class=\"form-control\" value=\"{{.DbData}}\" id=\"db_database\" placeholder=\"Database name\">\n                    </div>\n\n                </div>\n\n                <div class=\"col-6\">\n\n                    <div class=\"form-group\">\n                        <label for=\"project\">Project Name</label>\n                        <input type=\"text\" name=\"project\" class=\"form-control\" value=\"{{.Project}}\" id=\"project\" placeholder=\"Great Uptime\" required>\n                    </div>\n\n                    <div class=\"form-group\">\n                        <label for=\"description\">Project Description</label>\n                        <input type=\"text\" name=\"description\" class=\"form-control\" value=\"{{.Description}}\" id=\"description\" placeholder=\"Great Uptime\">\n                    </div>\n\n                    <div class=\"form-group\">\n                        <label for=\"domain_input\">Domain URL</label>\n                        <input type=\"text\" name=\"domain\" class=\"form-control\" value=\"{{.Domain}}\" id=\"domain_input\" required>\n                    </div>\n\n                    <div class=\"form-group\">\n                        <label for=\"username\">Admin Username</label>\n                        <input type=\"text\" name=\"username\" class=\"form-control\" value=\"{{.Username}}\" id=\"username\" value=\"admin\" placeholder=\"admin\" required>\n                    </div>\n\n                    <div class=\"form-group\">\n                        <label for=\"email\">Admin Email Address</label>\n                        <input type=\"email\" name=\"email\" class=\"form-control\" value=\"{{.Email}}\" id=\"email\" placeholder=\"info@admin.com\" required>\n                    </div>\n\n                    <div class=\"form-group\">\n                        <label for=\"password\">Admin Password</label>\n                        <input type=\"password\" name=\"password\" class=\"form-control\" value=\"{{.Password}}\" id=\"password\" placeholder=\"password\" required>\n                    </div>\n\n                    <div class=\"form-group\">\n              <span class=\"switch\">\n                <input type=\"checkbox\" name=\"sample_data\" class=\"switch\" id=\"switch-normal\" checked>\n                <label for=\"switch-normal\">Load Sample Data</label>\n              </span>\n                    </div>\n\n                </div>\n                <button id=\"setup_button\" type=\"submit\" class=\"btn btn-primary btn-block disable_click\">Save Settings</button>\n            </div>\n        </form>\n    </div>\n</div>\n{{end}}\n{{define \"extra_scripts\"}}\n<script src=\"/js/setup.js\"></script>\n{{end}}\n"),
211
        }
212
        filey := &embedded.EmbeddedFile{
213
                Filename:    "statup.png",
214
                FileModTime: time.Unix(1533786305, 0),
215
                Content:     string("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x01\x90\x00\x00\x00|\b\x06\x00\x00\x00GN\xe6\x81\x00\x00\x01\x83iCCPsRGB IEC61966-2.1\x00\x00(\x91u\x91\xcf+\xc3a\x1c\xc7_\xdb\xc80MqppX\x1a\x17\x9bfjqQ&\xa1\xa45S\x86\xcb\xf6\xb5\x1fj?\xbe}\xbf\x93\xe4\xaa\\\x15%.~\x1d\xf8\v\xb8*g\xa5\x88\x94\x1c\x9c\x9c\x89\v\xeb\xeb\xf3\xb5Ֆ\xec\xf3\xf4y>\xaf\xe7\xfd<\x9fO\xcf\xf3y\xc0\x1a\xc9(Y\xbd\xce\a\xd9\\A\v\x8f\a]s\xd1yW\xc3\vv\x1a\xb1ы3\xa6\xe8\xeaH(4EM\xfb\xbc\xc7b\xc6[\xafY\xab\xf6\xb9\u007f\xady)\xa1+`\xb1\v\x0f+\xaaV\x10\x9e\x10\x9eZ-\xa8&\xef\b\xb7+\xe9ؒ\xf0\x99\xb0G\x93\v\nߙz\xbcį&\xa7J\xfcm\xb2\x16\t\x8f\x82\xb5Uؕ\xaa\xe2x\x15+i-+,/ǝͬ(\xe5\xfb\x98/q$r\xb33\x12\xbb\xc4;\xd1\t3N\x10\x17\x93\x8c1J\x80~\x86d\x0e\xe0\xc5O\x9f\xac\xa8\x91\xef\xfb͟&/\xb9\x8a\xcc*kh,\x93\"M\x01\x8f\xa8+R=!1)zBF\x865\xb3\xff\u007f\xfb\xaa'\a\xfc\xa5\xea\x8e \xd4?\x1b\xc6{74lCq\xcb0\xbe\x8e\f\xa3x\f\xb6'\xb8\xccU\xf2\xf3\x870\xf8!\xfaVEs\x1f\x80s\x03ί*Z|\x17.6\xa1\xe3Q\x8di\xb1_\xc9&nM&\xe1\xed\x14Z\xa2\xd0v\x03M\v\xa5\x9e\x95\xf79y\x80Ⱥ|\xd55\xec\xedC\x8f\x9cw.\xfe\x00\x1a\x80g\xc3\x17\xe1\xe9w\x00\x00\x00\tpHYs\x00\x00=\x84\x00\x00=\x84\x01լ\xaft\x00\x00 \x00IDATx\x9c\xec\xbdy\x98$Gu/\xfa\x8b\x88\xcc\xea\x9eю\x05H,\x12\b\x8cY\xb4\x8c4\x82ь\x84a$\xb8\x86\x87\xd9\xeck\x8c\xedk??\xaf`\xf9^\x1b\x84\x04\bc\xbc\x00bF#\xd9\xc6\x12\x8b\xfd\x8cͽ6B\xba\xc6\x17\x03\xc6\xd8\x06I\xc3&\x01\x96f\x1f6\vI#\t\x8df\xba\xa7\xf7\xae\xaǎ8\uf3ec\x93\xf5\xcb\xe8\xea\x99\xea\xeej\xeb\xcd\xf7\xd5\xf9\xbe\xfe\xba\xbb\x96\xcc\x13'N\x9c\xe5wND\x02C\x1aҐ\x864\xa4!\riHC\x1aҐ\x864\xa4!\riHC\x1aҐ\x864\xa4!\riHC\x1aҐ\x864\xa4!\riHC\x1aҐ\x864\xa4\xe5\x93y\xbc\x198\x1e\xe85\xfb~\xf6CƘ\xd7\xe9\xff\"\x82\x10\x02\x8c1\xb0\xd6BD\x00\x00\xd6Zx\xef\xe1\x9cCQ\x14\xb0\xd6\"I\x12\x84\x10 \"0\xc6T\u007f;\xe7\xb2O?\xef\x96g<^c\x1a\xd2\xd2\xe8\xaa\x03\xd7\xfe\xa8\x88l\xef\xcc\x1d\x00\xd4\xe6\xd3Z\vkm5\xef\xde\xfb\xea\xb7\xea\x00\x80\xea\xbb!\x04ա\xf7\xddx\xf6u7?n\x03\x1bҐV@\xc9\xe3\xcd\xc0\xf1@ιS\xbd\xf7g\xaa\xe3h4\x1a0\xc6\xc0{\x0fcL\xe5\x1cԸ\xa8A1\xa6\xeb\x9fE\x04\"\x82$IP\x14\x05D${\x1c\x874\xa4\xa5S\x12B8\x93\x9d\x06\xcf=P:\x05\x9d\u007f\x0e.TO\xa2\x00\x02\xd6Z\xe4y~\xc2\xe3<\xae!\ri\xd9d\x1fo\x06\x8e\a*\x8a\xa22\b\x9a]\x88H\xe5H\xf4G3\x11\xfdl\xc7@\x00@͡8窈tH\xc7\ay\xef\x01\x00IR\xc6\\:\xe7\x00\xaay\xd7\xcfāD\x92$\x95ð\xb6\\r!\x04\xe4y^]oHC:\x1ei\xa8\xbd}\x90\x88\xfc\x98F\x93j4\x8c1\xc8\xf3\xbc\x8a*\xd90(\x94\xa1\x86C\xe1\x8c\x10B\x15\x8db(\xfb㊒\x89\xe4\xc9\xe1GB\xe5,8X\x88\x03\x03\xce:4+\x01P\xe9\x80~7I\x12\xf8\xa6\u007f\xfe\xe30\x9c!\ri 44b}\xd0\xdc\xec\xec\x8f$I\x02Ai$\x9csH\x92\xa42\x1c\x9c]\xa8\xf1P\xc7a\x8c\xa9\xfeN\xd3\x14y\x9e\xab\xa1\x19f\u007f\xc7\x11\xd9Y{BvJ\x86$I\xaa\fC\xeb\x18\xaa\v\x1a4\x88H-ke\x87\xa2\xce\x04(\xf5\x06s\xf2\xc4\xc7qXC\x1aҊh\xe8@\xfa\xa0v\xbb\x8d\xf9\xf9y8\xe7*\xa8\x8a!,\xeb\x1c\x1ai\x8a$M+\x98K\xb3\x0e\xfd\xac\x1a\x11\xa0[@\x1d\xd2\xf1C>\x94\x01\x80f\x97q\x93\x04\x80\xea=\xfd[\xe7\xdd\x18S\x05\x0f\xda|\x11B(\x9d\xcc\xe39\xa8!\ri\x854t }\x90\x16\xbf\xf5oŶ\xb3,\xab \x8c\xe6\xfc|\xe5 FFF\x90$\t\xacsH\x9c\x83\xeb@YZ\x84WhkH\xc7\x17i\x10\xa0p\xa5\xbe\x06\xa0\x06m*T\xa5\r\x13\x00jP\x16\xd0u0\x90\xff\xc4\x01\fiH\x03\xa6\xa1\x03Y\"\xa9q\x00\xea\xc6B\xdfS(\xc3{\xdf\x13\xea\xb0\xd6\"IS$C\ar\\\x911\x06\x82n\xfdC\xb3L\x00\v\x1c\x05\xb7\xeer&\xa2\xef+\f*\"(\x90?>\x03\x1aҐ\x06@C\a\xd2\a\xc5\x06@\xfb\xfb\xb5\x95\x97\xb3\v\xcdV\x14\xaa\xe0V_\xed\xba)\x8ab\ba\x1dgd`\xaa \x00(;\xf3\x14\x96Ү<\xaeq\xa8\x13Q\xbdQb\xe7!\"pf\x18H\f\xe9\xf8\xa5a!\xb7\x0fR\x87\xa1\x06\x847\x8e)\xe9\xfb\xfa\x9a\x1a\x14Żոp\xf7\u0590\x8e\x1f\x1a\x97#h\x86\x16rߝ;\x9dW\x00\xd5\xdcrV\xa2\u007fk\xa6\xaa\xdf\xe1v\xdf!\r\xe9x\xa6a\x06\xd2'\xa5iZ-~\x8e.\x15\xa2`H\x83\xdbv\xf5s\\|\x8f\x9dϐ\xfe\xffO\x87\xe40\\\xbbӎ\v\x8b\x11\xdb@jR\xacIGѰ#\x18A\xa3\xca.\x14\xb2T\xa7\xa2\x1dY\xdc\xf2\x9b\xe79\x1a\x8d\x06\n\x19BXC:~i\xe8@\xfa$\ue80ak\x1f\x9ay\x84\x10*GÝ6\xfa\xbef2\x00*\xcc|H\xc7\a%6\xa9\x0e\xfe\t\x120\xef\x9bp.\xc3Ts\xba\xac}\xc1 \xb5)Fl\x03\t\x12\xa4&\xc1\t#' A\xb2\xe0T\x02\xd5\r\xef=\x02\x86P搎_\x1a:\x90>I3\x8d4MὯ\xa2J\xdeX\xc6\xd1'CV\xba{\x1d\xe8\xc2\x19C\xf8\xe2\xf8\xa2 \x01\b\xf5F\t\x0e$\xac\xb5\xc8B\x86V\xd1꾖[H\x10\x8c\xba\x11\x8c&k\x90\"A\x82\x04k\x1bk鴂\xf4\xf1\x1eڐ\x86\xb4l\x1a:\x90>H\x8b\xe3i\x9a\xd6\x1c\x06\x1b\x13\x00\v:o\xb8\xc0\xaeQ\xa7b\xe3C\ar|Q\x90\x00#\xdd#k4(\xe0ڇ\xea\x03\xeb\x00\fЖ\f\xcdv\xab\xcaB\xc3\\@b\x124L\x8a\x864\x1e\xef\xa1\riH˦\xa1\x03\xe9\x83b\x87\xa0\x99FQ\x14h4\x1a\xb5\x13w\xb9\x88\xae\u007f3|\xa1\x1bІ5\x90\xe3\x93t\x9e\xb9\xee\xa5u.\xee\xd6\xe3\xf3\xb14\v\xd5\x1d\xea\"\x82`\x02\n[`\x16s\x8f\xe7p\x864\xa4\x15\xd1Њ\xf5Aj\x04ԑp\x1dDk\x1cj<\xf8o>\xad\x95\x1d\f\x1b\x9a!\x1d\x1f$\xe8\x1d\x1c\xf0\x916\x9cyhV\x1a\x9f\xdc\xcc\xd0\xe60\x13\x1d\xd2\xf1N\xff\xe9\x19ȋ\xbf\xf2\xf2\x91\x10\xc2\x05Ƙ\x17\x8a\xc8\x19\"r\x1a\x80\xd3\x00\x9c\xea\xbd?\xcd9w\x92\x88\x8c\x8bȣ\xd6\xdaGC\b\x8f:\xe7~\b\xe0Q\x11yTD\x1e5\xc6L}\xfd\xa5\xb7\xff\xa7\xad<\xed\xedg\xe7\xc1\xce@?\xc3\xceCq\xf0\xf8\xb0\xc5\xe3\xd9y\\r\xfbKM\x92$'\x15Eq\xa61\xe6Lk\xed\x99\xde\xfb3\x00xc\xccc\x00\x1eK\x92\xe41\xe7\xdc\xc1$M'\xbf\xf8\xc2\xcf\x1e\x9f\x03\xedA\xba_\x83aHv\x1c\x9a\x85\xd4\xe0+\xa0\xb6G\x84\x03\v\xa0\xb3)uXD\x1f\xd2Q\xe8-\x0f\xbcc$M\xd33\x8a\xa28\xc3Z{f\b\xe1\f\x00'Zk\x1f\x03\xf0\xc3\xceϣ!\x84\xa9\x1bϾ\xee?}\xbd\xad\xba\x03y\xd1\xe7_|\xa2I쫌3\x1b\xad\xb3\x1bB\b\x17y\xef\x1b\\/\x887]q\xa4\xaf\xbfy\xf3\x951\xa6y\xe9\xf6+\x0e\x00\xf87c\xccg\xf2<\xdf\xfe\x8d+\xb6\xaf\xda\xf35\xd8(\xf0\xa9\xbc\xf1\x06C\xc6\xc6\xe3\xd3{\xe3\xd3[\x8f\a'r\xe9\xf6+,\x80M\"\xf2\xd3\x00^\x01\xe0,\xef\xfdZ}_\xe7%.(\x03@\xbbݞ\xdax\xc7\xe6/\x18c>k\x8c\xf9篽\xe4KG\x1e\x9fQ\f\x86\x82\x04X\xb1\xb5\xac3M\xcb\x02\xb8\xea(\x80\x05\xcf\b\x01\xea\xc1\x05?K$\xee\xce\x1aҐ\xae:p\xad\x13\x91\x17\x03\xf8i\x00\xaf\x01p\x16\x9fr\xa0\xfa\xc5[\x05:\x01n\xf3\xea\x87\u007f\xef!\x11\xf9\x17c\xcc߇\x10\xbev\xc3Y\xef\xf7\xab\xcd\xef\xaai\xef\xba[6\\h\x8c\xf9\x8d\x10\xc2/\x008\xc9Z[\x9ef\x9bZ\x88\x11\xd8\xc4\xc1&\x06\xc6Y\xd8\xd4º\xae#ᣰ\x81n\xe7\vG\xf7@w\xb3^\ba\x06\xc0\x17\x92$\xf9l\b\xe1\xf3_{ɗƗ\xca\xef\xc6;6\xbf\xd3\x18\xf3T~\x96\x03\xdd\xff\x97\xbc\xf7'\x01\xa8\x15O9\xb3\xe0\x16\xdd$I\x90eY\xf5\f\x888*\xa5M\x897\xb3c\xe1\xf3\x93\xe2'\x1d\x02@\b\xe1\xe6\xbb6\xdf\xf1\xed\xe5\xcc\xc7\x12\xe4\x90\x18c^\xe2\xbd\xff\xe9F\xa3\xf1\xfa\x10\xc2\x19*g>\a\xaa\xd7ò8\x12\x8f\x8e\xee\b\xd6گy\xefo\x01\xf0Wwm\xbe\xa3\xa7\xb3\u007f\xf9\xb7^}j\x92\xa6\xefՆ\x05v\xb6*S\x85\x8c\xf8@J6\xda\xce9\xe4y^u\xcbu\xf8\xfe\xd6\xe7\xce\xfb\xdf\x1f?\xd6\xd8_\xb3\xefg/4\xc6\xfc*\x80Z\x06)\"\xf0E\xf1\f\x01^\xa5\x87e\xea\xd8\xe2L4\xe6\x87;\xf2\xb8C\x8f\x8ev\u007f0I\x92\xcfq\r%\xbe\x16\xcb\xdc{\xff\x83ϼ\xe0\xd6\x1b\x17\x1bë\xf7\xbe\xe14\x11\xf9\xe3Z\xf3\x86\x0f\x18IF\xb0&\x19E\x82\xa4\xb3w\xa5\x01\x87\xee\xaey\x1dW\xaf\xa0\xads\xdf/\xfc\xe93\xb7|\xeeX2\\*\xbd\xed\xa1w\xfd\xa4\x88\xbc\x82\x1f\x83\xd0h4j\xf2\x8b[\xe6\xb5\xf6č-\xac\x9b\x9d\xef\xbe\xfb\x86\xb3\xde?\xb1\f~\x9e\x0e\xe0\xed\xbc\x11\xb8ױD<'|\xce\x19\xf3\xc7\xf3o\x8c\xf9\xfb\x1b\xcez\xff\x9d\x8b\xdd\xf7\xaa\x03\xd7^\x1aB\xf8ec\xcckE\xe4\x89z/\x9d\u007f\xd6i]\x0f\x00\xaa\xff{<n␈\xfc\x1f\x11\xf9\x14\x80;o<\xfb\xbaU\xd9p4\xd0\f\xe4\xfc\xbf{\xa1\xb1\xd6\xfe\xbcs\xeew\x8b\xa2\xb8\x98\x8d\xa3\x0e\xaehw\x1e\xf9\x99\x15P\xf7(\"0\xd6\xc0:\x8b\xdce0\xce\"i8\x04\blb\xe1RW\xedގ\x1f\x17\xda9!\xf5\xa4\xa2(~&˲\x9f\xb1ֆ˾\xfc\xb2\xafz\xef?+\"\x9f\xb9\xfb\xf2;\xbf\xd7'\xfbo4Ɯ\xaf]U\xec\xdd\xe33\x8d\xb8xʝV:V\xfd>\x1bY\x86<\xe8T\xdf+\xe3hU\x9d\x90^+\x8ah?\x03`U\x1c\xc8e_~\x99\r!\xfc\x82\x88\\\a\xe0\xa9\xec\x10u\x11\xa5iZ9F]б\xa2\xf3i\xb4@\xf5\x00&[\x14ŋ\x01\xbc\xd8Z\xfb֍wl~\a\x80\u007f\xb8k\xf3\x1d\xb54l~~~-\x80+yߌ\xe9\x9cd\x9bt\x1c\n\x9f\x88\xcc\xd9\x1do\xd2\xe3\xf6\xe9,\xcb\x00\xe0o\x01\x1cӁ\x88ȳ\xac\xb5W\xeai\x01z\u007fc\f\x92N\xb6\xc1N@\xef\xa5G\xf4s\xa0\xa3r\x8b\xa1K\x86\xaf:\x06\xe6l\xef\xfd\x95\xcas\xecd\xf4\xbb\xb41\xf1k\x00\x16u I\x92\x9cX\x14ŕ|?\x978\xe4\x92Wss$\xef<\x8f\xc4:\xa4&Ej\x1ah\x98\x14k\xd25\x18MF ^ju\x9a\xce؎\x00\x18\xb8\x03\t!l0\xc6\\\xa9\x81\x197\xa4\xa8\x9c8p\x8ce\xbbXSJ\b\xe1\x03\x00\x96\xec@D\xe4\x89y\x9e_\x19\xef\xe7\x8aϼ\x03P\xdbL\x1cw\xe1\xe9\xba \xe4\xe4\xbb\x00\xee\x8c\xefwՁk\x9f$\"۬\xb5\xbf\xa8\xaf\xc5M\x19\xba\x06\xd8Yęl|\xc8g\b\xe1I\x00~\xd3\x18\xf3\x9b\xde\xfb\x83W?\xfc{\xef\x12\x91\x8fo{\xfa\xfb\x06\x9a\x95\f́\xac\xbfmӳC\b\x1f5\xc6\\\x0et\x9dF\xbc0\x948z\x04\x00\b\xe0s\x0f\xeb-\U000a2342&\xa3\xed,`\x00\xd7p\x10\x03$\x8d\x04H\x05\xd6ؚ\x92w&\xda\xe6y\xfe\xe3\xd6\xda\x1fw\xce\xfdѦ;/?\xfb\xeb/\xbd\xfd\xf0\xb1\xf8W\xc3\xcfg\x15\xf1\x02\xe6\xdf\x00j\x8a\x1e;J&\x8e^\xf4\x1al\x10XI\x81\xfaa\x8d\xfa}\x8e\x86W\x83.\xdd~\xc5\x06\xef\xfd\x9f\x19c60\xb4\xc8{]4\xcaS\x83\xaa<\xb2\x93\xe1(\x8d\x1dk\xa4\xf4\xcf\x0e!\xfc}\x92$_\xbf\xec\xcb/\xbb\xea\xab?\xfeŻ\x95\x0f\x96\x1d\xcb\xc9{\x0f\x9beh\xb7\xdbUf\xa2\x11s\xa3\xd1\x00\x8cA#Ma\xe8\x18\xfd^O\x82<\x16q@\xc0\xed\xd6\xec\xfc\xf5s\\\xe3P^\xf4o5\x8414\xcb:\xc0\x0e*v.\xea\xfcT\xbe\x9c\xb1\xf43\x16\x8e\x8e\xf5\xfaz\x0e\x1b\xeb].\x82\xc2x4\xd1*\xf9\xca:|\xc2am\xba\x06#n\x04)\x12\x8c\x98\x11$f\xf5\xd0n\xd57]{\xbc\xc9V\u05f7\x8e\x8b#m\x96\v\x1bU\x96\xc1r\xa8\xd1hTs\xa7\xd7b\x9d\xd6y\xe09\xe4\xac(\xce^{\xf1\xf3\x96\a\xdea\xad\xb5\xbf\xe6\x9c\xdbR\x14ũ\xbc\xe6ئ0\"\xa1\xa4\xd7繌\xb3V\xb5g\x9d\x03\\\xcf\b!\xfc\x951淯:p\xed[n8\xeb\xfdۗ-\x9c\x88V\xac\x15\xebnِ\x1ac\xde\x1aB\xf8\x03\xe7ܨ\nZ\x15\x9d'\x9f\x85\xcf\xca͆\x9a\x0f)LӴ\x9b\x1a\xfa\x00\xdf*\xaf՜ͺ\x11\x9a\x01`\r\x92\xd4\xc1$\x16\x05\n4FS\x04/\xf0\xe2\xff\xfc\xee\xcb\xef<\xa6\xf3\xe8\xf0y\x12G]\xf1B娗\x8dk\x1c\x19\xc4Q\xa3\x8e=\xce^⬅\xe5\xc0\xd1t䐞\xb0\x94\xb99\x16]r\xfbK\x9f✻\xce{\xffKl\xf8\xd9\xc11?l4\xe3\b\x95ǯ\xaf\xf1\xd8\xe2\xa8]D6\x85\x10\xee\xbat\xfb\x15\xef,\x8ab\xcb7\xae\xd8.\"\xb2\x86#>\x951\x00dYV3\x12*\xc7N\x86Q\x9b'\x97$H\x9c\xab\x9e\xd3⒤\xaf\x876\x15Eq\xba\xf2\xaf5\x0e\xe6[\xefφCOX\xd6,\x84!P\x86?\xd4\x18\xf1w\x81\xfa\x13,\xd9\xc1\xa8#d\xdd\x01\x00\xef\xfd\xa9G\x1bC\ba-\xf3\xaa\x86.\x1e\vߋ\xb3M\x00\xf0\xf0\x98\xcef`\xed\\\xf5\xd9\"/\x9e\u070f\f\x97J\x12\u0093\x04]|_\r\xa8\xcaPu\xa9(\n\xe4y^\x83*u\x9d\xaa\x91\xe5CLMn\xd6,\x8f!\x9c\xac\xc0>w\xc9Yk+\xb8\x8c!I\x9d\x1f\x9d\xff\xc5\x1an:\x19\x01\x00\xe0w\xef\u007f\xfb\xe9Ƙ\u007f\f!l\xe2\xb5\x1e;\x1d^C\x1c\xa8\xa8L\xd8np\xe0\xa9<\xaan\x12\xfcw\xa1\x88\xdcyՁk?彿\xe6O\x9f\xb9\xe5\a˒\x11ъ\xdax\xd7ݲ\xe1\x04\x11\xf9\x17\x11\xf9\x801f\x94#\a\x1e\x98\xa6\xf7*\x98\x18\x12b\x83\xa5\xdf\xe1\xf7c\xd8@\x1d\x8b\xb5\xe5N_)\x02\xdasm\xe4\xb3\x19\xfcl\x81\xe6X\x13s\ag\xe7\xe6\x0f\xce\xdd\xd0\xefX\x9csg*\xdfqڪ\x8b_\xf9P\xc3\x16\xd7A\x98_}\x8d\x15\n@\xedh\x13&UN\xbd6;^\xfd\xed\xbd\u007f\xe6\x92&\xe8(t\xe9\xf6+^f\x8c\xf9\xb6\x88\xfc\x12G\xf5\f\x9fċ 6>\x1c\xe9ğ\xd7\xf7Y\xa9y\xfe\x81*\x8b\xbb\xceZ\xfb\x91\r_zI\"\x82\x935p\x88\x83\f\x86\vظ\xe8\xb5\xf5\x9aY\x96!\xcf24\x9bM\xcc\xcd\xce\xe2ȑ#8\xf4\xd8c\xcf\xe9K(3x\xb6\x1aw5\xaal\xfc\x95\x8e\x96MƵ\x04\xd6e\x00\xb5\xbf9\x9bS\xe3\xa7\u007f\xeb\xbc\xf7\x88d\x9f~\xb4!\x98\xc7̩U\xd6ֹ\xd7b\xcf]\xd79U\xa3\xcdđ\xbd\xf7\x1e\xe2\xe5y}\xc9p\x89df\xec\xf3u-\x03u\x990\x1fI\x92T\x0f\xf4\x8a\x8d(;\xe1ꨠ\xfb\x8b\xa3:\xda\xc5\xc8\xdf_<\x05@\xd5 \xa1\xcf\xeea\xdd\xd6\a\x8a\x01\xdd.;\xe5_y\x88\xb3E;n\x9f\v\x00o{\xe8]\xa7;\xe7\xbe\xe4\x9c\xdb\xc4\xc1\x15\xaf\x0f\xbe\x9f^Gu\"FC4@\xe0\xb5\xc0\xd7d9Қ\xfaik\xed\xfe\xab\x0e\\\xfbsˑ\x11Ӳ\x1d\xc8\xfa\xdb6\x9d`\xad\xfd\xac\xb5vs< ]\x80* \x15h/\xac\\'\n\xe8\x1aW6`l4\xf4>z\x94\bg3\xbc\xe0;\x8b\xf6\x04\xd9U\xec:\xef\xed\x17\xf6\x15}f\xb3\x19|\xdb\xc3\xe7\xdd\xe8\x93k-\xb13\xe4\xa8M\xef\xa9\xca̐]\x8cѦiZ\xdb\xd1\xceO\xb9\xd3\xcf\xe88\xb8\x96°\xd6Jiӝ\x97\xff\xb7\x10\xc2?\x1bcN\x0e! ˲ZQ\x12\xe8B\x8b\xbaX\x81n\xbb*\xcf+G\x83*\v\x9d\x13\xae\v\xb0NT\x10J\xa7\xae\xe5\x9c\xfb\x8d\xb2\x01\u009f\xc8Ή\xe1\n\xfdn\xbc\x9f\"vP\xf1\"\xeb\x05+.FM4\xd1j\xb5j\x90#G\xba<\x8e8\xc8QC\xad\xf3\xceQ!\xcf+\xcb6v\xd0lH\xf5s\f\xa3\xf43\x96\"t\x9d\xb9\xae\x11>\xccQ\xe7Q\xc7\xc1\xb5E%\xd5\xedŲ\xf1AS\xac\xdfq\xb0\t\xa0f\x94UO\xf5o\x96?G\xdc\xcb!g]Mf\f)\xe9\xcf\xc8\xc8H5\x1f\xbc^\xe2Z\t;\x06\x81\xe0\xad\x0f\xbe\xf3GD\xe4\x8b\x00\xce\u05cc\x93u6\xce^\x01\xd4\xe4\xc0\xf6Ee\x12\aW*?\xcd\xdaX\x16\x91]\x1e1\xc6|\xe2m\x0f\xbd\xeb\x9dW\x1d\xb8v\xd9\x13\xbc,\b뼿\xbd\xf8\x84\x10\xc2g\x8d1\x9b5\xfa\xd2\x01\xa8\xd1\xe3\bA\x05\xa0\x03el\x99\r\x86\xfeVAŞ\x9fa\x156(zo]\xc0E\x91\xc3}'\x81\x97l\xfbޭ;\xfb\x82\xb0\u009cG\xee\xb3\xee\x8e\xe1$\x87\x18\x81q\x06&\xb1\x90F\xa9\x04\x1e\xddT\x9f3\x0f\xfd\xcdΌ\xa3r%6\xb4lP8\x1d\xd5\x05\xa2\x8b\x86\xa3\xb3\x95\xd0\xc6;6\x1bc\xccۍ1ױ\xfc\xd9\xe8\xb3A\xe6q\xe8\xfcőN\f\x85p\xf6\xa4\xf0\x12\x1bc~\x8a#GK\xde\xfbW\x18c\x9e\xa7\x86\x8f\xf9b\xfeب\xe9\xfd\x99g\xa0\v\xb1\xa9\xbe-\x16\x81\xc74ۜ\x85mw\xe7/m4`\x00\xa4\x8d\xf2\xa4]6\x16\xb1\xb3b\xd9\xf1\xd8j\xddPqTj\xed\x02Ǡ\xbf\x19o\uf571.F\x06\xf5\xac\r\xe8\x1a2\x9e\v\x95a\xa3ѨA\x85:\xa6\x18\x8e]-\xd2:&;[\xe5=\xae\xaf\xe98\x92$Y\x00gq\xf3\x861\x06\xde,\xafV\x1c$\xc0\xc0֮\xcd\x0e\x17@m=\xb3l9ˌk\"\xb2&\x9c \x82/Zk/\xe0\x82;_\x9f\xafݫ\x99 \xceF\xf5\xf3\xecP\xb8\x19\x81\x1f\xb7\x1c##\x14$\xbc_D\x9euՁk\xdf|\xc3Y\xef_r\xa7֒\x1dȺ[6\x18\x00\u007f\x1bB\xd8ܫ@\xce\x1e\x98q\xd58Em4\x1a\v\xa2G^xz]\x1d8\x178\xb9Xɓ\xd05&\x06\u0379\xd9`\x8cyO\xbf\xe3\xf2\xde\xd7`#\xf1ݮ1\x00(L^\t=i$\x10\x03\xa4#\t\x8c\xb3\x80\x03\x04\x01I#\x05L\xd7Y2\xae\xad8tlh\xf8iv1\xcc\xc1\x11\xcdJ\x17\xf1e_~\x99\xf3\xde\xff\xb91\xe6\xcdzo\x1dw\x1c\x812\x0f\xfa\x9b\x8b\x8a1\xac\xa4\x9fS~\x19\x96\xe1\xebq$\xcc\xc1\x80R\x9a\xa6g\xab.1\x04\xa4\xf2c\xbeu.\xb8P\xcd\x19\x02;\xc8~#\xd2r\xd1w\xe7\"t\f\x80:=\x00\xb0\x1d\x9e\xd3$\x01\x8cA\x9a$H\x1b\x8dZ۰\xf2\xa7\xe3\xe0\f\x96\x03%6<\fY0\x84\xc5\xdf\xe1\xc8t1\xb2\xa6kh4\x82\xe6f\x868\x10\xd0\xf7\xf5\x01Y\xec\xb08\xf8Y\xad\"\xfa\xf7\xe5>4f\x1b\x18u#h\xd8\x06F\xd0@\xc36`Q\xdf\xf5ρ\x04\xeb%C\xc5l\x87\x96\xbb^\x12\x9b@,j\x01\xa0^OeV\xd5e\xa3\x80\x80\xf5\x9d\x83\x1c\xef=\x92\x93\x92\x9f\x00`c;\xc9\xc11;l\xce.\xb4\xf3\x91\x83(\x9eWv,\xcc7\axlsz\xac\x87_\xf5ޟuՁk\u007f憳\xde?\xb5$y-\xe5\xc3\x1dz\xad\xb5\xf6u\xbc0\xa8կbV\xb1l6\x06\xb1\xc04\xda\xe4E\xc7\xc50\x16v\f\x17\xc5\vK\x17\xbas\x16v\x9f\x83s\xee\xe3{\xb7\xee\xfc\xeeR\x06\xc6\xfc\xb2\xe1\xe1\xc5d\x8cA\x91\x95<\xb7\xb3zWF;\xb4\xe1RW\xeemI\flb\x91\xa1@\xd2H\x90&i\x8dw\x1d\xb7\x16\xdf\xd4\x10\xb2Q\x8c\xeb'쐗J!\x84\xad!\x847\xeb\xffzOv\x1c\xecLx\xaf\x8b\xce-/\x8a8\xa2\xe6T;vF\xfc\x1a\a\x00|\x1d\x86\xc1\x18\xf6\x02\xba]I,#}]\xa4\xdb\xd1\xc4\xd9@\xac\x1b\xfdP\xb9\a!\xad`\x1d\x8e\xda+\x03\xacM\x06\x1dY\xb4;\x90W9\x0e\xc1\xe8\xe8\b\xd2F\xa3ʈ\xe3\xfa\x1f\x1b:\xe6Q\r\x8a\xea \xcf\a;\xec\xb8i`\xc1<K\xa8\xb2\x90\xd8\x11\xa8>iC\x02\a\x0e*W\x96=g\x9f\x85\xac\xce\xe3\a\f\frɑ\xe5Y\xcd!\x88\x0f\x18q\xa3\xa5c)\x1a\x18q\r\x8c\xb8\x11\xf0\xc6}6\x86\xdc\xed\x16BX\xf6\x93\x1e}\xf00R\x87Kk|\x91#\xe1\xa0X\xd7\f\xf3\xa5sٙ\x03\v,\xdcT\xaa\xf3\xc2\xceA\xaf\xad\b\x04\aZ\xac\xcbl\x93b\x1b\xaa|\x18c\xaa\xeeE\xfd\x0e\a[@e\xf7^\x0e\xe0\xd3oy\xe0\x1d/\xff\x93g|\xa0\xef\xc9^\x92\x03\xb9\U000135dc\b\xe0\x83\x1c\x1drD\xc9\x11\xa8\xe2\xab\\3\x88\x05\xcc\xc50\xc6\xe05\xe2\xe3(\x83\x8d\x1d;%ƈK\x81\n|\xd6̍1\u007f\xb4\x94\xb1iZ\x1c\x17Hyc#+\x13\xf3S\x831\x8a\x00\xe3\x05E\xab\x9b=\xb4C\xe7$\xd6\xc4\xc2&\x0ebBg\u007fKRf/\xa6wʮ\x13\xad\xbc\xf5\v\xc5\xc4t\xe9\xf6+^\x1bBxk\f\x0f\xe8\xb5\xd5(\xb1\x93\x88q\xd58\x95g\xc3\xcc\xce$\x8e\xdat\x9e\xab\a(-\xb2dž#`\xcef\x18fS\b\x8c\xe7\x8a#9\xee$c\x9d\x8b3\x9d\xc5(\x86^\xe3\xc5\xca\xd1\xe6bYs\xd6i7\xe6\xef\xb03qIRe-l\xfc8[b\xf9\xf0}\xe3v\xce\xc5(\x86\xcft\xfe\xd8\x11q6\xc8|\xb2\xd3\xe0\xb9_I\xf0r4\n(\x8f\xc9g9\x02\x80q\x16mi#\x0f9\x10\x80\xa2U\xce\xe3H2\x82D\x1cF\\\xf9{M\xba\x16&ԝm\xbf\x19\xe7b\xb4\xd8<\xeb\xff\xdc\xe2\xcd\u0383\xf5\x81۸c8\x9bх8kf\xde\xd9\xd6\xf0\\\xe9{\x1c\x000\xcc\xc7\xef\x8bH\xb51\x13\xa8;=\xe5E\xc7\"\"/M\x92\xe4}\x00\xdeޯ\xac\x96d\x91B\b\xbf/\"O\xd7>\xe9\xcek5\x85\xef\x15\xc5p\xe4\xad\x13\x12{\xc1\x18*ae\x8a\xb3\x126\xdcu\xc1\x19\x98=\x82\x10\xc2_\xec߶\xfb\x81\xa5\x8c\x8d\x05̆\x83\x17-G\x8d\xbd\xc6\x1a\x1b=6\x10\x00 ^P\x14%\x14\x13L\x807]%4\xd6@l\xb9C?i8d!C2\x92 i$5Hl\xa9\xb4\xf1\x8e\xcd\xe7x\xef?\xceВ*\x8e\x1a\xe4\xb8%PǪQT<_q\xf4\x1c;:\x96\x89\xea\x80F@\xaa+1ƫ\xf7\x89\x8d'Ϗb\xcb|\xb4\x03\xeb\x95\xf2\xc4\xd8o\xbf\xce\x03P\xc3Q_\xc4q$\xaf\xaf\xf1b\x8d[:\xbb\xd7\xea~\xbf\xd5jU\x9fU\x03\xa3rԍ\x92\x89s0\xd6VP'\u007f\x9f\xef{4r֕A\x89tk\x92:\aq\x10\x10\xcf9\as\xf1k\x82թ\x83\x88\b\x12\xb7\xb0\xb6\xa6\xe3U^T^ͬ\t\xe7\x1cf\xf2Y\x00@h\x06\x8c4F`\x83Ś\xa4\xdca\x9f\x88\xc3(F\x97ŏ5\v\x83\xa3x~Yf\x1c\fs֢\xaf\xb1\xfcy<\x9c]0\xc2\xc2\xf7c'\x04,\x84\x9bu~\xd9>\xc4\xddZ:߱\x13R\xfd\xe5\xbdA\xde{\xe4y~\xcd\xdb\x1ez\xd7\xdd۞\xfe\xbe\xffӏ\xbc\xfav \xebo\xdbt\x8a\x88\xfcN\b\xdd\x0e\x05V\xe68\x1a\x8f\x175\x80\x9a\xc1b'\xa1\xaf\xe9\xf7\xb8\xb8\xae\x1e\x94\x05\x10\xe3\x93<\x91\xde\xe7Mc\xcc\xfb\xfa\x1d\x97\x92\n_\xef\xc9J\x11Gܽ\xa05\xe6\x81qG.j\xa92h\x94\xcc\x05\xcd\xc4$\bY\x80\xe4\x02\xdf\xec\x18\xc8Y\x8f\xb6\xb4`\x9d\x85X)\xeb-K\xa0K\xb7_1\x12B\xb8\xcd\x18sJ\xafh\x9a\xf9\xe3F\b\x9e[5\xf21T\xa5\xaf\xf1\x9c\xaaSⱱAb\xb8\x92\x9d\x18GM\xcc\x1bGw\xec\x14\xb8\x16\xc3Pg|\x04\fGYK\xa18\vU\x990\xa4\xa1\x9f\xe3L\x9b\xe5\xa9\xf7\x8f`\x82\x05\v:\x84\x80v\xbb\x8d,\xcbj\x91iU\xb0\xb7\x16\x8d4\xc5\xc8\xe8h_\xe3\b\x12\x90\xd8d\x01\xfc\xa1\xc1\x19\xb0p\xad\xc6ccȮ\n\x06V\xe9\xd4#\xc1\xc2n\xbe\x18\xb7\xe7\xe3M\xb8+Nǒ\x17y'\xd3oW\xef\aY^\x16R\x84\x02\x89\xe9\xc2=q\x00\xc1\xeb\x83\x1d{\x8c\x1e\x18ӭS\xb0\xbdT=\xe1.2\xce\xca\xf5Z\x9cU\xf7ʂbć\x9dZ%\xdb\bA`\x9e\x94\xf4\x9e\x8c*y\xef?\xfe;?\xb8fߟ\x9d\xb3\xf5\x98\xa7x\xf4m\x91B\b\xaf6\xc644\xe2\x03\xba]$\xb5\vR\x04\x1b\x1b*\x8ehY\x00|\x92\xa9~\x87\r\xb3\x16Pوk4\xdà\x04\xb2\xab\x80\x88ܴ\xef\xfa]\x8f\xf6;.%^h쨀n\xbb\\\xec\f\x81z\xbb\xa9\xf6\x80\xb3\x81\xd1\xdf\x1c]k\xb4\xce\x11\x85*\x81*\x8f\xde\xd7\x18\x03_x\x84,\xa0=\xd3ZҘB\b۬\xb5\xeb\xd9\xe8뜩\xfcT\xa9\x95\xa7\xce\xf7J\xb8%\xc2^\xd9X\xb3\\\x18\xd7ey\xb0\xc1R\xa3ʑ\xa6\xfe\xcf\xc1F/Y\xf4\x8a\xc2\xf9\xfa<\x8ex\xb1\xf5\x03\xf9\x90\xbcj\xf3\xa7\xf2\xd2 G\xef\xcf\xfc\xa8q\xe09\xe3\xf9挛\r\x1f\xcf3;%5,\xedv\x1b\xedv\x1bE\x9ecvv\x16c\x87\x0f\xe3\xc8\xf88\xc6\x0e\x1f\xbd\xa9\xd0\xc0T5\x1c\xbd\x8f\x06.\x9c\xadŲd\b%\xce\xc0\x96ꀗBڅ\xd5\r\x00\xeb{(\xf4=\xae\x19\xea\xeb\xb1-\xaa\xe9\xc42k \x9a\x81(\x0f\xb1\xcd\x01\xba\x8e\x8du\x8ek\xc0\xaaì\a,\u007f\xce>\xe3\f\x9e\xff\xe6\xe0\x87u:\x86\xbf\u2004\xbf\xc7m\xc8\xec<8\x1bQ\xb9+\xefI\x92\x9c\xd4h4>\xf5\xd6\a\xdfY\x1d\x9c\xba\xa8\xbc\xfa\x16\xac\xb5\xff56p,L\xf6b\f-p\xe7\x14;\t\x15\nO\x969b`\xef\xb70\xdf5\x90\x83\x02\xe4\xa5qp֡\xf0\x05\f\xea\xfb,\xf4\x1e!\x04X\x18\xc0`\xc6Z\xbb\xa5\xdf11qD\x11\xa7\xf9l\xe0t\x12y\xf3\x95*\x89\xee\xf1P\x19\xf1be\bI\xa4[\xf8\xe5hC\xf7X\xc40\x8e^g)5\x90u\xb7lx~\xf3\xb1\xf9+[cM\xe4\xd39\x8a\xd9\x1c\xf9\\\x06\x9fy\x14y}\x13\x14G6\xca'oN\xd2\xf9\x8d\xb3K>f!\x86\xbe8\x83aGɑ\x9c\x12à*c\x95g\xec\x00\x18\xc2d\x18!\xee4\x02\xea\xb8x?\xc4Δyb\xa7\xaf\xc4u\x025\nl\x10b\xe8\x8c\xf9fc\xc1k\x06@\xed\b\x16\xbd\a\x1b*{\x8c,tR&\x91\xb5\xdbh\xb5Z\xb5\xd6V\x8e\x909ӎ\x1d\n\xebB/\x872h\nR?\xa5\x98\x91\t\xce:9\x82gx\x8dad\x1d\xebJ \xb7\t;\x8d\xe9|\xa6\x84\x97!5C\xcb끃b\xfd\x9f\rr\xec\x84y\x9d\xf3g9\x00\xe9U\xbb㌆\xe5\xc0\x8e\x8d3\xf58\xe3\xe0u\x117pp\xf0\xa0\xfa\vTs\u007f.\x80\xdf:\x96\xbc\xfa\xb2H\x17ݺ\xf1\xe4\x10\xc2+bE\x8a\x0f\u038b\xa3O\x16(\x1bPUhk,쌅\xbf?C\xde\x19|\x86N+r\x13\xc8\x1e\xcdj\x8bߍ\x8e\x00ϯwߔ\x03\a\xb2\x1d-\xb8\xc4ݸ\xfb\x03\xf7.\xf9$^\xa0\x9e\xee\xc5\xce\t\xe8\x16:u\xbc\xac(\xdc\x06\xa9r\x88k\x16z\x1d\xc679b\xe04W\xefυN\xe6\xa5Oz\x97\x811\xf0\x80\xcf\n\x14\x1d\x05\xca\xe7\xcbM\x83\x995\x80\x05\x92F\x8a\f\x19\x8c\x05\x92\x91\xb4\xdc\xf7b{w\x84\xb01W\xa5f\\=^\xf8ʷ~\x9e\xd3d\x95\x13\xcb2ލ\xcdƔ\xa1\v\xbd\x06\xef9\x8a\xb3>\x95a\xbb\xdd\xee\xbb\x0eR~\xa7,\x84s\xc1_\xbf\xaf\xfa\x16w\x83\x01ug\xa5\x06\x83\x8b\xcf<\x8f\x1c1\xea}\xd9A\xab\x03\xe7V\xf0\n\xfe;\x86]l\xa3\x85\xf6T\xab\xbav\x95\x05w\x8ew1\x1dc\xa1H\x00\xeb!\x93ʕ1\xf8\xd5 m;Vy\xb3}`\x99\xa9\xbeq\xc0\t\xd4\xe1\xb7\x1a\f\x14\x96W\xf4?\"G`2\x83\xd0*\xbb\xd9\x12\x93`\xc46\x90\x9a\x14'\xad9\x11N\x12$fak8\xaf\x95\xd89Ď\x99ǡ\xd0\x1cg5@\xfd\xa0\xc6^'_\xc4:\xa3\xf7f^\x18q\x88\xed\x98ΫfwJ\xfa\xb9\xce\xf7\xaey\xeb\x83\xef\xfc\xf0\x8dg_\xb7\xe8c3\xfb\xd2\f\x11\xd9\f`\x84\x99ӿ\x999UH.\x14\xf1\x02\x04\xba\xa7\x97Zk\x81q \u007f\xa8U\xf3\xa0\fﰑ\xca\xf3\x1c\xf3\xf330\xf7t0\xe5'\x8dB\x9e\"\U0003e034\x00\x81\x1c\xf1\xde/zJ鱈\x17;G\x87:\xae8\xfa\x88!\x13n#Աp\xd6@\x9d\x0e\vڛY\xe9z\xc1\nq\x14r,:\xefo/\xfe1k\xed\x1bC\b\xd5\xfe\x93\x98o\xef=\x9cq(\x9aye\xec\x9a\xd3\xf3\xa5l\xd3\x14\xc1\x04\xb8\xd4\x01\xae<g\xcc&\x0e\xc1\x04X\xd7M\xcf{\x9d\x89\xc50P\xaf\xc8]eƊ\xcaΘ#>}\x9f\x95<\x96\x0fG\x82\xca\a\xcbs)Et\xcel\xd8H1_\x1c\xd5)\xf1\xdf\x1c|\xb0\xb3\xe3\xcc5\xce\xce9\x10\x89\x9dp\x9c\xd9\xf4C\xb1cף7ڨפ\x9cs\x801H\x9cC\xa3\xb3\xbb\x9aO\x86й5Ƭj\x11\xddXS\v\x16t\f\xb13\xd1יB\b\xb5\xf5\xa4\xd7\\.\x05\t\xd51\xf7֕\x0f\xfc\x9a\v\xf3\b!`\x06\xb3\xe5zr)R\x93bԍ`4\x19E\x02\x87\xd1dtA\xd6\x1aג8\xe8\x89\r;\xeb\n\a\x12\x9c\x95T\xf2\"{\xa0?\xbc\x0e8\x88\xe2\xe0\x80\xef\x05\xd4\xf7\xaa\x00\xf5\xb5\xd9y\xed\x89Ƙ\xdf\x02p\xfdb\xf2\xea7\xb48\x9b\x17\xbc\xfe\xcd\a\t*\x03\x9c\xaa+C\xea\xed\x14\x9b-'\xdc\xc3?\x9c\xeb\x80\xe7\x00\xdcf\xad\xdd\x0f\xe0a\xef\xfd\x9c1\xe6\x19\xd6\xdasB\b\xe7x\xef\xcf\x01pN\x92$k\xd5@e\x8f5a\x0e\x19\xb8\xa4\x01_\x1e߰e\xef֝\xd3}\x8eg\x01ѱ\x1a\xd5k\xf1\"g\xa3\xa5\v\x9c\x8d\x03\xe3\xf9l\x84\xb8x\xacΐ\xfb\xfd\xd9X\xb2\"\xb0\x01\xd1\xeb\xf7Ci\x9a^뽷|\x1dU8\x95_|\b$\x1b\xdbv\xbb\x8d\xd1\xd1QH&\x10\t\xc8M@\b\xedr\x01x\x0f\xe3\x00\xa7N\xc5y\xd8\xc4\xc15\xea\r\a\f\x05ŝ)q\xed\x82\x17^\x9c\xd1\xe8\xf7x!p$\xcfNQI\x8b\xee\xf1\x82<\x16\xc5\x19\x13\x1b/\x86\xe4bh\x89u\x9e\x8b\xd71\xe4\xc2FB\xff\xe7{\xb3\xfcb\x98\xc2ڲX\x9f\xb8\xa3/Yk\xcag\xebą\xd9^\xf7\xaa`\xb3\x100??_s\xba\xba\x939I\x92\xf2(\xfdU*\xa2'6A\xb0ݵ\xc5G\x1c\xf11+1D\xa4\xef7\x1a\x8d\xdasb\xaa\xf1\xd9\xe5\xf1\xab\xf6*\x0e\"X\xd7\x02\x02\xda\xd2F3k\xc2\xe4]\xe7ް)\x9c8\x9c8z\"\x1a&E\xea\x1b\x18I\x1a\xb5\xb9d{\xc0\xaf\xc5YW<\xff\xfc\xd9\x18-\xe1@\x9b\xd7Y\xacwq\xbb\xb8~\x8e\xf5\x8e\xe1\xce\xce\xf5\xaf\xb9\xfa\xe1\xdf\xfb\xf0\xf5O{\xefl\xcf\xf9\xebS\xa8O\xe5\x88*\x16\x04/\xa8\x18\x8b\xe3\xc5\xcf\xe9;\xba\x86\xe1\xdd!\x84?\u07fbu\xe7Qw@>\xffm\xe7\x1b\xef\xfd\xc5\x00~\xcd9\xf7\xf3\x00N4\xc6 +2\x98\xf2q\xaa7\xf73\x96\xc5H\x05\x1e\x1b-.:1N\xa9\xef1\xac\x15w\x14\xf1\xb8{e\x141T\xa6\x0e\x83\r0˶\x1f\a\xb2\xee\x96\r\xcf.\x8a\xe2\x17\x14\x12`#\xad{\x11b\xa7\xc6FK\xff\xaf\xed\xbe\xa6\x88\xd9\x1a\x03\xf1\xe5\xf5\x8a&\xef\xeb\x11\xb8\xc4\xc2\xcd8ȴ i\xa5\x90\x86\xc0\x9dl\x11N\x15\xc8\xe9\xf5c=\xd8\x01\xf0}8\xf3d\xe3\x1fˏ\xe7\xc1{_A\x01\xfc\xb9\xd8(\x1d\x8b\xe2l\xa7\u05f58c\x8a\x1d\x8bf\x97\xedv\xbb6\xa7\xfa\xf98\x1b\x8a3\x918\n\xe5\xeb\xf7\v%\x05\t0\xd25&\xfa\xdd^\xf2fc\x19;\xb5,\xcbjYA\xbf\xc1\xcbRi\xb1\xf5\xc0\xddX\x9c\t\xda\x0e\x04\xc7ϥQY\xc7\xd9\xcarȚ\xf2\x84\xef\xb8~\xc6s\xc8\u007f\xab\xfe\x19c\xd0*\xcayo\xb5\xda]\x1e\x04\x18q#\x18u#\x18q#p\xc1bM\xba\xa6*֫\xdc\xf5\u07b2W0\xfb\xc8$\x0eO\x1f\xc6\xc4\xdc\x04N^{2N[{\x1a\x9e\xf0\x84'A~\f0\xa7\t\x80\xfaI\x10\xf1\x01\xacl\x878P\x88\x1b7X\x1fx\x1cQv\u007fz\b\xe1\xb7\x00l\xed%\xaf\xbe\x1cH\ba\x1d\x1f.\xc8Q\xa2\n\x8a\xbb\x06b\xc3ʌFQ\xe1\x9b\xf7n\xdd\xf9\x91~xؿm\xb7\x00\xf8\x16\x80o=\xef\xaa\xf3\xaeJ\x92\xe4\rEQ\xfc\x9asn#\x80\xf7\xedݺs\x13L\x85Z\x00\x00 \x00IDATQ\x9c\xae\x1f\x12\x91\xc7\xd0ɴXQX\x818\xaa\xecȥ\x06\xb7\xe9x\xe3̂\x9dO\x05I\x84z\xd6\xc6\xf0\x0f\x1bR\xbd\x8e\xb5\x16&7\x0f\x1ek\x1c!\x84\xff\x91\xa6\xa9\x8b#g.H\x16E\x81\x91\x91\x91\x05N$v\x90l88\x10\xe8f\a\x801\x16\xd8\aH\x96\xa1\x00\xd0\xee|\xbf\xa50գ]\x03\xb0fd\r\xec\xba\x14f\xd4 7\x02\x97\x96\x9b)]RO\xf5\xe3(p1lWI\x95?N\xeb\xe3(\xf2Xd\x0f\xe0\a~\x8d\x87\x85\xed\xb6\xc3v\xb0t{\x8aE\xb2\xb6[\xd7b,Y\xe7Qe\xcb\xc5\xff\x98Oկ*0\x00 \x87\x05b\x050\xa8\ueb5f/|\x81\xc4&Hl\xa7C.\v\x8f\x1cm\f\v\xe7\xa8^\xb0\xe7Z\x92\xaee\x8d\xe0\x95\u007f\xfdN\xecHW\x83\xbcxHQ\xdfx\a,\xd4\xc7ة\xc6c\u2d7a\x12\a\"(\x9f3\xc4P\x1fP߸\xd7+\xa3e\xfb\xa0<h&\x9c#GVd\xf0\xed\xc9\xf2\x1a\xb9\x85\x15\x83\xd1ξ\x95\xc6\xe1\x06\xee\xbf\xf3\xfb88y\x10@=\x83\x1e\x9b\x1dG\b\xf7\xc1\xdco\x80{\x80F\xd2\xc0\xe6\xf3^\x06\xd9X\x87\xa48Љ!W\x1e\a\xdb\xec8)\xd0\xf5\xce\x1d\xa2\x9d\xdfo{\xeb\x83\xef\xbc\xe1Ƴ\xaf[\x10E\xf4\xe5@\xd24}:+\x13G]\xbc\xa8\xf5\x86\x1c\xcdsT\x11}WҋF\x8fi\x10{ѷo\xd83\v\xe0c\x00>v\xde\xdb/<\xb7(\x8a\xef/\xe7:L\xb2\xbb\x98j\xfbv\xa5\x9c\xb9\xe4\xd5\x18\x1b\x17\xadY\x00]\xb0q\xe7l\x84?\xa7\xc4\xd9L\x95\x99H@~o\v\x85iW\x8b\x9ea\x97\xaaK\v\x1d\xf8\xa24Tc}\f\xe5\xff\x8a7/\xb1\xc3\x0f!\xd4\x1e\x19\x1a+\x1e\xd7r\x80\xfa\xde\x16\x0e\x0e\xac\xb5\xc0\xb7\r\xdas\xf3\xb5\xb1\xc5Ε\xafU\x84\x02\xfe[m\x8c4F\xe1_ (\x00X\x9b\xc3X\x83\x00\xe9<\xd3\xc5T\xe7\x8c\xe9\xfd\x95T\xb9C\xa8\x9f0\xab\xbc\xeb|pd\b\xd4O|>\x1a\x8d\xef:t(~ι1%>\xffħ\x9f\x89\xb0\xbe^\x13ӌ#\x8e\xe4E\xba]v*\v]\x13\v\"\xe4Y\xc1\xdc=S\v2\x0e\xa0\x9e\x19\xd2<\x1c\xf3\xd9\xf2\xbd\xe6+\x0e\x804r\x8d\xbbo\xe2\xe6\x00\x86oW\x83\xac)\x1fi\xadM\x03l3\x14\xaa\xe2`(6xq\x10\xa4\xf3\xce\xebo\xa9\xfc\xe8\xf5\xf9d\x04\xa0\xde\b\x02,<\vK\xf9\x8d\x83!\xa0~rn\b\x01\x85\x04̴gP\xfcS\x13\x0fO<R\xcbBU\x0e:nn.)B\x81\u007f\xdb\xf5\x054\xf6\xa6\xd8\xfc\xe2\x97#\u007fn\tk\xc6k\x80\x9d\xa9\xb6\x86\xc7Y\xbb\x8e\x91!5\x0e4u\r\x17E\xf1D\x11y\x11\x80\xbbby\xf5\xe5@|\xe7aK\x8c\xef\xeaMx\xb0\x1c\x19\xe8\xe4r\x11Y\x17X\xc7p\x19\x11\xf9Njn\xdd\xf8~\x11\xf9\x9f;\xdex\xf7\xb2\x1en\xb2gˎ\xbd\xcb\xf9^L\xb1\x17\xe6E\x96F\xe3\x02\x16n\xc6b\xc5b\xa7\xa22\x887\x97\xe9\xc4j\x94\xc5\v\x9a#\x88\xf8(\xee\xa3Q穐ϊ\xb3 6L\xbd\x1c\xbe*\x12\x13+?;\x02U\xaa\xec\x9ef732\x06Y\x96M5\x1a\x8d\u007f\t!|GD\x1e\xb3֎\x018\x19\xc0\x19\xd6\xdasD\xe4\x15\"r\xa6\xb5\x16\xed\xac\x05\xff\xef\x1e\x8ds\xd7 \x8c\x06XXH\bȋ.\x9e[\x98\xb2\xb8\x1f$`\xcd\tk\x11\xc4\x03\x0e\bi\x80\x18)k0\xae~f\x16\xf3\xc8c\xed\x17\xc2\xd2E\xa8\xdfW}M\xd3\x14y\x91\xc3\xf8\x85G\xccsp\x10\xb7a*/\x9c\xc9\xc5s\xc9\x0e:\x86\x13⌁\xe1\xb5\xc5\xc8\x1a[:d2\x021\x9c\xc6\x06&>\xf3\xacW\xa6\xa9\xb2X\r\x9a\x9c\x99@\xdah 錳\xd1hԜ\x85ޛ\xdb]{5\x1ep\xc0`m\xe7As\xcb \x03S\xc9O\x83\x00\x95E<\x8f\xcc\x17\xeb`\x1c\x80\xe9g\x81n\x9b\xbb-,\x1e\xbe\xedAdEV]\xdf{\xdf6\xc6|\x11\xc0N\x00\a\x8d1\x87\x92$9)\x84pf\b\xe1l\x00\xaf(\x8a\xe2i\xce9̷\x9b\xf8ܿ\xfd#6=\xb8\x11\xa7\xbd\xf2\x89\v\xe0]\xa58\x90\xe7\xc0\x92\x031\xb6]\xac'\x94\xad\xbe\x12\xcbu \xd6Z\u1cca\x989\xfe_\x15<\xc6\xfc\xf9}\x8e\xa6\x00\xa4!\x84\xf7Xk\xdfs\xe1'/\xf9\x9a\xf7\xfe\xd3\xd6گ9\xe7\xee\xbd\xe7\r_o\xf7\xc3\xdb\x00\xe9\xd3\xd6\xda{\x98?U\xe8 \xe1g\xc4ˉ\xdc\b\xa0\xe3S\xc5\xe0\x85ȑ\xa6N\x82\x8e_\x15>\xcb2\xc0\xfb\xbf\xd6ϳs\xe2\x8c\x00\x00\xff\xfe\xe1\xd1\x06\xd01\xd2\xd5\xf7\x19\ag\x83\xc7\v!\xc6K9\xc2c\xe7\xc3\xd7i\xff\xfb<;\xa4\u007f\f!\xfcY\x9a\xa6_\xdd\xfd\x81{\x17=\x0e\xfa\x05W_`\x8d1\x17\x89ț\x00\xfc?\x8dF\xc3\x16\xfb۰\xcfJaO\xab\x9f\xe4˼8㐷\xb2n\xf6\xd1,wl{u\xf4\xa9\x83Mlْ<\x92\" \xc0\xb8\xf2 K6\x84\xfd\x90\xb5\xf6\x01\x00\u007f\xcd\x1b\xba\xaa\xc0`\x14O\xb7־\x8c?ϲ\xe4\xec\xabs\xad\xea5\xdeD\xc9F\x10\x00|\xc3?\x92$ɿ\xb2\xc1\xe6\x00&\x0e\x04\xac\xb5GͶ\x83t\x1b/b\xf8By\x8e\xbb\xf2\xf8>\xcc?\x1bN\xad\x87\f\x9a\x8a\xa2\xa8\xae\xcd\x10\xb9\xb5\xb6z\xa2\xe4\xc8\xe8h\xcdA\xebZ\xd3q\xb1\\\x81\x0e\xe4f\x96\xef\xf0z\xed\xd6\x06\xba\xeb\x97\xd7:\xaf+\xbdw\xecp8\xb2\xd7\xf7\xee\xfb\xc4w\xd8h\xef\xb2־\xcf\x18\xf3\xcf{\xb7\xee\xecY\xac\x06\x80s\xafYg\x00\xac\x0f!\xfc*\x80_\xb7ֺo\xdc\xf7M<\xf3\xd6g\xe0\xa9?}6F\x935H\b~cb=T\xddR=Q(6\xee\x1a\xd3\xf1td\xf1\n\x00\xbf\x1f\xf3\xd4\xd7\xcaZwˆ\x87\x8c1OS\xc5\xe7\xc8\x15\xa8ciJ,HU~\x8e(8\xda\xe2\xcfu~\xda\xd6\xda\u007f7\xc6|\xcd\x18\xf3U\x00_\xb9\xf7g\xef\x9a\xec\x87\xd7\u0560u\xb7lx \x84pv\x8c\xbb\x02\va<v\x9cq\x96\xc2\x11\xb2s\x0e;\xdex\xf7@[[\xce\xff\xbb\x17~.I\x92W\xe9\xd1\x0f\xbcّ\xe1\x10\xee c#\xc2Q\x12\xc3j\xaa\\>x\x84\x9d\xb9\xbew/\x80\xff\xbew\xebί/\x95\xcfs\xafY\xf7\\\x00\u007f\xe2\xcbg\x80 \xbdh\xb4v?\xa0\xdejȼǭ\x86\xec\xccu\x9c\xea\xfc\x93F\x02\x97:\x04\x84\xfb\xefy\xdd\xd7\xcfY\x89l/\xb9c\U000eb735\x9f\x8b\x03(\xe65>(\x12Xx\xb2\x01\xe3\xe4\x9dk}\xfe\xae\xcdw\xbcj%\xbc1m\xbc}\xf3\x06\x81\xdc\xcd\x06N\xf9`\u074c3R^\x9f*\xdb\xc8\xe8}\xe5\xae\xcdw\xfc\xf8\xa0\xf8\xac\xf8\xbdc\xf3W\x00\\\x06ԍ\x1c\xd0-\xdesc\t\x004FF\xe0:\x0e\xc69Wk\xa0\xa8 \xa3G\xfd\x8b\xfe\xe9e\u007f\xff\xad\xa5\xf2\xf3\xda/\xbf\xf1\xe7\xfdi\xfe\xef\xe2\x93\"Ա\xc7u9\x8e\xfc9#\x8a3N\xed\xbeL\x9c\xc3\xc4\xdf\x1f\xc2\xd8\xcc8Dd\f\xc0[\x01\xfcݾ\xebw-\ts;\xef\xed\x17\xfeX\x9e\xe7۬\xb5?\x99\xa6)\xce>\xe7\xd9\xc0\xc62\x03]\x93\xaeAäH\x90\xe0\x84\x91\xb5H\x90T\x0fʊ\x91\r\xd5\xe7\xf8\xa8\x1d\xe6\xbd3n\x11\x91'\xdfx\xf6u\xb5\xa3\x10\xfa\xca@\x8a\xb1\xdc\xd9\xd4\xc1%\x16y\xc8J\x8c\xbaQ>\x0f\xc1\xa6\xbd\x1f\xb2\xa2\xc2\xe5\xf4\x8d\x17X\x1c\xa9s1\xdaZ;\"\"\x97\x02\xb8\x14\xc05!\x84p\xe1'/\xd9a\x8c\xb9\xc3{\xff\xc5$I\xbet\xcf\x1b\xbe\xbe:\xe7K\xf7 N\x9b\xd9K\xf3\u0600\x85\x9dB\x1c\xb9\xb3\xf1\xeb7\"^\n\xad\xbbeè\x88\\\xaeF*>\x17\x8ayV\xe5\xd1n!\x8e\xac8:\xd518\xe7 A\xe0\x1ep\b\xc8\x11B\xf8$\x80_ٻugs9\xbc\xeeݺ\xf3;/\xb8\xfa\x82W\xa5i\xfaޢ(ޙ~7Ex\x81,\x88\xee\x80z\x17\x89\xc2|\x9c\xc9q\xf4\x17\xc3O\b\x80o\x0f\xb6{\x88#\xe1\xcaQQw\x14\x1b^\x86\x14T\xce*\xd7x\x9c\x83\"\x1f|\x951pF̺Ɏ,\xc6\xdbـ\xf0I\x05\xab\xa1\xb3@\xbdê\x96A\x90#ֶw\x85\x94\xe6\xe7\xe6\x16ԕ\xd24\xad2\x16\xeb\xeaOv\\*\xc5ȉ\xbe\x06\xd4\v\xdc\xcaw\x1c\xbc\xf0\xbcs\x94o\x8cA\xb1\xc3\xe3\xf0\xf4\x18\x00\xec\xb7־zϖ\x1d˅\xee\xbf{\xee5\xeb^\x13Bx{\x9e\xe7\xef\xbf\xef{\xdf1\xcf|\xc6s`\x9ff1\x97\xcfa\x0e\x9d\xe0%+\xe7.\x81\xc3\xda\xc6Z\x18o\xb0&Y\x83\x86m 5ݓ/t\\\\\xf3b\x94ED\f\x80\x9f\x00\xf0\xb7\xccG\xbf\x10\xd6!)\u0099E\xd1I\xcdL\xf9\xa0%k-\xf2\xd0ٍ\xee,`\r`\x046\xb1𡀷\x82\xa4\x91 \x0f\x19\x8c\xb3p\x89[ p\x15:\xd7K\x00\xc4\x03\xb3!\x84\xf5\x00\xd6[k\xdf\xe6\xbd\xffᅟ\xbc䯭\xb5\x1f\xbb\xe7\r__\xd6\x04,\x858\xd2\xe4\xc8\x02X\xd8T\xa0)8G\xf1\xbd2\x96Uh\x8b\\o\x8cY\x13Ä\xcag|\u007f\x91\xf2ќ\xcaG\x1c\xdd\xc7\x06R \xc8'Z\x00\xf0Qc̛\xf7lٱ\xa2\xaaj'\xe2\xba\xf6\x05W_p\xb8՜\xbb192\x82\xe4G\xba\xcf@\xe9\x05\xbf\xb0AT\a\xc9\xd0\n;hu6\x83\xc2\xeeCV\xc0\x8d4\xca\xe7E\x90l\xd9@p+\xae\x8e\x01\xe8vlqƽZ5\x85\xc4&%\x84\x17e\xc1\fEi\xa1W\xf9֮<\x0e>x<1\xba0HR\a\x10\a\x93܂\xce2\x8b\x1d\x87\xfe_\x14\x05\x8c\xf7ȳ\xb2\xa6\xb0\xdc\xc3\x14My$Rm}\xb3c\xd3{ǻ\xccYה\xb7\x05\xad\xe5\x85\xe0?v~\x1b\"\xb2\xd7Z{ٞ-;\x96\xf4\xf0\xa6\x98\xf6n\xdd)\x00>\xf0\x82\xab/\xf8\x1e\x80\xff=\xfeՃ\xf6\xf47<\x05 \xa7\xaf\xf7\xce|\x8e\"\x9b\x81\xb5\x16\xd3\xd9L\x05\xf3\x8d&\xa3\xd5\xf1\xf8#R>sŠ\v\xbf1Ҕ\xa6\xe9\xcb\x109\x90\xfe\xb4x\x12?\x88\xa3\xe9\x18+\x97 \x80\x17\xa0\x00\xa4\x15`\xda\x06\xa6\t\x14\x939\xc2T\x00\xa6\x04\xd9X\x1b\x98\x11\x84\x19\x8f0\x17 ̀\xd0\x0e0\xa1|\x8e\x86FMq\xe4\x16\xb5\x94\xc1\x18\xf3\x14c̻B\b\xf7\xad\xbbeç.\xf8ċV\x04O\xf4C\x12M\nP\xaf\x19\x18czv`0\x14\xc3\xceg\xd0\xc7C8\xe7\x9e\x12;5vn\xba\x1b\xb9\xd7{\\h\xe3\b\x8aq\xdc\xfc\xde\x16B\b\xdf\a\xf0֕:\x8f\x88\xfeLDn\xcf\xefkU\x06A\x8d\x1a/\\\xfd\xcd\xf0'\xd0ť\xe3z\x1c\xd0=\x98\xb0\xdf\"\xfa\xd1(\x9f\xc81\xf7\xe8,\xdac-\xb4\xc6[\xc8&\xdb\xf0\xf3\x05B;\xa0\xc8\nXS\x1a\xe78\x92\x0eT\x8c5\xc6T\u007f\xc7m\xa2\x83\"\xc1\xc2V\xce8\xa2\xe4s\xe9⚘\xfe\xd6bv\xbcwe\xd0\xc4Y\x8e\xeb@R\xf1<\xf3\xf1\xf6\xbc\xc6\xf8D[\xd5\x1dθ\x96C*?\xa0\xde\xf0\xa2sƐ\xae\xbe\xa6\x9f\x05\xeag\xc1\xe9\x9a\x0f!\x00\"8\xf2\xa9\xc7\x00\xc0\x1bc~\xf9X\xfbޖB\xfb\xae\xdf\xf5\x0fƘ\xab\xa7\xe6\xa6`\x1eDup#CPlSU\xbey\x91c>\x9f\xc7T>\x8dC\xad\xc3x\xb8\xf9C\xfc`\xee\x01<8\u007f\x00\x0f\xcf\xfd\x10\x13\xf9$f\x8b9\x14R\x05kό\xef\xdd\xdf>\x90\xa9\xe2\x11s\xca\xc2\xed\xf11\xfe\\1\x16=\x13\xa2\x8a\x10\x8cAy6S\xe7\x99١\xfe\xb8Mk-2\xdb.+3\xa9@\f\x80\xce32|Qb\xdaA\xbaim'B\xfa)\x11\xf9\xc9\v?yɍƘ\xf7\xdd\xfb\xb3w-Z\x84Z\t1\xf6\xa9\v.\xce4\xd8q\xc4\x10\x10G\xa0*\xc7A\x92\xf7\xfe\f\x00\v\x8c\xbf\xb5\xb6z\"\x19g\x17\xfaY\x8e\xb08b\x06\xea\x05v\x00\xd2Q\xfc\xf9A\xf2\xbd\xef\xfa]\xe1\xdck\xd6\xfd\xaa\xf7~\x8f\x8cɉɓ\xbb'\x02\xf3x\xb8\x1dUy\x8d\xeb\x11\f\xdb\xe9\xe7uѯ\x94*l=\xa7\xfd9\x99Ԝ\x80\xb1\x06\x85\xcba\x9c\xed\xec\xd6O\x00\vؤ\xcb+w\x10\xc5m\u0383\xa0 \x01\x89I*}ձs{n\fm\xb1\xacX\xa6\xab\xa9\xaf\x15\xbf\xa1{\xaa\x03\xbf\xc6\x193;9~\x82';DδJ\x94dy\x8eyL\x0e!\x9dj\x00Ơ\x91\xa6\xd5q\xfa@y\x9e\x18?͑\x9f\x84\xb9\xe0\xfe\x84\xaeXk!90>;\x0ec\xcc\xfb\xf7]\xbf랕\xc8l\x11\xfa\x13\x00\x1bZ\xbbf\xdep\xc29\xa7\xd6\xd6y\f\t\x03X`\xbf\x19\xfa͊\x1c\x19r\xcc\xe6\xb35\b{č<#\xbei_R\x16\x91\x1d\f\x85(s\x8c\x8b.\xe8oG\xbdUT\xbf\xab\f\xf3\xf5\x18\x9f7b \x85 \xb4\x02\xb2\xe96\xfc\xacG6ц\x99\x05\xf2\xb1\f\xf9X\x86l<\x83\x99\x03\xc2l\x80\x9f\xf3\x90vhH.\xef\xf0Yq\xf7\xfa[7-\x18\xe4\xa0(v\x14,\a\x8ez\x18\x93W٬\xe6\x81t\x1d:\x8f\xe5˽\xf0\f\xa1\x00\xf5MQ\\\xd4U\x9e+c\xa9\x06\xfb?\x00k\xed\r\xfb\xaeߵ\xe4\x82y?\xb4w\xeb\xce\a\xd24}\x9b?\x90Ղ\tVr\x86\f\xe2n'\x86\x10\xb8%Zuu\x10p!/\xb0\xb8\x9e\xa1<\x06\x1f`\xbc\x81\xb4\x03\x8a\xd9\x02\xd9d\x1b\xed\xf1\x16\xe6\x0f\xce#\x1bk\xa3}\xa4\x05?\xeb\x11\xe6}\xe9|2\x8f\xd5(-\xb0a\xe0z\rg$\x8c \xf0\xff\x9cݱQ\\-\xfd\xe5H\x9e\xb3\xca8\x8b\xeb\xb5\xee\x16\x1b{\ba\xd9gw\x85PvH\x16y\x8e\x99\x99\x19LMN\xe2\xf0\xe1\xc3\x18\x1f\x1f\xc7\xf8\xd8\x18\xe6\xe6\xe6\xd0j6\xd1lv\xcb\u007f,K\xe6\xaf&\xd7\xdd\x01\"\xb2[D\u07bb,ƎA{\xb7\xee\x94$I\xde\xfe\xf0\xf8\xc3y\xe1\xbb\xcd3\x9c\xa1\x01X`\u007f\xe3̝\xeb\xbd\xfa\xfd\xf2\x0f\xa0\x1d\xdaO\x8a\xefۗ\x03\xb1\xd6\xde.\a< \xf5g0\xf0b\xe2\xe2\vG.\xcc\x04G\x90\xfa9\xceV\xd8\x003\xdeXSd\x97\xc0\x04 d\x01\xc8\x04a\xde\xc3\xcfx\xf8\xa9\x02\xf9\x91\xfc\x05\xf9X\xf6\x8d\xf3n^\xbf\xb1/\xa9\xf7I\x9cy\xc4P^\x1c\x05\xf7\x1a\xffb\x10р\xe9\x19\xfa\a+\t/<\x95\xbf\xf2\xa1P\x11;AV8k-\x8c\xb5ȧ[\xff!\"\xef\x1e4\xc3L\"\xf2\x17ƚ/\x15yQ\xd31\xe5\x83[ku\f\xbcHԩ\xe8g5p\x19T\xbd!\xdep\xa7FO#`\xe5\x83k/\xb5\xe0\"\x94\xf0n6\xdbF{\xba\x8d֑&\xb2#m\xcc<<\xb3bޘ\xac\xa9\xc3Q\xf1\xdabb\xf8\x8f\xa1b\xa0\xfe\x1c\x89A9\xe1\xc5HDj\xcf0\x01\xba\x8e\x9a\xe5Νm\xca\u007f\xac\xe7U\xa6\xbf\x82\xb3\xbb\x18\xf6\x8c\xed[\xbb\xd5\xc2\xcc\xcc\f\xa6\xa7\xa60v\xf80\x0e\x1f:\x84Ç\x0eaff\x06s\xb3\xb3h6\x9b\xb5S\x85\x95\xc7\xe9\xfbǂ\xb5\xf6\x97\xf7]\xbf\xeb\xe8\x0f\xb5_\x01\xed\xfe\xc0\xbd\x0fXk\xff\x12\xd3u\xa8\x8f\xb3<vv\v\x82w\xaa\xe7(\f\xc6\tC\ba\xf45\xfb~\xb6\x16I\xf4\xb5\xb2\xf6l\xd9\xf1\x80\xf7\xfe\a\xd6՟2\xc77gC\xcf\xcf\x1b\xe0\xcd=q\xd4\xc6\v\x9f\xa3^N\v\xe3HD'G\x95\x9a\xa3\xa6\x8e\x91y\x92\xb3\xee\x8b/\xf8\xe0\x85\xe7\xadxF:\xc4\x06\x8b\xa3\xba8\xbd\xd7I\xe1\xa8T?\xc7-\x81\x8c\x93\x0f\x8a\x9csOb\b'^\x8cJ\x9c-i\xd7E\fc\xf1u\xc4\a\x00\xf8\x9b\xbd[w.\xediVK\xa4=[v\x88\x88\xfc\x99\xae{\x9d\xe7xw2\x1bB\xd6\x1d\x8e\xfa\xe2\x831\aᬵ\xbe\xc1\x05\\uP|\xfc\x06w\x1a\x1e\xad\xf6\xb2\x12\x9c\xfeh\x14\xa4\x1e\xa4pA\x9c\x8d\x1a\xcb$\xfe\f\x1b\x9a\x18z]-\x8aa\x14\x95/\xef\xa7\xe2\xcf2|\xa5\xc6n\xb1\xa3\xe9\x97B\xbc\xce9\xd3U^bǢ\xeb\xa9\xd5l\xa2\xd5jazj\n3\xd3\xd3\x18\x1f\x1b\xc3\xf8\xd8\x18&&&0=9\x89\xb1\xe9\xf1;\xf7nݹcٌ\xf5O\u007fe\xa6\xeb\x1b\x90\xd9\t2\xc5vM\xf5%\xce\x00Y\xdeI\x92\x9c\xce\xd7\xe8;43\xc6|\xa8\xb8?\xab\x8cQ\x9c\xfa\xb0\xb7cLP'\x97\x9d\x8d*\x83~\x86\x8bR\xfa\xf9^8=_7\xc6\x1c\xf5\xef\xceg\xd7:\xe7\xfe\xe1\x82\x0f\xbd\xf0\xd4~\xc7w4\xb2-\x03?\xe7\x91\xcff\bYyX]\x91\x17\v\xd2Aδؠ\xf1{j\x84\x06\r\t\x14E\xf1\x84\xb8\xfe\xa1\xb2\xeb\xb5 \xac-kU\xb1\x93\xe3h?\x84\xa0\xe7T\xf5\xf5|䕒\xf7\xfe߬\xb5m\x8e\xf4\x81nG\x16\xcb4\x1e\x9f\x1a>\x86B\xf4\xbb\x830\xd4q\xa1\x9eOXЧ\x15\xc6\xf5%\xe6C\x1d\n\aO\xacσ\xa2\x90\a\xa4IZ\xddC\xf9T\xec\x9e\xefY\xabM\x12\xcfi\x9a\xd6\x0e\xdeT\xfeW\x8btnYoUޱ\xbc8\b\xe3L\x8b\x83Օ\x12g\xb9\x1c\xa4h\x91\x9f\rl\x9c\xfd\xa8\x1e\xaaSγ\f\xadv\x06\x18|j \xcc\x1d\x83B\b;e^\xa6\x95\x1f\x1dG\x96e\v\x9a'8\xd0P[\xa0\xfa\xa2\xef\xe9\x0fP\x95/\x9e\xcc\xf7\xeb[{E\xe4#Ƙ19\xd0\xed\x94\xe1ݠq\x14\xa8\x91\x99zm\x15|\x1c\xa5qT\x17G\x9a\xeaH\u0603\xb21`\xef\xcaE\xb5\xce{\xcf\x16\x91\xbf\\\xe1|\x00\x00|\xb3ĭM\xcb\xc0O\x15\xc0\xb4@&C\xf93\x15\x80YA1S\x00\xad\xb2vc\x83Eb\x1c ]G\xa7\xe3\xd21\f\xa23\x88ID\x8c\x1a\xfe\x1a\x04e\xba\xbb\xea\xb9\xd8\xc8\xd9\x12C\x861\x94\xd0n\xb73\xe7ܷ\a\xca\xec\"\xb4\u007f\xdb\ue588|\x9f\xf1Z\x86\xaa\xd8h\xb0\\Yg\x18\xe7\x1f\xa4\xd1\xe3H\x98\xaf\x9b\xd0Ù\x94\x1f\x0e*\x94\x18\x06Y\xcdh\xbe\x98,\xbbŚ\x8f5\xd1\x1eo!\x9f\xca\xe0\xe7=laP\xb4\n\x04\xbf\xf0\xb1\x04,;\r,\xd4\xe8\xb0a_\rR\x03\xad|(\xf1\xfc\xb11\x03\xea\xba\v\xd4\xed@\xf5\xfde\xb6\xf1\x02X\x800\xa8|\x18\xfd\xe0\f\x8f\x11\x18\x866\xf5Z\x1dy\u007f~\xd9\f-\x81\xf6o\xdb\x1d\xcc\tf\x1f\a\x8b1BĶH\x03\x05\xde\x00\x19B\xa8u02|\x1f|\x18\xe1\xfb\xf5\xad\x15\xfb\xb7\xed\x9e\xf3\u07bf[D`;\xe7\x81\xfa\xa2\xfbHI.\xbepԧ\x93\xcd)?\x1b\xaa\xb8w\x9f\a\xc8\xe93/\xdc8\xa3\xd1\xfb\xb31\xec|\xfe\xbf\x9ew\xd3\xfa\xf5+\x98\x8fj\x02\x98*/\xee\xcb\x16Nm]\xf6s\x1e\xc5t\x8e0\xed\x91\x1f\xc9!\x93\x01\xf9x\x06?Y\xc0\xcc\x03\xf9t^\x15P1xHY4\x82\x88\x17<G\xa3\xbd\xa2;}\x8de\xa8\x9fO\xd3\xd4\x0f\xb8m\xf7X\x94\xa9^0\xfe\r\xa0\xb689(\xe1\xac+\xa68\xf3Z.\xe9\xde\x04\x8er\x19J\xe5̈\r\f\a6\xac\xb3|V\xd6j\x90\x01ʎǖ\x87\x9f+Кh\xc1O\x17\xc8\xc6ژ{t\x16\xf3\x87\xe6\x90M\xb6\x91Mg(\xe6s\xa0@\x95U\xc7-\xaa\xc0``\xc0^\xa4\xf3\xa8\x01\x0eg\x1al\xc0\x95\a\x8e\xf2\xf9\xb5\x98G=\xbdx\xa9\xc4\x198\xb7\xde3\xec\xdb\v9\x01\xba\x8e\x8eaz\x00\x10\t8\xe1\xccS\x8ez\x8a\xf2 \xc9>\xc9e:\x8f̧R\xdc\xfd\x17\u05ee\xf5\xc8&\xbd\x06g3\xa6ejP\xf6\x92\xc2\nk\xedG\x01\xfc\x8d\xf7\x1e\xe1\xc1\x02v\xde\xd6\x1e\x14\xd5\v/唔\x9d\x04\x17lb\xbc\x98qX\x00\v\xf0<\xfd>;\x95\x91\x91\x91jSY\x04\xe5\xbcg)c\xecE\x1cU\xc6\xc7N+\xef\x1c!)OޗO\xfd\x93B`\n\x03\x9b\x1bH\xb3\xdc\a\xe3'\a\xbe\x91\xder\x1aώ\x9c\r+\x1b66^\xbc yA\x14E\x91\\\xf0\x89\x17\xad.\x00N\x14Bpl\x84\x95T\x8fT\xb1\x95\xd4\xe1i\xc0\xa1\xdfc\x18n\x10\xd9\x1eװ\x80\xfa\xa6\xb2^p\xaeʘ\xb3k\x0e\x98FFFV\xa7\x06BN\x8d\xa3e}OD\xf7l\x01\xf9|\x0e?_:\x97\xf6\x91\x16\xb2\xb16\xe6\x0f\xcea\xee\xe0,\x9a\xe3\xf3Ȧ3\x84V@\xd1ʑ\xb5V\xa7\xf6ˁ\v\xb7\xbb\xc7\xd8<\xc3k\x8bes\x9cY\xad\x948\vџF\xa3\x01\xa0\xbbF\x94\x17\xb6\x0fq\xf1Z\xf5#\xb9(9e\xc5L\xf5I-i&|\xfeZ܍ș\x1b7\xac\xf4\x1a{\x8c\na{V\x8bƖ\xe4@\xf6n\xdd)!\x847\x1bc\xbed\x8c\x81\x1f\xcf!\a<\xd0\xee\b\xd5\xd8\x05\x9eM'Y\x8d;GȜA\xe8\x80┹\xc6<\xba0\x86N\f\xb7m6\x1a\x8dZ\xe4\xd4\x11«Ͽ\xf9\xe2g-e\x9c1\xc50P\x1c\xf5\xaaB\xeb\xc40\xd4ƛ!5r\x8e\x9d\xec \xc8\x18\x93\xc7i>+\fgi\f\x11q\x8d$\x8e\xfc:\xe3J\x93$Y7Pf\x17\xa1\v?y\x893Ɯ\x13+/G\xa2\xaa?l@\x18\xd3\xe7\xc5\xcb\x11\xffJ\x89\xe1G\xa0\xbe\xb91\x8e\x96\xd9q\xf7ʮ\x192\\\rh\x88\xa1I\xbe\x17\xbf\xcf|\xb1\x11t\xd6\xc1\x19\x87\xd0\x0e\xf0\xf3\x05\xf2\xe9\f\xc5T\x81bbu\x0eS\xe4\x00G#\xfe؆\xe8\xda\xc9\xf3\xbcּ\xc3uV\xb6\x13ι\xe5\xefD\xefȂO\xa7V\x87\xa4\xc1\xae\xae-.8+\xcf|\xd8j\xa4+/Y\x16CK\xa4K\xb7_a\xa6&'\x9f391\x81Ç\x0ea~n\x0e333(\xf2\xbc\x82&\xd9I\xc7\xd9y\f\xc7q\xc0\x04\x00\xdf\xfb\xe1\xf7\x1b\xfc\xf9%k\xef\xfem\xbb[\x00^!\"ۀN\xbb\xdfc\x1e\xc5\xfd\x19̡:$\xa2\x91\xa02\x16\v\x9b\x17\x1f+<\xb0\xf0H\xee\x1a\xd3\x14e\xe8\xc3{\x18\xfbgat\xee\xf1\U000a5393\x89\xa3ZΜbG\xc7\xe3e\xc3\xc5ІFY\x83&\x99\f\xe3f\x16\xd5.\u007f\x97\xdb\xf2q\x9b\x85@\xbcTY\x92\xf2˵\xa3^\x06N\xc7\xd0\xf9\xfck\x06\xcepo\xba4I\x92\x93t\xd7<\a\x14ʏ\x12g\x1b,\xe7\xd8\xc8\xc7E\xf5\xe5\x92\xde'\x9e_\xbe_\xbc!.\x867\x80\x85'\x1e\x0f\x02^\x8bI\xf5\x8d\x8356|\xbc\x0e\xd9\xd9\xc500끈\x9c0pFK:\x91\xa3\xe08\xa3\u0ff9\xc1&v:\xfa7\xb0\xb2\xa3\xe7u\xec|\x12\x82\x06~1z\x12C\xf6q\xd6\x11\xc9\xfeu\xcbfj\tT\x14Ņ\"\xf2Dͼ\xb3,Cs~\x1eSSS\x98\x9d\x99\xc1\xd8\xe1\xc382>\x8eɉ\t\xcc\xce\xceb~n\x0eEQ\xa0\xd9lւ\xae<\xcfk\xe7\xcei\x82\x90\xa6i\xed\x99D˒\xf4ޭ;\x8b\xfd\xdbv_-\"\xaf\xb7\xd6\xfe\x87\n\xabhf0\x0f\v\xfc\x039\xfc\xfd9l\xa8\xd71X\x91ِr\xa6\x12\x17Ҹ\x10\ft#A5 \xaa@\x1cUq\x1a\xdfQ\xc8\x159\x10\x8e\xe8\xe2\xe3\xeacL\xbc\x97\x12\xf5ʞ\x06\x8d}\x87\x10\x1e\xf3\x99\x87\xf5\x16\xd2\n%\xb6=\x9d\x97G\xc7Lz\x98)\x00\xd3\x02?Y@fˍn&\x03\xac\xb7pp@\xe8>|\x86\x9dKG\xa1~\xfe\x82O\xbch\xd5wB\x02xS\x9c]\x02\xa8a\xe3:\aZ\xf8댽\xf6Y\x9d\xafA9\x0f\xa0\v\xa1\xf1^\t\x86\xc7\xd4\xe8p֣|\xa9\xae0$º\xbbZ\x14;X\xa0kp9\xabg'\xc2\xfcFY\xcb\x13V\x87G9Me\xd2\v6\xd2\xd7t.\xb9\xbdW\x03\x06v\xd2+m;f;\xc4\xf8\u007f\x92$\xb5\xfa\a\a\x85@7X\xe1Ca9\x90\t!\xbc\xf6\xd2\xedW\f\xa4+\xf4h\x94\xa6\xe9\x9bX\xdf8 g4$\xcb2\xb4\x9aM\xcc\xcc\xcc\xe0\xc8\xf8x\xb9a\xf2\xd0!\x1c\x19\x1f\xc7\xf4\xf44\xb2v\x1b\xadV\xab\xaa\xfb\x85Pn\xce,\x8a\xe21\xbeߊ\xf2\xe7\xfd\xdbv\u007fZD\x9e/\"\xbf\x0e\xe0!\x11\xe9n\xf5\xb7\x06\xf9\x816\xe4@';9\u0099Fɐb\x8al08\x8ac\\;\x8e8\xb83\x80\x8d\vGv\x84\x83\xbfx%㌍\x13\xc3Sl\xac\xf4\xe9i\x1c\xbd1>\x0ft1\xdfA\xb7\xf1J\x90\x878\xb5\x8fa \xef=\x10\x00x\xa0h\x16\xb0\x99A{\xb2\x8d0㑍\xb7\xe1'\n`J\x90\x1fɑOd\xc8&ې\xa6@Z\x01E\xabx\x0e\x02~q\xa0\fGtѭ\x1b_\v\xe0\xe7\xf4\u007f]\xc0\xfa\xc3\x0e\x97\xc7\xd5k\x1f\x8b\xca;\xcejWB1$\xc8-\x9d@\xf78l\x8d\x94\xf9\xf3l\xa8\xd9a\xacF\xf6\xc1\x0e\x8a\xd7\x15\x1bE\x86z\xb8\xce\xc0\xfcr\xf6\xd7\xe1\u007fU\x1cH>\xd6~\xc2\xfccs\xc8&\xda\bs\x1e\xf9\\\x0e\xdf.\x1fs\xcb<\xb2\x1d\x88\xf7{0\x14\xee\x9cC\xbb\xdd^v}\x89\xf7\xf4\xe8\xf8\xf9^|\xbfx\x1dǎCe\xd7y\xb4\xc2I\x00\u07b9L1\xf5E\x9b\xee\xbc\xfce\"\xf2\xeb\x9a1)1$\xad\xfcs\xf6ę\xaa\xf7\xber,\xd3SS\x98\x9c\x98\xc0\xf8\xd8\x18\xa6&'199\xe9\xf7o\xdb];*j\xc5\x00\xec\xbe\xebw\xe5{\xb7\xee\xfc\u007f\x01<\xcb9\xb7\xd9Z\xbbMD\xbeÆ\f\x00d\xae,\xbc\xe3\xa1\x009\x10\x80\xc3u\x83,\"\x95\x01fH\x8a\a\x1eGM\xecT8\xad\x04\x16\x1c\x1ex\xfa\xf97_\xbc\xa2\xb1*.ʩ\xa9*v\xdc\x19\xa2\xbcr\xe6\x15GÃ\xce@\xec\xa3v\x0f\xf3Î\x8e\x9d\x18/6}\xaf2\xc2>@\x8a\xb2\r\xd9\xe4\x06\xa6\r\x143\x05\xcc\x1cP\x1c\xc9\xff༛֯\n\x8cqѭ\x1bO\x17\x91\xbf`H'\x863c\xfe9{U\xa3\xa2\xef\U00061703\x82\x89bh\x853\x0f\xe5M\x0f \x04\xba\xf5\x9a\xb8~\xc7\x1d0\xb1a\x1a\x041\xb6\xad2T\x1eb9*O\xfa\xbd\xb8) 2,'\xaf\xbbe\xc3\xe8 y]wˆ5EQ\x9cd\xa4l1\xcef3dSm\xe4\x93\x19\x9a\x87\xe7\xd1<8\x8f\xd9Gg\x90O\xe5\xf0\xb3\x05\x8a\xb9\x02y3G\xc8}\xf9\xe4@\x82`\x81\xfa\xeeug\x977\xe7\\'d\x1d\xe2yd\x1d\xe4c\xf39+\xe6\fXO@\xf6\xde\xffΦ;/_Q=v1\xdax\xc7\xe6SP>\xe6{Q\xbb\x19\xa3;<\x8e8[6\xc6T\xa7\t\x03\xe5>\xa2|<[\xf0L\xa6\x81U\xf0\xf6]\xbf+߳eǝ\xfb\xae\xdfu\xf5ޭ;\x9f\x17Bx\xb6\x88\xfcN\x9e\xe7\xff*\"\x99\x1a6\xdd9\xea\xe7r\xd8G\x80\xe2\xfe\fr\xa8\x9c\xa4\"\xefzM>Q\x92'\x903\x8f\xb8_;\xfe\xad\x023\xe5\vˎ\xa0xQ\xa9B1/\x1a\x850N\x1a\x17\xd6t\xb2\xe2\xe7t\f\x8cB8\xc8\xd1e\\\xbc\x8fSj5\xac\fǰ\xb1\x89\x15\xceZ{\x16\x80\x8f\x9dw\xd3\xfa\x81wd\x85\x10n\xf6\xde?\x89!\"\x96\x8f\xf2\xc1\x9b\xf9hn\xab\xcf\xc6N\xb3W\xedd\x05<ֺYX\xb6\x8a\x97+\xef\n\xb9\xe9\xc2d8\x86\xb1u\xe5\u007f\x90$\"\xf3@\xf7\xd9;\xfa\xb7\xdeKaJ\xbd\xaf\x8eI\x1d\f\xff\xa8\xdeҹb?:`^\x9f\xc3\xd92Н\xebJ\xf7\x02\x10\xdaefR\xcc\xe6(\xa6r\xcc\x1f\x9a\xc7\xcc#\xd3\xf0\x93\x05\xf2\xc9\x1c\xf9t\x86|6C\xdȇ5\xdb00(\x1e+\xe6\x96\xcb\x17;ZF9:<\xd7`ʸv\xc4-\xb3\xec\x9c;\xaf\x8f\x00\xf8\xf4\xc6;6\x9f\xbc\\ގB7\x02x:;\x00\xa5^\x0e\x90\xd7P\x1c\x98+qW\xab\x88\xc0~\xcf>\x14\xdftuv\a\x01\xd8w\xfd\xae\xfb\xf6]\xbf\xeb\x83\u07fea\xcfO\x88ȏ$I\xf2\xfa\x10\xc2G\x00Ԟa\x1eB\x00Z\x01\xe6a\x81\xb1\xf5\xa3M8\xf5\xe6\xc9\xe0\xbf\xd5\x10\xc6\x1d-<ᝅSۂ\xbf\x14\xe2\b\x8e\r\x03\xdfG?\x17\x17\xcf\xd8\x11\xea\xff\xaa\x98\x83\xa4\x10\xc2A\x9dh\xde%\xcdNE\u007f\xf3\x93\xe6:\xdf]\xb0\xf9\x89#)2\xd0oH\x92d\xa0i\xf8\xb9\x1f\xbd\xe8\x17\xd0\xc2\x1bLV\x9enkBy\x8e\x91f{@]ᕗ\xaa\xeeF\xc5\xf6xN8KY)\xa9>\xaa\xf1e\xdeb#\xc3\xd90\xe3\xf9\fu\xf2\x02\x1e$\xb9\xfdv\xca\xd9:\xec\xc7NB\x1d\x02\xaf#\xae)r\r\x80\u007f:\xe3\xbbz\x90\xbc&Ir5\xf3\xc5N66̱\x93K\xd3\x14Y+\x83\xf1@{\xa6\x8d0\x1f\x90M\xb4\x91\x1d\xc90\u007fp\x0e\xd9\xeeֲ\x0e\x19c\x98/\x0e\xf8b\x84A\xa9W\r6\xde\xd3Bk\xf0\xdc$In\xbb\xe4\xf6\x97\x0e,\x9b\xbf\xe4\xf6\x97\xbe\x0e\xc0\xafp\x90˙n\x9c\xf1\xc6g\xc5ŁV\\;3\xc6\xc0:\x87\xc9\xc7\xc6\x0e\xc4\xf7^2\x10\u007f\xee\x9f_\xf4\xca$I\xee\xd8\xf9\xe6o\xf6}6R\a7\xfbt\xe7\a\xe7^\xb3\xee\tƘ\x8d\xde\xfb˒$y\x9d\xf7\xfe\xb9\"\x02\x1c\xf0\bg\x99\xea$M\xc6\x1fc\\6\xa6\xf8\x8c\x1a\x9e\xf0\x8e\x82.\xfb\xd4:\x9d\x10\x8e<c\x85\x89a\x02\xfd[kB:\x1e5փ&k\xed\x0e3e2\x9c\x8a\x86\xf2\xcc\x066\xe6\x81\xf1\xf18\xab\x02\xba\x11,+Qg\x1e\xdew\xdeM\xebO\xb7\xd6^\xbd뷾\xb5\xec\n\xf0\xf97_lD䷑\xe3O\xf3vV\x19\x8c`|Ն\xe9\xd2\x04A|\xf9\xa02+\b\xae<\xe2\xdf\xd8r\xd3[\x92&\xb5c\xca5\x98Ь`A4\xbb\x02\xe2\xb9V\x83\x1b\xb7\x12\xc75<\xa0\xbe\x18U/\x18b\x1b\xb4\x13i\xb7\x9b\xe2B\xa3\x06\x9fr\xe3\x86\x1aH\x005\xe3\x1cgѽ\xeatƘ_\\wˆ\x8f\xec\xfc\xb9o\xac\xf8T\xe6\xf5\xb7m\xba\xb4(\x8a_\xe0\x00\x85\r\x1d\x1f\xb1\xa2\xf0\xa0Ω\xca\xdd\xda\xee\x93\x17\xeb\x8c\x02\xed\xac\xb9\xac\xb4\x93\x83*\xad\x0fp \xabA\x00g\xbd\xca3\x9f\x04\xc1z\xa9\xef\xbb\xce\x06\xea$I~\xc2\x18\xb3{ӝ\x97\xff\xca\xd7_z\xfb\xf6\xe5\xf0\xa9\xb4\xe9\xce\xcb\u007f\xc5\x18\xf3\x11`\xe1\x9e\x0f\x9d\xdf4M\xab\xccW\xf7\xa9\xf0V\a\x0ef\xd8~\xb1\xfd5\xe5{ߌ\xef\xbf$\xed=\xef\xa6\xf5\xe7\xa4i\xfa\x99\x10\xc2\xde\xf3o\xbe\xf8\x95\xcb\x1d\xf4ޭ;\x8f\xecٲ\xe3\x9f\xf6]\xbf\xeb\x9dY\x96=\xdfZ\xfb\xf2\x10\xc2g\xe34\x91\r\\\xdc\xeb\xcd\x11T\xac\x80\x1a\x01\x00\xd4\x1a\xd8²\x1e\xbf\n\xd4\x1fU\xa9\xff\xf7\xe2A'\x86\x95\x8b\x1f\x13\x19\xa7\x95\x83\xa4=[v\xcc˴\xbfS(\xfa\xe1HJ\xf9稜\v\xfe\xb1\xbc\x19\xde\xe2h\xbbCo\x01\xf0\xf9\xf3nZ\xbf,H㼛\xd6?\x19\xc0nj1\x1f\x14\x11\xdb\x03r\x04\x04(\xda\xe5\x0ei\xdf,\xca\r\x98\xb3\x012\x13\xaa\a\x94\xf9#\x05\u0094\x87\xcc\x06\x98\x96\x81\xcbm\xb9\xf1\xad]\x94{\x19\xc2\xc2ξ\xe5\x12w\x01\xa9|\xe2\x8e:ΞU\xa6q\xb1\x9d\x17n\fg\r\x88\xda\xd6\xd4\v\xbfj\xd8b؏\x1b;\x94\xef\xf8aDq4j\xad\xfd\xe0\xba[6\xacH\xa0\xebo\xdb\xe4\xbc\xf7\x1fdhX\xafϧ\x0f\xb0\xc1\xe6\xec(曑\bc\f$\b\xac\xb5\xed\xe5\xf0\xd6>\xdcB6\xd1.\x1bL\x9a\x1e\xed\xd96\xa4\x10xr\xac\x1c\x10\xc4p\xa5ʕ\x03Eu.z\xf2xǎ\x9d#\"w^\xba\xfd\x8a\x9b.\xb9\xfd\xa5'.\x95\xcf\x17\u007f\xe5\xe5\xa7m\xbcc\xf3M\"\xf2W\"\x92r&\xc7땳O\x00U݆\xb3<\x955\xeb)C\xde\xd6Z\xe0\xbb\x00\x80\x05DZ,I\x11\x8c1\xef\xf1\xde'\x00\x9e\x15B\xf8\xfc\xf97_\xfc\x0f\x17|\xe8\x85g-u\xf0L\u07fea\x8f\xf0y>8\x00\x00 \x00IDAT\xec\xfe\xc0\xbd_ܿm\xf7kD䆀n\xeb.G\xcf\xdaN\x16\xc3\x031\xb6\xa7\x93\xcb\xfbO$\bp8,\xbb\x06»\x9f\xe3\xc9\x00\xba\x8a\x1c\xe3\xf7<\x19\xec\x84xq\x0f\x98\xbe\xe0h\x87|,/Κ\xd8\xd11\xf4\xa6N/\xc6o\xe3\xb1x\xef\xff\x8b\xb5v\xff\xf97_\xfc\xe1\xf3o\xbe\xf8\xc7\xfaa\uef1b\xd6?\xed\xbc\x9b\xd6\xff\x91\x88\xdc\a\xe0\x97\xf5Z5\xc7AĐ\x1bGDJ\xbe\xf0\x80/\xa1/=JF\xe6\x02d:\xa08\x92#\x1c\xf1\xf0\x13\x83\xdd\x04\xb7\b,Q\x19>\x9e{\x9dg\xde\\\xa6\xf5\x04.\xbe\x0e\x98\xc6A\xebC\r/w3q\x96\xa1\xbc\xc6{)\x9cs\v\xb2\xd7\xcew\xd6[k?\xba\xee\x96\r\xcb\xdaY}ѭ\x1bO\x11\x91\x8f\x00\xb8\x88\xf51Θk\xf0I\x04\xc1\xea\xfbj\x90\x81n\xc6\xd0\xf9\x91\x10\xc2\xf8\xb2\xa4'\x82\xa2U\xc0\x16\x06\xed\xa96¬G>\x91\xa1u\xa8\x85֡&\xf2\x89\f\xc5L\x81|&+\xbb\x19ea\x81Z[~9\x88c\x98\x98m\x81\x88\\i\xadݽ\xe1K/\xf9\xa9\x8dwl>f\x93¦;/?}×^\xf2\xb6,\xcb\xee3\xc6\\\xc9\xeb\x9231Θt\r\xe9\xfdU\xee\xf1A\x9a1\x9c\xa8r\xf5!\xa0\xf5\xe0\xecA\xe7\xdcΘ\x9f\xbe!\xac\r[.{^6\x99\xfd78\x03\x9bZ\x04\x13 V^/V^\xb1\xee\xe6\x17\xfe\xa5\x97\xf0\xc1=\xbf}\xcf}\xfd^\xaf\x17\xc9\xd3̻\x9c\xb1o\x01`5\x85\xe6\xc8C\x15]\x1d\x8a\x0eP\x85\xa4\n\xc6\x13\x1aBy\xa2l\x1e\x96\u007f\x9e\x05\x9f!\x15G\x9fqD\x14\xd7g\x80z-\x821\xcaA\x93\x88|\xc1\x1f\xf17ʉ\x82$Mj\xb2`c\xa0<\xc70\fw\x9d(1\xfe\xcc\n\xd9\x19c\x12Bx\x931\xe6M\xe7\xdf|\xf1\xf7E\xe4\x9fD\xe4\xbbƘ\x83\x00\x0e;\xe7N\xf1ޟ\x19Bx\xa6\xb5\xf6\x95\xd6ڋ\xd8\x11\xc7Ƙ\xc6Q\x8b~\xd9Ȱ\xd3\xebe\xf8\xf8=\x00\xd5\xe1\x81\x03\x90mŧ:g\x95\xabs\xae:\x91\x17@\r\xcaP~\xf4\xb7f\x1d\f\x83\r\x92\xf6n\xdd\xe9/\xbauc\xab(\x8aQ2\xa8\v!\tc*X\x88uV?\xcb\x01\b\xd0}(Z\xe7\xb5_3\xc6\xfc\xe4\xba[6\xfc.\x80\xdbv\xfe\xdc7\x8e)\xe0\xf5\xb7m2y\x9e\xbf\x01\xc0\x9f\x8a\xc8\x19q@\x15C\xaa\xbc\x9680\xe3\xd6y\xbe\x06\xd7q\xac\xb5\xad\xfd\xdbv\xaf\xc83svY\x9b\xf7̗\x19\xaes\b!\xef\"\x0f\x89\x83K\x1d<\x02\\b\x01\a\xa4#\r\x04t\x1fn\x15?\x93\x03\xa8 \xb3g&I\xf2)c\xcc̥ۯ\xf8'\x11\xf9\xa6\xb5\xf6\x87\x00\x1e\x15\x91Qc̙\"rV\x9e\xe7\xff\xc5{\xbf\xc9Z[\xcb\xda㵩:\xc9\xe3`}\xe4\xda\x12ˎ?˿C\x1e\x90\xfb\xfc\xf3\xbd\xce\xc4\xebۊ\x85\xd9\xf0\x87\xa3ɨ\x95\\ MA\x92\x8ch\x14\xb5\xc6Z\xfb?\xf2\"\xff\uf5fc\xf7ş\x0e\b\u007f\x12L\xf8꿿\xeb\xae%\xad\xda\v>\xf4B\a\xe0oB\b\x95%\x89\xa3$\x8e\x8cc%\x8b#\xa68\xc5\xecLȲ(Ɛ\xb9\b\x1ec\x9e<I\xfaY\xfd_\r^\xdc\xd2;(\n!|\xc7N\xe1@rZz\x96\x1a)6v1\x14\xa5\x0eC\xa3%퐋\vk\x9c\xad\xa8\xe2qM\xa83O?j\x8c\xf9]\xe5\x85\xe1\x1e\x8ezx1\xaa\\\xa2豒\x9d\xfe\xcf|\xebw\xf9\xd4`\x86\x87b\x87\xc3\xe3]\x91l'=lj\x01ga\xad\x81\x97\x00$\x80\xebQ@g\xf91O\xbc\xd0٨\x0f\x9a\xbc\xf7\xe3\xd6ڧ\xea\xb5;\xb8{\xed\x9e\xdcz\xca\xd1'g\xff\\\xecg\xbe;\x06\xfd\fc\xcc'\xbd\xf7\xbf\xb9\xee\x96\r\xb7\x1bc\xbe/\"\xdf3\xc6|\u007f\xc7\x1b\uf7bd\xe8֍'\x1ac~\xd4{\xff\x1cc̏\x86\x10.7\xc6l\xd6{\xc55D6|\xaa\x13*O\xe6K\r\x9d\xea\x8566Ԑ\x81\xe0\xc7\x16\x15N\x1f\xc4\xfc\x01u8\x87y\xe2\x9aW\xf0\x01\xbe(\xd7v\xde*3^o;\xeb\x03\x021\x82\x90\x06xx\xa4\x8d\x04&\xb10\xce H\xad\xf3\xf1\xa4\x10\xc2\x1b\x9dso\xe4\xf1\xa8\x81\xd7\xe3U\"\xe7S\xf1\xa4Y-;\x8cx-\xc75$F\x18b\xe82I\x12\x04\x11د\x06\x84\x10z\x9e&ܗ\x03y\xd1\xef_\xba\x0e\xc0\xcf\xf0\xc2\xd4\x01U-\x820Ʒ\xfd\xeb\x9ds\xaf\x17/\xdf\xd9\xf0\x9e˾`\x8c\xf9W\x00_\xbe\xfb\x0f\xberԖ\xba\xf5\xd7m\\\x1f\xa6\xc3\x1f\xc2\xe1U\xd6Y\x04xX:\xb4\x90暑S\x0f\xcb\x18\x1f\x1b\xbfH\x01g\xf7nٱ\xec\xd3\xe0\xb8\xe0\xc9J\xc5Q3\xa7\xde1\xa6ˑ\x96v\xf1h\x8b\xdc i\xff\xb6\xddr\xfe;.\xfaB1V\xfc\x06N\xc1\x02#\xb5\x18\\\xc2P\x92.\xde\xd8бC\xd2\xd7c|\x15\xa8\x9f\x14\xa0\xbf\x81n\x16\xc6\xf5\x19\xfd\xbbW\xe19\xae\xcb\xc4Q;\x1f)\xc2s\x12;\xf7AE\xf8\x12\x04\xbe\xe5\x01x\x92Uw_\x8a\x982\n\r\xf00\xceBl\x80q\x16\x05\n\xb8\xc4\xc1&ݬ\x993\xd0Հ2\xed\x03\xf6\xfe\xf0\x8c\xf0Tv\x16j\xa0\x15n〆\xe7^\x83.5\xcaqWd\x1cH\x18c6\x03\xd8̺v\xe1'/\x99,\x8a\xe2\xd4\x1eEx\x00\xa89-\x86V\xf5>\xfa;F\x12\x80\xfazb{\xc0\x81\x83\xfd\x81\xbd\u007f\xb9\xb2\xd35\nt7\x06\xc6\x067v\x82\xfa:\x9f`\xab:\\\xe9m\xee\x11\xf2N'\xd9|\xf7Ad!\x04\xa4\xa3)\x8c3\xf0\bH\x1b\t\nS \x19IJ\xc7#\v\xeb\x1a,k\x9e\x0f\xcd(\xf9s\x1c\xe8q\xf0˶\x8b\x03:ՉF\xa3Q\xca7782s\xa40\xc6|\xb1\x97\xbc\xfa\xcd@\xfe\x98a\x1bU\xb28:UeK\x92\xe4\xb9!\x84\xe7\x86\x10~\xd79\x97\xbd\xf0ݛ\xbei\xad= \"\a\x9ds\a\x8b\xa2\x18\xb3֞\x0e\xe0lk텡\x156\x89ԟ5\x1dB@\x82Nˣ\t\x80\x03<<\xc4\x02p\x80\x98\x001\x028 \b\xe0\x8d\x87I\xba\xe7T\xd5`\x83CŲ\x15\n\xa8\x1f[\x10C=\xb1b1\xf6\xcc\x11@<\xe9\xab\x11yvx\xfdK\xcc\xc8o$\xa7\xa7\x00\xea'$\xc7\xf7d\xe3\xcb\xddX\xbd\"\xf9\xaa@)\xd2SƬ\xc8\xfa\x1a\x8f\x9d\xef\xc1\x0e\x9e\x15We\xc9\vV\xdfk4\x1a\xb5\xd7\xf4\xbb1\xec\x16\xd7vbG\xbf\\\x12\x91jsZ\b\xa12\xb2\xd5\\\a\x81\x0f\x9dlS4\x98\xe8\xe8\x88\x05\x8a\x90\x03\xd6\xc0\xa5\x160@&\x19\x92\xd4\xc1%\x83\xef\xc8\xcb'[\x0f\xa5f\x14b\xba\x19\x9bs\xf5\x93\x12\xd8\xf8\xc6\x01\x03\xeb/\xeb\fG\xa9\xac+*\x1f\x95\xb7\xf7\xfeT\xb5\x17\xfcY\xce\xd2hs]-\x18`}Pb\xa8P\x1d\xa1\xf2\xa2\x81\b\x8f\xb351\xb7`\xbfB\xbfTf\xe1\xe9\xa2\xf5L\xe5C\x8dql\x17\xf5\xffxm\xa91\xef\xf5DâݭIy[\x8e\xad--\xc0\x94\xfaR8\x03\xe3,\x8c\x03\x92F\nq\x02\xeb\xba\xe8\x86\xeawܖ\xab\xb2$\x94\xa0\x1a'\xdb/M\x048\xd8j\xb7\xdbp.\x81\xdfބs\xee\x13{\xb7\xee\x9c\xea%\xafc:\x90\x17\xbe{\xd3%I\x92\xfc$\xf7C\xb32pڤ\xccs\vh\b\xa1a\xad\xbd\x8c\xa3\xdbZ\x8aDƙ=\xbbR\x15\x15\xb5\nXðQ\xb7\x1d1\xa5\xc92\x89\xe9\xd4g\x00\xe3\f\x8c\x13\xe4\xb3\xed\a\x8f5Σ\x91\x1a4\xe5\x97\xc7\xc7FT\v\x94\xaa(\x1a]\xe9\x18X\xa1V#\xf2\x04\x80\xbd[w\xfe\xfb\v\xae\xbe\u0cd80\xafƩ\xa8);\x13\x1b\x006\xe8\xfa\x9eF!\xec\x04b\x8c\x14\xa8\xb7\xfd\xc5i1Gg\xfcY\xbd\aG>\xfa\x9a*t-\xa2\xb4\xdd\xe38\x18\xdb\xe5\x8cHy\xe3\xac(vV+!\xe7\x1c\x82\xafg\x96:&\xa0[?\xd0q\x14E\x81\xd1\xd1\xd1\xea\xa1L\xd6Z\x84\xc2\xc3\x19[^\a\x80o{\x142\xf0c\xfd!\"\xf7\xc0\xe0\xe7 \v\x8d\xb2\xca_\x8d1G\xdbl09{\x8c\xb3X\x86T؈Ŷ!\x0e,8\xf3\xe8\x95\xe1\xe8w\x98?\xbe'G㬓Zs\xa2\xcc\xea\x9e\xe5ʎ\xb3&\xbe&ý\xac뜙s\r\x873:\xfd;F)z9a\x9e\xa3\x10\x02B\x1e`\n\x83\xf2\x1c\" \vYy?\t\xb0\xce\xc25\x1cr\b\\\xc3A \xb0I\t\x99\xc5\xed\xed\xb5\x9a\x06͡f\x1al\xc3+\x9b\x96\x19L\xb5f\xbd\xb5\xf6\x8f\x17\x93\xd71C3k\xed{Y`ʈ\x0eT\x15\x81\xa3s\xa0\xbe\xa0x\xa1\xeb{l\x14T\x88q\x9a\xa6\x8a\xcfu\x04\xeed`R\x0fo\xc5\xc2y\a\xd3\x02\\\xcb\xc2\xcd'p\xce-\xe8_^\n)\x9f\\\x00\xd5\xf1\xb0\x11V>\xf8)^|\xc0\x1eCm\x83.\x9e2\x89\xc8\x1f\xfa\xa9\x1c\x82n1\x94\x17\xa3\xf2\x1dgNʿ\xf2\xcb;Qkx/A\b\xb1a\xe7\xe7\xc3p\xe6\xd5\xeb\x18{\xce0\x18Έ\x17\x1a\a\x1d:\x0e&\xd6\v\xe5E\xf9\x89\x1f\x02\xb5RR\xdd\xe5\b36~*\a\xe5[\xff\xe6vZ\x1d\xdf \xb2\xa3\x1e<~\xc6>\xb2\xf0\xa1kʫ\xea\x04P?[Nǧs\b,\xec:dX&\x86\x1d\xd9x2)\x0f\xfc\\y^\xd3\xfa]\xcepb{\xc1\xf2U\bS\xef\xc5|\xd9G,\xac\xb5\x9fY\xae\xecbx*ַx=\xb3\xdc\xf85\xb5\x15\xea8؉\xc7NV\xdf\xe7 \x9b3\xc3\xf8yC\xde{\x14y\x81P\x04\x14\xcd\x02\xf9lypj6\xd1F{\xac\x85\xe2H\x8e\xb9\x83\xb3\b\xb3\x1e\xed\xa96\x8a\xf9\x02E+G\x91uO\xcaУ\x9e\x18\x1eֵ\xa3\xf7mm\x9f\x05\x80\x8f\xefݺ\xf3?\x16\x93\xd7Q\xb5w\xc3{.\xdbl\xad\xbd\"\xae\xe4\xebb\xe5\xcd):\xe9\xbc\x03S\x05\xd6kW&O\x18OL/\x03\xc3)\xb8\x92\x1a\x9a\x18\x02\xd1\xebi\xed$\xcf2\x88\xc8'\x8e6\xcec\xd1\xda\xc3k\xb0fl\x14k'\xd7btr\x04\x8d\xa9\x14#s\r\xb8Y\v;o\x81& m\x81\r\xb6l\x19F]QbH\x85\x17\xf0j\xd0\xfem\xbb\xef\x11\x91\xcf\xc8\x01\x0f\xdb1\xa6|\x14=\x1b|v,\x8bAVq\xe0\xc0?\xfa:?\xc0\x86\r\x81ރ#1\xde)\xcfN\x82#L\xe5\x89\x1d\xad~_\x8d\x9e\xf2\xc9\xc1\x87\xf2\x91e\x19\x8c\xe9>\xdf{\xa5\xc4\xfc\xc5\xc1T\x8c\xe3\xc7\xd9\x19gFld{\x19\xa8A\xd0ޭ;\xbf\xdf:8\xf7\x1d\xdb4\b\xf3\x01h\v\x8af\x01\x13\fB\x11*\xb9\xf0\xbdu\\\x9ca\xc7\x19%\xaf\xdb8#\x89\xb3\t\xd6\x1d\xdd[\xa2k6~\xa6\x0e\x80Zdφ\x92\xaf\xc5k\x9d;\xd88\vn?6\xbf\u007fϖ\x1d\xcb\xee\x06\x8d\xb3ט\xf4\xbc3\x9dw5\xc0l\x88\xd9^\xc5\xebF\xaf\xcd\u05cf\x83\xed\xd8)q0\xa2\xefŏ\x15\xa8ɦ\xf0Hl\x82|>/\xe7~&G6\x91\xa1\x98\xc8\xd1|l\x1eّ\f\xf9dV=\x82[\U00080b15Uk'I\x13\xf8oz4\xb3f\x91\xa6\xe9{\x8f&\xafEW\xd6ſ\xb7\xd1\x00xo\x8c\x8d\xa9\x90\x19\xef\xe3\xc8O\a\u008b\x84\x8d(/\x1a62z\x0f6\xb2qt\x1cu\xfd,\nϨ C\b\xc8|v\xf7ޭ;W\xd6^,R\xf6{\xe7\x02\xdb\xf1\xb9\x0e\xf5{\xabC\xb5֖\xbb\xa5\x1d V \xb6\xacӔ\u007f\x97\xc5X8,\xfb\xb0\xb7~\xc9\x18\xf3\x87\xde\xfb\xd74\xc6S\x14\xa7\x140\xb6\x1b\t\xf3B\x15\x91\x1aT\x15\xa7\xbb\xea\x1cTa\xe3\xc2y/(\x82\xb3KU\xfa\xf8H\xf6\xd8\b\xa8\xc3b}\xe2h\x94\x17\x95\xde\x17\xa8;\xa1ب\xf3\xfb+%k\xcb\x13\xa6\xd9Xq6\xa1{\x12\xe2\x05\xcf\x1d|\x1c\xf4\xb0\x0e\xaf\x06\x89\xc8g\xc2\xc1\xf0\\\u007fb\xb9c_B@&\xe5\xde:\xb1\x01\xdey$\xa9C\x11|\x19F\x1a\x81I,\\ja\x12\x8b\xbc\xc8k\x86\x89\xd7g\x9c9j\x10ɭ\xbe\xfa\x1d\xce>93\xe4,\x833\vޥ\xaf\xf2\x03\xea\x8faedB\xed\x10\x04p?p\xc8E\x96\x9d}(_\"\v\x9f\x8b\xae\xf3\x1d\xd7\x1d\xb8S\x8du[\xe5\xc2h\x03g6\xfay\xbdO\x04\xfb\xf3<\xd6\xe4ş\x89\xed/;\"\x86\xafj\xd7\x12 \xe4\xe5{y\xb3+k\xef=\xd2F\x8afh\xc2\x16\x06~<\x03\x80\x8f\xed\xba\ue7a3֏\x8f\x96\x81\xbc\xd2\x18\xb3\x89;_8\"P\xe2t7.ز\xa7\x8d#rV.V\x16\x8e\xd2\xf8\xbbl\xf0t\x02y\xe1\xc6F+\x04\x8f\xb9\xe6,D\xe4\xef\x8e&\x80~\x88\v\x82\xba\x10tҙ\x17] \x89up\xe2\xe0\n\x87$K`\xe7,\x92\xd9\x04\x8d\x99\x14kfG\xb1vz\rF\xc7G\x8eqו\xd1ޭ;\xef\xb5\xd6\xdeZ\xccd\xa5\x1c\xb1\xf0AA\xaa\xdc:\x0f\xbc\x10\xe2LP\xffgE\xe7\xefi\xe4\xda+\xe5g\x88\x01\xa8w\xb7pF\x1b;\r\xa0\xbb\xe8X\x87\xf4\xfb\x9c\xda3\xbeΙ\n/ƕ\x90\x8e\x93\xe5\u008b\x95\x9f\x15\xa1\xc4\xce#v\x8e\xfa\xb3Z\x99\xa81\xe632\xe3al\x8f\x83)\x05\x80\x17\x84,\xc0w\x8e\xf67-\x03\x99\t(&\n\xb4\x0f\xb5`g\f\xfcDQ>~y֗\x9dC\xad\x00\xe3\r\x10\xeagR\xf5\n\x06t.\x18B\xe4\x82y\x8d\x1ft\xb3\n>\x01X\xa3xv:\xb1a\xac\x82S\x03\xb4&琦\xe9\x8a\x1d\b\a\xc3qv\x1c\a\xb7\xdayů\xb1\xe3`\x9b\xc5Y\x1b\xc3\xe1\xf1\x1a\xe0u\x1a\xa3\x00,O\xd6{\xfd\x9f\x1d\\\xec\xfct\x0ez\xa1#Ɣ\xa7?8Xd;\x9b\xc8\xf3|\xca9w\xd4\xec\x03Xālx\xcfe\xd69\xf7^\x8e\xb2\x18\xd7慢=汧TA\xe9\xc0YQ\xd8\xd8s\xe4\xcaB\xd3\xcf\xf2k\x9c\xb61|\xa5\xc2\xd0G\xda\x1a\x18\x00\x06\"\xd2\xf2\xde\xdfv,!\x1c\x8bb\a\xa8cc\x05a\xe8\x85'\x87\x17/+\xc4 \xa2\xe2>\xe8M\x00\xee3\x8f\b\x82\x84\x1a\x8f\xf1\xc2\xe8U\x83\xe2\x80!\xee,Q\x99\xb0A\xe0E\xa7\xca\x1cC;\xec\f\x94\x18>a\x05\x8f\xe1\x04\xfd\x9b\x9f\x8b\xcdp\x98\xf2\xc0\x86Hy])1\xa4\xa7c\x89q\xedŢT\xfd\f\x1b\x89X\xe6\x83&\x11\xb9\xab(\x8a\xbb\xcd#\xdd\xe7\xef0\x84\xa4\xb2ֵȎYa\x10\v\v\xe4\x00\xda\xe5\xde/\xd3\x04\x8a\xc9\x1c\xed\xc3md\x87\xcag\xc8\xc8t@\x98\xf1@\x13\xf0\xf3\x05\xb2\xb9\xaclW\xf5\xd2s\xed\xab\x1daH\x93\xe7_\xd76Эϰ!Wb\xc8RB@~O\vƘ\xbb\x8a\xa2\xf8\xc6\n\xe5\x06`\xe1S\x1dy\x1ds\x16\xce\x01W\xaf`'\xaeip\x80ú\xa2\xf7\xe6\xac6\xb6\xab\xfa\x9b\x9dv\xbc>\xe3qp\x10\xae\xdfg\xfb\xac\xb2\xacjI;+\xc7\xf6\u007f\xefٲ\xe3\x98\xddl=\xb5\xd7\x18\xf3zc̅\xec0b\xe7\xc10\x16\x0f<N\xe7\xbc\xf7U\xf1\x8c\x17Oŀ\xedv/\xe9\xf5\x19\x06\xd0ϰAQ\xc18\xe7*\xa7\xa1<\x15E\x01\x81`\xbe5\a\x11y\xf7\xfem\xbb\x0f\x1dK\b\xc7\"n\xd3S\xa5V\x1e\u0600\xb2C\xe3蘣\x1a\x9d\xc8\xd5,\xa2+\xedݺs\x12\xc0O\x89H\xd3>\x02\xd8i\v7_fE\xa9O`r\x03+\v\xa3u\xee\xd0\xd1q\xeb\xbc)\xdc\xc5\v\x9f\x8d\xa0\xfe͆\x83\xbf\xaf\xf2P#Q\x93[\x90\xdaao\x1c\xa93n\xae\xfa\xa2\xf3͎\x8c\x17\xafF\xafqV\xb4\x12\xe2l\x82\xb3c\xd6M\x8e\xfc\xe2\xccK\xe5\xc1\x19\xfdj\xd0\xfem\xbb\x83s\xeeJH\bI֍\xe2\xf9\x98\r\xceF\x81z\xb3K\x9c\x1d\xb1a\xaft\xb7\xf3\x802\xc9\x04\xa1Y>J\xd96M\xf9\xd4˩\x80\xecP\x1b2%\xe5\xf3d\xa6s\xf89\x0f\x9b\x1b\x14\xcd\x02EVvU\xf6\x82\xb1yM\xb1\x8c\xd9\t\xb3\xa15\x8fX\b$\x88ȕ\xfb\xaeߵ┓\x03<\x86\xdf\xd8>)o\xbc\xe6\x95\x18\xb2U'\xc4\x01\b\a\xd6<nv(,\u007f\x0e̸\x01\x81O<\xe8\x95ų3\xd4\xf1\xf0Q\xfez\xffʞ}[\xe0C\x81$I\xb6\xecݺ\xf3\x1f\xfb\x91\xd5\x02\a\xb2\xf1\x0f\u007f\xdc\x19c\xfe\x98\x9d\x05G\xdd\xecEY\x01\xe3hC\aޫ=LI#\x12\x1e\xb8\xb5\xb6\xc2SY(q\x14\xc9\xc6<6\xea\x1d\xe7\xf1-\xe7ܟ\xf6#\x84c\x11\xc35\xbd\x1c \u007f\x8e\xfff\xde\xe3\boP\xd0ʱh\xef֝\xbb\xad\xb5\xbf\x99\xe79\xf2#m\xa43\t\xd2\xc9\x04\xa3S\xa3X;\xb5\x06k\xc6G\xb1\xf6\xf0\x1a\x9c0\xb1\x16k&G\x91N$h\xcc4\x90Υ%\xf4\xd6.;ڐ\x01V\xba2瀁#1\x00Uj\xcfN#>\xd6^\x17T\xa5܂\xaaư\xd8&K^\xc4@W\xe78\xdb\xe1\x05\xad:7\b\x98\x88\xa1\x848\xaac\x87\x17\xebx\x9cy\x03\xa8\x05L\xab\xa9\a{\xb6\xec\xb8\x17\xc0\x87\xfd\xa1\x1c2\xb30S\x8e\xf9S^bx\x85e\xa0\xf2䢷\xfep`Pe<Y\x0e\xc9\x05\xc8\x00i\x06ȼ\x94\x8fT>\x92\xa3}\xa8\x85|,\x83\x9f\xf4\xf0S\x05\x8a\xe9\x02aޣ\x98/\xbfc\x02`P\x87\xbc9\x90\fA`\x1e,\xf1z\x11\xf9\xd0\xfem\xbbw\xacTfq\xa0Ǚ\xa5\x8eKm\x94~\x9e\r2G\xf7\x9c\x91\xfa\x1ev\x92\xbf\xcb\xf0f/g\xa12\xd0\xcf\xeak\x1a\x8c\xf4\xea\xe4R=\xe5\xf5\xa2\x14\xa3\x11~G\x01\xdf\xca\x00\xe0Nc\xcc\xef\xf5+\xaf\x05\x0e\xa4(\x8a\xcbB\b\xcfc8\x81;\fb\x0f\xa9\x03fe\x8a!(`aڧ\x82\x88\x8fXP\x03\x15\x17\xd2\xf8:<\tU\x81\xaa\x03Ѵ\xf3\x16\xbc\xf79\x80_ٳe\xc7\xc0\x9a\xecc\x88\x8a\x1d#Gg:\xee8\x82\x03\xea\x13\xf8\x9f\xe5@\x00`ϖ\x1d\xff\xcb9\xf7\xe1\x10\x02ZY\xb34\xe6\xa6\xde\x05\xe4\xe0`\v\v\x979$-\a;c\x90\xce$p\x13\x0e\xa3ӥ\xb3\x19\x1d\x1b\xc1\xda\xc3kp\xf2\xf4I\x18\x9d\x18Ac\xb2\xf1\xff\xb5w\xae!v]\xd7\x1d\xff\xaf\xbdϽ3#K_T\x88mZ\\ZB\xa0z\x9b@\xdcGH!\x1fR\xbbNH(\t8\xae)\r\xa5\r-qh\xa8\xa4\x12ZSH\xa1hf\x14h\x1e\x1f\xf2h\xa1\xfd`5\xa4\x8e\x9b>▒\x96\xbaP\x97\xd8ռG\xc6\r8vd[\xb6\xf5\x98ǝ\xfb<g\xaf\xd5\x0f\xf7\xac{\xd7\xd93\xaa\xa4yH\xc9e\xffĠ\x99\xb93w\xce\xdeg\x9f\xbd\x9e{-\x8c7\xc71\xd6\x1a\x83\xdfp\xc8:\x1e\xbe\xe71\xeeƑQU;\xb2\x9a\xb8\x9d\x87Z\xad\x06\x0e\ft\x01Z\x1d\xf6ˈ\x95\x17\xe7\x1c:\x9dNE\xe8Xal\x85\x95}\xc0\xb6\xf2\xbbo\a\xebZ\xd3\xf7\xb6\n\x94}\xddj\xb0VX\xeax\xecƱז\xa8\x88<\xc1̗\x8b\xcb=`\x1d T[\x1fX\x8d>\xb6\xe4\xacU\x15[\n6U\xddλZ\x90\xd6M\xa7s\xa0\xf3\xa6\xf7V\xd7!\xe7\x01\x14\b\x94\x03\xdcb\xb8\x8eC\xb1\x9a\xa3X)\xfa\x15\x97W\x03\xd0\x10\x84\xf5\x02h\xf7\xcf'P\xe1\xc0/\a\xe4\xd7:\x10\x91\xcb\x00\x9e؍\xf9\xb2q\x86XqV\xb6r\xa9\xd9{\x1f\xbbj\x89\b\xa2J7\x0f-\xf0\xd8Ka\xf7N}Om\xfbm\x95#\xbb\x0f\xe9\xde\x13[F\xb1{P\xef\x8f~n\xc3\x01X\b\x10\x04\x10\xd1%\"zd\xe1\xcc\xccM\uf6db\x04\xc8\v\u007f\xfaܳD\xf4\x18\xf3\xf0샕\x8cV\xa3\xd6Iҋ\xb1\x12X\xbf\xb6\x83\x8d5p\xfb0Z)i\x17\xa4\x95\xa2\xaa\xb9\xe9\xffz3\xb3̃@\xd8h5\xf4\xc6\xff\xf1\xd2\xd4\\\xa5q\xd5N\xb1\xfev\x00\x95<\xf9ؕa\xad\xa9\xd8J\xd3\xf1\xdc\x0e\x17\x96\xc59\xf7\x99,\xcb\xfe\xa1(\n\xac5V\x118@\xb8\x1a_\x88ﭵ2\x14\xe6\xfe\xe1\xa6:\xea\xf0=\x87z\xaf\x86\xac\xe51ѝ\xc0Dk\x02\x13\x8dq\xf8\xb7\x1d\xc6.\xd71\xf1\xf68&\xae\x8e\xa3v%\xc3\xd8\xea\x18\xc6\x1bc}\v\xa8\x95!\xebxP\x87\xe0\n\x87Z\xa8\x81ߪ\xfa\xe5\xadŪף\xe6w\xfca7B;\xff\xfa\xbb\xbb\xe1&\x8aݳ:\x17\xfa\x9an\xaa\x8a\r*\x0f\xe6\xcdXW\xb1\xb5\xbeW,Mͭx\xef?\xe1\xbd\xcfõ\x1c\xc5Հ\xcc\x0f\x0f\xf0Z\x85к\n\xb7rO\xc6J\x8f>õZm\xcb\x03\x89[=\xe3\xf1\xbd\xb0_[m\xbf\xf2\xf3\x8c\xfei\xed\xd2U\xd6Y\xed\x80\u007fX@\xd6\v\x88HOD~syz~S\xbb\xd5\xed`k\xac\x01\xc3\xe3\x00VyP%7v\x01\xd99\xb4\xe3\xd1\xf7i?\xbf\x014\xcb^6\xd1Y0+\xac\xec~\xab\aQ\xb7J,\xb2\x9f\xeb\xb5\xe4y\xbee\xb2S\x1cs\xe1P\xc6\x1c\xe7z\b\x1cP\x14ś\"\xf2\xf0\u0099\x99\xb7ne\xbe\xb6\\\xc1\x8d\xe6\xfao\xb4:\xad\x8aD\xb4\x99\x10\x006\xf9\xa4\xad\x1bJ\x1fx\x95\xb2:\x99\xfa\x1e\xb6\f\xb3]`ֽa\xad\x10\xf5u덈\xfd\xf2!\x0fhu\x9az}\u007f\xb4457u+\x93p\xb3\xd8ִv\xa3\xb5\xae:}(c\xf3юu/}\xdf\xd7c\xe1\xccL\xb7(\x8a_\xf3\xde\u007f\x01\x00\x1a\xcdu\xa8\x92\x00\xd3\xc0\xcb\xde/{\x9dv<ֺR\xad\xc6f`\xa9\x89\xef\xbd\x1f\x1c\xect=B\xd6\xcb\xe0[\x1e\xbe\xe1Qo\xd41\xbe6\x86\xfa\xd5\x1a\x8a7{\x10\x910\x11Ɵ\x98X\x99\xc0\xc4\xda8\xc6\xd6\xebp\xab\x04Z\a\xc6\xf21p\x93\x81\x1e\xc0=\x1eTص\x0fT\xaf\xd7\x1b\x9c\xfe\xd7q\xc4\x1b\xfeN\xd9\xca]\x19k~V\xf3\xb4\xe5^\x94\xadb\x86{\xcd\u0099\x99\xef\x10ч\x9ds]Y\x0f\xa0פ\xe2\x82\xd1\x18\xa5\xddt\xe2Mӎ\x85\x99+\xf1\xa5\xd8\xfa\x06\xaaq\x84\x8a\xb6\x8b\xeb\x9f\xef\xb1V\x9d\xdd\xfc\xac\x05\xc7\xcc\xc8.9\xf4\xaeu\x00\xa0\xeb\xbd\xff\xf0\xf2\xf4\xfc\x96\x85\xfe\xb6C\xac\xdcY\x97T\xec~\xb2V\x9b\xbd\x97\xb1UW\n\x80\x9c\x88\xd0{\xa9\r\xf7\xa6\x83\xa0z\xf6*V:cE.^\xc3\xfa\xb3:W\xfa\xbfƸ\xecu\xe8\xfbW\xbc&\xaf\v\xf2\x99\x8eދ\x17\xbd\xf7?\xbf45w\xcb.\xc0M\x02\xe4\xf0\xa9\xe3\xef\x05\xf0\x01\x11\xc1F\xab\x81v\xb7UY$v#\xb1\x03\xd5&%ַ\x1dkYvAY\r\xcd.L5!m9\v}\xd8\xf45\xe7\xfa7 \x84~\xaan\xb3\xdb\xd4k\xfb\xcc\xd2\xd4ܟ\xdd\xea$\xdcp\x92\x9c\xab,,+L\xad;B\xc7`\xb3$\xf4\xf7m*\xf0nnj\xb7\u008b\x9f_\f\x8b\x93\xb3\xbfOD\x9f&\"n\xf7\xdah\xb67\x00T\x9b\x0f\xe9x\xd4|\xbe\x9e\xb6\x1ck\xfb\xd6\n\x03\xaagB\xecB֏n\xaf\x83f{\x03!\x84\xe0\xbd\u007f\xc4\xc1}\x87\n \xb4\x02|ףޭc\xa2;\xd1O\u007fn\x8ccbu\x1cw\xad\xeeþ+\x13ؿ\xb2\x1f\x13\xd7\xc61\xb6RGm5\xc3]\xdd}\xa8\xb52P\x93\xfa\xbf+u8v\xc8|V\xb9?\xdb%\xd6\xfe\xec\x1c\xc4\xcd\xcet\xbc[\xf5\b\xb1\xbf\xa7J\xd8\xed`qr\xf6\x9f\x01|\x90\x88\xdaE(\x10^ɑ\xbfַ\x86\xec\xb3\x06TcMz\xdfl\xc0V\x85\xa3\xf5\x1c\xd8ZU\xf6^o%$u\xcc\xd6\xdaT\xb7\xca\xf5<\x11!\x04\xe0-\x00\x17Y\x15\xd063?\xbcpf\xe6_vs\x9e\xc2J?\xabLZ\x02i3\xb8\xc3p\xec\xe00TJT\xc8\xc5^\x04k9X\xa1Z\xce\xe33\xde\xfbsD\x84\xe2\xed.\xa4\xac6_\xaf\xd5+?k\x05\x16PMW\xb6Ϧ\xfe\x8e\xf5~螣\x16\x8b^\xc7P\xe0\x01\xae\xe5\x10\xe6z\xc8\xdf\xea\xe8\xef\xfeG\bᗖ\xa6\xe6\xb6U\xeeiӮ\xe0\x9c{^D~\xd79\xf7\xba>\xfc\x1b\xadF\xb9є\xfeO\x93\xb1\x13\xe7\x1dǧLcS/\x8e\x83\xc4~;]\xa0q\n\xe8p1\xf67\xe1v\xbbi\xad\x8e\x00\xe0w.\x9c]ؕ\xa0y\x8cՎ\xac\xfbM7\xcb8\xa5\xd8j\x16vA\xe8F\xb3W\xb9\xff7\xcb\xd2\xd4ܗ\x00|\x84\x99[DT\xb9\xbf\xceh\xef\xf6\x01\xd7\xfba\xcfpX\x8b\xc4\xdeO[\xf2\xc4\xc6'\xfa\x9f\xf7\u007f\xae\xd1\\G\xaf聈\x82s\xee㋓\xb3OY!\x16k\x81\xb1\x9fXB\xff\xc1\x96\x8e\xa0^\xd4A\x1b\x84z\xab\x8e\x89V\xdfz\xa9]\xcd0qm\x1c\x13\x97DZ\xff\xda\xce\xdbO\xdb\xcdAǢ\xd7i-S\x00\x83\x18\xce\xf5,Q\xbb\xd6o\x87\x1bKY\x9c\x9c\xfd\xaes\xee!\"\xea\xbb{z\f~\xb5@X/3ʀ\x8a\x10\x04\x86\x15\"t-ر\xeb|\xd8Tj\xbb\xfe\xb7JÍ\xc7k\xf7\a\xbd\xb7\x83\x98\x99*\\-\a\\dP>\x98\xaf\x15\xef\xfd\x83\xcb\xd3\xf3\xff\xb6\xeb\x93\xc4\x02\xe9\t\xa8\a\xa0\x03\xa0%(Vs\xe4Ws`U k\f^\v\xa0\x16P4\np; t\xfa=B\xc0\xd5d\v\xa0\xe2\xa2\xcb\x01<&\"\u007f\xe2\x9cC\xaf\xdbF\xef|\x1b\xf2\x92\f\xaaW(Vp\xeb\u05fa'Z\x8f\x90\x9dkUZ\xad\x12\xa0\xffk܋\xe7z\xc8\xff\xb7c\xef\xc79f~pyz~e\xbbӵi\xf5.N\xce\xf6.\x9c]\xf8\x8a\x88\xbcSD\x1e'\xa2K:!\xadN\x13\x1b\xad\x06Z\xed\x8d\xe1\x03N\xd5\x1ce\x9b\xae\x16\xbb\xb4l)\x12\xab\xf1l\xe5\x1f\xb5\x82ƹ\xe1f\xd5\xe9u\xb0\xbe\xb1\x860p\xbf\xe0\xbf\x00ܿ45\xf7\xf5\xedN\u008d\x10\x91Wl`V\xb5\x0f벱c\x8a\xcd\xf7\xad\x02\xadY\x96\xddQ)\xb2<=\xff\x8f\xde\xfb\xf7\x10\xd1w\xf5\xc1n4ױ\xde\\\xaf$0\xe8\xbds\xce\r*\xa8ƽ@\x80\xeaحeBD\xfd\"\x98\xe5\xbd\xdch\xad\xa3\xddm\xe9\x02n3\xf3\xa3KSs\u007f\v\x00Y\x96m\xe8߱\nD\xfc0\xa9Eg\xad\xdc؟l\xdd E^\xbc\xb2\xd3\xf9\xf2M\u007f\xcdu\x1c\xa8G\xa0\x02\xf0\xe47\xa5\xa7[\v:\x16\x9e\xd6\xe26k\x00EQ\xbc\xbc\xd3k\xbb\x15\x96\xa6\xe6\x9e%\xa2w\x85\x10\xbeFD⽇_#\xe0\"C.2P\xaeJ\xad\x94`㛱\xa2d\xad\x11\xbbVb\xc5B_\x13\x91A\xe3\xadX\xc9\x1c\xccKyHQ\x82 \xbcZ\x00\x17\x19\xe1\xca\xc0\xc5&y\x9e\u007f\xd5{\xff\xae\x8533\xff\xb9\x17\xf3c\xaf\xd5*.\x833\x19\xdcO8A\xde?\xf7\xc2M\x86l0\xc2j\x81\xe2Z\x8e\xe2J\x0e^c\xf0z@\xb1\x9e\xf7\x85PW\x10:\x8c\xc5\xc9YY\x9e\x9e\xff\x1c3\u007f\xdc9\xd7\x15\x11\xb4V\x1b\x90\xc5\x02\xf2\x03\xdd\xfb6\x1f\xc0\xd4\xfd\xc6*\xa4\xfa\\\xd8\xfd\xc5>\x0f,\xfd\xc3ò\"\xc8g\xbb\xc0b@\x11\x06\xc9\x13\x97\x9cs\x9fȲ\xec\xb1\vg\x17\xb6\xd5\xfaW\xb9nz\xca\xf2\xf4|\a\xc0\x97\x0f\x9f:\xfe\x97ιO2\xf3gE\xe4\x1dz\xd3\xd77\xfa\xd5}\xbd\xf7\x98\x18\xdb7,U,\x02\x8a\x82K\xf6a\xaa\xd5j\x83ÇV\x13\xb7f\xaes\x04熾\xbf\x8dV\xa3\xb2Y\x97Z\xcf\xd5\x10\xc2i\xe7\xdc_-N\xce\xee\xa9#\xb9\xd9\xdex\x03@E\xb3\x8eMt\xbb\x91\x84N5;-\xeeD&\"\xe8\xe6\x9d;k\x86\x00X\x9c\x9c]>r\xfa\xc4\a\x88\xe8\xa1\x10\xc24\x80C\xde{=\xc1\x0f\xf4\x80\xfd\xfb\x0e\x94Z\xa4\xc0{B\x91\x17\x83\x12\xe4\xd65e\u074c\"2H\xcb\r!\xa0Wt+\xf1\x94\xd2\xdd\xf1\x8cs\xeeS\vgf\x06\xa5\x12\x1a\xcd\xf5\xa6nHV\x11\xb1Y?\xfa\x1e\xba![aa\xb54\x15\x1e\xe5k\xaf\xeft\xae\xf8Z\xb1j\x95\x9a\xc09 \x82\x80jY\x16\xf1\x00\x02#\x80\xe1\x88\xc0(\x06cf\xe3\xea#\"\x14\x12\xe0\x89\xb6]z|\xbb,\x9c\x99\xb9\f\xe0\x93\x87N\x1e\xfb\x1a\x80/\x89\xc8/\x00\xa5r\xf4j\u007f?q\xe4@?偬\xfc\xbeT\x9b\xa6\xc5~ykeYKB\u05c8Zj\xf5z\xbd\xd2\x1b\x9c\x8c\xbb\v\x05\x80\xd7\x18\x05\x0fS\xf8\xf5~z\xef\x9f\x13\x91\xc7_\xfc\xfc\xe2\xcc^\u038d\xae7ݏ\xac[ֺ\xd4\xf4\xfa\xec\xf8\x15-\x15\x92e\x19Bs\xe8\xfaW\x16'g\xbfq\xe8\xe4\xb1e\xe7\xdc\x14\x11=(\"\xe0\xb5\x1c\xc5\xf9\xfe\xdf\x1c;\xb8\x0fr_\xbf}\x00K\x80s\xc3\xf5o\x15\xb7\x81\xd2B\x0e!\f\xebp\xf1\x9b\x8c\xe2\xf5n%\xe6T\n\x9b\x0e3O\x13\xd1\xd4\xe2\xe4\xec\xc6n\xcc\xd7\r\xf3\x1b\x97\xa7\xe7\xdb\x00\xfe\xfc\xf0\xa9\xe3_!\xa2_%\xa2\xc7D\xe4a\xe7\\\x1d@\xa9U6*\x1b\xaaw\x1e\xb5\xac^y\xe0\xbd\xf7 \xe7\xd0\xeb\xe5pnh\xeao\xca`\xe8\xe5hv;\x95߳\xc1$\"z+˲\xbf\x16\x91\xe9\xe5\xe9\xf9\x1du\x1e\xbbY\xac/_\xaf\x15\x18\x96\xb2\xb7\x9bWlBZW\x85\x8d\xe7\xdci7\x96\xb245'\x00\x9e9|\xea\xf8\xbf:\xe7~\v\xc0\xe7\x98\xf9\x1dz/U\x988\xe7\xc0ݲ\x05\xa6\xf3\xb8k\xdf\xfe\x8ae\xa0\x14E\x8e^\xd1۴\xc9\x18\x8d\xf3\r\xef\xfd\xa7E\xe4\xe9\x8533\x15\xdb=\xb6@\xab\xae\xaf\xeaIZk\xc2[\v\x00\xc0\xc0Z\xb2>㝢\u007fǺd\xf4z\xac\xe6\xad\u007f\xdf\n<+\xe0b\x8bĎ\xf9vs\xe1\xec\xc2\xf9ç\x8e\xbf\x97\x88\x1e\x11\x91\xdf\x06\xf0\xcbDD\x03w\xf4\xc5|\xa0\x00\t3\xd8\t0N\xc8\xee\xae6\xf3\xb2q\x0e\x0eܯ\x05'\xd5\xcdغ@\x9ds\x90\xcb\x02j\t\x8a\xa2[YG:\xcfjq\x88ȳι\xaf\x8b\xc8\xdf\\8\xbb\xb0\xe7\x93\x15\xefY\x9a\x95e\x9fW{$\xc1\xde\u007f+,u\x9d\xd8{\x1e\xcd\xfd\"\x80\x87\x8e\x9c>\xf1~\x11\x99\n!\xbc[_k_\xd9@\xb6\x9a\xa1@ѷ\xfa\xb3\x1a\xb2\xfdu\xc8]\x02\xdc\x05`\x1f -AX\v\xa0\rB\xde\xee\xf4לȦ}\x13\x18\xec_犢\xf8\xec\xf2\xf4\xfc\x0fws\xben:A\xbe\xb4H\x9e\x06\xf0\xf4\x91\xd3'\x0e\x02\xf8(\x80_\x17\x91\xf7\xe9\x84\xeaD\xf5\xf2\x1e\xf2\"\xaf<\xf8q\xf6\x89\x1d\x1c\xb0Y\x9b\xd5`t\xa9\x81p\b\xe1\x99\x10\xc2_\xd4j\xb5g\x16'gw\xbf\x9d\xdf\xff\x03\x11\xfd\x0f\x80\t\x00\x9b\x04\x81}H\xac[%\x96\xfev\xac%\xbb\xdf\bb\a,O\xcf\x17\x00\xbez\xe4\xf4\x89s\x00>\x04\xe0#\"\xf2\x90\x88\xec\x8f\xcd\xfa,˰\xd6X\xad<\x1c:\xfe\xd8\xefo\xfc\xb7\x8b\xcc\xfcM\xe7\xdc\x17\x97\xa7\xe7\u05f7\xba\x06\"\xea0\xf3\xb7\x01T,\xd48\xbef\xad\x13+\x90\xad\xb6h\xcb}3\xf3\xb6\xfbC(\"\xb2Q\x14ŷc_\xb4]\x0f\"R\xb1\x9e\x00T\xae\xc5Z\xa5\x806/ʾ\xbf\xd3k\xdb\t\xe5\xc9\xeds\x00\xce\x1d:y\xec'E\xe4c\xcc\xfc\b\x80\a\xac&>X\xcf\xcd\x02\xfcr5\xb5?\x18\x97\xads\x0e\xc2\fq\x0e\x85\xb1\x06E\x04\x01C\x8f\x84\x18\xc5j\xa0<\x0e{\xe9|/˲o\x10\xd17\x17\xce\xccl\xbb\x15\xf5v\xd0\xf1ڴl\x1bطV\xa8\xae\x05\xfb\xba\n\xcaxO\xbc\x9e¸45\xf7\xef\x87N\x1e{\x0f\x11}\xd4{\xff83\xffb\b\xc1Ya\xc4\xc2謵@\xeb\xe5<\x995e\x15\x15+\xc8\xcb\xe7\xf0\xbcs\xeei\"\xfa\xd6\xe2\xe4\xecK{1_;V\xcf\x0e\x9f:~\x9f\x88\xbcOD\x1eȲ\xec\x01f>\x01\xa0\x06Ts\xe7\xad\x14\xb7n\x1f\xdb\r\xcbNH\x96e/2\xf3\xf3\x00\xbe\a\xe0\uf5e6\xe6n\xebBJ\x00\x87N\x1e\x1b\x03\xf0\xfe,\xcb>\"\"\x1fb\xe6{\xe3\x87V\x96*(\x00\x00\x05\x9fIDAT\xc6\nE\xbbї\x9f\x9fg\xe6\xa7\x00|\xeb\xc2م;\xbaQ&n\x8dç\x8e\xff,\x80\x0f\x028FDGC\bG\xbc\xf7\xfb\xac\xb0\xb6V\x9fM\x12Qb\xcb[\x85\xa8U*\x99\xb9\xc5\xccK\xde\xfb\xc5\x10\xc2\x02\x80\u007f\xbapv\xe1\xb6ƅ,\x87\xbep\xe2Q\xef\xfd\x93\xba7Yk\x11@\xe5\xb0\xe4VY\x95:F;G\xe5x\x9f\x9a\xff\xbd\x17>v\xa3\xbf\xffs\u007fp\xf4\xa0s\xeeWD\xe4\xe1,\xcb\x1e\x12\x91\x83V\x10\x01Մ\x0e\x9d\xf7\xf2\xef\x05\"z\x0e\xc0\xd3\xcc\xfcw\xcb\xd3\xf3;j\xa4w3\xecz\x0e\xe1\xd1?\xbc\u007f\\D\x8e3\xf3\x03Y\x96\xddW\x14\xc5O\x88\xc8A\xef\xfdA\":\xc8\xcc\a\xbd\xf7\x8e\x99WDd\x15\xc0\x8asn\x85\x88V\x99\xf9\xb5\x10\xc2\xf3ι\x17\x96\xa7\xe7\xb7l\xa1\x98\xb8s\x1c:y\xec\x00\x11\xddCD\xf7\x88\xc8=ι{\x01\xdc\x03`\x8c\x99/\x89\xc8%\"z\x13\xc0%\"z\xa3\xacŕ\x18\x01\x0e\x9d<\xe6\x88\xe8g\x9csG\x99\xf9(\x80{\x9ds\aD\xe4\x003\x1f \xa2\x03Y\x96\x1d`\xe6\x03!\x84}ι\x1637\xb2,k0s\x03@\x83\x99\x1bD\xd4@\u007f},\x02X\x04\xf0\x83\xa5\xa9\xb9\xdbW\x96\xe1\x06\x1c\xfe\xe2\xfd\x8f\x02x2N\x92\x897q\xebފcn\x83X\x84\xc9V\v!<\xb5\xf8\xa9\xf37\x14 \x96#\xa7Ox\x00?\r\xe0n\x00w\x17Eq\xb7\xf7\xfen\xef\xfdAf\xbe\x06\xe0\r\"\xba䜻\xc4\xcco\x88\xc8奩\xb9\xdb\xea\x1b\xbf=I\xe8\x89D\"\xf1c\xc0\xd1/\xbf\xfbQ\"z\xd2\xc65ĸ\xe84&d\xd3فj\x8cL\x05\x8e\xba\xe0K\xe1s\xcb\x02\xe4ǁۗ\x84\x9eH$\x12?\xe2\xd8TظK\xaa\x8d]\xe9\xf7\xb6\xaa֠Yfz>\xc8\xc6&F\x8d$@\x12\x89D\xa2\xc4\n\x0e\xa0Zj\xdd6\xbbR\x97\x96Z#63Ϟ_\xd2\xf7ܭl\xc0\x1f5\x92\x00I$\x12\x89\x12\x1b\xe8\xb7.)}M3\xa3\xac@\xb0\xf5\xf9\xe2\xb31q\xe2\xc0\xa8\x91\x04H\"\x91H\x94hv\x95\xcd\x1e\xb5\x99V6\x95\x1d\xa8\x96\xd9\x016\x17\x93̲\f\xbd^\uf39e\xf7\xd9K\x92\x00I$\x12\x89\x92\xb1N\x1d\xb5n\x86Z\x91A\xba\x02)L\ttS\x85B\xbf\x06\xaa\xe7CT\xd8h\xc5\r\x15\"\xa3*@v\xdei'\x91H$F\x84Z\xab\x86:\xeap\x9d\xe8lGF\xc89G6VC\xaf\xe8!\xab{xr`b\x88\xeb\xd7F\v\b@Vm\x8b\xa0Av[\xf6d\x94H\x02$\x91H$JB\b\xf0\xceo*S$\x85\xa0F5\xa0\x03Ըo\x9d\xd4|\xbf8\xac\xba\xb5\x802\x80N\xfd\x1ai\xf0\x00\x9c\x80\x89\xe1j\xa3\x19\x03I\x02$\x91H$JlI\x16%._\xa2'\xcd5\x0eb[X\x88\xf4\xab\xe0:\xa6\xb2\xb21\rʼ\x8f\"I\x80$\x12\x89\x84\xc1\x16\xe3\xb41\x0f[<Q\xcf{h\x8cC\xd1fxJ\xfc\x1e\xa3\xc6h:\xe6\x12\x89Db\x1blU 5>\x8d\xee\xbdG\xbd^\xaf\xa4\xf7\xdaC\x83\xa6\x04}\xa57\xcc(\x92\x04H\"\x91H\x94\xa8P\xb0\xc5\"m\xdf\x19\x1b\x1c\xb7\x02fll\xacr\xf8\xd0\xf6\x0f\xb11\x92Q#\t\x90D\"\x91(\xb1}^l\xd3(\xdb\xf7C\u007fFk]eY6(_\xa2B$nc\x11\xf7O\x1f\x15\x92\x00I$\x12\t\x83\xed壂\x01\xd8\xdc\xee\xd6V\xdbՒ&q\x8bY[|q\x14I\x02$\x91H$Jt\xc3W!\xa0օ\r\xa0\x03\xd8t\x98ЖqW\x01\xa3n/\xb5fF\x91\x94\x85\x95H$\x12\x06ku\xd8&x\x8a\xado\x15\xf7N\x8f\xddU\xea\xd6\xd2\xd8ɨ\x91\x04H\"\x91H\x94ؔ]-\x90\xa8\xc4}\xd0\xf55ۦ8n[\xac?kS}G\x89\xe4\xc2J$\x12\x89\x12kQ\xd86\xbc\xdavۦ\xee\xda~!\xb6d\xbb\xad\xd6k\xad\x94Q$\t\x90D\"\x91(\xb1\xc2\xc0\x16@̲l 0\xecY\x11k\xb1\xe8\x87E\xab\xfa\x8e\xaa\v+\t\x90D\"\x910ĥKl\tw\xb5(\xf4\xc0\xa0\x8do8\xe7*\x95wm<dT\x8b)\x8e\xe6\xa8\x12\x89Db\x9b\xc4\x19W\x8a\x9e0W\xc1\xa2\x8d\xa4,Z'K3\xaf⬭Qc4#;\x89D\"\xb1\r\xbc\xf7\bE@Q\x14\x95\x96\xb4궲=A\xb4\x0f\x88\xbe\xa65\xb4\xac\xf0Qa4\xaaq\x90d\x81$\x12\x89D\x89MŵYWZq\u05f6\xaf\xd5v\xb7\xde\xfb\x8a\xb5\xa1ߋ\x85\xc8(\x92,\x90D\"\x910h}+\x1b\xf3\xd0\xefٲ\xed\xeaʊ˟\xd8`\xba\xfd\xf9Q$Y \x89D\"\xa1\b\x02\x04\xa8\xd7\xea(\xf2\x02\x10@X\xc0\x81\xe1\xc8m\xfa<\x14\x01\x04\x02\x04\xe0\xc0\xe0\xc0 \xf3OX\xfa\x1f\"\xf9\x9d\x1e\xda^\x90,\x90D\"\x91(iu\x9a\xdf\aL\x89\x926W\x0e\x14Z\xb7\x94Z&\xfay\xadV\xab\x94n\xd7\x18IY\x0e\xe5\xbf\xef\xc4x\xf6\x9a$@\x12\x89D\xa2DSs\xe3\x02\x88\x1a8\xb7'\xd05E\xd7\xc6;\x00l\x126\x1a?\x19E\x92\v+\x91H$J4\x80\x1eB@\xadV\x1bX\x1f\xb60\xa2\n\x19\x15\x1c*h4F\x12\xc7?\xf4c\x14I\x16H\"\x91H\x948疙\xf9\x9d\x9ay\x05\xa0\x92\xaa\v\fO\xabk\xb7A[<\xd1\n\x16\xfd\xba\x14:Wn\xffh\x12\x89D\"\x91H$\x12\x89D\"\x91H$\x12\x89D\"\x91H$\x12\xdb\xe1\xff\x00a`\x0e\xb8q\xfd\x8e\xd6\x00\x00\x00\x00IEND\xaeB`\x82"),
216
        }
217
        filez := &embedded.EmbeddedFile{
218
                Filename:    "tray.html",
219
                FileModTime: time.Unix(1535012730, 0),
220
                Content:     string("<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-355, initial-scale=1, shrink-to-fit=no, maximum-scale=1.0, user-scalable=0\">\n{{if USE_CDN}}\n    <link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://assets.statup.io/favicon.ico\">\n    <link rel=\"stylesheet\" href=\"https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css\" integrity=\"sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB\" crossorigin=\"anonymous\">\n    <link rel=\"stylesheet\" href=\"https://assets.statup.io/base.css\">\n{{ else }}\n    <link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/favicon.ico\">\n    <link rel=\"stylesheet\" href=\"/css/bootstrap.min.css\">\n    <link rel=\"stylesheet\" href=\"/css/base.css\">\n{{end}}\n\n    <title>{{.Name}} Status</title>\n\n    <style>\n        BODY::-webkit-scrollbar { width: 0 !important }\n    </style>\n\n</head>\n<body>\n\n\n<div class=\"container col-12 sm-container\" style=\"margin-top: 0 !important;\">\n\n    <div class=\"col-12 full-col-12\">\n        <div class=\"list-group online_list\">\n        {{ range .Services }}\n            <a href=\"#\" class=\"service_li list-group-item list-group-item-action text-truncate {{if not .Online}}bg-danger text-white{{ end }}\" data-id=\"{{.Id}}\">\n            {{ .Name }}\n            {{if .Online}}\n                <span class=\"badge bg-success float-right pulse-glow\">ONLINE</span>\n            {{ else }}\n                <span class=\"badge bg-white text-black-50 float-right pulse\">OFFLINE</span>\n            {{end}}\n            </a>\n        {{ end }}\n        </div>\n    </div>\n\n    <div class=\"col-12 full-col-12\">\n    {{ range .Services }}\n        <div class=\"mt-4\" id=\"service_id_{{.Id}}\">\n            <div class=\"card\">\n                <div class=\"card-body\">\n                    <div class=\"col-12\">\n                        <h4 class=\"mt-3\"><a href=\"/service/{{.Id}}\"{{if not .Online}} class=\"text-danger\"{{end}}>{{ .Name }}</a>\n                        {{if .Online}}\n                            <span class=\"badge bg-success float-right\">ONLINE</span>\n                        {{ else }}\n                            <span class=\"badge bg-danger float-right pulse\">OFFLINE</span>\n                        {{end}}</h4>\n\n                        <div class=\"row stats_area mt-5 mb-5\">\n                            <div class=\"col-4\">\n                                <span class=\"lg_number\">{{.Online24}}%</span>\n                                Online last 24 Hours\n                            </div>\n                            <div class=\"col-4\">\n                                <span class=\"lg_number\">{{.AvgTime}}ms</span>\n                                Average Response\n                            </div>\n                            <div class=\"col-4\">\n                                <span class=\"lg_number\">{{.AvgUptime}}%</span>\n                                Total Uptime\n                            </div>\n                        </div>\n\n                    </div>\n                </div>\n            {{ if .AvgTime }}\n                <div class=\"chart-container\">\n                    <canvas id=\"service_{{ .Id }}\"></canvas>\n                </div>\n            {{ end }}\n                <div class=\"row lower_canvas full-col-12 text-white{{if not .Online}} bg-danger{{end}}\">\n                    <div class=\"col-10 text-truncate\">\n                        <span class=\"d-none d-md-inline\">{{.SmallText}}</span>\n                    </div>\n                    <div class=\"col-sm-12 col-md-2\">\n\n                    </div>\n                </div>\n            </div>\n        </div>\n    {{ end }}\n    </div>\n</div>\n\n<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\"></script>\n<script src=\"https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js\" integrity=\"sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T\" crossorigin=\"anonymous\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.bundle.min.js\"></script>\n<script src=\"https://assets.statup.io/main.js\"></script>\n\n<script src=\"/charts.js\"></script>\n\n</body>\n</html>"),
221
        }
222
        file10 := &embedded.EmbeddedFile{
223
                Filename:    "user.html",
224
                FileModTime: time.Unix(1538459587, 0),
225
                Content:     string("{{define \"title\"}}Statup | {{.Username}}{{end}}\n{{define \"content\"}}\n<div class=\"container col-md-7 col-sm-12 mt-md-5 bg-light\">\n{{template \"nav\"}}\n    <div class=\"col-12\">\n        <h3>User {{.Username}}</h3>\n        {{template \"form_user\" .}}\n    </div>\n</div>\n{{end}}\n"),
226
        }
227
        file11 := &embedded.EmbeddedFile{
228
                Filename:    "users.html",
229
                FileModTime: time.Unix(1538459610, 0),
230
                Content:     string("{{define \"title\"}}Statup | Users{{end}}\n{{define \"content\"}}\n<div class=\"container col-md-7 col-sm-12 mt-md-5 bg-light\">\n{{template \"nav\"}}\n    <div class=\"col-12\">\n        <h3>Users</h3>\n        <table class=\"table table-striped\">\n            <thead>\n            <tr>\n                <th scope=\"col\">Username</th>\n                <th scope=\"col\"></th>\n            </tr>\n            </thead>\n            <tbody>\n            {{range .}}\n            <tr>\n                <td>{{.Username}}</td>\n                <td class=\"text-right\" id=\"user_{{.Id}}\">\n                    <div class=\"btn-group\">\n                        <a href=\"/user/{{.Id}}\" class=\"btn btn-primary\">Edit</a>\n                        <a href=\"/user/{{.Id}}/delete\" class=\"btn btn-danger confirm-btn\" data-id=\"user_{{.Id}}\">Delete</a>\n                    </div>\n                </td>\n            </tr>\n            {{end}}\n            </tbody>\n        </table>\n\n        <h3>Create User</h3>\n\n        {{template \"form_user\" NewUser}}\n\n    </div>\n</div>\n{{end}}\n"),
231
        }
232
233
        // define dirs
234
        dirb := &embedded.EmbeddedDir{
235
                Filename:   "",
236
                DirModTime: time.Unix(1538866310, 0),
237
                ChildFiles: []*embedded.EmbeddedFile{
238
                        filec,  // "base.html"
239
                        filed,  // "dashboard.html"
240
                        filee,  // "error_404.html"
241
                        filef,  // "favicon.ico"
242
                        fileg,  // "footer.html"
243
                        fileh,  // "form_checkin.html"
244
                        filei,  // "form_notifier.html"
245
                        filej,  // "form_service.html"
246
                        filek,  // "form_user.html"
247
                        filel,  // "head.html"
248
                        filem,  // "help.html"
249
                        filen,  // "help.md"
250
                        fileo,  // "index.html"
251
                        filep,  // "login.html"
252
                        fileq,  // "logs.html"
253
                        filer,  // "nav.html"
254
                        files,  // "robots.txt"
255
                        filet,  // "scripts.html"
256
                        fileu,  // "service.html"
257
                        filev,  // "services.html"
258
                        filew,  // "settings.html"
259
                        filex,  // "setup.html"
260
                        filey,  // "statup.png"
261
                        filez,  // "tray.html"
262
                        file10, // "user.html"
263
                        file11, // "users.html"
264
265
                },
266
        }
267
268
        // link ChildDirs
269
        dirb.ChildDirs = []*embedded.EmbeddedDir{}
270
271
        // register embeddedBox
272
        embedded.RegisterEmbeddedBox(`tmpl`, &embedded.EmbeddedBox{
273
                Name: `tmpl`,
274
                Time: time.Unix(1538866310, 0),
275
                Dirs: map[string]*embedded.EmbeddedDir{
276
                        "": dirb,
277
                },
278
                Files: map[string]*embedded.EmbeddedFile{
279
                        "base.html":          filec,
280
                        "dashboard.html":     filed,
281
                        "error_404.html":     filee,
282
                        "favicon.ico":        filef,
283
                        "footer.html":        fileg,
284
                        "form_checkin.html":  fileh,
285
                        "form_notifier.html": filei,
286
                        "form_service.html":  filej,
287
                        "form_user.html":     filek,
288
                        "head.html":          filel,
289
                        "help.html":          filem,
290
                        "help.md":            filen,
291
                        "index.html":         fileo,
292
                        "login.html":         filep,
293
                        "logs.html":          fileq,
294
                        "nav.html":           filer,
295
                        "robots.txt":         files,
296
                        "scripts.html":       filet,
297
                        "service.html":       fileu,
298
                        "services.html":      filev,
299
                        "settings.html":      filew,
300
                        "setup.html":         filex,
301
                        "statup.png":         filey,
302
                        "tray.html":          filez,
303
                        "user.html":          file10,
304
                        "users.html":         file11,
305
                },
306
        })
307
}
func CreateAllAssets
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go:

152
func CreateAllAssets(folder string) error {
153
        utils.Log(1, fmt.Sprintf("Dump Statup assets into %v/assets", folder))
154
        MakePublicFolder(folder + "/assets")
155
        MakePublicFolder(folder + "/assets/js")
156
        MakePublicFolder(folder + "/assets/css")
157
        MakePublicFolder(folder + "/assets/scss")
158
        utils.Log(1, "Inserting scss, css, and javascript files into assets folder")
159
        CopyToPublic(ScssBox, folder+"/assets/scss", "base.scss")
160
        CopyToPublic(ScssBox, folder+"/assets/scss", "variables.scss")
161
        CopyToPublic(ScssBox, folder+"/assets/scss", "mobile.scss")
162
        CopyToPublic(ScssBox, folder+"/assets/scss", "pikaday.scss")
163
        CopyToPublic(CssBox, folder+"/assets/css", "bootstrap.min.css")
164
        CopyToPublic(CssBox, folder+"/assets/css", "base.css")
165
        //CopyToPublic(JsBox, folder+"/assets/js", "bootstrap.min.js")
166
        //CopyToPublic(JsBox, folder+"/assets/js", "Chart.bundle.min.js")
167
        //CopyToPublic(JsBox, folder+"/assets/js", "jquery-3.3.1.min.js")
168
        //CopyToPublic(JsBox, folder+"/assets/js", "sortable.min.js")
169
        //CopyToPublic(JsBox, folder+"/assets/js", "main.js")
170
        //CopyToPublic(JsBox, folder+"/assets/js", "setup.js")
171
        CopyToPublic(TmplBox, folder+"/assets", "robots.txt")
172
        CopyToPublic(TmplBox, folder+"/assets", "statup.png")
173
        utils.Log(1, "Compiling CSS from SCSS style...")
174
        err := utils.Log(1, "Statup assets have been inserted")
175
        return err
176
}
func init
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/rice-box.go:

8
func init() {
9
10
        // define files
11
        file2 := &embedded.EmbeddedFile{
12
                Filename:    "Chart.bundle.min.js",
13
                FileModTime: time.Unix(1528732500, 0),
14
                Content:     string("/*!\n * Chart.js\n * http://chartjs.org/\n * Version: 2.7.2\n *\n * Copyright 2018 Chart.js Contributors\n * Released under the MIT license\n * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md\n */\n!function(t){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=t();else if(\"function\"==typeof define&&define.amd)define([],t);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).Chart=t()}}(function(){return function t(e,i,n){function a(o,s){if(!i[o]){if(!e[o]){var l=\"function\"==typeof require&&require;if(!s&&l)return l(o,!0);if(r)return r(o,!0);var u=new Error(\"Cannot find module '\"+o+\"'\");throw u.code=\"MODULE_NOT_FOUND\",u}var d=i[o]={exports:{}};e[o][0].call(d.exports,function(t){var i=e[o][1][t];return a(i||t)},d,d.exports,t,e,i,n)}return i[o].exports}for(var r=\"function\"==typeof require&&require,o=0;o<n.length;o++)a(n[o]);return a}({1:[function(t,e,i){var n=t(5);function a(t){if(t){var e=[0,0,0],i=1,a=t.match(/^#([a-fA-F0-9]{3})$/i);if(a){a=a[1];for(var r=0;r<e.length;r++)e[r]=parseInt(a[r]+a[r],16)}else if(a=t.match(/^#([a-fA-F0-9]{6})$/i)){a=a[1];for(r=0;r<e.length;r++)e[r]=parseInt(a.slice(2*r,2*r+2),16)}else if(a=t.match(/^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i)){for(r=0;r<e.length;r++)e[r]=parseInt(a[r+1]);i=parseFloat(a[4])}else if(a=t.match(/^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i)){for(r=0;r<e.length;r++)e[r]=Math.round(2.55*parseFloat(a[r+1]));i=parseFloat(a[4])}else if(a=t.match(/(\\w+)/)){if(\"transparent\"==a[1])return[0,0,0,0];if(!(e=n[a[1]]))return}for(r=0;r<e.length;r++)e[r]=d(e[r],0,255);return i=i||0==i?d(i,0,1):1,e[3]=i,e}}function r(t){if(t){var e=t.match(/^hsla?\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/);if(e){var i=parseFloat(e[4]);return[d(parseInt(e[1]),0,360),d(parseFloat(e[2]),0,100),d(parseFloat(e[3]),0,100),d(isNaN(i)?1:i,0,1)]}}}function o(t){if(t){var e=t.match(/^hwb\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/);if(e){var i=parseFloat(e[4]);return[d(parseInt(e[1]),0,360),d(parseFloat(e[2]),0,100),d(parseFloat(e[3]),0,100),d(isNaN(i)?1:i,0,1)]}}}function s(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),\"rgba(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+e+\")\"}function l(t,e){return\"rgba(\"+Math.round(t[0]/255*100)+\"%, \"+Math.round(t[1]/255*100)+\"%, \"+Math.round(t[2]/255*100)+\"%, \"+(e||t[3]||1)+\")\"}function u(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),\"hsla(\"+t[0]+\", \"+t[1]+\"%, \"+t[2]+\"%, \"+e+\")\"}function d(t,e,i){return Math.min(Math.max(e,t),i)}function h(t){var e=t.toString(16).toUpperCase();return e.length<2?\"0\"+e:e}e.exports={getRgba:a,getHsla:r,getRgb:function(t){var e=a(t);return e&&e.slice(0,3)},getHsl:function(t){var e=r(t);return e&&e.slice(0,3)},getHwb:o,getAlpha:function(t){var e=a(t);{if(e)return e[3];if(e=r(t))return e[3];if(e=o(t))return e[3]}},hexString:function(t){return\"#\"+h(t[0])+h(t[1])+h(t[2])},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return s(t,e);return\"rgb(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\")\"},rgbaString:s,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return l(t,e);var i=Math.round(t[0]/255*100),n=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return\"rgb(\"+i+\"%, \"+n+\"%, \"+a+\"%)\"},percentaString:l,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return u(t,e);return\"hsl(\"+t[0]+\", \"+t[1]+\"%, \"+t[2]+\"%)\"},hslaString:u,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return\"hwb(\"+t[0]+\", \"+t[1]+\"%, \"+t[2]+\"%\"+(void 0!==e&&1!==e?\", \"+e:\"\")+\")\"},keyword:function(t){return c[t.slice(0,3)]}};var c={};for(var f in n)c[n[f]]=f},{5:5}],2:[function(t,e,i){var n=t(4),a=t(1),r=function(t){return t instanceof r?t:this instanceof r?(this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1},void(\"string\"==typeof t?(e=a.getRgba(t))?this.setValues(\"rgb\",e):(e=a.getHsla(t))?this.setValues(\"hsl\",e):(e=a.getHwb(t))&&this.setValues(\"hwb\",e):\"object\"==typeof t&&(void 0!==(e=t).r||void 0!==e.red?this.setValues(\"rgb\",e):void 0!==e.l||void 0!==e.lightness?this.setValues(\"hsl\",e):void 0!==e.v||void 0!==e.value?this.setValues(\"hsv\",e):void 0!==e.w||void 0!==e.whiteness?this.setValues(\"hwb\",e):void 0===e.c&&void 0===e.cyan||this.setValues(\"cmyk\",e)))):new r(t);var e};r.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace(\"rgb\",arguments)},hsl:function(){return this.setSpace(\"hsl\",arguments)},hsv:function(){return this.setSpace(\"hsv\",arguments)},hwb:function(){return this.setSpace(\"hwb\",arguments)},cmyk:function(){return this.setSpace(\"cmyk\",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues(\"alpha\",t),this)},red:function(t){return this.setChannel(\"rgb\",0,t)},green:function(t){return this.setChannel(\"rgb\",1,t)},blue:function(t){return this.setChannel(\"rgb\",2,t)},hue:function(t){return t&&(t=(t%=360)<0?360+t:t),this.setChannel(\"hsl\",0,t)},saturation:function(t){return this.setChannel(\"hsl\",1,t)},lightness:function(t){return this.setChannel(\"hsl\",2,t)},saturationv:function(t){return this.setChannel(\"hsv\",1,t)},whiteness:function(t){return this.setChannel(\"hwb\",1,t)},blackness:function(t){return this.setChannel(\"hwb\",2,t)},value:function(t){return this.setChannel(\"hsv\",2,t)},cyan:function(t){return this.setChannel(\"cmyk\",0,t)},magenta:function(t){return this.setChannel(\"cmyk\",1,t)},yellow:function(t){return this.setChannel(\"cmyk\",2,t)},black:function(t){return this.setChannel(\"cmyk\",3,t)},hexString:function(){return a.hexString(this.values.rgb)},rgbString:function(){return a.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return a.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return a.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return a.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return a.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return a.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return a.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],i=0;i<t.length;i++){var n=t[i]/255;e[i]=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),i=t.luminosity();return e>i?(e+.05)/(i+.05):(i+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?\"AAA\":e>=4.5?\"AA\":\"\"},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues(\"rgb\",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues(\"hsl\",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues(\"hsl\",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues(\"hsl\",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues(\"hsl\",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues(\"hwb\",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues(\"hwb\",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues(\"rgb\",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues(\"alpha\",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues(\"alpha\",e+e*t),this},rotate:function(t){var e=this.values.hsl,i=(e[0]+t)%360;return e[0]=i<0?360+i:i,this.setValues(\"hsl\",e),this},mix:function(t,e){var i=this,n=t,a=void 0===e?.5:e,r=2*a-1,o=i.alpha()-n.alpha(),s=((r*o==-1?r:(r+o)/(1+r*o))+1)/2,l=1-s;return this.rgb(s*i.red()+l*n.red(),s*i.green()+l*n.green(),s*i.blue()+l*n.blue()).alpha(i.alpha()*a+n.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,i=new r,n=this.values,a=i.values;for(var o in n)n.hasOwnProperty(o)&&(t=n[o],\"[object Array]\"===(e={}.toString.call(t))?a[o]=t.slice(0):\"[object Number]\"===e?a[o]=t:console.error(\"unexpected color value:\",t));return i}},r.prototype.spaces={rgb:[\"red\",\"green\",\"blue\"],hsl:[\"hue\",\"saturation\",\"lightness\"],hsv:[\"hue\",\"saturation\",\"value\"],hwb:[\"hue\",\"whiteness\",\"blackness\"],cmyk:[\"cyan\",\"magenta\",\"yellow\",\"black\"]},r.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},r.prototype.getValues=function(t){for(var e=this.values,i={},n=0;n<t.length;n++)i[t.charAt(n)]=e[t][n];return 1!==e.alpha&&(i.a=e.alpha),i},r.prototype.setValues=function(t,e){var i,a,r=this.values,o=this.spaces,s=this.maxes,l=1;if(this.valid=!0,\"alpha\"===t)l=e;else if(e.length)r[t]=e.slice(0,t.length),l=e[t.length];else if(void 0!==e[t.charAt(0)]){for(i=0;i<t.length;i++)r[t][i]=e[t.charAt(i)];l=e.a}else if(void 0!==e[o[t][0]]){var u=o[t];for(i=0;i<t.length;i++)r[t][i]=e[u[i]];l=e.alpha}if(r.alpha=Math.max(0,Math.min(1,void 0===l?r.alpha:l)),\"alpha\"===t)return!1;for(i=0;i<t.length;i++)a=Math.max(0,Math.min(s[t][i],r[t][i])),r[t][i]=Math.round(a);for(var d in o)d!==t&&(r[d]=n[t][d](r[t]));return!0},r.prototype.setSpace=function(t,e){var i=e[0];return void 0===i?this.getValues(t):(\"number\"==typeof i&&(i=Array.prototype.slice.call(e)),this.setValues(t,i),this)},r.prototype.setChannel=function(t,e,i){var n=this.values[t];return void 0===i?n[e]:i===n[e]?this:(n[e]=i,this.setValues(t,n),this)},\"undefined\"!=typeof window&&(window.Color=r),e.exports=r},{1:1,4:4}],3:[function(t,e,i){function n(t){var e,i,n=t[0]/255,a=t[1]/255,r=t[2]/255,o=Math.min(n,a,r),s=Math.max(n,a,r),l=s-o;return s==o?e=0:n==s?e=(a-r)/l:a==s?e=2+(r-n)/l:r==s&&(e=4+(n-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),i=(o+s)/2,[e,100*(s==o?0:i<=.5?l/(s+o):l/(2-s-o)),100*i]}function a(t){var e,i,n=t[0],a=t[1],r=t[2],o=Math.min(n,a,r),s=Math.max(n,a,r),l=s-o;return i=0==s?0:l/s*1e3/10,s==o?e=0:n==s?e=(a-r)/l:a==s?e=2+(r-n)/l:r==s&&(e=4+(n-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),[e,i,s/255*1e3/10]}function o(t){var e=t[0],i=t[1],a=t[2];return[n(t)[0],100*(1/255*Math.min(e,Math.min(i,a))),100*(a=1-1/255*Math.max(e,Math.max(i,a)))]}function s(t){var e,i=t[0]/255,n=t[1]/255,a=t[2]/255;return[100*((1-i-(e=Math.min(1-i,1-n,1-a)))/(1-e)||0),100*((1-n-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]}function l(t){return S[JSON.stringify(t)]}function u(t){var e=t[0]/255,i=t[1]/255,n=t[2]/255;return[100*(.4124*(e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)+.1805*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)),100*(.2126*e+.7152*i+.0722*n),100*(.0193*e+.1192*i+.9505*n)]}function d(t){var e=u(t),i=e[0],n=e[1],a=e[2];return n/=100,a/=108.883,i=(i/=95.047)>.008856?Math.pow(i,1/3):7.787*i+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(i-n),200*(n-(a=a>.008856?Math.pow(a,1/3):7.787*a+16/116))]}function h(t){var e,i,n,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return[r=255*l,r,r];e=2*l-(i=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(n=o+1/3*-(u-1))<0&&n++,n>1&&n--,r=6*n<1?e+6*(i-e)*n:2*n<1?i:3*n<2?e+(i-e)*(2/3-n)*6:e,a[u]=255*r;return a}function c(t){var e=t[0]/60,i=t[1]/100,n=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*n*(1-i),s=255*n*(1-i*r),l=255*n*(1-i*(1-r));n*=255;switch(a){case 0:return[n,l,o];case 1:return[s,n,o];case 2:return[o,n,l];case 3:return[o,s,n];case 4:return[l,o,n];case 5:return[n,o,s]}}function f(t){var e,i,n,a,o=t[0]/360,s=t[1]/100,l=t[2]/100,u=s+l;switch(u>1&&(s/=u,l/=u),n=6*o-(e=Math.floor(6*o)),0!=(1&e)&&(n=1-n),a=s+n*((i=1-l)-s),e){default:case 6:case 0:r=i,g=a,b=s;break;case 1:r=a,g=i,b=s;break;case 2:r=s,g=i,b=a;break;case 3:r=s,g=a,b=i;break;case 4:r=a,g=s,b=i;break;case 5:r=i,g=s,b=a}return[255*r,255*g,255*b]}function m(t){var e=t[0]/100,i=t[1]/100,n=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a))]}function p(t){var e,i,n,a=t[0]/100,r=t[1]/100,o=t[2]/100;return i=-.9689*a+1.8758*r+.0415*o,n=.0557*a+-.204*r+1.057*o,e=(e=3.2406*a+-1.5372*r+-.4986*o)>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,[255*(e=Math.min(Math.max(0,e),1)),255*(i=Math.min(Math.max(0,i),1)),255*(n=Math.min(Math.max(0,n),1))]}function v(t){var e=t[0],i=t[1],n=t[2];return i/=100,n/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(e-i),200*(i-(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116))]}function y(t){var e,i,n,a,r=t[0],o=t[1],s=t[2];return r<=8?a=(i=100*r/903.3)/100*7.787+16/116:(i=100*Math.pow((r+16)/116,3),a=Math.pow(i/100,1/3)),[e=e/95.047<=.008856?e=95.047*(o/500+a-16/116)/7.787:95.047*Math.pow(o/500+a,3),i,n=n/108.883<=.008859?n=108.883*(a-s/200-16/116)/7.787:108.883*Math.pow(a-s/200,3)]}function x(t){var e,i=t[0],n=t[1],a=t[2];return(e=360*Math.atan2(a,n)/2/Math.PI)<0&&(e+=360),[i,Math.sqrt(n*n+a*a),e]}function _(t){return p(y(t))}function k(t){var e,i=t[0],n=t[1];return e=t[2]/360*2*Math.PI,[i,n*Math.cos(e),n*Math.sin(e)]}function w(t){return M[t]}e.exports={rgb2hsl:n,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:s,rgb2keyword:l,rgb2xyz:u,rgb2lab:d,rgb2lch:function(t){return x(d(t))},hsl2rgb:h,hsl2hsv:function(t){var e=t[0],i=t[1]/100,n=t[2]/100;if(0===n)return[0,0,0];return[e,100*(2*(i*=(n*=2)<=1?n:2-n)/(n+i)),100*((n+i)/2)]},hsl2hwb:function(t){return o(h(t))},hsl2cmyk:function(t){return s(h(t))},hsl2keyword:function(t){return l(h(t))},hsv2rgb:c,hsv2hsl:function(t){var e,i,n=t[0],a=t[1]/100,r=t[2]/100;return e=a*r,[n,100*(e=(e/=(i=(2-a)*r)<=1?i:2-i)||0),100*(i/=2)]},hsv2hwb:function(t){return o(c(t))},hsv2cmyk:function(t){return s(c(t))},hsv2keyword:function(t){return l(c(t))},hwb2rgb:f,hwb2hsl:function(t){return n(f(t))},hwb2hsv:function(t){return a(f(t))},hwb2cmyk:function(t){return s(f(t))},hwb2keyword:function(t){return l(f(t))},cmyk2rgb:m,cmyk2hsl:function(t){return n(m(t))},cmyk2hsv:function(t){return a(m(t))},cmyk2hwb:function(t){return o(m(t))},cmyk2keyword:function(t){return l(m(t))},keyword2rgb:w,keyword2hsl:function(t){return n(w(t))},keyword2hsv:function(t){return a(w(t))},keyword2hwb:function(t){return o(w(t))},keyword2cmyk:function(t){return s(w(t))},keyword2lab:function(t){return d(w(t))},keyword2xyz:function(t){return u(w(t))},xyz2rgb:p,xyz2lab:v,xyz2lch:function(t){return x(v(t))},lab2xyz:y,lab2rgb:_,lab2lch:x,lch2lab:k,lch2xyz:function(t){return y(k(t))},lch2rgb:function(t){return _(k(t))}};var M={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},S={};for(var D in M)S[JSON.stringify(M[D])]=D},{}],4:[function(t,e,i){var n=t(3),a=function(){return new u};for(var r in n){a[r+\"Raw\"]=function(t){return function(e){return\"number\"==typeof e&&(e=Array.prototype.slice.call(arguments)),n[t](e)}}(r);var o=/(\\w+)2(\\w+)/.exec(r),s=o[1],l=o[2];(a[s]=a[s]||{})[l]=a[r]=function(t){return function(e){\"number\"==typeof e&&(e=Array.prototype.slice.call(arguments));var i=n[t](e);if(\"string\"==typeof i||void 0===i)return i;for(var a=0;a<i.length;a++)i[a]=Math.round(i[a]);return i}}(r)}var u=function(){this.convs={}};u.prototype.routeSpace=function(t,e){var i=e[0];return void 0===i?this.getValues(t):(\"number\"==typeof i&&(i=Array.prototype.slice.call(e)),this.setValues(t,i))},u.prototype.setValues=function(t,e){return this.space=t,this.convs={},this.convs[t]=e,this},u.prototype.getValues=function(t){var e=this.convs[t];if(!e){var i=this.space,n=this.convs[i];e=a[i][t](n),this.convs[t]=e}return e},[\"rgb\",\"hsl\",\"hsv\",\"cmyk\",\"keyword\"].forEach(function(t){u.prototype[t]=function(e){return this.routeSpace(t,arguments)}}),e.exports=a},{3:3}],5:[function(t,e,i){\"use strict\";e.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},{}],6:[function(t,e,i){var n,a;n=this,a=function(){\"use strict\";var i,n;function a(){return i.apply(null,arguments)}function r(t){return t instanceof Array||\"[object Array]\"===Object.prototype.toString.call(t)}function o(t){return null!=t&&\"[object Object]\"===Object.prototype.toString.call(t)}function s(t){return void 0===t}function l(t){return\"number\"==typeof t||\"[object Number]\"===Object.prototype.toString.call(t)}function u(t){return t instanceof Date||\"[object Date]\"===Object.prototype.toString.call(t)}function d(t,e){var i,n=[];for(i=0;i<t.length;++i)n.push(e(t[i],i));return n}function h(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function c(t,e){for(var i in e)h(e,i)&&(t[i]=e[i]);return h(e,\"toString\")&&(t.toString=e.toString),h(e,\"valueOf\")&&(t.valueOf=e.valueOf),t}function f(t,e,i,n){return Pe(t,e,i,n,!0).utc()}function g(t){return null==t._pf&&(t._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}),t._pf}function m(t){if(null==t._isValid){var e=g(t),i=n.call(e.parsedDateParts,function(t){return null!=t}),a=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidMonth&&!e.invalidWeekday&&!e.weekdayMismatch&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&i);if(t._strict&&(a=a&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour),null!=Object.isFrozen&&Object.isFrozen(t))return a;t._isValid=a}return t._isValid}function p(t){var e=f(NaN);return null!=t?c(g(e),t):g(e).userInvalidated=!0,e}n=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),i=e.length>>>0,n=0;n<i;n++)if(n in e&&t.call(this,e[n],n,e))return!0;return!1};var v=a.momentProperties=[];function y(t,e){var i,n,a;if(s(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),s(e._i)||(t._i=e._i),s(e._f)||(t._f=e._f),s(e._l)||(t._l=e._l),s(e._strict)||(t._strict=e._strict),s(e._tzm)||(t._tzm=e._tzm),s(e._isUTC)||(t._isUTC=e._isUTC),s(e._offset)||(t._offset=e._offset),s(e._pf)||(t._pf=g(e)),s(e._locale)||(t._locale=e._locale),v.length>0)for(i=0;i<v.length;i++)s(a=e[n=v[i]])||(t[n]=a);return t}var b=!1;function x(t){y(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===b&&(b=!0,a.updateOffset(this),b=!1)}function _(t){return t instanceof x||null!=t&&null!=t._isAMomentObject}function k(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function w(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=k(e)),i}function M(t,e,i){var n,a=Math.min(t.length,e.length),r=Math.abs(t.length-e.length),o=0;for(n=0;n<a;n++)(i&&t[n]!==e[n]||!i&&w(t[n])!==w(e[n]))&&o++;return o+r}function S(t){!1===a.suppressDeprecationWarnings&&\"undefined\"!=typeof console&&console.warn&&console.warn(\"Deprecation warning: \"+t)}function D(t,e){var i=!0;return c(function(){if(null!=a.deprecationHandler&&a.deprecationHandler(null,t),i){for(var n,r=[],o=0;o<arguments.length;o++){if(n=\"\",\"object\"==typeof arguments[o]){for(var s in n+=\"\\n[\"+o+\"] \",arguments[0])n+=s+\": \"+arguments[0][s]+\", \";n=n.slice(0,-2)}else n=arguments[o];r.push(n)}S(t+\"\\nArguments: \"+Array.prototype.slice.call(r).join(\"\")+\"\\n\"+(new Error).stack),i=!1}return e.apply(this,arguments)},e)}var C,P={};function T(t,e){null!=a.deprecationHandler&&a.deprecationHandler(t,e),P[t]||(S(e),P[t]=!0)}function O(t){return t instanceof Function||\"[object Function]\"===Object.prototype.toString.call(t)}function I(t,e){var i,n=c({},t);for(i in e)h(e,i)&&(o(t[i])&&o(e[i])?(n[i]={},c(n[i],t[i]),c(n[i],e[i])):null!=e[i]?n[i]=e[i]:delete n[i]);for(i in t)h(t,i)&&!h(e,i)&&o(t[i])&&(n[i]=c({},n[i]));return n}function A(t){null!=t&&this.set(t)}a.suppressDeprecationWarnings=!1,a.deprecationHandler=null,C=Object.keys?Object.keys:function(t){var e,i=[];for(e in t)h(t,e)&&i.push(e);return i};var F={};function R(t,e){var i=t.toLowerCase();F[i]=F[i+\"s\"]=F[e]=t}function L(t){return\"string\"==typeof t?F[t]||F[t.toLowerCase()]:void 0}function W(t){var e,i,n={};for(i in t)h(t,i)&&(e=L(i))&&(n[e]=t[i]);return n}var Y={};function N(t,e){Y[t]=e}function z(t,e,i){var n=\"\"+Math.abs(t),a=e-n.length;return(t>=0?i?\"+\":\"\":\"-\")+Math.pow(10,Math.max(0,a)).toString().substr(1)+n}var H=/(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,V=/(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,B={},E={};function j(t,e,i,n){var a=n;\"string\"==typeof n&&(a=function(){return this[n]()}),t&&(E[t]=a),e&&(E[e[0]]=function(){return z(a.apply(this,arguments),e[1],e[2])}),i&&(E[i]=function(){return this.localeData().ordinal(a.apply(this,arguments),t)})}function U(t,e){return t.isValid()?(e=q(e,t.localeData()),B[e]=B[e]||function(t){var e,i,n,a=t.match(H);for(e=0,i=a.length;e<i;e++)E[a[e]]?a[e]=E[a[e]]:a[e]=(n=a[e]).match(/\\[[\\s\\S]/)?n.replace(/^\\[|\\]$/g,\"\"):n.replace(/\\\\/g,\"\");return function(e){var n,r=\"\";for(n=0;n<i;n++)r+=O(a[n])?a[n].call(e,t):a[n];return r}}(e),B[e](t)):t.localeData().invalidDate()}function q(t,e){var i=5;function n(t){return e.longDateFormat(t)||t}for(V.lastIndex=0;i>=0&&V.test(t);)t=t.replace(V,n),V.lastIndex=0,i-=1;return t}var G=/\\d/,Z=/\\d\\d/,X=/\\d{3}/,J=/\\d{4}/,K=/[+-]?\\d{6}/,$=/\\d\\d?/,Q=/\\d\\d\\d\\d?/,tt=/\\d\\d\\d\\d\\d\\d?/,et=/\\d{1,3}/,it=/\\d{1,4}/,nt=/[+-]?\\d{1,6}/,at=/\\d+/,rt=/[+-]?\\d+/,ot=/Z|[+-]\\d\\d:?\\d\\d/gi,st=/Z|[+-]\\d\\d(?::?\\d\\d)?/gi,lt=/[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i,ut={};function dt(t,e,i){ut[t]=O(e)?e:function(t,n){return t&&i?i:e}}function ht(t,e){return h(ut,t)?ut[t](e._strict,e._locale):new RegExp(ct(t.replace(\"\\\\\",\"\").replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g,function(t,e,i,n,a){return e||i||n||a})))}function ct(t){return t.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\")}var ft={};function gt(t,e){var i,n=e;for(\"string\"==typeof t&&(t=[t]),l(e)&&(n=function(t,i){i[e]=w(t)}),i=0;i<t.length;i++)ft[t[i]]=n}function mt(t,e){gt(t,function(t,i,n,a){n._w=n._w||{},e(t,n._w,n,a)})}var pt=0,vt=1,yt=2,bt=3,xt=4,_t=5,kt=6,wt=7,Mt=8;function St(t){return Dt(t)?366:365}function Dt(t){return t%4==0&&t%100!=0||t%400==0}j(\"Y\",0,0,function(){var t=this.year();return t<=9999?\"\"+t:\"+\"+t}),j(0,[\"YY\",2],0,function(){return this.year()%100}),j(0,[\"YYYY\",4],0,\"year\"),j(0,[\"YYYYY\",5],0,\"year\"),j(0,[\"YYYYYY\",6,!0],0,\"year\"),R(\"year\",\"y\"),N(\"year\",1),dt(\"Y\",rt),dt(\"YY\",$,Z),dt(\"YYYY\",it,J),dt(\"YYYYY\",nt,K),dt(\"YYYYYY\",nt,K),gt([\"YYYYY\",\"YYYYYY\"],pt),gt(\"YYYY\",function(t,e){e[pt]=2===t.length?a.parseTwoDigitYear(t):w(t)}),gt(\"YY\",function(t,e){e[pt]=a.parseTwoDigitYear(t)}),gt(\"Y\",function(t,e){e[pt]=parseInt(t,10)}),a.parseTwoDigitYear=function(t){return w(t)+(w(t)>68?1900:2e3)};var Ct,Pt=Tt(\"FullYear\",!0);function Tt(t,e){return function(i){return null!=i?(It(this,t,i),a.updateOffset(this,e),this):Ot(this,t)}}function Ot(t,e){return t.isValid()?t._d[\"get\"+(t._isUTC?\"UTC\":\"\")+e]():NaN}function It(t,e,i){t.isValid()&&!isNaN(i)&&(\"FullYear\"===e&&Dt(t.year())&&1===t.month()&&29===t.date()?t._d[\"set\"+(t._isUTC?\"UTC\":\"\")+e](i,t.month(),At(i,t.month())):t._d[\"set\"+(t._isUTC?\"UTC\":\"\")+e](i))}function At(t,e){if(isNaN(t)||isNaN(e))return NaN;var i,n=(e%(i=12)+i)%i;return t+=(e-n)/12,1===n?Dt(t)?29:28:31-n%7%2}Ct=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e<this.length;++e)if(this[e]===t)return e;return-1},j(\"M\",[\"MM\",2],\"Mo\",function(){return this.month()+1}),j(\"MMM\",0,0,function(t){return this.localeData().monthsShort(this,t)}),j(\"MMMM\",0,0,function(t){return this.localeData().months(this,t)}),R(\"month\",\"M\"),N(\"month\",8),dt(\"M\",$),dt(\"MM\",$,Z),dt(\"MMM\",function(t,e){return e.monthsShortRegex(t)}),dt(\"MMMM\",function(t,e){return e.monthsRegex(t)}),gt([\"M\",\"MM\"],function(t,e){e[vt]=w(t)-1}),gt([\"MMM\",\"MMMM\"],function(t,e,i,n){var a=i._locale.monthsParse(t,n,i._strict);null!=a?e[vt]=a:g(i).invalidMonth=t});var Ft=/D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/,Rt=\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\");var Lt=\"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec\".split(\"_\");function Wt(t,e){var i;if(!t.isValid())return t;if(\"string\"==typeof e)if(/^\\d+$/.test(e))e=w(e);else if(!l(e=t.localeData().monthsParse(e)))return t;return i=Math.min(t.date(),At(t.year(),e)),t._d[\"set\"+(t._isUTC?\"UTC\":\"\")+\"Month\"](e,i),t}function Yt(t){return null!=t?(Wt(this,t),a.updateOffset(this,!0),this):Ot(this,\"Month\")}var Nt=lt;var zt=lt;function Ht(){function t(t,e){return e.length-t.length}var e,i,n=[],a=[],r=[];for(e=0;e<12;e++)i=f([2e3,e]),n.push(this.monthsShort(i,\"\")),a.push(this.months(i,\"\")),r.push(this.months(i,\"\")),r.push(this.monthsShort(i,\"\"));for(n.sort(t),a.sort(t),r.sort(t),e=0;e<12;e++)n[e]=ct(n[e]),a[e]=ct(a[e]);for(e=0;e<24;e++)r[e]=ct(r[e]);this._monthsRegex=new RegExp(\"^(\"+r.join(\"|\")+\")\",\"i\"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp(\"^(\"+a.join(\"|\")+\")\",\"i\"),this._monthsShortStrictRegex=new RegExp(\"^(\"+n.join(\"|\")+\")\",\"i\")}function Vt(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function Bt(t,e,i){var n=7+e-i;return-((7+Vt(t,0,n).getUTCDay()-e)%7)+n-1}function Et(t,e,i,n,a){var r,o,s=1+7*(e-1)+(7+i-n)%7+Bt(t,n,a);return s<=0?o=St(r=t-1)+s:s>St(t)?(r=t+1,o=s-St(t)):(r=t,o=s),{year:r,dayOfYear:o}}function jt(t,e,i){var n,a,r=Bt(t.year(),e,i),o=Math.floor((t.dayOfYear()-r-1)/7)+1;return o<1?n=o+Ut(a=t.year()-1,e,i):o>Ut(t.year(),e,i)?(n=o-Ut(t.year(),e,i),a=t.year()+1):(a=t.year(),n=o),{week:n,year:a}}function Ut(t,e,i){var n=Bt(t,e,i),a=Bt(t+1,e,i);return(St(t)-n+a)/7}j(\"w\",[\"ww\",2],\"wo\",\"week\"),j(\"W\",[\"WW\",2],\"Wo\",\"isoWeek\"),R(\"week\",\"w\"),R(\"isoWeek\",\"W\"),N(\"week\",5),N(\"isoWeek\",5),dt(\"w\",$),dt(\"ww\",$,Z),dt(\"W\",$),dt(\"WW\",$,Z),mt([\"w\",\"ww\",\"W\",\"WW\"],function(t,e,i,n){e[n.substr(0,1)]=w(t)});j(\"d\",0,\"do\",\"day\"),j(\"dd\",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),j(\"ddd\",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),j(\"dddd\",0,0,function(t){return this.localeData().weekdays(this,t)}),j(\"e\",0,0,\"weekday\"),j(\"E\",0,0,\"isoWeekday\"),R(\"day\",\"d\"),R(\"weekday\",\"e\"),R(\"isoWeekday\",\"E\"),N(\"day\",11),N(\"weekday\",11),N(\"isoWeekday\",11),dt(\"d\",$),dt(\"e\",$),dt(\"E\",$),dt(\"dd\",function(t,e){return e.weekdaysMinRegex(t)}),dt(\"ddd\",function(t,e){return e.weekdaysShortRegex(t)}),dt(\"dddd\",function(t,e){return e.weekdaysRegex(t)}),mt([\"dd\",\"ddd\",\"dddd\"],function(t,e,i,n){var a=i._locale.weekdaysParse(t,n,i._strict);null!=a?e.d=a:g(i).invalidWeekday=t}),mt([\"d\",\"e\",\"E\"],function(t,e,i,n){e[n]=w(t)});var qt=\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\");var Gt=\"Sun_Mon_Tue_Wed_Thu_Fri_Sat\".split(\"_\");var Zt=\"Su_Mo_Tu_We_Th_Fr_Sa\".split(\"_\");var Xt=lt;var Jt=lt;var Kt=lt;function $t(){function t(t,e){return e.length-t.length}var e,i,n,a,r,o=[],s=[],l=[],u=[];for(e=0;e<7;e++)i=f([2e3,1]).day(e),n=this.weekdaysMin(i,\"\"),a=this.weekdaysShort(i,\"\"),r=this.weekdays(i,\"\"),o.push(n),s.push(a),l.push(r),u.push(n),u.push(a),u.push(r);for(o.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=ct(s[e]),l[e]=ct(l[e]),u[e]=ct(u[e]);this._weekdaysRegex=new RegExp(\"^(\"+u.join(\"|\")+\")\",\"i\"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp(\"^(\"+l.join(\"|\")+\")\",\"i\"),this._weekdaysShortStrictRegex=new RegExp(\"^(\"+s.join(\"|\")+\")\",\"i\"),this._weekdaysMinStrictRegex=new RegExp(\"^(\"+o.join(\"|\")+\")\",\"i\")}function Qt(){return this.hours()%12||12}function te(t,e){j(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function ee(t,e){return e._meridiemParse}j(\"H\",[\"HH\",2],0,\"hour\"),j(\"h\",[\"hh\",2],0,Qt),j(\"k\",[\"kk\",2],0,function(){return this.hours()||24}),j(\"hmm\",0,0,function(){return\"\"+Qt.apply(this)+z(this.minutes(),2)}),j(\"hmmss\",0,0,function(){return\"\"+Qt.apply(this)+z(this.minutes(),2)+z(this.seconds(),2)}),j(\"Hmm\",0,0,function(){return\"\"+this.hours()+z(this.minutes(),2)}),j(\"Hmmss\",0,0,function(){return\"\"+this.hours()+z(this.minutes(),2)+z(this.seconds(),2)}),te(\"a\",!0),te(\"A\",!1),R(\"hour\",\"h\"),N(\"hour\",13),dt(\"a\",ee),dt(\"A\",ee),dt(\"H\",$),dt(\"h\",$),dt(\"k\",$),dt(\"HH\",$,Z),dt(\"hh\",$,Z),dt(\"kk\",$,Z),dt(\"hmm\",Q),dt(\"hmmss\",tt),dt(\"Hmm\",Q),dt(\"Hmmss\",tt),gt([\"H\",\"HH\"],bt),gt([\"k\",\"kk\"],function(t,e,i){var n=w(t);e[bt]=24===n?0:n}),gt([\"a\",\"A\"],function(t,e,i){i._isPm=i._locale.isPM(t),i._meridiem=t}),gt([\"h\",\"hh\"],function(t,e,i){e[bt]=w(t),g(i).bigHour=!0}),gt(\"hmm\",function(t,e,i){var n=t.length-2;e[bt]=w(t.substr(0,n)),e[xt]=w(t.substr(n)),g(i).bigHour=!0}),gt(\"hmmss\",function(t,e,i){var n=t.length-4,a=t.length-2;e[bt]=w(t.substr(0,n)),e[xt]=w(t.substr(n,2)),e[_t]=w(t.substr(a)),g(i).bigHour=!0}),gt(\"Hmm\",function(t,e,i){var n=t.length-2;e[bt]=w(t.substr(0,n)),e[xt]=w(t.substr(n))}),gt(\"Hmmss\",function(t,e,i){var n=t.length-4,a=t.length-2;e[bt]=w(t.substr(0,n)),e[xt]=w(t.substr(n,2)),e[_t]=w(t.substr(a))});var ie,ne=Tt(\"Hours\",!0),ae={calendar:{sameDay:\"[Today at] LT\",nextDay:\"[Tomorrow at] LT\",nextWeek:\"dddd [at] LT\",lastDay:\"[Yesterday at] LT\",lastWeek:\"[Last] dddd [at] LT\",sameElse:\"L\"},longDateFormat:{LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},invalidDate:\"Invalid date\",ordinal:\"%d\",dayOfMonthOrdinalParse:/\\d{1,2}/,relativeTime:{future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",ss:\"%d seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"},months:Rt,monthsShort:Lt,week:{dow:0,doy:6},weekdays:qt,weekdaysMin:Zt,weekdaysShort:Gt,meridiemParse:/[ap]\\.?m?\\.?/i},re={},oe={};function se(t){return t?t.toLowerCase().replace(\"_\",\"-\"):t}function le(i){var n=null;if(!re[i]&&void 0!==e&&e&&e.exports)try{n=ie._abbr,t(\"./locale/\"+i),ue(n)}catch(t){}return re[i]}function ue(t,e){var i;return t&&(i=s(e)?he(t):de(t,e))&&(ie=i),ie._abbr}function de(t,e){if(null!==e){var i=ae;if(e.abbr=t,null!=re[t])T(\"defineLocaleOverride\",\"use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info.\"),i=re[t]._config;else if(null!=e.parentLocale){if(null==re[e.parentLocale])return oe[e.parentLocale]||(oe[e.parentLocale]=[]),oe[e.parentLocale].push({name:t,config:e}),null;i=re[e.parentLocale]._config}return re[t]=new A(I(i,e)),oe[t]&&oe[t].forEach(function(t){de(t.name,t.config)}),ue(t),re[t]}return delete re[t],null}function he(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return ie;if(!r(t)){if(e=le(t))return e;t=[t]}return function(t){for(var e,i,n,a,r=0;r<t.length;){for(e=(a=se(t[r]).split(\"-\")).length,i=(i=se(t[r+1]))?i.split(\"-\"):null;e>0;){if(n=le(a.slice(0,e).join(\"-\")))return n;if(i&&i.length>=e&&M(a,i,!0)>=e-1)break;e--}r++}return null}(t)}function ce(t){var e,i=t._a;return i&&-2===g(t).overflow&&(e=i[vt]<0||i[vt]>11?vt:i[yt]<1||i[yt]>At(i[pt],i[vt])?yt:i[bt]<0||i[bt]>24||24===i[bt]&&(0!==i[xt]||0!==i[_t]||0!==i[kt])?bt:i[xt]<0||i[xt]>59?xt:i[_t]<0||i[_t]>59?_t:i[kt]<0||i[kt]>999?kt:-1,g(t)._overflowDayOfYear&&(e<pt||e>yt)&&(e=yt),g(t)._overflowWeeks&&-1===e&&(e=wt),g(t)._overflowWeekday&&-1===e&&(e=Mt),g(t).overflow=e),t}function fe(t,e,i){return null!=t?t:null!=e?e:i}function ge(t){var e,i,n,r,o,s=[];if(!t._d){var l,u;for(l=t,u=new Date(a.now()),n=l._useUTC?[u.getUTCFullYear(),u.getUTCMonth(),u.getUTCDate()]:[u.getFullYear(),u.getMonth(),u.getDate()],t._w&&null==t._a[yt]&&null==t._a[vt]&&function(t){var e,i,n,a,r,o,s,l;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)r=1,o=4,i=fe(e.GG,t._a[pt],jt(Te(),1,4).year),n=fe(e.W,1),((a=fe(e.E,1))<1||a>7)&&(l=!0);else{r=t._locale._week.dow,o=t._locale._week.doy;var u=jt(Te(),r,o);i=fe(e.gg,t._a[pt],u.year),n=fe(e.w,u.week),null!=e.d?((a=e.d)<0||a>6)&&(l=!0):null!=e.e?(a=e.e+r,(e.e<0||e.e>6)&&(l=!0)):a=r}n<1||n>Ut(i,r,o)?g(t)._overflowWeeks=!0:null!=l?g(t)._overflowWeekday=!0:(s=Et(i,n,a,r,o),t._a[pt]=s.year,t._dayOfYear=s.dayOfYear)}(t),null!=t._dayOfYear&&(o=fe(t._a[pt],n[pt]),(t._dayOfYear>St(o)||0===t._dayOfYear)&&(g(t)._overflowDayOfYear=!0),i=Vt(o,0,t._dayOfYear),t._a[vt]=i.getUTCMonth(),t._a[yt]=i.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=s[e]=n[e];for(;e<7;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[bt]&&0===t._a[xt]&&0===t._a[_t]&&0===t._a[kt]&&(t._nextDay=!0,t._a[bt]=0),t._d=(t._useUTC?Vt:function(t,e,i,n,a,r,o){var s=new Date(t,e,i,n,a,r,o);return t<100&&t>=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}).apply(null,s),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[bt]=24),t._w&&void 0!==t._w.d&&t._w.d!==r&&(g(t).weekdayMismatch=!0)}}var me=/^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,pe=/^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,ve=/Z|[+-]\\d\\d(?::?\\d\\d)?/,ye=[[\"YYYYYY-MM-DD\",/[+-]\\d{6}-\\d\\d-\\d\\d/],[\"YYYY-MM-DD\",/\\d{4}-\\d\\d-\\d\\d/],[\"GGGG-[W]WW-E\",/\\d{4}-W\\d\\d-\\d/],[\"GGGG-[W]WW\",/\\d{4}-W\\d\\d/,!1],[\"YYYY-DDD\",/\\d{4}-\\d{3}/],[\"YYYY-MM\",/\\d{4}-\\d\\d/,!1],[\"YYYYYYMMDD\",/[+-]\\d{10}/],[\"YYYYMMDD\",/\\d{8}/],[\"GGGG[W]WWE\",/\\d{4}W\\d{3}/],[\"GGGG[W]WW\",/\\d{4}W\\d{2}/,!1],[\"YYYYDDD\",/\\d{7}/]],be=[[\"HH:mm:ss.SSSS\",/\\d\\d:\\d\\d:\\d\\d\\.\\d+/],[\"HH:mm:ss,SSSS\",/\\d\\d:\\d\\d:\\d\\d,\\d+/],[\"HH:mm:ss\",/\\d\\d:\\d\\d:\\d\\d/],[\"HH:mm\",/\\d\\d:\\d\\d/],[\"HHmmss.SSSS\",/\\d\\d\\d\\d\\d\\d\\.\\d+/],[\"HHmmss,SSSS\",/\\d\\d\\d\\d\\d\\d,\\d+/],[\"HHmmss\",/\\d\\d\\d\\d\\d\\d/],[\"HHmm\",/\\d\\d\\d\\d/],[\"HH\",/\\d\\d/]],xe=/^\\/?Date\\((\\-?\\d+)/i;function _e(t){var e,i,n,a,r,o,s=t._i,l=me.exec(s)||pe.exec(s);if(l){for(g(t).iso=!0,e=0,i=ye.length;e<i;e++)if(ye[e][1].exec(l[1])){a=ye[e][0],n=!1!==ye[e][2];break}if(null==a)return void(t._isValid=!1);if(l[3]){for(e=0,i=be.length;e<i;e++)if(be[e][1].exec(l[3])){r=(l[2]||\" \")+be[e][0];break}if(null==r)return void(t._isValid=!1)}if(!n&&null!=r)return void(t._isValid=!1);if(l[4]){if(!ve.exec(l[4]))return void(t._isValid=!1);o=\"Z\"}t._f=a+(r||\"\")+(o||\"\"),De(t)}else t._isValid=!1}var ke=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/;function we(t,e,i,n,a,r){var o=[function(t){var e=parseInt(t,10);{if(e<=49)return 2e3+e;if(e<=999)return 1900+e}return e}(t),Lt.indexOf(e),parseInt(i,10),parseInt(n,10),parseInt(a,10)];return r&&o.push(parseInt(r,10)),o}var Me={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Se(t){var e,i,n,a=ke.exec(t._i.replace(/\\([^)]*\\)|[\\n\\t]/g,\" \").replace(/(\\s\\s+)/g,\" \").trim());if(a){var r=we(a[4],a[3],a[2],a[5],a[6],a[7]);if(e=a[1],i=r,n=t,e&&Gt.indexOf(e)!==new Date(i[0],i[1],i[2]).getDay()&&(g(n).weekdayMismatch=!0,n._isValid=!1,1))return;t._a=r,t._tzm=function(t,e,i){if(t)return Me[t];if(e)return 0;var n=parseInt(i,10),a=n%100;return(n-a)/100*60+a}(a[8],a[9],a[10]),t._d=Vt.apply(null,t._a),t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),g(t).rfc2822=!0}else t._isValid=!1}function De(t){if(t._f!==a.ISO_8601)if(t._f!==a.RFC_2822){t._a=[],g(t).empty=!0;var e,i,n,r,o,s,l,u,d=\"\"+t._i,c=d.length,f=0;for(n=q(t._f,t._locale).match(H)||[],e=0;e<n.length;e++)r=n[e],(i=(d.match(ht(r,t))||[])[0])&&((o=d.substr(0,d.indexOf(i))).length>0&&g(t).unusedInput.push(o),d=d.slice(d.indexOf(i)+i.length),f+=i.length),E[r]?(i?g(t).empty=!1:g(t).unusedTokens.push(r),s=r,u=t,null!=(l=i)&&h(ft,s)&&ft[s](l,u._a,u,s)):t._strict&&!i&&g(t).unusedTokens.push(r);g(t).charsLeftOver=c-f,d.length>0&&g(t).unusedInput.push(d),t._a[bt]<=12&&!0===g(t).bigHour&&t._a[bt]>0&&(g(t).bigHour=void 0),g(t).parsedDateParts=t._a.slice(0),g(t).meridiem=t._meridiem,t._a[bt]=function(t,e,i){var n;if(null==i)return e;return null!=t.meridiemHour?t.meridiemHour(e,i):null!=t.isPM?((n=t.isPM(i))&&e<12&&(e+=12),n||12!==e||(e=0),e):e}(t._locale,t._a[bt],t._meridiem),ge(t),ce(t)}else Se(t);else _e(t)}function Ce(t){var e,i,n,h,f=t._i,v=t._f;return t._locale=t._locale||he(t._l),null===f||void 0===v&&\"\"===f?p({nullInput:!0}):(\"string\"==typeof f&&(t._i=f=t._locale.preparse(f)),_(f)?new x(ce(f)):(u(f)?t._d=f:r(v)?function(t){var e,i,n,a,r;if(0===t._f.length)return g(t).invalidFormat=!0,void(t._d=new Date(NaN));for(a=0;a<t._f.length;a++)r=0,e=y({},t),null!=t._useUTC&&(e._useUTC=t._useUTC),e._f=t._f[a],De(e),m(e)&&(r+=g(e).charsLeftOver,r+=10*g(e).unusedTokens.length,g(e).score=r,(null==n||r<n)&&(n=r,i=e));c(t,i||e)}(t):v?De(t):s(i=(e=t)._i)?e._d=new Date(a.now()):u(i)?e._d=new Date(i.valueOf()):\"string\"==typeof i?(n=e,null===(h=xe.exec(n._i))?(_e(n),!1===n._isValid&&(delete n._isValid,Se(n),!1===n._isValid&&(delete n._isValid,a.createFromInputFallback(n)))):n._d=new Date(+h[1])):r(i)?(e._a=d(i.slice(0),function(t){return parseInt(t,10)}),ge(e)):o(i)?function(t){if(!t._d){var e=W(t._i);t._a=d([e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],function(t){return t&&parseInt(t,10)}),ge(t)}}(e):l(i)?e._d=new Date(i):a.createFromInputFallback(e),m(t)||(t._d=null),t))}function Pe(t,e,i,n,a){var s,l={};return!0!==i&&!1!==i||(n=i,i=void 0),(o(t)&&function(t){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(t).length;var e;for(e in t)if(t.hasOwnProperty(e))return!1;return!0}(t)||r(t)&&0===t.length)&&(t=void 0),l._isAMomentObject=!0,l._useUTC=l._isUTC=a,l._l=i,l._i=t,l._f=e,l._strict=n,(s=new x(ce(Ce(l))))._nextDay&&(s.add(1,\"d\"),s._nextDay=void 0),s}function Te(t,e,i,n){return Pe(t,e,i,n,!1)}a.createFromInputFallback=D(\"value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.\",function(t){t._d=new Date(t._i+(t._useUTC?\" UTC\":\"\"))}),a.ISO_8601=function(){},a.RFC_2822=function(){};var Oe=D(\"moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/\",function(){var t=Te.apply(null,arguments);return this.isValid()&&t.isValid()?t<this?this:t:p()}),Ie=D(\"moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/\",function(){var t=Te.apply(null,arguments);return this.isValid()&&t.isValid()?t>this?this:t:p()});function Ae(t,e){var i,n;if(1===e.length&&r(e[0])&&(e=e[0]),!e.length)return Te();for(i=e[0],n=1;n<e.length;++n)e[n].isValid()&&!e[n][t](i)||(i=e[n]);return i}var Fe=[\"year\",\"quarter\",\"month\",\"week\",\"day\",\"hour\",\"minute\",\"second\",\"millisecond\"];function Re(t){var e=W(t),i=e.year||0,n=e.quarter||0,a=e.month||0,r=e.week||0,o=e.day||0,s=e.hour||0,l=e.minute||0,u=e.second||0,d=e.millisecond||0;this._isValid=function(t){for(var e in t)if(-1===Ct.call(Fe,e)||null!=t[e]&&isNaN(t[e]))return!1;for(var i=!1,n=0;n<Fe.length;++n)if(t[Fe[n]]){if(i)return!1;parseFloat(t[Fe[n]])!==w(t[Fe[n]])&&(i=!0)}return!0}(e),this._milliseconds=+d+1e3*u+6e4*l+1e3*s*60*60,this._days=+o+7*r,this._months=+a+3*n+12*i,this._data={},this._locale=he(),this._bubble()}function Le(t){return t instanceof Re}function We(t){return t<0?-1*Math.round(-1*t):Math.round(t)}function Ye(t,e){j(t,0,0,function(){var t=this.utcOffset(),i=\"+\";return t<0&&(t=-t,i=\"-\"),i+z(~~(t/60),2)+e+z(~~t%60,2)})}Ye(\"Z\",\":\"),Ye(\"ZZ\",\"\"),dt(\"Z\",st),dt(\"ZZ\",st),gt([\"Z\",\"ZZ\"],function(t,e,i){i._useUTC=!0,i._tzm=ze(st,t)});var Ne=/([\\+\\-]|\\d\\d)/gi;function ze(t,e){var i=(e||\"\").match(t);if(null===i)return null;var n=((i[i.length-1]||[])+\"\").match(Ne)||[\"-\",0,0],a=60*n[1]+w(n[2]);return 0===a?0:\"+\"===n[0]?a:-a}function He(t,e){var i,n;return e._isUTC?(i=e.clone(),n=(_(t)||u(t)?t.valueOf():Te(t).valueOf())-i.valueOf(),i._d.setTime(i._d.valueOf()+n),a.updateOffset(i,!1),i):Te(t).local()}function Ve(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function Be(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}a.updateOffset=function(){};var Ee=/^(\\-|\\+)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/,je=/^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Ue(t,e){var i,n,a,r=t,o=null;return Le(t)?r={ms:t._milliseconds,d:t._days,M:t._months}:l(t)?(r={},e?r[e]=t:r.milliseconds=t):(o=Ee.exec(t))?(i=\"-\"===o[1]?-1:1,r={y:0,d:w(o[yt])*i,h:w(o[bt])*i,m:w(o[xt])*i,s:w(o[_t])*i,ms:w(We(1e3*o[kt]))*i}):(o=je.exec(t))?(i=\"-\"===o[1]?-1:(o[1],1),r={y:qe(o[2],i),M:qe(o[3],i),w:qe(o[4],i),d:qe(o[5],i),h:qe(o[6],i),m:qe(o[7],i),s:qe(o[8],i)}):null==r?r={}:\"object\"==typeof r&&(\"from\"in r||\"to\"in r)&&(a=function(t,e){var i;if(!t.isValid()||!e.isValid())return{milliseconds:0,months:0};e=He(e,t),t.isBefore(e)?i=Ge(t,e):((i=Ge(e,t)).milliseconds=-i.milliseconds,i.months=-i.months);return i}(Te(r.from),Te(r.to)),(r={}).ms=a.milliseconds,r.M=a.months),n=new Re(r),Le(t)&&h(t,\"_locale\")&&(n._locale=t._locale),n}function qe(t,e){var i=t&&parseFloat(t.replace(\",\",\".\"));return(isNaN(i)?0:i)*e}function Ge(t,e){var i={milliseconds:0,months:0};return i.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(i.months,\"M\").isAfter(e)&&--i.months,i.milliseconds=+e-+t.clone().add(i.months,\"M\"),i}function Ze(t,e){return function(i,n){var a;return null===n||isNaN(+n)||(T(e,\"moment().\"+e+\"(period, number) is deprecated. Please use moment().\"+e+\"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.\"),a=i,i=n,n=a),Xe(this,Ue(i=\"string\"==typeof i?+i:i,n),t),this}}function Xe(t,e,i,n){var r=e._milliseconds,o=We(e._days),s=We(e._months);t.isValid()&&(n=null==n||n,s&&Wt(t,Ot(t,\"Month\")+s*i),o&&It(t,\"Date\",Ot(t,\"Date\")+o*i),r&&t._d.setTime(t._d.valueOf()+r*i),n&&a.updateOffset(t,o||s))}Ue.fn=Re.prototype,Ue.invalid=function(){return Ue(NaN)};var Je=Ze(1,\"add\"),Ke=Ze(-1,\"subtract\");function $e(t,e){var i=12*(e.year()-t.year())+(e.month()-t.month()),n=t.clone().add(i,\"months\");return-(i+(e-n<0?(e-n)/(n-t.clone().add(i-1,\"months\")):(e-n)/(t.clone().add(i+1,\"months\")-n)))||0}function Qe(t){var e;return void 0===t?this._locale._abbr:(null!=(e=he(t))&&(this._locale=e),this)}a.defaultFormat=\"YYYY-MM-DDTHH:mm:ssZ\",a.defaultFormatUtc=\"YYYY-MM-DDTHH:mm:ss[Z]\";var ti=D(\"moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.\",function(t){return void 0===t?this.localeData():this.locale(t)});function ei(){return this._locale}function ii(t,e){j(0,[t,t.length],0,e)}function ni(t,e,i,n,a){var r;return null==t?jt(this,n,a).year:(e>(r=Ut(t,n,a))&&(e=r),function(t,e,i,n,a){var r=Et(t,e,i,n,a),o=Vt(r.year,0,r.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}.call(this,t,e,i,n,a))}j(0,[\"gg\",2],0,function(){return this.weekYear()%100}),j(0,[\"GG\",2],0,function(){return this.isoWeekYear()%100}),ii(\"gggg\",\"weekYear\"),ii(\"ggggg\",\"weekYear\"),ii(\"GGGG\",\"isoWeekYear\"),ii(\"GGGGG\",\"isoWeekYear\"),R(\"weekYear\",\"gg\"),R(\"isoWeekYear\",\"GG\"),N(\"weekYear\",1),N(\"isoWeekYear\",1),dt(\"G\",rt),dt(\"g\",rt),dt(\"GG\",$,Z),dt(\"gg\",$,Z),dt(\"GGGG\",it,J),dt(\"gggg\",it,J),dt(\"GGGGG\",nt,K),dt(\"ggggg\",nt,K),mt([\"gggg\",\"ggggg\",\"GGGG\",\"GGGGG\"],function(t,e,i,n){e[n.substr(0,2)]=w(t)}),mt([\"gg\",\"GG\"],function(t,e,i,n){e[n]=a.parseTwoDigitYear(t)}),j(\"Q\",0,\"Qo\",\"quarter\"),R(\"quarter\",\"Q\"),N(\"quarter\",7),dt(\"Q\",G),gt(\"Q\",function(t,e){e[vt]=3*(w(t)-1)}),j(\"D\",[\"DD\",2],\"Do\",\"date\"),R(\"date\",\"D\"),N(\"date\",9),dt(\"D\",$),dt(\"DD\",$,Z),dt(\"Do\",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),gt([\"D\",\"DD\"],yt),gt(\"Do\",function(t,e){e[yt]=w(t.match($)[0])});var ai=Tt(\"Date\",!0);j(\"DDD\",[\"DDDD\",3],\"DDDo\",\"dayOfYear\"),R(\"dayOfYear\",\"DDD\"),N(\"dayOfYear\",4),dt(\"DDD\",et),dt(\"DDDD\",X),gt([\"DDD\",\"DDDD\"],function(t,e,i){i._dayOfYear=w(t)}),j(\"m\",[\"mm\",2],0,\"minute\"),R(\"minute\",\"m\"),N(\"minute\",14),dt(\"m\",$),dt(\"mm\",$,Z),gt([\"m\",\"mm\"],xt);var ri=Tt(\"Minutes\",!1);j(\"s\",[\"ss\",2],0,\"second\"),R(\"second\",\"s\"),N(\"second\",15),dt(\"s\",$),dt(\"ss\",$,Z),gt([\"s\",\"ss\"],_t);var oi,si=Tt(\"Seconds\",!1);for(j(\"S\",0,0,function(){return~~(this.millisecond()/100)}),j(0,[\"SS\",2],0,function(){return~~(this.millisecond()/10)}),j(0,[\"SSS\",3],0,\"millisecond\"),j(0,[\"SSSS\",4],0,function(){return 10*this.millisecond()}),j(0,[\"SSSSS\",5],0,function(){return 100*this.millisecond()}),j(0,[\"SSSSSS\",6],0,function(){return 1e3*this.millisecond()}),j(0,[\"SSSSSSS\",7],0,function(){return 1e4*this.millisecond()}),j(0,[\"SSSSSSSS\",8],0,function(){return 1e5*this.millisecond()}),j(0,[\"SSSSSSSSS\",9],0,function(){return 1e6*this.millisecond()}),R(\"millisecond\",\"ms\"),N(\"millisecond\",16),dt(\"S\",et,G),dt(\"SS\",et,Z),dt(\"SSS\",et,X),oi=\"SSSS\";oi.length<=9;oi+=\"S\")dt(oi,at);function li(t,e){e[kt]=w(1e3*(\"0.\"+t))}for(oi=\"S\";oi.length<=9;oi+=\"S\")gt(oi,li);var ui=Tt(\"Milliseconds\",!1);j(\"z\",0,0,\"zoneAbbr\"),j(\"zz\",0,0,\"zoneName\");var di=x.prototype;function hi(t){return t}di.add=Je,di.calendar=function(t,e){var i=t||Te(),n=He(i,this).startOf(\"day\"),r=a.calendarFormat(this,n)||\"sameElse\",o=e&&(O(e[r])?e[r].call(this,i):e[r]);return this.format(o||this.localeData().calendar(r,this,Te(i)))},di.clone=function(){return new x(this)},di.diff=function(t,e,i){var n,a,r;if(!this.isValid())return NaN;if(!(n=He(t,this)).isValid())return NaN;switch(a=6e4*(n.utcOffset()-this.utcOffset()),e=L(e)){case\"year\":r=$e(this,n)/12;break;case\"month\":r=$e(this,n);break;case\"quarter\":r=$e(this,n)/3;break;case\"second\":r=(this-n)/1e3;break;case\"minute\":r=(this-n)/6e4;break;case\"hour\":r=(this-n)/36e5;break;case\"day\":r=(this-n-a)/864e5;break;case\"week\":r=(this-n-a)/6048e5;break;default:r=this-n}return i?r:k(r)},di.endOf=function(t){return void 0===(t=L(t))||\"millisecond\"===t?this:(\"date\"===t&&(t=\"day\"),this.startOf(t).add(1,\"isoWeek\"===t?\"week\":t).subtract(1,\"ms\"))},di.format=function(t){t||(t=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var e=U(this,t);return this.localeData().postformat(e)},di.from=function(t,e){return this.isValid()&&(_(t)&&t.isValid()||Te(t).isValid())?Ue({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},di.fromNow=function(t){return this.from(Te(),t)},di.to=function(t,e){return this.isValid()&&(_(t)&&t.isValid()||Te(t).isValid())?Ue({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},di.toNow=function(t){return this.to(Te(),t)},di.get=function(t){return O(this[t=L(t)])?this[t]():this},di.invalidAt=function(){return g(this).overflow},di.isAfter=function(t,e){var i=_(t)?t:Te(t);return!(!this.isValid()||!i.isValid())&&(\"millisecond\"===(e=L(s(e)?\"millisecond\":e))?this.valueOf()>i.valueOf():i.valueOf()<this.clone().startOf(e).valueOf())},di.isBefore=function(t,e){var i=_(t)?t:Te(t);return!(!this.isValid()||!i.isValid())&&(\"millisecond\"===(e=L(s(e)?\"millisecond\":e))?this.valueOf()<i.valueOf():this.clone().endOf(e).valueOf()<i.valueOf())},di.isBetween=function(t,e,i,n){return(\"(\"===(n=n||\"()\")[0]?this.isAfter(t,i):!this.isBefore(t,i))&&(\")\"===n[1]?this.isBefore(e,i):!this.isAfter(e,i))},di.isSame=function(t,e){var i,n=_(t)?t:Te(t);return!(!this.isValid()||!n.isValid())&&(\"millisecond\"===(e=L(e||\"millisecond\"))?this.valueOf()===n.valueOf():(i=n.valueOf(),this.clone().startOf(e).valueOf()<=i&&i<=this.clone().endOf(e).valueOf()))},di.isSameOrAfter=function(t,e){return this.isSame(t,e)||this.isAfter(t,e)},di.isSameOrBefore=function(t,e){return this.isSame(t,e)||this.isBefore(t,e)},di.isValid=function(){return m(this)},di.lang=ti,di.locale=Qe,di.localeData=ei,di.max=Ie,di.min=Oe,di.parsingFlags=function(){return c({},g(this))},di.set=function(t,e){if(\"object\"==typeof t)for(var i=function(t){var e=[];for(var i in t)e.push({unit:i,priority:Y[i]});return e.sort(function(t,e){return t.priority-e.priority}),e}(t=W(t)),n=0;n<i.length;n++)this[i[n].unit](t[i[n].unit]);else if(O(this[t=L(t)]))return this[t](e);return this},di.startOf=function(t){switch(t=L(t)){case\"year\":this.month(0);case\"quarter\":case\"month\":this.date(1);case\"week\":case\"isoWeek\":case\"day\":case\"date\":this.hours(0);case\"hour\":this.minutes(0);case\"minute\":this.seconds(0);case\"second\":this.milliseconds(0)}return\"week\"===t&&this.weekday(0),\"isoWeek\"===t&&this.isoWeekday(1),\"quarter\"===t&&this.month(3*Math.floor(this.month()/3)),this},di.subtract=Ke,di.toArray=function(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]},di.toObject=function(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}},di.toDate=function(){return new Date(this.valueOf())},di.toISOString=function(t){if(!this.isValid())return null;var e=!0!==t,i=e?this.clone().utc():this;return i.year()<0||i.year()>9999?U(i,e?\"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]\":\"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ\"):O(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this._d.valueOf()).toISOString().replace(\"Z\",U(i,\"Z\")):U(i,e?\"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]\":\"YYYY-MM-DD[T]HH:mm:ss.SSSZ\")},di.inspect=function(){if(!this.isValid())return\"moment.invalid(/* \"+this._i+\" */)\";var t=\"moment\",e=\"\";this.isLocal()||(t=0===this.utcOffset()?\"moment.utc\":\"moment.parseZone\",e=\"Z\");var i=\"[\"+t+'(\"]',n=0<=this.year()&&this.year()<=9999?\"YYYY\":\"YYYYYY\",a=e+'[\")]';return this.format(i+n+\"-MM-DD[T]HH:mm:ss.SSS\"+a)},di.toJSON=function(){return this.isValid()?this.toISOString():null},di.toString=function(){return this.clone().locale(\"en\").format(\"ddd MMM DD YYYY HH:mm:ss [GMT]ZZ\")},di.unix=function(){return Math.floor(this.valueOf()/1e3)},di.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},di.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},di.year=Pt,di.isLeapYear=function(){return Dt(this.year())},di.weekYear=function(t){return ni.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},di.isoWeekYear=function(t){return ni.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},di.quarter=di.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},di.month=Yt,di.daysInMonth=function(){return At(this.year(),this.month())},di.week=di.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),\"d\")},di.isoWeek=di.isoWeeks=function(t){var e=jt(this,1,4).week;return null==t?e:this.add(7*(t-e),\"d\")},di.weeksInYear=function(){var t=this.localeData()._week;return Ut(this.year(),t.dow,t.doy)},di.isoWeeksInYear=function(){return Ut(this.year(),1,4)},di.date=ai,di.day=di.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e,i,n=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(e=t,i=this.localeData(),t=\"string\"!=typeof e?e:isNaN(e)?\"number\"==typeof(e=i.weekdaysParse(e))?e:null:parseInt(e,10),this.add(t-n,\"d\")):n},di.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,\"d\")},di.isoWeekday=function(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=(i=t,n=this.localeData(),\"string\"==typeof i?n.weekdaysParse(i)%7||7:isNaN(i)?null:i);return this.day(this.day()%7?e:e-7)}return this.day()||7;var i,n},di.dayOfYear=function(t){var e=Math.round((this.clone().startOf(\"day\")-this.clone().startOf(\"year\"))/864e5)+1;return null==t?e:this.add(t-e,\"d\")},di.hour=di.hours=ne,di.minute=di.minutes=ri,di.second=di.seconds=si,di.millisecond=di.milliseconds=ui,di.utcOffset=function(t,e,i){var n,r=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if(\"string\"==typeof t){if(null===(t=ze(st,t)))return this}else Math.abs(t)<16&&!i&&(t*=60);return!this._isUTC&&e&&(n=Ve(this)),this._offset=t,this._isUTC=!0,null!=n&&this.add(n,\"m\"),r!==t&&(!e||this._changeInProgress?Xe(this,Ue(t-r,\"m\"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?r:Ve(this)},di.utc=function(t){return this.utcOffset(0,t)},di.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Ve(this),\"m\")),this},di.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if(\"string\"==typeof this._i){var t=ze(ot,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this},di.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Te(t).utcOffset():0,(this.utcOffset()-t)%60==0)},di.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},di.isLocal=function(){return!!this.isValid()&&!this._isUTC},di.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},di.isUtc=Be,di.isUTC=Be,di.zoneAbbr=function(){return this._isUTC?\"UTC\":\"\"},di.zoneName=function(){return this._isUTC?\"Coordinated Universal Time\":\"\"},di.dates=D(\"dates accessor is deprecated. Use date instead.\",ai),di.months=D(\"months accessor is deprecated. Use month instead\",Yt),di.years=D(\"years accessor is deprecated. Use year instead\",Pt),di.zone=D(\"moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/\",function(t,e){return null!=t?(\"string\"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}),di.isDSTShifted=D(\"isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information\",function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(y(t,this),(t=Ce(t))._a){var e=t._isUTC?f(t._a):Te(t._a);this._isDSTShifted=this.isValid()&&M(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var ci=A.prototype;function fi(t,e,i,n){var a=he(),r=f().set(n,e);return a[i](r,t)}function gi(t,e,i){if(l(t)&&(e=t,t=void 0),t=t||\"\",null!=e)return fi(t,e,i,\"month\");var n,a=[];for(n=0;n<12;n++)a[n]=fi(t,n,i,\"month\");return a}function mi(t,e,i,n){\"boolean\"==typeof t?(l(e)&&(i=e,e=void 0),e=e||\"\"):(i=e=t,t=!1,l(e)&&(i=e,e=void 0),e=e||\"\");var a,r=he(),o=t?r._week.dow:0;if(null!=i)return fi(e,(i+o)%7,n,\"day\");var s=[];for(a=0;a<7;a++)s[a]=fi(e,(a+o)%7,n,\"day\");return s}ci.calendar=function(t,e,i){var n=this._calendar[t]||this._calendar.sameElse;return O(n)?n.call(e,i):n},ci.longDateFormat=function(t){var e=this._longDateFormat[t],i=this._longDateFormat[t.toUpperCase()];return e||!i?e:(this._longDateFormat[t]=i.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])},ci.invalidDate=function(){return this._invalidDate},ci.ordinal=function(t){return this._ordinal.replace(\"%d\",t)},ci.preparse=hi,ci.postformat=hi,ci.relativeTime=function(t,e,i,n){var a=this._relativeTime[i];return O(a)?a(t,e,i,n):a.replace(/%d/i,t)},ci.pastFuture=function(t,e){var i=this._relativeTime[t>0?\"future\":\"past\"];return O(i)?i(e):i.replace(/%s/i,e)},ci.set=function(t){var e,i;for(i in t)O(e=t[i])?this[i]=e:this[\"_\"+i]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+\"|\"+/\\d{1,2}/.source)},ci.months=function(t,e){return t?r(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||Ft).test(e)?\"format\":\"standalone\"][t.month()]:r(this._months)?this._months:this._months.standalone},ci.monthsShort=function(t,e){return t?r(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[Ft.test(e)?\"format\":\"standalone\"][t.month()]:r(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},ci.monthsParse=function(t,e,i){var n,a,r;if(this._monthsParseExact)return function(t,e,i){var n,a,r,o=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],n=0;n<12;++n)r=f([2e3,n]),this._shortMonthsParse[n]=this.monthsShort(r,\"\").toLocaleLowerCase(),this._longMonthsParse[n]=this.months(r,\"\").toLocaleLowerCase();return i?\"MMM\"===e?-1!==(a=Ct.call(this._shortMonthsParse,o))?a:null:-1!==(a=Ct.call(this._longMonthsParse,o))?a:null:\"MMM\"===e?-1!==(a=Ct.call(this._shortMonthsParse,o))?a:-1!==(a=Ct.call(this._longMonthsParse,o))?a:null:-1!==(a=Ct.call(this._longMonthsParse,o))?a:-1!==(a=Ct.call(this._shortMonthsParse,o))?a:null}.call(this,t,e,i);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),n=0;n<12;n++){if(a=f([2e3,n]),i&&!this._longMonthsParse[n]&&(this._longMonthsParse[n]=new RegExp(\"^\"+this.months(a,\"\").replace(\".\",\"\")+\"$\",\"i\"),this._shortMonthsParse[n]=new RegExp(\"^\"+this.monthsShort(a,\"\").replace(\".\",\"\")+\"$\",\"i\")),i||this._monthsParse[n]||(r=\"^\"+this.months(a,\"\")+\"|^\"+this.monthsShort(a,\"\"),this._monthsParse[n]=new RegExp(r.replace(\".\",\"\"),\"i\")),i&&\"MMMM\"===e&&this._longMonthsParse[n].test(t))return n;if(i&&\"MMM\"===e&&this._shortMonthsParse[n].test(t))return n;if(!i&&this._monthsParse[n].test(t))return n}},ci.monthsRegex=function(t){return this._monthsParseExact?(h(this,\"_monthsRegex\")||Ht.call(this),t?this._monthsStrictRegex:this._monthsRegex):(h(this,\"_monthsRegex\")||(this._monthsRegex=zt),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},ci.monthsShortRegex=function(t){return this._monthsParseExact?(h(this,\"_monthsRegex\")||Ht.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(h(this,\"_monthsShortRegex\")||(this._monthsShortRegex=Nt),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},ci.week=function(t){return jt(t,this._week.dow,this._week.doy).week},ci.firstDayOfYear=function(){return this._week.doy},ci.firstDayOfWeek=function(){return this._week.dow},ci.weekdays=function(t,e){return t?r(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?\"format\":\"standalone\"][t.day()]:r(this._weekdays)?this._weekdays:this._weekdays.standalone},ci.weekdaysMin=function(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin},ci.weekdaysShort=function(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort},ci.weekdaysParse=function(t,e,i){var n,a,r;if(this._weekdaysParseExact)return function(t,e,i){var n,a,r,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],n=0;n<7;++n)r=f([2e3,1]).day(n),this._minWeekdaysParse[n]=this.weekdaysMin(r,\"\").toLocaleLowerCase(),this._shortWeekdaysParse[n]=this.weekdaysShort(r,\"\").toLocaleLowerCase(),this._weekdaysParse[n]=this.weekdays(r,\"\").toLocaleLowerCase();return i?\"dddd\"===e?-1!==(a=Ct.call(this._weekdaysParse,o))?a:null:\"ddd\"===e?-1!==(a=Ct.call(this._shortWeekdaysParse,o))?a:null:-1!==(a=Ct.call(this._minWeekdaysParse,o))?a:null:\"dddd\"===e?-1!==(a=Ct.call(this._weekdaysParse,o))?a:-1!==(a=Ct.call(this._shortWeekdaysParse,o))?a:-1!==(a=Ct.call(this._minWeekdaysParse,o))?a:null:\"ddd\"===e?-1!==(a=Ct.call(this._shortWeekdaysParse,o))?a:-1!==(a=Ct.call(this._weekdaysParse,o))?a:-1!==(a=Ct.call(this._minWeekdaysParse,o))?a:null:-1!==(a=Ct.call(this._minWeekdaysParse,o))?a:-1!==(a=Ct.call(this._weekdaysParse,o))?a:-1!==(a=Ct.call(this._shortWeekdaysParse,o))?a:null}.call(this,t,e,i);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),n=0;n<7;n++){if(a=f([2e3,1]).day(n),i&&!this._fullWeekdaysParse[n]&&(this._fullWeekdaysParse[n]=new RegExp(\"^\"+this.weekdays(a,\"\").replace(\".\",\".?\")+\"$\",\"i\"),this._shortWeekdaysParse[n]=new RegExp(\"^\"+this.weekdaysShort(a,\"\").replace(\".\",\".?\")+\"$\",\"i\"),this._minWeekdaysParse[n]=new RegExp(\"^\"+this.weekdaysMin(a,\"\").replace(\".\",\".?\")+\"$\",\"i\")),this._weekdaysParse[n]||(r=\"^\"+this.weekdays(a,\"\")+\"|^\"+this.weekdaysShort(a,\"\")+\"|^\"+this.weekdaysMin(a,\"\"),this._weekdaysParse[n]=new RegExp(r.replace(\".\",\"\"),\"i\")),i&&\"dddd\"===e&&this._fullWeekdaysParse[n].test(t))return n;if(i&&\"ddd\"===e&&this._shortWeekdaysParse[n].test(t))return n;if(i&&\"dd\"===e&&this._minWeekdaysParse[n].test(t))return n;if(!i&&this._weekdaysParse[n].test(t))return n}},ci.weekdaysRegex=function(t){return this._weekdaysParseExact?(h(this,\"_weekdaysRegex\")||$t.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(h(this,\"_weekdaysRegex\")||(this._weekdaysRegex=Xt),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},ci.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(h(this,\"_weekdaysRegex\")||$t.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(h(this,\"_weekdaysShortRegex\")||(this._weekdaysShortRegex=Jt),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},ci.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(h(this,\"_weekdaysRegex\")||$t.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(h(this,\"_weekdaysMinRegex\")||(this._weekdaysMinRegex=Kt),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},ci.isPM=function(t){return\"p\"===(t+\"\").toLowerCase().charAt(0)},ci.meridiem=function(t,e,i){return t>11?i?\"pm\":\"PM\":i?\"am\":\"AM\"},ue(\"en\",{dayOfMonthOrdinalParse:/\\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===w(t%100/10)?\"th\":1===e?\"st\":2===e?\"nd\":3===e?\"rd\":\"th\")}}),a.lang=D(\"moment.lang is deprecated. Use moment.locale instead.\",ue),a.langData=D(\"moment.langData is deprecated. Use moment.localeData instead.\",he);var pi=Math.abs;function vi(t,e,i,n){var a=Ue(e,i);return t._milliseconds+=n*a._milliseconds,t._days+=n*a._days,t._months+=n*a._months,t._bubble()}function yi(t){return t<0?Math.floor(t):Math.ceil(t)}function bi(t){return 4800*t/146097}function xi(t){return 146097*t/4800}function _i(t){return function(){return this.as(t)}}var ki=_i(\"ms\"),wi=_i(\"s\"),Mi=_i(\"m\"),Si=_i(\"h\"),Di=_i(\"d\"),Ci=_i(\"w\"),Pi=_i(\"M\"),Ti=_i(\"y\");function Oi(t){return function(){return this.isValid()?this._data[t]:NaN}}var Ii=Oi(\"milliseconds\"),Ai=Oi(\"seconds\"),Fi=Oi(\"minutes\"),Ri=Oi(\"hours\"),Li=Oi(\"days\"),Wi=Oi(\"months\"),Yi=Oi(\"years\");var Ni=Math.round,zi={ss:44,s:45,m:45,h:22,d:26,M:11};var Hi=Math.abs;function Vi(t){return(t>0)-(t<0)||+t}function Bi(){if(!this.isValid())return this.localeData().invalidDate();var t,e,i=Hi(this._milliseconds)/1e3,n=Hi(this._days),a=Hi(this._months);e=k((t=k(i/60))/60),i%=60,t%=60;var r=k(a/12),o=a%=12,s=n,l=e,u=t,d=i?i.toFixed(3).replace(/\\.?0+$/,\"\"):\"\",h=this.asSeconds();if(!h)return\"P0D\";var c=h<0?\"-\":\"\",f=Vi(this._months)!==Vi(h)?\"-\":\"\",g=Vi(this._days)!==Vi(h)?\"-\":\"\",m=Vi(this._milliseconds)!==Vi(h)?\"-\":\"\";return c+\"P\"+(r?f+r+\"Y\":\"\")+(o?f+o+\"M\":\"\")+(s?g+s+\"D\":\"\")+(l||u||d?\"T\":\"\")+(l?m+l+\"H\":\"\")+(u?m+u+\"M\":\"\")+(d?m+d+\"S\":\"\")}var Ei=Re.prototype;return Ei.isValid=function(){return this._isValid},Ei.abs=function(){var t=this._data;return this._milliseconds=pi(this._milliseconds),this._days=pi(this._days),this._months=pi(this._months),t.milliseconds=pi(t.milliseconds),t.seconds=pi(t.seconds),t.minutes=pi(t.minutes),t.hours=pi(t.hours),t.months=pi(t.months),t.years=pi(t.years),this},Ei.add=function(t,e){return vi(this,t,e,1)},Ei.subtract=function(t,e){return vi(this,t,e,-1)},Ei.as=function(t){if(!this.isValid())return NaN;var e,i,n=this._milliseconds;if(\"month\"===(t=L(t))||\"year\"===t)return e=this._days+n/864e5,i=this._months+bi(e),\"month\"===t?i:i/12;switch(e=this._days+Math.round(xi(this._months)),t){case\"week\":return e/7+n/6048e5;case\"day\":return e+n/864e5;case\"hour\":return 24*e+n/36e5;case\"minute\":return 1440*e+n/6e4;case\"second\":return 86400*e+n/1e3;case\"millisecond\":return Math.floor(864e5*e)+n;default:throw new Error(\"Unknown unit \"+t)}},Ei.asMilliseconds=ki,Ei.asSeconds=wi,Ei.asMinutes=Mi,Ei.asHours=Si,Ei.asDays=Di,Ei.asWeeks=Ci,Ei.asMonths=Pi,Ei.asYears=Ti,Ei.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*w(this._months/12):NaN},Ei._bubble=function(){var t,e,i,n,a,r=this._milliseconds,o=this._days,s=this._months,l=this._data;return r>=0&&o>=0&&s>=0||r<=0&&o<=0&&s<=0||(r+=864e5*yi(xi(s)+o),o=0,s=0),l.milliseconds=r%1e3,t=k(r/1e3),l.seconds=t%60,e=k(t/60),l.minutes=e%60,i=k(e/60),l.hours=i%24,s+=a=k(bi(o+=k(i/24))),o-=yi(xi(a)),n=k(s/12),s%=12,l.days=o,l.months=s,l.years=n,this},Ei.clone=function(){return Ue(this)},Ei.get=function(t){return t=L(t),this.isValid()?this[t+\"s\"]():NaN},Ei.milliseconds=Ii,Ei.seconds=Ai,Ei.minutes=Fi,Ei.hours=Ri,Ei.days=Li,Ei.weeks=function(){return k(this.days()/7)},Ei.months=Wi,Ei.years=Yi,Ei.humanize=function(t){if(!this.isValid())return this.localeData().invalidDate();var e,i,n,a,r,o,s,l,u,d,h,c=this.localeData(),f=(i=!t,n=c,a=Ue(e=this).abs(),r=Ni(a.as(\"s\")),o=Ni(a.as(\"m\")),s=Ni(a.as(\"h\")),l=Ni(a.as(\"d\")),u=Ni(a.as(\"M\")),d=Ni(a.as(\"y\")),(h=r<=zi.ss&&[\"s\",r]||r<zi.s&&[\"ss\",r]||o<=1&&[\"m\"]||o<zi.m&&[\"mm\",o]||s<=1&&[\"h\"]||s<zi.h&&[\"hh\",s]||l<=1&&[\"d\"]||l<zi.d&&[\"dd\",l]||u<=1&&[\"M\"]||u<zi.M&&[\"MM\",u]||d<=1&&[\"y\"]||[\"yy\",d])[2]=i,h[3]=+e>0,h[4]=n,function(t,e,i,n,a){return a.relativeTime(e||1,!!i,t,n)}.apply(null,h));return t&&(f=c.pastFuture(+this,f)),c.postformat(f)},Ei.toISOString=Bi,Ei.toString=Bi,Ei.toJSON=Bi,Ei.locale=Qe,Ei.localeData=ei,Ei.toIsoString=D(\"toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)\",Bi),Ei.lang=ti,j(\"X\",0,0,\"unix\"),j(\"x\",0,0,\"valueOf\"),dt(\"x\",rt),dt(\"X\",/[+-]?\\d+(\\.\\d{1,3})?/),gt(\"X\",function(t,e,i){i._d=new Date(1e3*parseFloat(t,10))}),gt(\"x\",function(t,e,i){i._d=new Date(w(t))}),a.version=\"2.20.1\",i=Te,a.fn=di,a.min=function(){return Ae(\"isBefore\",[].slice.call(arguments,0))},a.max=function(){return Ae(\"isAfter\",[].slice.call(arguments,0))},a.now=function(){return Date.now?Date.now():+new Date},a.utc=f,a.unix=function(t){return Te(1e3*t)},a.months=function(t,e){return gi(t,e,\"months\")},a.isDate=u,a.locale=ue,a.invalid=p,a.duration=Ue,a.isMoment=_,a.weekdays=function(t,e,i){return mi(t,e,i,\"weekdays\")},a.parseZone=function(){return Te.apply(null,arguments).parseZone()},a.localeData=he,a.isDuration=Le,a.monthsShort=function(t,e){return gi(t,e,\"monthsShort\")},a.weekdaysMin=function(t,e,i){return mi(t,e,i,\"weekdaysMin\")},a.defineLocale=de,a.updateLocale=function(t,e){if(null!=e){var i,n,a=ae;null!=(n=le(t))&&(a=n._config),(i=new A(e=I(a,e))).parentLocale=re[t],re[t]=i,ue(t)}else null!=re[t]&&(null!=re[t].parentLocale?re[t]=re[t].parentLocale:null!=re[t]&&delete re[t]);return re[t]},a.locales=function(){return C(re)},a.weekdaysShort=function(t,e,i){return mi(t,e,i,\"weekdaysShort\")},a.normalizeUnits=L,a.relativeTimeRounding=function(t){return void 0===t?Ni:\"function\"==typeof t&&(Ni=t,!0)},a.relativeTimeThreshold=function(t,e){return void 0!==zi[t]&&(void 0===e?zi[t]:(zi[t]=e,\"s\"===t&&(zi.ss=e-1),!0))},a.calendarFormat=function(t,e){var i=t.diff(e,\"days\",!0);return i<-6?\"sameElse\":i<-1?\"lastWeek\":i<0?\"lastDay\":i<1?\"sameDay\":i<2?\"nextDay\":i<7?\"nextWeek\":\"sameElse\"},a.prototype=di,a.HTML5_FMT={DATETIME_LOCAL:\"YYYY-MM-DDTHH:mm\",DATETIME_LOCAL_SECONDS:\"YYYY-MM-DDTHH:mm:ss\",DATETIME_LOCAL_MS:\"YYYY-MM-DDTHH:mm:ss.SSS\",DATE:\"YYYY-MM-DD\",TIME:\"HH:mm\",TIME_SECONDS:\"HH:mm:ss\",TIME_MS:\"HH:mm:ss.SSS\",WEEK:\"YYYY-[W]WW\",MONTH:\"YYYY-MM\"},a},\"object\"==typeof i&&void 0!==e?e.exports=a():n.moment=a()},{}],7:[function(t,e,i){var n=t(29)();n.helpers=t(45),t(27)(n),n.defaults=t(25),n.Element=t(26),n.elements=t(40),n.Interaction=t(28),n.layouts=t(30),n.platform=t(48),n.plugins=t(31),n.Ticks=t(34),t(22)(n),t(23)(n),t(24)(n),t(33)(n),t(32)(n),t(35)(n),t(55)(n),t(53)(n),t(54)(n),t(56)(n),t(57)(n),t(58)(n),t(15)(n),t(16)(n),t(17)(n),t(18)(n),t(19)(n),t(20)(n),t(21)(n),t(8)(n),t(9)(n),t(10)(n),t(11)(n),t(12)(n),t(13)(n),t(14)(n);var a=t(49);for(var r in a)a.hasOwnProperty(r)&&n.plugins.register(a[r]);n.platform.initialize(),e.exports=n,\"undefined\"!=typeof window&&(window.Chart=n),n.Legend=a.legend._element,n.Title=a.title._element,n.pluginService=n.plugins,n.PluginBase=n.Element.extend({}),n.canvasHelpers=n.helpers.canvas,n.layoutService=n.layouts},{10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,34:34,35:35,40:40,45:45,48:48,49:49,53:53,54:54,55:55,56:56,57:57,58:58,8:8,9:9}],8:[function(t,e,i){\"use strict\";e.exports=function(t){t.Bar=function(e,i){return i.type=\"bar\",new t(e,i)}}},{}],9:[function(t,e,i){\"use strict\";e.exports=function(t){t.Bubble=function(e,i){return i.type=\"bubble\",new t(e,i)}}},{}],10:[function(t,e,i){\"use strict\";e.exports=function(t){t.Doughnut=function(e,i){return i.type=\"doughnut\",new t(e,i)}}},{}],11:[function(t,e,i){\"use strict\";e.exports=function(t){t.Line=function(e,i){return i.type=\"line\",new t(e,i)}}},{}],12:[function(t,e,i){\"use strict\";e.exports=function(t){t.PolarArea=function(e,i){return i.type=\"polarArea\",new t(e,i)}}},{}],13:[function(t,e,i){\"use strict\";e.exports=function(t){t.Radar=function(e,i){return i.type=\"radar\",new t(e,i)}}},{}],14:[function(t,e,i){\"use strict\";e.exports=function(t){t.Scatter=function(e,i){return i.type=\"scatter\",new t(e,i)}}},{}],15:[function(t,e,i){\"use strict\";var n=t(25),a=t(40),r=t(45);n._set(\"bar\",{hover:{mode:\"label\"},scales:{xAxes:[{type:\"category\",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:\"linear\"}]}}),n._set(\"horizontalBar\",{hover:{mode:\"index\",axis:\"y\"},scales:{xAxes:[{type:\"linear\",position:\"bottom\"}],yAxes:[{position:\"left\",type:\"category\",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:\"left\"}},tooltips:{callbacks:{title:function(t,e){var i=\"\";return t.length>0&&(t[0].yLabel?i=t[0].yLabel:e.labels.length>0&&t[0].index<e.labels.length&&(i=e.labels[t[0].index])),i},label:function(t,e){return(e.datasets[t.datasetIndex].label||\"\")+\": \"+t.xLabel}},mode:\"index\",axis:\"y\"}}),e.exports=function(t){t.controllers.bar=t.DatasetController.extend({dataElementType:a.Rectangle,initialize:function(){var e;t.DatasetController.prototype.initialize.apply(this,arguments),(e=this.getMeta()).stack=this.getDataset().stack,e.bar=!0},update:function(t){var e,i,n=this.getMeta().data;for(this._ruler=this.getRuler(),e=0,i=n.length;e<i;++e)this.updateElement(n[e],e,t)},updateElement:function(t,e,i){var n=this,a=n.chart,o=n.getMeta(),s=n.getDataset(),l=t.custom||{},u=a.options.elements.rectangle;t._xScale=n.getScaleForId(o.xAxisID),t._yScale=n.getScaleForId(o.yAxisID),t._datasetIndex=n.index,t._index=e,t._model={datasetLabel:s.label,label:a.data.labels[e],borderSkipped:l.borderSkipped?l.borderSkipped:u.borderSkipped,backgroundColor:l.backgroundColor?l.backgroundColor:r.valueAtIndexOrDefault(s.backgroundColor,e,u.backgroundColor),borderColor:l.borderColor?l.borderColor:r.valueAtIndexOrDefault(s.borderColor,e,u.borderColor),borderWidth:l.borderWidth?l.borderWidth:r.valueAtIndexOrDefault(s.borderWidth,e,u.borderWidth)},n.updateElementGeometry(t,e,i),t.pivot()},updateElementGeometry:function(t,e,i){var n=this,a=t._model,r=n.getValueScale(),o=r.getBasePixel(),s=r.isHorizontal(),l=n._ruler||n.getRuler(),u=n.calculateBarValuePixels(n.index,e),d=n.calculateBarIndexPixels(n.index,e,l);a.horizontal=s,a.base=i?o:u.base,a.x=s?i?o:u.head:d.center,a.y=s?d.center:i?o:u.head,a.height=s?d.size:void 0,a.width=s?void 0:d.size},getValueScaleId:function(){return this.getMeta().yAxisID},getIndexScaleId:function(){return this.getMeta().xAxisID},getValueScale:function(){return this.getScaleForId(this.getValueScaleId())},getIndexScale:function(){return this.getScaleForId(this.getIndexScaleId())},_getStacks:function(t){var e,i,n=this.chart,a=this.getIndexScale().options.stacked,r=void 0===t?n.data.datasets.length:t+1,o=[];for(e=0;e<r;++e)(i=n.getDatasetMeta(e)).bar&&n.isDatasetVisible(e)&&(!1===a||!0===a&&-1===o.indexOf(i.stack)||void 0===a&&(void 0===i.stack||-1===o.indexOf(i.stack)))&&o.push(i.stack);return o},getStackCount:function(){return this._getStacks().length},getStackIndex:function(t,e){var i=this._getStacks(t),n=void 0!==e?i.indexOf(e):-1;return-1===n?i.length-1:n},getRuler:function(){var t,e,i=this.getIndexScale(),n=this.getStackCount(),a=this.index,o=i.isHorizontal(),s=o?i.left:i.top,l=s+(o?i.width:i.height),u=[];for(t=0,e=this.getMeta().data.length;t<e;++t)u.push(i.getPixelForValue(null,t,a));return{min:r.isNullOrUndef(i.options.barThickness)?function(t,e){var i,n,a,r,o=t.isHorizontal()?t.width:t.height,s=t.getTicks();for(a=1,r=e.length;a<r;++a)o=Math.min(o,e[a]-e[a-1]);for(a=0,r=s.length;a<r;++a)n=t.getPixelForTick(a),o=a>0?Math.min(o,n-i):o,i=n;return o}(i,u):-1,pixels:u,start:s,end:l,stackCount:n,scale:i}},calculateBarValuePixels:function(t,e){var i,n,a,r,o,s,l=this.chart,u=this.getMeta(),d=this.getValueScale(),h=l.data.datasets,c=d.getRightValue(h[t].data[e]),f=d.options.stacked,g=u.stack,m=0;if(f||void 0===f&&void 0!==g)for(i=0;i<t;++i)(n=l.getDatasetMeta(i)).bar&&n.stack===g&&n.controller.getValueScaleId()===d.id&&l.isDatasetVisible(i)&&(a=d.getRightValue(h[i].data[e]),(c<0&&a<0||c>=0&&a>0)&&(m+=a));return r=d.getPixelForValue(m),{size:s=((o=d.getPixelForValue(m+c))-r)/2,base:r,head:o,center:o+s/2}},calculateBarIndexPixels:function(t,e,i){var n,a,o,s,l,u,d,h,c,f,g,m,p,v,y,b,x,_=i.scale.options,k=\"flex\"===_.barThickness?(c=e,g=_,p=(f=i).pixels,v=p[c],y=c>0?p[c-1]:null,b=c<p.length-1?p[c+1]:null,x=g.categoryPercentage,null===y&&(y=v-(null===b?f.end-v:b-v)),null===b&&(b=v+v-y),m=v-(v-y)/2*x,{chunk:(b-y)/2*x/f.stackCount,ratio:g.barPercentage,start:m}):(n=e,a=i,u=(o=_).barThickness,d=a.stackCount,h=a.pixels[n],r.isNullOrUndef(u)?(s=a.min*o.categoryPercentage,l=o.barPercentage):(s=u*d,l=1),{chunk:s/d,ratio:l,start:h-s/2}),w=this.getStackIndex(t,this.getMeta().stack),M=k.start+k.chunk*w+k.chunk/2,S=Math.min(r.valueOrDefault(_.maxBarThickness,1/0),k.chunk*k.ratio);return{base:M-S/2,head:M+S/2,center:M,size:S}},draw:function(){var t=this.chart,e=this.getValueScale(),i=this.getMeta().data,n=this.getDataset(),a=i.length,o=0;for(r.canvas.clipArea(t.ctx,t.chartArea);o<a;++o)isNaN(e.getRightValue(n.data[o]))||i[o].draw();r.canvas.unclipArea(t.ctx)},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},a=t._model;a.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:r.valueAtIndexOrDefault(e.hoverBackgroundColor,i,r.getHoverColor(a.backgroundColor)),a.borderColor=n.hoverBorderColor?n.hoverBorderColor:r.valueAtIndexOrDefault(e.hoverBorderColor,i,r.getHoverColor(a.borderColor)),a.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:r.valueAtIndexOrDefault(e.hoverBorderWidth,i,a.borderWidth)},removeHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},a=t._model,o=this.chart.options.elements.rectangle;a.backgroundColor=n.backgroundColor?n.backgroundColor:r.valueAtIndexOrDefault(e.backgroundColor,i,o.backgroundColor),a.borderColor=n.borderColor?n.borderColor:r.valueAtIndexOrDefault(e.borderColor,i,o.borderColor),a.borderWidth=n.borderWidth?n.borderWidth:r.valueAtIndexOrDefault(e.borderWidth,i,o.borderWidth)}}),t.controllers.horizontalBar=t.controllers.bar.extend({getValueScaleId:function(){return this.getMeta().xAxisID},getIndexScaleId:function(){return this.getMeta().yAxisID}})}},{25:25,40:40,45:45}],16:[function(t,e,i){\"use strict\";var n=t(25),a=t(40),r=t(45);n._set(\"bubble\",{hover:{mode:\"single\"},scales:{xAxes:[{type:\"linear\",position:\"bottom\",id:\"x-axis-0\"}],yAxes:[{type:\"linear\",position:\"left\",id:\"y-axis-0\"}]},tooltips:{callbacks:{title:function(){return\"\"},label:function(t,e){var i=e.datasets[t.datasetIndex].label||\"\",n=e.datasets[t.datasetIndex].data[t.index];return i+\": (\"+t.xLabel+\", \"+t.yLabel+\", \"+n.r+\")\"}}}}),e.exports=function(t){t.controllers.bubble=t.DatasetController.extend({dataElementType:a.Point,update:function(t){var e=this,i=e.getMeta().data;r.each(i,function(i,n){e.updateElement(i,n,t)})},updateElement:function(t,e,i){var n=this,a=n.getMeta(),r=t.custom||{},o=n.getScaleForId(a.xAxisID),s=n.getScaleForId(a.yAxisID),l=n._resolveElementOptions(t,e),u=n.getDataset().data[e],d=n.index,h=i?o.getPixelForDecimal(.5):o.getPixelForValue(\"object\"==typeof u?u:NaN,e,d),c=i?s.getBasePixel():s.getPixelForValue(u,e,d);t._xScale=o,t._yScale=s,t._options=l,t._datasetIndex=d,t._index=e,t._model={backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,hitRadius:l.hitRadius,pointStyle:l.pointStyle,radius:i?0:l.radius,skip:r.skip||isNaN(h)||isNaN(c),x:h,y:c},t.pivot()},setHoverStyle:function(t){var e=t._model,i=t._options;e.backgroundColor=r.valueOrDefault(i.hoverBackgroundColor,r.getHoverColor(i.backgroundColor)),e.borderColor=r.valueOrDefault(i.hoverBorderColor,r.getHoverColor(i.borderColor)),e.borderWidth=r.valueOrDefault(i.hoverBorderWidth,i.borderWidth),e.radius=i.radius+i.hoverRadius},removeHoverStyle:function(t){var e=t._model,i=t._options;e.backgroundColor=i.backgroundColor,e.borderColor=i.borderColor,e.borderWidth=i.borderWidth,e.radius=i.radius},_resolveElementOptions:function(t,e){var i,n,a,o=this.chart,s=o.data.datasets[this.index],l=t.custom||{},u=o.options.elements.point,d=r.options.resolve,h=s.data[e],c={},f={chart:o,dataIndex:e,dataset:s,datasetIndex:this.index},g=[\"backgroundColor\",\"borderColor\",\"borderWidth\",\"hoverBackgroundColor\",\"hoverBorderColor\",\"hoverBorderWidth\",\"hoverRadius\",\"hitRadius\",\"pointStyle\"];for(i=0,n=g.length;i<n;++i)c[a=g[i]]=d([l[a],s[a],u[a]],f,e);return c.radius=d([l.radius,h?h.r:void 0,s.radius,u.radius],f,e),c}})}},{25:25,40:40,45:45}],17:[function(t,e,i){\"use strict\";var n=t(25),a=t(40),r=t(45);n._set(\"doughnut\",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:\"single\"},legendCallback:function(t){var e=[];e.push('<ul class=\"'+t.id+'-legend\">');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var r=0;r<n[0].data.length;++r)e.push('<li><span style=\"background-color:'+n[0].backgroundColor[r]+'\"></span>'),a[r]&&e.push(a[r]),e.push(\"</li>\");return e.push(\"</ul>\"),e.join(\"\")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),o=e.datasets[0],s=a.data[n],l=s&&s.custom||{},u=r.valueAtIndexOrDefault,d=t.options.elements.arc;return{text:i,fillStyle:l.backgroundColor?l.backgroundColor:u(o.backgroundColor,n,d.backgroundColor),strokeStyle:l.borderColor?l.borderColor:u(o.borderColor,n,d.borderColor),lineWidth:l.borderWidth?l.borderWidth:u(o.borderWidth,n,d.borderWidth),hidden:isNaN(o.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,r=e.index,o=this.chart;for(i=0,n=(o.data.datasets||[]).length;i<n;++i)(a=o.getDatasetMeta(i)).data[r]&&(a.data[r].hidden=!a.data[r].hidden);o.update()}},cutoutPercentage:50,rotation:-.5*Math.PI,circumference:2*Math.PI,tooltips:{callbacks:{title:function(){return\"\"},label:function(t,e){var i=e.labels[t.index],n=\": \"+e.datasets[t.datasetIndex].data[t.index];return r.isArray(i)?(i=i.slice())[0]+=n:i+=n,i}}}}),n._set(\"pie\",r.clone(n.doughnut)),n._set(\"pie\",{cutoutPercentage:0}),e.exports=function(t){t.controllers.doughnut=t.controllers.pie=t.DatasetController.extend({dataElementType:a.Arc,linkScales:r.noop,getRingIndex:function(t){for(var e=0,i=0;i<t;++i)this.chart.isDatasetVisible(i)&&++e;return e},update:function(t){var e=this,i=e.chart,n=i.chartArea,a=i.options,o=a.elements.arc,s=n.right-n.left-o.borderWidth,l=n.bottom-n.top-o.borderWidth,u=Math.min(s,l),d={x:0,y:0},h=e.getMeta(),c=a.cutoutPercentage,f=a.circumference;if(f<2*Math.PI){var g=a.rotation%(2*Math.PI),m=(g+=2*Math.PI*(g>=Math.PI?-1:g<-Math.PI?1:0))+f,p=Math.cos(g),v=Math.sin(g),y=Math.cos(m),b=Math.sin(m),x=g<=0&&m>=0||g<=2*Math.PI&&2*Math.PI<=m,_=g<=.5*Math.PI&&.5*Math.PI<=m||g<=2.5*Math.PI&&2.5*Math.PI<=m,k=g<=-Math.PI&&-Math.PI<=m||g<=Math.PI&&Math.PI<=m,w=g<=.5*-Math.PI&&.5*-Math.PI<=m||g<=1.5*Math.PI&&1.5*Math.PI<=m,M=c/100,S=k?-1:Math.min(p*(p<0?1:M),y*(y<0?1:M)),D=w?-1:Math.min(v*(v<0?1:M),b*(b<0?1:M)),C=x?1:Math.max(p*(p>0?1:M),y*(y>0?1:M)),P=_?1:Math.max(v*(v>0?1:M),b*(b>0?1:M)),T=.5*(C-S),O=.5*(P-D);u=Math.min(s/T,l/O),d={x:-.5*(C+S),y:-.5*(P+D)}}i.borderWidth=e.getMaxBorderWidth(h.data),i.outerRadius=Math.max((u-i.borderWidth)/2,0),i.innerRadius=Math.max(c?i.outerRadius/100*c:0,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),i.offsetX=d.x*i.outerRadius,i.offsetY=d.y*i.outerRadius,h.total=e.calculateTotal(),e.outerRadius=i.outerRadius-i.radiusLength*e.getRingIndex(e.index),e.innerRadius=Math.max(e.outerRadius-i.radiusLength,0),r.each(h.data,function(i,n){e.updateElement(i,n,t)})},updateElement:function(t,e,i){var n=this,a=n.chart,o=a.chartArea,s=a.options,l=s.animation,u=(o.left+o.right)/2,d=(o.top+o.bottom)/2,h=s.rotation,c=s.rotation,f=n.getDataset(),g=i&&l.animateRotate?0:t.hidden?0:n.calculateCircumference(f.data[e])*(s.circumference/(2*Math.PI)),m=i&&l.animateScale?0:n.innerRadius,p=i&&l.animateScale?0:n.outerRadius,v=r.valueAtIndexOrDefault;r.extend(t,{_datasetIndex:n.index,_index:e,_model:{x:u+a.offsetX,y:d+a.offsetY,startAngle:h,endAngle:c,circumference:g,outerRadius:p,innerRadius:m,label:v(f.label,e,a.data.labels[e])}});var y=t._model;this.removeHoverStyle(t),i&&l.animateRotate||(y.startAngle=0===e?s.rotation:n.getMeta().data[e-1]._model.endAngle,y.endAngle=y.startAngle+y.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,e=this.getDataset(),i=this.getMeta(),n=0;return r.each(i.data,function(i,a){t=e.data[a],isNaN(t)||i.hidden||(n+=Math.abs(t))}),n},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){for(var e,i,n=0,a=this.index,r=t.length,o=0;o<r;o++)e=t[o]._model?t[o]._model.borderWidth:0,n=(i=t[o]._chart?t[o]._chart.config.data.datasets[a].hoverBorderWidth:0)>(n=e>n?e:n)?i:n;return n}})}},{25:25,40:40,45:45}],18:[function(t,e,i){\"use strict\";var n=t(25),a=t(40),r=t(45);n._set(\"line\",{showLines:!0,spanGaps:!1,hover:{mode:\"label\"},scales:{xAxes:[{type:\"category\",id:\"x-axis-0\"}],yAxes:[{type:\"linear\",id:\"y-axis-0\"}]}}),e.exports=function(t){function e(t,e){return r.valueOrDefault(t.showLine,e.showLines)}t.controllers.line=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,update:function(t){var i,n,a,o=this,s=o.getMeta(),l=s.dataset,u=s.data||[],d=o.chart.options,h=d.elements.line,c=o.getScaleForId(s.yAxisID),f=o.getDataset(),g=e(f,d);for(g&&(a=l.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),l._scale=c,l._datasetIndex=o.index,l._children=u,l._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:a.tension?a.tension:r.valueOrDefault(f.lineTension,h.tension),backgroundColor:a.backgroundColor?a.backgroundColor:f.backgroundColor||h.backgroundColor,borderWidth:a.borderWidth?a.borderWidth:f.borderWidth||h.borderWidth,borderColor:a.borderColor?a.borderColor:f.borderColor||h.borderColor,borderCapStyle:a.borderCapStyle?a.borderCapStyle:f.borderCapStyle||h.borderCapStyle,borderDash:a.borderDash?a.borderDash:f.borderDash||h.borderDash,borderDashOffset:a.borderDashOffset?a.borderDashOffset:f.borderDashOffset||h.borderDashOffset,borderJoinStyle:a.borderJoinStyle?a.borderJoinStyle:f.borderJoinStyle||h.borderJoinStyle,fill:a.fill?a.fill:void 0!==f.fill?f.fill:h.fill,steppedLine:a.steppedLine?a.steppedLine:r.valueOrDefault(f.steppedLine,h.stepped),cubicInterpolationMode:a.cubicInterpolationMode?a.cubicInterpolationMode:r.valueOrDefault(f.cubicInterpolationMode,h.cubicInterpolationMode)},l.pivot()),i=0,n=u.length;i<n;++i)o.updateElement(u[i],i,t);for(g&&0!==l._model.tension&&o.updateBezierControlPoints(),i=0,n=u.length;i<n;++i)u[i].pivot()},getPointBackgroundColor:function(t,e){var i=this.chart.options.elements.point.backgroundColor,n=this.getDataset(),a=t.custom||{};return a.backgroundColor?i=a.backgroundColor:n.pointBackgroundColor?i=r.valueAtIndexOrDefault(n.pointBackgroundColor,e,i):n.backgroundColor&&(i=n.backgroundColor),i},getPointBorderColor:function(t,e){var i=this.chart.options.elements.point.borderColor,n=this.getDataset(),a=t.custom||{};return a.borderColor?i=a.borderColor:n.pointBorderColor?i=r.valueAtIndexOrDefault(n.pointBorderColor,e,i):n.borderColor&&(i=n.borderColor),i},getPointBorderWidth:function(t,e){var i=this.chart.options.elements.point.borderWidth,n=this.getDataset(),a=t.custom||{};return isNaN(a.borderWidth)?!isNaN(n.pointBorderWidth)||r.isArray(n.pointBorderWidth)?i=r.valueAtIndexOrDefault(n.pointBorderWidth,e,i):isNaN(n.borderWidth)||(i=n.borderWidth):i=a.borderWidth,i},updateElement:function(t,e,i){var n,a,o=this,s=o.getMeta(),l=t.custom||{},u=o.getDataset(),d=o.index,h=u.data[e],c=o.getScaleForId(s.yAxisID),f=o.getScaleForId(s.xAxisID),g=o.chart.options.elements.point;void 0!==u.radius&&void 0===u.pointRadius&&(u.pointRadius=u.radius),void 0!==u.hitRadius&&void 0===u.pointHitRadius&&(u.pointHitRadius=u.hitRadius),n=f.getPixelForValue(\"object\"==typeof h?h:NaN,e,d),a=i?c.getBasePixel():o.calculatePointY(h,e,d),t._xScale=f,t._yScale=c,t._datasetIndex=d,t._index=e,t._model={x:n,y:a,skip:l.skip||isNaN(n)||isNaN(a),radius:l.radius||r.valueAtIndexOrDefault(u.pointRadius,e,g.radius),pointStyle:l.pointStyle||r.valueAtIndexOrDefault(u.pointStyle,e,g.pointStyle),backgroundColor:o.getPointBackgroundColor(t,e),borderColor:o.getPointBorderColor(t,e),borderWidth:o.getPointBorderWidth(t,e),tension:s.dataset._model?s.dataset._model.tension:0,steppedLine:!!s.dataset._model&&s.dataset._model.steppedLine,hitRadius:l.hitRadius||r.valueAtIndexOrDefault(u.pointHitRadius,e,g.hitRadius)}},calculatePointY:function(t,e,i){var n,a,r,o=this.chart,s=this.getMeta(),l=this.getScaleForId(s.yAxisID),u=0,d=0;if(l.options.stacked){for(n=0;n<i;n++)if(a=o.data.datasets[n],\"line\"===(r=o.getDatasetMeta(n)).type&&r.yAxisID===l.id&&o.isDatasetVisible(n)){var h=Number(l.getRightValue(a.data[e]));h<0?d+=h||0:u+=h||0}var c=Number(l.getRightValue(t));return c<0?l.getPixelForValue(d+c):l.getPixelForValue(u+c)}return l.getPixelForValue(t)},updateBezierControlPoints:function(){var t,e,i,n,a=this.getMeta(),o=this.chart.chartArea,s=a.data||[];function l(t,e,i){return Math.max(Math.min(t,i),e)}if(a.dataset._model.spanGaps&&(s=s.filter(function(t){return!t._model.skip})),\"monotone\"===a.dataset._model.cubicInterpolationMode)r.splineCurveMonotone(s);else for(t=0,e=s.length;t<e;++t)i=s[t]._model,n=r.splineCurve(r.previousItem(s,t)._model,i,r.nextItem(s,t)._model,a.dataset._model.tension),i.controlPointPreviousX=n.previous.x,i.controlPointPreviousY=n.previous.y,i.controlPointNextX=n.next.x,i.controlPointNextY=n.next.y;if(this.chart.options.elements.line.capBezierPoints)for(t=0,e=s.length;t<e;++t)(i=s[t]._model).controlPointPreviousX=l(i.controlPointPreviousX,o.left,o.right),i.controlPointPreviousY=l(i.controlPointPreviousY,o.top,o.bottom),i.controlPointNextX=l(i.controlPointNextX,o.left,o.right),i.controlPointNextY=l(i.controlPointNextY,o.top,o.bottom)},draw:function(){var t=this.chart,i=this.getMeta(),n=i.data||[],a=t.chartArea,o=n.length,s=0;for(r.canvas.clipArea(t.ctx,a),e(this.getDataset(),t.options)&&i.dataset.draw(),r.canvas.unclipArea(t.ctx);s<o;++s)n[s].draw(a)},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},a=t._model;a.radius=n.hoverRadius||r.valueAtIndexOrDefault(e.pointHoverRadius,i,this.chart.options.elements.point.hoverRadius),a.backgroundColor=n.hoverBackgroundColor||r.valueAtIndexOrDefault(e.pointHoverBackgroundColor,i,r.getHoverColor(a.backgroundColor)),a.borderColor=n.hoverBorderColor||r.valueAtIndexOrDefault(e.pointHoverBorderColor,i,r.getHoverColor(a.borderColor)),a.borderWidth=n.hoverBorderWidth||r.valueAtIndexOrDefault(e.pointHoverBorderWidth,i,a.borderWidth)},removeHoverStyle:function(t){var e=this,i=e.chart.data.datasets[t._datasetIndex],n=t._index,a=t.custom||{},o=t._model;void 0!==i.radius&&void 0===i.pointRadius&&(i.pointRadius=i.radius),o.radius=a.radius||r.valueAtIndexOrDefault(i.pointRadius,n,e.chart.options.elements.point.radius),o.backgroundColor=e.getPointBackgroundColor(t,n),o.borderColor=e.getPointBorderColor(t,n),o.borderWidth=e.getPointBorderWidth(t,n)}})}},{25:25,40:40,45:45}],19:[function(t,e,i){\"use strict\";var n=t(25),a=t(40),r=t(45);n._set(\"polarArea\",{scale:{type:\"radialLinear\",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(t){var e=[];e.push('<ul class=\"'+t.id+'-legend\">');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var r=0;r<n[0].data.length;++r)e.push('<li><span style=\"background-color:'+n[0].backgroundColor[r]+'\"></span>'),a[r]&&e.push(a[r]),e.push(\"</li>\");return e.push(\"</ul>\"),e.join(\"\")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),o=e.datasets[0],s=a.data[n].custom||{},l=r.valueAtIndexOrDefault,u=t.options.elements.arc;return{text:i,fillStyle:s.backgroundColor?s.backgroundColor:l(o.backgroundColor,n,u.backgroundColor),strokeStyle:s.borderColor?s.borderColor:l(o.borderColor,n,u.borderColor),lineWidth:s.borderWidth?s.borderWidth:l(o.borderWidth,n,u.borderWidth),hidden:isNaN(o.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,r=e.index,o=this.chart;for(i=0,n=(o.data.datasets||[]).length;i<n;++i)(a=o.getDatasetMeta(i)).data[r].hidden=!a.data[r].hidden;o.update()}},tooltips:{callbacks:{title:function(){return\"\"},label:function(t,e){return e.labels[t.index]+\": \"+t.yLabel}}}}),e.exports=function(t){t.controllers.polarArea=t.DatasetController.extend({dataElementType:a.Arc,linkScales:r.noop,update:function(t){var e=this,i=e.chart,n=i.chartArea,a=e.getMeta(),o=i.options,s=o.elements.arc,l=Math.min(n.right-n.left,n.bottom-n.top);i.outerRadius=Math.max((l-s.borderWidth/2)/2,0),i.innerRadius=Math.max(o.cutoutPercentage?i.outerRadius/100*o.cutoutPercentage:1,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),e.outerRadius=i.outerRadius-i.radiusLength*e.index,e.innerRadius=e.outerRadius-i.radiusLength,a.count=e.countVisibleElements(),r.each(a.data,function(i,n){e.updateElement(i,n,t)})},updateElement:function(t,e,i){for(var n=this,a=n.chart,o=n.getDataset(),s=a.options,l=s.animation,u=a.scale,d=a.data.labels,h=n.calculateCircumference(o.data[e]),c=u.xCenter,f=u.yCenter,g=0,m=n.getMeta(),p=0;p<e;++p)isNaN(o.data[p])||m.data[p].hidden||++g;var v=s.startAngle,y=t.hidden?0:u.getDistanceFromCenterForValue(o.data[e]),b=v+h*g,x=b+(t.hidden?0:h),_=l.animateScale?0:u.getDistanceFromCenterForValue(o.data[e]);r.extend(t,{_datasetIndex:n.index,_index:e,_scale:u,_model:{x:c,y:f,innerRadius:0,outerRadius:i?_:y,startAngle:i&&l.animateRotate?v:b,endAngle:i&&l.animateRotate?v:x,label:r.valueAtIndexOrDefault(d,e,d[e])}}),n.removeHoverStyle(t),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},countVisibleElements:function(){var t=this.getDataset(),e=this.getMeta(),i=0;return r.each(e.data,function(e,n){isNaN(t.data[n])||e.hidden||i++}),i},calculateCircumference:function(t){var e=this.getMeta().count;return e>0&&!isNaN(t)?2*Math.PI/e:0}})}},{25:25,40:40,45:45}],20:[function(t,e,i){\"use strict\";var n=t(25),a=t(40),r=t(45);n._set(\"radar\",{scale:{type:\"radialLinear\"},elements:{line:{tension:0}}}),e.exports=function(t){t.controllers.radar=t.DatasetController.extend({datasetElementType:a.Line,dataElementType:a.Point,linkScales:r.noop,update:function(t){var e=this,i=e.getMeta(),n=i.dataset,a=i.data,o=n.custom||{},s=e.getDataset(),l=e.chart.options.elements.line,u=e.chart.scale;void 0!==s.tension&&void 0===s.lineTension&&(s.lineTension=s.tension),r.extend(i.dataset,{_datasetIndex:e.index,_scale:u,_children:a,_loop:!0,_model:{tension:o.tension?o.tension:r.valueOrDefault(s.lineTension,l.tension),backgroundColor:o.backgroundColor?o.backgroundColor:s.backgroundColor||l.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:s.borderWidth||l.borderWidth,borderColor:o.borderColor?o.borderColor:s.borderColor||l.borderColor,fill:o.fill?o.fill:void 0!==s.fill?s.fill:l.fill,borderCapStyle:o.borderCapStyle?o.borderCapStyle:s.borderCapStyle||l.borderCapStyle,borderDash:o.borderDash?o.borderDash:s.borderDash||l.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:s.borderDashOffset||l.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:s.borderJoinStyle||l.borderJoinStyle}}),i.dataset.pivot(),r.each(a,function(i,n){e.updateElement(i,n,t)},e),e.updateBezierControlPoints()},updateElement:function(t,e,i){var n=this,a=t.custom||{},o=n.getDataset(),s=n.chart.scale,l=n.chart.options.elements.point,u=s.getPointPositionForValue(e,o.data[e]);void 0!==o.radius&&void 0===o.pointRadius&&(o.pointRadius=o.radius),void 0!==o.hitRadius&&void 0===o.pointHitRadius&&(o.pointHitRadius=o.hitRadius),r.extend(t,{_datasetIndex:n.index,_index:e,_scale:s,_model:{x:i?s.xCenter:u.x,y:i?s.yCenter:u.y,tension:a.tension?a.tension:r.valueOrDefault(o.lineTension,n.chart.options.elements.line.tension),radius:a.radius?a.radius:r.valueAtIndexOrDefault(o.pointRadius,e,l.radius),backgroundColor:a.backgroundColor?a.backgroundColor:r.valueAtIndexOrDefault(o.pointBackgroundColor,e,l.backgroundColor),borderColor:a.borderColor?a.borderColor:r.valueAtIndexOrDefault(o.pointBorderColor,e,l.borderColor),borderWidth:a.borderWidth?a.borderWidth:r.valueAtIndexOrDefault(o.pointBorderWidth,e,l.borderWidth),pointStyle:a.pointStyle?a.pointStyle:r.valueAtIndexOrDefault(o.pointStyle,e,l.pointStyle),hitRadius:a.hitRadius?a.hitRadius:r.valueAtIndexOrDefault(o.pointHitRadius,e,l.hitRadius)}}),t._model.skip=a.skip?a.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,e=this.getMeta();r.each(e.data,function(i,n){var a=i._model,o=r.splineCurve(r.previousItem(e.data,n,!0)._model,a,r.nextItem(e.data,n,!0)._model,a.tension);a.controlPointPreviousX=Math.max(Math.min(o.previous.x,t.right),t.left),a.controlPointPreviousY=Math.max(Math.min(o.previous.y,t.bottom),t.top),a.controlPointNextX=Math.max(Math.min(o.next.x,t.right),t.left),a.controlPointNextY=Math.max(Math.min(o.next.y,t.bottom),t.top),i.pivot()})},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},n=t._index,a=t._model;a.radius=i.hoverRadius?i.hoverRadius:r.valueAtIndexOrDefault(e.pointHoverRadius,n,this.chart.options.elements.point.hoverRadius),a.backgroundColor=i.hoverBackgroundColor?i.hoverBackgroundColor:r.valueAtIndexOrDefault(e.pointHoverBackgroundColor,n,r.getHoverColor(a.backgroundColor)),a.borderColor=i.hoverBorderColor?i.hoverBorderColor:r.valueAtIndexOrDefault(e.pointHoverBorderColor,n,r.getHoverColor(a.borderColor)),a.borderWidth=i.hoverBorderWidth?i.hoverBorderWidth:r.valueAtIndexOrDefault(e.pointHoverBorderWidth,n,a.borderWidth)},removeHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},n=t._index,a=t._model,o=this.chart.options.elements.point;a.radius=i.radius?i.radius:r.valueAtIndexOrDefault(e.pointRadius,n,o.radius),a.backgroundColor=i.backgroundColor?i.backgroundColor:r.valueAtIndexOrDefault(e.pointBackgroundColor,n,o.backgroundColor),a.borderColor=i.borderColor?i.borderColor:r.valueAtIndexOrDefault(e.pointBorderColor,n,o.borderColor),a.borderWidth=i.borderWidth?i.borderWidth:r.valueAtIndexOrDefault(e.pointBorderWidth,n,o.borderWidth)}})}},{25:25,40:40,45:45}],21:[function(t,e,i){\"use strict\";t(25)._set(\"scatter\",{hover:{mode:\"single\"},scales:{xAxes:[{id:\"x-axis-1\",type:\"linear\",position:\"bottom\"}],yAxes:[{id:\"y-axis-1\",type:\"linear\",position:\"left\"}]},showLines:!1,tooltips:{callbacks:{title:function(){return\"\"},label:function(t){return\"(\"+t.xLabel+\", \"+t.yLabel+\")\"}}}}),e.exports=function(t){t.controllers.scatter=t.controllers.line}},{25:25}],22:[function(t,e,i){\"use strict\";var n=t(25),a=t(26),r=t(45);n._set(\"global\",{animation:{duration:1e3,easing:\"easeOutQuart\",onProgress:r.noop,onComplete:r.noop}}),e.exports=function(t){t.Animation=a.extend({chart:null,currentStep:0,numSteps:60,easing:\"\",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,i,n){var a,r,o=this.animations;for(e.chart=t,n||(t.animating=!0),a=0,r=o.length;a<r;++a)if(o[a].chart===t)return void(o[a]=e);o.push(e),1===o.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var e=r.findIndex(this.animations,function(e){return e.chart===t});-1!==e&&(this.animations.splice(e,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=r.requestAnimFrame.call(window,function(){t.request=null,t.startDigest()}))},startDigest:function(){var t=this,e=Date.now(),i=0;t.dropFrames>1&&(i=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1),t.advance(1+i);var n=Date.now();t.dropFrames+=(n-e)/t.frameDuration,t.animations.length>0&&t.requestAnimationFrame()},advance:function(t){for(var e,i,n=this.animations,a=0;a<n.length;)i=(e=n[a]).chart,e.currentStep=(e.currentStep||0)+t,e.currentStep=Math.min(e.currentStep,e.numSteps),r.callback(e.render,[i,e],i),r.callback(e.onAnimationProgress,[e],i),e.currentStep>=e.numSteps?(r.callback(e.onAnimationComplete,[e],i),i.animating=!1,n.splice(a,1)):++a}},Object.defineProperty(t.Animation.prototype,\"animationObject\",{get:function(){return this}}),Object.defineProperty(t.Animation.prototype,\"chartInstance\",{get:function(){return this.chart},set:function(t){this.chart=t}})}},{25:25,26:26,45:45}],23:[function(t,e,i){\"use strict\";var n=t(25),a=t(45),r=t(28),o=t(30),s=t(48),l=t(31);e.exports=function(t){function e(t){return\"top\"===t||\"bottom\"===t}t.types={},t.instances={},t.controllers={},a.extend(t.prototype,{construct:function(e,i){var r,o,l=this;(o=(r=(r=i)||{}).data=r.data||{}).datasets=o.datasets||[],o.labels=o.labels||[],r.options=a.configMerge(n.global,n[r.type],r.options||{}),i=r;var u=s.acquireContext(e,i),d=u&&u.canvas,h=d&&d.height,c=d&&d.width;l.id=a.uid(),l.ctx=u,l.canvas=d,l.config=i,l.width=c,l.height=h,l.aspectRatio=h?c/h:null,l.options=i.options,l._bufferedRender=!1,l.chart=l,l.controller=l,t.instances[l.id]=l,Object.defineProperty(l,\"data\",{get:function(){return l.config.data},set:function(t){l.config.data=t}}),u&&d?(l.initialize(),l.update()):console.error(\"Failed to create chart: can't acquire context from the given item\")},initialize:function(){var t=this;return l.notify(t,\"beforeInit\"),a.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.initToolTip(),l.notify(t,\"afterInit\"),t},clear:function(){return a.canvas.clear(this),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,i=e.options,n=e.canvas,r=i.maintainAspectRatio&&e.aspectRatio||null,o=Math.max(0,Math.floor(a.getMaximumWidth(n))),s=Math.max(0,Math.floor(r?o/r:a.getMaximumHeight(n)));if((e.width!==o||e.height!==s)&&(n.width=e.width=o,n.height=e.height=s,n.style.width=o+\"px\",n.style.height=s+\"px\",a.retinaScale(e,i.devicePixelRatio),!t)){var u={width:o,height:s};l.notify(e,\"resize\",[u]),e.options.onResize&&e.options.onResize(e,u),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},i=t.scale;a.each(e.xAxes,function(t,e){t.id=t.id||\"x-axis-\"+e}),a.each(e.yAxes,function(t,e){t.id=t.id||\"y-axis-\"+e}),i&&(i.id=i.id||\"scale\")},buildOrUpdateScales:function(){var i=this,n=i.options,r=i.scales||{},o=[],s=Object.keys(r).reduce(function(t,e){return t[e]=!1,t},{});n.scales&&(o=o.concat((n.scales.xAxes||[]).map(function(t){return{options:t,dtype:\"category\",dposition:\"bottom\"}}),(n.scales.yAxes||[]).map(function(t){return{options:t,dtype:\"linear\",dposition:\"left\"}}))),n.scale&&o.push({options:n.scale,dtype:\"radialLinear\",isDefault:!0,dposition:\"chartArea\"}),a.each(o,function(n){var o=n.options,l=o.id,u=a.valueOrDefault(o.type,n.dtype);e(o.position)!==e(n.dposition)&&(o.position=n.dposition),s[l]=!0;var d=null;if(l in r&&r[l].type===u)(d=r[l]).options=o,d.ctx=i.ctx,d.chart=i;else{var h=t.scaleService.getScaleConstructor(u);if(!h)return;d=new h({id:l,type:u,options:o,ctx:i.ctx,chart:i}),r[d.id]=d}d.mergeTicksOptions(),n.isDefault&&(i.scale=d)}),a.each(s,function(t,e){t||delete r[e]}),i.scales=r,t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,i=[],n=[];return a.each(e.data.datasets,function(a,r){var o=e.getDatasetMeta(r),s=a.type||e.config.type;if(o.type&&o.type!==s&&(e.destroyDatasetMeta(r),o=e.getDatasetMeta(r)),o.type=s,i.push(o.type),o.controller)o.controller.updateIndex(r),o.controller.linkScales();else{var l=t.controllers[o.type];if(void 0===l)throw new Error('\"'+o.type+'\" is not a chart type.');o.controller=new l(e,r),n.push(o.controller)}},e),n},resetElements:function(){var t=this;a.each(t.data.datasets,function(e,i){t.getDatasetMeta(i).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(e){var i,n,r=this;if(e&&\"object\"==typeof e||(e={duration:e,lazy:arguments[1]}),n=(i=r).options,a.each(i.scales,function(t){o.removeBox(i,t)}),n=a.configMerge(t.defaults.global,t.defaults[i.config.type],n),i.options=i.config.options=n,i.ensureScalesHaveIDs(),i.buildOrUpdateScales(),i.tooltip._options=n.tooltips,i.tooltip.initialize(),l._invalidate(r),!1!==l.notify(r,\"beforeUpdate\")){r.tooltip._data=r.data;var s=r.buildOrUpdateControllers();a.each(r.data.datasets,function(t,e){r.getDatasetMeta(e).controller.buildOrUpdateElements()},r),r.updateLayout(),r.options.animation&&r.options.animation.duration&&a.each(s,function(t){t.reset()}),r.updateDatasets(),r.tooltip.initialize(),r.lastActive=[],l.notify(r,\"afterUpdate\"),r._bufferedRender?r._bufferedRequest={duration:e.duration,easing:e.easing,lazy:e.lazy}:r.render(e)}},updateLayout:function(){!1!==l.notify(this,\"beforeLayout\")&&(o.update(this,this.width,this.height),l.notify(this,\"afterScaleUpdate\"),l.notify(this,\"afterLayout\"))},updateDatasets:function(){if(!1!==l.notify(this,\"beforeDatasetsUpdate\")){for(var t=0,e=this.data.datasets.length;t<e;++t)this.updateDataset(t);l.notify(this,\"afterDatasetsUpdate\")}},updateDataset:function(t){var e=this.getDatasetMeta(t),i={meta:e,index:t};!1!==l.notify(this,\"beforeDatasetUpdate\",[i])&&(e.controller.update(),l.notify(this,\"afterDatasetUpdate\",[i]))},render:function(e){var i=this;e&&\"object\"==typeof e||(e={duration:e,lazy:arguments[1]});var n=e.duration,r=e.lazy;if(!1!==l.notify(i,\"beforeRender\")){var o=i.options.animation,s=function(t){l.notify(i,\"afterRender\"),a.callback(o&&o.onComplete,[t],i)};if(o&&(void 0!==n&&0!==n||void 0===n&&0!==o.duration)){var u=new t.Animation({numSteps:(n||o.duration)/16.66,easing:e.easing||o.easing,render:function(t,e){var i=a.easing.effects[e.easing],n=e.currentStep,r=n/e.numSteps;t.draw(i(r),r,n)},onAnimationProgress:o.onProgress,onAnimationComplete:s});t.animationService.addAnimation(i,u,n,r)}else i.draw(),s(new t.Animation({numSteps:0,chart:i}));return i}},draw:function(t){var e=this;e.clear(),a.isNullOrUndef(t)&&(t=1),e.transition(t),!1!==l.notify(e,\"beforeDraw\",[t])&&(a.each(e.boxes,function(t){t.draw(e.chartArea)},e),e.scale&&e.scale.draw(),e.drawDatasets(t),e._drawTooltip(t),l.notify(e,\"afterDraw\",[t]))},transition:function(t){for(var e=0,i=(this.data.datasets||[]).length;e<i;++e)this.isDatasetVisible(e)&&this.getDatasetMeta(e).controller.transition(t);this.tooltip.transition(t)},drawDatasets:function(t){var e=this;if(!1!==l.notify(e,\"beforeDatasetsDraw\",[t])){for(var i=(e.data.datasets||[]).length-1;i>=0;--i)e.isDatasetVisible(i)&&e.drawDataset(i,t);l.notify(e,\"afterDatasetsDraw\",[t])}},drawDataset:function(t,e){var i=this.getDatasetMeta(t),n={meta:i,index:t,easingValue:e};!1!==l.notify(this,\"beforeDatasetDraw\",[n])&&(i.controller.draw(e),l.notify(this,\"afterDatasetDraw\",[n]))},_drawTooltip:function(t){var e=this.tooltip,i={tooltip:e,easingValue:t};!1!==l.notify(this,\"beforeTooltipDraw\",[i])&&(e.draw(),l.notify(this,\"afterTooltipDraw\",[i]))},getElementAtEvent:function(t){return r.modes.single(this,t)},getElementsAtEvent:function(t){return r.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return r.modes[\"x-axis\"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,i){var n=r.modes[e];return\"function\"==typeof n?n(this,t,i):[]},getDatasetAtEvent:function(t){return r.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var i=e._meta[this.id];return i||(i=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,i=this.data.datasets.length;e<i;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return\"boolean\"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(t){var e=this.id,i=this.data.datasets[t],n=i._meta&&i._meta[e];n&&(n.controller.destroy(),delete i._meta[e])},destroy:function(){var e,i,n=this,r=n.canvas;for(n.stop(),e=0,i=n.data.datasets.length;e<i;++e)n.destroyDatasetMeta(e);r&&(n.unbindEvents(),a.canvas.clear(n),s.releaseContext(n.ctx),n.canvas=null,n.ctx=null),l.notify(n,\"destroy\"),delete t.instances[n.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var e=this;e.tooltip=new t.Tooltip({_chart:e,_chartInstance:e,_data:e.data,_options:e.options.tooltips},e)},bindEvents:function(){var t=this,e=t._listeners={},i=function(){t.eventHandler.apply(t,arguments)};a.each(t.options.events,function(n){s.addEventListener(t,n,i),e[n]=i}),t.options.responsive&&(i=function(){t.resize()},s.addEventListener(t,\"resize\",i),e.resize=i)},unbindEvents:function(){var t=this,e=t._listeners;e&&(delete t._listeners,a.each(e,function(e,i){s.removeEventListener(t,i,e)}))},updateHoverStyle:function(t,e,i){var n,a,r,o=i?\"setHoverStyle\":\"removeHoverStyle\";for(a=0,r=t.length;a<r;++a)(n=t[a])&&this.getDatasetMeta(n._datasetIndex).controller[o](n)},eventHandler:function(t){var e=this,i=e.tooltip;if(!1!==l.notify(e,\"beforeEvent\",[t])){e._bufferedRender=!0,e._bufferedRequest=null;var n=e.handleEvent(t);i&&(n=i._start?i.handleEvent(t):n|i.handleEvent(t)),l.notify(e,\"afterEvent\",[t]);var a=e._bufferedRequest;return a?e.render(a):n&&!e.animating&&(e.stop(),e.render(e.options.hover.animationDuration,!0)),e._bufferedRender=!1,e._bufferedRequest=null,e}},handleEvent:function(t){var e,i=this,n=i.options||{},r=n.hover;return i.lastActive=i.lastActive||[],\"mouseout\"===t.type?i.active=[]:i.active=i.getElementsAtEventForMode(t,r.mode,r),a.callback(n.onHover||n.hover.onHover,[t.native,i.active],i),\"mouseup\"!==t.type&&\"click\"!==t.type||n.onClick&&n.onClick.call(i,t.native,i.active),i.lastActive.length&&i.updateHoverStyle(i.lastActive,r.mode,!1),i.active.length&&r.mode&&i.updateHoverStyle(i.active,r.mode,!0),e=!a.arrayEquals(i.active,i.lastActive),i.lastActive=i.active,e}}),t.Controller=t}},{25:25,28:28,30:30,31:31,45:45,48:48}],24:[function(t,e,i){\"use strict\";var n=t(45);e.exports=function(t){var e=[\"push\",\"pop\",\"shift\",\"splice\",\"unshift\"];function i(t,i){var n=t._chartjs;if(n){var a=n.listeners,r=a.indexOf(i);-1!==r&&a.splice(r,1),a.length>0||(e.forEach(function(e){delete t[e]}),delete t._chartjs)}}t.DatasetController=function(t,e){this.initialize(t,e)},n.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){this.chart=t,this.index=e,this.linkScales(),this.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),i=t.getDataset();null!==e.xAxisID&&e.xAxisID in t.chart.scales||(e.xAxisID=i.xAxisID||t.chart.options.scales.xAxes[0].id),null!==e.yAxisID&&e.yAxisID in t.chart.scales||(e.yAxisID=i.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&i(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,i=this.getMeta(),n=this.getDataset().data||[],a=i.data;for(t=0,e=n.length;t<e;++t)a[t]=a[t]||this.createMetaData(t);i.dataset=i.dataset||this.createMetaDataset()},addElementAndReset:function(t){var e=this.createMetaData(t);this.getMeta().data.splice(t,0,e),this.updateElement(e,t,!0)},buildOrUpdateElements:function(){var t,a,r=this,o=r.getDataset(),s=o.data||(o.data=[]);r._data!==s&&(r._data&&i(r._data,r),a=r,(t=s)._chartjs?t._chartjs.listeners.push(a):(Object.defineProperty(t,\"_chartjs\",{configurable:!0,enumerable:!1,value:{listeners:[a]}}),e.forEach(function(e){var i=\"onData\"+e.charAt(0).toUpperCase()+e.slice(1),a=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:function(){var e=Array.prototype.slice.call(arguments),r=a.apply(this,e);return n.each(t._chartjs.listeners,function(t){\"function\"==typeof t[i]&&t[i].apply(t,e)}),r}})})),r._data=s),r.resyncElements()},update:n.noop,transition:function(t){for(var e=this.getMeta(),i=e.data||[],n=i.length,a=0;a<n;++a)i[a].transition(t);e.dataset&&e.dataset.transition(t)},draw:function(){var t=this.getMeta(),e=t.data||[],i=e.length,n=0;for(t.dataset&&t.dataset.draw();n<i;++n)e[n].draw()},removeHoverStyle:function(t,e){var i=this.chart.data.datasets[t._datasetIndex],a=t._index,r=t.custom||{},o=n.valueAtIndexOrDefault,s=t._model;s.backgroundColor=r.backgroundColor?r.backgroundColor:o(i.backgroundColor,a,e.backgroundColor),s.borderColor=r.borderColor?r.borderColor:o(i.borderColor,a,e.borderColor),s.borderWidth=r.borderWidth?r.borderWidth:o(i.borderWidth,a,e.borderWidth)},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t._index,a=t.custom||{},r=n.valueAtIndexOrDefault,o=n.getHoverColor,s=t._model;s.backgroundColor=a.hoverBackgroundColor?a.hoverBackgroundColor:r(e.hoverBackgroundColor,i,o(s.backgroundColor)),s.borderColor=a.hoverBorderColor?a.hoverBorderColor:r(e.hoverBorderColor,i,o(s.borderColor)),s.borderWidth=a.hoverBorderWidth?a.hoverBorderWidth:r(e.hoverBorderWidth,i,s.borderWidth)},resyncElements:function(){var t=this.getMeta(),e=this.getDataset().data,i=t.data.length,n=e.length;n<i?t.data.splice(n,i-n):n>i&&this.insertElements(i,n-i)},insertElements:function(t,e){for(var i=0;i<e;++i)this.addElementAndReset(t+i)},onDataPush:function(){this.insertElements(this.getDataset().data.length-1,arguments.length)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(t,e){this.getMeta().data.splice(t,e),this.insertElements(t,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),t.DatasetController.extend=n.inherits}},{45:45}],25:[function(t,e,i){\"use strict\";var n=t(45);e.exports={_set:function(t,e){return n.merge(this[t]||(this[t]={}),e)}}},{45:45}],26:[function(t,e,i){\"use strict\";var n=t(2),a=t(45);var r=function(t){a.extend(this,t),this.initialize.apply(this,arguments)};a.extend(r.prototype,{initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=a.clone(t._model)),t._start={},t},transition:function(t){var e=this,i=e._model,a=e._start,r=e._view;return i&&1!==t?(r||(r=e._view={}),a||(a=e._start={}),function(t,e,i,a){var r,o,s,l,u,d,h,c,f,g=Object.keys(i);for(r=0,o=g.length;r<o;++r)if(d=i[s=g[r]],e.hasOwnProperty(s)||(e[s]=d),(l=e[s])!==d&&\"_\"!==s[0]){if(t.hasOwnProperty(s)||(t[s]=l),(h=typeof d)==typeof(u=t[s]))if(\"string\"===h){if((c=n(u)).valid&&(f=n(d)).valid){e[s]=f.mix(c,a).rgbString();continue}}else if(\"number\"===h&&isFinite(u)&&isFinite(d)){e[s]=u+(d-u)*a;continue}e[s]=d}}(a,r,i,t),e):(e._view=i,e._start=null,e)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return a.isNumber(this._model.x)&&a.isNumber(this._model.y)}}),r.extend=a.inherits,e.exports=r},{2:2,45:45}],27:[function(t,e,i){\"use strict\";var n=t(2),a=t(25),r=t(45);e.exports=function(t){function e(t,e,i){var n;return\"string\"==typeof t?(n=parseInt(t,10),-1!==t.indexOf(\"%\")&&(n=n/100*e.parentNode[i])):n=t,n}function i(t){return null!=t&&\"none\"!==t}function o(t,n,a){var r=document.defaultView,o=t.parentNode,s=r.getComputedStyle(t)[n],l=r.getComputedStyle(o)[n],u=i(s),d=i(l),h=Number.POSITIVE_INFINITY;return u||d?Math.min(u?e(s,t,a):h,d?e(l,o,a):h):\"none\"}r.configMerge=function(){return r.merge(r.clone(arguments[0]),[].slice.call(arguments,1),{merger:function(e,i,n,a){var o=i[e]||{},s=n[e];\"scales\"===e?i[e]=r.scaleMerge(o,s):\"scale\"===e?i[e]=r.merge(o,[t.scaleService.getScaleDefaults(s.type),s]):r._merger(e,i,n,a)}})},r.scaleMerge=function(){return r.merge(r.clone(arguments[0]),[].slice.call(arguments,1),{merger:function(e,i,n,a){if(\"xAxes\"===e||\"yAxes\"===e){var o,s,l,u=n[e].length;for(i[e]||(i[e]=[]),o=0;o<u;++o)l=n[e][o],s=r.valueOrDefault(l.type,\"xAxes\"===e?\"category\":\"linear\"),o>=i[e].length&&i[e].push({}),!i[e][o].type||l.type&&l.type!==i[e][o].type?r.merge(i[e][o],[t.scaleService.getScaleDefaults(s),l]):r.merge(i[e][o],l)}else r._merger(e,i,n,a)}})},r.where=function(t,e){if(r.isArray(t)&&Array.prototype.filter)return t.filter(e);var i=[];return r.each(t,function(t){e(t)&&i.push(t)}),i},r.findIndex=Array.prototype.findIndex?function(t,e,i){return t.findIndex(e,i)}:function(t,e,i){i=void 0===i?t:i;for(var n=0,a=t.length;n<a;++n)if(e.call(i,t[n],n,t))return n;return-1},r.findNextWhere=function(t,e,i){r.isNullOrUndef(i)&&(i=-1);for(var n=i+1;n<t.length;n++){var a=t[n];if(e(a))return a}},r.findPreviousWhere=function(t,e,i){r.isNullOrUndef(i)&&(i=t.length);for(var n=i-1;n>=0;n--){var a=t[n];if(e(a))return a}},r.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},r.almostEquals=function(t,e,i){return Math.abs(t-e)<i},r.almostWhole=function(t,e){var i=Math.round(t);return i-e<t&&i+e>t},r.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},r.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},r.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0===(t=+t)||isNaN(t)?t:t>0?1:-1},r.log10=Math.log10?function(t){return Math.log10(t)}:function(t){var e=Math.log(t)*Math.LOG10E,i=Math.round(e);return t===Math.pow(10,i)?i:e},r.toRadians=function(t){return t*(Math.PI/180)},r.toDegrees=function(t){return t*(180/Math.PI)},r.getAngleFromPoint=function(t,e){var i=e.x-t.x,n=e.y-t.y,a=Math.sqrt(i*i+n*n),r=Math.atan2(n,i);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},r.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},r.aliasPixel=function(t){return t%2==0?0:.5},r.splineCurve=function(t,e,i,n){var a=t.skip?e:t,r=e,o=i.skip?e:i,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),u=s/(s+l),d=l/(s+l),h=n*(u=isNaN(u)?0:u),c=n*(d=isNaN(d)?0:d);return{previous:{x:r.x-h*(o.x-a.x),y:r.y-h*(o.y-a.y)},next:{x:r.x+c*(o.x-a.x),y:r.y+c*(o.y-a.y)}}},r.EPSILON=Number.EPSILON||1e-14,r.splineCurveMonotone=function(t){var e,i,n,a,o,s,l,u,d,h=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),c=h.length;for(e=0;e<c;++e)if(!(n=h[e]).model.skip){if(i=e>0?h[e-1]:null,(a=e<c-1?h[e+1]:null)&&!a.model.skip){var f=a.model.x-n.model.x;n.deltaK=0!==f?(a.model.y-n.model.y)/f:0}!i||i.model.skip?n.mK=n.deltaK:!a||a.model.skip?n.mK=i.deltaK:this.sign(i.deltaK)!==this.sign(n.deltaK)?n.mK=0:n.mK=(i.deltaK+n.deltaK)/2}for(e=0;e<c-1;++e)n=h[e],a=h[e+1],n.model.skip||a.model.skip||(r.almostEquals(n.deltaK,0,this.EPSILON)?n.mK=a.mK=0:(o=n.mK/n.deltaK,s=a.mK/n.deltaK,(u=Math.pow(o,2)+Math.pow(s,2))<=9||(l=3/Math.sqrt(u),n.mK=o*l*n.deltaK,a.mK=s*l*n.deltaK)));for(e=0;e<c;++e)(n=h[e]).model.skip||(i=e>0?h[e-1]:null,a=e<c-1?h[e+1]:null,i&&!i.model.skip&&(d=(n.model.x-i.model.x)/3,n.model.controlPointPreviousX=n.model.x-d,n.model.controlPointPreviousY=n.model.y-d*n.mK),a&&!a.model.skip&&(d=(a.model.x-n.model.x)/3,n.model.controlPointNextX=n.model.x+d,n.model.controlPointNextY=n.model.y+d*n.mK))},r.nextItem=function(t,e,i){return i?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},r.previousItem=function(t,e,i){return i?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},r.niceNum=function(t,e){var i=Math.floor(r.log10(t)),n=t/Math.pow(10,i);return(e?n<1.5?1:n<3?2:n<7?5:10:n<=1?1:n<=2?2:n<=5?5:10)*Math.pow(10,i)},r.requestAnimFrame=\"undefined\"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},r.getRelativePosition=function(t,e){var i,n,a=t.originalEvent||t,o=t.currentTarget||t.srcElement,s=o.getBoundingClientRect(),l=a.touches;l&&l.length>0?(i=l[0].clientX,n=l[0].clientY):(i=a.clientX,n=a.clientY);var u=parseFloat(r.getStyle(o,\"padding-left\")),d=parseFloat(r.getStyle(o,\"padding-top\")),h=parseFloat(r.getStyle(o,\"padding-right\")),c=parseFloat(r.getStyle(o,\"padding-bottom\")),f=s.right-s.left-u-h,g=s.bottom-s.top-d-c;return{x:i=Math.round((i-s.left-u)/f*o.width/e.currentDevicePixelRatio),y:n=Math.round((n-s.top-d)/g*o.height/e.currentDevicePixelRatio)}},r.getConstraintWidth=function(t){return o(t,\"max-width\",\"clientWidth\")},r.getConstraintHeight=function(t){return o(t,\"max-height\",\"clientHeight\")},r.getMaximumWidth=function(t){var e=t.parentNode;if(!e)return t.clientWidth;var i=parseInt(r.getStyle(e,\"padding-left\"),10),n=parseInt(r.getStyle(e,\"padding-right\"),10),a=e.clientWidth-i-n,o=r.getConstraintWidth(t);return isNaN(o)?a:Math.min(a,o)},r.getMaximumHeight=function(t){var e=t.parentNode;if(!e)return t.clientHeight;var i=parseInt(r.getStyle(e,\"padding-top\"),10),n=parseInt(r.getStyle(e,\"padding-bottom\"),10),a=e.clientHeight-i-n,o=r.getConstraintHeight(t);return isNaN(o)?a:Math.min(a,o)},r.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},r.retinaScale=function(t,e){var i=t.currentDevicePixelRatio=e||window.devicePixelRatio||1;if(1!==i){var n=t.canvas,a=t.height,r=t.width;n.height=a*i,n.width=r*i,t.ctx.scale(i,i),n.style.height||n.style.width||(n.style.height=a+\"px\",n.style.width=r+\"px\")}},r.fontString=function(t,e,i){return e+\" \"+t+\"px \"+i},r.longestText=function(t,e,i,n){var a=(n=n||{}).data=n.data||{},o=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(a=n.data={},o=n.garbageCollect=[],n.font=e),t.font=e;var s=0;r.each(i,function(e){null!=e&&!0!==r.isArray(e)?s=r.measureText(t,a,o,s,e):r.isArray(e)&&r.each(e,function(e){null==e||r.isArray(e)||(s=r.measureText(t,a,o,s,e))})});var l=o.length/2;if(l>i.length){for(var u=0;u<l;u++)delete a[o[u]];o.splice(0,l)}return s},r.measureText=function(t,e,i,n,a){var r=e[a];return r||(r=e[a]=t.measureText(a).width,i.push(a)),r>n&&(n=r),n},r.numberOfLabelLines=function(t){var e=1;return r.each(t,function(t){r.isArray(t)&&t.length>e&&(e=t.length)}),e},r.color=n?function(t){return t instanceof CanvasGradient&&(t=a.global.defaultColor),n(t)}:function(t){return console.error(\"Color.js not found!\"),t},r.getHoverColor=function(t){return t instanceof CanvasPattern?t:r.color(t).saturate(.5).darken(.1).rgbString()}}},{2:2,25:25,45:45}],28:[function(t,e,i){\"use strict\";var n=t(45);function a(t,e){return t.native?{x:t.x,y:t.y}:n.getRelativePosition(t,e)}function r(t,e){var i,n,a,r,o;for(n=0,r=t.data.datasets.length;n<r;++n)if(t.isDatasetVisible(n))for(a=0,o=(i=t.getDatasetMeta(n)).data.length;a<o;++a){var s=i.data[a];s._view.skip||e(s)}}function o(t,e){var i=[];return r(t,function(t){t.inRange(e.x,e.y)&&i.push(t)}),i}function s(t,e,i,n){var a=Number.POSITIVE_INFINITY,o=[];return r(t,function(t){if(!i||t.inRange(e.x,e.y)){var r=t.getCenterPoint(),s=n(e,r);s<a?(o=[t],a=s):s===a&&o.push(t)}}),o}function l(t){var e=-1!==t.indexOf(\"x\"),i=-1!==t.indexOf(\"y\");return function(t,n){var a=e?Math.abs(t.x-n.x):0,r=i?Math.abs(t.y-n.y):0;return Math.sqrt(Math.pow(a,2)+Math.pow(r,2))}}function u(t,e,i){var n=a(e,t);i.axis=i.axis||\"x\";var r=l(i.axis),u=i.intersect?o(t,n):s(t,n,!1,r),d=[];return u.length?(t.data.datasets.forEach(function(e,i){if(t.isDatasetVisible(i)){var n=t.getDatasetMeta(i).data[u[0]._index];n&&!n._view.skip&&d.push(n)}}),d):[]}e.exports={modes:{single:function(t,e){var i=a(e,t),n=[];return r(t,function(t){if(t.inRange(i.x,i.y))return n.push(t),n}),n.slice(0,1)},label:u,index:u,dataset:function(t,e,i){var n=a(e,t);i.axis=i.axis||\"xy\";var r=l(i.axis),u=i.intersect?o(t,n):s(t,n,!1,r);return u.length>0&&(u=t.getDatasetMeta(u[0]._datasetIndex).data),u},\"x-axis\":function(t,e){return u(t,e,{intersect:!1})},point:function(t,e){return o(t,a(e,t))},nearest:function(t,e,i){var n=a(e,t);i.axis=i.axis||\"xy\";var r=l(i.axis),o=s(t,n,i.intersect,r);return o.length>1&&o.sort(function(t,e){var i=t.getArea()-e.getArea();return 0===i&&(i=t._datasetIndex-e._datasetIndex),i}),o.slice(0,1)},x:function(t,e,i){var n=a(e,t),o=[],s=!1;return r(t,function(t){t.inXRange(n.x)&&o.push(t),t.inRange(n.x,n.y)&&(s=!0)}),i.intersect&&!s&&(o=[]),o},y:function(t,e,i){var n=a(e,t),o=[],s=!1;return r(t,function(t){t.inYRange(n.y)&&o.push(t),t.inRange(n.x,n.y)&&(s=!0)}),i.intersect&&!s&&(o=[]),o}}}},{45:45}],29:[function(t,e,i){\"use strict\";t(25)._set(\"global\",{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:[\"mousemove\",\"mouseout\",\"click\",\"touchstart\",\"touchmove\"],hover:{onHover:null,mode:\"nearest\",intersect:!0,animationDuration:400},onClick:null,defaultColor:\"rgba(0,0,0,0.1)\",defaultFontColor:\"#666\",defaultFontFamily:\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",defaultFontSize:12,defaultFontStyle:\"normal\",showLines:!0,elements:{},layout:{padding:{top:0,right:0,bottom:0,left:0}}}),e.exports=function(){var t=function(t,e){return this.construct(t,e),this};return t.Chart=t,t}},{25:25}],30:[function(t,e,i){\"use strict\";var n=t(45);function a(t,e){return n.where(t,function(t){return t.position===e})}function r(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,i){var n=e?i:t,a=e?t:i;return n.weight===a.weight?n._tmpIndex_-a._tmpIndex_:n.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}e.exports={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||\"top\",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure:function(t,e,i){for(var n,a=[\"fullWidth\",\"position\",\"weight\"],r=a.length,o=0;o<r;++o)n=a[o],i.hasOwnProperty(n)&&(e[n]=i[n])},update:function(t,e,i){if(t){var o=t.options.layout||{},s=n.options.toPadding(o.padding),l=s.left,u=s.right,d=s.top,h=s.bottom,c=a(t.boxes,\"left\"),f=a(t.boxes,\"right\"),g=a(t.boxes,\"top\"),m=a(t.boxes,\"bottom\"),p=a(t.boxes,\"chartArea\");r(c,!0),r(f,!1),r(g,!0),r(m,!1);var v=e-l-u,y=i-d-h,b=y/2,x=(e-v/2)/(c.length+f.length),_=(i-b)/(g.length+m.length),k=v,w=y,M=[];n.each(c.concat(f,g,m),function(t){var e,i=t.isHorizontal();i?(e=t.update(t.fullWidth?v:k,_),w-=e.height):(e=t.update(x,w),k-=e.width),M.push({horizontal:i,minSize:e,box:t})});var S=0,D=0,C=0,P=0;n.each(g.concat(m),function(t){if(t.getPadding){var e=t.getPadding();S=Math.max(S,e.left),D=Math.max(D,e.right)}}),n.each(c.concat(f),function(t){if(t.getPadding){var e=t.getPadding();C=Math.max(C,e.top),P=Math.max(P,e.bottom)}});var T=l,O=u,I=d,A=h;n.each(c.concat(f),z),n.each(c,function(t){T+=t.width}),n.each(f,function(t){O+=t.width}),n.each(g.concat(m),z),n.each(g,function(t){I+=t.height}),n.each(m,function(t){A+=t.height}),n.each(c.concat(f),function(t){var e=n.findNextWhere(M,function(e){return e.box===t}),i={left:0,right:0,top:I,bottom:A};e&&t.update(e.minSize.width,w,i)}),T=l,O=u,I=d,A=h,n.each(c,function(t){T+=t.width}),n.each(f,function(t){O+=t.width}),n.each(g,function(t){I+=t.height}),n.each(m,function(t){A+=t.height});var F=Math.max(S-T,0);T+=F,O+=Math.max(D-O,0);var R=Math.max(C-I,0);I+=R,A+=Math.max(P-A,0);var L=i-I-A,W=e-T-O;W===k&&L===w||(n.each(c,function(t){t.height=L}),n.each(f,function(t){t.height=L}),n.each(g,function(t){t.fullWidth||(t.width=W)}),n.each(m,function(t){t.fullWidth||(t.width=W)}),w=L,k=W);var Y=l+F,N=d+R;n.each(c.concat(g),H),Y+=k,N+=w,n.each(f,H),n.each(m,H),t.chartArea={left:T,top:I,right:T+k,bottom:I+w},n.each(p,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(k,w)})}function z(t){var e=n.findNextWhere(M,function(e){return e.box===t});if(e)if(t.isHorizontal()){var i={left:Math.max(T,S),right:Math.max(O,D),top:0,bottom:0};t.update(t.fullWidth?v:k,y/2,i)}else t.update(e.minSize.width,w)}function H(t){t.isHorizontal()?(t.left=t.fullWidth?l:T,t.right=t.fullWidth?e-u:T+k,t.top=N,t.bottom=N+t.height,N=t.bottom):(t.left=Y,t.right=Y+t.width,t.top=I,t.bottom=I+w,Y=t.right)}}}},{45:45}],31:[function(t,e,i){\"use strict\";var n=t(25),a=t(45);n._set(\"global\",{plugins:{}}),e.exports={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){-1===e.indexOf(t)&&e.push(t)}),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var i=e.indexOf(t);-1!==i&&e.splice(i,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e,i){var n,a,r,o,s,l=this.descriptors(t),u=l.length;for(n=0;n<u;++n)if(\"function\"==typeof(s=(r=(a=l[n]).plugin)[e])&&((o=[t].concat(i||[])).push(a.options),!1===s.apply(r,o)))return!1;return!0},descriptors:function(t){var e=t.$plugins||(t.$plugins={});if(e.id===this._cacheId)return e.descriptors;var i=[],r=[],o=t&&t.config||{},s=o.options&&o.options.plugins||{};return this._plugins.concat(o.plugins||[]).forEach(function(t){if(-1===i.indexOf(t)){var e=t.id,o=s[e];!1!==o&&(!0===o&&(o=a.clone(n.global.plugins[e])),i.push(t),r.push({plugin:t,options:o||{}}))}}),e.descriptors=r,e.id=this._cacheId,r},_invalidate:function(t){delete t.$plugins}}},{25:25,45:45}],32:[function(t,e,i){\"use strict\";var n=t(25),a=t(26),r=t(45),o=t(34);function s(t){var e,i,n=[];for(e=0,i=t.length;e<i;++e)n.push(t[e].label);return n}function l(t,e,i){var n=t.getPixelForTick(e);return i&&(n-=0===e?(t.getPixelForTick(1)-n)/2:(n-t.getPixelForTick(e-1))/2),n}n._set(\"scale\",{display:!0,position:\"left\",offset:!1,gridLines:{display:!0,color:\"rgba(0, 0, 0, 0.1)\",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:\"rgba(0,0,0,0.25)\",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:\"\",lineHeight:1.2,padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:o.formatters.values,minor:{},major:{}}}),e.exports=function(t){function e(t,e,i){return r.isArray(e)?r.longestText(t,i,e):t.measureText(e).width}function i(t){var e=r.valueOrDefault,i=n.global,a=e(t.fontSize,i.defaultFontSize),o=e(t.fontStyle,i.defaultFontStyle),s=e(t.fontFamily,i.defaultFontFamily);return{size:a,style:o,family:s,font:r.fontString(a,o,s)}}function o(t){return r.options.toLineHeight(r.valueOrDefault(t.lineHeight,1.2),r.valueOrDefault(t.fontSize,n.global.defaultFontSize))}t.Scale=a.extend({getPadding:function(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}},getTicks:function(){return this._ticks},mergeTicksOptions:function(){var t=this.options.ticks;for(var e in!1===t.minor&&(t.minor={display:!1}),!1===t.major&&(t.major={display:!1}),t)\"major\"!==e&&\"minor\"!==e&&(void 0===t.minor[e]&&(t.minor[e]=t[e]),void 0===t.major[e]&&(t.major[e]=t[e]))},beforeUpdate:function(){r.callback(this.options.beforeUpdate,[this])},update:function(t,e,i){var n,a,o,s,l,u,d=this;for(d.beforeUpdate(),d.maxWidth=t,d.maxHeight=e,d.margins=r.extend({left:0,right:0,top:0,bottom:0},i),d.longestTextCache=d.longestTextCache||{},d.beforeSetDimensions(),d.setDimensions(),d.afterSetDimensions(),d.beforeDataLimits(),d.determineDataLimits(),d.afterDataLimits(),d.beforeBuildTicks(),l=d.buildTicks()||[],d.afterBuildTicks(),d.beforeTickToLabelConversion(),o=d.convertTicksToLabels(l)||d.ticks,d.afterTickToLabelConversion(),d.ticks=o,n=0,a=o.length;n<a;++n)s=o[n],(u=l[n])?u.label=s:l.push(u={label:s,major:!1});return d._ticks=l,d.beforeCalculateTickRotation(),d.calculateTickRotation(),d.afterCalculateTickRotation(),d.beforeFit(),d.fit(),d.afterFit(),d.afterUpdate(),d.minSize},afterUpdate:function(){r.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){r.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){r.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){r.callback(this.options.beforeDataLimits,[this])},determineDataLimits:r.noop,afterDataLimits:function(){r.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){r.callback(this.options.beforeBuildTicks,[this])},buildTicks:r.noop,afterBuildTicks:function(){r.callback(this.options.afterBuildTicks,[this])},beforeTickToLabelConversion:function(){r.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this.options.ticks;this.ticks=this.ticks.map(t.userCallback||t.callback,this)},afterTickToLabelConversion:function(){r.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){r.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var t=this,e=t.ctx,n=t.options.ticks,a=s(t._ticks),o=i(n);e.font=o.font;var l=n.minRotation||0;if(a.length&&t.options.display&&t.isHorizontal())for(var u,d=r.longestText(e,o.font,a,t.longestTextCache),h=d,c=t.getPixelForTick(1)-t.getPixelForTick(0)-6;h>c&&l<n.maxRotation;){var f=r.toRadians(l);if(u=Math.cos(f),Math.sin(f)*d>t.maxHeight){l--;break}l++,h=u*d}t.labelRotation=l},afterCalculateTickRotation:function(){r.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){r.callback(this.options.beforeFit,[this])},fit:function(){var t=this,n=t.minSize={width:0,height:0},a=s(t._ticks),l=t.options,u=l.ticks,d=l.scaleLabel,h=l.gridLines,c=l.display,f=t.isHorizontal(),g=i(u),m=l.gridLines.tickMarkLength;if(n.width=f?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:c&&h.drawTicks?m:0,n.height=f?c&&h.drawTicks?m:0:t.maxHeight,d.display&&c){var p=o(d)+r.options.toPadding(d.padding).height;f?n.height+=p:n.width+=p}if(u.display&&c){var v=r.longestText(t.ctx,g.font,a,t.longestTextCache),y=r.numberOfLabelLines(a),b=.5*g.size,x=t.options.ticks.padding;if(f){t.longestLabelWidth=v;var _=r.toRadians(t.labelRotation),k=Math.cos(_),w=Math.sin(_)*v+g.size*y+b*(y-1)+b;n.height=Math.min(t.maxHeight,n.height+w+x),t.ctx.font=g.font;var M=e(t.ctx,a[0],g.font),S=e(t.ctx,a[a.length-1],g.font);0!==t.labelRotation?(t.paddingLeft=\"bottom\"===l.position?k*M+3:k*b+3,t.paddingRight=\"bottom\"===l.position?k*b+3:k*S+3):(t.paddingLeft=M/2+3,t.paddingRight=S/2+3)}else u.mirror?v=0:v+=x+b,n.width=Math.min(t.maxWidth,n.width+v),t.paddingTop=g.size/2,t.paddingBottom=g.size/2}t.handleMargins(),t.width=n.width,t.height=n.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){r.callback(this.options.afterFit,[this])},isHorizontal:function(){return\"top\"===this.options.position||\"bottom\"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(r.isNullOrUndef(t))return NaN;if(\"number\"==typeof t&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:r.noop,getPixelForValue:r.noop,getValueForPixel:r.noop,getPixelForTick:function(t){var e=this,i=e.options.offset;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(i?0:1),1),a=n*t+e.paddingLeft;i&&(a+=n/2);var r=e.left+Math.round(a);return r+=e.isFullWidth()?e.margins.left:0}var o=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(o/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,n=e.left+Math.round(i);return n+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,i,n,a,o=this,s=o.isHorizontal(),l=o.options.ticks.minor,u=t.length,d=r.toRadians(o.labelRotation),h=Math.cos(d),c=o.longestLabelWidth*h,f=[];for(l.maxTicksLimit&&(a=l.maxTicksLimit),s&&(e=!1,(c+l.autoSkipPadding)*u>o.width-(o.paddingLeft+o.paddingRight)&&(e=1+Math.floor((c+l.autoSkipPadding)*u/(o.width-(o.paddingLeft+o.paddingRight)))),a&&u>a&&(e=Math.max(e,Math.floor(u/a)))),i=0;i<u;i++)n=t[i],(e>1&&i%e>0||i%e==0&&i+e>=u)&&i!==u-1&&delete n.label,f.push(n);return f},draw:function(t){var e=this,a=e.options;if(a.display){var s=e.ctx,u=n.global,d=a.ticks.minor,h=a.ticks.major||d,c=a.gridLines,f=a.scaleLabel,g=0!==e.labelRotation,m=e.isHorizontal(),p=d.autoSkip?e._autoSkip(e.getTicks()):e.getTicks(),v=r.valueOrDefault(d.fontColor,u.defaultFontColor),y=i(d),b=r.valueOrDefault(h.fontColor,u.defaultFontColor),x=i(h),_=c.drawTicks?c.tickMarkLength:0,k=r.valueOrDefault(f.fontColor,u.defaultFontColor),w=i(f),M=r.options.toPadding(f.padding),S=r.toRadians(e.labelRotation),D=[],C=e.options.gridLines.lineWidth,P=\"right\"===a.position?e.right:e.right-C-_,T=\"right\"===a.position?e.right+_:e.right,O=\"bottom\"===a.position?e.top+C:e.bottom-_-C,I=\"bottom\"===a.position?e.top+C+_:e.bottom+C;if(r.each(p,function(i,n){if(!r.isNullOrUndef(i.label)){var o,s,h,f,v,y,b,x,k,w,M,A,F,R,L=i.label;n===e.zeroLineIndex&&a.offset===c.offsetGridLines?(o=c.zeroLineWidth,s=c.zeroLineColor,h=c.zeroLineBorderDash,f=c.zeroLineBorderDashOffset):(o=r.valueAtIndexOrDefault(c.lineWidth,n),s=r.valueAtIndexOrDefault(c.color,n),h=r.valueOrDefault(c.borderDash,u.borderDash),f=r.valueOrDefault(c.borderDashOffset,u.borderDashOffset));var W=\"middle\",Y=\"middle\",N=d.padding;if(m){var z=_+N;\"bottom\"===a.position?(Y=g?\"middle\":\"top\",W=g?\"right\":\"center\",R=e.top+z):(Y=g?\"middle\":\"bottom\",W=g?\"left\":\"center\",R=e.bottom-z);var H=l(e,n,c.offsetGridLines&&p.length>1);H<e.left&&(s=\"rgba(0,0,0,0)\"),H+=r.aliasPixel(o),F=e.getPixelForTick(n)+d.labelOffset,v=b=k=M=H,y=O,x=I,w=t.top,A=t.bottom+C}else{var V,B=\"left\"===a.position;d.mirror?(W=B?\"left\":\"right\",V=N):(W=B?\"right\":\"left\",V=_+N),F=B?e.right-V:e.left+V;var E=l(e,n,c.offsetGridLines&&p.length>1);E<e.top&&(s=\"rgba(0,0,0,0)\"),E+=r.aliasPixel(o),R=e.getPixelForTick(n)+d.labelOffset,v=P,b=T,k=t.left,M=t.right+C,y=x=w=A=E}D.push({tx1:v,ty1:y,tx2:b,ty2:x,x1:k,y1:w,x2:M,y2:A,labelX:F,labelY:R,glWidth:o,glColor:s,glBorderDash:h,glBorderDashOffset:f,rotation:-1*S,label:L,major:i.major,textBaseline:Y,textAlign:W})}}),r.each(D,function(t){if(c.display&&(s.save(),s.lineWidth=t.glWidth,s.strokeStyle=t.glColor,s.setLineDash&&(s.setLineDash(t.glBorderDash),s.lineDashOffset=t.glBorderDashOffset),s.beginPath(),c.drawTicks&&(s.moveTo(t.tx1,t.ty1),s.lineTo(t.tx2,t.ty2)),c.drawOnChartArea&&(s.moveTo(t.x1,t.y1),s.lineTo(t.x2,t.y2)),s.stroke(),s.restore()),d.display){s.save(),s.translate(t.labelX,t.labelY),s.rotate(t.rotation),s.font=t.major?x.font:y.font,s.fillStyle=t.major?b:v,s.textBaseline=t.textBaseline,s.textAlign=t.textAlign;var i=t.label;if(r.isArray(i))for(var n=i.length,a=1.5*y.size,o=e.isHorizontal()?0:-a*(n-1)/2,l=0;l<n;++l)s.fillText(\"\"+i[l],0,o),o+=a;else s.fillText(i,0,0);s.restore()}}),f.display){var A,F,R=0,L=o(f)/2;if(m)A=e.left+(e.right-e.left)/2,F=\"bottom\"===a.position?e.bottom-L-M.bottom:e.top+L+M.top;else{var W=\"left\"===a.position;A=W?e.left+L+M.top:e.right-L-M.top,F=e.top+(e.bottom-e.top)/2,R=W?-.5*Math.PI:.5*Math.PI}s.save(),s.translate(A,F),s.rotate(R),s.textAlign=\"center\",s.textBaseline=\"middle\",s.fillStyle=k,s.font=w.font,s.fillText(f.labelString,0,0),s.restore()}if(c.drawBorder){s.lineWidth=r.valueAtIndexOrDefault(c.lineWidth,0),s.strokeStyle=r.valueAtIndexOrDefault(c.color,0);var Y=e.left,N=e.right+C,z=e.top,H=e.bottom+C,V=r.aliasPixel(s.lineWidth);m?(z=H=\"top\"===a.position?e.bottom:e.top,z+=V,H+=V):(Y=N=\"left\"===a.position?e.right:e.left,Y+=V,N+=V),s.beginPath(),s.moveTo(Y,z),s.lineTo(N,H),s.stroke()}}}})}},{25:25,26:26,34:34,45:45}],33:[function(t,e,i){\"use strict\";var n=t(25),a=t(45),r=t(30);e.exports=function(t){t.scaleService={constructors:{},defaults:{},registerScaleType:function(t,e,i){this.constructors[t]=e,this.defaults[t]=a.clone(i)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(t){return this.defaults.hasOwnProperty(t)?a.merge({},[n.scale,this.defaults[t]]):{}},updateScaleDefaults:function(t,e){this.defaults.hasOwnProperty(t)&&(this.defaults[t]=a.extend(this.defaults[t],e))},addScalesToLayout:function(t){a.each(t.scales,function(e){e.fullWidth=e.options.fullWidth,e.position=e.options.position,e.weight=e.options.weight,r.addBox(t,e)})}}}},{25:25,30:30,45:45}],34:[function(t,e,i){\"use strict\";var n=t(45);e.exports={formatters:{values:function(t){return n.isArray(t)?t:\"\"+t},linear:function(t,e,i){var a=i.length>3?i[2]-i[1]:i[1]-i[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var r=n.log10(Math.abs(a)),o=\"\";if(0!==t){var s=-1*Math.floor(r);s=Math.max(Math.min(s,20),0),o=t.toFixed(s)}else o=\"0\";return o},logarithmic:function(t,e,i){var a=t/Math.pow(10,Math.floor(n.log10(t)));return 0===t?\"0\":1===a||2===a||5===a||0===e||e===i.length-1?t.toExponential():\"\"}}}},{45:45}],35:[function(t,e,i){\"use strict\";var n=t(25),a=t(26),r=t(45);n._set(\"global\",{tooltips:{enabled:!0,custom:null,mode:\"nearest\",position:\"average\",intersect:!0,backgroundColor:\"rgba(0,0,0,0.8)\",titleFontStyle:\"bold\",titleSpacing:2,titleMarginBottom:6,titleFontColor:\"#fff\",titleAlign:\"left\",bodySpacing:2,bodyFontColor:\"#fff\",bodyAlign:\"left\",footerFontStyle:\"bold\",footerSpacing:2,footerMarginTop:6,footerFontColor:\"#fff\",footerAlign:\"left\",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:\"#fff\",displayColors:!0,borderColor:\"rgba(0,0,0,0)\",borderWidth:0,callbacks:{beforeTitle:r.noop,title:function(t,e){var i=\"\",n=e.labels,a=n?n.length:0;if(t.length>0){var r=t[0];r.xLabel?i=r.xLabel:a>0&&r.index<a&&(i=n[r.index])}return i},afterTitle:r.noop,beforeBody:r.noop,beforeLabel:r.noop,label:function(t,e){var i=e.datasets[t.datasetIndex].label||\"\";return i&&(i+=\": \"),i+=t.yLabel},labelColor:function(t,e){var i=e.getDatasetMeta(t.datasetIndex).data[t.index]._view;return{borderColor:i.borderColor,backgroundColor:i.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:r.noop,afterBody:r.noop,beforeFooter:r.noop,footer:r.noop,afterFooter:r.noop}}}),e.exports=function(t){function e(t,e){var i=r.color(t);return i.alpha(e*i.alpha()).rgbaString()}function i(t,e){return e&&(r.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function o(t){var e=n.global,i=r.valueOrDefault;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,bodyFontColor:t.bodyFontColor,_bodyFontFamily:i(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:i(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:i(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:i(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:i(t.titleFontStyle,e.defaultFontStyle),titleFontSize:i(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:i(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:i(t.footerFontStyle,e.defaultFontStyle),footerFontSize:i(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}t.Tooltip=a.extend({initialize:function(){this._model=o(this._options),this._lastActive=[]},getTitle:function(){var t=this._options.callbacks,e=t.beforeTitle.apply(this,arguments),n=t.title.apply(this,arguments),a=t.afterTitle.apply(this,arguments),r=[];return r=i(r=i(r=i(r,e),n),a)},getBeforeBody:function(){var t=this._options.callbacks.beforeBody.apply(this,arguments);return r.isArray(t)?t:void 0!==t?[t]:[]},getBody:function(t,e){var n=this,a=n._options.callbacks,o=[];return r.each(t,function(t){var r={before:[],lines:[],after:[]};i(r.before,a.beforeLabel.call(n,t,e)),i(r.lines,a.label.call(n,t,e)),i(r.after,a.afterLabel.call(n,t,e)),o.push(r)}),o},getAfterBody:function(){var t=this._options.callbacks.afterBody.apply(this,arguments);return r.isArray(t)?t:void 0!==t?[t]:[]},getFooter:function(){var t=this._options.callbacks,e=t.beforeFooter.apply(this,arguments),n=t.footer.apply(this,arguments),a=t.afterFooter.apply(this,arguments),r=[];return r=i(r=i(r=i(r,e),n),a)},update:function(e){var i,n,a,s,l,u,d,h,c,f,g,m,p,v,y,b,x,_,k,w,M=this,S=M._options,D=M._model,C=M._model=o(S),P=M._active,T=M._data,O={xAlign:D.xAlign,yAlign:D.yAlign},I={x:D.x,y:D.y},A={width:D.width,height:D.height},F={x:D.caretX,y:D.caretY};if(P.length){C.opacity=1;var R=[],L=[];F=t.Tooltip.positioners[S.position].call(M,P,M._eventPosition);var W=[];for(i=0,n=P.length;i<n;++i)W.push((b=P[i],x=void 0,_=void 0,void 0,void 0,x=b._xScale,_=b._yScale||b._scale,k=b._index,w=b._datasetIndex,{xLabel:x?x.getLabelForIndex(k,w):\"\",yLabel:_?_.getLabelForIndex(k,w):\"\",index:k,datasetIndex:w,x:b._model.x,y:b._model.y}));S.filter&&(W=W.filter(function(t){return S.filter(t,T)})),S.itemSort&&(W=W.sort(function(t,e){return S.itemSort(t,e,T)})),r.each(W,function(t){R.push(S.callbacks.labelColor.call(M,t,M._chart)),L.push(S.callbacks.labelTextColor.call(M,t,M._chart))}),C.title=M.getTitle(W,T),C.beforeBody=M.getBeforeBody(W,T),C.body=M.getBody(W,T),C.afterBody=M.getAfterBody(W,T),C.footer=M.getFooter(W,T),C.x=Math.round(F.x),C.y=Math.round(F.y),C.caretPadding=S.caretPadding,C.labelColors=R,C.labelTextColors=L,C.dataPoints=W,O=function(t,e){var i,n,a,r,o,s=t._model,l=t._chart,u=t._chart.chartArea,d=\"center\",h=\"center\";s.y<e.height?h=\"top\":s.y>l.height-e.height&&(h=\"bottom\");var c=(u.left+u.right)/2,f=(u.top+u.bottom)/2;\"center\"===h?(i=function(t){return t<=c},n=function(t){return t>c}):(i=function(t){return t<=e.width/2},n=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},r=function(t){return t-e.width-s.caretSize-s.caretPadding<0},o=function(t){return t<=f?\"top\":\"bottom\"},i(s.x)?(d=\"left\",a(s.x)&&(d=\"center\",h=o(s.y))):n(s.x)&&(d=\"right\",r(s.x)&&(d=\"center\",h=o(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:d,yAlign:g.yAlign?g.yAlign:h}}(this,A=function(t,e){var i=t._chart.ctx,n=2*e.yPadding,a=0,o=e.body,s=o.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);s+=e.beforeBody.length+e.afterBody.length;var l=e.title.length,u=e.footer.length,d=e.titleFontSize,h=e.bodyFontSize,c=e.footerFontSize;n+=l*d,n+=l?(l-1)*e.titleSpacing:0,n+=l?e.titleMarginBottom:0,n+=s*h,n+=s?(s-1)*e.bodySpacing:0,n+=u?e.footerMarginTop:0,n+=u*c,n+=u?(u-1)*e.footerSpacing:0;var f=0,g=function(t){a=Math.max(a,i.measureText(t).width+f)};return i.font=r.fontString(d,e._titleFontStyle,e._titleFontFamily),r.each(e.title,g),i.font=r.fontString(h,e._bodyFontStyle,e._bodyFontFamily),r.each(e.beforeBody.concat(e.afterBody),g),f=e.displayColors?h+2:0,r.each(o,function(t){r.each(t.before,g),r.each(t.lines,g),r.each(t.after,g)}),f=0,i.font=r.fontString(c,e._footerFontStyle,e._footerFontFamily),r.each(e.footer,g),{width:a+=2*e.xPadding,height:n}}(this,C)),a=C,s=A,l=O,u=M._chart,d=a.x,h=a.y,c=a.caretSize,f=a.caretPadding,g=a.cornerRadius,m=l.xAlign,p=l.yAlign,v=c+f,y=g+f,\"right\"===m?d-=s.width:\"center\"===m&&((d-=s.width/2)+s.width>u.width&&(d=u.width-s.width),d<0&&(d=0)),\"top\"===p?h+=v:h-=\"bottom\"===p?s.height+v:s.height/2,\"center\"===p?\"left\"===m?d+=v:\"right\"===m&&(d-=v):\"left\"===m?d-=y:\"right\"===m&&(d+=y),I={x:d,y:h}}else C.opacity=0;return C.xAlign=O.xAlign,C.yAlign=O.yAlign,C.x=I.x,C.y=I.y,C.width=A.width,C.height=A.height,C.caretX=F.x,C.caretY=F.y,M._model=C,e&&S.custom&&S.custom.call(M,C),M},drawCaret:function(t,e){var i=this._chart.ctx,n=this._view,a=this.getCaretPosition(t,e,n);i.lineTo(a.x1,a.y1),i.lineTo(a.x2,a.y2),i.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,i){var n,a,r,o,s,l,u=i.caretSize,d=i.cornerRadius,h=i.xAlign,c=i.yAlign,f=t.x,g=t.y,m=e.width,p=e.height;if(\"center\"===c)s=g+p/2,\"left\"===h?(a=(n=f)-u,r=n,o=s+u,l=s-u):(a=(n=f+m)+u,r=n,o=s-u,l=s+u);else if(\"left\"===h?(n=(a=f+d+u)-u,r=a+u):\"right\"===h?(n=(a=f+m-d-u)-u,r=a+u):(n=(a=i.caretX)-u,r=a+u),\"top\"===c)s=(o=g)-u,l=o;else{s=(o=g+p)+u,l=o;var v=r;r=n,n=v}return{x1:n,x2:a,x3:r,y1:o,y2:s,y3:l}},drawTitle:function(t,i,n,a){var o=i.title;if(o.length){n.textAlign=i._titleAlign,n.textBaseline=\"top\";var s,l,u=i.titleFontSize,d=i.titleSpacing;for(n.fillStyle=e(i.titleFontColor,a),n.font=r.fontString(u,i._titleFontStyle,i._titleFontFamily),s=0,l=o.length;s<l;++s)n.fillText(o[s],t.x,t.y),t.y+=u+d,s+1===o.length&&(t.y+=i.titleMarginBottom-d)}},drawBody:function(t,i,n,a){var o=i.bodyFontSize,s=i.bodySpacing,l=i.body;n.textAlign=i._bodyAlign,n.textBaseline=\"top\",n.font=r.fontString(o,i._bodyFontStyle,i._bodyFontFamily);var u=0,d=function(e){n.fillText(e,t.x+u,t.y),t.y+=o+s};n.fillStyle=e(i.bodyFontColor,a),r.each(i.beforeBody,d);var h=i.displayColors;u=h?o+2:0,r.each(l,function(s,l){var u=e(i.labelTextColors[l],a);n.fillStyle=u,r.each(s.before,d),r.each(s.lines,function(r){h&&(n.fillStyle=e(i.legendColorBackground,a),n.fillRect(t.x,t.y,o,o),n.lineWidth=1,n.strokeStyle=e(i.labelColors[l].borderColor,a),n.strokeRect(t.x,t.y,o,o),n.fillStyle=e(i.labelColors[l].backgroundColor,a),n.fillRect(t.x+1,t.y+1,o-2,o-2),n.fillStyle=u),d(r)}),r.each(s.after,d)}),u=0,r.each(i.afterBody,d),t.y-=s},drawFooter:function(t,i,n,a){var o=i.footer;o.length&&(t.y+=i.footerMarginTop,n.textAlign=i._footerAlign,n.textBaseline=\"top\",n.fillStyle=e(i.footerFontColor,a),n.font=r.fontString(i.footerFontSize,i._footerFontStyle,i._footerFontFamily),r.each(o,function(e){n.fillText(e,t.x,t.y),t.y+=i.footerFontSize+i.footerSpacing}))},drawBackground:function(t,i,n,a,r){n.fillStyle=e(i.backgroundColor,r),n.strokeStyle=e(i.borderColor,r),n.lineWidth=i.borderWidth;var o=i.xAlign,s=i.yAlign,l=t.x,u=t.y,d=a.width,h=a.height,c=i.cornerRadius;n.beginPath(),n.moveTo(l+c,u),\"top\"===s&&this.drawCaret(t,a),n.lineTo(l+d-c,u),n.quadraticCurveTo(l+d,u,l+d,u+c),\"center\"===s&&\"right\"===o&&this.drawCaret(t,a),n.lineTo(l+d,u+h-c),n.quadraticCurveTo(l+d,u+h,l+d-c,u+h),\"bottom\"===s&&this.drawCaret(t,a),n.lineTo(l+c,u+h),n.quadraticCurveTo(l,u+h,l,u+h-c),\"center\"===s&&\"left\"===o&&this.drawCaret(t,a),n.lineTo(l,u+c),n.quadraticCurveTo(l,u,l+c,u),n.closePath(),n.fill(),i.borderWidth>0&&n.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var i={width:e.width,height:e.height},n={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&r&&(this.drawBackground(n,e,t,i,a),n.x+=e.xPadding,n.y+=e.yPadding,this.drawTitle(n,e,t,a),this.drawBody(n,e,t,a),this.drawFooter(n,e,t,a))}},handleEvent:function(t){var e,i=this,n=i._options;return i._lastActive=i._lastActive||[],\"mouseout\"===t.type?i._active=[]:i._active=i._chart.getElementsAtEventForMode(t,n.mode,n),(e=!r.arrayEquals(i._active,i._lastActive))&&(i._lastActive=i._active,(n.enabled||n.custom)&&(i._eventPosition={x:t.x,y:t.y},i.update(!0),i.pivot())),e}}),t.Tooltip.positioners={average:function(t){if(!t.length)return!1;var e,i,n=0,a=0,r=0;for(e=0,i=t.length;e<i;++e){var o=t[e];if(o&&o.hasValue()){var s=o.tooltipPosition();n+=s.x,a+=s.y,++r}}return{x:Math.round(n/r),y:Math.round(a/r)}},nearest:function(t,e){var i,n,a,o=e.x,s=e.y,l=Number.POSITIVE_INFINITY;for(i=0,n=t.length;i<n;++i){var u=t[i];if(u&&u.hasValue()){var d=u.getCenterPoint(),h=r.distanceBetweenPoints(e,d);h<l&&(l=h,a=u)}}if(a){var c=a.tooltipPosition();o=c.x,s=c.y}return{x:o,y:s}}}}},{25:25,26:26,45:45}],36:[function(t,e,i){\"use strict\";var n=t(25),a=t(26),r=t(45);n._set(\"global\",{elements:{arc:{backgroundColor:n.global.defaultColor,borderColor:\"#fff\",borderWidth:2}}}),e.exports=a.extend({inLabelRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2)},inRange:function(t,e){var i=this._view;if(i){for(var n=r.getAngleFromPoint(i,{x:t,y:e}),a=n.angle,o=n.distance,s=i.startAngle,l=i.endAngle;l<s;)l+=2*Math.PI;for(;a>l;)a-=2*Math.PI;for(;a<s;)a+=2*Math.PI;var u=a>=s&&a<=l,d=o>=i.innerRadius&&o<=i.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,i=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,i=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},draw:function(){var t=this._chart.ctx,e=this._view,i=e.startAngle,n=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,i,n),t.arc(e.x,e.y,e.innerRadius,n,i,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin=\"bevel\",e.borderWidth&&t.stroke()}})},{25:25,26:26,45:45}],37:[function(t,e,i){\"use strict\";var n=t(25),a=t(26),r=t(45),o=n.global;n._set(\"global\",{elements:{line:{tension:.4,backgroundColor:o.defaultColor,borderWidth:3,borderColor:o.defaultColor,borderCapStyle:\"butt\",borderDash:[],borderDashOffset:0,borderJoinStyle:\"miter\",capBezierPoints:!0,fill:!0}}}),e.exports=a.extend({draw:function(){var t,e,i,n,a=this._view,s=this._chart.ctx,l=a.spanGaps,u=this._children.slice(),d=o.elements.line,h=-1;for(this._loop&&u.length&&u.push(u[0]),s.save(),s.lineCap=a.borderCapStyle||d.borderCapStyle,s.setLineDash&&s.setLineDash(a.borderDash||d.borderDash),s.lineDashOffset=a.borderDashOffset||d.borderDashOffset,s.lineJoin=a.borderJoinStyle||d.borderJoinStyle,s.lineWidth=a.borderWidth||d.borderWidth,s.strokeStyle=a.borderColor||o.defaultColor,s.beginPath(),h=-1,t=0;t<u.length;++t)e=u[t],i=r.previousItem(u,t),n=e._view,0===t?n.skip||(s.moveTo(n.x,n.y),h=t):(i=-1===h?i:u[h],n.skip||(h!==t-1&&!l||-1===h?s.moveTo(n.x,n.y):r.canvas.lineTo(s,i._view,e._view),h=t));s.stroke(),s.restore()}})},{25:25,26:26,45:45}],38:[function(t,e,i){\"use strict\";var n=t(25),a=t(26),r=t(45),o=n.global.defaultColor;function s(t){var e=this._view;return!!e&&Math.abs(t-e.x)<e.radius+e.hitRadius}n._set(\"global\",{elements:{point:{radius:3,pointStyle:\"circle\",backgroundColor:o,borderColor:o,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}}),e.exports=a.extend({inRange:function(t,e){var i=this._view;return!!i&&Math.pow(t-i.x,2)+Math.pow(e-i.y,2)<Math.pow(i.hitRadius+i.radius,2)},inLabelRange:s,inXRange:s,inYRange:function(t){var e=this._view;return!!e&&Math.abs(t-e.y)<e.radius+e.hitRadius},getCenterPoint:function(){var t=this._view;return{x:t.x,y:t.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(t){var e=this._view,i=this._model,a=this._chart.ctx,s=e.pointStyle,l=e.radius,u=e.x,d=e.y,h=r.color,c=0;e.skip||(a.strokeStyle=e.borderColor||o,a.lineWidth=r.valueOrDefault(e.borderWidth,n.global.elements.point.borderWidth),a.fillStyle=e.backgroundColor||o,void 0!==t&&(i.x<t.left||1.01*t.right<i.x||i.y<t.top||1.01*t.bottom<i.y)&&(i.x<t.left?c=(u-i.x)/(t.left-i.x):1.01*t.right<i.x?c=(i.x-u)/(i.x-t.right):i.y<t.top?c=(d-i.y)/(t.top-i.y):1.01*t.bottom<i.y&&(c=(i.y-d)/(i.y-t.bottom)),c=Math.round(100*c)/100,a.strokeStyle=h(a.strokeStyle).alpha(c).rgbString(),a.fillStyle=h(a.fillStyle).alpha(c).rgbString()),r.canvas.drawPoint(a,s,l,u,d))}})},{25:25,26:26,45:45}],39:[function(t,e,i){\"use strict\";var n=t(25),a=t(26);function r(t){return void 0!==t._view.width}function o(t){var e,i,n,a,o=t._view;if(r(t)){var s=o.width/2;e=o.x-s,i=o.x+s,n=Math.min(o.y,o.base),a=Math.max(o.y,o.base)}else{var l=o.height/2;e=Math.min(o.x,o.base),i=Math.max(o.x,o.base),n=o.y-l,a=o.y+l}return{left:e,top:n,right:i,bottom:a}}n._set(\"global\",{elements:{rectangle:{backgroundColor:n.global.defaultColor,borderColor:n.global.defaultColor,borderSkipped:\"bottom\",borderWidth:0}}}),e.exports=a.extend({draw:function(){var t,e,i,n,a,r,o,s=this._chart.ctx,l=this._view,u=l.borderWidth;if(l.horizontal?(t=l.base,e=l.x,i=l.y-l.height/2,n=l.y+l.height/2,a=e>t?1:-1,r=1,o=l.borderSkipped||\"left\"):(t=l.x-l.width/2,e=l.x+l.width/2,i=l.y,a=1,r=(n=l.base)>i?1:-1,o=l.borderSkipped||\"bottom\"),u){var d=Math.min(Math.abs(t-e),Math.abs(i-n)),h=(u=u>d?d:u)/2,c=t+(\"left\"!==o?h*a:0),f=e+(\"right\"!==o?-h*a:0),g=i+(\"top\"!==o?h*r:0),m=n+(\"bottom\"!==o?-h*r:0);c!==f&&(i=g,n=m),g!==m&&(t=c,e=f)}s.beginPath(),s.fillStyle=l.backgroundColor,s.strokeStyle=l.borderColor,s.lineWidth=u;var p=[[t,n],[t,i],[e,i],[e,n]],v=[\"bottom\",\"left\",\"top\",\"right\"].indexOf(o,0);function y(t){return p[(v+t)%4]}-1===v&&(v=0);var b=y(0);s.moveTo(b[0],b[1]);for(var x=1;x<4;x++)b=y(x),s.lineTo(b[0],b[1]);s.fill(),u&&s.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var i=!1;if(this._view){var n=o(this);i=t>=n.left&&t<=n.right&&e>=n.top&&e<=n.bottom}return i},inLabelRange:function(t,e){if(!this._view)return!1;var i=o(this);return r(this)?t>=i.left&&t<=i.right:e>=i.top&&e<=i.bottom},inXRange:function(t){var e=o(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=o(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,e,i=this._view;return r(this)?(t=i.x,e=(i.y+i.base)/2):(t=(i.x+i.base)/2,e=i.y),{x:t,y:e}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})},{25:25,26:26}],40:[function(t,e,i){\"use strict\";e.exports={},e.exports.Arc=t(36),e.exports.Line=t(37),e.exports.Point=t(38),e.exports.Rectangle=t(39)},{36:36,37:37,38:38,39:39}],41:[function(t,e,i){\"use strict\";var n=t(42);i=e.exports={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,i,n,a,r){if(r){var o=Math.min(r,n/2),s=Math.min(r,a/2);t.moveTo(e+o,i),t.lineTo(e+n-o,i),t.quadraticCurveTo(e+n,i,e+n,i+s),t.lineTo(e+n,i+a-s),t.quadraticCurveTo(e+n,i+a,e+n-o,i+a),t.lineTo(e+o,i+a),t.quadraticCurveTo(e,i+a,e,i+a-s),t.lineTo(e,i+s),t.quadraticCurveTo(e,i,e+o,i)}else t.rect(e,i,n,a)},drawPoint:function(t,e,i,n,a){var r,o,s,l,u,d;if(!e||\"object\"!=typeof e||\"[object HTMLImageElement]\"!==(r=e.toString())&&\"[object HTMLCanvasElement]\"!==r){if(!(isNaN(i)||i<=0)){switch(e){default:t.beginPath(),t.arc(n,a,i,0,2*Math.PI),t.closePath(),t.fill();break;case\"triangle\":t.beginPath(),u=(o=3*i/Math.sqrt(3))*Math.sqrt(3)/2,t.moveTo(n-o/2,a+u/3),t.lineTo(n+o/2,a+u/3),t.lineTo(n,a-2*u/3),t.closePath(),t.fill();break;case\"rect\":d=1/Math.SQRT2*i,t.beginPath(),t.fillRect(n-d,a-d,2*d,2*d),t.strokeRect(n-d,a-d,2*d,2*d);break;case\"rectRounded\":var h=i/Math.SQRT2,c=n-h,f=a-h,g=Math.SQRT2*i;t.beginPath(),this.roundedRect(t,c,f,g,g,i/2),t.closePath(),t.fill();break;case\"rectRot\":d=1/Math.SQRT2*i,t.beginPath(),t.moveTo(n-d,a),t.lineTo(n,a+d),t.lineTo(n+d,a),t.lineTo(n,a-d),t.closePath(),t.fill();break;case\"cross\":t.beginPath(),t.moveTo(n,a+i),t.lineTo(n,a-i),t.moveTo(n-i,a),t.lineTo(n+i,a),t.closePath();break;case\"crossRot\":t.beginPath(),s=Math.cos(Math.PI/4)*i,l=Math.sin(Math.PI/4)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n-s,a+l),t.lineTo(n+s,a-l),t.closePath();break;case\"star\":t.beginPath(),t.moveTo(n,a+i),t.lineTo(n,a-i),t.moveTo(n-i,a),t.lineTo(n+i,a),s=Math.cos(Math.PI/4)*i,l=Math.sin(Math.PI/4)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n-s,a+l),t.lineTo(n+s,a-l),t.closePath();break;case\"line\":t.beginPath(),t.moveTo(n-i,a),t.lineTo(n+i,a),t.closePath();break;case\"dash\":t.beginPath(),t.moveTo(n,a),t.lineTo(n+i,a),t.closePath()}t.stroke()}}else t.drawImage(e,n-e.width/2,a-e.height/2,e.width,e.height)},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,i,n){if(i.steppedLine)return\"after\"===i.steppedLine&&!n||\"after\"!==i.steppedLine&&n?t.lineTo(e.x,i.y):t.lineTo(i.x,e.y),void t.lineTo(i.x,i.y);i.tension?t.bezierCurveTo(n?e.controlPointPreviousX:e.controlPointNextX,n?e.controlPointPreviousY:e.controlPointNextY,n?i.controlPointNextX:i.controlPointPreviousX,n?i.controlPointNextY:i.controlPointPreviousY,i.x,i.y):t.lineTo(i.x,i.y)}};n.clear=i.clear,n.drawRoundedRectangle=function(t){t.beginPath(),i.roundedRect.apply(i,arguments),t.closePath()}},{42:42}],42:[function(t,e,i){\"use strict\";var n,a={noop:function(){},uid:(n=0,function(){return n++}),isNullOrUndef:function(t){return null==t},isArray:Array.isArray?Array.isArray:function(t){return\"[object Array]\"===Object.prototype.toString.call(t)},isObject:function(t){return null!==t&&\"[object Object]\"===Object.prototype.toString.call(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,i){return a.valueOrDefault(a.isArray(t)?t[e]:t,i)},callback:function(t,e,i){if(t&&\"function\"==typeof t.call)return t.apply(i,e)},each:function(t,e,i,n){var r,o,s;if(a.isArray(t))if(o=t.length,n)for(r=o-1;r>=0;r--)e.call(i,t[r],r);else for(r=0;r<o;r++)e.call(i,t[r],r);else if(a.isObject(t))for(o=(s=Object.keys(t)).length,r=0;r<o;r++)e.call(i,t[s[r]],s[r])},arrayEquals:function(t,e){var i,n,r,o;if(!t||!e||t.length!==e.length)return!1;for(i=0,n=t.length;i<n;++i)if(r=t[i],o=e[i],r instanceof Array&&o instanceof Array){if(!a.arrayEquals(r,o))return!1}else if(r!==o)return!1;return!0},clone:function(t){if(a.isArray(t))return t.map(a.clone);if(a.isObject(t)){for(var e={},i=Object.keys(t),n=i.length,r=0;r<n;++r)e[i[r]]=a.clone(t[i[r]]);return e}return t},_merger:function(t,e,i,n){var r=e[t],o=i[t];a.isObject(r)&&a.isObject(o)?a.merge(r,o,n):e[t]=a.clone(o)},_mergerIf:function(t,e,i){var n=e[t],r=i[t];a.isObject(n)&&a.isObject(r)?a.mergeIf(n,r):e.hasOwnProperty(t)||(e[t]=a.clone(r))},merge:function(t,e,i){var n,r,o,s,l,u=a.isArray(e)?e:[e],d=u.length;if(!a.isObject(t))return t;for(n=(i=i||{}).merger||a._merger,r=0;r<d;++r)if(e=u[r],a.isObject(e))for(l=0,s=(o=Object.keys(e)).length;l<s;++l)n(o[l],t,e,i);return t},mergeIf:function(t,e){return a.merge(t,e,{merger:a._mergerIf})},extend:function(t){for(var e=function(e,i){t[i]=e},i=1,n=arguments.length;i<n;++i)a.each(arguments[i],e);return t},inherits:function(t){var e=this,i=t&&t.hasOwnProperty(\"constructor\")?t.constructor:function(){return e.apply(this,arguments)},n=function(){this.constructor=i};return n.prototype=e.prototype,i.prototype=new n,i.extend=a.inherits,t&&a.extend(i.prototype,t),i.__super__=e.prototype,i}};e.exports=a,a.callCallback=a.callback,a.indexOf=function(t,e,i){return Array.prototype.indexOf.call(t,e,i)},a.getValueOrDefault=a.valueOrDefault,a.getValueAtIndexOrDefault=a.valueAtIndexOrDefault},{}],43:[function(t,e,i){\"use strict\";var n=t(42),a={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return(t-=1)*t*t+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-((t-=1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return(t-=1)*t*t*t*t+1},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return 1-Math.cos(t*(Math.PI/2))},easeOutSine:function(t){return Math.sin(t*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return t>=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i))},easeOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/i)+1)},easeInOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:2==(t/=.5)?1:(i||(i=.45),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),t<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},easeInBack:function(t){return t*t*(2.70158*t-1.70158)},easeOutBack:function(t){return(t-=1)*t*(2.70158*t+1.70158)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-a.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*a.easeInBounce(2*t):.5*a.easeOutBounce(2*t-1)+.5}};e.exports={effects:a},n.easingEffects=a},{42:42}],44:[function(t,e,i){\"use strict\";var n=t(42);e.exports={toLineHeight:function(t,e){var i=(\"\"+t).match(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);if(!i||\"normal\"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case\"px\":return t;case\"%\":t/=100}return e*t},toPadding:function(t){var e,i,a,r;return n.isObject(t)?(e=+t.top||0,i=+t.right||0,a=+t.bottom||0,r=+t.left||0):e=i=a=r=+t||0,{top:e,right:i,bottom:a,left:r,height:e+a,width:r+i}},resolve:function(t,e,i){var a,r,o;for(a=0,r=t.length;a<r;++a)if(void 0!==(o=t[a])&&(void 0!==e&&\"function\"==typeof o&&(o=o(e)),void 0!==i&&n.isArray(o)&&(o=o[i]),void 0!==o))return o}}},{42:42}],45:[function(t,e,i){\"use strict\";e.exports=t(42),e.exports.easing=t(43),e.exports.canvas=t(41),e.exports.options=t(44)},{41:41,42:42,43:43,44:44}],46:[function(t,e,i){e.exports={acquireContext:function(t){return t&&t.canvas&&(t=t.canvas),t&&t.getContext(\"2d\")||null}}},{}],47:[function(t,e,i){\"use strict\";var n=t(45),a=\"$chartjs\",r=\"chartjs-\",o=r+\"render-monitor\",s=r+\"render-animation\",l=[\"animationstart\",\"webkitAnimationStart\"],u={touchstart:\"mousedown\",touchmove:\"mousemove\",touchend:\"mouseup\",pointerenter:\"mouseenter\",pointerdown:\"mousedown\",pointermove:\"mousemove\",pointerup:\"mouseup\",pointerleave:\"mouseout\",pointerout:\"mouseout\"};function d(t,e){var i=n.getStyle(t,e),a=i&&i.match(/^(\\d+)(\\.\\d+)?px$/);return a?Number(a[1]):void 0}var h=!!function(){var t=!1;try{var e=Object.defineProperty({},\"passive\",{get:function(){t=!0}});window.addEventListener(\"e\",null,e)}catch(t){}return t}()&&{passive:!0};function c(t,e,i){t.addEventListener(e,i,h)}function f(t,e,i){t.removeEventListener(e,i,h)}function g(t,e,i,n,a){return{type:t,chart:e,native:a||null,x:void 0!==i?i:null,y:void 0!==n?n:null}}function m(t,e,i){var u,d,h,f,m,p,v,y,b=t[a]||(t[a]={}),x=b.resizer=function(t){var e=document.createElement(\"div\"),i=r+\"size-monitor\",n=\"position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1;\";e.style.cssText=n,e.className=i,e.innerHTML='<div class=\"'+i+'-expand\" style=\"'+n+'\"><div style=\"position:absolute;width:1000000px;height:1000000px;left:0;top:0\"></div></div><div class=\"'+i+'-shrink\" style=\"'+n+'\"><div style=\"position:absolute;width:200%;height:200%;left:0; top:0\"></div></div>';var a=e.childNodes[0],o=e.childNodes[1];e._reset=function(){a.scrollLeft=1e6,a.scrollTop=1e6,o.scrollLeft=1e6,o.scrollTop=1e6};var s=function(){e._reset(),t()};return c(a,\"scroll\",s.bind(a,\"expand\")),c(o,\"scroll\",s.bind(o,\"shrink\")),e}((u=function(){if(b.resizer)return e(g(\"resize\",i))},h=!1,f=[],function(){f=Array.prototype.slice.call(arguments),d=d||this,h||(h=!0,n.requestAnimFrame.call(window,function(){h=!1,u.apply(d,f)}))}));p=function(){if(b.resizer){var e=t.parentNode;e&&e!==x.parentNode&&e.insertBefore(x,e.firstChild),x._reset()}},v=(m=t)[a]||(m[a]={}),y=v.renderProxy=function(t){t.animationName===s&&p()},n.each(l,function(t){c(m,t,y)}),v.reflow=!!m.offsetParent,m.classList.add(o)}function p(t){var e,i,r,s=t[a]||{},u=s.resizer;delete s.resizer,i=(e=t)[a]||{},(r=i.renderProxy)&&(n.each(l,function(t){f(e,t,r)}),delete i.renderProxy),e.classList.remove(o),u&&u.parentNode&&u.parentNode.removeChild(u)}e.exports={_enabled:\"undefined\"!=typeof window&&\"undefined\"!=typeof document,initialize:function(){var t,e,i,n=\"from{opacity:0.99}to{opacity:1}\";e=\"@-webkit-keyframes \"+s+\"{\"+n+\"}@keyframes \"+s+\"{\"+n+\"}.\"+o+\"{-webkit-animation:\"+s+\" 0.001s;animation:\"+s+\" 0.001s;}\",i=(t=this)._style||document.createElement(\"style\"),t._style||(t._style=i,e=\"/* Chart.js */\\n\"+e,i.setAttribute(\"type\",\"text/css\"),document.getElementsByTagName(\"head\")[0].appendChild(i)),i.appendChild(document.createTextNode(e))},acquireContext:function(t,e){\"string\"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var i=t&&t.getContext&&t.getContext(\"2d\");return i&&i.canvas===t?(function(t,e){var i=t.style,n=t.getAttribute(\"height\"),r=t.getAttribute(\"width\");if(t[a]={initial:{height:n,width:r,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||\"block\",null===r||\"\"===r){var o=d(t,\"width\");void 0!==o&&(t.width=o)}if(null===n||\"\"===n)if(\"\"===t.style.height)t.height=t.width/(e.options.aspectRatio||2);else{var s=d(t,\"height\");void 0!==o&&(t.height=s)}}(t,e),i):null},releaseContext:function(t){var e=t.canvas;if(e[a]){var i=e[a].initial;[\"height\",\"width\"].forEach(function(t){var a=i[t];n.isNullOrUndef(a)?e.removeAttribute(t):e.setAttribute(t,a)}),n.each(i.style||{},function(t,i){e.style[i]=t}),e.width=e.width,delete e[a]}},addEventListener:function(t,e,i){var r=t.canvas;if(\"resize\"!==e){var o=i[a]||(i[a]={});c(r,e,(o.proxies||(o.proxies={}))[t.id+\"_\"+e]=function(e){var a,r,o,s;i((r=t,o=u[(a=e).type]||a.type,s=n.getRelativePosition(a,r),g(o,r,s.x,s.y,a)))})}else m(r,i,t)},removeEventListener:function(t,e,i){var n=t.canvas;if(\"resize\"!==e){var r=((i[a]||{}).proxies||{})[t.id+\"_\"+e];r&&f(n,e,r)}else p(n)}},n.addEvent=c,n.removeEvent=f},{45:45}],48:[function(t,e,i){\"use strict\";var n=t(45),a=t(46),r=t(47),o=r._enabled?r:a;e.exports=n.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},o)},{45:45,46:46,47:47}],49:[function(t,e,i){\"use strict\";e.exports={},e.exports.filler=t(50),e.exports.legend=t(51),e.exports.title=t(52)},{50:50,51:51,52:52}],50:[function(t,e,i){\"use strict\";var n=t(25),a=t(40),r=t(45);n._set(\"global\",{plugins:{filler:{propagate:!0}}});var o={dataset:function(t){var e=t.fill,i=t.chart,n=i.getDatasetMeta(e),a=n&&i.isDatasetVisible(e)&&n.dataset._children||[],r=a.length||0;return r?function(t,e){return e<r&&a[e]._view||null}:null},boundary:function(t){var e=t.boundary,i=e?e.x:null,n=e?e.y:null;return function(t){return{x:null===i?t.x:i,y:null===n?t.y:n}}}};function s(t,e,i){var n,a=t._model||{},r=a.fill;if(void 0===r&&(r=!!a.backgroundColor),!1===r||null===r)return!1;if(!0===r)return\"origin\";if(n=parseFloat(r,10),isFinite(n)&&Math.floor(n)===n)return\"-\"!==r[0]&&\"+\"!==r[0]||(n=e+n),!(n===e||n<0||n>=i)&&n;switch(r){case\"bottom\":return\"start\";case\"top\":return\"end\";case\"zero\":return\"origin\";case\"origin\":case\"start\":case\"end\":return r;default:return!1}}function l(t){var e,i=t.el._model||{},n=t.el._scale||{},a=t.fill,r=null;if(isFinite(a))return null;if(\"start\"===a?r=void 0===i.scaleBottom?n.bottom:i.scaleBottom:\"end\"===a?r=void 0===i.scaleTop?n.top:i.scaleTop:void 0!==i.scaleZero?r=i.scaleZero:n.getBasePosition?r=n.getBasePosition():n.getBasePixel&&(r=n.getBasePixel()),null!=r){if(void 0!==r.x&&void 0!==r.y)return r;if(\"number\"==typeof r&&isFinite(r))return{x:(e=n.isHorizontal())?r:null,y:e?null:r}}return null}function u(t,e,i){var n,a=t[e].fill,r=[e];if(!i)return a;for(;!1!==a&&-1===r.indexOf(a);){if(!isFinite(a))return a;if(!(n=t[a]))return!1;if(n.visible)return a;r.push(a),a=n.fill}return!1}function d(t){return t&&!t.skip}function h(t,e,i,n,a){var o;if(n&&a){for(t.moveTo(e[0].x,e[0].y),o=1;o<n;++o)r.canvas.lineTo(t,e[o-1],e[o]);for(t.lineTo(i[a-1].x,i[a-1].y),o=a-1;o>0;--o)r.canvas.lineTo(t,i[o],i[o-1],!0)}}e.exports={id:\"filler\",afterDatasetsUpdate:function(t,e){var i,n,r,d,h,c,f,g=(t.data.datasets||[]).length,m=e.propagate,p=[];for(n=0;n<g;++n)d=null,(r=(i=t.getDatasetMeta(n)).dataset)&&r._model&&r instanceof a.Line&&(d={visible:t.isDatasetVisible(n),fill:s(r,n,g),chart:t,el:r}),i.$filler=d,p.push(d);for(n=0;n<g;++n)(d=p[n])&&(d.fill=u(p,n,m),d.boundary=l(d),d.mapper=(void 0,f=void 0,c=(h=d).fill,f=\"dataset\",!1===c?null:(isFinite(c)||(f=\"boundary\"),o[f](h))))},beforeDatasetDraw:function(t,e){var i=e.meta.$filler;if(i){var a=t.ctx,o=i.el,s=o._view,l=o._children||[],u=i.mapper,c=s.backgroundColor||n.global.defaultColor;u&&c&&l.length&&(r.canvas.clipArea(a,t.chartArea),function(t,e,i,n,a,r){var o,s,l,u,c,f,g,m=e.length,p=n.spanGaps,v=[],y=[],b=0,x=0;for(t.beginPath(),o=0,s=m+!!r;o<s;++o)c=i(u=e[l=o%m]._view,l,n),f=d(u),g=d(c),f&&g?(b=v.push(u),x=y.push(c)):b&&x&&(p?(f&&v.push(u),g&&y.push(c)):(h(t,v,y,b,x),b=x=0,v=[],y=[]));h(t,v,y,b,x),t.closePath(),t.fillStyle=a,t.fill()}(a,l,u,s,c,o._loop),r.canvas.unclipArea(a))}}}},{25:25,40:40,45:45}],51:[function(t,e,i){\"use strict\";var n=t(25),a=t(26),r=t(45),o=t(30),s=r.noop;function l(t,e){return t.usePointStyle?e*Math.SQRT2:t.boxWidth}n._set(\"global\",{legend:{display:!0,position:\"top\",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var i=e.datasetIndex,n=this.chart,a=n.getDatasetMeta(i);a.hidden=null===a.hidden?!n.data.datasets[i].hidden:null,n.update()},onHover:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data;return r.isArray(e.datasets)?e.datasets.map(function(e,i){return{text:e.label,fillStyle:r.isArray(e.backgroundColor)?e.backgroundColor[0]:e.backgroundColor,hidden:!t.isDatasetVisible(i),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,pointStyle:e.pointStyle,datasetIndex:i}},this):[]}}},legendCallback:function(t){var e=[];e.push('<ul class=\"'+t.id+'-legend\">');for(var i=0;i<t.data.datasets.length;i++)e.push('<li><span style=\"background-color:'+t.data.datasets[i].backgroundColor+'\"></span>'),t.data.datasets[i].label&&e.push(t.data.datasets[i].label),e.push(\"</li>\");return e.push(\"</ul>\"),e.join(\"\")}});var u=a.extend({initialize:function(t){r.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:s,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:s,beforeSetDimensions:s,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:s,beforeBuildLabels:s,buildLabels:function(){var t=this,e=t.options.labels||{},i=r.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(i=i.filter(function(i){return e.filter(i,t.chart.data)})),t.options.reverse&&i.reverse(),t.legendItems=i},afterBuildLabels:s,beforeFit:s,fit:function(){var t=this,e=t.options,i=e.labels,a=e.display,o=t.ctx,s=n.global,u=r.valueOrDefault,d=u(i.fontSize,s.defaultFontSize),h=u(i.fontStyle,s.defaultFontStyle),c=u(i.fontFamily,s.defaultFontFamily),f=r.fontString(d,h,c),g=t.legendHitBoxes=[],m=t.minSize,p=t.isHorizontal();if(p?(m.width=t.maxWidth,m.height=a?10:0):(m.width=a?10:0,m.height=t.maxHeight),a)if(o.font=f,p){var v=t.lineWidths=[0],y=t.legendItems.length?d+i.padding:0;o.textAlign=\"left\",o.textBaseline=\"top\",r.each(t.legendItems,function(e,n){var a=l(i,d)+d/2+o.measureText(e.text).width;v[v.length-1]+a+i.padding>=t.width&&(y+=d+i.padding,v[v.length]=t.left),g[n]={left:0,top:0,width:a,height:d},v[v.length-1]+=a+i.padding}),m.height+=y}else{var b=i.padding,x=t.columnWidths=[],_=i.padding,k=0,w=0,M=d+b;r.each(t.legendItems,function(t,e){var n=l(i,d)+d/2+o.measureText(t.text).width;w+M>m.height&&(_+=k+i.padding,x.push(k),k=0,w=0),k=Math.max(k,n),w+=M,g[e]={left:0,top:0,width:n,height:d}}),_+=k,x.push(k),m.width+=_}t.width=m.width,t.height=m.height},afterFit:s,isHorizontal:function(){return\"top\"===this.options.position||\"bottom\"===this.options.position},draw:function(){var t=this,e=t.options,i=e.labels,a=n.global,o=a.elements.line,s=t.width,u=t.lineWidths;if(e.display){var d,h=t.ctx,c=r.valueOrDefault,f=c(i.fontColor,a.defaultFontColor),g=c(i.fontSize,a.defaultFontSize),m=c(i.fontStyle,a.defaultFontStyle),p=c(i.fontFamily,a.defaultFontFamily),v=r.fontString(g,m,p);h.textAlign=\"left\",h.textBaseline=\"middle\",h.lineWidth=.5,h.strokeStyle=f,h.fillStyle=f,h.font=v;var y=l(i,g),b=t.legendHitBoxes,x=t.isHorizontal();d=x?{x:t.left+(s-u[0])/2,y:t.top+i.padding,line:0}:{x:t.left+i.padding,y:t.top+i.padding,line:0};var _=g+i.padding;r.each(t.legendItems,function(n,l){var f,m,p,v,k,w=h.measureText(n.text).width,M=y+g/2+w,S=d.x,D=d.y;x?S+M>=s&&(D=d.y+=_,d.line++,S=d.x=t.left+(s-u[d.line])/2):D+_>t.bottom&&(S=d.x=S+t.columnWidths[d.line]+i.padding,D=d.y=t.top+i.padding,d.line++),function(t,i,n){if(!(isNaN(y)||y<=0)){h.save(),h.fillStyle=c(n.fillStyle,a.defaultColor),h.lineCap=c(n.lineCap,o.borderCapStyle),h.lineDashOffset=c(n.lineDashOffset,o.borderDashOffset),h.lineJoin=c(n.lineJoin,o.borderJoinStyle),h.lineWidth=c(n.lineWidth,o.borderWidth),h.strokeStyle=c(n.strokeStyle,a.defaultColor);var s=0===c(n.lineWidth,o.borderWidth);if(h.setLineDash&&h.setLineDash(c(n.lineDash,o.borderDash)),e.labels&&e.labels.usePointStyle){var l=g*Math.SQRT2/2,u=l/Math.SQRT2,d=t+u,f=i+u;r.canvas.drawPoint(h,n.pointStyle,l,d,f)}else s||h.strokeRect(t,i,y,g),h.fillRect(t,i,y,g);h.restore()}}(S,D,n),b[l].left=S,b[l].top=D,f=n,m=w,v=y+(p=g/2)+S,k=D+p,h.fillText(f.text,v,k),f.hidden&&(h.beginPath(),h.lineWidth=2,h.moveTo(v,k),h.lineTo(v+m,k),h.stroke()),x?d.x+=M+i.padding:d.y+=_})}},handleEvent:function(t){var e=this,i=e.options,n=\"mouseup\"===t.type?\"click\":t.type,a=!1;if(\"mousemove\"===n){if(!i.onHover)return}else{if(\"click\"!==n)return;if(!i.onClick)return}var r=t.x,o=t.y;if(r>=e.left&&r<=e.right&&o>=e.top&&o<=e.bottom)for(var s=e.legendHitBoxes,l=0;l<s.length;++l){var u=s[l];if(r>=u.left&&r<=u.left+u.width&&o>=u.top&&o<=u.top+u.height){if(\"click\"===n){i.onClick.call(e,t.native,e.legendItems[l]),a=!0;break}if(\"mousemove\"===n){i.onHover.call(e,t.native,e.legendItems[l]),a=!0;break}}}return a}});function d(t,e){var i=new u({ctx:t.ctx,options:e,chart:t});o.configure(t,i,e),o.addBox(t,i),t.legend=i}e.exports={id:\"legend\",_element:u,beforeInit:function(t){var e=t.options.legend;e&&d(t,e)},beforeUpdate:function(t){var e=t.options.legend,i=t.legend;e?(r.mergeIf(e,n.global.legend),i?(o.configure(t,i,e),i.options=e):d(t,e)):i&&(o.removeBox(t,i),delete t.legend)},afterEvent:function(t,e){var i=t.legend;i&&i.handleEvent(e)}}},{25:25,26:26,30:30,45:45}],52:[function(t,e,i){\"use strict\";var n=t(25),a=t(26),r=t(45),o=t(30),s=r.noop;n._set(\"global\",{title:{display:!1,fontStyle:\"bold\",fullWidth:!0,lineHeight:1.2,padding:10,position:\"top\",text:\"\",weight:2e3}});var l=a.extend({initialize:function(t){r.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:s,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:s,beforeSetDimensions:s,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:s,beforeBuildLabels:s,buildLabels:s,afterBuildLabels:s,beforeFit:s,fit:function(){var t=r.valueOrDefault,e=this.options,i=e.display,a=t(e.fontSize,n.global.defaultFontSize),o=this.minSize,s=r.isArray(e.text)?e.text.length:1,l=r.options.toLineHeight(e.lineHeight,a),u=i?s*l+2*e.padding:0;this.isHorizontal()?(o.width=this.maxWidth,o.height=u):(o.width=u,o.height=this.maxHeight),this.width=o.width,this.height=o.height},afterFit:s,isHorizontal:function(){var t=this.options.position;return\"top\"===t||\"bottom\"===t},draw:function(){var t=this.ctx,e=r.valueOrDefault,i=this.options,a=n.global;if(i.display){var o,s,l,u=e(i.fontSize,a.defaultFontSize),d=e(i.fontStyle,a.defaultFontStyle),h=e(i.fontFamily,a.defaultFontFamily),c=r.fontString(u,d,h),f=r.options.toLineHeight(i.lineHeight,u),g=f/2+i.padding,m=0,p=this.top,v=this.left,y=this.bottom,b=this.right;t.fillStyle=e(i.fontColor,a.defaultFontColor),t.font=c,this.isHorizontal()?(s=v+(b-v)/2,l=p+g,o=b-v):(s=\"left\"===i.position?v+g:b-g,l=p+(y-p)/2,o=y-p,m=Math.PI*(\"left\"===i.position?-.5:.5)),t.save(),t.translate(s,l),t.rotate(m),t.textAlign=\"center\",t.textBaseline=\"middle\";var x=i.text;if(r.isArray(x))for(var _=0,k=0;k<x.length;++k)t.fillText(x[k],0,_,o),_+=f;else t.fillText(x,0,0,o);t.restore()}}});function u(t,e){var i=new l({ctx:t.ctx,options:e,chart:t});o.configure(t,i,e),o.addBox(t,i),t.titleBlock=i}e.exports={id:\"title\",_element:l,beforeInit:function(t){var e=t.options.title;e&&u(t,e)},beforeUpdate:function(t){var e=t.options.title,i=t.titleBlock;e?(r.mergeIf(e,n.global.title),i?(o.configure(t,i,e),i.options=e):u(t,e)):i&&(o.removeBox(t,i),delete t.titleBlock)}}},{25:25,26:26,30:30,45:45}],53:[function(t,e,i){\"use strict\";e.exports=function(t){var e=t.Scale.extend({getLabels:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels},determineDataLimits:function(){var t,e=this,i=e.getLabels();e.minIndex=0,e.maxIndex=i.length-1,void 0!==e.options.ticks.min&&(t=i.indexOf(e.options.ticks.min),e.minIndex=-1!==t?t:e.minIndex),void 0!==e.options.ticks.max&&(t=i.indexOf(e.options.ticks.max),e.maxIndex=-1!==t?t:e.maxIndex),e.min=i[e.minIndex],e.max=i[e.maxIndex]},buildTicks:function(){var t=this.getLabels();this.ticks=0===this.minIndex&&this.maxIndex===t.length-1?t:t.slice(this.minIndex,this.maxIndex+1)},getLabelForIndex:function(t,e){var i=this.chart.data,n=this.isHorizontal();return i.yLabels&&!n?this.getRightValue(i.datasets[e].data[t]):this.ticks[t-this.minIndex]},getPixelForValue:function(t,e){var i,n=this,a=n.options.offset,r=Math.max(n.maxIndex+1-n.minIndex-(a?0:1),1);if(null!=t&&(i=n.isHorizontal()?t.x:t.y),void 0!==i||void 0!==t&&isNaN(e)){t=i||t;var o=n.getLabels().indexOf(t);e=-1!==o?o:e}if(n.isHorizontal()){var s=n.width/r,l=s*(e-n.minIndex);return a&&(l+=s/2),n.left+Math.round(l)}var u=n.height/r,d=u*(e-n.minIndex);return a&&(d+=u/2),n.top+Math.round(d)},getPixelForTick:function(t){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null)},getValueForPixel:function(t){var e=this.options.offset,i=Math.max(this._ticks.length-(e?0:1),1),n=this.isHorizontal(),a=(n?this.width:this.height)/i;return t-=n?this.left:this.top,e&&(t-=a/2),(t<=0?0:Math.round(t/a))+this.minIndex},getBasePixel:function(){return this.bottom}});t.scaleService.registerScaleType(\"category\",e,{position:\"bottom\"})}},{}],54:[function(t,e,i){\"use strict\";var n=t(25),a=t(45),r=t(34);e.exports=function(t){var e={position:\"left\",ticks:{callback:r.formatters.linear}},i=t.LinearScaleBase.extend({determineDataLimits:function(){var t=this,e=t.options,i=t.chart,n=i.data.datasets,r=t.isHorizontal();function o(e){return r?e.xAxisID===t.id:e.yAxisID===t.id}t.min=null,t.max=null;var s=e.stacked;if(void 0===s&&a.each(n,function(t,e){if(!s){var n=i.getDatasetMeta(e);i.isDatasetVisible(e)&&o(n)&&void 0!==n.stack&&(s=!0)}}),e.stacked||s){var l={};a.each(n,function(n,r){var s=i.getDatasetMeta(r),u=[s.type,void 0===e.stacked&&void 0===s.stack?r:\"\",s.stack].join(\".\");void 0===l[u]&&(l[u]={positiveValues:[],negativeValues:[]});var d=l[u].positiveValues,h=l[u].negativeValues;i.isDatasetVisible(r)&&o(s)&&a.each(n.data,function(i,n){var a=+t.getRightValue(i);isNaN(a)||s.data[n].hidden||(d[n]=d[n]||0,h[n]=h[n]||0,e.relativePoints?d[n]=100:a<0?h[n]+=a:d[n]+=a)})}),a.each(l,function(e){var i=e.positiveValues.concat(e.negativeValues),n=a.min(i),r=a.max(i);t.min=null===t.min?n:Math.min(t.min,n),t.max=null===t.max?r:Math.max(t.max,r)})}else a.each(n,function(e,n){var r=i.getDatasetMeta(n);i.isDatasetVisible(n)&&o(r)&&a.each(e.data,function(e,i){var n=+t.getRightValue(e);isNaN(n)||r.data[i].hidden||(null===t.min?t.min=n:n<t.min&&(t.min=n),null===t.max?t.max=n:n>t.max&&(t.max=n))})});t.min=isFinite(t.min)&&!isNaN(t.min)?t.min:0,t.max=isFinite(t.max)&&!isNaN(t.max)?t.max:1,this.handleTickRangeOptions()},getTickLimit:function(){var t,e=this.options.ticks;if(this.isHorizontal())t=Math.min(e.maxTicksLimit?e.maxTicksLimit:11,Math.ceil(this.width/50));else{var i=a.valueOrDefault(e.fontSize,n.global.defaultFontSize);t=Math.min(e.maxTicksLimit?e.maxTicksLimit:11,Math.ceil(this.height/(2*i)))}return t},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e=this.start,i=+this.getRightValue(t),n=this.end-e;return this.isHorizontal()?this.left+this.width/n*(i-e):this.bottom-this.height/n*(i-e)},getValueForPixel:function(t){var e=this.isHorizontal(),i=e?this.width:this.height,n=(e?t-this.left:this.bottom-t)/i;return this.start+(this.end-this.start)*n},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType(\"linear\",i,e)}},{25:25,34:34,45:45}],55:[function(t,e,i){\"use strict\";var n=t(45);e.exports=function(t){var e=n.noop;t.LinearScaleBase=t.Scale.extend({getRightValue:function(e){return\"string\"==typeof e?+e:t.Scale.prototype.getRightValue.call(this,e)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var i=n.sign(t.min),a=n.sign(t.max);i<0&&a<0?t.max=0:i>0&&a>0&&(t.min=0)}var r=void 0!==e.min||void 0!==e.suggestedMin,o=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),r!==o&&t.min>=t.max&&(r?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:e,handleDirectionalChanges:e,buildTicks:function(){var t=this,e=t.options.ticks,i=t.getTickLimit(),a={maxTicks:i=Math.max(2,i),min:e.min,max:e.max,stepSize:n.valueOrDefault(e.fixedStepSize,e.stepSize)},r=t.ticks=function(t,e){var i,a=[];if(t.stepSize&&t.stepSize>0)i=t.stepSize;else{var r=n.niceNum(e.max-e.min,!1);i=n.niceNum(r/(t.maxTicks-1),!0)}var o=Math.floor(e.min/i)*i,s=Math.ceil(e.max/i)*i;t.min&&t.max&&t.stepSize&&n.almostWhole((t.max-t.min)/t.stepSize,i/1e3)&&(o=t.min,s=t.max);var l=(s-o)/i;l=n.almostEquals(l,Math.round(l),i/1e3)?Math.round(l):Math.ceil(l);var u=1;i<1&&(u=Math.pow(10,i.toString().length-2),o=Math.round(o*u)/u,s=Math.round(s*u)/u),a.push(void 0!==t.min?t.min:o);for(var d=1;d<l;++d)a.push(Math.round((o+d*i)*u)/u);return a.push(void 0!==t.max?t.max:s),a}(a,t);t.handleDirectionalChanges(),t.max=n.max(r),t.min=n.min(r),e.reverse?(r.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){this.ticksAsNumbers=this.ticks.slice(),this.zeroLineIndex=this.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(this)}})}},{45:45}],56:[function(t,e,i){\"use strict\";var n=t(45),a=t(34);e.exports=function(t){var e={position:\"left\",ticks:{callback:a.formatters.logarithmic}},i=t.Scale.extend({determineDataLimits:function(){var t=this,e=t.options,i=t.chart,a=i.data.datasets,r=t.isHorizontal();function o(e){return r?e.xAxisID===t.id:e.yAxisID===t.id}t.min=null,t.max=null,t.minNotZero=null;var s=e.stacked;if(void 0===s&&n.each(a,function(t,e){if(!s){var n=i.getDatasetMeta(e);i.isDatasetVisible(e)&&o(n)&&void 0!==n.stack&&(s=!0)}}),e.stacked||s){var l={};n.each(a,function(a,r){var s=i.getDatasetMeta(r),u=[s.type,void 0===e.stacked&&void 0===s.stack?r:\"\",s.stack].join(\".\");i.isDatasetVisible(r)&&o(s)&&(void 0===l[u]&&(l[u]=[]),n.each(a.data,function(e,i){var n=l[u],a=+t.getRightValue(e);isNaN(a)||s.data[i].hidden||a<0||(n[i]=n[i]||0,n[i]+=a)}))}),n.each(l,function(e){if(e.length>0){var i=n.min(e),a=n.max(e);t.min=null===t.min?i:Math.min(t.min,i),t.max=null===t.max?a:Math.max(t.max,a)}})}else n.each(a,function(e,a){var r=i.getDatasetMeta(a);i.isDatasetVisible(a)&&o(r)&&n.each(e.data,function(e,i){var n=+t.getRightValue(e);isNaN(n)||r.data[i].hidden||n<0||(null===t.min?t.min=n:n<t.min&&(t.min=n),null===t.max?t.max=n:n>t.max&&(t.max=n),0!==n&&(null===t.minNotZero||n<t.minNotZero)&&(t.minNotZero=n))})});this.handleTickRangeOptions()},handleTickRangeOptions:function(){var t=this,e=t.options.ticks,i=n.valueOrDefault;t.min=i(e.min,t.min),t.max=i(e.max,t.max),t.min===t.max&&(0!==t.min&&null!==t.min?(t.min=Math.pow(10,Math.floor(n.log10(t.min))-1),t.max=Math.pow(10,Math.floor(n.log10(t.max))+1)):(t.min=1,t.max=10)),null===t.min&&(t.min=Math.pow(10,Math.floor(n.log10(t.max))-1)),null===t.max&&(t.max=0!==t.min?Math.pow(10,Math.floor(n.log10(t.min))+1):10),null===t.minNotZero&&(t.min>0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(n.log10(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,i=!t.isHorizontal(),a={min:e.min,max:e.max},r=t.ticks=function(t,e){var i,a,r=[],o=n.valueOrDefault,s=o(t.min,Math.pow(10,Math.floor(n.log10(e.min)))),l=Math.floor(n.log10(e.max)),u=Math.ceil(e.max/Math.pow(10,l));0===s?(i=Math.floor(n.log10(e.minNotZero)),a=Math.floor(e.minNotZero/Math.pow(10,i)),r.push(s),s=a*Math.pow(10,i)):(i=Math.floor(n.log10(s)),a=Math.floor(s/Math.pow(10,i)));for(var d=i<0?Math.pow(10,Math.abs(i)):1;r.push(s),10==++a&&(a=1,d=++i>=0?1:d),s=Math.round(a*Math.pow(10,i)*d)/d,i<l||i===l&&a<u;);var h=o(t.max,s);return r.push(h),r}(a,t);t.max=n.max(r),t.min=n.min(r),e.reverse?(i=!i,t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max),i&&r.reverse()},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),t.Scale.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t){return this.getPixelForValue(this.tickValues[t])},_getFirstTickValue:function(t){var e=Math.floor(n.log10(t));return Math.floor(t/Math.pow(10,e))*Math.pow(10,e)},getPixelForValue:function(e){var i,a,r,o,s,l=this,u=l.options.ticks.reverse,d=n.log10,h=l._getFirstTickValue(l.minNotZero),c=0;return e=+l.getRightValue(e),u?(r=l.end,o=l.start,s=-1):(r=l.start,o=l.end,s=1),l.isHorizontal()?(i=l.width,a=u?l.right:l.left):(i=l.height,s*=-1,a=u?l.top:l.bottom),e!==r&&(0===r&&(i-=c=n.getValueOrDefault(l.options.ticks.fontSize,t.defaults.global.defaultFontSize),r=h),0!==e&&(c+=i/(d(o)-d(r))*(d(e)-d(r))),a+=s*c),a},getValueForPixel:function(e){var i,a,r,o,s=this,l=s.options.ticks.reverse,u=n.log10,d=s._getFirstTickValue(s.minNotZero);if(l?(a=s.end,r=s.start):(a=s.start,r=s.end),s.isHorizontal()?(i=s.width,o=l?s.right-e:e-s.left):(i=s.height,o=l?e-s.top:s.bottom-e),o!==a){if(0===a){var h=n.getValueOrDefault(s.options.ticks.fontSize,t.defaults.global.defaultFontSize);o-=h,i-=h,a=d}o*=u(r)-u(a),o/=i,o=Math.pow(10,u(a)+o)}return o}});t.scaleService.registerScaleType(\"logarithmic\",i,e)}},{34:34,45:45}],57:[function(t,e,i){\"use strict\";var n=t(25),a=t(45),r=t(34);e.exports=function(t){var e=n.global,i={display:!0,animate:!0,position:\"chartArea\",angleLines:{display:!0,color:\"rgba(0, 0, 0, 0.1)\",lineWidth:1},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:\"rgba(255,255,255,0.75)\",backdropPaddingY:2,backdropPaddingX:2,callback:r.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}};function o(t){var e=t.options;return e.angleLines.display||e.pointLabels.display?t.chart.data.labels.length:0}function s(t){var i=t.options.pointLabels,n=a.valueOrDefault(i.fontSize,e.defaultFontSize),r=a.valueOrDefault(i.fontStyle,e.defaultFontStyle),o=a.valueOrDefault(i.fontFamily,e.defaultFontFamily);return{size:n,style:r,family:o,font:a.fontString(n,r,o)}}function l(t,e,i,n,a){return t===n||t===a?{start:e-i/2,end:e+i/2}:t<n||t>a?{start:e-i-5,end:e}:{start:e,end:e+i+5}}function u(t,e,i,n){if(a.isArray(e))for(var r=i.y,o=1.5*n,s=0;s<e.length;++s)t.fillText(e[s],i.x,r),r+=o;else t.fillText(e,i.x,i.y)}function d(t){return a.isNumber(t)?t:0}var h=t.LinearScaleBase.extend({setDimensions:function(){var t=this,i=t.options,n=i.ticks;t.width=t.maxWidth,t.height=t.maxHeight,t.xCenter=Math.round(t.width/2),t.yCenter=Math.round(t.height/2);var r=a.min([t.height,t.width]),o=a.valueOrDefault(n.fontSize,e.defaultFontSize);t.drawingArea=i.display?r/2-(o/2+n.backdropPaddingY):r/2},determineDataLimits:function(){var t=this,e=t.chart,i=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;a.each(e.data.datasets,function(r,o){if(e.isDatasetVisible(o)){var s=e.getDatasetMeta(o);a.each(r.data,function(e,a){var r=+t.getRightValue(e);isNaN(r)||s.data[a].hidden||(i=Math.min(r,i),n=Math.max(r,n))})}}),t.min=i===Number.POSITIVE_INFINITY?0:i,t.max=n===Number.NEGATIVE_INFINITY?0:n,t.handleTickRangeOptions()},getTickLimit:function(){var t=this.options.ticks,i=a.valueOrDefault(t.fontSize,e.defaultFontSize);return Math.min(t.maxTicksLimit?t.maxTicksLimit:11,Math.ceil(this.drawingArea/(1.5*i)))},convertTicksToLabels:function(){t.LinearScaleBase.prototype.convertTicksToLabels.call(this),this.pointLabels=this.chart.data.labels.map(this.options.pointLabels.callback,this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t,e;this.options.pointLabels.display?function(t){var e,i,n,r=s(t),u=Math.min(t.height/2,t.width/2),d={r:t.width,l:0,t:t.height,b:0},h={};t.ctx.font=r.font,t._pointLabelSizes=[];var c,f,g,m=o(t);for(e=0;e<m;e++){n=t.getPointPosition(e,u),c=t.ctx,f=r.size,g=t.pointLabels[e]||\"\",i=a.isArray(g)?{w:a.longestText(c,c.font,g),h:g.length*f+1.5*(g.length-1)*f}:{w:c.measureText(g).width,h:f},t._pointLabelSizes[e]=i;var p=t.getIndexAngle(e),v=a.toDegrees(p)%360,y=l(v,n.x,i.w,0,180),b=l(v,n.y,i.h,90,270);y.start<d.l&&(d.l=y.start,h.l=p),y.end>d.r&&(d.r=y.end,h.r=p),b.start<d.t&&(d.t=b.start,h.t=p),b.end>d.b&&(d.b=b.end,h.b=p)}t.setReductions(u,d,h)}(this):(t=this,e=Math.min(t.height/2,t.width/2),t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0))},setReductions:function(t,e,i){var n=e.l/Math.sin(i.l),a=Math.max(e.r-this.width,0)/Math.sin(i.r),r=-e.t/Math.cos(i.t),o=-Math.max(e.b-this.height,0)/Math.cos(i.b);n=d(n),a=d(a),r=d(r),o=d(o),this.drawingArea=Math.min(Math.round(t-(n+a)/2),Math.round(t-(r+o)/2)),this.setCenterPoint(n,a,r,o)},setCenterPoint:function(t,e,i,n){var a=this,r=a.width-e-a.drawingArea,o=t+a.drawingArea,s=i+a.drawingArea,l=a.height-n-a.drawingArea;a.xCenter=Math.round((o+r)/2+a.left),a.yCenter=Math.round((s+l)/2+a.top)},getIndexAngle:function(t){return t*(2*Math.PI/o(this))+(this.chart.options&&this.chart.options.startAngle?this.chart.options.startAngle:0)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){if(null===t)return 0;var e=this.drawingArea/(this.max-this.min);return this.options.ticks.reverse?(this.max-t)*e:(t-this.min)*e},getPointPosition:function(t,e){var i=this.getIndexAngle(t)-Math.PI/2;return{x:Math.round(Math.cos(i)*e)+this.xCenter,y:Math.round(Math.sin(i)*e)+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this.min,e=this.max;return this.getPointPositionForValue(0,this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0)},draw:function(){var t=this,i=t.options,n=i.gridLines,r=i.ticks,l=a.valueOrDefault;if(i.display){var d=t.ctx,h=this.getIndexAngle(0),c=l(r.fontSize,e.defaultFontSize),f=l(r.fontStyle,e.defaultFontStyle),g=l(r.fontFamily,e.defaultFontFamily),m=a.fontString(c,f,g);a.each(t.ticks,function(i,s){if(s>0||r.reverse){var u=t.getDistanceFromCenterForValue(t.ticksAsNumbers[s]);if(n.display&&0!==s&&function(t,e,i,n){var r=t.ctx;if(r.strokeStyle=a.valueAtIndexOrDefault(e.color,n-1),r.lineWidth=a.valueAtIndexOrDefault(e.lineWidth,n-1),t.options.gridLines.circular)r.beginPath(),r.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),r.closePath(),r.stroke();else{var s=o(t);if(0===s)return;r.beginPath();var l=t.getPointPosition(0,i);r.moveTo(l.x,l.y);for(var u=1;u<s;u++)l=t.getPointPosition(u,i),r.lineTo(l.x,l.y);r.closePath(),r.stroke()}}(t,n,u,s),r.display){var f=l(r.fontColor,e.defaultFontColor);if(d.font=m,d.save(),d.translate(t.xCenter,t.yCenter),d.rotate(h),r.showLabelBackdrop){var g=d.measureText(i).width;d.fillStyle=r.backdropColor,d.fillRect(-g/2-r.backdropPaddingX,-u-c/2-r.backdropPaddingY,g+2*r.backdropPaddingX,c+2*r.backdropPaddingY)}d.textAlign=\"center\",d.textBaseline=\"middle\",d.fillStyle=f,d.fillText(i,0,-u),d.restore()}}}),(i.angleLines.display||i.pointLabels.display)&&function(t){var i=t.ctx,n=t.options,r=n.angleLines,l=n.pointLabels;i.lineWidth=r.lineWidth,i.strokeStyle=r.color;var d,h,c,f,g=t.getDistanceFromCenterForValue(n.ticks.reverse?t.min:t.max),m=s(t);i.textBaseline=\"top\";for(var p=o(t)-1;p>=0;p--){if(r.display){var v=t.getPointPosition(p,g);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(v.x,v.y),i.stroke(),i.closePath()}if(l.display){var y=t.getPointPosition(p,g+5),b=a.valueAtIndexOrDefault(l.fontColor,p,e.defaultFontColor);i.font=m.font,i.fillStyle=b;var x=t.getIndexAngle(p),_=a.toDegrees(x);i.textAlign=0===(f=_)||180===f?\"center\":f<180?\"left\":\"right\",d=_,h=t._pointLabelSizes[p],c=y,90===d||270===d?c.y-=h.h/2:(d>270||d<90)&&(c.y-=h.h),u(i,t.pointLabels[p]||\"\",y,m.size)}}}(t)}}});t.scaleService.registerScaleType(\"radialLinear\",h,i)}},{25:25,34:34,45:45}],58:[function(t,e,i){\"use strict\";var n=t(6);n=\"function\"==typeof n?n:window.moment;var a=t(25),r=t(45),o=Number.MIN_SAFE_INTEGER||-9007199254740991,s=Number.MAX_SAFE_INTEGER||9007199254740991,l={millisecond:{common:!0,size:1,steps:[1,2,5,10,20,50,100,250,500]},second:{common:!0,size:1e3,steps:[1,2,5,10,30]},minute:{common:!0,size:6e4,steps:[1,2,5,10,30]},hour:{common:!0,size:36e5,steps:[1,2,3,6,12]},day:{common:!0,size:864e5,steps:[1,2,5]},week:{common:!1,size:6048e5,steps:[1,2,3,4]},month:{common:!0,size:2628e6,steps:[1,2,3]},quarter:{common:!1,size:7884e6,steps:[1,2,3,4]},year:{common:!0,size:3154e7}},u=Object.keys(l);function d(t,e){return t-e}function h(t){var e,i,n,a={},r=[];for(e=0,i=t.length;e<i;++e)a[n=t[e]]||(a[n]=!0,r.push(n));return r}function c(t,e,i,n){var a=function(t,e,i){for(var n,a,r,o=0,s=t.length-1;o>=0&&o<=s;){if(a=t[(n=o+s>>1)-1]||null,r=t[n],!a)return{lo:null,hi:r};if(r[e]<i)o=n+1;else{if(!(a[e]>i))return{lo:a,hi:r};s=n-1}}return{lo:r,hi:null}}(t,e,i),r=a.lo?a.hi?a.lo:t[t.length-2]:t[0],o=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=o[e]-r[e],l=s?(i-r[e])/s:0,u=(o[n]-r[n])*l;return r[n]+u}function f(t,e){var i=e.parser,a=e.parser||e.format;return\"function\"==typeof i?i(t):\"string\"==typeof t&&\"string\"==typeof a?n(t,a):(t instanceof n||(t=n(t)),t.isValid()?t:\"function\"==typeof a?a(t):t)}function g(t,e){if(r.isNullOrUndef(t))return null;var i=e.options.time,n=f(e.getRightValue(t),i);return n.isValid()?(i.round&&n.startOf(i.round),n.valueOf()):null}function m(t){for(var e=u.indexOf(t)+1,i=u.length;e<i;++e)if(l[u[e]].common)return u[e]}function p(t,e,i,a){var o,d=a.time,h=d.unit||function(t,e,i,n){var a,r,o,d=u.length;for(a=u.indexOf(t);a<d-1;++a)if(o=(r=l[u[a]]).steps?r.steps[r.steps.length-1]:s,r.common&&Math.ceil((i-e)/(o*r.size))<=n)return u[a];return u[d-1]}(d.minUnit,t,e,i),c=m(h),f=r.valueOrDefault(d.stepSize,d.unitStepSize),g=\"week\"===h&&d.isoWeekday,p=a.ticks.major.enabled,v=l[h],y=n(t),b=n(e),x=[];for(f||(f=function(t,e,i,n){var a,r,o,s=e-t,u=l[i],d=u.size,h=u.steps;if(!h)return Math.ceil(s/(n*d));for(a=0,r=h.length;a<r&&(o=h[a],!(Math.ceil(s/(d*o))<=n));++a);return o}(t,e,h,i)),g&&(y=y.isoWeekday(g),b=b.isoWeekday(g)),y=y.startOf(g?\"day\":h),(b=b.startOf(g?\"day\":h))<e&&b.add(1,h),o=n(y),p&&c&&!g&&!d.round&&(o.startOf(c),o.add(~~((y-o)/(v.size*f))*f,h));o<b;o.add(f,h))x.push(+o);return x.push(+o),x}e.exports=function(t){var e=t.Scale.extend({initialize:function(){if(!n)throw new Error(\"Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com\");this.mergeTicksOptions(),t.Scale.prototype.initialize.call(this)},update:function(){var e=this.options;return e.time&&e.time.format&&console.warn(\"options.time.format is deprecated and replaced by options.time.parser.\"),t.Scale.prototype.update.apply(this,arguments)},getRightValue:function(e){return e&&void 0!==e.t&&(e=e.t),t.Scale.prototype.getRightValue.call(this,e)},determineDataLimits:function(){var t,e,i,a,l,u,c=this,f=c.chart,m=c.options.time,p=m.unit||\"day\",v=s,y=o,b=[],x=[],_=[];for(t=0,i=f.data.labels.length;t<i;++t)_.push(g(f.data.labels[t],c));for(t=0,i=(f.data.datasets||[]).length;t<i;++t)if(f.isDatasetVisible(t))if(l=f.data.datasets[t].data,r.isObject(l[0]))for(x[t]=[],e=0,a=l.length;e<a;++e)u=g(l[e],c),b.push(u),x[t][e]=u;else b.push.apply(b,_),x[t]=_.slice(0);else x[t]=[];_.length&&(_=h(_).sort(d),v=Math.min(v,_[0]),y=Math.max(y,_[_.length-1])),b.length&&(b=h(b).sort(d),v=Math.min(v,b[0]),y=Math.max(y,b[b.length-1])),v=g(m.min,c)||v,y=g(m.max,c)||y,v=v===s?+n().startOf(p):v,y=y===o?+n().endOf(p)+1:y,c.min=Math.min(v,y),c.max=Math.max(v+1,y),c._horizontal=c.isHorizontal(),c._table=[],c._timestamps={data:b,datasets:x,labels:_}},buildTicks:function(){var t,e,i,a,r,o,s,d,h,v,y,b,x=this,_=x.min,k=x.max,w=x.options,M=w.time,S=[],D=[];switch(w.ticks.source){case\"data\":S=x._timestamps.data;break;case\"labels\":S=x._timestamps.labels;break;case\"auto\":default:S=p(_,k,x.getLabelCapacity(_),w)}for(\"ticks\"===w.bounds&&S.length&&(_=S[0],k=S[S.length-1]),_=g(M.min,x)||_,k=g(M.max,x)||k,t=0,e=S.length;t<e;++t)(i=S[t])>=_&&i<=k&&D.push(i);return x.min=_,x.max=k,x._unit=M.unit||function(t,e,i,a){var r,o,s=n.duration(n(a).diff(n(i)));for(r=u.length-1;r>=u.indexOf(e);r--)if(o=u[r],l[o].common&&s.as(o)>=t.length)return o;return u[e?u.indexOf(e):0]}(D,M.minUnit,x.min,x.max),x._majorUnit=m(x._unit),x._table=function(t,e,i,n){if(\"linear\"===n||!t.length)return[{time:e,pos:0},{time:i,pos:1}];var a,r,o,s,l,u=[],d=[e];for(a=0,r=t.length;a<r;++a)(s=t[a])>e&&s<i&&d.push(s);for(d.push(i),a=0,r=d.length;a<r;++a)l=d[a+1],o=d[a-1],s=d[a],void 0!==o&&void 0!==l&&Math.round((l+o)/2)===s||u.push({time:s,pos:a/(r-1)});return u}(x._timestamps.data,_,k,w.distribution),x._offsets=(a=x._table,r=D,o=_,s=k,y=0,b=0,(d=w).offset&&r.length&&(d.time.min||(h=r.length>1?r[1]:s,v=r[0],y=(c(a,\"time\",h,\"pos\")-c(a,\"time\",v,\"pos\"))/2),d.time.max||(h=r[r.length-1],v=r.length>1?r[r.length-2]:o,b=(c(a,\"time\",h,\"pos\")-c(a,\"time\",v,\"pos\"))/2)),{left:y,right:b}),x._labelFormat=function(t,e){var i,n,a,r=t.length;for(i=0;i<r;i++){if(0!==(n=f(t[i],e)).millisecond())return\"MMM D, YYYY h:mm:ss.SSS a\";0===n.second()&&0===n.minute()&&0===n.hour()||(a=!0)}return a?\"MMM D, YYYY h:mm:ss a\":\"MMM D, YYYY\"}(x._timestamps.data,M),function(t,e){var i,a,r,o,s=[];for(i=0,a=t.length;i<a;++i)r=t[i],o=!!e&&r===+n(r).startOf(e),s.push({value:r,major:o});return s}(D,x._majorUnit)},getLabelForIndex:function(t,e){var i=this.chart.data,n=this.options.time,a=i.labels&&t<i.labels.length?i.labels[t]:\"\",o=i.datasets[e].data[t];return r.isObject(o)&&(a=this.getRightValue(o)),n.tooltipFormat?f(a,n).format(n.tooltipFormat):\"string\"==typeof a?a:f(a,n).format(this._labelFormat)},tickFormatFunction:function(t,e,i,n){var a=this.options,o=t.valueOf(),s=a.time.displayFormats,l=s[this._unit],u=this._majorUnit,d=s[u],h=t.clone().startOf(u).valueOf(),c=a.ticks.major,f=c.enabled&&u&&d&&o===h,g=t.format(n||(f?d:l)),m=f?c:a.ticks.minor,p=r.valueOrDefault(m.callback,m.userCallback);return p?p(g,e,i):g},convertTicksToLabels:function(t){var e,i,a=[];for(e=0,i=t.length;e<i;++e)a.push(this.tickFormatFunction(n(t[e].value),e,t));return a},getPixelForOffset:function(t){var e=this,i=e._horizontal?e.width:e.height,n=e._horizontal?e.left:e.top,a=c(e._table,\"time\",t,\"pos\");return n+i*(e._offsets.left+a)/(e._offsets.left+1+e._offsets.right)},getPixelForValue:function(t,e,i){var n=null;if(void 0!==e&&void 0!==i&&(n=this._timestamps.datasets[i][e]),null===n&&(n=g(t,this)),null!==n)return this.getPixelForOffset(n)},getPixelForTick:function(t){var e=this.getTicks();return t>=0&&t<e.length?this.getPixelForOffset(e[t].value):null},getValueForPixel:function(t){var e=this,i=e._horizontal?e.width:e.height,a=e._horizontal?e.left:e.top,r=(i?(t-a)/i:0)*(e._offsets.left+1+e._offsets.left)-e._offsets.right,o=c(e._table,\"pos\",r,\"time\");return n(o)},getLabelWidth:function(t){var e=this.options.ticks,i=this.ctx.measureText(t).width,n=r.toRadians(e.maxRotation),o=Math.cos(n),s=Math.sin(n);return i*o+r.valueOrDefault(e.fontSize,a.global.defaultFontSize)*s},getLabelCapacity:function(t){var e=this.options.time.displayFormats.millisecond,i=this.tickFormatFunction(n(t),0,[],e),a=this.getLabelWidth(i),r=this.isHorizontal()?this.width:this.height,o=Math.floor(r/a);return o>0?o:1}});t.scaleService.registerScaleType(\"time\",e,{position:\"bottom\",distribution:\"linear\",bounds:\"data\",time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:\"millisecond\",displayFormats:{millisecond:\"h:mm:ss.SSS a\",second:\"h:mm:ss a\",minute:\"h:mm a\",hour:\"hA\",day:\"MMM D\",week:\"ll\",month:\"MMM YYYY\",quarter:\"[Q]Q - YYYY\",year:\"YYYY\"}},ticks:{autoSkip:!1,source:\"auto\",major:{enabled:!1}}})}},{25:25,45:45,6:6}]},{},[7])(7)});"),
15
        }
16
        file3 := &embedded.EmbeddedFile{
17
                Filename:    "bootstrap.min.js",
18
                FileModTime: time.Unix(1528732500, 0),
19
                Content:     string("/*!\n  * Bootstrap v4.1.0 (https://getbootstrap.com/)\n  * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n  */\n!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?e(exports,require(\"jquery\"),require(\"popper.js\")):\"function\"==typeof define&&define.amd?define([\"exports\",\"jquery\",\"popper.js\"],e):e(t.bootstrap={},t.jQuery,t.Popper)}(this,function(t,e,c){\"use strict\";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function o(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function h(r){for(var t=1;t<arguments.length;t++){var s=null!=arguments[t]?arguments[t]:{},e=Object.keys(s);\"function\"==typeof Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(s).filter(function(t){return Object.getOwnPropertyDescriptor(s,t).enumerable}))),e.forEach(function(t){var e,n,i;e=r,i=s[n=t],n in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i})}return r}e=e&&e.hasOwnProperty(\"default\")?e.default:e,c=c&&c.hasOwnProperty(\"default\")?c.default:c;var r,n,s,a,l,u,f,d,_,g,m,p,v,E,y,T,C,I,A,D,b,S,w,N,O,k,P,L,j,R,H,W,M,x,U,K,F,V,Q,B,Y,G,q,z,X,J,Z,$,tt,et,nt,it,rt,st,ot,at,lt,ht,ct,ut,ft,dt,_t,gt,mt,pt,vt,Et,yt,Tt,Ct,It,At,Dt,bt,St,wt,Nt,Ot,kt,Pt,Lt,jt,Rt,Ht,Wt,Mt,xt,Ut,Kt,Ft,Vt,Qt,Bt,Yt,Gt,qt,zt,Xt,Jt,Zt,$t,te,ee,ne,ie,re,se,oe,ae,le,he,ce,ue,fe,de,_e,ge,me,pe,ve,Ee,ye,Te,Ce,Ie,Ae,De,be,Se,we,Ne,Oe,ke,Pe,Le,je,Re,He,We,Me,xe,Ue,Ke,Fe,Ve,Qe,Be,Ye,Ge,qe,ze,Xe,Je,Ze,$e,tn,en,nn,rn,sn,on,an,ln,hn,cn,un,fn,dn,_n,gn,mn,pn,vn,En,yn,Tn,Cn=function(i){var e=\"transitionend\";function t(t){var e=this,n=!1;return i(this).one(l.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||l.triggerTransitionEnd(e)},t),this}var l={TRANSITION_END:\"bsTransitionEnd\",getUID:function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},getSelectorFromElement:function(t){var e=t.getAttribute(\"data-target\");e&&\"#\"!==e||(e=t.getAttribute(\"href\")||\"\");try{return 0<i(document).find(e).length?e:null}catch(t){return null}},getTransitionDurationFromElement:function(t){if(!t)return 0;var e=i(t).css(\"transition-duration\");return parseFloat(e)?(e=e.split(\",\")[0],1e3*parseFloat(e)):0},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){i(t).trigger(e)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var r=n[i],s=e[i],o=s&&l.isElement(s)?\"element\":(a=s,{}.toString.call(a).match(/\\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(r).test(o))throw new Error(t.toUpperCase()+': Option \"'+i+'\" provided type \"'+o+'\" but expected type \"'+r+'\".')}var a}};return i.fn.emulateTransitionEnd=t,i.event.special[l.TRANSITION_END]={bindType:e,delegateType:e,handle:function(t){if(i(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}},l}(e),In=(n=\"alert\",a=\".\"+(s=\"bs.alert\"),l=(r=e).fn[n],u={CLOSE:\"close\"+a,CLOSED:\"closed\"+a,CLICK_DATA_API:\"click\"+a+\".data-api\"},f=\"alert\",d=\"fade\",_=\"show\",g=function(){function i(t){this._element=t}var t=i.prototype;return t.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},t.dispose=function(){r.removeData(this._element,s),this._element=null},t._getRootElement=function(t){var e=Cn.getSelectorFromElement(t),n=!1;return e&&(n=r(e)[0]),n||(n=r(t).closest(\".\"+f)[0]),n},t._triggerCloseEvent=function(t){var e=r.Event(u.CLOSE);return r(t).trigger(e),e},t._removeElement=function(e){var n=this;if(r(e).removeClass(_),r(e).hasClass(d)){var t=Cn.getTransitionDurationFromElement(e);r(e).one(Cn.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(t)}else this._destroyElement(e)},t._destroyElement=function(t){r(t).detach().trigger(u.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var t=r(this),e=t.data(s);e||(e=new i(this),t.data(s,e)),\"close\"===n&&e[n](this)})},i._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},o(i,null,[{key:\"VERSION\",get:function(){return\"4.1.0\"}}]),i}(),r(document).on(u.CLICK_DATA_API,'[data-dismiss=\"alert\"]',g._handleDismiss(new g)),r.fn[n]=g._jQueryInterface,r.fn[n].Constructor=g,r.fn[n].noConflict=function(){return r.fn[n]=l,g._jQueryInterface},g),An=(p=\"button\",E=\".\"+(v=\"bs.button\"),y=\".data-api\",T=(m=e).fn[p],C=\"active\",I=\"btn\",D='[data-toggle^=\"button\"]',b='[data-toggle=\"buttons\"]',S=\"input\",w=\".active\",N=\".btn\",O={CLICK_DATA_API:\"click\"+E+y,FOCUS_BLUR_DATA_API:(A=\"focus\")+E+y+\" blur\"+E+y},k=function(){function n(t){this._element=t}var t=n.prototype;return t.toggle=function(){var t=!0,e=!0,n=m(this._element).closest(b)[0];if(n){var i=m(this._element).find(S)[0];if(i){if(\"radio\"===i.type)if(i.checked&&m(this._element).hasClass(C))t=!1;else{var r=m(n).find(w)[0];r&&m(r).removeClass(C)}if(t){if(i.hasAttribute(\"disabled\")||n.hasAttribute(\"disabled\")||i.classList.contains(\"disabled\")||n.classList.contains(\"disabled\"))return;i.checked=!m(this._element).hasClass(C),m(i).trigger(\"change\")}i.focus(),e=!1}}e&&this._element.setAttribute(\"aria-pressed\",!m(this._element).hasClass(C)),t&&m(this._element).toggleClass(C)},t.dispose=function(){m.removeData(this._element,v),this._element=null},n._jQueryInterface=function(e){return this.each(function(){var t=m(this).data(v);t||(t=new n(this),m(this).data(v,t)),\"toggle\"===e&&t[e]()})},o(n,null,[{key:\"VERSION\",get:function(){return\"4.1.0\"}}]),n}(),m(document).on(O.CLICK_DATA_API,D,function(t){t.preventDefault();var e=t.target;m(e).hasClass(I)||(e=m(e).closest(N)),k._jQueryInterface.call(m(e),\"toggle\")}).on(O.FOCUS_BLUR_DATA_API,D,function(t){var e=m(t.target).closest(N)[0];m(e).toggleClass(A,/^focus(in)?$/.test(t.type))}),m.fn[p]=k._jQueryInterface,m.fn[p].Constructor=k,m.fn[p].noConflict=function(){return m.fn[p]=T,k._jQueryInterface},k),Dn=(L=\"carousel\",R=\".\"+(j=\"bs.carousel\"),H=\".data-api\",W=(P=e).fn[L],M={interval:5e3,keyboard:!0,slide:!1,pause:\"hover\",wrap:!0},x={interval:\"(number|boolean)\",keyboard:\"boolean\",slide:\"(boolean|string)\",pause:\"(string|boolean)\",wrap:\"boolean\"},U=\"next\",K=\"prev\",F=\"left\",V=\"right\",Q={SLIDE:\"slide\"+R,SLID:\"slid\"+R,KEYDOWN:\"keydown\"+R,MOUSEENTER:\"mouseenter\"+R,MOUSELEAVE:\"mouseleave\"+R,TOUCHEND:\"touchend\"+R,LOAD_DATA_API:\"load\"+R+H,CLICK_DATA_API:\"click\"+R+H},B=\"carousel\",Y=\"active\",G=\"slide\",q=\"carousel-item-right\",z=\"carousel-item-left\",X=\"carousel-item-next\",J=\"carousel-item-prev\",Z={ACTIVE:\".active\",ACTIVE_ITEM:\".active.carousel-item\",ITEM:\".carousel-item\",NEXT_PREV:\".carousel-item-next, .carousel-item-prev\",INDICATORS:\".carousel-indicators\",DATA_SLIDE:\"[data-slide], [data-slide-to]\",DATA_RIDE:'[data-ride=\"carousel\"]'},$=function(){function s(t,e){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(e),this._element=P(t)[0],this._indicatorsElement=P(this._element).find(Z.INDICATORS)[0],this._addEventListeners()}var t=s.prototype;return t.next=function(){this._isSliding||this._slide(U)},t.nextWhenVisible=function(){!document.hidden&&P(this._element).is(\":visible\")&&\"hidden\"!==P(this._element).css(\"visibility\")&&this.next()},t.prev=function(){this._isSliding||this._slide(K)},t.pause=function(t){t||(this._isPaused=!0),P(this._element).find(Z.NEXT_PREV)[0]&&(Cn.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(t){var e=this;this._activeElement=P(this._element).find(Z.ACTIVE_ITEM)[0];var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)P(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n<t?U:K;this._slide(i,this._items[t])}},t.dispose=function(){P(this._element).off(R),P.removeData(this._element,j),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(t){return t=h({},M,t),Cn.typeCheckConfig(L,t,x),t},t._addEventListeners=function(){var e=this;this._config.keyboard&&P(this._element).on(Q.KEYDOWN,function(t){return e._keydown(t)}),\"hover\"===this._config.pause&&(P(this._element).on(Q.MOUSEENTER,function(t){return e.pause(t)}).on(Q.MOUSELEAVE,function(t){return e.cycle(t)}),\"ontouchstart\"in document.documentElement&&P(this._element).on(Q.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},t._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},t._getItemIndex=function(t){return this._items=P.makeArray(P(t).parent().find(Z.ITEM)),this._items.indexOf(t)},t._getItemByDirection=function(t,e){var n=t===U,i=t===K,r=this._getItemIndex(e),s=this._items.length-1;if((i&&0===r||n&&r===s)&&!this._config.wrap)return e;var o=(r+(t===K?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},t._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(P(this._element).find(Z.ACTIVE_ITEM)[0]),r=P.Event(Q.SLIDE,{relatedTarget:t,direction:e,from:i,to:n});return P(this._element).trigger(r),r},t._setActiveIndicatorElement=function(t){if(this._indicatorsElement){P(this._indicatorsElement).find(Z.ACTIVE).removeClass(Y);var e=this._indicatorsElement.children[this._getItemIndex(t)];e&&P(e).addClass(Y)}},t._slide=function(t,e){var n,i,r,s=this,o=P(this._element).find(Z.ACTIVE_ITEM)[0],a=this._getItemIndex(o),l=e||o&&this._getItemByDirection(t,o),h=this._getItemIndex(l),c=Boolean(this._interval);if(t===U?(n=z,i=X,r=F):(n=q,i=J,r=V),l&&P(l).hasClass(Y))this._isSliding=!1;else if(!this._triggerSlideEvent(l,r).isDefaultPrevented()&&o&&l){this._isSliding=!0,c&&this.pause(),this._setActiveIndicatorElement(l);var u=P.Event(Q.SLID,{relatedTarget:l,direction:r,from:a,to:h});if(P(this._element).hasClass(G)){P(l).addClass(i),Cn.reflow(l),P(o).addClass(n),P(l).addClass(n);var f=Cn.getTransitionDurationFromElement(o);P(o).one(Cn.TRANSITION_END,function(){P(l).removeClass(n+\" \"+i).addClass(Y),P(o).removeClass(Y+\" \"+i+\" \"+n),s._isSliding=!1,setTimeout(function(){return P(s._element).trigger(u)},0)}).emulateTransitionEnd(f)}else P(o).removeClass(Y),P(l).addClass(Y),this._isSliding=!1,P(this._element).trigger(u);c&&this.cycle()}},s._jQueryInterface=function(i){return this.each(function(){var t=P(this).data(j),e=h({},M,P(this).data());\"object\"==typeof i&&(e=h({},e,i));var n=\"string\"==typeof i?i:e.slide;if(t||(t=new s(this,e),P(this).data(j,t)),\"number\"==typeof i)t.to(i);else if(\"string\"==typeof n){if(\"undefined\"==typeof t[n])throw new TypeError('No method named \"'+n+'\"');t[n]()}else e.interval&&(t.pause(),t.cycle())})},s._dataApiClickHandler=function(t){var e=Cn.getSelectorFromElement(this);if(e){var n=P(e)[0];if(n&&P(n).hasClass(B)){var i=h({},P(n).data(),P(this).data()),r=this.getAttribute(\"data-slide-to\");r&&(i.interval=!1),s._jQueryInterface.call(P(n),i),r&&P(n).data(j).to(r),t.preventDefault()}}},o(s,null,[{key:\"VERSION\",get:function(){return\"4.1.0\"}},{key:\"Default\",get:function(){return M}}]),s}(),P(document).on(Q.CLICK_DATA_API,Z.DATA_SLIDE,$._dataApiClickHandler),P(window).on(Q.LOAD_DATA_API,function(){P(Z.DATA_RIDE).each(function(){var t=P(this);$._jQueryInterface.call(t,t.data())})}),P.fn[L]=$._jQueryInterface,P.fn[L].Constructor=$,P.fn[L].noConflict=function(){return P.fn[L]=W,$._jQueryInterface},$),bn=(et=\"collapse\",it=\".\"+(nt=\"bs.collapse\"),rt=(tt=e).fn[et],st={toggle:!0,parent:\"\"},ot={toggle:\"boolean\",parent:\"(string|element)\"},at={SHOW:\"show\"+it,SHOWN:\"shown\"+it,HIDE:\"hide\"+it,HIDDEN:\"hidden\"+it,CLICK_DATA_API:\"click\"+it+\".data-api\"},lt=\"show\",ht=\"collapse\",ct=\"collapsing\",ut=\"collapsed\",ft=\"width\",dt=\"height\",_t={ACTIVES:\".show, .collapsing\",DATA_TOGGLE:'[data-toggle=\"collapse\"]'},gt=function(){function a(t,e){this._isTransitioning=!1,this._element=t,this._config=this._getConfig(e),this._triggerArray=tt.makeArray(tt('[data-toggle=\"collapse\"][href=\"#'+t.id+'\"],[data-toggle=\"collapse\"][data-target=\"#'+t.id+'\"]'));for(var n=tt(_t.DATA_TOGGLE),i=0;i<n.length;i++){var r=n[i],s=Cn.getSelectorFromElement(r);null!==s&&0<tt(s).filter(t).length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=a.prototype;return t.toggle=function(){tt(this._element).hasClass(lt)?this.hide():this.show()},t.show=function(){var t,e,n=this;if(!this._isTransitioning&&!tt(this._element).hasClass(lt)&&(this._parent&&0===(t=tt.makeArray(tt(this._parent).find(_t.ACTIVES).filter('[data-parent=\"'+this._config.parent+'\"]'))).length&&(t=null),!(t&&(e=tt(t).not(this._selector).data(nt))&&e._isTransitioning))){var i=tt.Event(at.SHOW);if(tt(this._element).trigger(i),!i.isDefaultPrevented()){t&&(a._jQueryInterface.call(tt(t).not(this._selector),\"hide\"),e||tt(t).data(nt,null));var r=this._getDimension();tt(this._element).removeClass(ht).addClass(ct),(this._element.style[r]=0)<this._triggerArray.length&&tt(this._triggerArray).removeClass(ut).attr(\"aria-expanded\",!0),this.setTransitioning(!0);var s=\"scroll\"+(r[0].toUpperCase()+r.slice(1)),o=Cn.getTransitionDurationFromElement(this._element);tt(this._element).one(Cn.TRANSITION_END,function(){tt(n._element).removeClass(ct).addClass(ht).addClass(lt),n._element.style[r]=\"\",n.setTransitioning(!1),tt(n._element).trigger(at.SHOWN)}).emulateTransitionEnd(o),this._element.style[r]=this._element[s]+\"px\"}}},t.hide=function(){var t=this;if(!this._isTransitioning&&tt(this._element).hasClass(lt)){var e=tt.Event(at.HIDE);if(tt(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();if(this._element.style[n]=this._element.getBoundingClientRect()[n]+\"px\",Cn.reflow(this._element),tt(this._element).addClass(ct).removeClass(ht).removeClass(lt),0<this._triggerArray.length)for(var i=0;i<this._triggerArray.length;i++){var r=this._triggerArray[i],s=Cn.getSelectorFromElement(r);if(null!==s)tt(s).hasClass(lt)||tt(r).addClass(ut).attr(\"aria-expanded\",!1)}this.setTransitioning(!0);this._element.style[n]=\"\";var o=Cn.getTransitionDurationFromElement(this._element);tt(this._element).one(Cn.TRANSITION_END,function(){t.setTransitioning(!1),tt(t._element).removeClass(ct).addClass(ht).trigger(at.HIDDEN)}).emulateTransitionEnd(o)}}},t.setTransitioning=function(t){this._isTransitioning=t},t.dispose=function(){tt.removeData(this._element,nt),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},t._getConfig=function(t){return(t=h({},st,t)).toggle=Boolean(t.toggle),Cn.typeCheckConfig(et,t,ot),t},t._getDimension=function(){return tt(this._element).hasClass(ft)?ft:dt},t._getParent=function(){var n=this,t=null;Cn.isElement(this._config.parent)?(t=this._config.parent,\"undefined\"!=typeof this._config.parent.jquery&&(t=this._config.parent[0])):t=tt(this._config.parent)[0];var e='[data-toggle=\"collapse\"][data-parent=\"'+this._config.parent+'\"]';return tt(t).find(e).each(function(t,e){n._addAriaAndCollapsedClass(a._getTargetFromElement(e),[e])}),t},t._addAriaAndCollapsedClass=function(t,e){if(t){var n=tt(t).hasClass(lt);0<e.length&&tt(e).toggleClass(ut,!n).attr(\"aria-expanded\",n)}},a._getTargetFromElement=function(t){var e=Cn.getSelectorFromElement(t);return e?tt(e)[0]:null},a._jQueryInterface=function(i){return this.each(function(){var t=tt(this),e=t.data(nt),n=h({},st,t.data(),\"object\"==typeof i&&i);if(!e&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),e||(e=new a(this,n),t.data(nt,e)),\"string\"==typeof i){if(\"undefined\"==typeof e[i])throw new TypeError('No method named \"'+i+'\"');e[i]()}})},o(a,null,[{key:\"VERSION\",get:function(){return\"4.1.0\"}},{key:\"Default\",get:function(){return st}}]),a}(),tt(document).on(at.CLICK_DATA_API,_t.DATA_TOGGLE,function(t){\"A\"===t.currentTarget.tagName&&t.preventDefault();var n=tt(this),e=Cn.getSelectorFromElement(this);tt(e).each(function(){var t=tt(this),e=t.data(nt)?\"toggle\":n.data();gt._jQueryInterface.call(t,e)})}),tt.fn[et]=gt._jQueryInterface,tt.fn[et].Constructor=gt,tt.fn[et].noConflict=function(){return tt.fn[et]=rt,gt._jQueryInterface},gt),Sn=(pt=\"dropdown\",Et=\".\"+(vt=\"bs.dropdown\"),yt=\".data-api\",Tt=(mt=e).fn[pt],Ct=new RegExp(\"38|40|27\"),It={HIDE:\"hide\"+Et,HIDDEN:\"hidden\"+Et,SHOW:\"show\"+Et,SHOWN:\"shown\"+Et,CLICK:\"click\"+Et,CLICK_DATA_API:\"click\"+Et+yt,KEYDOWN_DATA_API:\"keydown\"+Et+yt,KEYUP_DATA_API:\"keyup\"+Et+yt},At=\"disabled\",Dt=\"show\",bt=\"dropup\",St=\"dropright\",wt=\"dropleft\",Nt=\"dropdown-menu-right\",Ot=\"position-static\",kt='[data-toggle=\"dropdown\"]',Pt=\".dropdown form\",Lt=\".dropdown-menu\",jt=\".navbar-nav\",Rt=\".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)\",Ht=\"top-start\",Wt=\"top-end\",Mt=\"bottom-start\",xt=\"bottom-end\",Ut=\"right-start\",Kt=\"left-start\",Ft={offset:0,flip:!0,boundary:\"scrollParent\",reference:\"toggle\",display:\"dynamic\"},Vt={offset:\"(number|string|function)\",flip:\"boolean\",boundary:\"(string|element)\",reference:\"(string|element)\",display:\"string\"},Qt=function(){function l(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var t=l.prototype;return t.toggle=function(){if(!this._element.disabled&&!mt(this._element).hasClass(At)){var t=l._getParentFromElement(this._element),e=mt(this._menu).hasClass(Dt);if(l._clearMenus(),!e){var n={relatedTarget:this._element},i=mt.Event(It.SHOW,n);if(mt(t).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if(\"undefined\"==typeof c)throw new TypeError(\"Bootstrap dropdown require Popper.js (https://popper.js.org)\");var r=this._element;\"parent\"===this._config.reference?r=t:Cn.isElement(this._config.reference)&&(r=this._config.reference,\"undefined\"!=typeof this._config.reference.jquery&&(r=this._config.reference[0])),\"scrollParent\"!==this._config.boundary&&mt(t).addClass(Ot),this._popper=new c(r,this._menu,this._getPopperConfig())}\"ontouchstart\"in document.documentElement&&0===mt(t).closest(jt).length&&mt(document.body).children().on(\"mouseover\",null,mt.noop),this._element.focus(),this._element.setAttribute(\"aria-expanded\",!0),mt(this._menu).toggleClass(Dt),mt(t).toggleClass(Dt).trigger(mt.Event(It.SHOWN,n))}}}},t.dispose=function(){mt.removeData(this._element,vt),mt(this._element).off(Et),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},t.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},t._addEventListeners=function(){var e=this;mt(this._element).on(It.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},t._getConfig=function(t){return t=h({},this.constructor.Default,mt(this._element).data(),t),Cn.typeCheckConfig(pt,t,this.constructor.DefaultType),t},t._getMenuElement=function(){if(!this._menu){var t=l._getParentFromElement(this._element);this._menu=mt(t).find(Lt)[0]}return this._menu},t._getPlacement=function(){var t=mt(this._element).parent(),e=Mt;return t.hasClass(bt)?(e=Ht,mt(this._menu).hasClass(Nt)&&(e=Wt)):t.hasClass(St)?e=Ut:t.hasClass(wt)?e=Kt:mt(this._menu).hasClass(Nt)&&(e=xt),e},t._detectNavbar=function(){return 0<mt(this._element).closest(\".navbar\").length},t._getPopperConfig=function(){var e=this,t={};\"function\"==typeof this._config.offset?t.fn=function(t){return t.offsets=h({},t.offsets,e._config.offset(t.offsets)||{}),t}:t.offset=this._config.offset;var n={placement:this._getPlacement(),modifiers:{offset:t,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return\"static\"===this._config.display&&(n.modifiers.applyStyle={enabled:!1}),n},l._jQueryInterface=function(e){return this.each(function(){var t=mt(this).data(vt);if(t||(t=new l(this,\"object\"==typeof e?e:null),mt(this).data(vt,t)),\"string\"==typeof e){if(\"undefined\"==typeof t[e])throw new TypeError('No method named \"'+e+'\"');t[e]()}})},l._clearMenus=function(t){if(!t||3!==t.which&&(\"keyup\"!==t.type||9===t.which))for(var e=mt.makeArray(mt(kt)),n=0;n<e.length;n++){var i=l._getParentFromElement(e[n]),r=mt(e[n]).data(vt),s={relatedTarget:e[n]};if(r){var o=r._menu;if(mt(i).hasClass(Dt)&&!(t&&(\"click\"===t.type&&/input|textarea/i.test(t.target.tagName)||\"keyup\"===t.type&&9===t.which)&&mt.contains(i,t.target))){var a=mt.Event(It.HIDE,s);mt(i).trigger(a),a.isDefaultPrevented()||(\"ontouchstart\"in document.documentElement&&mt(document.body).children().off(\"mouseover\",null,mt.noop),e[n].setAttribute(\"aria-expanded\",\"false\"),mt(o).removeClass(Dt),mt(i).removeClass(Dt).trigger(mt.Event(It.HIDDEN,s)))}}}},l._getParentFromElement=function(t){var e,n=Cn.getSelectorFromElement(t);return n&&(e=mt(n)[0]),e||t.parentNode},l._dataApiKeydownHandler=function(t){if((/input|textarea/i.test(t.target.tagName)?!(32===t.which||27!==t.which&&(40!==t.which&&38!==t.which||mt(t.target).closest(Lt).length)):Ct.test(t.which))&&(t.preventDefault(),t.stopPropagation(),!this.disabled&&!mt(this).hasClass(At))){var e=l._getParentFromElement(this),n=mt(e).hasClass(Dt);if((n||27===t.which&&32===t.which)&&(!n||27!==t.which&&32!==t.which)){var i=mt(e).find(Rt).get();if(0!==i.length){var r=i.indexOf(t.target);38===t.which&&0<r&&r--,40===t.which&&r<i.length-1&&r++,r<0&&(r=0),i[r].focus()}}else{if(27===t.which){var s=mt(e).find(kt)[0];mt(s).trigger(\"focus\")}mt(this).trigger(\"click\")}}},o(l,null,[{key:\"VERSION\",get:function(){return\"4.1.0\"}},{key:\"Default\",get:function(){return Ft}},{key:\"DefaultType\",get:function(){return Vt}}]),l}(),mt(document).on(It.KEYDOWN_DATA_API,kt,Qt._dataApiKeydownHandler).on(It.KEYDOWN_DATA_API,Lt,Qt._dataApiKeydownHandler).on(It.CLICK_DATA_API+\" \"+It.KEYUP_DATA_API,Qt._clearMenus).on(It.CLICK_DATA_API,kt,function(t){t.preventDefault(),t.stopPropagation(),Qt._jQueryInterface.call(mt(this),\"toggle\")}).on(It.CLICK_DATA_API,Pt,function(t){t.stopPropagation()}),mt.fn[pt]=Qt._jQueryInterface,mt.fn[pt].Constructor=Qt,mt.fn[pt].noConflict=function(){return mt.fn[pt]=Tt,Qt._jQueryInterface},Qt),wn=(Yt=\"modal\",qt=\".\"+(Gt=\"bs.modal\"),zt=(Bt=e).fn[Yt],Xt={backdrop:!0,keyboard:!0,focus:!0,show:!0},Jt={backdrop:\"(boolean|string)\",keyboard:\"boolean\",focus:\"boolean\",show:\"boolean\"},Zt={HIDE:\"hide\"+qt,HIDDEN:\"hidden\"+qt,SHOW:\"show\"+qt,SHOWN:\"shown\"+qt,FOCUSIN:\"focusin\"+qt,RESIZE:\"resize\"+qt,CLICK_DISMISS:\"click.dismiss\"+qt,KEYDOWN_DISMISS:\"keydown.dismiss\"+qt,MOUSEUP_DISMISS:\"mouseup.dismiss\"+qt,MOUSEDOWN_DISMISS:\"mousedown.dismiss\"+qt,CLICK_DATA_API:\"click\"+qt+\".data-api\"},$t=\"modal-scrollbar-measure\",te=\"modal-backdrop\",ee=\"modal-open\",ne=\"fade\",ie=\"show\",re={DIALOG:\".modal-dialog\",DATA_TOGGLE:'[data-toggle=\"modal\"]',DATA_DISMISS:'[data-dismiss=\"modal\"]',FIXED_CONTENT:\".fixed-top, .fixed-bottom, .is-fixed, .sticky-top\",STICKY_CONTENT:\".sticky-top\",NAVBAR_TOGGLER:\".navbar-toggler\"},se=function(){function r(t,e){this._config=this._getConfig(e),this._element=t,this._dialog=Bt(t).find(re.DIALOG)[0],this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._scrollbarWidth=0}var t=r.prototype;return t.toggle=function(t){return this._isShown?this.hide():this.show(t)},t.show=function(t){var e=this;if(!this._isTransitioning&&!this._isShown){Bt(this._element).hasClass(ne)&&(this._isTransitioning=!0);var n=Bt.Event(Zt.SHOW,{relatedTarget:t});Bt(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),Bt(document.body).addClass(ee),this._setEscapeEvent(),this._setResizeEvent(),Bt(this._element).on(Zt.CLICK_DISMISS,re.DATA_DISMISS,function(t){return e.hide(t)}),Bt(this._dialog).on(Zt.MOUSEDOWN_DISMISS,function(){Bt(e._element).one(Zt.MOUSEUP_DISMISS,function(t){Bt(t.target).is(e._element)&&(e._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return e._showElement(t)}))}},t.hide=function(t){var e=this;if(t&&t.preventDefault(),!this._isTransitioning&&this._isShown){var n=Bt.Event(Zt.HIDE);if(Bt(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=Bt(this._element).hasClass(ne);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),Bt(document).off(Zt.FOCUSIN),Bt(this._element).removeClass(ie),Bt(this._element).off(Zt.CLICK_DISMISS),Bt(this._dialog).off(Zt.MOUSEDOWN_DISMISS),i){var r=Cn.getTransitionDurationFromElement(this._element);Bt(this._element).one(Cn.TRANSITION_END,function(t){return e._hideModal(t)}).emulateTransitionEnd(r)}else this._hideModal()}}},t.dispose=function(){Bt.removeData(this._element,Gt),Bt(window,document,this._element,this._backdrop).off(qt),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._scrollbarWidth=null},t.handleUpdate=function(){this._adjustDialog()},t._getConfig=function(t){return t=h({},Xt,t),Cn.typeCheckConfig(Yt,t,Jt),t},t._showElement=function(t){var e=this,n=Bt(this._element).hasClass(ne);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display=\"block\",this._element.removeAttribute(\"aria-hidden\"),this._element.scrollTop=0,n&&Cn.reflow(this._element),Bt(this._element).addClass(ie),this._config.focus&&this._enforceFocus();var i=Bt.Event(Zt.SHOWN,{relatedTarget:t}),r=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,Bt(e._element).trigger(i)};if(n){var s=Cn.getTransitionDurationFromElement(this._element);Bt(this._dialog).one(Cn.TRANSITION_END,r).emulateTransitionEnd(s)}else r()},t._enforceFocus=function(){var e=this;Bt(document).off(Zt.FOCUSIN).on(Zt.FOCUSIN,function(t){document!==t.target&&e._element!==t.target&&0===Bt(e._element).has(t.target).length&&e._element.focus()})},t._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?Bt(this._element).on(Zt.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||Bt(this._element).off(Zt.KEYDOWN_DISMISS)},t._setResizeEvent=function(){var e=this;this._isShown?Bt(window).on(Zt.RESIZE,function(t){return e.handleUpdate(t)}):Bt(window).off(Zt.RESIZE)},t._hideModal=function(){var t=this;this._element.style.display=\"none\",this._element.setAttribute(\"aria-hidden\",!0),this._isTransitioning=!1,this._showBackdrop(function(){Bt(document.body).removeClass(ee),t._resetAdjustments(),t._resetScrollbar(),Bt(t._element).trigger(Zt.HIDDEN)})},t._removeBackdrop=function(){this._backdrop&&(Bt(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(t){var e=this,n=Bt(this._element).hasClass(ne)?ne:\"\";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement(\"div\"),this._backdrop.className=te,n&&Bt(this._backdrop).addClass(n),Bt(this._backdrop).appendTo(document.body),Bt(this._element).on(Zt.CLICK_DISMISS,function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&(\"static\"===e._config.backdrop?e._element.focus():e.hide())}),n&&Cn.reflow(this._backdrop),Bt(this._backdrop).addClass(ie),!t)return;if(!n)return void t();var i=Cn.getTransitionDurationFromElement(this._backdrop);Bt(this._backdrop).one(Cn.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){Bt(this._backdrop).removeClass(ie);var r=function(){e._removeBackdrop(),t&&t()};if(Bt(this._element).hasClass(ne)){var s=Cn.getTransitionDurationFromElement(this._backdrop);Bt(this._backdrop).one(Cn.TRANSITION_END,r).emulateTransitionEnd(s)}else r()}else t&&t()},t._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+\"px\"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+\"px\")},t._resetAdjustments=function(){this._element.style.paddingLeft=\"\",this._element.style.paddingRight=\"\"},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},t._setScrollbar=function(){var r=this;if(this._isBodyOverflowing){Bt(re.FIXED_CONTENT).each(function(t,e){var n=Bt(e)[0].style.paddingRight,i=Bt(e).css(\"padding-right\");Bt(e).data(\"padding-right\",n).css(\"padding-right\",parseFloat(i)+r._scrollbarWidth+\"px\")}),Bt(re.STICKY_CONTENT).each(function(t,e){var n=Bt(e)[0].style.marginRight,i=Bt(e).css(\"margin-right\");Bt(e).data(\"margin-right\",n).css(\"margin-right\",parseFloat(i)-r._scrollbarWidth+\"px\")}),Bt(re.NAVBAR_TOGGLER).each(function(t,e){var n=Bt(e)[0].style.marginRight,i=Bt(e).css(\"margin-right\");Bt(e).data(\"margin-right\",n).css(\"margin-right\",parseFloat(i)+r._scrollbarWidth+\"px\")});var t=document.body.style.paddingRight,e=Bt(document.body).css(\"padding-right\");Bt(document.body).data(\"padding-right\",t).css(\"padding-right\",parseFloat(e)+this._scrollbarWidth+\"px\")}},t._resetScrollbar=function(){Bt(re.FIXED_CONTENT).each(function(t,e){var n=Bt(e).data(\"padding-right\");\"undefined\"!=typeof n&&Bt(e).css(\"padding-right\",n).removeData(\"padding-right\")}),Bt(re.STICKY_CONTENT+\", \"+re.NAVBAR_TOGGLER).each(function(t,e){var n=Bt(e).data(\"margin-right\");\"undefined\"!=typeof n&&Bt(e).css(\"margin-right\",n).removeData(\"margin-right\")});var t=Bt(document.body).data(\"padding-right\");\"undefined\"!=typeof t&&Bt(document.body).css(\"padding-right\",t).removeData(\"padding-right\")},t._getScrollbarWidth=function(){var t=document.createElement(\"div\");t.className=$t,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},r._jQueryInterface=function(n,i){return this.each(function(){var t=Bt(this).data(Gt),e=h({},r.Default,Bt(this).data(),\"object\"==typeof n&&n);if(t||(t=new r(this,e),Bt(this).data(Gt,t)),\"string\"==typeof n){if(\"undefined\"==typeof t[n])throw new TypeError('No method named \"'+n+'\"');t[n](i)}else e.show&&t.show(i)})},o(r,null,[{key:\"VERSION\",get:function(){return\"4.1.0\"}},{key:\"Default\",get:function(){return Xt}}]),r}(),Bt(document).on(Zt.CLICK_DATA_API,re.DATA_TOGGLE,function(t){var e,n=this,i=Cn.getSelectorFromElement(this);i&&(e=Bt(i)[0]);var r=Bt(e).data(Gt)?\"toggle\":h({},Bt(e).data(),Bt(this).data());\"A\"!==this.tagName&&\"AREA\"!==this.tagName||t.preventDefault();var s=Bt(e).one(Zt.SHOW,function(t){t.isDefaultPrevented()||s.one(Zt.HIDDEN,function(){Bt(n).is(\":visible\")&&n.focus()})});se._jQueryInterface.call(Bt(e),r,this)}),Bt.fn[Yt]=se._jQueryInterface,Bt.fn[Yt].Constructor=se,Bt.fn[Yt].noConflict=function(){return Bt.fn[Yt]=zt,se._jQueryInterface},se),Nn=(ae=\"tooltip\",he=\".\"+(le=\"bs.tooltip\"),ce=(oe=e).fn[ae],ue=\"bs-tooltip\",fe=new RegExp(\"(^|\\\\s)\"+ue+\"\\\\S+\",\"g\"),ge={animation:!0,template:'<div class=\"tooltip\" role=\"tooltip\"><div class=\"arrow\"></div><div class=\"tooltip-inner\"></div></div>',trigger:\"hover focus\",title:\"\",delay:0,html:!(_e={AUTO:\"auto\",TOP:\"top\",RIGHT:\"right\",BOTTOM:\"bottom\",LEFT:\"left\"}),selector:!(de={animation:\"boolean\",template:\"string\",title:\"(string|element|function)\",trigger:\"string\",delay:\"(number|object)\",html:\"boolean\",selector:\"(string|boolean)\",placement:\"(string|function)\",offset:\"(number|string)\",container:\"(string|element|boolean)\",fallbackPlacement:\"(string|array)\",boundary:\"(string|element)\"}),placement:\"top\",offset:0,container:!1,fallbackPlacement:\"flip\",boundary:\"scrollParent\"},pe=\"out\",ve={HIDE:\"hide\"+he,HIDDEN:\"hidden\"+he,SHOW:(me=\"show\")+he,SHOWN:\"shown\"+he,INSERTED:\"inserted\"+he,CLICK:\"click\"+he,FOCUSIN:\"focusin\"+he,FOCUSOUT:\"focusout\"+he,MOUSEENTER:\"mouseenter\"+he,MOUSELEAVE:\"mouseleave\"+he},Ee=\"fade\",ye=\"show\",Te=\".tooltip-inner\",Ce=\".arrow\",Ie=\"hover\",Ae=\"focus\",De=\"click\",be=\"manual\",Se=function(){function i(t,e){if(\"undefined\"==typeof c)throw new TypeError(\"Bootstrap tooltips require Popper.js (https://popper.js.org)\");this._isEnabled=!0,this._timeout=0,this._hoverState=\"\",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=oe(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),oe(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(oe(this.getTipElement()).hasClass(ye))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),oe.removeData(this.element,this.constructor.DATA_KEY),oe(this.element).off(this.constructor.EVENT_KEY),oe(this.element).closest(\".modal\").off(\"hide.bs.modal\"),this.tip&&oe(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if(\"none\"===oe(this.element).css(\"display\"))throw new Error(\"Please use show on visible elements\");var t=oe.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){oe(this.element).trigger(t);var n=oe.contains(this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!n)return;var i=this.getTipElement(),r=Cn.getUID(this.constructor.NAME);i.setAttribute(\"id\",r),this.element.setAttribute(\"aria-describedby\",r),this.setContent(),this.config.animation&&oe(i).addClass(Ee);var s=\"function\"==typeof this.config.placement?this.config.placement.call(this,i,this.element):this.config.placement,o=this._getAttachment(s);this.addAttachmentClass(o);var a=!1===this.config.container?document.body:oe(this.config.container);oe(i).data(this.constructor.DATA_KEY,this),oe.contains(this.element.ownerDocument.documentElement,this.tip)||oe(i).appendTo(a),oe(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new c(this.element,i,{placement:o,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:Ce},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),oe(i).addClass(ye),\"ontouchstart\"in document.documentElement&&oe(document.body).children().on(\"mouseover\",null,oe.noop);var l=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,oe(e.element).trigger(e.constructor.Event.SHOWN),t===pe&&e._leave(null,e)};if(oe(this.tip).hasClass(Ee)){var h=Cn.getTransitionDurationFromElement(this.tip);oe(this.tip).one(Cn.TRANSITION_END,l).emulateTransitionEnd(h)}else l()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=oe.Event(this.constructor.Event.HIDE),r=function(){e._hoverState!==me&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute(\"aria-describedby\"),oe(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(oe(this.element).trigger(i),!i.isDefaultPrevented()){if(oe(n).removeClass(ye),\"ontouchstart\"in document.documentElement&&oe(document.body).children().off(\"mouseover\",null,oe.noop),this._activeTrigger[De]=!1,this._activeTrigger[Ae]=!1,this._activeTrigger[Ie]=!1,oe(this.tip).hasClass(Ee)){var s=Cn.getTransitionDurationFromElement(n);oe(n).one(Cn.TRANSITION_END,r).emulateTransitionEnd(s)}else r();this._hoverState=\"\"}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){oe(this.getTipElement()).addClass(ue+\"-\"+t)},t.getTipElement=function(){return this.tip=this.tip||oe(this.config.template)[0],this.tip},t.setContent=function(){var t=oe(this.getTipElement());this.setElementContent(t.find(Te),this.getTitle()),t.removeClass(Ee+\" \"+ye)},t.setElementContent=function(t,e){var n=this.config.html;\"object\"==typeof e&&(e.nodeType||e.jquery)?n?oe(e).parent().is(t)||t.empty().append(e):t.text(oe(e).text()):t[n?\"html\":\"text\"](e)},t.getTitle=function(){var t=this.element.getAttribute(\"data-original-title\");return t||(t=\"function\"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getAttachment=function(t){return _e[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(\" \").forEach(function(t){if(\"click\"===t)oe(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==be){var e=t===Ie?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===Ie?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;oe(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}oe(i.element).closest(\".modal\").on(\"hide.bs.modal\",function(){return i.hide()})}),this.config.selector?this.config=h({},this.config,{trigger:\"manual\",selector:\"\"}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute(\"data-original-title\");(this.element.getAttribute(\"title\")||\"string\"!==t)&&(this.element.setAttribute(\"data-original-title\",this.element.getAttribute(\"title\")||\"\"),this.element.setAttribute(\"title\",\"\"))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||oe(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),oe(t.currentTarget).data(n,e)),t&&(e._activeTrigger[\"focusin\"===t.type?Ae:Ie]=!0),oe(e.getTipElement()).hasClass(ye)||e._hoverState===me?e._hoverState=me:(clearTimeout(e._timeout),e._hoverState=me,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===me&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||oe(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),oe(t.currentTarget).data(n,e)),t&&(e._activeTrigger[\"focusout\"===t.type?Ae:Ie]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=pe,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===pe&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){return\"number\"==typeof(t=h({},this.constructor.Default,oe(this.element).data(),t)).delay&&(t.delay={show:t.delay,hide:t.delay}),\"number\"==typeof t.title&&(t.title=t.title.toString()),\"number\"==typeof t.content&&(t.content=t.content.toString()),Cn.typeCheckConfig(ae,t,this.constructor.DefaultType),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=oe(this.getTipElement()),e=t.attr(\"class\").match(fe);null!==e&&0<e.length&&t.removeClass(e.join(\"\"))},t._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute(\"x-placement\")&&(oe(t).removeClass(Ee),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=oe(this).data(le),e=\"object\"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),oe(this).data(le,t)),\"string\"==typeof n)){if(\"undefined\"==typeof t[n])throw new TypeError('No method named \"'+n+'\"');t[n]()}})},o(i,null,[{key:\"VERSION\",get:function(){return\"4.1.0\"}},{key:\"Default\",get:function(){return ge}},{key:\"NAME\",get:function(){return ae}},{key:\"DATA_KEY\",get:function(){return le}},{key:\"Event\",get:function(){return ve}},{key:\"EVENT_KEY\",get:function(){return he}},{key:\"DefaultType\",get:function(){return de}}]),i}(),oe.fn[ae]=Se._jQueryInterface,oe.fn[ae].Constructor=Se,oe.fn[ae].noConflict=function(){return oe.fn[ae]=ce,Se._jQueryInterface},Se),On=(Ne=\"popover\",ke=\".\"+(Oe=\"bs.popover\"),Pe=(we=e).fn[Ne],Le=\"bs-popover\",je=new RegExp(\"(^|\\\\s)\"+Le+\"\\\\S+\",\"g\"),Re=h({},Nn.Default,{placement:\"right\",trigger:\"click\",content:\"\",template:'<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-header\"></h3><div class=\"popover-body\"></div></div>'}),He=h({},Nn.DefaultType,{content:\"(string|element|function)\"}),We=\"fade\",xe=\".popover-header\",Ue=\".popover-body\",Ke={HIDE:\"hide\"+ke,HIDDEN:\"hidden\"+ke,SHOW:(Me=\"show\")+ke,SHOWN:\"shown\"+ke,INSERTED:\"inserted\"+ke,CLICK:\"click\"+ke,FOCUSIN:\"focusin\"+ke,FOCUSOUT:\"focusout\"+ke,MOUSEENTER:\"mouseenter\"+ke,MOUSELEAVE:\"mouseleave\"+ke},Fe=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var r=i.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.addAttachmentClass=function(t){we(this.getTipElement()).addClass(Le+\"-\"+t)},r.getTipElement=function(){return this.tip=this.tip||we(this.config.template)[0],this.tip},r.setContent=function(){var t=we(this.getTipElement());this.setElementContent(t.find(xe),this.getTitle());var e=this._getContent();\"function\"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(Ue),e),t.removeClass(We+\" \"+Me)},r._getContent=function(){return this.element.getAttribute(\"data-content\")||this.config.content},r._cleanTipClass=function(){var t=we(this.getTipElement()),e=t.attr(\"class\").match(je);null!==e&&0<e.length&&t.removeClass(e.join(\"\"))},i._jQueryInterface=function(n){return this.each(function(){var t=we(this).data(Oe),e=\"object\"==typeof n?n:null;if((t||!/destroy|hide/.test(n))&&(t||(t=new i(this,e),we(this).data(Oe,t)),\"string\"==typeof n)){if(\"undefined\"==typeof t[n])throw new TypeError('No method named \"'+n+'\"');t[n]()}})},o(i,null,[{key:\"VERSION\",get:function(){return\"4.1.0\"}},{key:\"Default\",get:function(){return Re}},{key:\"NAME\",get:function(){return Ne}},{key:\"DATA_KEY\",get:function(){return Oe}},{key:\"Event\",get:function(){return Ke}},{key:\"EVENT_KEY\",get:function(){return ke}},{key:\"DefaultType\",get:function(){return He}}]),i}(Nn),we.fn[Ne]=Fe._jQueryInterface,we.fn[Ne].Constructor=Fe,we.fn[Ne].noConflict=function(){return we.fn[Ne]=Pe,Fe._jQueryInterface},Fe),kn=(Qe=\"scrollspy\",Ye=\".\"+(Be=\"bs.scrollspy\"),Ge=(Ve=e).fn[Qe],qe={offset:10,method:\"auto\",target:\"\"},ze={offset:\"number\",method:\"string\",target:\"(string|element)\"},Xe={ACTIVATE:\"activate\"+Ye,SCROLL:\"scroll\"+Ye,LOAD_DATA_API:\"load\"+Ye+\".data-api\"},Je=\"dropdown-item\",Ze=\"active\",$e={DATA_SPY:'[data-spy=\"scroll\"]',ACTIVE:\".active\",NAV_LIST_GROUP:\".nav, .list-group\",NAV_LINKS:\".nav-link\",NAV_ITEMS:\".nav-item\",LIST_ITEMS:\".list-group-item\",DROPDOWN:\".dropdown\",DROPDOWN_ITEMS:\".dropdown-item\",DROPDOWN_TOGGLE:\".dropdown-toggle\"},tn=\"offset\",en=\"position\",nn=function(){function n(t,e){var n=this;this._element=t,this._scrollElement=\"BODY\"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+\" \"+$e.NAV_LINKS+\",\"+this._config.target+\" \"+$e.LIST_ITEMS+\",\"+this._config.target+\" \"+$e.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,Ve(this._scrollElement).on(Xe.SCROLL,function(t){return n._process(t)}),this.refresh(),this._process()}var t=n.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?tn:en,r=\"auto\"===this._config.method?t:this._config.method,s=r===en?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),Ve.makeArray(Ve(this._selector)).map(function(t){var e,n=Cn.getSelectorFromElement(t);if(n&&(e=Ve(n)[0]),e){var i=e.getBoundingClientRect();if(i.width||i.height)return[Ve(e)[r]().top+s,n]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},t.dispose=function(){Ve.removeData(this._element,Be),Ve(this._scrollElement).off(Ye),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(t){if(\"string\"!=typeof(t=h({},qe,t)).target){var e=Ve(t.target).attr(\"id\");e||(e=Cn.getUID(Qe),Ve(t.target).attr(\"id\",e)),t.target=\"#\"+e}return Cn.typeCheckConfig(Qe,t,ze),t},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),n<=t){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var r=this._offsets.length;r--;){this._activeTarget!==this._targets[r]&&t>=this._offsets[r]&&(\"undefined\"==typeof this._offsets[r+1]||t<this._offsets[r+1])&&this._activate(this._targets[r])}}},t._activate=function(e){this._activeTarget=e,this._clear();var t=this._selector.split(\",\");t=t.map(function(t){return t+'[data-target=\"'+e+'\"],'+t+'[href=\"'+e+'\"]'});var n=Ve(t.join(\",\"));n.hasClass(Je)?(n.closest($e.DROPDOWN).find($e.DROPDOWN_TOGGLE).addClass(Ze),n.addClass(Ze)):(n.addClass(Ze),n.parents($e.NAV_LIST_GROUP).prev($e.NAV_LINKS+\", \"+$e.LIST_ITEMS).addClass(Ze),n.parents($e.NAV_LIST_GROUP).prev($e.NAV_ITEMS).children($e.NAV_LINKS).addClass(Ze)),Ve(this._scrollElement).trigger(Xe.ACTIVATE,{relatedTarget:e})},t._clear=function(){Ve(this._selector).filter($e.ACTIVE).removeClass(Ze)},n._jQueryInterface=function(e){return this.each(function(){var t=Ve(this).data(Be);if(t||(t=new n(this,\"object\"==typeof e&&e),Ve(this).data(Be,t)),\"string\"==typeof e){if(\"undefined\"==typeof t[e])throw new TypeError('No method named \"'+e+'\"');t[e]()}})},o(n,null,[{key:\"VERSION\",get:function(){return\"4.1.0\"}},{key:\"Default\",get:function(){return qe}}]),n}(),Ve(window).on(Xe.LOAD_DATA_API,function(){for(var t=Ve.makeArray(Ve($e.DATA_SPY)),e=t.length;e--;){var n=Ve(t[e]);nn._jQueryInterface.call(n,n.data())}}),Ve.fn[Qe]=nn._jQueryInterface,Ve.fn[Qe].Constructor=nn,Ve.fn[Qe].noConflict=function(){return Ve.fn[Qe]=Ge,nn._jQueryInterface},nn),Pn=(on=\".\"+(sn=\"bs.tab\"),an=(rn=e).fn.tab,ln={HIDE:\"hide\"+on,HIDDEN:\"hidden\"+on,SHOW:\"show\"+on,SHOWN:\"shown\"+on,CLICK_DATA_API:\"click\"+on+\".data-api\"},hn=\"dropdown-menu\",cn=\"active\",un=\"disabled\",fn=\"fade\",dn=\"show\",_n=\".dropdown\",gn=\".nav, .list-group\",mn=\".active\",pn=\"> li > .active\",vn='[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',En=\".dropdown-toggle\",yn=\"> .dropdown-menu .active\",Tn=function(){function i(t){this._element=t}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&rn(this._element).hasClass(cn)||rn(this._element).hasClass(un))){var t,i,e=rn(this._element).closest(gn)[0],r=Cn.getSelectorFromElement(this._element);if(e){var s=\"UL\"===e.nodeName?pn:mn;i=(i=rn.makeArray(rn(e).find(s)))[i.length-1]}var o=rn.Event(ln.HIDE,{relatedTarget:this._element}),a=rn.Event(ln.SHOW,{relatedTarget:i});if(i&&rn(i).trigger(o),rn(this._element).trigger(a),!a.isDefaultPrevented()&&!o.isDefaultPrevented()){r&&(t=rn(r)[0]),this._activate(this._element,e);var l=function(){var t=rn.Event(ln.HIDDEN,{relatedTarget:n._element}),e=rn.Event(ln.SHOWN,{relatedTarget:i});rn(i).trigger(t),rn(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){rn.removeData(this._element,sn),this._element=null},t._activate=function(t,e,n){var i=this,r=(\"UL\"===e.nodeName?rn(e).find(pn):rn(e).children(mn))[0],s=n&&r&&rn(r).hasClass(fn),o=function(){return i._transitionComplete(t,r,n)};if(r&&s){var a=Cn.getTransitionDurationFromElement(r);rn(r).one(Cn.TRANSITION_END,o).emulateTransitionEnd(a)}else o()},t._transitionComplete=function(t,e,n){if(e){rn(e).removeClass(dn+\" \"+cn);var i=rn(e.parentNode).find(yn)[0];i&&rn(i).removeClass(cn),\"tab\"===e.getAttribute(\"role\")&&e.setAttribute(\"aria-selected\",!1)}if(rn(t).addClass(cn),\"tab\"===t.getAttribute(\"role\")&&t.setAttribute(\"aria-selected\",!0),Cn.reflow(t),rn(t).addClass(dn),t.parentNode&&rn(t.parentNode).hasClass(hn)){var r=rn(t).closest(_n)[0];r&&rn(r).find(En).addClass(cn),t.setAttribute(\"aria-expanded\",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var t=rn(this),e=t.data(sn);if(e||(e=new i(this),t.data(sn,e)),\"string\"==typeof n){if(\"undefined\"==typeof e[n])throw new TypeError('No method named \"'+n+'\"');e[n]()}})},o(i,null,[{key:\"VERSION\",get:function(){return\"4.1.0\"}}]),i}(),rn(document).on(ln.CLICK_DATA_API,vn,function(t){t.preventDefault(),Tn._jQueryInterface.call(rn(this),\"show\")}),rn.fn.tab=Tn._jQueryInterface,rn.fn.tab.Constructor=Tn,rn.fn.tab.noConflict=function(){return rn.fn.tab=an,Tn._jQueryInterface},Tn);!function(t){if(\"undefined\"==typeof t)throw new TypeError(\"Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.\");var e=t.fn.jquery.split(\" \")[0].split(\".\");if(e[0]<2&&e[1]<9||1===e[0]&&9===e[1]&&e[2]<1||4<=e[0])throw new Error(\"Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0\")}(e),t.Util=Cn,t.Alert=In,t.Button=An,t.Carousel=Dn,t.Collapse=bn,t.Dropdown=Sn,t.Modal=wn,t.Popover=On,t.Scrollspy=kn,t.Tab=Pn,t.Tooltip=Nn,Object.defineProperty(t,\"__esModule\",{value:!0})});\n//# sourceMappingURL=bootstrap.min.js.map"),
20
        }
21
        file4 := &embedded.EmbeddedFile{
22
                Filename:    "chart_index.js",
23
                FileModTime: time.Unix(1538522004, 0),
24
                Content:     string("{{define \"chartIndex\"}}\nvar ctx_{{js .Id}} = document.getElementById(\"service_{{js .Id}}\").getContext('2d');\nvar chartdata_{{js .Id}} = new Chart(ctx_{{js .Id}}, {\n  type: 'line',\n    data: {\n    datasets: [{\n      label: 'Response Time (Milliseconds)',\n      data: [],\n      backgroundColor: ['{{if .Online}}rgba(47, 206, 30, 0.92){{else}}rgb(221, 53, 69){{end}}'],\n      borderColor: ['{{if .Online}}rgb(47, 171, 34){{else}}rgb(183, 32, 47){{end}}'],\n      borderWidth: 1\n    }]\n  },\n  options: {\n    maintainAspectRatio: !1,\n      scaleShowValues: !0,\n      layout: {\n      padding: {\n        left: 0,\n          right: 0,\n          top: 0,\n          bottom: -10\n      }\n    },\n    hover: {\n      animationDuration: 0,\n    },\n    responsiveAnimationDuration: 0,\n      animation: {\n      duration: 3500,\n        onComplete: function() {\n        var chartInstance = this.chart,\n          ctx = chartInstance.ctx;\n        var controller = this.chart.controller;\n        var xAxis = controller.scales['x-axis-0'];\n        var yAxis = controller.scales['y-axis-0'];\n        ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, Chart.defaults.global.defaultFontStyle, Chart.defaults.global.defaultFontFamily);\n        ctx.textAlign = 'center';\n        ctx.textBaseline = 'bottom';\n        var numTicks = xAxis.ticks.length;\n        var yOffsetStart = xAxis.width / numTicks;\n        var halfBarWidth = (xAxis.width / (numTicks * 2));\n        xAxis.ticks.forEach(function(value, index) {\n          var xOffset = 20;\n          var yOffset = (yOffsetStart * index) + halfBarWidth;\n          ctx.fillStyle = '#e2e2e2';\n          ctx.fillText(value, yOffset, xOffset)\n        });\n        this.data.datasets.forEach(function(dataset, i) {\n          var meta = chartInstance.controller.getDatasetMeta(i);\n          var hxH = 0;\n          var hyH = 0;\n          var hxL = 0;\n          var hyL = 0;\n          var highestNum = 0;\n          var lowestnum = 999999999999;\n          meta.data.forEach(function(bar, index) {\n            var data = dataset.data[index];\n            if (lowestnum > data.y) {\n              lowestnum = data.y;\n              hxL = bar._model.x;\n              hyL = bar._model.y\n            }\n            if (data.y > highestNum) {\n              highestNum = data.y;\n              hxH = bar._model.x;\n              hyH = bar._model.y\n            }\n          });\n          if (hxH >= 820) {\n            hxH = 820\n          } else if (50 >= hxH) {\n            hxH = 50\n          }\n          if (hxL >= 820) {\n            hxL = 820\n          } else if (70 >= hxL) {\n            hxL = 70\n          }\n          ctx.fillStyle = '#ffa7a2';\n          ctx.fillText(highestNum + \"ms\", hxH - 40, hyH + 15);\n          ctx.fillStyle = '#45d642';\n          ctx.fillText(lowestnum + \"ms\", hxL, hyL + 10);\n        })\n      }\n    },\n    legend: {\n      display: !1\n    },\n    tooltips: {\n      enabled: !1\n    },\n    scales: {\n      yAxes: [{\n        display: !1,\n        ticks: {\n          fontSize: 20,\n          display: !1,\n          beginAtZero: !1\n        },\n        gridLines: {\n          display: !1\n        }\n      }],\n        xAxes: [{\n        type: 'time',\n        distribution: 'series',\n        autoSkip: !1,\n        time: {\n          displayFormats: {\n            'hour': 'MMM DD hA'\n          },\n          source: 'auto'\n        },\n        gridLines: {\n          display: !1\n        },\n        ticks: {\n          source: 'auto',\n          stepSize: 1,\n          min: 0,\n          fontColor: \"white\",\n          fontSize: 20,\n          display: !1\n        }\n      }]\n    },\n    elements: {\n      point: {\n        radius: 0\n      }\n    }\n  }\n});\n\nAjaxChart(chartdata_{{js .Id}},{{js .Id}},0,99999999999,\"hour\");\n{{end}}\n"),
25
        }
26
        file5 := &embedded.EmbeddedFile{
27
                Filename:    "charts.js",
28
                FileModTime: time.Unix(1538579801, 0),
29
                Content:     string("{{define \"charts\"}}\n{{$start := .Start}}\n{{$end := .End}}\n{{ range .Services }}\nvar ctx_{{js .Id}} = document.getElementById(\"service_{{js .Id}}\").getContext('2d');\nvar chartdata_{{js .Id}} = new Chart(ctx_{{js .Id}}, {\n  type: 'line',\n    data: {\n    datasets: [{\n      label: 'Response Time (Milliseconds)',\n      data: [],\n      backgroundColor: ['{{if .Online}}rgba(47, 206, 30, 0.92){{else}}rgb(221, 53, 69){{end}}'],\n      borderColor: ['{{if .Online}}rgb(47, 171, 34){{else}}rgb(183, 32, 47){{end}}'],\n      borderWidth: 1\n    }]\n  },\n  options: {\n    maintainAspectRatio: !1,\n      scaleShowValues: !0,\n      layout: {\n      padding: {\n        left: 0,\n          right: 0,\n          top: 0,\n          bottom: -10\n      }\n    },\n    hover: {\n      animationDuration: 0,\n    },\n    responsiveAnimationDuration: 0,\n      animation: {\n      duration: 3500,\n        onComplete: function() {\n        var chartInstance = this.chart,\n          ctx = chartInstance.ctx;\n        var controller = this.chart.controller;\n        var xAxis = controller.scales['x-axis-0'];\n        var yAxis = controller.scales['y-axis-0'];\n        ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, Chart.defaults.global.defaultFontStyle, Chart.defaults.global.defaultFontFamily);\n        ctx.textAlign = 'center';\n        ctx.textBaseline = 'bottom';\n        var numTicks = xAxis.ticks.length;\n        var yOffsetStart = xAxis.width / numTicks;\n        var halfBarWidth = (xAxis.width / (numTicks * 2));\n        xAxis.ticks.forEach(function(value, index) {\n          var xOffset = 20;\n          var yOffset = (yOffsetStart * index) + halfBarWidth;\n          ctx.fillStyle = '#e2e2e2';\n          ctx.fillText(value, yOffset, xOffset)\n        });\n        this.data.datasets.forEach(function(dataset, i) {\n          var meta = chartInstance.controller.getDatasetMeta(i);\n          var hxH = 0;\n          var hyH = 0;\n          var hxL = 0;\n          var hyL = 0;\n          var highestNum = 0;\n          var lowestnum = 999999999999;\n          meta.data.forEach(function(bar, index) {\n            var data = dataset.data[index];\n            if (lowestnum > data.y) {\n              lowestnum = data.y;\n              hxL = bar._model.x;\n              hyL = bar._model.y\n            }\n            if (data.y > highestNum) {\n              highestNum = data.y;\n              hxH = bar._model.x;\n              hyH = bar._model.y\n            }\n          });\n          if (hxH >= 820) {\n            hxH = 820\n          } else if (50 >= hxH) {\n            hxH = 50\n          }\n          if (hxL >= 820) {\n            hxL = 820\n          } else if (70 >= hxL) {\n            hxL = 70\n          }\n          ctx.fillStyle = '#ffa7a2';\n          ctx.fillText(highestNum + \"ms\", hxH - 40, hyH + 15);\n          ctx.fillStyle = '#45d642';\n          ctx.fillText(lowestnum + \"ms\", hxL, hyL + 10);\n        })\n      }\n    },\n    legend: {\n      display: !1\n    },\n    tooltips: {\n      enabled: !1\n    },\n    scales: {\n      yAxes: [{\n        display: !1,\n        ticks: {\n          fontSize: 20,\n          display: !1,\n          beginAtZero: !1\n        },\n        gridLines: {\n          display: !1\n        }\n      }],\n        xAxes: [{\n        type: 'time',\n        distribution: 'series',\n        autoSkip: !1,\n        time: {\n          displayFormats: {\n            'hour': 'MMM DD hA'\n          },\n          source: 'auto'\n        },\n        gridLines: {\n          display: !1\n        },\n        ticks: {\n          source: 'auto',\n          stepSize: 1,\n          min: 0,\n          fontColor: \"white\",\n          fontSize: 20,\n          display: !1\n        }\n      }]\n    },\n    elements: {\n      point: {\n        radius: 0\n      }\n    }\n  }\n});\n\nAjaxChart(chartdata_{{js .Id}},{{js .Id}},{{$start}},{{$end}},\"hour\");\n{{end}}{{end}}\n"),
30
        }
31
        file6 := &embedded.EmbeddedFile{
32
                Filename:    "jquery-3.3.1.min.js",
33
                FileModTime: time.Unix(1534926456, 0),
34
                Content:     string("/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(e,t){\"use strict\";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return\"function\"==typeof t&&\"number\"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement(\"script\");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?l[c.call(e)]||\"object\":typeof e}var b=\"3.3.1\",w=function(e,t){return new w.fn.init(e,t)},T=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;w.fn=w.prototype={jquery:\"3.3.1\",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:\"jQuery\"+(\"3.3.1\"+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==c.call(e))&&(!(t=i(e))||\"function\"==typeof(n=f.call(t,\"constructor\")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?\"\":(e+\"\").replace(T,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,\"string\"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),\"function\"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){l[\"[object \"+t+\"]\"]=t.toLowerCase()});function C(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b=\"sizzle\"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",M=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",R=\"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",I=\"\\\\[\"+M+\"*(\"+R+\")(?:\"+M+\"*([*^$|!~]?=)\"+M+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+R+\"))|)\"+M+\"*\\\\]\",W=\":(\"+R+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+I+\")*)|.*)\\\\)|)\",$=new RegExp(M+\"+\",\"g\"),B=new RegExp(\"^\"+M+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+M+\"+$\",\"g\"),F=new RegExp(\"^\"+M+\"*,\"+M+\"*\"),_=new RegExp(\"^\"+M+\"*([>+~]|\"+M+\")\"+M+\"*\"),z=new RegExp(\"=\"+M+\"*([^\\\\]'\\\"]*?)\"+M+\"*\\\\]\",\"g\"),X=new RegExp(W),U=new RegExp(\"^\"+R+\"$\"),V={ID:new RegExp(\"^#(\"+R+\")\"),CLASS:new RegExp(\"^\\\\.(\"+R+\")\"),TAG:new RegExp(\"^(\"+R+\"|[*])\"),ATTR:new RegExp(\"^\"+I),PSEUDO:new RegExp(\"^\"+W),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+M+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+M+\"*(?:([+-]|)\"+M+\"*(\\\\d+)|))\"+M+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+P+\")$\",\"i\"),needsContext:new RegExp(\"^\"+M+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+M+\"*((?:-\\\\d)?\\\\d*)\"+M+\"*\\\\)|)(?=[^-]|$)\",\"i\")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\\d$/i,Q=/^[^{]+\\{\\s*\\[native \\w/,J=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,K=/[+~]/,Z=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+M+\"?|(\"+M+\")|.)\",\"ig\"),ee=function(e,t,n){var r=\"0x\"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,ne=function(e,t){return t?\"\\0\"===e?\"\\ufffd\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&(\"form\"in e||\"label\"in e)},{dir:\"parentNode\",next:\"legend\"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],\"string\"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+\" \"]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if(\"object\"!==t.nodeName.toLowerCase()){(c=t.getAttribute(\"id\"))?c=c.replace(te,ne):t.setAttribute(\"id\",c=b),s=(h=a(e)).length;while(s--)h[s]=\"#\"+c+\" \"+ve(h[s]);v=h.join(\",\"),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute(\"id\")}}}return u(e.replace(B,\"$1\"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+\" \")>r.cacheLength&&delete t[e.shift()],t[n+\" \"]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split(\"|\"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return\"input\"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return(\"input\"===n||\"button\"===n)&&t.type===e}}function de(e){return function(t){return\"form\"in t?t.parentNode&&!1===t.disabled?\"label\"in t?\"label\"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:\"label\"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&\"HTML\"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener(\"unload\",re,!1):i.attachEvent&&i.attachEvent(\"onunload\",re)),n.attributes=ue(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute(\"id\")===t}},r.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return n&&n.value===t}},r.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if(\"*\"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML=\"<a id='\"+b+\"'></a><select id='\"+b+\"-\\r\\\\' msallowcapture=''><option selected=''></option></select>\",e.querySelectorAll(\"[msallowcapture^='']\").length&&y.push(\"[*^$]=\"+M+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\"[selected]\").length||y.push(\"\\\\[\"+M+\"*(?:value|\"+P+\")\"),e.querySelectorAll(\"[id~=\"+b+\"-]\").length||y.push(\"~=\"),e.querySelectorAll(\":checked\").length||y.push(\":checked\"),e.querySelectorAll(\"a#\"+b+\"+*\").length||y.push(\".#.+[+~]\")}),ue(function(e){e.innerHTML=\"<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>\";var t=d.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),e.querySelectorAll(\"[name=d]\").length&&y.push(\"name\"+M+\"*[*^$|!~]?=\"),2!==e.querySelectorAll(\":enabled\").length&&y.push(\":enabled\",\":disabled\"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&y.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),y.push(\",.*:\")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,\"*\"),m.call(e,\"[s!='']:x\"),v.push(\"!=\",W)}),y=y.length&&new RegExp(y.join(\"|\")),v=v.length&&new RegExp(v.join(\"|\")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,\"='$1']\"),n.matchesSelector&&g&&!S[t+\" \"]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+\"\").replace(te,ne)},oe.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n=\"\",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||\"\").replace(Z,ee),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+\" \"];return t||(t=new RegExp(\"(^|\"+M+\")\"+e+\"(\"+M+\"|$)\"))&&E(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?\"!=\"===t:!t||(i+=\"\",\"=\"===t?i===n:\"!=\"===t?i!==n:\"^=\"===t?n&&0===i.indexOf(n):\"*=\"===t?n&&i.indexOf(n)>-1:\"$=\"===t?n&&i.slice(-n.length)===n:\"~=\"===t?(\" \"+i.replace($,\" \")+\" \").indexOf(n)>-1:\"|=\"===t&&(i===n||i.slice(0,n.length+1)===n+\"-\"))}},CHILD:function(e,t,n,r,i){var o=\"nth\"!==e.slice(0,3),a=\"last\"!==e.slice(-4),s=\"of-type\"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?\"nextSibling\":\"previousSibling\",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g=\"only\"===e&&!h&&\"nextSibling\"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error(\"unsupported pseudo: \"+e);return i[b]?i(t):i.length>1?(n=[e,e,\"\",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,\"$1\"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||\"\")||oe.error(\"unsupported lang: \"+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute(\"xml:lang\")||t.getAttribute(\"lang\"))return(n=n.toLowerCase())===e||0===n.indexOf(e+\"-\")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||\"text\"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:he(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:he(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=r.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})r.pseudos[t]=fe(t);for(t in{submit:!0,reset:!0})r.pseudos[t]=pe(t);function ye(){}ye.prototype=r.filters=r.pseudos,r.setFilters=new ye,a=oe.tokenize=function(e,t){var n,i,o,a,s,u,l,c=k[e+\" \"];if(c)return t?0:c.slice(0);s=e,u=[],l=r.preFilter;while(s){n&&!(i=F.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(o=[])),n=!1,(i=_.exec(s))&&(n=i.shift(),o.push({value:n,type:i[0].replace(B,\" \")}),s=s.slice(n.length));for(a in r.filter)!(i=V[a].exec(s))||l[a]&&!(i=l[a](i))||(n=i.shift(),o.push({value:n,type:a,matches:i}),s=s.slice(n.length));if(!n)break}return t?s.length:s?oe.error(e):k(e,u).slice(0)};function ve(e){for(var t=0,n=e.length,r=\"\";t<n;t++)r+=e[t].value;return r}function me(e,t,n){var r=t.dir,i=t.next,o=i||r,a=n&&\"parentNode\"===o,s=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||a)return e(t,n,i);return!1}:function(t,n,u){var l,c,f,p=[T,s];if(u){while(t=t[r])if((1===t.nodeType||a)&&e(t,n,u))return!0}else while(t=t[r])if(1===t.nodeType||a)if(f=t[b]||(t[b]={}),c=f[t.uniqueID]||(f[t.uniqueID]={}),i&&i===t.nodeName.toLowerCase())t=t[r]||t;else{if((l=c[o])&&l[0]===T&&l[1]===s)return p[2]=l[2];if(c[o]=p,p[2]=e(t,n,u))return!0}return!1}}function xe(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r<i;r++)oe(e,t[r],n);return n}function we(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Te(e,t,n,r,i,o){return r&&!r[b]&&(r=Te(r)),i&&!i[b]&&(i=Te(i,o)),se(function(o,a,s,u){var l,c,f,p=[],d=[],h=a.length,g=o||be(t||\"*\",s.nodeType?[s]:s,[]),y=!e||!o&&t?g:we(g,p,e,s,u),v=n?i||(o?e:h||r)?[]:a:y;if(n&&n(y,v,s,u),r){l=we(v,d),r(l,[],s,u),c=l.length;while(c--)(f=l[c])&&(v[d[c]]=!(y[d[c]]=f))}if(o){if(i||e){if(i){l=[],c=v.length;while(c--)(f=v[c])&&l.push(y[c]=f);i(null,v=[],l,u)}c=v.length;while(c--)(f=v[c])&&(l=i?O(o,f):p[c])>-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[\" \"],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u<o;u++)if(n=r.relative[e[u].type])p=[me(xe(p),n)];else{if((n=r.filter[e[u].type].apply(null,e[u].matches))[b]){for(i=++u;i<o;i++)if(r.relative[e[i].type])break;return Te(u>1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:\" \"===e[u-2].type?\"*\":\"\"})).replace(B,\"$1\"),n,u<i&&Ce(e.slice(u,i)),i<o&&Ce(e=e.slice(i)),i<o&&ve(e))}p.push(n)}return xe(p)}function Ee(e,t){var n=t.length>0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m=\"0\",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG(\"*\",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+\" \"];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p=\"function\"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&\"ID\"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split(\"\").sort(D).join(\"\")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement(\"fieldset\"))}),ue(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||le(\"type|href|height|width\",function(e,t,n){if(!n)return e.getAttribute(t,\"type\"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||le(\"value\",function(e,t,n){if(!n&&\"input\"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute(\"disabled\")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[\":\"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):\"string\"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if(\"string\"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t<r;t++)if(w.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)w.find(e,i[t],n);return r>1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,\"string\"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,\"string\"==typeof e){if(!(i=\"<\"===e[0]&&\">\"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(w.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a=\"string\"!=typeof e&&w(e);if(!D.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?\"string\"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,\"parentNode\")},parentsUntil:function(e,t,n){return k(e,\"parentNode\",n)},next:function(e){return P(e,\"nextSibling\")},prev:function(e){return P(e,\"previousSibling\")},nextAll:function(e){return k(e,\"nextSibling\")},prevAll:function(e){return k(e,\"previousSibling\")},nextUntil:function(e,t,n){return k(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return k(e,\"previousSibling\",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,\"iframe\")?e.contentDocument:(N(e,\"template\")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return\"Until\"!==e.slice(-5)&&(r=n),r&&\"string\"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\\x20\\t\\r\\n\\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e=\"string\"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s<o.length)!1===o[s].apply(n[0],n[1])&&e.stopOnFalse&&(s=o.length,n=!1)}e.memory||(n=!1),t=!1,i&&(o=n?[]:\"\")},l={add:function(){return o&&(n&&!t&&(s=o.length-1,a.push(n)),function t(n){w.each(n,function(n,r){g(r)?e.unique&&l.has(r)||o.push(r):r&&r.length&&\"string\"!==x(r)&&t(r)})}(arguments),n&&!t&&u()),this},remove:function(){return w.each(arguments,function(e,t){var n;while((n=w.inArray(t,o,n))>-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n=\"\",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=\"\"),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[[\"notify\",\"progress\",w.Callbacks(\"memory\"),w.Callbacks(\"memory\"),2],[\"resolve\",\"done\",w.Callbacks(\"once memory\"),w.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",w.Callbacks(\"once memory\"),w.Callbacks(\"once memory\"),1,\"rejected\"]],r=\"pending\",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},\"catch\":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+\"With\"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t<o)){if((e=r.apply(s,u))===n.promise())throw new TypeError(\"Thenable self-resolution\");l=e&&(\"object\"==typeof e||\"function\"==typeof e)&&e.then,g(l)?i?l.call(e,a(o,n,I,i),a(o,n,W,i)):(o++,l.call(e,a(o,n,I,i),a(o,n,W,i),a(o,n,I,n.notifyWith))):(r!==I&&(s=void 0,u=[e]),(i||n.resolveWith)(s,u))}},c=i?l:function(){try{l()}catch(e){w.Deferred.exceptionHook&&w.Deferred.exceptionHook(e,c.stackTrace),t+1>=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+\"With\"](this===o?void 0:this,arguments),this},o[t[0]+\"With\"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),\"pending\"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn(\"jQuery.Deferred exception: \"+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)[\"catch\"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener(\"DOMContentLoaded\",_),e.removeEventListener(\"load\",_),w.ready()}\"complete\"===r.readyState||\"loading\"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener(\"DOMContentLoaded\",_),e.addEventListener(\"load\",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if(\"object\"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},X=/^-ms-/,U=/-([a-z])/g;function V(e,t){return t.toUpperCase()}function G(e){return e.replace(X,\"ms-\").replace(U,V)}var Y=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Q(){this.expando=w.expando+Q.uid++}Q.uid=1,Q.prototype={cache:function(e){var t=e[this.expando];return t||(t={},Y(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if(\"string\"==typeof t)i[G(t)]=n;else for(r in t)i[G(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][G(t)]},access:function(e,t,n){return void 0===t||t&&\"string\"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(G):(t=G(t))in r?[t]:t.match(M)||[]).length;while(n--)delete r[t[n]]}(void 0===t||w.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!w.isEmptyObject(t)}};var J=new Q,K=new Q,Z=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,ee=/[A-Z]/g;function te(e){return\"true\"===e||\"false\"!==e&&(\"null\"===e?null:e===+e+\"\"?+e:Z.test(e)?JSON.parse(e):e)}function ne(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r=\"data-\"+t.replace(ee,\"-$&\").toLowerCase(),\"string\"==typeof(n=e.getAttribute(r))){try{n=te(n)}catch(e){}K.set(e,t,n)}else n=void 0;return n}w.extend({hasData:function(e){return K.hasData(e)||J.hasData(e)},data:function(e,t,n){return K.access(e,t,n)},removeData:function(e,t){K.remove(e,t)},_data:function(e,t,n){return J.access(e,t,n)},_removeData:function(e,t){J.remove(e,t)}}),w.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=K.get(o),1===o.nodeType&&!J.get(o,\"hasDataAttrs\"))){n=a.length;while(n--)a[n]&&0===(r=a[n].name).indexOf(\"data-\")&&(r=G(r.slice(5)),ne(o,r,i[r]));J.set(o,\"hasDataAttrs\",!0)}return i}return\"object\"==typeof e?this.each(function(){K.set(this,e)}):z(this,function(t){var n;if(o&&void 0===t){if(void 0!==(n=K.get(o,e)))return n;if(void 0!==(n=ne(o,e)))return n}else this.each(function(){K.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||\"fx\")+\"queue\",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||\"fx\";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};\"inprogress\"===i&&(i=n.shift(),r--),i&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks(\"once memory\").add(function(){J.remove(e,[t+\"queue\",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return\"string\"!=typeof e&&(t=e,e=\"fx\",n--),arguments.length<n?w.queue(this[0],e):void 0===t?this:this.each(function(){var n=w.queue(this,e,t);w._queueHooks(this,e),\"fx\"===e&&\"inprogress\"!==n[0]&&w.dequeue(this,e)})},dequeue:function(e){return this.each(function(){w.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,i=w.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};\"string\"!=typeof e&&(t=e,e=void 0),e=e||\"fx\";while(a--)(n=J.get(o[a],e+\"queueHooks\"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var re=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,ie=new RegExp(\"^(?:([+-])=|)(\"+re+\")([a-z%]*)$\",\"i\"),oe=[\"Top\",\"Right\",\"Bottom\",\"Left\"],ae=function(e,t){return\"none\"===(e=t||e).style.display||\"\"===e.style.display&&w.contains(e.ownerDocument,e)&&\"none\"===w.css(e,\"display\")},se=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i};function ue(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return w.css(e,t,\"\")},u=s(),l=n&&n[3]||(w.cssNumber[t]?\"\":\"px\"),c=(w.cssNumber[t]||\"px\"!==l&&+u)&&ie.exec(w.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)w.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,w.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var le={};function ce(e){var t,n=e.ownerDocument,r=e.nodeName,i=le[r];return i||(t=n.body.appendChild(n.createElement(r)),i=w.css(t,\"display\"),t.parentNode.removeChild(t),\"none\"===i&&(i=\"block\"),le[r]=i,i)}function fe(e,t){for(var n,r,i=[],o=0,a=e.length;o<a;o++)(r=e[o]).style&&(n=r.style.display,t?(\"none\"===n&&(i[o]=J.get(r,\"display\")||null,i[o]||(r.style.display=\"\")),\"\"===r.style.display&&ae(r)&&(i[o]=ce(r))):\"none\"!==n&&(i[o]=\"none\",J.set(r,\"display\",n)));for(o=0;o<a;o++)null!=i[o]&&(e[o].style.display=i[o]);return e}w.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?w(this).show():w(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i,he=/^$|^module$|\\/(?:java|ecma)script/i,ge={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n<r;n++)J.set(e[n],\"globalEval\",!t||J.get(t[n],\"globalEval\"))}var me=/<|&#?\\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if(\"object\"===x(o))w.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement(\"div\")),s=(de.exec(o)||[\"\",\"\"])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+w.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;w.merge(p,a.childNodes),(a=f.firstChild).textContent=\"\"}else p.push(t.createTextNode(o));f.textContent=\"\",d=0;while(o=p[d++])if(r&&w.inArray(o,r)>-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),\"script\"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||\"\")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement(\"div\")),t=r.createElement(\"input\");t.setAttribute(\"type\",\"radio\"),t.setAttribute(\"checked\",\"checked\"),t.setAttribute(\"name\",\"t\"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML=\"<textarea>x</textarea>\",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if(\"object\"==typeof t){\"string\"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&(\"string\"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return\"undefined\"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||\"\").match(M)||[\"\"]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(\".\")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||\"\").match(M)||[\"\"]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||\"\").split(\".\").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&(\"**\"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,\"handle events\")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,\"events\")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n<arguments.length;n++)u[n]=arguments[n];if(t.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,t)){s=w.event.handlers.call(this,t,l),n=0;while((o=s[n++])&&!t.isPropagationStopped()){t.currentTarget=o.elem,r=0;while((a=o.handlers[r++])&&!t.isImmediatePropagationStopped())t.rnamespace&&!t.rnamespace.test(a.namespace)||(t.handleObj=a,t.data=a.data,void 0!==(i=((w.event.special[a.origType]||{}).handle||a.handler).apply(o.elem,u))&&!1===(t.result=i)&&(t.preventDefault(),t.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,t),t.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!(\"click\"===e.type&&e.button>=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&(\"click\"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+\" \"]&&(a[i]=r.needsContext?w(i,this).index(l)>-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(e,t){Object.defineProperty(w.Event.prototype,e,{enumerable:!0,configurable:!0,get:g(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[w.expando]?e:new w.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==Se()&&this.focus)return this.focus(),!1},delegateType:\"focusin\"},blur:{trigger:function(){if(this===Se()&&this.blur)return this.blur(),!1},delegateType:\"focusout\"},click:{trigger:function(){if(\"checkbox\"===this.type&&this.click&&N(this,\"input\"))return this.click(),!1},_default:function(e){return N(e.target,\"a\")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},w.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},w.Event=function(e,t){if(!(this instanceof w.Event))return new w.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ee:ke,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&w.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[w.expando]=!0},w.Event.prototype={constructor:w.Event,isDefaultPrevented:ke,isPropagationStopped:ke,isImmediatePropagationStopped:ke,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ee,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ee,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ee,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},w.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,\"char\":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&we.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Te.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},w.event.addProp),w.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(e,t){w.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||w.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),w.fn.extend({on:function(e,t,n,r){return De(this,e,t,n,r)},one:function(e,t,n,r){return De(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,w(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&\"function\"!=typeof t||(n=t,t=void 0),!1===n&&(n=ke),this.each(function(){w.event.remove(this,e,n,t)})}});var Ne=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,Ae=/<script|<style|<link/i,je=/checked\\s*(?:[^=]|=\\s*.checked.)/i,qe=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;function Le(e,t){return N(e,\"table\")&&N(11!==t.nodeType?t:t.firstChild,\"tr\")?w(e).children(\"tbody\")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function Oe(e){return\"true/\"===(e.type||\"\").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute(\"type\"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n<r;n++)w.event.add(t,i,l[i][n])}K.hasData(e)&&(s=K.access(e),u=w.extend({},s),K.set(t,u))}}function Me(e,t){var n=t.nodeName.toLowerCase();\"input\"===n&&pe.test(e.type)?t.checked=e.checked:\"input\"!==n&&\"textarea\"!==n||(t.defaultValue=e.defaultValue)}function Re(e,t,n,r){t=a.apply([],t);var i,o,s,u,l,c,f=0,p=e.length,d=p-1,y=t[0],v=g(y);if(v||p>1&&\"string\"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,\"script\"),He)).length;f<p;f++)l=i,f!==d&&(l=w.clone(l,!0,!0),u&&w.merge(s,ye(l,\"script\"))),n.call(e[f],l,f);if(u)for(c=s[s.length-1].ownerDocument,w.map(s,Oe),f=0;f<u;f++)l=s[f],he.test(l.type||\"\")&&!J.access(l,\"globalEval\")&&w.contains(c,l)&&(l.src&&\"module\"!==(l.type||\"\").toLowerCase()?w._evalUrl&&w._evalUrl(l.src):m(l.textContent.replace(qe,\"\"),c,l))}return e}function Ie(e,t,n){for(var r,i=t?w.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||w.cleanData(ye(r)),r.parentNode&&(n&&w.contains(r.ownerDocument,r)&&ve(ye(r,\"script\")),r.parentNode.removeChild(r));return e}w.extend({htmlPrefilter:function(e){return e.replace(Ne,\"<$1></$2>\")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r<i;r++)Me(o[r],a[r]);if(t)if(n)for(o=o||ye(e),a=a||ye(s),r=0,i=o.length;r<i;r++)Pe(o[r],a[r]);else Pe(e,s);return(a=ye(s,\"script\")).length>0&&ve(a,!u&&ye(e,\"script\")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(w.cleanData(ye(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return Re(this,arguments,function(t){var n=this.parentNode;w.inArray(this,e)<0&&(w.cleanData(ye(this)),n&&n.replaceChild(t,this))},e)}}),w.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,t){w.fn[e]=function(e){for(var n,r=[],i=w(e),o=i.length-1,a=0;a<=o;a++)n=a===o?this:this.clone(!0),w(i[a])[t](n),s.apply(r,n.get());return this.pushStack(r)}});var We=new RegExp(\"^(\"+re+\")(?!px)[a-z%]+$\",\"i\"),$e=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},Be=new RegExp(oe.join(\"|\"),\"i\");!function(){function t(){if(c){l.style.cssText=\"position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0\",c.style.cssText=\"position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%\",be.appendChild(l).appendChild(c);var t=e.getComputedStyle(c);i=\"1%\"!==t.top,u=12===n(t.marginLeft),c.style.right=\"60%\",s=36===n(t.right),o=36===n(t.width),c.style.position=\"absolute\",a=36===c.offsetWidth||\"absolute\",be.removeChild(l),c=null}}function n(e){return Math.round(parseFloat(e))}var i,o,a,s,u,l=r.createElement(\"div\"),c=r.createElement(\"div\");c.style&&(c.style.backgroundClip=\"content-box\",c.cloneNode(!0).style.backgroundClip=\"\",h.clearCloneStyle=\"content-box\"===c.style.backgroundClip,w.extend(h,{boxSizingReliable:function(){return t(),o},pixelBoxStyles:function(){return t(),s},pixelPosition:function(){return t(),i},reliableMarginLeft:function(){return t(),u},scrollboxSize:function(){return t(),a}}))}();function Fe(e,t,n){var r,i,o,a,s=e.style;return(n=n||$e(e))&&(\"\"!==(a=n.getPropertyValue(t)||n[t])||w.contains(e.ownerDocument,e)||(a=w.style(e,t)),!h.pixelBoxStyles()&&We.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+\"\":a}function _e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}var ze=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ue={position:\"absolute\",visibility:\"hidden\",display:\"block\"},Ve={letterSpacing:\"0\",fontWeight:\"400\"},Ge=[\"Webkit\",\"Moz\",\"ms\"],Ye=r.createElement(\"div\").style;function Qe(e){if(e in Ye)return e;var t=e[0].toUpperCase()+e.slice(1),n=Ge.length;while(n--)if((e=Ge[n]+t)in Ye)return e}function Je(e){var t=w.cssProps[e];return t||(t=w.cssProps[e]=Qe(e)||e),t}function Ke(e,t,n){var r=ie.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||\"px\"):t}function Ze(e,t,n,r,i,o){var a=\"width\"===t?1:0,s=0,u=0;if(n===(r?\"border\":\"content\"))return 0;for(;a<4;a+=2)\"margin\"===n&&(u+=w.css(e,n+oe[a],!0,i)),r?(\"content\"===n&&(u-=w.css(e,\"padding\"+oe[a],!0,i)),\"margin\"!==n&&(u-=w.css(e,\"border\"+oe[a]+\"Width\",!0,i))):(u+=w.css(e,\"padding\"+oe[a],!0,i),\"padding\"!==n?u+=w.css(e,\"border\"+oe[a]+\"Width\",!0,i):s+=w.css(e,\"border\"+oe[a]+\"Width\",!0,i));return!r&&o>=0&&(u+=Math.max(0,Math.ceil(e[\"offset\"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o=\"border-box\"===w.css(e,\"boxSizing\",!1,r),a=o;if(We.test(i)){if(!n)return i;i=\"auto\"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),(\"auto\"===i||!parseFloat(i)&&\"inline\"===w.css(e,\"display\",!1,r))&&(i=e[\"offset\"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?\"border\":\"content\"),a,r,i)+\"px\"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&\"get\"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];\"string\"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o=\"number\"),null!=n&&n===n&&(\"number\"===o&&(n+=i&&i[3]||(w.cssNumber[s]?\"\":\"px\")),h.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(l[t]=\"inherit\"),a&&\"set\"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&\"get\"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),\"normal\"===i&&t in Ve&&(i=Ve[t]),\"\"===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each([\"height\",\"width\"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,\"display\"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a=\"border-box\"===w.css(e,\"boxSizing\",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e[\"offset\"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,\"border\",!1,o)-.5)),s&&(i=ie.exec(n))&&\"px\"!==(i[3]||\"px\")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,\"marginLeft\"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+\"px\"}),w.each({margin:\"\",padding:\"\",border:\"Width\"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o=\"string\"==typeof n?n.split(\" \"):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},\"margin\"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a<i;a++)o[t[a]]=w.css(e,t[a],!1,r);return o}return void 0!==n?w.style(e,t,n):w.css(e,t)},e,t,arguments.length>1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?\"\":\"px\")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,\"\"))&&\"auto\"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:\"swing\"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i[\"margin\"+(n=oe[r])]=i[\"padding\"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners[\"*\"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ct(e,t,n){var r,i,o,a,s,u,l,c,f=\"width\"in t||\"height\"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),y=J.get(e,\"fxshow\");n.queue||(null==(a=w._queueHooks(e,\"fx\")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,w.queue(e,\"fx\").length||a.empty.fire()})}));for(r in t)if(i=t[r],it.test(i)){if(delete t[r],o=o||\"toggle\"===i,i===(g?\"hide\":\"show\")){if(\"show\"!==i||!y||void 0===y[r])continue;g=!0}d[r]=y&&y[r]||w.style(e,r)}if((u=!w.isEmptyObject(t))||!w.isEmptyObject(d)){f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=y&&y.display)&&(l=J.get(e,\"display\")),\"none\"===(c=w.css(e,\"display\"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=w.css(e,\"display\"),fe([e]))),(\"inline\"===c||\"inline-block\"===c&&null!=l)&&\"none\"===w.css(e,\"float\")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l=\"none\"===c?\"\":c)),h.display=\"inline-block\")),n.overflow&&(h.overflow=\"hidden\",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1;for(r in d)u||(y?\"hidden\"in y&&(g=y.hidden):y=J.access(e,\"fxshow\",{display:l}),o&&(y.hidden=!g),g&&fe([e],!0),p.done(function(){g||fe([e]),J.remove(e,\"fxshow\");for(r in d)w.style(e,r,d[r])})),u=lt(g?y[r]:0,r,p),r in y||(y[r]=u.start,g&&(u.end=u.start,u.start=0))}}function ft(e,t){var n,r,i,o,a;for(n in e)if(r=G(n),i=t[r],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=w.cssHooks[r])&&\"expand\"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function pt(e,t,n){var r,i,o=0,a=pt.prefilters.length,s=w.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=nt||st(),n=Math.max(0,l.startTime+l.duration-t),r=1-(n/l.duration||0),o=0,a=l.tweens.length;o<a;o++)l.tweens[o].run(r);return s.notifyWith(e,[l,r,n]),r<1&&a?n:(a||s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:w.extend({},t),opts:w.extend(!0,{specialEasing:{},easing:w.easing._default},n),originalProperties:t,originalOptions:n,startTime:nt||st(),duration:n.duration,tweens:[],createTween:function(t,n){var r=w.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(ft(c,l.opts.specialEasing);o<a;o++)if(r=pt.prefilters[o].call(l,e,c,l.opts))return g(r.stop)&&(w._queueHooks(l.elem,l.opts.queue).stop=r.stop.bind(r)),r;return w.map(c,lt,l),g(l.opts.start)&&l.opts.start.call(e,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),w.fx.timer(w.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l}w.Animation=w.extend(pt,{tweeners:{\"*\":[function(e,t){var n=this.createTween(e,t);return ue(n.elem,e,ie.exec(t),n),n}]},tweener:function(e,t){g(e)?(t=e,e=[\"*\"]):e=e.match(M);for(var n,r=0,i=e.length;r<i;r++)n=e[r],pt.tweeners[n]=pt.tweeners[n]||[],pt.tweeners[n].unshift(t)},prefilters:[ct],prefilter:function(e,t){t?pt.prefilters.unshift(e):pt.prefilters.push(e)}}),w.speed=function(e,t,n){var r=e&&\"object\"==typeof e?w.extend({},e):{complete:n||!n&&t||g(e)&&e,duration:e,easing:n&&t||t&&!g(t)&&t};return w.fx.off?r.duration=0:\"number\"!=typeof r.duration&&(r.duration in w.fx.speeds?r.duration=w.fx.speeds[r.duration]:r.duration=w.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){g(r.old)&&r.old.call(this),r.queue&&w.dequeue(this,r.queue)},r},w.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=w.isEmptyObject(e),o=w.speed(t,n,r),a=function(){var t=pt(this,w.extend({},e),o);(i||J.get(this,\"finish\"))&&t.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return\"string\"!=typeof e&&(n=t,t=e,e=void 0),t&&!1!==e&&this.queue(e||\"fx\",[]),this.each(function(){var t=!0,i=null!=e&&e+\"queueHooks\",o=w.timers,a=J.get(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&ot.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||w.dequeue(this,e)})},finish:function(e){return!1!==e&&(e=e||\"fx\"),this.each(function(){var t,n=J.get(this),r=n[e+\"queue\"],i=n[e+\"queueHooks\"],o=w.timers,a=r?r.length:0;for(n.finish=!0,w.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),w.each([\"toggle\",\"show\",\"hide\"],function(e,t){var n=w.fn[t];w.fn[t]=function(e,r,i){return null==e||\"boolean\"==typeof e?n.apply(this,arguments):this.animate(ut(t,!0),e,r,i)}}),w.each({slideDown:ut(\"show\"),slideUp:ut(\"hide\"),slideToggle:ut(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,t){w.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),w.timers=[],w.fx.tick=function(){var e,t=0,n=w.timers;for(nt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||w.fx.stop(),nt=void 0},w.fx.timer=function(e){w.timers.push(e),w.fx.start()},w.fx.interval=13,w.fx.start=function(){rt||(rt=!0,at())},w.fx.stop=function(){rt=null},w.fx.speeds={slow:600,fast:200,_default:400},w.fn.delay=function(t,n){return t=w.fx?w.fx.speeds[t]||t:t,n=n||\"fx\",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=r.createElement(\"input\"),t=r.createElement(\"select\").appendChild(r.createElement(\"option\"));e.type=\"checkbox\",h.checkOn=\"\"!==e.value,h.optSelected=t.selected,(e=r.createElement(\"input\")).value=\"t\",e.type=\"radio\",h.radioValue=\"t\"===e.value}();var dt,ht=w.expr.attrHandle;w.fn.extend({attr:function(e,t){return z(this,w.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return\"undefined\"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+\"\"),n):i&&\"get\"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&\"radio\"===t&&N(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&\"get\"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,\"tabindex\");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{\"for\":\"htmlFor\",\"class\":\"className\"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(\" \")}function mt(e){return e.getAttribute&&e.getAttribute(\"class\")||\"\"}function xt(e){return Array.isArray(e)?e:\"string\"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&\" \"+vt(i)+\" \"){a=0;while(o=t[a++])r.indexOf(\" \"+o+\" \")<0&&(r+=o+\" \");i!==(s=vt(r))&&n.setAttribute(\"class\",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr(\"class\",\"\");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&\" \"+vt(i)+\" \"){a=0;while(o=t[a++])while(r.indexOf(\" \"+o+\" \")>-1)r=r.replace(\" \"+o+\" \",\" \");i!==(s=vt(r))&&n.setAttribute(\"class\",s)}return this},toggleClass:function(e,t){var n=typeof e,r=\"string\"===n||Array.isArray(e);return\"boolean\"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&\"boolean\"!==n||((t=mt(this))&&J.set(this,\"__className__\",t),this.setAttribute&&this.setAttribute(\"class\",t||!1===e?\"\":J.get(this,\"__className__\")||\"\"))})},hasClass:function(e){var t,n,r=0;t=\" \"+e+\" \";while(n=this[r++])if(1===n.nodeType&&(\" \"+vt(mt(n))+\" \").indexOf(t)>-1)return!0;return!1}});var bt=/\\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i=\"\":\"number\"==typeof i?i+=\"\":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?\"\":e+\"\"})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&\"set\"in t&&void 0!==t.set(this,i,\"value\")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&\"get\"in t&&void 0!==(n=t.get(i,\"value\"))?n:\"string\"==typeof(n=i.value)?n.replace(bt,\"\"):null==n?\"\":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,\"value\");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a=\"select-one\"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!N(n.parentNode,\"optgroup\"))){if(t=w(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=w.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=w.inArray(w.valHooks.option.get(r),o)>-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each([\"radio\",\"checkbox\"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})}),h.focusin=\"onfocusin\"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,\"type\")?t.type:t,x=f.call(t,\"namespace\")?t.namespace.split(\".\"):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(\".\")>-1&&(m=(x=m.split(\".\")).shift(),x.sort()),c=m.indexOf(\":\")<0&&\"on\"+m,t=t[w.expando]?t:new w.Event(m,\"object\"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join(\".\"),t.rnamespace=t.namespace?new RegExp(\"(^|\\\\.)\"+x.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,\"events\")||{})[t.type]&&J.get(s,\"handle\"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\\?/;w.parseXML=function(t){var n;if(!t||\"string\"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,\"text/xml\")}catch(e){n=void 0}return n&&!n.getElementsByTagName(\"parsererror\").length||w.error(\"Invalid XML: \"+t),n};var St=/\\[\\]$/,Dt=/\\r?\\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+\"[\"+(\"object\"==typeof i&&null!=i?t:\"\")+\"]\",i,n,r)});else if(n||\"object\"!==x(t))r(e,t);else for(i in t)jt(e+\"[\"+i+\"]\",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(null==n?\"\":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join(\"&\")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,\"elements\");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(\":disabled\")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,\"\\r\\n\")}}):{name:t.name,value:n.replace(Dt,\"\\r\\n\")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\\/\\//,It={},Wt={},$t=\"*/\".concat(\"*\"),Bt=r.createElement(\"a\");Bt.href=Ct.href;function Ft(e){return function(t,n){\"string\"!=typeof t&&(n=t,t=\"*\");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])\"+\"===r[0]?(r=r.slice(1)||\"*\",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return\"string\"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i[\"*\"]&&a(\"*\")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while(\"*\"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+\" \"+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if(\"*\"===o)o=u;else if(\"*\"!==u&&u!==o){if(!(a=l[u+\" \"+o]||l[\"* \"+o]))for(i in l)if((s=i.split(\" \"))[1]===o&&(a=l[u+\" \"+s[0]]||l[\"* \"+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e[\"throws\"])t=a(t);else try{t=a(t)}catch(e){return{state:\"parsererror\",error:a?e:\"No conversion from \"+u+\" to \"+o}}}return{state:\"success\",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:\"GET\",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":$t,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){\"object\"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks(\"once memory\"),x=h.statusCode||{},b={},T={},C=\"canceled\",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+\"\").replace(Rt,Ct.protocol+\"//\"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||\"*\").toLowerCase().match(M)||[\"\"],null==h.crossDomain){l=r.createElement(\"a\");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+\"//\"+Bt.host!=l.protocol+\"//\"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&\"string\"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger(\"ajaxStart\"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,\"\"),h.hasContent?h.data&&h.processData&&0===(h.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(h.data=h.data.replace(qt,\"+\")):(d=h.url.slice(o.length),h.data&&(h.processData||\"string\"==typeof h.data)&&(o+=(kt.test(o)?\"&\":\"?\")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,\"$1\"),d=(kt.test(o)?\"&\":\"?\")+\"_=\"+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader(\"If-Modified-Since\",w.lastModified[o]),w.etag[o]&&E.setRequestHeader(\"If-None-Match\",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader(\"Content-Type\",h.contentType),E.setRequestHeader(\"Accept\",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+(\"*\"!==h.dataTypes[0]?\", \"+$t+\"; q=0.01\":\"\"):h.accepts[\"*\"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C=\"abort\",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger(\"ajaxSend\",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort(\"timeout\")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,\"No Transport\");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||\"\",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader(\"Last-Modified\"))&&(w.lastModified[o]=T),(T=E.getResponseHeader(\"etag\"))&&(w.etag[o]=T)),204===t||\"HEAD\"===h.type?C=\"nocontent\":304===t?C=\"notmodified\":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C=\"error\",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+\"\",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?\"ajaxSuccess\":\"ajaxError\",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger(\"ajaxComplete\",[E,h]),--w.active||w.event.trigger(\"ajaxStop\")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,\"json\")},getScript:function(e,t){return w.get(e,void 0,t,\"script\")}}),w.each([\"get\",\"post\"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,\"throws\":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not(\"body\").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&\"withCredentials\"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i[\"X-Requested-With\"]||(i[\"X-Requested-With\"]=\"XMLHttpRequest\");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,\"abort\"===e?s.abort():\"error\"===e?\"number\"!=typeof s.status?o(0,\"error\"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,\"text\"!==(s.responseType||\"text\")||\"string\"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n(\"error\"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n(\"abort\");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter(\"script\",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),w.ajaxTransport(\"script\",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(\"<script>\").prop({charset:e.scriptCharset,src:e.url}).on(\"load error\",n=function(e){t.remove(),n=null,e&&o(\"error\"===e.type?404:200,e.type)}),r.head.appendChild(t[0])},abort:function(){n&&n()}}}});var Yt=[],Qt=/(=)\\?(?=&|$)|\\?\\?/;w.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=Yt.pop()||w.expando+\"_\"+Et++;return this[e]=!0,e}}),w.ajaxPrefilter(\"json jsonp\",function(t,n,r){var i,o,a,s=!1!==t.jsonp&&(Qt.test(t.url)?\"url\":\"string\"==typeof t.data&&0===(t.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Qt.test(t.data)&&\"data\");if(s||\"jsonp\"===t.dataTypes[0])return i=t.jsonpCallback=g(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(Qt,\"$1\"+i):!1!==t.jsonp&&(t.url+=(kt.test(t.url)?\"&\":\"?\")+t.jsonp+\"=\"+i),t.converters[\"script json\"]=function(){return a||w.error(i+\" was not called\"),a[0]},t.dataTypes[0]=\"json\",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?w(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,Yt.push(i)),a&&g(o)&&o(a[0]),a=o=void 0}),\"script\"}),h.createHTMLDocument=function(){var e=r.implementation.createHTMLDocument(\"\").body;return e.innerHTML=\"<form></form><form></form>\",2===e.childNodes.length}(),w.parseHTML=function(e,t,n){if(\"string\"!=typeof e)return[];\"boolean\"==typeof t&&(n=t,t=!1);var i,o,a;return t||(h.createHTMLDocument?((i=(t=r.implementation.createHTMLDocument(\"\")).createElement(\"base\")).href=r.location.href,t.head.appendChild(i)):t=r),o=A.exec(e),a=!n&&[],o?[t.createElement(o[1])]:(o=xe([e],t,a),a&&a.length&&w(a).remove(),w.merge([],o.childNodes))},w.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(\" \");return s>-1&&(r=vt(e.slice(s)),e=e.slice(0,s)),g(t)?(n=t,t=void 0):t&&\"object\"==typeof t&&(i=\"POST\"),a.length>0&&w.ajax({url:e,type:i||\"GET\",dataType:\"html\",data:t}).done(function(e){o=arguments,a.html(r?w(\"<div>\").append(w.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},w.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){w.fn[t]=function(e){return this.on(t,e)}}),w.expr.pseudos.animated=function(e){return w.grep(w.timers,function(t){return e===t.elem}).length},w.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=w.css(e,\"position\"),f=w(e),p={};\"static\"===c&&(e.style.position=\"relative\"),s=f.offset(),o=w.css(e,\"top\"),u=w.css(e,\"left\"),(l=(\"absolute\"===c||\"fixed\"===c)&&(o+u).indexOf(\"auto\")>-1)?(a=(r=f.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),g(t)&&(t=t.call(e,n,w.extend({},s))),null!=t.top&&(p.top=t.top-s.top+a),null!=t.left&&(p.left=t.left-s.left+i),\"using\"in t?t.using.call(e,p):f.css(p)}},w.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){w.offset.setOffset(this,e,t)});var t,n,r=this[0];if(r)return r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if(\"fixed\"===w.css(r,\"position\"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&\"static\"===w.css(e,\"position\"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=w(e).offset()).top+=w.css(e,\"borderTopWidth\",!0),i.left+=w.css(e,\"borderLeftWidth\",!0))}return{top:t.top-i.top-w.css(r,\"marginTop\",!0),left:t.left-i.left-w.css(r,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&\"static\"===w.css(e,\"position\"))e=e.offsetParent;return e||be})}}),w.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(e,t){var n=\"pageYOffset\"===t;w.fn[e]=function(r){return z(this,function(e,r,i){var o;if(y(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),w.each([\"top\",\"left\"],function(e,t){w.cssHooks[t]=_e(h.pixelPosition,function(e,n){if(n)return n=Fe(e,t),We.test(n)?w(e).position()[t]+\"px\":n})}),w.each({Height:\"height\",Width:\"width\"},function(e,t){w.each({padding:\"inner\"+e,content:t,\"\":\"outer\"+e},function(n,r){w.fn[r]=function(i,o){var a=arguments.length&&(n||\"boolean\"!=typeof i),s=n||(!0===i||!0===o?\"margin\":\"border\");return z(this,function(t,n,i){var o;return y(t)?0===r.indexOf(\"outer\")?t[\"inner\"+e]:t.document.documentElement[\"client\"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body[\"scroll\"+e],o[\"scroll\"+e],t.body[\"offset\"+e],o[\"offset\"+e],o[\"client\"+e])):void 0===i?w.css(t,n,s):w.style(t,n,i,s)},t,a?i:void 0,a)}})}),w.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}}),w.proxy=function(e,t){var n,r,i;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=N,w.isFunction=g,w.isWindow=y,w.camelCase=G,w.type=x,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return w});var Jt=e.jQuery,Kt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=Kt),t&&e.jQuery===w&&(e.jQuery=Jt),w},t||(e.jQuery=e.$=w),w});"),
35
        }
36
        file7 := &embedded.EmbeddedFile{
37
                Filename:    "main.js",
38
                FileModTime: time.Unix(1538866330, 0),
39
                Content:     string("/*\n * Statup\n * Copyright (C) 2018.  Hunter Long and the project contributors\n * Written by Hunter Long <info@socialeck.com> and the project contributors\n *\n * https://github.com/hunterlong/statup\n *\n * The licenses for most software and other practical works are designed\n * to take away your freedom to share and change the works.  By contrast,\n * the GNU General Public License is intended to guarantee your freedom to\n * share and change all versions of a program--to make sure it remains free\n * software for all its users.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n\n$('.service_li').on('click', function() {\n    var id = $(this).attr('data-id');\n    var position = $('#service_id_' + id).offset();\n    window.scroll(0, position.top - 23);\n    return false;\n});\n\n$('.test_notifier').on('click', function(e) {\n    var btn = $(this);\n    var form = $(this).parents('form:first');\n    var values = form.serialize();\n    var notifier = form.find('input[name=notifier]').val();\n    var success = $('#'+notifier+'-success');\n    var error = $('#'+notifier+'-error');\n    btn.prop(\"disabled\", true);\n    $.ajax({\n        url: form.attr(\"action\")+\"/test\",\n        type: 'POST',\n        data: values,\n        success: function(data) {\n          if (data === 'ok') {\n              success.removeClass('d-none');\n              setTimeout(function() {\n                  success.addClass('d-none');\n              }, 5000)\n          } else {\n              error.removeClass('d-none');\n              error.html(data);\n              setTimeout(function() {\n                  error.addClass('d-none');\n              }, 8000)\n          }\n            btn.prop(\"disabled\", false);\n        }\n    });\n    e.preventDefault();\n});\n\n$('form').submit(function() {\n    console.log(this);\n    $(this).find('button[type=submit]').prop('disabled', true);\n});\n\n$('select#service_type').on('change', function() {\n    var selected = $('#service_type option:selected').val();\n    if (selected === 'tcp' || selected === 'udp') {\n        $('#service_port').parent().parent().removeClass('d-none');\n        $('#service_check_type').parent().parent().addClass('d-none');\n        $('#service_url').attr('placeholder', 'localhost');\n\n        $('#post_data').parent().parent().addClass('d-none');\n        $('#service_response').parent().parent().addClass('d-none');\n        $('#service_response_code').parent().parent().addClass('d-none');\n    } else {\n        $('#post_data').parent().parent().removeClass('d-none');\n        $('#service_response').parent().parent().removeClass('d-none');\n        $('#service_response_code').parent().parent().removeClass('d-none');\n        $('#service_check_type').parent().parent().removeClass('d-none');\n        $('#service_url').attr('placeholder', 'https://google.com');\n\n        $('#service_port').parent().parent().addClass('d-none');\n    }\n\n});\n\nfunction AjaxChart(chart, service, start=0, end=9999999999, group=\"hour\") {\n  $.ajax({\n    url: \"/api/services/\"+service+\"/data?start=\"+start+\"&end=\"+end+\"&group=\"+group,\n    type: 'GET',\n    success: function(data) {\n      chart.data.labels.pop();\n      data.data.forEach(function(d) {\n        chart.data.datasets[0].data.push(d);\n      });\n      chart.update();\n    }\n  });\n}\n\nfunction PingAjaxChart(chart, service, start=0, end=9999999999, group=\"hour\") {\n  $.ajax({\n    url: \"/api/services/\"+service+\"/ping?start=\"+start+\"&end=\"+end+\"&group=\"+group,\n    type: 'GET',\n    success: function(data) {\n      chart.data.labels.pop();\n      chart.data.datasets.push({\n        label: \"Ping Time\",\n        backgroundColor: \"#bababa\"\n      });\n      chart.update();\n      data.data.forEach(function(d) {\n        chart.data.datasets[1].data.push(d);\n      });\n      chart.update();\n    }\n  });\n}\n\n$('select#service_check_type').on('change', function() {\n    var selected = $('#service_check_type option:selected').val();\n    if (selected === 'POST') {\n        $('#post_data').parent().parent().removeClass('d-none');\n    } else {\n        $('#post_data').parent().parent().addClass('d-none');\n    }\n});\n\n\n$(function() {\n    var pathname = window.location.pathname;\n    if (pathname === '/logs') {\n        var lastline;\n        var logArea = $('#live_logs');\n        setInterval(function() {\n            $.get('/logs/line', function(data, status) {\n                if (lastline !== data) {\n                    var curr = $.trim(logArea.text());\n                    var line = data.replace(/(\\r\\n|\\n|\\r)/gm, ' ');\n                    line = line + '\\n';\n                    logArea.text(line + curr);\n                    lastline = data;\n                }\n            });\n        }, 200);\n    }\n});\n\n\n$('.confirm-btn').on('click', function() {\n    var r = confirm('Are you sure you want to delete?');\n    if (r === true) {\n        return true;\n    } else {\n        return false;\n    }\n});\n\n\n$('.select-input').on('click', function() {\n    $(this).select();\n});\n\n\n// $('input[name=password], input[name=password_confirm]').on('change keyup input paste', function() {\n//     var password = $('input[name=password]'),\n//         repassword = $('input[name=password_confirm]'),\n//         both = password.add(repassword).removeClass('is-valid is-invalid');\n//\n//     var btn = $(this).parents('form:first').find('button[type=submit]');\n//     password.addClass(\n//         password.val().length > 0 ? 'is-valid' : 'is-invalid'\n//     );\n//     repassword.addClass(\n//         password.val().length > 0 ? 'is-valid' : 'is-invalid'\n//     );\n//\n//     if (password.val() !== repassword.val()) {\n//         both.addClass('is-invalid');\n//         btn.prop('disabled', true);\n//     } else {\n//         btn.prop('disabled', false);\n//     }\n// });\n\n\nvar ranVar = false;\nvar ranTheme = false;\nvar ranMobile = false;\n$('a[data-toggle=pill]').on('shown.bs.tab', function(e) {\n    var target = $(e.target).attr('href');\n    if (target === '#v-pills-style' && !ranVar) {\n        var sass_vars = CodeMirror.fromTextArea(document.getElementById('sass_vars'), {\n            lineNumbers: true,\n            matchBrackets: true,\n            mode: 'text/x-scss',\n            colorpicker: true\n        });\n        sass_vars.setSize(null, 900);\n        ranVar = true;\n    } else if (target === '#pills-theme' && !ranTheme) {\n        var theme_css = CodeMirror.fromTextArea(document.getElementById('theme_css'), {\n            lineNumbers: true,\n            matchBrackets: true,\n            mode: 'text/x-scss',\n            colorpicker: true\n        });\n        theme_css.setSize(null, 900);\n        ranTheme = true;\n    } else if (target === '#pills-mobile' && !ranMobile) {\n        var mobile_css = CodeMirror.fromTextArea(document.getElementById('mobile_css'), {\n            lineNumbers: true,\n            matchBrackets: true,\n            mode: 'text/x-scss',\n            colorpicker: true\n        });\n        mobile_css.setSize(null, 900);\n        ranMobile = true;\n    }\n});\n"),
40
        }
41
        file8 := &embedded.EmbeddedFile{
42
                Filename:    "pikaday.js",
43
                FileModTime: time.Unix(1537243030, 0),
44
                Content:     string("/*!\n * Pikaday\n *\n * Copyright © 2014 David Bushell | BSD & MIT license | https://github.com/dbushell/Pikaday\n */\n\n(function (root, factory)\n{\n  'use strict';\n\n  var moment;\n  if (typeof exports === 'object') {\n    // CommonJS module\n    // Load moment.js as an optional dependency\n    try { moment = require('moment'); } catch (e) {}\n    module.exports = factory(moment);\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define(function (req)\n    {\n      // Load moment.js as an optional dependency\n      var id = 'moment';\n      try { moment = req(id); } catch (e) {}\n      return factory(moment);\n    });\n  } else {\n    root.Pikaday = factory(root.moment);\n  }\n}(this, function (moment)\n{\n  'use strict';\n\n  /**\n   * feature detection and helper functions\n   */\n  var hasMoment = typeof moment === 'function',\n\n    hasEventListeners = !!window.addEventListener,\n\n    document = window.document,\n\n    sto = window.setTimeout,\n\n    addEvent = function(el, e, callback, capture)\n    {\n      if (hasEventListeners) {\n        el.addEventListener(e, callback, !!capture);\n      } else {\n        el.attachEvent('on' + e, callback);\n      }\n    },\n\n    removeEvent = function(el, e, callback, capture)\n    {\n      if (hasEventListeners) {\n        el.removeEventListener(e, callback, !!capture);\n      } else {\n        el.detachEvent('on' + e, callback);\n      }\n    },\n\n    trim = function(str)\n    {\n      return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g,'');\n    },\n\n    hasClass = function(el, cn)\n    {\n      return (' ' + el.className + ' ').indexOf(' ' + cn + ' ') !== -1;\n    },\n\n    addClass = function(el, cn)\n    {\n      if (!hasClass(el, cn)) {\n        el.className = (el.className === '') ? cn : el.className + ' ' + cn;\n      }\n    },\n\n    removeClass = function(el, cn)\n    {\n      el.className = trim((' ' + el.className + ' ').replace(' ' + cn + ' ', ' '));\n    },\n\n    isArray = function(obj)\n    {\n      return (/Array/).test(Object.prototype.toString.call(obj));\n    },\n\n    isDate = function(obj)\n    {\n      return (/Date/).test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime());\n    },\n\n    isWeekend = function(date)\n    {\n      var day = date.getDay();\n      return day === 0 || day === 6;\n    },\n\n    isLeapYear = function(year)\n    {\n      // solution by Matti Virkkunen: http://stackoverflow.com/a/4881951\n      return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;\n    },\n\n    getDaysInMonth = function(year, month)\n    {\n      return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n    },\n\n    setToStartOfDay = function(date)\n    {\n      if (isDate(date)) date.setHours(0,0,0,0);\n    },\n\n    compareDates = function(a,b)\n    {\n      // weak date comparison (use setToStartOfDay(date) to ensure correct result)\n      return a.getTime() === b.getTime();\n    },\n\n    extend = function(to, from, overwrite)\n    {\n      var prop, hasProp;\n      for (prop in from) {\n        hasProp = to[prop] !== undefined;\n        if (hasProp && typeof from[prop] === 'object' && from[prop] !== null && from[prop].nodeName === undefined) {\n          if (isDate(from[prop])) {\n            if (overwrite) {\n              to[prop] = new Date(from[prop].getTime());\n            }\n          }\n          else if (isArray(from[prop])) {\n            if (overwrite) {\n              to[prop] = from[prop].slice(0);\n            }\n          } else {\n            to[prop] = extend({}, from[prop], overwrite);\n          }\n        } else if (overwrite || !hasProp) {\n          to[prop] = from[prop];\n        }\n      }\n      return to;\n    },\n\n    fireEvent = function(el, eventName, data)\n    {\n      var ev;\n\n      if (document.createEvent) {\n        ev = document.createEvent('HTMLEvents');\n        ev.initEvent(eventName, true, false);\n        ev = extend(ev, data);\n        el.dispatchEvent(ev);\n      } else if (document.createEventObject) {\n        ev = document.createEventObject();\n        ev = extend(ev, data);\n        el.fireEvent('on' + eventName, ev);\n      }\n    },\n\n    adjustCalendar = function(calendar) {\n      if (calendar.month < 0) {\n        calendar.year -= Math.ceil(Math.abs(calendar.month)/12);\n        calendar.month += 12;\n      }\n      if (calendar.month > 11) {\n        calendar.year += Math.floor(Math.abs(calendar.month)/12);\n        calendar.month -= 12;\n      }\n      return calendar;\n    },\n\n    /**\n     * defaults and localisation\n     */\n    defaults = {\n\n      // bind the picker to a form field\n      field: null,\n\n      // automatically show/hide the picker on `field` focus (default `true` if `field` is set)\n      bound: undefined,\n\n      // data-attribute on the input field with an aria assistance tekst (only applied when `bound` is set)\n      ariaLabel: 'Use the arrow keys to pick a date',\n\n      // position of the datepicker, relative to the field (default to bottom & left)\n      // ('bottom' & 'left' keywords are not used, 'top' & 'right' are modifier on the bottom/left position)\n      position: 'bottom left',\n\n      // automatically fit in the viewport even if it means repositioning from the position option\n      reposition: true,\n\n      // the default output format for `.toString()` and `field` value\n      format: 'YYYY-MM-DD',\n\n      // the toString function which gets passed a current date object and format\n      // and returns a string\n      toString: null,\n\n      // used to create date object from current input string\n      parse: null,\n\n      // the initial date to view when first opened\n      defaultDate: null,\n\n      // make the `defaultDate` the initial selected value\n      setDefaultDate: false,\n\n      // first day of week (0: Sunday, 1: Monday etc)\n      firstDay: 0,\n\n      // the default flag for moment's strict date parsing\n      formatStrict: false,\n\n      // the minimum/earliest date that can be selected\n      minDate: null,\n      // the maximum/latest date that can be selected\n      maxDate: null,\n\n      // number of years either side, or array of upper/lower range\n      yearRange: 10,\n\n      // show week numbers at head of row\n      showWeekNumber: false,\n\n      // Week picker mode\n      pickWholeWeek: false,\n\n      // used internally (don't config outside)\n      minYear: 0,\n      maxYear: 9999,\n      minMonth: undefined,\n      maxMonth: undefined,\n\n      startRange: null,\n      endRange: null,\n\n      isRTL: false,\n\n      // Additional text to append to the year in the calendar title\n      yearSuffix: '',\n\n      // Render the month after year in the calendar title\n      showMonthAfterYear: false,\n\n      // Render days of the calendar grid that fall in the next or previous month\n      showDaysInNextAndPreviousMonths: false,\n\n      // Allows user to select days that fall in the next or previous month\n      enableSelectionDaysInNextAndPreviousMonths: false,\n\n      // how many months are visible\n      numberOfMonths: 1,\n\n      // when numberOfMonths is used, this will help you to choose where the main calendar will be (default `left`, can be set to `right`)\n      // only used for the first display or when a selected date is not visible\n      mainCalendar: 'left',\n\n      // Specify a DOM element to render the calendar in\n      container: undefined,\n\n      // Blur field when date is selected\n      blurFieldOnSelect : true,\n\n      // internationalization\n      i18n: {\n        previousMonth : 'Previous Month',\n        nextMonth     : 'Next Month',\n        months        : ['January','February','March','April','May','June','July','August','September','October','November','December'],\n        weekdays      : ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],\n        weekdaysShort : ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']\n      },\n\n      // Theme Classname\n      theme: null,\n\n      // events array\n      events: [],\n\n      // callback function\n      onSelect: null,\n      onOpen: null,\n      onClose: null,\n      onDraw: null,\n\n      // Enable keyboard input\n      keyboardInput: true\n    },\n\n\n    /**\n     * templating functions to abstract HTML rendering\n     */\n    renderDayName = function(opts, day, abbr)\n    {\n      day += opts.firstDay;\n      while (day >= 7) {\n        day -= 7;\n      }\n      return abbr ? opts.i18n.weekdaysShort[day] : opts.i18n.weekdays[day];\n    },\n\n    renderDay = function(opts)\n    {\n      var arr = [];\n      var ariaSelected = 'false';\n      if (opts.isEmpty) {\n        if (opts.showDaysInNextAndPreviousMonths) {\n          arr.push('is-outside-current-month');\n\n          if(!opts.enableSelectionDaysInNextAndPreviousMonths) {\n            arr.push('is-selection-disabled');\n          }\n\n        } else {\n          return '<td class=\"is-empty\"></td>';\n        }\n      }\n      if (opts.isDisabled) {\n        arr.push('is-disabled');\n      }\n      if (opts.isToday) {\n        arr.push('is-today');\n      }\n      if (opts.isSelected) {\n        arr.push('is-selected');\n        ariaSelected = 'true';\n      }\n      if (opts.hasEvent) {\n        arr.push('has-event');\n      }\n      if (opts.isInRange) {\n        arr.push('is-inrange');\n      }\n      if (opts.isStartRange) {\n        arr.push('is-startrange');\n      }\n      if (opts.isEndRange) {\n        arr.push('is-endrange');\n      }\n      return '<td data-day=\"' + opts.day + '\" class=\"' + arr.join(' ') + '\" aria-selected=\"' + ariaSelected + '\">' +\n        '<button class=\"pika-button pika-day\" type=\"button\" ' +\n        'data-pika-year=\"' + opts.year + '\" data-pika-month=\"' + opts.month + '\" data-pika-day=\"' + opts.day + '\">' +\n        opts.day +\n        '</button>' +\n        '</td>';\n    },\n\n    renderWeek = function (d, m, y) {\n      // Lifted from http://javascript.about.com/library/blweekyear.htm, lightly modified.\n      var onejan = new Date(y, 0, 1),\n        weekNum = Math.ceil((((new Date(y, m, d) - onejan) / 86400000) + onejan.getDay()+1)/7);\n      return '<td class=\"pika-week\">' + weekNum + '</td>';\n    },\n\n    renderRow = function(days, isRTL, pickWholeWeek, isRowSelected)\n    {\n      return '<tr class=\"pika-row' + (pickWholeWeek ? ' pick-whole-week' : '') + (isRowSelected ? ' is-selected' : '') + '\">' + (isRTL ? days.reverse() : days).join('') + '</tr>';\n    },\n\n    renderBody = function(rows)\n    {\n      return '<tbody>' + rows.join('') + '</tbody>';\n    },\n\n    renderHead = function(opts)\n    {\n      var i, arr = [];\n      if (opts.showWeekNumber) {\n        arr.push('<th></th>');\n      }\n      for (i = 0; i < 7; i++) {\n        arr.push('<th scope=\"col\"><abbr title=\"' + renderDayName(opts, i) + '\">' + renderDayName(opts, i, true) + '</abbr></th>');\n      }\n      return '<thead><tr>' + (opts.isRTL ? arr.reverse() : arr).join('') + '</tr></thead>';\n    },\n\n    renderTitle = function(instance, c, year, month, refYear, randId)\n    {\n      var i, j, arr,\n        opts = instance._o,\n        isMinYear = year === opts.minYear,\n        isMaxYear = year === opts.maxYear,\n        html = '<div id=\"' + randId + '\" class=\"pika-title\" role=\"heading\" aria-live=\"assertive\">',\n        monthHtml,\n        yearHtml,\n        prev = true,\n        next = true;\n\n      for (arr = [], i = 0; i < 12; i++) {\n        arr.push('<option value=\"' + (year === refYear ? i - c : 12 + i - c) + '\"' +\n          (i === month ? ' selected=\"selected\"': '') +\n          ((isMinYear && i < opts.minMonth) || (isMaxYear && i > opts.maxMonth) ? 'disabled=\"disabled\"' : '') + '>' +\n          opts.i18n.months[i] + '</option>');\n      }\n\n      monthHtml = '<div class=\"pika-label\">' + opts.i18n.months[month] + '<select class=\"pika-select pika-select-month\" tabindex=\"-1\">' + arr.join('') + '</select></div>';\n\n      if (isArray(opts.yearRange)) {\n        i = opts.yearRange[0];\n        j = opts.yearRange[1] + 1;\n      } else {\n        i = year - opts.yearRange;\n        j = 1 + year + opts.yearRange;\n      }\n\n      for (arr = []; i < j && i <= opts.maxYear; i++) {\n        if (i >= opts.minYear) {\n          arr.push('<option value=\"' + i + '\"' + (i === year ? ' selected=\"selected\"': '') + '>' + (i) + '</option>');\n        }\n      }\n      yearHtml = '<div class=\"pika-label\">' + year + opts.yearSuffix + '<select class=\"pika-select pika-select-year\" tabindex=\"-1\">' + arr.join('') + '</select></div>';\n\n      if (opts.showMonthAfterYear) {\n        html += yearHtml + monthHtml;\n      } else {\n        html += monthHtml + yearHtml;\n      }\n\n      if (isMinYear && (month === 0 || opts.minMonth >= month)) {\n        prev = false;\n      }\n\n      if (isMaxYear && (month === 11 || opts.maxMonth <= month)) {\n        next = false;\n      }\n\n      if (c === 0) {\n        html += '<button class=\"pika-prev' + (prev ? '' : ' is-disabled') + '\" type=\"button\">' + opts.i18n.previousMonth + '</button>';\n      }\n      if (c === (instance._o.numberOfMonths - 1) ) {\n        html += '<button class=\"pika-next' + (next ? '' : ' is-disabled') + '\" type=\"button\">' + opts.i18n.nextMonth + '</button>';\n      }\n\n      return html += '</div>';\n    },\n\n    renderTable = function(opts, data, randId)\n    {\n      return '<table cellpadding=\"0\" cellspacing=\"0\" class=\"pika-table\" role=\"grid\" aria-labelledby=\"' + randId + '\">' + renderHead(opts) + renderBody(data) + '</table>';\n    },\n\n\n    /**\n     * Pikaday constructor\n     */\n    Pikaday = function(options)\n    {\n      var self = this,\n        opts = self.config(options);\n\n      self._onMouseDown = function(e)\n      {\n        if (!self._v) {\n          return;\n        }\n        e = e || window.event;\n        var target = e.target || e.srcElement;\n        if (!target) {\n          return;\n        }\n\n        if (!hasClass(target, 'is-disabled')) {\n          if (hasClass(target, 'pika-button') && !hasClass(target, 'is-empty') && !hasClass(target.parentNode, 'is-disabled')) {\n            self.setDate(new Date(target.getAttribute('data-pika-year'), target.getAttribute('data-pika-month'), target.getAttribute('data-pika-day')));\n            if (opts.bound) {\n              sto(function() {\n                self.hide();\n                if (opts.blurFieldOnSelect && opts.field) {\n                  opts.field.blur();\n                }\n              }, 100);\n            }\n          }\n          else if (hasClass(target, 'pika-prev')) {\n            self.prevMonth();\n          }\n          else if (hasClass(target, 'pika-next')) {\n            self.nextMonth();\n          }\n        }\n        if (!hasClass(target, 'pika-select')) {\n          // if this is touch event prevent mouse events emulation\n          if (e.preventDefault) {\n            e.preventDefault();\n          } else {\n            e.returnValue = false;\n            return false;\n          }\n        } else {\n          self._c = true;\n        }\n      };\n\n      self._onChange = function(e)\n      {\n        e = e || window.event;\n        var target = e.target || e.srcElement;\n        if (!target) {\n          return;\n        }\n        if (hasClass(target, 'pika-select-month')) {\n          self.gotoMonth(target.value);\n        }\n        else if (hasClass(target, 'pika-select-year')) {\n          self.gotoYear(target.value);\n        }\n      };\n\n      self._onKeyChange = function(e)\n      {\n        e = e || window.event;\n\n        if (self.isVisible()) {\n\n          switch(e.keyCode){\n            case 13:\n            case 27:\n              if (opts.field) {\n                opts.field.blur();\n              }\n              break;\n            case 37:\n              e.preventDefault();\n              self.adjustDate('subtract', 1);\n              break;\n            case 38:\n              self.adjustDate('subtract', 7);\n              break;\n            case 39:\n              self.adjustDate('add', 1);\n              break;\n            case 40:\n              self.adjustDate('add', 7);\n              break;\n          }\n        }\n      };\n\n      self._onInputChange = function(e)\n      {\n        var date;\n\n        if (e.firedBy === self) {\n          return;\n        }\n        if (opts.parse) {\n          date = opts.parse(opts.field.value, opts.format);\n        } else if (hasMoment) {\n          date = moment(opts.field.value, opts.format, opts.formatStrict);\n          date = (date && date.isValid()) ? date.toDate() : null;\n        }\n        else {\n          date = new Date(Date.parse(opts.field.value));\n        }\n        if (isDate(date)) {\n          self.setDate(date);\n        }\n        if (!self._v) {\n          self.show();\n        }\n      };\n\n      self._onInputFocus = function()\n      {\n        self.show();\n      };\n\n      self._onInputClick = function()\n      {\n        self.show();\n      };\n\n      self._onInputBlur = function()\n      {\n        // IE allows pika div to gain focus; catch blur the input field\n        var pEl = document.activeElement;\n        do {\n          if (hasClass(pEl, 'pika-single')) {\n            return;\n          }\n        }\n        while ((pEl = pEl.parentNode));\n\n        if (!self._c) {\n          self._b = sto(function() {\n            self.hide();\n          }, 50);\n        }\n        self._c = false;\n      };\n\n      self._onClick = function(e)\n      {\n        e = e || window.event;\n        var target = e.target || e.srcElement,\n          pEl = target;\n        if (!target) {\n          return;\n        }\n        if (!hasEventListeners && hasClass(target, 'pika-select')) {\n          if (!target.onchange) {\n            target.setAttribute('onchange', 'return;');\n            addEvent(target, 'change', self._onChange);\n          }\n        }\n        do {\n          if (hasClass(pEl, 'pika-single') || pEl === opts.trigger) {\n            return;\n          }\n        }\n        while ((pEl = pEl.parentNode));\n        if (self._v && target !== opts.trigger && pEl !== opts.trigger) {\n          self.hide();\n        }\n      };\n\n      self.el = document.createElement('div');\n      self.el.className = 'pika-single' + (opts.isRTL ? ' is-rtl' : '') + (opts.theme ? ' ' + opts.theme : '');\n\n      addEvent(self.el, 'mousedown', self._onMouseDown, true);\n      addEvent(self.el, 'touchend', self._onMouseDown, true);\n      addEvent(self.el, 'change', self._onChange);\n\n      if (opts.keyboardInput) {\n        addEvent(document, 'keydown', self._onKeyChange);\n      }\n\n      if (opts.field) {\n        if (opts.container) {\n          opts.container.appendChild(self.el);\n        } else if (opts.bound) {\n          document.body.appendChild(self.el);\n        } else {\n          opts.field.parentNode.insertBefore(self.el, opts.field.nextSibling);\n        }\n        addEvent(opts.field, 'change', self._onInputChange);\n\n        if (!opts.defaultDate) {\n          if (hasMoment && opts.field.value) {\n            opts.defaultDate = moment(opts.field.value, opts.format).toDate();\n          } else {\n            opts.defaultDate = new Date(Date.parse(opts.field.value));\n          }\n          opts.setDefaultDate = true;\n        }\n      }\n\n      var defDate = opts.defaultDate;\n\n      if (isDate(defDate)) {\n        if (opts.setDefaultDate) {\n          self.setDate(defDate, true);\n        } else {\n          self.gotoDate(defDate);\n        }\n      } else {\n        self.gotoDate(new Date());\n      }\n\n      if (opts.bound) {\n        this.hide();\n        self.el.className += ' is-bound';\n        addEvent(opts.trigger, 'click', self._onInputClick);\n        addEvent(opts.trigger, 'focus', self._onInputFocus);\n        addEvent(opts.trigger, 'blur', self._onInputBlur);\n      } else {\n        this.show();\n      }\n    };\n\n\n  /**\n   * public Pikaday API\n   */\n  Pikaday.prototype = {\n\n\n    /**\n     * configure functionality\n     */\n    config: function(options)\n    {\n      if (!this._o) {\n        this._o = extend({}, defaults, true);\n      }\n\n      var opts = extend(this._o, options, true);\n\n      opts.isRTL = !!opts.isRTL;\n\n      opts.field = (opts.field && opts.field.nodeName) ? opts.field : null;\n\n      opts.theme = (typeof opts.theme) === 'string' && opts.theme ? opts.theme : null;\n\n      opts.bound = !!(opts.bound !== undefined ? opts.field && opts.bound : opts.field);\n\n      opts.trigger = (opts.trigger && opts.trigger.nodeName) ? opts.trigger : opts.field;\n\n      opts.disableWeekends = !!opts.disableWeekends;\n\n      opts.disableDayFn = (typeof opts.disableDayFn) === 'function' ? opts.disableDayFn : null;\n\n      var nom = parseInt(opts.numberOfMonths, 10) || 1;\n      opts.numberOfMonths = nom > 4 ? 4 : nom;\n\n      if (!isDate(opts.minDate)) {\n        opts.minDate = false;\n      }\n      if (!isDate(opts.maxDate)) {\n        opts.maxDate = false;\n      }\n      if ((opts.minDate && opts.maxDate) && opts.maxDate < opts.minDate) {\n        opts.maxDate = opts.minDate = false;\n      }\n      if (opts.minDate) {\n        this.setMinDate(opts.minDate);\n      }\n      if (opts.maxDate) {\n        this.setMaxDate(opts.maxDate);\n      }\n\n      if (isArray(opts.yearRange)) {\n        var fallback = new Date().getFullYear() - 10;\n        opts.yearRange[0] = parseInt(opts.yearRange[0], 10) || fallback;\n        opts.yearRange[1] = parseInt(opts.yearRange[1], 10) || fallback;\n      } else {\n        opts.yearRange = Math.abs(parseInt(opts.yearRange, 10)) || defaults.yearRange;\n        if (opts.yearRange > 100) {\n          opts.yearRange = 100;\n        }\n      }\n\n      return opts;\n    },\n\n    /**\n     * return a formatted string of the current selection (using Moment.js if available)\n     */\n    toString: function(format)\n    {\n      format = format || this._o.format;\n      if (!isDate(this._d)) {\n        return '';\n      }\n      if (this._o.toString) {\n        return this._o.toString(this._d, format);\n      }\n      if (hasMoment) {\n        return moment(this._d).format(format);\n      }\n      return this._d.toDateString();\n    },\n\n    /**\n     * return a Moment.js object of the current selection (if available)\n     */\n    getMoment: function()\n    {\n      return hasMoment ? moment(this._d) : null;\n    },\n\n    /**\n     * set the current selection from a Moment.js object (if available)\n     */\n    setMoment: function(date, preventOnSelect)\n    {\n      if (hasMoment && moment.isMoment(date)) {\n        this.setDate(date.toDate(), preventOnSelect);\n      }\n    },\n\n    /**\n     * return a Date object of the current selection\n     */\n    getDate: function()\n    {\n      return isDate(this._d) ? new Date(this._d.getTime()) : null;\n    },\n\n    /**\n     * set the current selection\n     */\n    setDate: function(date, preventOnSelect)\n    {\n      if (!date) {\n        this._d = null;\n\n        if (this._o.field) {\n          this._o.field.value = '';\n          fireEvent(this._o.field, 'change', { firedBy: this });\n        }\n\n        return this.draw();\n      }\n      if (typeof date === 'string') {\n        date = new Date(Date.parse(date));\n      }\n      if (!isDate(date)) {\n        return;\n      }\n\n      var min = this._o.minDate,\n        max = this._o.maxDate;\n\n      if (isDate(min) && date < min) {\n        date = min;\n      } else if (isDate(max) && date > max) {\n        date = max;\n      }\n\n      this._d = new Date(date.getTime());\n      setToStartOfDay(this._d);\n      this.gotoDate(this._d);\n\n      if (this._o.field) {\n        this._o.field.value = this.toString();\n        fireEvent(this._o.field, 'change', { firedBy: this });\n      }\n      if (!preventOnSelect && typeof this._o.onSelect === 'function') {\n        this._o.onSelect.call(this, this.getDate());\n      }\n    },\n\n    /**\n     * change view to a specific date\n     */\n    gotoDate: function(date)\n    {\n      var newCalendar = true;\n\n      if (!isDate(date)) {\n        return;\n      }\n\n      if (this.calendars) {\n        var firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1),\n          lastVisibleDate = new Date(this.calendars[this.calendars.length-1].year, this.calendars[this.calendars.length-1].month, 1),\n          visibleDate = date.getTime();\n        // get the end of the month\n        lastVisibleDate.setMonth(lastVisibleDate.getMonth()+1);\n        lastVisibleDate.setDate(lastVisibleDate.getDate()-1);\n        newCalendar = (visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate);\n      }\n\n      if (newCalendar) {\n        this.calendars = [{\n          month: date.getMonth(),\n          year: date.getFullYear()\n        }];\n        if (this._o.mainCalendar === 'right') {\n          this.calendars[0].month += 1 - this._o.numberOfMonths;\n        }\n      }\n\n      this.adjustCalendars();\n    },\n\n    adjustDate: function(sign, days) {\n\n      var day = this.getDate() || new Date();\n      var difference = parseInt(days)*24*60*60*1000;\n\n      var newDay;\n\n      if (sign === 'add') {\n        newDay = new Date(day.valueOf() + difference);\n      } else if (sign === 'subtract') {\n        newDay = new Date(day.valueOf() - difference);\n      }\n\n      this.setDate(newDay);\n    },\n\n    adjustCalendars: function() {\n      this.calendars[0] = adjustCalendar(this.calendars[0]);\n      for (var c = 1; c < this._o.numberOfMonths; c++) {\n        this.calendars[c] = adjustCalendar({\n          month: this.calendars[0].month + c,\n          year: this.calendars[0].year\n        });\n      }\n      this.draw();\n    },\n\n    gotoToday: function()\n    {\n      this.gotoDate(new Date());\n    },\n\n    /**\n     * change view to a specific month (zero-index, e.g. 0: January)\n     */\n    gotoMonth: function(month)\n    {\n      if (!isNaN(month)) {\n        this.calendars[0].month = parseInt(month, 10);\n        this.adjustCalendars();\n      }\n    },\n\n    nextMonth: function()\n    {\n      this.calendars[0].month++;\n      this.adjustCalendars();\n    },\n\n    prevMonth: function()\n    {\n      this.calendars[0].month--;\n      this.adjustCalendars();\n    },\n\n    /**\n     * change view to a specific full year (e.g. \"2012\")\n     */\n    gotoYear: function(year)\n    {\n      if (!isNaN(year)) {\n        this.calendars[0].year = parseInt(year, 10);\n        this.adjustCalendars();\n      }\n    },\n\n    /**\n     * change the minDate\n     */\n    setMinDate: function(value)\n    {\n      if(value instanceof Date) {\n        setToStartOfDay(value);\n        this._o.minDate = value;\n        this._o.minYear  = value.getFullYear();\n        this._o.minMonth = value.getMonth();\n      } else {\n        this._o.minDate = defaults.minDate;\n        this._o.minYear  = defaults.minYear;\n        this._o.minMonth = defaults.minMonth;\n        this._o.startRange = defaults.startRange;\n      }\n\n      this.draw();\n    },\n\n    /**\n     * change the maxDate\n     */\n    setMaxDate: function(value)\n    {\n      if(value instanceof Date) {\n        setToStartOfDay(value);\n        this._o.maxDate = value;\n        this._o.maxYear = value.getFullYear();\n        this._o.maxMonth = value.getMonth();\n      } else {\n        this._o.maxDate = defaults.maxDate;\n        this._o.maxYear = defaults.maxYear;\n        this._o.maxMonth = defaults.maxMonth;\n        this._o.endRange = defaults.endRange;\n      }\n\n      this.draw();\n    },\n\n    setStartRange: function(value)\n    {\n      this._o.startRange = value;\n    },\n\n    setEndRange: function(value)\n    {\n      this._o.endRange = value;\n    },\n\n    /**\n     * refresh the HTML\n     */\n    draw: function(force)\n    {\n      if (!this._v && !force) {\n        return;\n      }\n      var opts = this._o,\n        minYear = opts.minYear,\n        maxYear = opts.maxYear,\n        minMonth = opts.minMonth,\n        maxMonth = opts.maxMonth,\n        html = '',\n        randId;\n\n      if (this._y <= minYear) {\n        this._y = minYear;\n        if (!isNaN(minMonth) && this._m < minMonth) {\n          this._m = minMonth;\n        }\n      }\n      if (this._y >= maxYear) {\n        this._y = maxYear;\n        if (!isNaN(maxMonth) && this._m > maxMonth) {\n          this._m = maxMonth;\n        }\n      }\n\n      randId = 'pika-title-' + Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 2);\n\n      for (var c = 0; c < opts.numberOfMonths; c++) {\n        html += '<div class=\"pika-lendar\">' + renderTitle(this, c, this.calendars[c].year, this.calendars[c].month, this.calendars[0].year, randId) + this.render(this.calendars[c].year, this.calendars[c].month, randId) + '</div>';\n      }\n\n      this.el.innerHTML = html;\n\n      if (opts.bound) {\n        if(opts.field.type !== 'hidden') {\n          sto(function() {\n            opts.trigger.focus();\n          }, 1);\n        }\n      }\n\n      if (typeof this._o.onDraw === 'function') {\n        this._o.onDraw(this);\n      }\n\n      if (opts.bound) {\n        // let the screen reader user know to use arrow keys\n        opts.field.setAttribute('aria-label', opts.ariaLabel);\n      }\n    },\n\n    adjustPosition: function()\n    {\n      var field, pEl, width, height, viewportWidth, viewportHeight, scrollTop, left, top, clientRect, leftAligned, bottomAligned;\n\n      if (this._o.container) return;\n\n      this.el.style.position = 'absolute';\n\n      field = this._o.trigger;\n      pEl = field;\n      width = this.el.offsetWidth;\n      height = this.el.offsetHeight;\n      viewportWidth = window.innerWidth || document.documentElement.clientWidth;\n      viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n      scrollTop = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;\n      leftAligned = true;\n      bottomAligned = true;\n\n      if (typeof field.getBoundingClientRect === 'function') {\n        clientRect = field.getBoundingClientRect();\n        left = clientRect.left + window.pageXOffset;\n        top = clientRect.bottom + window.pageYOffset;\n      } else {\n        left = pEl.offsetLeft;\n        top  = pEl.offsetTop + pEl.offsetHeight;\n        while((pEl = pEl.offsetParent)) {\n          left += pEl.offsetLeft;\n          top  += pEl.offsetTop;\n        }\n      }\n\n      // default position is bottom & left\n      if ((this._o.reposition && left + width > viewportWidth) ||\n        (\n          this._o.position.indexOf('right') > -1 &&\n          left - width + field.offsetWidth > 0\n        )\n      ) {\n        left = left - width + field.offsetWidth;\n        leftAligned = false;\n      }\n      if ((this._o.reposition && top + height > viewportHeight + scrollTop) ||\n        (\n          this._o.position.indexOf('top') > -1 &&\n          top - height - field.offsetHeight > 0\n        )\n      ) {\n        top = top - height - field.offsetHeight;\n        bottomAligned = false;\n      }\n\n      this.el.style.left = left + 'px';\n      this.el.style.top = top + 'px';\n\n      addClass(this.el, leftAligned ? 'left-aligned' : 'right-aligned');\n      addClass(this.el, bottomAligned ? 'bottom-aligned' : 'top-aligned');\n      removeClass(this.el, !leftAligned ? 'left-aligned' : 'right-aligned');\n      removeClass(this.el, !bottomAligned ? 'bottom-aligned' : 'top-aligned');\n    },\n\n    /**\n     * render HTML for a particular month\n     */\n    render: function(year, month, randId)\n    {\n      var opts   = this._o,\n        now    = new Date(),\n        days   = getDaysInMonth(year, month),\n        before = new Date(year, month, 1).getDay(),\n        data   = [],\n        row    = [];\n      setToStartOfDay(now);\n      if (opts.firstDay > 0) {\n        before -= opts.firstDay;\n        if (before < 0) {\n          before += 7;\n        }\n      }\n      var previousMonth = month === 0 ? 11 : month - 1,\n        nextMonth = month === 11 ? 0 : month + 1,\n        yearOfPreviousMonth = month === 0 ? year - 1 : year,\n        yearOfNextMonth = month === 11 ? year + 1 : year,\n        daysInPreviousMonth = getDaysInMonth(yearOfPreviousMonth, previousMonth);\n      var cells = days + before,\n        after = cells;\n      while(after > 7) {\n        after -= 7;\n      }\n      cells += 7 - after;\n      var isWeekSelected = false;\n      for (var i = 0, r = 0; i < cells; i++)\n      {\n        var day = new Date(year, month, 1 + (i - before)),\n          isSelected = isDate(this._d) ? compareDates(day, this._d) : false,\n          isToday = compareDates(day, now),\n          hasEvent = opts.events.indexOf(day.toDateString()) !== -1 ? true : false,\n          isEmpty = i < before || i >= (days + before),\n          dayNumber = 1 + (i - before),\n          monthNumber = month,\n          yearNumber = year,\n          isStartRange = opts.startRange && compareDates(opts.startRange, day),\n          isEndRange = opts.endRange && compareDates(opts.endRange, day),\n          isInRange = opts.startRange && opts.endRange && opts.startRange < day && day < opts.endRange,\n          isDisabled = (opts.minDate && day < opts.minDate) ||\n            (opts.maxDate && day > opts.maxDate) ||\n            (opts.disableWeekends && isWeekend(day)) ||\n            (opts.disableDayFn && opts.disableDayFn(day));\n\n        if (isEmpty) {\n          if (i < before) {\n            dayNumber = daysInPreviousMonth + dayNumber;\n            monthNumber = previousMonth;\n            yearNumber = yearOfPreviousMonth;\n          } else {\n            dayNumber = dayNumber - days;\n            monthNumber = nextMonth;\n            yearNumber = yearOfNextMonth;\n          }\n        }\n\n        var dayConfig = {\n          day: dayNumber,\n          month: monthNumber,\n          year: yearNumber,\n          hasEvent: hasEvent,\n          isSelected: isSelected,\n          isToday: isToday,\n          isDisabled: isDisabled,\n          isEmpty: isEmpty,\n          isStartRange: isStartRange,\n          isEndRange: isEndRange,\n          isInRange: isInRange,\n          showDaysInNextAndPreviousMonths: opts.showDaysInNextAndPreviousMonths,\n          enableSelectionDaysInNextAndPreviousMonths: opts.enableSelectionDaysInNextAndPreviousMonths\n        };\n\n        if (opts.pickWholeWeek && isSelected) {\n          isWeekSelected = true;\n        }\n\n        row.push(renderDay(dayConfig));\n\n        if (++r === 7) {\n          if (opts.showWeekNumber) {\n            row.unshift(renderWeek(i - before, month, year));\n          }\n          data.push(renderRow(row, opts.isRTL, opts.pickWholeWeek, isWeekSelected));\n          row = [];\n          r = 0;\n          isWeekSelected = false;\n        }\n      }\n      return renderTable(opts, data, randId);\n    },\n\n    isVisible: function()\n    {\n      return this._v;\n    },\n\n    show: function()\n    {\n      if (!this.isVisible()) {\n        this._v = true;\n        this.draw();\n        removeClass(this.el, 'is-hidden');\n        if (this._o.bound) {\n          addEvent(document, 'click', this._onClick);\n          this.adjustPosition();\n        }\n        if (typeof this._o.onOpen === 'function') {\n          this._o.onOpen.call(this);\n        }\n      }\n    },\n\n    hide: function()\n    {\n      var v = this._v;\n      if (v !== false) {\n        if (this._o.bound) {\n          removeEvent(document, 'click', this._onClick);\n        }\n        this.el.style.position = 'static'; // reset\n        this.el.style.left = 'auto';\n        this.el.style.top = 'auto';\n        addClass(this.el, 'is-hidden');\n        this._v = false;\n        if (v !== undefined && typeof this._o.onClose === 'function') {\n          this._o.onClose.call(this);\n        }\n      }\n    },\n\n    /**\n     * GAME OVER\n     */\n    destroy: function()\n    {\n      var opts = this._o;\n\n      this.hide();\n      removeEvent(this.el, 'mousedown', this._onMouseDown, true);\n      removeEvent(this.el, 'touchend', this._onMouseDown, true);\n      removeEvent(this.el, 'change', this._onChange);\n      if (opts.keyboardInput) {\n        removeEvent(document, 'keydown', this._onKeyChange);\n      }\n      if (opts.field) {\n        removeEvent(opts.field, 'change', this._onInputChange);\n        if (opts.bound) {\n          removeEvent(opts.trigger, 'click', this._onInputClick);\n          removeEvent(opts.trigger, 'focus', this._onInputFocus);\n          removeEvent(opts.trigger, 'blur', this._onInputBlur);\n        }\n      }\n      if (this.el.parentNode) {\n        this.el.parentNode.removeChild(this.el);\n      }\n    }\n\n  };\n\n  return Pikaday;\n}));\n"),
45
        }
46
        file9 := &embedded.EmbeddedFile{
47
                Filename:    "setup.js",
48
                FileModTime: time.Unix(1534396043, 0),
49
                Content:     string("/*\n * Statup\n * Copyright (C) 2018.  Hunter Long and the project contributors\n * Written by Hunter Long <info@socialeck.com> and the project contributors\n *\n * https://github.com/hunterlong/statup\n *\n * The licenses for most software and other practical works are designed\n * to take away your freedom to share and change the works.  By contrast,\n * the GNU General Public License is intended to guarantee your freedom to\n * share and change all versions of a program--to make sure it remains free\n * software for all its users.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nvar currentLocation = window.location;\n$(\"#domain_input\").val(currentLocation.origin);\n\n$('select#database_type').on('change', function(){\n    var selected = $('#database_type option:selected').val();\n    if (selected==\"sqlite\") {\n        $(\"#db_host\").hide();\n        $(\"#db_password\").hide();\n        $(\"#db_port\").hide();\n        $(\"#db_user\").hide();\n        $(\"#db_database\").hide();\n    } else {\n        $(\"#db_host\").show();\n        $(\"#db_password\").show();\n        $(\"#db_port\").show();\n        $(\"#db_user\").show();\n        $(\"#db_database\").show();\n    }\n    if (selected==\"mysql\") {\n        $(\"#db_port_in\").val('3306');\n    } else if (selected==\"postgres\") {\n        $(\"#db_port_in\").val('5432');\n    }\n\n});\n\n$(\"#setup_form\").submit(function() {\n    $(\"#setup_button\").prop(\"disabled\", true);\n    $(\"#setup_button\").text(\"Creating Statup...\");\n    return true;\n});\n\n\n$('form').submit(function() {\n    $(this).find(\"button[type='submit']\").prop('disabled',true);\n    $(this).find(\"button[type='submit']\").text('Loading...');\n});"),
50
        }
51
        filea := &embedded.EmbeddedFile{
52
                Filename:    "sortable.min.js",
53
                FileModTime: time.Unix(1538283453, 0),
54
                Content:     string("var sortable=function(){\"use strict\";function d(e,t,n){if(void 0===n)return e&&e.h5s&&e.h5s.data&&e.h5s.data[t];e.h5s=e.h5s||{},e.h5s.data=e.h5s.data||{},e.h5s.data[t]=n}function u(e,t){if(!(e instanceof NodeList||e instanceof HTMLCollection||e instanceof Array))throw new Error(\"You must provide a nodeList/HTMLCollection/Array of elements to be filtered.\");return\"string\"!=typeof t?Array.from(e):Array.from(e).filter(function(e){return 1===e.nodeType&&e.matches(t)})}var p=new Map,t=function(){function e(){this._config=new Map,this._placeholder=void 0,this._data=new Map}return Object.defineProperty(e.prototype,\"config\",{get:function(){var n={};return this._config.forEach(function(e,t){n[t]=e}),n},set:function(e){if(\"object\"!=typeof e)throw new Error(\"You must provide a valid configuration object to the config setter.\");var t=Object.assign({},e);this._config=new Map(Object.entries(t))},enumerable:!0,configurable:!0}),e.prototype.setConfig=function(e,t){if(!this._config.has(e))throw new Error(\"Trying to set invalid configuration item: \"+e);this._config.set(e,t)},e.prototype.getConfig=function(e){if(!this._config.has(e))throw new Error(\"Invalid configuration item requested: \"+e);return this._config.get(e)},Object.defineProperty(e.prototype,\"placeholder\",{get:function(){return this._placeholder},set:function(e){if(!(e instanceof HTMLElement)&&null!==e)throw new Error(\"A placeholder must be an html element or null.\");this._placeholder=e},enumerable:!0,configurable:!0}),e.prototype.setData=function(e,t){if(\"string\"!=typeof e)throw new Error(\"The key must be a string.\");this._data.set(e,t)},e.prototype.getData=function(e){if(\"string\"!=typeof e)throw new Error(\"The key must be a string.\");return this._data.get(e)},e.prototype.deleteData=function(e){if(\"string\"!=typeof e)throw new Error(\"The key must be a string.\");return this._data.delete(e)},e}();function m(e){if(!(e instanceof HTMLElement))throw new Error(\"Please provide a sortable to the store function.\");return p.has(e)||p.set(e,new t),p.get(e)}function g(e,t,n){if(e instanceof Array)for(var r=0;r<e.length;++r)g(e[r],t,n);else e.addEventListener(t,n),m(e).setData(\"event\"+t,n)}function l(e,t){if(e instanceof Array)for(var n=0;n<e.length;++n)l(e[n],t);else e.removeEventListener(t,m(e).getData(\"event\"+t)),m(e).deleteData(\"event\"+t)}function h(e,t,n){if(e instanceof Array)for(var r=0;r<e.length;++r)h(e[r],t,n);else e.setAttribute(t,n)}function s(e,t){if(e instanceof Array)for(var n=0;n<e.length;++n)s(e[n],t);else e.removeAttribute(t)}function v(e){if(!e.parentElement||0===e.getClientRects().length)throw new Error(\"target element must be part of the dom\");var t=e.getClientRects()[0];return{left:t.left+window.scrollX,right:t.right+window.scrollX,top:t.top+window.scrollY,bottom:t.bottom+window.scrollY}}function y(e,t){if(!(e instanceof HTMLElement&&(t instanceof NodeList||t instanceof HTMLCollection||t instanceof Array)))throw new Error(\"You must provide an element and a list of elements.\");return Array.from(t).indexOf(e)}function E(e){if(!(e instanceof HTMLElement))throw new Error(\"Element is not a node element.\");return null!==e.parentNode}var n=function(e,t,n){if(!(e instanceof HTMLElement&&e.parentElement instanceof HTMLElement))throw new Error(\"target and element must be a node\");e.parentElement.insertBefore(t,\"before\"===n?e:e.nextElementSibling)},b=function(e,t){return n(e,t,\"before\")},w=function(e,t){return n(e,t,\"after\")};function T(e){if(!(e instanceof HTMLElement))throw new Error(\"You must provide a valid dom element\");var n=window.getComputedStyle(e);return[\"height\",\"padding-top\",\"padding-bottom\"].map(function(e){var t=parseInt(n.getPropertyValue(e),10);return isNaN(t)?0:t}).reduce(function(e,t){return e+t})}function c(e,t){if(!(e instanceof Array))throw new Error(\"You must provide a Array of HTMLElements to be filtered.\");return\"string\"!=typeof t?e:e.filter(function(e){return e.querySelector(t)instanceof HTMLElement}).map(function(e){return e.querySelector(t)})}var C=function(e,t,n){return{element:e,posX:n.pageX-t.left,posY:n.pageY-t.top}};function L(e,t){if(!0===e.isSortable){var n=m(e).getConfig(\"acceptFrom\");if(null!==n&&!1!==n&&\"string\"!=typeof n)throw new Error('HTML5Sortable: Wrong argument, \"acceptFrom\" must be \"null\", \"false\", or a valid selector string.');if(null!==n)return!1!==n&&0<n.split(\",\").filter(function(e){return 0<e.length&&t.matches(e)}).length;if(e===t)return!0;if(void 0!==m(e).getConfig(\"connectWith\")&&null!==m(e).getConfig(\"connectWith\"))return m(e).getConfig(\"connectWith\")===m(t).getConfig(\"connectWith\")}return!1}var M,x,D,A,H,I,S,Y={items:null,connectWith:null,disableIEFix:null,acceptFrom:null,copy:!1,placeholder:null,placeholderClass:\"sortable-placeholder\",draggingClass:\"sortable-dragging\",hoverClass:!1,debounce:0,throttleTime:100,maxItems:0,itemSerializer:void 0,containerSerializer:void 0,customDragImage:null};function _(e,t){if(\"string\"==typeof m(e).getConfig(\"hoverClass\")){var o=m(e).getConfig(\"hoverClass\").split(\" \");!0===t?(g(e,\"mousemove\",function(r,o){var i=this;if(void 0===o&&(o=250),\"function\"!=typeof r)throw new Error(\"You must provide a function as the first argument for throttle.\");if(\"number\"!=typeof o)throw new Error(\"You must provide a number as the second argument for throttle.\");var a=null;return function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var n=Date.now();(null===a||o<=n-a)&&(a=n,r.apply(i,e))}}(function(r){0===r.buttons&&u(e.children,m(e).getConfig(\"items\")).forEach(function(e){var t,n;e!==r.target?(t=e.classList).remove.apply(t,o):(n=e.classList).add.apply(n,o)})},m(e).getConfig(\"throttleTime\"))),g(e,\"mouseleave\",function(){u(e.children,m(e).getConfig(\"items\")).forEach(function(e){var t;(t=e.classList).remove.apply(t,o)})})):(l(e,\"mousemove\"),l(e,\"mouseleave\"))}}var f=function(e){l(e,\"dragstart\"),l(e,\"dragend\"),l(e,\"dragover\"),l(e,\"dragenter\"),l(e,\"drop\"),l(e,\"mouseenter\"),l(e,\"mouseleave\")},O=function(e,t){var n=e;return!0===m(t).getConfig(\"copy\")&&(h(n=e.cloneNode(!0),\"aria-copied\",\"true\"),e.parentElement.appendChild(n),n.style.display=\"none\",n.oldDisplay=e.style.display),n};function F(e){for(;!0!==e.isSortable;)e=e.parentElement;return e}function W(e,t){var n=d(e,\"opts\"),r=u(e.children,n.items).filter(function(e){return e.contains(t)});return 0<r.length?r[0]:t}var r=function(e){var t,n,r,o=d(e,\"opts\")||{},i=u(e.children,o.items),a=c(i,o.handle);l(e,\"dragover\"),l(e,\"dragenter\"),l(e,\"drop\"),(n=t=e).h5s&&delete n.h5s.data,s(t,\"aria-dropeffect\"),l(a,\"mousedown\"),f(i),s(r=i,\"aria-grabbed\"),s(r,\"aria-copied\"),s(r,\"draggable\"),s(r,\"role\")},j=function(e){var t=d(e,\"opts\"),n=u(e.children,t.items),r=c(n,t.handle);(h(e,\"aria-dropeffect\",\"move\"),d(e,\"_disabled\",\"false\"),h(r,\"draggable\",\"true\"),!1===t.disableIEFix)&&(\"function\"==typeof(document||window.document).createElement(\"span\").dragDrop&&g(r,\"mousedown\",function(){if(-1!==n.indexOf(this))this.dragDrop();else{for(var e=this.parentElement;-1===n.indexOf(e);)e=e.parentElement;e.dragDrop()}}))},z=function(e){var t=d(e,\"opts\"),n=u(e.children,t.items),r=c(n,t.handle);d(e,\"_disabled\",\"false\"),f(n),l(r,\"mousedown\"),l(e,\"dragover\"),l(e,\"dragenter\"),l(e,\"drop\")};function N(e,f){var c=String(f);return f=Object.assign({connectWith:null,acceptFrom:null,copy:!1,placeholder:null,disableIEFix:null,placeholderClass:\"sortable-placeholder\",draggingClass:\"sortable-dragging\",hoverClass:!1,debounce:0,maxItems:0,itemSerializer:void 0,containerSerializer:void 0,customDragImage:null,items:null},\"object\"==typeof f?f:{}),\"string\"==typeof e&&(e=document.querySelectorAll(e)),e instanceof HTMLElement&&(e=[e]),e=Array.prototype.slice.call(e),/serialize/.test(c)?e.map(function(e){var t=d(e,\"opts\");return function(t,n,e){if(void 0===n&&(n=function(e,t){return e}),void 0===e&&(e=function(e){return e}),!(t instanceof HTMLElement)||1==!t.isSortable)throw new Error(\"You need to provide a sortableContainer to be serialized.\");if(\"function\"!=typeof n||\"function\"!=typeof e)throw new Error(\"You need to provide a valid serializer for items and the container.\");var r=d(t,\"opts\").items,o=u(t.children,r),i=o.map(function(e){return{parent:t,node:e,html:e.outerHTML,index:y(e,o)}});return{container:e({node:t,itemCount:i.length}),items:i.map(function(e){return n(e,t)})}}(e,t.itemSerializer,t.containerSerializer)}):(e.forEach(function(s){if(/enable|disable|destroy/.test(c))return N[c](s);[\"connectWith\",\"disableIEFix\"].forEach(function(e){f.hasOwnProperty(e)&&null!==f[e]&&console.warn('HTML5Sortable: You are using the deprecated configuration \"'+e+'\". This will be removed in an upcoming version, make sure to migrate to the new options when updating.')}),f=Object.assign({},Y,f),m(s).config=f,f=d(s,\"opts\")||f,d(s,\"opts\",f),s.isSortable=!0,z(s);var e,t=u(s.children,f.items);if(null!==f.placeholder&&void 0!==f.placeholder){var n=document.createElement(s.tagName);n.innerHTML=f.placeholder,e=n.children[0]}m(s).placeholder=function(e,t,n){if(void 0===n&&(n=\"sortable-placeholder\"),!(e instanceof HTMLElement))throw new Error(\"You must provide a valid element as a sortable.\");if(!(t instanceof HTMLElement)&&void 0!==t)throw new Error(\"You must provide a valid element as a placeholder or set ot to undefined.\");return void 0===t&&([\"UL\",\"OL\"].includes(e.tagName)?t=document.createElement(\"li\"):[\"TABLE\",\"TBODY\"].includes(e.tagName)?(t=document.createElement(\"tr\")).innerHTML='<td colspan=\"100\"></td>':t=document.createElement(\"div\")),\"string\"==typeof n&&(r=t.classList).add.apply(r,n.split(\" \")),t;var r}(s,e,f.placeholderClass),d(s,\"items\",f.items),f.acceptFrom?d(s,\"acceptFrom\",f.acceptFrom):f.connectWith&&d(s,\"connectWith\",f.connectWith),j(s),h(t,\"role\",\"option\"),h(t,\"aria-grabbed\",\"false\"),_(s,!0),g(s,\"dragstart\",function(e){if(!0!==e.target.isSortable&&(e.stopImmediatePropagation(),(!f.handle||e.target.matches(f.handle))&&\"false\"!==e.target.getAttribute(\"draggable\"))){var t=F(e.target),n=W(t,e.target);I=u(t.children,f.items),A=I.indexOf(n),H=y(n,t.children),D=t,function(e,t,n){if(!(e instanceof Event))throw new Error(\"setDragImage requires a DragEvent as the first argument.\");if(!(t instanceof HTMLElement))throw new Error(\"setDragImage requires the dragged element as the second argument.\");if(n||(n=C),e.dataTransfer&&e.dataTransfer.setDragImage){var r=n(t,v(t),e);if(!(r.element instanceof HTMLElement)||\"number\"!=typeof r.posX||\"number\"!=typeof r.posY)throw new Error(\"The customDragImage function you provided must return and object with the properties element[string], posX[integer], posY[integer].\");e.dataTransfer.effectAllowed=\"copyMove\",e.dataTransfer.setData(\"text/plain\",e.target.id),e.dataTransfer.setDragImage(r.element,r.posX,r.posY)}}(e,n,f.customDragImage),x=T(n),n.classList.add(f.draggingClass),h(M=O(n,t),\"aria-grabbed\",\"true\"),t.dispatchEvent(new CustomEvent(\"sortstart\",{detail:{origin:{elementIndex:H,index:A,container:D},item:M}}))}}),g(s,\"dragenter\",function(e){if(!0!==e.target.isSortable){var t=F(e.target);S=u(t.children,d(t,\"items\")).filter(function(e){return e!==m(s).placeholder})}}),g(s,\"dragend\",function(e){if(M){M.classList.remove(f.draggingClass),h(M,\"aria-grabbed\",\"false\"),\"true\"===M.getAttribute(\"aria-copied\")&&\"true\"!==d(M,\"dropped\")&&M.remove(),M.style.display=M.oldDisplay,delete M.oldDisplay;var t=Array.from(p.values()).map(function(e){return e.placeholder}).filter(function(e){return e instanceof HTMLElement}).filter(E)[0];t&&t.remove(),s.dispatchEvent(new CustomEvent(\"sortstop\",{detail:{origin:{elementIndex:H,index:A,container:D},item:M}})),x=M=null}}),g(s,\"drop\",function(e){if(L(s,M.parentElement)){e.preventDefault(),e.stopPropagation(),d(M,\"dropped\",\"true\");var t=Array.from(p.values()).map(function(e){return e.placeholder}).filter(function(e){return e instanceof HTMLElement}).filter(E)[0];w(t,M),t.remove(),s.dispatchEvent(new CustomEvent(\"sortstop\",{detail:{origin:{elementIndex:H,index:A,container:D},item:M}}));var n=m(s).placeholder,r=u(D.children,f.items).filter(function(e){return e!==n}),o=!0===this.isSortable?this:this.parentElement,i=u(o.children,d(o,\"items\")).filter(function(e){return e!==n}),a=y(M,Array.from(M.parentElement.children).filter(function(e){return e!==n})),l=y(M,i);H===a&&D===o||s.dispatchEvent(new CustomEvent(\"sortupdate\",{detail:{origin:{elementIndex:H,index:A,container:D,itemsBeforeUpdate:I,items:r},destination:{index:l,elementIndex:a,container:o,itemsBeforeUpdate:S,items:i},item:M}}))}});var r,o,i,a=(r=function(t,e,n){if(M)if(f.forcePlaceholderSize&&(m(t).placeholder.style.height=x+\"px\"),-1<Array.from(t.children).indexOf(e)){var r=T(e),o=y(m(t).placeholder,e.parentElement.children),i=y(e,e.parentElement.children);if(x<r){var a=r-x,l=v(e).top;if(o<i&&n<l)return;if(i<o&&l+r-a<n)return}void 0===M.oldDisplay&&(M.oldDisplay=M.style.display),\"none\"!==M.style.display&&(M.style.display=\"none\");var s=!1;try{s=v(e).top+e.offsetHeight/2<=n}catch(e){s=o<i}s?w(e,m(t).placeholder):b(e,m(t).placeholder),Array.from(p.values()).filter(function(e){return void 0!==e.placeholder}).forEach(function(e){e.placeholder!==m(t).placeholder&&e.placeholder.remove()})}else{var c=Array.from(p.values()).filter(function(e){return void 0!==e.placeholder}).map(function(e){return e.placeholder});-1!==c.indexOf(e)||t!==e||u(e.children,f.items).length||(c.forEach(function(e){return e.remove()}),e.appendChild(m(t).placeholder))}},void 0===(o=f.debounce)&&(o=0),function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];clearTimeout(i),i=setTimeout(function(){r.apply(void 0,e)},o)}),l=function(e){var t=e.target,n=!0===t.isSortable?t:F(t);if(t=W(n,t),M&&L(n,M.parentElement)&&\"true\"!==d(n,\"_disabled\")){var r=d(n,\"opts\");parseInt(r.maxItems)&&u(n.children,d(n,\"items\")).length>=parseInt(r.maxItems)&&M.parentElement!==n||(e.preventDefault(),e.stopPropagation(),e.dataTransfer.dropEffect=!0===m(n).getConfig(\"copy\")?\"copy\":\"move\",a(n,t,e.pageY))}};g(t.concat(s),\"dragover\",l),g(t.concat(s),\"dragenter\",l)}),e)}return N.destroy=function(e){r(e)},N.enable=function(e){j(e)},N.disable=function(e){var t,n,r;n=d(t=e,\"opts\"),r=c(u(t.children,n.items),n.handle),h(t,\"aria-dropeffect\",\"none\"),d(t,\"_disabled\",\"true\"),h(r,\"draggable\",\"false\"),l(r,\"mousedown\")},N}();\n//# sourceMappingURL=html5sortable.min.js.map\n"),
55
        }
56
57
        // define dirs
58
        dir1 := &embedded.EmbeddedDir{
59
                Filename:   "",
60
                DirModTime: time.Unix(1538866330, 0),
61
                ChildFiles: []*embedded.EmbeddedFile{
62
                        file2, // "Chart.bundle.min.js"
63
                        file3, // "bootstrap.min.js"
64
                        file4, // "chart_index.js"
65
                        file5, // "charts.js"
66
                        file6, // "jquery-3.3.1.min.js"
67
                        file7, // "main.js"
68
                        file8, // "pikaday.js"
69
                        file9, // "setup.js"
70
                        filea, // "sortable.min.js"
71
72
                },
73
        }
74
75
        // link ChildDirs
76
        dir1.ChildDirs = []*embedded.EmbeddedDir{}
77
78
        // register embeddedBox
79
        embedded.RegisterEmbeddedBox(`js`, &embedded.EmbeddedBox{
80
                Name: `js`,
81
                Time: time.Unix(1538866330, 0),
82
                Dirs: map[string]*embedded.EmbeddedDir{
83
                        "": dir1,
84
                },
85
                Files: map[string]*embedded.EmbeddedFile{
86
                        "Chart.bundle.min.js": file2,
87
                        "bootstrap.min.js":    file3,
88
                        "chart_index.js":      file4,
89
                        "charts.js":           file5,
90
                        "jquery-3.3.1.min.js": file6,
91
                        "main.js":             file7,
92
                        "pikaday.js":          file8,
93
                        "setup.js":            file9,
94
                        "sortable.min.js":     filea,
95
                },
96
        })
97
}
func init
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/rice-box.go:

358
func init() {
359
360
        // define files
361
        file17 := &embedded.EmbeddedFile{
362
                Filename:    "base.scss",
363
                FileModTime: time.Unix(1538106377, 0),
364
                Content:     string("/*!\n * Statup\n * Copyright (C) 2018.  Hunter Long and the project contributors\n * Written by Hunter Long <info@socialeck.com> and the project contributors\n *\n * https://github.com/hunterlong/statup\n *\n * The licenses for most software and other practical works are designed\n * to take away your freedom to share and change the works.  By contrast,\n * the GNU General Public License is intended to guarantee your freedom to\n * share and change all versions of a program--to make sure it remains free\n * software for all its users.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n@import 'variables';\n\n\nHTML,BODY {\n    background-color: $background-color;\n}\n\n.container {\n    padding-top: 20px;\n    padding-bottom: 20px;\n    max-width: $max-width;\n}\n\n.header-title {\n    color: $title-color;\n}\n\n.header-desc {\n    color: $description-color;\n}\n\n.btn {\n    border-radius: $global-border-radius;\n}\n\n.online_list .badge {\n    margin-top: 0.2rem;\n}\n\n.navbar {\n    margin-bottom: 30px;\n}\n\n.btn-sm {\n    line-height: 1.3;\n    font-size: 0.75rem;\n}\n\n.view_service_btn {\n    position: absolute;\n    bottom: -40px;\n    right: 40px;\n}\n\n.service_lower_info {\n    position: absolute;\n    bottom: -40px;\n    left: 40px;\n    color: #d1ffca;\n    font-size: 0.85rem;\n}\n\n.lg_number {\n    font-size: $service-stats-size;\n    font-weight: bold;\n    display: block;\n    color: $service-stats-color;\n}\n\n.stats_area {\n    text-align: center;\n    color: #a5a5a5;\n}\n\n.lower_canvas {\n    height: 3.4rem;\n    width: 100%;\n    background-color: #48d338;\n    padding: 15px 10px;\n    margin-left: 0px !important;\n    margin-right: 0px !important;\n}\n\n.lower_canvas SPAN {\n    font-size: 1rem;\n    color: $service-description-color\n}\n\n.footer {\n    text-decoration: none;\n    margin-top: 20px;\n}\n\n.footer A {\n    color: $footer-text-color;\n    text-decoration: none;\n}\n\n.footer A:HOVER {\n    color: #6d6d6d;\n}\n\n.badge {\n    color: white;\n    border-radius: $global-border-radius;\n}\n\n.btn-group {\n    height: 25px;\n\n    & A {\n        padding: 0.1rem .75rem;\n        font-size: 0.8rem;\n    }\n}\n\n.card-body .badge {\n    color: #fff;\n}\n\n.nav-pills .nav-link {\n    border-radius: $global-border-radius;\n}\n\n.form-control {\n    border-radius: $global-border-radius;\n}\n\n.card {\n    background-color: $service-background;\n    border: $service-border;\n}\n\n.card-body {\n    overflow: hidden;\n}\n\n.card-body H4 A {\n    color: $service-title;\n    text-decoration: none;\n}\n\n.chart-container {\n  position: relative;\n  height: 170px;\n  width: 100%;\n}\n\n.service-chart-container {\n  position: relative;\n  height: 400px;\n  width: 100%;\n}\n\n@mixin dynamic-color-hov($color) {\n    &.dyn-dark {\n        background-color: darken($color, 12%) !important;\n        border-color: darken($color, 17%) !important;\n    }\n    &.dyn-dark:HOVER {\n        background-color: darken($color, 17%) !important;\n        border-color: darken($color, 20%) !important;\n    }\n    &.dyn-light {\n        background-color: lighten($color, 12%) !important;\n        border-color: lighten($color, 17%) !important;\n    }\n    &.dyn-light:HOVER {\n        background-color: lighten($color, 17%) !important;\n        border-color: lighten($color, 20%) !important;\n    }\n}\n\n@mixin dynamic-color($color) {\n    &.dyn-dark {\n        background-color: darken($color, 12%) !important;\n        border-color: darken($color, 17%) !important;\n    }\n    &.dyn-light {\n        background-color: lighten($color, 12%) !important;\n        border-color: lighten($color, 17%) !important;\n    }\n}\n\n\n.btn-primary {\n    background-color: $primary-color;\n    border-color: darken($primary-color, 17%);\n    color: white;\n    @include dynamic-color($success-color);\n}\n\n.btn-success {\n    background-color: $success-color;\n    @include dynamic-color($success-color);\n}\n\n.btn-danger {\n    background-color: $danger-color;\n    @include dynamic-color($danger-color);\n}\n\n.bg-success {\n    background-color: $success-color !important;\n}\n\n.bg-danger {\n    background-color: $danger-color !important;\n}\n\n.bg-success .dyn-dark {\n    background-color: darken($success-color, 10%) !important;\n}\n\n.bg-danger .dyn-dark {\n    background-color: darken($danger-color, 10%) !important;\n}\n\n.nav-pills .nav-link.active, .nav-pills .show>.nav-link {\n    background-color: $nav-tab-color;\n}\n\n.nav-pills A {\n    color: #424242;\n}\n\n\n.CodeMirror {\n  /* Bootstrap Settings */\n  box-sizing: border-box;\n  margin: 0;\n  font: inherit;\n  overflow: auto;\n  font-family: inherit;\n  display: block;\n  width: 100%;\n  padding: 0px;\n  font-size: 14px;\n  line-height: 1.5;\n  color: #555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  /* Code Mirror Settings */\n  font-family: monospace;\n  position: relative;\n  overflow: hidden;\n  height:80vh;\n}\n\n.CodeMirror-focused {\n  /* Bootstrap Settings */\n  border-color: #66afe9;\n  outline: 0;\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n\n.switch {\n  font-size: 1rem;\n  position: relative;\n}\n.switch input {\n  position: absolute;\n  height: 1px;\n  width: 1px;\n  background: none;\n  border: 0;\n  clip: rect(0 0 0 0);\n  clip-path: inset(50%);\n  overflow: hidden;\n  padding: 0;\n}\n.switch input + label {\n  position: relative;\n  min-width: calc(calc(2.375rem * .8) * 2);\n  border-radius: calc(2.375rem * .8);\n  height: calc(2.375rem * .8);\n  line-height: calc(2.375rem * .8);\n  display: inline-block;\n  cursor: pointer;\n  outline: none;\n  user-select: none;\n  vertical-align: middle;\n  text-indent: calc(calc(calc(2.375rem * .8) * 2) + .5rem);\n}\n.switch input + label::before,\n.switch input + label::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: calc(calc(2.375rem * .8) * 2);\n  bottom: 0;\n  display: block;\n}\n.switch input + label::before {\n  right: 0;\n  background-color: #dee2e6;\n  border-radius: calc(2.375rem * .8);\n  transition: 0.2s all;\n}\n.switch input + label::after {\n  top: 2px;\n  left: 2px;\n  width: calc(calc(2.375rem * .8) - calc(2px * 2));\n  height: calc(calc(2.375rem * .8) - calc(2px * 2));\n  border-radius: 50%;\n  background-color: white;\n  transition: 0.2s all;\n}\n.switch input:checked + label::before {\n  background-color: #08d;\n}\n.switch input:checked + label::after {\n  margin-left: calc(2.375rem * .8);\n}\n.switch input:focus + label::before {\n  outline: none;\n  box-shadow: 0 0 0 0.2rem rgba(0, 136, 221, 0.25);\n}\n.switch input:disabled + label {\n  color: #868e96;\n  cursor: not-allowed;\n}\n.switch input:disabled + label::before {\n  background-color: #e9ecef;\n}\n.switch.switch-sm {\n  font-size: 0.875rem;\n}\n.switch.switch-sm input + label {\n  min-width: calc(calc(1.9375rem * .8) * 2);\n  height: calc(1.9375rem * .8);\n  line-height: calc(1.9375rem * .8);\n  text-indent: calc(calc(calc(1.9375rem * .8) * 2) + .5rem);\n}\n.switch.switch-sm input + label::before {\n  width: calc(calc(1.9375rem * .8) * 2);\n}\n.switch.switch-sm input + label::after {\n  width: calc(calc(1.9375rem * .8) - calc(2px * 2));\n  height: calc(calc(1.9375rem * .8) - calc(2px * 2));\n}\n.switch.switch-sm input:checked + label::after {\n  margin-left: calc(1.9375rem * .8);\n}\n.switch.switch-lg {\n  font-size: 1.25rem;\n}\n.switch.switch-lg input + label {\n  min-width: calc(calc(3rem * .8) * 2);\n  height: calc(3rem * .8);\n  line-height: calc(3rem * .8);\n  text-indent: calc(calc(calc(3rem * .8) * 2) + .5rem);\n}\n.switch.switch-lg input + label::before {\n  width: calc(calc(3rem * .8) * 2);\n}\n.switch.switch-lg input + label::after {\n  width: calc(calc(3rem * .8) - calc(2px * 2));\n  height: calc(calc(3rem * .8) - calc(2px * 2));\n}\n.switch.switch-lg input:checked + label::after {\n  margin-left: calc(3rem * .8);\n}\n.switch + .switch {\n  margin-left: 1rem;\n}\n\n\n@keyframes pulse_animation {\n    0% { transform: scale(1); }\n    30% { transform: scale(1); }\n    40% { transform: scale(1.02); }\n    50% { transform: scale(1); }\n    60% { transform: scale(1); }\n    70% { transform: scale(1.05); }\n    80% { transform: scale(1); }\n    100% { transform: scale(1); }\n}\n\n.pulse {\n    animation-name: pulse_animation;\n    animation-duration: 1500ms;\n    transform-origin:70% 70%;\n    animation-iteration-count: infinite;\n    animation-timing-function: linear;\n}\n\n\n@keyframes glow-grow {\n  0% {\n    opacity: 0;\n    transform: scale(1);\n  }\n  80% {\n    opacity: 1;\n  }\n  100% {\n    transform: scale(2);\n    opacity: 0;\n  }\n}\n.pulse-glow {\n    animation-name: glow-grown;\n    animation-duration: 100ms;\n    transform-origin: 70% 30%;\n    animation-iteration-count: infinite;\n    animation-timing-function: linear;\n}\n\n.pulse-glow:before,\n.pulse-glow:after {\n    position: absolute;\n    content: '';\n    height: 0.5rem;\n    width: 1.75rem;\n    top: 1.2rem;\n    right: 2.15rem;\n    border-radius: 0;\n    box-shadow: 0 0 7px #47d337;\n    animation: glow-grow 2s ease-out infinite;\n}\n\n.sortable_drag {\n  background-color: #0000000f;\n}\n\n.drag_icon {\n  cursor: move; /* fallback if grab cursor is unsupported */\n  cursor: grab;\n  cursor: -moz-grab;\n  cursor: -webkit-grab;\n  width: 25px;\n  height: 25px;\n  display: inline-block;\n  margin-right: 5px;\n  margin-left: -10px;\n  text-align: center;\n  color: #b1b1b1;\n}\n\n/* (Optional) Apply a \"closed-hand\" cursor during drag operation. */\n.drag_icon:active {\n  cursor: grabbing;\n  cursor: -moz-grabbing;\n  cursor: -webkit-grabbing;\n}\n\n.switch_btn {\n  float: right;\n  margin: -1px 0px 0px 0px;\n  display: block;\n}\n\n#start_container {\n  position: absolute;\n  z-index: 99999;\n  margin-top: 20px;\n}\n\n#end_container {\n  position: absolute;\n  z-index: 99999;\n  margin-top: 20px;\n  right: 0;\n}\n\n.pointer {\n  cursor: pointer;\n}\n\n@import './pikaday';\n\n@import './mobile';\n"),
365
        }
366
        file18 := &embedded.EmbeddedFile{
367
                Filename:    "mobile.scss",
368
                FileModTime: time.Unix(1538106377, 0),
369
                Content:     string("/*!\n * Statup\n * Copyright (C) 2018.  Hunter Long and the project contributors\n * Written by Hunter Long <info@socialeck.com> and the project contributors\n *\n * https://github.com/hunterlong/statup\n *\n * The licenses for most software and other practical works are designed\n * to take away your freedom to share and change the works.  By contrast,\n * the GNU General Public License is intended to guarantee your freedom to\n * share and change all versions of a program--to make sure it remains free\n * software for all its users.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n@media (max-width: 767px) {\n\n    HTML,BODY {\n        background-color: $sm-background-color;\n    }\n\n    .sm-container {\n        margin-top: 40px !important;\n        padding: 0 !important;\n    }\n\n    .list-group-item H5 {\n        font-size: 0.9rem;\n    }\n\n    .container {\n        padding: 0 !important;\n    }\n\n    .navbar {\n        margin-left: 0px;\n        margin-top: 0px;\n        width: 100%;\n        margin-bottom: 0;\n    }\n\n    .btn-sm {\n        line-height: 0.9rem;\n        font-size: 0.65rem;\n    }\n\n    .full-col-12 {\n        padding-left: 0px;\n        padding-right: 0px;\n    }\n\n    .card {\n        border: 0;\n        border-radius: $sm-border-radius;\n        padding: $sm-padding;\n        background-color: $sm-service-background;\n    }\n\n    .card-body {\n        font-size: 6pt;\n        padding: 5px 5px;\n    }\n\n    .lg_number {\n        font-size: 7.8vw;\n    }\n\n    .stats_area {\n        margin-top: 1.5rem !important;\n        margin-bottom: 1.5rem !important;\n    }\n\n    .stats_area .col-4 {\n        padding-left: 0;\n        padding-right: 0;\n        font-size: 0.6rem;\n    }\n\n    .list-group-item {\n        border-top: 1px solid #e4e4e4;\n        border: 0px;\n    }\n\n    .list-group-item:first-child {\n        border-top-left-radius: 0;\n        border-top-right-radius: 0;\n    }\n\n    .list-group-item:last-child {\n        border-bottom-right-radius: 0;\n        border-bottom-left-radius: 0;\n    }\n\n    .list-group-item P {\n        font-size: 0.7rem;\n    }\n\n    .service-chart-container {\n        height: 200px;\n    }\n}\n"),
370
        }
371
        file19 := &embedded.EmbeddedFile{
372
                Filename:    "pikaday.scss",
373
                FileModTime: time.Unix(1537243356, 0),
374
                Content:     string("/*!\n * Pikaday\n * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/\n */\n\n// Variables\n// Declare any of these variables before importing this SCSS file to easily override defaults\n// Variables are namespaced with the pd (pikaday) prefix\n\n// Colours\n$pd-text-color: #333 !default;\n$pd-title-color: #333 !default;\n$pd-title-bg: #fff !default;\n$pd-picker-bg: #fff !default;\n$pd-picker-border: #ccc !default;\n$pd-picker-border-bottom: #bbb !default;\n$pd-picker-shadow: rgba(0,0,0,.5) !default;\n$pd-th-color: #999 !default;\n$pd-day-color: #666 !default;\n$pd-day-bg: #f5f5f5 !default;\n$pd-day-hover-color: #fff !default;\n$pd-day-hover-bg: #ff8000 !default;\n$pd-day-today-color: #33aaff !default;\n$pd-day-selected-color: #fff !default;\n$pd-day-selected-bg: #33aaff !default;\n$pd-day-selected-shadow: #178fe5 !default;\n$pd-day-disabled-color: #999 !default;\n$pd-week-color: #999 !default;\n\n// Font\n$pd-font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n\n\n.pika-single {\n    z-index: 9999;\n    display: block;\n    position: relative;\n    color: $pd-text-color;\n    background: $pd-picker-bg;\n    border: 1px solid $pd-picker-border;\n    border-bottom-color: $pd-picker-border-bottom;\n    font-family: $pd-font-family;\n\n    &.is-hidden {\n        display: none;\n    }\n\n    &.is-bound {\n        position: absolute;\n        box-shadow: 0 5px 15px -5px $pd-picker-shadow;\n    }\n}\n\n// clear child float (pika-lendar), using the famous micro clearfix hack\n// http://nicolasgallagher.com/micro-clearfix-hack/\n.pika-single {\n    *zoom: 1;\n\n    &:before,\n    &:after {\n        content: \" \";\n        display: table;\n    }\n\n    &:after { clear: both }\n}\n\n.pika-lendar {\n    float: left;\n    width: 240px;\n    margin: 8px;\n}\n\n.pika-title {\n    position: relative;\n    text-align: center;\n\n    select {\n        cursor: pointer;\n        position: absolute;\n        z-index: 9998;\n        margin: 0;\n        left: 0;\n        top: 5px;\n        filter: alpha(opacity=0);\n        opacity: 0;\n    }\n}\n\n.pika-label {\n    display: inline-block;\n    *display: inline;\n    position: relative;\n    z-index: 9999;\n    overflow: hidden;\n    margin: 0;\n    padding: 5px 3px;\n    font-size: 14px;\n    line-height: 20px;\n    font-weight: bold;\n    color: $pd-title-color;\n    background-color: $pd-title-bg;\n}\n\n.pika-prev,\n.pika-next {\n    display: block;\n    cursor: pointer;\n    position: relative;\n    outline: none;\n    border: 0;\n    padding: 0;\n    width: 20px;\n    height: 30px;\n    text-indent: 20px; // hide text using text-indent trick, using width value (it's enough)\n    white-space: nowrap;\n    overflow: hidden;\n    background-color: transparent;\n    background-position: center center;\n    background-repeat: no-repeat;\n    background-size: 75% 75%;\n    opacity: .5;\n    *position: absolute;\n    *top: 0;\n\n    &:hover {\n        opacity: 1;\n    }\n\n    &.is-disabled {\n        cursor: default;\n        opacity: .2;\n    }\n}\n\n.pika-prev,\n.is-rtl .pika-next {\n    float: left;\n    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==');\n    *left: 0;\n}\n\n.pika-next,\n.is-rtl .pika-prev {\n    float: right;\n    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=');\n    *right: 0;\n}\n\n.pika-select {\n    display: inline-block;\n    *display: inline;\n}\n\n.pika-table {\n    width: 100%;\n    border-collapse: collapse;\n    border-spacing: 0;\n    border: 0;\n\n    th,\n    td {\n        width: 14.285714285714286%;\n        padding: 0;\n    }\n\n    th {\n        color: $pd-th-color;\n        font-size: 12px;\n        line-height: 25px;\n        font-weight: bold;\n        text-align: center;\n    }\n\n    abbr {\n        border-bottom: none;\n        cursor: help;\n    }\n}\n\n.pika-button {\n    cursor: pointer;\n    display: block;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    outline: none;\n    border: 0;\n    margin: 0;\n    width: 100%;\n    padding: 5px;\n    color: $pd-day-color;\n    font-size: 12px;\n    line-height: 15px;\n    text-align: right;\n    background: $pd-day-bg;\n\n    .is-today & {\n        color: $pd-day-today-color;\n        font-weight: bold;\n    }\n\n    .is-selected & {\n        color: $pd-day-selected-color;\n        font-weight: bold;\n        background: $pd-day-selected-bg;\n        box-shadow: inset 0 1px 3px $pd-day-selected-shadow;\n        border-radius: 3px;\n    }\n\n    .is-disabled &,\n    .is-outside-current-month & {        \n        color: $pd-day-disabled-color;\n        opacity: .3;\n    }\n\n    .is-disabled & {\n        pointer-events: none;\n        cursor: default;\n    }\n\n    &:hover {\n        color: $pd-day-hover-color;\n        background: $pd-day-hover-bg;\n        box-shadow: none;\n        border-radius: 3px;\n    }\n\n    .is-selection-disabled {\n        pointer-events: none;\n        cursor: default;\n    }\n}\n\n.pika-week {\n    font-size: 11px;\n    color: $pd-week-color;\n}\n\n.is-inrange .pika-button {\n    background: #D5E9F7;\n}\n\n.is-startrange .pika-button {\n    color: #fff;\n    background: #6CB31D;\n    box-shadow: none;\n    border-radius: 3px;\n}\n\n.is-endrange .pika-button {\n    color: #fff;\n    background: #33aaff;\n    box-shadow: none;\n    border-radius: 3px;\n}"),
375
        }
376
        file1a := &embedded.EmbeddedFile{
377
                Filename:    "variables.scss",
378
                FileModTime: time.Unix(1537299527, 0),
379
                Content:     string("/*!\n * Statup\n * Copyright (C) 2018.  Hunter Long and the project contributors\n * Written by Hunter Long <info@socialeck.com> and the project contributors\n *\n * https://github.com/hunterlong/statup\n *\n * The licenses for most software and other practical works are designed\n * to take away your freedom to share and change the works.  By contrast,\n * the GNU General Public License is intended to guarantee your freedom to\n * share and change all versions of a program--to make sure it remains free\n * software for all its users.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n/*    Index Page      */\n$background-color: #fcfcfc;\n$max-width: 860px;\n$title-color: #464646;\n$description-color: #939393;\n\n/*    Status Container   */\n$service-background: #ffffff;\n$service-border: 1px solid rgba(0,0,0,.125);\n$service-title: #444444;\n$service-stats-color: #4f4f4f;\n$service-description-color: #fff;\n$service-stats-size: 2.3rem;\n\n/*    Button Colors      */\n$success-color: #47d337;\n$danger-color: #dd3545;\n$primary-color: #3e9bff;\n\n/*   Footer Settings   */\n$footer-text-color: #8d8d8d;\n$nav-tab-color: #13a00d;\n$footer-display: block;\n\n/*   Global Settings */\n$global-border-radius: 0.2rem;\n\n\n/*   Mobile Settings   */\n$sm-background-color: #fcfcfc;\n$sm-border-radius: 0rem;\n\n/*   Mobile Service Container   */\n$sm-service-background: #ffffff;\n$sm-padding: 0;\n$sm-service-stats-size: 1.5rem;\n"),
380
        }
381
382
        // define dirs
383
        dir16 := &embedded.EmbeddedDir{
384
                Filename:   "",
385
                DirModTime: time.Unix(1538106377, 0),
386
                ChildFiles: []*embedded.EmbeddedFile{
387
                        file17, // "base.scss"
388
                        file18, // "mobile.scss"
389
                        file19, // "pikaday.scss"
390
                        file1a, // "variables.scss"
391
392
                },
393
        }
394
395
        // link ChildDirs
396
        dir16.ChildDirs = []*embedded.EmbeddedDir{}
397
398
        // register embeddedBox
399
        embedded.RegisterEmbeddedBox(`scss`, &embedded.EmbeddedBox{
400
                Name: `scss`,
401
                Time: time.Unix(1538106377, 0),
402
                Dirs: map[string]*embedded.EmbeddedDir{
403
                        "": dir16,
404
                },
405
                Files: map[string]*embedded.EmbeddedFile{
406
                        "base.scss":      file17,
407
                        "mobile.scss":    file18,
408
                        "pikaday.scss":   file19,
409
                        "variables.scss": file1a,
410
                },
411
        })
412
}
func init
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/rice-box.go:

309
func init() {
310
311
        // define files
312
        file13 := &embedded.EmbeddedFile{
313
                Filename:    "base.css",
314
                FileModTime: time.Unix(1538879459, 0),
315
                Content:     string("@charset \"UTF-8\";\n/*!\n * Statup\n * Copyright (C) 2018.  Hunter Long and the project contributors\n * Written by Hunter Long <info@socialeck.com> and the project contributors\n *\n * https://github.com/hunterlong/statup\n *\n * The licenses for most software and other practical works are designed\n * to take away your freedom to share and change the works.  By contrast,\n * the GNU General Public License is intended to guarantee your freedom to\n * share and change all versions of a program--to make sure it remains free\n * software for all its users.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n/*!\n * Statup\n * Copyright (C) 2018.  Hunter Long and the project contributors\n * Written by Hunter Long <info@socialeck.com> and the project contributors\n *\n * https://github.com/hunterlong/statup\n *\n * The licenses for most software and other practical works are designed\n * to take away your freedom to share and change the works.  By contrast,\n * the GNU General Public License is intended to guarantee your freedom to\n * share and change all versions of a program--to make sure it remains free\n * software for all its users.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n/*    Index Page      */\n/*    Status Container   */\n/*    Button Colors      */\n/*   Footer Settings   */\n/*   Global Settings */\n/*   Mobile Settings   */\n/*   Mobile Service Container   */\nHTML, BODY {\n  background-color: #fcfcfc; }\n\n.container {\n  padding-top: 20px;\n  padding-bottom: 20px;\n  max-width: 860px; }\n\n.header-title {\n  color: #464646; }\n\n.header-desc {\n  color: #939393; }\n\n.btn {\n  border-radius: 0.2rem; }\n\n.online_list .badge {\n  margin-top: 0.2rem; }\n\n.navbar {\n  margin-bottom: 30px; }\n\n.btn-sm {\n  line-height: 1.3;\n  font-size: 0.75rem; }\n\n.view_service_btn {\n  position: absolute;\n  bottom: -40px;\n  right: 40px; }\n\n.service_lower_info {\n  position: absolute;\n  bottom: -40px;\n  left: 40px;\n  color: #d1ffca;\n  font-size: 0.85rem; }\n\n.lg_number {\n  font-size: 2.3rem;\n  font-weight: bold;\n  display: block;\n  color: #4f4f4f; }\n\n.stats_area {\n  text-align: center;\n  color: #a5a5a5; }\n\n.lower_canvas {\n  height: 3.4rem;\n  width: 100%;\n  background-color: #48d338;\n  padding: 15px 10px;\n  margin-left: 0px !important;\n  margin-right: 0px !important; }\n\n.lower_canvas SPAN {\n  font-size: 1rem;\n  color: #fff; }\n\n.footer {\n  text-decoration: none;\n  margin-top: 20px; }\n\n.footer A {\n  color: #8d8d8d;\n  text-decoration: none; }\n\n.footer A:HOVER {\n  color: #6d6d6d; }\n\n.badge {\n  color: white;\n  border-radius: 0.2rem; }\n\n.btn-group {\n  height: 25px; }\n  .btn-group A {\n    padding: 0.1rem .75rem;\n    font-size: 0.8rem; }\n\n.card-body .badge {\n  color: #fff; }\n\n.nav-pills .nav-link {\n  border-radius: 0.2rem; }\n\n.form-control {\n  border-radius: 0.2rem; }\n\n.card {\n  background-color: #ffffff;\n  border: 1px solid rgba(0, 0, 0, 0.125); }\n\n.card-body {\n  overflow: hidden; }\n\n.card-body H4 A {\n  color: #444444;\n  text-decoration: none; }\n\n.chart-container {\n  position: relative;\n  height: 170px;\n  width: 100%; }\n\n.service-chart-container {\n  position: relative;\n  height: 400px;\n  width: 100%; }\n\n.btn-primary {\n  background-color: #3e9bff;\n  border-color: #006fe6;\n  color: white; }\n  .btn-primary.dyn-dark {\n    background-color: #32a825 !important;\n    border-color: #2c9320 !important; }\n  .btn-primary.dyn-light {\n    background-color: #75de69 !important;\n    border-color: #88e37e !important; }\n\n.btn-success {\n  background-color: #47d337; }\n  .btn-success.dyn-dark {\n    background-color: #32a825 !important;\n    border-color: #2c9320 !important; }\n  .btn-success.dyn-light {\n    background-color: #75de69 !important;\n    border-color: #88e37e !important; }\n\n.btn-danger {\n  background-color: #dd3545; }\n  .btn-danger.dyn-dark {\n    background-color: #b61f2d !important;\n    border-color: #a01b28 !important; }\n  .btn-danger.dyn-light {\n    background-color: #e66975 !important;\n    border-color: #e97f89 !important; }\n\n.bg-success {\n  background-color: #47d337 !important; }\n\n.bg-danger {\n  background-color: #dd3545 !important; }\n\n.bg-success .dyn-dark {\n  background-color: #35b027 !important; }\n\n.bg-danger .dyn-dark {\n  background-color: #bf202f !important; }\n\n.nav-pills .nav-link.active, .nav-pills .show > .nav-link {\n  background-color: #13a00d; }\n\n.nav-pills A {\n  color: #424242; }\n\n.CodeMirror {\n  /* Bootstrap Settings */\n  box-sizing: border-box;\n  margin: 0;\n  font: inherit;\n  overflow: auto;\n  font-family: inherit;\n  display: block;\n  width: 100%;\n  padding: 0px;\n  font-size: 14px;\n  line-height: 1.5;\n  color: #555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  /* Code Mirror Settings */\n  font-family: monospace;\n  position: relative;\n  overflow: hidden;\n  height: 80vh; }\n\n.CodeMirror-focused {\n  /* Bootstrap Settings */\n  border-color: #66afe9;\n  outline: 0;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; }\n\n.switch {\n  font-size: 1rem;\n  position: relative; }\n\n.switch input {\n  position: absolute;\n  height: 1px;\n  width: 1px;\n  background: none;\n  border: 0;\n  clip: rect(0 0 0 0);\n  clip-path: inset(50%);\n  overflow: hidden;\n  padding: 0; }\n\n.switch input + label {\n  position: relative;\n  min-width: calc(calc(2.375rem * .8) * 2);\n  border-radius: calc(2.375rem * .8);\n  height: calc(2.375rem * .8);\n  line-height: calc(2.375rem * .8);\n  display: inline-block;\n  cursor: pointer;\n  outline: none;\n  user-select: none;\n  vertical-align: middle;\n  text-indent: calc(calc(calc(2.375rem * .8) * 2) + .5rem); }\n\n.switch input + label::before,\n.switch input + label::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: calc(calc(2.375rem * .8) * 2);\n  bottom: 0;\n  display: block; }\n\n.switch input + label::before {\n  right: 0;\n  background-color: #dee2e6;\n  border-radius: calc(2.375rem * .8);\n  transition: 0.2s all; }\n\n.switch input + label::after {\n  top: 2px;\n  left: 2px;\n  width: calc(calc(2.375rem * .8) - calc(2px * 2));\n  height: calc(calc(2.375rem * .8) - calc(2px * 2));\n  border-radius: 50%;\n  background-color: white;\n  transition: 0.2s all; }\n\n.switch input:checked + label::before {\n  background-color: #08d; }\n\n.switch input:checked + label::after {\n  margin-left: calc(2.375rem * .8); }\n\n.switch input:focus + label::before {\n  outline: none;\n  box-shadow: 0 0 0 0.2rem rgba(0, 136, 221, 0.25); }\n\n.switch input:disabled + label {\n  color: #868e96;\n  cursor: not-allowed; }\n\n.switch input:disabled + label::before {\n  background-color: #e9ecef; }\n\n.switch.switch-sm {\n  font-size: 0.875rem; }\n\n.switch.switch-sm input + label {\n  min-width: calc(calc(1.9375rem * .8) * 2);\n  height: calc(1.9375rem * .8);\n  line-height: calc(1.9375rem * .8);\n  text-indent: calc(calc(calc(1.9375rem * .8) * 2) + .5rem); }\n\n.switch.switch-sm input + label::before {\n  width: calc(calc(1.9375rem * .8) * 2); }\n\n.switch.switch-sm input + label::after {\n  width: calc(calc(1.9375rem * .8) - calc(2px * 2));\n  height: calc(calc(1.9375rem * .8) - calc(2px * 2)); }\n\n.switch.switch-sm input:checked + label::after {\n  margin-left: calc(1.9375rem * .8); }\n\n.switch.switch-lg {\n  font-size: 1.25rem; }\n\n.switch.switch-lg input + label {\n  min-width: calc(calc(3rem * .8) * 2);\n  height: calc(3rem * .8);\n  line-height: calc(3rem * .8);\n  text-indent: calc(calc(calc(3rem * .8) * 2) + .5rem); }\n\n.switch.switch-lg input + label::before {\n  width: calc(calc(3rem * .8) * 2); }\n\n.switch.switch-lg input + label::after {\n  width: calc(calc(3rem * .8) - calc(2px * 2));\n  height: calc(calc(3rem * .8) - calc(2px * 2)); }\n\n.switch.switch-lg input:checked + label::after {\n  margin-left: calc(3rem * .8); }\n\n.switch + .switch {\n  margin-left: 1rem; }\n\n@keyframes pulse_animation {\n  0% {\n    transform: scale(1); }\n  30% {\n    transform: scale(1); }\n  40% {\n    transform: scale(1.02); }\n  50% {\n    transform: scale(1); }\n  60% {\n    transform: scale(1); }\n  70% {\n    transform: scale(1.05); }\n  80% {\n    transform: scale(1); }\n  100% {\n    transform: scale(1); } }\n.pulse {\n  animation-name: pulse_animation;\n  animation-duration: 1500ms;\n  transform-origin: 70% 70%;\n  animation-iteration-count: infinite;\n  animation-timing-function: linear; }\n\n@keyframes glow-grow {\n  0% {\n    opacity: 0;\n    transform: scale(1); }\n  80% {\n    opacity: 1; }\n  100% {\n    transform: scale(2);\n    opacity: 0; } }\n.pulse-glow {\n  animation-name: glow-grown;\n  animation-duration: 100ms;\n  transform-origin: 70% 30%;\n  animation-iteration-count: infinite;\n  animation-timing-function: linear; }\n\n.pulse-glow:before,\n.pulse-glow:after {\n  position: absolute;\n  content: '';\n  height: 0.5rem;\n  width: 1.75rem;\n  top: 1.2rem;\n  right: 2.15rem;\n  border-radius: 0;\n  box-shadow: 0 0 7px #47d337;\n  animation: glow-grow 2s ease-out infinite; }\n\n.sortable_drag {\n  background-color: #0000000f; }\n\n.drag_icon {\n  cursor: move;\n  /* fallback if grab cursor is unsupported */\n  cursor: grab;\n  cursor: -moz-grab;\n  cursor: -webkit-grab;\n  width: 25px;\n  height: 25px;\n  display: inline-block;\n  margin-right: 5px;\n  margin-left: -10px;\n  text-align: center;\n  color: #b1b1b1; }\n\n/* (Optional) Apply a \"closed-hand\" cursor during drag operation. */\n.drag_icon:active {\n  cursor: grabbing;\n  cursor: -moz-grabbing;\n  cursor: -webkit-grabbing; }\n\n.switch_btn {\n  float: right;\n  margin: -1px 0px 0px 0px;\n  display: block; }\n\n#start_container {\n  position: absolute;\n  z-index: 99999;\n  margin-top: 20px; }\n\n#end_container {\n  position: absolute;\n  z-index: 99999;\n  margin-top: 20px;\n  right: 0; }\n\n.pointer {\n  cursor: pointer; }\n\n/*!\n * Pikaday\n * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/\n */\n.pika-single {\n  z-index: 9999;\n  display: block;\n  position: relative;\n  color: #333;\n  background: #fff;\n  border: 1px solid #ccc;\n  border-bottom-color: #bbb;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif; }\n  .pika-single.is-hidden {\n    display: none; }\n  .pika-single.is-bound {\n    position: absolute;\n    box-shadow: 0 5px 15px -5px rgba(0, 0, 0, 0.5); }\n\n.pika-single {\n  *zoom: 1; }\n  .pika-single:before, .pika-single:after {\n    content: \" \";\n    display: table; }\n  .pika-single:after {\n    clear: both; }\n\n.pika-lendar {\n  float: left;\n  width: 240px;\n  margin: 8px; }\n\n.pika-title {\n  position: relative;\n  text-align: center; }\n  .pika-title select {\n    cursor: pointer;\n    position: absolute;\n    z-index: 9998;\n    margin: 0;\n    left: 0;\n    top: 5px;\n    filter: alpha(opacity=0);\n    opacity: 0; }\n\n.pika-label {\n  display: inline-block;\n  *display: inline;\n  position: relative;\n  z-index: 9999;\n  overflow: hidden;\n  margin: 0;\n  padding: 5px 3px;\n  font-size: 14px;\n  line-height: 20px;\n  font-weight: bold;\n  color: #333;\n  background-color: #fff; }\n\n.pika-prev,\n.pika-next {\n  display: block;\n  cursor: pointer;\n  position: relative;\n  outline: none;\n  border: 0;\n  padding: 0;\n  width: 20px;\n  height: 30px;\n  text-indent: 20px;\n  white-space: nowrap;\n  overflow: hidden;\n  background-color: transparent;\n  background-position: center center;\n  background-repeat: no-repeat;\n  background-size: 75% 75%;\n  opacity: .5;\n  *position: absolute;\n  *top: 0; }\n  .pika-prev:hover,\n  .pika-next:hover {\n    opacity: 1; }\n  .pika-prev.is-disabled,\n  .pika-next.is-disabled {\n    cursor: default;\n    opacity: .2; }\n\n.pika-prev,\n.is-rtl .pika-next {\n  float: left;\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==\");\n  *left: 0; }\n\n.pika-next,\n.is-rtl .pika-prev {\n  float: right;\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=\");\n  *right: 0; }\n\n.pika-select {\n  display: inline-block;\n  *display: inline; }\n\n.pika-table {\n  width: 100%;\n  border-collapse: collapse;\n  border-spacing: 0;\n  border: 0; }\n  .pika-table th,\n  .pika-table td {\n    width: 14.285714285714286%;\n    padding: 0; }\n  .pika-table th {\n    color: #999;\n    font-size: 12px;\n    line-height: 25px;\n    font-weight: bold;\n    text-align: center; }\n  .pika-table abbr {\n    border-bottom: none;\n    cursor: help; }\n\n.pika-button {\n  cursor: pointer;\n  display: block;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  outline: none;\n  border: 0;\n  margin: 0;\n  width: 100%;\n  padding: 5px;\n  color: #666;\n  font-size: 12px;\n  line-height: 15px;\n  text-align: right;\n  background: #f5f5f5; }\n  .is-today .pika-button {\n    color: #33aaff;\n    font-weight: bold; }\n  .is-selected .pika-button {\n    color: #fff;\n    font-weight: bold;\n    background: #33aaff;\n    box-shadow: inset 0 1px 3px #178fe5;\n    border-radius: 3px; }\n  .is-disabled .pika-button, .is-outside-current-month .pika-button {\n    color: #999;\n    opacity: .3; }\n  .is-disabled .pika-button {\n    pointer-events: none;\n    cursor: default; }\n  .pika-button:hover {\n    color: #fff;\n    background: #ff8000;\n    box-shadow: none;\n    border-radius: 3px; }\n  .pika-button .is-selection-disabled {\n    pointer-events: none;\n    cursor: default; }\n\n.pika-week {\n  font-size: 11px;\n  color: #999; }\n\n.is-inrange .pika-button {\n  background: #D5E9F7; }\n\n.is-startrange .pika-button {\n  color: #fff;\n  background: #6CB31D;\n  box-shadow: none;\n  border-radius: 3px; }\n\n.is-endrange .pika-button {\n  color: #fff;\n  background: #33aaff;\n  box-shadow: none;\n  border-radius: 3px; }\n\n/*!\n * Statup\n * Copyright (C) 2018.  Hunter Long and the project contributors\n * Written by Hunter Long <info@socialeck.com> and the project contributors\n *\n * https://github.com/hunterlong/statup\n *\n * The licenses for most software and other practical works are designed\n * to take away your freedom to share and change the works.  By contrast,\n * the GNU General Public License is intended to guarantee your freedom to\n * share and change all versions of a program--to make sure it remains free\n * software for all its users.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n@media (max-width: 767px) {\n  HTML, BODY {\n    background-color: #fcfcfc; }\n\n  .sm-container {\n    margin-top: 40px !important;\n    padding: 0 !important; }\n\n  .list-group-item H5 {\n    font-size: 0.9rem; }\n\n  .container {\n    padding: 0 !important; }\n\n  .navbar {\n    margin-left: 0px;\n    margin-top: 0px;\n    width: 100%;\n    margin-bottom: 0; }\n\n  .btn-sm {\n    line-height: 0.9rem;\n    font-size: 0.65rem; }\n\n  .full-col-12 {\n    padding-left: 0px;\n    padding-right: 0px; }\n\n  .card {\n    border: 0;\n    border-radius: 0rem;\n    padding: 0;\n    background-color: #ffffff; }\n\n  .card-body {\n    font-size: 6pt;\n    padding: 5px 5px; }\n\n  .lg_number {\n    font-size: 7.8vw; }\n\n  .stats_area {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important; }\n\n  .stats_area .col-4 {\n    padding-left: 0;\n    padding-right: 0;\n    font-size: 0.6rem; }\n\n  .list-group-item {\n    border-top: 1px solid #e4e4e4;\n    border: 0px; }\n\n  .list-group-item:first-child {\n    border-top-left-radius: 0;\n    border-top-right-radius: 0; }\n\n  .list-group-item:last-child {\n    border-bottom-right-radius: 0;\n    border-bottom-left-radius: 0; }\n\n  .list-group-item P {\n    font-size: 0.7rem; }\n\n  .service-chart-container {\n    height: 200px; } }\n\n/*# sourceMappingURL=base.css.map */\n"),
316
        }
317
        file14 := &embedded.EmbeddedFile{
318
                Filename:    "base.css.map",
319
                FileModTime: time.Unix(1538879459, 0),
320
                Content:     string("{\n\"version\": 3,\n\"mappings\": \";AAAA;;;;;;;;;;;;;;;GAeG;ACfH;;;;;;;;;;;;;;;GAeG;AAEH,wBAAwB;AAMxB,2BAA2B;AAQ3B,2BAA2B;AAK3B,yBAAyB;AAKzB,uBAAuB;AAIvB,yBAAyB;AAIzB,kCAAkC;AD7BlC,UAAU;EACN,gBAAgB,ECHD,OAAO;;ADM1B,UAAW;EACP,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,IAAI;EACpB,SAAS,ECRD,KAAK;;ADWjB,aAAc;EACV,KAAK,ECXK,OAAO;;ADcrB,YAAa;EACT,KAAK,ECdW,OAAO;;ADiB3B,IAAK;EACD,aAAa,ECGM,MAAM;;ADA7B,mBAAoB;EAChB,UAAU,EAAE,MAAM;;AAGtB,OAAQ;EACJ,aAAa,EAAE,IAAI;;AAGvB,OAAQ;EACJ,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,OAAO;;AAGtB,iBAAkB;EACd,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,KAAK;EACb,KAAK,EAAE,IAAI;;AAGf,mBAAoB;EAChB,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,KAAK;EACb,IAAI,EAAE,IAAI;EACV,KAAK,EAAE,OAAO;EACd,SAAS,EAAE,OAAO;;AAGtB,UAAW;EACP,SAAS,ECzCQ,MAAM;ED0CvB,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,KAAK;EACd,KAAK,EC9Ca,OAAO;;ADiD7B,WAAY;EACR,UAAU,EAAE,MAAM;EAClB,KAAK,EAAE,OAAO;;AAGlB,aAAc;EACV,MAAM,EAAE,MAAM;EACd,KAAK,EAAE,IAAI;EACX,gBAAgB,EAAE,OAAO;EACzB,OAAO,EAAE,SAAS;EAClB,WAAW,EAAE,cAAc;EAC3B,YAAY,EAAE,cAAc;;AAGhC,kBAAmB;EACf,SAAS,EAAE,IAAI;EACf,KAAK,EChEmB,IAAI;;ADmEhC,OAAQ;EACJ,eAAe,EAAE,IAAI;EACrB,UAAU,EAAE,IAAI;;AAGpB,SAAU;EACN,KAAK,EChEW,OAAO;EDiEvB,eAAe,EAAE,IAAI;;AAGzB,eAAgB;EACZ,KAAK,EAAE,OAAO;;AAGlB,MAAO;EACH,KAAK,EAAE,KAAK;EACZ,aAAa,ECrEM,MAAM;;ADwE7B,UAAW;EACP,MAAM,EAAE,IAAI;EAEZ,YAAI;IACA,OAAO,EAAE,aAAa;IACtB,SAAS,EAAE,MAAM;;AAIzB,iBAAkB;EACd,KAAK,EAAE,IAAI;;AAGf,oBAAqB;EACjB,aAAa,ECtFM,MAAM;;ADyF7B,aAAc;EACV,aAAa,EC1FM,MAAM;;AD6F7B,KAAM;EACF,gBAAgB,EChHC,OAAO;EDiHxB,MAAM,EChHO,8BAA0B;;ADmH3C,UAAW;EACP,QAAQ,EAAE,MAAM;;AAGpB,eAAgB;EACZ,KAAK,ECvHO,OAAO;EDwHnB,eAAe,EAAE,IAAI;;AAGzB,gBAAiB;EACf,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,KAAK;EACb,KAAK,EAAE,IAAI;;AAGb,wBAAyB;EACvB,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,KAAK;EACb,KAAK,EAAE,IAAI;;AAkCb,YAAa;EACT,gBAAgB,EC/JJ,OAAO;EDgKnB,YAAY,EAAE,OAA2B;EACzC,KAAK,EAAE,KAAK;EAdZ,qBAAW;IACP,gBAAgB,EAAE,kBAA8B;IAChD,YAAY,EAAE,kBAA8B;EAEhD,sBAAY;IACR,gBAAgB,EAAE,kBAA+B;IACjD,YAAY,EAAE,kBAA+B;;AAYrD,YAAa;EACT,gBAAgB,ECxKJ,OAAO;EDqJnB,qBAAW;IACP,gBAAgB,EAAE,kBAA8B;IAChD,YAAY,EAAE,kBAA8B;EAEhD,sBAAY;IACR,gBAAgB,EAAE,kBAA+B;IACjD,YAAY,EAAE,kBAA+B;;AAiBrD,WAAY;EACR,gBAAgB,EC5KL,OAAO;EDoJlB,oBAAW;IACP,gBAAgB,EAAE,kBAA8B;IAChD,YAAY,EAAE,kBAA8B;EAEhD,qBAAY;IACR,gBAAgB,EAAE,kBAA+B;IACjD,YAAY,EAAE,kBAA+B;;AAsBrD,WAAY;EACR,gBAAgB,EAAE,kBAAyB;;AAG/C,UAAW;EACP,gBAAgB,EAAE,kBAAwB;;AAG9C,qBAAsB;EAClB,gBAAgB,EAAE,kBAAsC;;AAG5D,oBAAqB;EACjB,gBAAgB,EAAE,kBAAqC;;AAG3D,yDAAwD;EACpD,gBAAgB,EC5LJ,OAAO;;AD+LvB,YAAa;EACT,KAAK,EAAE,OAAO;;AAIlB,WAAY;EACV,wBAAwB;EACxB,UAAU,EAAE,UAAU;EACtB,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,OAAO;EACb,QAAQ,EAAE,IAAI;EACd,WAAW,EAAE,OAAO;EACpB,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,GAAG;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,IAAI;EACX,gBAAgB,EAAE,IAAI;EACtB,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,cAAc;EACtB,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,oCAAmC;EAC/C,UAAU,EAAE,0DAA0D;EACtE,0BAA0B;EAC1B,WAAW,EAAE,SAAS;EACtB,QAAQ,EAAE,QAAQ;EAClB,QAAQ,EAAE,MAAM;EAChB,MAAM,EAAC,IAAI;;AAGb,mBAAoB;EAClB,wBAAwB;EACxB,YAAY,EAAE,OAAO;EACrB,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,sEAAiE;EAC7E,UAAU,EAAE,0DAA0D;;AAGxE,OAAQ;EACN,SAAS,EAAE,IAAI;EACf,QAAQ,EAAE,QAAQ;;AAEpB,aAAc;EACZ,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,GAAG;EACX,KAAK,EAAE,GAAG;EACV,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,aAAa;EACnB,SAAS,EAAE,UAAU;EACrB,QAAQ,EAAE,MAAM;EAChB,OAAO,EAAE,CAAC;;AAEZ,qBAAsB;EACpB,QAAQ,EAAE,QAAQ;EAClB,SAAS,EAAE,6BAA6B;EACxC,aAAa,EAAE,mBAAmB;EAClC,MAAM,EAAE,mBAAmB;EAC3B,WAAW,EAAE,mBAAmB;EAChC,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,OAAO;EACf,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,MAAM;EACtB,WAAW,EAAE,2CAA2C;;AAE1D;4BAC6B;EAC3B,OAAO,EAAE,EAAE;EACX,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,6BAA6B;EACpC,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,KAAK;;AAEhB,6BAA8B;EAC5B,KAAK,EAAE,CAAC;EACR,gBAAgB,EAAE,OAAO;EACzB,aAAa,EAAE,mBAAmB;EAClC,UAAU,EAAE,QAAQ;;AAEtB,4BAA6B;EAC3B,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,GAAG;EACT,KAAK,EAAE,yCAAyC;EAChD,MAAM,EAAE,yCAAyC;EACjD,aAAa,EAAE,GAAG;EAClB,gBAAgB,EAAE,KAAK;EACvB,UAAU,EAAE,QAAQ;;AAEtB,qCAAsC;EACpC,gBAAgB,EAAE,IAAI;;AAExB,oCAAqC;EACnC,WAAW,EAAE,mBAAmB;;AAElC,mCAAoC;EAClC,OAAO,EAAE,IAAI;EACb,UAAU,EAAE,oCAAoC;;AAElD,8BAA+B;EAC7B,KAAK,EAAE,OAAO;EACd,MAAM,EAAE,WAAW;;AAErB,sCAAuC;EACrC,gBAAgB,EAAE,OAAO;;AAE3B,iBAAkB;EAChB,SAAS,EAAE,QAAQ;;AAErB,+BAAgC;EAC9B,SAAS,EAAE,8BAA8B;EACzC,MAAM,EAAE,oBAAoB;EAC5B,WAAW,EAAE,oBAAoB;EACjC,WAAW,EAAE,4CAA4C;;AAE3D,uCAAwC;EACtC,KAAK,EAAE,8BAA8B;;AAEvC,sCAAuC;EACrC,KAAK,EAAE,0CAA0C;EACjD,MAAM,EAAE,0CAA0C;;AAEpD,8CAA+C;EAC7C,WAAW,EAAE,oBAAoB;;AAEnC,iBAAkB;EAChB,SAAS,EAAE,OAAO;;AAEpB,+BAAgC;EAC9B,SAAS,EAAE,yBAAyB;EACpC,MAAM,EAAE,eAAe;EACvB,WAAW,EAAE,eAAe;EAC5B,WAAW,EAAE,uCAAuC;;AAEtD,uCAAwC;EACtC,KAAK,EAAE,yBAAyB;;AAElC,sCAAuC;EACrC,KAAK,EAAE,qCAAqC;EAC5C,MAAM,EAAE,qCAAqC;;AAE/C,8CAA+C;EAC7C,WAAW,EAAE,eAAe;;AAE9B,iBAAkB;EAChB,WAAW,EAAE,IAAI;;AAInB,0BASC;EARG,EAAG;IAAE,SAAS,EAAE,QAAQ;EACxB,GAAI;IAAE,SAAS,EAAE,QAAQ;EACzB,GAAI;IAAE,SAAS,EAAE,WAAW;EAC5B,GAAI;IAAE,SAAS,EAAE,QAAQ;EACzB,GAAI;IAAE,SAAS,EAAE,QAAQ;EACzB,GAAI;IAAE,SAAS,EAAE,WAAW;EAC5B,GAAI;IAAE,SAAS,EAAE,QAAQ;EACzB,IAAK;IAAE,SAAS,EAAE,QAAQ;AAG9B,MAAO;EACH,cAAc,EAAE,eAAe;EAC/B,kBAAkB,EAAE,MAAM;EAC1B,gBAAgB,EAAC,OAAO;EACxB,yBAAyB,EAAE,QAAQ;EACnC,yBAAyB,EAAE,MAAM;;AAIrC,oBAYC;EAXC,EAAG;IACD,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,QAAQ;EAErB,GAAI;IACF,OAAO,EAAE,CAAC;EAEZ,IAAK;IACH,SAAS,EAAE,QAAQ;IACnB,OAAO,EAAE,CAAC;AAGd,WAAY;EACR,cAAc,EAAE,UAAU;EAC1B,kBAAkB,EAAE,KAAK;EACzB,gBAAgB,EAAE,OAAO;EACzB,yBAAyB,EAAE,QAAQ;EACnC,yBAAyB,EAAE,MAAM;;AAGrC;iBACkB;EACd,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,EAAE;EACX,MAAM,EAAE,MAAM;EACd,KAAK,EAAE,OAAO;EACd,GAAG,EAAE,MAAM;EACX,KAAK,EAAE,OAAO;EACd,aAAa,EAAE,CAAC;EAChB,UAAU,EAAE,eAAe;EAC3B,SAAS,EAAE,8BAA8B;;AAG7C,cAAe;EACb,gBAAgB,EAAE,SAAS;;AAG7B,UAAW;EACT,MAAM,EAAE,IAAI;EAAE,4CAA4C;EAC1D,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,SAAS;EACjB,MAAM,EAAE,YAAY;EACpB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,YAAY;EACrB,YAAY,EAAE,GAAG;EACjB,WAAW,EAAE,KAAK;EAClB,UAAU,EAAE,MAAM;EAClB,KAAK,EAAE,OAAO;;AAGhB,oEAAoE;AACpE,iBAAkB;EAChB,MAAM,EAAE,QAAQ;EAChB,MAAM,EAAE,aAAa;EACrB,MAAM,EAAE,gBAAgB;;AAG1B,WAAY;EACV,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,gBAAgB;EACxB,OAAO,EAAE,KAAK;;AAGhB,gBAAiB;EACf,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,IAAI;;AAGlB,cAAe;EACb,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,CAAC;;AAGV,QAAS;EACP,MAAM,EAAE,OAAO;;AEhejB;;;GAGG;AA8BH,YAAa;EACT,OAAO,EAAE,IAAI;EACb,OAAO,EAAE,KAAK;EACd,QAAQ,EAAE,QAAQ;EAClB,KAAK,EA3BO,IAAI;EA4BhB,UAAU,EAzBC,IAAI;EA0Bf,MAAM,EAAE,cAA2B;EACnC,mBAAmB,EAzBG,IAAI;EA0B1B,WAAW,EAXE,8CAA8C;EAa3D,sBAAY;IACR,OAAO,EAAE,IAAI;EAGjB,qBAAW;IACP,QAAQ,EAAE,QAAQ;IAClB,UAAU,EAAE,kCAAiC;;AAMrD,YAAa;EACT,KAAK,EAAE,CAAC;EAER,uCACQ;IACJ,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,KAAK;EAGlB,kBAAQ;IAAE,KAAK,EAAE,IAAI;;AAGzB,YAAa;EACT,KAAK,EAAE,IAAI;EACX,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,GAAG;;AAGf,WAAY;EACR,QAAQ,EAAE,QAAQ;EAClB,UAAU,EAAE,MAAM;EAElB,kBAAO;IACH,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,IAAI;IACb,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,GAAG;IACR,MAAM,EAAE,gBAAgB;IACxB,OAAO,EAAE,CAAC;;AAIlB,WAAY;EACR,OAAO,EAAE,YAAY;EACrB,QAAQ,EAAE,MAAM;EAChB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,IAAI;EACb,QAAQ,EAAE,MAAM;EAChB,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,OAAO;EAChB,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,IAAI;EACjB,WAAW,EAAE,IAAI;EACjB,KAAK,EAzFQ,IAAI;EA0FjB,gBAAgB,EAzFN,IAAI;;AA4FlB;UACW;EACP,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,OAAO;EACf,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,IAAI;EACb,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,IAAI;EACjB,WAAW,EAAE,MAAM;EACnB,QAAQ,EAAE,MAAM;EAChB,gBAAgB,EAAE,WAAW;EAC7B,mBAAmB,EAAE,aAAa;EAClC,iBAAiB,EAAE,SAAS;EAC5B,eAAe,EAAE,OAAO;EACxB,OAAO,EAAE,EAAE;EACX,SAAS,EAAE,QAAQ;EACnB,IAAI,EAAE,CAAC;EAEP;kBAAQ;IACJ,OAAO,EAAE,CAAC;EAGd;wBAAc;IACV,MAAM,EAAE,OAAO;IACf,OAAO,EAAE,EAAE;;AAInB;kBACmB;EACf,KAAK,EAAE,IAAI;EACX,gBAAgB,EAAE,yNAAyN;EAC3O,KAAK,EAAE,CAAC;;AAGZ;kBACmB;EACf,KAAK,EAAE,KAAK;EACZ,gBAAgB,EAAE,yNAAyN;EAC3O,MAAM,EAAE,CAAC;;AAGb,YAAa;EACT,OAAO,EAAE,YAAY;EACrB,QAAQ,EAAE,MAAM;;AAGpB,WAAY;EACR,KAAK,EAAE,IAAI;EACX,eAAe,EAAE,QAAQ;EACzB,cAAc,EAAE,CAAC;EACjB,MAAM,EAAE,CAAC;EAET;gBACG;IACC,KAAK,EAAE,mBAAmB;IAC1B,OAAO,EAAE,CAAC;EAGd,cAAG;IACC,KAAK,EAtJC,IAAI;IAuJV,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,MAAM;EAGtB,gBAAK;IACD,aAAa,EAAE,IAAI;IACnB,MAAM,EAAE,IAAI;;AAIpB,YAAa;EACT,MAAM,EAAE,OAAO;EACf,OAAO,EAAE,KAAK;EACd,eAAe,EAAE,UAAU;EAC3B,UAAU,EAAE,UAAU;EACtB,OAAO,EAAE,IAAI;EACb,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,CAAC;EACT,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,GAAG;EACZ,KAAK,EA5KM,IAAI;EA6Kf,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,IAAI;EACjB,UAAU,EAAE,KAAK;EACjB,UAAU,EA/KF,OAAO;EAiLf,sBAAY;IACR,KAAK,EA/KQ,OAAO;IAgLpB,WAAW,EAAE,IAAI;EAGrB,yBAAe;IACX,KAAK,EAnLW,IAAI;IAoLpB,WAAW,EAAE,IAAI;IACjB,UAAU,EApLG,OAAO;IAqLpB,UAAU,EAAE,uBAAuC;IACnD,aAAa,EAAE,GAAG;EAGtB,iEAC4B;IACxB,KAAK,EAzLW,IAAI;IA0LpB,OAAO,EAAE,EAAE;EAGf,yBAAe;IACX,cAAc,EAAE,IAAI;IACpB,MAAM,EAAE,OAAO;EAGnB,kBAAQ;IACJ,KAAK,EAzMQ,IAAI;IA0MjB,UAAU,EAzMA,OAAO;IA0MjB,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,GAAG;EAGtB,mCAAuB;IACnB,cAAc,EAAE,IAAI;IACpB,MAAM,EAAE,OAAO;;AAIvB,UAAW;EACP,SAAS,EAAE,IAAI;EACf,KAAK,EAhNO,IAAI;;AAmNpB,wBAAyB;EACrB,UAAU,EAAE,OAAO;;AAGvB,2BAA4B;EACxB,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,OAAO;EACnB,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,GAAG;;AAGtB,yBAA0B;EACtB,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,OAAO;EACnB,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,GAAG;;AC7PtB;;;;;;;;;;;;;;;GAeG;AAEH,yBAA0B;EAEtB,UAAU;IACN,gBAAgB,EF0BF,OAAO;;EEvBzB,aAAc;IACV,UAAU,EAAE,eAAe;IAC3B,OAAO,EAAE,YAAY;;EAGzB,mBAAoB;IAChB,SAAS,EAAE,MAAM;;EAGrB,UAAW;IACP,OAAO,EAAE,YAAY;;EAGzB,OAAQ;IACJ,WAAW,EAAE,GAAG;IAChB,UAAU,EAAE,GAAG;IACf,KAAK,EAAE,IAAI;IACX,aAAa,EAAE,CAAC;;EAGpB,OAAQ;IACJ,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,OAAO;;EAGtB,YAAa;IACT,YAAY,EAAE,GAAG;IACjB,aAAa,EAAE,GAAG;;EAGtB,KAAM;IACF,MAAM,EAAE,CAAC;IACT,aAAa,EFRF,IAAI;IESf,OAAO,EFLF,CAAC;IEMN,gBAAgB,EFPA,OAAO;;EEU3B,UAAW;IACP,SAAS,EAAE,GAAG;IACd,OAAO,EAAE,OAAO;;EAGpB,UAAW;IACP,SAAS,EAAE,KAAK;;EAGpB,WAAY;IACR,UAAU,EAAE,iBAAiB;IAC7B,aAAa,EAAE,iBAAiB;;EAGpC,kBAAmB;IACf,YAAY,EAAE,CAAC;IACf,aAAa,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM;;EAGrB,gBAAiB;IACb,UAAU,EAAE,iBAAiB;IAC7B,MAAM,EAAE,GAAG;;EAGf,4BAA6B;IACzB,sBAAsB,EAAE,CAAC;IACzB,uBAAuB,EAAE,CAAC;;EAG9B,2BAA4B;IACxB,0BAA0B,EAAE,CAAC;IAC7B,yBAAyB,EAAE,CAAC;;EAGhC,kBAAmB;IACf,SAAS,EAAE,MAAM;;EAGrB,wBAAyB;IACrB,MAAM,EAAE,KAAK\",\n\"sources\": [\"../scss/base.scss\",\"../scss/variables.scss\",\"../scss/pikaday.scss\",\"../scss/mobile.scss\"],\n\"names\": [],\n\"file\": \"base.css\"\n}\n"),
321
        }
322
        file15 := &embedded.EmbeddedFile{
323
                Filename:    "bootstrap.min.css",
324
                FileModTime: time.Unix(1530208361, 0),
325
                Content:     string("/*!\n * Bootstrap v4.1.1 (https://getbootstrap.com/)\n * Copyright 2011-2018 The Bootstrap Authors\n * Copyright 2011-2018 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex=\"-1\"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:\"\\2014 \\00A0\"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:\"\";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:\"\";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:\"\";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:\"\"}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:\"\";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:\"\";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:\"\";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E\")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E\")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size=\"1\"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-label::after{border-color:#80bdff}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:\"Browse\"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:\"Browse\";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:\"\";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:\"/\"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:\"\";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:\"\";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:\"\";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-item-next,.carousel-item-prev,.carousel-item.active{transition:none}}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\")}.carousel-control-next-icon{background-image:url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:\"\"}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:\"\"}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:\"\"}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:\"\"}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:\" (\" attr(title) \")\"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}\n/*# sourceMappingURL=bootstrap.min.css.map */"),
326
        }
327
328
        // define dirs
329
        dir12 := &embedded.EmbeddedDir{
330
                Filename:   "",
331
                DirModTime: time.Unix(1538106376, 0),
332
                ChildFiles: []*embedded.EmbeddedFile{
333
                        file13, // "base.css"
334
                        file14, // "base.css.map"
335
                        file15, // "bootstrap.min.css"
336
337
                },
338
        }
339
340
        // link ChildDirs
341
        dir12.ChildDirs = []*embedded.EmbeddedDir{}
342
343
        // register embeddedBox
344
        embedded.RegisterEmbeddedBox(`css`, &embedded.EmbeddedBox{
345
                Name: `css`,
346
                Time: time.Unix(1538106376, 0),
347
                Dirs: map[string]*embedded.EmbeddedDir{
348
                        "": dir12,
349
                },
350
                Files: map[string]*embedded.EmbeddedFile{
351
                        "base.css":          file13,
352
                        "base.css.map":      file14,
353
                        "bootstrap.min.css": file15,
354
                },
355
        })
356
}
func Assets
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go:

38
func Assets() {
39
        CssBox = rice.MustFindBox("css")
40
        ScssBox = rice.MustFindBox("scss")
41
        JsBox = rice.MustFindBox("js")
42
        TmplBox = rice.MustFindBox("tmpl")
43
}
func @79:5
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go:

79
func() {
80
                stdout, errStdout = copyAndCapture(os.Stdout, stdoutIn)
81
        }
func @83:5
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go:

83
func() {
84
                stderr, errStderr = copyAndCapture(os.Stderr, stderrIn)
85
        }
func CompileSASS
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go:

57
func CompileSASS(folder string) error {
58
        sassBin := os.Getenv("SASS")
59
        if sassBin == "" {
60
                sassBin = "sass"
61
        }
62
63
        scssFile := fmt.Sprintf("%v/%v", folder, "assets/scss/base.scss")
64
        baseFile := fmt.Sprintf("%v/%v", folder, "assets/css/base.css")
65
66
        utils.Log(1, fmt.Sprintf("Compiling SASS %v into %v", scssFile, baseFile))
67
        command := fmt.Sprintf("%v %v %v", sassBin, scssFile, baseFile)
68
69
        utils.Log(1, fmt.Sprintf("Command: sh -c %v", command))
70
71
        testCmd := exec.Command("sh", "-c", command)
72
73
        var stdout, stderr []byte
74
        var errStdout, errStderr error
75
        stdoutIn, _ := testCmd.StdoutPipe()
76
        stderrIn, _ := testCmd.StderrPipe()
77
        testCmd.Start()
78
79
        go func() {
80
                stdout, errStdout = copyAndCapture(os.Stdout, stdoutIn)
81
        }()
82
83
        go func() {
84
                stderr, errStderr = copyAndCapture(os.Stderr, stderrIn)
85
        }()
86
87
        err := testCmd.Wait()
88
        if err != nil {
89
                utils.Log(3, err)
90
                return err
91
        }
92
93
        if errStdout != nil || errStderr != nil {
94
                utils.Log(3, fmt.Sprintf("Failed to compile assets with SASS %v", err))
95
                return errors.New("failed to capture stdout or stderr")
96
        }
97
98
        if err != nil {
99
                utils.Log(3, fmt.Sprintf("Failed to compile assets with SASS %v", err))
100
                utils.Log(3, fmt.Sprintf("bash -c %v %v %v", sassBin, scssFile, baseFile))
101
                return err
102
        }
103
104
        outStr, errStr := string(stdout), string(stderr)
105
        utils.Log(1, fmt.Sprintf("out: %v | error: %v", outStr, errStr))
106
        utils.Log(1, "SASS Compiling is complete!")
107
        return err
108
}
func MakePublicFolder
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go:

207
func MakePublicFolder(folder string) error {
208
        utils.Log(1, fmt.Sprintf("Creating folder '%v'", folder))
209
        if _, err := os.Stat(folder); os.IsNotExist(err) {
210
                err = os.MkdirAll(folder, 0777)
211
                if err != nil {
212
                        utils.Log(3, fmt.Sprintf("Failed to created %v directory, %v", folder, err))
213
                        return err
214
                }
215
        }
216
        return nil
217
}
func SaveAsset
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go:

131
func SaveAsset(data []byte, folder, file string) error {
132
        utils.Log(1, fmt.Sprintf("Saving %v/%v into assets folder", folder, file))
133
        err := ioutil.WriteFile(folder+"/assets/"+file, data, 0744)
134
        if err != nil {
135
                utils.Log(3, fmt.Sprintf("Failed to save %v/%v, %v", folder, file, err))
136
                return err
137
        }
138
        return nil
139
}
func DeleteAllAssets
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go:

179
func DeleteAllAssets(folder string) error {
180
        err := os.RemoveAll(folder + "/assets")
181
        if err != nil {
182
                utils.Log(1, fmt.Sprintf("There was an issue deleting Statup Assets, %v", err))
183
                return err
184
        }
185
        utils.Log(1, "Statup assets have been deleted")
186
        return err
187
}
func copyAndCapture
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go:

220
func copyAndCapture(w io.Writer, r io.Reader) ([]byte, error) {
221
        var out []byte
222
        buf := make([]byte, 1024, 1024)
223
        for {
224
                n, err := r.Read(buf[:])
225
                if n > 0 {
226
                        d := buf[:n]
227
                        out = append(out, d...)
228
                        _, err := w.Write(d)
229
                        if err != nil {
230
                                return out, err
231
                        }
232
                }
233
                if err != nil {
234
                        // Read returns io.EOF at the end of file, which is not an error for us
235
                        if err == io.EOF {
236
                                err = nil
237
                        }
238
                        return out, err
239
                }
240
        }
241
}
func CopyToPublic
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go:

190
func CopyToPublic(box *rice.Box, folder, file string) error {
191
        assetFolder := fmt.Sprintf("%v/%v", folder, file)
192
        utils.Log(1, fmt.Sprintf("Copying %v to %v", file, assetFolder))
193
        base, err := box.String(file)
194
        if err != nil {
195
                utils.Log(3, fmt.Sprintf("Failed to copy %v to %v, %v.", file, assetFolder, err))
196
                return err
197
        }
198
        err = ioutil.WriteFile(assetFolder, []byte(base), 0744)
199
        if err != nil {
200
                utils.Log(3, fmt.Sprintf("Failed to write file %v to %v, %v.", file, assetFolder, err))
201
                return err
202
        }
203
        return nil
204
}
func OpenAsset
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go:

142
func OpenAsset(folder, file string) string {
143
        dat, err := ioutil.ReadFile(folder + "/assets/" + file)
144
        if err != nil {
145
                utils.Log(3, fmt.Sprintf("Failed to open %v, %v", file, err))
146
                return ""
147
        }
148
        return string(dat)
149
}
func UsingAssets
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go:

111
func UsingAssets(folder string) bool {
112
        if _, err := os.Stat(folder + "/assets"); err == nil {
113
                return true
114
        } else {
115
                if os.Getenv("USE_ASSETS") == "true" {
116
                        utils.Log(1, "Environment variable USE_ASSETS was found.")
117
                        CreateAllAssets(folder)
118
                        err := CompileSASS(folder)
119
                        if err != nil {
120
                                CopyToPublic(CssBox, folder+"/css", "base.css")
121
                                utils.Log(2, "Default 'base.css' was insert because SASS did not work.")
122
                                return true
123
                        }
124
                        return true
125
                }
126
        }
127
        return false
128
}
func HelpMarkdown
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go:

46
func HelpMarkdown() string {
47
        helpSrc, err := TmplBox.Bytes("help.md")
48
        if err != nil {
49
                utils.Log(4, err)
50
                return "error generating markdown"
51
        }
52
        output := blackfriday.Run(helpSrc)
53
        return string(output)
54
}
Package Overview: github.com/hunterlong/statup/utils 55.29%

This is a coverage report created after analysis of the github.com/hunterlong/statup/utils package. It has been generated with the following command:

gocov test github.com/hunterlong/statup/utils | gocov-html

Here are the stats. Please select a function name to view its implementation and see what's left for testing.

Log(...)github.com/hunterlong/statup/utils/log.go100.00%16/16
UnderScoreString(...)github.com/hunterlong/statup/utils/utils.go100.00%10/10
NewSHA1Hash(...)github.com/hunterlong/statup/utils/encryption.go100.00%8/8
Http(...)github.com/hunterlong/statup/utils/log.go100.00%5/5
DeleteFile(...)github.com/hunterlong/statup/utils/utils.go100.00%5/5
newLogRow(...)github.com/hunterlong/statup/utils/log.go100.00%4/4
RandomString(...)github.com/hunterlong/statup/utils/encryption.go100.00%4/4
Timezoner(...)github.com/hunterlong/statup/utils/utils.go100.00%4/4
rotate(...)github.com/hunterlong/statup/utils/log.go100.00%3/3
@84:5(...)github.com/hunterlong/statup/utils/log.go100.00%3/3
HashPassword(...)github.com/hunterlong/statup/utils/encryption.go100.00%2/2
Timestamp.Ago(...)github.com/hunterlong/statup/utils/utils.go100.00%2/2
StringInt(...)github.com/hunterlong/statup/utils/utils.go100.00%2/2
DeleteDirectory(...)github.com/hunterlong/statup/utils/utils.go100.00%1/1
rev(...)github.com/hunterlong/statup/utils/time.go100.00%1/1
pushLastLine(...)github.com/hunterlong/statup/utils/log.go80.00%4/5
InitLogs(...)github.com/hunterlong/statup/utils/log.go76.92%10/13
init(...)github.com/hunterlong/statup/utils/utils.go66.67%2/3
createLog(...)github.com/hunterlong/statup/utils/log.go63.64%7/11
FileExists(...)github.com/hunterlong/statup/utils/utils.go50.00%2/4
DurationReadable(...)github.com/hunterlong/statup/utils/utils.go42.86%3/7
FormatDuration(...)github.com/hunterlong/statup/utils/time.go37.50%15/40
ToString(...)github.com/hunterlong/statup/utils/utils.go25.00%2/8
Command(...)github.com/hunterlong/statup/utils/utils.go0.00%0/16
copyAndCapture(...)github.com/hunterlong/statup/utils/utils.go0.00%0/14
GetLastLine(...)github.com/hunterlong/statup/utils/log.go0.00%0/5
LogRow.lineAsString(...)github.com/hunterlong/statup/utils/log.go0.00%0/5
dir(...)github.com/hunterlong/statup/utils/utils.go0.00%0/4
LogRow.FormatForHtml(...)github.com/hunterlong/statup/utils/log.go0.00%0/1
@155:5(...)github.com/hunterlong/statup/utils/utils.go0.00%0/1
@159:5(...)github.com/hunterlong/statup/utils/utils.go0.00%0/1
github.com/hunterlong/statup/utils55.29%115/208
func Log
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go:

93
func Log(level int, err interface{}) error {
94
        pushLastLine(err)
95
        var outErr error
96
        switch level {
97
        case 5:
98
                _, outErr = fmt.Printf("PANIC: %v\n", err)
99
                fmtLogs.Printf("PANIC: %v\n", err)
100
        case 4:
101
                _, outErr = fmt.Printf("FATAL: %v\n", err)
102
                fmtLogs.Printf("FATAL: %v\n", err)
103
                //color.Red("ERROR: %v\n", err)
104
                //os.Exit(2)
105
        case 3:
106
                _, outErr = fmt.Printf("ERROR: %v\n", err)
107
                fmtLogs.Printf("ERROR: %v\n", err)
108
                //color.Red("ERROR: %v\n", err)
109
        case 2:
110
                _, outErr = fmt.Printf("WARNING: %v\n", err)
111
                fmtLogs.Printf("WARNING: %v\n", err)
112
                //color.Yellow("WARNING: %v\n", err)
113
        case 1:
114
                _, outErr = fmt.Printf("INFO: %v\n", err)
115
                fmtLogs.Printf("INFO: %v\n", err)
116
                //color.Blue("INFO: %v\n", err)
117
        case 0:
118
                _, outErr = fmt.Printf("%v\n", err)
119
                fmtLogs.Printf("%v\n", err)
120
                //color.White("%v\n", err)
121
        }
122
        return outErr
123
}
func UnderScoreString
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go:

97
func UnderScoreString(str string) string {
98
99
        // convert every letter to lower case
100
        newStr := strings.ToLower(str)
101
102
        // convert all spaces/tab to underscore
103
        regExp := regexp.MustCompile("[[:space:][:blank:]]")
104
        newStrByte := regExp.ReplaceAll([]byte(newStr), []byte("_"))
105
106
        regExp = regexp.MustCompile("`[^a-z0-9]`i")
107
        newStrByte = regExp.ReplaceAll(newStrByte, []byte("_"))
108
109
        regExp = regexp.MustCompile("[!/']")
110
        newStrByte = regExp.ReplaceAll(newStrByte, []byte("_"))
111
112
        // and remove underscore from beginning and ending
113
114
        newStr = strings.TrimPrefix(string(newStrByte), "_")
115
        newStr = strings.TrimSuffix(newStr, "_")
116
117
        return newStr
118
}
func NewSHA1Hash
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/encryption.go:

32
func NewSHA1Hash(n ...int) string {
33
        noRandomCharacters := 32
34
        if len(n) > 0 {
35
                noRandomCharacters = n[0]
36
        }
37
        randString := RandomString(noRandomCharacters)
38
        hash := sha1.New()
39
        hash.Write([]byte(randString))
40
        bs := hash.Sum(nil)
41
        return fmt.Sprintf("%x", bs)
42
}
func Http
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go:

126
func Http(r *http.Request) string {
127
        msg := fmt.Sprintf("%v (%v) | IP: %v", r.RequestURI, r.Method, r.Host)
128
        fmtLogs.Printf("WEB: %v\n", msg)
129
        fmt.Printf("WEB: %v\n", msg)
130
        pushLastLine(msg)
131
        return msg
132
}
func DeleteFile
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go:

131
func DeleteFile(file string) error {
132
        Log(1, "deleting file: "+file)
133
        err := os.Remove(file)
134
        if err != nil {
135
                return err
136
        }
137
        return nil
138
}
func newLogRow
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go:

159
func newLogRow(line interface{}) (logRow *LogRow) {
160
        logRow = new(LogRow)
161
        logRow.Date = time.Now()
162
        logRow.Line = line
163
        return
164
}
func RandomString
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/encryption.go:

47
func RandomString(n int) string {
48
        b := make([]rune, n)
49
        for i := range b {
50
                b[i] = characterRunes[rand.Intn(len(characterRunes))]
51
        }
52
        return string(b)
53
}
func Timezoner
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go:

69
func Timezoner(t time.Time, zone float32) time.Time {
70
        zoneInt := float32(3600) * (zone + 1)
71
        loc := time.FixedZone("", int(zoneInt))
72
        timez := t.In(loc)
73
        return timez
74
}
func rotate
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go:

81
func rotate() {
82
        c := make(chan os.Signal, 1)
83
        signal.Notify(c, syscall.SIGHUP)
84
        go func() {
85
                for {
86
                        <-c
87
                        ljLogger.Rotate()
88
                }
89
        }()
90
}
func @84:5
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go:

84
func() {
85
                for {
86
                        <-c
87
                        ljLogger.Rotate()
88
                }
89
        }
func HashPassword
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/encryption.go:

26
func HashPassword(password string) string {
27
        bytes, _ := bcrypt.GenerateFromPassword([]byte(password), 14)
28
        return string(bytes)
29
}
func Timestamp.Ago
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go:

91
func (t Timestamp) Ago() string {
92
        got, _ := timeago.TimeAgoWithTime(time.Now(), time.Time(t))
93
        return got
94
}
func StringInt
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go:

45
func StringInt(s string) int64 {
46
        num, _ := strconv.Atoi(s)
47
        return int64(num)
48
}
func DeleteDirectory
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go:

141
func DeleteDirectory(directory string) error {
142
        return os.RemoveAll(directory)
143
}
func rev
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/time.go:

76
func rev(f float64) float64 {
77
        return f * -1
78
}
func pushLastLine
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go:

134
func pushLastLine(line interface{}) {
135
        LockLines.Lock()
136
        defer LockLines.Unlock()
137
        LastLines = append(LastLines, newLogRow(line))
138
        // We want to store max 1000 lines in memory (for /logs page).
139
        for len(LastLines) > 1000 {
140
                LastLines = LastLines[1:]
141
        }
142
}
func InitLogs
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go:

58
func InitLogs() error {
59
        err := createLog(Directory)
60
        if err != nil {
61
                return err
62
        }
63
        logFile, err = os.OpenFile(Directory+"/logs/statup.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0755)
64
        if err != nil {
65
                log.Printf("ERROR opening file: %v", err)
66
                return err
67
        }
68
        ljLogger = &lumberjack.Logger{
69
                Filename:   Directory + "/logs/statup.log",
70
                MaxSize:    16,
71
                MaxBackups: 3,
72
                MaxAge:     28,
73
        }
74
        fmtLogs = log.New(logFile, "", log.Ldate|log.Ltime)
75
        log.SetOutput(ljLogger)
76
        rotate()
77
        LastLines = make([]*LogRow, 0)
78
        return err
79
}
func init
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go:

36
func init() {
37
        if os.Getenv("STATUP_DIR") != "" {
38
                Directory = os.Getenv("STATUP_DIR")
39
        } else {
40
                Directory = dir()
41
        }
42
}
func createLog
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go:

39
func createLog(dir string) error {
40
        var err error
41
        _, err = os.Stat(dir + "/logs")
42
        if err != nil {
43
                if os.IsNotExist(err) {
44
                        os.Mkdir(dir+"/logs", 0777)
45
                } else {
46
                        return err
47
                }
48
        }
49
        file, err := os.Create(dir + "/logs/statup.log")
50
        if err != nil {
51
                return err
52
        }
53
        defer file.Close()
54
        return err
55
}
func FileExists
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go:

121
func FileExists(name string) bool {
122
        if _, err := os.Stat(name); err != nil {
123
                if os.IsNotExist(err) {
124
                        return false
125
                }
126
        }
127
        return true
128
}
func DurationReadable
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go:

200
func DurationReadable(d time.Duration) string {
201
        if d.Hours() >= 1 {
202
                return fmt.Sprintf("%0.0f hours", d.Hours())
203
        } else if d.Minutes() >= 1 {
204
                return fmt.Sprintf("%0.0f minutes", d.Minutes())
205
        } else if d.Seconds() >= 1 {
206
                return fmt.Sprintf("%0.0f seconds", d.Seconds())
207
        }
208
        return d.String()
209
}
func FormatDuration
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/time.go:

23
func FormatDuration(d time.Duration) string {
24
        var out string
25
        if d.Hours() >= 24 {
26
                out = fmt.Sprintf("%0.0f day", d.Hours()/24)
27
                if (d.Hours() / 24) >= 2 {
28
                        out += "s"
29
                }
30
                return out
31
        } else if d.Hours() >= 1 {
32
                out = fmt.Sprintf("%0.0f hour", d.Hours())
33
                if d.Hours() >= 2 {
34
                        out += "s"
35
                }
36
                return out
37
        } else if d.Minutes() >= 1 {
38
                out = fmt.Sprintf("%0.0f minute", d.Minutes())
39
                if d.Minutes() >= 2 {
40
                        out += "s"
41
                }
42
                return out
43
        } else if d.Seconds() >= 1 {
44
                out = fmt.Sprintf("%0.0f second", d.Seconds())
45
                if d.Seconds() >= 2 {
46
                        out += "s"
47
                }
48
                return out
49
        } else if rev(d.Hours()) >= 24 {
50
                out = fmt.Sprintf("%0.0f day", rev(d.Hours()/24))
51
                if rev(d.Hours()/24) >= 2 {
52
                        out += "s"
53
                }
54
                return out
55
        } else if rev(d.Hours()) >= 1 {
56
                out = fmt.Sprintf("%0.0f hour", rev(d.Hours()))
57
                if rev(d.Hours()) >= 2 {
58
                        out += "s"
59
                }
60
                return out
61
        } else if rev(d.Minutes()) >= 1 {
62
                out = fmt.Sprintf("%0.0f minute", rev(d.Minutes()))
63
                if rev(d.Minutes()) >= 2 {
64
                        out += "s"
65
                }
66
                return out
67
        } else {
68
                out = fmt.Sprintf("%0.0f second", rev(d.Seconds()))
69
                if rev(d.Seconds()) >= 2 {
70
                        out += "s"
71
                }
72
                return out
73
        }
74
}
func ToString
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go:

51
func ToString(s interface{}) string {
52
        switch v := s.(type) {
53
        case int, int32, int64:
54
                return fmt.Sprintf("%v", v)
55
        case float32, float64:
56
                return fmt.Sprintf("%v", v)
57
        case []byte:
58
                return string(v)
59
        case bool:
60
                if v {
61
                        return "true"
62
                }
63
                return "false"
64
        default:
65
                return fmt.Sprintf("%v", v)
66
        }
67
}
func Command
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go:

146
func Command(cmd string) (string, string, error) {
147
        Log(1, "running command: "+cmd)
148
        testCmd := exec.Command("sh", "-c", cmd)
149
        var stdout, stderr []byte
150
        var errStdout, errStderr error
151
        stdoutIn, _ := testCmd.StdoutPipe()
152
        stderrIn, _ := testCmd.StderrPipe()
153
        testCmd.Start()
154
155
        go func() {
156
                stdout, errStdout = copyAndCapture(os.Stdout, stdoutIn)
157
        }()
158
159
        go func() {
160
                stderr, errStderr = copyAndCapture(os.Stderr, stderrIn)
161
        }()
162
163
        err := testCmd.Wait()
164
        if err != nil {
165
                return "", "", err
166
        }
167
168
        if errStdout != nil || errStderr != nil {
169
                return "", "", errors.New("failed to capture stdout or stderr")
170
        }
171
172
        outStr, errStr := string(stdout), string(stderr)
173
        return outStr, errStr, err
174
}
func copyAndCapture
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go:

177
func copyAndCapture(w io.Writer, r io.Reader) ([]byte, error) {
178
        var out []byte
179
        buf := make([]byte, 1024, 1024)
180
        for {
181
                n, err := r.Read(buf[:])
182
                if n > 0 {
183
                        d := buf[:n]
184
                        out = append(out, d...)
185
                        _, err := w.Write(d)
186
                        if err != nil {
187
                                return out, err
188
                        }
189
                }
190
                if err != nil {
191
                        // Read returns io.EOF at the end of file, which is not an error for us
192
                        if err == io.EOF {
193
                                err = nil
194
                        }
195
                        return out, err
196
                }
197
        }
198
}
func GetLastLine
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go:

145
func GetLastLine() *LogRow {
146
        LockLines.Lock()
147
        defer LockLines.Unlock()
148
        if len(LastLines) > 0 {
149
                return LastLines[len(LastLines)-1]
150
        }
151
        return nil
152
}
func LogRow.lineAsString
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go:

166
func (o *LogRow) lineAsString() string {
167
        switch v := o.Line.(type) {
168
        case string:
169
                return v
170
        case error:
171
                return v.Error()
172
        case []byte:
173
                return string(v)
174
        }
175
        return ""
176
}
func dir
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go:

77
func dir() string {
78
        dir, err := os.Getwd()
79
        if err != nil {
80
                return "."
81
        }
82
        return dir
83
}
func LogRow.FormatForHtml
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go:

178
func (o *LogRow) FormatForHtml() string {
179
        return fmt.Sprintf("%s: %s", o.Date.Format("2006-01-02 15:04:05"), o.lineAsString())
180
}
func @155:5
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go:

155
func() {
156
                stdout, errStdout = copyAndCapture(os.Stdout, stdoutIn)
157
        }
func @159:5
Back

In /Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go:

159
func() {
160
                stderr, errStderr = copyAndCapture(os.Stderr, stderrIn)
161
        }
Report Total
54.77%