1886 lines
1.5 MiB
1886 lines
1.5 MiB
|
||
<html>
|
||
<head>
|
||
<title>Coverage Report</title>
|
||
|
||
<style type="text/css">
|
||
body { background-color: #fff; }
|
||
table {
|
||
margin-left: 10px;
|
||
border-collapse: collapse;
|
||
}
|
||
td {
|
||
background-color: #fff;
|
||
padding: 2px;
|
||
}
|
||
table.overview td {
|
||
padding-right: 20px;
|
||
}
|
||
td.percent, td.linecount { text-align: right; }
|
||
div.package, #totalcov {
|
||
color: #fff;
|
||
background-color: #375eab;
|
||
font-size: 16px;
|
||
font-weight: bold;
|
||
padding: 10px;
|
||
border-radius: 5px 5px 5px 5px;
|
||
}
|
||
div.package, #totalcov {
|
||
float: right;
|
||
right: 10px;
|
||
}
|
||
#totalcov {
|
||
top: 10px;
|
||
position: relative;
|
||
background-color: #fff;
|
||
color: #000;
|
||
border: 1px solid #375eab;
|
||
clear: both;
|
||
}
|
||
#summaryWrapper {
|
||
position: fixed;
|
||
top: 10px;
|
||
float: right;
|
||
right: 10px;
|
||
|
||
}
|
||
span.packageTotal {
|
||
float: right;
|
||
color: #000;
|
||
}
|
||
#doctitle {
|
||
background-color: #fff;
|
||
font-size: 24px;
|
||
margin-top: 20px;
|
||
margin-left: 10px;
|
||
color: #375eab;
|
||
font-weight: bold;
|
||
}
|
||
#about {
|
||
margin-left: 18px;
|
||
font-size: 10px;
|
||
}
|
||
table tr:last-child td {
|
||
font-weight: bold;
|
||
}
|
||
.functitle, .funcname {
|
||
text-align: center;
|
||
font-size: 20px;
|
||
font-weight: bold;
|
||
color: 375eab;
|
||
}
|
||
.funcname {
|
||
text-align: left;
|
||
margin-top: 20px;
|
||
margin-left: 10px;
|
||
margin-bottom: 20px;
|
||
padding: 2px 5px 5px;
|
||
background-color: #e0ebf5;
|
||
}
|
||
table.listing {
|
||
margin-left: 10px;
|
||
}
|
||
table.listing td {
|
||
padding: 0px;
|
||
font-size: 12px;
|
||
background-color: #eee;
|
||
vertical-align: top;
|
||
padding-left: 10px;
|
||
border-bottom: 1px solid #fff;
|
||
}
|
||
table.listing td:first-child {
|
||
text-align: right;
|
||
font-weight: bold;
|
||
vertical-align: center;
|
||
}
|
||
table.listing tr.miss td {
|
||
background-color: #FFBBB8;
|
||
}
|
||
table.listing tr:last-child td {
|
||
font-weight: normal;
|
||
color: #000;
|
||
}
|
||
table.listing tr:last-child td:first-child {
|
||
font-weight: bold;
|
||
}
|
||
.info {
|
||
margin-left: 10px;
|
||
}
|
||
.info code {
|
||
}
|
||
pre { margin: 1px; }
|
||
pre.cmd {
|
||
background-color: #e9e9e9;
|
||
border-radius: 5px 5px 5px 5px;
|
||
padding: 10px;
|
||
margin: 20px;
|
||
line-height: 18px;
|
||
font-size; 14px;
|
||
}
|
||
a {
|
||
text-decoration: none;
|
||
color: #375eab;
|
||
}
|
||
a:hover { text-decoration: underline; }
|
||
p { margin-left: 10px; }
|
||
</style>
|
||
|
||
</head>
|
||
<body>
|
||
<div id="doctitle">Coverage Report</div>
|
||
<div id="about">Generated on 15 Oct 18 15:22 -0700 with <a href="https://github.com/matm/gocov-html">gocov-html</a></div><div class="funcname">Report Overview</div><table class="overview">
|
||
<tr id="s_pkg_github.com/hunterlong/statup/cmd"><td><code><a href="#pkg_github.com/hunterlong/statup/cmd">github.com/hunterlong/statup/cmd</a></code></td><td class="percent"><code>31.08%</code></td><td class="linecount"><code>46/148</code></td></tr>
|
||
<tr id="s_pkg_github.com/hunterlong/statup/core"><td><code><a href="#pkg_github.com/hunterlong/statup/core">github.com/hunterlong/statup/core</a></code></td><td class="percent"><code>52.58%</code></td><td class="linecount"><code>510/970</code></td></tr>
|
||
<tr id="s_pkg_github.com/hunterlong/statup/core/notifier"><td><code><a href="#pkg_github.com/hunterlong/statup/core/notifier">github.com/hunterlong/statup/core/notifier</a></code></td><td class="percent"><code>72.73%</code></td><td class="linecount"><code>152/209</code></td></tr>
|
||
<tr id="s_pkg_github.com/hunterlong/statup/handlers"><td><code><a href="#pkg_github.com/hunterlong/statup/handlers">github.com/hunterlong/statup/handlers</a></code></td><td class="percent"><code>67.41%</code></td><td class="linecount"><code>635/942</code></td></tr>
|
||
<tr id="s_pkg_github.com/hunterlong/statup/notifiers"><td><code><a href="#pkg_github.com/hunterlong/statup/notifiers">github.com/hunterlong/statup/notifiers</a></code></td><td class="percent"><code>7.00%</code></td><td class="linecount"><code>18/257</code></td></tr>
|
||
<tr id="s_pkg_github.com/hunterlong/statup/plugin"><td><code><a href="#pkg_github.com/hunterlong/statup/plugin">github.com/hunterlong/statup/plugin</a></code></td><td class="percent"><code>4.08%</code></td><td class="linecount"><code>2/49</code></td></tr>
|
||
<tr id="s_pkg_github.com/hunterlong/statup/source"><td><code><a href="#pkg_github.com/hunterlong/statup/source">github.com/hunterlong/statup/source</a></code></td><td class="percent"><code>77.71%</code></td><td class="linecount"><code>136/175</code></td></tr>
|
||
<tr id="s_pkg_github.com/hunterlong/statup/utils"><td><code><a href="#pkg_github.com/hunterlong/statup/utils">github.com/hunterlong/statup/utils</a></code></td><td class="percent"><code>54.76%</code></td><td class="linecount"><code>115/210</code></td></tr>
|
||
<tr><td><code>Report Total</code></td><td class="percent"><code>54.53%</code></td><td class="linecount"><code>1614/2960</code></td></tr>
|
||
</table>
|
||
<div id="pkg_github.com/hunterlong/statup/cmd" class="funcname">Package Overview: github.com/hunterlong/statup/cmd <span class="packageTotal">31.08%</span></div><p>This is a coverage report created after analysis of the <code>github.com/hunterlong/statup/cmd</code> package. It
|
||
has been generated with the following command:</p><pre class="cmd">gocov test github.com/hunterlong/statup/cmd | gocov-html</pre> <p>Here are the stats. Please select a function name to view its implementation and see what's left for testing.</p><table class="overview">
|
||
<tr id="s_fn_HelpEcho"><td><code><a href="#fn_HelpEcho">HelpEcho(...)</a></code></td><td><code>github.com/hunterlong/statup/cmd/cli.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>17/17</code></td></tr>
|
||
<tr id="s_fn_init"><td><code><a href="#fn_init">init(...)</a></code></td><td><code>github.com/hunterlong/statup/cmd/main.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_loadDotEnvs"><td><code><a href="#fn_loadDotEnvs">loadDotEnvs(...)</a></code></td><td><code>github.com/hunterlong/statup/cmd/main.go</code></td><td class="percent"><code>60.00%</code></td><td class="linecount"><code>3/5</code></td></tr>
|
||
<tr id="s_fn_catchCLI"><td><code><a href="#fn_catchCLI">catchCLI(...)</a></code></td><td><code>github.com/hunterlong/statup/cmd/cli.go</code></td><td class="percent"><code>42.37%</code></td><td class="linecount"><code>25/59</code></td></tr>
|
||
<tr id="s_fn_main"><td><code><a href="#fn_main">main(...)</a></code></td><td><code>github.com/hunterlong/statup/cmd/main.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/22</code></td></tr>
|
||
<tr id="s_fn_RunOnce"><td><code><a href="#fn_RunOnce">RunOnce(...)</a></code></td><td><code>github.com/hunterlong/statup/cmd/cli.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/17</code></td></tr>
|
||
<tr id="s_fn_mainProcess"><td><code><a href="#fn_mainProcess">mainProcess(...)</a></code></td><td><code>github.com/hunterlong/statup/cmd/main.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/11</code></td></tr>
|
||
<tr id="s_fn_checkGithubUpdates"><td><code><a href="#fn_checkGithubUpdates">checkGithubUpdates(...)</a></code></td><td><code>github.com/hunterlong/statup/cmd/cli.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/10</code></td></tr>
|
||
<tr id="s_fn_parseFlags"><td><code><a href="#fn_parseFlags">parseFlags(...)</a></code></td><td><code>github.com/hunterlong/statup/cmd/main.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/5</code></td></tr>
|
||
<tr id="s_fn_ForEachPlugin"><td><code><a href="#fn_ForEachPlugin">ForEachPlugin(...)</a></code></td><td><code>github.com/hunterlong/statup/cmd/main.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr><td colspan="2"><code>github.com/hunterlong/statup/cmd</code></td><td class="percent"><code>31.08%</code></td><td class="linecount"><code>46/148</code></td></tr>
|
||
</table>
|
||
|
||
<div class="funcname" id="fn_HelpEcho">func HelpEcho</div><div class="info"><a href="#s_fn_HelpEcho">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/cli.go</code>:</p></div><table class="listing">
|
||
<tr><td>151</td><td><code><pre>func HelpEcho() {</pre></code></td></tr><tr><td>152</td><td><code><pre> fmt.Printf("Statup v%v - Statup.io\n", VERSION)</pre></code></td></tr><tr><td>153</td><td><code><pre> fmt.Printf("A simple Application Status Monitor that is opensource and lightweight.\n")</pre></code></td></tr><tr><td>154</td><td><code><pre> fmt.Printf("Commands:\n")</pre></code></td></tr><tr><td>155</td><td><code><pre> fmt.Println(" statup - Main command to run Statup server")</pre></code></td></tr><tr><td>156</td><td><code><pre> fmt.Println(" statup version - Returns the current version of Statup")</pre></code></td></tr><tr><td>157</td><td><code><pre> fmt.Println(" statup run - Check all services 1 time and then quit")</pre></code></td></tr><tr><td>158</td><td><code><pre> fmt.Println(" statup test plugins - Test all plugins for required information")</pre></code></td></tr><tr><td>159</td><td><code><pre> fmt.Println(" statup assets - Dump all assets used locally to be edited.")</pre></code></td></tr><tr><td>160</td><td><code><pre> fmt.Println(" statup sass - Compile .scss files into the css directory")</pre></code></td></tr><tr><td>161</td><td><code><pre> fmt.Println(" statup env - Show all environment variables being used for Statup")</pre></code></td></tr><tr><td>162</td><td><code><pre> fmt.Println(" statup export - Exports the index page as a static HTML for pushing")</pre></code></td></tr><tr><td>163</td><td><code><pre> fmt.Println(" statup update - Attempts to update to the latest version")</pre></code></td></tr><tr><td>164</td><td><code><pre> fmt.Println(" statup help - Shows the user basic information about Statup")</pre></code></td></tr><tr><td>165</td><td><code><pre> fmt.Printf("Flags:\n")</pre></code></td></tr><tr><td>166</td><td><code><pre> fmt.Println(" -ip 127.0.0.1 - Run HTTP server on specific IP address (default: localhost)")</pre></code></td></tr><tr><td>167</td><td><code><pre> fmt.Println(" -port 8080 - Run HTTP server on Port (default: 8080)")</pre></code></td></tr><tr><td>168</td><td><code><pre> fmt.Println("Give Statup a Star at https://github.com/hunterlong/statup")</pre></code></td></tr><tr><td>169</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_init">func init</div><div class="info"><a href="#s_fn_init">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/main.go</code>:</p></div><table class="listing">
|
||
<tr><td>41</td><td><code><pre>func init() {</pre></code></td></tr><tr><td>42</td><td><code><pre> core.VERSION = VERSION</pre></code></td></tr><tr><td>43</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_loadDotEnvs">func loadDotEnvs</div><div class="info"><a href="#s_fn_loadDotEnvs">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/main.go</code>:</p></div><table class="listing">
|
||
<tr><td>88</td><td><code><pre>func loadDotEnvs() error {</pre></code></td></tr><tr><td>89</td><td><code><pre> err := godotenv.Load()</pre></code></td></tr><tr><td>90</td><td><code><pre> if err == nil {</pre></code></td></tr><tr class="miss"><td>91</td><td><code><pre> utils.Log(1, "Environment file '.env' Loaded")</pre></code></td></tr><tr class="miss"><td>92</td><td><code><pre> UsingDotEnv = true</pre></code></td></tr><tr><td>93</td><td><code><pre> }</pre></code></td></tr><tr><td>94</td><td><code><pre> return err</pre></code></td></tr><tr><td>95</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_catchCLI">func catchCLI</div><div class="info"><a href="#s_fn_catchCLI">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/cli.go</code>:</p></div><table class="listing">
|
||
<tr><td>34</td><td><code><pre>func catchCLI(args []string) error {</pre></code></td></tr><tr><td>35</td><td><code><pre> dir := utils.Directory</pre></code></td></tr><tr><td>36</td><td><code><pre> utils.InitLogs()</pre></code></td></tr><tr><td>37</td><td><code><pre> source.Assets()</pre></code></td></tr><tr><td>38</td><td><code><pre> loadDotEnvs()</pre></code></td></tr><tr><td>39</td><td><code><pre></pre></code></td></tr><tr><td>40</td><td><code><pre> switch args[0] {</pre></code></td></tr><tr><td>41</td><td><code><pre> case "app":</pre></code></td></tr><tr class="miss"><td>42</td><td><code><pre> handlers.DesktopInit(ipAddress, port)</pre></code></td></tr><tr><td>43</td><td><code><pre> case "version":</pre></code></td></tr><tr><td>44</td><td><code><pre> if COMMIT != "" {</pre></code></td></tr><tr class="miss"><td>45</td><td><code><pre> fmt.Printf("Statup v%v (%v)\n", VERSION, COMMIT)</pre></code></td></tr><tr><td>46</td><td><code><pre> } else {</pre></code></td></tr><tr><td>47</td><td><code><pre> fmt.Printf("Statup v%v\n", VERSION)</pre></code></td></tr><tr><td>48</td><td><code><pre> }</pre></code></td></tr><tr><td>49</td><td><code><pre> return errors.New("end")</pre></code></td></tr><tr><td>50</td><td><code><pre> case "assets":</pre></code></td></tr><tr><td>51</td><td><code><pre> err := source.CreateAllAssets(dir)</pre></code></td></tr><tr><td>52</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>53</td><td><code><pre> return err</pre></code></td></tr><tr><td>54</td><td><code><pre> } else {</pre></code></td></tr><tr><td>55</td><td><code><pre> return errors.New("end")</pre></code></td></tr><tr><td>56</td><td><code><pre> }</pre></code></td></tr><tr><td>57</td><td><code><pre> case "sass":</pre></code></td></tr><tr><td>58</td><td><code><pre> err := source.CompileSASS(dir)</pre></code></td></tr><tr><td>59</td><td><code><pre> if err == nil {</pre></code></td></tr><tr><td>60</td><td><code><pre> return errors.New("end")</pre></code></td></tr><tr><td>61</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>62</td><td><code><pre> return err</pre></code></td></tr><tr><td>63</td><td><code><pre> case "update":</pre></code></td></tr><tr class="miss"><td>64</td><td><code><pre> gitCurrent, err := checkGithubUpdates()</pre></code></td></tr><tr class="miss"><td>65</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>66</td><td><code><pre> return nil</pre></code></td></tr><tr><td>67</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>68</td><td><code><pre> fmt.Printf("Statup Version: v%v\nLatest Version: %v\n", VERSION, gitCurrent.TagName)</pre></code></td></tr><tr class="miss"><td>69</td><td><code><pre> if VERSION != gitCurrent.TagName[1:] {</pre></code></td></tr><tr class="miss"><td>70</td><td><code><pre> 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:])</pre></code></td></tr><tr><td>71</td><td><code><pre> } else {</pre></code></td></tr><tr class="miss"><td>72</td><td><code><pre> fmt.Printf("You have the latest version of Statup!\n")</pre></code></td></tr><tr><td>73</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>74</td><td><code><pre> if err == nil {</pre></code></td></tr><tr class="miss"><td>75</td><td><code><pre> return errors.New("end")</pre></code></td></tr><tr><td>76</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>77</td><td><code><pre> return nil</pre></code></td></tr><tr><td>78</td><td><code><pre> case "test":</pre></code></td></tr><tr><td>79</td><td><code><pre> cmd := args[1]</pre></code></td></tr><tr><td>80</td><td><code><pre> switch cmd {</pre></code></td></tr><tr><td>81</td><td><code><pre> case "plugins":</pre></code></td></tr><tr><td>82</td><td><code><pre> plugin.LoadPlugins()</pre></code></td></tr><tr><td>83</td><td><code><pre> }</pre></code></td></tr><tr><td>84</td><td><code><pre> return errors.New("end")</pre></code></td></tr><tr><td>85</td><td><code><pre> case "export":</pre></code></td></tr><tr class="miss"><td>86</td><td><code><pre> var err error</pre></code></td></tr><tr class="miss"><td>87</td><td><code><pre> fmt.Printf("Statup v%v Exporting Static 'index.html' page...\n", VERSION)</pre></code></td></tr><tr class="miss"><td>88</td><td><code><pre> core.Configs, err = core.LoadConfigFile(dir)</pre></code></td></tr><tr class="miss"><td>89</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>90</td><td><code><pre> utils.Log(4, "config.yml file not found")</pre></code></td></tr><tr class="miss"><td>91</td><td><code><pre> return err</pre></code></td></tr><tr><td>92</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>93</td><td><code><pre> indexSource := core.ExportIndexHTML()</pre></code></td></tr><tr class="miss"><td>94</td><td><code><pre> err = utils.SaveFile("./index.html", []byte(indexSource))</pre></code></td></tr><tr class="miss"><td>95</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>96</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr class="miss"><td>97</td><td><code><pre> return err</pre></code></td></tr><tr><td>98</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>99</td><td><code><pre> utils.Log(1, "Exported Statup index page: 'index.html'")</pre></code></td></tr><tr><td>100</td><td><code><pre> case "help":</pre></code></td></tr><tr><td>101</td><td><code><pre> HelpEcho()</pre></code></td></tr><tr><td>102</td><td><code><pre> return errors.New("end")</pre></code></td></tr><tr><td>103</td><td><code><pre> case "run":</pre></code></td></tr><tr class="miss"><td>104</td><td><code><pre> utils.Log(1, "Running 1 time and saving to database...")</pre></code></td></tr><tr class="miss"><td>105</td><td><code><pre> RunOnce()</pre></code></td></tr><tr class="miss"><td>106</td><td><code><pre> fmt.Println("Check is complete.")</pre></code></td></tr><tr class="miss"><td>107</td><td><code><pre> return errors.New("end")</pre></code></td></tr><tr><td>108</td><td><code><pre> case "env":</pre></code></td></tr><tr><td>109</td><td><code><pre> fmt.Println("Statup Environment Variable")</pre></code></td></tr><tr><td>110</td><td><code><pre> envs, err := godotenv.Read(".env")</pre></code></td></tr><tr><td>111</td><td><code><pre> if err != nil {</pre></code></td></tr><tr><td>112</td><td><code><pre> utils.Log(4, "No .env file found in current directory.")</pre></code></td></tr><tr><td>113</td><td><code><pre> return err</pre></code></td></tr><tr><td>114</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>115</td><td><code><pre> for k, e := range envs {</pre></code></td></tr><tr class="miss"><td>116</td><td><code><pre> fmt.Printf("%v=%v\n", k, e)</pre></code></td></tr><tr><td>117</td><td><code><pre> }</pre></code></td></tr><tr><td>118</td><td><code><pre> default:</pre></code></td></tr><tr class="miss"><td>119</td><td><code><pre> return nil</pre></code></td></tr><tr><td>120</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>121</td><td><code><pre> return errors.New("end")</pre></code></td></tr><tr><td>122</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_main">func main</div><div class="info"><a href="#s_fn_main">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/main.go</code>:</p></div><table class="listing">
|
||
<tr><td>57</td><td><code><pre>func main() {</pre></code></td></tr><tr class="miss"><td>58</td><td><code><pre> var err error</pre></code></td></tr><tr class="miss"><td>59</td><td><code><pre> parseFlags()</pre></code></td></tr><tr class="miss"><td>60</td><td><code><pre> loadDotEnvs()</pre></code></td></tr><tr class="miss"><td>61</td><td><code><pre> source.Assets()</pre></code></td></tr><tr class="miss"><td>62</td><td><code><pre> utils.InitLogs()</pre></code></td></tr><tr class="miss"><td>63</td><td><code><pre> args := flag.Args()</pre></code></td></tr><tr><td>64</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>65</td><td><code><pre> if len(args) >= 1 {</pre></code></td></tr><tr class="miss"><td>66</td><td><code><pre> err := catchCLI(args)</pre></code></td></tr><tr class="miss"><td>67</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>68</td><td><code><pre> if err.Error() == "end" {</pre></code></td></tr><tr class="miss"><td>69</td><td><code><pre> os.Exit(0)</pre></code></td></tr><tr><td>70</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>71</td><td><code><pre> fmt.Println(err)</pre></code></td></tr><tr class="miss"><td>72</td><td><code><pre> os.Exit(1)</pre></code></td></tr><tr><td>73</td><td><code><pre> }</pre></code></td></tr><tr><td>74</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>75</td><td><code><pre> utils.Log(1, fmt.Sprintf("Starting Statup v%v", VERSION))</pre></code></td></tr><tr class="miss"><td>76</td><td><code><pre> core.Configs, err = core.LoadConfigFile(utils.Directory)</pre></code></td></tr><tr class="miss"><td>77</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>78</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr class="miss"><td>79</td><td><code><pre> core.SetupMode = true</pre></code></td></tr><tr class="miss"><td>80</td><td><code><pre> fmt.Println(handlers.RunHTTPServer(ipAddress, port))</pre></code></td></tr><tr class="miss"><td>81</td><td><code><pre> os.Exit(1)</pre></code></td></tr><tr><td>82</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>83</td><td><code><pre> defer core.CloseDB()</pre></code></td></tr><tr class="miss"><td>84</td><td><code><pre> mainProcess()</pre></code></td></tr><tr><td>85</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_RunOnce">func RunOnce</div><div class="info"><a href="#s_fn_RunOnce">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/cli.go</code>:</p></div><table class="listing">
|
||
<tr><td>125</td><td><code><pre>func RunOnce() {</pre></code></td></tr><tr class="miss"><td>126</td><td><code><pre> var err error</pre></code></td></tr><tr class="miss"><td>127</td><td><code><pre> core.Configs, err = core.LoadConfigFile(utils.Directory)</pre></code></td></tr><tr class="miss"><td>128</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>129</td><td><code><pre> utils.Log(4, "config.yml file not found")</pre></code></td></tr><tr><td>130</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>131</td><td><code><pre> err = core.Configs.Connect(false, utils.Directory)</pre></code></td></tr><tr class="miss"><td>132</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>133</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr><td>134</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>135</td><td><code><pre> core.CoreApp, err = core.SelectCore()</pre></code></td></tr><tr class="miss"><td>136</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>137</td><td><code><pre> fmt.Println("Core database was not found, Statup is not setup yet.")</pre></code></td></tr><tr><td>138</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>139</td><td><code><pre> _, err = core.CoreApp.SelectAllServices(true)</pre></code></td></tr><tr class="miss"><td>140</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>141</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr><td>142</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>143</td><td><code><pre> for _, out := range core.CoreApp.Services {</pre></code></td></tr><tr class="miss"><td>144</td><td><code><pre> service := out.Select()</pre></code></td></tr><tr class="miss"><td>145</td><td><code><pre> out.Check(true)</pre></code></td></tr><tr class="miss"><td>146</td><td><code><pre> fmt.Printf(" Service %v | URL: %v | Latency: %0.0fms | Online: %v\n", service.Name, service.Domain, (service.Latency * 1000), service.Online)</pre></code></td></tr><tr><td>147</td><td><code><pre> }</pre></code></td></tr><tr><td>148</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_mainProcess">func mainProcess</div><div class="info"><a href="#s_fn_mainProcess">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/main.go</code>:</p></div><table class="listing">
|
||
<tr><td>98</td><td><code><pre>func mainProcess() {</pre></code></td></tr><tr class="miss"><td>99</td><td><code><pre> dir := utils.Directory</pre></code></td></tr><tr class="miss"><td>100</td><td><code><pre> var err error</pre></code></td></tr><tr class="miss"><td>101</td><td><code><pre> err = core.Configs.Connect(false, dir)</pre></code></td></tr><tr class="miss"><td>102</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>103</td><td><code><pre> utils.Log(4, fmt.Sprintf("could not connect to database: %v", err))</pre></code></td></tr><tr><td>104</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>105</td><td><code><pre> core.Configs.MigrateDatabase()</pre></code></td></tr><tr class="miss"><td>106</td><td><code><pre> core.InitApp()</pre></code></td></tr><tr class="miss"><td>107</td><td><code><pre> if !core.SetupMode {</pre></code></td></tr><tr class="miss"><td>108</td><td><code><pre> plugin.LoadPlugins()</pre></code></td></tr><tr class="miss"><td>109</td><td><code><pre> fmt.Println(handlers.RunHTTPServer(ipAddress, port))</pre></code></td></tr><tr class="miss"><td>110</td><td><code><pre> os.Exit(1)</pre></code></td></tr><tr><td>111</td><td><code><pre> }</pre></code></td></tr><tr><td>112</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_checkGithubUpdates">func checkGithubUpdates</div><div class="info"><a href="#s_fn_checkGithubUpdates">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/cli.go</code>:</p></div><table class="listing">
|
||
<tr><td>171</td><td><code><pre>func checkGithubUpdates() (githubResponse, error) {</pre></code></td></tr><tr class="miss"><td>172</td><td><code><pre> var gitResp githubResponse</pre></code></td></tr><tr class="miss"><td>173</td><td><code><pre> response, err := http.Get("https://api.github.com/repos/hunterlong/statup/releases/latest")</pre></code></td></tr><tr class="miss"><td>174</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>175</td><td><code><pre> return githubResponse{}, err</pre></code></td></tr><tr><td>176</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>177</td><td><code><pre> defer response.Body.Close()</pre></code></td></tr><tr class="miss"><td>178</td><td><code><pre> contents, err := ioutil.ReadAll(response.Body)</pre></code></td></tr><tr class="miss"><td>179</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>180</td><td><code><pre> return githubResponse{}, err</pre></code></td></tr><tr><td>181</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>182</td><td><code><pre> err = json.Unmarshal(contents, &gitResp)</pre></code></td></tr><tr class="miss"><td>183</td><td><code><pre> return gitResp, err</pre></code></td></tr><tr><td>184</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_parseFlags">func parseFlags</div><div class="info"><a href="#s_fn_parseFlags">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/main.go</code>:</p></div><table class="listing">
|
||
<tr><td>48</td><td><code><pre>func parseFlags() {</pre></code></td></tr><tr class="miss"><td>49</td><td><code><pre> ip := flag.String("ip", "0.0.0.0", "IP address to run the Statup HTTP server")</pre></code></td></tr><tr class="miss"><td>50</td><td><code><pre> p := flag.Int("port", 8080, "Port to run the HTTP server")</pre></code></td></tr><tr class="miss"><td>51</td><td><code><pre> flag.Parse()</pre></code></td></tr><tr class="miss"><td>52</td><td><code><pre> ipAddress = *ip</pre></code></td></tr><tr class="miss"><td>53</td><td><code><pre> port = *p</pre></code></td></tr><tr><td>54</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_ForEachPlugin">func ForEachPlugin</div><div class="info"><a href="#s_fn_ForEachPlugin">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/cmd/main.go</code>:</p></div><table class="listing">
|
||
<tr><td>114</td><td><code><pre>func ForEachPlugin() {</pre></code></td></tr><tr class="miss"><td>115</td><td><code><pre> if len(core.CoreApp.Plugins) > 0 {</pre></code></td></tr><tr><td>116</td><td><code><pre> //for _, p := range core.Plugins {</pre></code></td></tr><tr><td>117</td><td><code><pre> // p.OnShutdown()</pre></code></td></tr><tr><td>118</td><td><code><pre> //}</pre></code></td></tr><tr><td>119</td><td><code><pre> }</pre></code></td></tr><tr><td>120</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<!-- Can be parsed by external script
|
||
PACKAGE:github.com/hunterlong/statup/cmd DONE:31.08
|
||
-->
|
||
|
||
<div id="pkg_github.com/hunterlong/statup/core" class="funcname">Package Overview: github.com/hunterlong/statup/core <span class="packageTotal">52.58%</span></div><p>This is a coverage report created after analysis of the <code>github.com/hunterlong/statup/core</code> package. It
|
||
has been generated with the following command:</p><pre class="cmd">gocov test github.com/hunterlong/statup/core | gocov-html</pre> <p>Here are the stats. Please select a function name to view its implementation and see what's left for testing.</p><table class="overview">
|
||
<tr id="s_fn_InsertLargeSampleData"><td><code><a href="#fn_InsertLargeSampleData">InsertLargeSampleData(...)</a></code></td><td><code>github.com/hunterlong/statup/core/sample.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>28/28</code></td></tr>
|
||
<tr id="s_fn_InsertSampleData"><td><code><a href="#fn_InsertSampleData">InsertSampleData(...)</a></code></td><td><code>github.com/hunterlong/statup/core/sample.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>13/13</code></td></tr>
|
||
<tr id="s_fn_Service.CheckQueue"><td><code><a href="#fn_Service.CheckQueue">Service.CheckQueue(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checker.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>13/13</code></td></tr>
|
||
<tr id="s_fn_insertSampleCheckins"><td><code><a href="#fn_insertSampleCheckins">insertSampleCheckins(...)</a></code></td><td><code>github.com/hunterlong/statup/core/sample.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>12/12</code></td></tr>
|
||
<tr id="s_fn_DbConfig.CreateDatabase"><td><code><a href="#fn_DbConfig.CreateDatabase">DbConfig.CreateDatabase(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>11/11</code></td></tr>
|
||
<tr id="s_fn_insertHitRecords"><td><code><a href="#fn_insertHitRecords">insertHitRecords(...)</a></code></td><td><code>github.com/hunterlong/statup/core/sample.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>10/10</code></td></tr>
|
||
<tr id="s_fn_DbConfig.DropDatabase"><td><code><a href="#fn_DbConfig.DropDatabase">DbConfig.DropDatabase(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>10/10</code></td></tr>
|
||
<tr id="s_fn_insertFailureRecords"><td><code><a href="#fn_insertFailureRecords">insertFailureRecords(...)</a></code></td><td><code>github.com/hunterlong/statup/core/sample.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>8/8</code></td></tr>
|
||
<tr id="s_fn_recordSuccess"><td><code><a href="#fn_recordSuccess">recordSuccess(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checker.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>6/6</code></td></tr>
|
||
<tr id="s_fn_Core.CountOnline"><td><code><a href="#fn_Core.CountOnline">Core.CountOnline(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>5/5</code></td></tr>
|
||
<tr id="s_fn_Checkin.Expected"><td><code><a href="#fn_Checkin.Expected">Checkin.Expected(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>5/5</code></td></tr>
|
||
<tr id="s_fn_SelectUsername"><td><code><a href="#fn_SelectUsername">SelectUsername(...)</a></code></td><td><code>github.com/hunterlong/statup/core/users.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_Service.Hits"><td><code><a href="#fn_Service.Hits">Service.Hits(...)</a></code></td><td><code>github.com/hunterlong/statup/core/hits.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_insertSampleUsers"><td><code><a href="#fn_insertSampleUsers">insertSampleUsers(...)</a></code></td><td><code>github.com/hunterlong/statup/core/sample.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_NewCore"><td><code><a href="#fn_NewCore">NewCore(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_Checkin.CreateFailure"><td><code><a href="#fn_Checkin.CreateFailure">Checkin.CreateFailure(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_Service.LimitedHits"><td><code><a href="#fn_Service.LimitedHits">Service.LimitedHits(...)</a></code></td><td><code>github.com/hunterlong/statup/core/hits.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_user.Update"><td><code><a href="#fn_user.Update">user.Update(...)</a></code></td><td><code>github.com/hunterlong/statup/core/users.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_Service.LimitedFailures"><td><code><a href="#fn_Service.LimitedFailures">Service.LimitedFailures(...)</a></code></td><td><code>github.com/hunterlong/statup/core/failures.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_Service.TotalHits"><td><code><a href="#fn_Service.TotalHits">Service.TotalHits(...)</a></code></td><td><code>github.com/hunterlong/statup/core/hits.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_Service.TotalFailuresSince"><td><code><a href="#fn_Service.TotalFailuresSince">Service.TotalFailuresSince(...)</a></code></td><td><code>github.com/hunterlong/statup/core/failures.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_Service.TotalHitsSince"><td><code><a href="#fn_Service.TotalHitsSince">Service.TotalHitsSince(...)</a></code></td><td><code>github.com/hunterlong/statup/core/hits.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_reverseHits"><td><code><a href="#fn_reverseHits">reverseHits(...)</a></code></td><td><code>github.com/hunterlong/statup/core/hits.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_Checkin.Hits"><td><code><a href="#fn_Checkin.Hits">Checkin.Hits(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_Checkin.Last"><td><code><a href="#fn_Checkin.Last">Checkin.Last(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_Service.Checkins"><td><code><a href="#fn_Service.Checkins">Service.Checkins(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_insertSampleCore"><td><code><a href="#fn_insertSampleCore">insertSampleCore(...)</a></code></td><td><code>github.com/hunterlong/statup/core/sample.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_Service.Check"><td><code><a href="#fn_Service.Check">Service.Check(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checker.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_Checkin.BeforeCreate"><td><code><a href="#fn_Checkin.BeforeCreate">Checkin.BeforeCreate(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_SelectUser"><td><code><a href="#fn_SelectUser">SelectUser(...)</a></code></td><td><code>github.com/hunterlong/statup/core/users.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_Service.AfterFind"><td><code><a href="#fn_Service.AfterFind">Service.AfterFind(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_checkinHit.Ago"><td><code><a href="#fn_checkinHit.Ago">checkinHit.Ago(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_user.AfterFind"><td><code><a href="#fn_user.AfterFind">user.AfterFind(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_failure.AfterFind"><td><code><a href="#fn_failure.AfterFind">failure.AfterFind(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_Checkin.AfterFind"><td><code><a href="#fn_Checkin.AfterFind">Checkin.AfterFind(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_Checkin.Grace"><td><code><a href="#fn_Checkin.Grace">Checkin.Grace(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_Checkin.Period"><td><code><a href="#fn_Checkin.Period">Checkin.Period(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_Checkin.Service"><td><code><a href="#fn_Checkin.Service">Checkin.Service(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_updateService"><td><code><a href="#fn_updateService">updateService(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_CheckHash"><td><code><a href="#fn_CheckHash">CheckHash(...)</a></code></td><td><code>github.com/hunterlong/statup/core/users.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_checkinHit.AfterFind"><td><code><a href="#fn_checkinHit.AfterFind">checkinHit.AfterFind(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_checkinHitsDB"><td><code><a href="#fn_checkinHitsDB">checkinHitsDB(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_user.Delete"><td><code><a href="#fn_user.Delete">user.Delete(...)</a></code></td><td><code>github.com/hunterlong/statup/core/users.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_init"><td><code><a href="#fn_init">init(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_ReturnCheckin"><td><code><a href="#fn_ReturnCheckin">ReturnCheckin(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_reorderServices"><td><code><a href="#fn_reorderServices">reorderServices(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_ReturnService"><td><code><a href="#fn_ReturnService">ReturnService(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_checkinDB"><td><code><a href="#fn_checkinDB">checkinDB(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_ReturnCheckinHit"><td><code><a href="#fn_ReturnCheckinHit">ReturnCheckinHit(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_ServiceOrder.Len"><td><code><a href="#fn_ServiceOrder.Len">ServiceOrder.Len(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_ServiceOrder.Swap"><td><code><a href="#fn_ServiceOrder.Swap">ServiceOrder.Swap(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_ServiceOrder.Less"><td><code><a href="#fn_ServiceOrder.Less">ServiceOrder.Less(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_failuresDB"><td><code><a href="#fn_failuresDB">failuresDB(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_hitsDB"><td><code><a href="#fn_hitsDB">hitsDB(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_servicesDB"><td><code><a href="#fn_servicesDB">servicesDB(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_coreDB"><td><code><a href="#fn_coreDB">coreDB(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_usersDB"><td><code><a href="#fn_usersDB">usersDB(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_ReturnUser"><td><code><a href="#fn_ReturnUser">ReturnUser(...)</a></code></td><td><code>github.com/hunterlong/statup/core/users.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_Service.Select"><td><code><a href="#fn_Service.Select">Service.Select(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_Service.parseHost"><td><code><a href="#fn_Service.parseHost">Service.parseHost(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checker.go</code></td><td class="percent"><code>90.91%</code></td><td class="linecount"><code>10/11</code></td></tr>
|
||
<tr id="s_fn_Service.dnsCheck"><td><code><a href="#fn_Service.dnsCheck">Service.dnsCheck(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checker.go</code></td><td class="percent"><code>90.91%</code></td><td class="linecount"><code>10/11</code></td></tr>
|
||
<tr id="s_fn_Service.Sum"><td><code><a href="#fn_Service.Sum">Service.Sum(...)</a></code></td><td><code>github.com/hunterlong/statup/core/hits.go</code></td><td class="percent"><code>85.71%</code></td><td class="linecount"><code>6/7</code></td></tr>
|
||
<tr id="s_fn_Service.Update"><td><code><a href="#fn_Service.Update">Service.Update(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>84.62%</code></td><td class="linecount"><code>11/13</code></td></tr>
|
||
<tr id="s_fn_Service.Delete"><td><code><a href="#fn_Service.Delete">Service.Delete(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>81.82%</code></td><td class="linecount"><code>9/11</code></td></tr>
|
||
<tr id="s_fn_Service.Create"><td><code><a href="#fn_Service.Create">Service.Create(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>81.82%</code></td><td class="linecount"><code>9/11</code></td></tr>
|
||
<tr id="s_fn_Checkin.Routine"><td><code><a href="#fn_Checkin.Routine">Checkin.Routine(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>80.00%</code></td><td class="linecount"><code>12/15</code></td></tr>
|
||
<tr id="s_fn_Service.OnlineSince"><td><code><a href="#fn_Service.OnlineSince">Service.OnlineSince(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>80.00%</code></td><td class="linecount"><code>12/15</code></td></tr>
|
||
<tr id="s_fn_Service.duration"><td><code><a href="#fn_Service.duration">Service.duration(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checker.go</code></td><td class="percent"><code>80.00%</code></td><td class="linecount"><code>4/5</code></td></tr>
|
||
<tr id="s_fn_SelectAllUsers"><td><code><a href="#fn_SelectAllUsers">SelectAllUsers(...)</a></code></td><td><code>github.com/hunterlong/statup/core/users.go</code></td><td class="percent"><code>80.00%</code></td><td class="linecount"><code>4/5</code></td></tr>
|
||
<tr id="s_fn_Service.AvgUptime"><td><code><a href="#fn_Service.AvgUptime">Service.AvgUptime(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>78.57%</code></td><td class="linecount"><code>11/14</code></td></tr>
|
||
<tr id="s_fn_Service.AllFailures"><td><code><a href="#fn_Service.AllFailures">Service.AllFailures(...)</a></code></td><td><code>github.com/hunterlong/statup/core/failures.go</code></td><td class="percent"><code>77.78%</code></td><td class="linecount"><code>7/9</code></td></tr>
|
||
<tr id="s_fn_Service.Downtime"><td><code><a href="#fn_Service.Downtime">Service.Downtime(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>75.00%</code></td><td class="linecount"><code>6/8</code></td></tr>
|
||
<tr id="s_fn_Checkin.Create"><td><code><a href="#fn_Checkin.Create">Checkin.Create(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>75.00%</code></td><td class="linecount"><code>6/8</code></td></tr>
|
||
<tr id="s_fn_Service.index"><td><code><a href="#fn_Service.index">Service.index(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>75.00%</code></td><td class="linecount"><code>3/4</code></td></tr>
|
||
<tr id="s_fn_SelectService"><td><code><a href="#fn_SelectService">SelectService(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>75.00%</code></td><td class="linecount"><code>3/4</code></td></tr>
|
||
<tr id="s_fn_user.Create"><td><code><a href="#fn_user.Create">user.Create(...)</a></code></td><td><code>github.com/hunterlong/statup/core/users.go</code></td><td class="percent"><code>72.73%</code></td><td class="linecount"><code>8/11</code></td></tr>
|
||
<tr id="s_fn_Service.checkTcp"><td><code><a href="#fn_Service.checkTcp">Service.checkTcp(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checker.go</code></td><td class="percent"><code>72.00%</code></td><td class="linecount"><code>18/25</code></td></tr>
|
||
<tr id="s_fn_Core.SelectAllServices"><td><code><a href="#fn_Core.SelectAllServices">Core.SelectAllServices(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>71.43%</code></td><td class="linecount"><code>10/14</code></td></tr>
|
||
<tr id="s_fn_DbConfig.Save"><td><code><a href="#fn_DbConfig.Save">DbConfig.Save(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>71.43%</code></td><td class="linecount"><code>10/14</code></td></tr>
|
||
<tr id="s_fn_AuthUser"><td><code><a href="#fn_AuthUser">AuthUser(...)</a></code></td><td><code>github.com/hunterlong/statup/core/users.go</code></td><td class="percent"><code>71.43%</code></td><td class="linecount"><code>5/7</code></td></tr>
|
||
<tr id="s_fn_Service.CreateFailure"><td><code><a href="#fn_Service.CreateFailure">Service.CreateFailure(...)</a></code></td><td><code>github.com/hunterlong/statup/core/failures.go</code></td><td class="percent"><code>71.43%</code></td><td class="linecount"><code>5/7</code></td></tr>
|
||
<tr id="s_fn_SelectCore"><td><code><a href="#fn_SelectCore">SelectCore(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>69.23%</code></td><td class="linecount"><code>9/13</code></td></tr>
|
||
<tr id="s_fn_Service.checkHttp"><td><code><a href="#fn_Service.checkHttp">Service.checkHttp(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checker.go</code></td><td class="percent"><code>68.09%</code></td><td class="linecount"><code>32/47</code></td></tr>
|
||
<tr id="s_fn_DbConfig.MigrateDatabase"><td><code><a href="#fn_DbConfig.MigrateDatabase">DbConfig.MigrateDatabase(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>8/12</code></td></tr>
|
||
<tr id="s_fn_LoadConfigFile"><td><code><a href="#fn_LoadConfigFile">LoadConfigFile(...)</a></code></td><td><code>github.com/hunterlong/statup/core/configs.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>8/12</code></td></tr>
|
||
<tr id="s_fn_user.BeforeCreate"><td><code><a href="#fn_user.BeforeCreate">user.BeforeCreate(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>2/3</code></td></tr>
|
||
<tr id="s_fn_Service.BeforeCreate"><td><code><a href="#fn_Service.BeforeCreate">Service.BeforeCreate(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>2/3</code></td></tr>
|
||
<tr id="s_fn_checkinHit.BeforeCreate"><td><code><a href="#fn_checkinHit.BeforeCreate">checkinHit.BeforeCreate(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>2/3</code></td></tr>
|
||
<tr id="s_fn_DbConfig.Connect"><td><code><a href="#fn_DbConfig.Connect">DbConfig.Connect(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>65.38%</code></td><td class="linecount"><code>17/26</code></td></tr>
|
||
<tr id="s_fn_Service.CreateHit"><td><code><a href="#fn_Service.CreateHit">Service.CreateHit(...)</a></code></td><td><code>github.com/hunterlong/statup/core/hits.go</code></td><td class="percent"><code>60.00%</code></td><td class="linecount"><code>3/5</code></td></tr>
|
||
<tr id="s_fn_Checkin.Update"><td><code><a href="#fn_Checkin.Update">Checkin.Update(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>60.00%</code></td><td class="linecount"><code>3/5</code></td></tr>
|
||
<tr id="s_fn_checkinHit.Create"><td><code><a href="#fn_checkinHit.Create">checkinHit.Create(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>57.14%</code></td><td class="linecount"><code>4/7</code></td></tr>
|
||
<tr id="s_fn_Service.SmallText"><td><code><a href="#fn_Service.SmallText">Service.SmallText(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>50.00%</code></td><td class="linecount"><code>6/12</code></td></tr>
|
||
<tr id="s_fn_InsertNotifierDB"><td><code><a href="#fn_InsertNotifierDB">InsertNotifierDB(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>50.00%</code></td><td class="linecount"><code>3/6</code></td></tr>
|
||
<tr id="s_fn_@356:8"><td><code><a href="#fn_@356:8">@356:8(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>50.00%</code></td><td class="linecount"><code>1/2</code></td></tr>
|
||
<tr id="s_fn_DefaultPort"><td><code><a href="#fn_DefaultPort">DefaultPort(...)</a></code></td><td><code>github.com/hunterlong/statup/core/configs.go</code></td><td class="percent"><code>40.00%</code></td><td class="linecount"><code>2/5</code></td></tr>
|
||
<tr id="s_fn_LoadUsingEnv"><td><code><a href="#fn_LoadUsingEnv">LoadUsingEnv(...)</a></code></td><td><code>github.com/hunterlong/statup/core/configs.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/35</code></td></tr>
|
||
<tr id="s_fn_failure.ParseError"><td><code><a href="#fn_failure.ParseError">failure.ParseError(...)</a></code></td><td><code>github.com/hunterlong/statup/core/failures.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/30</code></td></tr>
|
||
<tr id="s_fn_ExportIndexHTML"><td><code><a href="#fn_ExportIndexHTML">ExportIndexHTML(...)</a></code></td><td><code>github.com/hunterlong/statup/core/export.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/23</code></td></tr>
|
||
<tr id="s_fn_GraphDataRaw"><td><code><a href="#fn_GraphDataRaw">GraphDataRaw(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/16</code></td></tr>
|
||
<tr id="s_fn_InsertSampleHits"><td><code><a href="#fn_InsertSampleHits">InsertSampleHits(...)</a></code></td><td><code>github.com/hunterlong/statup/core/sample.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/14</code></td></tr>
|
||
<tr id="s_fn_DbConfig.Update"><td><code><a href="#fn_DbConfig.Update">DbConfig.Update(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/12</code></td></tr>
|
||
<tr id="s_fn_Dbtimestamp"><td><code><a href="#fn_Dbtimestamp">Dbtimestamp(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/12</code></td></tr>
|
||
<tr id="s_fn_ExportChartsJs"><td><code><a href="#fn_ExportChartsJs">ExportChartsJs(...)</a></code></td><td><code>github.com/hunterlong/statup/core/export.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/11</code></td></tr>
|
||
<tr id="s_fn_Service.TotalUptime"><td><code><a href="#fn_Service.TotalUptime">Service.TotalUptime(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/10</code></td></tr>
|
||
<tr id="s_fn_EnvToConfig"><td><code><a href="#fn_EnvToConfig">EnvToConfig(...)</a></code></td><td><code>github.com/hunterlong/statup/core/configs.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/9</code></td></tr>
|
||
<tr id="s_fn_Checkin.RecheckCheckinFailure"><td><code><a href="#fn_Checkin.RecheckCheckinFailure">Checkin.RecheckCheckinFailure(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/8</code></td></tr>
|
||
<tr id="s_fn_DbConfig.CreateCore"><td><code><a href="#fn_DbConfig.CreateCore">DbConfig.CreateCore(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/8</code></td></tr>
|
||
<tr id="s_fn_Service.AvgTime"><td><code><a href="#fn_Service.AvgTime">Service.AvgTime(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/8</code></td></tr>
|
||
<tr id="s_fn_Service.GraphData"><td><code><a href="#fn_Service.GraphData">Service.GraphData(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/8</code></td></tr>
|
||
<tr id="s_fn_CountFailures"><td><code><a href="#fn_CountFailures">CountFailures(...)</a></code></td><td><code>github.com/hunterlong/statup/core/failures.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/6</code></td></tr>
|
||
<tr id="s_fn_InitApp"><td><code><a href="#fn_InitApp">InitApp(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/6</code></td></tr>
|
||
<tr id="s_fn_Core.Count24HFailures"><td><code><a href="#fn_Core.Count24HFailures">Core.Count24HFailures(...)</a></code></td><td><code>github.com/hunterlong/statup/core/failures.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/6</code></td></tr>
|
||
<tr id="s_fn_SampleData"><td><code><a href="#fn_SampleData">SampleData(...)</a></code></td><td><code>github.com/hunterlong/statup/core/configs.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/5</code></td></tr>
|
||
<tr id="s_fn_recordFailure"><td><code><a href="#fn_recordFailure">recordFailure(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checker.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/5</code></td></tr>
|
||
<tr id="s_fn_Service.lastFailure"><td><code><a href="#fn_Service.lastFailure">Service.lastFailure(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/5</code></td></tr>
|
||
<tr id="s_fn_DatabaseMaintence"><td><code><a href="#fn_DatabaseMaintence">DatabaseMaintence(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/5</code></td></tr>
|
||
<tr id="s_fn_DateScanObj.ToString"><td><code><a href="#fn_DateScanObj.ToString">DateScanObj.ToString(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/5</code></td></tr>
|
||
<tr id="s_fn_DeleteConfig"><td><code><a href="#fn_DeleteConfig">DeleteConfig(...)</a></code></td><td><code>github.com/hunterlong/statup/core/configs.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/5</code></td></tr>
|
||
<tr id="s_fn_Core.CurrentTime"><td><code><a href="#fn_Core.CurrentTime">Core.CurrentTime(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/4</code></td></tr>
|
||
<tr id="s_fn_Service.TotalFailures"><td><code><a href="#fn_Service.TotalFailures">Service.TotalFailures(...)</a></code></td><td><code>github.com/hunterlong/statup/core/failures.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/4</code></td></tr>
|
||
<tr id="s_fn_Service.DeleteFailures"><td><code><a href="#fn_Service.DeleteFailures">Service.DeleteFailures(...)</a></code></td><td><code>github.com/hunterlong/statup/core/failures.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/4</code></td></tr>
|
||
<tr id="s_fn_DbConfig.InsertCore"><td><code><a href="#fn_DbConfig.InsertCore">DbConfig.InsertCore(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/4</code></td></tr>
|
||
<tr id="s_fn_Core.AllOnline"><td><code><a href="#fn_Core.AllOnline">Core.AllOnline(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/4</code></td></tr>
|
||
<tr id="s_fn_DeleteAllSince"><td><code><a href="#fn_DeleteAllSince">DeleteAllSince(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/4</code></td></tr>
|
||
<tr id="s_fn_Service.CheckinProcess"><td><code><a href="#fn_Service.CheckinProcess">Service.CheckinProcess(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/4</code></td></tr>
|
||
<tr id="s_fn_SelectCheckinId"><td><code><a href="#fn_SelectCheckinId">SelectCheckinId(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_SelectCheckin"><td><code><a href="#fn_SelectCheckin">SelectCheckin(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_Hit.BeforeCreate"><td><code><a href="#fn_Hit.BeforeCreate">Hit.BeforeCreate(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_failure.BeforeCreate"><td><code><a href="#fn_failure.BeforeCreate">failure.BeforeCreate(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_Checkin.Delete"><td><code><a href="#fn_Checkin.Delete">Checkin.Delete(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_Service.LimitedCheckins"><td><code><a href="#fn_Service.LimitedCheckins">Service.LimitedCheckins(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_Core.MobileSASS"><td><code><a href="#fn_Core.MobileSASS">Core.MobileSASS(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_Core.BaseSASS"><td><code><a href="#fn_Core.BaseSASS">Core.BaseSASS(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_Core.SassVars"><td><code><a href="#fn_Core.SassVars">Core.SassVars(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_checkServices"><td><code><a href="#fn_checkServices">checkServices(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checker.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_Service.AvgUptime24"><td><code><a href="#fn_Service.AvgUptime24">Service.AvgUptime24(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_Service.ToJSON"><td><code><a href="#fn_Service.ToJSON">Service.ToJSON(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_Service.HitsBetween"><td><code><a href="#fn_Service.HitsBetween">Service.HitsBetween(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_failure.Ago"><td><code><a href="#fn_failure.Ago">failure.Ago(...)</a></code></td><td><code>github.com/hunterlong/statup/core/failures.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_Service.TotalFailures24"><td><code><a href="#fn_Service.TotalFailures24">Service.TotalFailures24(...)</a></code></td><td><code>github.com/hunterlong/statup/core/failures.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_Service.Online24"><td><code><a href="#fn_Service.Online24">Service.Online24(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_CloseDB"><td><code><a href="#fn_CloseDB">CloseDB(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_Hit.AfterFind"><td><code><a href="#fn_Hit.AfterFind">Hit.AfterFind(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_DbConfig.waitForDb"><td><code><a href="#fn_DbConfig.waitForDb">DbConfig.waitForDb(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_UpdateCore"><td><code><a href="#fn_UpdateCore">UpdateCore(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_failure.Delete"><td><code><a href="#fn_failure.Delete">failure.Delete(...)</a></code></td><td><code>github.com/hunterlong/statup/core/failures.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_DbConfig.Close"><td><code><a href="#fn_DbConfig.Close">DbConfig.Close(...)</a></code></td><td><code>github.com/hunterlong/statup/core/database.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_injectDatabase"><td><code><a href="#fn_injectDatabase">injectDatabase(...)</a></code></td><td><code>github.com/hunterlong/statup/core/export.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@68:10"><td><code><a href="#fn_@68:10">@68:10(...)</a></code></td><td><code>github.com/hunterlong/statup/core/export.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_Core.ToCore"><td><code><a href="#fn_Core.ToCore">Core.ToCore(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_Services"><td><code><a href="#fn_Services">Services(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_Service.UpdateSingle"><td><code><a href="#fn_Service.UpdateSingle">Service.UpdateSingle(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@53:11"><td><code><a href="#fn_@53:11">@53:11(...)</a></code></td><td><code>github.com/hunterlong/statup/core/export.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@56:14"><td><code><a href="#fn_@56:14">@56:14(...)</a></code></td><td><code>github.com/hunterlong/statup/core/export.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_Core.ServicesCount"><td><code><a href="#fn_Core.ServicesCount">Core.ServicesCount(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_Service.DowntimeText"><td><code><a href="#fn_Service.DowntimeText">Service.DowntimeText(...)</a></code></td><td><code>github.com/hunterlong/statup/core/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_Core.UsingAssets"><td><code><a href="#fn_Core.UsingAssets">Core.UsingAssets(...)</a></code></td><td><code>github.com/hunterlong/statup/core/core.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@59:14"><td><code><a href="#fn_@59:14">@59:14(...)</a></code></td><td><code>github.com/hunterlong/statup/core/export.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@62:14"><td><code><a href="#fn_@62:14">@62:14(...)</a></code></td><td><code>github.com/hunterlong/statup/core/export.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_Checkin.Link"><td><code><a href="#fn_Checkin.Link">Checkin.Link(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@65:17"><td><code><a href="#fn_@65:17">@65:17(...)</a></code></td><td><code>github.com/hunterlong/statup/core/export.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@94:11"><td><code><a href="#fn_@94:11">@94:11(...)</a></code></td><td><code>github.com/hunterlong/statup/core/export.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_Checkin.String"><td><code><a href="#fn_Checkin.String">Checkin.String(...)</a></code></td><td><code>github.com/hunterlong/statup/core/checkin.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@71:17"><td><code><a href="#fn_@71:17">@71:17(...)</a></code></td><td><code>github.com/hunterlong/statup/core/export.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@50:9"><td><code><a href="#fn_@50:9">@50:9(...)</a></code></td><td><code>github.com/hunterlong/statup/core/export.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr><td colspan="2"><code>github.com/hunterlong/statup/core</code></td><td class="percent"><code>52.58%</code></td><td class="linecount"><code>510/970</code></td></tr>
|
||
</table>
|
||
|
||
<div class="funcname" id="fn_InsertLargeSampleData">func InsertLargeSampleData</div><div class="info"><a href="#s_fn_InsertLargeSampleData">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/sample.go</code>:</p></div><table class="listing">
|
||
<tr><td>185</td><td><code><pre>func InsertLargeSampleData() error {</pre></code></td></tr><tr><td>186</td><td><code><pre> insertSampleCore()</pre></code></td></tr><tr><td>187</td><td><code><pre> InsertSampleData()</pre></code></td></tr><tr><td>188</td><td><code><pre> insertSampleUsers()</pre></code></td></tr><tr><td>189</td><td><code><pre> insertSampleCheckins()</pre></code></td></tr><tr><td>190</td><td><code><pre> s6 := ReturnService(&types.Service{</pre></code></td></tr><tr><td>191</td><td><code><pre> Name: "JSON Lint",</pre></code></td></tr><tr><td>192</td><td><code><pre> Domain: "https://jsonlint.com",</pre></code></td></tr><tr><td>193</td><td><code><pre> ExpectedStatus: 200,</pre></code></td></tr><tr><td>194</td><td><code><pre> Interval: 15,</pre></code></td></tr><tr><td>195</td><td><code><pre> Type: "http",</pre></code></td></tr><tr><td>196</td><td><code><pre> Method: "GET",</pre></code></td></tr><tr><td>197</td><td><code><pre> Timeout: 10,</pre></code></td></tr><tr><td>198</td><td><code><pre> Order: 6,</pre></code></td></tr><tr><td>199</td><td><code><pre> })</pre></code></td></tr><tr><td>200</td><td><code><pre></pre></code></td></tr><tr><td>201</td><td><code><pre> s7 := ReturnService(&types.Service{</pre></code></td></tr><tr><td>202</td><td><code><pre> Name: "Demo Page",</pre></code></td></tr><tr><td>203</td><td><code><pre> Domain: "https://demo.statup.io",</pre></code></td></tr><tr><td>204</td><td><code><pre> ExpectedStatus: 200,</pre></code></td></tr><tr><td>205</td><td><code><pre> Interval: 30,</pre></code></td></tr><tr><td>206</td><td><code><pre> Type: "http",</pre></code></td></tr><tr><td>207</td><td><code><pre> Method: "GET",</pre></code></td></tr><tr><td>208</td><td><code><pre> Timeout: 15,</pre></code></td></tr><tr><td>209</td><td><code><pre> Order: 7,</pre></code></td></tr><tr><td>210</td><td><code><pre> })</pre></code></td></tr><tr><td>211</td><td><code><pre></pre></code></td></tr><tr><td>212</td><td><code><pre> s8 := ReturnService(&types.Service{</pre></code></td></tr><tr><td>213</td><td><code><pre> Name: "Golang",</pre></code></td></tr><tr><td>214</td><td><code><pre> Domain: "https://golang.org",</pre></code></td></tr><tr><td>215</td><td><code><pre> ExpectedStatus: 200,</pre></code></td></tr><tr><td>216</td><td><code><pre> Interval: 15,</pre></code></td></tr><tr><td>217</td><td><code><pre> Type: "http",</pre></code></td></tr><tr><td>218</td><td><code><pre> Method: "GET",</pre></code></td></tr><tr><td>219</td><td><code><pre> Timeout: 10,</pre></code></td></tr><tr><td>220</td><td><code><pre> Order: 8,</pre></code></td></tr><tr><td>221</td><td><code><pre> })</pre></code></td></tr><tr><td>222</td><td><code><pre></pre></code></td></tr><tr><td>223</td><td><code><pre> s9 := ReturnService(&types.Service{</pre></code></td></tr><tr><td>224</td><td><code><pre> Name: "Santa Monica",</pre></code></td></tr><tr><td>225</td><td><code><pre> Domain: "https://www.santamonica.com",</pre></code></td></tr><tr><td>226</td><td><code><pre> ExpectedStatus: 200,</pre></code></td></tr><tr><td>227</td><td><code><pre> Interval: 15,</pre></code></td></tr><tr><td>228</td><td><code><pre> Type: "http",</pre></code></td></tr><tr><td>229</td><td><code><pre> Method: "GET",</pre></code></td></tr><tr><td>230</td><td><code><pre> Timeout: 10,</pre></code></td></tr><tr><td>231</td><td><code><pre> Order: 9,</pre></code></td></tr><tr><td>232</td><td><code><pre> })</pre></code></td></tr><tr><td>233</td><td><code><pre></pre></code></td></tr><tr><td>234</td><td><code><pre> s10 := ReturnService(&types.Service{</pre></code></td></tr><tr><td>235</td><td><code><pre> Name: "Oeschs Die Dritten",</pre></code></td></tr><tr><td>236</td><td><code><pre> Domain: "https://www.oeschs-die-dritten.ch/en/",</pre></code></td></tr><tr><td>237</td><td><code><pre> ExpectedStatus: 200,</pre></code></td></tr><tr><td>238</td><td><code><pre> Interval: 15,</pre></code></td></tr><tr><td>239</td><td><code><pre> Type: "http",</pre></code></td></tr><tr><td>240</td><td><code><pre> Method: "GET",</pre></code></td></tr><tr><td>241</td><td><code><pre> Timeout: 10,</pre></code></td></tr><tr><td>242</td><td><code><pre> Order: 10,</pre></code></td></tr><tr><td>243</td><td><code><pre> })</pre></code></td></tr><tr><td>244</td><td><code><pre></pre></code></td></tr><tr><td>245</td><td><code><pre> s11 := ReturnService(&types.Service{</pre></code></td></tr><tr><td>246</td><td><code><pre> Name: "XS Project - Bochka, Bass, Kolbaser",</pre></code></td></tr><tr><td>247</td><td><code><pre> Domain: "https://www.youtube.com/watch?v=VLW1ieY4Izw",</pre></code></td></tr><tr><td>248</td><td><code><pre> ExpectedStatus: 200,</pre></code></td></tr><tr><td>249</td><td><code><pre> Interval: 60,</pre></code></td></tr><tr><td>250</td><td><code><pre> Type: "http",</pre></code></td></tr><tr><td>251</td><td><code><pre> Method: "GET",</pre></code></td></tr><tr><td>252</td><td><code><pre> Timeout: 20,</pre></code></td></tr><tr><td>253</td><td><code><pre> Order: 11,</pre></code></td></tr><tr><td>254</td><td><code><pre> })</pre></code></td></tr><tr><td>255</td><td><code><pre></pre></code></td></tr><tr><td>256</td><td><code><pre> s12 := ReturnService(&types.Service{</pre></code></td></tr><tr><td>257</td><td><code><pre> Name: "Github",</pre></code></td></tr><tr><td>258</td><td><code><pre> Domain: "https://github.com/hunterlong",</pre></code></td></tr><tr><td>259</td><td><code><pre> ExpectedStatus: 200,</pre></code></td></tr><tr><td>260</td><td><code><pre> Interval: 60,</pre></code></td></tr><tr><td>261</td><td><code><pre> Type: "http",</pre></code></td></tr><tr><td>262</td><td><code><pre> Method: "GET",</pre></code></td></tr><tr><td>263</td><td><code><pre> Timeout: 20,</pre></code></td></tr><tr><td>264</td><td><code><pre> Order: 12,</pre></code></td></tr><tr><td>265</td><td><code><pre> })</pre></code></td></tr><tr><td>266</td><td><code><pre></pre></code></td></tr><tr><td>267</td><td><code><pre> s13 := ReturnService(&types.Service{</pre></code></td></tr><tr><td>268</td><td><code><pre> Name: "Failing URL",</pre></code></td></tr><tr><td>269</td><td><code><pre> Domain: "http://thisdomainisfakeanditsgoingtofail.com",</pre></code></td></tr><tr><td>270</td><td><code><pre> ExpectedStatus: 200,</pre></code></td></tr><tr><td>271</td><td><code><pre> Interval: 45,</pre></code></td></tr><tr><td>272</td><td><code><pre> Type: "http",</pre></code></td></tr><tr><td>273</td><td><code><pre> Method: "GET",</pre></code></td></tr><tr><td>274</td><td><code><pre> Timeout: 10,</pre></code></td></tr><tr><td>275</td><td><code><pre> Order: 13,</pre></code></td></tr><tr><td>276</td><td><code><pre> })</pre></code></td></tr><tr><td>277</td><td><code><pre></pre></code></td></tr><tr><td>278</td><td><code><pre> s14 := ReturnService(&types.Service{</pre></code></td></tr><tr><td>279</td><td><code><pre> Name: "Oesch's die Dritten - Die Jodelsprache",</pre></code></td></tr><tr><td>280</td><td><code><pre> Domain: "https://www.youtube.com/watch?v=k3GTxRt4iao",</pre></code></td></tr><tr><td>281</td><td><code><pre> ExpectedStatus: 200,</pre></code></td></tr><tr><td>282</td><td><code><pre> Interval: 60,</pre></code></td></tr><tr><td>283</td><td><code><pre> Type: "http",</pre></code></td></tr><tr><td>284</td><td><code><pre> Method: "GET",</pre></code></td></tr><tr><td>285</td><td><code><pre> Timeout: 12,</pre></code></td></tr><tr><td>286</td><td><code><pre> Order: 14,</pre></code></td></tr><tr><td>287</td><td><code><pre> })</pre></code></td></tr><tr><td>288</td><td><code><pre></pre></code></td></tr><tr><td>289</td><td><code><pre> s15 := ReturnService(&types.Service{</pre></code></td></tr><tr><td>290</td><td><code><pre> Name: "Gorm",</pre></code></td></tr><tr><td>291</td><td><code><pre> Domain: "http://gorm.io/",</pre></code></td></tr><tr><td>292</td><td><code><pre> ExpectedStatus: 200,</pre></code></td></tr><tr><td>293</td><td><code><pre> Interval: 30,</pre></code></td></tr><tr><td>294</td><td><code><pre> Type: "http",</pre></code></td></tr><tr><td>295</td><td><code><pre> Method: "GET",</pre></code></td></tr><tr><td>296</td><td><code><pre> Timeout: 12,</pre></code></td></tr><tr><td>297</td><td><code><pre> Order: 15,</pre></code></td></tr><tr><td>298</td><td><code><pre> })</pre></code></td></tr><tr><td>299</td><td><code><pre></pre></code></td></tr><tr><td>300</td><td><code><pre> s6.Create(false)</pre></code></td></tr><tr><td>301</td><td><code><pre> s7.Create(false)</pre></code></td></tr><tr><td>302</td><td><code><pre> s8.Create(false)</pre></code></td></tr><tr><td>303</td><td><code><pre> s9.Create(false)</pre></code></td></tr><tr><td>304</td><td><code><pre> s10.Create(false)</pre></code></td></tr><tr><td>305</td><td><code><pre> s11.Create(false)</pre></code></td></tr><tr><td>306</td><td><code><pre> s12.Create(false)</pre></code></td></tr><tr><td>307</td><td><code><pre> s13.Create(false)</pre></code></td></tr><tr><td>308</td><td><code><pre> s14.Create(false)</pre></code></td></tr><tr><td>309</td><td><code><pre> s15.Create(false)</pre></code></td></tr><tr><td>310</td><td><code><pre></pre></code></td></tr><tr><td>311</td><td><code><pre> var dayAgo = time.Now().Add(-24 * time.Hour).Add(-10 * time.Minute)</pre></code></td></tr><tr><td>312</td><td><code><pre></pre></code></td></tr><tr><td>313</td><td><code><pre> insertHitRecords(dayAgo, 1450)</pre></code></td></tr><tr><td>314</td><td><code><pre></pre></code></td></tr><tr><td>315</td><td><code><pre> insertFailureRecords(dayAgo, 730)</pre></code></td></tr><tr><td>316</td><td><code><pre></pre></code></td></tr><tr><td>317</td><td><code><pre> return nil</pre></code></td></tr><tr><td>318</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_InsertSampleData">func InsertSampleData</div><div class="info"><a href="#s_fn_InsertSampleData">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/sample.go</code>:</p></div><table class="listing">
|
||
<tr><td>27</td><td><code><pre>func InsertSampleData() error {</pre></code></td></tr><tr><td>28</td><td><code><pre> utils.Log(1, "Inserting Sample Data...")</pre></code></td></tr><tr><td>29</td><td><code><pre> s1 := ReturnService(&types.Service{</pre></code></td></tr><tr><td>30</td><td><code><pre> Name: "Google",</pre></code></td></tr><tr><td>31</td><td><code><pre> Domain: "https://google.com",</pre></code></td></tr><tr><td>32</td><td><code><pre> ExpectedStatus: 200,</pre></code></td></tr><tr><td>33</td><td><code><pre> Interval: 10,</pre></code></td></tr><tr><td>34</td><td><code><pre> Type: "http",</pre></code></td></tr><tr><td>35</td><td><code><pre> Method: "GET",</pre></code></td></tr><tr><td>36</td><td><code><pre> Timeout: 10,</pre></code></td></tr><tr><td>37</td><td><code><pre> Order: 1,</pre></code></td></tr><tr><td>38</td><td><code><pre> })</pre></code></td></tr><tr><td>39</td><td><code><pre> s2 := ReturnService(&types.Service{</pre></code></td></tr><tr><td>40</td><td><code><pre> Name: "Statup Github",</pre></code></td></tr><tr><td>41</td><td><code><pre> Domain: "https://github.com/hunterlong/statup",</pre></code></td></tr><tr><td>42</td><td><code><pre> ExpectedStatus: 200,</pre></code></td></tr><tr><td>43</td><td><code><pre> Interval: 30,</pre></code></td></tr><tr><td>44</td><td><code><pre> Type: "http",</pre></code></td></tr><tr><td>45</td><td><code><pre> Method: "GET",</pre></code></td></tr><tr><td>46</td><td><code><pre> Timeout: 20,</pre></code></td></tr><tr><td>47</td><td><code><pre> Order: 2,</pre></code></td></tr><tr><td>48</td><td><code><pre> })</pre></code></td></tr><tr><td>49</td><td><code><pre> s3 := ReturnService(&types.Service{</pre></code></td></tr><tr><td>50</td><td><code><pre> Name: "JSON Users Test",</pre></code></td></tr><tr><td>51</td><td><code><pre> Domain: "https://jsonplaceholder.typicode.com/users",</pre></code></td></tr><tr><td>52</td><td><code><pre> ExpectedStatus: 200,</pre></code></td></tr><tr><td>53</td><td><code><pre> Interval: 60,</pre></code></td></tr><tr><td>54</td><td><code><pre> Type: "http",</pre></code></td></tr><tr><td>55</td><td><code><pre> Method: "GET",</pre></code></td></tr><tr><td>56</td><td><code><pre> Timeout: 30,</pre></code></td></tr><tr><td>57</td><td><code><pre> Order: 3,</pre></code></td></tr><tr><td>58</td><td><code><pre> })</pre></code></td></tr><tr><td>59</td><td><code><pre> s4 := ReturnService(&types.Service{</pre></code></td></tr><tr><td>60</td><td><code><pre> Name: "JSON API Tester",</pre></code></td></tr><tr><td>61</td><td><code><pre> Domain: "https://jsonplaceholder.typicode.com/posts",</pre></code></td></tr><tr><td>62</td><td><code><pre> ExpectedStatus: 201,</pre></code></td></tr><tr><td>63</td><td><code><pre> Expected: `(title)": "((\\"|[statup])*)"`,</pre></code></td></tr><tr><td>64</td><td><code><pre> Interval: 30,</pre></code></td></tr><tr><td>65</td><td><code><pre> Type: "http",</pre></code></td></tr><tr><td>66</td><td><code><pre> Method: "POST",</pre></code></td></tr><tr><td>67</td><td><code><pre> PostData: `{ "title": "statup", "body": "bar", "userId": 19999 }`,</pre></code></td></tr><tr><td>68</td><td><code><pre> Timeout: 30,</pre></code></td></tr><tr><td>69</td><td><code><pre> Order: 4,</pre></code></td></tr><tr><td>70</td><td><code><pre> })</pre></code></td></tr><tr><td>71</td><td><code><pre> s5 := ReturnService(&types.Service{</pre></code></td></tr><tr><td>72</td><td><code><pre> Name: "Google DNS",</pre></code></td></tr><tr><td>73</td><td><code><pre> Domain: "8.8.8.8",</pre></code></td></tr><tr><td>74</td><td><code><pre> Interval: 20,</pre></code></td></tr><tr><td>75</td><td><code><pre> Type: "tcp",</pre></code></td></tr><tr><td>76</td><td><code><pre> Port: 53,</pre></code></td></tr><tr><td>77</td><td><code><pre> Timeout: 120,</pre></code></td></tr><tr><td>78</td><td><code><pre> Order: 5,</pre></code></td></tr><tr><td>79</td><td><code><pre> })</pre></code></td></tr><tr><td>80</td><td><code><pre></pre></code></td></tr><tr><td>81</td><td><code><pre> s1.Create(false)</pre></code></td></tr><tr><td>82</td><td><code><pre> s2.Create(false)</pre></code></td></tr><tr><td>83</td><td><code><pre> s3.Create(false)</pre></code></td></tr><tr><td>84</td><td><code><pre> s4.Create(false)</pre></code></td></tr><tr><td>85</td><td><code><pre> s5.Create(false)</pre></code></td></tr><tr><td>86</td><td><code><pre></pre></code></td></tr><tr><td>87</td><td><code><pre> utils.Log(1, "Sample data has finished importing")</pre></code></td></tr><tr><td>88</td><td><code><pre></pre></code></td></tr><tr><td>89</td><td><code><pre> return nil</pre></code></td></tr><tr><td>90</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.CheckQueue">func Service.CheckQueue</div><div class="info"><a href="#s_fn_Service.CheckQueue">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go</code>:</p></div><table class="listing">
|
||
<tr><td>43</td><td><code><pre>func (s *Service) CheckQueue(record bool) {</pre></code></td></tr><tr><td>44</td><td><code><pre> s.Checkpoint = time.Now()</pre></code></td></tr><tr><td>45</td><td><code><pre> s.SleepDuration = time.Duration((time.Duration(s.Id) * 100) * time.Millisecond)</pre></code></td></tr><tr><td>46</td><td><code><pre>CheckLoop:</pre></code></td></tr><tr><td>47</td><td><code><pre> for {</pre></code></td></tr><tr><td>48</td><td><code><pre> select {</pre></code></td></tr><tr><td>49</td><td><code><pre> case <-s.Running:</pre></code></td></tr><tr><td>50</td><td><code><pre> utils.Log(1, fmt.Sprintf("Stopping service: %v", s.Name))</pre></code></td></tr><tr><td>51</td><td><code><pre> break CheckLoop</pre></code></td></tr><tr><td>52</td><td><code><pre> case <-time.After(s.SleepDuration):</pre></code></td></tr><tr><td>53</td><td><code><pre> s.Check(record)</pre></code></td></tr><tr><td>54</td><td><code><pre> s.Checkpoint = s.Checkpoint.Add(s.duration())</pre></code></td></tr><tr><td>55</td><td><code><pre> sleep := s.Checkpoint.Sub(time.Now())</pre></code></td></tr><tr><td>56</td><td><code><pre> if !s.Online {</pre></code></td></tr><tr><td>57</td><td><code><pre> s.SleepDuration = s.duration()</pre></code></td></tr><tr><td>58</td><td><code><pre> } else {</pre></code></td></tr><tr><td>59</td><td><code><pre> s.SleepDuration = sleep</pre></code></td></tr><tr><td>60</td><td><code><pre> }</pre></code></td></tr><tr><td>61</td><td><code><pre> }</pre></code></td></tr><tr><td>62</td><td><code><pre> continue</pre></code></td></tr><tr><td>63</td><td><code><pre> }</pre></code></td></tr><tr><td>64</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_insertSampleCheckins">func insertSampleCheckins</div><div class="info"><a href="#s_fn_insertSampleCheckins">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/sample.go</code>:</p></div><table class="listing">
|
||
<tr><td>93</td><td><code><pre>func insertSampleCheckins() error {</pre></code></td></tr><tr><td>94</td><td><code><pre> s1 := SelectService(1)</pre></code></td></tr><tr><td>95</td><td><code><pre> checkin1 := ReturnCheckin(&types.Checkin{</pre></code></td></tr><tr><td>96</td><td><code><pre> ServiceId: s1.Id,</pre></code></td></tr><tr><td>97</td><td><code><pre> Interval: 300,</pre></code></td></tr><tr><td>98</td><td><code><pre> GracePeriod: 300,</pre></code></td></tr><tr><td>99</td><td><code><pre> })</pre></code></td></tr><tr><td>100</td><td><code><pre> checkin1.Update()</pre></code></td></tr><tr><td>101</td><td><code><pre></pre></code></td></tr><tr><td>102</td><td><code><pre> s2 := SelectService(1)</pre></code></td></tr><tr><td>103</td><td><code><pre> checkin2 := ReturnCheckin(&types.Checkin{</pre></code></td></tr><tr><td>104</td><td><code><pre> ServiceId: s2.Id,</pre></code></td></tr><tr><td>105</td><td><code><pre> Interval: 900,</pre></code></td></tr><tr><td>106</td><td><code><pre> GracePeriod: 300,</pre></code></td></tr><tr><td>107</td><td><code><pre> })</pre></code></td></tr><tr><td>108</td><td><code><pre> checkin2.Update()</pre></code></td></tr><tr><td>109</td><td><code><pre></pre></code></td></tr><tr><td>110</td><td><code><pre> checkTime := time.Now().Add(-24 * time.Hour)</pre></code></td></tr><tr><td>111</td><td><code><pre> for i := 0; i <= 60; i++ {</pre></code></td></tr><tr><td>112</td><td><code><pre> checkHit := ReturnCheckinHit(&types.CheckinHit{</pre></code></td></tr><tr><td>113</td><td><code><pre> Checkin: checkin1.Id,</pre></code></td></tr><tr><td>114</td><td><code><pre> From: "192.168.0.1",</pre></code></td></tr><tr><td>115</td><td><code><pre> CreatedAt: checkTime.UTC(),</pre></code></td></tr><tr><td>116</td><td><code><pre> })</pre></code></td></tr><tr><td>117</td><td><code><pre> checkHit.Create()</pre></code></td></tr><tr><td>118</td><td><code><pre> checkTime = checkTime.Add(10 * time.Minute)</pre></code></td></tr><tr><td>119</td><td><code><pre> }</pre></code></td></tr><tr><td>120</td><td><code><pre> return nil</pre></code></td></tr><tr><td>121</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DbConfig.CreateDatabase">func DbConfig.CreateDatabase</div><div class="info"><a href="#s_fn_DbConfig.CreateDatabase">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>336</td><td><code><pre>func (db *DbConfig) CreateDatabase() error {</pre></code></td></tr><tr><td>337</td><td><code><pre> utils.Log(1, "Creating Database Tables...")</pre></code></td></tr><tr><td>338</td><td><code><pre> err := DbSession.CreateTable(&types.Checkin{})</pre></code></td></tr><tr><td>339</td><td><code><pre> err = DbSession.CreateTable(&types.CheckinHit{})</pre></code></td></tr><tr><td>340</td><td><code><pre> err = DbSession.CreateTable(&notifier.Notification{})</pre></code></td></tr><tr><td>341</td><td><code><pre> err = DbSession.Table("core").CreateTable(&types.Core{})</pre></code></td></tr><tr><td>342</td><td><code><pre> err = DbSession.CreateTable(&types.Failure{})</pre></code></td></tr><tr><td>343</td><td><code><pre> err = DbSession.CreateTable(&types.Hit{})</pre></code></td></tr><tr><td>344</td><td><code><pre> err = DbSession.CreateTable(&types.Service{})</pre></code></td></tr><tr><td>345</td><td><code><pre> err = DbSession.CreateTable(&types.User{})</pre></code></td></tr><tr><td>346</td><td><code><pre> utils.Log(1, "Statup Database Created")</pre></code></td></tr><tr><td>347</td><td><code><pre> return err.Error</pre></code></td></tr><tr><td>348</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_insertHitRecords">func insertHitRecords</div><div class="info"><a href="#s_fn_insertHitRecords">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/sample.go</code>:</p></div><table class="listing">
|
||
<tr><td>342</td><td><code><pre>func insertHitRecords(since time.Time, amount int64) {</pre></code></td></tr><tr><td>343</td><td><code><pre> for i := int64(1); i <= 15; i++ {</pre></code></td></tr><tr><td>344</td><td><code><pre> service := SelectService(i)</pre></code></td></tr><tr><td>345</td><td><code><pre> utils.Log(1, fmt.Sprintf("Adding %v hit records to service %v", amount, service.Name))</pre></code></td></tr><tr><td>346</td><td><code><pre> createdAt := since</pre></code></td></tr><tr><td>347</td><td><code><pre></pre></code></td></tr><tr><td>348</td><td><code><pre> for hi := int64(1); hi <= amount; hi++ {</pre></code></td></tr><tr><td>349</td><td><code><pre> rand.Seed(time.Now().UnixNano())</pre></code></td></tr><tr><td>350</td><td><code><pre> latency := rand.Float64()</pre></code></td></tr><tr><td>351</td><td><code><pre> createdAt = createdAt.Add(1 * time.Minute)</pre></code></td></tr><tr><td>352</td><td><code><pre> hit := &types.Hit{</pre></code></td></tr><tr><td>353</td><td><code><pre> Service: service.Id,</pre></code></td></tr><tr><td>354</td><td><code><pre> CreatedAt: createdAt,</pre></code></td></tr><tr><td>355</td><td><code><pre> Latency: latency,</pre></code></td></tr><tr><td>356</td><td><code><pre> }</pre></code></td></tr><tr><td>357</td><td><code><pre> service.CreateHit(hit)</pre></code></td></tr><tr><td>358</td><td><code><pre> }</pre></code></td></tr><tr><td>359</td><td><code><pre></pre></code></td></tr><tr><td>360</td><td><code><pre> }</pre></code></td></tr><tr><td>361</td><td><code><pre></pre></code></td></tr><tr><td>362</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DbConfig.DropDatabase">func DbConfig.DropDatabase</div><div class="info"><a href="#s_fn_DbConfig.DropDatabase">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>322</td><td><code><pre>func (db *DbConfig) DropDatabase() error {</pre></code></td></tr><tr><td>323</td><td><code><pre> utils.Log(1, "Dropping Database Tables...")</pre></code></td></tr><tr><td>324</td><td><code><pre> err := DbSession.DropTableIfExists("checkins")</pre></code></td></tr><tr><td>325</td><td><code><pre> err = DbSession.DropTableIfExists("checkin_hits")</pre></code></td></tr><tr><td>326</td><td><code><pre> err = DbSession.DropTableIfExists("notifications")</pre></code></td></tr><tr><td>327</td><td><code><pre> err = DbSession.DropTableIfExists("core")</pre></code></td></tr><tr><td>328</td><td><code><pre> err = DbSession.DropTableIfExists("failures")</pre></code></td></tr><tr><td>329</td><td><code><pre> err = DbSession.DropTableIfExists("hits")</pre></code></td></tr><tr><td>330</td><td><code><pre> err = DbSession.DropTableIfExists("services")</pre></code></td></tr><tr><td>331</td><td><code><pre> err = DbSession.DropTableIfExists("users")</pre></code></td></tr><tr><td>332</td><td><code><pre> return err.Error</pre></code></td></tr><tr><td>333</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_insertFailureRecords">func insertFailureRecords</div><div class="info"><a href="#s_fn_insertFailureRecords">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/sample.go</code>:</p></div><table class="listing">
|
||
<tr><td>321</td><td><code><pre>func insertFailureRecords(since time.Time, amount int64) {</pre></code></td></tr><tr><td>322</td><td><code><pre> for i := int64(14); i <= 15; i++ {</pre></code></td></tr><tr><td>323</td><td><code><pre> service := SelectService(i)</pre></code></td></tr><tr><td>324</td><td><code><pre> utils.Log(1, fmt.Sprintf("Adding %v failure records to service %v", amount, service.Name))</pre></code></td></tr><tr><td>325</td><td><code><pre> createdAt := since</pre></code></td></tr><tr><td>326</td><td><code><pre></pre></code></td></tr><tr><td>327</td><td><code><pre> for fi := int64(1); fi <= amount; fi++ {</pre></code></td></tr><tr><td>328</td><td><code><pre> createdAt = createdAt.Add(2 * time.Minute)</pre></code></td></tr><tr><td>329</td><td><code><pre></pre></code></td></tr><tr><td>330</td><td><code><pre> failure := &types.Failure{</pre></code></td></tr><tr><td>331</td><td><code><pre> Service: service.Id,</pre></code></td></tr><tr><td>332</td><td><code><pre> Issue: "testing right here",</pre></code></td></tr><tr><td>333</td><td><code><pre> CreatedAt: createdAt,</pre></code></td></tr><tr><td>334</td><td><code><pre> }</pre></code></td></tr><tr><td>335</td><td><code><pre></pre></code></td></tr><tr><td>336</td><td><code><pre> service.CreateFailure(failure)</pre></code></td></tr><tr><td>337</td><td><code><pre> }</pre></code></td></tr><tr><td>338</td><td><code><pre> }</pre></code></td></tr><tr><td>339</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_recordSuccess">func recordSuccess</div><div class="info"><a href="#s_fn_recordSuccess">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go</code>:</p></div><table class="listing">
|
||
<tr><td>232</td><td><code><pre>func recordSuccess(s *Service) {</pre></code></td></tr><tr><td>233</td><td><code><pre> s.Online = true</pre></code></td></tr><tr><td>234</td><td><code><pre> s.LastOnline = time.Now()</pre></code></td></tr><tr><td>235</td><td><code><pre> hit := &types.Hit{</pre></code></td></tr><tr><td>236</td><td><code><pre> Service: s.Id,</pre></code></td></tr><tr><td>237</td><td><code><pre> Latency: s.Latency,</pre></code></td></tr><tr><td>238</td><td><code><pre> PingTime: s.PingTime,</pre></code></td></tr><tr><td>239</td><td><code><pre> CreatedAt: time.Now(),</pre></code></td></tr><tr><td>240</td><td><code><pre> }</pre></code></td></tr><tr><td>241</td><td><code><pre> 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))</pre></code></td></tr><tr><td>242</td><td><code><pre> s.CreateHit(hit)</pre></code></td></tr><tr><td>243</td><td><code><pre> notifier.OnSuccess(s.Service)</pre></code></td></tr><tr><td>244</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Core.CountOnline">func Core.CountOnline</div><div class="info"><a href="#s_fn_Core.CountOnline">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>408</td><td><code><pre>func (c *Core) CountOnline() int {</pre></code></td></tr><tr><td>409</td><td><code><pre> amount := 0</pre></code></td></tr><tr><td>410</td><td><code><pre> for _, s := range CoreApp.Services {</pre></code></td></tr><tr><td>411</td><td><code><pre> if s.Select().Online {</pre></code></td></tr><tr><td>412</td><td><code><pre> amount++</pre></code></td></tr><tr><td>413</td><td><code><pre> }</pre></code></td></tr><tr><td>414</td><td><code><pre> }</pre></code></td></tr><tr><td>415</td><td><code><pre> return amount</pre></code></td></tr><tr><td>416</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.Expected">func Checkin.Expected</div><div class="info"><a href="#s_fn_Checkin.Expected">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>120</td><td><code><pre>func (c *Checkin) Expected() time.Duration {</pre></code></td></tr><tr><td>121</td><td><code><pre> last := c.Last().CreatedAt</pre></code></td></tr><tr><td>122</td><td><code><pre> now := time.Now()</pre></code></td></tr><tr><td>123</td><td><code><pre> lastDir := now.Sub(last)</pre></code></td></tr><tr><td>124</td><td><code><pre> sub := time.Duration(c.Period() - lastDir)</pre></code></td></tr><tr><td>125</td><td><code><pre> return sub</pre></code></td></tr><tr><td>126</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_SelectUsername">func SelectUsername</div><div class="info"><a href="#s_fn_SelectUsername">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go</code>:</p></div><table class="listing">
|
||
<tr><td>43</td><td><code><pre>func SelectUsername(username string) (*user, error) {</pre></code></td></tr><tr><td>44</td><td><code><pre> var user user</pre></code></td></tr><tr><td>45</td><td><code><pre> res := usersDB().Where("username = ?", username)</pre></code></td></tr><tr><td>46</td><td><code><pre> err := res.First(&user)</pre></code></td></tr><tr><td>47</td><td><code><pre> return &user, err.Error</pre></code></td></tr><tr><td>48</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.Hits">func Service.Hits</div><div class="info"><a href="#s_fn_Service.Hits">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/hits.go</code>:</p></div><table class="listing">
|
||
<tr><td>39</td><td><code><pre>func (s *Service) Hits() ([]*types.Hit, error) {</pre></code></td></tr><tr><td>40</td><td><code><pre> var hits []*types.Hit</pre></code></td></tr><tr><td>41</td><td><code><pre> col := hitsDB().Where("service = ?", s.Id).Order("id desc")</pre></code></td></tr><tr><td>42</td><td><code><pre> err := col.Find(&hits)</pre></code></td></tr><tr><td>43</td><td><code><pre> return hits, err.Error</pre></code></td></tr><tr><td>44</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_insertSampleUsers">func insertSampleUsers</div><div class="info"><a href="#s_fn_insertSampleUsers">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/sample.go</code>:</p></div><table class="listing">
|
||
<tr><td>165</td><td><code><pre>func insertSampleUsers() {</pre></code></td></tr><tr><td>166</td><td><code><pre> u2 := ReturnUser(&types.User{</pre></code></td></tr><tr><td>167</td><td><code><pre> Username: "testadmin",</pre></code></td></tr><tr><td>168</td><td><code><pre> Password: "password123",</pre></code></td></tr><tr><td>169</td><td><code><pre> Email: "info@betatude.com",</pre></code></td></tr><tr><td>170</td><td><code><pre> Admin: true,</pre></code></td></tr><tr><td>171</td><td><code><pre> })</pre></code></td></tr><tr><td>172</td><td><code><pre></pre></code></td></tr><tr><td>173</td><td><code><pre> u3 := ReturnUser(&types.User{</pre></code></td></tr><tr><td>174</td><td><code><pre> Username: "testadmin2",</pre></code></td></tr><tr><td>175</td><td><code><pre> Password: "password123",</pre></code></td></tr><tr><td>176</td><td><code><pre> Email: "info@adminhere.com",</pre></code></td></tr><tr><td>177</td><td><code><pre> Admin: true,</pre></code></td></tr><tr><td>178</td><td><code><pre> })</pre></code></td></tr><tr><td>179</td><td><code><pre></pre></code></td></tr><tr><td>180</td><td><code><pre> u2.Create()</pre></code></td></tr><tr><td>181</td><td><code><pre> u3.Create()</pre></code></td></tr><tr><td>182</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_NewCore">func NewCore</div><div class="info"><a href="#s_fn_NewCore">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>47</td><td><code><pre>func NewCore() *Core {</pre></code></td></tr><tr><td>48</td><td><code><pre> CoreApp = new(Core)</pre></code></td></tr><tr><td>49</td><td><code><pre> CoreApp.Core = new(types.Core)</pre></code></td></tr><tr><td>50</td><td><code><pre> CoreApp.Started = time.Now()</pre></code></td></tr><tr><td>51</td><td><code><pre> return CoreApp</pre></code></td></tr><tr><td>52</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.CreateFailure">func Checkin.CreateFailure</div><div class="info"><a href="#s_fn_Checkin.CreateFailure">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>80</td><td><code><pre>func (c *Checkin) CreateFailure() (int64, error) {</pre></code></td></tr><tr><td>81</td><td><code><pre> service := c.Service()</pre></code></td></tr><tr><td>82</td><td><code><pre> fail := &types.Failure{</pre></code></td></tr><tr><td>83</td><td><code><pre> 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())),</pre></code></td></tr><tr><td>84</td><td><code><pre> Method: "checkin",</pre></code></td></tr><tr><td>85</td><td><code><pre> MethodId: c.Id,</pre></code></td></tr><tr><td>86</td><td><code><pre> Service: service.Id,</pre></code></td></tr><tr><td>87</td><td><code><pre> PingTime: c.Expected().Seconds() * 0.001,</pre></code></td></tr><tr><td>88</td><td><code><pre> }</pre></code></td></tr><tr><td>89</td><td><code><pre> row := failuresDB().Create(&fail)</pre></code></td></tr><tr><td>90</td><td><code><pre> return fail.Id, row.Error</pre></code></td></tr><tr><td>91</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.LimitedHits">func Service.LimitedHits</div><div class="info"><a href="#s_fn_Service.LimitedHits">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/hits.go</code>:</p></div><table class="listing">
|
||
<tr><td>47</td><td><code><pre>func (s *Service) LimitedHits() ([]*types.Hit, error) {</pre></code></td></tr><tr><td>48</td><td><code><pre> var hits []*types.Hit</pre></code></td></tr><tr><td>49</td><td><code><pre> col := hitsDB().Where("service = ?", s.Id).Order("id desc").Limit(1024)</pre></code></td></tr><tr><td>50</td><td><code><pre> err := col.Find(&hits)</pre></code></td></tr><tr><td>51</td><td><code><pre> return reverseHits(hits), err.Error</pre></code></td></tr><tr><td>52</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_user.Update">func user.Update</div><div class="info"><a href="#s_fn_user.Update">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go</code>:</p></div><table class="listing">
|
||
<tr><td>56</td><td><code><pre>func (u *user) Update() error {</pre></code></td></tr><tr><td>57</td><td><code><pre> u.Password = utils.HashPassword(u.Password)</pre></code></td></tr><tr><td>58</td><td><code><pre> u.ApiKey = utils.NewSHA1Hash(5)</pre></code></td></tr><tr><td>59</td><td><code><pre> u.ApiSecret = utils.NewSHA1Hash(10)</pre></code></td></tr><tr><td>60</td><td><code><pre> return usersDB().Update(u).Error</pre></code></td></tr><tr><td>61</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.LimitedFailures">func Service.LimitedFailures</div><div class="info"><a href="#s_fn_Service.LimitedFailures">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go</code>:</p></div><table class="listing">
|
||
<tr><td>68</td><td><code><pre>func (s *Service) LimitedFailures() []*failure {</pre></code></td></tr><tr><td>69</td><td><code><pre> var failArr []*failure</pre></code></td></tr><tr><td>70</td><td><code><pre> col := failuresDB().Where("service = ?", s.Id).Order("id desc").Limit(10)</pre></code></td></tr><tr><td>71</td><td><code><pre> col.Find(&failArr)</pre></code></td></tr><tr><td>72</td><td><code><pre> return failArr</pre></code></td></tr><tr><td>73</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.TotalHits">func Service.TotalHits</div><div class="info"><a href="#s_fn_Service.TotalHits">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/hits.go</code>:</p></div><table class="listing">
|
||
<tr><td>63</td><td><code><pre>func (s *Service) TotalHits() (uint64, error) {</pre></code></td></tr><tr><td>64</td><td><code><pre> var count uint64</pre></code></td></tr><tr><td>65</td><td><code><pre> col := hitsDB().Where("service = ?", s.Id)</pre></code></td></tr><tr><td>66</td><td><code><pre> err := col.Count(&count)</pre></code></td></tr><tr><td>67</td><td><code><pre> return count, err.Error</pre></code></td></tr><tr><td>68</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.TotalFailuresSince">func Service.TotalFailuresSince</div><div class="info"><a href="#s_fn_Service.TotalFailuresSince">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go</code>:</p></div><table class="listing">
|
||
<tr><td>124</td><td><code><pre>func (s *Service) TotalFailuresSince(ago time.Time) (uint64, error) {</pre></code></td></tr><tr><td>125</td><td><code><pre> var count uint64</pre></code></td></tr><tr><td>126</td><td><code><pre> rows := failuresDB().Where("service = ? AND created_at > ?", s.Id, ago.UTC().Format("2006-01-02 15:04:05")).Not("method = 'checkin'")</pre></code></td></tr><tr><td>127</td><td><code><pre> err := rows.Count(&count)</pre></code></td></tr><tr><td>128</td><td><code><pre> return count, err.Error</pre></code></td></tr><tr><td>129</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.TotalHitsSince">func Service.TotalHitsSince</div><div class="info"><a href="#s_fn_Service.TotalHitsSince">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/hits.go</code>:</p></div><table class="listing">
|
||
<tr><td>71</td><td><code><pre>func (s *Service) TotalHitsSince(ago time.Time) (uint64, error) {</pre></code></td></tr><tr><td>72</td><td><code><pre> var count uint64</pre></code></td></tr><tr><td>73</td><td><code><pre> rows := hitsDB().Where("service = ? AND created_at > ?", s.Id, ago.UTC().Format("2006-01-02 15:04:05"))</pre></code></td></tr><tr><td>74</td><td><code><pre> err := rows.Count(&count)</pre></code></td></tr><tr><td>75</td><td><code><pre> return count, err.Error</pre></code></td></tr><tr><td>76</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_reverseHits">func reverseHits</div><div class="info"><a href="#s_fn_reverseHits">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/hits.go</code>:</p></div><table class="listing">
|
||
<tr><td>55</td><td><code><pre>func reverseHits(input []*types.Hit) []*types.Hit {</pre></code></td></tr><tr><td>56</td><td><code><pre> if len(input) == 0 {</pre></code></td></tr><tr><td>57</td><td><code><pre> return input</pre></code></td></tr><tr><td>58</td><td><code><pre> }</pre></code></td></tr><tr><td>59</td><td><code><pre> return append(reverseHits(input[1:]), input[0])</pre></code></td></tr><tr><td>60</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.Hits">func Checkin.Hits</div><div class="info"><a href="#s_fn_Checkin.Hits">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>140</td><td><code><pre>func (c *Checkin) Hits() []*checkinHit {</pre></code></td></tr><tr><td>141</td><td><code><pre> var checkins []*checkinHit</pre></code></td></tr><tr><td>142</td><td><code><pre> checkinHitsDB().Where("checkin = ?", c.Id).Order("id DESC").Find(&checkins)</pre></code></td></tr><tr><td>143</td><td><code><pre> return checkins</pre></code></td></tr><tr><td>144</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.Last">func Checkin.Last</div><div class="info"><a href="#s_fn_Checkin.Last">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>129</td><td><code><pre>func (c *Checkin) Last() *checkinHit {</pre></code></td></tr><tr><td>130</td><td><code><pre> var hit checkinHit</pre></code></td></tr><tr><td>131</td><td><code><pre> checkinHitsDB().Where("checkin = ?", c.Id).Last(&hit)</pre></code></td></tr><tr><td>132</td><td><code><pre> return &hit</pre></code></td></tr><tr><td>133</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.Checkins">func Service.Checkins</div><div class="info"><a href="#s_fn_Service.Checkins">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>68</td><td><code><pre>func (s *Service) Checkins() []*Checkin {</pre></code></td></tr><tr><td>69</td><td><code><pre> var checkin []*Checkin</pre></code></td></tr><tr><td>70</td><td><code><pre> checkinDB().Where("service = ?", s.Id).Find(&checkin)</pre></code></td></tr><tr><td>71</td><td><code><pre> return checkin</pre></code></td></tr><tr><td>72</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_insertSampleCore">func insertSampleCore</div><div class="info"><a href="#s_fn_insertSampleCore">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/sample.go</code>:</p></div><table class="listing">
|
||
<tr><td>149</td><td><code><pre>func insertSampleCore() error {</pre></code></td></tr><tr><td>150</td><td><code><pre> core := &types.Core{</pre></code></td></tr><tr><td>151</td><td><code><pre> Name: "Statup Sample Data",</pre></code></td></tr><tr><td>152</td><td><code><pre> Description: "This data is only used to testing",</pre></code></td></tr><tr><td>153</td><td><code><pre> ApiKey: "sample",</pre></code></td></tr><tr><td>154</td><td><code><pre> ApiSecret: "samplesecret",</pre></code></td></tr><tr><td>155</td><td><code><pre> Domain: "http://localhost:8080",</pre></code></td></tr><tr><td>156</td><td><code><pre> Version: "test",</pre></code></td></tr><tr><td>157</td><td><code><pre> CreatedAt: time.Now(),</pre></code></td></tr><tr><td>158</td><td><code><pre> UseCdn: false,</pre></code></td></tr><tr><td>159</td><td><code><pre> }</pre></code></td></tr><tr><td>160</td><td><code><pre> query := coreDB().Create(core)</pre></code></td></tr><tr><td>161</td><td><code><pre> return query.Error</pre></code></td></tr><tr><td>162</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.Check">func Service.Check</div><div class="info"><a href="#s_fn_Service.Check">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go</code>:</p></div><table class="listing">
|
||
<tr><td>222</td><td><code><pre>func (s *Service) Check(record bool) {</pre></code></td></tr><tr><td>223</td><td><code><pre> switch s.Type {</pre></code></td></tr><tr><td>224</td><td><code><pre> case "http":</pre></code></td></tr><tr><td>225</td><td><code><pre> s.checkHttp(record)</pre></code></td></tr><tr><td>226</td><td><code><pre> case "tcp", "udp":</pre></code></td></tr><tr><td>227</td><td><code><pre> s.checkTcp(record)</pre></code></td></tr><tr><td>228</td><td><code><pre> }</pre></code></td></tr><tr><td>229</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.BeforeCreate">func Checkin.BeforeCreate</div><div class="info"><a href="#s_fn_Checkin.BeforeCreate">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>163</td><td><code><pre>func (c *Checkin) BeforeCreate() (err error) {</pre></code></td></tr><tr><td>164</td><td><code><pre> if c.CreatedAt.IsZero() {</pre></code></td></tr><tr><td>165</td><td><code><pre> c.CreatedAt = time.Now().UTC()</pre></code></td></tr><tr><td>166</td><td><code><pre> }</pre></code></td></tr><tr><td>167</td><td><code><pre> return</pre></code></td></tr><tr><td>168</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_SelectUser">func SelectUser</div><div class="info"><a href="#s_fn_SelectUser">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go</code>:</p></div><table class="listing">
|
||
<tr><td>36</td><td><code><pre>func SelectUser(id int64) (*user, error) {</pre></code></td></tr><tr><td>37</td><td><code><pre> var user user</pre></code></td></tr><tr><td>38</td><td><code><pre> err := usersDB().First(&user, id)</pre></code></td></tr><tr><td>39</td><td><code><pre> return &user, err.Error</pre></code></td></tr><tr><td>40</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.AfterFind">func Service.AfterFind</div><div class="info"><a href="#s_fn_Service.AfterFind">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>95</td><td><code><pre>func (s *Service) AfterFind() (err error) {</pre></code></td></tr><tr><td>96</td><td><code><pre> s.CreatedAt = utils.Timezoner(s.CreatedAt, CoreApp.Timezone)</pre></code></td></tr><tr><td>97</td><td><code><pre> return</pre></code></td></tr><tr><td>98</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_checkinHit.Ago">func checkinHit.Ago</div><div class="info"><a href="#s_fn_checkinHit.Ago">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>190</td><td><code><pre>func (c *checkinHit) Ago() string {</pre></code></td></tr><tr><td>191</td><td><code><pre> got, _ := timeago.TimeAgoWithTime(time.Now(), c.CreatedAt)</pre></code></td></tr><tr><td>192</td><td><code><pre> return got</pre></code></td></tr><tr><td>193</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_user.AfterFind">func user.AfterFind</div><div class="info"><a href="#s_fn_user.AfterFind">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>113</td><td><code><pre>func (u *user) AfterFind() (err error) {</pre></code></td></tr><tr><td>114</td><td><code><pre> u.CreatedAt = utils.Timezoner(u.CreatedAt, CoreApp.Timezone)</pre></code></td></tr><tr><td>115</td><td><code><pre> return</pre></code></td></tr><tr><td>116</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_failure.AfterFind">func failure.AfterFind</div><div class="info"><a href="#s_fn_failure.AfterFind">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>107</td><td><code><pre>func (f *failure) AfterFind() (err error) {</pre></code></td></tr><tr><td>108</td><td><code><pre> f.CreatedAt = utils.Timezoner(f.CreatedAt, CoreApp.Timezone)</pre></code></td></tr><tr><td>109</td><td><code><pre> return</pre></code></td></tr><tr><td>110</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.AfterFind">func Checkin.AfterFind</div><div class="info"><a href="#s_fn_Checkin.AfterFind">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>119</td><td><code><pre>func (c *Checkin) AfterFind() (err error) {</pre></code></td></tr><tr><td>120</td><td><code><pre> c.CreatedAt = utils.Timezoner(c.CreatedAt, CoreApp.Timezone)</pre></code></td></tr><tr><td>121</td><td><code><pre> return</pre></code></td></tr><tr><td>122</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.Grace">func Checkin.Grace</div><div class="info"><a href="#s_fn_Checkin.Grace">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>114</td><td><code><pre>func (c *Checkin) Grace() time.Duration {</pre></code></td></tr><tr><td>115</td><td><code><pre> duration, _ := time.ParseDuration(fmt.Sprintf("%vs", c.GracePeriod))</pre></code></td></tr><tr><td>116</td><td><code><pre> return duration</pre></code></td></tr><tr><td>117</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.Period">func Checkin.Period</div><div class="info"><a href="#s_fn_Checkin.Period">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>108</td><td><code><pre>func (c *Checkin) Period() time.Duration {</pre></code></td></tr><tr><td>109</td><td><code><pre> duration, _ := time.ParseDuration(fmt.Sprintf("%vs", c.Interval))</pre></code></td></tr><tr><td>110</td><td><code><pre> return duration</pre></code></td></tr><tr><td>111</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.Service">func Checkin.Service</div><div class="info"><a href="#s_fn_Checkin.Service">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>75</td><td><code><pre>func (c *Checkin) Service() *Service {</pre></code></td></tr><tr><td>76</td><td><code><pre> service := SelectService(c.ServiceId)</pre></code></td></tr><tr><td>77</td><td><code><pre> return service</pre></code></td></tr><tr><td>78</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_updateService">func updateService</div><div class="info"><a href="#s_fn_updateService">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>341</td><td><code><pre>func updateService(service *Service) {</pre></code></td></tr><tr><td>342</td><td><code><pre> index := service.index()</pre></code></td></tr><tr><td>343</td><td><code><pre> CoreApp.Services[index] = service</pre></code></td></tr><tr><td>344</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_CheckHash">func CheckHash</div><div class="info"><a href="#s_fn_CheckHash">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go</code>:</p></div><table class="listing">
|
||
<tr><td>105</td><td><code><pre>func CheckHash(password, hash string) bool {</pre></code></td></tr><tr><td>106</td><td><code><pre> err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))</pre></code></td></tr><tr><td>107</td><td><code><pre> return err == nil</pre></code></td></tr><tr><td>108</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_checkinHit.AfterFind">func checkinHit.AfterFind</div><div class="info"><a href="#s_fn_checkinHit.AfterFind">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>125</td><td><code><pre>func (c *checkinHit) AfterFind() (err error) {</pre></code></td></tr><tr><td>126</td><td><code><pre> c.CreatedAt = utils.Timezoner(c.CreatedAt, CoreApp.Timezone)</pre></code></td></tr><tr><td>127</td><td><code><pre> return</pre></code></td></tr><tr><td>128</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_checkinHitsDB">func checkinHitsDB</div><div class="info"><a href="#s_fn_checkinHitsDB">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>72</td><td><code><pre>func checkinHitsDB() *gorm.DB {</pre></code></td></tr><tr><td>73</td><td><code><pre> return DbSession.Model(&types.CheckinHit{})</pre></code></td></tr><tr><td>74</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_user.Delete">func user.Delete</div><div class="info"><a href="#s_fn_user.Delete">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go</code>:</p></div><table class="listing">
|
||
<tr><td>51</td><td><code><pre>func (u *user) Delete() error {</pre></code></td></tr><tr><td>52</td><td><code><pre> return usersDB().Delete(u).Error</pre></code></td></tr><tr><td>53</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_init">func init</div><div class="info"><a href="#s_fn_init">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>42</td><td><code><pre>func init() {</pre></code></td></tr><tr><td>43</td><td><code><pre> CoreApp = NewCore()</pre></code></td></tr><tr><td>44</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_ReturnCheckin">func ReturnCheckin</div><div class="info"><a href="#s_fn_ReturnCheckin">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>66</td><td><code><pre>func ReturnCheckin(c *types.Checkin) *Checkin {</pre></code></td></tr><tr><td>67</td><td><code><pre> return &Checkin{Checkin: c}</pre></code></td></tr><tr><td>68</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_reorderServices">func reorderServices</div><div class="info"><a href="#s_fn_reorderServices">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>103</td><td><code><pre>func reorderServices() {</pre></code></td></tr><tr><td>104</td><td><code><pre> sort.Sort(ServiceOrder(CoreApp.Services))</pre></code></td></tr><tr><td>105</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_ReturnService">func ReturnService</div><div class="info"><a href="#s_fn_ReturnService">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>40</td><td><code><pre>func ReturnService(s *types.Service) *Service {</pre></code></td></tr><tr><td>41</td><td><code><pre> return &Service{s}</pre></code></td></tr><tr><td>42</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_checkinDB">func checkinDB</div><div class="info"><a href="#s_fn_checkinDB">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>67</td><td><code><pre>func checkinDB() *gorm.DB {</pre></code></td></tr><tr><td>68</td><td><code><pre> return DbSession.Model(&types.Checkin{})</pre></code></td></tr><tr><td>69</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_ReturnCheckinHit">func ReturnCheckinHit</div><div class="info"><a href="#s_fn_ReturnCheckinHit">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>71</td><td><code><pre>func ReturnCheckinHit(c *types.CheckinHit) *checkinHit {</pre></code></td></tr><tr><td>72</td><td><code><pre> return &checkinHit{CheckinHit: c}</pre></code></td></tr><tr><td>73</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_ServiceOrder.Len">func ServiceOrder.Len</div><div class="info"><a href="#s_fn_ServiceOrder.Len">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>160</td><td><code><pre>func (c ServiceOrder) Len() int { return len(c) }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_ServiceOrder.Swap">func ServiceOrder.Swap</div><div class="info"><a href="#s_fn_ServiceOrder.Swap">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>161</td><td><code><pre>func (c ServiceOrder) Swap(i, j int) { c[i], c[j] = c[j], c[i] }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_ServiceOrder.Less">func ServiceOrder.Less</div><div class="info"><a href="#s_fn_ServiceOrder.Less">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>162</td><td><code><pre>func (c ServiceOrder) Less(i, j int) bool { return c[i].(*Service).Order < c[j].(*Service).Order }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_failuresDB">func failuresDB</div><div class="info"><a href="#s_fn_failuresDB">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>42</td><td><code><pre>func failuresDB() *gorm.DB {</pre></code></td></tr><tr><td>43</td><td><code><pre> return DbSession.Model(&types.Failure{})</pre></code></td></tr><tr><td>44</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_hitsDB">func hitsDB</div><div class="info"><a href="#s_fn_hitsDB">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>47</td><td><code><pre>func hitsDB() *gorm.DB {</pre></code></td></tr><tr><td>48</td><td><code><pre> return DbSession.Model(&types.Hit{})</pre></code></td></tr><tr><td>49</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_servicesDB">func servicesDB</div><div class="info"><a href="#s_fn_servicesDB">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>52</td><td><code><pre>func servicesDB() *gorm.DB {</pre></code></td></tr><tr><td>53</td><td><code><pre> return DbSession.Model(&types.Service{})</pre></code></td></tr><tr><td>54</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_coreDB">func coreDB</div><div class="info"><a href="#s_fn_coreDB">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>57</td><td><code><pre>func coreDB() *gorm.DB {</pre></code></td></tr><tr><td>58</td><td><code><pre> return DbSession.Table("core").Model(&CoreApp)</pre></code></td></tr><tr><td>59</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_usersDB">func usersDB</div><div class="info"><a href="#s_fn_usersDB">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>62</td><td><code><pre>func usersDB() *gorm.DB {</pre></code></td></tr><tr><td>63</td><td><code><pre> return DbSession.Model(&types.User{})</pre></code></td></tr><tr><td>64</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_ReturnUser">func ReturnUser</div><div class="info"><a href="#s_fn_ReturnUser">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go</code>:</p></div><table class="listing">
|
||
<tr><td>31</td><td><code><pre>func ReturnUser(u *types.User) *user {</pre></code></td></tr><tr><td>32</td><td><code><pre> return &user{u}</pre></code></td></tr><tr><td>33</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.Select">func Service.Select</div><div class="info"><a href="#s_fn_Service.Select">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>35</td><td><code><pre>func (s *Service) Select() *types.Service {</pre></code></td></tr><tr><td>36</td><td><code><pre> return s.Service</pre></code></td></tr><tr><td>37</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.parseHost">func Service.parseHost</div><div class="info"><a href="#s_fn_Service.parseHost">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go</code>:</p></div><table class="listing">
|
||
<tr><td>77</td><td><code><pre>func (s *Service) parseHost() string {</pre></code></td></tr><tr><td>78</td><td><code><pre> if s.Type == "tcp" || s.Type == "udp" {</pre></code></td></tr><tr><td>79</td><td><code><pre> return s.Domain</pre></code></td></tr><tr><td>80</td><td><code><pre> } else {</pre></code></td></tr><tr><td>81</td><td><code><pre> domain := s.Domain</pre></code></td></tr><tr><td>82</td><td><code><pre> hasPort, _ := regexp.MatchString(`\:([0-9]+)`, domain)</pre></code></td></tr><tr><td>83</td><td><code><pre> if hasPort {</pre></code></td></tr><tr><td>84</td><td><code><pre> splitDomain := strings.Split(s.Domain, ":")</pre></code></td></tr><tr><td>85</td><td><code><pre> domain = splitDomain[len(splitDomain)-2]</pre></code></td></tr><tr><td>86</td><td><code><pre> }</pre></code></td></tr><tr><td>87</td><td><code><pre> host, err := url.Parse(domain)</pre></code></td></tr><tr><td>88</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>89</td><td><code><pre> return s.Domain</pre></code></td></tr><tr><td>90</td><td><code><pre> }</pre></code></td></tr><tr><td>91</td><td><code><pre> return host.Host</pre></code></td></tr><tr><td>92</td><td><code><pre> }</pre></code></td></tr><tr><td>93</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.dnsCheck">func Service.dnsCheck</div><div class="info"><a href="#s_fn_Service.dnsCheck">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go</code>:</p></div><table class="listing">
|
||
<tr><td>96</td><td><code><pre>func (s *Service) dnsCheck() (float64, error) {</pre></code></td></tr><tr><td>97</td><td><code><pre> var err error</pre></code></td></tr><tr><td>98</td><td><code><pre> t1 := time.Now()</pre></code></td></tr><tr><td>99</td><td><code><pre> host := s.parseHost()</pre></code></td></tr><tr><td>100</td><td><code><pre> if s.Type == "tcp" {</pre></code></td></tr><tr><td>101</td><td><code><pre> _, err = net.LookupHost(host)</pre></code></td></tr><tr><td>102</td><td><code><pre> } else {</pre></code></td></tr><tr><td>103</td><td><code><pre> _, err = net.LookupIP(host)</pre></code></td></tr><tr><td>104</td><td><code><pre> }</pre></code></td></tr><tr><td>105</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>106</td><td><code><pre> return 0, err</pre></code></td></tr><tr><td>107</td><td><code><pre> }</pre></code></td></tr><tr><td>108</td><td><code><pre> t2 := time.Now()</pre></code></td></tr><tr><td>109</td><td><code><pre> subTime := t2.Sub(t1).Seconds()</pre></code></td></tr><tr><td>110</td><td><code><pre> return subTime, err</pre></code></td></tr><tr><td>111</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.Sum">func Service.Sum</div><div class="info"><a href="#s_fn_Service.Sum">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/hits.go</code>:</p></div><table class="listing">
|
||
<tr><td>79</td><td><code><pre>func (s *Service) Sum() (float64, error) {</pre></code></td></tr><tr><td>80</td><td><code><pre> var amount float64</pre></code></td></tr><tr><td>81</td><td><code><pre> hits, err := s.Hits()</pre></code></td></tr><tr><td>82</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>83</td><td><code><pre> utils.Log(2, err)</pre></code></td></tr><tr><td>84</td><td><code><pre> }</pre></code></td></tr><tr><td>85</td><td><code><pre> for _, h := range hits {</pre></code></td></tr><tr><td>86</td><td><code><pre> amount += h.Latency</pre></code></td></tr><tr><td>87</td><td><code><pre> }</pre></code></td></tr><tr><td>88</td><td><code><pre> return amount, err</pre></code></td></tr><tr><td>89</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.Update">func Service.Update</div><div class="info"><a href="#s_fn_Service.Update">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>368</td><td><code><pre>func (s *Service) Update(restart bool) error {</pre></code></td></tr><tr><td>369</td><td><code><pre> err := servicesDB().Update(s)</pre></code></td></tr><tr><td>370</td><td><code><pre> if err.Error != nil {</pre></code></td></tr><tr class="miss"><td>371</td><td><code><pre> utils.Log(3, fmt.Sprintf("Failed to update service %v. %v", s.Name, err))</pre></code></td></tr><tr class="miss"><td>372</td><td><code><pre> return err.Error</pre></code></td></tr><tr><td>373</td><td><code><pre> }</pre></code></td></tr><tr><td>374</td><td><code><pre> if restart {</pre></code></td></tr><tr><td>375</td><td><code><pre> s.Close()</pre></code></td></tr><tr><td>376</td><td><code><pre> s.Start()</pre></code></td></tr><tr><td>377</td><td><code><pre> s.SleepDuration = time.Duration(s.Interval) * time.Second</pre></code></td></tr><tr><td>378</td><td><code><pre> go s.CheckQueue(true)</pre></code></td></tr><tr><td>379</td><td><code><pre> }</pre></code></td></tr><tr><td>380</td><td><code><pre> reorderServices()</pre></code></td></tr><tr><td>381</td><td><code><pre> updateService(s)</pre></code></td></tr><tr><td>382</td><td><code><pre> notifier.OnUpdatedService(s.Service)</pre></code></td></tr><tr><td>383</td><td><code><pre> return err.Error</pre></code></td></tr><tr><td>384</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.Delete">func Service.Delete</div><div class="info"><a href="#s_fn_Service.Delete">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>347</td><td><code><pre>func (s *Service) Delete() error {</pre></code></td></tr><tr><td>348</td><td><code><pre> i := s.index()</pre></code></td></tr><tr><td>349</td><td><code><pre> err := servicesDB().Delete(s)</pre></code></td></tr><tr><td>350</td><td><code><pre> if err.Error != nil {</pre></code></td></tr><tr class="miss"><td>351</td><td><code><pre> utils.Log(3, fmt.Sprintf("Failed to delete service %v. %v", s.Name, err.Error))</pre></code></td></tr><tr class="miss"><td>352</td><td><code><pre> return err.Error</pre></code></td></tr><tr><td>353</td><td><code><pre> }</pre></code></td></tr><tr><td>354</td><td><code><pre> s.Close()</pre></code></td></tr><tr><td>355</td><td><code><pre> slice := CoreApp.Services</pre></code></td></tr><tr><td>356</td><td><code><pre> CoreApp.Services = append(slice[:i], slice[i+1:]...)</pre></code></td></tr><tr><td>357</td><td><code><pre> reorderServices()</pre></code></td></tr><tr><td>358</td><td><code><pre> notifier.OnDeletedService(s.Service)</pre></code></td></tr><tr><td>359</td><td><code><pre> return err.Error</pre></code></td></tr><tr><td>360</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.Create">func Service.Create</div><div class="info"><a href="#s_fn_Service.Create">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>387</td><td><code><pre>func (s *Service) Create(check bool) (int64, error) {</pre></code></td></tr><tr><td>388</td><td><code><pre> s.CreatedAt = time.Now()</pre></code></td></tr><tr><td>389</td><td><code><pre> db := servicesDB().Create(s)</pre></code></td></tr><tr><td>390</td><td><code><pre> if db.Error != nil {</pre></code></td></tr><tr class="miss"><td>391</td><td><code><pre> utils.Log(3, fmt.Sprintf("Failed to create service %v #%v: %v", s.Name, s.Id, db.Error))</pre></code></td></tr><tr class="miss"><td>392</td><td><code><pre> return 0, db.Error</pre></code></td></tr><tr><td>393</td><td><code><pre> }</pre></code></td></tr><tr><td>394</td><td><code><pre> s.Start()</pre></code></td></tr><tr><td>395</td><td><code><pre> go s.CheckQueue(check)</pre></code></td></tr><tr><td>396</td><td><code><pre> CoreApp.Services = append(CoreApp.Services, s)</pre></code></td></tr><tr><td>397</td><td><code><pre> reorderServices()</pre></code></td></tr><tr><td>398</td><td><code><pre> notifier.OnNewService(s.Service)</pre></code></td></tr><tr><td>399</td><td><code><pre> return s.Id, nil</pre></code></td></tr><tr><td>400</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.Routine">func Checkin.Routine</div><div class="info"><a href="#s_fn_Checkin.Routine">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>35</td><td><code><pre>func (c *Checkin) Routine() {</pre></code></td></tr><tr><td>36</td><td><code><pre> if c.Last() == nil {</pre></code></td></tr><tr class="miss"><td>37</td><td><code><pre> return</pre></code></td></tr><tr><td>38</td><td><code><pre> }</pre></code></td></tr><tr><td>39</td><td><code><pre> reCheck := c.Period()</pre></code></td></tr><tr><td>40</td><td><code><pre>CheckinLoop:</pre></code></td></tr><tr><td>41</td><td><code><pre> for {</pre></code></td></tr><tr><td>42</td><td><code><pre> select {</pre></code></td></tr><tr><td>43</td><td><code><pre> case <-c.Running:</pre></code></td></tr><tr class="miss"><td>44</td><td><code><pre> utils.Log(1, fmt.Sprintf("Stopping checkin routine: %v", c.Name))</pre></code></td></tr><tr class="miss"><td>45</td><td><code><pre> break CheckinLoop</pre></code></td></tr><tr><td>46</td><td><code><pre> case <-time.After(reCheck):</pre></code></td></tr><tr><td>47</td><td><code><pre> utils.Log(1, fmt.Sprintf("Checkin %v is expected at %v, checking every %v", c.Name, utils.FormatDuration(c.Expected()), utils.FormatDuration(c.Period())))</pre></code></td></tr><tr><td>48</td><td><code><pre> if c.Expected().Seconds() <= 0 {</pre></code></td></tr><tr><td>49</td><td><code><pre> issue := fmt.Sprintf("Checkin %v is failing, no request since %v", c.Name, c.Last().CreatedAt)</pre></code></td></tr><tr><td>50</td><td><code><pre> utils.Log(3, issue)</pre></code></td></tr><tr><td>51</td><td><code><pre> c.Service()</pre></code></td></tr><tr><td>52</td><td><code><pre> c.CreateFailure()</pre></code></td></tr><tr><td>53</td><td><code><pre> }</pre></code></td></tr><tr><td>54</td><td><code><pre> reCheck = c.Period()</pre></code></td></tr><tr><td>55</td><td><code><pre> }</pre></code></td></tr><tr><td>56</td><td><code><pre> continue</pre></code></td></tr><tr><td>57</td><td><code><pre> }</pre></code></td></tr><tr><td>58</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.OnlineSince">func Service.OnlineSince</div><div class="info"><a href="#s_fn_Service.OnlineSince">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>133</td><td><code><pre>func (s *Service) OnlineSince(ago time.Time) float32 {</pre></code></td></tr><tr><td>134</td><td><code><pre> failed, _ := s.TotalFailuresSince(ago)</pre></code></td></tr><tr><td>135</td><td><code><pre> if failed == 0 {</pre></code></td></tr><tr><td>136</td><td><code><pre> s.Online24Hours = 100.00</pre></code></td></tr><tr><td>137</td><td><code><pre> return s.Online24Hours</pre></code></td></tr><tr><td>138</td><td><code><pre> }</pre></code></td></tr><tr><td>139</td><td><code><pre> total, _ := s.TotalHitsSince(ago)</pre></code></td></tr><tr><td>140</td><td><code><pre> if total == 0 {</pre></code></td></tr><tr class="miss"><td>141</td><td><code><pre> s.Online24Hours = 0</pre></code></td></tr><tr class="miss"><td>142</td><td><code><pre> return s.Online24Hours</pre></code></td></tr><tr><td>143</td><td><code><pre> }</pre></code></td></tr><tr><td>144</td><td><code><pre> avg := float64(failed) / float64(total) * 100</pre></code></td></tr><tr><td>145</td><td><code><pre> avg = 100 - avg</pre></code></td></tr><tr><td>146</td><td><code><pre> if avg < 0 {</pre></code></td></tr><tr class="miss"><td>147</td><td><code><pre> avg = 0</pre></code></td></tr><tr><td>148</td><td><code><pre> }</pre></code></td></tr><tr><td>149</td><td><code><pre> amount, _ := strconv.ParseFloat(fmt.Sprintf("%0.2f", avg), 10)</pre></code></td></tr><tr><td>150</td><td><code><pre> s.Online24Hours = float32(amount)</pre></code></td></tr><tr><td>151</td><td><code><pre> return s.Online24Hours</pre></code></td></tr><tr><td>152</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.duration">func Service.duration</div><div class="info"><a href="#s_fn_Service.duration">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go</code>:</p></div><table class="listing">
|
||
<tr><td>67</td><td><code><pre>func (s *Service) duration() time.Duration {</pre></code></td></tr><tr><td>68</td><td><code><pre> var amount time.Duration</pre></code></td></tr><tr><td>69</td><td><code><pre> if s.Interval >= 10000 {</pre></code></td></tr><tr class="miss"><td>70</td><td><code><pre> amount = time.Duration(s.Interval) * time.Microsecond</pre></code></td></tr><tr><td>71</td><td><code><pre> } else {</pre></code></td></tr><tr><td>72</td><td><code><pre> amount = time.Duration(s.Interval) * time.Second</pre></code></td></tr><tr><td>73</td><td><code><pre> }</pre></code></td></tr><tr><td>74</td><td><code><pre> return amount</pre></code></td></tr><tr><td>75</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_SelectAllUsers">func SelectAllUsers</div><div class="info"><a href="#s_fn_SelectAllUsers">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go</code>:</p></div><table class="listing">
|
||
<tr><td>81</td><td><code><pre>func SelectAllUsers() ([]*user, error) {</pre></code></td></tr><tr><td>82</td><td><code><pre> var users []*user</pre></code></td></tr><tr><td>83</td><td><code><pre> db := usersDB().Find(&users)</pre></code></td></tr><tr><td>84</td><td><code><pre> if db.Error != nil {</pre></code></td></tr><tr class="miss"><td>85</td><td><code><pre> utils.Log(3, fmt.Sprintf("Failed to load all users. %v", db.Error))</pre></code></td></tr><tr><td>86</td><td><code><pre> }</pre></code></td></tr><tr><td>87</td><td><code><pre> return users, db.Error</pre></code></td></tr><tr><td>88</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.AvgUptime">func Service.AvgUptime</div><div class="info"><a href="#s_fn_Service.AvgUptime">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>293</td><td><code><pre>func (s *Service) AvgUptime(ago time.Time) string {</pre></code></td></tr><tr><td>294</td><td><code><pre> failed, _ := s.TotalFailuresSince(ago)</pre></code></td></tr><tr><td>295</td><td><code><pre> if failed == 0 {</pre></code></td></tr><tr><td>296</td><td><code><pre> return "100"</pre></code></td></tr><tr><td>297</td><td><code><pre> }</pre></code></td></tr><tr><td>298</td><td><code><pre> total, _ := s.TotalHitsSince(ago)</pre></code></td></tr><tr><td>299</td><td><code><pre> if total == 0 {</pre></code></td></tr><tr class="miss"><td>300</td><td><code><pre> return "0.00"</pre></code></td></tr><tr><td>301</td><td><code><pre> }</pre></code></td></tr><tr><td>302</td><td><code><pre> percent := float64(failed) / float64(total) * 100</pre></code></td></tr><tr><td>303</td><td><code><pre> percent = 100 - percent</pre></code></td></tr><tr><td>304</td><td><code><pre> if percent < 0 {</pre></code></td></tr><tr class="miss"><td>305</td><td><code><pre> percent = 0</pre></code></td></tr><tr><td>306</td><td><code><pre> }</pre></code></td></tr><tr><td>307</td><td><code><pre> amount := fmt.Sprintf("%0.2f", percent)</pre></code></td></tr><tr><td>308</td><td><code><pre> if amount == "100.00" {</pre></code></td></tr><tr class="miss"><td>309</td><td><code><pre> amount = "100"</pre></code></td></tr><tr><td>310</td><td><code><pre> }</pre></code></td></tr><tr><td>311</td><td><code><pre> return amount</pre></code></td></tr><tr><td>312</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.AllFailures">func Service.AllFailures</div><div class="info"><a href="#s_fn_Service.AllFailures">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go</code>:</p></div><table class="listing">
|
||
<tr><td>44</td><td><code><pre>func (s *Service) AllFailures() []*failure {</pre></code></td></tr><tr><td>45</td><td><code><pre> var fails []*failure</pre></code></td></tr><tr><td>46</td><td><code><pre> col := failuresDB().Where("service = ?", s.Id).Not("method = 'checkin'").Order("id desc")</pre></code></td></tr><tr><td>47</td><td><code><pre> err := col.Find(&fails)</pre></code></td></tr><tr><td>48</td><td><code><pre> if err.Error != nil {</pre></code></td></tr><tr class="miss"><td>49</td><td><code><pre> utils.Log(3, fmt.Sprintf("Issue getting failures for service %v, %v", s.Name, err))</pre></code></td></tr><tr class="miss"><td>50</td><td><code><pre> return nil</pre></code></td></tr><tr><td>51</td><td><code><pre> }</pre></code></td></tr><tr><td>52</td><td><code><pre> for _, f := range fails {</pre></code></td></tr><tr><td>53</td><td><code><pre> s.Failures = append(s.Failures, f)</pre></code></td></tr><tr><td>54</td><td><code><pre> }</pre></code></td></tr><tr><td>55</td><td><code><pre> return fails</pre></code></td></tr><tr><td>56</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.Downtime">func Service.Downtime</div><div class="info"><a href="#s_fn_Service.Downtime">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>228</td><td><code><pre>func (s *Service) Downtime() time.Duration {</pre></code></td></tr><tr><td>229</td><td><code><pre> hits, _ := s.Hits()</pre></code></td></tr><tr><td>230</td><td><code><pre> fails := s.LimitedFailures()</pre></code></td></tr><tr><td>231</td><td><code><pre> if len(fails) == 0 {</pre></code></td></tr><tr class="miss"><td>232</td><td><code><pre> return time.Duration(0)</pre></code></td></tr><tr><td>233</td><td><code><pre> }</pre></code></td></tr><tr><td>234</td><td><code><pre> if len(hits) == 0 {</pre></code></td></tr><tr class="miss"><td>235</td><td><code><pre> return time.Now().UTC().Sub(fails[len(fails)-1].CreatedAt.UTC())</pre></code></td></tr><tr><td>236</td><td><code><pre> }</pre></code></td></tr><tr><td>237</td><td><code><pre> since := fails[0].CreatedAt.UTC().Sub(hits[0].CreatedAt.UTC())</pre></code></td></tr><tr><td>238</td><td><code><pre> return since</pre></code></td></tr><tr><td>239</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.Create">func Checkin.Create</div><div class="info"><a href="#s_fn_Checkin.Create">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>154</td><td><code><pre>func (c *Checkin) Create() (int64, error) {</pre></code></td></tr><tr><td>155</td><td><code><pre> c.ApiKey = utils.RandomString(7)</pre></code></td></tr><tr><td>156</td><td><code><pre> row := checkinDB().Create(&c)</pre></code></td></tr><tr><td>157</td><td><code><pre> c.Start()</pre></code></td></tr><tr><td>158</td><td><code><pre> go c.Routine()</pre></code></td></tr><tr><td>159</td><td><code><pre> if row.Error != nil {</pre></code></td></tr><tr class="miss"><td>160</td><td><code><pre> utils.Log(2, row.Error)</pre></code></td></tr><tr class="miss"><td>161</td><td><code><pre> return 0, row.Error</pre></code></td></tr><tr><td>162</td><td><code><pre> }</pre></code></td></tr><tr><td>163</td><td><code><pre> return c.Id, row.Error</pre></code></td></tr><tr><td>164</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.index">func Service.index</div><div class="info"><a href="#s_fn_Service.index">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>331</td><td><code><pre>func (s *Service) index() int {</pre></code></td></tr><tr><td>332</td><td><code><pre> for k, service := range CoreApp.Services {</pre></code></td></tr><tr><td>333</td><td><code><pre> if s.Id == service.(*Service).Id {</pre></code></td></tr><tr><td>334</td><td><code><pre> return k</pre></code></td></tr><tr><td>335</td><td><code><pre> }</pre></code></td></tr><tr><td>336</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>337</td><td><code><pre> return 0</pre></code></td></tr><tr><td>338</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_SelectService">func SelectService</div><div class="info"><a href="#s_fn_SelectService">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>49</td><td><code><pre>func SelectService(id int64) *Service {</pre></code></td></tr><tr><td>50</td><td><code><pre> for _, s := range CoreApp.Services {</pre></code></td></tr><tr><td>51</td><td><code><pre> if s.Select().Id == id {</pre></code></td></tr><tr><td>52</td><td><code><pre> return s.(*Service)</pre></code></td></tr><tr><td>53</td><td><code><pre> }</pre></code></td></tr><tr><td>54</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>55</td><td><code><pre> return nil</pre></code></td></tr><tr><td>56</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_user.Create">func user.Create</div><div class="info"><a href="#s_fn_user.Create">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go</code>:</p></div><table class="listing">
|
||
<tr><td>64</td><td><code><pre>func (u *user) Create() (int64, error) {</pre></code></td></tr><tr><td>65</td><td><code><pre> u.CreatedAt = time.Now()</pre></code></td></tr><tr><td>66</td><td><code><pre> u.Password = utils.HashPassword(u.Password)</pre></code></td></tr><tr><td>67</td><td><code><pre> u.ApiKey = utils.NewSHA1Hash(5)</pre></code></td></tr><tr><td>68</td><td><code><pre> u.ApiSecret = utils.NewSHA1Hash(10)</pre></code></td></tr><tr><td>69</td><td><code><pre> db := usersDB().Create(u)</pre></code></td></tr><tr><td>70</td><td><code><pre> if db.Error != nil {</pre></code></td></tr><tr class="miss"><td>71</td><td><code><pre> return 0, db.Error</pre></code></td></tr><tr><td>72</td><td><code><pre> }</pre></code></td></tr><tr><td>73</td><td><code><pre> if u.Id == 0 {</pre></code></td></tr><tr class="miss"><td>74</td><td><code><pre> utils.Log(3, fmt.Sprintf("Failed to create user %v. %v", u.Username, db.Error))</pre></code></td></tr><tr class="miss"><td>75</td><td><code><pre> return 0, db.Error</pre></code></td></tr><tr><td>76</td><td><code><pre> }</pre></code></td></tr><tr><td>77</td><td><code><pre> return u.Id, db.Error</pre></code></td></tr><tr><td>78</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.checkTcp">func Service.checkTcp</div><div class="info"><a href="#s_fn_Service.checkTcp">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go</code>:</p></div><table class="listing">
|
||
<tr><td>114</td><td><code><pre>func (s *Service) checkTcp(record bool) *Service {</pre></code></td></tr><tr><td>115</td><td><code><pre> dnsLookup, err := s.dnsCheck()</pre></code></td></tr><tr><td>116</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>117</td><td><code><pre> if record {</pre></code></td></tr><tr class="miss"><td>118</td><td><code><pre> recordFailure(s, fmt.Sprintf("Could not get IP address for TCP service %v, %v", s.Domain, err))</pre></code></td></tr><tr><td>119</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>120</td><td><code><pre> return s</pre></code></td></tr><tr><td>121</td><td><code><pre> }</pre></code></td></tr><tr><td>122</td><td><code><pre> s.PingTime = dnsLookup</pre></code></td></tr><tr><td>123</td><td><code><pre> t1 := time.Now()</pre></code></td></tr><tr><td>124</td><td><code><pre> domain := fmt.Sprintf("%v", s.Domain)</pre></code></td></tr><tr><td>125</td><td><code><pre> if s.Port != 0 {</pre></code></td></tr><tr><td>126</td><td><code><pre> domain = fmt.Sprintf("%v:%v", s.Domain, s.Port)</pre></code></td></tr><tr><td>127</td><td><code><pre> }</pre></code></td></tr><tr><td>128</td><td><code><pre> conn, err := net.DialTimeout(s.Type, domain, time.Duration(s.Timeout)*time.Second)</pre></code></td></tr><tr><td>129</td><td><code><pre> if err != nil {</pre></code></td></tr><tr><td>130</td><td><code><pre> if record {</pre></code></td></tr><tr class="miss"><td>131</td><td><code><pre> recordFailure(s, fmt.Sprintf("%v Dial Error %v", s.Type, err))</pre></code></td></tr><tr><td>132</td><td><code><pre> }</pre></code></td></tr><tr><td>133</td><td><code><pre> return s</pre></code></td></tr><tr><td>134</td><td><code><pre> }</pre></code></td></tr><tr><td>135</td><td><code><pre> if err := conn.Close(); err != nil {</pre></code></td></tr><tr class="miss"><td>136</td><td><code><pre> if record {</pre></code></td></tr><tr class="miss"><td>137</td><td><code><pre> recordFailure(s, fmt.Sprintf("TCP Socket Close Error %v", err))</pre></code></td></tr><tr><td>138</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>139</td><td><code><pre> return s</pre></code></td></tr><tr><td>140</td><td><code><pre> }</pre></code></td></tr><tr><td>141</td><td><code><pre> t2 := time.Now()</pre></code></td></tr><tr><td>142</td><td><code><pre> s.Latency = t2.Sub(t1).Seconds()</pre></code></td></tr><tr><td>143</td><td><code><pre> s.LastResponse = ""</pre></code></td></tr><tr><td>144</td><td><code><pre> if record {</pre></code></td></tr><tr><td>145</td><td><code><pre> recordSuccess(s)</pre></code></td></tr><tr><td>146</td><td><code><pre> }</pre></code></td></tr><tr><td>147</td><td><code><pre> return s</pre></code></td></tr><tr><td>148</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Core.SelectAllServices">func Core.SelectAllServices</div><div class="info"><a href="#s_fn_Core.SelectAllServices">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>82</td><td><code><pre>func (c *Core) SelectAllServices(start bool) ([]*Service, error) {</pre></code></td></tr><tr><td>83</td><td><code><pre> var services []*Service</pre></code></td></tr><tr><td>84</td><td><code><pre> db := servicesDB().Find(&services).Order("order_id desc")</pre></code></td></tr><tr><td>85</td><td><code><pre> if db.Error != nil {</pre></code></td></tr><tr class="miss"><td>86</td><td><code><pre> utils.Log(3, fmt.Sprintf("service error: %v", db.Error))</pre></code></td></tr><tr class="miss"><td>87</td><td><code><pre> return nil, db.Error</pre></code></td></tr><tr><td>88</td><td><code><pre> }</pre></code></td></tr><tr><td>89</td><td><code><pre> CoreApp.Services = nil</pre></code></td></tr><tr><td>90</td><td><code><pre> for _, service := range services {</pre></code></td></tr><tr><td>91</td><td><code><pre> if start {</pre></code></td></tr><tr class="miss"><td>92</td><td><code><pre> service.Start()</pre></code></td></tr><tr class="miss"><td>93</td><td><code><pre> service.CheckinProcess()</pre></code></td></tr><tr><td>94</td><td><code><pre> }</pre></code></td></tr><tr><td>95</td><td><code><pre> service.AllFailures()</pre></code></td></tr><tr><td>96</td><td><code><pre> CoreApp.Services = append(CoreApp.Services, service)</pre></code></td></tr><tr><td>97</td><td><code><pre> }</pre></code></td></tr><tr><td>98</td><td><code><pre> sort.Sort(ServiceOrder(CoreApp.Services))</pre></code></td></tr><tr><td>99</td><td><code><pre> return services, db.Error</pre></code></td></tr><tr><td>100</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DbConfig.Save">func DbConfig.Save</div><div class="info"><a href="#s_fn_DbConfig.Save">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>280</td><td><code><pre>func (db *DbConfig) Save() (*DbConfig, error) {</pre></code></td></tr><tr><td>281</td><td><code><pre> var err error</pre></code></td></tr><tr><td>282</td><td><code><pre> config, err := os.Create(utils.Directory + "/config.yml")</pre></code></td></tr><tr><td>283</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>284</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr class="miss"><td>285</td><td><code><pre> return nil, err</pre></code></td></tr><tr><td>286</td><td><code><pre> }</pre></code></td></tr><tr><td>287</td><td><code><pre> db.ApiKey = utils.NewSHA1Hash(16)</pre></code></td></tr><tr><td>288</td><td><code><pre> db.ApiSecret = utils.NewSHA1Hash(16)</pre></code></td></tr><tr><td>289</td><td><code><pre> data, err := yaml.Marshal(db)</pre></code></td></tr><tr><td>290</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>291</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr class="miss"><td>292</td><td><code><pre> return nil, err</pre></code></td></tr><tr><td>293</td><td><code><pre> }</pre></code></td></tr><tr><td>294</td><td><code><pre> config.WriteString(string(data))</pre></code></td></tr><tr><td>295</td><td><code><pre> defer config.Close()</pre></code></td></tr><tr><td>296</td><td><code><pre> return db, err</pre></code></td></tr><tr><td>297</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_AuthUser">func AuthUser</div><div class="info"><a href="#s_fn_AuthUser">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/users.go</code>:</p></div><table class="listing">
|
||
<tr><td>92</td><td><code><pre>func AuthUser(username, password string) (*user, bool) {</pre></code></td></tr><tr><td>93</td><td><code><pre> user, err := SelectUsername(username)</pre></code></td></tr><tr><td>94</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>95</td><td><code><pre> utils.Log(2, err)</pre></code></td></tr><tr class="miss"><td>96</td><td><code><pre> return nil, false</pre></code></td></tr><tr><td>97</td><td><code><pre> }</pre></code></td></tr><tr><td>98</td><td><code><pre> if CheckHash(password, user.Password) {</pre></code></td></tr><tr><td>99</td><td><code><pre> return user, true</pre></code></td></tr><tr><td>100</td><td><code><pre> }</pre></code></td></tr><tr><td>101</td><td><code><pre> return nil, false</pre></code></td></tr><tr><td>102</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.CreateFailure">func Service.CreateFailure</div><div class="info"><a href="#s_fn_Service.CreateFailure">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go</code>:</p></div><table class="listing">
|
||
<tr><td>32</td><td><code><pre>func (s *Service) CreateFailure(f *types.Failure) (int64, error) {</pre></code></td></tr><tr><td>33</td><td><code><pre> f.Service = s.Id</pre></code></td></tr><tr><td>34</td><td><code><pre> s.Failures = append(s.Failures, f)</pre></code></td></tr><tr><td>35</td><td><code><pre> row := failuresDB().Create(f)</pre></code></td></tr><tr><td>36</td><td><code><pre> if row.Error != nil {</pre></code></td></tr><tr class="miss"><td>37</td><td><code><pre> utils.Log(3, row.Error)</pre></code></td></tr><tr class="miss"><td>38</td><td><code><pre> return 0, row.Error</pre></code></td></tr><tr><td>39</td><td><code><pre> }</pre></code></td></tr><tr><td>40</td><td><code><pre> return f.Id, row.Error</pre></code></td></tr><tr><td>41</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_SelectCore">func SelectCore</div><div class="info"><a href="#s_fn_SelectCore">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>136</td><td><code><pre>func SelectCore() (*Core, error) {</pre></code></td></tr><tr><td>137</td><td><code><pre> if DbSession == nil {</pre></code></td></tr><tr class="miss"><td>138</td><td><code><pre> return nil, errors.New("database has not been initiated yet.")</pre></code></td></tr><tr><td>139</td><td><code><pre> }</pre></code></td></tr><tr><td>140</td><td><code><pre> exists := DbSession.HasTable("core")</pre></code></td></tr><tr><td>141</td><td><code><pre> if !exists {</pre></code></td></tr><tr class="miss"><td>142</td><td><code><pre> return nil, errors.New("core database has not been setup yet.")</pre></code></td></tr><tr><td>143</td><td><code><pre> }</pre></code></td></tr><tr><td>144</td><td><code><pre> db := coreDB().First(&CoreApp)</pre></code></td></tr><tr><td>145</td><td><code><pre> if db.Error != nil {</pre></code></td></tr><tr class="miss"><td>146</td><td><code><pre> return nil, db.Error</pre></code></td></tr><tr><td>147</td><td><code><pre> }</pre></code></td></tr><tr><td>148</td><td><code><pre> CoreApp.DbConnection = Configs.DbConn</pre></code></td></tr><tr><td>149</td><td><code><pre> CoreApp.Version = VERSION</pre></code></td></tr><tr><td>150</td><td><code><pre> if os.Getenv("USE_CDN") == "true" {</pre></code></td></tr><tr class="miss"><td>151</td><td><code><pre> CoreApp.UseCdn = true</pre></code></td></tr><tr><td>152</td><td><code><pre> }</pre></code></td></tr><tr><td>153</td><td><code><pre> return CoreApp, db.Error</pre></code></td></tr><tr><td>154</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.checkHttp">func Service.checkHttp</div><div class="info"><a href="#s_fn_Service.checkHttp">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go</code>:</p></div><table class="listing">
|
||
<tr><td>151</td><td><code><pre>func (s *Service) checkHttp(record bool) *Service {</pre></code></td></tr><tr><td>152</td><td><code><pre> dnsLookup, err := s.dnsCheck()</pre></code></td></tr><tr><td>153</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>154</td><td><code><pre> if record {</pre></code></td></tr><tr class="miss"><td>155</td><td><code><pre> recordFailure(s, fmt.Sprintf("Could not get IP address for domain %v, %v", s.Domain, err))</pre></code></td></tr><tr><td>156</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>157</td><td><code><pre> return s</pre></code></td></tr><tr><td>158</td><td><code><pre> }</pre></code></td></tr><tr><td>159</td><td><code><pre> s.PingTime = dnsLookup</pre></code></td></tr><tr><td>160</td><td><code><pre> t1 := time.Now()</pre></code></td></tr><tr><td>161</td><td><code><pre> timeout := time.Duration(s.Timeout)</pre></code></td></tr><tr><td>162</td><td><code><pre> client := http.Client{</pre></code></td></tr><tr><td>163</td><td><code><pre> Timeout: timeout * time.Second,</pre></code></td></tr><tr><td>164</td><td><code><pre> }</pre></code></td></tr><tr><td>165</td><td><code><pre></pre></code></td></tr><tr><td>166</td><td><code><pre> var response *http.Response</pre></code></td></tr><tr><td>167</td><td><code><pre> if s.Method == "POST" {</pre></code></td></tr><tr><td>168</td><td><code><pre> response, err = client.Post(s.Domain, "application/json", bytes.NewBuffer([]byte(s.PostData)))</pre></code></td></tr><tr><td>169</td><td><code><pre> } else {</pre></code></td></tr><tr><td>170</td><td><code><pre> response, err = client.Get(s.Domain)</pre></code></td></tr><tr><td>171</td><td><code><pre> }</pre></code></td></tr><tr><td>172</td><td><code><pre> if err != nil {</pre></code></td></tr><tr><td>173</td><td><code><pre> if record {</pre></code></td></tr><tr class="miss"><td>174</td><td><code><pre> recordFailure(s, fmt.Sprintf("HTTP Error %v", err))</pre></code></td></tr><tr><td>175</td><td><code><pre> }</pre></code></td></tr><tr><td>176</td><td><code><pre> return s</pre></code></td></tr><tr><td>177</td><td><code><pre> }</pre></code></td></tr><tr><td>178</td><td><code><pre> response.Header.Set("Connection", "close")</pre></code></td></tr><tr><td>179</td><td><code><pre> response.Header.Set("user-Agent", "StatupMonitor")</pre></code></td></tr><tr><td>180</td><td><code><pre> t2 := time.Now()</pre></code></td></tr><tr><td>181</td><td><code><pre> s.Latency = t2.Sub(t1).Seconds()</pre></code></td></tr><tr><td>182</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>183</td><td><code><pre> if record {</pre></code></td></tr><tr class="miss"><td>184</td><td><code><pre> recordFailure(s, fmt.Sprintf("HTTP Error %v", err))</pre></code></td></tr><tr><td>185</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>186</td><td><code><pre> return s</pre></code></td></tr><tr><td>187</td><td><code><pre> }</pre></code></td></tr><tr><td>188</td><td><code><pre> defer response.Body.Close()</pre></code></td></tr><tr><td>189</td><td><code><pre> contents, err := ioutil.ReadAll(response.Body)</pre></code></td></tr><tr><td>190</td><td><code><pre> s.LastResponse = string(contents)</pre></code></td></tr><tr><td>191</td><td><code><pre> s.LastStatusCode = response.StatusCode</pre></code></td></tr><tr><td>192</td><td><code><pre></pre></code></td></tr><tr><td>193</td><td><code><pre> if s.Expected != "" {</pre></code></td></tr><tr><td>194</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>195</td><td><code><pre> utils.Log(2, err)</pre></code></td></tr><tr><td>196</td><td><code><pre> }</pre></code></td></tr><tr><td>197</td><td><code><pre> match, err := regexp.MatchString(s.Expected, string(contents))</pre></code></td></tr><tr><td>198</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>199</td><td><code><pre> utils.Log(2, err)</pre></code></td></tr><tr><td>200</td><td><code><pre> }</pre></code></td></tr><tr><td>201</td><td><code><pre> if !match {</pre></code></td></tr><tr class="miss"><td>202</td><td><code><pre> if record {</pre></code></td></tr><tr class="miss"><td>203</td><td><code><pre> recordFailure(s, fmt.Sprintf("HTTP Response Body did not match '%v'", s.Expected))</pre></code></td></tr><tr><td>204</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>205</td><td><code><pre> return s</pre></code></td></tr><tr><td>206</td><td><code><pre> }</pre></code></td></tr><tr><td>207</td><td><code><pre> }</pre></code></td></tr><tr><td>208</td><td><code><pre> if s.ExpectedStatus != response.StatusCode {</pre></code></td></tr><tr class="miss"><td>209</td><td><code><pre> if record {</pre></code></td></tr><tr class="miss"><td>210</td><td><code><pre> recordFailure(s, fmt.Sprintf("HTTP Status Code %v did not match %v", response.StatusCode, s.ExpectedStatus))</pre></code></td></tr><tr><td>211</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>212</td><td><code><pre> return s</pre></code></td></tr><tr><td>213</td><td><code><pre> }</pre></code></td></tr><tr><td>214</td><td><code><pre> s.Online = true</pre></code></td></tr><tr><td>215</td><td><code><pre> if record {</pre></code></td></tr><tr><td>216</td><td><code><pre> recordSuccess(s)</pre></code></td></tr><tr><td>217</td><td><code><pre> }</pre></code></td></tr><tr><td>218</td><td><code><pre> return s</pre></code></td></tr><tr><td>219</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DbConfig.MigrateDatabase">func DbConfig.MigrateDatabase</div><div class="info"><a href="#s_fn_DbConfig.MigrateDatabase">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>353</td><td><code><pre>func (db *DbConfig) MigrateDatabase() error {</pre></code></td></tr><tr><td>354</td><td><code><pre> utils.Log(1, "Migrating Database Tables...")</pre></code></td></tr><tr><td>355</td><td><code><pre> tx := DbSession.Begin()</pre></code></td></tr><tr><td>356</td><td><code><pre> defer func() {</pre></code></td></tr><tr><td>357</td><td><code><pre> if r := recover(); r != nil {</pre></code></td></tr><tr><td>358</td><td><code><pre> tx.Rollback()</pre></code></td></tr><tr><td>359</td><td><code><pre> }</pre></code></td></tr><tr><td>360</td><td><code><pre> }()</pre></code></td></tr><tr><td>361</td><td><code><pre> if tx.Error != nil {</pre></code></td></tr><tr class="miss"><td>362</td><td><code><pre> return tx.Error</pre></code></td></tr><tr><td>363</td><td><code><pre> }</pre></code></td></tr><tr><td>364</td><td><code><pre> tx = tx.AutoMigrate(&types.Service{}, &types.User{}, &types.Hit{}, &types.Failure{}, &types.Checkin{}, &types.CheckinHit{}, &notifier.Notification{}).Table("core").AutoMigrate(&types.Core{})</pre></code></td></tr><tr><td>365</td><td><code><pre> if tx.Error != nil {</pre></code></td></tr><tr class="miss"><td>366</td><td><code><pre> tx.Rollback()</pre></code></td></tr><tr class="miss"><td>367</td><td><code><pre> utils.Log(3, fmt.Sprintf("Statup Database could not be migrated: %v", tx.Error))</pre></code></td></tr><tr class="miss"><td>368</td><td><code><pre> return tx.Error</pre></code></td></tr><tr><td>369</td><td><code><pre> }</pre></code></td></tr><tr><td>370</td><td><code><pre> utils.Log(1, "Statup Database Migrated")</pre></code></td></tr><tr><td>371</td><td><code><pre> return tx.Commit().Error</pre></code></td></tr><tr><td>372</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_LoadConfigFile">func LoadConfigFile</div><div class="info"><a href="#s_fn_LoadConfigFile">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/configs.go</code>:</p></div><table class="listing">
|
||
<tr><td>34</td><td><code><pre>func LoadConfigFile(directory string) (*DbConfig, error) {</pre></code></td></tr><tr><td>35</td><td><code><pre> var configs *DbConfig</pre></code></td></tr><tr><td>36</td><td><code><pre> if os.Getenv("DB_CONN") != "" {</pre></code></td></tr><tr class="miss"><td>37</td><td><code><pre> utils.Log(1, "DB_CONN environment variable was found, waiting for database...")</pre></code></td></tr><tr class="miss"><td>38</td><td><code><pre> return LoadUsingEnv()</pre></code></td></tr><tr><td>39</td><td><code><pre> }</pre></code></td></tr><tr><td>40</td><td><code><pre> file, err := ioutil.ReadFile(directory + "/config.yml")</pre></code></td></tr><tr><td>41</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>42</td><td><code><pre> return nil, errors.New("config.yml file not found at " + directory + "/config.yml - starting in setup mode")</pre></code></td></tr><tr><td>43</td><td><code><pre> }</pre></code></td></tr><tr><td>44</td><td><code><pre> err = yaml.Unmarshal(file, &configs)</pre></code></td></tr><tr><td>45</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>46</td><td><code><pre> return nil, err</pre></code></td></tr><tr><td>47</td><td><code><pre> }</pre></code></td></tr><tr><td>48</td><td><code><pre> Configs = configs</pre></code></td></tr><tr><td>49</td><td><code><pre> return Configs, err</pre></code></td></tr><tr><td>50</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_user.BeforeCreate">func user.BeforeCreate</div><div class="info"><a href="#s_fn_user.BeforeCreate">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>147</td><td><code><pre>func (u *user) BeforeCreate() (err error) {</pre></code></td></tr><tr><td>148</td><td><code><pre> if u.CreatedAt.IsZero() {</pre></code></td></tr><tr class="miss"><td>149</td><td><code><pre> u.CreatedAt = time.Now().UTC()</pre></code></td></tr><tr><td>150</td><td><code><pre> }</pre></code></td></tr><tr><td>151</td><td><code><pre> return</pre></code></td></tr><tr><td>152</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.BeforeCreate">func Service.BeforeCreate</div><div class="info"><a href="#s_fn_Service.BeforeCreate">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>155</td><td><code><pre>func (s *Service) BeforeCreate() (err error) {</pre></code></td></tr><tr><td>156</td><td><code><pre> if s.CreatedAt.IsZero() {</pre></code></td></tr><tr class="miss"><td>157</td><td><code><pre> s.CreatedAt = time.Now().UTC()</pre></code></td></tr><tr><td>158</td><td><code><pre> }</pre></code></td></tr><tr><td>159</td><td><code><pre> return</pre></code></td></tr><tr><td>160</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_checkinHit.BeforeCreate">func checkinHit.BeforeCreate</div><div class="info"><a href="#s_fn_checkinHit.BeforeCreate">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>171</td><td><code><pre>func (c *checkinHit) BeforeCreate() (err error) {</pre></code></td></tr><tr><td>172</td><td><code><pre> if c.CreatedAt.IsZero() {</pre></code></td></tr><tr class="miss"><td>173</td><td><code><pre> c.CreatedAt = time.Now().UTC()</pre></code></td></tr><tr><td>174</td><td><code><pre> }</pre></code></td></tr><tr><td>175</td><td><code><pre> return</pre></code></td></tr><tr><td>176</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DbConfig.Connect">func DbConfig.Connect</div><div class="info"><a href="#s_fn_DbConfig.Connect">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>195</td><td><code><pre>func (db *DbConfig) Connect(retry bool, location string) error {</pre></code></td></tr><tr><td>196</td><td><code><pre> if DbSession != nil {</pre></code></td></tr><tr><td>197</td><td><code><pre> return nil</pre></code></td></tr><tr><td>198</td><td><code><pre> }</pre></code></td></tr><tr><td>199</td><td><code><pre> var conn, dbType string</pre></code></td></tr><tr><td>200</td><td><code><pre> var err error</pre></code></td></tr><tr><td>201</td><td><code><pre> dbType = Configs.DbConn</pre></code></td></tr><tr><td>202</td><td><code><pre> if Configs.DbPort == 0 {</pre></code></td></tr><tr><td>203</td><td><code><pre> Configs.DbPort = DefaultPort(dbType)</pre></code></td></tr><tr><td>204</td><td><code><pre> }</pre></code></td></tr><tr><td>205</td><td><code><pre> switch dbType {</pre></code></td></tr><tr><td>206</td><td><code><pre> case "sqlite":</pre></code></td></tr><tr><td>207</td><td><code><pre> conn = location + "/statup.db"</pre></code></td></tr><tr><td>208</td><td><code><pre> dbType = "sqlite3"</pre></code></td></tr><tr><td>209</td><td><code><pre> case "mysql":</pre></code></td></tr><tr class="miss"><td>210</td><td><code><pre> host := fmt.Sprintf("%v:%v", Configs.DbHost, Configs.DbPort)</pre></code></td></tr><tr class="miss"><td>211</td><td><code><pre> conn = fmt.Sprintf("%v:%v@tcp(%v)/%v?charset=utf8&parseTime=True&loc=UTC", Configs.DbUser, Configs.DbPass, host, Configs.DbData)</pre></code></td></tr><tr><td>212</td><td><code><pre> case "postgres":</pre></code></td></tr><tr class="miss"><td>213</td><td><code><pre> 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)</pre></code></td></tr><tr><td>214</td><td><code><pre> case "mssql":</pre></code></td></tr><tr class="miss"><td>215</td><td><code><pre> host := fmt.Sprintf("%v:%v", Configs.DbHost, Configs.DbPort)</pre></code></td></tr><tr class="miss"><td>216</td><td><code><pre> conn = fmt.Sprintf("sqlserver://%v:%v@%v?database=%v", Configs.DbUser, Configs.DbPass, host, Configs.DbData)</pre></code></td></tr><tr><td>217</td><td><code><pre> }</pre></code></td></tr><tr><td>218</td><td><code><pre> dbSession, err := gorm.Open(dbType, conn)</pre></code></td></tr><tr><td>219</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>220</td><td><code><pre> if retry {</pre></code></td></tr><tr class="miss"><td>221</td><td><code><pre> utils.Log(1, fmt.Sprintf("Database connection to '%v' is not available, trying again in 5 seconds...", conn))</pre></code></td></tr><tr class="miss"><td>222</td><td><code><pre> return db.waitForDb()</pre></code></td></tr><tr><td>223</td><td><code><pre> } else {</pre></code></td></tr><tr class="miss"><td>224</td><td><code><pre> return err</pre></code></td></tr><tr><td>225</td><td><code><pre> }</pre></code></td></tr><tr><td>226</td><td><code><pre> }</pre></code></td></tr><tr><td>227</td><td><code><pre> err = dbSession.DB().Ping()</pre></code></td></tr><tr><td>228</td><td><code><pre> if err == nil {</pre></code></td></tr><tr><td>229</td><td><code><pre> DbSession = dbSession</pre></code></td></tr><tr><td>230</td><td><code><pre> utils.Log(1, fmt.Sprintf("Database %v connection '%v@%v' at %v was successful.", dbType, Configs.DbUser, Configs.DbHost, Configs.DbData))</pre></code></td></tr><tr><td>231</td><td><code><pre> }</pre></code></td></tr><tr><td>232</td><td><code><pre> return err</pre></code></td></tr><tr><td>233</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.CreateHit">func Service.CreateHit</div><div class="info"><a href="#s_fn_Service.CreateHit">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/hits.go</code>:</p></div><table class="listing">
|
||
<tr><td>29</td><td><code><pre>func (s *Service) CreateHit(h *types.Hit) (int64, error) {</pre></code></td></tr><tr><td>30</td><td><code><pre> db := hitsDB().Create(&h)</pre></code></td></tr><tr><td>31</td><td><code><pre> if db.Error != nil {</pre></code></td></tr><tr class="miss"><td>32</td><td><code><pre> utils.Log(2, db.Error)</pre></code></td></tr><tr class="miss"><td>33</td><td><code><pre> return 0, db.Error</pre></code></td></tr><tr><td>34</td><td><code><pre> }</pre></code></td></tr><tr><td>35</td><td><code><pre> return h.Id, db.Error</pre></code></td></tr><tr><td>36</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.Update">func Checkin.Update</div><div class="info"><a href="#s_fn_Checkin.Update">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>167</td><td><code><pre>func (c *Checkin) Update() (int64, error) {</pre></code></td></tr><tr><td>168</td><td><code><pre> row := checkinDB().Update(c)</pre></code></td></tr><tr><td>169</td><td><code><pre> if row.Error != nil {</pre></code></td></tr><tr class="miss"><td>170</td><td><code><pre> utils.Log(2, row.Error)</pre></code></td></tr><tr class="miss"><td>171</td><td><code><pre> return 0, row.Error</pre></code></td></tr><tr><td>172</td><td><code><pre> }</pre></code></td></tr><tr><td>173</td><td><code><pre> return c.Id, row.Error</pre></code></td></tr><tr><td>174</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_checkinHit.Create">func checkinHit.Create</div><div class="info"><a href="#s_fn_checkinHit.Create">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>177</td><td><code><pre>func (c *checkinHit) Create() (int64, error) {</pre></code></td></tr><tr><td>178</td><td><code><pre> if c.CreatedAt.IsZero() {</pre></code></td></tr><tr class="miss"><td>179</td><td><code><pre> c.CreatedAt = time.Now()</pre></code></td></tr><tr><td>180</td><td><code><pre> }</pre></code></td></tr><tr><td>181</td><td><code><pre> row := checkinHitsDB().Create(c)</pre></code></td></tr><tr><td>182</td><td><code><pre> if row.Error != nil {</pre></code></td></tr><tr class="miss"><td>183</td><td><code><pre> utils.Log(2, row.Error)</pre></code></td></tr><tr class="miss"><td>184</td><td><code><pre> return 0, row.Error</pre></code></td></tr><tr><td>185</td><td><code><pre> }</pre></code></td></tr><tr><td>186</td><td><code><pre> return c.Id, row.Error</pre></code></td></tr><tr><td>187</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.SmallText">func Service.SmallText</div><div class="info"><a href="#s_fn_Service.SmallText">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>178</td><td><code><pre>func (s *Service) SmallText() string {</pre></code></td></tr><tr><td>179</td><td><code><pre> last := s.LimitedFailures()</pre></code></td></tr><tr><td>180</td><td><code><pre> hits, _ := s.LimitedHits()</pre></code></td></tr><tr><td>181</td><td><code><pre> zone := CoreApp.Timezone</pre></code></td></tr><tr><td>182</td><td><code><pre> if s.Online {</pre></code></td></tr><tr><td>183</td><td><code><pre> if len(last) == 0 {</pre></code></td></tr><tr><td>184</td><td><code><pre> return fmt.Sprintf("Online since %v", utils.Timezoner(s.CreatedAt, zone).Format("Monday 3:04:05PM, Jan _2 2006"))</pre></code></td></tr><tr><td>185</td><td><code><pre> } else {</pre></code></td></tr><tr class="miss"><td>186</td><td><code><pre> return fmt.Sprintf("Online, last failure was %v", utils.Timezoner(hits[0].CreatedAt, zone).Format("Monday 3:04:05PM, Jan _2 2006"))</pre></code></td></tr><tr><td>187</td><td><code><pre> }</pre></code></td></tr><tr><td>188</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>189</td><td><code><pre> if len(last) > 0 {</pre></code></td></tr><tr class="miss"><td>190</td><td><code><pre> lastFailure := s.lastFailure()</pre></code></td></tr><tr class="miss"><td>191</td><td><code><pre> got, _ := timeago.TimeAgoWithTime(time.Now().Add(s.Downtime()), time.Now())</pre></code></td></tr><tr class="miss"><td>192</td><td><code><pre> return fmt.Sprintf("Reported offline %v, %v", got, lastFailure.ParseError())</pre></code></td></tr><tr><td>193</td><td><code><pre> } else {</pre></code></td></tr><tr class="miss"><td>194</td><td><code><pre> return fmt.Sprintf("%v is currently offline", s.Name)</pre></code></td></tr><tr><td>195</td><td><code><pre> }</pre></code></td></tr><tr><td>196</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_InsertNotifierDB">func InsertNotifierDB</div><div class="info"><a href="#s_fn_InsertNotifierDB">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>70</td><td><code><pre>func InsertNotifierDB() error {</pre></code></td></tr><tr><td>71</td><td><code><pre> if DbSession == nil {</pre></code></td></tr><tr class="miss"><td>72</td><td><code><pre> err := Configs.Connect(false, utils.Directory)</pre></code></td></tr><tr class="miss"><td>73</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>74</td><td><code><pre> return errors.New("database connection has not been created")</pre></code></td></tr><tr><td>75</td><td><code><pre> }</pre></code></td></tr><tr><td>76</td><td><code><pre> }</pre></code></td></tr><tr><td>77</td><td><code><pre> notifier.SetDB(DbSession)</pre></code></td></tr><tr><td>78</td><td><code><pre> return nil</pre></code></td></tr><tr><td>79</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@356:8">func @356:8</div><div class="info"><a href="#s_fn_@356:8">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>356</td><td><code><pre>func() {</pre></code></td></tr><tr><td>357</td><td><code><pre> if r := recover(); r != nil {</pre></code></td></tr><tr class="miss"><td>358</td><td><code><pre> tx.Rollback()</pre></code></td></tr><tr><td>359</td><td><code><pre> }</pre></code></td></tr><tr><td>360</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DefaultPort">func DefaultPort</div><div class="info"><a href="#s_fn_DefaultPort">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/configs.go</code>:</p></div><table class="listing">
|
||
<tr><td>108</td><td><code><pre>func DefaultPort(db string) int64 {</pre></code></td></tr><tr><td>109</td><td><code><pre> switch db {</pre></code></td></tr><tr><td>110</td><td><code><pre> case "mysql":</pre></code></td></tr><tr class="miss"><td>111</td><td><code><pre> return 3306</pre></code></td></tr><tr><td>112</td><td><code><pre> case "postgres":</pre></code></td></tr><tr class="miss"><td>113</td><td><code><pre> return 5432</pre></code></td></tr><tr><td>114</td><td><code><pre> case "mssql":</pre></code></td></tr><tr class="miss"><td>115</td><td><code><pre> return 1433</pre></code></td></tr><tr><td>116</td><td><code><pre> default:</pre></code></td></tr><tr><td>117</td><td><code><pre> return 0</pre></code></td></tr><tr><td>118</td><td><code><pre> }</pre></code></td></tr><tr><td>119</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_LoadUsingEnv">func LoadUsingEnv</div><div class="info"><a href="#s_fn_LoadUsingEnv">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/configs.go</code>:</p></div><table class="listing">
|
||
<tr><td>53</td><td><code><pre>func LoadUsingEnv() (*DbConfig, error) {</pre></code></td></tr><tr class="miss"><td>54</td><td><code><pre> Configs = new(DbConfig)</pre></code></td></tr><tr class="miss"><td>55</td><td><code><pre> if os.Getenv("DB_CONN") == "" {</pre></code></td></tr><tr class="miss"><td>56</td><td><code><pre> return nil, errors.New("Missing DB_CONN environment variable")</pre></code></td></tr><tr><td>57</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>58</td><td><code><pre> if os.Getenv("DB_HOST") == "" {</pre></code></td></tr><tr class="miss"><td>59</td><td><code><pre> return nil, errors.New("Missing DB_HOST environment variable")</pre></code></td></tr><tr><td>60</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>61</td><td><code><pre> if os.Getenv("DB_USER") == "" {</pre></code></td></tr><tr class="miss"><td>62</td><td><code><pre> return nil, errors.New("Missing DB_USER environment variable")</pre></code></td></tr><tr><td>63</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>64</td><td><code><pre> if os.Getenv("DB_PASS") == "" {</pre></code></td></tr><tr class="miss"><td>65</td><td><code><pre> return nil, errors.New("Missing DB_PASS environment variable")</pre></code></td></tr><tr><td>66</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>67</td><td><code><pre> if os.Getenv("DB_DATABASE") == "" {</pre></code></td></tr><tr class="miss"><td>68</td><td><code><pre> return nil, errors.New("Missing DB_DATABASE environment variable")</pre></code></td></tr><tr><td>69</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>70</td><td><code><pre> Configs = EnvToConfig()</pre></code></td></tr><tr class="miss"><td>71</td><td><code><pre> CoreApp.Name = os.Getenv("NAME")</pre></code></td></tr><tr class="miss"><td>72</td><td><code><pre> CoreApp.Domain = os.Getenv("DOMAIN")</pre></code></td></tr><tr class="miss"><td>73</td><td><code><pre> CoreApp.DbConnection = Configs.DbConn</pre></code></td></tr><tr class="miss"><td>74</td><td><code><pre> if os.Getenv("USE_CDN") == "true" {</pre></code></td></tr><tr class="miss"><td>75</td><td><code><pre> CoreApp.UseCdn = true</pre></code></td></tr><tr><td>76</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>77</td><td><code><pre> err := Configs.Connect(true, utils.Directory)</pre></code></td></tr><tr class="miss"><td>78</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>79</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr class="miss"><td>80</td><td><code><pre> return nil, err</pre></code></td></tr><tr><td>81</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>82</td><td><code><pre> Configs.Save()</pre></code></td></tr><tr class="miss"><td>83</td><td><code><pre> exists := DbSession.HasTable("core")</pre></code></td></tr><tr class="miss"><td>84</td><td><code><pre> if !exists {</pre></code></td></tr><tr class="miss"><td>85</td><td><code><pre> utils.Log(1, fmt.Sprintf("Core database does not exist, creating now!"))</pre></code></td></tr><tr class="miss"><td>86</td><td><code><pre> Configs.DropDatabase()</pre></code></td></tr><tr class="miss"><td>87</td><td><code><pre> Configs.CreateDatabase()</pre></code></td></tr><tr class="miss"><td>88</td><td><code><pre> CoreApp, err = Configs.InsertCore()</pre></code></td></tr><tr class="miss"><td>89</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>90</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr><td>91</td><td><code><pre> }</pre></code></td></tr><tr><td>92</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>93</td><td><code><pre> admin := ReturnUser(&types.User{</pre></code></td></tr><tr><td>94</td><td><code><pre> Username: "admin",</pre></code></td></tr><tr><td>95</td><td><code><pre> Password: "admin",</pre></code></td></tr><tr><td>96</td><td><code><pre> Email: "info@admin.com",</pre></code></td></tr><tr><td>97</td><td><code><pre> Admin: true,</pre></code></td></tr><tr><td>98</td><td><code><pre> })</pre></code></td></tr><tr class="miss"><td>99</td><td><code><pre> _, err := admin.Create()</pre></code></td></tr><tr><td>100</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>101</td><td><code><pre> SampleData()</pre></code></td></tr><tr class="miss"><td>102</td><td><code><pre> return Configs, err</pre></code></td></tr><tr><td>103</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>104</td><td><code><pre> return Configs, nil</pre></code></td></tr><tr><td>105</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_failure.ParseError">func failure.ParseError</div><div class="info"><a href="#s_fn_failure.ParseError">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go</code>:</p></div><table class="listing">
|
||
<tr><td>132</td><td><code><pre>func (f *failure) ParseError() string {</pre></code></td></tr><tr class="miss"><td>133</td><td><code><pre> if f.Method == "checkin" {</pre></code></td></tr><tr class="miss"><td>134</td><td><code><pre> return fmt.Sprintf("Checkin is Offline")</pre></code></td></tr><tr><td>135</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>136</td><td><code><pre> err := strings.Contains(f.Issue, "connection reset by peer")</pre></code></td></tr><tr class="miss"><td>137</td><td><code><pre> if err {</pre></code></td></tr><tr class="miss"><td>138</td><td><code><pre> return fmt.Sprintf("Connection Reset")</pre></code></td></tr><tr><td>139</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>140</td><td><code><pre> err = strings.Contains(f.Issue, "operation timed out")</pre></code></td></tr><tr class="miss"><td>141</td><td><code><pre> if err {</pre></code></td></tr><tr class="miss"><td>142</td><td><code><pre> return fmt.Sprintf("HTTP Request Timed Out")</pre></code></td></tr><tr><td>143</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>144</td><td><code><pre> err = strings.Contains(f.Issue, "x509: certificate is valid")</pre></code></td></tr><tr class="miss"><td>145</td><td><code><pre> if err {</pre></code></td></tr><tr class="miss"><td>146</td><td><code><pre> return fmt.Sprintf("SSL Certificate invalid")</pre></code></td></tr><tr><td>147</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>148</td><td><code><pre> err = strings.Contains(f.Issue, "Client.Timeout exceeded while awaiting headers")</pre></code></td></tr><tr class="miss"><td>149</td><td><code><pre> if err {</pre></code></td></tr><tr class="miss"><td>150</td><td><code><pre> return fmt.Sprintf("Connection Timed Out")</pre></code></td></tr><tr><td>151</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>152</td><td><code><pre> err = strings.Contains(f.Issue, "no such host")</pre></code></td></tr><tr class="miss"><td>153</td><td><code><pre> if err {</pre></code></td></tr><tr class="miss"><td>154</td><td><code><pre> return fmt.Sprintf("Domain is offline or not found")</pre></code></td></tr><tr><td>155</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>156</td><td><code><pre> err = strings.Contains(f.Issue, "HTTP Status Code")</pre></code></td></tr><tr class="miss"><td>157</td><td><code><pre> if err {</pre></code></td></tr><tr class="miss"><td>158</td><td><code><pre> return fmt.Sprintf("Incorrect HTTP Status Code")</pre></code></td></tr><tr><td>159</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>160</td><td><code><pre> err = strings.Contains(f.Issue, "connection refused")</pre></code></td></tr><tr class="miss"><td>161</td><td><code><pre> if err {</pre></code></td></tr><tr class="miss"><td>162</td><td><code><pre> return fmt.Sprintf("Connection Failed")</pre></code></td></tr><tr><td>163</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>164</td><td><code><pre> err = strings.Contains(f.Issue, "can't assign requested address")</pre></code></td></tr><tr class="miss"><td>165</td><td><code><pre> if err {</pre></code></td></tr><tr class="miss"><td>166</td><td><code><pre> return fmt.Sprintf("Unable to Request Address")</pre></code></td></tr><tr><td>167</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>168</td><td><code><pre> err = strings.Contains(f.Issue, "no route to host")</pre></code></td></tr><tr class="miss"><td>169</td><td><code><pre> if err {</pre></code></td></tr><tr class="miss"><td>170</td><td><code><pre> return fmt.Sprintf("Domain is offline or not found")</pre></code></td></tr><tr><td>171</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>172</td><td><code><pre> return f.Issue</pre></code></td></tr><tr><td>173</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_ExportIndexHTML">func ExportIndexHTML</div><div class="info"><a href="#s_fn_ExportIndexHTML">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go</code>:</p></div><table class="listing">
|
||
<tr><td>31</td><td><code><pre>func ExportIndexHTML() string {</pre></code></td></tr><tr class="miss"><td>32</td><td><code><pre> source.Assets()</pre></code></td></tr><tr class="miss"><td>33</td><td><code><pre> injectDatabase()</pre></code></td></tr><tr class="miss"><td>34</td><td><code><pre> CoreApp.SelectAllServices(false)</pre></code></td></tr><tr class="miss"><td>35</td><td><code><pre> CoreApp.UseCdn = true</pre></code></td></tr><tr class="miss"><td>36</td><td><code><pre> for _, srv := range CoreApp.Services {</pre></code></td></tr><tr class="miss"><td>37</td><td><code><pre> service := srv.(*Service)</pre></code></td></tr><tr class="miss"><td>38</td><td><code><pre> service.Check(true)</pre></code></td></tr><tr class="miss"><td>39</td><td><code><pre> fmt.Println(service.Name, service.Online, service.Latency)</pre></code></td></tr><tr><td>40</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>41</td><td><code><pre> nav, _ := source.TmplBox.String("nav.html")</pre></code></td></tr><tr class="miss"><td>42</td><td><code><pre> footer, _ := source.TmplBox.String("footer.html")</pre></code></td></tr><tr class="miss"><td>43</td><td><code><pre> render, err := source.TmplBox.String("index.html")</pre></code></td></tr><tr class="miss"><td>44</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>45</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr><td>46</td><td><code><pre> }</pre></code></td></tr><tr><td>47</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>48</td><td><code><pre> t := template.New("message")</pre></code></td></tr><tr class="miss"><td>49</td><td><code><pre> t.Funcs(template.FuncMap{</pre></code></td></tr><tr><td>50</td><td><code><pre> "js": func(html string) template.JS {</pre></code></td></tr><tr><td>51</td><td><code><pre> return template.JS(html)</pre></code></td></tr><tr><td>52</td><td><code><pre> },</pre></code></td></tr><tr><td>53</td><td><code><pre> "safe": func(html string) template.HTML {</pre></code></td></tr><tr><td>54</td><td><code><pre> return template.HTML(html)</pre></code></td></tr><tr><td>55</td><td><code><pre> },</pre></code></td></tr><tr><td>56</td><td><code><pre> "VERSION": func() string {</pre></code></td></tr><tr><td>57</td><td><code><pre> return VERSION</pre></code></td></tr><tr><td>58</td><td><code><pre> },</pre></code></td></tr><tr><td>59</td><td><code><pre> "CoreApp": func() *Core {</pre></code></td></tr><tr><td>60</td><td><code><pre> return CoreApp</pre></code></td></tr><tr><td>61</td><td><code><pre> },</pre></code></td></tr><tr><td>62</td><td><code><pre> "USE_CDN": func() bool {</pre></code></td></tr><tr><td>63</td><td><code><pre> return CoreApp.UseCdn</pre></code></td></tr><tr><td>64</td><td><code><pre> },</pre></code></td></tr><tr><td>65</td><td><code><pre> "underscore": func(html string) string {</pre></code></td></tr><tr><td>66</td><td><code><pre> return utils.UnderScoreString(html)</pre></code></td></tr><tr><td>67</td><td><code><pre> },</pre></code></td></tr><tr><td>68</td><td><code><pre> "URL": func() string {</pre></code></td></tr><tr><td>69</td><td><code><pre> return "/"</pre></code></td></tr><tr><td>70</td><td><code><pre> },</pre></code></td></tr><tr><td>71</td><td><code><pre> "CHART_DATA": func() string {</pre></code></td></tr><tr><td>72</td><td><code><pre> return ExportChartsJs()</pre></code></td></tr><tr><td>73</td><td><code><pre> },</pre></code></td></tr><tr><td>74</td><td><code><pre> })</pre></code></td></tr><tr class="miss"><td>75</td><td><code><pre> t, _ = t.Parse(nav)</pre></code></td></tr><tr class="miss"><td>76</td><td><code><pre> t, _ = t.Parse(footer)</pre></code></td></tr><tr class="miss"><td>77</td><td><code><pre> t.Parse(render)</pre></code></td></tr><tr class="miss"><td>78</td><td><code><pre> var tpl bytes.Buffer</pre></code></td></tr><tr class="miss"><td>79</td><td><code><pre> if err := t.Execute(&tpl, CoreApp); err != nil {</pre></code></td></tr><tr class="miss"><td>80</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr><td>81</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>82</td><td><code><pre> result := tpl.String()</pre></code></td></tr><tr class="miss"><td>83</td><td><code><pre> return result</pre></code></td></tr><tr><td>84</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_GraphDataRaw">func GraphDataRaw</div><div class="info"><a href="#s_fn_GraphDataRaw">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>242</td><td><code><pre>func GraphDataRaw(service types.ServiceInterface, start, end time.Time, group string, column string) *DateScanObj {</pre></code></td></tr><tr class="miss"><td>243</td><td><code><pre> var d []DateScan</pre></code></td></tr><tr class="miss"><td>244</td><td><code><pre> model := service.(*Service).HitsBetween(start, end, group, column)</pre></code></td></tr><tr class="miss"><td>245</td><td><code><pre> rows, _ := model.Rows()</pre></code></td></tr><tr class="miss"><td>246</td><td><code><pre> for rows.Next() {</pre></code></td></tr><tr class="miss"><td>247</td><td><code><pre> var gd DateScan</pre></code></td></tr><tr class="miss"><td>248</td><td><code><pre> var createdAt string</pre></code></td></tr><tr class="miss"><td>249</td><td><code><pre> var value float64</pre></code></td></tr><tr class="miss"><td>250</td><td><code><pre> var createdTime time.Time</pre></code></td></tr><tr class="miss"><td>251</td><td><code><pre> rows.Scan(&createdAt, &value)</pre></code></td></tr><tr class="miss"><td>252</td><td><code><pre> createdTime, _ = time.Parse(types.TIME, createdAt)</pre></code></td></tr><tr class="miss"><td>253</td><td><code><pre> if CoreApp.DbConnection == "postgres" {</pre></code></td></tr><tr class="miss"><td>254</td><td><code><pre> createdTime, _ = time.Parse(types.TIME_NANO, createdAt)</pre></code></td></tr><tr><td>255</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>256</td><td><code><pre> gd.CreatedAt = utils.Timezoner(createdTime, CoreApp.Timezone).Format(types.TIME)</pre></code></td></tr><tr class="miss"><td>257</td><td><code><pre> gd.Value = int64(value * 1000)</pre></code></td></tr><tr class="miss"><td>258</td><td><code><pre> d = append(d, gd)</pre></code></td></tr><tr><td>259</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>260</td><td><code><pre> return &DateScanObj{d}</pre></code></td></tr><tr><td>261</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_InsertSampleHits">func InsertSampleHits</div><div class="info"><a href="#s_fn_InsertSampleHits">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/sample.go</code>:</p></div><table class="listing">
|
||
<tr><td>124</td><td><code><pre>func InsertSampleHits() error {</pre></code></td></tr><tr class="miss"><td>125</td><td><code><pre> since := time.Now().Add((-24 * 7) * time.Hour).UTC()</pre></code></td></tr><tr class="miss"><td>126</td><td><code><pre> for i := int64(1); i <= 5; i++ {</pre></code></td></tr><tr class="miss"><td>127</td><td><code><pre> service := SelectService(i)</pre></code></td></tr><tr class="miss"><td>128</td><td><code><pre> utils.Log(1, fmt.Sprintf("Adding %v sample hit records to service %v", 360, service.Name))</pre></code></td></tr><tr class="miss"><td>129</td><td><code><pre> createdAt := since</pre></code></td></tr><tr class="miss"><td>130</td><td><code><pre> alpha := float64(1.05)</pre></code></td></tr><tr><td>131</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>132</td><td><code><pre> for hi := int64(1); hi <= 168; hi++ {</pre></code></td></tr><tr class="miss"><td>133</td><td><code><pre> alpha += 0.01</pre></code></td></tr><tr class="miss"><td>134</td><td><code><pre> rand.Seed(time.Now().UnixNano())</pre></code></td></tr><tr class="miss"><td>135</td><td><code><pre> latency := rand.Float64() * alpha</pre></code></td></tr><tr class="miss"><td>136</td><td><code><pre> createdAt = createdAt.Add(1 * time.Hour)</pre></code></td></tr><tr class="miss"><td>137</td><td><code><pre> hit := &types.Hit{</pre></code></td></tr><tr><td>138</td><td><code><pre> Service: service.Id,</pre></code></td></tr><tr><td>139</td><td><code><pre> CreatedAt: createdAt,</pre></code></td></tr><tr><td>140</td><td><code><pre> Latency: latency,</pre></code></td></tr><tr><td>141</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>142</td><td><code><pre> service.CreateHit(hit)</pre></code></td></tr><tr><td>143</td><td><code><pre> }</pre></code></td></tr><tr><td>144</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>145</td><td><code><pre> return nil</pre></code></td></tr><tr><td>146</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DbConfig.Update">func DbConfig.Update</div><div class="info"><a href="#s_fn_DbConfig.Update">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>262</td><td><code><pre>func (db *DbConfig) Update() error {</pre></code></td></tr><tr class="miss"><td>263</td><td><code><pre> var err error</pre></code></td></tr><tr class="miss"><td>264</td><td><code><pre> config, err := os.Create(utils.Directory + "/config.yml")</pre></code></td></tr><tr class="miss"><td>265</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>266</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr class="miss"><td>267</td><td><code><pre> return err</pre></code></td></tr><tr><td>268</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>269</td><td><code><pre> data, err := yaml.Marshal(db)</pre></code></td></tr><tr class="miss"><td>270</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>271</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr class="miss"><td>272</td><td><code><pre> return err</pre></code></td></tr><tr><td>273</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>274</td><td><code><pre> config.WriteString(string(data))</pre></code></td></tr><tr class="miss"><td>275</td><td><code><pre> config.Close()</pre></code></td></tr><tr class="miss"><td>276</td><td><code><pre> return err</pre></code></td></tr><tr><td>277</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Dbtimestamp">func Dbtimestamp</div><div class="info"><a href="#s_fn_Dbtimestamp">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>206</td><td><code><pre>func Dbtimestamp(group string, column string) string {</pre></code></td></tr><tr class="miss"><td>207</td><td><code><pre> seconds := 60</pre></code></td></tr><tr class="miss"><td>208</td><td><code><pre> if group == "second" {</pre></code></td></tr><tr class="miss"><td>209</td><td><code><pre> seconds = 60</pre></code></td></tr><tr class="miss"><td>210</td><td><code><pre> } else if group == "hour" {</pre></code></td></tr><tr class="miss"><td>211</td><td><code><pre> seconds = 3600</pre></code></td></tr><tr class="miss"><td>212</td><td><code><pre> } else if group == "day" {</pre></code></td></tr><tr class="miss"><td>213</td><td><code><pre> seconds = 86400</pre></code></td></tr><tr><td>214</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>215</td><td><code><pre> switch CoreApp.DbConnection {</pre></code></td></tr><tr><td>216</td><td><code><pre> case "mysql":</pre></code></td></tr><tr class="miss"><td>217</td><td><code><pre> return fmt.Sprintf("CONCAT(date_format(created_at, '%%Y-%%m-%%d %%H:00:00')) AS timeframe, AVG(%v) AS value", column)</pre></code></td></tr><tr><td>218</td><td><code><pre> case "sqlite":</pre></code></td></tr><tr class="miss"><td>219</td><td><code><pre> return fmt.Sprintf("datetime((strftime('%%s', created_at) / %v) * %v, 'unixepoch') AS timeframe, AVG(%v) as value", seconds, seconds, column)</pre></code></td></tr><tr><td>220</td><td><code><pre> case "postgres":</pre></code></td></tr><tr class="miss"><td>221</td><td><code><pre> return fmt.Sprintf("date_trunc('%v', created_at) AS timeframe, AVG(%v) AS value", group, column)</pre></code></td></tr><tr><td>222</td><td><code><pre> default:</pre></code></td></tr><tr class="miss"><td>223</td><td><code><pre> return ""</pre></code></td></tr><tr><td>224</td><td><code><pre> }</pre></code></td></tr><tr><td>225</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_ExportChartsJs">func ExportChartsJs</div><div class="info"><a href="#s_fn_ExportChartsJs">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go</code>:</p></div><table class="listing">
|
||
<tr><td>87</td><td><code><pre>func ExportChartsJs() string {</pre></code></td></tr><tr class="miss"><td>88</td><td><code><pre> render, err := source.JsBox.String("charts.js")</pre></code></td></tr><tr class="miss"><td>89</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>90</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr><td>91</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>92</td><td><code><pre> t := template.New("charts")</pre></code></td></tr><tr class="miss"><td>93</td><td><code><pre> t.Funcs(template.FuncMap{</pre></code></td></tr><tr><td>94</td><td><code><pre> "safe": func(html string) template.HTML {</pre></code></td></tr><tr><td>95</td><td><code><pre> return template.HTML(html)</pre></code></td></tr><tr><td>96</td><td><code><pre> },</pre></code></td></tr><tr><td>97</td><td><code><pre> })</pre></code></td></tr><tr class="miss"><td>98</td><td><code><pre> t.Parse(render)</pre></code></td></tr><tr class="miss"><td>99</td><td><code><pre> var tpl bytes.Buffer</pre></code></td></tr><tr class="miss"><td>100</td><td><code><pre> if err := t.Execute(&tpl, CoreApp.Services); err != nil {</pre></code></td></tr><tr class="miss"><td>101</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr><td>102</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>103</td><td><code><pre> result := tpl.String()</pre></code></td></tr><tr class="miss"><td>104</td><td><code><pre> return result</pre></code></td></tr><tr><td>105</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.TotalUptime">func Service.TotalUptime</div><div class="info"><a href="#s_fn_Service.TotalUptime">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>315</td><td><code><pre>func (s *Service) TotalUptime() string {</pre></code></td></tr><tr class="miss"><td>316</td><td><code><pre> hits, _ := s.TotalHits()</pre></code></td></tr><tr class="miss"><td>317</td><td><code><pre> failures, _ := s.TotalFailures()</pre></code></td></tr><tr class="miss"><td>318</td><td><code><pre> percent := float64(failures) / float64(hits) * 100</pre></code></td></tr><tr class="miss"><td>319</td><td><code><pre> percent = 100 - percent</pre></code></td></tr><tr class="miss"><td>320</td><td><code><pre> if percent < 0 {</pre></code></td></tr><tr class="miss"><td>321</td><td><code><pre> percent = 0</pre></code></td></tr><tr><td>322</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>323</td><td><code><pre> amount := fmt.Sprintf("%0.2f", percent)</pre></code></td></tr><tr class="miss"><td>324</td><td><code><pre> if amount == "100.00" {</pre></code></td></tr><tr class="miss"><td>325</td><td><code><pre> amount = "100"</pre></code></td></tr><tr><td>326</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>327</td><td><code><pre> return amount</pre></code></td></tr><tr><td>328</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_EnvToConfig">func EnvToConfig</div><div class="info"><a href="#s_fn_EnvToConfig">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/configs.go</code>:</p></div><table class="listing">
|
||
<tr><td>122</td><td><code><pre>func EnvToConfig() *DbConfig {</pre></code></td></tr><tr class="miss"><td>123</td><td><code><pre> port := DefaultPort(os.Getenv("DB_PORT"))</pre></code></td></tr><tr class="miss"><td>124</td><td><code><pre> name := os.Getenv("NAME")</pre></code></td></tr><tr class="miss"><td>125</td><td><code><pre> if name == "" {</pre></code></td></tr><tr class="miss"><td>126</td><td><code><pre> name = "Statup"</pre></code></td></tr><tr><td>127</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>128</td><td><code><pre> description := os.Getenv("DESCRIPTION")</pre></code></td></tr><tr class="miss"><td>129</td><td><code><pre> if description == "" {</pre></code></td></tr><tr class="miss"><td>130</td><td><code><pre> description = "Statup Monitoring Sample Data"</pre></code></td></tr><tr><td>131</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>132</td><td><code><pre> data := &DbConfig{</pre></code></td></tr><tr><td>133</td><td><code><pre> DbConn: os.Getenv("DB_CONN"),</pre></code></td></tr><tr><td>134</td><td><code><pre> DbHost: os.Getenv("DB_HOST"),</pre></code></td></tr><tr><td>135</td><td><code><pre> DbUser: os.Getenv("DB_USER"),</pre></code></td></tr><tr><td>136</td><td><code><pre> DbPass: os.Getenv("DB_PASS"),</pre></code></td></tr><tr><td>137</td><td><code><pre> DbData: os.Getenv("DB_DATABASE"),</pre></code></td></tr><tr><td>138</td><td><code><pre> DbPort: port,</pre></code></td></tr><tr><td>139</td><td><code><pre> Project: name,</pre></code></td></tr><tr><td>140</td><td><code><pre> Description: description,</pre></code></td></tr><tr><td>141</td><td><code><pre> Domain: os.Getenv("DOMAIN"),</pre></code></td></tr><tr><td>142</td><td><code><pre> Email: "",</pre></code></td></tr><tr><td>143</td><td><code><pre> Username: "admin",</pre></code></td></tr><tr><td>144</td><td><code><pre> Password: "admin",</pre></code></td></tr><tr><td>145</td><td><code><pre> Error: nil,</pre></code></td></tr><tr><td>146</td><td><code><pre> Location: utils.Directory,</pre></code></td></tr><tr><td>147</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>148</td><td><code><pre> return data</pre></code></td></tr><tr><td>149</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.RecheckCheckinFailure">func Checkin.RecheckCheckinFailure</div><div class="info"><a href="#s_fn_Checkin.RecheckCheckinFailure">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>196</td><td><code><pre>func (c *Checkin) RecheckCheckinFailure(guard chan struct{}) {</pre></code></td></tr><tr class="miss"><td>197</td><td><code><pre> between := time.Now().Sub(time.Now()).Seconds()</pre></code></td></tr><tr class="miss"><td>198</td><td><code><pre> if between > float64(c.Interval) {</pre></code></td></tr><tr class="miss"><td>199</td><td><code><pre> fmt.Println("rechecking every 15 seconds!")</pre></code></td></tr><tr class="miss"><td>200</td><td><code><pre> time.Sleep(15 * time.Second)</pre></code></td></tr><tr class="miss"><td>201</td><td><code><pre> guard <- struct{}{}</pre></code></td></tr><tr class="miss"><td>202</td><td><code><pre> c.RecheckCheckinFailure(guard)</pre></code></td></tr><tr><td>203</td><td><code><pre> } else {</pre></code></td></tr><tr class="miss"><td>204</td><td><code><pre> fmt.Println("i recovered!!")</pre></code></td></tr><tr><td>205</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>206</td><td><code><pre> <-guard</pre></code></td></tr><tr><td>207</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DbConfig.CreateCore">func DbConfig.CreateCore</div><div class="info"><a href="#s_fn_DbConfig.CreateCore">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>300</td><td><code><pre>func (c *DbConfig) CreateCore() *Core {</pre></code></td></tr><tr class="miss"><td>301</td><td><code><pre> newCore := &types.Core{</pre></code></td></tr><tr><td>302</td><td><code><pre> Name: c.Project,</pre></code></td></tr><tr><td>303</td><td><code><pre> Description: c.Description,</pre></code></td></tr><tr><td>304</td><td><code><pre> Config: "config.yml",</pre></code></td></tr><tr><td>305</td><td><code><pre> ApiKey: c.ApiKey,</pre></code></td></tr><tr><td>306</td><td><code><pre> ApiSecret: c.ApiSecret,</pre></code></td></tr><tr><td>307</td><td><code><pre> Domain: c.Domain,</pre></code></td></tr><tr><td>308</td><td><code><pre> MigrationId: time.Now().Unix(),</pre></code></td></tr><tr><td>309</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>310</td><td><code><pre> db := coreDB().Create(&newCore)</pre></code></td></tr><tr class="miss"><td>311</td><td><code><pre> if db.Error == nil {</pre></code></td></tr><tr class="miss"><td>312</td><td><code><pre> CoreApp = &Core{Core: newCore}</pre></code></td></tr><tr><td>313</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>314</td><td><code><pre> CoreApp, err := SelectCore()</pre></code></td></tr><tr class="miss"><td>315</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>316</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr><td>317</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>318</td><td><code><pre> return CoreApp</pre></code></td></tr><tr><td>319</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.AvgTime">func Service.AvgTime</div><div class="info"><a href="#s_fn_Service.AvgTime">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>114</td><td><code><pre>func (s *Service) AvgTime() float64 {</pre></code></td></tr><tr class="miss"><td>115</td><td><code><pre> total, _ := s.TotalHits()</pre></code></td></tr><tr class="miss"><td>116</td><td><code><pre> if total == 0 {</pre></code></td></tr><tr class="miss"><td>117</td><td><code><pre> return float64(0)</pre></code></td></tr><tr><td>118</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>119</td><td><code><pre> sum, _ := s.Sum()</pre></code></td></tr><tr class="miss"><td>120</td><td><code><pre> avg := sum / float64(total) * 100</pre></code></td></tr><tr class="miss"><td>121</td><td><code><pre> amount := fmt.Sprintf("%0.0f", avg*10)</pre></code></td></tr><tr class="miss"><td>122</td><td><code><pre> val, _ := strconv.ParseFloat(amount, 10)</pre></code></td></tr><tr class="miss"><td>123</td><td><code><pre> return val</pre></code></td></tr><tr><td>124</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.GraphData">func Service.GraphData</div><div class="info"><a href="#s_fn_Service.GraphData">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>274</td><td><code><pre>func (s *Service) GraphData() string {</pre></code></td></tr><tr class="miss"><td>275</td><td><code><pre> start := time.Now().Add((-24 * 7) * time.Hour)</pre></code></td></tr><tr class="miss"><td>276</td><td><code><pre> end := time.Now()</pre></code></td></tr><tr class="miss"><td>277</td><td><code><pre> obj := GraphDataRaw(s, start, end, "hour", "latency")</pre></code></td></tr><tr class="miss"><td>278</td><td><code><pre> data, err := json.Marshal(obj)</pre></code></td></tr><tr class="miss"><td>279</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>280</td><td><code><pre> utils.Log(2, err)</pre></code></td></tr><tr class="miss"><td>281</td><td><code><pre> return ""</pre></code></td></tr><tr><td>282</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>283</td><td><code><pre> return string(data)</pre></code></td></tr><tr><td>284</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_CountFailures">func CountFailures</div><div class="info"><a href="#s_fn_CountFailures">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go</code>:</p></div><table class="listing">
|
||
<tr><td>99</td><td><code><pre>func CountFailures() uint64 {</pre></code></td></tr><tr class="miss"><td>100</td><td><code><pre> var count uint64</pre></code></td></tr><tr class="miss"><td>101</td><td><code><pre> err := failuresDB().Count(&count)</pre></code></td></tr><tr class="miss"><td>102</td><td><code><pre> if err.Error != nil {</pre></code></td></tr><tr class="miss"><td>103</td><td><code><pre> utils.Log(2, err.Error)</pre></code></td></tr><tr class="miss"><td>104</td><td><code><pre> return 0</pre></code></td></tr><tr><td>105</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>106</td><td><code><pre> return count</pre></code></td></tr><tr><td>107</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_InitApp">func InitApp</div><div class="info"><a href="#s_fn_InitApp">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>60</td><td><code><pre>func InitApp() {</pre></code></td></tr><tr class="miss"><td>61</td><td><code><pre> SelectCore()</pre></code></td></tr><tr class="miss"><td>62</td><td><code><pre> InsertNotifierDB()</pre></code></td></tr><tr class="miss"><td>63</td><td><code><pre> CoreApp.SelectAllServices(true)</pre></code></td></tr><tr class="miss"><td>64</td><td><code><pre> checkServices()</pre></code></td></tr><tr class="miss"><td>65</td><td><code><pre> CoreApp.Notifications = notifier.Load()</pre></code></td></tr><tr class="miss"><td>66</td><td><code><pre> go DatabaseMaintence()</pre></code></td></tr><tr><td>67</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Core.Count24HFailures">func Core.Count24HFailures</div><div class="info"><a href="#s_fn_Core.Count24HFailures">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go</code>:</p></div><table class="listing">
|
||
<tr><td>88</td><td><code><pre>func (c *Core) Count24HFailures() uint64 {</pre></code></td></tr><tr class="miss"><td>89</td><td><code><pre> var count uint64</pre></code></td></tr><tr class="miss"><td>90</td><td><code><pre> for _, s := range CoreApp.Services {</pre></code></td></tr><tr class="miss"><td>91</td><td><code><pre> service := s.(*Service)</pre></code></td></tr><tr class="miss"><td>92</td><td><code><pre> fails, _ := service.TotalFailures24()</pre></code></td></tr><tr class="miss"><td>93</td><td><code><pre> count += fails</pre></code></td></tr><tr><td>94</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>95</td><td><code><pre> return count</pre></code></td></tr><tr><td>96</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_SampleData">func SampleData</div><div class="info"><a href="#s_fn_SampleData">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/configs.go</code>:</p></div><table class="listing">
|
||
<tr><td>152</td><td><code><pre>func SampleData() error {</pre></code></td></tr><tr class="miss"><td>153</td><td><code><pre> if err := InsertSampleData(); err != nil {</pre></code></td></tr><tr class="miss"><td>154</td><td><code><pre> return err</pre></code></td></tr><tr><td>155</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>156</td><td><code><pre> if err := InsertSampleHits(); err != nil {</pre></code></td></tr><tr class="miss"><td>157</td><td><code><pre> return err</pre></code></td></tr><tr><td>158</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>159</td><td><code><pre> return nil</pre></code></td></tr><tr><td>160</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_recordFailure">func recordFailure</div><div class="info"><a href="#s_fn_recordFailure">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go</code>:</p></div><table class="listing">
|
||
<tr><td>247</td><td><code><pre>func recordFailure(s *Service, issue string) {</pre></code></td></tr><tr class="miss"><td>248</td><td><code><pre> s.Online = false</pre></code></td></tr><tr class="miss"><td>249</td><td><code><pre> fail := &types.Failure{</pre></code></td></tr><tr><td>250</td><td><code><pre> Service: s.Id,</pre></code></td></tr><tr><td>251</td><td><code><pre> Issue: issue,</pre></code></td></tr><tr><td>252</td><td><code><pre> PingTime: s.PingTime,</pre></code></td></tr><tr><td>253</td><td><code><pre> CreatedAt: time.Now(),</pre></code></td></tr><tr><td>254</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>255</td><td><code><pre> utils.Log(2, fmt.Sprintf("Service %v Failing: %v | Lookup in: %0.2f ms", s.Name, issue, fail.PingTime*1000))</pre></code></td></tr><tr class="miss"><td>256</td><td><code><pre> s.CreateFailure(fail)</pre></code></td></tr><tr class="miss"><td>257</td><td><code><pre> notifier.OnFailure(s.Service, fail)</pre></code></td></tr><tr><td>258</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.lastFailure">func Service.lastFailure</div><div class="info"><a href="#s_fn_Service.lastFailure">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>166</td><td><code><pre>func (s *Service) lastFailure() *failure {</pre></code></td></tr><tr class="miss"><td>167</td><td><code><pre> limited := s.LimitedFailures()</pre></code></td></tr><tr class="miss"><td>168</td><td><code><pre> if len(limited) == 0 {</pre></code></td></tr><tr class="miss"><td>169</td><td><code><pre> return nil</pre></code></td></tr><tr><td>170</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>171</td><td><code><pre> last := limited[len(limited)-1]</pre></code></td></tr><tr class="miss"><td>172</td><td><code><pre> return last</pre></code></td></tr><tr><td>173</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DatabaseMaintence">func DatabaseMaintence</div><div class="info"><a href="#s_fn_DatabaseMaintence">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>243</td><td><code><pre>func DatabaseMaintence() {</pre></code></td></tr><tr class="miss"><td>244</td><td><code><pre> for range time.Tick(60 * time.Minute) {</pre></code></td></tr><tr class="miss"><td>245</td><td><code><pre> utils.Log(1, "Checking for database records older than 3 months...")</pre></code></td></tr><tr class="miss"><td>246</td><td><code><pre> since := time.Now().AddDate(0, -3, 0).UTC()</pre></code></td></tr><tr class="miss"><td>247</td><td><code><pre> DeleteAllSince("failures", since)</pre></code></td></tr><tr class="miss"><td>248</td><td><code><pre> DeleteAllSince("hits", since)</pre></code></td></tr><tr><td>249</td><td><code><pre> }</pre></code></td></tr><tr><td>250</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DateScanObj.ToString">func DateScanObj.ToString</div><div class="info"><a href="#s_fn_DateScanObj.ToString">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>264</td><td><code><pre>func (d *DateScanObj) ToString() string {</pre></code></td></tr><tr class="miss"><td>265</td><td><code><pre> data, err := json.Marshal(d.Array)</pre></code></td></tr><tr class="miss"><td>266</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>267</td><td><code><pre> utils.Log(2, err)</pre></code></td></tr><tr class="miss"><td>268</td><td><code><pre> return "{}"</pre></code></td></tr><tr><td>269</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>270</td><td><code><pre> return string(data)</pre></code></td></tr><tr><td>271</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DeleteConfig">func DeleteConfig</div><div class="info"><a href="#s_fn_DeleteConfig">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/configs.go</code>:</p></div><table class="listing">
|
||
<tr><td>163</td><td><code><pre>func DeleteConfig() error {</pre></code></td></tr><tr class="miss"><td>164</td><td><code><pre> err := os.Remove(utils.Directory + "/config.yml")</pre></code></td></tr><tr class="miss"><td>165</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>166</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr class="miss"><td>167</td><td><code><pre> return err</pre></code></td></tr><tr><td>168</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>169</td><td><code><pre> return nil</pre></code></td></tr><tr><td>170</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Core.CurrentTime">func Core.CurrentTime</div><div class="info"><a href="#s_fn_Core.CurrentTime">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>88</td><td><code><pre>func (c Core) CurrentTime() string {</pre></code></td></tr><tr class="miss"><td>89</td><td><code><pre> t := time.Now().UTC()</pre></code></td></tr><tr class="miss"><td>90</td><td><code><pre> current := utils.Timezoner(t, c.Timezone)</pre></code></td></tr><tr class="miss"><td>91</td><td><code><pre> ansic := "Monday 03:04:05 PM"</pre></code></td></tr><tr class="miss"><td>92</td><td><code><pre> return current.Format(ansic)</pre></code></td></tr><tr><td>93</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.TotalFailures">func Service.TotalFailures</div><div class="info"><a href="#s_fn_Service.TotalFailures">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go</code>:</p></div><table class="listing">
|
||
<tr><td>116</td><td><code><pre>func (s *Service) TotalFailures() (uint64, error) {</pre></code></td></tr><tr class="miss"><td>117</td><td><code><pre> var count uint64</pre></code></td></tr><tr class="miss"><td>118</td><td><code><pre> rows := failuresDB().Where("service = ?", s.Id)</pre></code></td></tr><tr class="miss"><td>119</td><td><code><pre> err := rows.Count(&count)</pre></code></td></tr><tr class="miss"><td>120</td><td><code><pre> return count, err.Error</pre></code></td></tr><tr><td>121</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.DeleteFailures">func Service.DeleteFailures</div><div class="info"><a href="#s_fn_Service.DeleteFailures">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go</code>:</p></div><table class="listing">
|
||
<tr><td>59</td><td><code><pre>func (s *Service) DeleteFailures() {</pre></code></td></tr><tr class="miss"><td>60</td><td><code><pre> err := DbSession.Exec(`DELETE FROM failures WHERE service = ?`, s.Id)</pre></code></td></tr><tr class="miss"><td>61</td><td><code><pre> if err.Error != nil {</pre></code></td></tr><tr class="miss"><td>62</td><td><code><pre> utils.Log(3, fmt.Sprintf("failed to delete all failures: %v", err))</pre></code></td></tr><tr><td>63</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>64</td><td><code><pre> s.Failures = nil</pre></code></td></tr><tr><td>65</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DbConfig.InsertCore">func DbConfig.InsertCore</div><div class="info"><a href="#s_fn_DbConfig.InsertCore">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>179</td><td><code><pre>func (db *DbConfig) InsertCore() (*Core, error) {</pre></code></td></tr><tr class="miss"><td>180</td><td><code><pre> CoreApp = &Core{Core: &types.Core{</pre></code></td></tr><tr><td>181</td><td><code><pre> Name: db.Project,</pre></code></td></tr><tr><td>182</td><td><code><pre> Description: db.Description,</pre></code></td></tr><tr><td>183</td><td><code><pre> Config: "config.yml",</pre></code></td></tr><tr><td>184</td><td><code><pre> ApiKey: utils.NewSHA1Hash(9),</pre></code></td></tr><tr><td>185</td><td><code><pre> ApiSecret: utils.NewSHA1Hash(16),</pre></code></td></tr><tr><td>186</td><td><code><pre> Domain: db.Domain,</pre></code></td></tr><tr><td>187</td><td><code><pre> MigrationId: time.Now().Unix(),</pre></code></td></tr><tr><td>188</td><td><code><pre> }}</pre></code></td></tr><tr class="miss"><td>189</td><td><code><pre> CoreApp.DbConnection = db.DbConn</pre></code></td></tr><tr class="miss"><td>190</td><td><code><pre> query := coreDB().Create(&CoreApp)</pre></code></td></tr><tr class="miss"><td>191</td><td><code><pre> return CoreApp, query.Error</pre></code></td></tr><tr><td>192</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Core.AllOnline">func Core.AllOnline</div><div class="info"><a href="#s_fn_Core.AllOnline">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>126</td><td><code><pre>func (c Core) AllOnline() bool {</pre></code></td></tr><tr class="miss"><td>127</td><td><code><pre> for _, s := range CoreApp.Services {</pre></code></td></tr><tr class="miss"><td>128</td><td><code><pre> if !s.Select().Online {</pre></code></td></tr><tr class="miss"><td>129</td><td><code><pre> return false</pre></code></td></tr><tr><td>130</td><td><code><pre> }</pre></code></td></tr><tr><td>131</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>132</td><td><code><pre> return true</pre></code></td></tr><tr><td>133</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DeleteAllSince">func DeleteAllSince</div><div class="info"><a href="#s_fn_DeleteAllSince">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>253</td><td><code><pre>func DeleteAllSince(table string, date time.Time) {</pre></code></td></tr><tr class="miss"><td>254</td><td><code><pre> sql := fmt.Sprintf("DELETE FROM %v WHERE created_at < '%v';", table, date.Format("2006-01-02"))</pre></code></td></tr><tr class="miss"><td>255</td><td><code><pre> db := DbSession.Raw(sql)</pre></code></td></tr><tr class="miss"><td>256</td><td><code><pre> if db.Error != nil {</pre></code></td></tr><tr class="miss"><td>257</td><td><code><pre> utils.Log(2, db.Error)</pre></code></td></tr><tr><td>258</td><td><code><pre> }</pre></code></td></tr><tr><td>259</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.CheckinProcess">func Service.CheckinProcess</div><div class="info"><a href="#s_fn_Service.CheckinProcess">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>59</td><td><code><pre>func (s *Service) CheckinProcess() {</pre></code></td></tr><tr class="miss"><td>60</td><td><code><pre> checkins := s.Checkins()</pre></code></td></tr><tr class="miss"><td>61</td><td><code><pre> for _, c := range checkins {</pre></code></td></tr><tr class="miss"><td>62</td><td><code><pre> c.Start()</pre></code></td></tr><tr class="miss"><td>63</td><td><code><pre> go c.Routine()</pre></code></td></tr><tr><td>64</td><td><code><pre> }</pre></code></td></tr><tr><td>65</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_SelectCheckinId">func SelectCheckinId</div><div class="info"><a href="#s_fn_SelectCheckinId">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>101</td><td><code><pre>func SelectCheckinId(id int64) *Checkin {</pre></code></td></tr><tr class="miss"><td>102</td><td><code><pre> var checkin Checkin</pre></code></td></tr><tr class="miss"><td>103</td><td><code><pre> checkinDB().Where("id = ?", id).First(&checkin)</pre></code></td></tr><tr class="miss"><td>104</td><td><code><pre> return &checkin</pre></code></td></tr><tr><td>105</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_SelectCheckin">func SelectCheckin</div><div class="info"><a href="#s_fn_SelectCheckin">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>94</td><td><code><pre>func SelectCheckin(api string) *Checkin {</pre></code></td></tr><tr class="miss"><td>95</td><td><code><pre> var checkin Checkin</pre></code></td></tr><tr class="miss"><td>96</td><td><code><pre> checkinDB().Where("api_key = ?", api).First(&checkin)</pre></code></td></tr><tr class="miss"><td>97</td><td><code><pre> return &checkin</pre></code></td></tr><tr><td>98</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Hit.BeforeCreate">func Hit.BeforeCreate</div><div class="info"><a href="#s_fn_Hit.BeforeCreate">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>131</td><td><code><pre>func (h *Hit) BeforeCreate() (err error) {</pre></code></td></tr><tr class="miss"><td>132</td><td><code><pre> if h.CreatedAt.IsZero() {</pre></code></td></tr><tr class="miss"><td>133</td><td><code><pre> h.CreatedAt = time.Now().UTC()</pre></code></td></tr><tr><td>134</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>135</td><td><code><pre> return</pre></code></td></tr><tr><td>136</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_failure.BeforeCreate">func failure.BeforeCreate</div><div class="info"><a href="#s_fn_failure.BeforeCreate">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>139</td><td><code><pre>func (f *failure) BeforeCreate() (err error) {</pre></code></td></tr><tr class="miss"><td>140</td><td><code><pre> if f.CreatedAt.IsZero() {</pre></code></td></tr><tr class="miss"><td>141</td><td><code><pre> f.CreatedAt = time.Now().UTC()</pre></code></td></tr><tr><td>142</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>143</td><td><code><pre> return</pre></code></td></tr><tr><td>144</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.Delete">func Checkin.Delete</div><div class="info"><a href="#s_fn_Checkin.Delete">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>147</td><td><code><pre>func (c *Checkin) Delete() error {</pre></code></td></tr><tr class="miss"><td>148</td><td><code><pre> c.Close()</pre></code></td></tr><tr class="miss"><td>149</td><td><code><pre> row := checkinDB().Delete(&c)</pre></code></td></tr><tr class="miss"><td>150</td><td><code><pre> return row.Error</pre></code></td></tr><tr><td>151</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.LimitedCheckins">func Service.LimitedCheckins</div><div class="info"><a href="#s_fn_Service.LimitedCheckins">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>75</td><td><code><pre>func (s *Service) LimitedCheckins() []*Checkin {</pre></code></td></tr><tr class="miss"><td>76</td><td><code><pre> var checkin []*Checkin</pre></code></td></tr><tr class="miss"><td>77</td><td><code><pre> checkinDB().Where("service = ?", s.Id).Limit(10).Find(&checkin)</pre></code></td></tr><tr class="miss"><td>78</td><td><code><pre> return checkin</pre></code></td></tr><tr><td>79</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Core.MobileSASS">func Core.MobileSASS</div><div class="info"><a href="#s_fn_Core.MobileSASS">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>118</td><td><code><pre>func (c Core) MobileSASS() string {</pre></code></td></tr><tr class="miss"><td>119</td><td><code><pre> if !source.UsingAssets(utils.Directory) {</pre></code></td></tr><tr class="miss"><td>120</td><td><code><pre> return ""</pre></code></td></tr><tr><td>121</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>122</td><td><code><pre> return source.OpenAsset(utils.Directory, "scss/mobile.scss")</pre></code></td></tr><tr><td>123</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Core.BaseSASS">func Core.BaseSASS</div><div class="info"><a href="#s_fn_Core.BaseSASS">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>109</td><td><code><pre>func (c Core) BaseSASS() string {</pre></code></td></tr><tr class="miss"><td>110</td><td><code><pre> if !source.UsingAssets(utils.Directory) {</pre></code></td></tr><tr class="miss"><td>111</td><td><code><pre> return ""</pre></code></td></tr><tr><td>112</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>113</td><td><code><pre> return source.OpenAsset(utils.Directory, "scss/base.scss")</pre></code></td></tr><tr><td>114</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Core.SassVars">func Core.SassVars</div><div class="info"><a href="#s_fn_Core.SassVars">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>101</td><td><code><pre>func (c Core) SassVars() string {</pre></code></td></tr><tr class="miss"><td>102</td><td><code><pre> if !source.UsingAssets(utils.Directory) {</pre></code></td></tr><tr class="miss"><td>103</td><td><code><pre> return ""</pre></code></td></tr><tr><td>104</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>105</td><td><code><pre> return source.OpenAsset(utils.Directory, "scss/variables.scss")</pre></code></td></tr><tr><td>106</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_checkServices">func checkServices</div><div class="info"><a href="#s_fn_checkServices">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checker.go</code>:</p></div><table class="listing">
|
||
<tr><td>34</td><td><code><pre>func checkServices() {</pre></code></td></tr><tr class="miss"><td>35</td><td><code><pre> utils.Log(1, fmt.Sprintf("Starting monitoring process for %v Services", len(CoreApp.Services)))</pre></code></td></tr><tr class="miss"><td>36</td><td><code><pre> for _, ser := range CoreApp.Services {</pre></code></td></tr><tr><td>37</td><td><code><pre> //go obj.StartCheckins()</pre></code></td></tr><tr class="miss"><td>38</td><td><code><pre> go ser.CheckQueue(true)</pre></code></td></tr><tr><td>39</td><td><code><pre> }</pre></code></td></tr><tr><td>40</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.AvgUptime24">func Service.AvgUptime24</div><div class="info"><a href="#s_fn_Service.AvgUptime24">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>287</td><td><code><pre>func (s *Service) AvgUptime24() string {</pre></code></td></tr><tr class="miss"><td>288</td><td><code><pre> ago := time.Now().Add(-24 * time.Hour)</pre></code></td></tr><tr class="miss"><td>289</td><td><code><pre> return s.AvgUptime(ago)</pre></code></td></tr><tr><td>290</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.ToJSON">func Service.ToJSON</div><div class="info"><a href="#s_fn_Service.ToJSON">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>108</td><td><code><pre>func (s *Service) ToJSON() string {</pre></code></td></tr><tr class="miss"><td>109</td><td><code><pre> data, _ := json.Marshal(s)</pre></code></td></tr><tr class="miss"><td>110</td><td><code><pre> return string(data)</pre></code></td></tr><tr><td>111</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.HitsBetween">func Service.HitsBetween</div><div class="info"><a href="#s_fn_Service.HitsBetween">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>77</td><td><code><pre>func (s *Service) HitsBetween(t1, t2 time.Time, group string, column string) *gorm.DB {</pre></code></td></tr><tr class="miss"><td>78</td><td><code><pre> selector := Dbtimestamp(group, column)</pre></code></td></tr><tr class="miss"><td>79</td><td><code><pre> 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")</pre></code></td></tr><tr><td>80</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_failure.Ago">func failure.Ago</div><div class="info"><a href="#s_fn_failure.Ago">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go</code>:</p></div><table class="listing">
|
||
<tr><td>76</td><td><code><pre>func (f *failure) Ago() string {</pre></code></td></tr><tr class="miss"><td>77</td><td><code><pre> got, _ := timeago.TimeAgoWithTime(time.Now(), f.CreatedAt)</pre></code></td></tr><tr class="miss"><td>78</td><td><code><pre> return got</pre></code></td></tr><tr><td>79</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.TotalFailures24">func Service.TotalFailures24</div><div class="info"><a href="#s_fn_Service.TotalFailures24">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go</code>:</p></div><table class="listing">
|
||
<tr><td>110</td><td><code><pre>func (s *Service) TotalFailures24() (uint64, error) {</pre></code></td></tr><tr class="miss"><td>111</td><td><code><pre> ago := time.Now().Add(-24 * time.Hour)</pre></code></td></tr><tr class="miss"><td>112</td><td><code><pre> return s.TotalFailuresSince(ago)</pre></code></td></tr><tr><td>113</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.Online24">func Service.Online24</div><div class="info"><a href="#s_fn_Service.Online24">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>127</td><td><code><pre>func (s *Service) Online24() float32 {</pre></code></td></tr><tr class="miss"><td>128</td><td><code><pre> ago := time.Now().Add(-24 * time.Hour)</pre></code></td></tr><tr class="miss"><td>129</td><td><code><pre> return s.OnlineSince(ago)</pre></code></td></tr><tr><td>130</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_CloseDB">func CloseDB</div><div class="info"><a href="#s_fn_CloseDB">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>83</td><td><code><pre>func CloseDB() {</pre></code></td></tr><tr class="miss"><td>84</td><td><code><pre> if DbSession != nil {</pre></code></td></tr><tr class="miss"><td>85</td><td><code><pre> DbSession.DB().Close()</pre></code></td></tr><tr><td>86</td><td><code><pre> }</pre></code></td></tr><tr><td>87</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Hit.AfterFind">func Hit.AfterFind</div><div class="info"><a href="#s_fn_Hit.AfterFind">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>101</td><td><code><pre>func (h *Hit) AfterFind() (err error) {</pre></code></td></tr><tr class="miss"><td>102</td><td><code><pre> h.CreatedAt = utils.Timezoner(h.CreatedAt, CoreApp.Timezone)</pre></code></td></tr><tr class="miss"><td>103</td><td><code><pre> return</pre></code></td></tr><tr><td>104</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DbConfig.waitForDb">func DbConfig.waitForDb</div><div class="info"><a href="#s_fn_DbConfig.waitForDb">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>236</td><td><code><pre>func (db *DbConfig) waitForDb() error {</pre></code></td></tr><tr class="miss"><td>237</td><td><code><pre> time.Sleep(5 * time.Second)</pre></code></td></tr><tr class="miss"><td>238</td><td><code><pre> return db.Connect(true, utils.Directory)</pre></code></td></tr><tr><td>239</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_UpdateCore">func UpdateCore</div><div class="info"><a href="#s_fn_UpdateCore">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>82</td><td><code><pre>func UpdateCore(c *Core) (*Core, error) {</pre></code></td></tr><tr class="miss"><td>83</td><td><code><pre> db := coreDB().Update(&c)</pre></code></td></tr><tr class="miss"><td>84</td><td><code><pre> return c, db.Error</pre></code></td></tr><tr><td>85</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_failure.Delete">func failure.Delete</div><div class="info"><a href="#s_fn_failure.Delete">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/failures.go</code>:</p></div><table class="listing">
|
||
<tr><td>82</td><td><code><pre>func (f *failure) Delete() error {</pre></code></td></tr><tr class="miss"><td>83</td><td><code><pre> db := failuresDB().Delete(f)</pre></code></td></tr><tr class="miss"><td>84</td><td><code><pre> return db.Error</pre></code></td></tr><tr><td>85</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DbConfig.Close">func DbConfig.Close</div><div class="info"><a href="#s_fn_DbConfig.Close">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/database.go</code>:</p></div><table class="listing">
|
||
<tr><td>90</td><td><code><pre>func (db *DbConfig) Close() error {</pre></code></td></tr><tr class="miss"><td>91</td><td><code><pre> return DbSession.DB().Close()</pre></code></td></tr><tr><td>92</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_injectDatabase">func injectDatabase</div><div class="info"><a href="#s_fn_injectDatabase">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go</code>:</p></div><table class="listing">
|
||
<tr><td>26</td><td><code><pre>func injectDatabase() {</pre></code></td></tr><tr class="miss"><td>27</td><td><code><pre> Configs.Connect(false, utils.Directory)</pre></code></td></tr><tr><td>28</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@68:10">func @68:10</div><div class="info"><a href="#s_fn_@68:10">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go</code>:</p></div><table class="listing">
|
||
<tr><td>68</td><td><code><pre>func() string {</pre></code></td></tr><tr class="miss"><td>69</td><td><code><pre> return "/"</pre></code></td></tr><tr><td>70</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Core.ToCore">func Core.ToCore</div><div class="info"><a href="#s_fn_Core.ToCore">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>55</td><td><code><pre>func (c *Core) ToCore() *types.Core {</pre></code></td></tr><tr class="miss"><td>56</td><td><code><pre> return c.Core</pre></code></td></tr><tr><td>57</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Services">func Services</div><div class="info"><a href="#s_fn_Services">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>44</td><td><code><pre>func Services() []types.ServiceInterface {</pre></code></td></tr><tr class="miss"><td>45</td><td><code><pre> return CoreApp.Services</pre></code></td></tr><tr><td>46</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.UpdateSingle">func Service.UpdateSingle</div><div class="info"><a href="#s_fn_Service.UpdateSingle">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>363</td><td><code><pre>func (s *Service) UpdateSingle(attr ...interface{}) error {</pre></code></td></tr><tr class="miss"><td>364</td><td><code><pre> return servicesDB().Model(s).Update(attr).Error</pre></code></td></tr><tr><td>365</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@53:11">func @53:11</div><div class="info"><a href="#s_fn_@53:11">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go</code>:</p></div><table class="listing">
|
||
<tr><td>53</td><td><code><pre>func(html string) template.HTML {</pre></code></td></tr><tr class="miss"><td>54</td><td><code><pre> return template.HTML(html)</pre></code></td></tr><tr><td>55</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@56:14">func @56:14</div><div class="info"><a href="#s_fn_@56:14">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go</code>:</p></div><table class="listing">
|
||
<tr><td>56</td><td><code><pre>func() string {</pre></code></td></tr><tr class="miss"><td>57</td><td><code><pre> return VERSION</pre></code></td></tr><tr><td>58</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Core.ServicesCount">func Core.ServicesCount</div><div class="info"><a href="#s_fn_Core.ServicesCount">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>403</td><td><code><pre>func (c *Core) ServicesCount() int {</pre></code></td></tr><tr class="miss"><td>404</td><td><code><pre> return len(c.Services)</pre></code></td></tr><tr><td>405</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Service.DowntimeText">func Service.DowntimeText</div><div class="info"><a href="#s_fn_Service.DowntimeText">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>201</td><td><code><pre>func (s *Service) DowntimeText() string {</pre></code></td></tr><tr class="miss"><td>202</td><td><code><pre> return fmt.Sprintf("%v has been offline for %v", s.Name, utils.DurationReadable(s.Downtime()))</pre></code></td></tr><tr><td>203</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Core.UsingAssets">func Core.UsingAssets</div><div class="info"><a href="#s_fn_Core.UsingAssets">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/core.go</code>:</p></div><table class="listing">
|
||
<tr><td>96</td><td><code><pre>func (c Core) UsingAssets() bool {</pre></code></td></tr><tr class="miss"><td>97</td><td><code><pre> return source.UsingAssets(utils.Directory)</pre></code></td></tr><tr><td>98</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@59:14">func @59:14</div><div class="info"><a href="#s_fn_@59:14">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go</code>:</p></div><table class="listing">
|
||
<tr><td>59</td><td><code><pre>func() *Core {</pre></code></td></tr><tr class="miss"><td>60</td><td><code><pre> return CoreApp</pre></code></td></tr><tr><td>61</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@62:14">func @62:14</div><div class="info"><a href="#s_fn_@62:14">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go</code>:</p></div><table class="listing">
|
||
<tr><td>62</td><td><code><pre>func() bool {</pre></code></td></tr><tr class="miss"><td>63</td><td><code><pre> return CoreApp.UseCdn</pre></code></td></tr><tr><td>64</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.Link">func Checkin.Link</div><div class="info"><a href="#s_fn_Checkin.Link">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>135</td><td><code><pre>func (c *Checkin) Link() string {</pre></code></td></tr><tr class="miss"><td>136</td><td><code><pre> return fmt.Sprintf("%v/checkin/%v", CoreApp.Domain, c.ApiKey)</pre></code></td></tr><tr><td>137</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@65:17">func @65:17</div><div class="info"><a href="#s_fn_@65:17">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go</code>:</p></div><table class="listing">
|
||
<tr><td>65</td><td><code><pre>func(html string) string {</pre></code></td></tr><tr class="miss"><td>66</td><td><code><pre> return utils.UnderScoreString(html)</pre></code></td></tr><tr><td>67</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@94:11">func @94:11</div><div class="info"><a href="#s_fn_@94:11">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go</code>:</p></div><table class="listing">
|
||
<tr><td>94</td><td><code><pre>func(html string) template.HTML {</pre></code></td></tr><tr class="miss"><td>95</td><td><code><pre> return template.HTML(html)</pre></code></td></tr><tr><td>96</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Checkin.String">func Checkin.String</div><div class="info"><a href="#s_fn_Checkin.String">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/checkin.go</code>:</p></div><table class="listing">
|
||
<tr><td>61</td><td><code><pre>func (c *Checkin) String() string {</pre></code></td></tr><tr class="miss"><td>62</td><td><code><pre> return c.ApiKey</pre></code></td></tr><tr><td>63</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@71:17">func @71:17</div><div class="info"><a href="#s_fn_@71:17">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go</code>:</p></div><table class="listing">
|
||
<tr><td>71</td><td><code><pre>func() string {</pre></code></td></tr><tr class="miss"><td>72</td><td><code><pre> return ExportChartsJs()</pre></code></td></tr><tr><td>73</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@50:9">func @50:9</div><div class="info"><a href="#s_fn_@50:9">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/export.go</code>:</p></div><table class="listing">
|
||
<tr><td>50</td><td><code><pre>func(html string) template.JS {</pre></code></td></tr><tr class="miss"><td>51</td><td><code><pre> return template.JS(html)</pre></code></td></tr><tr><td>52</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<!-- Can be parsed by external script
|
||
PACKAGE:github.com/hunterlong/statup/core DONE:52.58
|
||
-->
|
||
|
||
<div id="pkg_github.com/hunterlong/statup/core/notifier" class="funcname">Package Overview: github.com/hunterlong/statup/core/notifier <span class="packageTotal">72.73%</span></div><p>This is a coverage report created after analysis of the <code>github.com/hunterlong/statup/core/notifier</code> package. It
|
||
has been generated with the following command:</p><pre class="cmd">gocov test github.com/hunterlong/statup/core/notifier | gocov-html</pre> <p>Here are the stats. Please select a function name to view its implementation and see what's left for testing.</p><table class="overview">
|
||
<tr id="s_fn_Init"><td><code><a href="#fn_Init">Init(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>7/7</code></td></tr>
|
||
<tr id="s_fn_Load"><td><code><a href="#fn_Load">Load(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>7/7</code></td></tr>
|
||
<tr id="s_fn_Notification.SentLast"><td><code><a href="#fn_Notification.SentLast">Notification.SentLast(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>6/6</code></td></tr>
|
||
<tr id="s_fn_Update"><td><code><a href="#fn_Update">Update(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>6/6</code></td></tr>
|
||
<tr id="s_fn_Notification.IsRunning"><td><code><a href="#fn_Notification.IsRunning">Notification.IsRunning(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>5/5</code></td></tr>
|
||
<tr id="s_fn_Notification.LastSent"><td><code><a href="#fn_Notification.LastSent">Notification.LastSent(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>5/5</code></td></tr>
|
||
<tr id="s_fn_SelectNotification"><td><code><a href="#fn_SelectNotification">SelectNotification(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_OnDeletedService"><td><code><a href="#fn_OnDeletedService">OnDeletedService(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/events.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_OnNewUser"><td><code><a href="#fn_OnNewUser">OnNewUser(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/events.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_OnUpdatedUser"><td><code><a href="#fn_OnUpdatedUser">OnUpdatedUser(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/events.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_OnDeletedUser"><td><code><a href="#fn_OnDeletedUser">OnDeletedUser(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/events.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_OnUpdatedCore"><td><code><a href="#fn_OnUpdatedCore">OnUpdatedCore(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/events.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_inLimits"><td><code><a href="#fn_inLimits">inLimits(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_OnUpdatedService"><td><code><a href="#fn_OnUpdatedService">OnUpdatedService(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/events.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_OnUpdatedNotifier"><td><code><a href="#fn_OnUpdatedNotifier">OnUpdatedNotifier(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/events.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_OnNewService"><td><code><a href="#fn_OnNewService">OnNewService(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/events.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_OnSuccess"><td><code><a href="#fn_OnSuccess">OnSuccess(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/events.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_OnFailure"><td><code><a href="#fn_OnFailure">OnFailure(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/events.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_isType"><td><code><a href="#fn_isType">isType(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_reverseLogs"><td><code><a href="#fn_reverseLogs">reverseLogs(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_Notification.makeLog"><td><code><a href="#fn_Notification.makeLog">Notification.makeLog(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_Notification.SentLastHour"><td><code><a href="#fn_Notification.SentLastHour">Notification.SentLastHour(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_isEnabled"><td><code><a href="#fn_isEnabled">isEnabled(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_Notification.SentLastMinute"><td><code><a href="#fn_Notification.SentLastMinute">Notification.SentLastMinute(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_Notification.close"><td><code><a href="#fn_Notification.close">Notification.close(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_isInDatabase"><td><code><a href="#fn_isInDatabase">isInDatabase(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_Notification.CanTest"><td><code><a href="#fn_Notification.CanTest">Notification.CanTest(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_Notification.Logs"><td><code><a href="#fn_Notification.Logs">Notification.Logs(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_asNotification"><td><code><a href="#fn_asNotification">asNotification(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_modelDb"><td><code><a href="#fn_modelDb">modelDb(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_Notification.AddQueue"><td><code><a href="#fn_Notification.AddQueue">Notification.AddQueue(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_Notification.start"><td><code><a href="#fn_Notification.start">Notification.start(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_Queue"><td><code><a href="#fn_Queue">Queue(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>94.12%</code></td><td class="linecount"><code>16/17</code></td></tr>
|
||
<tr id="s_fn_checkNotifierForm"><td><code><a href="#fn_checkNotifierForm">checkNotifierForm(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/audit.go</code></td><td class="percent"><code>83.33%</code></td><td class="linecount"><code>5/6</code></td></tr>
|
||
<tr id="s_fn_insertDatabase"><td><code><a href="#fn_insertDatabase">insertDatabase(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>80.00%</code></td><td class="linecount"><code>4/5</code></td></tr>
|
||
<tr id="s_fn_contains"><td><code><a href="#fn_contains">contains(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/audit.go</code></td><td class="percent"><code>75.00%</code></td><td class="linecount"><code>3/4</code></td></tr>
|
||
<tr id="s_fn_Notification.WithinLimits"><td><code><a href="#fn_Notification.WithinLimits">Notification.WithinLimits(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>72.73%</code></td><td class="linecount"><code>8/11</code></td></tr>
|
||
<tr id="s_fn_install"><td><code><a href="#fn_install">install(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>71.43%</code></td><td class="linecount"><code>5/7</code></td></tr>
|
||
<tr id="s_fn_AddNotifier"><td><code><a href="#fn_AddNotifier">AddNotifier(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>71.43%</code></td><td class="linecount"><code>5/7</code></td></tr>
|
||
<tr id="s_fn_startAllNotifiers"><td><code><a href="#fn_startAllNotifiers">startAllNotifiers(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>57.14%</code></td><td class="linecount"><code>4/7</code></td></tr>
|
||
<tr id="s_fn_Notification.GetValue"><td><code><a href="#fn_Notification.GetValue">Notification.GetValue(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>30.77%</code></td><td class="linecount"><code>4/13</code></td></tr>
|
||
<tr id="s_fn_normalizeType"><td><code><a href="#fn_normalizeType">normalizeType(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>22.22%</code></td><td class="linecount"><code>2/9</code></td></tr>
|
||
<tr id="s_fn_SelectNotifier"><td><code><a href="#fn_SelectNotifier">SelectNotifier(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/8</code></td></tr>
|
||
<tr id="s_fn_Notification.removeQueue"><td><code><a href="#fn_Notification.removeQueue">Notification.removeQueue(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/6</code></td></tr>
|
||
<tr id="s_fn_OnSave"><td><code><a href="#fn_OnSave">OnSave(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/events.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/5</code></td></tr>
|
||
<tr id="s_fn_OnStart"><td><code><a href="#fn_OnStart">OnStart(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/events.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_OnNewNotifier"><td><code><a href="#fn_OnNewNotifier">OnNewNotifier(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/events.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_SetDB"><td><code><a href="#fn_SetDB">SetDB(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_Notification.ResetQueue"><td><code><a href="#fn_Notification.ResetQueue">Notification.ResetQueue(...)</a></code></td><td><code>github.com/hunterlong/statup/core/notifier/notifiers.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr><td colspan="2"><code>github.com/hunterlong/statup/core/notifier</code></td><td class="percent"><code>72.73%</code></td><td class="linecount"><code>152/209</code></td></tr>
|
||
</table>
|
||
|
||
<div class="funcname" id="fn_Init">func Init</div><div class="info"><a href="#s_fn_Init">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>241</td><td><code><pre>func Init(n Notifier) (*Notification, error) {</pre></code></td></tr><tr><td>242</td><td><code><pre> err := install(n)</pre></code></td></tr><tr><td>243</td><td><code><pre> var notify *Notification</pre></code></td></tr><tr><td>244</td><td><code><pre> if err == nil {</pre></code></td></tr><tr><td>245</td><td><code><pre> notify, _ = SelectNotification(n)</pre></code></td></tr><tr><td>246</td><td><code><pre> notify.testable = isType(n, new(Tester))</pre></code></td></tr><tr><td>247</td><td><code><pre> notify.Form = n.Select().Form</pre></code></td></tr><tr><td>248</td><td><code><pre> }</pre></code></td></tr><tr><td>249</td><td><code><pre> return notify, err</pre></code></td></tr><tr><td>250</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Load">func Load</div><div class="info"><a href="#s_fn_Load">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>124</td><td><code><pre>func Load() []types.AllNotifiers {</pre></code></td></tr><tr><td>125</td><td><code><pre> var notifiers []types.AllNotifiers</pre></code></td></tr><tr><td>126</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr><td>127</td><td><code><pre> n := comm.(Notifier)</pre></code></td></tr><tr><td>128</td><td><code><pre> Init(n)</pre></code></td></tr><tr><td>129</td><td><code><pre> notifiers = append(notifiers, n)</pre></code></td></tr><tr><td>130</td><td><code><pre> }</pre></code></td></tr><tr><td>131</td><td><code><pre> startAllNotifiers()</pre></code></td></tr><tr><td>132</td><td><code><pre> return notifiers</pre></code></td></tr><tr><td>133</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Notification.SentLast">func Notification.SentLast</div><div class="info"><a href="#s_fn_Notification.SentLast">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>332</td><td><code><pre>func (n *Notification) SentLast(since time.Time) int {</pre></code></td></tr><tr><td>333</td><td><code><pre> sent := 0</pre></code></td></tr><tr><td>334</td><td><code><pre> for _, v := range n.Logs() {</pre></code></td></tr><tr><td>335</td><td><code><pre> lastTime := time.Time(v.Time)</pre></code></td></tr><tr><td>336</td><td><code><pre> if lastTime.After(since) {</pre></code></td></tr><tr><td>337</td><td><code><pre> sent++</pre></code></td></tr><tr><td>338</td><td><code><pre> }</pre></code></td></tr><tr><td>339</td><td><code><pre> }</pre></code></td></tr><tr><td>340</td><td><code><pre> return sent</pre></code></td></tr><tr><td>341</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Update">func Update</div><div class="info"><a href="#s_fn_Update">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>205</td><td><code><pre>func Update(n Notifier, notif *Notification) (*Notification, error) {</pre></code></td></tr><tr><td>206</td><td><code><pre> err := db.Model(&Notification{}).Update(notif)</pre></code></td></tr><tr><td>207</td><td><code><pre> if notif.Enabled {</pre></code></td></tr><tr><td>208</td><td><code><pre> notif.close()</pre></code></td></tr><tr><td>209</td><td><code><pre> notif.start()</pre></code></td></tr><tr><td>210</td><td><code><pre> go Queue(n)</pre></code></td></tr><tr><td>211</td><td><code><pre> }</pre></code></td></tr><tr><td>212</td><td><code><pre> return notif, err.Error</pre></code></td></tr><tr><td>213</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Notification.IsRunning">func Notification.IsRunning</div><div class="info"><a href="#s_fn_Notification.IsRunning">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>429</td><td><code><pre>func (n *Notification) IsRunning() bool {</pre></code></td></tr><tr><td>430</td><td><code><pre> if n.Running == nil {</pre></code></td></tr><tr><td>431</td><td><code><pre> return false</pre></code></td></tr><tr><td>432</td><td><code><pre> }</pre></code></td></tr><tr><td>433</td><td><code><pre> select {</pre></code></td></tr><tr><td>434</td><td><code><pre> case <-n.Running:</pre></code></td></tr><tr><td>435</td><td><code><pre> return false</pre></code></td></tr><tr><td>436</td><td><code><pre> default:</pre></code></td></tr><tr><td>437</td><td><code><pre> return true</pre></code></td></tr><tr><td>438</td><td><code><pre> }</pre></code></td></tr><tr><td>439</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Notification.LastSent">func Notification.LastSent</div><div class="info"><a href="#s_fn_Notification.LastSent">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>310</td><td><code><pre>func (n *Notification) LastSent() time.Duration {</pre></code></td></tr><tr><td>311</td><td><code><pre> if len(n.logs) == 0 {</pre></code></td></tr><tr><td>312</td><td><code><pre> return time.Duration(0)</pre></code></td></tr><tr><td>313</td><td><code><pre> }</pre></code></td></tr><tr><td>314</td><td><code><pre> last := n.Logs()[0]</pre></code></td></tr><tr><td>315</td><td><code><pre> since := time.Since(last.Timestamp)</pre></code></td></tr><tr><td>316</td><td><code><pre> return since</pre></code></td></tr><tr><td>317</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_SelectNotification">func SelectNotification</div><div class="info"><a href="#s_fn_SelectNotification">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>198</td><td><code><pre>func SelectNotification(n Notifier) (*Notification, error) {</pre></code></td></tr><tr><td>199</td><td><code><pre> notifier := n.Select()</pre></code></td></tr><tr><td>200</td><td><code><pre> err := db.Model(&Notification{}).Where("method = ?", notifier.Method).Scan(&notifier)</pre></code></td></tr><tr><td>201</td><td><code><pre> return notifier, err.Error</pre></code></td></tr><tr><td>202</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_OnDeletedService">func OnDeletedService</div><div class="info"><a href="#s_fn_OnDeletedService">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go</code>:</p></div><table class="listing">
|
||
<tr><td>69</td><td><code><pre>func OnDeletedService(s *types.Service) {</pre></code></td></tr><tr><td>70</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr><td>71</td><td><code><pre> if isType(comm, new(ServiceEvents)) && isEnabled(comm) && inLimits(comm) {</pre></code></td></tr><tr><td>72</td><td><code><pre> comm.(ServiceEvents).OnDeletedService(s)</pre></code></td></tr><tr><td>73</td><td><code><pre> }</pre></code></td></tr><tr><td>74</td><td><code><pre> }</pre></code></td></tr><tr><td>75</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_OnNewUser">func OnNewUser</div><div class="info"><a href="#s_fn_OnNewUser">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go</code>:</p></div><table class="listing">
|
||
<tr><td>78</td><td><code><pre>func OnNewUser(u *types.User) {</pre></code></td></tr><tr><td>79</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr><td>80</td><td><code><pre> if isType(comm, new(UserEvents)) && isEnabled(comm) && inLimits(comm) {</pre></code></td></tr><tr><td>81</td><td><code><pre> comm.(UserEvents).OnNewUser(u)</pre></code></td></tr><tr><td>82</td><td><code><pre> }</pre></code></td></tr><tr><td>83</td><td><code><pre> }</pre></code></td></tr><tr><td>84</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_OnUpdatedUser">func OnUpdatedUser</div><div class="info"><a href="#s_fn_OnUpdatedUser">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go</code>:</p></div><table class="listing">
|
||
<tr><td>87</td><td><code><pre>func OnUpdatedUser(u *types.User) {</pre></code></td></tr><tr><td>88</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr><td>89</td><td><code><pre> if isType(comm, new(UserEvents)) && isEnabled(comm) && inLimits(comm) {</pre></code></td></tr><tr><td>90</td><td><code><pre> comm.(UserEvents).OnUpdatedUser(u)</pre></code></td></tr><tr><td>91</td><td><code><pre> }</pre></code></td></tr><tr><td>92</td><td><code><pre> }</pre></code></td></tr><tr><td>93</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_OnDeletedUser">func OnDeletedUser</div><div class="info"><a href="#s_fn_OnDeletedUser">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go</code>:</p></div><table class="listing">
|
||
<tr><td>96</td><td><code><pre>func OnDeletedUser(u *types.User) {</pre></code></td></tr><tr><td>97</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr><td>98</td><td><code><pre> if isType(comm, new(UserEvents)) && isEnabled(comm) && inLimits(comm) {</pre></code></td></tr><tr><td>99</td><td><code><pre> comm.(UserEvents).OnDeletedUser(u)</pre></code></td></tr><tr><td>100</td><td><code><pre> }</pre></code></td></tr><tr><td>101</td><td><code><pre> }</pre></code></td></tr><tr><td>102</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_OnUpdatedCore">func OnUpdatedCore</div><div class="info"><a href="#s_fn_OnUpdatedCore">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go</code>:</p></div><table class="listing">
|
||
<tr><td>105</td><td><code><pre>func OnUpdatedCore(c *types.Core) {</pre></code></td></tr><tr><td>106</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr><td>107</td><td><code><pre> if isType(comm, new(CoreEvents)) && isEnabled(comm) && inLimits(comm) {</pre></code></td></tr><tr><td>108</td><td><code><pre> comm.(CoreEvents).OnUpdatedCore(c)</pre></code></td></tr><tr><td>109</td><td><code><pre> }</pre></code></td></tr><tr><td>110</td><td><code><pre> }</pre></code></td></tr><tr><td>111</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_inLimits">func inLimits</div><div class="info"><a href="#s_fn_inLimits">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>385</td><td><code><pre>func inLimits(n interface{}) bool {</pre></code></td></tr><tr><td>386</td><td><code><pre> notifier := n.(Notifier).Select()</pre></code></td></tr><tr><td>387</td><td><code><pre> ok, _ := notifier.WithinLimits()</pre></code></td></tr><tr><td>388</td><td><code><pre> return ok</pre></code></td></tr><tr><td>389</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_OnUpdatedService">func OnUpdatedService</div><div class="info"><a href="#s_fn_OnUpdatedService">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go</code>:</p></div><table class="listing">
|
||
<tr><td>60</td><td><code><pre>func OnUpdatedService(s *types.Service) {</pre></code></td></tr><tr><td>61</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr><td>62</td><td><code><pre> if isType(comm, new(ServiceEvents)) && isEnabled(comm) && inLimits(comm) {</pre></code></td></tr><tr><td>63</td><td><code><pre> comm.(ServiceEvents).OnUpdatedService(s)</pre></code></td></tr><tr><td>64</td><td><code><pre> }</pre></code></td></tr><tr><td>65</td><td><code><pre> }</pre></code></td></tr><tr><td>66</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_OnUpdatedNotifier">func OnUpdatedNotifier</div><div class="info"><a href="#s_fn_OnUpdatedNotifier">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go</code>:</p></div><table class="listing">
|
||
<tr><td>132</td><td><code><pre>func OnUpdatedNotifier(n *Notification) {</pre></code></td></tr><tr><td>133</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr><td>134</td><td><code><pre> if isType(comm, new(NotifierEvents)) && isEnabled(comm) && inLimits(comm) {</pre></code></td></tr><tr><td>135</td><td><code><pre> comm.(NotifierEvents).OnUpdatedNotifier(n)</pre></code></td></tr><tr><td>136</td><td><code><pre> }</pre></code></td></tr><tr><td>137</td><td><code><pre> }</pre></code></td></tr><tr><td>138</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_OnNewService">func OnNewService</div><div class="info"><a href="#s_fn_OnNewService">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go</code>:</p></div><table class="listing">
|
||
<tr><td>51</td><td><code><pre>func OnNewService(s *types.Service) {</pre></code></td></tr><tr><td>52</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr><td>53</td><td><code><pre> if isType(comm, new(ServiceEvents)) && isEnabled(comm) && inLimits(comm) {</pre></code></td></tr><tr><td>54</td><td><code><pre> comm.(ServiceEvents).OnNewService(s)</pre></code></td></tr><tr><td>55</td><td><code><pre> }</pre></code></td></tr><tr><td>56</td><td><code><pre> }</pre></code></td></tr><tr><td>57</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_OnSuccess">func OnSuccess</div><div class="info"><a href="#s_fn_OnSuccess">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go</code>:</p></div><table class="listing">
|
||
<tr><td>42</td><td><code><pre>func OnSuccess(s *types.Service) {</pre></code></td></tr><tr><td>43</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr><td>44</td><td><code><pre> if isType(comm, new(BasicEvents)) && isEnabled(comm) && inLimits(comm) {</pre></code></td></tr><tr><td>45</td><td><code><pre> comm.(BasicEvents).OnSuccess(s)</pre></code></td></tr><tr><td>46</td><td><code><pre> }</pre></code></td></tr><tr><td>47</td><td><code><pre> }</pre></code></td></tr><tr><td>48</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_OnFailure">func OnFailure</div><div class="info"><a href="#s_fn_OnFailure">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go</code>:</p></div><table class="listing">
|
||
<tr><td>33</td><td><code><pre>func OnFailure(s *types.Service, f *types.Failure) {</pre></code></td></tr><tr><td>34</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr><td>35</td><td><code><pre> if isType(comm, new(BasicEvents)) && isEnabled(comm) && inLimits(comm) {</pre></code></td></tr><tr><td>36</td><td><code><pre> comm.(BasicEvents).OnFailure(s, f)</pre></code></td></tr><tr><td>37</td><td><code><pre> }</pre></code></td></tr><tr><td>38</td><td><code><pre> }</pre></code></td></tr><tr><td>39</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_isType">func isType</div><div class="info"><a href="#s_fn_isType">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>372</td><td><code><pre>func isType(n interface{}, obj interface{}) bool {</pre></code></td></tr><tr><td>373</td><td><code><pre> one := reflect.TypeOf(n)</pre></code></td></tr><tr><td>374</td><td><code><pre> two := reflect.ValueOf(obj).Elem()</pre></code></td></tr><tr><td>375</td><td><code><pre> return one.Implements(two.Type())</pre></code></td></tr><tr><td>376</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_reverseLogs">func reverseLogs</div><div class="info"><a href="#s_fn_reverseLogs">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>184</td><td><code><pre>func reverseLogs(input []*NotificationLog) []*NotificationLog {</pre></code></td></tr><tr><td>185</td><td><code><pre> if len(input) == 0 {</pre></code></td></tr><tr><td>186</td><td><code><pre> return input</pre></code></td></tr><tr><td>187</td><td><code><pre> }</pre></code></td></tr><tr><td>188</td><td><code><pre> return append(reverseLogs(input[1:]), input[0])</pre></code></td></tr><tr><td>189</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Notification.makeLog">func Notification.makeLog</div><div class="info"><a href="#s_fn_Notification.makeLog">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>169</td><td><code><pre>func (n *Notification) makeLog(msg interface{}) {</pre></code></td></tr><tr><td>170</td><td><code><pre> log := &NotificationLog{</pre></code></td></tr><tr><td>171</td><td><code><pre> Message: normalizeType(msg),</pre></code></td></tr><tr><td>172</td><td><code><pre> Time: utils.Timestamp(time.Now()),</pre></code></td></tr><tr><td>173</td><td><code><pre> Timestamp: time.Now(),</pre></code></td></tr><tr><td>174</td><td><code><pre> }</pre></code></td></tr><tr><td>175</td><td><code><pre> n.logs = append(n.logs, log)</pre></code></td></tr><tr><td>176</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Notification.SentLastHour">func Notification.SentLastHour</div><div class="info"><a href="#s_fn_Notification.SentLastHour">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>320</td><td><code><pre>func (n *Notification) SentLastHour() int {</pre></code></td></tr><tr><td>321</td><td><code><pre> since := time.Now().Add(-1 * time.Hour)</pre></code></td></tr><tr><td>322</td><td><code><pre> return n.SentLast(since)</pre></code></td></tr><tr><td>323</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_isEnabled">func isEnabled</div><div class="info"><a href="#s_fn_isEnabled">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>379</td><td><code><pre>func isEnabled(n interface{}) bool {</pre></code></td></tr><tr><td>380</td><td><code><pre> notifier, _ := SelectNotification(n.(Notifier))</pre></code></td></tr><tr><td>381</td><td><code><pre> return notifier.Enabled</pre></code></td></tr><tr><td>382</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Notification.SentLastMinute">func Notification.SentLastMinute</div><div class="info"><a href="#s_fn_Notification.SentLastMinute">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>326</td><td><code><pre>func (n *Notification) SentLastMinute() int {</pre></code></td></tr><tr><td>327</td><td><code><pre> since := time.Now().Add(-1 * time.Minute)</pre></code></td></tr><tr><td>328</td><td><code><pre> return n.SentLast(since)</pre></code></td></tr><tr><td>329</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Notification.close">func Notification.close</div><div class="info"><a href="#s_fn_Notification.close">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>422</td><td><code><pre>func (n *Notification) close() {</pre></code></td></tr><tr><td>423</td><td><code><pre> if n.IsRunning() {</pre></code></td></tr><tr><td>424</td><td><code><pre> close(n.Running)</pre></code></td></tr><tr><td>425</td><td><code><pre> }</pre></code></td></tr><tr><td>426</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_isInDatabase">func isInDatabase</div><div class="info"><a href="#s_fn_isInDatabase">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>192</td><td><code><pre>func isInDatabase(n *Notification) bool {</pre></code></td></tr><tr><td>193</td><td><code><pre> inDb := modelDb(n).RecordNotFound()</pre></code></td></tr><tr><td>194</td><td><code><pre> return !inDb</pre></code></td></tr><tr><td>195</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Notification.CanTest">func Notification.CanTest</div><div class="info"><a href="#s_fn_Notification.CanTest">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>90</td><td><code><pre>func (n *Notification) CanTest() bool {</pre></code></td></tr><tr><td>91</td><td><code><pre> return n.testable</pre></code></td></tr><tr><td>92</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Notification.Logs">func Notification.Logs</div><div class="info"><a href="#s_fn_Notification.Logs">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>179</td><td><code><pre>func (n *Notification) Logs() []*NotificationLog {</pre></code></td></tr><tr><td>180</td><td><code><pre> return reverseLogs(n.logs)</pre></code></td></tr><tr><td>181</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_asNotification">func asNotification</div><div class="info"><a href="#s_fn_asNotification">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>105</td><td><code><pre>func asNotification(n Notifier) *Notification {</pre></code></td></tr><tr><td>106</td><td><code><pre> return n.Select()</pre></code></td></tr><tr><td>107</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_modelDb">func modelDb</div><div class="info"><a href="#s_fn_modelDb">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>95</td><td><code><pre>func modelDb(n *Notification) *gorm.DB {</pre></code></td></tr><tr><td>96</td><td><code><pre> return db.Model(&Notification{}).Where("method = ?", n.Method).Find(n)</pre></code></td></tr><tr><td>97</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Notification.AddQueue">func Notification.AddQueue</div><div class="info"><a href="#s_fn_Notification.AddQueue">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>85</td><td><code><pre>func (n *Notification) AddQueue(msg interface{}) {</pre></code></td></tr><tr><td>86</td><td><code><pre> n.Queue = append(n.Queue, msg)</pre></code></td></tr><tr><td>87</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Notification.start">func Notification.start</div><div class="info"><a href="#s_fn_Notification.start">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>417</td><td><code><pre>func (n *Notification) start() {</pre></code></td></tr><tr><td>418</td><td><code><pre> n.Running = make(chan bool)</pre></code></td></tr><tr><td>419</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Queue">func Queue</div><div class="info"><a href="#s_fn_Queue">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>267</td><td><code><pre>func Queue(n Notifier) {</pre></code></td></tr><tr><td>268</td><td><code><pre> notification := n.Select()</pre></code></td></tr><tr><td>269</td><td><code><pre> rateLimit := notification.Delay</pre></code></td></tr><tr><td>270</td><td><code><pre></pre></code></td></tr><tr><td>271</td><td><code><pre>CheckNotifier:</pre></code></td></tr><tr><td>272</td><td><code><pre> for {</pre></code></td></tr><tr><td>273</td><td><code><pre> select {</pre></code></td></tr><tr><td>274</td><td><code><pre> case <-notification.Running:</pre></code></td></tr><tr><td>275</td><td><code><pre> break CheckNotifier</pre></code></td></tr><tr><td>276</td><td><code><pre> case <-time.After(rateLimit):</pre></code></td></tr><tr><td>277</td><td><code><pre> notification = n.Select()</pre></code></td></tr><tr><td>278</td><td><code><pre> if len(notification.Queue) > 0 {</pre></code></td></tr><tr><td>279</td><td><code><pre> ok, _ := notification.WithinLimits()</pre></code></td></tr><tr><td>280</td><td><code><pre> if ok {</pre></code></td></tr><tr><td>281</td><td><code><pre> msg := notification.Queue[0]</pre></code></td></tr><tr><td>282</td><td><code><pre> err := n.Send(msg)</pre></code></td></tr><tr><td>283</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>284</td><td><code><pre> utils.Log(2, fmt.Sprintf("notifier %v had an error: %v", notification.Method, err))</pre></code></td></tr><tr><td>285</td><td><code><pre> }</pre></code></td></tr><tr><td>286</td><td><code><pre> notification.makeLog(msg)</pre></code></td></tr><tr><td>287</td><td><code><pre> notification.Queue = notification.Queue[1:]</pre></code></td></tr><tr><td>288</td><td><code><pre> rateLimit = notification.Delay</pre></code></td></tr><tr><td>289</td><td><code><pre> }</pre></code></td></tr><tr><td>290</td><td><code><pre> }</pre></code></td></tr><tr><td>291</td><td><code><pre> }</pre></code></td></tr><tr><td>292</td><td><code><pre> continue</pre></code></td></tr><tr><td>293</td><td><code><pre> }</pre></code></td></tr><tr><td>294</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_checkNotifierForm">func checkNotifierForm</div><div class="info"><a href="#s_fn_checkNotifierForm">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/audit.go</code>:</p></div><table class="listing">
|
||
<tr><td>27</td><td><code><pre>func checkNotifierForm(n Notifier) error {</pre></code></td></tr><tr><td>28</td><td><code><pre> notifier := asNotification(n)</pre></code></td></tr><tr><td>29</td><td><code><pre> for _, f := range notifier.Form {</pre></code></td></tr><tr><td>30</td><td><code><pre> contains := contains(f.DbField, allowedVars)</pre></code></td></tr><tr><td>31</td><td><code><pre> if !contains {</pre></code></td></tr><tr class="miss"><td>32</td><td><code><pre> return fmt.Errorf("the DbField '%v' is not allowed, allowed vars: %v", f.DbField, allowedVars)</pre></code></td></tr><tr><td>33</td><td><code><pre> }</pre></code></td></tr><tr><td>34</td><td><code><pre> }</pre></code></td></tr><tr><td>35</td><td><code><pre> return nil</pre></code></td></tr><tr><td>36</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_insertDatabase">func insertDatabase</div><div class="info"><a href="#s_fn_insertDatabase">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>216</td><td><code><pre>func insertDatabase(n *Notification) (int64, error) {</pre></code></td></tr><tr><td>217</td><td><code><pre> n.Limits = 3</pre></code></td></tr><tr><td>218</td><td><code><pre> query := db.Create(n)</pre></code></td></tr><tr><td>219</td><td><code><pre> if query.Error != nil {</pre></code></td></tr><tr class="miss"><td>220</td><td><code><pre> return 0, query.Error</pre></code></td></tr><tr><td>221</td><td><code><pre> }</pre></code></td></tr><tr><td>222</td><td><code><pre> return n.Id, query.Error</pre></code></td></tr><tr><td>223</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_contains">func contains</div><div class="info"><a href="#s_fn_contains">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/audit.go</code>:</p></div><table class="listing">
|
||
<tr><td>38</td><td><code><pre>func contains(s string, arr []string) bool {</pre></code></td></tr><tr><td>39</td><td><code><pre> for _, v := range arr {</pre></code></td></tr><tr><td>40</td><td><code><pre> if strings.ToLower(s) == v {</pre></code></td></tr><tr><td>41</td><td><code><pre> return true</pre></code></td></tr><tr><td>42</td><td><code><pre> }</pre></code></td></tr><tr><td>43</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>44</td><td><code><pre> return false</pre></code></td></tr><tr><td>45</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Notification.WithinLimits">func Notification.WithinLimits</div><div class="info"><a href="#s_fn_Notification.WithinLimits">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>392</td><td><code><pre>func (n *Notification) WithinLimits() (bool, error) {</pre></code></td></tr><tr><td>393</td><td><code><pre> if n.SentLastMinute() == 0 {</pre></code></td></tr><tr><td>394</td><td><code><pre> return true, nil</pre></code></td></tr><tr><td>395</td><td><code><pre> }</pre></code></td></tr><tr><td>396</td><td><code><pre> if n.SentLastMinute() >= n.Limits {</pre></code></td></tr><tr class="miss"><td>397</td><td><code><pre> return false, fmt.Errorf("notifier sent %v out of %v in last minute", n.SentLastMinute(), n.Limits)</pre></code></td></tr><tr><td>398</td><td><code><pre> }</pre></code></td></tr><tr><td>399</td><td><code><pre> if n.Delay.Seconds() == 0 {</pre></code></td></tr><tr class="miss"><td>400</td><td><code><pre> n.Delay = time.Duration(500 * time.Millisecond)</pre></code></td></tr><tr><td>401</td><td><code><pre> }</pre></code></td></tr><tr><td>402</td><td><code><pre> if n.LastSent().Seconds() == 0 {</pre></code></td></tr><tr class="miss"><td>403</td><td><code><pre> return true, nil</pre></code></td></tr><tr><td>404</td><td><code><pre> }</pre></code></td></tr><tr><td>405</td><td><code><pre> if n.Delay.Seconds() >= n.LastSent().Seconds() {</pre></code></td></tr><tr><td>406</td><td><code><pre> return false, fmt.Errorf("notifiers delay (%v) is greater than last message sent (%v)", n.Delay.Seconds(), n.LastSent().Seconds())</pre></code></td></tr><tr><td>407</td><td><code><pre> }</pre></code></td></tr><tr><td>408</td><td><code><pre> return true, nil</pre></code></td></tr><tr><td>409</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_install">func install</div><div class="info"><a href="#s_fn_install">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>297</td><td><code><pre>func install(n Notifier) error {</pre></code></td></tr><tr><td>298</td><td><code><pre> inDb := isInDatabase(n.Select())</pre></code></td></tr><tr><td>299</td><td><code><pre> if !inDb {</pre></code></td></tr><tr><td>300</td><td><code><pre> _, err := insertDatabase(n.Select())</pre></code></td></tr><tr><td>301</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>302</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr class="miss"><td>303</td><td><code><pre> return err</pre></code></td></tr><tr><td>304</td><td><code><pre> }</pre></code></td></tr><tr><td>305</td><td><code><pre> }</pre></code></td></tr><tr><td>306</td><td><code><pre> return nil</pre></code></td></tr><tr><td>307</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_AddNotifier">func AddNotifier</div><div class="info"><a href="#s_fn_AddNotifier">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>110</td><td><code><pre>func AddNotifier(n Notifier) error {</pre></code></td></tr><tr><td>111</td><td><code><pre> if isType(n, new(Notifier)) {</pre></code></td></tr><tr><td>112</td><td><code><pre> err := checkNotifierForm(n)</pre></code></td></tr><tr><td>113</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>114</td><td><code><pre> return err</pre></code></td></tr><tr><td>115</td><td><code><pre> }</pre></code></td></tr><tr><td>116</td><td><code><pre> AllCommunications = append(AllCommunications, n)</pre></code></td></tr><tr><td>117</td><td><code><pre> } else {</pre></code></td></tr><tr class="miss"><td>118</td><td><code><pre> return errors.New("notifier does not have the required methods")</pre></code></td></tr><tr><td>119</td><td><code><pre> }</pre></code></td></tr><tr><td>120</td><td><code><pre> return nil</pre></code></td></tr><tr><td>121</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_startAllNotifiers">func startAllNotifiers</div><div class="info"><a href="#s_fn_startAllNotifiers">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>253</td><td><code><pre>func startAllNotifiers() {</pre></code></td></tr><tr><td>254</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr><td>255</td><td><code><pre> if isType(comm, new(Notifier)) {</pre></code></td></tr><tr><td>256</td><td><code><pre> notify := comm.(Notifier)</pre></code></td></tr><tr><td>257</td><td><code><pre> if notify.Select().Enabled {</pre></code></td></tr><tr class="miss"><td>258</td><td><code><pre> notify.Select().close()</pre></code></td></tr><tr class="miss"><td>259</td><td><code><pre> notify.Select().start()</pre></code></td></tr><tr class="miss"><td>260</td><td><code><pre> go Queue(notify)</pre></code></td></tr><tr><td>261</td><td><code><pre> }</pre></code></td></tr><tr><td>262</td><td><code><pre> }</pre></code></td></tr><tr><td>263</td><td><code><pre> }</pre></code></td></tr><tr><td>264</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Notification.GetValue">func Notification.GetValue</div><div class="info"><a href="#s_fn_Notification.GetValue">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>344</td><td><code><pre>func (n *Notification) GetValue(dbField string) string {</pre></code></td></tr><tr><td>345</td><td><code><pre> dbField = strings.ToLower(dbField)</pre></code></td></tr><tr><td>346</td><td><code><pre> switch dbField {</pre></code></td></tr><tr><td>347</td><td><code><pre> case "host":</pre></code></td></tr><tr><td>348</td><td><code><pre> return n.Host</pre></code></td></tr><tr><td>349</td><td><code><pre> case "port":</pre></code></td></tr><tr class="miss"><td>350</td><td><code><pre> return fmt.Sprintf("%v", n.Port)</pre></code></td></tr><tr><td>351</td><td><code><pre> case "username":</pre></code></td></tr><tr class="miss"><td>352</td><td><code><pre> return n.Username</pre></code></td></tr><tr><td>353</td><td><code><pre> case "password":</pre></code></td></tr><tr class="miss"><td>354</td><td><code><pre> if n.Password != "" {</pre></code></td></tr><tr class="miss"><td>355</td><td><code><pre> return "##########"</pre></code></td></tr><tr><td>356</td><td><code><pre> }</pre></code></td></tr><tr><td>357</td><td><code><pre> case "var1":</pre></code></td></tr><tr class="miss"><td>358</td><td><code><pre> return n.Var1</pre></code></td></tr><tr><td>359</td><td><code><pre> case "var2":</pre></code></td></tr><tr class="miss"><td>360</td><td><code><pre> return n.Var2</pre></code></td></tr><tr><td>361</td><td><code><pre> case "api_key":</pre></code></td></tr><tr><td>362</td><td><code><pre> return n.ApiKey</pre></code></td></tr><tr><td>363</td><td><code><pre> case "api_secret":</pre></code></td></tr><tr class="miss"><td>364</td><td><code><pre> return n.ApiSecret</pre></code></td></tr><tr><td>365</td><td><code><pre> case "limits":</pre></code></td></tr><tr class="miss"><td>366</td><td><code><pre> return utils.ToString(int(n.Limits))</pre></code></td></tr><tr><td>367</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>368</td><td><code><pre> return ""</pre></code></td></tr><tr><td>369</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_normalizeType">func normalizeType</div><div class="info"><a href="#s_fn_normalizeType">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>136</td><td><code><pre>func normalizeType(ty interface{}) string {</pre></code></td></tr><tr><td>137</td><td><code><pre> switch v := ty.(type) {</pre></code></td></tr><tr><td>138</td><td><code><pre> case int, int32, int64:</pre></code></td></tr><tr class="miss"><td>139</td><td><code><pre> return fmt.Sprintf("%v", v)</pre></code></td></tr><tr><td>140</td><td><code><pre> case float32, float64:</pre></code></td></tr><tr class="miss"><td>141</td><td><code><pre> return fmt.Sprintf("%v", v)</pre></code></td></tr><tr><td>142</td><td><code><pre> case string:</pre></code></td></tr><tr><td>143</td><td><code><pre> return v</pre></code></td></tr><tr><td>144</td><td><code><pre> case []byte:</pre></code></td></tr><tr class="miss"><td>145</td><td><code><pre> return string(v)</pre></code></td></tr><tr><td>146</td><td><code><pre> case []string:</pre></code></td></tr><tr class="miss"><td>147</td><td><code><pre> return fmt.Sprintf("%v", v)</pre></code></td></tr><tr><td>148</td><td><code><pre> case interface{}, map[string]interface{}:</pre></code></td></tr><tr class="miss"><td>149</td><td><code><pre> j, _ := json.Marshal(v)</pre></code></td></tr><tr class="miss"><td>150</td><td><code><pre> return string(j)</pre></code></td></tr><tr><td>151</td><td><code><pre> default:</pre></code></td></tr><tr class="miss"><td>152</td><td><code><pre> return fmt.Sprintf("%v", v)</pre></code></td></tr><tr><td>153</td><td><code><pre> }</pre></code></td></tr><tr><td>154</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_SelectNotifier">func SelectNotifier</div><div class="info"><a href="#s_fn_SelectNotifier">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>226</td><td><code><pre>func SelectNotifier(method string) (*Notification, Notifier, error) {</pre></code></td></tr><tr class="miss"><td>227</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr class="miss"><td>228</td><td><code><pre> n, ok := comm.(Notifier)</pre></code></td></tr><tr class="miss"><td>229</td><td><code><pre> if !ok {</pre></code></td></tr><tr class="miss"><td>230</td><td><code><pre> return nil, nil, fmt.Errorf("incorrect notification type: %v", reflect.TypeOf(n).String())</pre></code></td></tr><tr><td>231</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>232</td><td><code><pre> notifier := n.Select()</pre></code></td></tr><tr class="miss"><td>233</td><td><code><pre> if notifier.Method == method {</pre></code></td></tr><tr class="miss"><td>234</td><td><code><pre> return notifier, comm.(Notifier), nil</pre></code></td></tr><tr><td>235</td><td><code><pre> }</pre></code></td></tr><tr><td>236</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>237</td><td><code><pre> return nil, nil, nil</pre></code></td></tr><tr><td>238</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Notification.removeQueue">func Notification.removeQueue</div><div class="info"><a href="#s_fn_Notification.removeQueue">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>157</td><td><code><pre>func (n *Notification) removeQueue(msg interface{}) interface{} {</pre></code></td></tr><tr class="miss"><td>158</td><td><code><pre> var newArr []interface{}</pre></code></td></tr><tr class="miss"><td>159</td><td><code><pre> for _, q := range n.Queue {</pre></code></td></tr><tr class="miss"><td>160</td><td><code><pre> if q != msg {</pre></code></td></tr><tr class="miss"><td>161</td><td><code><pre> newArr = append(newArr, q)</pre></code></td></tr><tr><td>162</td><td><code><pre> }</pre></code></td></tr><tr><td>163</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>164</td><td><code><pre> n.Queue = newArr</pre></code></td></tr><tr class="miss"><td>165</td><td><code><pre> return newArr</pre></code></td></tr><tr><td>166</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_OnSave">func OnSave</div><div class="info"><a href="#s_fn_OnSave">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go</code>:</p></div><table class="listing">
|
||
<tr><td>21</td><td><code><pre>func OnSave(method string) {</pre></code></td></tr><tr class="miss"><td>22</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr class="miss"><td>23</td><td><code><pre> if isType(comm, new(Notifier)) {</pre></code></td></tr><tr class="miss"><td>24</td><td><code><pre> notifier := comm.(Notifier)</pre></code></td></tr><tr class="miss"><td>25</td><td><code><pre> if notifier.Select().Method == method {</pre></code></td></tr><tr class="miss"><td>26</td><td><code><pre> notifier.OnSave()</pre></code></td></tr><tr><td>27</td><td><code><pre> }</pre></code></td></tr><tr><td>28</td><td><code><pre> }</pre></code></td></tr><tr><td>29</td><td><code><pre> }</pre></code></td></tr><tr><td>30</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_OnStart">func OnStart</div><div class="info"><a href="#s_fn_OnStart">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go</code>:</p></div><table class="listing">
|
||
<tr><td>114</td><td><code><pre>func OnStart(c *types.Core) {</pre></code></td></tr><tr class="miss"><td>115</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr class="miss"><td>116</td><td><code><pre> if isType(comm, new(CoreEvents)) && isEnabled(comm) && inLimits(comm) {</pre></code></td></tr><tr class="miss"><td>117</td><td><code><pre> comm.(CoreEvents).OnUpdatedCore(c)</pre></code></td></tr><tr><td>118</td><td><code><pre> }</pre></code></td></tr><tr><td>119</td><td><code><pre> }</pre></code></td></tr><tr><td>120</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_OnNewNotifier">func OnNewNotifier</div><div class="info"><a href="#s_fn_OnNewNotifier">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/events.go</code>:</p></div><table class="listing">
|
||
<tr><td>123</td><td><code><pre>func OnNewNotifier(n *Notification) {</pre></code></td></tr><tr class="miss"><td>124</td><td><code><pre> for _, comm := range AllCommunications {</pre></code></td></tr><tr class="miss"><td>125</td><td><code><pre> if isType(comm, new(NotifierEvents)) && isEnabled(comm) && inLimits(comm) {</pre></code></td></tr><tr class="miss"><td>126</td><td><code><pre> comm.(NotifierEvents).OnNewNotifier(n)</pre></code></td></tr><tr><td>127</td><td><code><pre> }</pre></code></td></tr><tr><td>128</td><td><code><pre> }</pre></code></td></tr><tr><td>129</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_SetDB">func SetDB</div><div class="info"><a href="#s_fn_SetDB">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>100</td><td><code><pre>func SetDB(d *gorm.DB) {</pre></code></td></tr><tr class="miss"><td>101</td><td><code><pre> db = d</pre></code></td></tr><tr><td>102</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Notification.ResetQueue">func Notification.ResetQueue</div><div class="info"><a href="#s_fn_Notification.ResetQueue">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/core/notifier/notifiers.go</code>:</p></div><table class="listing">
|
||
<tr><td>412</td><td><code><pre>func (n *Notification) ResetQueue() {</pre></code></td></tr><tr class="miss"><td>413</td><td><code><pre> n.Queue = nil</pre></code></td></tr><tr><td>414</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<!-- Can be parsed by external script
|
||
PACKAGE:github.com/hunterlong/statup/core/notifier DONE:72.73
|
||
-->
|
||
|
||
<div id="pkg_github.com/hunterlong/statup/handlers" class="funcname">Package Overview: github.com/hunterlong/statup/handlers <span class="packageTotal">67.41%</span></div><p>This is a coverage report created after analysis of the <code>github.com/hunterlong/statup/handlers</code> package. It
|
||
has been generated with the following command:</p><pre class="cmd">gocov test github.com/hunterlong/statup/handlers | gocov-html</pre> <p>Here are the stats. Please select a function name to view its implementation and see what's left for testing.</p><table class="overview">
|
||
<tr id="s_fn_Router"><td><code><a href="#fn_Router">Router(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/routes.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>68/68</code></td></tr>
|
||
<tr id="s_fn_prometheusHandler"><td><code><a href="#fn_prometheusHandler">prometheusHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/prometheus.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>22/22</code></td></tr>
|
||
<tr id="s_fn_exportHandler"><td><code><a href="#fn_exportHandler">exportHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/dashboard.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>18/18</code></td></tr>
|
||
<tr id="s_fn_saveSASSHandler"><td><code><a href="#fn_saveSASSHandler">saveSASSHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/settings.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>13/13</code></td></tr>
|
||
<tr id="s_fn_renderServiceChartsHandler"><td><code><a href="#fn_renderServiceChartsHandler">renderServiceChartsHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/services.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>10/10</code></td></tr>
|
||
<tr id="s_fn_logsHandler"><td><code><a href="#fn_logsHandler">logsHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/dashboard.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>10/10</code></td></tr>
|
||
<tr id="s_fn_isAuthorized"><td><code><a href="#fn_isAuthorized">isAuthorized(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/prometheus.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>8/8</code></td></tr>
|
||
<tr id="s_fn_servicesDeleteFailuresHandler"><td><code><a href="#fn_servicesDeleteFailuresHandler">servicesDeleteFailuresHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/services.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>7/7</code></td></tr>
|
||
<tr id="s_fn_usersEditHandler"><td><code><a href="#fn_usersEditHandler">usersEditHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/users.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>7/7</code></td></tr>
|
||
<tr id="s_fn_deleteAssetsHandler"><td><code><a href="#fn_deleteAssetsHandler">deleteAssetsHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/settings.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>6/6</code></td></tr>
|
||
<tr id="s_fn_RunHTTPServer"><td><code><a href="#fn_RunHTTPServer">RunHTTPServer(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>6/6</code></td></tr>
|
||
<tr id="s_fn_usersHandler"><td><code><a href="#fn_usersHandler">usersHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/users.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>5/5</code></td></tr>
|
||
<tr id="s_fn_logsLineHandler"><td><code><a href="#fn_logsLineHandler">logsLineHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/dashboard.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>5/5</code></td></tr>
|
||
<tr id="s_fn_helpHandler"><td><code><a href="#fn_helpHandler">helpHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/dashboard.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>5/5</code></td></tr>
|
||
<tr id="s_fn_settingsHandler"><td><code><a href="#fn_settingsHandler">settingsHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/settings.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_servicesHandler"><td><code><a href="#fn_servicesHandler">servicesHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/services.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_logoutHandler"><td><code><a href="#fn_logoutHandler">logoutHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/dashboard.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_parseGet"><td><code><a href="#fn_parseGet">parseGet(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/settings.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_error404Handler"><td><code><a href="#fn_error404Handler">error404Handler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_resetRouter"><td><code><a href="#fn_resetRouter">resetRouter(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/routes.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_parseForm"><td><code><a href="#fn_parseForm">parseForm(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/settings.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_@126:17"><td><code><a href="#fn_@126:17">@126:17(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_@129:10"><td><code><a href="#fn_@129:10">@129:10(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_@138:15"><td><code><a href="#fn_@138:15">@138:15(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_@151:15"><td><code><a href="#fn_@151:15">@151:15(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_@88:20"><td><code><a href="#fn_@88:20">@88:20(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_@135:12"><td><code><a href="#fn_@135:12">@135:12(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_@93:11"><td><code><a href="#fn_@93:11">@93:11(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_@96:11"><td><code><a href="#fn_@96:11">@96:11(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_@99:14"><td><code><a href="#fn_@99:14">@99:14(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_@102:14"><td><code><a href="#fn_@102:14">@102:14(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_@105:15"><td><code><a href="#fn_@105:15">@105:15(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_@108:14"><td><code><a href="#fn_@108:14">@108:14(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_@154:17"><td><code><a href="#fn_@154:17">@154:17(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_@157:14"><td><code><a href="#fn_@157:14">@157:14(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_saveSettingsHandler"><td><code><a href="#fn_saveSettingsHandler">saveSettingsHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/settings.go</code></td><td class="percent"><code>96.15%</code></td><td class="linecount"><code>25/26</code></td></tr>
|
||
<tr id="s_fn_servicesUpdateHandler"><td><code><a href="#fn_servicesUpdateHandler">servicesUpdateHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/services.go</code></td><td class="percent"><code>93.55%</code></td><td class="linecount"><code>29/31</code></td></tr>
|
||
<tr id="s_fn_loginHandler"><td><code><a href="#fn_loginHandler">loginHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/dashboard.go</code></td><td class="percent"><code>92.86%</code></td><td class="linecount"><code>13/14</code></td></tr>
|
||
<tr id="s_fn_createUserHandler"><td><code><a href="#fn_createUserHandler">createUserHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/users.go</code></td><td class="percent"><code>92.31%</code></td><td class="linecount"><code>12/13</code></td></tr>
|
||
<tr id="s_fn_createServiceHandler"><td><code><a href="#fn_createServiceHandler">createServiceHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/services.go</code></td><td class="percent"><code>90.91%</code></td><td class="linecount"><code>20/22</code></td></tr>
|
||
<tr id="s_fn_servicesViewHandler"><td><code><a href="#fn_servicesViewHandler">servicesViewHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/services.go</code></td><td class="percent"><code>88.24%</code></td><td class="linecount"><code>15/17</code></td></tr>
|
||
<tr id="s_fn_setupHandler"><td><code><a href="#fn_setupHandler">setupHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/setup.go</code></td><td class="percent"><code>87.50%</code></td><td class="linecount"><code>7/8</code></td></tr>
|
||
<tr id="s_fn_saveNotificationHandler"><td><code><a href="#fn_saveNotificationHandler">saveNotificationHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/settings.go</code></td><td class="percent"><code>86.96%</code></td><td class="linecount"><code>40/46</code></td></tr>
|
||
<tr id="s_fn_apiIndexHandler"><td><code><a href="#fn_apiIndexHandler">apiIndexHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>84.62%</code></td><td class="linecount"><code>11/13</code></td></tr>
|
||
<tr id="s_fn_apiServiceDataHandler"><td><code><a href="#fn_apiServiceDataHandler">apiServiceDataHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>83.33%</code></td><td class="linecount"><code>10/12</code></td></tr>
|
||
<tr id="s_fn_apiAllServicesHandler"><td><code><a href="#fn_apiAllServicesHandler">apiAllServicesHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>81.82%</code></td><td class="linecount"><code>9/11</code></td></tr>
|
||
<tr id="s_fn_executeResponse"><td><code><a href="#fn_executeResponse">executeResponse(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>80.00%</code></td><td class="linecount"><code>24/30</code></td></tr>
|
||
<tr id="s_fn_servicesDeleteHandler"><td><code><a href="#fn_servicesDeleteHandler">servicesDeleteHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/services.go</code></td><td class="percent"><code>80.00%</code></td><td class="linecount"><code>8/10</code></td></tr>
|
||
<tr id="s_fn_usersDeleteHandler"><td><code><a href="#fn_usersDeleteHandler">usersDeleteHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/users.go</code></td><td class="percent"><code>76.92%</code></td><td class="linecount"><code>10/13</code></td></tr>
|
||
<tr id="s_fn_resetCookies"><td><code><a href="#fn_resetCookies">resetCookies(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/routes.go</code></td><td class="percent"><code>75.00%</code></td><td class="linecount"><code>3/4</code></td></tr>
|
||
<tr id="s_fn_executeJSResponse"><td><code><a href="#fn_executeJSResponse">executeJSResponse(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>72.73%</code></td><td class="linecount"><code>8/11</code></td></tr>
|
||
<tr id="s_fn_reorderServiceHandler"><td><code><a href="#fn_reorderServiceHandler">reorderServiceHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/services.go</code></td><td class="percent"><code>72.73%</code></td><td class="linecount"><code>8/11</code></td></tr>
|
||
<tr id="s_fn_saveAssetsHandler"><td><code><a href="#fn_saveAssetsHandler">saveAssetsHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/settings.go</code></td><td class="percent"><code>71.43%</code></td><td class="linecount"><code>10/14</code></td></tr>
|
||
<tr id="s_fn_updateUserHandler"><td><code><a href="#fn_updateUserHandler">updateUserHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/users.go</code></td><td class="percent"><code>70.00%</code></td><td class="linecount"><code>14/20</code></td></tr>
|
||
<tr id="s_fn_apiServiceUpdateHandler"><td><code><a href="#fn_apiServiceUpdateHandler">apiServiceUpdateHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>70.00%</code></td><td class="linecount"><code>14/20</code></td></tr>
|
||
<tr id="s_fn_apiRenewHandler"><td><code><a href="#fn_apiRenewHandler">apiRenewHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>70.00%</code></td><td class="linecount"><code>7/10</code></td></tr>
|
||
<tr id="s_fn_apiUserUpdateHandler"><td><code><a href="#fn_apiUserUpdateHandler">apiUserUpdateHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>68.42%</code></td><td class="linecount"><code>13/19</code></td></tr>
|
||
<tr id="s_fn_IsAuthenticated"><td><code><a href="#fn_IsAuthenticated">IsAuthenticated(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>8/12</code></td></tr>
|
||
<tr id="s_fn_apiAllUsersHandler"><td><code><a href="#fn_apiAllUsersHandler">apiAllUsersHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>4/6</code></td></tr>
|
||
<tr id="s_fn_apiCreateUsersHandler"><td><code><a href="#fn_apiCreateUsersHandler">apiCreateUsersHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>64.71%</code></td><td class="linecount"><code>11/17</code></td></tr>
|
||
<tr id="s_fn_apiCreateServiceHandler"><td><code><a href="#fn_apiCreateServiceHandler">apiCreateServiceHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>62.50%</code></td><td class="linecount"><code>10/16</code></td></tr>
|
||
<tr id="s_fn_processSetupHandler"><td><code><a href="#fn_processSetupHandler">processSetupHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/setup.go</code></td><td class="percent"><code>62.00%</code></td><td class="linecount"><code>31/50</code></td></tr>
|
||
<tr id="s_fn_apiUserDeleteHandler"><td><code><a href="#fn_apiUserDeleteHandler">apiUserDeleteHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>60.00%</code></td><td class="linecount"><code>9/15</code></td></tr>
|
||
<tr id="s_fn_apiServiceDeleteHandler"><td><code><a href="#fn_apiServiceDeleteHandler">apiServiceDeleteHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>60.00%</code></td><td class="linecount"><code>9/15</code></td></tr>
|
||
<tr id="s_fn_apiUserHandler"><td><code><a href="#fn_apiUserHandler">apiUserHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>60.00%</code></td><td class="linecount"><code>6/10</code></td></tr>
|
||
<tr id="s_fn_apiServiceHandler"><td><code><a href="#fn_apiServiceHandler">apiServiceHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>60.00%</code></td><td class="linecount"><code>6/10</code></td></tr>
|
||
<tr id="s_fn_dashboardHandler"><td><code><a href="#fn_dashboardHandler">dashboardHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/dashboard.go</code></td><td class="percent"><code>60.00%</code></td><td class="linecount"><code>3/5</code></td></tr>
|
||
<tr id="s_fn_indexHandler"><td><code><a href="#fn_indexHandler">indexHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/index.go</code></td><td class="percent"><code>50.00%</code></td><td class="linecount"><code>2/4</code></td></tr>
|
||
<tr id="s_fn_isAPIAuthorized"><td><code><a href="#fn_isAPIAuthorized">isAPIAuthorized(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>28.57%</code></td><td class="linecount"><code>2/7</code></td></tr>
|
||
<tr id="s_fn_testNotificationHandler"><td><code><a href="#fn_testNotificationHandler">testNotificationHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/settings.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/46</code></td></tr>
|
||
<tr id="s_fn_DesktopInit"><td><code><a href="#fn_DesktopInit">DesktopInit(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/index.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/42</code></td></tr>
|
||
<tr id="s_fn_checkinCreateHandler"><td><code><a href="#fn_checkinCreateHandler">checkinCreateHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/13</code></td></tr>
|
||
<tr id="s_fn_apiServicePingDataHandler"><td><code><a href="#fn_apiServicePingDataHandler">apiServicePingDataHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/12</code></td></tr>
|
||
<tr id="s_fn_checkinHitHandler"><td><code><a href="#fn_checkinHitHandler">checkinHitHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/10</code></td></tr>
|
||
<tr id="s_fn_checkinDeleteHandler"><td><code><a href="#fn_checkinDeleteHandler">checkinDeleteHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/services.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/9</code></td></tr>
|
||
<tr id="s_fn_pluginSavedHandler"><td><code><a href="#fn_pluginSavedHandler">pluginSavedHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/plugins.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/9</code></td></tr>
|
||
<tr id="s_fn_@111:11"><td><code><a href="#fn_@111:11">@111:11(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/8</code></td></tr>
|
||
<tr id="s_fn_apiCheckinHandler"><td><code><a href="#fn_apiCheckinHandler">apiCheckinHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/api.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/7</code></td></tr>
|
||
<tr id="s_fn_pluginsDownloadHandler"><td><code><a href="#fn_pluginsDownloadHandler">pluginsDownloadHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/plugins.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/5</code></td></tr>
|
||
<tr id="s_fn_parseId"><td><code><a href="#fn_parseId">parseId(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/settings.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_@122:13"><td><code><a href="#fn_@122:13">@122:13(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_@144:15"><td><code><a href="#fn_@144:15">@144:15(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_setupResponseError"><td><code><a href="#fn_setupResponseError">setupResponseError(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/setup.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@90:9"><td><code><a href="#fn_@90:9">@90:9(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@132:17"><td><code><a href="#fn_@132:17">@132:17(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@148:13"><td><code><a href="#fn_@148:13">@148:13(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_trayHandler"><td><code><a href="#fn_trayHandler">trayHandler(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/index.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@141:10"><td><code><a href="#fn_@141:10">@141:10(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@235:15"><td><code><a href="#fn_@235:15">@235:15(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@160:17"><td><code><a href="#fn_@160:17">@160:17(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@232:11"><td><code><a href="#fn_@232:11">@232:11(...)</a></code></td><td><code>github.com/hunterlong/statup/handlers/handlers.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr><td colspan="2"><code>github.com/hunterlong/statup/handlers</code></td><td class="percent"><code>67.41%</code></td><td class="linecount"><code>635/942</code></td></tr>
|
||
</table>
|
||
|
||
<div class="funcname" id="fn_Router">func Router</div><div class="info"><a href="#s_fn_Router">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/routes.go</code>:</p></div><table class="listing">
|
||
<tr><td>34</td><td><code><pre>func Router() *mux.Router {</pre></code></td></tr><tr><td>35</td><td><code><pre> dir := utils.Directory</pre></code></td></tr><tr><td>36</td><td><code><pre> r := mux.NewRouter()</pre></code></td></tr><tr><td>37</td><td><code><pre> r.Handle("/", http.HandlerFunc(indexHandler))</pre></code></td></tr><tr><td>38</td><td><code><pre> if source.UsingAssets(dir) {</pre></code></td></tr><tr><td>39</td><td><code><pre> indexHandler := http.FileServer(http.Dir(dir + "/assets/"))</pre></code></td></tr><tr><td>40</td><td><code><pre> r.PathPrefix("/css/").Handler(http.StripPrefix("/css/", http.FileServer(http.Dir(dir+"/assets/css"))))</pre></code></td></tr><tr><td>41</td><td><code><pre> r.PathPrefix("/robots.txt").Handler(indexHandler)</pre></code></td></tr><tr><td>42</td><td><code><pre> r.PathPrefix("/favicon.ico").Handler(indexHandler)</pre></code></td></tr><tr><td>43</td><td><code><pre> r.PathPrefix("/statup.png").Handler(indexHandler)</pre></code></td></tr><tr><td>44</td><td><code><pre> } else {</pre></code></td></tr><tr><td>45</td><td><code><pre> r.PathPrefix("/css/").Handler(http.StripPrefix("/css/", http.FileServer(source.CssBox.HTTPBox())))</pre></code></td></tr><tr><td>46</td><td><code><pre> r.PathPrefix("/robots.txt").Handler(http.FileServer(source.TmplBox.HTTPBox()))</pre></code></td></tr><tr><td>47</td><td><code><pre> r.PathPrefix("/favicon.ico").Handler(http.FileServer(source.TmplBox.HTTPBox()))</pre></code></td></tr><tr><td>48</td><td><code><pre> r.PathPrefix("/statup.png").Handler(http.FileServer(source.TmplBox.HTTPBox()))</pre></code></td></tr><tr><td>49</td><td><code><pre> }</pre></code></td></tr><tr><td>50</td><td><code><pre> r.PathPrefix("/js/").Handler(http.StripPrefix("/js/", http.FileServer(source.JsBox.HTTPBox())))</pre></code></td></tr><tr><td>51</td><td><code><pre> r.Handle("/charts.js", http.HandlerFunc(renderServiceChartsHandler))</pre></code></td></tr><tr><td>52</td><td><code><pre> r.Handle("/setup", http.HandlerFunc(setupHandler)).Methods("GET")</pre></code></td></tr><tr><td>53</td><td><code><pre> r.Handle("/setup", http.HandlerFunc(processSetupHandler)).Methods("POST")</pre></code></td></tr><tr><td>54</td><td><code><pre> r.Handle("/dashboard", http.HandlerFunc(dashboardHandler)).Methods("GET")</pre></code></td></tr><tr><td>55</td><td><code><pre> r.Handle("/dashboard", http.HandlerFunc(loginHandler)).Methods("POST")</pre></code></td></tr><tr><td>56</td><td><code><pre> r.Handle("/logout", http.HandlerFunc(logoutHandler))</pre></code></td></tr><tr><td>57</td><td><code><pre> r.Handle("/plugins/download/{name}", http.HandlerFunc(pluginsDownloadHandler))</pre></code></td></tr><tr><td>58</td><td><code><pre> r.Handle("/plugins/{name}/save", http.HandlerFunc(pluginSavedHandler)).Methods("POST")</pre></code></td></tr><tr><td>59</td><td><code><pre> r.Handle("/help", http.HandlerFunc(helpHandler))</pre></code></td></tr><tr><td>60</td><td><code><pre> r.Handle("/logs", http.HandlerFunc(logsHandler))</pre></code></td></tr><tr><td>61</td><td><code><pre> r.Handle("/logs/line", http.HandlerFunc(logsLineHandler))</pre></code></td></tr><tr><td>62</td><td><code><pre></pre></code></td></tr><tr><td>63</td><td><code><pre> // USER Routes</pre></code></td></tr><tr><td>64</td><td><code><pre> r.Handle("/users", http.HandlerFunc(usersHandler)).Methods("GET")</pre></code></td></tr><tr><td>65</td><td><code><pre> r.Handle("/users", http.HandlerFunc(createUserHandler)).Methods("POST")</pre></code></td></tr><tr><td>66</td><td><code><pre> r.Handle("/user/{id}", http.HandlerFunc(usersEditHandler)).Methods("GET")</pre></code></td></tr><tr><td>67</td><td><code><pre> r.Handle("/user/{id}", http.HandlerFunc(updateUserHandler)).Methods("POST")</pre></code></td></tr><tr><td>68</td><td><code><pre> r.Handle("/user/{id}/delete", http.HandlerFunc(usersDeleteHandler)).Methods("GET")</pre></code></td></tr><tr><td>69</td><td><code><pre></pre></code></td></tr><tr><td>70</td><td><code><pre> // SETTINGS Routes</pre></code></td></tr><tr><td>71</td><td><code><pre> r.Handle("/settings", http.HandlerFunc(settingsHandler)).Methods("GET")</pre></code></td></tr><tr><td>72</td><td><code><pre> r.Handle("/settings", http.HandlerFunc(saveSettingsHandler)).Methods("POST")</pre></code></td></tr><tr><td>73</td><td><code><pre> r.Handle("/settings/css", http.HandlerFunc(saveSASSHandler)).Methods("POST")</pre></code></td></tr><tr><td>74</td><td><code><pre> r.Handle("/settings/build", http.HandlerFunc(saveAssetsHandler)).Methods("GET")</pre></code></td></tr><tr><td>75</td><td><code><pre> r.Handle("/settings/delete_assets", http.HandlerFunc(deleteAssetsHandler)).Methods("GET")</pre></code></td></tr><tr><td>76</td><td><code><pre> r.Handle("/settings/notifier/{method}", http.HandlerFunc(saveNotificationHandler)).Methods("POST")</pre></code></td></tr><tr><td>77</td><td><code><pre> r.Handle("/settings/notifier/{method}/test", http.HandlerFunc(testNotificationHandler)).Methods("POST")</pre></code></td></tr><tr><td>78</td><td><code><pre> r.Handle("/settings/export", http.HandlerFunc(exportHandler)).Methods("GET")</pre></code></td></tr><tr><td>79</td><td><code><pre></pre></code></td></tr><tr><td>80</td><td><code><pre> // SERVICE Routes</pre></code></td></tr><tr><td>81</td><td><code><pre> r.Handle("/services", http.HandlerFunc(servicesHandler)).Methods("GET")</pre></code></td></tr><tr><td>82</td><td><code><pre> r.Handle("/services", http.HandlerFunc(createServiceHandler)).Methods("POST")</pre></code></td></tr><tr><td>83</td><td><code><pre> r.Handle("/services/reorder", http.HandlerFunc(reorderServiceHandler)).Methods("POST")</pre></code></td></tr><tr><td>84</td><td><code><pre> r.Handle("/service/{id}", http.HandlerFunc(servicesViewHandler)).Methods("GET")</pre></code></td></tr><tr><td>85</td><td><code><pre> r.Handle("/service/{id}", http.HandlerFunc(servicesUpdateHandler)).Methods("POST")</pre></code></td></tr><tr><td>86</td><td><code><pre> r.Handle("/service/{id}/edit", http.HandlerFunc(servicesViewHandler))</pre></code></td></tr><tr><td>87</td><td><code><pre> r.Handle("/service/{id}/delete", http.HandlerFunc(servicesDeleteHandler))</pre></code></td></tr><tr><td>88</td><td><code><pre> r.Handle("/service/{id}/delete_failures", http.HandlerFunc(servicesDeleteFailuresHandler)).Methods("GET")</pre></code></td></tr><tr><td>89</td><td><code><pre> r.Handle("/service/{id}/checkin", http.HandlerFunc(checkinCreateHandler)).Methods("POST")</pre></code></td></tr><tr><td>90</td><td><code><pre> r.Handle("/checkin/{id}/delete", http.HandlerFunc(checkinDeleteHandler)).Methods("GET")</pre></code></td></tr><tr><td>91</td><td><code><pre> r.Handle("/checkin/{id}", http.HandlerFunc(checkinHitHandler))</pre></code></td></tr><tr><td>92</td><td><code><pre></pre></code></td></tr><tr><td>93</td><td><code><pre> // API SERVICE Routes</pre></code></td></tr><tr><td>94</td><td><code><pre> r.Handle("/api/services", http.HandlerFunc(apiAllServicesHandler)).Methods("GET")</pre></code></td></tr><tr><td>95</td><td><code><pre> r.Handle("/api/services", http.HandlerFunc(apiCreateServiceHandler)).Methods("POST")</pre></code></td></tr><tr><td>96</td><td><code><pre> r.Handle("/api/services/{id}", http.HandlerFunc(apiServiceHandler)).Methods("GET")</pre></code></td></tr><tr><td>97</td><td><code><pre> r.Handle("/api/services/{id}/data", http.HandlerFunc(apiServiceDataHandler)).Methods("GET")</pre></code></td></tr><tr><td>98</td><td><code><pre> r.Handle("/api/services/{id}/ping", http.HandlerFunc(apiServicePingDataHandler)).Methods("GET")</pre></code></td></tr><tr><td>99</td><td><code><pre> r.Handle("/api/services/{id}", http.HandlerFunc(apiServiceUpdateHandler)).Methods("POST")</pre></code></td></tr><tr><td>100</td><td><code><pre> r.Handle("/api/services/{id}", http.HandlerFunc(apiServiceDeleteHandler)).Methods("DELETE")</pre></code></td></tr><tr><td>101</td><td><code><pre></pre></code></td></tr><tr><td>102</td><td><code><pre> // API USER Routes</pre></code></td></tr><tr><td>103</td><td><code><pre> r.Handle("/api/users", http.HandlerFunc(apiAllUsersHandler)).Methods("GET")</pre></code></td></tr><tr><td>104</td><td><code><pre> r.Handle("/api/users", http.HandlerFunc(apiCreateUsersHandler)).Methods("POST")</pre></code></td></tr><tr><td>105</td><td><code><pre> r.Handle("/api/users/{id}", http.HandlerFunc(apiUserHandler)).Methods("GET")</pre></code></td></tr><tr><td>106</td><td><code><pre> r.Handle("/api/users/{id}", http.HandlerFunc(apiUserUpdateHandler)).Methods("POST")</pre></code></td></tr><tr><td>107</td><td><code><pre> r.Handle("/api/users/{id}", http.HandlerFunc(apiUserDeleteHandler)).Methods("DELETE")</pre></code></td></tr><tr><td>108</td><td><code><pre></pre></code></td></tr><tr><td>109</td><td><code><pre> // Generic API Routes</pre></code></td></tr><tr><td>110</td><td><code><pre> r.Handle("/api", http.HandlerFunc(apiIndexHandler))</pre></code></td></tr><tr><td>111</td><td><code><pre> r.Handle("/api/renew", http.HandlerFunc(apiRenewHandler))</pre></code></td></tr><tr><td>112</td><td><code><pre> r.Handle("/api/checkin/{api}", http.HandlerFunc(apiCheckinHandler))</pre></code></td></tr><tr><td>113</td><td><code><pre> r.Handle("/metrics", http.HandlerFunc(prometheusHandler))</pre></code></td></tr><tr><td>114</td><td><code><pre> r.Handle("/tray", http.HandlerFunc(trayHandler))</pre></code></td></tr><tr><td>115</td><td><code><pre> r.NotFoundHandler = http.HandlerFunc(error404Handler)</pre></code></td></tr><tr><td>116</td><td><code><pre> return r</pre></code></td></tr><tr><td>117</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_prometheusHandler">func prometheusHandler</div><div class="info"><a href="#s_fn_prometheusHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/prometheus.go</code>:</p></div><table class="listing">
|
||
<tr><td>36</td><td><code><pre>func prometheusHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>37</td><td><code><pre> utils.Log(1, fmt.Sprintf("Prometheus /metrics Request From IP: %v\n", r.RemoteAddr))</pre></code></td></tr><tr><td>38</td><td><code><pre> if !isAuthorized(r) {</pre></code></td></tr><tr><td>39</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>40</td><td><code><pre> return</pre></code></td></tr><tr><td>41</td><td><code><pre> }</pre></code></td></tr><tr><td>42</td><td><code><pre> metrics := []string{}</pre></code></td></tr><tr><td>43</td><td><code><pre> system := fmt.Sprintf("statup_total_failures %v\n", core.CountFailures())</pre></code></td></tr><tr><td>44</td><td><code><pre> system += fmt.Sprintf("statup_total_services %v", len(core.CoreApp.Services))</pre></code></td></tr><tr><td>45</td><td><code><pre> metrics = append(metrics, system)</pre></code></td></tr><tr><td>46</td><td><code><pre> for _, ser := range core.CoreApp.Services {</pre></code></td></tr><tr><td>47</td><td><code><pre> v := ser.Select()</pre></code></td></tr><tr><td>48</td><td><code><pre> online := 1</pre></code></td></tr><tr><td>49</td><td><code><pre> if !v.Online {</pre></code></td></tr><tr><td>50</td><td><code><pre> online = 0</pre></code></td></tr><tr><td>51</td><td><code><pre> }</pre></code></td></tr><tr><td>52</td><td><code><pre> met := fmt.Sprintf("statup_service_failures{id=\"%v\" name=\"%v\"} %v\n", v.Id, v.Name, len(v.Failures))</pre></code></td></tr><tr><td>53</td><td><code><pre> met += fmt.Sprintf("statup_service_latency{id=\"%v\" name=\"%v\"} %0.0f\n", v.Id, v.Name, (v.Latency * 100))</pre></code></td></tr><tr><td>54</td><td><code><pre> met += fmt.Sprintf("statup_service_online{id=\"%v\" name=\"%v\"} %v\n", v.Id, v.Name, online)</pre></code></td></tr><tr><td>55</td><td><code><pre> met += fmt.Sprintf("statup_service_status_code{id=\"%v\" name=\"%v\"} %v\n", v.Id, v.Name, v.LastStatusCode)</pre></code></td></tr><tr><td>56</td><td><code><pre> met += fmt.Sprintf("statup_service_response_length{id=\"%v\" name=\"%v\"} %v", v.Id, v.Name, len([]byte(v.LastResponse)))</pre></code></td></tr><tr><td>57</td><td><code><pre> metrics = append(metrics, met)</pre></code></td></tr><tr><td>58</td><td><code><pre> }</pre></code></td></tr><tr><td>59</td><td><code><pre> output := strings.Join(metrics, "\n")</pre></code></td></tr><tr><td>60</td><td><code><pre> w.WriteHeader(http.StatusOK)</pre></code></td></tr><tr><td>61</td><td><code><pre> w.Write([]byte(output))</pre></code></td></tr><tr><td>62</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_exportHandler">func exportHandler</div><div class="info"><a href="#s_fn_exportHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/dashboard.go</code>:</p></div><table class="listing">
|
||
<tr><td>109</td><td><code><pre>func exportHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>110</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>111</td><td><code><pre> w.WriteHeader(http.StatusInternalServerError)</pre></code></td></tr><tr><td>112</td><td><code><pre> return</pre></code></td></tr><tr><td>113</td><td><code><pre> }</pre></code></td></tr><tr><td>114</td><td><code><pre></pre></code></td></tr><tr><td>115</td><td><code><pre> var notifiers []*notifier.Notification</pre></code></td></tr><tr><td>116</td><td><code><pre> for _, v := range core.CoreApp.Notifications {</pre></code></td></tr><tr><td>117</td><td><code><pre> notifier := v.(notifier.Notifier)</pre></code></td></tr><tr><td>118</td><td><code><pre> notifiers = append(notifiers, notifier.Select())</pre></code></td></tr><tr><td>119</td><td><code><pre> }</pre></code></td></tr><tr><td>120</td><td><code><pre></pre></code></td></tr><tr><td>121</td><td><code><pre> data := exportData{core.CoreApp, notifiers}</pre></code></td></tr><tr><td>122</td><td><code><pre></pre></code></td></tr><tr><td>123</td><td><code><pre> export, _ := json.Marshal(data)</pre></code></td></tr><tr><td>124</td><td><code><pre></pre></code></td></tr><tr><td>125</td><td><code><pre> mime := http.DetectContentType(export)</pre></code></td></tr><tr><td>126</td><td><code><pre> fileSize := len(string(export))</pre></code></td></tr><tr><td>127</td><td><code><pre></pre></code></td></tr><tr><td>128</td><td><code><pre> w.Header().Set("Content-Type", mime)</pre></code></td></tr><tr><td>129</td><td><code><pre> w.Header().Set("Content-Disposition", "attachment; filename=export.json")</pre></code></td></tr><tr><td>130</td><td><code><pre> w.Header().Set("Expires", "0")</pre></code></td></tr><tr><td>131</td><td><code><pre> w.Header().Set("Content-Transfer-Encoding", "binary")</pre></code></td></tr><tr><td>132</td><td><code><pre> w.Header().Set("Content-Length", strconv.Itoa(fileSize))</pre></code></td></tr><tr><td>133</td><td><code><pre> w.Header().Set("Content-Control", "private, no-transform, no-store, must-revalidate")</pre></code></td></tr><tr><td>134</td><td><code><pre></pre></code></td></tr><tr><td>135</td><td><code><pre> http.ServeContent(w, r, "export.json", time.Now(), bytes.NewReader(export))</pre></code></td></tr><tr><td>136</td><td><code><pre></pre></code></td></tr><tr><td>137</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_saveSASSHandler">func saveSASSHandler</div><div class="info"><a href="#s_fn_saveSASSHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go</code>:</p></div><table class="listing">
|
||
<tr><td>75</td><td><code><pre>func saveSASSHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>76</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>77</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>78</td><td><code><pre> return</pre></code></td></tr><tr><td>79</td><td><code><pre> }</pre></code></td></tr><tr><td>80</td><td><code><pre> r.ParseForm()</pre></code></td></tr><tr><td>81</td><td><code><pre> theme := r.PostForm.Get("theme")</pre></code></td></tr><tr><td>82</td><td><code><pre> variables := r.PostForm.Get("variables")</pre></code></td></tr><tr><td>83</td><td><code><pre> mobile := r.PostForm.Get("mobile")</pre></code></td></tr><tr><td>84</td><td><code><pre> source.SaveAsset([]byte(theme), utils.Directory, "scss/base.scss")</pre></code></td></tr><tr><td>85</td><td><code><pre> source.SaveAsset([]byte(variables), utils.Directory, "scss/variables.scss")</pre></code></td></tr><tr><td>86</td><td><code><pre> source.SaveAsset([]byte(mobile), utils.Directory, "scss/mobile.scss")</pre></code></td></tr><tr><td>87</td><td><code><pre> source.CompileSASS(utils.Directory)</pre></code></td></tr><tr><td>88</td><td><code><pre> resetRouter()</pre></code></td></tr><tr><td>89</td><td><code><pre> executeResponse(w, r, "settings.html", core.CoreApp, "/settings")</pre></code></td></tr><tr><td>90</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_renderServiceChartsHandler">func renderServiceChartsHandler</div><div class="info"><a href="#s_fn_renderServiceChartsHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>31</td><td><code><pre>func renderServiceChartsHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>32</td><td><code><pre> services := core.CoreApp.Services</pre></code></td></tr><tr><td>33</td><td><code><pre> w.Header().Set("Content-Type", "text/javascript")</pre></code></td></tr><tr><td>34</td><td><code><pre> w.Header().Set("Cache-Control", "max-age=60")</pre></code></td></tr><tr><td>35</td><td><code><pre></pre></code></td></tr><tr><td>36</td><td><code><pre> //var data []string</pre></code></td></tr><tr><td>37</td><td><code><pre> end := time.Now().UTC()</pre></code></td></tr><tr><td>38</td><td><code><pre> start := time.Now().Add((-24 * 7) * time.Hour).UTC()</pre></code></td></tr><tr><td>39</td><td><code><pre> var srvs []*core.Service</pre></code></td></tr><tr><td>40</td><td><code><pre> for _, s := range services {</pre></code></td></tr><tr><td>41</td><td><code><pre> srvs = append(srvs, s.(*core.Service))</pre></code></td></tr><tr><td>42</td><td><code><pre> }</pre></code></td></tr><tr><td>43</td><td><code><pre> out := struct {</pre></code></td></tr><tr><td>44</td><td><code><pre> Services []*core.Service</pre></code></td></tr><tr><td>45</td><td><code><pre> Start int64</pre></code></td></tr><tr><td>46</td><td><code><pre> End int64</pre></code></td></tr><tr><td>47</td><td><code><pre> }{srvs, start.Unix(), end.Unix()}</pre></code></td></tr><tr><td>48</td><td><code><pre></pre></code></td></tr><tr><td>49</td><td><code><pre> executeJSResponse(w, r, "charts.js", out)</pre></code></td></tr><tr><td>50</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_logsHandler">func logsHandler</div><div class="info"><a href="#s_fn_logsHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/dashboard.go</code>:</p></div><table class="listing">
|
||
<tr><td>78</td><td><code><pre>func logsHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>79</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>80</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>81</td><td><code><pre> return</pre></code></td></tr><tr><td>82</td><td><code><pre> }</pre></code></td></tr><tr><td>83</td><td><code><pre> utils.LockLines.Lock()</pre></code></td></tr><tr><td>84</td><td><code><pre> logs := make([]string, 0)</pre></code></td></tr><tr><td>85</td><td><code><pre> len := len(utils.LastLines)</pre></code></td></tr><tr><td>86</td><td><code><pre> // We need string log lines from end to start.</pre></code></td></tr><tr><td>87</td><td><code><pre> for i := len - 1; i >= 0; i-- {</pre></code></td></tr><tr><td>88</td><td><code><pre> logs = append(logs, utils.LastLines[i].FormatForHtml()+"\r\n")</pre></code></td></tr><tr><td>89</td><td><code><pre> }</pre></code></td></tr><tr><td>90</td><td><code><pre> utils.LockLines.Unlock()</pre></code></td></tr><tr><td>91</td><td><code><pre> executeResponse(w, r, "logs.html", logs, nil)</pre></code></td></tr><tr><td>92</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_isAuthorized">func isAuthorized</div><div class="info"><a href="#s_fn_isAuthorized">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/prometheus.go</code>:</p></div><table class="listing">
|
||
<tr><td>64</td><td><code><pre>func isAuthorized(r *http.Request) bool {</pre></code></td></tr><tr><td>65</td><td><code><pre> var token string</pre></code></td></tr><tr><td>66</td><td><code><pre> tokens, ok := r.Header["Authorization"]</pre></code></td></tr><tr><td>67</td><td><code><pre> if ok && len(tokens) >= 1 {</pre></code></td></tr><tr><td>68</td><td><code><pre> token = tokens[0]</pre></code></td></tr><tr><td>69</td><td><code><pre> token = strings.TrimPrefix(token, "Bearer ")</pre></code></td></tr><tr><td>70</td><td><code><pre> }</pre></code></td></tr><tr><td>71</td><td><code><pre> if token == core.CoreApp.ApiSecret {</pre></code></td></tr><tr><td>72</td><td><code><pre> return true</pre></code></td></tr><tr><td>73</td><td><code><pre> }</pre></code></td></tr><tr><td>74</td><td><code><pre> return false</pre></code></td></tr><tr><td>75</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_servicesDeleteFailuresHandler">func servicesDeleteFailuresHandler</div><div class="info"><a href="#s_fn_servicesDeleteFailuresHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>209</td><td><code><pre>func servicesDeleteFailuresHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>210</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>211</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>212</td><td><code><pre> return</pre></code></td></tr><tr><td>213</td><td><code><pre> }</pre></code></td></tr><tr><td>214</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr><td>215</td><td><code><pre> service := core.SelectService(utils.StringInt(vars["id"]))</pre></code></td></tr><tr><td>216</td><td><code><pre> service.DeleteFailures()</pre></code></td></tr><tr><td>217</td><td><code><pre> executeResponse(w, r, "services.html", core.CoreApp.Services, "/services")</pre></code></td></tr><tr><td>218</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_usersEditHandler">func usersEditHandler</div><div class="info"><a href="#s_fn_usersEditHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/users.go</code>:</p></div><table class="listing">
|
||
<tr><td>37</td><td><code><pre>func usersEditHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>38</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>39</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>40</td><td><code><pre> return</pre></code></td></tr><tr><td>41</td><td><code><pre> }</pre></code></td></tr><tr><td>42</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr><td>43</td><td><code><pre> id, _ := strconv.Atoi(vars["id"])</pre></code></td></tr><tr><td>44</td><td><code><pre> user, _ := core.SelectUser(int64(id))</pre></code></td></tr><tr><td>45</td><td><code><pre> executeResponse(w, r, "user.html", user, nil)</pre></code></td></tr><tr><td>46</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_deleteAssetsHandler">func deleteAssetsHandler</div><div class="info"><a href="#s_fn_deleteAssetsHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go</code>:</p></div><table class="listing">
|
||
<tr><td>112</td><td><code><pre>func deleteAssetsHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>113</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>114</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>115</td><td><code><pre> return</pre></code></td></tr><tr><td>116</td><td><code><pre> }</pre></code></td></tr><tr><td>117</td><td><code><pre> source.DeleteAllAssets(utils.Directory)</pre></code></td></tr><tr><td>118</td><td><code><pre> resetRouter()</pre></code></td></tr><tr><td>119</td><td><code><pre> executeResponse(w, r, "settings.html", core.CoreApp, "/settings")</pre></code></td></tr><tr><td>120</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_RunHTTPServer">func RunHTTPServer</div><div class="info"><a href="#s_fn_RunHTTPServer">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>43</td><td><code><pre>func RunHTTPServer(ip string, port int) error {</pre></code></td></tr><tr><td>44</td><td><code><pre> host := fmt.Sprintf("%v:%v", ip, port)</pre></code></td></tr><tr><td>45</td><td><code><pre> utils.Log(1, "Statup HTTP Server running on http://"+host)</pre></code></td></tr><tr><td>46</td><td><code><pre> //for _, p := range core.CoreApp.AllPlugins {</pre></code></td></tr><tr><td>47</td><td><code><pre> // info := p.GetInfo()</pre></code></td></tr><tr><td>48</td><td><code><pre> // for _, route := range p.Routes() {</pre></code></td></tr><tr><td>49</td><td><code><pre> // path := fmt.Sprintf("%v", route.URL)</pre></code></td></tr><tr><td>50</td><td><code><pre> // router.Handle(path, http.HandlerFunc(route.Handler)).Methods(route.Method)</pre></code></td></tr><tr><td>51</td><td><code><pre> // utils.Log(1, fmt.Sprintf("Added Route %v for plugin %v\n", path, info.Name))</pre></code></td></tr><tr><td>52</td><td><code><pre> // }</pre></code></td></tr><tr><td>53</td><td><code><pre> //}</pre></code></td></tr><tr><td>54</td><td><code><pre> router = Router()</pre></code></td></tr><tr><td>55</td><td><code><pre> httpServer = &http.Server{</pre></code></td></tr><tr><td>56</td><td><code><pre> Addr: host,</pre></code></td></tr><tr><td>57</td><td><code><pre> WriteTimeout: time.Second * 60,</pre></code></td></tr><tr><td>58</td><td><code><pre> ReadTimeout: time.Second * 60,</pre></code></td></tr><tr><td>59</td><td><code><pre> IdleTimeout: time.Second * 60,</pre></code></td></tr><tr><td>60</td><td><code><pre> Handler: router,</pre></code></td></tr><tr><td>61</td><td><code><pre> }</pre></code></td></tr><tr><td>62</td><td><code><pre> resetCookies()</pre></code></td></tr><tr><td>63</td><td><code><pre> return httpServer.ListenAndServe()</pre></code></td></tr><tr><td>64</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_usersHandler">func usersHandler</div><div class="info"><a href="#s_fn_usersHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/users.go</code>:</p></div><table class="listing">
|
||
<tr><td>28</td><td><code><pre>func usersHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>29</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>30</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>31</td><td><code><pre> return</pre></code></td></tr><tr><td>32</td><td><code><pre> }</pre></code></td></tr><tr><td>33</td><td><code><pre> users, _ := core.SelectAllUsers()</pre></code></td></tr><tr><td>34</td><td><code><pre> executeResponse(w, r, "users.html", users, nil)</pre></code></td></tr><tr><td>35</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_logsLineHandler">func logsLineHandler</div><div class="info"><a href="#s_fn_logsLineHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/dashboard.go</code>:</p></div><table class="listing">
|
||
<tr><td>94</td><td><code><pre>func logsLineHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>95</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>96</td><td><code><pre> w.WriteHeader(http.StatusInternalServerError)</pre></code></td></tr><tr><td>97</td><td><code><pre> return</pre></code></td></tr><tr><td>98</td><td><code><pre> }</pre></code></td></tr><tr><td>99</td><td><code><pre> if lastLine := utils.GetLastLine(); lastLine != nil {</pre></code></td></tr><tr><td>100</td><td><code><pre> w.Write([]byte(lastLine.FormatForHtml()))</pre></code></td></tr><tr><td>101</td><td><code><pre> }</pre></code></td></tr><tr><td>102</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_helpHandler">func helpHandler</div><div class="info"><a href="#s_fn_helpHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/dashboard.go</code>:</p></div><table class="listing">
|
||
<tr><td>69</td><td><code><pre>func helpHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>70</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>71</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>72</td><td><code><pre> return</pre></code></td></tr><tr><td>73</td><td><code><pre> }</pre></code></td></tr><tr><td>74</td><td><code><pre> help := source.HelpMarkdown()</pre></code></td></tr><tr><td>75</td><td><code><pre> executeResponse(w, r, "help.html", help, nil)</pre></code></td></tr><tr><td>76</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_settingsHandler">func settingsHandler</div><div class="info"><a href="#s_fn_settingsHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go</code>:</p></div><table class="listing">
|
||
<tr><td>30</td><td><code><pre>func settingsHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>31</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>32</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>33</td><td><code><pre> return</pre></code></td></tr><tr><td>34</td><td><code><pre> }</pre></code></td></tr><tr><td>35</td><td><code><pre> executeResponse(w, r, "settings.html", core.CoreApp, nil)</pre></code></td></tr><tr><td>36</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_servicesHandler">func servicesHandler</div><div class="info"><a href="#s_fn_servicesHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>52</td><td><code><pre>func servicesHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>53</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>54</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>55</td><td><code><pre> return</pre></code></td></tr><tr><td>56</td><td><code><pre> }</pre></code></td></tr><tr><td>57</td><td><code><pre> executeResponse(w, r, "services.html", core.CoreApp.Services, nil)</pre></code></td></tr><tr><td>58</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_logoutHandler">func logoutHandler</div><div class="info"><a href="#s_fn_logoutHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/dashboard.go</code>:</p></div><table class="listing">
|
||
<tr><td>62</td><td><code><pre>func logoutHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>63</td><td><code><pre> session, _ := sessionStore.Get(r, cookieKey)</pre></code></td></tr><tr><td>64</td><td><code><pre> session.Values["authenticated"] = false</pre></code></td></tr><tr><td>65</td><td><code><pre> session.Save(r, w)</pre></code></td></tr><tr><td>66</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>67</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_parseGet">func parseGet</div><div class="info"><a href="#s_fn_parseGet">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go</code>:</p></div><table class="listing">
|
||
<tr><td>132</td><td><code><pre>func parseGet(r *http.Request) url.Values {</pre></code></td></tr><tr><td>133</td><td><code><pre> r.ParseForm()</pre></code></td></tr><tr><td>134</td><td><code><pre> return r.Form</pre></code></td></tr><tr><td>135</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_error404Handler">func error404Handler</div><div class="info"><a href="#s_fn_error404Handler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>251</td><td><code><pre>func error404Handler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>252</td><td><code><pre> w.WriteHeader(http.StatusNotFound)</pre></code></td></tr><tr><td>253</td><td><code><pre> executeResponse(w, r, "error_404.html", nil, nil)</pre></code></td></tr><tr><td>254</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_resetRouter">func resetRouter</div><div class="info"><a href="#s_fn_resetRouter">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/routes.go</code>:</p></div><table class="listing">
|
||
<tr><td>119</td><td><code><pre>func resetRouter() {</pre></code></td></tr><tr><td>120</td><td><code><pre> router = Router()</pre></code></td></tr><tr><td>121</td><td><code><pre> httpServer.Handler = router</pre></code></td></tr><tr><td>122</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_parseForm">func parseForm</div><div class="info"><a href="#s_fn_parseForm">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go</code>:</p></div><table class="listing">
|
||
<tr><td>127</td><td><code><pre>func parseForm(r *http.Request) url.Values {</pre></code></td></tr><tr><td>128</td><td><code><pre> r.ParseForm()</pre></code></td></tr><tr><td>129</td><td><code><pre> return r.PostForm</pre></code></td></tr><tr><td>130</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@126:17">func @126:17</div><div class="info"><a href="#s_fn_@126:17">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>126</td><td><code><pre>func(html string) string {</pre></code></td></tr><tr><td>127</td><td><code><pre> return utils.UnderScoreString(html)</pre></code></td></tr><tr><td>128</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@129:10">func @129:10</div><div class="info"><a href="#s_fn_@129:10">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>129</td><td><code><pre>func() string {</pre></code></td></tr><tr><td>130</td><td><code><pre> return r.URL.String()</pre></code></td></tr><tr><td>131</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@138:15">func @138:15</div><div class="info"><a href="#s_fn_@138:15">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>138</td><td><code><pre>func(v interface{}) string {</pre></code></td></tr><tr><td>139</td><td><code><pre> return utils.ToString(v)</pre></code></td></tr><tr><td>140</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@151:15">func @151:15</div><div class="info"><a href="#s_fn_@151:15">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>151</td><td><code><pre>func(t int64) string {</pre></code></td></tr><tr><td>152</td><td><code><pre> return utils.Timezoner(time.Unix(t, 0), core.CoreApp.Timezone).Format("Monday, January 02")</pre></code></td></tr><tr><td>153</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@88:20">func @88:20</div><div class="info"><a href="#s_fn_@88:20">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>88</td><td><code><pre>func(w http.ResponseWriter, r *http.Request) template.FuncMap {</pre></code></td></tr><tr><td>89</td><td><code><pre> return template.FuncMap{</pre></code></td></tr><tr><td>90</td><td><code><pre> "js": func(html interface{}) template.JS {</pre></code></td></tr><tr><td>91</td><td><code><pre> return template.JS(utils.ToString(html))</pre></code></td></tr><tr><td>92</td><td><code><pre> },</pre></code></td></tr><tr><td>93</td><td><code><pre> "safe": func(html string) template.HTML {</pre></code></td></tr><tr><td>94</td><td><code><pre> return template.HTML(html)</pre></code></td></tr><tr><td>95</td><td><code><pre> },</pre></code></td></tr><tr><td>96</td><td><code><pre> "Auth": func() bool {</pre></code></td></tr><tr><td>97</td><td><code><pre> return IsAuthenticated(r)</pre></code></td></tr><tr><td>98</td><td><code><pre> },</pre></code></td></tr><tr><td>99</td><td><code><pre> "VERSION": func() string {</pre></code></td></tr><tr><td>100</td><td><code><pre> return core.VERSION</pre></code></td></tr><tr><td>101</td><td><code><pre> },</pre></code></td></tr><tr><td>102</td><td><code><pre> "CoreApp": func() *core.Core {</pre></code></td></tr><tr><td>103</td><td><code><pre> return core.CoreApp</pre></code></td></tr><tr><td>104</td><td><code><pre> },</pre></code></td></tr><tr><td>105</td><td><code><pre> "Services": func() []types.ServiceInterface {</pre></code></td></tr><tr><td>106</td><td><code><pre> return core.CoreApp.Services</pre></code></td></tr><tr><td>107</td><td><code><pre> },</pre></code></td></tr><tr><td>108</td><td><code><pre> "USE_CDN": func() bool {</pre></code></td></tr><tr><td>109</td><td><code><pre> return core.CoreApp.UseCdn</pre></code></td></tr><tr><td>110</td><td><code><pre> },</pre></code></td></tr><tr><td>111</td><td><code><pre> "Type": func(g interface{}) []string {</pre></code></td></tr><tr><td>112</td><td><code><pre> fooType := reflect.TypeOf(g)</pre></code></td></tr><tr><td>113</td><td><code><pre> var methods []string</pre></code></td></tr><tr><td>114</td><td><code><pre> methods = append(methods, fooType.String())</pre></code></td></tr><tr><td>115</td><td><code><pre> for i := 0; i < fooType.NumMethod(); i++ {</pre></code></td></tr><tr><td>116</td><td><code><pre> method := fooType.Method(i)</pre></code></td></tr><tr><td>117</td><td><code><pre> fmt.Println(method.Name)</pre></code></td></tr><tr><td>118</td><td><code><pre> methods = append(methods, method.Name)</pre></code></td></tr><tr><td>119</td><td><code><pre> }</pre></code></td></tr><tr><td>120</td><td><code><pre> return methods</pre></code></td></tr><tr><td>121</td><td><code><pre> },</pre></code></td></tr><tr><td>122</td><td><code><pre> "ToJSON": func(g interface{}) template.HTML {</pre></code></td></tr><tr><td>123</td><td><code><pre> data, _ := json.Marshal(g)</pre></code></td></tr><tr><td>124</td><td><code><pre> return template.HTML(string(data))</pre></code></td></tr><tr><td>125</td><td><code><pre> },</pre></code></td></tr><tr><td>126</td><td><code><pre> "underscore": func(html string) string {</pre></code></td></tr><tr><td>127</td><td><code><pre> return utils.UnderScoreString(html)</pre></code></td></tr><tr><td>128</td><td><code><pre> },</pre></code></td></tr><tr><td>129</td><td><code><pre> "URL": func() string {</pre></code></td></tr><tr><td>130</td><td><code><pre> return r.URL.String()</pre></code></td></tr><tr><td>131</td><td><code><pre> },</pre></code></td></tr><tr><td>132</td><td><code><pre> "CHART_DATA": func() string {</pre></code></td></tr><tr><td>133</td><td><code><pre> return ""</pre></code></td></tr><tr><td>134</td><td><code><pre> },</pre></code></td></tr><tr><td>135</td><td><code><pre> "Error": func() string {</pre></code></td></tr><tr><td>136</td><td><code><pre> return ""</pre></code></td></tr><tr><td>137</td><td><code><pre> },</pre></code></td></tr><tr><td>138</td><td><code><pre> "ToString": func(v interface{}) string {</pre></code></td></tr><tr><td>139</td><td><code><pre> return utils.ToString(v)</pre></code></td></tr><tr><td>140</td><td><code><pre> },</pre></code></td></tr><tr><td>141</td><td><code><pre> "Ago": func(t time.Time) string {</pre></code></td></tr><tr><td>142</td><td><code><pre> return utils.Timestamp(t).Ago()</pre></code></td></tr><tr><td>143</td><td><code><pre> },</pre></code></td></tr><tr><td>144</td><td><code><pre> "Duration": func(t time.Duration) string {</pre></code></td></tr><tr><td>145</td><td><code><pre> duration, _ := time.ParseDuration(fmt.Sprintf("%vs", t.Seconds()))</pre></code></td></tr><tr><td>146</td><td><code><pre> return utils.FormatDuration(duration)</pre></code></td></tr><tr><td>147</td><td><code><pre> },</pre></code></td></tr><tr><td>148</td><td><code><pre> "ToUnix": func(t time.Time) int64 {</pre></code></td></tr><tr><td>149</td><td><code><pre> return t.UTC().Unix()</pre></code></td></tr><tr><td>150</td><td><code><pre> },</pre></code></td></tr><tr><td>151</td><td><code><pre> "FromUnix": func(t int64) string {</pre></code></td></tr><tr><td>152</td><td><code><pre> return utils.Timezoner(time.Unix(t, 0), core.CoreApp.Timezone).Format("Monday, January 02")</pre></code></td></tr><tr><td>153</td><td><code><pre> },</pre></code></td></tr><tr><td>154</td><td><code><pre> "NewService": func() *types.Service {</pre></code></td></tr><tr><td>155</td><td><code><pre> return new(types.Service)</pre></code></td></tr><tr><td>156</td><td><code><pre> },</pre></code></td></tr><tr><td>157</td><td><code><pre> "NewUser": func() *types.User {</pre></code></td></tr><tr><td>158</td><td><code><pre> return new(types.User)</pre></code></td></tr><tr><td>159</td><td><code><pre> },</pre></code></td></tr><tr><td>160</td><td><code><pre> "NewCheckin": func() *types.Checkin {</pre></code></td></tr><tr><td>161</td><td><code><pre> return new(types.Checkin)</pre></code></td></tr><tr><td>162</td><td><code><pre> },</pre></code></td></tr><tr><td>163</td><td><code><pre> }</pre></code></td></tr><tr><td>164</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@135:12">func @135:12</div><div class="info"><a href="#s_fn_@135:12">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>135</td><td><code><pre>func() string {</pre></code></td></tr><tr><td>136</td><td><code><pre> return ""</pre></code></td></tr><tr><td>137</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@93:11">func @93:11</div><div class="info"><a href="#s_fn_@93:11">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>93</td><td><code><pre>func(html string) template.HTML {</pre></code></td></tr><tr><td>94</td><td><code><pre> return template.HTML(html)</pre></code></td></tr><tr><td>95</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@96:11">func @96:11</div><div class="info"><a href="#s_fn_@96:11">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>96</td><td><code><pre>func() bool {</pre></code></td></tr><tr><td>97</td><td><code><pre> return IsAuthenticated(r)</pre></code></td></tr><tr><td>98</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@99:14">func @99:14</div><div class="info"><a href="#s_fn_@99:14">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>99</td><td><code><pre>func() string {</pre></code></td></tr><tr><td>100</td><td><code><pre> return core.VERSION</pre></code></td></tr><tr><td>101</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@102:14">func @102:14</div><div class="info"><a href="#s_fn_@102:14">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>102</td><td><code><pre>func() *core.Core {</pre></code></td></tr><tr><td>103</td><td><code><pre> return core.CoreApp</pre></code></td></tr><tr><td>104</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@105:15">func @105:15</div><div class="info"><a href="#s_fn_@105:15">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>105</td><td><code><pre>func() []types.ServiceInterface {</pre></code></td></tr><tr><td>106</td><td><code><pre> return core.CoreApp.Services</pre></code></td></tr><tr><td>107</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@108:14">func @108:14</div><div class="info"><a href="#s_fn_@108:14">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>108</td><td><code><pre>func() bool {</pre></code></td></tr><tr><td>109</td><td><code><pre> return core.CoreApp.UseCdn</pre></code></td></tr><tr><td>110</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@154:17">func @154:17</div><div class="info"><a href="#s_fn_@154:17">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>154</td><td><code><pre>func() *types.Service {</pre></code></td></tr><tr><td>155</td><td><code><pre> return new(types.Service)</pre></code></td></tr><tr><td>156</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@157:14">func @157:14</div><div class="info"><a href="#s_fn_@157:14">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>157</td><td><code><pre>func() *types.User {</pre></code></td></tr><tr><td>158</td><td><code><pre> return new(types.User)</pre></code></td></tr><tr><td>159</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_saveSettingsHandler">func saveSettingsHandler</div><div class="info"><a href="#s_fn_saveSettingsHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go</code>:</p></div><table class="listing">
|
||
<tr><td>38</td><td><code><pre>func saveSettingsHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>39</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>40</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>41</td><td><code><pre> return</pre></code></td></tr><tr><td>42</td><td><code><pre> }</pre></code></td></tr><tr><td>43</td><td><code><pre> r.ParseForm()</pre></code></td></tr><tr><td>44</td><td><code><pre> app := core.CoreApp</pre></code></td></tr><tr><td>45</td><td><code><pre> name := r.PostForm.Get("project")</pre></code></td></tr><tr><td>46</td><td><code><pre> if name != "" {</pre></code></td></tr><tr><td>47</td><td><code><pre> app.Name = name</pre></code></td></tr><tr><td>48</td><td><code><pre> }</pre></code></td></tr><tr><td>49</td><td><code><pre> description := r.PostForm.Get("description")</pre></code></td></tr><tr><td>50</td><td><code><pre> if description != app.Description {</pre></code></td></tr><tr><td>51</td><td><code><pre> app.Description = description</pre></code></td></tr><tr><td>52</td><td><code><pre> }</pre></code></td></tr><tr><td>53</td><td><code><pre> style := r.PostForm.Get("style")</pre></code></td></tr><tr><td>54</td><td><code><pre> if style != app.Style {</pre></code></td></tr><tr class="miss"><td>55</td><td><code><pre> app.Style = style</pre></code></td></tr><tr><td>56</td><td><code><pre> }</pre></code></td></tr><tr><td>57</td><td><code><pre> footer := r.PostForm.Get("footer")</pre></code></td></tr><tr><td>58</td><td><code><pre> if footer != app.Footer {</pre></code></td></tr><tr><td>59</td><td><code><pre> app.Footer = footer</pre></code></td></tr><tr><td>60</td><td><code><pre> }</pre></code></td></tr><tr><td>61</td><td><code><pre> domain := r.PostForm.Get("domain")</pre></code></td></tr><tr><td>62</td><td><code><pre> if domain != app.Domain {</pre></code></td></tr><tr><td>63</td><td><code><pre> app.Domain = domain</pre></code></td></tr><tr><td>64</td><td><code><pre> }</pre></code></td></tr><tr><td>65</td><td><code><pre> timezone := r.PostForm.Get("timezone")</pre></code></td></tr><tr><td>66</td><td><code><pre> timeFloat, _ := strconv.ParseFloat(timezone, 10)</pre></code></td></tr><tr><td>67</td><td><code><pre> app.Timezone = float32(timeFloat)</pre></code></td></tr><tr><td>68</td><td><code><pre></pre></code></td></tr><tr><td>69</td><td><code><pre> app.UseCdn = (r.PostForm.Get("enable_cdn") == "on")</pre></code></td></tr><tr><td>70</td><td><code><pre> core.CoreApp, _ = core.UpdateCore(app)</pre></code></td></tr><tr><td>71</td><td><code><pre> //notifiers.OnSettingsSaved(core.CoreApp.ToCore())</pre></code></td></tr><tr><td>72</td><td><code><pre> executeResponse(w, r, "settings.html", core.CoreApp, "/settings")</pre></code></td></tr><tr><td>73</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_servicesUpdateHandler">func servicesUpdateHandler</div><div class="info"><a href="#s_fn_servicesUpdateHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>172</td><td><code><pre>func servicesUpdateHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>173</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr class="miss"><td>174</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr class="miss"><td>175</td><td><code><pre> return</pre></code></td></tr><tr><td>176</td><td><code><pre> }</pre></code></td></tr><tr><td>177</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr><td>178</td><td><code><pre> service := core.SelectService(utils.StringInt(vars["id"]))</pre></code></td></tr><tr><td>179</td><td><code><pre> r.ParseForm()</pre></code></td></tr><tr><td>180</td><td><code><pre> name := r.PostForm.Get("name")</pre></code></td></tr><tr><td>181</td><td><code><pre> domain := r.PostForm.Get("domain")</pre></code></td></tr><tr><td>182</td><td><code><pre> method := r.PostForm.Get("method")</pre></code></td></tr><tr><td>183</td><td><code><pre> expected := r.PostForm.Get("expected")</pre></code></td></tr><tr><td>184</td><td><code><pre> status, _ := strconv.Atoi(r.PostForm.Get("expected_status"))</pre></code></td></tr><tr><td>185</td><td><code><pre> interval, _ := strconv.Atoi(r.PostForm.Get("interval"))</pre></code></td></tr><tr><td>186</td><td><code><pre> port, _ := strconv.Atoi(r.PostForm.Get("port"))</pre></code></td></tr><tr><td>187</td><td><code><pre> timeout, _ := strconv.Atoi(r.PostForm.Get("timeout"))</pre></code></td></tr><tr><td>188</td><td><code><pre> checkType := r.PostForm.Get("check_type")</pre></code></td></tr><tr><td>189</td><td><code><pre> postData := r.PostForm.Get("post_data")</pre></code></td></tr><tr><td>190</td><td><code><pre> order, _ := strconv.Atoi(r.PostForm.Get("order"))</pre></code></td></tr><tr><td>191</td><td><code><pre></pre></code></td></tr><tr><td>192</td><td><code><pre> service.Name = name</pre></code></td></tr><tr><td>193</td><td><code><pre> service.Domain = domain</pre></code></td></tr><tr><td>194</td><td><code><pre> service.Method = method</pre></code></td></tr><tr><td>195</td><td><code><pre> service.ExpectedStatus = status</pre></code></td></tr><tr><td>196</td><td><code><pre> service.Expected = expected</pre></code></td></tr><tr><td>197</td><td><code><pre> service.Interval = interval</pre></code></td></tr><tr><td>198</td><td><code><pre> service.Type = checkType</pre></code></td></tr><tr><td>199</td><td><code><pre> service.Port = port</pre></code></td></tr><tr><td>200</td><td><code><pre> service.PostData = postData</pre></code></td></tr><tr><td>201</td><td><code><pre> service.Timeout = timeout</pre></code></td></tr><tr><td>202</td><td><code><pre> service.Order = order</pre></code></td></tr><tr><td>203</td><td><code><pre></pre></code></td></tr><tr><td>204</td><td><code><pre> service.Update(true)</pre></code></td></tr><tr><td>205</td><td><code><pre> service.Check(true)</pre></code></td></tr><tr><td>206</td><td><code><pre> executeResponse(w, r, "service.html", service, "/services")</pre></code></td></tr><tr><td>207</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_loginHandler">func loginHandler</div><div class="info"><a href="#s_fn_loginHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/dashboard.go</code>:</p></div><table class="listing">
|
||
<tr><td>42</td><td><code><pre>func loginHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>43</td><td><code><pre> if sessionStore == nil {</pre></code></td></tr><tr class="miss"><td>44</td><td><code><pre> resetCookies()</pre></code></td></tr><tr><td>45</td><td><code><pre> }</pre></code></td></tr><tr><td>46</td><td><code><pre> session, _ := sessionStore.Get(r, cookieKey)</pre></code></td></tr><tr><td>47</td><td><code><pre> r.ParseForm()</pre></code></td></tr><tr><td>48</td><td><code><pre> username := r.PostForm.Get("username")</pre></code></td></tr><tr><td>49</td><td><code><pre> password := r.PostForm.Get("password")</pre></code></td></tr><tr><td>50</td><td><code><pre> user, auth := core.AuthUser(username, password)</pre></code></td></tr><tr><td>51</td><td><code><pre> if auth {</pre></code></td></tr><tr><td>52</td><td><code><pre> session.Values["authenticated"] = true</pre></code></td></tr><tr><td>53</td><td><code><pre> session.Values["user_id"] = user.Id</pre></code></td></tr><tr><td>54</td><td><code><pre> session.Save(r, w)</pre></code></td></tr><tr><td>55</td><td><code><pre> http.Redirect(w, r, "/dashboard", http.StatusSeeOther)</pre></code></td></tr><tr><td>56</td><td><code><pre> } else {</pre></code></td></tr><tr><td>57</td><td><code><pre> err := core.ErrorResponse{Error: "Incorrect login information submitted, try again."}</pre></code></td></tr><tr><td>58</td><td><code><pre> executeResponse(w, r, "login.html", err, nil)</pre></code></td></tr><tr><td>59</td><td><code><pre> }</pre></code></td></tr><tr><td>60</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_createUserHandler">func createUserHandler</div><div class="info"><a href="#s_fn_createUserHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/users.go</code>:</p></div><table class="listing">
|
||
<tr><td>75</td><td><code><pre>func createUserHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>76</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>77</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>78</td><td><code><pre> return</pre></code></td></tr><tr><td>79</td><td><code><pre> }</pre></code></td></tr><tr><td>80</td><td><code><pre> r.ParseForm()</pre></code></td></tr><tr><td>81</td><td><code><pre> username := r.PostForm.Get("username")</pre></code></td></tr><tr><td>82</td><td><code><pre> password := r.PostForm.Get("password")</pre></code></td></tr><tr><td>83</td><td><code><pre> email := r.PostForm.Get("email")</pre></code></td></tr><tr><td>84</td><td><code><pre> admin := r.PostForm.Get("admin")</pre></code></td></tr><tr><td>85</td><td><code><pre></pre></code></td></tr><tr><td>86</td><td><code><pre> user := core.ReturnUser(&types.User{</pre></code></td></tr><tr><td>87</td><td><code><pre> Username: username,</pre></code></td></tr><tr><td>88</td><td><code><pre> Password: password,</pre></code></td></tr><tr><td>89</td><td><code><pre> Email: email,</pre></code></td></tr><tr><td>90</td><td><code><pre> Admin: (admin == "on"),</pre></code></td></tr><tr><td>91</td><td><code><pre> })</pre></code></td></tr><tr><td>92</td><td><code><pre> _, err := user.Create()</pre></code></td></tr><tr><td>93</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>94</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr><td>95</td><td><code><pre> }</pre></code></td></tr><tr><td>96</td><td><code><pre> //notifiers.OnNewUser(user)</pre></code></td></tr><tr><td>97</td><td><code><pre> executeResponse(w, r, "users.html", user, "/users")</pre></code></td></tr><tr><td>98</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_createServiceHandler">func createServiceHandler</div><div class="info"><a href="#s_fn_createServiceHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>81</td><td><code><pre>func createServiceHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>82</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>83</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>84</td><td><code><pre> return</pre></code></td></tr><tr><td>85</td><td><code><pre> }</pre></code></td></tr><tr><td>86</td><td><code><pre> r.ParseForm()</pre></code></td></tr><tr><td>87</td><td><code><pre> name := r.PostForm.Get("name")</pre></code></td></tr><tr><td>88</td><td><code><pre> domain := r.PostForm.Get("domain")</pre></code></td></tr><tr><td>89</td><td><code><pre> method := r.PostForm.Get("method")</pre></code></td></tr><tr><td>90</td><td><code><pre> expected := r.PostForm.Get("expected")</pre></code></td></tr><tr><td>91</td><td><code><pre> status, _ := strconv.Atoi(r.PostForm.Get("expected_status"))</pre></code></td></tr><tr><td>92</td><td><code><pre> interval, _ := strconv.Atoi(r.PostForm.Get("interval"))</pre></code></td></tr><tr><td>93</td><td><code><pre> port, _ := strconv.Atoi(r.PostForm.Get("port"))</pre></code></td></tr><tr><td>94</td><td><code><pre> timeout, _ := strconv.Atoi(r.PostForm.Get("timeout"))</pre></code></td></tr><tr><td>95</td><td><code><pre> checkType := r.PostForm.Get("check_type")</pre></code></td></tr><tr><td>96</td><td><code><pre> postData := r.PostForm.Get("post_data")</pre></code></td></tr><tr><td>97</td><td><code><pre> order, _ := strconv.Atoi(r.PostForm.Get("order"))</pre></code></td></tr><tr><td>98</td><td><code><pre></pre></code></td></tr><tr><td>99</td><td><code><pre> if checkType == "http" && status == 0 {</pre></code></td></tr><tr class="miss"><td>100</td><td><code><pre> status = 200</pre></code></td></tr><tr><td>101</td><td><code><pre> }</pre></code></td></tr><tr><td>102</td><td><code><pre></pre></code></td></tr><tr><td>103</td><td><code><pre> service := core.ReturnService(&types.Service{</pre></code></td></tr><tr><td>104</td><td><code><pre> Name: name,</pre></code></td></tr><tr><td>105</td><td><code><pre> Domain: domain,</pre></code></td></tr><tr><td>106</td><td><code><pre> Method: method,</pre></code></td></tr><tr><td>107</td><td><code><pre> Expected: expected,</pre></code></td></tr><tr><td>108</td><td><code><pre> ExpectedStatus: status,</pre></code></td></tr><tr><td>109</td><td><code><pre> Interval: interval,</pre></code></td></tr><tr><td>110</td><td><code><pre> Type: checkType,</pre></code></td></tr><tr><td>111</td><td><code><pre> Port: port,</pre></code></td></tr><tr><td>112</td><td><code><pre> PostData: postData,</pre></code></td></tr><tr><td>113</td><td><code><pre> Timeout: timeout,</pre></code></td></tr><tr><td>114</td><td><code><pre> Order: order,</pre></code></td></tr><tr><td>115</td><td><code><pre> })</pre></code></td></tr><tr><td>116</td><td><code><pre> _, err := service.Create(true)</pre></code></td></tr><tr><td>117</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>118</td><td><code><pre> utils.Log(3, fmt.Sprintf("Error starting %v check routine. %v", service.Name, err))</pre></code></td></tr><tr><td>119</td><td><code><pre> }</pre></code></td></tr><tr><td>120</td><td><code><pre> //notifiers.OnNewService(core.ReturnService(service.Service))</pre></code></td></tr><tr><td>121</td><td><code><pre> executeResponse(w, r, "services.html", core.CoreApp.Services, "/services")</pre></code></td></tr><tr><td>122</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_servicesViewHandler">func servicesViewHandler</div><div class="info"><a href="#s_fn_servicesViewHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>139</td><td><code><pre>func servicesViewHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>140</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr><td>141</td><td><code><pre> fields := parseGet(r)</pre></code></td></tr><tr><td>142</td><td><code><pre> startField := utils.StringInt(fields.Get("start"))</pre></code></td></tr><tr><td>143</td><td><code><pre> endField := utils.StringInt(fields.Get("end"))</pre></code></td></tr><tr><td>144</td><td><code><pre> serv := core.SelectService(utils.StringInt(vars["id"]))</pre></code></td></tr><tr><td>145</td><td><code><pre> if serv == nil {</pre></code></td></tr><tr><td>146</td><td><code><pre> w.WriteHeader(http.StatusNotFound)</pre></code></td></tr><tr><td>147</td><td><code><pre> return</pre></code></td></tr><tr><td>148</td><td><code><pre> }</pre></code></td></tr><tr><td>149</td><td><code><pre></pre></code></td></tr><tr><td>150</td><td><code><pre> end := time.Now().UTC()</pre></code></td></tr><tr><td>151</td><td><code><pre> start := end.Add((-24 * 7) * time.Hour).UTC()</pre></code></td></tr><tr><td>152</td><td><code><pre></pre></code></td></tr><tr><td>153</td><td><code><pre> if startField != 0 {</pre></code></td></tr><tr class="miss"><td>154</td><td><code><pre> start = time.Unix(startField, 0)</pre></code></td></tr><tr><td>155</td><td><code><pre> }</pre></code></td></tr><tr><td>156</td><td><code><pre> if endField != 0 {</pre></code></td></tr><tr class="miss"><td>157</td><td><code><pre> end = time.Unix(endField, 0)</pre></code></td></tr><tr><td>158</td><td><code><pre> }</pre></code></td></tr><tr><td>159</td><td><code><pre></pre></code></td></tr><tr><td>160</td><td><code><pre> data := core.GraphDataRaw(serv, start, end, "hour", "latency")</pre></code></td></tr><tr><td>161</td><td><code><pre></pre></code></td></tr><tr><td>162</td><td><code><pre> out := struct {</pre></code></td></tr><tr><td>163</td><td><code><pre> Service *core.Service</pre></code></td></tr><tr><td>164</td><td><code><pre> Start int64</pre></code></td></tr><tr><td>165</td><td><code><pre> End int64</pre></code></td></tr><tr><td>166</td><td><code><pre> Data string</pre></code></td></tr><tr><td>167</td><td><code><pre> }{serv, start.Unix(), end.Unix(), data.ToString()}</pre></code></td></tr><tr><td>168</td><td><code><pre></pre></code></td></tr><tr><td>169</td><td><code><pre> executeResponse(w, r, "service.html", out, nil)</pre></code></td></tr><tr><td>170</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_setupHandler">func setupHandler</div><div class="info"><a href="#s_fn_setupHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/setup.go</code>:</p></div><table class="listing">
|
||
<tr><td>27</td><td><code><pre>func setupHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>28</td><td><code><pre> if core.CoreApp.Services != nil {</pre></code></td></tr><tr><td>29</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>30</td><td><code><pre> return</pre></code></td></tr><tr><td>31</td><td><code><pre> }</pre></code></td></tr><tr><td>32</td><td><code><pre> w.WriteHeader(http.StatusOK)</pre></code></td></tr><tr><td>33</td><td><code><pre> var data interface{}</pre></code></td></tr><tr><td>34</td><td><code><pre> if os.Getenv("DB_CONN") != "" {</pre></code></td></tr><tr class="miss"><td>35</td><td><code><pre> data, _ = core.LoadUsingEnv()</pre></code></td></tr><tr><td>36</td><td><code><pre> }</pre></code></td></tr><tr><td>37</td><td><code><pre> executeResponse(w, r, "setup.html", data, nil)</pre></code></td></tr><tr><td>38</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_saveNotificationHandler">func saveNotificationHandler</div><div class="info"><a href="#s_fn_saveNotificationHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go</code>:</p></div><table class="listing">
|
||
<tr><td>137</td><td><code><pre>func saveNotificationHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>138</td><td><code><pre> var err error</pre></code></td></tr><tr><td>139</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>140</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>141</td><td><code><pre> return</pre></code></td></tr><tr><td>142</td><td><code><pre> }</pre></code></td></tr><tr><td>143</td><td><code><pre> form := parseForm(r)</pre></code></td></tr><tr><td>144</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr><td>145</td><td><code><pre> method := vars["method"]</pre></code></td></tr><tr><td>146</td><td><code><pre> enabled := form.Get("enable")</pre></code></td></tr><tr><td>147</td><td><code><pre> host := form.Get("host")</pre></code></td></tr><tr><td>148</td><td><code><pre> port := int(utils.StringInt(form.Get("port")))</pre></code></td></tr><tr><td>149</td><td><code><pre> username := form.Get("username")</pre></code></td></tr><tr><td>150</td><td><code><pre> password := form.Get("password")</pre></code></td></tr><tr><td>151</td><td><code><pre> var1 := form.Get("var1")</pre></code></td></tr><tr><td>152</td><td><code><pre> var2 := form.Get("var2")</pre></code></td></tr><tr><td>153</td><td><code><pre> apiKey := form.Get("api_key")</pre></code></td></tr><tr><td>154</td><td><code><pre> apiSecret := form.Get("api_secret")</pre></code></td></tr><tr><td>155</td><td><code><pre> limits := int(utils.StringInt(form.Get("limits")))</pre></code></td></tr><tr><td>156</td><td><code><pre></pre></code></td></tr><tr><td>157</td><td><code><pre> notifer, notif, err := notifier.SelectNotifier(method)</pre></code></td></tr><tr><td>158</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>159</td><td><code><pre> utils.Log(3, fmt.Sprintf("issue saving notifier %v: %v", method, err))</pre></code></td></tr><tr class="miss"><td>160</td><td><code><pre> executeResponse(w, r, "settings.html", core.CoreApp, "/settings")</pre></code></td></tr><tr class="miss"><td>161</td><td><code><pre> return</pre></code></td></tr><tr><td>162</td><td><code><pre> }</pre></code></td></tr><tr><td>163</td><td><code><pre></pre></code></td></tr><tr><td>164</td><td><code><pre> if host != "" {</pre></code></td></tr><tr><td>165</td><td><code><pre> notifer.Host = host</pre></code></td></tr><tr><td>166</td><td><code><pre> }</pre></code></td></tr><tr><td>167</td><td><code><pre> if port != 0 {</pre></code></td></tr><tr><td>168</td><td><code><pre> notifer.Port = port</pre></code></td></tr><tr><td>169</td><td><code><pre> }</pre></code></td></tr><tr><td>170</td><td><code><pre> if username != "" {</pre></code></td></tr><tr><td>171</td><td><code><pre> notifer.Username = username</pre></code></td></tr><tr><td>172</td><td><code><pre> }</pre></code></td></tr><tr><td>173</td><td><code><pre> if password != "" && password != "##########" {</pre></code></td></tr><tr><td>174</td><td><code><pre> notifer.Password = password</pre></code></td></tr><tr><td>175</td><td><code><pre> }</pre></code></td></tr><tr><td>176</td><td><code><pre> if var1 != "" {</pre></code></td></tr><tr><td>177</td><td><code><pre> notifer.Var1 = var1</pre></code></td></tr><tr><td>178</td><td><code><pre> }</pre></code></td></tr><tr><td>179</td><td><code><pre> if var2 != "" {</pre></code></td></tr><tr><td>180</td><td><code><pre> notifer.Var2 = var2</pre></code></td></tr><tr><td>181</td><td><code><pre> }</pre></code></td></tr><tr><td>182</td><td><code><pre> if apiKey != "" {</pre></code></td></tr><tr class="miss"><td>183</td><td><code><pre> notifer.ApiKey = apiKey</pre></code></td></tr><tr><td>184</td><td><code><pre> }</pre></code></td></tr><tr><td>185</td><td><code><pre> if apiSecret != "" {</pre></code></td></tr><tr class="miss"><td>186</td><td><code><pre> notifer.ApiSecret = apiSecret</pre></code></td></tr><tr><td>187</td><td><code><pre> }</pre></code></td></tr><tr><td>188</td><td><code><pre> if limits != 0 {</pre></code></td></tr><tr><td>189</td><td><code><pre> notifer.Limits = limits</pre></code></td></tr><tr><td>190</td><td><code><pre> }</pre></code></td></tr><tr><td>191</td><td><code><pre> notifer.Enabled = enabled == "on"</pre></code></td></tr><tr><td>192</td><td><code><pre> _, err = notifier.Update(notif, notifer)</pre></code></td></tr><tr><td>193</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>194</td><td><code><pre> utils.Log(3, fmt.Sprintf("issue updating notifier: %v", err))</pre></code></td></tr><tr><td>195</td><td><code><pre> }</pre></code></td></tr><tr><td>196</td><td><code><pre> notifier.OnSave(notifer.Method)</pre></code></td></tr><tr><td>197</td><td><code><pre> executeResponse(w, r, "settings.html", core.CoreApp, "/settings")</pre></code></td></tr><tr><td>198</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_apiIndexHandler">func apiIndexHandler</div><div class="info"><a href="#s_fn_apiIndexHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>36</td><td><code><pre>func apiIndexHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>37</td><td><code><pre> if !isAPIAuthorized(r) {</pre></code></td></tr><tr class="miss"><td>38</td><td><code><pre> http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)</pre></code></td></tr><tr class="miss"><td>39</td><td><code><pre> return</pre></code></td></tr><tr><td>40</td><td><code><pre> }</pre></code></td></tr><tr><td>41</td><td><code><pre> var out core.Core</pre></code></td></tr><tr><td>42</td><td><code><pre> out = *core.CoreApp</pre></code></td></tr><tr><td>43</td><td><code><pre> var services []types.ServiceInterface</pre></code></td></tr><tr><td>44</td><td><code><pre> for _, s := range out.Services {</pre></code></td></tr><tr><td>45</td><td><code><pre> service := s.Select()</pre></code></td></tr><tr><td>46</td><td><code><pre> service.Failures = nil</pre></code></td></tr><tr><td>47</td><td><code><pre> services = append(services, core.ReturnService(service))</pre></code></td></tr><tr><td>48</td><td><code><pre> }</pre></code></td></tr><tr><td>49</td><td><code><pre> out.Services = services</pre></code></td></tr><tr><td>50</td><td><code><pre> w.Header().Set("Content-Type", "application/json")</pre></code></td></tr><tr><td>51</td><td><code><pre> json.NewEncoder(w).Encode(out)</pre></code></td></tr><tr><td>52</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_apiServiceDataHandler">func apiServiceDataHandler</div><div class="info"><a href="#s_fn_apiServiceDataHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>81</td><td><code><pre>func apiServiceDataHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>82</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr><td>83</td><td><code><pre> service := core.SelectService(utils.StringInt(vars["id"]))</pre></code></td></tr><tr><td>84</td><td><code><pre> if service == nil {</pre></code></td></tr><tr class="miss"><td>85</td><td><code><pre> http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)</pre></code></td></tr><tr class="miss"><td>86</td><td><code><pre> return</pre></code></td></tr><tr><td>87</td><td><code><pre> }</pre></code></td></tr><tr><td>88</td><td><code><pre> fields := parseGet(r)</pre></code></td></tr><tr><td>89</td><td><code><pre> grouping := fields.Get("group")</pre></code></td></tr><tr><td>90</td><td><code><pre> startField := utils.StringInt(fields.Get("start"))</pre></code></td></tr><tr><td>91</td><td><code><pre> endField := utils.StringInt(fields.Get("end"))</pre></code></td></tr><tr><td>92</td><td><code><pre> obj := core.GraphDataRaw(service, time.Unix(startField, 0), time.Unix(endField, 0), grouping, "latency")</pre></code></td></tr><tr><td>93</td><td><code><pre></pre></code></td></tr><tr><td>94</td><td><code><pre> w.Header().Set("Content-Type", "application/json")</pre></code></td></tr><tr><td>95</td><td><code><pre> json.NewEncoder(w).Encode(obj)</pre></code></td></tr><tr><td>96</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_apiAllServicesHandler">func apiAllServicesHandler</div><div class="info"><a href="#s_fn_apiAllServicesHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>205</td><td><code><pre>func apiAllServicesHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>206</td><td><code><pre> if !isAPIAuthorized(r) {</pre></code></td></tr><tr class="miss"><td>207</td><td><code><pre> http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)</pre></code></td></tr><tr class="miss"><td>208</td><td><code><pre> return</pre></code></td></tr><tr><td>209</td><td><code><pre> }</pre></code></td></tr><tr><td>210</td><td><code><pre> allServices := core.CoreApp.Services</pre></code></td></tr><tr><td>211</td><td><code><pre> var services []types.ServiceInterface</pre></code></td></tr><tr><td>212</td><td><code><pre> for _, s := range allServices {</pre></code></td></tr><tr><td>213</td><td><code><pre> service := s.Select()</pre></code></td></tr><tr><td>214</td><td><code><pre> service.Failures = nil</pre></code></td></tr><tr><td>215</td><td><code><pre> services = append(services, core.ReturnService(service))</pre></code></td></tr><tr><td>216</td><td><code><pre> }</pre></code></td></tr><tr><td>217</td><td><code><pre> w.Header().Set("Content-Type", "application/json")</pre></code></td></tr><tr><td>218</td><td><code><pre> json.NewEncoder(w).Encode(services)</pre></code></td></tr><tr><td>219</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_executeResponse">func executeResponse</div><div class="info"><a href="#s_fn_executeResponse">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>169</td><td><code><pre>func executeResponse(w http.ResponseWriter, r *http.Request, file string, data interface{}, redirect interface{}) {</pre></code></td></tr><tr><td>170</td><td><code><pre> utils.Http(r)</pre></code></td></tr><tr><td>171</td><td><code><pre> if url, ok := redirect.(string); ok {</pre></code></td></tr><tr><td>172</td><td><code><pre> http.Redirect(w, r, url, http.StatusSeeOther)</pre></code></td></tr><tr><td>173</td><td><code><pre> return</pre></code></td></tr><tr><td>174</td><td><code><pre> }</pre></code></td></tr><tr><td>175</td><td><code><pre></pre></code></td></tr><tr><td>176</td><td><code><pre> templates := []string{"base.html", "head.html", "nav.html", "footer.html", "scripts.html", "form_service.html", "form_notifier.html", "form_user.html", "form_checkin.html"}</pre></code></td></tr><tr><td>177</td><td><code><pre></pre></code></td></tr><tr><td>178</td><td><code><pre> javascripts := []string{"charts.js", "chart_index.js"}</pre></code></td></tr><tr><td>179</td><td><code><pre></pre></code></td></tr><tr><td>180</td><td><code><pre> render, err := source.TmplBox.String(file)</pre></code></td></tr><tr><td>181</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>182</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr><td>183</td><td><code><pre> }</pre></code></td></tr><tr><td>184</td><td><code><pre></pre></code></td></tr><tr><td>185</td><td><code><pre> // setup the main template and handler funcs</pre></code></td></tr><tr><td>186</td><td><code><pre> t := template.New("main")</pre></code></td></tr><tr><td>187</td><td><code><pre> t.Funcs(handlerFuncs(w, r))</pre></code></td></tr><tr><td>188</td><td><code><pre> t, err = t.Parse(mainTmpl)</pre></code></td></tr><tr><td>189</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>190</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr><td>191</td><td><code><pre> }</pre></code></td></tr><tr><td>192</td><td><code><pre></pre></code></td></tr><tr><td>193</td><td><code><pre> // render all templates</pre></code></td></tr><tr><td>194</td><td><code><pre> for _, temp := range templates {</pre></code></td></tr><tr><td>195</td><td><code><pre> tmp, _ := source.TmplBox.String(temp)</pre></code></td></tr><tr><td>196</td><td><code><pre> t, err = t.Parse(tmp)</pre></code></td></tr><tr><td>197</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>198</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr><td>199</td><td><code><pre> }</pre></code></td></tr><tr><td>200</td><td><code><pre> }</pre></code></td></tr><tr><td>201</td><td><code><pre></pre></code></td></tr><tr><td>202</td><td><code><pre> // render all javascript files</pre></code></td></tr><tr><td>203</td><td><code><pre> for _, temp := range javascripts {</pre></code></td></tr><tr><td>204</td><td><code><pre> tmp, _ := source.JsBox.String(temp)</pre></code></td></tr><tr><td>205</td><td><code><pre> t, err = t.Parse(tmp)</pre></code></td></tr><tr><td>206</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>207</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr><td>208</td><td><code><pre> }</pre></code></td></tr><tr><td>209</td><td><code><pre> }</pre></code></td></tr><tr><td>210</td><td><code><pre></pre></code></td></tr><tr><td>211</td><td><code><pre> // render the page requested</pre></code></td></tr><tr><td>212</td><td><code><pre> _, err = t.Parse(render)</pre></code></td></tr><tr><td>213</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>214</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr><td>215</td><td><code><pre> }</pre></code></td></tr><tr><td>216</td><td><code><pre></pre></code></td></tr><tr><td>217</td><td><code><pre> // execute the template</pre></code></td></tr><tr><td>218</td><td><code><pre> err = t.Execute(w, data)</pre></code></td></tr><tr><td>219</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>220</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr><td>221</td><td><code><pre> }</pre></code></td></tr><tr><td>222</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_servicesDeleteHandler">func servicesDeleteHandler</div><div class="info"><a href="#s_fn_servicesDeleteHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>124</td><td><code><pre>func servicesDeleteHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>125</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>126</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>127</td><td><code><pre> return</pre></code></td></tr><tr><td>128</td><td><code><pre> }</pre></code></td></tr><tr><td>129</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr><td>130</td><td><code><pre> service := core.SelectService(utils.StringInt(vars["id"]))</pre></code></td></tr><tr><td>131</td><td><code><pre> if service == nil {</pre></code></td></tr><tr class="miss"><td>132</td><td><code><pre> w.WriteHeader(http.StatusNotFound)</pre></code></td></tr><tr class="miss"><td>133</td><td><code><pre> return</pre></code></td></tr><tr><td>134</td><td><code><pre> }</pre></code></td></tr><tr><td>135</td><td><code><pre> service.Delete()</pre></code></td></tr><tr><td>136</td><td><code><pre> executeResponse(w, r, "services.html", core.CoreApp.Services, "/services")</pre></code></td></tr><tr><td>137</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_usersDeleteHandler">func usersDeleteHandler</div><div class="info"><a href="#s_fn_usersDeleteHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/users.go</code>:</p></div><table class="listing">
|
||
<tr><td>100</td><td><code><pre>func usersDeleteHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>101</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>102</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>103</td><td><code><pre> return</pre></code></td></tr><tr><td>104</td><td><code><pre> }</pre></code></td></tr><tr><td>105</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr><td>106</td><td><code><pre> id, _ := strconv.Atoi(vars["id"])</pre></code></td></tr><tr><td>107</td><td><code><pre> user, _ := core.SelectUser(int64(id))</pre></code></td></tr><tr><td>108</td><td><code><pre></pre></code></td></tr><tr><td>109</td><td><code><pre> users, _ := core.SelectAllUsers()</pre></code></td></tr><tr><td>110</td><td><code><pre> if len(users) == 1 {</pre></code></td></tr><tr class="miss"><td>111</td><td><code><pre> utils.Log(2, "cannot delete the only user in the system")</pre></code></td></tr><tr class="miss"><td>112</td><td><code><pre> http.Redirect(w, r, "/users", http.StatusSeeOther)</pre></code></td></tr><tr class="miss"><td>113</td><td><code><pre> return</pre></code></td></tr><tr><td>114</td><td><code><pre> }</pre></code></td></tr><tr><td>115</td><td><code><pre> user.Delete()</pre></code></td></tr><tr><td>116</td><td><code><pre> http.Redirect(w, r, "/users", http.StatusSeeOther)</pre></code></td></tr><tr><td>117</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_resetCookies">func resetCookies</div><div class="info"><a href="#s_fn_resetCookies">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/routes.go</code>:</p></div><table class="listing">
|
||
<tr><td>124</td><td><code><pre>func resetCookies() {</pre></code></td></tr><tr><td>125</td><td><code><pre> if core.CoreApp != nil {</pre></code></td></tr><tr><td>126</td><td><code><pre> cookie := fmt.Sprintf("%v_%v", core.CoreApp.ApiSecret, time.Now().Nanosecond())</pre></code></td></tr><tr><td>127</td><td><code><pre> sessionStore = sessions.NewCookieStore([]byte(cookie))</pre></code></td></tr><tr><td>128</td><td><code><pre> } else {</pre></code></td></tr><tr class="miss"><td>129</td><td><code><pre> sessionStore = sessions.NewCookieStore([]byte("secretinfo"))</pre></code></td></tr><tr><td>130</td><td><code><pre> }</pre></code></td></tr><tr><td>131</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_executeJSResponse">func executeJSResponse</div><div class="info"><a href="#s_fn_executeJSResponse">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>225</td><td><code><pre>func executeJSResponse(w http.ResponseWriter, r *http.Request, file string, data interface{}) {</pre></code></td></tr><tr><td>226</td><td><code><pre> render, err := source.JsBox.String(file)</pre></code></td></tr><tr><td>227</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>228</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr><td>229</td><td><code><pre> }</pre></code></td></tr><tr><td>230</td><td><code><pre> t := template.New("charts")</pre></code></td></tr><tr><td>231</td><td><code><pre> t.Funcs(template.FuncMap{</pre></code></td></tr><tr><td>232</td><td><code><pre> "safe": func(html string) template.HTML {</pre></code></td></tr><tr><td>233</td><td><code><pre> return template.HTML(html)</pre></code></td></tr><tr><td>234</td><td><code><pre> },</pre></code></td></tr><tr><td>235</td><td><code><pre> "Services": func() []types.ServiceInterface {</pre></code></td></tr><tr><td>236</td><td><code><pre> return core.CoreApp.Services</pre></code></td></tr><tr><td>237</td><td><code><pre> },</pre></code></td></tr><tr><td>238</td><td><code><pre> })</pre></code></td></tr><tr><td>239</td><td><code><pre> _, err = t.Parse(render)</pre></code></td></tr><tr><td>240</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>241</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr><td>242</td><td><code><pre> }</pre></code></td></tr><tr><td>243</td><td><code><pre></pre></code></td></tr><tr><td>244</td><td><code><pre> err = t.Execute(w, data)</pre></code></td></tr><tr><td>245</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>246</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr><td>247</td><td><code><pre> }</pre></code></td></tr><tr><td>248</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_reorderServiceHandler">func reorderServiceHandler</div><div class="info"><a href="#s_fn_reorderServiceHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>65</td><td><code><pre>func reorderServiceHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>66</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>67</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>68</td><td><code><pre> return</pre></code></td></tr><tr><td>69</td><td><code><pre> }</pre></code></td></tr><tr><td>70</td><td><code><pre> var newOrder []*serviceOrder</pre></code></td></tr><tr><td>71</td><td><code><pre> decoder := json.NewDecoder(r.Body)</pre></code></td></tr><tr><td>72</td><td><code><pre> decoder.Decode(&newOrder)</pre></code></td></tr><tr><td>73</td><td><code><pre> for _, s := range newOrder {</pre></code></td></tr><tr class="miss"><td>74</td><td><code><pre> service := core.SelectService(s.Id)</pre></code></td></tr><tr class="miss"><td>75</td><td><code><pre> service.Order = s.Order</pre></code></td></tr><tr class="miss"><td>76</td><td><code><pre> service.Update(false)</pre></code></td></tr><tr><td>77</td><td><code><pre> }</pre></code></td></tr><tr><td>78</td><td><code><pre> w.WriteHeader(http.StatusOK)</pre></code></td></tr><tr><td>79</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_saveAssetsHandler">func saveAssetsHandler</div><div class="info"><a href="#s_fn_saveAssetsHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go</code>:</p></div><table class="listing">
|
||
<tr><td>92</td><td><code><pre>func saveAssetsHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>93</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr><td>94</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>95</td><td><code><pre> return</pre></code></td></tr><tr><td>96</td><td><code><pre> }</pre></code></td></tr><tr><td>97</td><td><code><pre> dir := utils.Directory</pre></code></td></tr><tr><td>98</td><td><code><pre> err := source.CreateAllAssets(dir)</pre></code></td></tr><tr><td>99</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>100</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr class="miss"><td>101</td><td><code><pre> return</pre></code></td></tr><tr><td>102</td><td><code><pre> }</pre></code></td></tr><tr><td>103</td><td><code><pre> err = source.CompileSASS(dir)</pre></code></td></tr><tr><td>104</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>105</td><td><code><pre> source.CopyToPublic(source.CssBox, dir+"/assets/css", "base.css")</pre></code></td></tr><tr class="miss"><td>106</td><td><code><pre> utils.Log(2, "Default 'base.css' was insert because SASS did not work.")</pre></code></td></tr><tr><td>107</td><td><code><pre> }</pre></code></td></tr><tr><td>108</td><td><code><pre> resetRouter()</pre></code></td></tr><tr><td>109</td><td><code><pre> executeResponse(w, r, "settings.html", core.CoreApp, "/settings")</pre></code></td></tr><tr><td>110</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_updateUserHandler">func updateUserHandler</div><div class="info"><a href="#s_fn_updateUserHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/users.go</code>:</p></div><table class="listing">
|
||
<tr><td>48</td><td><code><pre>func updateUserHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>49</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr class="miss"><td>50</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr class="miss"><td>51</td><td><code><pre> return</pre></code></td></tr><tr><td>52</td><td><code><pre> }</pre></code></td></tr><tr><td>53</td><td><code><pre> r.ParseForm()</pre></code></td></tr><tr><td>54</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr><td>55</td><td><code><pre> id, _ := strconv.Atoi(vars["id"])</pre></code></td></tr><tr><td>56</td><td><code><pre> user, err := core.SelectUser(int64(id))</pre></code></td></tr><tr><td>57</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>58</td><td><code><pre> utils.Log(3, fmt.Sprintf("user error: %v", err))</pre></code></td></tr><tr class="miss"><td>59</td><td><code><pre> w.WriteHeader(http.StatusInternalServerError)</pre></code></td></tr><tr class="miss"><td>60</td><td><code><pre> return</pre></code></td></tr><tr><td>61</td><td><code><pre> }</pre></code></td></tr><tr><td>62</td><td><code><pre></pre></code></td></tr><tr><td>63</td><td><code><pre> user.Username = r.PostForm.Get("username")</pre></code></td></tr><tr><td>64</td><td><code><pre> user.Email = r.PostForm.Get("email")</pre></code></td></tr><tr><td>65</td><td><code><pre> user.Admin = (r.PostForm.Get("admin") == "on")</pre></code></td></tr><tr><td>66</td><td><code><pre> password := r.PostForm.Get("password")</pre></code></td></tr><tr><td>67</td><td><code><pre> if password != "##########" {</pre></code></td></tr><tr class="miss"><td>68</td><td><code><pre> user.Password = utils.HashPassword(password)</pre></code></td></tr><tr><td>69</td><td><code><pre> }</pre></code></td></tr><tr><td>70</td><td><code><pre> user.Update()</pre></code></td></tr><tr><td>71</td><td><code><pre> users, _ := core.SelectAllUsers()</pre></code></td></tr><tr><td>72</td><td><code><pre> executeResponse(w, r, "users.html", users, "/users")</pre></code></td></tr><tr><td>73</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_apiServiceUpdateHandler">func apiServiceUpdateHandler</div><div class="info"><a href="#s_fn_apiServiceUpdateHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>153</td><td><code><pre>func apiServiceUpdateHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>154</td><td><code><pre> if !isAPIAuthorized(r) {</pre></code></td></tr><tr class="miss"><td>155</td><td><code><pre> http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)</pre></code></td></tr><tr class="miss"><td>156</td><td><code><pre> return</pre></code></td></tr><tr><td>157</td><td><code><pre> }</pre></code></td></tr><tr><td>158</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr><td>159</td><td><code><pre> service := core.SelectService(utils.StringInt(vars["id"]))</pre></code></td></tr><tr><td>160</td><td><code><pre> if service == nil {</pre></code></td></tr><tr class="miss"><td>161</td><td><code><pre> http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)</pre></code></td></tr><tr class="miss"><td>162</td><td><code><pre> return</pre></code></td></tr><tr><td>163</td><td><code><pre> }</pre></code></td></tr><tr><td>164</td><td><code><pre> var updatedService *types.Service</pre></code></td></tr><tr><td>165</td><td><code><pre> decoder := json.NewDecoder(r.Body)</pre></code></td></tr><tr><td>166</td><td><code><pre> decoder.Decode(&updatedService)</pre></code></td></tr><tr><td>167</td><td><code><pre> updatedService.Id = service.Id</pre></code></td></tr><tr><td>168</td><td><code><pre> service = core.ReturnService(updatedService)</pre></code></td></tr><tr><td>169</td><td><code><pre> err := service.Update(true)</pre></code></td></tr><tr><td>170</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>171</td><td><code><pre> http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)</pre></code></td></tr><tr class="miss"><td>172</td><td><code><pre> return</pre></code></td></tr><tr><td>173</td><td><code><pre> }</pre></code></td></tr><tr><td>174</td><td><code><pre> service.Check(true)</pre></code></td></tr><tr><td>175</td><td><code><pre> w.Header().Set("Content-Type", "application/json")</pre></code></td></tr><tr><td>176</td><td><code><pre> json.NewEncoder(w).Encode(service)</pre></code></td></tr><tr><td>177</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_apiRenewHandler">func apiRenewHandler</div><div class="info"><a href="#s_fn_apiRenewHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>54</td><td><code><pre>func apiRenewHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>55</td><td><code><pre> if !isAPIAuthorized(r) {</pre></code></td></tr><tr class="miss"><td>56</td><td><code><pre> http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)</pre></code></td></tr><tr class="miss"><td>57</td><td><code><pre> return</pre></code></td></tr><tr><td>58</td><td><code><pre> }</pre></code></td></tr><tr><td>59</td><td><code><pre> var err error</pre></code></td></tr><tr><td>60</td><td><code><pre> core.CoreApp.ApiKey = utils.NewSHA1Hash(40)</pre></code></td></tr><tr><td>61</td><td><code><pre> core.CoreApp.ApiSecret = utils.NewSHA1Hash(40)</pre></code></td></tr><tr><td>62</td><td><code><pre> core.CoreApp, err = core.UpdateCore(core.CoreApp)</pre></code></td></tr><tr><td>63</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>64</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr><td>65</td><td><code><pre> }</pre></code></td></tr><tr><td>66</td><td><code><pre> http.Redirect(w, r, "/settings", http.StatusSeeOther)</pre></code></td></tr><tr><td>67</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_apiUserUpdateHandler">func apiUserUpdateHandler</div><div class="info"><a href="#s_fn_apiUserUpdateHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>236</td><td><code><pre>func apiUserUpdateHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>237</td><td><code><pre> if !isAPIAuthorized(r) {</pre></code></td></tr><tr class="miss"><td>238</td><td><code><pre> http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)</pre></code></td></tr><tr class="miss"><td>239</td><td><code><pre> return</pre></code></td></tr><tr><td>240</td><td><code><pre> }</pre></code></td></tr><tr><td>241</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr><td>242</td><td><code><pre> user, err := core.SelectUser(utils.StringInt(vars["id"]))</pre></code></td></tr><tr><td>243</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>244</td><td><code><pre> http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)</pre></code></td></tr><tr class="miss"><td>245</td><td><code><pre> return</pre></code></td></tr><tr><td>246</td><td><code><pre> }</pre></code></td></tr><tr><td>247</td><td><code><pre> var updateUser *types.User</pre></code></td></tr><tr><td>248</td><td><code><pre> decoder := json.NewDecoder(r.Body)</pre></code></td></tr><tr><td>249</td><td><code><pre> decoder.Decode(&updateUser)</pre></code></td></tr><tr><td>250</td><td><code><pre> updateUser.Id = user.Id</pre></code></td></tr><tr><td>251</td><td><code><pre> user = core.ReturnUser(updateUser)</pre></code></td></tr><tr><td>252</td><td><code><pre> err = user.Update()</pre></code></td></tr><tr><td>253</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>254</td><td><code><pre> http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)</pre></code></td></tr><tr class="miss"><td>255</td><td><code><pre> return</pre></code></td></tr><tr><td>256</td><td><code><pre> }</pre></code></td></tr><tr><td>257</td><td><code><pre> w.Header().Set("Content-Type", "application/json")</pre></code></td></tr><tr><td>258</td><td><code><pre> json.NewEncoder(w).Encode(user)</pre></code></td></tr><tr><td>259</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_IsAuthenticated">func IsAuthenticated</div><div class="info"><a href="#s_fn_IsAuthenticated">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>68</td><td><code><pre>func IsAuthenticated(r *http.Request) bool {</pre></code></td></tr><tr><td>69</td><td><code><pre> if os.Getenv("GO_ENV") == "test" {</pre></code></td></tr><tr><td>70</td><td><code><pre> return true</pre></code></td></tr><tr><td>71</td><td><code><pre> }</pre></code></td></tr><tr><td>72</td><td><code><pre> if core.CoreApp == nil {</pre></code></td></tr><tr class="miss"><td>73</td><td><code><pre> return false</pre></code></td></tr><tr><td>74</td><td><code><pre> }</pre></code></td></tr><tr><td>75</td><td><code><pre> if sessionStore == nil {</pre></code></td></tr><tr class="miss"><td>76</td><td><code><pre> return false</pre></code></td></tr><tr><td>77</td><td><code><pre> }</pre></code></td></tr><tr><td>78</td><td><code><pre> session, err := sessionStore.Get(r, cookieKey)</pre></code></td></tr><tr><td>79</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>80</td><td><code><pre> return false</pre></code></td></tr><tr><td>81</td><td><code><pre> }</pre></code></td></tr><tr><td>82</td><td><code><pre> if session.Values["authenticated"] == nil {</pre></code></td></tr><tr><td>83</td><td><code><pre> return false</pre></code></td></tr><tr><td>84</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>85</td><td><code><pre> return session.Values["authenticated"].(bool)</pre></code></td></tr><tr><td>86</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_apiAllUsersHandler">func apiAllUsersHandler</div><div class="info"><a href="#s_fn_apiAllUsersHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>287</td><td><code><pre>func apiAllUsersHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>288</td><td><code><pre> if !isAPIAuthorized(r) {</pre></code></td></tr><tr class="miss"><td>289</td><td><code><pre> http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)</pre></code></td></tr><tr class="miss"><td>290</td><td><code><pre> return</pre></code></td></tr><tr><td>291</td><td><code><pre> }</pre></code></td></tr><tr><td>292</td><td><code><pre> users, _ := core.SelectAllUsers()</pre></code></td></tr><tr><td>293</td><td><code><pre> w.Header().Set("Content-Type", "application/json")</pre></code></td></tr><tr><td>294</td><td><code><pre> json.NewEncoder(w).Encode(users)</pre></code></td></tr><tr><td>295</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_apiCreateUsersHandler">func apiCreateUsersHandler</div><div class="info"><a href="#s_fn_apiCreateUsersHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>297</td><td><code><pre>func apiCreateUsersHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>298</td><td><code><pre> if !isAPIAuthorized(r) {</pre></code></td></tr><tr class="miss"><td>299</td><td><code><pre> http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)</pre></code></td></tr><tr class="miss"><td>300</td><td><code><pre> return</pre></code></td></tr><tr><td>301</td><td><code><pre> }</pre></code></td></tr><tr><td>302</td><td><code><pre> var user *types.User</pre></code></td></tr><tr><td>303</td><td><code><pre> decoder := json.NewDecoder(r.Body)</pre></code></td></tr><tr><td>304</td><td><code><pre> err := decoder.Decode(&user)</pre></code></td></tr><tr><td>305</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>306</td><td><code><pre> http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)</pre></code></td></tr><tr class="miss"><td>307</td><td><code><pre> return</pre></code></td></tr><tr><td>308</td><td><code><pre> }</pre></code></td></tr><tr><td>309</td><td><code><pre> newUser := core.ReturnUser(user)</pre></code></td></tr><tr><td>310</td><td><code><pre> uId, err := newUser.Create()</pre></code></td></tr><tr><td>311</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>312</td><td><code><pre> http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)</pre></code></td></tr><tr class="miss"><td>313</td><td><code><pre> return</pre></code></td></tr><tr><td>314</td><td><code><pre> }</pre></code></td></tr><tr><td>315</td><td><code><pre> output := apiResponse{</pre></code></td></tr><tr><td>316</td><td><code><pre> Object: "user",</pre></code></td></tr><tr><td>317</td><td><code><pre> Method: "create",</pre></code></td></tr><tr><td>318</td><td><code><pre> Id: uId,</pre></code></td></tr><tr><td>319</td><td><code><pre> Status: "success",</pre></code></td></tr><tr><td>320</td><td><code><pre> }</pre></code></td></tr><tr><td>321</td><td><code><pre> w.Header().Set("Content-Type", "application/json")</pre></code></td></tr><tr><td>322</td><td><code><pre> json.NewEncoder(w).Encode(output)</pre></code></td></tr><tr><td>323</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_apiCreateServiceHandler">func apiCreateServiceHandler</div><div class="info"><a href="#s_fn_apiCreateServiceHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>131</td><td><code><pre>func apiCreateServiceHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>132</td><td><code><pre> if !isAPIAuthorized(r) {</pre></code></td></tr><tr class="miss"><td>133</td><td><code><pre> http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)</pre></code></td></tr><tr class="miss"><td>134</td><td><code><pre> return</pre></code></td></tr><tr><td>135</td><td><code><pre> }</pre></code></td></tr><tr><td>136</td><td><code><pre> var service *types.Service</pre></code></td></tr><tr><td>137</td><td><code><pre> decoder := json.NewDecoder(r.Body)</pre></code></td></tr><tr><td>138</td><td><code><pre> err := decoder.Decode(&service)</pre></code></td></tr><tr><td>139</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>140</td><td><code><pre> http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)</pre></code></td></tr><tr class="miss"><td>141</td><td><code><pre> return</pre></code></td></tr><tr><td>142</td><td><code><pre> }</pre></code></td></tr><tr><td>143</td><td><code><pre> newService := core.ReturnService(service)</pre></code></td></tr><tr><td>144</td><td><code><pre> _, err = newService.Create(true)</pre></code></td></tr><tr><td>145</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>146</td><td><code><pre> http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)</pre></code></td></tr><tr class="miss"><td>147</td><td><code><pre> return</pre></code></td></tr><tr><td>148</td><td><code><pre> }</pre></code></td></tr><tr><td>149</td><td><code><pre> w.Header().Set("Content-Type", "application/json")</pre></code></td></tr><tr><td>150</td><td><code><pre> json.NewEncoder(w).Encode(service)</pre></code></td></tr><tr><td>151</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_processSetupHandler">func processSetupHandler</div><div class="info"><a href="#s_fn_processSetupHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/setup.go</code>:</p></div><table class="listing">
|
||
<tr><td>40</td><td><code><pre>func processSetupHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>41</td><td><code><pre> var err error</pre></code></td></tr><tr><td>42</td><td><code><pre> if core.Services() != nil {</pre></code></td></tr><tr class="miss"><td>43</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr class="miss"><td>44</td><td><code><pre> return</pre></code></td></tr><tr><td>45</td><td><code><pre> }</pre></code></td></tr><tr><td>46</td><td><code><pre> r.ParseForm()</pre></code></td></tr><tr><td>47</td><td><code><pre> dbHost := r.PostForm.Get("db_host")</pre></code></td></tr><tr><td>48</td><td><code><pre> dbUser := r.PostForm.Get("db_user")</pre></code></td></tr><tr><td>49</td><td><code><pre> dbPass := r.PostForm.Get("db_password")</pre></code></td></tr><tr><td>50</td><td><code><pre> dbDatabase := r.PostForm.Get("db_database")</pre></code></td></tr><tr><td>51</td><td><code><pre> dbConn := r.PostForm.Get("db_connection")</pre></code></td></tr><tr><td>52</td><td><code><pre> dbPort := utils.StringInt(r.PostForm.Get("db_port"))</pre></code></td></tr><tr><td>53</td><td><code><pre> project := r.PostForm.Get("project")</pre></code></td></tr><tr><td>54</td><td><code><pre> username := r.PostForm.Get("username")</pre></code></td></tr><tr><td>55</td><td><code><pre> password := r.PostForm.Get("password")</pre></code></td></tr><tr><td>56</td><td><code><pre> //sample := r.PostForm.Get("sample_data")</pre></code></td></tr><tr><td>57</td><td><code><pre> description := r.PostForm.Get("description")</pre></code></td></tr><tr><td>58</td><td><code><pre> domain := r.PostForm.Get("domain")</pre></code></td></tr><tr><td>59</td><td><code><pre> email := r.PostForm.Get("email")</pre></code></td></tr><tr><td>60</td><td><code><pre> dir := utils.Directory</pre></code></td></tr><tr><td>61</td><td><code><pre></pre></code></td></tr><tr><td>62</td><td><code><pre> config := &core.DbConfig{</pre></code></td></tr><tr><td>63</td><td><code><pre> DbConn: dbConn,</pre></code></td></tr><tr><td>64</td><td><code><pre> DbHost: dbHost,</pre></code></td></tr><tr><td>65</td><td><code><pre> DbUser: dbUser,</pre></code></td></tr><tr><td>66</td><td><code><pre> DbPass: dbPass,</pre></code></td></tr><tr><td>67</td><td><code><pre> DbData: dbDatabase,</pre></code></td></tr><tr><td>68</td><td><code><pre> DbPort: dbPort,</pre></code></td></tr><tr><td>69</td><td><code><pre> Project: project,</pre></code></td></tr><tr><td>70</td><td><code><pre> Description: description,</pre></code></td></tr><tr><td>71</td><td><code><pre> Domain: domain,</pre></code></td></tr><tr><td>72</td><td><code><pre> Username: username,</pre></code></td></tr><tr><td>73</td><td><code><pre> Password: password,</pre></code></td></tr><tr><td>74</td><td><code><pre> Email: email,</pre></code></td></tr><tr><td>75</td><td><code><pre> Error: nil,</pre></code></td></tr><tr><td>76</td><td><code><pre> Location: utils.Directory,</pre></code></td></tr><tr><td>77</td><td><code><pre> }</pre></code></td></tr><tr><td>78</td><td><code><pre></pre></code></td></tr><tr><td>79</td><td><code><pre> if core.Configs, err = config.Save(); err != nil {</pre></code></td></tr><tr class="miss"><td>80</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr class="miss"><td>81</td><td><code><pre> config.Error = err</pre></code></td></tr><tr class="miss"><td>82</td><td><code><pre> setupResponseError(w, r, config)</pre></code></td></tr><tr class="miss"><td>83</td><td><code><pre> return</pre></code></td></tr><tr><td>84</td><td><code><pre> }</pre></code></td></tr><tr><td>85</td><td><code><pre></pre></code></td></tr><tr><td>86</td><td><code><pre> if core.Configs, err = core.LoadConfigFile(dir); err != nil {</pre></code></td></tr><tr class="miss"><td>87</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr class="miss"><td>88</td><td><code><pre> config.Error = err</pre></code></td></tr><tr class="miss"><td>89</td><td><code><pre> setupResponseError(w, r, config)</pre></code></td></tr><tr class="miss"><td>90</td><td><code><pre> return</pre></code></td></tr><tr><td>91</td><td><code><pre> }</pre></code></td></tr><tr><td>92</td><td><code><pre></pre></code></td></tr><tr><td>93</td><td><code><pre> if err = core.Configs.Connect(false, dir); err != nil {</pre></code></td></tr><tr class="miss"><td>94</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr class="miss"><td>95</td><td><code><pre> core.DeleteConfig()</pre></code></td></tr><tr class="miss"><td>96</td><td><code><pre> config.Error = err</pre></code></td></tr><tr class="miss"><td>97</td><td><code><pre> setupResponseError(w, r, config)</pre></code></td></tr><tr class="miss"><td>98</td><td><code><pre> return</pre></code></td></tr><tr><td>99</td><td><code><pre> }</pre></code></td></tr><tr><td>100</td><td><code><pre></pre></code></td></tr><tr><td>101</td><td><code><pre> config.DropDatabase()</pre></code></td></tr><tr><td>102</td><td><code><pre> config.CreateDatabase()</pre></code></td></tr><tr><td>103</td><td><code><pre></pre></code></td></tr><tr><td>104</td><td><code><pre> core.CoreApp, err = config.InsertCore()</pre></code></td></tr><tr><td>105</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>106</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr class="miss"><td>107</td><td><code><pre> config.Error = err</pre></code></td></tr><tr class="miss"><td>108</td><td><code><pre> setupResponseError(w, r, config)</pre></code></td></tr><tr class="miss"><td>109</td><td><code><pre> return</pre></code></td></tr><tr><td>110</td><td><code><pre> }</pre></code></td></tr><tr><td>111</td><td><code><pre></pre></code></td></tr><tr><td>112</td><td><code><pre> admin := core.ReturnUser(&types.User{</pre></code></td></tr><tr><td>113</td><td><code><pre> Username: config.Username,</pre></code></td></tr><tr><td>114</td><td><code><pre> Password: config.Password,</pre></code></td></tr><tr><td>115</td><td><code><pre> Email: config.Email,</pre></code></td></tr><tr><td>116</td><td><code><pre> Admin: true,</pre></code></td></tr><tr><td>117</td><td><code><pre> })</pre></code></td></tr><tr><td>118</td><td><code><pre> admin.Create()</pre></code></td></tr><tr><td>119</td><td><code><pre></pre></code></td></tr><tr><td>120</td><td><code><pre> core.SampleData()</pre></code></td></tr><tr><td>121</td><td><code><pre> core.InitApp()</pre></code></td></tr><tr><td>122</td><td><code><pre> resetCookies()</pre></code></td></tr><tr><td>123</td><td><code><pre> time.Sleep(2 * time.Second)</pre></code></td></tr><tr><td>124</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr><td>125</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_apiUserDeleteHandler">func apiUserDeleteHandler</div><div class="info"><a href="#s_fn_apiUserDeleteHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>261</td><td><code><pre>func apiUserDeleteHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>262</td><td><code><pre> if !isAPIAuthorized(r) {</pre></code></td></tr><tr class="miss"><td>263</td><td><code><pre> http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)</pre></code></td></tr><tr class="miss"><td>264</td><td><code><pre> return</pre></code></td></tr><tr><td>265</td><td><code><pre> }</pre></code></td></tr><tr><td>266</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr><td>267</td><td><code><pre> user, err := core.SelectUser(utils.StringInt(vars["id"]))</pre></code></td></tr><tr><td>268</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>269</td><td><code><pre> http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)</pre></code></td></tr><tr class="miss"><td>270</td><td><code><pre> return</pre></code></td></tr><tr><td>271</td><td><code><pre> }</pre></code></td></tr><tr><td>272</td><td><code><pre> err = user.Delete()</pre></code></td></tr><tr><td>273</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>274</td><td><code><pre> http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)</pre></code></td></tr><tr class="miss"><td>275</td><td><code><pre> return</pre></code></td></tr><tr><td>276</td><td><code><pre> }</pre></code></td></tr><tr><td>277</td><td><code><pre> output := apiResponse{</pre></code></td></tr><tr><td>278</td><td><code><pre> Object: "user",</pre></code></td></tr><tr><td>279</td><td><code><pre> Method: "delete",</pre></code></td></tr><tr><td>280</td><td><code><pre> Id: user.Id,</pre></code></td></tr><tr><td>281</td><td><code><pre> Status: "success",</pre></code></td></tr><tr><td>282</td><td><code><pre> }</pre></code></td></tr><tr><td>283</td><td><code><pre> w.Header().Set("Content-Type", "application/json")</pre></code></td></tr><tr><td>284</td><td><code><pre> json.NewEncoder(w).Encode(output)</pre></code></td></tr><tr><td>285</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_apiServiceDeleteHandler">func apiServiceDeleteHandler</div><div class="info"><a href="#s_fn_apiServiceDeleteHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>179</td><td><code><pre>func apiServiceDeleteHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>180</td><td><code><pre> if !isAPIAuthorized(r) {</pre></code></td></tr><tr class="miss"><td>181</td><td><code><pre> http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)</pre></code></td></tr><tr class="miss"><td>182</td><td><code><pre> return</pre></code></td></tr><tr><td>183</td><td><code><pre> }</pre></code></td></tr><tr><td>184</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr><td>185</td><td><code><pre> service := core.SelectService(utils.StringInt(vars["id"]))</pre></code></td></tr><tr><td>186</td><td><code><pre> if service == nil {</pre></code></td></tr><tr class="miss"><td>187</td><td><code><pre> http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)</pre></code></td></tr><tr class="miss"><td>188</td><td><code><pre> return</pre></code></td></tr><tr><td>189</td><td><code><pre> }</pre></code></td></tr><tr><td>190</td><td><code><pre> err := service.Delete()</pre></code></td></tr><tr><td>191</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>192</td><td><code><pre> http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)</pre></code></td></tr><tr class="miss"><td>193</td><td><code><pre> return</pre></code></td></tr><tr><td>194</td><td><code><pre> }</pre></code></td></tr><tr><td>195</td><td><code><pre> output := apiResponse{</pre></code></td></tr><tr><td>196</td><td><code><pre> Object: "service",</pre></code></td></tr><tr><td>197</td><td><code><pre> Method: "delete",</pre></code></td></tr><tr><td>198</td><td><code><pre> Id: service.Id,</pre></code></td></tr><tr><td>199</td><td><code><pre> Status: "success",</pre></code></td></tr><tr><td>200</td><td><code><pre> }</pre></code></td></tr><tr><td>201</td><td><code><pre> w.Header().Set("Content-Type", "application/json")</pre></code></td></tr><tr><td>202</td><td><code><pre> json.NewEncoder(w).Encode(output)</pre></code></td></tr><tr><td>203</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_apiUserHandler">func apiUserHandler</div><div class="info"><a href="#s_fn_apiUserHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>221</td><td><code><pre>func apiUserHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>222</td><td><code><pre> if !isAPIAuthorized(r) {</pre></code></td></tr><tr class="miss"><td>223</td><td><code><pre> http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)</pre></code></td></tr><tr class="miss"><td>224</td><td><code><pre> return</pre></code></td></tr><tr><td>225</td><td><code><pre> }</pre></code></td></tr><tr><td>226</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr><td>227</td><td><code><pre> user, err := core.SelectUser(utils.StringInt(vars["id"]))</pre></code></td></tr><tr><td>228</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>229</td><td><code><pre> http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)</pre></code></td></tr><tr class="miss"><td>230</td><td><code><pre> return</pre></code></td></tr><tr><td>231</td><td><code><pre> }</pre></code></td></tr><tr><td>232</td><td><code><pre> w.Header().Set("Content-Type", "application/json")</pre></code></td></tr><tr><td>233</td><td><code><pre> json.NewEncoder(w).Encode(user)</pre></code></td></tr><tr><td>234</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_apiServiceHandler">func apiServiceHandler</div><div class="info"><a href="#s_fn_apiServiceHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>115</td><td><code><pre>func apiServiceHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>116</td><td><code><pre> if !isAPIAuthorized(r) {</pre></code></td></tr><tr class="miss"><td>117</td><td><code><pre> http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)</pre></code></td></tr><tr class="miss"><td>118</td><td><code><pre> return</pre></code></td></tr><tr><td>119</td><td><code><pre> }</pre></code></td></tr><tr><td>120</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr><td>121</td><td><code><pre> service := core.SelectService(utils.StringInt(vars["id"]))</pre></code></td></tr><tr><td>122</td><td><code><pre> if service == nil {</pre></code></td></tr><tr class="miss"><td>123</td><td><code><pre> http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)</pre></code></td></tr><tr class="miss"><td>124</td><td><code><pre> return</pre></code></td></tr><tr><td>125</td><td><code><pre> }</pre></code></td></tr><tr><td>126</td><td><code><pre></pre></code></td></tr><tr><td>127</td><td><code><pre> w.Header().Set("Content-Type", "application/json")</pre></code></td></tr><tr><td>128</td><td><code><pre> json.NewEncoder(w).Encode(service)</pre></code></td></tr><tr><td>129</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_dashboardHandler">func dashboardHandler</div><div class="info"><a href="#s_fn_dashboardHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/dashboard.go</code>:</p></div><table class="listing">
|
||
<tr><td>32</td><td><code><pre>func dashboardHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>33</td><td><code><pre> fmt.Println()</pre></code></td></tr><tr><td>34</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr class="miss"><td>35</td><td><code><pre> err := core.ErrorResponse{}</pre></code></td></tr><tr class="miss"><td>36</td><td><code><pre> executeResponse(w, r, "login.html", err, nil)</pre></code></td></tr><tr><td>37</td><td><code><pre> } else {</pre></code></td></tr><tr><td>38</td><td><code><pre> executeResponse(w, r, "dashboard.html", core.CoreApp, nil)</pre></code></td></tr><tr><td>39</td><td><code><pre> }</pre></code></td></tr><tr><td>40</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_indexHandler">func indexHandler</div><div class="info"><a href="#s_fn_indexHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/index.go</code>:</p></div><table class="listing">
|
||
<tr><td>25</td><td><code><pre>func indexHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr><td>26</td><td><code><pre> if core.Configs == nil {</pre></code></td></tr><tr class="miss"><td>27</td><td><code><pre> http.Redirect(w, r, "/setup", http.StatusSeeOther)</pre></code></td></tr><tr class="miss"><td>28</td><td><code><pre> return</pre></code></td></tr><tr><td>29</td><td><code><pre> }</pre></code></td></tr><tr><td>30</td><td><code><pre> executeResponse(w, r, "index.html", core.CoreApp, nil)</pre></code></td></tr><tr><td>31</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_isAPIAuthorized">func isAPIAuthorized</div><div class="info"><a href="#s_fn_isAPIAuthorized">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>325</td><td><code><pre>func isAPIAuthorized(r *http.Request) bool {</pre></code></td></tr><tr><td>326</td><td><code><pre> if os.Getenv("GO_ENV") == "test" {</pre></code></td></tr><tr><td>327</td><td><code><pre> return true</pre></code></td></tr><tr><td>328</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>329</td><td><code><pre> if IsAuthenticated(r) {</pre></code></td></tr><tr class="miss"><td>330</td><td><code><pre> return true</pre></code></td></tr><tr><td>331</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>332</td><td><code><pre> if isAuthorized(r) {</pre></code></td></tr><tr class="miss"><td>333</td><td><code><pre> return true</pre></code></td></tr><tr><td>334</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>335</td><td><code><pre> return false</pre></code></td></tr><tr><td>336</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_testNotificationHandler">func testNotificationHandler</div><div class="info"><a href="#s_fn_testNotificationHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go</code>:</p></div><table class="listing">
|
||
<tr><td>200</td><td><code><pre>func testNotificationHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr class="miss"><td>201</td><td><code><pre> var err error</pre></code></td></tr><tr class="miss"><td>202</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr class="miss"><td>203</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr class="miss"><td>204</td><td><code><pre> return</pre></code></td></tr><tr><td>205</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>206</td><td><code><pre> form := parseForm(r)</pre></code></td></tr><tr class="miss"><td>207</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr class="miss"><td>208</td><td><code><pre> method := vars["method"]</pre></code></td></tr><tr class="miss"><td>209</td><td><code><pre> enabled := form.Get("enable")</pre></code></td></tr><tr class="miss"><td>210</td><td><code><pre> host := form.Get("host")</pre></code></td></tr><tr class="miss"><td>211</td><td><code><pre> port := int(utils.StringInt(form.Get("port")))</pre></code></td></tr><tr class="miss"><td>212</td><td><code><pre> username := form.Get("username")</pre></code></td></tr><tr class="miss"><td>213</td><td><code><pre> password := form.Get("password")</pre></code></td></tr><tr class="miss"><td>214</td><td><code><pre> var1 := form.Get("var1")</pre></code></td></tr><tr class="miss"><td>215</td><td><code><pre> var2 := form.Get("var2")</pre></code></td></tr><tr class="miss"><td>216</td><td><code><pre> apiKey := form.Get("api_key")</pre></code></td></tr><tr class="miss"><td>217</td><td><code><pre> apiSecret := form.Get("api_secret")</pre></code></td></tr><tr class="miss"><td>218</td><td><code><pre> limits := int(utils.StringInt(form.Get("limits")))</pre></code></td></tr><tr><td>219</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>220</td><td><code><pre> fakeNotifer, notif, err := notifier.SelectNotifier(method)</pre></code></td></tr><tr class="miss"><td>221</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>222</td><td><code><pre> utils.Log(3, fmt.Sprintf("issue saving notifier %v: %v", method, err))</pre></code></td></tr><tr class="miss"><td>223</td><td><code><pre> executeResponse(w, r, "settings.html", core.CoreApp, "/settings")</pre></code></td></tr><tr class="miss"><td>224</td><td><code><pre> return</pre></code></td></tr><tr><td>225</td><td><code><pre> }</pre></code></td></tr><tr><td>226</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>227</td><td><code><pre> notifer := *fakeNotifer</pre></code></td></tr><tr><td>228</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>229</td><td><code><pre> if host != "" {</pre></code></td></tr><tr class="miss"><td>230</td><td><code><pre> notifer.Host = host</pre></code></td></tr><tr><td>231</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>232</td><td><code><pre> if port != 0 {</pre></code></td></tr><tr class="miss"><td>233</td><td><code><pre> notifer.Port = port</pre></code></td></tr><tr><td>234</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>235</td><td><code><pre> if username != "" {</pre></code></td></tr><tr class="miss"><td>236</td><td><code><pre> notifer.Username = username</pre></code></td></tr><tr><td>237</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>238</td><td><code><pre> if password != "" && password != "##########" {</pre></code></td></tr><tr class="miss"><td>239</td><td><code><pre> notifer.Password = password</pre></code></td></tr><tr><td>240</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>241</td><td><code><pre> if var1 != "" {</pre></code></td></tr><tr class="miss"><td>242</td><td><code><pre> notifer.Var1 = var1</pre></code></td></tr><tr><td>243</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>244</td><td><code><pre> if var2 != "" {</pre></code></td></tr><tr class="miss"><td>245</td><td><code><pre> notifer.Var2 = var2</pre></code></td></tr><tr><td>246</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>247</td><td><code><pre> if apiKey != "" {</pre></code></td></tr><tr class="miss"><td>248</td><td><code><pre> notifer.ApiKey = apiKey</pre></code></td></tr><tr><td>249</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>250</td><td><code><pre> if apiSecret != "" {</pre></code></td></tr><tr class="miss"><td>251</td><td><code><pre> notifer.ApiSecret = apiSecret</pre></code></td></tr><tr><td>252</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>253</td><td><code><pre> if limits != 0 {</pre></code></td></tr><tr class="miss"><td>254</td><td><code><pre> notifer.Limits = limits</pre></code></td></tr><tr><td>255</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>256</td><td><code><pre> notifer.Enabled = enabled == "on"</pre></code></td></tr><tr><td>257</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>258</td><td><code><pre> err = notif.(notifier.Tester).OnTest()</pre></code></td></tr><tr class="miss"><td>259</td><td><code><pre> if err == nil {</pre></code></td></tr><tr class="miss"><td>260</td><td><code><pre> w.Write([]byte("ok"))</pre></code></td></tr><tr><td>261</td><td><code><pre> } else {</pre></code></td></tr><tr class="miss"><td>262</td><td><code><pre> w.Write([]byte(err.Error()))</pre></code></td></tr><tr><td>263</td><td><code><pre> }</pre></code></td></tr><tr><td>264</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DesktopInit">func DesktopInit</div><div class="info"><a href="#s_fn_DesktopInit">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/index.go</code>:</p></div><table class="listing">
|
||
<tr><td>38</td><td><code><pre>func DesktopInit(ip string, port int) {</pre></code></td></tr><tr class="miss"><td>39</td><td><code><pre> var err error</pre></code></td></tr><tr class="miss"><td>40</td><td><code><pre> exists := utils.FileExists(utils.Directory + "/statup.db")</pre></code></td></tr><tr class="miss"><td>41</td><td><code><pre> if exists {</pre></code></td></tr><tr class="miss"><td>42</td><td><code><pre> core.Configs, err = core.LoadConfigFile(utils.Directory)</pre></code></td></tr><tr class="miss"><td>43</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>44</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr class="miss"><td>45</td><td><code><pre> return</pre></code></td></tr><tr><td>46</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>47</td><td><code><pre> err = core.Configs.Connect(false, utils.Directory)</pre></code></td></tr><tr class="miss"><td>48</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>49</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr class="miss"><td>50</td><td><code><pre> return</pre></code></td></tr><tr><td>51</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>52</td><td><code><pre> core.InitApp()</pre></code></td></tr><tr class="miss"><td>53</td><td><code><pre> RunHTTPServer(ip, port)</pre></code></td></tr><tr><td>54</td><td><code><pre> }</pre></code></td></tr><tr><td>55</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>56</td><td><code><pre> config := &core.DbConfig{</pre></code></td></tr><tr><td>57</td><td><code><pre> DbConn: "sqlite",</pre></code></td></tr><tr><td>58</td><td><code><pre> Project: "Statup",</pre></code></td></tr><tr><td>59</td><td><code><pre> Description: "Statup running as an App!",</pre></code></td></tr><tr><td>60</td><td><code><pre> Domain: "http://localhost",</pre></code></td></tr><tr><td>61</td><td><code><pre> Username: "admin",</pre></code></td></tr><tr><td>62</td><td><code><pre> Password: "admin",</pre></code></td></tr><tr><td>63</td><td><code><pre> Email: "user@email.com",</pre></code></td></tr><tr><td>64</td><td><code><pre> Error: nil,</pre></code></td></tr><tr><td>65</td><td><code><pre> Location: utils.Directory,</pre></code></td></tr><tr><td>66</td><td><code><pre> }</pre></code></td></tr><tr><td>67</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>68</td><td><code><pre> config, err = config.Save()</pre></code></td></tr><tr class="miss"><td>69</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>70</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr><td>71</td><td><code><pre> }</pre></code></td></tr><tr><td>72</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>73</td><td><code><pre> config.DropDatabase()</pre></code></td></tr><tr class="miss"><td>74</td><td><code><pre> config.CreateDatabase()</pre></code></td></tr><tr class="miss"><td>75</td><td><code><pre> core.CoreApp = config.CreateCore()</pre></code></td></tr><tr><td>76</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>77</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>78</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr class="miss"><td>79</td><td><code><pre> return</pre></code></td></tr><tr><td>80</td><td><code><pre> }</pre></code></td></tr><tr><td>81</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>82</td><td><code><pre> core.Configs, err = core.LoadConfigFile(utils.Directory)</pre></code></td></tr><tr class="miss"><td>83</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>84</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr class="miss"><td>85</td><td><code><pre> config.Error = err</pre></code></td></tr><tr class="miss"><td>86</td><td><code><pre> return</pre></code></td></tr><tr><td>87</td><td><code><pre> }</pre></code></td></tr><tr><td>88</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>89</td><td><code><pre> err = core.Configs.Connect(false, utils.Directory)</pre></code></td></tr><tr class="miss"><td>90</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>91</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr class="miss"><td>92</td><td><code><pre> core.DeleteConfig()</pre></code></td></tr><tr class="miss"><td>93</td><td><code><pre> config.Error = err</pre></code></td></tr><tr class="miss"><td>94</td><td><code><pre> return</pre></code></td></tr><tr><td>95</td><td><code><pre> }</pre></code></td></tr><tr><td>96</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>97</td><td><code><pre> admin := core.ReturnUser(&types.User{</pre></code></td></tr><tr><td>98</td><td><code><pre> Username: config.Username,</pre></code></td></tr><tr><td>99</td><td><code><pre> Password: config.Password,</pre></code></td></tr><tr><td>100</td><td><code><pre> Email: config.Email,</pre></code></td></tr><tr><td>101</td><td><code><pre> Admin: true,</pre></code></td></tr><tr><td>102</td><td><code><pre> })</pre></code></td></tr><tr class="miss"><td>103</td><td><code><pre> admin.Create()</pre></code></td></tr><tr><td>104</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>105</td><td><code><pre> core.InsertSampleData()</pre></code></td></tr><tr><td>106</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>107</td><td><code><pre> config.ApiKey = core.CoreApp.ApiKey</pre></code></td></tr><tr class="miss"><td>108</td><td><code><pre> config.ApiSecret = core.CoreApp.ApiSecret</pre></code></td></tr><tr class="miss"><td>109</td><td><code><pre> config.Update()</pre></code></td></tr><tr><td>110</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>111</td><td><code><pre> core.InitApp()</pre></code></td></tr><tr class="miss"><td>112</td><td><code><pre> RunHTTPServer(ip, port)</pre></code></td></tr><tr><td>113</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_checkinCreateHandler">func checkinCreateHandler</div><div class="info"><a href="#s_fn_checkinCreateHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>233</td><td><code><pre>func checkinCreateHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr class="miss"><td>234</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr class="miss"><td>235</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr class="miss"><td>236</td><td><code><pre> return</pre></code></td></tr><tr><td>237</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>238</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr class="miss"><td>239</td><td><code><pre> r.ParseForm()</pre></code></td></tr><tr class="miss"><td>240</td><td><code><pre> service := core.SelectService(utils.StringInt(vars["id"]))</pre></code></td></tr><tr class="miss"><td>241</td><td><code><pre> fmt.Println(service.Name)</pre></code></td></tr><tr class="miss"><td>242</td><td><code><pre> name := r.PostForm.Get("name")</pre></code></td></tr><tr class="miss"><td>243</td><td><code><pre> interval := utils.StringInt(r.PostForm.Get("interval"))</pre></code></td></tr><tr class="miss"><td>244</td><td><code><pre> grace := utils.StringInt(r.PostForm.Get("grace"))</pre></code></td></tr><tr class="miss"><td>245</td><td><code><pre> checkin := core.ReturnCheckin(&types.Checkin{</pre></code></td></tr><tr><td>246</td><td><code><pre> Name: name,</pre></code></td></tr><tr><td>247</td><td><code><pre> ServiceId: service.Id,</pre></code></td></tr><tr><td>248</td><td><code><pre> Interval: interval,</pre></code></td></tr><tr><td>249</td><td><code><pre> GracePeriod: grace,</pre></code></td></tr><tr><td>250</td><td><code><pre> })</pre></code></td></tr><tr class="miss"><td>251</td><td><code><pre> checkin.Create()</pre></code></td></tr><tr class="miss"><td>252</td><td><code><pre> executeResponse(w, r, "service.html", service, fmt.Sprintf("/service/%v", service.Id))</pre></code></td></tr><tr><td>253</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_apiServicePingDataHandler">func apiServicePingDataHandler</div><div class="info"><a href="#s_fn_apiServicePingDataHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>98</td><td><code><pre>func apiServicePingDataHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr class="miss"><td>99</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr class="miss"><td>100</td><td><code><pre> service := core.SelectService(utils.StringInt(vars["id"]))</pre></code></td></tr><tr class="miss"><td>101</td><td><code><pre> if service == nil {</pre></code></td></tr><tr class="miss"><td>102</td><td><code><pre> http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)</pre></code></td></tr><tr class="miss"><td>103</td><td><code><pre> return</pre></code></td></tr><tr><td>104</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>105</td><td><code><pre> fields := parseGet(r)</pre></code></td></tr><tr class="miss"><td>106</td><td><code><pre> grouping := fields.Get("group")</pre></code></td></tr><tr class="miss"><td>107</td><td><code><pre> startField := utils.StringInt(fields.Get("start"))</pre></code></td></tr><tr class="miss"><td>108</td><td><code><pre> endField := utils.StringInt(fields.Get("end"))</pre></code></td></tr><tr class="miss"><td>109</td><td><code><pre> obj := core.GraphDataRaw(service, time.Unix(startField, 0), time.Unix(endField, 0), grouping, "ping_time")</pre></code></td></tr><tr><td>110</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>111</td><td><code><pre> w.Header().Set("Content-Type", "application/json")</pre></code></td></tr><tr class="miss"><td>112</td><td><code><pre> json.NewEncoder(w).Encode(obj)</pre></code></td></tr><tr><td>113</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_checkinHitHandler">func checkinHitHandler</div><div class="info"><a href="#s_fn_checkinHitHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>255</td><td><code><pre>func checkinHitHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr class="miss"><td>256</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr class="miss"><td>257</td><td><code><pre> checkin := core.SelectCheckin(vars["id"])</pre></code></td></tr><tr class="miss"><td>258</td><td><code><pre> ip, _, _ := net.SplitHostPort(r.RemoteAddr)</pre></code></td></tr><tr class="miss"><td>259</td><td><code><pre> checkinHit := core.ReturnCheckinHit(&types.CheckinHit{</pre></code></td></tr><tr><td>260</td><td><code><pre> Checkin: checkin.Id,</pre></code></td></tr><tr><td>261</td><td><code><pre> From: ip,</pre></code></td></tr><tr><td>262</td><td><code><pre> CreatedAt: time.Now().UTC(),</pre></code></td></tr><tr><td>263</td><td><code><pre> })</pre></code></td></tr><tr class="miss"><td>264</td><td><code><pre> if checkin.Last() == nil {</pre></code></td></tr><tr class="miss"><td>265</td><td><code><pre> checkin.Start()</pre></code></td></tr><tr class="miss"><td>266</td><td><code><pre> go checkin.Routine()</pre></code></td></tr><tr><td>267</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>268</td><td><code><pre> checkinHit.Create()</pre></code></td></tr><tr class="miss"><td>269</td><td><code><pre> w.Write([]byte("ok"))</pre></code></td></tr><tr class="miss"><td>270</td><td><code><pre> w.WriteHeader(http.StatusOK)</pre></code></td></tr><tr><td>271</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_checkinDeleteHandler">func checkinDeleteHandler</div><div class="info"><a href="#s_fn_checkinDeleteHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/services.go</code>:</p></div><table class="listing">
|
||
<tr><td>220</td><td><code><pre>func checkinDeleteHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr class="miss"><td>221</td><td><code><pre> if !IsAuthenticated(r) {</pre></code></td></tr><tr class="miss"><td>222</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr class="miss"><td>223</td><td><code><pre> return</pre></code></td></tr><tr><td>224</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>225</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr class="miss"><td>226</td><td><code><pre> checkin := core.SelectCheckinId(utils.StringInt(vars["id"]))</pre></code></td></tr><tr class="miss"><td>227</td><td><code><pre> service := core.SelectService(checkin.ServiceId)</pre></code></td></tr><tr class="miss"><td>228</td><td><code><pre> fmt.Println(checkin, service)</pre></code></td></tr><tr class="miss"><td>229</td><td><code><pre> checkin.Delete()</pre></code></td></tr><tr class="miss"><td>230</td><td><code><pre> executeResponse(w, r, "service.html", service, fmt.Sprintf("/service/%v", service.Id))</pre></code></td></tr><tr><td>231</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_pluginSavedHandler">func pluginSavedHandler</div><div class="info"><a href="#s_fn_pluginSavedHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/plugins.go</code>:</p></div><table class="listing">
|
||
<tr><td>29</td><td><code><pre>func pluginSavedHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr class="miss"><td>30</td><td><code><pre> auth := IsAuthenticated(r)</pre></code></td></tr><tr class="miss"><td>31</td><td><code><pre> if !auth {</pre></code></td></tr><tr class="miss"><td>32</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr class="miss"><td>33</td><td><code><pre> return</pre></code></td></tr><tr><td>34</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>35</td><td><code><pre> r.ParseForm()</pre></code></td></tr><tr><td>36</td><td><code><pre> //vars := mux.Vars(router)</pre></code></td></tr><tr><td>37</td><td><code><pre> //plug := SelectPlugin(vars["name"])</pre></code></td></tr><tr class="miss"><td>38</td><td><code><pre> data := make(map[string]string)</pre></code></td></tr><tr class="miss"><td>39</td><td><code><pre> for k, v := range r.PostForm {</pre></code></td></tr><tr class="miss"><td>40</td><td><code><pre> data[k] = strings.Join(v, "")</pre></code></td></tr><tr><td>41</td><td><code><pre> }</pre></code></td></tr><tr><td>42</td><td><code><pre> //plug.OnSave(structs.Map(data))</pre></code></td></tr><tr class="miss"><td>43</td><td><code><pre> http.Redirect(w, r, "/settings", http.StatusSeeOther)</pre></code></td></tr><tr><td>44</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@111:11">func @111:11</div><div class="info"><a href="#s_fn_@111:11">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>111</td><td><code><pre>func(g interface{}) []string {</pre></code></td></tr><tr class="miss"><td>112</td><td><code><pre> fooType := reflect.TypeOf(g)</pre></code></td></tr><tr class="miss"><td>113</td><td><code><pre> var methods []string</pre></code></td></tr><tr class="miss"><td>114</td><td><code><pre> methods = append(methods, fooType.String())</pre></code></td></tr><tr class="miss"><td>115</td><td><code><pre> for i := 0; i < fooType.NumMethod(); i++ {</pre></code></td></tr><tr class="miss"><td>116</td><td><code><pre> method := fooType.Method(i)</pre></code></td></tr><tr class="miss"><td>117</td><td><code><pre> fmt.Println(method.Name)</pre></code></td></tr><tr class="miss"><td>118</td><td><code><pre> methods = append(methods, method.Name)</pre></code></td></tr><tr><td>119</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>120</td><td><code><pre> return methods</pre></code></td></tr><tr><td>121</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_apiCheckinHandler">func apiCheckinHandler</div><div class="info"><a href="#s_fn_apiCheckinHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/api.go</code>:</p></div><table class="listing">
|
||
<tr><td>69</td><td><code><pre>func apiCheckinHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr class="miss"><td>70</td><td><code><pre> if !isAPIAuthorized(r) {</pre></code></td></tr><tr class="miss"><td>71</td><td><code><pre> http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)</pre></code></td></tr><tr class="miss"><td>72</td><td><code><pre> return</pre></code></td></tr><tr><td>73</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>74</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr class="miss"><td>75</td><td><code><pre> checkin := core.SelectCheckin(vars["api"])</pre></code></td></tr><tr><td>76</td><td><code><pre> //checkin.Receivehit()</pre></code></td></tr><tr class="miss"><td>77</td><td><code><pre> w.WriteHeader(http.StatusOK)</pre></code></td></tr><tr class="miss"><td>78</td><td><code><pre> json.NewEncoder(w).Encode(checkin)</pre></code></td></tr><tr><td>79</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_pluginsDownloadHandler">func pluginsDownloadHandler</div><div class="info"><a href="#s_fn_pluginsDownloadHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/plugins.go</code>:</p></div><table class="listing">
|
||
<tr><td>46</td><td><code><pre>func pluginsDownloadHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr class="miss"><td>47</td><td><code><pre> auth := IsAuthenticated(r)</pre></code></td></tr><tr class="miss"><td>48</td><td><code><pre> if !auth {</pre></code></td></tr><tr class="miss"><td>49</td><td><code><pre> http.Redirect(w, r, "/", http.StatusSeeOther)</pre></code></td></tr><tr class="miss"><td>50</td><td><code><pre> return</pre></code></td></tr><tr><td>51</td><td><code><pre> }</pre></code></td></tr><tr><td>52</td><td><code><pre> //vars := mux.Vars(router)</pre></code></td></tr><tr><td>53</td><td><code><pre> //name := vars["name"]</pre></code></td></tr><tr><td>54</td><td><code><pre> //DownloadPlugin(name)</pre></code></td></tr><tr><td>55</td><td><code><pre> //core.LoadConfig(utils.Directory)</pre></code></td></tr><tr class="miss"><td>56</td><td><code><pre> http.Redirect(w, r, "/plugins", http.StatusSeeOther)</pre></code></td></tr><tr><td>57</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_parseId">func parseId</div><div class="info"><a href="#s_fn_parseId">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/settings.go</code>:</p></div><table class="listing">
|
||
<tr><td>122</td><td><code><pre>func parseId(r *http.Request) int64 {</pre></code></td></tr><tr class="miss"><td>123</td><td><code><pre> vars := mux.Vars(r)</pre></code></td></tr><tr class="miss"><td>124</td><td><code><pre> return utils.StringInt(vars["id"])</pre></code></td></tr><tr><td>125</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@122:13">func @122:13</div><div class="info"><a href="#s_fn_@122:13">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>122</td><td><code><pre>func(g interface{}) template.HTML {</pre></code></td></tr><tr class="miss"><td>123</td><td><code><pre> data, _ := json.Marshal(g)</pre></code></td></tr><tr class="miss"><td>124</td><td><code><pre> return template.HTML(string(data))</pre></code></td></tr><tr><td>125</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@144:15">func @144:15</div><div class="info"><a href="#s_fn_@144:15">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>144</td><td><code><pre>func(t time.Duration) string {</pre></code></td></tr><tr class="miss"><td>145</td><td><code><pre> duration, _ := time.ParseDuration(fmt.Sprintf("%vs", t.Seconds()))</pre></code></td></tr><tr class="miss"><td>146</td><td><code><pre> return utils.FormatDuration(duration)</pre></code></td></tr><tr><td>147</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_setupResponseError">func setupResponseError</div><div class="info"><a href="#s_fn_setupResponseError">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/setup.go</code>:</p></div><table class="listing">
|
||
<tr><td>127</td><td><code><pre>func setupResponseError(w http.ResponseWriter, r *http.Request, a interface{}) {</pre></code></td></tr><tr class="miss"><td>128</td><td><code><pre> executeResponse(w, r, "setup.html", a, nil)</pre></code></td></tr><tr><td>129</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@90:9">func @90:9</div><div class="info"><a href="#s_fn_@90:9">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>90</td><td><code><pre>func(html interface{}) template.JS {</pre></code></td></tr><tr class="miss"><td>91</td><td><code><pre> return template.JS(utils.ToString(html))</pre></code></td></tr><tr><td>92</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@132:17">func @132:17</div><div class="info"><a href="#s_fn_@132:17">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>132</td><td><code><pre>func() string {</pre></code></td></tr><tr class="miss"><td>133</td><td><code><pre> return ""</pre></code></td></tr><tr><td>134</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@148:13">func @148:13</div><div class="info"><a href="#s_fn_@148:13">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>148</td><td><code><pre>func(t time.Time) int64 {</pre></code></td></tr><tr class="miss"><td>149</td><td><code><pre> return t.UTC().Unix()</pre></code></td></tr><tr><td>150</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_trayHandler">func trayHandler</div><div class="info"><a href="#s_fn_trayHandler">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/index.go</code>:</p></div><table class="listing">
|
||
<tr><td>33</td><td><code><pre>func trayHandler(w http.ResponseWriter, r *http.Request) {</pre></code></td></tr><tr class="miss"><td>34</td><td><code><pre> executeResponse(w, r, "tray.html", core.CoreApp, nil)</pre></code></td></tr><tr><td>35</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@141:10">func @141:10</div><div class="info"><a href="#s_fn_@141:10">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>141</td><td><code><pre>func(t time.Time) string {</pre></code></td></tr><tr class="miss"><td>142</td><td><code><pre> return utils.Timestamp(t).Ago()</pre></code></td></tr><tr><td>143</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@235:15">func @235:15</div><div class="info"><a href="#s_fn_@235:15">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>235</td><td><code><pre>func() []types.ServiceInterface {</pre></code></td></tr><tr class="miss"><td>236</td><td><code><pre> return core.CoreApp.Services</pre></code></td></tr><tr><td>237</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@160:17">func @160:17</div><div class="info"><a href="#s_fn_@160:17">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>160</td><td><code><pre>func() *types.Checkin {</pre></code></td></tr><tr class="miss"><td>161</td><td><code><pre> return new(types.Checkin)</pre></code></td></tr><tr><td>162</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@232:11">func @232:11</div><div class="info"><a href="#s_fn_@232:11">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/handlers/handlers.go</code>:</p></div><table class="listing">
|
||
<tr><td>232</td><td><code><pre>func(html string) template.HTML {</pre></code></td></tr><tr class="miss"><td>233</td><td><code><pre> return template.HTML(html)</pre></code></td></tr><tr><td>234</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<!-- Can be parsed by external script
|
||
PACKAGE:github.com/hunterlong/statup/handlers DONE:67.41
|
||
-->
|
||
|
||
<div id="pkg_github.com/hunterlong/statup/notifiers" class="funcname">Package Overview: github.com/hunterlong/statup/notifiers <span class="packageTotal">7.00%</span></div><p>This is a coverage report created after analysis of the <code>github.com/hunterlong/statup/notifiers</code> package. It
|
||
has been generated with the following command:</p><pre class="cmd">gocov test github.com/hunterlong/statup/notifiers | gocov-html</pre> <p>Here are the stats. Please select a function name to view its implementation and see what's left for testing.</p><table class="overview">
|
||
<tr id="s_fn_twilio.Select"><td><code><a href="#fn_twilio.Select">twilio.Select(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/twilio.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_lineNotifier.Select"><td><code><a href="#fn_lineNotifier.Select">lineNotifier.Select(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/line_notify.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_discord.Select"><td><code><a href="#fn_discord.Select">discord.Select(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/discord.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_webhooker.Select"><td><code><a href="#fn_webhooker.Select">webhooker.Select(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/webhook.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_slack.Select"><td><code><a href="#fn_slack.Select">slack.Select(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/slack.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_email.Select"><td><code><a href="#fn_email.Select">email.Select(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/email.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_init"><td><code><a href="#fn_init">init(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/line_notify.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>2/3</code></td></tr>
|
||
<tr id="s_fn_init"><td><code><a href="#fn_init">init(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/email.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>2/3</code></td></tr>
|
||
<tr id="s_fn_init"><td><code><a href="#fn_init">init(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/discord.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>2/3</code></td></tr>
|
||
<tr id="s_fn_init"><td><code><a href="#fn_init">init(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/twilio.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>2/3</code></td></tr>
|
||
<tr id="s_fn_init"><td><code><a href="#fn_init">init(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/webhook.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>2/3</code></td></tr>
|
||
<tr id="s_fn_init"><td><code><a href="#fn_init">init(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/slack.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>2/3</code></td></tr>
|
||
<tr id="s_fn_twilio.Send"><td><code><a href="#fn_twilio.Send">twilio.Send(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/twilio.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/25</code></td></tr>
|
||
<tr id="s_fn_webhooker.run"><td><code><a href="#fn_webhooker.run">webhooker.run(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/webhook.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/21</code></td></tr>
|
||
<tr id="s_fn_discord.OnTest"><td><code><a href="#fn_discord.OnTest">discord.OnTest(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/discord.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/20</code></td></tr>
|
||
<tr id="s_fn_lineNotifier.Send"><td><code><a href="#fn_lineNotifier.Send">lineNotifier.Send(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/line_notify.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/14</code></td></tr>
|
||
<tr id="s_fn_email.dialSend"><td><code><a href="#fn_email.dialSend">email.dialSend(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/email.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/12</code></td></tr>
|
||
<tr id="s_fn_emailTemplate"><td><code><a href="#fn_emailTemplate">emailTemplate(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/email.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/9</code></td></tr>
|
||
<tr id="s_fn_webhooker.OnTest"><td><code><a href="#fn_webhooker.OnTest">webhooker.OnTest(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/webhook.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/9</code></td></tr>
|
||
<tr id="s_fn_slack.OnTest"><td><code><a href="#fn_slack.OnTest">slack.OnTest(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/slack.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/9</code></td></tr>
|
||
<tr id="s_fn_email.OnTest"><td><code><a href="#fn_email.OnTest">email.OnTest(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/email.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/8</code></td></tr>
|
||
<tr id="s_fn_discord.Send"><td><code><a href="#fn_discord.Send">discord.Send(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/discord.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/8</code></td></tr>
|
||
<tr id="s_fn_replaceBodyText"><td><code><a href="#fn_replaceBodyText">replaceBodyText(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/webhook.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/7</code></td></tr>
|
||
<tr id="s_fn_slack.Send"><td><code><a href="#fn_slack.Send">slack.Send(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/slack.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/7</code></td></tr>
|
||
<tr id="s_fn_parseSlackMessage"><td><code><a href="#fn_parseSlackMessage">parseSlackMessage(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/slack.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/7</code></td></tr>
|
||
<tr id="s_fn_email.Send"><td><code><a href="#fn_email.Send">email.Send(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/email.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/6</code></td></tr>
|
||
<tr id="s_fn_twilioSuccess"><td><code><a href="#fn_twilioSuccess">twilioSuccess(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/twilio.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/5</code></td></tr>
|
||
<tr id="s_fn_lineNotifier.OnSuccess"><td><code><a href="#fn_lineNotifier.OnSuccess">lineNotifier.OnSuccess(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/line_notify.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/4</code></td></tr>
|
||
<tr id="s_fn_webhooker.Send"><td><code><a href="#fn_webhooker.Send">webhooker.Send(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/webhook.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/4</code></td></tr>
|
||
<tr id="s_fn_discord.OnSuccess"><td><code><a href="#fn_discord.OnSuccess">discord.OnSuccess(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/discord.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/4</code></td></tr>
|
||
<tr id="s_fn_slack.OnSuccess"><td><code><a href="#fn_slack.OnSuccess">slack.OnSuccess(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/slack.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/4</code></td></tr>
|
||
<tr id="s_fn_email.OnSuccess"><td><code><a href="#fn_email.OnSuccess">email.OnSuccess(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/email.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/4</code></td></tr>
|
||
<tr id="s_fn_webhooker.OnSuccess"><td><code><a href="#fn_webhooker.OnSuccess">webhooker.OnSuccess(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/webhook.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/4</code></td></tr>
|
||
<tr id="s_fn_twilio.OnSuccess"><td><code><a href="#fn_twilio.OnSuccess">twilio.OnSuccess(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/twilio.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/4</code></td></tr>
|
||
<tr id="s_fn_twilio.OnFailure"><td><code><a href="#fn_twilio.OnFailure">twilio.OnFailure(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/twilio.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_discord.OnSave"><td><code><a href="#fn_discord.OnSave">discord.OnSave(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/discord.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_lineNotifier.OnFailure"><td><code><a href="#fn_lineNotifier.OnFailure">lineNotifier.OnFailure(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/line_notify.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_email.OnFailure"><td><code><a href="#fn_email.OnFailure">email.OnFailure(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/email.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_slack.OnSave"><td><code><a href="#fn_slack.OnSave">slack.OnSave(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/slack.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_twilioError"><td><code><a href="#fn_twilioError">twilioError(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/twilio.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_slack.OnFailure"><td><code><a href="#fn_slack.OnFailure">slack.OnFailure(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/slack.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_webhooker.OnFailure"><td><code><a href="#fn_webhooker.OnFailure">webhooker.OnFailure(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/webhook.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_discord.OnFailure"><td><code><a href="#fn_discord.OnFailure">discord.OnFailure(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/discord.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/3</code></td></tr>
|
||
<tr id="s_fn_twilio.OnTest"><td><code><a href="#fn_twilio.OnTest">twilio.OnTest(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/twilio.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_lineNotifier.OnSave"><td><code><a href="#fn_lineNotifier.OnSave">lineNotifier.OnSave(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/line_notify.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_emailSource"><td><code><a href="#fn_emailSource">emailSource(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/email.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_email.OnSave"><td><code><a href="#fn_email.OnSave">email.OnSave(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/email.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_twilio.OnSave"><td><code><a href="#fn_twilio.OnSave">twilio.OnSave(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/twilio.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_webhooker.OnSave"><td><code><a href="#fn_webhooker.OnSave">webhooker.OnSave(...)</a></code></td><td><code>github.com/hunterlong/statup/notifiers/webhook.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr><td colspan="2"><code>github.com/hunterlong/statup/notifiers</code></td><td class="percent"><code>7.00%</code></td><td class="linecount"><code>18/257</code></td></tr>
|
||
</table>
|
||
|
||
<div class="funcname" id="fn_twilio.Select">func twilio.Select</div><div class="info"><a href="#s_fn_twilio.Select">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go</code>:</p></div><table class="listing">
|
||
<tr><td>78</td><td><code><pre>func (u *twilio) Select() *notifier.Notification {</pre></code></td></tr><tr><td>79</td><td><code><pre> return u.Notification</pre></code></td></tr><tr><td>80</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_lineNotifier.Select">func lineNotifier.Select</div><div class="info"><a href="#s_fn_lineNotifier.Select">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/line_notify.go</code>:</p></div><table class="listing">
|
||
<tr><td>78</td><td><code><pre>func (u *lineNotifier) Select() *notifier.Notification {</pre></code></td></tr><tr><td>79</td><td><code><pre> return u.Notification</pre></code></td></tr><tr><td>80</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_discord.Select">func discord.Select</div><div class="info"><a href="#s_fn_discord.Select">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/discord.go</code>:</p></div><table class="listing">
|
||
<tr><td>71</td><td><code><pre>func (u *discord) Select() *notifier.Notification {</pre></code></td></tr><tr><td>72</td><td><code><pre> return u.Notification</pre></code></td></tr><tr><td>73</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_webhooker.Select">func webhooker.Select</div><div class="info"><a href="#s_fn_webhooker.Select">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go</code>:</p></div><table class="listing">
|
||
<tr><td>97</td><td><code><pre>func (w *webhooker) Select() *notifier.Notification {</pre></code></td></tr><tr><td>98</td><td><code><pre> return w.Notification</pre></code></td></tr><tr><td>99</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_slack.Select">func slack.Select</div><div class="info"><a href="#s_fn_slack.Select">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go</code>:</p></div><table class="listing">
|
||
<tr><td>97</td><td><code><pre>func (u *slack) Select() *notifier.Notification {</pre></code></td></tr><tr><td>98</td><td><code><pre> return u.Notification</pre></code></td></tr><tr><td>99</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_email.Select">func email.Select</div><div class="info"><a href="#s_fn_email.Select">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go</code>:</p></div><table class="listing">
|
||
<tr><td>209</td><td><code><pre>func (u *email) Select() *notifier.Notification {</pre></code></td></tr><tr><td>210</td><td><code><pre> return u.Notification</pre></code></td></tr><tr><td>211</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_init">func init</div><div class="info"><a href="#s_fn_init">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/line_notify.go</code>:</p></div><table class="listing">
|
||
<tr><td>51</td><td><code><pre>func init() {</pre></code></td></tr><tr><td>52</td><td><code><pre> err := notifier.AddNotifier(lineNotify)</pre></code></td></tr><tr><td>53</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>54</td><td><code><pre> panic(err)</pre></code></td></tr><tr><td>55</td><td><code><pre> }</pre></code></td></tr><tr><td>56</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_init">func init</div><div class="info"><a href="#s_fn_init">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go</code>:</p></div><table class="listing">
|
||
<tr><td>153</td><td><code><pre>func init() {</pre></code></td></tr><tr><td>154</td><td><code><pre> err := notifier.AddNotifier(emailer)</pre></code></td></tr><tr><td>155</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>156</td><td><code><pre> panic(err)</pre></code></td></tr><tr><td>157</td><td><code><pre> }</pre></code></td></tr><tr><td>158</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_init">func init</div><div class="info"><a href="#s_fn_init">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/discord.go</code>:</p></div><table class="listing">
|
||
<tr><td>51</td><td><code><pre>func init() {</pre></code></td></tr><tr><td>52</td><td><code><pre> err := notifier.AddNotifier(discorder)</pre></code></td></tr><tr><td>53</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>54</td><td><code><pre> panic(err)</pre></code></td></tr><tr><td>55</td><td><code><pre> }</pre></code></td></tr><tr><td>56</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_init">func init</div><div class="info"><a href="#s_fn_init">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go</code>:</p></div><table class="listing">
|
||
<tr><td>71</td><td><code><pre>func init() {</pre></code></td></tr><tr><td>72</td><td><code><pre> err := notifier.AddNotifier(twilioNotifier)</pre></code></td></tr><tr><td>73</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>74</td><td><code><pre> panic(err)</pre></code></td></tr><tr><td>75</td><td><code><pre> }</pre></code></td></tr><tr><td>76</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_init">func init</div><div class="info"><a href="#s_fn_init">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go</code>:</p></div><table class="listing">
|
||
<tr><td>81</td><td><code><pre>func init() {</pre></code></td></tr><tr><td>82</td><td><code><pre> err := notifier.AddNotifier(webhook)</pre></code></td></tr><tr><td>83</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>84</td><td><code><pre> panic(err)</pre></code></td></tr><tr><td>85</td><td><code><pre> }</pre></code></td></tr><tr><td>86</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_init">func init</div><div class="info"><a href="#s_fn_init">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go</code>:</p></div><table class="listing">
|
||
<tr><td>77</td><td><code><pre>func init() {</pre></code></td></tr><tr><td>78</td><td><code><pre> err := notifier.AddNotifier(slacker)</pre></code></td></tr><tr><td>79</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>80</td><td><code><pre> panic(err)</pre></code></td></tr><tr><td>81</td><td><code><pre> }</pre></code></td></tr><tr><td>82</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_twilio.Send">func twilio.Send</div><div class="info"><a href="#s_fn_twilio.Send">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go</code>:</p></div><table class="listing">
|
||
<tr><td>83</td><td><code><pre>func (u *twilio) Send(msg interface{}) error {</pre></code></td></tr><tr class="miss"><td>84</td><td><code><pre> message := msg.(string)</pre></code></td></tr><tr class="miss"><td>85</td><td><code><pre> twilioUrl := fmt.Sprintf("https://api.twilio.com/2010-04-01/Accounts/%v/Messages.json", u.GetValue("api_key"))</pre></code></td></tr><tr class="miss"><td>86</td><td><code><pre> client := &http.Client{}</pre></code></td></tr><tr class="miss"><td>87</td><td><code><pre> v := url.Values{}</pre></code></td></tr><tr class="miss"><td>88</td><td><code><pre> v.Set("To", "+"+u.Var1)</pre></code></td></tr><tr class="miss"><td>89</td><td><code><pre> v.Set("From", "+"+u.Var2)</pre></code></td></tr><tr class="miss"><td>90</td><td><code><pre> v.Set("Body", message)</pre></code></td></tr><tr class="miss"><td>91</td><td><code><pre> rb := *strings.NewReader(v.Encode())</pre></code></td></tr><tr class="miss"><td>92</td><td><code><pre> req, err := http.NewRequest("POST", twilioUrl, &rb)</pre></code></td></tr><tr class="miss"><td>93</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>94</td><td><code><pre> return err</pre></code></td></tr><tr><td>95</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>96</td><td><code><pre> req.SetBasicAuth(u.ApiKey, u.ApiSecret)</pre></code></td></tr><tr class="miss"><td>97</td><td><code><pre> req.Header.Add("Accept", "application/json")</pre></code></td></tr><tr class="miss"><td>98</td><td><code><pre> req.Header.Add("Content-Type", "application/x-www-form-urlencoded")</pre></code></td></tr><tr class="miss"><td>99</td><td><code><pre> res, err := client.Do(req)</pre></code></td></tr><tr class="miss"><td>100</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>101</td><td><code><pre> return err</pre></code></td></tr><tr><td>102</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>103</td><td><code><pre> defer res.Body.Close()</pre></code></td></tr><tr class="miss"><td>104</td><td><code><pre> contents, _ := ioutil.ReadAll(res.Body)</pre></code></td></tr><tr class="miss"><td>105</td><td><code><pre> success, _ := twilioSuccess(contents)</pre></code></td></tr><tr class="miss"><td>106</td><td><code><pre> if !success {</pre></code></td></tr><tr class="miss"><td>107</td><td><code><pre> errorOut := twilioError(contents)</pre></code></td></tr><tr class="miss"><td>108</td><td><code><pre> out := fmt.Sprintf("Error code %v - %v", errorOut.Code, errorOut.Message)</pre></code></td></tr><tr class="miss"><td>109</td><td><code><pre> return errors.New(out)</pre></code></td></tr><tr><td>110</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>111</td><td><code><pre> return nil</pre></code></td></tr><tr><td>112</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_webhooker.run">func webhooker.run</div><div class="info"><a href="#s_fn_webhooker.run">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go</code>:</p></div><table class="listing">
|
||
<tr><td>113</td><td><code><pre>func (w *webhooker) run(body string) (*http.Response, error) {</pre></code></td></tr><tr class="miss"><td>114</td><td><code><pre> utils.Log(1, fmt.Sprintf("sending body: '%v' to %v as a %v request", body, w.Host, w.Var1))</pre></code></td></tr><tr class="miss"><td>115</td><td><code><pre> client := new(http.Client)</pre></code></td></tr><tr class="miss"><td>116</td><td><code><pre> client.Timeout = time.Duration(10 * time.Second)</pre></code></td></tr><tr class="miss"><td>117</td><td><code><pre> var buf *bytes.Buffer</pre></code></td></tr><tr class="miss"><td>118</td><td><code><pre> buf = bytes.NewBuffer(nil)</pre></code></td></tr><tr class="miss"><td>119</td><td><code><pre> if w.Var2 != "" {</pre></code></td></tr><tr class="miss"><td>120</td><td><code><pre> buf = bytes.NewBuffer([]byte(w.Var2))</pre></code></td></tr><tr><td>121</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>122</td><td><code><pre> req, err := http.NewRequest(w.Var1, w.Host, buf)</pre></code></td></tr><tr class="miss"><td>123</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>124</td><td><code><pre> return nil, err</pre></code></td></tr><tr><td>125</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>126</td><td><code><pre> if w.ApiSecret != "" {</pre></code></td></tr><tr class="miss"><td>127</td><td><code><pre> splitArray := strings.Split(w.ApiSecret, ",")</pre></code></td></tr><tr class="miss"><td>128</td><td><code><pre> for _, a := range splitArray {</pre></code></td></tr><tr class="miss"><td>129</td><td><code><pre> split := strings.Split(a, "=")</pre></code></td></tr><tr class="miss"><td>130</td><td><code><pre> req.Header.Add(split[0], split[1])</pre></code></td></tr><tr><td>131</td><td><code><pre> }</pre></code></td></tr><tr><td>132</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>133</td><td><code><pre> if w.ApiKey != "" {</pre></code></td></tr><tr class="miss"><td>134</td><td><code><pre> req.Header.Add("Content-Type", w.ApiKey)</pre></code></td></tr><tr><td>135</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>136</td><td><code><pre> resp, err := client.Do(req)</pre></code></td></tr><tr class="miss"><td>137</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>138</td><td><code><pre> return nil, err</pre></code></td></tr><tr><td>139</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>140</td><td><code><pre> return resp, err</pre></code></td></tr><tr><td>141</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_discord.OnTest">func discord.OnTest</div><div class="info"><a href="#s_fn_discord.OnTest">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/discord.go</code>:</p></div><table class="listing">
|
||
<tr><td>99</td><td><code><pre>func (u *discord) OnTest() error {</pre></code></td></tr><tr class="miss"><td>100</td><td><code><pre> outError := errors.New("Incorrect discord URL, please confirm URL is correct")</pre></code></td></tr><tr class="miss"><td>101</td><td><code><pre> message := `{"content": "Testing the discord notifier"}`</pre></code></td></tr><tr class="miss"><td>102</td><td><code><pre> req, _ := http.NewRequest("POST", discorder.Host, bytes.NewBuffer([]byte(message)))</pre></code></td></tr><tr class="miss"><td>103</td><td><code><pre> req.Header.Set("Content-Type", "application/json")</pre></code></td></tr><tr class="miss"><td>104</td><td><code><pre> client := &http.Client{}</pre></code></td></tr><tr class="miss"><td>105</td><td><code><pre> resp, err := client.Do(req)</pre></code></td></tr><tr class="miss"><td>106</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>107</td><td><code><pre> return err</pre></code></td></tr><tr><td>108</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>109</td><td><code><pre> defer resp.Body.Close()</pre></code></td></tr><tr class="miss"><td>110</td><td><code><pre> contents, _ := ioutil.ReadAll(resp.Body)</pre></code></td></tr><tr class="miss"><td>111</td><td><code><pre> if string(contents) == "" {</pre></code></td></tr><tr class="miss"><td>112</td><td><code><pre> return nil</pre></code></td></tr><tr><td>113</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>114</td><td><code><pre> var d discordTestJson</pre></code></td></tr><tr class="miss"><td>115</td><td><code><pre> err = json.Unmarshal(contents, &d)</pre></code></td></tr><tr class="miss"><td>116</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>117</td><td><code><pre> return outError</pre></code></td></tr><tr><td>118</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>119</td><td><code><pre> if d.Code == 0 {</pre></code></td></tr><tr class="miss"><td>120</td><td><code><pre> return outError</pre></code></td></tr><tr><td>121</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>122</td><td><code><pre> fmt.Println("discord: ", string(contents))</pre></code></td></tr><tr class="miss"><td>123</td><td><code><pre> return nil</pre></code></td></tr><tr><td>124</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_lineNotifier.Send">func lineNotifier.Send</div><div class="info"><a href="#s_fn_lineNotifier.Send">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/line_notify.go</code>:</p></div><table class="listing">
|
||
<tr><td>59</td><td><code><pre>func (u *lineNotifier) Send(msg interface{}) error {</pre></code></td></tr><tr class="miss"><td>60</td><td><code><pre> message := msg.(string)</pre></code></td></tr><tr class="miss"><td>61</td><td><code><pre> client := new(http.Client)</pre></code></td></tr><tr class="miss"><td>62</td><td><code><pre> v := url.Values{}</pre></code></td></tr><tr class="miss"><td>63</td><td><code><pre> v.Set("message", message)</pre></code></td></tr><tr class="miss"><td>64</td><td><code><pre> req, err := http.NewRequest("POST", "https://notify-api.line.me/api/notify", strings.NewReader(v.Encode()))</pre></code></td></tr><tr class="miss"><td>65</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>66</td><td><code><pre> return err</pre></code></td></tr><tr><td>67</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>68</td><td><code><pre> req.Header.Add("Authorization", fmt.Sprintf("Bearer %v", u.GetValue("api_secret")))</pre></code></td></tr><tr class="miss"><td>69</td><td><code><pre> req.Header.Add("Accept", "application/json")</pre></code></td></tr><tr class="miss"><td>70</td><td><code><pre> req.Header.Add("Content-Type", "application/x-www-form-urlencoded")</pre></code></td></tr><tr class="miss"><td>71</td><td><code><pre> _, err = client.Do(req)</pre></code></td></tr><tr class="miss"><td>72</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>73</td><td><code><pre> return err</pre></code></td></tr><tr><td>74</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>75</td><td><code><pre> return nil</pre></code></td></tr><tr><td>76</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_email.dialSend">func email.dialSend</div><div class="info"><a href="#s_fn_email.dialSend">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go</code>:</p></div><table class="listing">
|
||
<tr><td>233</td><td><code><pre>func (u *email) dialSend(email *emailOutgoing) error {</pre></code></td></tr><tr class="miss"><td>234</td><td><code><pre> mailer = mail.NewDialer(emailer.Host, emailer.Port, emailer.Username, emailer.Password)</pre></code></td></tr><tr class="miss"><td>235</td><td><code><pre> mailer.TLSConfig = &tls.Config{InsecureSkipVerify: true}</pre></code></td></tr><tr class="miss"><td>236</td><td><code><pre> emailSource(email)</pre></code></td></tr><tr class="miss"><td>237</td><td><code><pre> m := mail.NewMessage()</pre></code></td></tr><tr class="miss"><td>238</td><td><code><pre> m.SetHeader("From", email.From)</pre></code></td></tr><tr class="miss"><td>239</td><td><code><pre> m.SetHeader("To", email.To)</pre></code></td></tr><tr class="miss"><td>240</td><td><code><pre> m.SetHeader("Subject", email.Subject)</pre></code></td></tr><tr class="miss"><td>241</td><td><code><pre> m.SetBody("text/html", email.Source)</pre></code></td></tr><tr class="miss"><td>242</td><td><code><pre> if err := mailer.DialAndSend(m); err != nil {</pre></code></td></tr><tr class="miss"><td>243</td><td><code><pre> 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))</pre></code></td></tr><tr class="miss"><td>244</td><td><code><pre> return err</pre></code></td></tr><tr><td>245</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>246</td><td><code><pre> return nil</pre></code></td></tr><tr><td>247</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_emailTemplate">func emailTemplate</div><div class="info"><a href="#s_fn_emailTemplate">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go</code>:</p></div><table class="listing">
|
||
<tr><td>254</td><td><code><pre>func emailTemplate(contents string, data interface{}) string {</pre></code></td></tr><tr class="miss"><td>255</td><td><code><pre> t := template.New("email")</pre></code></td></tr><tr class="miss"><td>256</td><td><code><pre> t, err := t.Parse(contents)</pre></code></td></tr><tr class="miss"><td>257</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>258</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr><td>259</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>260</td><td><code><pre> var tpl bytes.Buffer</pre></code></td></tr><tr class="miss"><td>261</td><td><code><pre> if err := t.Execute(&tpl, data); err != nil {</pre></code></td></tr><tr class="miss"><td>262</td><td><code><pre> utils.Log(2, err)</pre></code></td></tr><tr><td>263</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>264</td><td><code><pre> result := tpl.String()</pre></code></td></tr><tr class="miss"><td>265</td><td><code><pre> return result</pre></code></td></tr><tr><td>266</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_webhooker.OnTest">func webhooker.OnTest</div><div class="info"><a href="#s_fn_webhooker.OnTest">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go</code>:</p></div><table class="listing">
|
||
<tr><td>143</td><td><code><pre>func (w *webhooker) OnTest() error {</pre></code></td></tr><tr class="miss"><td>144</td><td><code><pre> service := &types.Service{</pre></code></td></tr><tr><td>145</td><td><code><pre> Id: 1,</pre></code></td></tr><tr><td>146</td><td><code><pre> Name: "Interpol - All The Rage Back Home",</pre></code></td></tr><tr><td>147</td><td><code><pre> Domain: "https://www.youtube.com/watch?v=-u6DvRyyKGU",</pre></code></td></tr><tr><td>148</td><td><code><pre> ExpectedStatus: 200,</pre></code></td></tr><tr><td>149</td><td><code><pre> Interval: 30,</pre></code></td></tr><tr><td>150</td><td><code><pre> Type: "http",</pre></code></td></tr><tr><td>151</td><td><code><pre> Method: "GET",</pre></code></td></tr><tr><td>152</td><td><code><pre> Timeout: 20,</pre></code></td></tr><tr><td>153</td><td><code><pre> LastStatusCode: 404,</pre></code></td></tr><tr><td>154</td><td><code><pre> Expected: "test example",</pre></code></td></tr><tr><td>155</td><td><code><pre> LastResponse: "<html>this is an example response</html>",</pre></code></td></tr><tr><td>156</td><td><code><pre> CreatedAt: time.Now().Add(-24 * time.Hour),</pre></code></td></tr><tr><td>157</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>158</td><td><code><pre> body := replaceBodyText(w.Var2, service, nil)</pre></code></td></tr><tr class="miss"><td>159</td><td><code><pre> resp, err := w.run(body)</pre></code></td></tr><tr class="miss"><td>160</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>161</td><td><code><pre> return err</pre></code></td></tr><tr><td>162</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>163</td><td><code><pre> defer resp.Body.Close()</pre></code></td></tr><tr class="miss"><td>164</td><td><code><pre> content, err := ioutil.ReadAll(resp.Body)</pre></code></td></tr><tr class="miss"><td>165</td><td><code><pre> utils.Log(1, fmt.Sprintf("webhook notifier received: '%v'", string(content)))</pre></code></td></tr><tr class="miss"><td>166</td><td><code><pre> return err</pre></code></td></tr><tr><td>167</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_slack.OnTest">func slack.OnTest</div><div class="info"><a href="#s_fn_slack.OnTest">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go</code>:</p></div><table class="listing">
|
||
<tr><td>101</td><td><code><pre>func (u *slack) OnTest() error {</pre></code></td></tr><tr class="miss"><td>102</td><td><code><pre> client := new(http.Client)</pre></code></td></tr><tr class="miss"><td>103</td><td><code><pre> res, err := client.Post(u.Host, "application/json", bytes.NewBuffer([]byte(`{"text":"testing message"}`)))</pre></code></td></tr><tr class="miss"><td>104</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>105</td><td><code><pre> return err</pre></code></td></tr><tr><td>106</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>107</td><td><code><pre> defer res.Body.Close()</pre></code></td></tr><tr class="miss"><td>108</td><td><code><pre> contents, _ := ioutil.ReadAll(res.Body)</pre></code></td></tr><tr class="miss"><td>109</td><td><code><pre> if string(contents) != "ok" {</pre></code></td></tr><tr class="miss"><td>110</td><td><code><pre> return errors.New("The slack response was incorrect, check the URL")</pre></code></td></tr><tr><td>111</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>112</td><td><code><pre> return err</pre></code></td></tr><tr><td>113</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_email.OnTest">func email.OnTest</div><div class="info"><a href="#s_fn_email.OnTest">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go</code>:</p></div><table class="listing">
|
||
<tr><td>221</td><td><code><pre>func (u *email) OnTest() error {</pre></code></td></tr><tr class="miss"><td>222</td><td><code><pre> host := fmt.Sprintf("%v:%v", u.Host, u.Port)</pre></code></td></tr><tr class="miss"><td>223</td><td><code><pre> dial, err := smtp.Dial(host)</pre></code></td></tr><tr class="miss"><td>224</td><td><code><pre> dial.StartTLS(&tls.Config{InsecureSkipVerify: true})</pre></code></td></tr><tr class="miss"><td>225</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>226</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr class="miss"><td>227</td><td><code><pre> return err</pre></code></td></tr><tr><td>228</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>229</td><td><code><pre> auth := smtp.PlainAuth("", u.Username, u.Password, host)</pre></code></td></tr><tr class="miss"><td>230</td><td><code><pre> return dial.Auth(auth)</pre></code></td></tr><tr><td>231</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_discord.Send">func discord.Send</div><div class="info"><a href="#s_fn_discord.Send">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/discord.go</code>:</p></div><table class="listing">
|
||
<tr><td>59</td><td><code><pre>func (u *discord) Send(msg interface{}) error {</pre></code></td></tr><tr class="miss"><td>60</td><td><code><pre> message := msg.(string)</pre></code></td></tr><tr class="miss"><td>61</td><td><code><pre> req, _ := http.NewRequest("POST", discorder.GetValue("host"), bytes.NewBuffer([]byte(message)))</pre></code></td></tr><tr class="miss"><td>62</td><td><code><pre> req.Header.Set("Content-Type", "application/json")</pre></code></td></tr><tr class="miss"><td>63</td><td><code><pre> client := &http.Client{}</pre></code></td></tr><tr class="miss"><td>64</td><td><code><pre> resp, err := client.Do(req)</pre></code></td></tr><tr class="miss"><td>65</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>66</td><td><code><pre> return err</pre></code></td></tr><tr><td>67</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>68</td><td><code><pre> return resp.Body.Close()</pre></code></td></tr><tr><td>69</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_replaceBodyText">func replaceBodyText</div><div class="info"><a href="#s_fn_replaceBodyText">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go</code>:</p></div><table class="listing">
|
||
<tr><td>101</td><td><code><pre>func replaceBodyText(body string, s *types.Service, f *types.Failure) string {</pre></code></td></tr><tr class="miss"><td>102</td><td><code><pre> if s != nil {</pre></code></td></tr><tr class="miss"><td>103</td><td><code><pre> body = strings.Replace(body, "%service.Name", s.Name, -1)</pre></code></td></tr><tr class="miss"><td>104</td><td><code><pre> body = strings.Replace(body, "%service.Id", utils.ToString(s.Id), -1)</pre></code></td></tr><tr class="miss"><td>105</td><td><code><pre> body = strings.Replace(body, "%service.Online", utils.ToString(s.Online), -1)</pre></code></td></tr><tr><td>106</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>107</td><td><code><pre> if f != nil {</pre></code></td></tr><tr class="miss"><td>108</td><td><code><pre> body = strings.Replace(body, "%failure.Issue", f.Issue, -1)</pre></code></td></tr><tr><td>109</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>110</td><td><code><pre> return body</pre></code></td></tr><tr><td>111</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_slack.Send">func slack.Send</div><div class="info"><a href="#s_fn_slack.Send">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go</code>:</p></div><table class="listing">
|
||
<tr><td>85</td><td><code><pre>func (u *slack) Send(msg interface{}) error {</pre></code></td></tr><tr class="miss"><td>86</td><td><code><pre> message := msg.(string)</pre></code></td></tr><tr class="miss"><td>87</td><td><code><pre> client := new(http.Client)</pre></code></td></tr><tr class="miss"><td>88</td><td><code><pre> res, err := client.Post(u.Host, "application/json", bytes.NewBuffer([]byte(message)))</pre></code></td></tr><tr class="miss"><td>89</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>90</td><td><code><pre> return err</pre></code></td></tr><tr><td>91</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>92</td><td><code><pre> defer res.Body.Close()</pre></code></td></tr><tr><td>93</td><td><code><pre> //contents, _ := ioutil.ReadAll(res.Body)</pre></code></td></tr><tr class="miss"><td>94</td><td><code><pre> return nil</pre></code></td></tr><tr><td>95</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_parseSlackMessage">func parseSlackMessage</div><div class="info"><a href="#s_fn_parseSlackMessage">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go</code>:</p></div><table class="listing">
|
||
<tr><td>59</td><td><code><pre>func parseSlackMessage(temp string, data interface{}) error {</pre></code></td></tr><tr class="miss"><td>60</td><td><code><pre> buf := new(bytes.Buffer)</pre></code></td></tr><tr class="miss"><td>61</td><td><code><pre> slackTemp, _ := template.New("slack").Parse(temp)</pre></code></td></tr><tr class="miss"><td>62</td><td><code><pre> err := slackTemp.Execute(buf, data)</pre></code></td></tr><tr class="miss"><td>63</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>64</td><td><code><pre> return err</pre></code></td></tr><tr><td>65</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>66</td><td><code><pre> slacker.AddQueue(buf.String())</pre></code></td></tr><tr class="miss"><td>67</td><td><code><pre> return nil</pre></code></td></tr><tr><td>68</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_email.Send">func email.Send</div><div class="info"><a href="#s_fn_email.Send">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go</code>:</p></div><table class="listing">
|
||
<tr><td>161</td><td><code><pre>func (u *email) Send(msg interface{}) error {</pre></code></td></tr><tr class="miss"><td>162</td><td><code><pre> email := msg.(*emailOutgoing)</pre></code></td></tr><tr class="miss"><td>163</td><td><code><pre> err := u.dialSend(email)</pre></code></td></tr><tr class="miss"><td>164</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>165</td><td><code><pre> utils.Log(3, fmt.Sprintf("email Notifier could not send email: %v", err))</pre></code></td></tr><tr class="miss"><td>166</td><td><code><pre> return err</pre></code></td></tr><tr><td>167</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>168</td><td><code><pre> return nil</pre></code></td></tr><tr><td>169</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_twilioSuccess">func twilioSuccess</div><div class="info"><a href="#s_fn_twilioSuccess">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go</code>:</p></div><table class="listing">
|
||
<tr><td>145</td><td><code><pre>func twilioSuccess(res []byte) (bool, twilioResponse) {</pre></code></td></tr><tr class="miss"><td>146</td><td><code><pre> var obj twilioResponse</pre></code></td></tr><tr class="miss"><td>147</td><td><code><pre> json.Unmarshal(res, &obj)</pre></code></td></tr><tr class="miss"><td>148</td><td><code><pre> if obj.Status == "queued" {</pre></code></td></tr><tr class="miss"><td>149</td><td><code><pre> return true, obj</pre></code></td></tr><tr><td>150</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>151</td><td><code><pre> return false, obj</pre></code></td></tr><tr><td>152</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_lineNotifier.OnSuccess">func lineNotifier.OnSuccess</div><div class="info"><a href="#s_fn_lineNotifier.OnSuccess">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/line_notify.go</code>:</p></div><table class="listing">
|
||
<tr><td>90</td><td><code><pre>func (u *lineNotifier) OnSuccess(s *types.Service) {</pre></code></td></tr><tr class="miss"><td>91</td><td><code><pre> if !u.Online {</pre></code></td></tr><tr class="miss"><td>92</td><td><code><pre> msg := fmt.Sprintf("Your service '%v' is back online!", s.Name)</pre></code></td></tr><tr class="miss"><td>93</td><td><code><pre> u.AddQueue(msg)</pre></code></td></tr><tr><td>94</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>95</td><td><code><pre> u.Online = true</pre></code></td></tr><tr><td>96</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_webhooker.Send">func webhooker.Send</div><div class="info"><a href="#s_fn_webhooker.Send">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go</code>:</p></div><table class="listing">
|
||
<tr><td>89</td><td><code><pre>func (w *webhooker) Send(msg interface{}) error {</pre></code></td></tr><tr class="miss"><td>90</td><td><code><pre> resp, err := w.run(msg.(string))</pre></code></td></tr><tr class="miss"><td>91</td><td><code><pre> if err == nil {</pre></code></td></tr><tr class="miss"><td>92</td><td><code><pre> resp.Body.Close()</pre></code></td></tr><tr><td>93</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>94</td><td><code><pre> return err</pre></code></td></tr><tr><td>95</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_discord.OnSuccess">func discord.OnSuccess</div><div class="info"><a href="#s_fn_discord.OnSuccess">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/discord.go</code>:</p></div><table class="listing">
|
||
<tr><td>83</td><td><code><pre>func (u *discord) OnSuccess(s *types.Service) {</pre></code></td></tr><tr class="miss"><td>84</td><td><code><pre> if !u.Online {</pre></code></td></tr><tr class="miss"><td>85</td><td><code><pre> msg := fmt.Sprintf(`{"content": "Your service '%v' is back online!"}`, s.Name)</pre></code></td></tr><tr class="miss"><td>86</td><td><code><pre> u.AddQueue(msg)</pre></code></td></tr><tr><td>87</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>88</td><td><code><pre> u.Online = true</pre></code></td></tr><tr><td>89</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_slack.OnSuccess">func slack.OnSuccess</div><div class="info"><a href="#s_fn_slack.OnSuccess">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go</code>:</p></div><table class="listing">
|
||
<tr><td>127</td><td><code><pre>func (u *slack) OnSuccess(s *types.Service) {</pre></code></td></tr><tr class="miss"><td>128</td><td><code><pre> if !u.Online {</pre></code></td></tr><tr class="miss"><td>129</td><td><code><pre> message := slackMessage{</pre></code></td></tr><tr><td>130</td><td><code><pre> Service: s,</pre></code></td></tr><tr><td>131</td><td><code><pre> Template: successTemplate,</pre></code></td></tr><tr><td>132</td><td><code><pre> Time: time.Now().Unix(),</pre></code></td></tr><tr><td>133</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>134</td><td><code><pre> parseSlackMessage(successTemplate, message)</pre></code></td></tr><tr><td>135</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>136</td><td><code><pre> u.Online = true</pre></code></td></tr><tr><td>137</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_email.OnSuccess">func email.OnSuccess</div><div class="info"><a href="#s_fn_email.OnSuccess">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go</code>:</p></div><table class="listing">
|
||
<tr><td>195</td><td><code><pre>func (u *email) OnSuccess(s *types.Service) {</pre></code></td></tr><tr class="miss"><td>196</td><td><code><pre> if !u.Online {</pre></code></td></tr><tr class="miss"><td>197</td><td><code><pre> email := &emailOutgoing{</pre></code></td></tr><tr><td>198</td><td><code><pre> To: emailer.GetValue("var2"),</pre></code></td></tr><tr><td>199</td><td><code><pre> Subject: fmt.Sprintf("Service %v is Back Online", s.Name),</pre></code></td></tr><tr><td>200</td><td><code><pre> Template: mainEmailTemplate,</pre></code></td></tr><tr><td>201</td><td><code><pre> Data: interface{}(s),</pre></code></td></tr><tr><td>202</td><td><code><pre> From: emailer.GetValue("var1"),</pre></code></td></tr><tr><td>203</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>204</td><td><code><pre> u.AddQueue(email)</pre></code></td></tr><tr><td>205</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>206</td><td><code><pre> u.Online = true</pre></code></td></tr><tr><td>207</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_webhooker.OnSuccess">func webhooker.OnSuccess</div><div class="info"><a href="#s_fn_webhooker.OnSuccess">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go</code>:</p></div><table class="listing">
|
||
<tr><td>177</td><td><code><pre>func (w *webhooker) OnSuccess(s *types.Service) {</pre></code></td></tr><tr class="miss"><td>178</td><td><code><pre> if !w.Online {</pre></code></td></tr><tr class="miss"><td>179</td><td><code><pre> msg := replaceBodyText(w.Var2, s, nil)</pre></code></td></tr><tr class="miss"><td>180</td><td><code><pre> webhook.AddQueue(msg)</pre></code></td></tr><tr><td>181</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>182</td><td><code><pre> w.Online = true</pre></code></td></tr><tr><td>183</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_twilio.OnSuccess">func twilio.OnSuccess</div><div class="info"><a href="#s_fn_twilio.OnSuccess">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go</code>:</p></div><table class="listing">
|
||
<tr><td>122</td><td><code><pre>func (u *twilio) OnSuccess(s *types.Service) {</pre></code></td></tr><tr class="miss"><td>123</td><td><code><pre> if !u.Online {</pre></code></td></tr><tr class="miss"><td>124</td><td><code><pre> msg := fmt.Sprintf("Your service '%v' is back online!", s.Name)</pre></code></td></tr><tr class="miss"><td>125</td><td><code><pre> u.AddQueue(msg)</pre></code></td></tr><tr><td>126</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>127</td><td><code><pre> u.Online = true</pre></code></td></tr><tr><td>128</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_twilio.OnFailure">func twilio.OnFailure</div><div class="info"><a href="#s_fn_twilio.OnFailure">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go</code>:</p></div><table class="listing">
|
||
<tr><td>115</td><td><code><pre>func (u *twilio) OnFailure(s *types.Service, f *types.Failure) {</pre></code></td></tr><tr class="miss"><td>116</td><td><code><pre> msg := fmt.Sprintf("Your service '%v' is currently offline!", s.Name)</pre></code></td></tr><tr class="miss"><td>117</td><td><code><pre> u.AddQueue(msg)</pre></code></td></tr><tr class="miss"><td>118</td><td><code><pre> u.Online = false</pre></code></td></tr><tr><td>119</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_discord.OnSave">func discord.OnSave</div><div class="info"><a href="#s_fn_discord.OnSave">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/discord.go</code>:</p></div><table class="listing">
|
||
<tr><td>92</td><td><code><pre>func (u *discord) OnSave() error {</pre></code></td></tr><tr class="miss"><td>93</td><td><code><pre> msg := fmt.Sprintf(`{"content": "The discord notifier on Statup was just updated."}`)</pre></code></td></tr><tr class="miss"><td>94</td><td><code><pre> u.AddQueue(msg)</pre></code></td></tr><tr class="miss"><td>95</td><td><code><pre> return nil</pre></code></td></tr><tr><td>96</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_lineNotifier.OnFailure">func lineNotifier.OnFailure</div><div class="info"><a href="#s_fn_lineNotifier.OnFailure">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/line_notify.go</code>:</p></div><table class="listing">
|
||
<tr><td>83</td><td><code><pre>func (u *lineNotifier) OnFailure(s *types.Service, f *types.Failure) {</pre></code></td></tr><tr class="miss"><td>84</td><td><code><pre> msg := fmt.Sprintf("Your service '%v' is currently offline!", s.Name)</pre></code></td></tr><tr class="miss"><td>85</td><td><code><pre> u.AddQueue(msg)</pre></code></td></tr><tr class="miss"><td>86</td><td><code><pre> u.Online = false</pre></code></td></tr><tr><td>87</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_email.OnFailure">func email.OnFailure</div><div class="info"><a href="#s_fn_email.OnFailure">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go</code>:</p></div><table class="listing">
|
||
<tr><td>182</td><td><code><pre>func (u *email) OnFailure(s *types.Service, f *types.Failure) {</pre></code></td></tr><tr class="miss"><td>183</td><td><code><pre> email := &emailOutgoing{</pre></code></td></tr><tr><td>184</td><td><code><pre> To: emailer.GetValue("var2"),</pre></code></td></tr><tr><td>185</td><td><code><pre> Subject: fmt.Sprintf("Service %v is Failing", s.Name),</pre></code></td></tr><tr><td>186</td><td><code><pre> Template: mainEmailTemplate,</pre></code></td></tr><tr><td>187</td><td><code><pre> Data: interface{}(s),</pre></code></td></tr><tr><td>188</td><td><code><pre> From: emailer.GetValue("var1"),</pre></code></td></tr><tr><td>189</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>190</td><td><code><pre> u.AddQueue(email)</pre></code></td></tr><tr class="miss"><td>191</td><td><code><pre> u.Online = false</pre></code></td></tr><tr><td>192</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_slack.OnSave">func slack.OnSave</div><div class="info"><a href="#s_fn_slack.OnSave">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go</code>:</p></div><table class="listing">
|
||
<tr><td>140</td><td><code><pre>func (u *slack) OnSave() error {</pre></code></td></tr><tr class="miss"><td>141</td><td><code><pre> message := fmt.Sprintf("Notification %v is receiving updated information.", u.Method)</pre></code></td></tr><tr class="miss"><td>142</td><td><code><pre> u.AddQueue(message)</pre></code></td></tr><tr class="miss"><td>143</td><td><code><pre> return nil</pre></code></td></tr><tr><td>144</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_twilioError">func twilioError</div><div class="info"><a href="#s_fn_twilioError">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go</code>:</p></div><table class="listing">
|
||
<tr><td>154</td><td><code><pre>func twilioError(res []byte) twilioErrorObj {</pre></code></td></tr><tr class="miss"><td>155</td><td><code><pre> var obj twilioErrorObj</pre></code></td></tr><tr class="miss"><td>156</td><td><code><pre> json.Unmarshal(res, &obj)</pre></code></td></tr><tr class="miss"><td>157</td><td><code><pre> return obj</pre></code></td></tr><tr><td>158</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_slack.OnFailure">func slack.OnFailure</div><div class="info"><a href="#s_fn_slack.OnFailure">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/slack.go</code>:</p></div><table class="listing">
|
||
<tr><td>116</td><td><code><pre>func (u *slack) OnFailure(s *types.Service, f *types.Failure) {</pre></code></td></tr><tr class="miss"><td>117</td><td><code><pre> message := slackMessage{</pre></code></td></tr><tr><td>118</td><td><code><pre> Service: s,</pre></code></td></tr><tr><td>119</td><td><code><pre> Template: failingTemplate,</pre></code></td></tr><tr><td>120</td><td><code><pre> Time: time.Now().Unix(),</pre></code></td></tr><tr><td>121</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>122</td><td><code><pre> parseSlackMessage(failingTemplate, message)</pre></code></td></tr><tr class="miss"><td>123</td><td><code><pre> u.Online = false</pre></code></td></tr><tr><td>124</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_webhooker.OnFailure">func webhooker.OnFailure</div><div class="info"><a href="#s_fn_webhooker.OnFailure">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go</code>:</p></div><table class="listing">
|
||
<tr><td>170</td><td><code><pre>func (w *webhooker) OnFailure(s *types.Service, f *types.Failure) {</pre></code></td></tr><tr class="miss"><td>171</td><td><code><pre> msg := replaceBodyText(w.Var2, s, f)</pre></code></td></tr><tr class="miss"><td>172</td><td><code><pre> webhook.AddQueue(msg)</pre></code></td></tr><tr class="miss"><td>173</td><td><code><pre> w.Online = false</pre></code></td></tr><tr><td>174</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_discord.OnFailure">func discord.OnFailure</div><div class="info"><a href="#s_fn_discord.OnFailure">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/discord.go</code>:</p></div><table class="listing">
|
||
<tr><td>76</td><td><code><pre>func (u *discord) OnFailure(s *types.Service, f *types.Failure) {</pre></code></td></tr><tr class="miss"><td>77</td><td><code><pre> msg := fmt.Sprintf(`{"content": "Your service '%v' is currently failing! Reason: %v"}`, s.Name, f.Issue)</pre></code></td></tr><tr class="miss"><td>78</td><td><code><pre> u.AddQueue(msg)</pre></code></td></tr><tr class="miss"><td>79</td><td><code><pre> u.Online = false</pre></code></td></tr><tr><td>80</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_twilio.OnTest">func twilio.OnTest</div><div class="info"><a href="#s_fn_twilio.OnTest">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go</code>:</p></div><table class="listing">
|
||
<tr><td>140</td><td><code><pre>func (u *twilio) OnTest() error {</pre></code></td></tr><tr class="miss"><td>141</td><td><code><pre> msg := fmt.Sprintf("Testing the Twilio SMS Notifier")</pre></code></td></tr><tr class="miss"><td>142</td><td><code><pre> return u.Send(msg)</pre></code></td></tr><tr><td>143</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_lineNotifier.OnSave">func lineNotifier.OnSave</div><div class="info"><a href="#s_fn_lineNotifier.OnSave">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/line_notify.go</code>:</p></div><table class="listing">
|
||
<tr><td>99</td><td><code><pre>func (u *lineNotifier) OnSave() error {</pre></code></td></tr><tr class="miss"><td>100</td><td><code><pre> utils.Log(1, fmt.Sprintf("Notification %v is receiving updated information.", u.Method))</pre></code></td></tr><tr><td>101</td><td><code><pre> // Do updating stuff here</pre></code></td></tr><tr class="miss"><td>102</td><td><code><pre> return nil</pre></code></td></tr><tr><td>103</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_emailSource">func emailSource</div><div class="info"><a href="#s_fn_emailSource">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go</code>:</p></div><table class="listing">
|
||
<tr><td>249</td><td><code><pre>func emailSource(email *emailOutgoing) {</pre></code></td></tr><tr class="miss"><td>250</td><td><code><pre> source := emailTemplate(email.Template, email.Data)</pre></code></td></tr><tr class="miss"><td>251</td><td><code><pre> email.Source = source</pre></code></td></tr><tr><td>252</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_email.OnSave">func email.OnSave</div><div class="info"><a href="#s_fn_email.OnSave">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/email.go</code>:</p></div><table class="listing">
|
||
<tr><td>214</td><td><code><pre>func (u *email) OnSave() error {</pre></code></td></tr><tr class="miss"><td>215</td><td><code><pre> utils.Log(1, fmt.Sprintf("Notification %v is receiving updated information.", u.Method))</pre></code></td></tr><tr><td>216</td><td><code><pre> // Do updating stuff here</pre></code></td></tr><tr class="miss"><td>217</td><td><code><pre> return nil</pre></code></td></tr><tr><td>218</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_twilio.OnSave">func twilio.OnSave</div><div class="info"><a href="#s_fn_twilio.OnSave">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/twilio.go</code>:</p></div><table class="listing">
|
||
<tr><td>131</td><td><code><pre>func (u *twilio) OnSave() error {</pre></code></td></tr><tr class="miss"><td>132</td><td><code><pre> utils.Log(1, fmt.Sprintf("Notification %v is receiving updated information.", u.Method))</pre></code></td></tr><tr><td>133</td><td><code><pre></pre></code></td></tr><tr><td>134</td><td><code><pre> // Do updating stuff here</pre></code></td></tr><tr><td>135</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>136</td><td><code><pre> return nil</pre></code></td></tr><tr><td>137</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_webhooker.OnSave">func webhooker.OnSave</div><div class="info"><a href="#s_fn_webhooker.OnSave">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/notifiers/webhook.go</code>:</p></div><table class="listing">
|
||
<tr><td>186</td><td><code><pre>func (w *webhooker) OnSave() error {</pre></code></td></tr><tr class="miss"><td>187</td><td><code><pre> return nil</pre></code></td></tr><tr><td>188</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<!-- Can be parsed by external script
|
||
PACKAGE:github.com/hunterlong/statup/notifiers DONE:7.00
|
||
-->
|
||
|
||
<div id="pkg_github.com/hunterlong/statup/plugin" class="funcname">Package Overview: github.com/hunterlong/statup/plugin <span class="packageTotal">4.08%</span></div><p>This is a coverage report created after analysis of the <code>github.com/hunterlong/statup/plugin</code> package. It
|
||
has been generated with the following command:</p><pre class="cmd">gocov test github.com/hunterlong/statup/plugin | gocov-html</pre> <p>Here are the stats. Please select a function name to view its implementation and see what's left for testing.</p><table class="overview">
|
||
<tr id="s_fn_init"><td><code><a href="#fn_init">init(...)</a></code></td><td><code>github.com/hunterlong/statup/plugin/plugin.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_LoadPlugin"><td><code><a href="#fn_LoadPlugin">LoadPlugin(...)</a></code></td><td><code>github.com/hunterlong/statup/plugin/plugin.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/33</code></td></tr>
|
||
<tr id="s_fn_LoadPlugins"><td><code><a href="#fn_LoadPlugins">LoadPlugins(...)</a></code></td><td><code>github.com/hunterlong/statup/plugin/plugin.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/14</code></td></tr>
|
||
<tr><td colspan="2"><code>github.com/hunterlong/statup/plugin</code></td><td class="percent"><code>4.08%</code></td><td class="linecount"><code>2/49</code></td></tr>
|
||
</table>
|
||
|
||
<div class="funcname" id="fn_init">func init</div><div class="info"><a href="#s_fn_init">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/plugin/plugin.go</code>:</p></div><table class="listing">
|
||
<tr><td>46</td><td><code><pre>func init() {</pre></code></td></tr><tr><td>47</td><td><code><pre> utils.InitLogs()</pre></code></td></tr><tr><td>48</td><td><code><pre> dir = utils.Directory</pre></code></td></tr><tr><td>49</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_LoadPlugin">func LoadPlugin</div><div class="info"><a href="#s_fn_LoadPlugin">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/plugin/plugin.go</code>:</p></div><table class="listing">
|
||
<tr><td>51</td><td><code><pre>func LoadPlugin(file string) error {</pre></code></td></tr><tr class="miss"><td>52</td><td><code><pre> utils.Log(1, fmt.Sprintf("opening file %v", file))</pre></code></td></tr><tr class="miss"><td>53</td><td><code><pre> f, err := os.Open(file)</pre></code></td></tr><tr class="miss"><td>54</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>55</td><td><code><pre> return err</pre></code></td></tr><tr><td>56</td><td><code><pre> }</pre></code></td></tr><tr><td>57</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>58</td><td><code><pre> fSplit := strings.Split(f.Name(), "/")</pre></code></td></tr><tr class="miss"><td>59</td><td><code><pre> fileBin := fSplit[len(fSplit)-1]</pre></code></td></tr><tr><td>60</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>61</td><td><code><pre> utils.Log(1, fmt.Sprintf("Attempting to load plugin '%v'", fileBin))</pre></code></td></tr><tr class="miss"><td>62</td><td><code><pre> ext := strings.Split(fileBin, ".")</pre></code></td></tr><tr class="miss"><td>63</td><td><code><pre> if len(ext) != 2 {</pre></code></td></tr><tr class="miss"><td>64</td><td><code><pre> utils.Log(3, fmt.Sprintf("Plugin '%v' must end in .so extension", fileBin))</pre></code></td></tr><tr class="miss"><td>65</td><td><code><pre> return fmt.Errorf("Plugin '%v' must end in .so extension %v", fileBin, len(ext))</pre></code></td></tr><tr><td>66</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>67</td><td><code><pre> if ext[1] != "so" {</pre></code></td></tr><tr class="miss"><td>68</td><td><code><pre> utils.Log(3, fmt.Sprintf("Plugin '%v' must end in .so extension", fileBin))</pre></code></td></tr><tr class="miss"><td>69</td><td><code><pre> return fmt.Errorf("Plugin '%v' must end in .so extension", fileBin)</pre></code></td></tr><tr><td>70</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>71</td><td><code><pre> plug, err := plugin.Open(file)</pre></code></td></tr><tr class="miss"><td>72</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>73</td><td><code><pre> utils.Log(3, fmt.Sprintf("Plugin '%v' could not load correctly. %v", fileBin, err))</pre></code></td></tr><tr class="miss"><td>74</td><td><code><pre> return err</pre></code></td></tr><tr><td>75</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>76</td><td><code><pre> symPlugin, err := plug.Lookup("Plugin")</pre></code></td></tr><tr class="miss"><td>77</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>78</td><td><code><pre> utils.Log(3, fmt.Sprintf("Plugin '%v' could not locate Plugin variable. %v", fileBin, err))</pre></code></td></tr><tr class="miss"><td>79</td><td><code><pre> return err</pre></code></td></tr><tr><td>80</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>81</td><td><code><pre> plugActions, ok := symPlugin.(types.PluginActions)</pre></code></td></tr><tr class="miss"><td>82</td><td><code><pre> if !ok {</pre></code></td></tr><tr class="miss"><td>83</td><td><code><pre> utils.Log(3, fmt.Sprintf("Plugin %v was not type PluginObject", f.Name()))</pre></code></td></tr><tr class="miss"><td>84</td><td><code><pre> return fmt.Errorf("Plugin %v was not type PluginActions %v", f.Name(), plugActions.GetInfo())</pre></code></td></tr><tr><td>85</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>86</td><td><code><pre> info := plugActions.GetInfo()</pre></code></td></tr><tr class="miss"><td>87</td><td><code><pre> err = plugActions.OnLoad()</pre></code></td></tr><tr class="miss"><td>88</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>89</td><td><code><pre> return err</pre></code></td></tr><tr><td>90</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>91</td><td><code><pre> utils.Log(1, fmt.Sprintf("Plugin %v loaded from %v", info.Name, f.Name()))</pre></code></td></tr><tr class="miss"><td>92</td><td><code><pre> core.CoreApp.AllPlugins = append(core.CoreApp.AllPlugins, plugActions)</pre></code></td></tr><tr class="miss"><td>93</td><td><code><pre> return nil</pre></code></td></tr><tr><td>94</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_LoadPlugins">func LoadPlugins</div><div class="info"><a href="#s_fn_LoadPlugins">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/plugin/plugin.go</code>:</p></div><table class="listing">
|
||
<tr><td>96</td><td><code><pre>func LoadPlugins() {</pre></code></td></tr><tr class="miss"><td>97</td><td><code><pre> pluginDir := dir + "/plugins"</pre></code></td></tr><tr class="miss"><td>98</td><td><code><pre> utils.Log(1, fmt.Sprintf("Loading any available Plugins from /plugins directory"))</pre></code></td></tr><tr class="miss"><td>99</td><td><code><pre> if _, err := os.Stat(pluginDir); os.IsNotExist(err) {</pre></code></td></tr><tr class="miss"><td>100</td><td><code><pre> os.Mkdir(pluginDir, os.ModePerm)</pre></code></td></tr><tr><td>101</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>102</td><td><code><pre> files, err := ioutil.ReadDir(pluginDir)</pre></code></td></tr><tr class="miss"><td>103</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>104</td><td><code><pre> utils.Log(2, fmt.Sprintf("Plugins directory was not found. Error: %v", err))</pre></code></td></tr><tr class="miss"><td>105</td><td><code><pre> return</pre></code></td></tr><tr><td>106</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>107</td><td><code><pre> for _, f := range files {</pre></code></td></tr><tr class="miss"><td>108</td><td><code><pre> err := LoadPlugin(f.Name())</pre></code></td></tr><tr class="miss"><td>109</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>110</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr class="miss"><td>111</td><td><code><pre> continue</pre></code></td></tr><tr><td>112</td><td><code><pre> }</pre></code></td></tr><tr><td>113</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>114</td><td><code><pre> utils.Log(1, fmt.Sprintf("Loaded %v Plugins", len(core.CoreApp.Plugins)))</pre></code></td></tr><tr><td>115</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<!-- Can be parsed by external script
|
||
PACKAGE:github.com/hunterlong/statup/plugin DONE:4.08
|
||
-->
|
||
|
||
<div id="pkg_github.com/hunterlong/statup/source" class="funcname">Package Overview: github.com/hunterlong/statup/source <span class="packageTotal">77.71%</span></div><p>This is a coverage report created after analysis of the <code>github.com/hunterlong/statup/source</code> package. It
|
||
has been generated with the following command:</p><pre class="cmd">gocov test github.com/hunterlong/statup/source | gocov-html</pre> <p>Here are the stats. Please select a function name to view its implementation and see what's left for testing.</p><table class="overview">
|
||
<tr id="s_fn_init"><td><code><a href="#fn_init">init(...)</a></code></td><td><code>github.com/hunterlong/statup/source/rice-box.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>29/29</code></td></tr>
|
||
<tr id="s_fn_CreateAllAssets"><td><code><a href="#fn_CreateAllAssets">CreateAllAssets(...)</a></code></td><td><code>github.com/hunterlong/statup/source/source.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>17/17</code></td></tr>
|
||
<tr id="s_fn_init"><td><code><a href="#fn_init">init(...)</a></code></td><td><code>github.com/hunterlong/statup/source/rice-box.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>12/12</code></td></tr>
|
||
<tr id="s_fn_init"><td><code><a href="#fn_init">init(...)</a></code></td><td><code>github.com/hunterlong/statup/source/rice-box.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>7/7</code></td></tr>
|
||
<tr id="s_fn_init"><td><code><a href="#fn_init">init(...)</a></code></td><td><code>github.com/hunterlong/statup/source/rice-box.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>6/6</code></td></tr>
|
||
<tr id="s_fn_Assets"><td><code><a href="#fn_Assets">Assets(...)</a></code></td><td><code>github.com/hunterlong/statup/source/source.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_@79:5"><td><code><a href="#fn_@79:5">@79:5(...)</a></code></td><td><code>github.com/hunterlong/statup/source/source.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_@83:5"><td><code><a href="#fn_@83:5">@83:5(...)</a></code></td><td><code>github.com/hunterlong/statup/source/source.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_CompileSASS"><td><code><a href="#fn_CompileSASS">CompileSASS(...)</a></code></td><td><code>github.com/hunterlong/statup/source/source.go</code></td><td class="percent"><code>74.19%</code></td><td class="linecount"><code>23/31</code></td></tr>
|
||
<tr id="s_fn_MakePublicFolder"><td><code><a href="#fn_MakePublicFolder">MakePublicFolder(...)</a></code></td><td><code>github.com/hunterlong/statup/source/source.go</code></td><td class="percent"><code>71.43%</code></td><td class="linecount"><code>5/7</code></td></tr>
|
||
<tr id="s_fn_SaveAsset"><td><code><a href="#fn_SaveAsset">SaveAsset(...)</a></code></td><td><code>github.com/hunterlong/statup/source/source.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>4/6</code></td></tr>
|
||
<tr id="s_fn_DeleteAllAssets"><td><code><a href="#fn_DeleteAllAssets">DeleteAllAssets(...)</a></code></td><td><code>github.com/hunterlong/statup/source/source.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>4/6</code></td></tr>
|
||
<tr id="s_fn_copyAndCapture"><td><code><a href="#fn_copyAndCapture">copyAndCapture(...)</a></code></td><td><code>github.com/hunterlong/statup/source/source.go</code></td><td class="percent"><code>64.29%</code></td><td class="linecount"><code>9/14</code></td></tr>
|
||
<tr id="s_fn_CopyToPublic"><td><code><a href="#fn_CopyToPublic">CopyToPublic(...)</a></code></td><td><code>github.com/hunterlong/statup/source/source.go</code></td><td class="percent"><code>63.64%</code></td><td class="linecount"><code>7/11</code></td></tr>
|
||
<tr id="s_fn_OpenAsset"><td><code><a href="#fn_OpenAsset">OpenAsset(...)</a></code></td><td><code>github.com/hunterlong/statup/source/source.go</code></td><td class="percent"><code>60.00%</code></td><td class="linecount"><code>3/5</code></td></tr>
|
||
<tr id="s_fn_UsingAssets"><td><code><a href="#fn_UsingAssets">UsingAssets(...)</a></code></td><td><code>github.com/hunterlong/statup/source/source.go</code></td><td class="percent"><code>33.33%</code></td><td class="linecount"><code>4/12</code></td></tr>
|
||
<tr id="s_fn_HelpMarkdown"><td><code><a href="#fn_HelpMarkdown">HelpMarkdown(...)</a></code></td><td><code>github.com/hunterlong/statup/source/source.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/6</code></td></tr>
|
||
<tr><td colspan="2"><code>github.com/hunterlong/statup/source</code></td><td class="percent"><code>77.71%</code></td><td class="linecount"><code>136/175</code></td></tr>
|
||
</table>
|
||
|
||
<div class="funcname" id="fn_init">func init</div><div class="info"><a href="#s_fn_init">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/rice-box.go</code>:</p></div><table class="listing">
|
||
<tr><td>155</td><td><code><pre>func init() {</pre></code></td></tr><tr><td>156</td><td><code><pre></pre></code></td></tr><tr><td>157</td><td><code><pre> // define files</pre></code></td></tr><tr><td>158</td><td><code><pre> fileh := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>159</td><td><code><pre> Filename: "base.html",</pre></code></td></tr><tr><td>160</td><td><code><pre> FileModTime: time.Unix(1538458071, 0),</pre></code></td></tr><tr><td>161</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>162</td><td><code><pre> }</pre></code></td></tr><tr><td>163</td><td><code><pre> filei := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>164</td><td><code><pre> Filename: "dashboard.html",</pre></code></td></tr><tr><td>165</td><td><code><pre> FileModTime: time.Unix(1538459427, 0),</pre></code></td></tr><tr><td>166</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>167</td><td><code><pre> }</pre></code></td></tr><tr><td>168</td><td><code><pre> filej := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>169</td><td><code><pre> Filename: "error_404.html",</pre></code></td></tr><tr><td>170</td><td><code><pre> FileModTime: time.Unix(1538457906, 0),</pre></code></td></tr><tr><td>171</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>172</td><td><code><pre> }</pre></code></td></tr><tr><td>173</td><td><code><pre> filek := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>174</td><td><code><pre> Filename: "favicon.ico",</pre></code></td></tr><tr><td>175</td><td><code><pre> FileModTime: time.Unix(1530546686, 0),</pre></code></td></tr><tr><td>176</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>177</td><td><code><pre> }</pre></code></td></tr><tr><td>178</td><td><code><pre> filel := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>179</td><td><code><pre> Filename: "footer.html",</pre></code></td></tr><tr><td>180</td><td><code><pre> FileModTime: time.Unix(1538458476, 0),</pre></code></td></tr><tr><td>181</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>182</td><td><code><pre> }</pre></code></td></tr><tr><td>183</td><td><code><pre> filem := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>184</td><td><code><pre> Filename: "form_checkin.html",</pre></code></td></tr><tr><td>185</td><td><code><pre> FileModTime: time.Unix(1538935644, 0),</pre></code></td></tr><tr><td>186</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>187</td><td><code><pre> }</pre></code></td></tr><tr><td>188</td><td><code><pre> filen := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>189</td><td><code><pre> Filename: "form_notifier.html",</pre></code></td></tr><tr><td>190</td><td><code><pre> FileModTime: time.Unix(1539400173, 0),</pre></code></td></tr><tr><td>191</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>192</td><td><code><pre> }</pre></code></td></tr><tr><td>193</td><td><code><pre> fileo := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>194</td><td><code><pre> Filename: "form_service.html",</pre></code></td></tr><tr><td>195</td><td><code><pre> FileModTime: time.Unix(1538934599, 0),</pre></code></td></tr><tr><td>196</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>197</td><td><code><pre> }</pre></code></td></tr><tr><td>198</td><td><code><pre> filep := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>199</td><td><code><pre> Filename: "form_user.html",</pre></code></td></tr><tr><td>200</td><td><code><pre> FileModTime: time.Unix(1538543370, 0),</pre></code></td></tr><tr><td>201</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>202</td><td><code><pre> }</pre></code></td></tr><tr><td>203</td><td><code><pre> fileq := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>204</td><td><code><pre> Filename: "head.html",</pre></code></td></tr><tr><td>205</td><td><code><pre> FileModTime: time.Unix(1538459085, 0),</pre></code></td></tr><tr><td>206</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>207</td><td><code><pre> }</pre></code></td></tr><tr><td>208</td><td><code><pre> filer := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>209</td><td><code><pre> Filename: "help.html",</pre></code></td></tr><tr><td>210</td><td><code><pre> FileModTime: time.Unix(1538459433, 0),</pre></code></td></tr><tr><td>211</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>212</td><td><code><pre> }</pre></code></td></tr><tr><td>213</td><td><code><pre> files := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>214</td><td><code><pre> Filename: "help.md",</pre></code></td></tr><tr><td>215</td><td><code><pre> FileModTime: time.Unix(1536974218, 0),</pre></code></td></tr><tr><td>216</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>217</td><td><code><pre> }</pre></code></td></tr><tr><td>218</td><td><code><pre> filet := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>219</td><td><code><pre> Filename: "index.html",</pre></code></td></tr><tr><td>220</td><td><code><pre> FileModTime: time.Unix(1538522506, 0),</pre></code></td></tr><tr><td>221</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>222</td><td><code><pre> }</pre></code></td></tr><tr><td>223</td><td><code><pre> fileu := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>224</td><td><code><pre> Filename: "login.html",</pre></code></td></tr><tr><td>225</td><td><code><pre> FileModTime: time.Unix(1538454764, 0),</pre></code></td></tr><tr><td>226</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>227</td><td><code><pre> }</pre></code></td></tr><tr><td>228</td><td><code><pre> filev := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>229</td><td><code><pre> Filename: "logs.html",</pre></code></td></tr><tr><td>230</td><td><code><pre> FileModTime: time.Unix(1538460210, 0),</pre></code></td></tr><tr><td>231</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>232</td><td><code><pre> }</pre></code></td></tr><tr><td>233</td><td><code><pre> filew := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>234</td><td><code><pre> Filename: "nav.html",</pre></code></td></tr><tr><td>235</td><td><code><pre> FileModTime: time.Unix(1534817721, 0),</pre></code></td></tr><tr><td>236</td><td><code><pre> 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}}"),</pre></code></td></tr><tr><td>237</td><td><code><pre> }</pre></code></td></tr><tr><td>238</td><td><code><pre> filex := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>239</td><td><code><pre> Filename: "robots.txt",</pre></code></td></tr><tr><td>240</td><td><code><pre> FileModTime: time.Unix(1530546686, 0),</pre></code></td></tr><tr><td>241</td><td><code><pre> Content: string("User-agent: *\nDisallow: /login\nDisallow: /dashboard"),</pre></code></td></tr><tr><td>242</td><td><code><pre> }</pre></code></td></tr><tr><td>243</td><td><code><pre> filey := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>244</td><td><code><pre> Filename: "scripts.html",</pre></code></td></tr><tr><td>245</td><td><code><pre> FileModTime: time.Unix(1538453657, 0),</pre></code></td></tr><tr><td>246</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>247</td><td><code><pre> }</pre></code></td></tr><tr><td>248</td><td><code><pre> filez := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>249</td><td><code><pre> Filename: "service.html",</pre></code></td></tr><tr><td>250</td><td><code><pre> FileModTime: time.Unix(1539361671, 0),</pre></code></td></tr><tr><td>251</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>252</td><td><code><pre> }</pre></code></td></tr><tr><td>253</td><td><code><pre> file10 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>254</td><td><code><pre> Filename: "services.html",</pre></code></td></tr><tr><td>255</td><td><code><pre> FileModTime: time.Unix(1538459465, 0),</pre></code></td></tr><tr><td>256</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>257</td><td><code><pre> }</pre></code></td></tr><tr><td>258</td><td><code><pre> file11 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>259</td><td><code><pre> Filename: "settings.html",</pre></code></td></tr><tr><td>260</td><td><code><pre> FileModTime: time.Unix(1538947359, 0),</pre></code></td></tr><tr><td>261</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>262</td><td><code><pre> }</pre></code></td></tr><tr><td>263</td><td><code><pre> file12 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>264</td><td><code><pre> Filename: "setup.html",</pre></code></td></tr><tr><td>265</td><td><code><pre> FileModTime: time.Unix(1538459628, 0),</pre></code></td></tr><tr><td>266</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>267</td><td><code><pre> }</pre></code></td></tr><tr><td>268</td><td><code><pre> file13 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>269</td><td><code><pre> Filename: "statup.png",</pre></code></td></tr><tr><td>270</td><td><code><pre> FileModTime: time.Unix(1533786305, 0),</pre></code></td></tr><tr><td>271</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>272</td><td><code><pre> }</pre></code></td></tr><tr><td>273</td><td><code><pre> file14 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>274</td><td><code><pre> Filename: "tray.html",</pre></code></td></tr><tr><td>275</td><td><code><pre> FileModTime: time.Unix(1535012730, 0),</pre></code></td></tr><tr><td>276</td><td><code><pre> 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>"),</pre></code></td></tr><tr><td>277</td><td><code><pre> }</pre></code></td></tr><tr><td>278</td><td><code><pre> file15 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>279</td><td><code><pre> Filename: "user.html",</pre></code></td></tr><tr><td>280</td><td><code><pre> FileModTime: time.Unix(1538459587, 0),</pre></code></td></tr><tr><td>281</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>282</td><td><code><pre> }</pre></code></td></tr><tr><td>283</td><td><code><pre> file16 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>284</td><td><code><pre> Filename: "users.html",</pre></code></td></tr><tr><td>285</td><td><code><pre> FileModTime: time.Unix(1538459610, 0),</pre></code></td></tr><tr><td>286</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>287</td><td><code><pre> }</pre></code></td></tr><tr><td>288</td><td><code><pre></pre></code></td></tr><tr><td>289</td><td><code><pre> // define dirs</pre></code></td></tr><tr><td>290</td><td><code><pre> dirg := &embedded.EmbeddedDir{</pre></code></td></tr><tr><td>291</td><td><code><pre> Filename: "",</pre></code></td></tr><tr><td>292</td><td><code><pre> DirModTime: time.Unix(1539400173, 0),</pre></code></td></tr><tr><td>293</td><td><code><pre> ChildFiles: []*embedded.EmbeddedFile{</pre></code></td></tr><tr><td>294</td><td><code><pre> fileh, // "base.html"</pre></code></td></tr><tr><td>295</td><td><code><pre> filei, // "dashboard.html"</pre></code></td></tr><tr><td>296</td><td><code><pre> filej, // "error_404.html"</pre></code></td></tr><tr><td>297</td><td><code><pre> filek, // "favicon.ico"</pre></code></td></tr><tr><td>298</td><td><code><pre> filel, // "footer.html"</pre></code></td></tr><tr><td>299</td><td><code><pre> filem, // "form_checkin.html"</pre></code></td></tr><tr><td>300</td><td><code><pre> filen, // "form_notifier.html"</pre></code></td></tr><tr><td>301</td><td><code><pre> fileo, // "form_service.html"</pre></code></td></tr><tr><td>302</td><td><code><pre> filep, // "form_user.html"</pre></code></td></tr><tr><td>303</td><td><code><pre> fileq, // "head.html"</pre></code></td></tr><tr><td>304</td><td><code><pre> filer, // "help.html"</pre></code></td></tr><tr><td>305</td><td><code><pre> files, // "help.md"</pre></code></td></tr><tr><td>306</td><td><code><pre> filet, // "index.html"</pre></code></td></tr><tr><td>307</td><td><code><pre> fileu, // "login.html"</pre></code></td></tr><tr><td>308</td><td><code><pre> filev, // "logs.html"</pre></code></td></tr><tr><td>309</td><td><code><pre> filew, // "nav.html"</pre></code></td></tr><tr><td>310</td><td><code><pre> filex, // "robots.txt"</pre></code></td></tr><tr><td>311</td><td><code><pre> filey, // "scripts.html"</pre></code></td></tr><tr><td>312</td><td><code><pre> filez, // "service.html"</pre></code></td></tr><tr><td>313</td><td><code><pre> file10, // "services.html"</pre></code></td></tr><tr><td>314</td><td><code><pre> file11, // "settings.html"</pre></code></td></tr><tr><td>315</td><td><code><pre> file12, // "setup.html"</pre></code></td></tr><tr><td>316</td><td><code><pre> file13, // "statup.png"</pre></code></td></tr><tr><td>317</td><td><code><pre> file14, // "tray.html"</pre></code></td></tr><tr><td>318</td><td><code><pre> file15, // "user.html"</pre></code></td></tr><tr><td>319</td><td><code><pre> file16, // "users.html"</pre></code></td></tr><tr><td>320</td><td><code><pre></pre></code></td></tr><tr><td>321</td><td><code><pre> },</pre></code></td></tr><tr><td>322</td><td><code><pre> }</pre></code></td></tr><tr><td>323</td><td><code><pre></pre></code></td></tr><tr><td>324</td><td><code><pre> // link ChildDirs</pre></code></td></tr><tr><td>325</td><td><code><pre> dirg.ChildDirs = []*embedded.EmbeddedDir{}</pre></code></td></tr><tr><td>326</td><td><code><pre></pre></code></td></tr><tr><td>327</td><td><code><pre> // register embeddedBox</pre></code></td></tr><tr><td>328</td><td><code><pre> embedded.RegisterEmbeddedBox(`tmpl`, &embedded.EmbeddedBox{</pre></code></td></tr><tr><td>329</td><td><code><pre> Name: `tmpl`,</pre></code></td></tr><tr><td>330</td><td><code><pre> Time: time.Unix(1539400173, 0),</pre></code></td></tr><tr><td>331</td><td><code><pre> Dirs: map[string]*embedded.EmbeddedDir{</pre></code></td></tr><tr><td>332</td><td><code><pre> "": dirg,</pre></code></td></tr><tr><td>333</td><td><code><pre> },</pre></code></td></tr><tr><td>334</td><td><code><pre> Files: map[string]*embedded.EmbeddedFile{</pre></code></td></tr><tr><td>335</td><td><code><pre> "base.html": fileh,</pre></code></td></tr><tr><td>336</td><td><code><pre> "dashboard.html": filei,</pre></code></td></tr><tr><td>337</td><td><code><pre> "error_404.html": filej,</pre></code></td></tr><tr><td>338</td><td><code><pre> "favicon.ico": filek,</pre></code></td></tr><tr><td>339</td><td><code><pre> "footer.html": filel,</pre></code></td></tr><tr><td>340</td><td><code><pre> "form_checkin.html": filem,</pre></code></td></tr><tr><td>341</td><td><code><pre> "form_notifier.html": filen,</pre></code></td></tr><tr><td>342</td><td><code><pre> "form_service.html": fileo,</pre></code></td></tr><tr><td>343</td><td><code><pre> "form_user.html": filep,</pre></code></td></tr><tr><td>344</td><td><code><pre> "head.html": fileq,</pre></code></td></tr><tr><td>345</td><td><code><pre> "help.html": filer,</pre></code></td></tr><tr><td>346</td><td><code><pre> "help.md": files,</pre></code></td></tr><tr><td>347</td><td><code><pre> "index.html": filet,</pre></code></td></tr><tr><td>348</td><td><code><pre> "login.html": fileu,</pre></code></td></tr><tr><td>349</td><td><code><pre> "logs.html": filev,</pre></code></td></tr><tr><td>350</td><td><code><pre> "nav.html": filew,</pre></code></td></tr><tr><td>351</td><td><code><pre> "robots.txt": filex,</pre></code></td></tr><tr><td>352</td><td><code><pre> "scripts.html": filey,</pre></code></td></tr><tr><td>353</td><td><code><pre> "service.html": filez,</pre></code></td></tr><tr><td>354</td><td><code><pre> "services.html": file10,</pre></code></td></tr><tr><td>355</td><td><code><pre> "settings.html": file11,</pre></code></td></tr><tr><td>356</td><td><code><pre> "setup.html": file12,</pre></code></td></tr><tr><td>357</td><td><code><pre> "statup.png": file13,</pre></code></td></tr><tr><td>358</td><td><code><pre> "tray.html": file14,</pre></code></td></tr><tr><td>359</td><td><code><pre> "user.html": file15,</pre></code></td></tr><tr><td>360</td><td><code><pre> "users.html": file16,</pre></code></td></tr><tr><td>361</td><td><code><pre> },</pre></code></td></tr><tr><td>362</td><td><code><pre> })</pre></code></td></tr><tr><td>363</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_CreateAllAssets">func CreateAllAssets</div><div class="info"><a href="#s_fn_CreateAllAssets">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go</code>:</p></div><table class="listing">
|
||
<tr><td>152</td><td><code><pre>func CreateAllAssets(folder string) error {</pre></code></td></tr><tr><td>153</td><td><code><pre> utils.Log(1, fmt.Sprintf("Dump Statup assets into %v/assets", folder))</pre></code></td></tr><tr><td>154</td><td><code><pre> MakePublicFolder(folder + "/assets")</pre></code></td></tr><tr><td>155</td><td><code><pre> MakePublicFolder(folder + "/assets/js")</pre></code></td></tr><tr><td>156</td><td><code><pre> MakePublicFolder(folder + "/assets/css")</pre></code></td></tr><tr><td>157</td><td><code><pre> MakePublicFolder(folder + "/assets/scss")</pre></code></td></tr><tr><td>158</td><td><code><pre> utils.Log(1, "Inserting scss, css, and javascript files into assets folder")</pre></code></td></tr><tr><td>159</td><td><code><pre> CopyToPublic(ScssBox, folder+"/assets/scss", "base.scss")</pre></code></td></tr><tr><td>160</td><td><code><pre> CopyToPublic(ScssBox, folder+"/assets/scss", "variables.scss")</pre></code></td></tr><tr><td>161</td><td><code><pre> CopyToPublic(ScssBox, folder+"/assets/scss", "mobile.scss")</pre></code></td></tr><tr><td>162</td><td><code><pre> CopyToPublic(ScssBox, folder+"/assets/scss", "pikaday.scss")</pre></code></td></tr><tr><td>163</td><td><code><pre> CopyToPublic(CssBox, folder+"/assets/css", "bootstrap.min.css")</pre></code></td></tr><tr><td>164</td><td><code><pre> CopyToPublic(CssBox, folder+"/assets/css", "base.css")</pre></code></td></tr><tr><td>165</td><td><code><pre> //CopyToPublic(JsBox, folder+"/assets/js", "bootstrap.min.js")</pre></code></td></tr><tr><td>166</td><td><code><pre> //CopyToPublic(JsBox, folder+"/assets/js", "Chart.bundle.min.js")</pre></code></td></tr><tr><td>167</td><td><code><pre> //CopyToPublic(JsBox, folder+"/assets/js", "jquery-3.3.1.min.js")</pre></code></td></tr><tr><td>168</td><td><code><pre> //CopyToPublic(JsBox, folder+"/assets/js", "sortable.min.js")</pre></code></td></tr><tr><td>169</td><td><code><pre> //CopyToPublic(JsBox, folder+"/assets/js", "main.js")</pre></code></td></tr><tr><td>170</td><td><code><pre> //CopyToPublic(JsBox, folder+"/assets/js", "setup.js")</pre></code></td></tr><tr><td>171</td><td><code><pre> CopyToPublic(TmplBox, folder+"/assets", "robots.txt")</pre></code></td></tr><tr><td>172</td><td><code><pre> CopyToPublic(TmplBox, folder+"/assets", "statup.png")</pre></code></td></tr><tr><td>173</td><td><code><pre> utils.Log(1, "Compiling CSS from SCSS style...")</pre></code></td></tr><tr><td>174</td><td><code><pre> err := utils.Log(1, "Statup assets have been inserted")</pre></code></td></tr><tr><td>175</td><td><code><pre> return err</pre></code></td></tr><tr><td>176</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_init">func init</div><div class="info"><a href="#s_fn_init">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/rice-box.go</code>:</p></div><table class="listing">
|
||
<tr><td>64</td><td><code><pre>func init() {</pre></code></td></tr><tr><td>65</td><td><code><pre></pre></code></td></tr><tr><td>66</td><td><code><pre> // define files</pre></code></td></tr><tr><td>67</td><td><code><pre> file7 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>68</td><td><code><pre> Filename: "Chart.bundle.min.js",</pre></code></td></tr><tr><td>69</td><td><code><pre> FileModTime: time.Unix(1528732500, 0),</pre></code></td></tr><tr><td>70</td><td><code><pre> 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)});"),</pre></code></td></tr><tr><td>71</td><td><code><pre> }</pre></code></td></tr><tr><td>72</td><td><code><pre> file8 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>73</td><td><code><pre> Filename: "bootstrap.min.js",</pre></code></td></tr><tr><td>74</td><td><code><pre> FileModTime: time.Unix(1528732500, 0),</pre></code></td></tr><tr><td>75</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>76</td><td><code><pre> }</pre></code></td></tr><tr><td>77</td><td><code><pre> file9 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>78</td><td><code><pre> Filename: "chart_index.js",</pre></code></td></tr><tr><td>79</td><td><code><pre> FileModTime: time.Unix(1538522004, 0),</pre></code></td></tr><tr><td>80</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>81</td><td><code><pre> }</pre></code></td></tr><tr><td>82</td><td><code><pre> filea := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>83</td><td><code><pre> Filename: "charts.js",</pre></code></td></tr><tr><td>84</td><td><code><pre> FileModTime: time.Unix(1538579801, 0),</pre></code></td></tr><tr><td>85</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>86</td><td><code><pre> }</pre></code></td></tr><tr><td>87</td><td><code><pre> fileb := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>88</td><td><code><pre> Filename: "jquery-3.3.1.min.js",</pre></code></td></tr><tr><td>89</td><td><code><pre> FileModTime: time.Unix(1534926456, 0),</pre></code></td></tr><tr><td>90</td><td><code><pre> 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});"),</pre></code></td></tr><tr><td>91</td><td><code><pre> }</pre></code></td></tr><tr><td>92</td><td><code><pre> filec := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>93</td><td><code><pre> Filename: "main.js",</pre></code></td></tr><tr><td>94</td><td><code><pre> FileModTime: time.Unix(1538894434, 0),</pre></code></td></tr><tr><td>95</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>96</td><td><code><pre> }</pre></code></td></tr><tr><td>97</td><td><code><pre> filed := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>98</td><td><code><pre> Filename: "pikaday.js",</pre></code></td></tr><tr><td>99</td><td><code><pre> FileModTime: time.Unix(1537243030, 0),</pre></code></td></tr><tr><td>100</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>101</td><td><code><pre> }</pre></code></td></tr><tr><td>102</td><td><code><pre> filee := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>103</td><td><code><pre> Filename: "setup.js",</pre></code></td></tr><tr><td>104</td><td><code><pre> FileModTime: time.Unix(1534396043, 0),</pre></code></td></tr><tr><td>105</td><td><code><pre> 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});"),</pre></code></td></tr><tr><td>106</td><td><code><pre> }</pre></code></td></tr><tr><td>107</td><td><code><pre> filef := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>108</td><td><code><pre> Filename: "sortable.min.js",</pre></code></td></tr><tr><td>109</td><td><code><pre> FileModTime: time.Unix(1538283453, 0),</pre></code></td></tr><tr><td>110</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>111</td><td><code><pre> }</pre></code></td></tr><tr><td>112</td><td><code><pre></pre></code></td></tr><tr><td>113</td><td><code><pre> // define dirs</pre></code></td></tr><tr><td>114</td><td><code><pre> dir6 := &embedded.EmbeddedDir{</pre></code></td></tr><tr><td>115</td><td><code><pre> Filename: "",</pre></code></td></tr><tr><td>116</td><td><code><pre> DirModTime: time.Unix(1538894434, 0),</pre></code></td></tr><tr><td>117</td><td><code><pre> ChildFiles: []*embedded.EmbeddedFile{</pre></code></td></tr><tr><td>118</td><td><code><pre> file7, // "Chart.bundle.min.js"</pre></code></td></tr><tr><td>119</td><td><code><pre> file8, // "bootstrap.min.js"</pre></code></td></tr><tr><td>120</td><td><code><pre> file9, // "chart_index.js"</pre></code></td></tr><tr><td>121</td><td><code><pre> filea, // "charts.js"</pre></code></td></tr><tr><td>122</td><td><code><pre> fileb, // "jquery-3.3.1.min.js"</pre></code></td></tr><tr><td>123</td><td><code><pre> filec, // "main.js"</pre></code></td></tr><tr><td>124</td><td><code><pre> filed, // "pikaday.js"</pre></code></td></tr><tr><td>125</td><td><code><pre> filee, // "setup.js"</pre></code></td></tr><tr><td>126</td><td><code><pre> filef, // "sortable.min.js"</pre></code></td></tr><tr><td>127</td><td><code><pre></pre></code></td></tr><tr><td>128</td><td><code><pre> },</pre></code></td></tr><tr><td>129</td><td><code><pre> }</pre></code></td></tr><tr><td>130</td><td><code><pre></pre></code></td></tr><tr><td>131</td><td><code><pre> // link ChildDirs</pre></code></td></tr><tr><td>132</td><td><code><pre> dir6.ChildDirs = []*embedded.EmbeddedDir{}</pre></code></td></tr><tr><td>133</td><td><code><pre></pre></code></td></tr><tr><td>134</td><td><code><pre> // register embeddedBox</pre></code></td></tr><tr><td>135</td><td><code><pre> embedded.RegisterEmbeddedBox(`js`, &embedded.EmbeddedBox{</pre></code></td></tr><tr><td>136</td><td><code><pre> Name: `js`,</pre></code></td></tr><tr><td>137</td><td><code><pre> Time: time.Unix(1538894434, 0),</pre></code></td></tr><tr><td>138</td><td><code><pre> Dirs: map[string]*embedded.EmbeddedDir{</pre></code></td></tr><tr><td>139</td><td><code><pre> "": dir6,</pre></code></td></tr><tr><td>140</td><td><code><pre> },</pre></code></td></tr><tr><td>141</td><td><code><pre> Files: map[string]*embedded.EmbeddedFile{</pre></code></td></tr><tr><td>142</td><td><code><pre> "Chart.bundle.min.js": file7,</pre></code></td></tr><tr><td>143</td><td><code><pre> "bootstrap.min.js": file8,</pre></code></td></tr><tr><td>144</td><td><code><pre> "chart_index.js": file9,</pre></code></td></tr><tr><td>145</td><td><code><pre> "charts.js": filea,</pre></code></td></tr><tr><td>146</td><td><code><pre> "jquery-3.3.1.min.js": fileb,</pre></code></td></tr><tr><td>147</td><td><code><pre> "main.js": filec,</pre></code></td></tr><tr><td>148</td><td><code><pre> "pikaday.js": filed,</pre></code></td></tr><tr><td>149</td><td><code><pre> "setup.js": filee,</pre></code></td></tr><tr><td>150</td><td><code><pre> "sortable.min.js": filef,</pre></code></td></tr><tr><td>151</td><td><code><pre> },</pre></code></td></tr><tr><td>152</td><td><code><pre> })</pre></code></td></tr><tr><td>153</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_init">func init</div><div class="info"><a href="#s_fn_init">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/rice-box.go</code>:</p></div><table class="listing">
|
||
<tr><td>8</td><td><code><pre>func init() {</pre></code></td></tr><tr><td>9</td><td><code><pre></pre></code></td></tr><tr><td>10</td><td><code><pre> // define files</pre></code></td></tr><tr><td>11</td><td><code><pre> file2 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>12</td><td><code><pre> Filename: "base.scss",</pre></code></td></tr><tr><td>13</td><td><code><pre> FileModTime: time.Unix(1538106377, 0),</pre></code></td></tr><tr><td>14</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>15</td><td><code><pre> }</pre></code></td></tr><tr><td>16</td><td><code><pre> file3 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>17</td><td><code><pre> Filename: "mobile.scss",</pre></code></td></tr><tr><td>18</td><td><code><pre> FileModTime: time.Unix(1538106377, 0),</pre></code></td></tr><tr><td>19</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>20</td><td><code><pre> }</pre></code></td></tr><tr><td>21</td><td><code><pre> file4 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>22</td><td><code><pre> Filename: "pikaday.scss",</pre></code></td></tr><tr><td>23</td><td><code><pre> FileModTime: time.Unix(1537243356, 0),</pre></code></td></tr><tr><td>24</td><td><code><pre> 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}"),</pre></code></td></tr><tr><td>25</td><td><code><pre> }</pre></code></td></tr><tr><td>26</td><td><code><pre> file5 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>27</td><td><code><pre> Filename: "variables.scss",</pre></code></td></tr><tr><td>28</td><td><code><pre> FileModTime: time.Unix(1537299527, 0),</pre></code></td></tr><tr><td>29</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>30</td><td><code><pre> }</pre></code></td></tr><tr><td>31</td><td><code><pre></pre></code></td></tr><tr><td>32</td><td><code><pre> // define dirs</pre></code></td></tr><tr><td>33</td><td><code><pre> dir1 := &embedded.EmbeddedDir{</pre></code></td></tr><tr><td>34</td><td><code><pre> Filename: "",</pre></code></td></tr><tr><td>35</td><td><code><pre> DirModTime: time.Unix(1538106377, 0),</pre></code></td></tr><tr><td>36</td><td><code><pre> ChildFiles: []*embedded.EmbeddedFile{</pre></code></td></tr><tr><td>37</td><td><code><pre> file2, // "base.scss"</pre></code></td></tr><tr><td>38</td><td><code><pre> file3, // "mobile.scss"</pre></code></td></tr><tr><td>39</td><td><code><pre> file4, // "pikaday.scss"</pre></code></td></tr><tr><td>40</td><td><code><pre> file5, // "variables.scss"</pre></code></td></tr><tr><td>41</td><td><code><pre></pre></code></td></tr><tr><td>42</td><td><code><pre> },</pre></code></td></tr><tr><td>43</td><td><code><pre> }</pre></code></td></tr><tr><td>44</td><td><code><pre></pre></code></td></tr><tr><td>45</td><td><code><pre> // link ChildDirs</pre></code></td></tr><tr><td>46</td><td><code><pre> dir1.ChildDirs = []*embedded.EmbeddedDir{}</pre></code></td></tr><tr><td>47</td><td><code><pre></pre></code></td></tr><tr><td>48</td><td><code><pre> // register embeddedBox</pre></code></td></tr><tr><td>49</td><td><code><pre> embedded.RegisterEmbeddedBox(`scss`, &embedded.EmbeddedBox{</pre></code></td></tr><tr><td>50</td><td><code><pre> Name: `scss`,</pre></code></td></tr><tr><td>51</td><td><code><pre> Time: time.Unix(1538106377, 0),</pre></code></td></tr><tr><td>52</td><td><code><pre> Dirs: map[string]*embedded.EmbeddedDir{</pre></code></td></tr><tr><td>53</td><td><code><pre> "": dir1,</pre></code></td></tr><tr><td>54</td><td><code><pre> },</pre></code></td></tr><tr><td>55</td><td><code><pre> Files: map[string]*embedded.EmbeddedFile{</pre></code></td></tr><tr><td>56</td><td><code><pre> "base.scss": file2,</pre></code></td></tr><tr><td>57</td><td><code><pre> "mobile.scss": file3,</pre></code></td></tr><tr><td>58</td><td><code><pre> "pikaday.scss": file4,</pre></code></td></tr><tr><td>59</td><td><code><pre> "variables.scss": file5,</pre></code></td></tr><tr><td>60</td><td><code><pre> },</pre></code></td></tr><tr><td>61</td><td><code><pre> })</pre></code></td></tr><tr><td>62</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_init">func init</div><div class="info"><a href="#s_fn_init">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/rice-box.go</code>:</p></div><table class="listing">
|
||
<tr><td>365</td><td><code><pre>func init() {</pre></code></td></tr><tr><td>366</td><td><code><pre></pre></code></td></tr><tr><td>367</td><td><code><pre> // define files</pre></code></td></tr><tr><td>368</td><td><code><pre> file18 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>369</td><td><code><pre> Filename: "base.css",</pre></code></td></tr><tr><td>370</td><td><code><pre> FileModTime: time.Unix(1539641084, 0),</pre></code></td></tr><tr><td>371</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>372</td><td><code><pre> }</pre></code></td></tr><tr><td>373</td><td><code><pre> file19 := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>374</td><td><code><pre> Filename: "base.css.map",</pre></code></td></tr><tr><td>375</td><td><code><pre> FileModTime: time.Unix(1539641085, 0),</pre></code></td></tr><tr><td>376</td><td><code><pre> 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"),</pre></code></td></tr><tr><td>377</td><td><code><pre> }</pre></code></td></tr><tr><td>378</td><td><code><pre> file1a := &embedded.EmbeddedFile{</pre></code></td></tr><tr><td>379</td><td><code><pre> Filename: "bootstrap.min.css",</pre></code></td></tr><tr><td>380</td><td><code><pre> FileModTime: time.Unix(1530208361, 0),</pre></code></td></tr><tr><td>381</td><td><code><pre> 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 */"),</pre></code></td></tr><tr><td>382</td><td><code><pre> }</pre></code></td></tr><tr><td>383</td><td><code><pre></pre></code></td></tr><tr><td>384</td><td><code><pre> // define dirs</pre></code></td></tr><tr><td>385</td><td><code><pre> dir17 := &embedded.EmbeddedDir{</pre></code></td></tr><tr><td>386</td><td><code><pre> Filename: "",</pre></code></td></tr><tr><td>387</td><td><code><pre> DirModTime: time.Unix(1538106376, 0),</pre></code></td></tr><tr><td>388</td><td><code><pre> ChildFiles: []*embedded.EmbeddedFile{</pre></code></td></tr><tr><td>389</td><td><code><pre> file18, // "base.css"</pre></code></td></tr><tr><td>390</td><td><code><pre> file19, // "base.css.map"</pre></code></td></tr><tr><td>391</td><td><code><pre> file1a, // "bootstrap.min.css"</pre></code></td></tr><tr><td>392</td><td><code><pre></pre></code></td></tr><tr><td>393</td><td><code><pre> },</pre></code></td></tr><tr><td>394</td><td><code><pre> }</pre></code></td></tr><tr><td>395</td><td><code><pre></pre></code></td></tr><tr><td>396</td><td><code><pre> // link ChildDirs</pre></code></td></tr><tr><td>397</td><td><code><pre> dir17.ChildDirs = []*embedded.EmbeddedDir{}</pre></code></td></tr><tr><td>398</td><td><code><pre></pre></code></td></tr><tr><td>399</td><td><code><pre> // register embeddedBox</pre></code></td></tr><tr><td>400</td><td><code><pre> embedded.RegisterEmbeddedBox(`css`, &embedded.EmbeddedBox{</pre></code></td></tr><tr><td>401</td><td><code><pre> Name: `css`,</pre></code></td></tr><tr><td>402</td><td><code><pre> Time: time.Unix(1538106376, 0),</pre></code></td></tr><tr><td>403</td><td><code><pre> Dirs: map[string]*embedded.EmbeddedDir{</pre></code></td></tr><tr><td>404</td><td><code><pre> "": dir17,</pre></code></td></tr><tr><td>405</td><td><code><pre> },</pre></code></td></tr><tr><td>406</td><td><code><pre> Files: map[string]*embedded.EmbeddedFile{</pre></code></td></tr><tr><td>407</td><td><code><pre> "base.css": file18,</pre></code></td></tr><tr><td>408</td><td><code><pre> "base.css.map": file19,</pre></code></td></tr><tr><td>409</td><td><code><pre> "bootstrap.min.css": file1a,</pre></code></td></tr><tr><td>410</td><td><code><pre> },</pre></code></td></tr><tr><td>411</td><td><code><pre> })</pre></code></td></tr><tr><td>412</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Assets">func Assets</div><div class="info"><a href="#s_fn_Assets">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go</code>:</p></div><table class="listing">
|
||
<tr><td>38</td><td><code><pre>func Assets() {</pre></code></td></tr><tr><td>39</td><td><code><pre> CssBox = rice.MustFindBox("css")</pre></code></td></tr><tr><td>40</td><td><code><pre> ScssBox = rice.MustFindBox("scss")</pre></code></td></tr><tr><td>41</td><td><code><pre> JsBox = rice.MustFindBox("js")</pre></code></td></tr><tr><td>42</td><td><code><pre> TmplBox = rice.MustFindBox("tmpl")</pre></code></td></tr><tr><td>43</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@79:5">func @79:5</div><div class="info"><a href="#s_fn_@79:5">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go</code>:</p></div><table class="listing">
|
||
<tr><td>79</td><td><code><pre>func() {</pre></code></td></tr><tr><td>80</td><td><code><pre> stdout, errStdout = copyAndCapture(os.Stdout, stdoutIn)</pre></code></td></tr><tr><td>81</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@83:5">func @83:5</div><div class="info"><a href="#s_fn_@83:5">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go</code>:</p></div><table class="listing">
|
||
<tr><td>83</td><td><code><pre>func() {</pre></code></td></tr><tr><td>84</td><td><code><pre> stderr, errStderr = copyAndCapture(os.Stderr, stderrIn)</pre></code></td></tr><tr><td>85</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_CompileSASS">func CompileSASS</div><div class="info"><a href="#s_fn_CompileSASS">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go</code>:</p></div><table class="listing">
|
||
<tr><td>57</td><td><code><pre>func CompileSASS(folder string) error {</pre></code></td></tr><tr><td>58</td><td><code><pre> sassBin := os.Getenv("SASS")</pre></code></td></tr><tr><td>59</td><td><code><pre> if sassBin == "" {</pre></code></td></tr><tr class="miss"><td>60</td><td><code><pre> sassBin = "sass"</pre></code></td></tr><tr><td>61</td><td><code><pre> }</pre></code></td></tr><tr><td>62</td><td><code><pre></pre></code></td></tr><tr><td>63</td><td><code><pre> scssFile := fmt.Sprintf("%v/%v", folder, "assets/scss/base.scss")</pre></code></td></tr><tr><td>64</td><td><code><pre> baseFile := fmt.Sprintf("%v/%v", folder, "assets/css/base.css")</pre></code></td></tr><tr><td>65</td><td><code><pre></pre></code></td></tr><tr><td>66</td><td><code><pre> utils.Log(1, fmt.Sprintf("Compiling SASS %v into %v", scssFile, baseFile))</pre></code></td></tr><tr><td>67</td><td><code><pre> command := fmt.Sprintf("%v %v %v", sassBin, scssFile, baseFile)</pre></code></td></tr><tr><td>68</td><td><code><pre></pre></code></td></tr><tr><td>69</td><td><code><pre> utils.Log(1, fmt.Sprintf("Command: sh -c %v", command))</pre></code></td></tr><tr><td>70</td><td><code><pre></pre></code></td></tr><tr><td>71</td><td><code><pre> testCmd := exec.Command("sh", "-c", command)</pre></code></td></tr><tr><td>72</td><td><code><pre></pre></code></td></tr><tr><td>73</td><td><code><pre> var stdout, stderr []byte</pre></code></td></tr><tr><td>74</td><td><code><pre> var errStdout, errStderr error</pre></code></td></tr><tr><td>75</td><td><code><pre> stdoutIn, _ := testCmd.StdoutPipe()</pre></code></td></tr><tr><td>76</td><td><code><pre> stderrIn, _ := testCmd.StderrPipe()</pre></code></td></tr><tr><td>77</td><td><code><pre> testCmd.Start()</pre></code></td></tr><tr><td>78</td><td><code><pre></pre></code></td></tr><tr><td>79</td><td><code><pre> go func() {</pre></code></td></tr><tr><td>80</td><td><code><pre> stdout, errStdout = copyAndCapture(os.Stdout, stdoutIn)</pre></code></td></tr><tr><td>81</td><td><code><pre> }()</pre></code></td></tr><tr><td>82</td><td><code><pre></pre></code></td></tr><tr><td>83</td><td><code><pre> go func() {</pre></code></td></tr><tr><td>84</td><td><code><pre> stderr, errStderr = copyAndCapture(os.Stderr, stderrIn)</pre></code></td></tr><tr><td>85</td><td><code><pre> }()</pre></code></td></tr><tr><td>86</td><td><code><pre></pre></code></td></tr><tr><td>87</td><td><code><pre> err := testCmd.Wait()</pre></code></td></tr><tr><td>88</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>89</td><td><code><pre> utils.Log(3, err)</pre></code></td></tr><tr class="miss"><td>90</td><td><code><pre> return err</pre></code></td></tr><tr><td>91</td><td><code><pre> }</pre></code></td></tr><tr><td>92</td><td><code><pre></pre></code></td></tr><tr><td>93</td><td><code><pre> if errStdout != nil || errStderr != nil {</pre></code></td></tr><tr class="miss"><td>94</td><td><code><pre> utils.Log(3, fmt.Sprintf("Failed to compile assets with SASS %v", err))</pre></code></td></tr><tr class="miss"><td>95</td><td><code><pre> return errors.New("failed to capture stdout or stderr")</pre></code></td></tr><tr><td>96</td><td><code><pre> }</pre></code></td></tr><tr><td>97</td><td><code><pre></pre></code></td></tr><tr><td>98</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>99</td><td><code><pre> utils.Log(3, fmt.Sprintf("Failed to compile assets with SASS %v", err))</pre></code></td></tr><tr class="miss"><td>100</td><td><code><pre> utils.Log(3, fmt.Sprintf("bash -c %v %v %v", sassBin, scssFile, baseFile))</pre></code></td></tr><tr class="miss"><td>101</td><td><code><pre> return err</pre></code></td></tr><tr><td>102</td><td><code><pre> }</pre></code></td></tr><tr><td>103</td><td><code><pre></pre></code></td></tr><tr><td>104</td><td><code><pre> outStr, errStr := string(stdout), string(stderr)</pre></code></td></tr><tr><td>105</td><td><code><pre> utils.Log(1, fmt.Sprintf("out: %v | error: %v", outStr, errStr))</pre></code></td></tr><tr><td>106</td><td><code><pre> utils.Log(1, "SASS Compiling is complete!")</pre></code></td></tr><tr><td>107</td><td><code><pre> return err</pre></code></td></tr><tr><td>108</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_MakePublicFolder">func MakePublicFolder</div><div class="info"><a href="#s_fn_MakePublicFolder">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go</code>:</p></div><table class="listing">
|
||
<tr><td>207</td><td><code><pre>func MakePublicFolder(folder string) error {</pre></code></td></tr><tr><td>208</td><td><code><pre> utils.Log(1, fmt.Sprintf("Creating folder '%v'", folder))</pre></code></td></tr><tr><td>209</td><td><code><pre> if _, err := os.Stat(folder); os.IsNotExist(err) {</pre></code></td></tr><tr><td>210</td><td><code><pre> err = os.MkdirAll(folder, 0777)</pre></code></td></tr><tr><td>211</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>212</td><td><code><pre> utils.Log(3, fmt.Sprintf("Failed to created %v directory, %v", folder, err))</pre></code></td></tr><tr class="miss"><td>213</td><td><code><pre> return err</pre></code></td></tr><tr><td>214</td><td><code><pre> }</pre></code></td></tr><tr><td>215</td><td><code><pre> }</pre></code></td></tr><tr><td>216</td><td><code><pre> return nil</pre></code></td></tr><tr><td>217</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_SaveAsset">func SaveAsset</div><div class="info"><a href="#s_fn_SaveAsset">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go</code>:</p></div><table class="listing">
|
||
<tr><td>131</td><td><code><pre>func SaveAsset(data []byte, folder, file string) error {</pre></code></td></tr><tr><td>132</td><td><code><pre> utils.Log(1, fmt.Sprintf("Saving %v/%v into assets folder", folder, file))</pre></code></td></tr><tr><td>133</td><td><code><pre> err := ioutil.WriteFile(folder+"/assets/"+file, data, 0744)</pre></code></td></tr><tr><td>134</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>135</td><td><code><pre> utils.Log(3, fmt.Sprintf("Failed to save %v/%v, %v", folder, file, err))</pre></code></td></tr><tr class="miss"><td>136</td><td><code><pre> return err</pre></code></td></tr><tr><td>137</td><td><code><pre> }</pre></code></td></tr><tr><td>138</td><td><code><pre> return nil</pre></code></td></tr><tr><td>139</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DeleteAllAssets">func DeleteAllAssets</div><div class="info"><a href="#s_fn_DeleteAllAssets">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go</code>:</p></div><table class="listing">
|
||
<tr><td>179</td><td><code><pre>func DeleteAllAssets(folder string) error {</pre></code></td></tr><tr><td>180</td><td><code><pre> err := os.RemoveAll(folder + "/assets")</pre></code></td></tr><tr><td>181</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>182</td><td><code><pre> utils.Log(1, fmt.Sprintf("There was an issue deleting Statup Assets, %v", err))</pre></code></td></tr><tr class="miss"><td>183</td><td><code><pre> return err</pre></code></td></tr><tr><td>184</td><td><code><pre> }</pre></code></td></tr><tr><td>185</td><td><code><pre> utils.Log(1, "Statup assets have been deleted")</pre></code></td></tr><tr><td>186</td><td><code><pre> return err</pre></code></td></tr><tr><td>187</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_copyAndCapture">func copyAndCapture</div><div class="info"><a href="#s_fn_copyAndCapture">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go</code>:</p></div><table class="listing">
|
||
<tr><td>220</td><td><code><pre>func copyAndCapture(w io.Writer, r io.Reader) ([]byte, error) {</pre></code></td></tr><tr><td>221</td><td><code><pre> var out []byte</pre></code></td></tr><tr><td>222</td><td><code><pre> buf := make([]byte, 1024, 1024)</pre></code></td></tr><tr><td>223</td><td><code><pre> for {</pre></code></td></tr><tr><td>224</td><td><code><pre> n, err := r.Read(buf[:])</pre></code></td></tr><tr><td>225</td><td><code><pre> if n > 0 {</pre></code></td></tr><tr class="miss"><td>226</td><td><code><pre> d := buf[:n]</pre></code></td></tr><tr class="miss"><td>227</td><td><code><pre> out = append(out, d...)</pre></code></td></tr><tr class="miss"><td>228</td><td><code><pre> _, err := w.Write(d)</pre></code></td></tr><tr class="miss"><td>229</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>230</td><td><code><pre> return out, err</pre></code></td></tr><tr><td>231</td><td><code><pre> }</pre></code></td></tr><tr><td>232</td><td><code><pre> }</pre></code></td></tr><tr><td>233</td><td><code><pre> if err != nil {</pre></code></td></tr><tr><td>234</td><td><code><pre> // Read returns io.EOF at the end of file, which is not an error for us</pre></code></td></tr><tr><td>235</td><td><code><pre> if err == io.EOF {</pre></code></td></tr><tr><td>236</td><td><code><pre> err = nil</pre></code></td></tr><tr><td>237</td><td><code><pre> }</pre></code></td></tr><tr><td>238</td><td><code><pre> return out, err</pre></code></td></tr><tr><td>239</td><td><code><pre> }</pre></code></td></tr><tr><td>240</td><td><code><pre> }</pre></code></td></tr><tr><td>241</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_CopyToPublic">func CopyToPublic</div><div class="info"><a href="#s_fn_CopyToPublic">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go</code>:</p></div><table class="listing">
|
||
<tr><td>190</td><td><code><pre>func CopyToPublic(box *rice.Box, folder, file string) error {</pre></code></td></tr><tr><td>191</td><td><code><pre> assetFolder := fmt.Sprintf("%v/%v", folder, file)</pre></code></td></tr><tr><td>192</td><td><code><pre> utils.Log(1, fmt.Sprintf("Copying %v to %v", file, assetFolder))</pre></code></td></tr><tr><td>193</td><td><code><pre> base, err := box.String(file)</pre></code></td></tr><tr><td>194</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>195</td><td><code><pre> utils.Log(3, fmt.Sprintf("Failed to copy %v to %v, %v.", file, assetFolder, err))</pre></code></td></tr><tr class="miss"><td>196</td><td><code><pre> return err</pre></code></td></tr><tr><td>197</td><td><code><pre> }</pre></code></td></tr><tr><td>198</td><td><code><pre> err = ioutil.WriteFile(assetFolder, []byte(base), 0744)</pre></code></td></tr><tr><td>199</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>200</td><td><code><pre> utils.Log(3, fmt.Sprintf("Failed to write file %v to %v, %v.", file, assetFolder, err))</pre></code></td></tr><tr class="miss"><td>201</td><td><code><pre> return err</pre></code></td></tr><tr><td>202</td><td><code><pre> }</pre></code></td></tr><tr><td>203</td><td><code><pre> return nil</pre></code></td></tr><tr><td>204</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_OpenAsset">func OpenAsset</div><div class="info"><a href="#s_fn_OpenAsset">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go</code>:</p></div><table class="listing">
|
||
<tr><td>142</td><td><code><pre>func OpenAsset(folder, file string) string {</pre></code></td></tr><tr><td>143</td><td><code><pre> dat, err := ioutil.ReadFile(folder + "/assets/" + file)</pre></code></td></tr><tr><td>144</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>145</td><td><code><pre> utils.Log(3, fmt.Sprintf("Failed to open %v, %v", file, err))</pre></code></td></tr><tr class="miss"><td>146</td><td><code><pre> return ""</pre></code></td></tr><tr><td>147</td><td><code><pre> }</pre></code></td></tr><tr><td>148</td><td><code><pre> return string(dat)</pre></code></td></tr><tr><td>149</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_UsingAssets">func UsingAssets</div><div class="info"><a href="#s_fn_UsingAssets">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go</code>:</p></div><table class="listing">
|
||
<tr><td>111</td><td><code><pre>func UsingAssets(folder string) bool {</pre></code></td></tr><tr><td>112</td><td><code><pre> if _, err := os.Stat(folder + "/assets"); err == nil {</pre></code></td></tr><tr><td>113</td><td><code><pre> return true</pre></code></td></tr><tr><td>114</td><td><code><pre> } else {</pre></code></td></tr><tr><td>115</td><td><code><pre> if os.Getenv("USE_ASSETS") == "true" {</pre></code></td></tr><tr class="miss"><td>116</td><td><code><pre> utils.Log(1, "Environment variable USE_ASSETS was found.")</pre></code></td></tr><tr class="miss"><td>117</td><td><code><pre> CreateAllAssets(folder)</pre></code></td></tr><tr class="miss"><td>118</td><td><code><pre> err := CompileSASS(folder)</pre></code></td></tr><tr class="miss"><td>119</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>120</td><td><code><pre> CopyToPublic(CssBox, folder+"/css", "base.css")</pre></code></td></tr><tr class="miss"><td>121</td><td><code><pre> utils.Log(2, "Default 'base.css' was insert because SASS did not work.")</pre></code></td></tr><tr class="miss"><td>122</td><td><code><pre> return true</pre></code></td></tr><tr><td>123</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>124</td><td><code><pre> return true</pre></code></td></tr><tr><td>125</td><td><code><pre> }</pre></code></td></tr><tr><td>126</td><td><code><pre> }</pre></code></td></tr><tr><td>127</td><td><code><pre> return false</pre></code></td></tr><tr><td>128</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_HelpMarkdown">func HelpMarkdown</div><div class="info"><a href="#s_fn_HelpMarkdown">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/source/source.go</code>:</p></div><table class="listing">
|
||
<tr><td>46</td><td><code><pre>func HelpMarkdown() string {</pre></code></td></tr><tr class="miss"><td>47</td><td><code><pre> helpSrc, err := TmplBox.Bytes("help.md")</pre></code></td></tr><tr class="miss"><td>48</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>49</td><td><code><pre> utils.Log(4, err)</pre></code></td></tr><tr class="miss"><td>50</td><td><code><pre> return "error generating markdown"</pre></code></td></tr><tr><td>51</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>52</td><td><code><pre> output := blackfriday.Run(helpSrc)</pre></code></td></tr><tr class="miss"><td>53</td><td><code><pre> return string(output)</pre></code></td></tr><tr><td>54</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<!-- Can be parsed by external script
|
||
PACKAGE:github.com/hunterlong/statup/source DONE:77.71
|
||
-->
|
||
|
||
<div id="pkg_github.com/hunterlong/statup/utils" class="funcname">Package Overview: github.com/hunterlong/statup/utils <span class="packageTotal">54.76%</span></div><p>This is a coverage report created after analysis of the <code>github.com/hunterlong/statup/utils</code> package. It
|
||
has been generated with the following command:</p><pre class="cmd">gocov test github.com/hunterlong/statup/utils | gocov-html</pre> <p>Here are the stats. Please select a function name to view its implementation and see what's left for testing.</p><table class="overview">
|
||
<tr id="s_fn_Log"><td><code><a href="#fn_Log">Log(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/log.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>16/16</code></td></tr>
|
||
<tr id="s_fn_UnderScoreString"><td><code><a href="#fn_UnderScoreString">UnderScoreString(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>10/10</code></td></tr>
|
||
<tr id="s_fn_NewSHA1Hash"><td><code><a href="#fn_NewSHA1Hash">NewSHA1Hash(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/encryption.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>8/8</code></td></tr>
|
||
<tr id="s_fn_RandomString"><td><code><a href="#fn_RandomString">RandomString(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/encryption.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>5/5</code></td></tr>
|
||
<tr id="s_fn_DeleteFile"><td><code><a href="#fn_DeleteFile">DeleteFile(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>5/5</code></td></tr>
|
||
<tr id="s_fn_newLogRow"><td><code><a href="#fn_newLogRow">newLogRow(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/log.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_Http"><td><code><a href="#fn_Http">Http(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/log.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_Timezoner"><td><code><a href="#fn_Timezoner">Timezoner(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>4/4</code></td></tr>
|
||
<tr id="s_fn_rotate"><td><code><a href="#fn_rotate">rotate(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/log.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_@84:5"><td><code><a href="#fn_@84:5">@84:5(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/log.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>3/3</code></td></tr>
|
||
<tr id="s_fn_Timestamp.Ago"><td><code><a href="#fn_Timestamp.Ago">Timestamp.Ago(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_StringInt"><td><code><a href="#fn_StringInt">StringInt(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_HashPassword"><td><code><a href="#fn_HashPassword">HashPassword(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/encryption.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>2/2</code></td></tr>
|
||
<tr id="s_fn_DeleteDirectory"><td><code><a href="#fn_DeleteDirectory">DeleteDirectory(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_rev"><td><code><a href="#fn_rev">rev(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/time.go</code></td><td class="percent"><code>100.00%</code></td><td class="linecount"><code>1/1</code></td></tr>
|
||
<tr id="s_fn_pushLastLine"><td><code><a href="#fn_pushLastLine">pushLastLine(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/log.go</code></td><td class="percent"><code>80.00%</code></td><td class="linecount"><code>4/5</code></td></tr>
|
||
<tr id="s_fn_InitLogs"><td><code><a href="#fn_InitLogs">InitLogs(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/log.go</code></td><td class="percent"><code>76.92%</code></td><td class="linecount"><code>10/13</code></td></tr>
|
||
<tr id="s_fn_init"><td><code><a href="#fn_init">init(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>66.67%</code></td><td class="linecount"><code>2/3</code></td></tr>
|
||
<tr id="s_fn_createLog"><td><code><a href="#fn_createLog">createLog(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/log.go</code></td><td class="percent"><code>63.64%</code></td><td class="linecount"><code>7/11</code></td></tr>
|
||
<tr id="s_fn_FileExists"><td><code><a href="#fn_FileExists">FileExists(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>50.00%</code></td><td class="linecount"><code>2/4</code></td></tr>
|
||
<tr id="s_fn_DurationReadable"><td><code><a href="#fn_DurationReadable">DurationReadable(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>42.86%</code></td><td class="linecount"><code>3/7</code></td></tr>
|
||
<tr id="s_fn_FormatDuration"><td><code><a href="#fn_FormatDuration">FormatDuration(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/time.go</code></td><td class="percent"><code>37.50%</code></td><td class="linecount"><code>15/40</code></td></tr>
|
||
<tr id="s_fn_ToString"><td><code><a href="#fn_ToString">ToString(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>25.00%</code></td><td class="linecount"><code>2/8</code></td></tr>
|
||
<tr id="s_fn_Command"><td><code><a href="#fn_Command">Command(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/16</code></td></tr>
|
||
<tr id="s_fn_copyAndCapture"><td><code><a href="#fn_copyAndCapture">copyAndCapture(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/14</code></td></tr>
|
||
<tr id="s_fn_GetLastLine"><td><code><a href="#fn_GetLastLine">GetLastLine(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/log.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/5</code></td></tr>
|
||
<tr id="s_fn_LogRow.lineAsString"><td><code><a href="#fn_LogRow.lineAsString">LogRow.lineAsString(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/log.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/5</code></td></tr>
|
||
<tr id="s_fn_dir"><td><code><a href="#fn_dir">dir(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/4</code></td></tr>
|
||
<tr id="s_fn_SaveFile"><td><code><a href="#fn_SaveFile">SaveFile(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/2</code></td></tr>
|
||
<tr id="s_fn_@164:5"><td><code><a href="#fn_@164:5">@164:5(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_@168:5"><td><code><a href="#fn_@168:5">@168:5(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/utils.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr id="s_fn_LogRow.FormatForHtml"><td><code><a href="#fn_LogRow.FormatForHtml">LogRow.FormatForHtml(...)</a></code></td><td><code>github.com/hunterlong/statup/utils/log.go</code></td><td class="percent"><code>0.00%</code></td><td class="linecount"><code>0/1</code></td></tr>
|
||
<tr><td colspan="2"><code>github.com/hunterlong/statup/utils</code></td><td class="percent"><code>54.76%</code></td><td class="linecount"><code>115/210</code></td></tr>
|
||
</table>
|
||
|
||
<div class="funcname" id="fn_Log">func Log</div><div class="info"><a href="#s_fn_Log">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go</code>:</p></div><table class="listing">
|
||
<tr><td>93</td><td><code><pre>func Log(level int, err interface{}) error {</pre></code></td></tr><tr><td>94</td><td><code><pre> pushLastLine(err)</pre></code></td></tr><tr><td>95</td><td><code><pre> var outErr error</pre></code></td></tr><tr><td>96</td><td><code><pre> switch level {</pre></code></td></tr><tr><td>97</td><td><code><pre> case 5:</pre></code></td></tr><tr><td>98</td><td><code><pre> _, outErr = fmt.Printf("PANIC: %v\n", err)</pre></code></td></tr><tr><td>99</td><td><code><pre> fmtLogs.Printf("PANIC: %v\n", err)</pre></code></td></tr><tr><td>100</td><td><code><pre> case 4:</pre></code></td></tr><tr><td>101</td><td><code><pre> _, outErr = fmt.Printf("FATAL: %v\n", err)</pre></code></td></tr><tr><td>102</td><td><code><pre> fmtLogs.Printf("FATAL: %v\n", err)</pre></code></td></tr><tr><td>103</td><td><code><pre> //color.Red("ERROR: %v\n", err)</pre></code></td></tr><tr><td>104</td><td><code><pre> //os.Exit(2)</pre></code></td></tr><tr><td>105</td><td><code><pre> case 3:</pre></code></td></tr><tr><td>106</td><td><code><pre> _, outErr = fmt.Printf("ERROR: %v\n", err)</pre></code></td></tr><tr><td>107</td><td><code><pre> fmtLogs.Printf("ERROR: %v\n", err)</pre></code></td></tr><tr><td>108</td><td><code><pre> //color.Red("ERROR: %v\n", err)</pre></code></td></tr><tr><td>109</td><td><code><pre> case 2:</pre></code></td></tr><tr><td>110</td><td><code><pre> _, outErr = fmt.Printf("WARNING: %v\n", err)</pre></code></td></tr><tr><td>111</td><td><code><pre> fmtLogs.Printf("WARNING: %v\n", err)</pre></code></td></tr><tr><td>112</td><td><code><pre> //color.Yellow("WARNING: %v\n", err)</pre></code></td></tr><tr><td>113</td><td><code><pre> case 1:</pre></code></td></tr><tr><td>114</td><td><code><pre> _, outErr = fmt.Printf("INFO: %v\n", err)</pre></code></td></tr><tr><td>115</td><td><code><pre> fmtLogs.Printf("INFO: %v\n", err)</pre></code></td></tr><tr><td>116</td><td><code><pre> //color.Blue("INFO: %v\n", err)</pre></code></td></tr><tr><td>117</td><td><code><pre> case 0:</pre></code></td></tr><tr><td>118</td><td><code><pre> _, outErr = fmt.Printf("%v\n", err)</pre></code></td></tr><tr><td>119</td><td><code><pre> fmtLogs.Printf("%v\n", err)</pre></code></td></tr><tr><td>120</td><td><code><pre> //color.White("%v\n", err)</pre></code></td></tr><tr><td>121</td><td><code><pre> }</pre></code></td></tr><tr><td>122</td><td><code><pre> return outErr</pre></code></td></tr><tr><td>123</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_UnderScoreString">func UnderScoreString</div><div class="info"><a href="#s_fn_UnderScoreString">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>102</td><td><code><pre>func UnderScoreString(str string) string {</pre></code></td></tr><tr><td>103</td><td><code><pre></pre></code></td></tr><tr><td>104</td><td><code><pre> // convert every letter to lower case</pre></code></td></tr><tr><td>105</td><td><code><pre> newStr := strings.ToLower(str)</pre></code></td></tr><tr><td>106</td><td><code><pre></pre></code></td></tr><tr><td>107</td><td><code><pre> // convert all spaces/tab to underscore</pre></code></td></tr><tr><td>108</td><td><code><pre> regExp := regexp.MustCompile("[[:space:][:blank:]]")</pre></code></td></tr><tr><td>109</td><td><code><pre> newStrByte := regExp.ReplaceAll([]byte(newStr), []byte("_"))</pre></code></td></tr><tr><td>110</td><td><code><pre></pre></code></td></tr><tr><td>111</td><td><code><pre> regExp = regexp.MustCompile("`[^a-z0-9]`i")</pre></code></td></tr><tr><td>112</td><td><code><pre> newStrByte = regExp.ReplaceAll(newStrByte, []byte("_"))</pre></code></td></tr><tr><td>113</td><td><code><pre></pre></code></td></tr><tr><td>114</td><td><code><pre> regExp = regexp.MustCompile("[!/']")</pre></code></td></tr><tr><td>115</td><td><code><pre> newStrByte = regExp.ReplaceAll(newStrByte, []byte("_"))</pre></code></td></tr><tr><td>116</td><td><code><pre></pre></code></td></tr><tr><td>117</td><td><code><pre> // and remove underscore from beginning and ending</pre></code></td></tr><tr><td>118</td><td><code><pre></pre></code></td></tr><tr><td>119</td><td><code><pre> newStr = strings.TrimPrefix(string(newStrByte), "_")</pre></code></td></tr><tr><td>120</td><td><code><pre> newStr = strings.TrimSuffix(newStr, "_")</pre></code></td></tr><tr><td>121</td><td><code><pre></pre></code></td></tr><tr><td>122</td><td><code><pre> return newStr</pre></code></td></tr><tr><td>123</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_NewSHA1Hash">func NewSHA1Hash</div><div class="info"><a href="#s_fn_NewSHA1Hash">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/encryption.go</code>:</p></div><table class="listing">
|
||
<tr><td>33</td><td><code><pre>func NewSHA1Hash(n ...int) string {</pre></code></td></tr><tr><td>34</td><td><code><pre> noRandomCharacters := 32</pre></code></td></tr><tr><td>35</td><td><code><pre> if len(n) > 0 {</pre></code></td></tr><tr><td>36</td><td><code><pre> noRandomCharacters = n[0]</pre></code></td></tr><tr><td>37</td><td><code><pre> }</pre></code></td></tr><tr><td>38</td><td><code><pre> randString := RandomString(noRandomCharacters)</pre></code></td></tr><tr><td>39</td><td><code><pre> hash := sha1.New()</pre></code></td></tr><tr><td>40</td><td><code><pre> hash.Write([]byte(randString))</pre></code></td></tr><tr><td>41</td><td><code><pre> bs := hash.Sum(nil)</pre></code></td></tr><tr><td>42</td><td><code><pre> return fmt.Sprintf("%x", bs)</pre></code></td></tr><tr><td>43</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_RandomString">func RandomString</div><div class="info"><a href="#s_fn_RandomString">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/encryption.go</code>:</p></div><table class="listing">
|
||
<tr><td>48</td><td><code><pre>func RandomString(n int) string {</pre></code></td></tr><tr><td>49</td><td><code><pre> b := make([]rune, n)</pre></code></td></tr><tr><td>50</td><td><code><pre> rand.Seed(time.Now().UnixNano())</pre></code></td></tr><tr><td>51</td><td><code><pre> for i := range b {</pre></code></td></tr><tr><td>52</td><td><code><pre> b[i] = characterRunes[rand.Intn(len(characterRunes))]</pre></code></td></tr><tr><td>53</td><td><code><pre> }</pre></code></td></tr><tr><td>54</td><td><code><pre> return string(b)</pre></code></td></tr><tr><td>55</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DeleteFile">func DeleteFile</div><div class="info"><a href="#s_fn_DeleteFile">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>138</td><td><code><pre>func DeleteFile(file string) error {</pre></code></td></tr><tr><td>139</td><td><code><pre> Log(1, "deleting file: "+file)</pre></code></td></tr><tr><td>140</td><td><code><pre> err := os.Remove(file)</pre></code></td></tr><tr><td>141</td><td><code><pre> if err != nil {</pre></code></td></tr><tr><td>142</td><td><code><pre> return err</pre></code></td></tr><tr><td>143</td><td><code><pre> }</pre></code></td></tr><tr><td>144</td><td><code><pre> return nil</pre></code></td></tr><tr><td>145</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_newLogRow">func newLogRow</div><div class="info"><a href="#s_fn_newLogRow">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go</code>:</p></div><table class="listing">
|
||
<tr><td>158</td><td><code><pre>func newLogRow(line interface{}) (logRow *LogRow) {</pre></code></td></tr><tr><td>159</td><td><code><pre> logRow = new(LogRow)</pre></code></td></tr><tr><td>160</td><td><code><pre> logRow.Date = time.Now()</pre></code></td></tr><tr><td>161</td><td><code><pre> logRow.Line = line</pre></code></td></tr><tr><td>162</td><td><code><pre> return</pre></code></td></tr><tr><td>163</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Http">func Http</div><div class="info"><a href="#s_fn_Http">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go</code>:</p></div><table class="listing">
|
||
<tr><td>126</td><td><code><pre>func Http(r *http.Request) string {</pre></code></td></tr><tr><td>127</td><td><code><pre> msg := fmt.Sprintf("%v (%v) | IP: %v", r.RequestURI, r.Method, r.Host)</pre></code></td></tr><tr><td>128</td><td><code><pre> fmt.Printf("WEB: %v\n", msg)</pre></code></td></tr><tr><td>129</td><td><code><pre> pushLastLine(msg)</pre></code></td></tr><tr><td>130</td><td><code><pre> return msg</pre></code></td></tr><tr><td>131</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Timezoner">func Timezoner</div><div class="info"><a href="#s_fn_Timezoner">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>72</td><td><code><pre>func Timezoner(t time.Time, zone float32) time.Time {</pre></code></td></tr><tr><td>73</td><td><code><pre> zoneInt := float32(3600) * (zone + 1)</pre></code></td></tr><tr><td>74</td><td><code><pre> loc := time.FixedZone("", int(zoneInt))</pre></code></td></tr><tr><td>75</td><td><code><pre> timez := t.In(loc)</pre></code></td></tr><tr><td>76</td><td><code><pre> return timez</pre></code></td></tr><tr><td>77</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_rotate">func rotate</div><div class="info"><a href="#s_fn_rotate">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go</code>:</p></div><table class="listing">
|
||
<tr><td>81</td><td><code><pre>func rotate() {</pre></code></td></tr><tr><td>82</td><td><code><pre> c := make(chan os.Signal, 1)</pre></code></td></tr><tr><td>83</td><td><code><pre> signal.Notify(c, syscall.SIGHUP)</pre></code></td></tr><tr><td>84</td><td><code><pre> go func() {</pre></code></td></tr><tr><td>85</td><td><code><pre> for {</pre></code></td></tr><tr><td>86</td><td><code><pre> <-c</pre></code></td></tr><tr><td>87</td><td><code><pre> ljLogger.Rotate()</pre></code></td></tr><tr><td>88</td><td><code><pre> }</pre></code></td></tr><tr><td>89</td><td><code><pre> }()</pre></code></td></tr><tr><td>90</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@84:5">func @84:5</div><div class="info"><a href="#s_fn_@84:5">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go</code>:</p></div><table class="listing">
|
||
<tr><td>84</td><td><code><pre>func() {</pre></code></td></tr><tr><td>85</td><td><code><pre> for {</pre></code></td></tr><tr><td>86</td><td><code><pre> <-c</pre></code></td></tr><tr><td>87</td><td><code><pre> ljLogger.Rotate()</pre></code></td></tr><tr><td>88</td><td><code><pre> }</pre></code></td></tr><tr><td>89</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Timestamp.Ago">func Timestamp.Ago</div><div class="info"><a href="#s_fn_Timestamp.Ago">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>94</td><td><code><pre>func (t Timestamp) Ago() string {</pre></code></td></tr><tr><td>95</td><td><code><pre> got, _ := timeago.TimeAgoWithTime(time.Now(), time.Time(t))</pre></code></td></tr><tr><td>96</td><td><code><pre> return got</pre></code></td></tr><tr><td>97</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_StringInt">func StringInt</div><div class="info"><a href="#s_fn_StringInt">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>47</td><td><code><pre>func StringInt(s string) int64 {</pre></code></td></tr><tr><td>48</td><td><code><pre> num, _ := strconv.Atoi(s)</pre></code></td></tr><tr><td>49</td><td><code><pre> return int64(num)</pre></code></td></tr><tr><td>50</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_HashPassword">func HashPassword</div><div class="info"><a href="#s_fn_HashPassword">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/encryption.go</code>:</p></div><table class="listing">
|
||
<tr><td>27</td><td><code><pre>func HashPassword(password string) string {</pre></code></td></tr><tr><td>28</td><td><code><pre> bytes, _ := bcrypt.GenerateFromPassword([]byte(password), 14)</pre></code></td></tr><tr><td>29</td><td><code><pre> return string(bytes)</pre></code></td></tr><tr><td>30</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DeleteDirectory">func DeleteDirectory</div><div class="info"><a href="#s_fn_DeleteDirectory">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>149</td><td><code><pre>func DeleteDirectory(directory string) error {</pre></code></td></tr><tr><td>150</td><td><code><pre> return os.RemoveAll(directory)</pre></code></td></tr><tr><td>151</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_rev">func rev</div><div class="info"><a href="#s_fn_rev">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/time.go</code>:</p></div><table class="listing">
|
||
<tr><td>77</td><td><code><pre>func rev(f float64) float64 {</pre></code></td></tr><tr><td>78</td><td><code><pre> return f * -1</pre></code></td></tr><tr><td>79</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_pushLastLine">func pushLastLine</div><div class="info"><a href="#s_fn_pushLastLine">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go</code>:</p></div><table class="listing">
|
||
<tr><td>133</td><td><code><pre>func pushLastLine(line interface{}) {</pre></code></td></tr><tr><td>134</td><td><code><pre> LockLines.Lock()</pre></code></td></tr><tr><td>135</td><td><code><pre> defer LockLines.Unlock()</pre></code></td></tr><tr><td>136</td><td><code><pre> LastLines = append(LastLines, newLogRow(line))</pre></code></td></tr><tr><td>137</td><td><code><pre> // We want to store max 1000 lines in memory (for /logs page).</pre></code></td></tr><tr><td>138</td><td><code><pre> for len(LastLines) > 1000 {</pre></code></td></tr><tr class="miss"><td>139</td><td><code><pre> LastLines = LastLines[1:]</pre></code></td></tr><tr><td>140</td><td><code><pre> }</pre></code></td></tr><tr><td>141</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_InitLogs">func InitLogs</div><div class="info"><a href="#s_fn_InitLogs">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go</code>:</p></div><table class="listing">
|
||
<tr><td>58</td><td><code><pre>func InitLogs() error {</pre></code></td></tr><tr><td>59</td><td><code><pre> err := createLog(Directory)</pre></code></td></tr><tr><td>60</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>61</td><td><code><pre> return err</pre></code></td></tr><tr><td>62</td><td><code><pre> }</pre></code></td></tr><tr><td>63</td><td><code><pre> logFile, err = os.OpenFile(Directory+"/logs/statup.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0755)</pre></code></td></tr><tr><td>64</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>65</td><td><code><pre> log.Printf("ERROR opening file: %v", err)</pre></code></td></tr><tr class="miss"><td>66</td><td><code><pre> return err</pre></code></td></tr><tr><td>67</td><td><code><pre> }</pre></code></td></tr><tr><td>68</td><td><code><pre> ljLogger = &lumberjack.Logger{</pre></code></td></tr><tr><td>69</td><td><code><pre> Filename: Directory + "/logs/statup.log",</pre></code></td></tr><tr><td>70</td><td><code><pre> MaxSize: 16,</pre></code></td></tr><tr><td>71</td><td><code><pre> MaxBackups: 3,</pre></code></td></tr><tr><td>72</td><td><code><pre> MaxAge: 28,</pre></code></td></tr><tr><td>73</td><td><code><pre> }</pre></code></td></tr><tr><td>74</td><td><code><pre> fmtLogs = log.New(logFile, "", log.Ldate|log.Ltime)</pre></code></td></tr><tr><td>75</td><td><code><pre> log.SetOutput(ljLogger)</pre></code></td></tr><tr><td>76</td><td><code><pre> rotate()</pre></code></td></tr><tr><td>77</td><td><code><pre> LastLines = make([]*LogRow, 0)</pre></code></td></tr><tr><td>78</td><td><code><pre> return err</pre></code></td></tr><tr><td>79</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_init">func init</div><div class="info"><a href="#s_fn_init">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>38</td><td><code><pre>func init() {</pre></code></td></tr><tr><td>39</td><td><code><pre> if os.Getenv("STATUP_DIR") != "" {</pre></code></td></tr><tr><td>40</td><td><code><pre> Directory = os.Getenv("STATUP_DIR")</pre></code></td></tr><tr><td>41</td><td><code><pre> } else {</pre></code></td></tr><tr class="miss"><td>42</td><td><code><pre> Directory = dir()</pre></code></td></tr><tr><td>43</td><td><code><pre> }</pre></code></td></tr><tr><td>44</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_createLog">func createLog</div><div class="info"><a href="#s_fn_createLog">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go</code>:</p></div><table class="listing">
|
||
<tr><td>39</td><td><code><pre>func createLog(dir string) error {</pre></code></td></tr><tr><td>40</td><td><code><pre> var err error</pre></code></td></tr><tr><td>41</td><td><code><pre> _, err = os.Stat(dir + "/logs")</pre></code></td></tr><tr><td>42</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>43</td><td><code><pre> if os.IsNotExist(err) {</pre></code></td></tr><tr class="miss"><td>44</td><td><code><pre> os.Mkdir(dir+"/logs", 0777)</pre></code></td></tr><tr><td>45</td><td><code><pre> } else {</pre></code></td></tr><tr class="miss"><td>46</td><td><code><pre> return err</pre></code></td></tr><tr><td>47</td><td><code><pre> }</pre></code></td></tr><tr><td>48</td><td><code><pre> }</pre></code></td></tr><tr><td>49</td><td><code><pre> file, err := os.Create(dir + "/logs/statup.log")</pre></code></td></tr><tr><td>50</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>51</td><td><code><pre> return err</pre></code></td></tr><tr><td>52</td><td><code><pre> }</pre></code></td></tr><tr><td>53</td><td><code><pre> defer file.Close()</pre></code></td></tr><tr><td>54</td><td><code><pre> return err</pre></code></td></tr><tr><td>55</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_FileExists">func FileExists</div><div class="info"><a href="#s_fn_FileExists">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>127</td><td><code><pre>func FileExists(name string) bool {</pre></code></td></tr><tr><td>128</td><td><code><pre> if _, err := os.Stat(name); err != nil {</pre></code></td></tr><tr class="miss"><td>129</td><td><code><pre> if os.IsNotExist(err) {</pre></code></td></tr><tr class="miss"><td>130</td><td><code><pre> return false</pre></code></td></tr><tr><td>131</td><td><code><pre> }</pre></code></td></tr><tr><td>132</td><td><code><pre> }</pre></code></td></tr><tr><td>133</td><td><code><pre> return true</pre></code></td></tr><tr><td>134</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_DurationReadable">func DurationReadable</div><div class="info"><a href="#s_fn_DurationReadable">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>213</td><td><code><pre>func DurationReadable(d time.Duration) string {</pre></code></td></tr><tr><td>214</td><td><code><pre> if d.Hours() >= 1 {</pre></code></td></tr><tr class="miss"><td>215</td><td><code><pre> return fmt.Sprintf("%0.0f hours", d.Hours())</pre></code></td></tr><tr><td>216</td><td><code><pre> } else if d.Minutes() >= 1 {</pre></code></td></tr><tr><td>217</td><td><code><pre> return fmt.Sprintf("%0.0f minutes", d.Minutes())</pre></code></td></tr><tr class="miss"><td>218</td><td><code><pre> } else if d.Seconds() >= 1 {</pre></code></td></tr><tr class="miss"><td>219</td><td><code><pre> return fmt.Sprintf("%0.0f seconds", d.Seconds())</pre></code></td></tr><tr><td>220</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>221</td><td><code><pre> return d.String()</pre></code></td></tr><tr><td>222</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_FormatDuration">func FormatDuration</div><div class="info"><a href="#s_fn_FormatDuration">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/time.go</code>:</p></div><table class="listing">
|
||
<tr><td>24</td><td><code><pre>func FormatDuration(d time.Duration) string {</pre></code></td></tr><tr><td>25</td><td><code><pre> var out string</pre></code></td></tr><tr><td>26</td><td><code><pre> if d.Hours() >= 24 {</pre></code></td></tr><tr class="miss"><td>27</td><td><code><pre> out = fmt.Sprintf("%0.0f day", d.Hours()/24)</pre></code></td></tr><tr class="miss"><td>28</td><td><code><pre> if (d.Hours() / 24) >= 2 {</pre></code></td></tr><tr class="miss"><td>29</td><td><code><pre> out += "s"</pre></code></td></tr><tr><td>30</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>31</td><td><code><pre> return out</pre></code></td></tr><tr><td>32</td><td><code><pre> } else if d.Hours() >= 1 {</pre></code></td></tr><tr class="miss"><td>33</td><td><code><pre> out = fmt.Sprintf("%0.0f hour", d.Hours())</pre></code></td></tr><tr class="miss"><td>34</td><td><code><pre> if d.Hours() >= 2 {</pre></code></td></tr><tr class="miss"><td>35</td><td><code><pre> out += "s"</pre></code></td></tr><tr><td>36</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>37</td><td><code><pre> return out</pre></code></td></tr><tr><td>38</td><td><code><pre> } else if d.Minutes() >= 1 {</pre></code></td></tr><tr><td>39</td><td><code><pre> out = fmt.Sprintf("%0.0f minute", d.Minutes())</pre></code></td></tr><tr><td>40</td><td><code><pre> if d.Minutes() >= 2 {</pre></code></td></tr><tr><td>41</td><td><code><pre> out += "s"</pre></code></td></tr><tr><td>42</td><td><code><pre> }</pre></code></td></tr><tr><td>43</td><td><code><pre> return out</pre></code></td></tr><tr><td>44</td><td><code><pre> } else if d.Seconds() >= 1 {</pre></code></td></tr><tr class="miss"><td>45</td><td><code><pre> out = fmt.Sprintf("%0.0f second", d.Seconds())</pre></code></td></tr><tr class="miss"><td>46</td><td><code><pre> if d.Seconds() >= 2 {</pre></code></td></tr><tr class="miss"><td>47</td><td><code><pre> out += "s"</pre></code></td></tr><tr><td>48</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>49</td><td><code><pre> return out</pre></code></td></tr><tr><td>50</td><td><code><pre> } else if rev(d.Hours()) >= 24 {</pre></code></td></tr><tr class="miss"><td>51</td><td><code><pre> out = fmt.Sprintf("%0.0f day", rev(d.Hours()/24))</pre></code></td></tr><tr class="miss"><td>52</td><td><code><pre> if rev(d.Hours()/24) >= 2 {</pre></code></td></tr><tr class="miss"><td>53</td><td><code><pre> out += "s"</pre></code></td></tr><tr><td>54</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>55</td><td><code><pre> return out</pre></code></td></tr><tr><td>56</td><td><code><pre> } else if rev(d.Hours()) >= 1 {</pre></code></td></tr><tr class="miss"><td>57</td><td><code><pre> out = fmt.Sprintf("%0.0f hour", rev(d.Hours()))</pre></code></td></tr><tr class="miss"><td>58</td><td><code><pre> if rev(d.Hours()) >= 2 {</pre></code></td></tr><tr class="miss"><td>59</td><td><code><pre> out += "s"</pre></code></td></tr><tr><td>60</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>61</td><td><code><pre> return out</pre></code></td></tr><tr><td>62</td><td><code><pre> } else if rev(d.Minutes()) >= 1 {</pre></code></td></tr><tr><td>63</td><td><code><pre> out = fmt.Sprintf("%0.0f minute", rev(d.Minutes()))</pre></code></td></tr><tr><td>64</td><td><code><pre> if rev(d.Minutes()) >= 2 {</pre></code></td></tr><tr class="miss"><td>65</td><td><code><pre> out += "s"</pre></code></td></tr><tr><td>66</td><td><code><pre> }</pre></code></td></tr><tr><td>67</td><td><code><pre> return out</pre></code></td></tr><tr><td>68</td><td><code><pre> } else {</pre></code></td></tr><tr class="miss"><td>69</td><td><code><pre> out = fmt.Sprintf("%0.0f second", rev(d.Seconds()))</pre></code></td></tr><tr class="miss"><td>70</td><td><code><pre> if rev(d.Seconds()) >= 2 {</pre></code></td></tr><tr class="miss"><td>71</td><td><code><pre> out += "s"</pre></code></td></tr><tr><td>72</td><td><code><pre> }</pre></code></td></tr><tr><td>73</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>74</td><td><code><pre> return out</pre></code></td></tr><tr><td>75</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_ToString">func ToString</div><div class="info"><a href="#s_fn_ToString">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>53</td><td><code><pre>func ToString(s interface{}) string {</pre></code></td></tr><tr><td>54</td><td><code><pre> switch v := s.(type) {</pre></code></td></tr><tr><td>55</td><td><code><pre> case int, int32, int64:</pre></code></td></tr><tr><td>56</td><td><code><pre> return fmt.Sprintf("%v", v)</pre></code></td></tr><tr><td>57</td><td><code><pre> case float32, float64:</pre></code></td></tr><tr class="miss"><td>58</td><td><code><pre> return fmt.Sprintf("%v", v)</pre></code></td></tr><tr><td>59</td><td><code><pre> case []byte:</pre></code></td></tr><tr class="miss"><td>60</td><td><code><pre> return string(v)</pre></code></td></tr><tr><td>61</td><td><code><pre> case bool:</pre></code></td></tr><tr class="miss"><td>62</td><td><code><pre> if v {</pre></code></td></tr><tr class="miss"><td>63</td><td><code><pre> return "true"</pre></code></td></tr><tr><td>64</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>65</td><td><code><pre> return "false"</pre></code></td></tr><tr><td>66</td><td><code><pre> default:</pre></code></td></tr><tr class="miss"><td>67</td><td><code><pre> return fmt.Sprintf("%v", v)</pre></code></td></tr><tr><td>68</td><td><code><pre> }</pre></code></td></tr><tr><td>69</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_Command">func Command</div><div class="info"><a href="#s_fn_Command">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>155</td><td><code><pre>func Command(cmd string) (string, string, error) {</pre></code></td></tr><tr class="miss"><td>156</td><td><code><pre> Log(1, "running command: "+cmd)</pre></code></td></tr><tr class="miss"><td>157</td><td><code><pre> testCmd := exec.Command("sh", "-c", cmd)</pre></code></td></tr><tr class="miss"><td>158</td><td><code><pre> var stdout, stderr []byte</pre></code></td></tr><tr class="miss"><td>159</td><td><code><pre> var errStdout, errStderr error</pre></code></td></tr><tr class="miss"><td>160</td><td><code><pre> stdoutIn, _ := testCmd.StdoutPipe()</pre></code></td></tr><tr class="miss"><td>161</td><td><code><pre> stderrIn, _ := testCmd.StderrPipe()</pre></code></td></tr><tr class="miss"><td>162</td><td><code><pre> testCmd.Start()</pre></code></td></tr><tr><td>163</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>164</td><td><code><pre> go func() {</pre></code></td></tr><tr><td>165</td><td><code><pre> stdout, errStdout = copyAndCapture(os.Stdout, stdoutIn)</pre></code></td></tr><tr><td>166</td><td><code><pre> }()</pre></code></td></tr><tr><td>167</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>168</td><td><code><pre> go func() {</pre></code></td></tr><tr><td>169</td><td><code><pre> stderr, errStderr = copyAndCapture(os.Stderr, stderrIn)</pre></code></td></tr><tr><td>170</td><td><code><pre> }()</pre></code></td></tr><tr><td>171</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>172</td><td><code><pre> err := testCmd.Wait()</pre></code></td></tr><tr class="miss"><td>173</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>174</td><td><code><pre> return "", "", err</pre></code></td></tr><tr><td>175</td><td><code><pre> }</pre></code></td></tr><tr><td>176</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>177</td><td><code><pre> if errStdout != nil || errStderr != nil {</pre></code></td></tr><tr class="miss"><td>178</td><td><code><pre> return "", "", errors.New("failed to capture stdout or stderr")</pre></code></td></tr><tr><td>179</td><td><code><pre> }</pre></code></td></tr><tr><td>180</td><td><code><pre></pre></code></td></tr><tr class="miss"><td>181</td><td><code><pre> outStr, errStr := string(stdout), string(stderr)</pre></code></td></tr><tr class="miss"><td>182</td><td><code><pre> return outStr, errStr, err</pre></code></td></tr><tr><td>183</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_copyAndCapture">func copyAndCapture</div><div class="info"><a href="#s_fn_copyAndCapture">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>186</td><td><code><pre>func copyAndCapture(w io.Writer, r io.Reader) ([]byte, error) {</pre></code></td></tr><tr class="miss"><td>187</td><td><code><pre> var out []byte</pre></code></td></tr><tr class="miss"><td>188</td><td><code><pre> buf := make([]byte, 1024, 1024)</pre></code></td></tr><tr class="miss"><td>189</td><td><code><pre> for {</pre></code></td></tr><tr class="miss"><td>190</td><td><code><pre> n, err := r.Read(buf[:])</pre></code></td></tr><tr class="miss"><td>191</td><td><code><pre> if n > 0 {</pre></code></td></tr><tr class="miss"><td>192</td><td><code><pre> d := buf[:n]</pre></code></td></tr><tr class="miss"><td>193</td><td><code><pre> out = append(out, d...)</pre></code></td></tr><tr class="miss"><td>194</td><td><code><pre> _, err := w.Write(d)</pre></code></td></tr><tr class="miss"><td>195</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>196</td><td><code><pre> return out, err</pre></code></td></tr><tr><td>197</td><td><code><pre> }</pre></code></td></tr><tr><td>198</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>199</td><td><code><pre> if err != nil {</pre></code></td></tr><tr><td>200</td><td><code><pre> // Read returns io.EOF at the end of file, which is not an error for us</pre></code></td></tr><tr class="miss"><td>201</td><td><code><pre> if err == io.EOF {</pre></code></td></tr><tr class="miss"><td>202</td><td><code><pre> err = nil</pre></code></td></tr><tr><td>203</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>204</td><td><code><pre> return out, err</pre></code></td></tr><tr><td>205</td><td><code><pre> }</pre></code></td></tr><tr><td>206</td><td><code><pre> }</pre></code></td></tr><tr><td>207</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_GetLastLine">func GetLastLine</div><div class="info"><a href="#s_fn_GetLastLine">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go</code>:</p></div><table class="listing">
|
||
<tr><td>144</td><td><code><pre>func GetLastLine() *LogRow {</pre></code></td></tr><tr class="miss"><td>145</td><td><code><pre> LockLines.Lock()</pre></code></td></tr><tr class="miss"><td>146</td><td><code><pre> defer LockLines.Unlock()</pre></code></td></tr><tr class="miss"><td>147</td><td><code><pre> if len(LastLines) > 0 {</pre></code></td></tr><tr class="miss"><td>148</td><td><code><pre> return LastLines[len(LastLines)-1]</pre></code></td></tr><tr><td>149</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>150</td><td><code><pre> return nil</pre></code></td></tr><tr><td>151</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_LogRow.lineAsString">func LogRow.lineAsString</div><div class="info"><a href="#s_fn_LogRow.lineAsString">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go</code>:</p></div><table class="listing">
|
||
<tr><td>165</td><td><code><pre>func (o *LogRow) lineAsString() string {</pre></code></td></tr><tr class="miss"><td>166</td><td><code><pre> switch v := o.Line.(type) {</pre></code></td></tr><tr><td>167</td><td><code><pre> case string:</pre></code></td></tr><tr class="miss"><td>168</td><td><code><pre> return v</pre></code></td></tr><tr><td>169</td><td><code><pre> case error:</pre></code></td></tr><tr class="miss"><td>170</td><td><code><pre> return v.Error()</pre></code></td></tr><tr><td>171</td><td><code><pre> case []byte:</pre></code></td></tr><tr class="miss"><td>172</td><td><code><pre> return string(v)</pre></code></td></tr><tr><td>173</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>174</td><td><code><pre> return ""</pre></code></td></tr><tr><td>175</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_dir">func dir</div><div class="info"><a href="#s_fn_dir">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>80</td><td><code><pre>func dir() string {</pre></code></td></tr><tr class="miss"><td>81</td><td><code><pre> dir, err := os.Getwd()</pre></code></td></tr><tr class="miss"><td>82</td><td><code><pre> if err != nil {</pre></code></td></tr><tr class="miss"><td>83</td><td><code><pre> return "."</pre></code></td></tr><tr><td>84</td><td><code><pre> }</pre></code></td></tr><tr class="miss"><td>85</td><td><code><pre> return dir</pre></code></td></tr><tr><td>86</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_SaveFile">func SaveFile</div><div class="info"><a href="#s_fn_SaveFile">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>226</td><td><code><pre>func SaveFile(filename string, data []byte) error {</pre></code></td></tr><tr class="miss"><td>227</td><td><code><pre> err := ioutil.WriteFile(filename, data, 0644)</pre></code></td></tr><tr class="miss"><td>228</td><td><code><pre> return err</pre></code></td></tr><tr><td>229</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@164:5">func @164:5</div><div class="info"><a href="#s_fn_@164:5">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>164</td><td><code><pre>func() {</pre></code></td></tr><tr class="miss"><td>165</td><td><code><pre> stdout, errStdout = copyAndCapture(os.Stdout, stdoutIn)</pre></code></td></tr><tr><td>166</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_@168:5">func @168:5</div><div class="info"><a href="#s_fn_@168:5">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/utils.go</code>:</p></div><table class="listing">
|
||
<tr><td>168</td><td><code><pre>func() {</pre></code></td></tr><tr class="miss"><td>169</td><td><code><pre> stderr, errStderr = copyAndCapture(os.Stderr, stderrIn)</pre></code></td></tr><tr><td>170</td><td><code><pre> }</pre></code></td></tr></table>
|
||
|
||
<div class="funcname" id="fn_LogRow.FormatForHtml">func LogRow.FormatForHtml</div><div class="info"><a href="#s_fn_LogRow.FormatForHtml">Back</a><p>In <code>/Users/hunterlong/go/src/github.com/hunterlong/statup/utils/log.go</code>:</p></div><table class="listing">
|
||
<tr><td>177</td><td><code><pre>func (o *LogRow) FormatForHtml() string {</pre></code></td></tr><tr class="miss"><td>178</td><td><code><pre> return fmt.Sprintf("%s: %s", o.Date.Format("2006-01-02 15:04:05"), o.lineAsString())</pre></code></td></tr><tr><td>179</td><td><code><pre>}</pre></code></td></tr></table>
|
||
|
||
<!-- Can be parsed by external script
|
||
PACKAGE:github.com/hunterlong/statup/utils DONE:54.76
|
||
-->
|
||
|
||
<div id="summaryWrapper"><div class="package">Report Total</div>
|
||
<div id="totalcov">54.53%</div>
|
||
</div>
|
||
</body>
|