Coverage Report
Generated on 15 Oct 18 15:22 -0700 with gocov-html
Report Overview
github.com/hunterlong/statup/cmd31.08%46/148
github.com/hunterlong/statup/core52.58%510/970
github.com/hunterlong/statup/core/notifier72.73%152/209
github.com/hunterlong/statup/handlers67.41%635/942
github.com/hunterlong/statup/notifiers7.00%18/257
github.com/hunterlong/statup/plugin4.08%2/49
github.com/hunterlong/statup/source77.71%136/175
github.com/hunterlong/statup/utils54.76%115/210
Report Total54.53%1614/2960
Package Overview: github.com/hunterlong/statup/cmd 31.08%

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.go42.37%25/59
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/11
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
github.com/hunterlong/statup/cmd31.08%46/148
func HelpEcho
Back

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

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

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

41
func init() {
42
        core.VERSION = VERSION
43
}
func loadDotEnvs
Back

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

88
func loadDotEnvs() error {
89
        err := godotenv.Load()
90
        if err == nil {
91
                utils.Log(1, "Environment file '.env' Loaded")
92
                UsingDotEnv = true
93
        }
94
        return err
95
}
func catchCLI
Back

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

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

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

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

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

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

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

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

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

171
func checkGithubUpdates() (githubResponse, error) {
172
        var gitResp githubResponse
173
        response, err := http.Get("https://api.github.com/repos/hunterlong/statup/releases/latest")
174
        if err != nil {
175
                return githubResponse{}, err
176
        }
177
        defer response.Body.Close()
178
        contents, err := ioutil.ReadAll(response.Body)
179
        if err != nil {
180
                return githubResponse{}, err
181
        }
182
        err = json.Unmarshal(contents, &gitResp)
183
        return gitResp, err
184
}
func parseFlags
Back

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

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

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

114
func ForEachPlugin() {
115
        if len(core.CoreApp.Plugins) > 0 {
116
                //for _, p := range core.Plugins {
117
                //        p.OnShutdown()
118
                //}
119
        }
120
}
Package Overview: github.com/hunterlong/statup/core 52.58%

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%28/28
InsertSampleData(...)github.com/hunterlong/statup/core/sample.go100.00%13/13
Service.CheckQueue(...)github.com/hunterlong/statup/core/checker.go100.00%13/13
insertSampleCheckins(...)github.com/hunterlong/statup/core/sample.go100.00%12/12
DbConfig.CreateDatabase(...)github.com/hunterlong/statup/core/database.go100.00%11/11
insertHitRecords(...)github.com/hunterlong/statup/core/sample.go100.00%10/10
DbConfig.DropDatabase(...)github.com/hunterlong/statup/core/database.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
Checkin.Expected(...)github.com/hunterlong/statup/core/checkin.go100.00%5/5
SelectUsername(...)github.com/hunterlong/statup/core/users.go100.00%4/4
Service.Hits(...)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
Checkin.CreateFailure(...)github.com/hunterlong/statup/core/checkin.go100.00%4/4
Service.LimitedHits(...)github.com/hunterlong/statup/core/hits.go100.00%4/4
user.Update(...)github.com/hunterlong/statup/core/users.go100.00%4/4
Service.LimitedFailures(...)github.com/hunterlong/statup/core/failures.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.TotalHitsSince(...)github.com/hunterlong/statup/core/hits.go100.00%4/4
reverseHits(...)github.com/hunterlong/statup/core/hits.go100.00%3/3
Checkin.Hits(...)github.com/hunterlong/statup/core/checkin.go100.00%3/3
Checkin.Last(...)github.com/hunterlong/statup/core/checkin.go100.00%3/3
Service.Checkins(...)github.com/hunterlong/statup/core/services.go100.00%3/3
insertSampleCore(...)github.com/hunterlong/statup/core/sample.go100.00%3/3
Service.Check(...)github.com/hunterlong/statup/core/checker.go100.00%3/3
Checkin.BeforeCreate(...)github.com/hunterlong/statup/core/database.go100.00%3/3
SelectUser(...)github.com/hunterlong/statup/core/users.go100.00%3/3
Service.AfterFind(...)github.com/hunterlong/statup/core/database.go100.00%2/2
checkinHit.Ago(...)github.com/hunterlong/statup/core/checkin.go100.00%2/2
user.AfterFind(...)github.com/hunterlong/statup/core/database.go100.00%2/2
failure.AfterFind(...)github.com/hunterlong/statup/core/database.go100.00%2/2
Checkin.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.Service(...)github.com/hunterlong/statup/core/checkin.go100.00%2/2
updateService(...)github.com/hunterlong/statup/core/services.go100.00%2/2
CheckHash(...)github.com/hunterlong/statup/core/users.go100.00%2/2
checkinHit.AfterFind(...)github.com/hunterlong/statup/core/database.go100.00%2/2
checkinHitsDB(...)github.com/hunterlong/statup/core/database.go100.00%1/1
user.Delete(...)github.com/hunterlong/statup/core/users.go100.00%1/1
init(...)github.com/hunterlong/statup/core/core.go100.00%1/1
ReturnCheckin(...)github.com/hunterlong/statup/core/checkin.go100.00%1/1
reorderServices(...)github.com/hunterlong/statup/core/services.go100.00%1/1
ReturnService(...)github.com/hunterlong/statup/core/services.go100.00%1/1
checkinDB(...)github.com/hunterlong/statup/core/database.go100.00%1/1
ReturnCheckinHit(...)github.com/hunterlong/statup/core/checkin.go100.00%1/1
ServiceOrder.Len(...)github.com/hunterlong/statup/core/core.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
ReturnUser(...)github.com/hunterlong/statup/core/users.go100.00%1/1
Service.Select(...)github.com/hunterlong/statup/core/services.go100.00%1/1
Service.parseHost(...)github.com/hunterlong/statup/core/checker.go90.91%10/11
Service.dnsCheck(...)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
Service.Delete(...)github.com/hunterlong/statup/core/services.go81.82%9/11
Service.Create(...)github.com/hunterlong/statup/core/services.go81.82%9/11
Checkin.Routine(...)github.com/hunterlong/statup/core/checkin.go80.00%12/15
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
Checkin.Create(...)github.com/hunterlong/statup/core/checkin.go75.00%6/8
Service.index(...)github.com/hunterlong/statup/core/services.go75.00%3/4
SelectService(...)github.com/hunterlong/statup/core/services.go75.00%3/4
user.Create(...)github.com/hunterlong/statup/core/users.go72.73%8/11
Service.checkTcp(...)github.com/hunterlong/statup/core/checker.go72.00%18/25
Core.SelectAllServices(...)github.com/hunterlong/statup/core/services.go71.43%10/14
DbConfig.Save(...)github.com/hunterlong/statup/core/database.go71.43%10/14
AuthUser(...)github.com/hunterlong/statup/core/users.go71.43%5/7
Service.CreateFailure(...)github.com/hunterlong/statup/core/failures.go71.43%5/7
SelectCore(...)github.com/hunterlong/statup/core/core.go69.23%9/13
Service.checkHttp(...)github.com/hunterlong/statup/core/checker.go68.09%32/47
DbConfig.MigrateDatabase(...)github.com/hunterlong/statup/core/database.go66.67%8/12
LoadConfigFile(...)github.com/hunterlong/statup/core/configs.go66.67%8/12
user.BeforeCreate(...)github.com/hunterlong/statup/core/database.go66.67%2/3
Service.BeforeCreate(...)github.com/hunterlong/statup/core/database.go66.67%2/3
checkinHit.BeforeCreate(...)github.com/hunterlong/statup/core/database.go66.67%2/3
DbConfig.Connect(...)github.com/hunterlong/statup/core/database.go65.38%17/26
Service.CreateHit(...)github.com/hunterlong/statup/core/hits.go60.00%3/5
Checkin.Update(...)github.com/hunterlong/statup/core/checkin.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
@356:8(...)github.com/hunterlong/statup/core/database.go50.00%1/2
DefaultPort(...)github.com/hunterlong/statup/core/configs.go40.00%2/5
LoadUsingEnv(...)github.com/hunterlong/statup/core/configs.go0.00%0/35
failure.ParseError(...)github.com/hunterlong/statup/core/failures.go0.00%0/30
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
EnvToConfig(...)github.com/hunterlong/statup/core/configs.go0.00%0/9
Checkin.RecheckCheckinFailure(...)github.com/hunterlong/statup/core/checkin.go0.00%0/8
DbConfig.CreateCore(...)github.com/hunterlong/statup/core/database.go0.00%0/8
Service.AvgTime(...)github.com/hunterlong/statup/core/services.go0.00%0/8
Service.GraphData(...)github.com/hunterlong/statup/core/services.go0.00%0/8
CountFailures(...)github.com/hunterlong/statup/core/failures.go0.00%0/6
InitApp(...)github.com/hunterlong/statup/core/core.go0.00%0/6
Core.Count24HFailures(...)github.com/hunterlong/statup/core/failures.go0.00%0/6
SampleData(...)github.com/hunterlong/statup/core/configs.go0.00%0/5
recordFailure(...)github.com/hunterlong/statup/core/checker.go0.00%0/5
Service.lastFailure(...)github.com/hunterlong/statup/core/services.go0.00%0/5
DatabaseMaintence(...)github.com/hunterlong/statup/core/database.go0.00%0/5
DateScanObj.ToString(...)github.com/hunterlong/statup/core/services.go0.00%0/5
DeleteConfig(...)github.com/hunterlong/statup/core/configs.go0.00%0/5
Core.CurrentTime(...)github.com/hunterlong/statup/core/core.go0.00%0/4
Service.TotalFailures(...)github.com/hunterlong/statup/core/failures.go0.00%0/4
Service.DeleteFailures(...)github.com/hunterlong/statup/core/failures.go0.00%0/4
DbConfig.InsertCore(...)github.com/hunterlong/statup/core/database.go0.00%0/4
Core.AllOnline(...)github.com/hunterlong/statup/core/core.go0.00%0/4
DeleteAllSince(...)github.com/hunterlong/statup/core/database.go0.00%0/4
Service.CheckinProcess(...)github.com/hunterlong/statup/core/services.go0.00%0/4
SelectCheckinId(...)github.com/hunterlong/statup/core/checkin.go0.00%0/3
SelectCheckin(...)github.com/hunterlong/statup/core/checkin.go0.00%0/3
Hit.BeforeCreate(...)github.com/hunterlong/statup/core/database.go0.00%0/3
failure.BeforeCreate(...)github.com/hunterlong/statup/core/database.go0.00%0/3
Checkin.Delete(...)github.com/hunterlong/statup/core/checkin.go0.00%0/3
Service.LimitedCheckins(...)github.com/hunterlong/statup/core/services.go0.00%0/3
Core.MobileSASS(...)github.com/hunterlong/statup/core/core.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
checkServices(...)github.com/hunterlong/statup/core/checker.go0.00%0/3
Service.AvgUptime24(...)github.com/hunterlong/statup/core/services.go0.00%0/2
Service.ToJSON(...)github.com/hunterlong/statup/core/services.go0.00%0/2
Service.HitsBetween(...)github.com/hunterlong/statup/core/database.go0.00%0/2
failure.Ago(...)github.com/hunterlong/statup/core/failures.go0.00%0/2
Service.TotalFailures24(...)github.com/hunterlong/statup/core/failures.go0.00%0/2
Service.Online24(...)github.com/hunterlong/statup/core/services.go0.00%0/2
CloseDB(...)github.com/hunterlong/statup/core/database.go0.00%0/2
Hit.AfterFind(...)github.com/hunterlong/statup/core/database.go0.00%0/2
DbConfig.waitForDb(...)github.com/hunterlong/statup/core/database.go0.00%0/2
UpdateCore(...)github.com/hunterlong/statup/core/core.go0.00%0/2
failure.Delete(...)github.com/hunterlong/statup/core/failures.go0.00%0/2
DbConfig.Close(...)github.com/hunterlong/statup/core/database.go0.00%0/1
injectDatabase(...)github.com/hunterlong/statup/core/export.go0.00%0/1
@68:10(...)github.com/hunterlong/statup/core/export.go0.00%0/1
Core.ToCore(...)github.com/hunterlong/statup/core/core.go0.00%0/1
Services(...)github.com/hunterlong/statup/core/services.go0.00%0/1
Service.UpdateSingle(...)github.com/hunterlong/statup/core/services.go0.00%0/1
@53:11(...)github.com/hunterlong/statup/core/export.go0.00%0/1
@56:14(...)github.com/hunterlong/statup/core/export.go0.00%0/1
Core.ServicesCount(...)github.com/hunterlong/statup/core/services.go0.00%0/1
Service.DowntimeText(...)github.com/hunterlong/statup/core/services.go0.00%0/1
Core.UsingAssets(...)github.com/hunterlong/statup/core/core.go0.00%0/1
@59:14(...)github.com/hunterlong/statup/core/export.go0.00%0/1
@62:14(...)github.com/hunterlong/statup/core/export.go0.00%0/1
@65:17(...)github.com/hunterlong/statup/core/export.go0.00%0/1
@94:11(...)github.com/hunterlong/statup/core/export.go0.00%0/1
Checkin.String(...)github.com/hunterlong/statup/core/checkin.go0.00%0/1
@71:17(...)github.com/hunterlong/statup/core/export.go0.00%0/1
@50:9(...)github.com/hunterlong/statup/core/export.go0.00%0/1
github.com/hunterlong/statup/core52.58%510/970
func InsertLargeSampleData
Back

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

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

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

93
func insertSampleCheckins() error {
94
        s1 := SelectService(1)
95
        checkin1 := ReturnCheckin(&types.Checkin{
96
                ServiceId:   s1.Id,
97
                Interval:    300,
98
                GracePeriod: 300,
99
        })
100
        checkin1.Update()
101
102
        s2 := SelectService(1)
103
        checkin2 := ReturnCheckin(&types.Checkin{
104
                ServiceId:   s2.Id,
105
                Interval:    900,
106
                GracePeriod: 300,
107
        })
108
        checkin2.Update()
109
110
        checkTime := time.Now().Add(-24 * time.Hour)
111
        for i := 0; i <= 60; i++ {
112
                checkHit := ReturnCheckinHit(&types.CheckinHit{
113
                        Checkin:   checkin1.Id,
114
                        From:      "192.168.0.1",
115
                        CreatedAt: checkTime.UTC(),
116
                })
117
                checkHit.Create()
118
                checkTime = checkTime.Add(10 * time.Minute)
119
        }
120
        return nil
121
}
func DbConfig.CreateDatabase
Back

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

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

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

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

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

322
func (db *DbConfig) DropDatabase() error {
323
        utils.Log(1, "Dropping Database Tables...")
324
        err := DbSession.DropTableIfExists("checkins")
325
        err = DbSession.DropTableIfExists("checkin_hits")
326
        err = DbSession.DropTableIfExists("notifications")
327
        err = DbSession.DropTableIfExists("core")
328
        err = DbSession.DropTableIfExists("failures")
329
        err = DbSession.DropTableIfExists("hits")
330
        err = DbSession.DropTableIfExists("services")
331
        err = DbSession.DropTableIfExists("users")
332
        return err.Error
333
}
func insertFailureRecords
Back

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

321
func insertFailureRecords(since time.Time, amount int64) {
322
        for i := int64(14); i <= 15; i++ {
323
                service := SelectService(i)
324
                utils.Log(1, fmt.Sprintf("Adding %v failure records to service %v", amount, service.Name))
325
                createdAt := since
326
327
                for fi := int64(1); fi <= amount; fi++ {
328
                        createdAt = createdAt.Add(2 * time.Minute)
329
330
                        failure := &types.Failure{
331
                                Service:   service.Id,
332
                                Issue:     "testing right here",
333
                                CreatedAt: createdAt,
334
                        }
335
336
                        service.CreateFailure(failure)
337
                }
338
        }
339
}
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:

408
func (c *Core) CountOnline() int {
409
        amount := 0
410
        for _, s := range CoreApp.Services {
411
                if s.Select().Online {
412
                        amount++
413
                }
414
        }
415
        return amount
416
}
func Checkin.Expected
Back

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

120
func (c *Checkin) Expected() time.Duration {
121
        last := c.Last().CreatedAt
122
        now := time.Now()
123
        lastDir := now.Sub(last)
124
        sub := time.Duration(c.Period() - lastDir)
125
        return sub
126
}
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 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 insertSampleUsers
Back

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

165
func insertSampleUsers() {
166
        u2 := ReturnUser(&types.User{
167
                Username: "testadmin",
168
                Password: "password123",
169
                Email:    "info@betatude.com",
170
                Admin:    true,
171
        })
172
173
        u3 := ReturnUser(&types.User{
174
                Username: "testadmin2",
175
                Password: "password123",
176
                Email:    "info@adminhere.com",
177
                Admin:    true,
178
        })
179
180
        u2.Create()
181
        u3.Create()
182
}
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 Checkin.CreateFailure
Back

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

80
func (c *Checkin) CreateFailure() (int64, error) {
81
        service := c.Service()
82
        fail := &types.Failure{
83
                Issue:    fmt.Sprintf("Checkin %v was not reported %v ago, it expects a request every %v", c.Name, utils.FormatDuration(c.Expected()), utils.FormatDuration(c.Period())),
84
                Method:   "checkin",
85
                MethodId: c.Id,
86
                Service:  service.Id,
87
                PingTime: c.Expected().Seconds() * 0.001,
88
        }
89
        row := failuresDB().Create(&fail)
90
        return fail.Id, row.Error
91
}
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 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.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.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")).Not("method = 'checkin'")
127
        err := rows.Count(&count)
128
        return count, err.Error
129
}
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 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 Checkin.Hits
Back

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

140
func (c *Checkin) Hits() []*checkinHit {
141
        var checkins []*checkinHit
142
        checkinHitsDB().Where("checkin = ?", c.Id).Order("id DESC").Find(&checkins)
143
        return checkins
144
}
func Checkin.Last
Back

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

129
func (c *Checkin) Last() *checkinHit {
130
        var hit checkinHit
131
        checkinHitsDB().Where("checkin = ?", c.Id).Last(&hit)
132
        return &hit
133
}
func Service.Checkins
Back

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

68
func (s *Service) Checkins() []*Checkin {
69
        var checkin []*Checkin
70
        checkinDB().Where("service = ?", s.Id).Find(&checkin)
71
        return checkin
72
}
func insertSampleCore
Back

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

149
func insertSampleCore() error {
150
        core := &types.Core{
151
                Name:        "Statup Sample Data",
152
                Description: "This data is only used to testing",
153
                ApiKey:      "sample",
154
                ApiSecret:   "samplesecret",
155
                Domain:      "http://localhost:8080",
156
                Version:     "test",
157
                CreatedAt:   time.Now(),
158
                UseCdn:      false,
159
        }
160
        query := coreDB().Create(core)
161
        return query.Error
162
}
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 Checkin.BeforeCreate
Back

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

163
func (c *Checkin) BeforeCreate() (err error) {
164
        if c.CreatedAt.IsZero() {
165
                c.CreatedAt = time.Now().UTC()
166
        }
167
        return
168
}
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.AfterFind
Back

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

95
func (s *Service) AfterFind() (err error) {
96
        s.CreatedAt = utils.Timezoner(s.CreatedAt, CoreApp.Timezone)
97
        return
98
}
func checkinHit.Ago
Back

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

190
func (c *checkinHit) Ago() string {
191
        got, _ := timeago.TimeAgoWithTime(time.Now(), c.CreatedAt)
192
        return got
193
}
func user.AfterFind
Back

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

113
func (u *user) AfterFind() (err error) {
114
        u.CreatedAt = utils.Timezoner(u.CreatedAt, CoreApp.Timezone)
115
        return
116
}
func failure.AfterFind
Back

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

107
func (f *failure) AfterFind() (err error) {
108
        f.CreatedAt = utils.Timezoner(f.CreatedAt, CoreApp.Timezone)
109
        return
110
}
func Checkin.AfterFind
Back

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

119
func (c *Checkin) AfterFind() (err error) {
120
        c.CreatedAt = utils.Timezoner(c.CreatedAt, CoreApp.Timezone)
121
        return
122
}
func Checkin.Grace
Back

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

114
func (c *Checkin) Grace() time.Duration {
115
        duration, _ := time.ParseDuration(fmt.Sprintf("%vs", c.GracePeriod))
116
        return duration
117
}
func Checkin.Period
Back

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

108
func (c *Checkin) Period() time.Duration {
109
        duration, _ := time.ParseDuration(fmt.Sprintf("%vs", c.Interval))
110
        return duration
111
}
func Checkin.Service
Back

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

75
func (c *Checkin) Service() *Service {
76
        service := SelectService(c.ServiceId)
77
        return service
78
}
func updateService
Back

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

341
func updateService(service *Service) {
342
        index := service.index()
343
        CoreApp.Services[index] = service
344
}
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 checkinHit.AfterFind
Back

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

125
func (c *checkinHit) AfterFind() (err error) {
126
        c.CreatedAt = utils.Timezoner(c.CreatedAt, CoreApp.Timezone)
127
        return
128
}
func checkinHitsDB
Back

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

72
func checkinHitsDB() *gorm.DB {
73
        return DbSession.Model(&types.CheckinHit{})
74
}
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 init
Back

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

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

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

66
func ReturnCheckin(c *types.Checkin) *Checkin {
67
        return &Checkin{Checkin: c}
68
}
func reorderServices
Back

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

103
func reorderServices() {
104
        sort.Sort(ServiceOrder(CoreApp.Services))
105
}
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 checkinDB
Back

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

67
func checkinDB() *gorm.DB {
68
        return DbSession.Model(&types.Checkin{})
69
}
func ReturnCheckinHit
Back

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

71
func ReturnCheckinHit(c *types.CheckinHit) *checkinHit {
72
        return &checkinHit{CheckinHit: c}
73
}
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 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:

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

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

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

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

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

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

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

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

62
func usersDB() *gorm.DB {
63
        return DbSession.Model(&types.User{})
64
}
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 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 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.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 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:

368
func (s *Service) Update(restart bool) error {
369
        err := servicesDB().Update(s)
370
        if err.Error != nil {
371
                utils.Log(3, fmt.Sprintf("Failed to update service %v. %v", s.Name, err))
372
                return err.Error
373
        }
374
        if restart {
375
                s.Close()
376
                s.Start()
377
                s.SleepDuration = time.Duration(s.Interval) * time.Second
378
                go s.CheckQueue(true)
379
        }
380
        reorderServices()
381
        updateService(s)
382
        notifier.OnUpdatedService(s.Service)
383
        return err.Error
384
}
func Service.Delete
Back

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

347
func (s *Service) Delete() error {
348
        i := s.index()
349
        err := servicesDB().Delete(s)
350
        if err.Error != nil {
351
                utils.Log(3, fmt.Sprintf("Failed to delete service %v. %v", s.Name, err.Error))
352
                return err.Error
353
        }
354
        s.Close()
355
        slice := CoreApp.Services
356
        CoreApp.Services = append(slice[:i], slice[i+1:]...)
357
        reorderServices()
358
        notifier.OnDeletedService(s.Service)
359
        return err.Error
360
}
func Service.Create
Back

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

387
func (s *Service) Create(check bool) (int64, error) {
388
        s.CreatedAt = time.Now()
389
        db := servicesDB().Create(s)
390
        if db.Error != nil {
391
                utils.Log(3, fmt.Sprintf("Failed to create service %v #%v: %v", s.Name, s.Id, db.Error))
392
                return 0, db.Error
393
        }
394
        s.Start()
395
        go s.CheckQueue(check)
396
        CoreApp.Services = append(CoreApp.Services, s)
397
        reorderServices()
398
        notifier.OnNewService(s.Service)
399
        return s.Id, nil
400
}
func Checkin.Routine
Back

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

35
func (c *Checkin) Routine() {
36
        if c.Last() == nil {
37
                return
38
        }
39
        reCheck := c.Period()
40
CheckinLoop:
41
        for {
42
                select {
43
                case <-c.Running:
44
                        utils.Log(1, fmt.Sprintf("Stopping checkin routine: %v", c.Name))
45
                        break CheckinLoop
46
                case <-time.After(reCheck):
47
                        utils.Log(1, fmt.Sprintf("Checkin %v is expected at %v, checking every %v", c.Name, utils.FormatDuration(c.Expected()), utils.FormatDuration(c.Period())))
48
                        if c.Expected().Seconds() <= 0 {
49
                                issue := fmt.Sprintf("Checkin %v is failing, no request since %v", c.Name, c.Last().CreatedAt)
50
                                utils.Log(3, issue)
51
                                c.Service()
52
                                c.CreateFailure()
53
                        }
54
                        reCheck = c.Period()
55
                }
56
                continue
57
        }
58
}
func Service.OnlineSince
Back

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

133
func (s *Service) OnlineSince(ago time.Time) float32 {
134
        failed, _ := s.TotalFailuresSince(ago)
135
        if failed == 0 {
136
                s.Online24Hours = 100.00
137
                return s.Online24Hours
138
        }
139
        total, _ := s.TotalHitsSince(ago)
140
        if total == 0 {
141
                s.Online24Hours = 0
142
                return s.Online24Hours
143
        }
144
        avg := float64(failed) / float64(total) * 100
145
        avg = 100 - avg
146
        if avg < 0 {
147
                avg = 0
148
        }
149
        amount, _ := strconv.ParseFloat(fmt.Sprintf("%0.2f", avg), 10)
150
        s.Online24Hours = float32(amount)
151
        return s.Online24Hours
152
}
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:

293
func (s *Service) AvgUptime(ago time.Time) string {
294
        failed, _ := s.TotalFailuresSince(ago)
295
        if failed == 0 {
296
                return "100"
297
        }
298
        total, _ := s.TotalHitsSince(ago)
299
        if total == 0 {
300
                return "0.00"
301
        }
302
        percent := float64(failed) / float64(total) * 100
303
        percent = 100 - percent
304
        if percent < 0 {
305
                percent = 0
306
        }
307
        amount := fmt.Sprintf("%0.2f", percent)
308
        if amount == "100.00" {
309
                amount = "100"
310
        }
311
        return amount
312
}
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).Not("method = 'checkin'").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:

228
func (s *Service) Downtime() time.Duration {
229
        hits, _ := s.Hits()
230
        fails := s.LimitedFailures()
231
        if len(fails) == 0 {
232
                return time.Duration(0)
233
        }
234
        if len(hits) == 0 {
235
                return time.Now().UTC().Sub(fails[len(fails)-1].CreatedAt.UTC())
236
        }
237
        since := fails[0].CreatedAt.UTC().Sub(hits[0].CreatedAt.UTC())
238
        return since
239
}
func Checkin.Create
Back

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

154
func (c *Checkin) Create() (int64, error) {
155
        c.ApiKey = utils.RandomString(7)
156
        row := checkinDB().Create(&c)
157
        c.Start()
158
        go c.Routine()
159
        if row.Error != nil {
160
                utils.Log(2, row.Error)
161
                return 0, row.Error
162
        }
163
        return c.Id, row.Error
164
}
func Service.index
Back

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

331
func (s *Service) index() int {
332
        for k, service := range CoreApp.Services {
333
                if s.Id == service.(*Service).Id {
334
                        return k
335
                }
336
        }
337
        return 0
338
}
func SelectService
Back

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

49
func SelectService(id int64) *Service {
50
        for _, s := range CoreApp.Services {
51
                if s.Select().Id == id {
52
                        return s.(*Service)
53
                }
54
        }
55
        return nil
56
}
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 Core.SelectAllServices
Back

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

82
func (c *Core) SelectAllServices(start bool) ([]*Service, error) {
83
        var services []*Service
84
        db := servicesDB().Find(&services).Order("order_id desc")
85
        if db.Error != nil {
86
                utils.Log(3, fmt.Sprintf("service error: %v", db.Error))
87
                return nil, db.Error
88
        }
89
        CoreApp.Services = nil
90
        for _, service := range services {
91
                if start {
92
                        service.Start()
93
                        service.CheckinProcess()
94
                }
95
                service.AllFailures()
96
                CoreApp.Services = append(CoreApp.Services, service)
97
        }
98
        sort.Sort(ServiceOrder(CoreApp.Services))
99
        return services, db.Error
100
}
func DbConfig.Save
Back

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

280
func (db *DbConfig) Save() (*DbConfig, error) {
281
        var err error
282
        config, err := os.Create(utils.Directory + "/config.yml")
283
        if err != nil {
284
                utils.Log(4, err)
285
                return nil, err
286
        }
287
        db.ApiKey = utils.NewSHA1Hash(16)
288
        db.ApiSecret = utils.NewSHA1Hash(16)
289
        data, err := yaml.Marshal(db)
290
        if err != nil {
291
                utils.Log(3, err)
292
                return nil, err
293
        }
294
        config.WriteString(string(data))
295
        defer config.Close()
296
        return db, err
297
}
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 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 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
        return CoreApp, db.Error
154
}
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 DbConfig.MigrateDatabase
Back

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

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

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

34
func LoadConfigFile(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 user.BeforeCreate
Back

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

147
func (u *user) BeforeCreate() (err error) {
148
        if u.CreatedAt.IsZero() {
149
                u.CreatedAt = time.Now().UTC()
150
        }
151
        return
152
}
func Service.BeforeCreate
Back

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

155
func (s *Service) BeforeCreate() (err error) {
156
        if s.CreatedAt.IsZero() {
157
                s.CreatedAt = time.Now().UTC()
158
        }
159
        return
160
}
func checkinHit.BeforeCreate
Back

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

171
func (c *checkinHit) BeforeCreate() (err error) {
172
        if c.CreatedAt.IsZero() {
173
                c.CreatedAt = time.Now().UTC()
174
        }
175
        return
176
}
func DbConfig.Connect
Back

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

195
func (db *DbConfig) Connect(retry bool, location string) error {
196
        if DbSession != nil {
197
                return nil
198
        }
199
        var conn, dbType string
200
        var err error
201
        dbType = Configs.DbConn
202
        if Configs.DbPort == 0 {
203
                Configs.DbPort = DefaultPort(dbType)
204
        }
205
        switch dbType {
206
        case "sqlite":
207
                conn = location + "/statup.db"
208
                dbType = "sqlite3"
209
        case "mysql":
210
                host := fmt.Sprintf("%v:%v", Configs.DbHost, Configs.DbPort)
211
                conn = fmt.Sprintf("%v:%v@tcp(%v)/%v?charset=utf8&parseTime=True&loc=UTC", Configs.DbUser, Configs.DbPass, host, Configs.DbData)
212
        case "postgres":
213
                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)
214
        case "mssql":
215
                host := fmt.Sprintf("%v:%v", Configs.DbHost, Configs.DbPort)
216
                conn = fmt.Sprintf("sqlserver://%v:%v@%v?database=%v", Configs.DbUser, Configs.DbPass, host, Configs.DbData)
217
        }
218
        dbSession, err := gorm.Open(dbType, conn)
219
        if err != nil {
220
                if retry {
221
                        utils.Log(1, fmt.Sprintf("Database connection to '%v' is not available, trying again in 5 seconds...", conn))
222
                        return db.waitForDb()
223
                } else {
224
                        return err
225
                }
226
        }
227
        err = dbSession.DB().Ping()
228
        if err == nil {
229
                DbSession = dbSession
230
                utils.Log(1, fmt.Sprintf("Database %v connection '%v@%v' at %v was successful.", dbType, Configs.DbUser, Configs.DbHost, Configs.DbData))
231
        }
232
        return err
233
}
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 Checkin.Update
Back

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

167
func (c *Checkin) Update() (int64, error) {
168
        row := checkinDB().Update(c)
169
        if row.Error != nil {
170
                utils.Log(2, row.Error)
171
                return 0, row.Error
172
        }
173
        return c.Id, row.Error
174
}
func checkinHit.Create
Back

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

177
func (c *checkinHit) Create() (int64, error) {
178
        if c.CreatedAt.IsZero() {
179
                c.CreatedAt = time.Now()
180
        }
181
        row := checkinHitsDB().Create(c)
182
        if row.Error != nil {
183
                utils.Log(2, row.Error)
184
                return 0, row.Error
185
        }
186
        return c.Id, row.Error
187
}
func Service.SmallText
Back

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

178
func (s *Service) SmallText() string {
179
        last := s.LimitedFailures()
180
        hits, _ := s.LimitedHits()
181
        zone := CoreApp.Timezone
182
        if s.Online {
183
                if len(last) == 0 {
184
                        return fmt.Sprintf("Online since %v", utils.Timezoner(s.CreatedAt, zone).Format("Monday 3:04:05PM, Jan _2 2006"))
185
                } else {
186
                        return fmt.Sprintf("Online, last failure was %v", utils.Timezoner(hits[0].CreatedAt, zone).Format("Monday 3:04:05PM, Jan _2 2006"))
187
                }
188
        }
189
        if len(last) > 0 {
190
                lastFailure := s.lastFailure()
191
                got, _ := timeago.TimeAgoWithTime(time.Now().Add(s.Downtime()), time.Now())
192
                return fmt.Sprintf("Reported offline %v, %v", got, lastFailure.ParseError())
193
        } else {
194
                return fmt.Sprintf("%v is currently offline", s.Name)
195
        }
196
}
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 @356:8
Back

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

356
func() {
357
                if r := recover(); r != nil {
358
                        tx.Rollback()
359
                }
360
        }
func DefaultPort
Back

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

108
func DefaultPort(db string) int64 {
109
        switch db {
110
        case "mysql":
111
                return 3306
112
        case "postgres":
113
                return 5432
114
        case "mssql":
115
                return 1433
116
        default:
117
                return 0
118
        }
119
}
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 = EnvToConfig()
71
        CoreApp.Name = os.Getenv("NAME")
72
        CoreApp.Domain = os.Getenv("DOMAIN")
73
        CoreApp.DbConnection = Configs.DbConn
74
        if os.Getenv("USE_CDN") == "true" {
75
                CoreApp.UseCdn = true
76
        }
77
        err := Configs.Connect(true, utils.Directory)
78
        if err != nil {
79
                utils.Log(4, err)
80
                return nil, err
81
        }
82
        Configs.Save()
83
        exists := DbSession.HasTable("core")
84
        if !exists {
85
                utils.Log(1, fmt.Sprintf("Core database does not exist, creating now!"))
86
                Configs.DropDatabase()
87
                Configs.CreateDatabase()
88
                CoreApp, err = Configs.InsertCore()
89
                if err != nil {
90
                        utils.Log(3, err)
91
                }
92
93
                admin := ReturnUser(&types.User{
94
                        Username: "admin",
95
                        Password: "admin",
96
                        Email:    "info@admin.com",
97
                        Admin:    true,
98
                })
99
                _, err := admin.Create()
100
101
                SampleData()
102
                return Configs, err
103
        }
104
        return Configs, nil
105
}
func failure.ParseError
Back

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

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

242
func GraphDataRaw(service types.ServiceInterface, start, end time.Time, group string, column string) *DateScanObj {
243
        var d []DateScan
244
        model := service.(*Service).HitsBetween(start, end, group, column)
245
        rows, _ := model.Rows()
246
        for rows.Next() {
247
                var gd DateScan
248
                var createdAt string
249
                var value float64
250
                var createdTime time.Time
251
                rows.Scan(&createdAt, &value)
252
                createdTime, _ = time.Parse(types.TIME, createdAt)
253
                if CoreApp.DbConnection == "postgres" {
254
                        createdTime, _ = time.Parse(types.TIME_NANO, createdAt)
255
                }
256
                gd.CreatedAt = utils.Timezoner(createdTime, CoreApp.Timezone).Format(types.TIME)
257
                gd.Value = int64(value * 1000)
258
                d = append(d, gd)
259
        }
260
        return &DateScanObj{d}
261
}
func InsertSampleHits
Back

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

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

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

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

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

206
func Dbtimestamp(group string, column string) string {
207
        seconds := 60
208
        if group == "second" {
209
                seconds = 60
210
        } else if group == "hour" {
211
                seconds = 3600
212
        } else if group == "day" {
213
                seconds = 86400
214
        }
215
        switch CoreApp.DbConnection {
216
        case "mysql":
217
                return fmt.Sprintf("CONCAT(date_format(created_at, '%%Y-%%m-%%d %%H:00:00')) AS timeframe, AVG(%v) AS value", column)
218
        case "sqlite":
219
                return fmt.Sprintf("datetime((strftime('%%s', created_at) / %v) * %v, 'unixepoch') AS timeframe, AVG(%v) as value", seconds, seconds, column)
220
        case "postgres":
221
                return fmt.Sprintf("date_trunc('%v', created_at) AS timeframe, AVG(%v) AS value", group, column)
222
        default:
223
                return ""
224
        }
225
}
func ExportChartsJs
Back

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

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

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

315
func (s *Service) TotalUptime() string {
316
        hits, _ := s.TotalHits()
317
        failures, _ := s.TotalFailures()
318
        percent := float64(failures) / float64(hits) * 100
319
        percent = 100 - percent
320
        if percent < 0 {
321
                percent = 0
322
        }
323
        amount := fmt.Sprintf("%0.2f", percent)
324
        if amount == "100.00" {
325
                amount = "100"
326
        }
327
        return amount
328
}
func EnvToConfig
Back

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

122
func EnvToConfig() *DbConfig {
123
        port := DefaultPort(os.Getenv("DB_PORT"))
124
        name := os.Getenv("NAME")
125
        if name == "" {
126
                name = "Statup"
127
        }
128
        description := os.Getenv("DESCRIPTION")
129
        if description == "" {
130
                description = "Statup Monitoring Sample Data"
131
        }
132
        data := &DbConfig{
133
                DbConn:      os.Getenv("DB_CONN"),
134
                DbHost:      os.Getenv("DB_HOST"),
135
                DbUser:      os.Getenv("DB_USER"),
136
                DbPass:      os.Getenv("DB_PASS"),
137
                DbData:      os.Getenv("DB_DATABASE"),
138
                DbPort:      port,
139
                Project:     name,
140
                Description: description,
141
                Domain:      os.Getenv("DOMAIN"),
142
                Email:       "",
143
                Username:    "admin",
144
                Password:    "admin",
145
                Error:       nil,
146
                Location:    utils.Directory,
147
        }
148
        return data
149
}
func Checkin.RecheckCheckinFailure
Back

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

196
func (c *Checkin) RecheckCheckinFailure(guard chan struct{}) {
197
        between := time.Now().Sub(time.Now()).Seconds()
198
        if between > float64(c.Interval) {
199
                fmt.Println("rechecking every 15 seconds!")
200
                time.Sleep(15 * time.Second)
201
                guard <- struct{}{}
202
                c.RecheckCheckinFailure(guard)
203
        } else {
204
                fmt.Println("i recovered!!")
205
        }
206
        <-guard
207
}
func DbConfig.CreateCore
Back

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

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

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

114
func (s *Service) AvgTime() float64 {
115
        total, _ := s.TotalHits()
116
        if total == 0 {
117
                return float64(0)
118
        }
119
        sum, _ := s.Sum()
120
        avg := sum / float64(total) * 100
121
        amount := fmt.Sprintf("%0.0f", avg*10)
122
        val, _ := strconv.ParseFloat(amount, 10)
123
        return val
124
}
func Service.GraphData
Back

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

274
func (s *Service) GraphData() string {
275
        start := time.Now().Add((-24 * 7) * time.Hour)
276
        end := time.Now()
277
        obj := GraphDataRaw(s, start, end, "hour", "latency")
278
        data, err := json.Marshal(obj)
279
        if err != nil {
280
                utils.Log(2, err)
281
                return ""
282
        }
283
        return string(data)
284
}
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 InitApp
Back

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

60
func InitApp() {
61
        SelectCore()
62
        InsertNotifierDB()
63
        CoreApp.SelectAllServices(true)
64
        checkServices()
65
        CoreApp.Notifications = notifier.Load()
66
        go DatabaseMaintence()
67
}
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 SampleData
Back

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

152
func SampleData() error {
153
        if err := InsertSampleData(); err != nil {
154
                return err
155
        }
156
        if err := InsertSampleHits(); err != nil {
157
                return err
158
        }
159
        return nil
160
}
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.lastFailure
Back

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

166
func (s *Service) lastFailure() *failure {
167
        limited := s.LimitedFailures()
168
        if len(limited) == 0 {
169
                return nil
170
        }
171
        last := limited[len(limited)-1]
172
        return last
173
}
func DatabaseMaintence
Back

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

243
func DatabaseMaintence() {
244
        for range time.Tick(60 * time.Minute) {
245
                utils.Log(1, "Checking for database records older than 3 months...")
246
                since := time.Now().AddDate(0, -3, 0).UTC()
247
                DeleteAllSince("failures", since)
248
                DeleteAllSince("hits", since)
249
        }
250
}
func DateScanObj.ToString
Back

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

264
func (d *DateScanObj) ToString() string {
265
        data, err := json.Marshal(d.Array)
266
        if err != nil {
267
                utils.Log(2, err)
268
                return "{}"
269
        }
270
        return string(data)
271
}
func DeleteConfig
Back

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

163
func DeleteConfig() error {
164
        err := os.Remove(utils.Directory + "/config.yml")
165
        if err != nil {
166
                utils.Log(3, err)
167
                return err
168
        }
169
        return nil
170
}
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.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 Service.DeleteFailures
Back

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

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

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

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

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

253
func DeleteAllSince(table string, date time.Time) {
254
        sql := fmt.Sprintf("DELETE FROM %v WHERE created_at < '%v';", table, date.Format("2006-01-02"))
255
        db := DbSession.Raw(sql)
256
        if db.Error != nil {
257
                utils.Log(2, db.Error)
258
        }
259
}
func Service.CheckinProcess
Back

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

59
func (s *Service) CheckinProcess() {
60
        checkins := s.Checkins()
61
        for _, c := range checkins {
62
                c.Start()
63
                go c.Routine()
64
        }
65
}
func SelectCheckinId
Back

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

101
func SelectCheckinId(id int64) *Checkin {
102
        var checkin Checkin
103
        checkinDB().Where("id = ?", id).First(&checkin)
104
        return &checkin
105
}
func SelectCheckin
Back

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

94
func SelectCheckin(api string) *Checkin {
95
        var checkin Checkin
96
        checkinDB().Where("api_key = ?", api).First(&checkin)
97
        return &checkin
98
}
func Hit.BeforeCreate
Back

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

131
func (h *Hit) BeforeCreate() (err error) {
132
        if h.CreatedAt.IsZero() {
133
                h.CreatedAt = time.Now().UTC()
134
        }
135
        return
136
}
func failure.BeforeCreate
Back

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

139
func (f *failure) BeforeCreate() (err error) {
140
        if f.CreatedAt.IsZero() {
141
                f.CreatedAt = time.Now().UTC()
142
        }
143
        return
144
}
func Checkin.Delete
Back

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

147
func (c *Checkin) Delete() error {
148
        c.Close()
149
        row := checkinDB().Delete(&c)
150
        return row.Error
151
}
func Service.LimitedCheckins
Back

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

75
func (s *Service) LimitedCheckins() []*Checkin {
76
        var checkin []*Checkin
77
        checkinDB().Where("service = ?", s.Id).Limit(10).Find(&checkin)
78
        return checkin
79
}
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 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 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 Service.AvgUptime24
Back

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

287
func (s *Service) AvgUptime24() string {
288
        ago := time.Now().Add(-24 * time.Hour)
289
        return s.AvgUptime(ago)
290
}
func Service.ToJSON
Back

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

108
func (s *Service) ToJSON() string {
109
        data, _ := json.Marshal(s)
110
        return string(data)
111
}
func Service.HitsBetween
Back

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

77
func (s *Service) HitsBetween(t1, t2 time.Time, group string, column string) *gorm.DB {
78
        selector := Dbtimestamp(group, column)
79
        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")
80
}
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 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 Service.Online24
Back

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

127
func (s *Service) Online24() float32 {
128
        ago := time.Now().Add(-24 * time.Hour)
129
        return s.OnlineSince(ago)
130
}
func CloseDB
Back

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

83
func CloseDB() {
84
        if DbSession != nil {
85
                DbSession.DB().Close()
86
        }
87
}
func Hit.AfterFind
Back

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

101
func (h *Hit) AfterFind() (err error) {
102
        h.CreatedAt = utils.Timezoner(h.CreatedAt, CoreApp.Timezone)
103
        return
104
}
func DbConfig.waitForDb
Back

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

236
func (db *DbConfig) waitForDb() error {
237
        time.Sleep(5 * time.Second)
238
        return db.Connect(true, utils.Directory)
239
}
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.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 DbConfig.Close
Back

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

90
func (db *DbConfig) Close() error {
91
        return DbSession.DB().Close()
92
}
func injectDatabase
Back

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

26
func injectDatabase() {
27
        Configs.Connect(false, utils.Directory)
28
}
func @68:10
Back

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

68
func() string {
69
                        return "/"
70
                }
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 Services
Back

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

44
func Services() []types.ServiceInterface {
45
        return CoreApp.Services
46
}
func Service.UpdateSingle
Back

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

363
func (s *Service) UpdateSingle(attr ...interface{}) error {
364
        return servicesDB().Model(s).Update(attr).Error
365
}
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 @56:14
Back

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

56
func() string {
57
                        return VERSION
58
                }
func Core.ServicesCount
Back

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

403
func (c *Core) ServicesCount() int {
404
        return len(c.Services)
405
}
func Service.DowntimeText
Back

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

201
func (s *Service) DowntimeText() string {
202
        return fmt.Sprintf("%v has been offline for %v", s.Name, utils.DurationReadable(s.Downtime()))
203
}
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 @59:14
Back

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

59
func() *Core {
60
                        return CoreApp
61
                }
func @62:14
Back

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

62
func() bool {
63
                        return CoreApp.UseCdn
64
                }
Back

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

135
func (c *Checkin) Link() string {
136
        return fmt.Sprintf("%v/checkin/%v", CoreApp.Domain, c.ApiKey)
137
}
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 @94:11
Back

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

94
func(html string) template.HTML {
95
                        return template.HTML(html)
96
                }
func Checkin.String
Back

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

61
func (c *Checkin) String() string {
62
        return c.ApiKey
63
}
func @71:17
Back

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

71
func() string {
72
                        return ExportChartsJs()
73
                }
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:

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

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

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

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

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

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

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

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

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

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

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

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

198
func SelectNotification(n Notifier) (*Notification, error) {
199
        notifier := n.Select()
200
        err := db.Model(&Notification{}).Where("method = ?", notifier.Method).Scan(&notifier)
201
        return notifier, err.Error
202
}
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:

385
func inLimits(n interface{}) bool {
386
        notifier := n.(Notifier).Select()
387
        ok, _ := notifier.WithinLimits()
388
        return ok
389
}
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:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

157
func (n *Notification) removeQueue(msg interface{}) interface{} {
158
        var newArr []interface{}
159
        for _, q := range n.Queue {
160
                if q != msg {
161
                        newArr = append(newArr, q)
162
                }
163
        }
164
        n.Queue = newArr
165
        return newArr
166
}
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:

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

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

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

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%68/68
prometheusHandler(...)github.com/hunterlong/statup/handlers/prometheus.go100.00%22/22
exportHandler(...)github.com/hunterlong/statup/handlers/dashboard.go100.00%18/18
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
servicesDeleteFailuresHandler(...)github.com/hunterlong/statup/handlers/services.go100.00%7/7
usersEditHandler(...)github.com/hunterlong/statup/handlers/users.go100.00%7/7
deleteAssetsHandler(...)github.com/hunterlong/statup/handlers/settings.go100.00%6/6
RunHTTPServer(...)github.com/hunterlong/statup/handlers/handlers.go100.00%6/6
usersHandler(...)github.com/hunterlong/statup/handlers/users.go100.00%5/5
logsLineHandler(...)github.com/hunterlong/statup/handlers/dashboard.go100.00%5/5
helpHandler(...)github.com/hunterlong/statup/handlers/dashboard.go100.00%5/5
settingsHandler(...)github.com/hunterlong/statup/handlers/settings.go100.00%4/4
servicesHandler(...)github.com/hunterlong/statup/handlers/services.go100.00%4/4
logoutHandler(...)github.com/hunterlong/statup/handlers/dashboard.go100.00%4/4
parseGet(...)github.com/hunterlong/statup/handlers/settings.go100.00%2/2
error404Handler(...)github.com/hunterlong/statup/handlers/handlers.go100.00%2/2
resetRouter(...)github.com/hunterlong/statup/handlers/routes.go100.00%2/2
parseForm(...)github.com/hunterlong/statup/handlers/settings.go100.00%2/2
@126:17(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@129:10(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@138:15(...)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
@135:12(...)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
@154:17(...)github.com/hunterlong/statup/handlers/handlers.go100.00%1/1
@157:14(...)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
setupHandler(...)github.com/hunterlong/statup/handlers/setup.go87.50%7/8
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
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
apiRenewHandler(...)github.com/hunterlong/statup/handlers/api.go70.00%7/10
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
apiCreateUsersHandler(...)github.com/hunterlong/statup/handlers/api.go64.71%11/17
apiCreateServiceHandler(...)github.com/hunterlong/statup/handlers/api.go62.50%10/16
processSetupHandler(...)github.com/hunterlong/statup/handlers/setup.go62.00%31/50
apiUserDeleteHandler(...)github.com/hunterlong/statup/handlers/api.go60.00%9/15
apiServiceDeleteHandler(...)github.com/hunterlong/statup/handlers/api.go60.00%9/15
apiUserHandler(...)github.com/hunterlong/statup/handlers/api.go60.00%6/10
apiServiceHandler(...)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
checkinCreateHandler(...)github.com/hunterlong/statup/handlers/services.go0.00%0/13
apiServicePingDataHandler(...)github.com/hunterlong/statup/handlers/api.go0.00%0/12
checkinHitHandler(...)github.com/hunterlong/statup/handlers/services.go0.00%0/10
checkinDeleteHandler(...)github.com/hunterlong/statup/handlers/services.go0.00%0/9
pluginSavedHandler(...)github.com/hunterlong/statup/handlers/plugins.go0.00%0/9
@111:11(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/8
apiCheckinHandler(...)github.com/hunterlong/statup/handlers/api.go0.00%0/7
pluginsDownloadHandler(...)github.com/hunterlong/statup/handlers/plugins.go0.00%0/5
parseId(...)github.com/hunterlong/statup/handlers/settings.go0.00%0/2
@122:13(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/2
@144:15(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/2
setupResponseError(...)github.com/hunterlong/statup/handlers/setup.go0.00%0/1
@90:9(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/1
@132:17(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/1
@148:13(...)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
@235:15(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/1
@160:17(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/1
@232:11(...)github.com/hunterlong/statup/handlers/handlers.go0.00%0/1
github.com/hunterlong/statup/handlers67.41%635/942
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(checkinCreateHandler)).Methods("POST")
90
        r.Handle("/checkin/{id}/delete", http.HandlerFunc(checkinDeleteHandler)).Methods("GET")
91
        r.Handle("/checkin/{id}", http.HandlerFunc(checkinHitHandler))
92
93
        // API SERVICE Routes
94
        r.Handle("/api/services", http.HandlerFunc(apiAllServicesHandler)).Methods("GET")
95
        r.Handle("/api/services", http.HandlerFunc(apiCreateServiceHandler)).Methods("POST")
96
        r.Handle("/api/services/{id}", http.HandlerFunc(apiServiceHandler)).Methods("GET")
97
        r.Handle("/api/services/{id}/data", http.HandlerFunc(apiServiceDataHandler)).Methods("GET")
98
        r.Handle("/api/services/{id}/ping", http.HandlerFunc(apiServicePingDataHandler)).Methods("GET")
99
        r.Handle("/api/services/{id}", http.HandlerFunc(apiServiceUpdateHandler)).Methods("POST")
100
        r.Handle("/api/services/{id}", http.HandlerFunc(apiServiceDeleteHandler)).Methods("DELETE")
101
102
        // API USER Routes
103
        r.Handle("/api/users", http.HandlerFunc(apiAllUsersHandler)).Methods("GET")
104
        r.Handle("/api/users", http.HandlerFunc(apiCreateUsersHandler)).Methods("POST")
105
        r.Handle("/api/users/{id}", http.HandlerFunc(apiUserHandler)).Methods("GET")
106
        r.Handle("/api/users/{id}", http.HandlerFunc(apiUserUpdateHandler)).Methods("POST")
107
        r.Handle("/api/users/{id}", http.HandlerFunc(apiUserDeleteHandler)).Methods("DELETE")
108
109
        // Generic API Routes
110
        r.Handle("/api", http.HandlerFunc(apiIndexHandler))
111
        r.Handle("/api/renew", http.HandlerFunc(apiRenewHandler))
112
        r.Handle("/api/checkin/{api}", http.HandlerFunc(apiCheckinHandler))
113
        r.Handle("/metrics", http.HandlerFunc(prometheusHandler))
114
        r.Handle("/tray", http.HandlerFunc(trayHandler))
115
        r.NotFoundHandler = http.HandlerFunc(error404Handler)
116
        return r
117
}
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.Select()
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 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 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:

31
func renderServiceChartsHandler(w http.ResponseWriter, r *http.Request) {
32
        services := core.CoreApp.Services
33
        w.Header().Set("Content-Type", "text/javascript")
34
        w.Header().Set("Cache-Control", "max-age=60")
35
36
        //var data []string
37
        end := time.Now().UTC()
38
        start := time.Now().Add((-24 * 7) * time.Hour).UTC()
39
        var srvs []*core.Service
40
        for _, s := range services {
41
                srvs = append(srvs, s.(*core.Service))
42
        }
43
        out := struct {
44
                Services []*core.Service
45
                Start    int64
46
                End      int64
47
        }{srvs, start.Unix(), end.Unix()}
48
49
        executeJSResponse(w, r, "charts.js", out)
50
}
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 servicesDeleteFailuresHandler
Back

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

209
func servicesDeleteFailuresHandler(w http.ResponseWriter, r *http.Request) {
210
        if !IsAuthenticated(r) {
211
                http.Redirect(w, r, "/", http.StatusSeeOther)
212
                return
213
        }
214
        vars := mux.Vars(r)
215
        service := core.SelectService(utils.StringInt(vars["id"]))
216
        service.DeleteFailures()
217
        executeResponse(w, r, "services.html", core.CoreApp.Services, "/services")
218
}
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 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 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 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 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 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 servicesHandler
Back

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

52
func servicesHandler(w http.ResponseWriter, r *http.Request) {
53
        if !IsAuthenticated(r) {
54
                http.Redirect(w, r, "/", http.StatusSeeOther)
55
                return
56
        }
57
        executeResponse(w, r, "services.html", core.CoreApp.Services, nil)
58
}
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 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 error404Handler
Back

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

251
func error404Handler(w http.ResponseWriter, r *http.Request) {
252
        w.WriteHeader(http.StatusNotFound)
253
        executeResponse(w, r, "error_404.html", nil, nil)
254
}
func resetRouter
Back

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

119
func resetRouter() {
120
        router = Router()
121
        httpServer.Handler = router
122
}
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 @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 @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 @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
                "NewCheckin": func() *types.Checkin {
161
                        return new(types.Checkin)
162
                },
163
        }
164
}
func @135:12
Back

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

135
func() string {
136
                        return ""
137
                }
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 @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 @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 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:

172
func servicesUpdateHandler(w http.ResponseWriter, r *http.Request) {
173
        if !IsAuthenticated(r) {
174
                http.Redirect(w, r, "/", http.StatusSeeOther)
175
                return
176
        }
177
        vars := mux.Vars(r)
178
        service := core.SelectService(utils.StringInt(vars["id"]))
179
        r.ParseForm()
180
        name := r.PostForm.Get("name")
181
        domain := r.PostForm.Get("domain")
182
        method := r.PostForm.Get("method")
183
        expected := r.PostForm.Get("expected")
184
        status, _ := strconv.Atoi(r.PostForm.Get("expected_status"))
185
        interval, _ := strconv.Atoi(r.PostForm.Get("interval"))
186
        port, _ := strconv.Atoi(r.PostForm.Get("port"))
187
        timeout, _ := strconv.Atoi(r.PostForm.Get("timeout"))
188
        checkType := r.PostForm.Get("check_type")
189
        postData := r.PostForm.Get("post_data")
190
        order, _ := strconv.Atoi(r.PostForm.Get("order"))
191
192
        service.Name = name
193
        service.Domain = domain
194
        service.Method = method
195
        service.ExpectedStatus = status
196
        service.Expected = expected
197
        service.Interval = interval
198
        service.Type = checkType
199
        service.Port = port
200
        service.PostData = postData
201
        service.Timeout = timeout
202
        service.Order = order
203
204
        service.Update(true)
205
        service.Check(true)
206
        executeResponse(w, r, "service.html", service, "/services")
207
}
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:

81
func createServiceHandler(w http.ResponseWriter, r *http.Request) {
82
        if !IsAuthenticated(r) {
83
                http.Redirect(w, r, "/", http.StatusSeeOther)
84
                return
85
        }
86
        r.ParseForm()
87
        name := r.PostForm.Get("name")
88
        domain := r.PostForm.Get("domain")
89
        method := r.PostForm.Get("method")
90
        expected := r.PostForm.Get("expected")
91
        status, _ := strconv.Atoi(r.PostForm.Get("expected_status"))
92
        interval, _ := strconv.Atoi(r.PostForm.Get("interval"))
93
        port, _ := strconv.Atoi(r.PostForm.Get("port"))
94
        timeout, _ := strconv.Atoi(r.PostForm.Get("timeout"))
95
        checkType := r.PostForm.Get("check_type")
96
        postData := r.PostForm.Get("post_data")
97
        order, _ := strconv.Atoi(r.PostForm.Get("order"))
98
99
        if checkType == "http" && status == 0 {
100
                status = 200
101
        }
102
103
        service := core.ReturnService(&types.Service{
104
                Name:           name,
105
                Domain:         domain,
106
                Method:         method,
107
                Expected:       expected,
108
                ExpectedStatus: status,
109
                Interval:       interval,
110
                Type:           checkType,
111
                Port:           port,
112
                PostData:       postData,
113
                Timeout:        timeout,
114
                Order:          order,
115
        })
116
        _, err := service.Create(true)
117
        if err != nil {
118
                utils.Log(3, fmt.Sprintf("Error starting %v check routine. %v", service.Name, err))
119
        }
120
        //notifiers.OnNewService(core.ReturnService(service.Service))
121
        executeResponse(w, r, "services.html", core.CoreApp.Services, "/services")
122
}
func servicesViewHandler
Back

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

139
func servicesViewHandler(w http.ResponseWriter, r *http.Request) {
140
        vars := mux.Vars(r)
141
        fields := parseGet(r)
142
        startField := utils.StringInt(fields.Get("start"))
143
        endField := utils.StringInt(fields.Get("end"))
144
        serv := core.SelectService(utils.StringInt(vars["id"]))
145
        if serv == nil {
146
                w.WriteHeader(http.StatusNotFound)
147
                return
148
        }
149
150
        end := time.Now().UTC()
151
        start := end.Add((-24 * 7) * time.Hour).UTC()
152
153
        if startField != 0 {
154
                start = time.Unix(startField, 0)
155
        }
156
        if endField != 0 {
157
                end = time.Unix(endField, 0)
158
        }
159
160
        data := core.GraphDataRaw(serv, start, end, "hour", "latency")
161
162
        out := struct {
163
                Service *core.Service
164
                Start   int64
165
                End     int64
166
                Data    string
167
        }{serv, start.Unix(), end.Unix(), data.ToString()}
168
169
        executeResponse(w, r, "service.html", out, nil)
170
}
func setupHandler
Back

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

27
func setupHandler(w http.ResponseWriter, r *http.Request) {
28
        if core.CoreApp.Services != nil {
29
                http.Redirect(w, r, "/", http.StatusSeeOther)
30
                return
31
        }
32
        w.WriteHeader(http.StatusOK)
33
        var data interface{}
34
        if os.Getenv("DB_CONN") != "" {
35
                data, _ = core.LoadUsingEnv()
36
        }
37
        executeResponse(w, r, "setup.html", data, nil)
38
}
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 executeResponse
Back

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

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

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

124
func servicesDeleteHandler(w http.ResponseWriter, r *http.Request) {
125
        if !IsAuthenticated(r) {
126
                http.Redirect(w, r, "/", http.StatusSeeOther)
127
                return
128
        }
129
        vars := mux.Vars(r)
130
        service := core.SelectService(utils.StringInt(vars["id"]))
131
        if service == nil {
132
                w.WriteHeader(http.StatusNotFound)
133
                return
134
        }
135
        service.Delete()
136
        executeResponse(w, r, "services.html", core.CoreApp.Services, "/services")
137
}
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:

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

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

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

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

65
func reorderServiceHandler(w http.ResponseWriter, r *http.Request) {
66
        if !IsAuthenticated(r) {
67
                http.Redirect(w, r, "/", http.StatusSeeOther)
68
                return
69
        }
70
        var newOrder []*serviceOrder
71
        decoder := json.NewDecoder(r.Body)
72
        decoder.Decode(&newOrder)
73
        for _, s := range newOrder {
74
                service := core.SelectService(s.Id)
75
                service.Order = s.Order
76
                service.Update(false)
77
        }
78
        w.WriteHeader(http.StatusOK)
79
}
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 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 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 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 processSetupHandler
Back

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

40
func processSetupHandler(w http.ResponseWriter, r *http.Request) {
41
        var err error
42
        if core.Services() != nil {
43
                http.Redirect(w, r, "/", http.StatusSeeOther)
44
                return
45
        }
46
        r.ParseForm()
47
        dbHost := r.PostForm.Get("db_host")
48
        dbUser := r.PostForm.Get("db_user")
49
        dbPass := r.PostForm.Get("db_password")
50
        dbDatabase := r.PostForm.Get("db_database")
51
        dbConn := r.PostForm.Get("db_connection")
52
        dbPort := utils.StringInt(r.PostForm.Get("db_port"))
53
        project := r.PostForm.Get("project")
54
        username := r.PostForm.Get("username")
55
        password := r.PostForm.Get("password")
56
        //sample := r.PostForm.Get("sample_data")
57
        description := r.PostForm.Get("description")
58
        domain := r.PostForm.Get("domain")
59
        email := r.PostForm.Get("email")
60
        dir := utils.Directory
61
62
        config := &core.DbConfig{
63
                DbConn:      dbConn,
64
                DbHost:      dbHost,
65
                DbUser:      dbUser,
66
                DbPass:      dbPass,
67
                DbData:      dbDatabase,
68
                DbPort:      dbPort,
69
                Project:     project,
70
                Description: description,
71
                Domain:      domain,
72
                Username:    username,
73
                Password:    password,
74
                Email:       email,
75
                Error:       nil,
76
                Location:    utils.Directory,
77
        }
78
79
        if core.Configs, err = config.Save(); err != nil {
80
                utils.Log(4, err)
81
                config.Error = err
82
                setupResponseError(w, r, config)
83
                return
84
        }
85
86
        if core.Configs, err = core.LoadConfigFile(dir); err != nil {
87
                utils.Log(3, err)
88
                config.Error = err
89
                setupResponseError(w, r, config)
90
                return
91
        }
92
93
        if err = core.Configs.Connect(false, dir); err != nil {
94
                utils.Log(4, err)
95
                core.DeleteConfig()
96
                config.Error = err
97
                setupResponseError(w, r, config)
98
                return
99
        }
100
101
        config.DropDatabase()
102
        config.CreateDatabase()
103
104
        core.CoreApp, err = config.InsertCore()
105
        if err != nil {
106
                utils.Log(4, err)
107
                config.Error = err
108
                setupResponseError(w, r, config)
109
                return
110
        }
111
112
        admin := core.ReturnUser(&types.User{
113
                Username: config.Username,
114
                Password: config.Password,
115
                Email:    config.Email,
116
                Admin:    true,
117
        })
118
        admin.Create()
119
120
        core.SampleData()
121
        core.InitApp()
122
        resetCookies()
123
        time.Sleep(2 * time.Second)
124
        http.Redirect(w, r, "/", http.StatusSeeOther)
125
}
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 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 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 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 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:

25
func indexHandler(w http.ResponseWriter, r *http.Request) {
26
        if core.Configs == nil {
27
                http.Redirect(w, r, "/setup", http.StatusSeeOther)
28
                return
29
        }
30
        executeResponse(w, r, "index.html", core.CoreApp, nil)
31
}
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:

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

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

233
func checkinCreateHandler(w http.ResponseWriter, r *http.Request) {
234
        if !IsAuthenticated(r) {
235
                http.Redirect(w, r, "/", http.StatusSeeOther)
236
                return
237
        }
238
        vars := mux.Vars(r)
239
        r.ParseForm()
240
        service := core.SelectService(utils.StringInt(vars["id"]))
241
        fmt.Println(service.Name)
242
        name := r.PostForm.Get("name")
243
        interval := utils.StringInt(r.PostForm.Get("interval"))
244
        grace := utils.StringInt(r.PostForm.Get("grace"))
245
        checkin := core.ReturnCheckin(&types.Checkin{
246
                Name:        name,
247
                ServiceId:   service.Id,
248
                Interval:    interval,
249
                GracePeriod: grace,
250
        })
251
        checkin.Create()
252
        executeResponse(w, r, "service.html", service, fmt.Sprintf("/service/%v", service.Id))
253
}
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 checkinHitHandler
Back

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

255
func checkinHitHandler(w http.ResponseWriter, r *http.Request) {
256
        vars := mux.Vars(r)
257
        checkin := core.SelectCheckin(vars["id"])
258
        ip, _, _ := net.SplitHostPort(r.RemoteAddr)
259
        checkinHit := core.ReturnCheckinHit(&types.CheckinHit{
260
                Checkin:   checkin.Id,
261
                From:      ip,
262
                CreatedAt: time.Now().UTC(),
263
        })
264
        if checkin.Last() == nil {
265
                checkin.Start()
266
                go checkin.Routine()
267
        }
268
        checkinHit.Create()
269
        w.Write([]byte("ok"))
270
        w.WriteHeader(http.StatusOK)
271
}
func checkinDeleteHandler
Back

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

220
func checkinDeleteHandler(w http.ResponseWriter, r *http.Request) {
221
        if !IsAuthenticated(r) {
222
                http.Redirect(w, r, "/", http.StatusSeeOther)
223
                return
224
        }
225
        vars := mux.Vars(r)
226
        checkin := core.SelectCheckinId(utils.StringInt(vars["id"]))
227
        service := core.SelectService(checkin.ServiceId)
228
        fmt.Println(checkin, service)
229
        checkin.Delete()
230
        executeResponse(w, r, "service.html", service, fmt.Sprintf("/service/%v", service.Id))
231
}
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 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 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 @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 setupResponseError
Back

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

127
func setupResponseError(w http.ResponseWriter, r *http.Request, a interface{}) {
128
        executeResponse(w, r, "setup.html", a, nil)
129
}
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 @132:17
Back

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

132
func() string {
133
                        return ""
134
                }
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 trayHandler
Back

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

33
func trayHandler(w http.ResponseWriter, r *http.Request) {
34
        executeResponse(w, r, "tray.html", core.CoreApp, nil)
35
}
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
                }
func @235:15
Back

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

235
func() []types.ServiceInterface {
236
                        return core.CoreApp.Services
237
                }
func @160:17
Back

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

160
func() *types.Checkin {
161
                        return new(types.Checkin)
162
                }
func @232:11
Back

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

232
func(html string) template.HTML {
233
                        return template.HTML(html)
234
                }
Package Overview: github.com/hunterlong/statup/notifiers 7.00%

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.

twilio.Select(...)github.com/hunterlong/statup/notifiers/twilio.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
slack.Select(...)github.com/hunterlong/statup/notifiers/slack.go100.00%1/1
email.Select(...)github.com/hunterlong/statup/notifiers/email.go100.00%1/1
init(...)github.com/hunterlong/statup/notifiers/line_notify.go66.67%2/3
init(...)github.com/hunterlong/statup/notifiers/email.go66.67%2/3
init(...)github.com/hunterlong/statup/notifiers/discord.go66.67%2/3
init(...)github.com/hunterlong/statup/notifiers/twilio.go66.67%2/3
init(...)github.com/hunterlong/statup/notifiers/webhook.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/25
webhooker.run(...)github.com/hunterlong/statup/notifiers/webhook.go0.00%0/21
discord.OnTest(...)github.com/hunterlong/statup/notifiers/discord.go0.00%0/20
lineNotifier.Send(...)github.com/hunterlong/statup/notifiers/line_notify.go0.00%0/14
email.dialSend(...)github.com/hunterlong/statup/notifiers/email.go0.00%0/12
emailTemplate(...)github.com/hunterlong/statup/notifiers/email.go0.00%0/9
webhooker.OnTest(...)github.com/hunterlong/statup/notifiers/webhook.go0.00%0/9
slack.OnTest(...)github.com/hunterlong/statup/notifiers/slack.go0.00%0/9
email.OnTest(...)github.com/hunterlong/statup/notifiers/email.go0.00%0/8
discord.Send(...)github.com/hunterlong/statup/notifiers/discord.go0.00%0/8
replaceBodyText(...)github.com/hunterlong/statup/notifiers/webhook.go0.00%0/7
slack.Send(...)github.com/hunterlong/statup/notifiers/slack.go0.00%0/7
parseSlackMessage(...)github.com/hunterlong/statup/notifiers/slack.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
webhooker.Send(...)github.com/hunterlong/statup/notifiers/webhook.go0.00%0/4
discord.OnSuccess(...)github.com/hunterlong/statup/notifiers/discord.go0.00%0/4
slack.OnSuccess(...)github.com/hunterlong/statup/notifiers/slack.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
twilio.OnSuccess(...)github.com/hunterlong/statup/notifiers/twilio.go0.00%0/4
twilio.OnFailure(...)github.com/hunterlong/statup/notifiers/twilio.go0.00%0/3
discord.OnSave(...)github.com/hunterlong/statup/notifiers/discord.go0.00%0/3
lineNotifier.OnFailure(...)github.com/hunterlong/statup/notifiers/line_notify.go0.00%0/3
email.OnFailure(...)github.com/hunterlong/statup/notifiers/email.go0.00%0/3
slack.OnSave(...)github.com/hunterlong/statup/notifiers/slack.go0.00%0/3
twilioError(...)github.com/hunterlong/statup/notifiers/twilio.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
discord.OnFailure(...)github.com/hunterlong/statup/notifiers/discord.go0.00%0/3
twilio.OnTest(...)github.com/hunterlong/statup/notifiers/twilio.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
email.OnSave(...)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.00%18/257
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 lineNotifier.Select
Back

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

78
func (u *lineNotifier) Select() *notifier.Notification {
79
        return u.Notification
80
}
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 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 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 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/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/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/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/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/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
        if err != nil {
94
                return err
95
        }
96
        req.SetBasicAuth(u.ApiKey, u.ApiSecret)
97
        req.Header.Add("Accept", "application/json")
98
        req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
99
        res, err := client.Do(req)
100
        if err != nil {
101
                return err
102
        }
103
        defer res.Body.Close()
104
        contents, _ := ioutil.ReadAll(res.Body)
105
        success, _ := twilioSuccess(contents)
106
        if !success {
107
                errorOut := twilioError(contents)
108
                out := fmt.Sprintf("Error code %v - %v", errorOut.Code, errorOut.Message)
109
                return errors.New(out)
110
        }
111
        return nil
112
}
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.ApiKey != "" {
134
                req.Header.Add("Content-Type", w.ApiKey)
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 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
        if err != nil {
66
                return err
67
        }
68
        req.Header.Add("Authorization", fmt.Sprintf("Bearer %v", u.GetValue("api_secret")))
69
        req.Header.Add("Accept", "application/json")
70
        req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
71
        _, err = client.Do(req)
72
        if err != nil {
73
                return err
74
        }
75
        return nil
76
}
func email.dialSend
Back

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

233
func (u *email) dialSend(email *emailOutgoing) error {
234
        mailer = mail.NewDialer(emailer.Host, emailer.Port, emailer.Username, emailer.Password)
235
        mailer.TLSConfig = &tls.Config{InsecureSkipVerify: true}
236
        emailSource(email)
237
        m := mail.NewMessage()
238
        m.SetHeader("From", email.From)
239
        m.SetHeader("To", email.To)
240
        m.SetHeader("Subject", email.Subject)
241
        m.SetBody("text/html", email.Source)
242
        if err := mailer.DialAndSend(m); err != nil {
243
                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))
244
                return err
245
        }
246
        return nil
247
}
func emailTemplate
Back

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

254
func emailTemplate(contents string, data interface{}) string {
255
        t := template.New("email")
256
        t, err := t.Parse(contents)
257
        if err != nil {
258
                utils.Log(3, err)
259
        }
260
        var tpl bytes.Buffer
261
        if err := t.Execute(&tpl, data); err != nil {
262
                utils.Log(2, err)
263
        }
264
        result := tpl.String()
265
        return result
266
}
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 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
        dial.StartTLS(&tls.Config{InsecureSkipVerify: true})
225
        if err != nil {
226
                utils.Log(3, err)
227
                return err
228
        }
229
        auth := smtp.PlainAuth("", u.Username, u.Password, host)
230
        return dial.Auth(auth)
231
}
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 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 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 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.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:

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

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

90
func (u *lineNotifier) OnSuccess(s *types.Service) {
91
        if !u.Online {
92
                msg := fmt.Sprintf("Your service '%v' is back online!", s.Name)
93
                u.AddQueue(msg)
94
        }
95
        u.Online = true
96
}
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 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 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 twilio.OnSuccess
Back

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

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

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

115
func (u *twilio) OnFailure(s *types.Service, f *types.Failure) {
116
        msg := fmt.Sprintf("Your service '%v' is currently offline!", s.Name)
117
        u.AddQueue(msg)
118
        u.Online = false
119
}
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 lineNotifier.OnFailure
Back

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

83
func (u *lineNotifier) OnFailure(s *types.Service, f *types.Failure) {
84
        msg := fmt.Sprintf("Your service '%v' is currently offline!", s.Name)
85
        u.AddQueue(msg)
86
        u.Online = false
87
}
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 twilioError
Back

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

154
func twilioError(res []byte) twilioErrorObj {
155
        var obj twilioErrorObj
156
        json.Unmarshal(res, &obj)
157
        return obj
158
}
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 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:

140
func (u *twilio) OnTest() error {
141
        msg := fmt.Sprintf("Testing the Twilio SMS Notifier")
142
        return u.Send(msg)
143
}
func lineNotifier.OnSave
Back

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

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

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

249
func emailSource(email *emailOutgoing) {
250
        source := emailTemplate(email.Template, email.Data)
251
        email.Source = source
252
}
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 twilio.OnSave
Back

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

131
func (u *twilio) OnSave() error {
132
        utils.Log(1, fmt.Sprintf("Notification %v is receiving updated information.", u.Method))
133
134
        // Do updating stuff here
135
136
        return nil
137
}
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 4.08%

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.

init(...)github.com/hunterlong/statup/plugin/plugin.go100.00%2/2
LoadPlugin(...)github.com/hunterlong/statup/plugin/plugin.go0.00%0/33
LoadPlugins(...)github.com/hunterlong/statup/plugin/plugin.go0.00%0/14
github.com/hunterlong/statup/plugin4.08%2/49
func init
Back

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

46
func init() {
47
        utils.InitLogs()
48
        dir = utils.Directory
49
}
func LoadPlugin
Back

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

51
func LoadPlugin(file string) error {
52
        utils.Log(1, fmt.Sprintf("opening file %v", file))
53
        f, err := os.Open(file)
54
        if err != nil {
55
                return err
56
        }
57
58
        fSplit := strings.Split(f.Name(), "/")
59
        fileBin := fSplit[len(fSplit)-1]
60
61
        utils.Log(1, fmt.Sprintf("Attempting to load plugin '%v'", fileBin))
62
        ext := strings.Split(fileBin, ".")
63
        if len(ext) != 2 {
64
                utils.Log(3, fmt.Sprintf("Plugin '%v' must end in .so extension", fileBin))
65
                return fmt.Errorf("Plugin '%v' must end in .so extension %v", fileBin, len(ext))
66
        }
67
        if ext[1] != "so" {
68
                utils.Log(3, fmt.Sprintf("Plugin '%v' must end in .so extension", fileBin))
69
                return fmt.Errorf("Plugin '%v' must end in .so extension", fileBin)
70
        }
71
        plug, err := plugin.Open(file)
72
        if err != nil {
73
                utils.Log(3, fmt.Sprintf("Plugin '%v' could not load correctly. %v", fileBin, err))
74
                return err
75
        }
76
        symPlugin, err := plug.Lookup("Plugin")
77
        if err != nil {
78
                utils.Log(3, fmt.Sprintf("Plugin '%v' could not locate Plugin variable. %v", fileBin, err))
79
                return err
80
        }
81
        plugActions, ok := symPlugin.(types.PluginActions)
82
        if !ok {
83
                utils.Log(3, fmt.Sprintf("Plugin %v was not type PluginObject", f.Name()))
84
                return fmt.Errorf("Plugin %v was not type PluginActions %v", f.Name(), plugActions.GetInfo())
85
        }
86
        info := plugActions.GetInfo()
87
        err = plugActions.OnLoad()
88
        if err != nil {
89
                return err
90
        }
91
        utils.Log(1, fmt.Sprintf("Plugin %v loaded from %v", info.Name, f.Name()))
92
        core.CoreApp.AllPlugins = append(core.CoreApp.AllPlugins, plugActions)
93
        return nil
94
}
func LoadPlugins
Back

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

96
func LoadPlugins() {
97
        pluginDir := dir + "/plugins"
98
        utils.Log(1, fmt.Sprintf("Loading any available Plugins from /plugins directory"))
99
        if _, err := os.Stat(pluginDir); os.IsNotExist(err) {
100
                os.Mkdir(pluginDir, os.ModePerm)
101
        }
102
        files, err := ioutil.ReadDir(pluginDir)
103
        if err != nil {
104
                utils.Log(2, fmt.Sprintf("Plugins directory was not found. Error: %v", err))
105
                return
106
        }
107
        for _, f := range files {
108
                err := LoadPlugin(f.Name())
109
                if err != nil {
110
                        utils.Log(3, err)
111
                        continue
112
                }
113
        }
114
        utils.Log(1, fmt.Sprintf("Loaded %v Plugins", len(core.CoreApp.Plugins)))
115
}
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:

155
func init() {
156
157
        // define files
158
        fileh := &embedded.EmbeddedFile{
159
                Filename:    "base.html",
160
                FileModTime: time.Unix(1538458071, 0),
161
                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"),
162
        }
163
        filei := &embedded.EmbeddedFile{
164
                Filename:    "dashboard.html",
165
                FileModTime: time.Unix(1538459427, 0),
166
                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"),
167
        }
168
        filej := &embedded.EmbeddedFile{
169
                Filename:    "error_404.html",
170
                FileModTime: time.Unix(1538457906, 0),
171
                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"),
172
        }
173
        filek := &embedded.EmbeddedFile{
174
                Filename:    "favicon.ico",
175
                FileModTime: time.Unix(1530546686, 0),
176
                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"),
177
        }
178
        filel := &embedded.EmbeddedFile{
179
                Filename:    "footer.html",
180
                FileModTime: time.Unix(1538458476, 0),
181
                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"),
182
        }
183
        filem := &embedded.EmbeddedFile{
184
                Filename:    "form_checkin.html",
185
                FileModTime: time.Unix(1538935644, 0),
186
                Content:     string("{{define \"form_checkin\"}}\n<form action=\"/service/{{.Id}}/checkin\" method=\"POST\">\n    <div class=\"form-group row\">\n        <div class=\"col-md-3\">\n            <label for=\"checkin_interval\" class=\"col-form-label\">Checkin Name</label>\n            <input type=\"text\" name=\"name\" class=\"form-control\" id=\"checkin_name\" placeholder=\"New Checkin\">\n        </div>\n        <div class=\"col-3\">\n            <label for=\"checkin_interval\" class=\"col-form-label\">Interval</label>\n            <input type=\"number\" name=\"interval\" class=\"form-control\" id=\"checkin_interval\" placeholder=\"60\">\n        </div>\n        <div class=\"col-3\">\n            <label for=\"grace_period\" class=\"col-form-label\">Grace Period</label>\n            <input type=\"number\" name=\"grace\" class=\"form-control\" id=\"grace_period\" placeholder=\"10\">\n        </div>\n        <div class=\"col-3\">\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"),
187
        }
188
        filen := &embedded.EmbeddedFile{
189
                Filename:    "form_notifier.html",
190
                FileModTime: time.Unix(1539400173, 0),
191
                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\">{{safe $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"),
192
        }
193
        fileo := &embedded.EmbeddedFile{
194
                Filename:    "form_service.html",
195
                FileModTime: time.Unix(1538934599, 0),
196
                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=\"udp\" {{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 ne .Type \"http\"}} 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 ne .Type \"http\"}} 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 id=\"service_type_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"),
197
        }
198
        filep := &embedded.EmbeddedFile{
199
                Filename:    "form_user.html",
200
                FileModTime: time.Unix(1538543370, 0),
201
                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"),
202
        }
203
        fileq := &embedded.EmbeddedFile{
204
                Filename:    "head.html",
205
                FileModTime: time.Unix(1538459085, 0),
206
                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"),
207
        }
208
        filer := &embedded.EmbeddedFile{
209
                Filename:    "help.html",
210
                FileModTime: time.Unix(1538459433, 0),
211
                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"),
212
        }
213
        files := &embedded.EmbeddedFile{
214
                Filename:    "help.md",
215
                FileModTime: time.Unix(1536974218, 0),
216
                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"),
217
        }
218
        filet := &embedded.EmbeddedFile{
219
                Filename:    "index.html",
220
                FileModTime: time.Unix(1538522506, 0),
221
                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"),
222
        }
223
        fileu := &embedded.EmbeddedFile{
224
                Filename:    "login.html",
225
                FileModTime: time.Unix(1538454764, 0),
226
                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"),
227
        }
228
        filev := &embedded.EmbeddedFile{
229
                Filename:    "logs.html",
230
                FileModTime: time.Unix(1538460210, 0),
231
                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"),
232
        }
233
        filew := &embedded.EmbeddedFile{
234
                Filename:    "nav.html",
235
                FileModTime: time.Unix(1534817721, 0),
236
                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}}"),
237
        }
238
        filex := &embedded.EmbeddedFile{
239
                Filename:    "robots.txt",
240
                FileModTime: time.Unix(1530546686, 0),
241
                Content:     string("User-agent: *\nDisallow: /login\nDisallow: /dashboard"),
242
        }
243
        filey := &embedded.EmbeddedFile{
244
                Filename:    "scripts.html",
245
                FileModTime: time.Unix(1538453657, 0),
246
                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"),
247
        }
248
        filez := &embedded.EmbeddedFile{
249
                Filename:    "service.html",
250
                FileModTime: time.Unix(1539361671, 0),
251
                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        {{if $s.LimitedCheckins}}\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                    <th scope=\"col\"></th>\n                </tr>\n            </thead>\n            <tbody>\n            {{range $s.LimitedCheckins}}\n            {{ $ch := . }}\n            <tr class=\"{{ if lt $ch.Expected 0}}bg-warning text-black{{else}}bg-light{{end}}\">\n                <td>{{$ch.Name}}<br><a href=\"{{$ch.Link}}\" target=\"_blank\">{{$ch.Link}}</a></td>\n                <td>every {{Duration $ch.Period}}<br>after {{Duration $ch.Grace}}</td>\n                <td>{{ if $ch.Last.CreatedAt.IsZero}}\n                        Never\n                    {{else}}\n                        {{Ago $ch.Last.CreatedAt}}\n                    {{end}}\n                </td>\n                <td>\n                    {{ if $ch.Last.CreatedAt.IsZero}}\n                        -\n                    {{else}}\n                        {{ if lt $ch.Expected 0}}{{Duration $ch.Expected}} ago{{else}}in {{Duration $ch.Expected}}{{end}}\n                    {{end}}\n                </td>\n                <td><a href=\"/checkin/{{$ch.Id}}/delete\" class=\"btn btn-sm btn-danger\">Delete</a></td>\n            </tr>\n            {{end}}\n            </tbody>\n        </table>\n        {{end}}\n        {{template \"form_checkin\" $s}}\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    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"),
252
        }
253
        file10 := &embedded.EmbeddedFile{
254
                Filename:    "services.html",
255
                FileModTime: time.Unix(1538459465, 0),
256
                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"),
257
        }
258
        file11 := &embedded.EmbeddedFile{
259
                Filename:    "settings.html",
260
                FileModTime: time.Unix(1538947359, 0),
261
                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                            <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"),
262
        }
263
        file12 := &embedded.EmbeddedFile{
264
                Filename:    "setup.html",
265
                FileModTime: time.Unix(1538459628, 0),
266
                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"),
267
        }
268
        file13 := &embedded.EmbeddedFile{
269
                Filename:    "statup.png",
270
                FileModTime: time.Unix(1533786305, 0),
271
                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"),
272
        }
273
        file14 := &embedded.EmbeddedFile{
274
                Filename:    "tray.html",
275
                FileModTime: time.Unix(1535012730, 0),
276
                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>"),
277
        }
278
        file15 := &embedded.EmbeddedFile{
279
                Filename:    "user.html",
280
                FileModTime: time.Unix(1538459587, 0),
281
                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"),
282
        }
283
        file16 := &embedded.EmbeddedFile{
284
                Filename:    "users.html",
285
                FileModTime: time.Unix(1538459610, 0),
286
                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"),
287
        }
288
289
        // define dirs
290
        dirg := &embedded.EmbeddedDir{
291
                Filename:   "",
292
                DirModTime: time.Unix(1539400173, 0),
293
                ChildFiles: []*embedded.EmbeddedFile{
294
                        fileh,  // "base.html"
295
                        filei,  // "dashboard.html"
296
                        filej,  // "error_404.html"
297
                        filek,  // "favicon.ico"
298
                        filel,  // "footer.html"
299
                        filem,  // "form_checkin.html"
300
                        filen,  // "form_notifier.html"
301
                        fileo,  // "form_service.html"
302
                        filep,  // "form_user.html"
303
                        fileq,  // "head.html"
304
                        filer,  // "help.html"
305
                        files,  // "help.md"
306
                        filet,  // "index.html"
307
                        fileu,  // "login.html"
308
                        filev,  // "logs.html"
309
                        filew,  // "nav.html"
310
                        filex,  // "robots.txt"
311
                        filey,  // "scripts.html"
312
                        filez,  // "service.html"
313
                        file10, // "services.html"
314
                        file11, // "settings.html"
315
                        file12, // "setup.html"
316
                        file13, // "statup.png"
317
                        file14, // "tray.html"
318
                        file15, // "user.html"
319
                        file16, // "users.html"
320
321
                },
322
        }
323
324
        // link ChildDirs
325
        dirg.ChildDirs = []*embedded.EmbeddedDir{}
326
327
        // register embeddedBox
328
        embedded.RegisterEmbeddedBox(`tmpl`, &embedded.EmbeddedBox{
329
                Name: `tmpl`,
330
                Time: time.Unix(1539400173, 0),
331
                Dirs: map[string]*embedded.EmbeddedDir{
332
                        "": dirg,
333
                },
334
                Files: map[string]*embedded.EmbeddedFile{
335
                        "base.html":          fileh,
336
                        "dashboard.html":     filei,
337
                        "error_404.html":     filej,
338
                        "favicon.ico":        filek,
339
                        "footer.html":        filel,
340
                        "form_checkin.html":  filem,
341
                        "form_notifier.html": filen,
342
                        "form_service.html":  fileo,
343
                        "form_user.html":     filep,
344
                        "head.html":          fileq,
345
                        "help.html":          filer,
346
                        "help.md":            files,
347
                        "index.html":         filet,
348
                        "login.html":         fileu,
349
                        "logs.html":          filev,
350
                        "nav.html":           filew,
351
                        "robots.txt":         filex,
352
                        "scripts.html":       filey,
353
                        "service.html":       filez,
354
                        "services.html":      file10,
355
                        "settings.html":      file11,
356
                        "setup.html":         file12,
357
                        "statup.png":         file13,
358
                        "tray.html":          file14,
359
                        "user.html":          file15,
360
                        "users.html":         file16,
361
                },
362
        })
363
}
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:

64
func init() {
65
66
        // define files
67
        file7 := &embedded.EmbeddedFile{
68
                Filename:    "Chart.bundle.min.js",
69
                FileModTime: time.Unix(1528732500, 0),
70
                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)});"),
71
        }
72
        file8 := &embedded.EmbeddedFile{
73
                Filename:    "bootstrap.min.js",
74
                FileModTime: time.Unix(1528732500, 0),
75
                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"),
76
        }
77
        file9 := &embedded.EmbeddedFile{
78
                Filename:    "chart_index.js",
79
                FileModTime: time.Unix(1538522004, 0),
80
                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"),
81
        }
82
        filea := &embedded.EmbeddedFile{
83
                Filename:    "charts.js",
84
                FileModTime: time.Unix(1538579801, 0),
85
                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"),
86
        }
87
        fileb := &embedded.EmbeddedFile{
88
                Filename:    "jquery-3.3.1.min.js",
89
                FileModTime: time.Unix(1534926456, 0),
90
                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});"),
91
        }
92
        filec := &embedded.EmbeddedFile{
93
                Filename:    "main.js",
94
                FileModTime: time.Unix(1538894434, 0),
95
                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    var typeLabel = $('#service_type_label');\n    if (selected === 'tcp' || selected === 'udp') {\n        if (selected === 'tcp') {\n            typeLabel.html('TCP Port')\n        } else {\n            typeLabel.html('UDP Port')\n        }\n        $('#service_port').parent().parent().removeClass('d-none');\n        $('#service_check_type').parent().parent().addClass('d-none');\n        $('#service_url').attr('placeholder', 'localhost');\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        $('#service_port').parent().parent().addClass('d-none');\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"),
96
        }
97
        filed := &embedded.EmbeddedFile{
98
                Filename:    "pikaday.js",
99
                FileModTime: time.Unix(1537243030, 0),
100
                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"),
101
        }
102
        filee := &embedded.EmbeddedFile{
103
                Filename:    "setup.js",
104
                FileModTime: time.Unix(1534396043, 0),
105
                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});"),
106
        }
107
        filef := &embedded.EmbeddedFile{
108
                Filename:    "sortable.min.js",
109
                FileModTime: time.Unix(1538283453, 0),
110
                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"),
111
        }
112
113
        // define dirs
114
        dir6 := &embedded.EmbeddedDir{
115
                Filename:   "",
116
                DirModTime: time.Unix(1538894434, 0),
117
                ChildFiles: []*embedded.EmbeddedFile{
118
                        file7, // "Chart.bundle.min.js"
119
                        file8, // "bootstrap.min.js"
120
                        file9, // "chart_index.js"
121
                        filea, // "charts.js"
122
                        fileb, // "jquery-3.3.1.min.js"
123
                        filec, // "main.js"
124
                        filed, // "pikaday.js"
125
                        filee, // "setup.js"
126
                        filef, // "sortable.min.js"
127
128
                },
129
        }
130
131
        // link ChildDirs
132
        dir6.ChildDirs = []*embedded.EmbeddedDir{}
133
134
        // register embeddedBox
135
        embedded.RegisterEmbeddedBox(`js`, &embedded.EmbeddedBox{
136
                Name: `js`,
137
                Time: time.Unix(1538894434, 0),
138
                Dirs: map[string]*embedded.EmbeddedDir{
139
                        "": dir6,
140
                },
141
                Files: map[string]*embedded.EmbeddedFile{
142
                        "Chart.bundle.min.js": file7,
143
                        "bootstrap.min.js":    file8,
144
                        "chart_index.js":      file9,
145
                        "charts.js":           filea,
146
                        "jquery-3.3.1.min.js": fileb,
147
                        "main.js":             filec,
148
                        "pikaday.js":          filed,
149
                        "setup.js":            filee,
150
                        "sortable.min.js":     filef,
151
                },
152
        })
153
}
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:    "base.scss",
13
                FileModTime: time.Unix(1538106377, 0),
14
                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"),
15
        }
16
        file3 := &embedded.EmbeddedFile{
17
                Filename:    "mobile.scss",
18
                FileModTime: time.Unix(1538106377, 0),
19
                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"),
20
        }
21
        file4 := &embedded.EmbeddedFile{
22
                Filename:    "pikaday.scss",
23
                FileModTime: time.Unix(1537243356, 0),
24
                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}"),
25
        }
26
        file5 := &embedded.EmbeddedFile{
27
                Filename:    "variables.scss",
28
                FileModTime: time.Unix(1537299527, 0),
29
                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"),
30
        }
31
32
        // define dirs
33
        dir1 := &embedded.EmbeddedDir{
34
                Filename:   "",
35
                DirModTime: time.Unix(1538106377, 0),
36
                ChildFiles: []*embedded.EmbeddedFile{
37
                        file2, // "base.scss"
38
                        file3, // "mobile.scss"
39
                        file4, // "pikaday.scss"
40
                        file5, // "variables.scss"
41
42
                },
43
        }
44
45
        // link ChildDirs
46
        dir1.ChildDirs = []*embedded.EmbeddedDir{}
47
48
        // register embeddedBox
49
        embedded.RegisterEmbeddedBox(`scss`, &embedded.EmbeddedBox{
50
                Name: `scss`,
51
                Time: time.Unix(1538106377, 0),
52
                Dirs: map[string]*embedded.EmbeddedDir{
53
                        "": dir1,
54
                },
55
                Files: map[string]*embedded.EmbeddedFile{
56
                        "base.scss":      file2,
57
                        "mobile.scss":    file3,
58
                        "pikaday.scss":   file4,
59
                        "variables.scss": file5,
60
                },
61
        })
62
}
func init
Back

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

365
func init() {
366
367
        // define files
368
        file18 := &embedded.EmbeddedFile{
369
                Filename:    "base.css",
370
                FileModTime: time.Unix(1539641084, 0),
371
                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"),
372
        }
373
        file19 := &embedded.EmbeddedFile{
374
                Filename:    "base.css.map",
375
                FileModTime: time.Unix(1539641085, 0),
376
                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"),
377
        }
378
        file1a := &embedded.EmbeddedFile{
379
                Filename:    "bootstrap.min.css",
380
                FileModTime: time.Unix(1530208361, 0),
381
                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 */"),
382
        }
383
384
        // define dirs
385
        dir17 := &embedded.EmbeddedDir{
386
                Filename:   "",
387
                DirModTime: time.Unix(1538106376, 0),
388
                ChildFiles: []*embedded.EmbeddedFile{
389
                        file18, // "base.css"
390
                        file19, // "base.css.map"
391
                        file1a, // "bootstrap.min.css"
392
393
                },
394
        }
395
396
        // link ChildDirs
397
        dir17.ChildDirs = []*embedded.EmbeddedDir{}
398
399
        // register embeddedBox
400
        embedded.RegisterEmbeddedBox(`css`, &embedded.EmbeddedBox{
401
                Name: `css`,
402
                Time: time.Unix(1538106376, 0),
403
                Dirs: map[string]*embedded.EmbeddedDir{
404
                        "": dir17,
405
                },
406
                Files: map[string]*embedded.EmbeddedFile{
407
                        "base.css":          file18,
408
                        "base.css.map":      file19,
409
                        "bootstrap.min.css": file1a,
410
                },
411
        })
412
}
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 54.76%

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
RandomString(...)github.com/hunterlong/statup/utils/encryption.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
Http(...)github.com/hunterlong/statup/utils/log.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
Timestamp.Ago(...)github.com/hunterlong/statup/utils/utils.go100.00%2/2
StringInt(...)github.com/hunterlong/statup/utils/utils.go100.00%2/2
HashPassword(...)github.com/hunterlong/statup/utils/encryption.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
SaveFile(...)github.com/hunterlong/statup/utils/utils.go0.00%0/2
@164:5(...)github.com/hunterlong/statup/utils/utils.go0.00%0/1
@168:5(...)github.com/hunterlong/statup/utils/utils.go0.00%0/1
LogRow.FormatForHtml(...)github.com/hunterlong/statup/utils/log.go0.00%0/1
github.com/hunterlong/statup/utils54.76%115/210
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:

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

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

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

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

48
func RandomString(n int) string {
49
        b := make([]rune, n)
50
        rand.Seed(time.Now().UnixNano())
51
        for i := range b {
52
                b[i] = characterRunes[rand.Intn(len(characterRunes))]
53
        }
54
        return string(b)
55
}
func DeleteFile
Back

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

138
func DeleteFile(file string) error {
139
        Log(1, "deleting file: "+file)
140
        err := os.Remove(file)
141
        if err != nil {
142
                return err
143
        }
144
        return nil
145
}
func newLogRow
Back

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

158
func newLogRow(line interface{}) (logRow *LogRow) {
159
        logRow = new(LogRow)
160
        logRow.Date = time.Now()
161
        logRow.Line = line
162
        return
163
}
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
        fmt.Printf("WEB: %v\n", msg)
129
        pushLastLine(msg)
130
        return msg
131
}
func Timezoner
Back

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

72
func Timezoner(t time.Time, zone float32) time.Time {
73
        zoneInt := float32(3600) * (zone + 1)
74
        loc := time.FixedZone("", int(zoneInt))
75
        timez := t.In(loc)
76
        return timez
77
}
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 Timestamp.Ago
Back

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

94
func (t Timestamp) Ago() string {
95
        got, _ := timeago.TimeAgoWithTime(time.Now(), time.Time(t))
96
        return got
97
}
func StringInt
Back

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

47
func StringInt(s string) int64 {
48
        num, _ := strconv.Atoi(s)
49
        return int64(num)
50
}
func HashPassword
Back

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

27
func HashPassword(password string) string {
28
        bytes, _ := bcrypt.GenerateFromPassword([]byte(password), 14)
29
        return string(bytes)
30
}
func DeleteDirectory
Back

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

149
func DeleteDirectory(directory string) error {
150
        return os.RemoveAll(directory)
151
}
func rev
Back

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

77
func rev(f float64) float64 {
78
        return f * -1
79
}
func pushLastLine
Back

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

133
func pushLastLine(line interface{}) {
134
        LockLines.Lock()
135
        defer LockLines.Unlock()
136
        LastLines = append(LastLines, newLogRow(line))
137
        // We want to store max 1000 lines in memory (for /logs page).
138
        for len(LastLines) > 1000 {
139
                LastLines = LastLines[1:]
140
        }
141
}
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:

38
func init() {
39
        if os.Getenv("STATUP_DIR") != "" {
40
                Directory = os.Getenv("STATUP_DIR")
41
        } else {
42
                Directory = dir()
43
        }
44
}
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:

127
func FileExists(name string) bool {
128
        if _, err := os.Stat(name); err != nil {
129
                if os.IsNotExist(err) {
130
                        return false
131
                }
132
        }
133
        return true
134
}
func DurationReadable
Back

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

213
func DurationReadable(d time.Duration) string {
214
        if d.Hours() >= 1 {
215
                return fmt.Sprintf("%0.0f hours", d.Hours())
216
        } else if d.Minutes() >= 1 {
217
                return fmt.Sprintf("%0.0f minutes", d.Minutes())
218
        } else if d.Seconds() >= 1 {
219
                return fmt.Sprintf("%0.0f seconds", d.Seconds())
220
        }
221
        return d.String()
222
}
func FormatDuration
Back

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

24
func FormatDuration(d time.Duration) string {
25
        var out string
26
        if d.Hours() >= 24 {
27
                out = fmt.Sprintf("%0.0f day", d.Hours()/24)
28
                if (d.Hours() / 24) >= 2 {
29
                        out += "s"
30
                }
31
                return out
32
        } else if d.Hours() >= 1 {
33
                out = fmt.Sprintf("%0.0f hour", d.Hours())
34
                if d.Hours() >= 2 {
35
                        out += "s"
36
                }
37
                return out
38
        } else if d.Minutes() >= 1 {
39
                out = fmt.Sprintf("%0.0f minute", d.Minutes())
40
                if d.Minutes() >= 2 {
41
                        out += "s"
42
                }
43
                return out
44
        } else if d.Seconds() >= 1 {
45
                out = fmt.Sprintf("%0.0f second", d.Seconds())
46
                if d.Seconds() >= 2 {
47
                        out += "s"
48
                }
49
                return out
50
        } else if rev(d.Hours()) >= 24 {
51
                out = fmt.Sprintf("%0.0f day", rev(d.Hours()/24))
52
                if rev(d.Hours()/24) >= 2 {
53
                        out += "s"
54
                }
55
                return out
56
        } else if rev(d.Hours()) >= 1 {
57
                out = fmt.Sprintf("%0.0f hour", rev(d.Hours()))
58
                if rev(d.Hours()) >= 2 {
59
                        out += "s"
60
                }
61
                return out
62
        } else if rev(d.Minutes()) >= 1 {
63
                out = fmt.Sprintf("%0.0f minute", rev(d.Minutes()))
64
                if rev(d.Minutes()) >= 2 {
65
                        out += "s"
66
                }
67
                return out
68
        } else {
69
                out = fmt.Sprintf("%0.0f second", rev(d.Seconds()))
70
                if rev(d.Seconds()) >= 2 {
71
                        out += "s"
72
                }
73
        }
74
        return out
75
}
func ToString
Back

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

53
func ToString(s interface{}) string {
54
        switch v := s.(type) {
55
        case int, int32, int64:
56
                return fmt.Sprintf("%v", v)
57
        case float32, float64:
58
                return fmt.Sprintf("%v", v)
59
        case []byte:
60
                return string(v)
61
        case bool:
62
                if v {
63
                        return "true"
64
                }
65
                return "false"
66
        default:
67
                return fmt.Sprintf("%v", v)
68
        }
69
}
func Command
Back

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

155
func Command(cmd string) (string, string, error) {
156
        Log(1, "running command: "+cmd)
157
        testCmd := exec.Command("sh", "-c", cmd)
158
        var stdout, stderr []byte
159
        var errStdout, errStderr error
160
        stdoutIn, _ := testCmd.StdoutPipe()
161
        stderrIn, _ := testCmd.StderrPipe()
162
        testCmd.Start()
163
164
        go func() {
165
                stdout, errStdout = copyAndCapture(os.Stdout, stdoutIn)
166
        }()
167
168
        go func() {
169
                stderr, errStderr = copyAndCapture(os.Stderr, stderrIn)
170
        }()
171
172
        err := testCmd.Wait()
173
        if err != nil {
174
                return "", "", err
175
        }
176
177
        if errStdout != nil || errStderr != nil {
178
                return "", "", errors.New("failed to capture stdout or stderr")
179
        }
180
181
        outStr, errStr := string(stdout), string(stderr)
182
        return outStr, errStr, err
183
}
func copyAndCapture
Back

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

186
func copyAndCapture(w io.Writer, r io.Reader) ([]byte, error) {
187
        var out []byte
188
        buf := make([]byte, 1024, 1024)
189
        for {
190
                n, err := r.Read(buf[:])
191
                if n > 0 {
192
                        d := buf[:n]
193
                        out = append(out, d...)
194
                        _, err := w.Write(d)
195
                        if err != nil {
196
                                return out, err
197
                        }
198
                }
199
                if err != nil {
200
                        // Read returns io.EOF at the end of file, which is not an error for us
201
                        if err == io.EOF {
202
                                err = nil
203
                        }
204
                        return out, err
205
                }
206
        }
207
}
func GetLastLine
Back

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

144
func GetLastLine() *LogRow {
145
        LockLines.Lock()
146
        defer LockLines.Unlock()
147
        if len(LastLines) > 0 {
148
                return LastLines[len(LastLines)-1]
149
        }
150
        return nil
151
}
func LogRow.lineAsString
Back

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

165
func (o *LogRow) lineAsString() string {
166
        switch v := o.Line.(type) {
167
        case string:
168
                return v
169
        case error:
170
                return v.Error()
171
        case []byte:
172
                return string(v)
173
        }
174
        return ""
175
}
func dir
Back

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

80
func dir() string {
81
        dir, err := os.Getwd()
82
        if err != nil {
83
                return "."
84
        }
85
        return dir
86
}
func SaveFile
Back

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

226
func SaveFile(filename string, data []byte) error {
227
        err := ioutil.WriteFile(filename, data, 0644)
228
        return err
229
}
func @164:5
Back

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

164
func() {
165
                stdout, errStdout = copyAndCapture(os.Stdout, stdoutIn)
166
        }
func @168:5
Back

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

168
func() {
169
                stderr, errStderr = copyAndCapture(os.Stderr, stderrIn)
170
        }
func LogRow.FormatForHtml
Back

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

177
func (o *LogRow) FormatForHtml() string {
178
        return fmt.Sprintf("%s: %s", o.Date.Format("2006-01-02 15:04:05"), o.lineAsString())
179
}
Report Total
54.53%