├── .gitmodules ├── README.md ├── example └── main.go ├── miniprofiler ├── context.go ├── doc.go ├── miniprofiler.go ├── static.go ├── templates.go └── types.go ├── miniprofiler_beego ├── doc.go └── miniprofiler_beego.go ├── miniprofiler_gae ├── doc.go └── miniprofiler_gae.go ├── miniprofiler_gocraftweb ├── doc.go └── miniprofiler_gocraftweb.go ├── miniprofiler_martini ├── doc.go └── miniprofiler_martini.go ├── miniprofiler_revel ├── doc.go └── miniprofiler_revel.go ├── miniprofiler_traffic ├── doc.go └── miniprofiler_traffic.go ├── redis └── redis.go └── sql └── sql.go /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "ui"] 2 | path = ui 3 | url = git@github.com:MiniProfiler/ui.git 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | go 2 | == 3 | 4 | A simple but effective mini-profiler for Go websites 5 | -------------------------------------------------------------------------------- /example/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | 7 | _ "code.google.com/p/go-sqlite/go1/sqlite3" 8 | "github.com/MiniProfiler/go/miniprofiler" 9 | "github.com/MiniProfiler/go/redis" 10 | "github.com/MiniProfiler/go/sql" 11 | ) 12 | 13 | func Index(t miniprofiler.Timer, w http.ResponseWriter, r *http.Request) { 14 | db, _ := sql.Open("sqlite3", ":memory:") 15 | db.ExecTimer(t, "create table x(a, b, c)") 16 | db.ExecTimer(t, "insert into x (1, 2, 4), (3, 5, 6)") 17 | db.QueryTimer(t, "select * from x") 18 | t.Step("redissss", func(t miniprofiler.Timer) { 19 | conn, _ := redis.Dial("tcp", ":6379") 20 | defer conn.Close() 21 | conn.DoTimer(t, "set", "tes t", "value") 22 | conn.SendTimer(t, "get", "test t") 23 | }) 24 | fmt.Fprintf(w, `%v`, t.Includes()) 25 | } 26 | 27 | func main() { 28 | miniprofiler.TrivialMilliseconds = 0 29 | http.Handle("/", miniprofiler.NewHandler(Index)) 30 | fmt.Println("serving") 31 | http.ListenAndServe(":8080", nil) 32 | } 33 | -------------------------------------------------------------------------------- /miniprofiler/context.go: -------------------------------------------------------------------------------- 1 | // +build go1.7 2 | 3 | package miniprofiler 4 | 5 | import ( 6 | "context" 7 | "net/http" 8 | ) 9 | 10 | type ctxKey int 11 | 12 | // contextKey can be used to retreive the profiler instance from the request's context 13 | const contextKey ctxKey = 0 14 | 15 | // ContextHandler is an alternate handler that passes the profiler on the http 16 | // request's context, rather than as function arguments. 17 | // This approach is more compatible with standard net/http Handlers. 18 | type ContextHandler struct { 19 | f http.Handler 20 | name string 21 | } 22 | 23 | // NewContextHandler creates a ContextHandler to wrap the given http.HandlerFunc. 24 | // A profiler will be added to the request Context, and can be retreived with 25 | // miniprofiler.GetTimer(r) 26 | func NewContextHandler(f http.Handler) http.Handler { 27 | return ContextHandler{ 28 | f: f, 29 | } 30 | } 31 | 32 | // NewNamedContextHandler creates a ContextHandler to wrap the given http.HandlerFunc. 33 | // A profiler will be added to the request Context, and can be retreived with 34 | // miniprofiler.GetTimer(r) 35 | func NewNamedContextHandler(f http.Handler, name string) http.Handler { 36 | return ContextHandler{ 37 | f: f, 38 | name: name, 39 | } 40 | } 41 | 42 | func (h ContextHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { 43 | fname := h.name 44 | if fname == "" { 45 | fname = FuncName(h.f) 46 | } 47 | p := NewProfile(w, r, fname) 48 | ctx := context.WithValue(r.Context(), contextKey, p) 49 | h.f.ServeHTTP(w, r.WithContext(ctx)) 50 | p.Finalize() 51 | } 52 | 53 | // GetTimer will retreive the timer from the given http request's context. 54 | // If the request has not been wrapped by a ContextHandler, nil will be returned. 55 | func GetTimer(r *http.Request) Timer { 56 | return GetTimerFromContext(r.Context()) 57 | } 58 | 59 | // GetTimerFromContext will retreive the timer from the given context. 60 | // If the given context has not been wrapped by a ContextHandler, nil will be returned. 61 | func GetTimerFromContext(ctx context.Context) Timer { 62 | val := ctx.Value(contextKey) 63 | if val == nil { 64 | return nil 65 | } 66 | return val.(*Profile) 67 | } 68 | -------------------------------------------------------------------------------- /miniprofiler/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | /* 18 | Package miniprofiler is a simple but effective mini-profiler for websites. 19 | 20 | To use this package, change your HTTP handler functions to use this signature: 21 | 22 | func(miniprofiler.Timer, http.ResponseWriter, *http.Request) 23 | 24 | Register them in the usual way, wrapping them with NewHandler. 25 | 26 | By default, all requests are profiled. This should be changed to profile 27 | only developer requests. Set miniprofiler.Enable to a function that returns 28 | true if profiling is enabled. It might resemble this: 29 | 30 | miniprofiler.Enable = func(r *http.Request) bool { 31 | return isUserAuthenticated(r) 32 | } 33 | 34 | By default, profile results are stored in memory in a concurrent-safe 35 | data structure. To store in redis, memcache, or something else, set 36 | miniprofiler.Store and miniprofiler.Get to functions to back the profile 37 | data. The key is Profile.Id. 38 | 39 | Send output of t.Includes() to your HTML (it is empty if Enable returns 40 | false). 41 | 42 | Step 43 | 44 | The Step function can be used to profile more specific parts of your code. It 45 | should be called with the name of the step and a closure. Further Timers are 46 | used so concurrent work can be done and results applied to the correct location. 47 | 48 | t.Step("something", func(t miniprofiler.Timer) { 49 | // do some work 50 | // t.Step("another", func(t miniprofiler.Timer) { ... }) 51 | }) 52 | 53 | StepCustomTiming 54 | 55 | StepCustomTiming can be used to record any kind of call (redis, RPC, etc.) 56 | 57 | t.StepCustomTiming( 58 | "redis", // call type 59 | "get", // execute type 60 | "get key_name" // command string 61 | func() { 62 | // do work 63 | } 64 | ) 65 | 66 | Example 67 | 68 | This is a small example using this package. 69 | 70 | package main 71 | 72 | import ( 73 | "fmt" 74 | "net/http" 75 | 76 | "github.com/MiniProfiler/go/miniprofiler" 77 | ) 78 | 79 | func Index(t miniprofiler.Timer, w http.ResponseWriter, r *http.Request) { 80 | t.Step("something", func(t miniprofiler.Timer) { 81 | t.StepCustomTiming("RPC", "get", "get key_name", func() { 82 | // some RPC call 83 | }) 84 | }) 85 | fmt.Fprintf(w, "%v", p.Includes()) 86 | } 87 | 88 | func main() { 89 | http.Handle("/", miniprofiler.NewHandler(Index)) 90 | http.ListenAndServe(":8080", nil) 91 | } 92 | 93 | Configuration 94 | 95 | Refer to the variables section of the documentation: http://godoc.org/github.com/MiniProfiler/go/miniprofiler#pkg-variables. 96 | 97 | Other implementations and resources: http://miniprofiler.com. 98 | 99 | Frameworks 100 | 101 | Various frameworks have explicit support. 102 | 103 | Google App Engine: http://godoc.org/github.com/MiniProfiler/go/miniprofiler_gae 104 | 105 | Revel: http://godoc.org/github.com/MiniProfiler/go/miniprofiler_revel 106 | 107 | Martini: http://godoc.org/github.com/MiniProfiler/go/miniprofiler_martini 108 | 109 | Beego: http://godoc.org/github.com/MiniProfiler/go/miniprofiler_beego 110 | 111 | Traffic: http://godoc.org/github.com/MiniProfiler/go/miniprofiler_traffic 112 | 113 | gocraft/web: http://godoc.org/github.com/MiniProfiler/go/miniprofiler_gocraftweb 114 | 115 | RPCs 116 | 117 | Various RPCs have explicit support. 118 | 119 | Redis: http://godoc.org/github.com/MiniProfiler/go/redis 120 | 121 | SQL: http://godoc.org/github.com/MiniProfiler/go/sql 122 | */ 123 | package miniprofiler 124 | -------------------------------------------------------------------------------- /miniprofiler/miniprofiler.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | package miniprofiler 18 | 19 | import ( 20 | "bytes" 21 | "encoding/json" 22 | "html/template" 23 | "log" 24 | "net/http" 25 | "os" 26 | "reflect" 27 | "runtime" 28 | "sort" 29 | "strconv" 30 | "strings" 31 | "sync" 32 | "time" 33 | "unicode" 34 | ) 35 | 36 | var ( 37 | // Enable returns true if the request should be profiled. 38 | Enable func(*http.Request) bool = EnableAll 39 | 40 | // Store stores the Profile by its Id field. 41 | Store func(*http.Request, *Profile) = StoreMemory 42 | 43 | // Get retrieves a Profile by its Id field. 44 | Get func(*http.Request, string) *Profile = GetMemory 45 | 46 | // MachineName returns the machine name to display. 47 | // The default is to use the machine's hostname. 48 | MachineName func() string = Hostname 49 | 50 | // Valid positions: left, right, bottomleft, bottomright 51 | Position = "left" 52 | 53 | ShowTrivial = false 54 | ShowChildren = false 55 | MaxTracesToShow = 15 56 | ShowControls = true 57 | ToggleShortcut = "Alt+P" 58 | StartHidden = false 59 | TrivialMilliseconds = 12.0 60 | 61 | Version = "3.0.12" 62 | 63 | staticFiles map[string][]byte 64 | ) 65 | 66 | const ( 67 | PATH = "/mini-profiler-resources/" 68 | 69 | clientTimingsPrefix = "clientPerformance[timing][" 70 | ) 71 | 72 | var ( 73 | webFS = FS(false) 74 | fsHandler = http.FileServer(webFS) 75 | ) 76 | 77 | func init() { 78 | http.Handle(PATH, http.StripPrefix(PATH, http.HandlerFunc(MiniProfilerHandler))) 79 | } 80 | 81 | // miniProfilerHandler serves requests to the /mini-profiler-resources/ 82 | // path. For use only by miniprofiler helper libraries. 83 | func MiniProfilerHandler(w http.ResponseWriter, r *http.Request) { 84 | if r.URL.Path == "results" { 85 | results(w, r) 86 | } else { 87 | fsHandler.ServeHTTP(w, r) 88 | } 89 | } 90 | 91 | func results(w http.ResponseWriter, r *http.Request) { 92 | id := r.FormValue("id") 93 | isPopup := r.FormValue("popup") == "1" 94 | p := Get(r, id) 95 | if p == nil { 96 | http.Error(w, "", http.StatusNotFound) 97 | return 98 | } 99 | 100 | needsSave := false 101 | if p.ClientTimings == nil { 102 | p.ClientTimings = getClientTimings(r) 103 | if p.ClientTimings != nil { 104 | needsSave = true 105 | } 106 | } 107 | 108 | if needsSave { 109 | Store(r, p) 110 | } 111 | 112 | var j []byte 113 | j, err := json.Marshal(p) 114 | if err != nil { 115 | http.Error(w, err.Error(), http.StatusInternalServerError) 116 | return 117 | } 118 | 119 | if isPopup { 120 | w.Write(j) 121 | } else { 122 | v := map[string]interface{}{ 123 | "name": p.Name, 124 | "duration": p.DurationMilliseconds, 125 | "path": PATH, 126 | "json": template.JS(j), 127 | "includes": p.Includes(), 128 | "version": Version, 129 | } 130 | 131 | w.Header().Add("Content-Type", "text/html") 132 | shareHtmlTmpl.Execute(w, v) 133 | } 134 | } 135 | 136 | func getClientTimings(r *http.Request) *ClientTimings { 137 | var navigationStart int64 138 | if i, err := strconv.ParseInt(r.FormValue(clientTimingsPrefix+"navigationStart]"), 10, 64); err != nil { 139 | return nil 140 | } else { 141 | navigationStart = i 142 | } 143 | ct := new(ClientTimings) 144 | 145 | if i, err := strconv.ParseInt(r.FormValue("clientPerformance[navigation][redirectCount]"), 10, 64); err == nil { 146 | ct.RedirectCount = i 147 | } 148 | 149 | r.ParseForm() 150 | clientPerf := make(map[string]ClientTiming) 151 | for k, v := range r.Form { 152 | if len(v) < 1 || !strings.HasPrefix(k, clientTimingsPrefix) { 153 | continue 154 | } 155 | 156 | if i, err := strconv.ParseInt(v[0], 10, 64); err == nil && i > navigationStart { 157 | i -= navigationStart 158 | name := k[len(clientTimingsPrefix) : len(k)-1] 159 | 160 | if strings.HasSuffix(name, "Start") { 161 | shortName := name[:len(name)-5] 162 | if c, present := clientPerf[shortName]; !present { 163 | clientPerf[shortName] = ClientTiming{ 164 | Name: shortName, 165 | Duration: -1, 166 | Start: i, 167 | } 168 | } else { 169 | c.Start = i 170 | c.Duration -= i 171 | clientPerf[shortName] = c 172 | } 173 | } else if strings.HasSuffix(name, "End") { 174 | shortName := name[:len(name)-3] 175 | if c, present := clientPerf[shortName]; !present { 176 | clientPerf[shortName] = ClientTiming{ 177 | Duration: i, 178 | Name: shortName, 179 | } 180 | } else { 181 | c.Duration = i - c.Start 182 | clientPerf[shortName] = c 183 | } 184 | } 185 | } 186 | } 187 | for _, v := range clientPerf { 188 | ct.Timings = append(ct.Timings, &ClientTiming{ 189 | Name: sentenceCase(v.Name), 190 | Start: v.Start, 191 | Duration: v.Duration, 192 | }) 193 | } 194 | sort.Sort(ct) 195 | 196 | return ct 197 | } 198 | 199 | func sentenceCase(s string) string { 200 | var buf bytes.Buffer 201 | for k, v := range s { 202 | if k == 0 { 203 | buf.WriteRune(unicode.ToUpper(v)) 204 | continue 205 | } 206 | if unicode.IsUpper(v) { 207 | buf.WriteString(" ") 208 | } 209 | buf.WriteRune(v) 210 | } 211 | return buf.String() 212 | } 213 | 214 | func static(w http.ResponseWriter, r *http.Request) { 215 | fname := r.URL.Path[strings.LastIndex(r.URL.Path, "/")+1:] 216 | if v, present := staticFiles[fname]; present { 217 | h := w.Header() 218 | 219 | if strings.HasSuffix(r.URL.Path, ".css") { 220 | h.Set("Content-type", "text/css") 221 | } else if strings.HasSuffix(r.URL.Path, ".js") { 222 | h.Set("Content-type", "text/javascript") 223 | } 224 | 225 | h.Set("Cache-Control", "public, max-age=expiry") 226 | expires := time.Now().Add(time.Hour) 227 | h.Set("Expires", expires.Format(time.RFC1123)) 228 | 229 | w.Write(v) 230 | } 231 | } 232 | 233 | // Includes renders the JavaScript includes for this request, if enabled. 234 | func (p *Profile) Includes() template.HTML { 235 | if !Enable(p.r) { 236 | return "" 237 | } 238 | 239 | current := p.Id 240 | authorized := true 241 | 242 | v := map[string]interface{}{ 243 | "ids": current, 244 | "path": PATH, 245 | "version": Version, 246 | "position": Position, 247 | "showTrivial": ShowTrivial, 248 | "showChildren": ShowChildren, 249 | "maxTracesToShow": MaxTracesToShow, 250 | "showControls": ShowControls, 251 | "currentId": current, 252 | "authorized": authorized, 253 | "toggleShortcut": ToggleShortcut, 254 | "startHidden": StartHidden, 255 | "trivialMilliseconds": TrivialMilliseconds, 256 | } 257 | 258 | var w bytes.Buffer 259 | if err := includePartialHtmlTmpl.Execute(&w, v); err != nil { 260 | log.Print(err) 261 | return "" 262 | } 263 | return template.HTML(w.String()) 264 | } 265 | 266 | type Handler struct { 267 | f func(Timer, http.ResponseWriter, *http.Request) 268 | p *Profile 269 | } 270 | 271 | // NewHandler returns a new profiled handler. 272 | func NewHandler(f func(Timer, http.ResponseWriter, *http.Request)) Handler { 273 | return Handler{ 274 | f: f, 275 | } 276 | } 277 | 278 | func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { 279 | switch r.URL.Query().Get("pp") { 280 | default: 281 | h.ProfileRequest(w, r) 282 | } 283 | } 284 | 285 | func (h Handler) ProfileRequest(w http.ResponseWriter, r *http.Request) { 286 | h.p = NewProfile(w, r, FuncName(h.f)) 287 | h.f(h.p, w, r) 288 | h.p.Finalize() 289 | } 290 | 291 | // Since returns the number of milliseconds since t. 292 | func Since(t time.Time) float64 { 293 | d := time.Since(t) 294 | return float64(d.Nanoseconds()) / 1000000 295 | } 296 | 297 | // Hostname returns the os.Hostname() of the current machine, 298 | // or "" if unavailable. 299 | func Hostname() string { 300 | name, err := os.Hostname() 301 | if err != nil { 302 | return "" 303 | } 304 | return name 305 | } 306 | 307 | // FuncName returns the name of the function f, or "" if f is not a function. 308 | func FuncName(f interface{}) string { 309 | v := reflect.ValueOf(f) 310 | if v.Kind() != reflect.Func { 311 | return "" 312 | } 313 | fp := v.Pointer() 314 | if fn := runtime.FuncForPC(fp); fn != nil { 315 | return fn.Name() 316 | } 317 | return "" 318 | } 319 | 320 | // EnableAll returns true. 321 | func EnableAll(r *http.Request) bool { 322 | return true 323 | } 324 | 325 | var profiles map[string]*Profile 326 | var profileLock sync.Mutex 327 | 328 | func init() { 329 | profiles = make(map[string]*Profile) 330 | } 331 | 332 | // StoreMemory stores a profile in memory (concurrent-safe). Note that profiles 333 | // do not expire, so memory usage will increase until restart. This function is 334 | // provided as an example: it is not designed for production use. 335 | func StoreMemory(r *http.Request, p *Profile) { 336 | profileLock.Lock() 337 | defer profileLock.Unlock() 338 | profiles[string(p.Id)] = p 339 | } 340 | 341 | // GetMemory fetches a profile stored by StoreMemory (concurrent-safe). 342 | func GetMemory(r *http.Request, id string) *Profile { 343 | profileLock.Lock() 344 | defer profileLock.Unlock() 345 | return profiles[id] 346 | } 347 | 348 | //go:generate esc -o static.go -pkg miniprofiler -prefix ../ui ../ui/include.partial.html ../ui/includes.css ../ui/includes.js ../ui/includes.tmpl ../ui/share.html 349 | -------------------------------------------------------------------------------- /miniprofiler/static.go: -------------------------------------------------------------------------------- 1 | package miniprofiler 2 | 3 | import ( 4 | "bytes" 5 | "compress/gzip" 6 | "encoding/base64" 7 | "io/ioutil" 8 | "net/http" 9 | "os" 10 | "path" 11 | "sync" 12 | "time" 13 | ) 14 | 15 | type _escLocalFS struct{} 16 | 17 | var _escLocal _escLocalFS 18 | 19 | type _escStaticFS struct{} 20 | 21 | var _escStatic _escStaticFS 22 | 23 | type _escDirectory struct { 24 | fs http.FileSystem 25 | name string 26 | } 27 | 28 | type _escFile struct { 29 | compressed string 30 | size int64 31 | modtime int64 32 | local string 33 | isDir bool 34 | 35 | once sync.Once 36 | data []byte 37 | name string 38 | } 39 | 40 | func (_escLocalFS) Open(name string) (http.File, error) { 41 | f, present := _escData[path.Clean(name)] 42 | if !present { 43 | return nil, os.ErrNotExist 44 | } 45 | return os.Open(f.local) 46 | } 47 | 48 | func (_escStaticFS) prepare(name string) (*_escFile, error) { 49 | f, present := _escData[path.Clean(name)] 50 | if !present { 51 | return nil, os.ErrNotExist 52 | } 53 | var err error 54 | f.once.Do(func() { 55 | f.name = path.Base(name) 56 | if f.size == 0 { 57 | return 58 | } 59 | var gr *gzip.Reader 60 | b64 := base64.NewDecoder(base64.StdEncoding, bytes.NewBufferString(f.compressed)) 61 | gr, err = gzip.NewReader(b64) 62 | if err != nil { 63 | return 64 | } 65 | f.data, err = ioutil.ReadAll(gr) 66 | }) 67 | if err != nil { 68 | return nil, err 69 | } 70 | return f, nil 71 | } 72 | 73 | func (fs _escStaticFS) Open(name string) (http.File, error) { 74 | f, err := fs.prepare(name) 75 | if err != nil { 76 | return nil, err 77 | } 78 | return f.File() 79 | } 80 | 81 | func (dir _escDirectory) Open(name string) (http.File, error) { 82 | return dir.fs.Open(dir.name + name) 83 | } 84 | 85 | func (f *_escFile) File() (http.File, error) { 86 | type httpFile struct { 87 | *bytes.Reader 88 | *_escFile 89 | } 90 | return &httpFile{ 91 | Reader: bytes.NewReader(f.data), 92 | _escFile: f, 93 | }, nil 94 | } 95 | 96 | func (f *_escFile) Close() error { 97 | return nil 98 | } 99 | 100 | func (f *_escFile) Readdir(count int) ([]os.FileInfo, error) { 101 | return nil, nil 102 | } 103 | 104 | func (f *_escFile) Stat() (os.FileInfo, error) { 105 | return f, nil 106 | } 107 | 108 | func (f *_escFile) Name() string { 109 | return f.name 110 | } 111 | 112 | func (f *_escFile) Size() int64 { 113 | return f.size 114 | } 115 | 116 | func (f *_escFile) Mode() os.FileMode { 117 | return 0 118 | } 119 | 120 | func (f *_escFile) ModTime() time.Time { 121 | return time.Unix(f.modtime, 0) 122 | } 123 | 124 | func (f *_escFile) IsDir() bool { 125 | return f.isDir 126 | } 127 | 128 | func (f *_escFile) Sys() interface{} { 129 | return f 130 | } 131 | 132 | // FS returns a http.Filesystem for the embedded assets. If useLocal is true, 133 | // the filesystem's contents are instead used. 134 | func FS(useLocal bool) http.FileSystem { 135 | if useLocal { 136 | return _escLocal 137 | } 138 | return _escStatic 139 | } 140 | 141 | // Dir returns a http.Filesystem for the embedded assets on a given prefix dir. 142 | // If useLocal is true, the filesystem's contents are instead used. 143 | func Dir(useLocal bool, name string) http.FileSystem { 144 | if useLocal { 145 | return _escDirectory{fs: _escLocal, name: name} 146 | } 147 | return _escDirectory{fs: _escStatic, name: name} 148 | } 149 | 150 | // FSByte returns the named file from the embedded assets. If useLocal is 151 | // true, the filesystem's contents are instead used. 152 | func FSByte(useLocal bool, name string) ([]byte, error) { 153 | if useLocal { 154 | f, err := _escLocal.Open(name) 155 | if err != nil { 156 | return nil, err 157 | } 158 | return ioutil.ReadAll(f) 159 | } 160 | f, err := _escStatic.prepare(name) 161 | if err != nil { 162 | return nil, err 163 | } 164 | return f.data, nil 165 | } 166 | 167 | // FSMustByte is the same as FSByte, but panics if name is not present. 168 | func FSMustByte(useLocal bool, name string) []byte { 169 | b, err := FSByte(useLocal, name) 170 | if err != nil { 171 | panic(err) 172 | } 173 | return b 174 | } 175 | 176 | // FSString is the string version of FSByte. 177 | func FSString(useLocal bool, name string) (string, error) { 178 | b, err := FSByte(useLocal, name) 179 | return string(b), err 180 | } 181 | 182 | // FSMustString is the string version of FSMustByte. 183 | func FSMustString(useLocal bool, name string) string { 184 | return string(FSMustByte(useLocal, name)) 185 | } 186 | 187 | var _escData = map[string]*_escFile{ 188 | 189 | "/include.partial.html": { 190 | local: "../ui/include.partial.html", 191 | size: 502, 192 | modtime: 1456280857, 193 | compressed: ` 194 | H4sIAAAJbogA/1yRQXLzIAyF9/8pPOz5c4E4XXTTLrpKLsAAjZXB4JFkN6nHd69swO1k4+F7T3oS5kgW 195 | YeDG0CPahh+DbxX7Ox9uZjLZUw24VvUQQQ+YPiF4VA2hbdU8GO4WiDaMztP/G71M7Tx5JEhxUY0zbHRB 196 | KX4y1t4aUSQ7IvrIep03F3h31QVHIst3T0gEnLPrsVqMMIEJ4lCXvi6Z9jEdBCfZxX0tWO3e3KXfWL+O 197 | E7hs50s6S+0ekSJjClQjClbbjNwlhG+/XuQX9u3S9Rq8lk5kO7LUZOVchFpHbJB1B87lZVd82+jpnrqH 198 | EIC8rLX9pCJ//FEXdToe8oOe/v0EAAD//4yIcAP2AQAA 199 | `, 200 | }, 201 | 202 | "/includes.css": { 203 | local: "../ui/includes.css", 204 | size: 13910, 205 | modtime: 1456280857, 206 | compressed: ` 207 | H4sIAAAJbogA/7Qb627bvPX3/BQaig/YiqhwEjt27T8rBhR7DUqibCKyqFG0nTTIu483SRQvImVnKYZ9 208 | knjuh+dG+kdDcIkqSFIC23NFHxbDm/+eIUGwTT4WSZLjCpNd8m29Xu/ZY4VqmB4hOhzpLnnkb0pc07RF 209 | fyB7fmre9ovPhYk7aQh04Tdeq8U5LpyrzfdqeQUyWLnWWx8UAAVZ5SRgfegAMly8OwHMDx3AEYLCCWB+ 210 | 6ABKjJ0WsD50AMS5mjiZcXPiWupmuhCOcALkgOpdsuRGb0BRoPqgnjJMCkjUg+4Py+Vf3atdguojQ0j5 211 | iwskFOWgSkGFDgxnBlrIPUsgA/nrgeBzXaTK9ygBddsAAmsBjBl0WeHrLrmgFjGT7QV3b71b1phjcrjh 212 | tOWFlFIUTrkCTctk6P5rkDNlvOSd8A4qwEUBONQNdkcui3O5/CR34Jm0XA0NRjWFZK9tyuVys8nzGVwI 213 | hBS+0bSAOSaAIlxPKCySQwshMx4k0qAOrB+dl5TghKr3XfIfWF0gd4iH5BdBoHpIWmbxtGWUSr8hh7d5 214 | hZhvpBSdmFlazVtTihvuhp6wNLwQscKMdyrkDf52REUB630n8fABVhVqWtQGqJxrREdEgPgLQFGCLkwp 215 | ArBAbVOB9wmT2XDUFXFcy5LvDuaSv6NTgwkFfPOFQ7snhltU6/Mpg65w5dDWyFf+jesWV6B9SE64xnwr 216 | QuYuXk8xKY4kfBR/AThUl3jwchWwCI80MYAafXCSIYa5DGBRqoLlTAxMygs3GFKIrkdEoYhGkDvElYAm 217 | 5BJqh9CjDHZWqP1WluXe4aDzpR9ITXtft6y4UyRNTUd8TU+YwPk7xsJVnGVIm+eHtofdrj/dG1jwkTui 218 | gpTqiWgVDHA2OhXIhbrmbcxoXFa8m8hXMehH1lAlSMr30S55CWogP7cUnxR2EbsvCF4Fqm5PKrvwF6ra 219 | 4anDk+aDmKdcer4/eInsmBPSND+iqlDCjDWzDSc/VL/6siazXQUB2WWYHqPQgGGryCLw51rUgP0+RLXo 220 | IbIK56/7gaZk1ttBWGR2JSKG3CNM4ZxP8eHAZGOVRK8B3Q0Ywml4vUu6r5yxcWrRjLIgzZI0cx/dRMwe 221 | zB2YwtZBObVua24YG/kug08jAvLQYQRyjKqme0nYTmOsoKLvNQWjV1XUZ7gqRp2HlPyWlGE0NhZGfWvK 222 | LO0XI5KQuUm7LUqkcE/xVhze4KLoRHBwB9f833x3Q3UOudMRV9s5BTkKznOjm41O1D4FuvjQWTuhcwfm 223 | VWlGIHhlPsP/j8FVXYd4RQU97pLnZTg62BwdQCO4mqmXDmzCVnkwJ06i/cG/vstk45b+VtwTqXyz2XwF 224 | 3puraz92q7XhX9rZxaBNQEPHTFdTwPIYsZjPoezS45C3dNySbJf8Lxb69VoY9dVyuc1ioXN8Mmjzf7HQ 225 | 9L0ZQT9lPx9BdH6rDHeaJ3dzri25Z0BX90BTcLiDc0DHtMtyHvTF4jw6C/0oYG5xHrT3FZCaZarJoKfW 226 | JN+jVrnbhjtAp8JUGVSuwm1Puvxizljr5vhuBIbI+rQwWvD6LEp7G8pZecWgimdDhuM/oqd9Y/XP42qz 227 | 2j6/rJ5FiYdbJOeIJXqDouoTHYknabdab8CqtYdkYoEsFvgy1UdPtAoGXk1aLMI/wVVr0dILPY3smZGt 228 | bXsbJPR2ryPA2WSmyF4RTUcVs6wdUwIKdG6Hdi094T/dQvlNrVelZrcujCuokS8RcBJGM9csWk64kUo7 229 | DSmlDL3HVvwFpBdgEY4m1iWCoKIU1qxY+H92NsnXLG/jyox3NtXNO33NgSmskK+RL8JpbqDmBnS5m1LL 230 | TG9zerMVg+/dFjeIeDsPE8r6mzEXYPmjeyXnUjdrL3rDfnQZRzuy7NkJ+uuEuUZDK1Ntrs3HuIiP82yx 231 | O8j7sESI4Tb5TXLERhC21hk+PDg+F47qIsIlfVvV6BFdVcpyenzVueXU8AvU6NSdvsJrynpG1sGvW3ml 232 | op9IrRjSjT2U6kcg1tGwq9IydWE+pyCn6OI4rnOpyAPsmWycAMG4voutiKOJOXzOwxbPmah/v441R2Uu 233 | /SaqMr9FBN5GfBX/dhfmYL7G5AScs6nw1uwPD6zLR/NO6dT2KWAJGF1zm/knOU4OGfZ6urYcTlON+a+a 234 | XaqJ5vjlzD0+YsccO4858w3BdHQNbs5NbFx8HHdvIGNyn6nnVs/4GMDU0ygMMk30ycA1nB9fStvKhcPt 235 | DHCmWMs1b6yDBgX/wA/3OFk++NdvfAzJK7w2vCZGwcNzPxA1xtvPUqrOcbrXT44Ke6TLogiGCCcLWjTq 236 | Ly5om+1xuNk1KxzF0BoeuQ1BVY3PFoJD3Bn0zCsV5rnlPORTdx6i4IwDqaXvWDuOCc9JrOlCz7fT0Lr7 237 | /gKVds7ytPGcazkO92NjzHM/DnpWEUEWi92Tim3do2OW1AWG9H0IDf27t+Fd/JGfSxxb/Y+bYM3NtGq3 238 | V3E+70Nip6cvwDVakDKLe7OL7s16knM0Ut18Mzt4hoNPe5eLDGaSA3FhTn4xhrJFyx8bf04ahoqjSSBj 239 | kQmlXFheYbV1lJbnqnLbSkH+XBsCc5dUzhWNz9lbBQ0YROZNOpq7Pq1DqcUuZ4xkZaQw3yn3bewGsoR5 240 | wr7UqkMp4FamsP40xD1JmM3cEMztJHA7sqPjztN2XBIoST33fb6KdGdMTzC7Q11WvFy5Sx7PZbc7KFt3 241 | icZ69g1LbqYYSJvr9a0E9VzahR2+69xX2KLRDdfjb4uKUdnxRbU7E783ebpXL64bPxOdxR2UjGA1+yLL 242 | 58K4465Ss0yKSfKh/ejC/F3Cch+AFr9bSSjZ1fQovf4fuCj+yZGaNc83COE+mY8PXmDtRshrqCBCknwM 243 | 8oUW8x/VSBC7YsuybN/71Gq12lsjg1js3GWNlnQdAc48rgfaivWepWkBKNtkoyaLre+Zf3l5mQCWHYzm 244 | Xmp48blY/OsVvpeENVatNmrkzrj8S12cdOjt9+/fv3794t75yf7H9/vkWrnwc/G/AAAA//9MOPbTVjYA 245 | AA== 246 | `, 247 | }, 248 | 249 | "/includes.js": { 250 | local: "../ui/includes.js", 251 | size: 177543, 252 | modtime: 1456280857, 253 | compressed: ` 254 | H4sIAAAJbogA/+y9+5/aRrIo/vPJXyEUn0EyggE7j42whuv4sfGexPGxvZu9lyH+aKAB2UIikphHBvZv 255 | /1ZVP9SSWsw4m3vuL1924wGpH9XV1fXq6mpnuUvmRZQmzlWULNIr9/YLe5czKy+yaF7Y4y++OD21MraN 256 | wzmzijWzFmwZJczasGKdLqxllm7g9W+7KGMfc8+KllgoY1aUW2FyM8DaxRp+wP8TNmd5HmY3VpFa4WUa 257 | LaxNuoiWN1GyoqY3URItI7awdsmCZfk8hXbCZGF9/G3HoFae7rI5oyajogvtpYW1TfM8uogZNtldsJgV 258 | rEttbbN0y7JCQlCHG8DJWF5ADwvLAaCvwtxi11FeACyuFS4LllEtMyRxdJHhOLBWxlZQDYa8+OIyzKw0 259 | i1ZREsbPeXeBxdE64N2Pv4C+nGoZt1oEqsgpgRFuHde6tQ4wDdj4T4CgN1m6jGIAL7DU3FlY6gsLPtW5 260 | wydY74FHX/HzQX2DNuX7dIut5GWpeZoUIQCTVR9laawVKjbb+Fk4XyPIt4fy+ZIV8HDxapHDi+ms9gIQ 261 | rN5YMDd5al0xoI1LGNJ2F8cWoCKxQpxAPs7iKpoz1Ub4Mbx+V4RZ8T7aMNNY1mH+YzoP43cwueGqgk6F 262 | JYIe5q/8hZ+MFbsssbqxVr1rRYmYH+vkRHybVovMrE4QWAnAPlbtHax5CIO1HOaae1mGcc608vTtoI1j 263 | xYp/AOkB3GzxX+ymMo5P7OZNBtRyrTcuGlbvrJ7V7XfhXzG7g0ve3LjRVR5eMnP7HryPd5UxIAF3akh2 264 | XKRSDsAYxqIKw/zOY4YUFi8QshwwWKw5R9iKHqBB4BQlkaSZ5SBUEYA0HMOfJ5aO7kHMklWxhhe9Xh23 265 | CJtTKQx9OpFr7fdWt+sOYPbY9c9LHX9nVn9UbwY/lVYytkkv2auCbUytu+NK7YM2qToiCMvET/j4xXR8 266 | YepxWpt9DeIZoIUmpTmPcRou7qYTAAVxTN0BV7z0rDCOgbxZmN9YFzfbEDgqMOR0CSQM6/iOiUfUCv6F 267 | LWK/gzX0qXDd3WyTlFoKugrdklhp0eh4Es/vi4smDojHvGfAmsKC5RVs5Ls5CiAdF1jjEy2ubiHrdL3K 268 | dBLoiFbELvbtjr+o4IQXqNPQA6d7kS5ugOjC7ZYlC1msSisCJMetcwL8MOAQ9VYHgAxHLuhtCGsJVnmU 269 | zOPdguUD5MiTy8Cw6D0ND4uwCE0kj4Npe0fAAgEjAjyLSo2NhRrjPlLWMPomFuhXAz81TvksjlhSvGEZ 270 | UPYmTOY6O3MMTFJQ7FavwFm4NeF/fEOZFmp7y/JdXFRpLVo06Gxeh9GTj7L0gqHu5FkfPWsLXxb437VG 271 | Z8QUNYYIzR/lg0ivUGYazbRG8NMAwqpLLq0UwaUKNDitQNDmTWGimFobUArYKCHKNN80wI98gB9hgHpt 272 | NdKPzZGaept+nA0QAY1nuHhQbbib4PCDEC/jXb6uFz80UYEID9Sam++yDHp+RUyhDTGVKTCRsOOOm5WJ 273 | 4TQa6PA5akMOKsykkV/sVqsbUg+3VrorFL3mxmpEtOkWueOtlYSX0YrYu4/KnlVEoK2v8LtaEKb6vBi0 274 | 8GDArgvkB1i5MYIBL2caMX6IOraoiolyLQOVGOKlBiCsfr5K3ghLwNm6qMJ1Hgyi/KXkDbzkdDtzj7WJ 275 | H8TEQBWHEanvZuaGnyZRtT81zuygRPsx+Ai2sigstAXYY/PiWbpLinIlGNutFjaPxQyxiZARkpZJBCpc 276 | h/NPZPwtFtZ8DaYjE1g0E6DGZERppYKLBwMUyrik83b0EBlTaSpYmmT1JkxsoQREa2KwjLK8eAMGErGT 277 | ozPTQulT+yW2YVEjFrZiI039BBJ9kMFELI70Zz20RsPhsBVa82z93x/FU7Kaf0Ql9P4Doko/iim4e2T3 278 | JM+a+sBVKRx/xXyUfBPJqiKuar+FAALldXhE0lXWwW3JIDXWST37VRu2FEoWsdJ661WITdLaII+AxyVP 279 | sywE8wR0idIgd0G0DnF4hgLcMKcSRu1wcY0aTllysEXZGIGQ61sjw5p/MEDQHTNV7bLYt+p6rNAPagq4 280 | /KAiieiMFj5pSA20+3epWH5N4dqm293Wt0bWob3H9zdbaLj7MU+TFrgKXuLNz+/et5RA1wl0y5uyQS+O 281 | I24pnV73r66u+ghtHzDCknm6YIsxsKswy1kR/P39y/5fbHOj2yxF5fk5YaXIdjBWw+eY3u1r+iqO7xgH 282 | KElITXu72EMKxAZxfdnraLFgiX2XeL3YFQUskHV6xWH5bKHahnowiVjB/BYvkHGcgr5znCcGQ732rFEL 283 | QAbWc8QdQP9q5oOYw78hroIjs4G/Bz+E+fMdJx32bJcX6eY9l51YtepNkuXvWex9Fl1GYXy8nN4W8COy 284 | d24PxkI/RsknfN14tN83q4jOf4riOMoZLBVyDkrWUDTf1uq/TdNi8CZEhZsD92ohu361KMvq7o9FtFwy 285 | rGDlLIPWo9/BSAblJFnEDBc9SABVJC49U/lVRC49XPDpkndBnLlp/c9DkDfdZLe5YFnXb9CIXhVZOruy 286 | YB0zp9Jkk+AuMhZ+Ghs6Qo0+WRk6gsEOXr94382tv4WX4bs5KP7FOzVmGD5im484zK1TAmL0ePiX4aOv 287 | Hj96NPzma/e00SYSboiiAyA/7U/OF71T0O3Z/C7oSfxiPSlOwWIyut6OYWiLjPFVUvCWpsNZ3fuGn+ai 288 | rGFOk5hiCXLSoSF4JV15ltRFDKv2vTRtqutWmkaetWDbYl1xOXOz5PkuI+7/S1SswQp7to7iBZBabQXU 289 | CptXgCyEPUEd6rHx1sAIxJvq4wmJEcuvL/+ymVb+01jVhj7Nz4EltIBZc7NJkAW26oRjchvXqhzzmGjj 290 | lMWn0azJV0QZnbMco6Rmk4IsQN0xiZTPoJB+YAL4OLlUF8fB5GGstUn7NMaFg3w05Z5svl2W7y6KLJzj 291 | DhooMFDdWghg8jopvZIip0nnx4b85DPEgkmstbwoSVDB1UJ7OnnWKchQxiQmK7Q654VBnpS+jeO94Eer 292 | eXRBT8vmDT6KshUEE6E0MmI5L741NGtY5DaAt00ubO5zIXmICTMV7GgruTLcu9axCUfomqjgJmpx2+il 293 | Pmv5l5URn4qerV6153usUENrhORez1yO7Hq9i2fpBqyfxTvSCtDaK3E+bS84O+oB0Ku9KgUB4iTbsXZt 294 | /S7hoRPpnY3dqQe3VzcyO/1zPxwd7+Memkgbm6jhoZx7syLVMevkeitHVau7+m/H050MAT+tTIGQch+N 295 | 7W4oDUussvKavdyjTe4xrTZocIzeU4ge0ZKaxiCwmgXL5NblUXtQsxvr1rLY4HrgPEAhuXHktqbT/VJG 296 | VMguulzTdV2DjluYwEjCDfOs9HgUBdWGyrhSZIDIFGvOUNA69WeB9WGgYHxAXbiDdbGJHbeu2qeDDzmL 297 | l2gdjhtdYhXRpZPWKgqcYJH7RGgAS87TGB3DK8dmWQbyCKMWfMsGrQ0BhD82/8WObkyWPo2js8knH11f 298 | UKxKBXJ2K9qIjMRxa4PEFgZRAjZt8T0DKcrKkiWUSK2meny39n3qqNAfvdtyNAQi1VhGycLpDiRV9fn7 299 | rlvlCuRja69Er7t6V6BXip6uQEJaCBfqAglMSwZQyQASjPgqQIHkLaGck9qm1Uc3H99oyBH3CwYDiksl 300 | lDc/oELVECrx6hm94d+Fl9Adk2NHhzLfhBitJHvNC7bNKUgMgZun8W6TcGDD1SpjK1xMSiEGA5pZ3DNm 301 | XdxgbFoI2BmLSIwiXa1wSOUqwwfsByrvCHgqsMTRal1cpNekRkL3GKYWsXLIVKeBfFGqj1jqukaEiCLk 302 | l3vgoLbvemIuDSiJgdUVMHbglw2KJZpqgMCbgs6Vi12q+Jvw+j2YEyx/n2LvJmJ/S2E592md9hscnaEI 303 | IsChOyb+p2G8sng59murt1DWjBnRvLW+KFZfIvztM6KY/K42ONH0OX3ljaZ4D38Nt2VDW1JiHfcOqPor 304 | qNStL3pe5lVRlQPposE0Kf4oSj7hVi8v0NQOPsVhjnBhuQE6152ugGGOb+qDwQ8Ml71n10W1Fj7tF/DY 305 | VAWntFkFn8oqFAJFG1dzXMLEZy4Y7aw0la1cEQG1hk3AyugECrTa1oeM9Ep3yLWiAukCK9G+Jy3vDGMd 306 | C319U0eo1UnYTbpbfVwckqaWYxy0p6ofD2YwkwwGFNHkuQM+YY5ES621EjCFt0k5h74ORLPbN4iYpPgh 307 | zaLfcUnH7+YgvGLF8BTIWuXK2hmEi4UjyNnVf+B6MPI3wzp8VXA2p/VX43IwU5xJYUhFzgoLFASkI5xx 308 | sZ1N/F107lkrmPk1CxckHUgkAY/eVDik5HqEIMFN0C/Bv+rTmSZ93LHuNgIWSvAFBkwxZQbwjfDhXiMJ 309 | r7lwxLRCKz01pj3kEiR9mu6hM5EErvCcqjSuhjNesS6iW0hN7pPi5U+peAV2TuFR7nT9y4hix5uopDJA 310 | v6yuBBgwalD/cRyi7TdYL6fAiDYhxXchFSxNhgbEEmXfEyDYUqXlAX5HijNpYk3OhEsRo22tFKP0+ajy 311 | lqHr3XrVXg0tX5DGSdQjw/nThGFoNy07tmj2QkrFcQRX3O6yzv3oQgh44ALPkHM53Rp6+uiqvGQVLPEu 312 | WPEcaDnBsMm8AV9NpZL6Q/XxfThZc2h6v/cbI5fQqF6L0W7TPOIxjwN83rdGJOzkYysRgginR2rZ5hni 313 | MTI/MFQsSaaL4yGDNT1yanQK2poqW6natzggXw0Jkk34CYhkl/GzJNw4WKQsT7qFxQPEgJJiziGtZRpX 314 | gYry71MAeqNtEHJ76Y0YoIo6ti+ooE2Suj8aE+PLOWvgVSjGmWvLvCydA0lSDx8Rb0TAS+XcrRphEhST 315 | HnQhgWxiDTAhpipdLoH5qomST3cFy36QhXtaCzmR0Hs8EUKYXIHgER2lS1HdoL38yJbFPdAVQzGFrC+a 316 | 1rWiZFkVA0x54xOL1wbxbmcIuD1urvUGZIM5rMlbq8uH0PXFWDyrC6TU5+iCpyVdHVxzG03QvAoyf4kW 317 | xZoQ/9glMkCbwUKIUW4TwFAhzNkCyQHY9DJa3Y/NHx8YTCvAD/9+/pDMk/WnD6vBgVrY1t32j1QSFAsY 318 | NhilLAIEz8L5umZm1hro4dIhLUwtnJqxKRrlqN4Ck4fl3M8EhmutnYnSag1OgBsBtY6GKlijgQqUgJ8l 319 | Z/gRkTtFTRV+FMcm61M3bytQCMu7hv4LCrA1WfYXq7pCId60e2REAR1Y4gAA6n+ruhermgaFuwyiJr6x 320 | 5RtbawbZptZMnXNCmxyJ5tMQAtxqkUOJM81TUUEZmiTKZaHHY9NcY0zb45ojGziuzrurL9ealNO5+iPr 321 | IbT2x3Gt67PpNoQ3sHrnn1YUO6lewiQ/WUSXFtnLgW2Yb/v0TJ29eJ+qwxhipSgm9MBZpPMdaBuFJpsO 322 | bsUfgh8drDmUFsci5cjQYACNBeV5nOK+L490I8uCeIemVUjyEKBUeOJaMsQqItZoSEs3HlrNNwUGZ0ll 323 | E1WXMCFJGJY6Du4fkvZAFj4d2GzA0FDbJPUQ0K+SIv1HxK4E7Yh36kvdD3gDrPIaFshqTW443bDfZqwo 324 | bt6AslGY1rmxVwP1Kgiu1mHxPuXl61yADn2QAT6P05zlhdMtMqSFosicLlqQfW6d9qNFnSvMWRwjnUr8 325 | cEItsmm1WmCjJwA66llde2YVizrlCloA9N+gSQYL6RJGpEro4GsKTctj1H8IMOm+M6i3FCxcIRk5DdIV 326 | i0ctF3wxISnJs7fINOdpnGZjDGOICrTecxZfMtT7cN5QEpKphLITFOQit65OxQHgwd9foZTlRlSEEYa4 327 | koRrF7SxtyyPVt2cd2Bt4x10+UUF1wYh2FC6sKClJKHJNyaG+gNDNtb98iV8vv/eEISqSr5dXfDTJm// 328 | +r2j1zc0LzFVqYMw0QrultypT8MEK7rZBp5rwZfPo+WyQtdLPPh55LxKuAi3GPpF58v/lq4TI06BcRTF 329 | 1j895T/zgZieebo5Bd74kc2LUypv7EZsC1GIOnAjh3+JkjLIDMBEmgPW7mjYmEYzID0dp/DERWqtP/Os 330 | R19/7ZZRZPqnfmqG/BhgoMGg0VOYRBvcMcjx1IMw1sU5FqLPaLW66RNNCxsGtx8Ufj08Vf0K9KAUGIF1 331 | k+48lCnzqLjpNJa95MeiADBjsBmbs+tXyc2kugqYa41ZBw8UvIXaNX40HIIpiOD6FZfylWctr9soAuaB 332 | wSIb5MVNzKYadERdXdxGtLPVhYN7clOd6IjQhjAFjYcj08NH7mzwMQUSsD0bJ9R27ftsVh9q3kJ9fmFe 333 | qQ/4NxGHMctzV5y+FWZfAqeSlb6/sb6PwwgP/WPodbwBiSffCaoX1A6W5HZXDObhaaWhU1n6DZKzxWNE 334 | c5DT6SeUoSgm+VoqdsDAcmsKtOqJ/2ZKRPF1X1m7VMu8gVnlxc/WDAgUsyuQgy6MMxYu0KAOyU/HN8cS 335 | EUyK542x4byiL3II8TwGfhng1myR7eYFPAwCi04wlG/LuNLHrlzdnMdXwPoRMEDDR4pJdhtP/OdWelY7 336 | sqdQ7Nw5zx8602H/u9ntyHt8cOGnd69H566IjuVYU3BNFZPhHU1HyC7qDx+ZHj6eubPjI/pPT/1zv0H1 337 | nIl/PuBf3Yl7/p+VwXz+2+OjfhmnoT5u4K+PBkB4VvPto6NvH6u3bQj5MhxejOaPWpDwpTMN+8un/Zc0 338 | ZY8O7l2/7z2XwF++Mc5ny4vH/EXrMJbL5X3G4Lb/uDfowPbuHkZZ6MiQykJ3DA+IMXRAKoj/u7iEiyxM 339 | cr4RhXrku3AZZpH1uJ2cw3OtiTYC5Cxm2tVa7+pQ6XkJmnsToBU/F2bTC9QP89bsIrp9dUHKNI9J+MRu 340 | dtuufhqfNQ4Jy5Q5a7LicpTwZPtQAo0iSz8xj5RbaWOjtTXPwt9vLHaNFaJL0rxfvbCefFdvGOtRjADW 341 | CXPm8dw4Ub6Nwxs/QZf9nHNtsOB2y2U0xwNTg4ZuKsM6HhiCOUBdj8FQrLl4VGAS9+ug1mGLfsnxCBIc 342 | u7drjh451R3uMeEs3qQmiOwjleeHpidTRbEI//2R7ZOmOlsa9ML/JA0tY8hBi63fbPZz/DeEj/xFPn8D 343 | PSEkbIDnUXDFdDlxoTxkg6t1NCdR+Ohb8676GzGDFOxvLlL6e8SJgMasNPxAppmpNqUBj/FgGvi0Qrri 344 | jLbYL8sdgYrpEFgIFA4z0EjceiGajmqR1mNY+FHnQe+zG1jH2OeOwABcvQgnuWYZ9Rw98+rNUSK/w8uG 345 | H6OnTX6kC0D3Td7R1Zu6T1R+7t5HrU7NoeYtVOH+tH38bp1mxXxXEPLMr8COA2XZOf31NbCSB6dRYy6b 346 | fBkWDWac6nqWucmSVzcjBXmLjdUPi1zGSdSHenSHE8NFXoLkaXiBKiJCBq+Q+SIzkmHco9i54rsGxOlx 347 | hOJcm6ZXV1PkOC3diK5UGi4ZJcOzlC1kpNkSz09vMQ0WCCxQ7yv1a8GMsi33jmhDiY9jQqZW/HiEHNFi 348 | 1RVXH2ce4cFt5dfUzBX0FeKhsF1e1LxL3FVlXSHWaemjVRNa9sjKf4tt8sU1N4z+QBRe2xqteStVfJ5J 349 | lHTpuSL+Y3RpcFQiZT4TwaQ1W1DOXy1FWCVERIahNgNtZYttjm1ZxD57Aupa0ni/iZL+Jry2zzZPTrFA 350 | SzFKQmafzWWhU+ir4idvpcMKLhXAgzoA95y4MgpERMTU9ougta5hahpY422sgYVnd/RI2QDkXlqYGzts 351 | 87rIenWKLcdc3y5QQFeHUFUv/l8CbJJqBoA/lwqIvj6bBlrDVc3SuSk88GPYmC57MES/JKkaQPdOaUSS 352 | /bg40hd7uCtoO755IBpND2CVIo1AGbWdc7mySlGeYOJQ80COcAghcs37Xk0+r6fQHLwl+fRKpE+DceUM 353 | 3fykOotw8yKVAjXCyHIRDILm0Q76ymjH/S7kl8DaWma26u5+E1QRPArYFBHlfNKqGpjGl9t5GA+RAzSL 354 | kQiU0ekP6zIKQWYJVyId3OiLA51XjDQMirWX2oInWqKJpFcyxpUaQ9c0kAydHImqeDmqdVi1j4hv2YSY 355 | WZXUi1IREdA36ui52BRFYh629lVUp98cD5yLwFadz9aYxtHFdw8wDtVN6I+oqt88/RhePxPZKiqrDWz0 356 | 63XmIW0WpiOhOAAo0IJG4NC7GIOqKp5W4QxGa2M1sKb2cPiX+Vd/GT3uf3ex+Lb/1VePF/3vHn/7Tf+7 357 | r74asflXi2/Cv8xtzx59s1w+/vbbi/5fLr6b97+aPxr2w28vvu5/9+188d0y/Jax8Ft71gCDcoxSjzzz 358 | K0CLWW8ASVtADvsB1CyQY91/9vXF2YeydVkoh6saO3b8M+LH6Hmyhr+9+/k12lBdTMBJCmzXmtDTAfmt 359 | 9CZ9i12GsfbEfNqvMtFNOuMTbf51qPrB9H2foghhYWEoMWbPUflLpBYvg/d4bALo3FKpXuBJmW7uUgYu 360 | j3Ij8wh0WEAJBiEnqdrJbKQeRXTxFh+U6bE4WVYh5ctedKn4CLrwcKeUQwx8vurDly2r5F2aHmp8SImD 361 | 5FqoT/Hx0k5zMZm8SaKRgUquZCIkc09UvObbauRokukqRNhSCxUYUCtRyjnw03dvrKdmpAq6dt7d5G6d 362 | sAGn2uvBL+ziZZpt7l1u8Ab47VsGEiEvfgoT+JHVqxrE+1+FqIgS4KJoS0GzzYaansRmGUDgHeAg93gl 363 | +mkYc4biIIk/gOgTT7XJy0kgesAYzUftec4S8zs5gEywMQAbiyJsH+SztpRywnlNZSoVnl6GURxeoOcA 364 | p0eV+XC9iX8oiq0Ywl0ZHyVsOtc1APfHubA+kDu5sQ7R/22uLD/34M7yc98sjcdy0uorGXdqraf5dvCa 365 | 8RNGuF1tXr2Cxj+8uGbzXcGeicK0AWJLMm3kzmqpZVUywsuOf77AMIgW7QBTLLMyJkbWNkpwVSpoA8CQ 366 | BE5mO/8MsPAj+6oXP5JpVCf1aq0BrB2xbv49gr83sf9PEfo9idxEyjVadlqpOYzz1CicXlwXf3tHdz8A 367 | YjF9ccKzUUVkHV0wdIbtci0AUCf8F3jGrV0cwesBCr77lBngaeo7xZMsTRdToLdvBbqBiJQB/Yt790S4 368 | oVDCCowLyzEtIQ1RqmJdi2LDKh1osDiN8roH+Q5dngMbLbNwg8FPqGTttnjcK7cWKZ6RIBDXRLlNC4j2 369 | yaB93JboGJXsNqI1bZ4Z6AQ//78yz3+ZF4xO4z+l6fuU3J7tRCz40nEClswL9O4ixZqo0PAN6Fp6zTR5 370 | 1kh4aDCw63OIXrPBvzGRd07j/+0pvHP62iyxY3IcsxTnu+02zQoycZ4mq10cZn975wkXEXC3nB8gCvNo 371 | bv3zpx91FS3lwsdgCg1C3pJOCNXKx+kBsfkBVVfAZ7WeRiL4viIuj5bUPQ45qcp04w+aPcY7AYjOkWrS 372 | hHZJQBcv2ByM1JVxk0xfFlQNr/pR20G0d6oRAh58bSs8wNDcD6Zeg6MiQH4aDWJeFqulUd9qGWNrzvO2 373 | 8hp60+QtvsXUMuwZvdWRfWdqc+wgUw3gqL+6j97dWO7/tuovIbq3+i9B+Z8yAfDzGWYAftpSZ7emnsZP 374 | 9Dl0qiy3o3AItfneraLjO74hKMiYJX9Fqzp4t6PqP/CPCpIQRI16yP/M4uY9/QkLGhtSi5iux7lj4dav 375 | 0EkTzE1eX6D/8R//8e+tKWigsXTgGQLyZ68Q0axhIcCbP0rVhKY/hZKxpT+ber8wAEDy8h4dtd7ehIH4 376 | jB/0yK2rMKFz1Bcqiw8esmQZbhiApj7nJoKWcqgROVg/DiTA1DfWkqg4lraaKJAy+mLmV9E4kuALDuX3 377 | N68WThdx3pdIr7NznnOEt4E2A/+KbTwtgIQuduh+lbZBpSb6iStbaQ+qLX+ov/9Qa0DsjFjGW+zqw5Rx 378 | 84FlgFCcbRJlTBKLYklCypDbXh8LNDYMZW11o8vRJkQpOl/V0hBf2e1NRO12El0pJBqIRHrywul6rX1t 379 | y6PaR4YtCrW2Uou9OtaWSOaTi7LGJonttbaAhwILyvrUdc18BUFSqaEwEFNGHd+z0c8GSaZH2mj5Oo8B 380 | Z0hNez8wWzr6owB3UYDivWbZDs/nVtNUmXNYHm9XnqrucsmstTsvkwX/oYZVOEKj4TJA6I80XIYjNJsu 381 | 3/3BxmmvWKTjajav7SSr9tuco2a9BpY43nORt9z+EGJCQvzX/F5wQ19+MZeqhiD4imOYS2u5iXyV3Mis 382 | TDXXgG962N6PnlWoPNBvLl/LFOeXD460LyjLN9xrqn8U4/fLr+aSJUH52vcW/FR4ql/73QJ1SVG+/uNO 383 | P1Vjg4yyMKevQL1oPb4gP7g5XcaU8vDGfB1mDC+NkZGfHj9OgME5FMxD9+g2mqrF8tSjnvrYXJvoK0Mx 384 | 2uP/Zdmjl1HaJ4IKg5Httt3nIz+mnFx8Ld/Ty04gaTG997t37kie4kpI1j3C2AwTfxVGIkFH/Q2YFlG+ 385 | thq3f8j3YHxgrFSFaloj+HhjbqtjWZsp/RLG8n6vbeOyqaMv6RYv0qxfJHQXH91yRIN9QndKtc50zq9f 386 | SneFo0boiYPlpvLUZi/AEgb8H5s9heD2DNI4wX9sXqN7TszdoXp6q7ss1pIHiXuabHXf6DzPJ5eB3XbH 387 | sKl/ZajMMxYW7B0e6H23Zqx1KxA/rZUcALDNTrwr4TcwIdxIKW8qxQhDSmGZsTiw6ahxjp3YZIkHNuY1 388 | PIUh2xbyFJ4LARGEyRAsDD/8jO235ghfGaa+PtEPShLVvdaelg9xs4394ymb8SOtchmZL4uZG1W3U/JU 389 | 1t/fvA43lRuV5tpbj1IkN44SGLP6a9UG90zuX16TWK2Hl18gWHSPa9h+nZ08B2hu4v4hXFpbtxbHB0di 390 | mR/dtj1L3Phm27rfQsdtJkJQQZJXrP3G5TH4qWSK7nbHd2KYXwjThkvRFDCz7klykW/H3bZQJW208qC3 391 | aTCkGvw9q1Bg1GAwoqGW298m0SLgWUbuRYx5Gx023NE8Q22OqJvOmuKtnseVfCOVBgeqYXl4tn677l1E 392 | nt+XystLO2sVjTRas+34OsC7156nG0tuCNq021S+k47K+vPGvZTN/vS+VBL+J9YjukGIv2pcIiQ/OAP8 393 | CrnGqxadJ7+fzZHQGuQDabnOT63MEuwjujYWo+Xb5AnHj8XREPO0EiUYetaFdgo25KHGmPePf2vGCcqb 394 | 0KGx9oWgXzCgL4QsTRsCtcI8prPmyMPF4n1qusz6+KW7970gR/98zg04rY3cven1+bfkHG2yury9SvN/ 395 | 8J4a/XPnfTV3tgDm2g9Pn/2XT1vXUbJMrfAC73mmXJv8KL1ovkgtzEBk6ajAUJi/v6KUWlwqfRbElcty 396 | uCSW+MZfd2/VVW9dCeOYqCLQSOTuNkSeNeIvenv/xraf+emdK6HlmjL98ydcWaZ/9OVbBwOTEf0JAZCG 397 | Y5PExnj+RSvklIbMh85HZmyOSbUsPF/7RSuoxKvqvI+mscJDJQtt86KFnFlX70gD9tp4WuPdJu8IP3+l 398 | RJtmViE79pQkaWi5soGEXf1oVjXwY5p4Ehq12W41yyJQ3CnZW160XmRFxpaAU0ibM6rIf9wVZ2CuKs36 399 | 45QoRi9uioV6dyw/dO9EybGLn9oXaKWvWym5y3F6wuz2rdqI6vK27OpudApL/sl9kXKk8p2T0Rjk/xOE 400 | 1qAvsaph4AhKm0/alrHo/rgdXL2Fk1W1Fdyk9YS4a9tQXJRLWw2REow1uEU5UsdcAG8Bwheme91c0241 401 | lc6i+VpJ+qkEx7CUKUkFF913xPxTu6JoIMZvng+tZBWQKt9zzOU09nevgFEcAbV0l0w0scVKxftKQ500 402 | ql3TBZz45A+6auqEWOkpoxtjaYoMghKjCGUA9cUN3bBwp8wz2A33FXJmwbYAQzCDSWQ/X7IsDre6aFuF 403 | Wzwl1rzaRVZOVR2D59M0ediYRjj3v7cxE0Rca+CorBO1lLyC4dyDMxuuVJafFn++1pXi5NjXnYz8OFNu 404 | ETsS573AUukpy5F5VhUUTESs0lkqoMpSHMb7bEJIHw3v/m5urAjrrxWiskqq8izKzXI3cdVpVCNMM3uk 405 | dsnvhztS+71q64x3OdDVNROSRQOwzLgTgciO/Aiaz0A2eq/bC1XoHAcgkY5J2fBRSBS8OOvGGeCdGpFB 406 | XfwRTlupeF9OKzGnT385X1W2y6f/j7vIBUlSM3cTZMFPYhr2uTDwzAq0FG/y84An5eWM2LtjZ5QC2rAp 407 | TvBmFJXUw0PpTMwbAcV0QS+ja7ZwHhnSfeFHeqSiNueW1FLM/dxpytWHhPmV37IwJxWpMrt6Kc9ql3nU 408 | Ip+ElrH3+Iv7XYgrZg1rGAy4hudWSFN1q5xx+49iiZhKzz6tVupbI4O42bABXqJyz1lH9BgH+OdPfGtX 409 | prlvH1X7xJdlatNeadsYfHlsz4A2coty10TbAmlh26JR9R5Z/rDE5KhlF0uPgPUrv7RCaFL79bMOtUBM 410 | sXHRKsm22oUrCNutabHR7up2ERbsr1lUCTk27JjIDz+w7rTz4x3uvbRsrPRxbIbk4PKDUU0wdMuOwxxj 411 | GG0MP6rn7qlXQLecb3Ux+ceRpgte6q8v3h8plO/mqEtXKMBw8qT+eeB0CzwwbRXiqgO1m2t/meFtc3yL 412 | 03YpuQlv8g7zmWYxXlC0Z9Ry1Xet7HNoFhcM/DleXgs3OC5gTB2BcUxAEXB3e0Npv5/DdgcnNH20zrCF 413 | aa0lZI+tF6Hrn3ZXg/yU68ChTu/y1nrWV8PW+Iz2Lk3uCYMWVQlbFmHDsKToa7OBBxgb6Mj3uNxUdATS 414 | 2+SSNjPxvYzEuyd9k8/oDvp/oO73EERPFdrx0igPD76k1aPuhBbL5NgS0abr/urckSwY9O/4CxGpBrYy 415 | fv6OGxD5PM3Y4GNujQZfDx7JVyL7+U6V+JgP0mwlXztzF5PMf9d/NBw9tv7GMra5sZ7m608sCXPPkmH4 416 | z+J0x288fJVcsryIViFe0mO9ZXjgD1q2TqwXi6jAjOQNmEALvcHg/2XGWHyD+XNFcOjCIrDID/7Tq/cg 417 | T+YM8zd8Ufqx3VtaygGdQiiCZPDBy4Lbg8cCSmdeHszzdoE4wF4+ioKXoh3tYRgwctd5KXzJsUtvDt9A 418 | +s/DwouDHchGfn+9t4Qf6zD/+Sp5I64T8HIoCkL4Bei+3ha+b0DAr+FvxhY7aOlSfX1Ll0qtsDgl+PUW 419 | 8JUyE3sb7DgFFeUGvohgO+8CvqMseSV+X4sBRjn99a7k8DCvsfchiCgjp/cxUKhK3FvpFlR5RdKl9XGS 420 | +BRyWHnGNdMPVxnS9iJIvMsU5NfQ9TEby0do6zC21REauxOI4zXsGuc7nziml5t0sYvZyQn/OxBlT04c 421 | 8S2ovgg+up74OvgAP/wE/3gfB/948fbdq59fBzYRsj1GCngafCSDA/4I9GsD9wqPubfR0kEdqxMkLnyF 422 | fhNVNAhyV/1ysPRYGJ2OtN6gTE9+d2+hKJl8u2AIVKQsvOhsN96BkQf18AqBOHaYl0x3M2/nJS60kLl8 423 | Bg7UumwkBKBx1gCrHm8wPN5gCE3OPPy31uz4IxIcNDfH24LmRRUHGV8sLJjOxlpq7iBIJszfIj6wchBs 424 | J/TNwRq+8xTqas3svMi95StEgpR5/LF7gAkDwsBOXgT2W6JzzFwD7LC4Efmy6J6CJFWZzi7DeMdsAJwv 425 | C5q/eBHD3yj52BwCTiRHvDpxJHB19mgsZhgGBESVwDBdb43DEk0HwVogygIqdArog7LW4nwD5ieyIB94 426 | +cvFhmtoiLzQvd1NskBNC2IBn/pOBstlF3SGiI/Ozi3WoDlRFiPU717gFfjOC1fOQHbwPuosQSAg+zfH 427 | fVmOmzcbBJf3GjyVrmJAPHJpYnVqXzpRB5ZFxEHTyHhckvChjrvUm3uxezsPwkk47fejmQ//eHVUTucz 428 | KkfYxB+fh1BMBgngoMnVtgpk+Z8N9C0j+qr0PXEYzCyA4XNmiOTOO0MGDt3l7DMX3YqYEK8eBKuJ/HFk 429 | 6dVgOjkRazERq4+oybBw1KAkvNW2QT7KEh2tC3x8gMrYLAknGCW8a/DWYr8nkoow8i4qbjit4JzVB73z 430 | Fzho3lgQLCbiOxFiY8i0zHgLzi7YnZyUXJDeuRM+FX6GpAG0wbnPzzgZIEER2uTm/tCOmtBuEFpqKwg2 431 | E/71TlitHfSwCxrAZiXlcGA/qqzlxPBI162AW8psAVFn5N8gSEIvAKhuJuXVo4XbCfojv0rTZRtQujjQ 432 | ZEbJZfqp3hXt1gcph1rxGe8REBaCl0ttCXmBoiaUFKbeHDYp/GRazFxxUDRBOqLOt/Fu/sk8zPb2LGyL 433 | 17/C3Kbt9B3lL1DgAJSTTNLHdOZ/nGYTGxmD7dt8CdizWk9SIlN+0oKk7jSbAY9L4I9gn4pIOkMODTb5 434 | SwMiDR4Cl6BEFubhEK8b0ENfneLk5KNU6AAcmObpcEaKB/zFSecs9ck3X3/9+Gu3duOWwDL+9BISWbI9 435 | jo3EFTX6o9PhmPOkW0yrg4q2jw89ksX09SDn18SCOLMvJjVW5Cfj8AwVZd4k6nXBLW8y8VRH4YEY1YBe 436 | EDKi5M9GRpTcGxmWCRklLv4NVDz5fFTk691yGbOKyk7ud7Bphp4uQp7WCBe5WQbmV7pxMlAXPTbN+qNZ 437 | wGDJePhPkEhhlYcYwdq2eOrKxZNH+302SaaqdYn2/siFFSUhBhC4qeQMPbVlNoRFIPjxJ5MVUuEoiQtm 438 | yLLkL0oET5PZAfkkbuV+f9MiWz9VOBKxF6fJSaCGEnJqNohz+oU3zyLgCFHos3IqsfwB7/GshE5prDIZ 439 | yGowO4X6gfSWAdfgRkd2xgCJqIBxE0oSHpZiZ9l+z+rv+qOD5Hmcs/cL/hcm0eYKs0DsSxNiSzTqeiMY 440 | xaC7kRTJJqXs8z85mVuSVVHiK0N5Rh45MCaVZhbC6McgjL2U2Lm3o9nB++O2MD0vnfoEwTyAiUxImyAH 441 | J5GAKipXW6iNj3x0xvpUPKNC83SHB/FrhdzbWg+9Hu9jRJVw7tiCrGaDSp21YqS08DI5+MIFDA69sNSA 442 | w7NorHDUC8/OzkA4lHZaOnOf7CZRkPZGfhikclIjXIdFSpzNaJ5PdMY3EfI4QYW8aYtOJJ1r6gwsTKIS 443 | VMVB8tGyj35nxr6EWjE0Ny6/+Eq1l2o9Cb4sR8aDB3/gTxF+auUrshshjfnPgvOW4cyXQ/SQZ3D1hKzD 444 | tua08oohOVqjIx9ZD7SDHpM/AlPJ5jTgFGdTbwtv6AqVmzABmhxaross3d4Jeg3cAxH4ZhtWNHeT1q5N 445 | NGcCP7X1RSKPa9dUjdOUO5kL8Qg8rqHG4nIqiW+/57+EVEByLCahXv0n0aefaXZIRqrtMg6LgiVmtYjX 446 | Az5ACl1UrNNdy8AX0XIJChRmp028hnI64hOwS6LfAv5nV6dCXOg19ZUkcgZitfAKUPulAZCp1YSVUDoA 447 | p4IFrwvenc4hoWWnmIBBHU7DkmTQJeOXqr0TAkIAlU4oeZ4XCWRN2YzcJpEYQ6phS0MBDstRCNVG3xH0 448 | R5mpc0YVm+pDU6UfaeJSEJboJXFNuvdHZaQZZPTH0vwAijgLUC8mqMqZM8AkiZAZ57QBnskk6Gg4xq55 449 | r79HWx2JkpEnASnejtQPyu5sPnG2K5y8DiAVfcnsypLrABWwcXKWjVG7QpsgMDRj90pJWiAkPGldjf5L 450 | Z42Q9rcHJWyE63ro7UoZsztjY4a9TrIp0sssKOBfn/8A5gm6HX4ZzSoOEGkeGjTrau/9kVB/K52i2kKF 451 | 7WS3uQBLSTlxM+VFCirClQbnIShoZE7QjBhDo2fZRFMIdz1kFOgSqtuwblXhIVoSUlhhAGEX7Ssgxkpj 452 | Etz+1WcPnDuFMxzzBdkVWitBcKG6mlReSRdZ5ZGuNjCw9stJ7PfHHP5dBf5dBf4Ms481IG/o5MGIHHjJ 453 | fg/iLxgicaoy00ez/X6kwGBB9ULmOYtixyn6iXsKXGgo/c0lqaPn+2wHsE53vR6Qlpf0ADVKcSGUvdWX 454 | FzJ6dCSaXAkeQ6R+QKRSkSD4IAf+QTkFjKsfDbaafWBy+ymSb3FaaHBii059n4O5Jd2JbFZeJrlAvUkX 455 | 4HpbbhQF2qaREB8I29tqGYyLkm5T3sPueA/SK0msw4nQvR9NIh/UbHSchFlNLboHh28KlERP3VUcgYY6 456 | xal7Gt+3U8DzEClcbpWUs8YdtbZoztpgkuALPEqV55ieV+7jYnhfbptNkkLYA8J3jd+J7XsJeRLYJq2q 457 | uaWldqvM+Ibzz6ttJqIlp+FHy2ymZBLaGyj8gSUTKwamlJjrEAYXLA5v7utrk70YYhuaM4j0Re5ZrkDS 458 | gfYWLQphELU+etPEG83aJh5XIDWHc1cUBm8BoQk9HWgMIQgpiEewZB1ENFem5vriSwNMNhLiuSagjc4I 459 | zQ1xq4NsoVwg5HM2EC8dOQ5kvXEKmrNstIONQvdpEPPel0HRd+J+qrDJ+A6xtn3iDc+C5cShy6YkokO3 460 | HFAdJNcPscciC+mupUB0GQbaRM29pYvKHJ+LC7BX50eR56WGcUZNUMNy2A3cVtHSD8fFWTxhVaiKPu6k 461 | cHbkZYQoObQIhwazHQfZyUlH7YowKFRvBIYWg+Sp1fVSGm5q1PJANJVO9SYZZ5MCN3g6Q9q6Ny4gkHAE 462 | dcGXEm5Imw2KGkqyYJoolai0WLSGK6s8482jBZbmrI7fpJwLw2CksC20GcuC0oQcZ2e4PPp9twCgQHms 463 | sF9XQVmANkdQUEr4O0cpNId+8mQ0aeFYcrsBG0X7Pbja7/U5Qo0E1o4QNmYZ69ivksswhna4OmvzFVag 464 | UVTxlyeudMRkLm7UCFunohFzt0Rg8rkX2i54puQHCPFSOclIXwF08k1xhsoUyADcDVd0y8VklP2pnVAf 465 | nuiq2leUgGFUtHQG2nym9ciV7Kyh2SNRoGY/C/BPBWGyXdwf2jCwkhe5QRCbpkJXnnD3wjQl3LPJd/eu 466 | wbJcmGTHU5OAqMhk3Cdxa3sn2GeAlpKUztto/skAOqHofrbgU1i/pe0N8NFQURfGvmiQ0Bm3vDZR8Qc7 467 | Uxq8RKQyMTNgd6g8cLLbzaqkLS6zy/9kFErXMO7sS5QqjWcep4nRrYfTr1Z11Z2YCE89egn5pDuAFvQu 468 | kshvY6/YEHRKa/+dwcGCrES3bIa4awamyCk8HZ0WWozCfi9cX66+LTmuBiVRIEOiApBgWuuvC1i+6rVQ 469 | wGPpKsXudh35u3DLvbv8KsJLjXfuLd6vYU85U7N4RNfM9kuY+CM06iolX5NBrJXsBL1kUsC/hT9Ef6Ic 470 | sg9/ekW1MopoqFp59n2agg6SqBZ7hnpv2erF9VbrFFbuLsOYlkJ8QyNrFacXIWJWfKOQHqBJVFioqPpB 471 | 1vcqSTP2DLrBV+UvNM9tweuV2Q+z1nhWlFiVlBuV3C0SJm82jWal1W0x+lmM+c5ZgqsrL7LdvEgzULoK 472 | /TdOYghklIJi4lQYWgjcLNQJIuSbe6pACgVSvUCqkYDyVHoyjkmqrENviSELiACJeVo3MzsIdkTjcyXX 473 | oehcs3PIUzHv94Eyl8E7h2JWCvwHV4c7dscU86VkQ865C7QohWaOTsl5r+d1oAH+sKCH2FiOjeWiMdfl 474 | B+2g8pJLm1ztV+sVOwCOKArDmh/k/gOMP906NHr6u0QbPspf/LaredzV4n8nnLXSXyu2UYO6LlFxsHBE 475 | Nr3JYl2VW7BoLypPiRKeDQTpq1jtwHNgeI5mAyPsOB1kQsiLBniICrUaMQK+/XJdVYh4rebkK8bC6/5c 476 | d+xVQiwU4z14T52prbzntmdLAoWvHA3whTMU+ILMAf7wtW7Pqk75qR3ldi+ZBQYHrGJzQaBAh7I9e2Yf 477 | +Paa5sIvtUOQZZVXrfjryCmwsR/GbPJZl1dqSY5wOjgFGtYXoqHJslqgmIsA8iVu+xjlmXxHgQCdKH8d 478 | vnYoC/DLOA1Jc+UTA8/bxCFHM48kQJbNKwjm2zaVnSFIK2HqNRl2gy5e72p+kspWUyD6/LsMjW3rVWjt 479 | HqG9xQ6Q20jc8E/SZ+I6SsP+AcbNFh6aBgdt88jYOakAeP66YbWWHkW+mjWvbuJylTnRVWYVEbFzK/oy 480 | jyM4FuNUcO8md20mPepoGafQP30VgQjuQ3Rj9kYyxOBVcMvyebhl/q19Yvv2SbjZjmE1PcHvcYFfz/Dr 481 | Cr927S58/W2X0vMuPv/y+tG3Y1gu41eDXcJbCqR277wa8CdcTrxXXZHDj5YrCAy7JzR9VXrwMY0Sx7Zd 482 | XImevbIBT4mhqqNVlQVk5T3Wdnlt5NN0qnJq80LwWJZv8AszqxAonti2D4D1Crwem65jcN5DDdPuzit4 483 | ziOvaJXy80937WlYnITHIkwC6o9NUR+ZO8nU7nbGo4Guo+pqfOpoVlBle0p50T5ShAt28rH0veKzhhk/ 484 | rYS1N/wDie4f+F1wVXIPKM8ZspqDoLnXQPRyz/HVwmBv9Hqve7atggonCeiIZCzIXJHvxNVlQFFoGsMT 485 | //TJfzrT8/z83aw3cf/z7HTl0ebeNo3F26D2WhAUvOlX33AgfwtOnYH766n3fXBLpN4Fqjk/hy/wD3zL 486 | 4BtKn/MEvqBg+g/4W+CD3aPho7/AD/5XPPhOPPjOPnjPg9Pz8313f57tz5P9ebHnVfif705X43KgbTG4 487 | QWk4oRmSGXDj6t51vmKmTibW2H7/mys0YA8eaqiqvZH41R7P9CW2fyBWKA/xsD982PaCrj1O1ALRNn7J 488 | 5vF2XloGTvUCaVhF8FhVem7YtkTE977HwCbXy4DZQV272ztPHOfDhyIAZpDBigdZjktq0u36H8RY8bXr 489 | QsEugMlMFVmtIpQXxXey+BjmubfrwXSLEeKI055yhRQAlCoIdA+4j/BME7k6bdyod0AM7ve3B/cWmwp7 490 | 9gH+ouPUxnmCPj1oOeh24c/H+ikcwrhn9+wtKD8VWUXQQI26ndztguo8Fj3JzaMPW3wyLrKbW+66KTmK 491 | BjAaLDCpH2wvdA9zPOkOdsEtd3Gl0oAKvfRAxrcUUjC5Hxsu7FJEMo0rJFBSearnskWl4MCENOFBbq4Q 492 | Z3tzMuPXYWRUQfCgDX/rCJbzu6kYZ2pUbqJX8fmJEGSpzkeXlFHQ+AElaPXAnww39XOUIvk6WuKaR38Q 493 | /tkiJZN04W+qwoUzN4YOVp3hJg2GmwUVflv6nQzuWAFDBw8xSAA6tMkJ2ru0Kvf7BaMbvLPpcFbl0CSf 494 | cIh8VwOAR1rDwVBTf2AEAlq9F93PqoaljUIISeFX0Zr2bmlO/Gbz2uSRI5zUNB6d2FZY9ItyyOXA8VTe 495 | dOLvYUfcgW9djgaj4eCRtZen+L72LDrGJ96/THfJgifutF4l8wEU/PgbvsEDgKfisN0XD0+143ZMbl1h 496 | hEykHAF0Vk4miacTdDLJtJcHofoh7DQvhgIcBtAb2eCBN0fP3BZjbZZ4qguhtr1FsJWn7tbwlc7kreAL 497 | P5O3gW/ybNxNMC8P5V3Cj9qhvItgOYCXG08LAWS63gkc5HqwTCjsDN/QltpVcDrt9WcTZ+KfLx6eD/bu 498 | +aIHP6bsxYxewM+9eyplzHsQhu96II+fBae/ohzevXzx8uX59dPhrLev/X4AxV5DMWw6f+g8mZ5fnf8y 499 | 652501/PZg/3X4Icv+rPHrrug1PvE5R74pxf9Vwoen46OYNKT85Pz0dne3z9gnqbef7t4TyfPYQn70Dg 500 | T/xf9/7ec3kH51MXAXuK4hoHAALo/PRimWTFbL+bni/C/vJp/+Xs9quDC8U+Bqf29Fcsk50ns4f2HjOs 501 | 7ykDLXnu9n2Okl4rSlaoGfza3+T9U+/H4BTVEujj9xm8ibwfzHNQwAz+Hag6QxcUuqR/08q5t06orunE 502 | jGYsYRkwVMxTD1YY0BBSIjyQ18Tiw1C72Q99Kx8c17vmzxy0Fz/oa73Z/MTBBjCFV+WxYz//+Se88AKf 503 | QfdsYXu/eZ0RulOMxQlGXsT1oc0Fw/twqZBjNy+fg6LYVK2UaASNHSTU4FqLMbjli9ZfeprvzL/2KNOC 504 | hutEql2goFCABXM1rkJOL37VWWmYc79uFIAVRVgGELOnGB8FLPqs8oiVceF4JEkcTQseT6a0e8co3HHm 505 | vwbWyOYwoV4n2u870XSEofzSr4Ou4QEfzcSBH5lLhyugOJ1Q1X2DKOXEOzqHBg0JH3TFj3zN40sTmPgN 506 | y1aMc/FrftfbD+9/+pFqegn6Q6V/aJIM0iuYOnm2GYDyQ4q08z6BcpoXvLeTk2swZd7EwLfL/TO0kiPu 507 | ubquRBxCt5g2dCK+OJRElI8qLAqo5PG0otqMoFqSAhXXLiGLpo9mrpeenKQim9xrTOaEY0/BtgdZSQWU 508 | q08iiboSEb4jkjJ4nELFJEv8Ylp+0InoJz/OlmYB41JJaUAKU06lmmyUF6925voVfGDohFiKeJKKqb46 509 | wv6v9q++epUOmfyGC3sTfmIihon3CEtcVvNt2xOBzCBheeS1QbquSkkPlQHvvs6CKhY0o5mUUdygag3P 510 | +KOpNvYem9EUT9kMxBvIL+BF80+VRrkiolNnhcrxSF+pNWHaHuF6LEN3FOrlD9wBQy+Bb+Sz19yDQPUZ 511 | eY9oGkwjFcwSWc0mQqYMgjxhuHi5kkKCuE1JUcN1Vua9aeiZAsjbGmC/OXhaCuPrjhQBfgOj/c2AU20e 512 | vCQA08ihKfKHlUWmwZmcBcOTk+IsmdAcgjI488nfvQm3JvTUql/zM9M4SM1ObBoOHvnscPigIrZiT830 513 | ft9kfZgpiBOUv/ZQZQc4aSvX43oz/aRvB0/pNZrEwGfwQmz5Uon69q8MUyE9z0u9EBU5FWQ4nKEBCHrc 514 | yGseSAZtTuwI2RfcU1oKFDztPw/ySmMj2dgjMALEHlNZYb+vMA7yWucYZQQ9BwHGo+R8MfT7sTvencXj 515 | WISKUlgnclDVUzzTOHTqsgBZsZcFKf7J0cxA8E5O8E+duWfYMQpeuZ2Rua4LUgr+D8NFnZcLBBlGOcFZ 516 | cH31XG+L3sKQsftAzoMz9yhO3Jc8kN5m5fZ3flBz5tyy6y36QX2b69FgaS57Ffdo6YI4PX8OGpkNJnrp 517 | JTYdtQJFHDB6jaHx8G0HqxwlOW9fvRA/Y+C4By/K6fJlH8ZPnOKXEDSOkbdO48XbBlNhE8FPsFSv50tV 518 | jM5ENnkQHo4iB/yk0+9rNf0OYpOa50Gd4QCzsLjNqDlRyR2rCmhfMYwVg3VeafRsiJOLvs00vmS/oJMj 519 | 9KbXM5cvH9CKVisGVHHthK785dhU3XYH6XKpfmAYUUmuBrahb3/A3COZO7glJSjHr2T10DanygYoj0Kj 520 | 9i9kAbYJrA6SIUN9jVuKWOM1rIosmhuqNDdYmAv6jtqEwR4pC9UR8ch6tu03ljPq6M39HzaZT2/EsSl3 521 | Vu40+/I9gqstoAa3T7g+q+9Rl9jZ70uNhXMTjiuHaRuK6EpCktMZ7clJ51Ie5rK157arvdEraOa+DQDL 522 | Hz8v7bIn4YhSh3TgCfR7PRB346Pq+SOIPOJTqMpaSktXsCQ8SEW8HetRFPu9VgqxRvu0LVgrqJlC76Sy 523 | tcow/KtSi/vOeFgYEoFSoyu6hsd3g2k+hEVRJohxNToZNwVEQYEf4lQO/AsjCsUuwidlO0RBBzT28lBO 524 | BhJb3GYlNGUnQxV9hsGF14OLXRQvXmbhit6AMgYgRtAKrufIFVYbGYdcC5vOMEQbs22iak2aCg0Ub4n2 525 | jS5BfIPMsrxHeqL/oLN7YgtwkvgNM4un7bgmHwWF2ZycvOCWRul9furZ/8sumfpHz55pP98hfwd5pOSk 526 | dJXavcQF7RQIjFWD+Wgw9JqUQILzn/pEJjKIP6LFlRgmM6lMJnljB2Adv8G2wH7m5wrUAxC0EcfHS1Ao 527 | ZRSAx28Cu97EtsuzfWAk3hyzR/1TiEv7p2iepXm6LAYAIbQHoiwbhPlNMg9s8kugoxpNZHhNe8HK2ZsF 528 | hYp6ALle90TBOs40+yr//uZ9SNdtODYBmhHSbFd5HxtoRJRxLGYHkK/pVtfowIagOJwXULYicQvUCWi2 529 | +VE0oux3dDuqxvILTLSD+xblAdSD6+BszQHEGB0lJg7MtM0He5P3NTL50fvBRTAXjC7ZMhoInFnie6Ro 530 | +R0snR/TK+mdoQD/yhODyeGVFBQMuYeQ64dh8JMw2zmjCPnu8jg9A1LjylumYvAxXsijaE3chefhLGX6 531 | pIgzr3vWaO+LIxgrRh7+uV9/x2tp29441f4FUNsFr2Of75ZsuTzfDYfh0HYnR+QoSNELKRoPxwQu7uii 532 | 0C1n+xkyBTRfhGHsG9y4yGCrmWlIVXB+cpSu6k4kY4TF2vAQTfAEBNjwaxmQgOmEEhA9SbNPRRFj2nHB 533 | ud9IFrKR5pGSb1p8boInlMEw04IOsh4yVR8DdZNxIlR+CoMCGw4d+Xj8XoU1iFjpEWADR1Jxi5WH+UVv 534 | UUmqeK5BOwUXlKfgiIqys3ScUsRDRKelpumMJw67AukB+ILfqMxr7+GPogvpIYkwM8MKZq11+YBESmlb 535 | kulhUmB4dDDnBochg18wXdCll8IMcGtGnDPFp255iqtm0d65VMFcAxqh1VNZPDBDkvxRavFzdGS5SFsQ 536 | DZhxffXcs5oAdyGWNeCAvDK7aAE2Bmha1zemaURrVVQ1ytmUdn2AopjHghSFftUtBWS3MpwliwwbQ0xG 537 | DXAbvTzXVW+ADlhEAwQdUKv9QYGCf3s9TBpSHLyQZ22tem2lAS7Pegxp10QZ2yKDwVgL2yyNA7Afb1OM 538 | aUT8x4j/zL0e8G6o9djLwC72wDLCHhSfjIQRinWrOIq4BQ5mmzfHSQMDWMqnSJ7WAEE+pwieOpGpvVKq 539 | cY20hee38F9XnPXkBjzUQLAyL59Evkw/gU9iT77STsulYE/PJxIO199NsNAQC/khCryrpqPFkUdmXNQA 540 | 0GhEKZZfNZaG5jaH9SBO66Y84jKEhYXuSbzeFFde+TUokBnoR4gy5LSuXlsrjQ2VC/Sgdiqk8y2oBYt3 541 | KDQSlcbneOYrYwtQYNu3P0xmsRKJja0Pt/no2LZHs6y250Hd4PZKcZ9tj1opue0hLABhp8mkHWywzEA1 542 | UbpcY6NR6IERaGJC+wMdK43jkxOJTSsVR0M1pwJ1ocrCYNiysKVOWcpdDaWp9/XQPVT2lw4H+E/F30kP 543 | KupuwgFriyhCEU8uAtBVIAMPPSX6FEEv4kgot75s8u8BjixbC4gisT6fajGgBUaezRrKGlCh7Oen0mPK 544 | SnGrjOex8gVrZjMmIRvR7o+0q0HmTjpDv/RNJLqh3+GZCYfcQm0IU5TYZ+h67Y+4gDiA1YZn8Vq2nTk3 545 | BE6w8+be1lt6C2/trbyNd+NdeheBnUe//x4zu9dXZwyv9B3p98BAn8F/rwMwsFzvE//zgv95h868p+Yt 546 | SkYn2513yBKHro8BmuUO+PNg9OTJ45H3I3CI+v7zDyjAfwt+wHhr7wP+xb3sn+SXn+EL39R+Cd/EpnbV 547 | 9cMnCI97a25tfjo+OSvGhUgRSvsPFdWn0A6Yfx/Y8zWbf2KLPd8YgS9kRe3DXZEuAT85fQPt8WYvb/Lf 548 | 05nS/SLKMYhlsV/TPfn7KAcdYh+DwbOnQwXAdvYw2mSP9A8L9wa+/LaLMuxrDi9gGb8J7On5+fWj4fl5 549 | gXvL58n5+XJme28DG/eT4TPYQ4Gr/mw//RUKDod9+Dccztye7f0SvFV6rX1le/bVl0D5DwL7/Hxq9970 550 | 7IeO3XuLkZL8x8R3pg9/fbDv/Gs2CfSH3XN75jplh7/i35n7cOKenz/eQyO/QCN7+B+vA+9s71WA0ZLU 551 | PFV0nDvbqb1wXBjZbLa3ew/UMB57f8FgoIfufvAQKmGX3u+BjAn9lfrvUUu/quZls1CLv5dRa/+sVXzo 552 | 8T/w6u/1V870rPcvhOWNwhcU+4cshr+nUACe/W9VNZBVAZAZjv2hjiAC4W+y8CvX+6veJ2D0Abz/7+D2 553 | 1XNfPf9STpjrPfvx6bt35RsYX/nu/dO/lm/wcY0MHvL4WNd7+v79W1/r9YHrvXn34u/Pf9YfAmjPfnj1 554 | owaG7xC10lbUHjeb9gkY+vBfH3+4fYccQft02celLuZfIIOBnNqniwVMEkY/7F3n/Hzx0E32OsHRC/Eb 555 | XvdgnhXqaM7tCKBHR5g2zolv976HcT0QrxPGFvkzvr/n16aTz6ZfQsN+269gLHwk5cCqsMMPWF4Ld0Ig 556 | awA5k2D6K8D8QIB28P4LQ0x+vZ31zm8pmCThub3Pr069/8ODWETACoyNAlX2MIHiAYaosIKXipLtrhCs 557 | Z48jCYFZ7C92RZEmUC7yCiy4Pl/g9wS+d/fn56crLysUNdFagqWEISuz25H3zYEgn+z5sGApEdQUx1k0 558 | tE+uRdjDaxCMfcwb+I3yIKK5tN8nuD94lk24MAb1It08W4fZM5ByTtajGq5vevn114+++2afnZ2Nht7X 559 | 3zx+NNyPho8en2AeJFQnfhJK4A/BzyJeS/cvetVfP0z139IiUqJWOrdALv0U3FK7/g8yX1dVbn1QuufP 560 | 6iDcwegFUKIf89xw4xXMJLRZi2kGf0CNk9YqipLDQekPYSG0ZJENUZfNC5LJ12iZOJgjsRZWUfhXLuB9 561 | eXKyBci4s3eJFgQqyt4d7mNsFM/1ODFoN+poz8nJd/AsFqW40brGEyM8QCL4P9KHTCnAg1SGjXyHe4nc 562 | GYWn56oRFzAnnXC/74R6wIUORziIFpRDvFT40OoO0REiteza6DEcN6g9a/YL47l0Co+Ou93RB41Pi/z4 563 | SYW0F2YPJ/lpaGoQD48xoKXmC30GXCPnjsCi5c2dvamSOBoAFT1ng9/yEMbfWQFOV9zPjafayB0ULIIL 564 | 7yYovOvgO76/y7wR/6Lt7RQtfklMK73B1jxnwefxaSHuEnDsaGG77gR6UBIElEHgKA9ObLC9B3m9sLdx 565 | vQ3oLHiFvt3b9OzuzLLB9J5L9Yuvk12/787xxMumd1M4czoXfBP8Q46Ljl0rsgGih5HNReC5B9wVN39c 566 | MjnqmLwZUCTUOxHD8hQNZsIhZwDvwapZRgks65vbBbQr9jFqAz6oU3+fMEhLjvx3z34wAibJF265mlEH 567 | LvNVq8cFHeov/R78/GQvQPPjDI82g175IyHl5EQE6BZTsG4xotdx8exigkkcpU5a9hcXuuN6ejGjLdry 568 | /a4otd9lbYvHXkSXtjsucdfpkIXF0ZNoG2wSTfpMVOdFII+uWOO8CE1Mjc3Niyq7FObXHrciSq8cpwjM 569 | 9JBSWNcPYbIA+x4PbgMnLVvbVlrDfXZMGHFyUjeqRkGgcTdYM/+Sx30p5dR+/xwUlH+x+jOevkuKNu5o 570 | Fx5JPAcJkvdddIFJTNzaqe2+ytXBJiMfGL2CeKlPVP0ETtK6IKUnjkQ/2YWIdwpCgZFq+F38W+07Wgcg 571 | NbhKQb/clv7Wen+xlmJHi0gNeoUXVxK/lp6ggLYJlcu4wPMPaZUMQiCDZBoBcw1nMzq+HwF58/PQFOzn 572 | Up68PAgLMK7/+dOPQdPiY7Q7VJObzK07OlRE08TG3dgqi/RhBWCKsELuMfNg65BYnmy10XeCe/iNnv0r 573 | yoojjuz8I2JXauuAS/LvAv2oLYZV1kCdOMsg8RZB44W3Djp0vitCt7XmCIKfGNWId6nV3qCL6IKBFcx2 574 | wlWkefm2DmWipHVIDDEP9FRK+n7ZXAqpABReUDxqgkO9tnmLJnHa2ja/G4gzlkRwsGfphnMwEEiiO8MO 575 | 5EO179jsVYnV1n6jBGYOiSGwnwCjtGgQQTfsnj05hd9nlYdWJB/bHuN5XQniGmYeEXtqke9oK9TgRS2m 576 | BcBFBTFA0REK/k5SbR0bBiXB8NS5MHU2cVIKeB28el5z4aAGJlw1NTULaOvjycm65DQ1LUyLsEByLmXG 577 | BIQaZtc9eKlIUlnttnSrSambFWCVNPOy6dPWVFkoZ//B9R0hWNUI/4RuxZCFbl3pHEfIUdN8zgGroIUO 578 | rAhQPQEimO6BebVMqhs3knuJXRpjFYRlYn5F8eFGuwbYHnBpvqfVqgbTxslDimZ3b6WYTGnHzh3V2JlK 579 | HaEMR6nUpAc5bPJm1Aeu6dKfMXZVSxBpHQHl6iMUgLoKw13hP1zLDv5LhpHUVUk0LZza0qwyDW6nnz3h 580 | FyBa0mMYdJFV8IfwRZRCttHQVu2prDTTQihWHIWa427iE/XsucsDzzYa2vKF69LQUvkKo0KrY+JrIamr 581 | jlxdAOWxpvbjNIBazp2cBInOpgq3XtymuErj2ItfAVXlwE9OJLjol5wFauzd7v7cPm8fN0vI8Woat3zl 582 | 2b70z7a08tDzr+GVrOkNHvo27bsBndAdwCyX5SXN3IChdMUuPkXFT9UC+/1isEl/NzxNTSXz2kOkvLpM 583 | GAD48xSID4mFygc3KvKO1Hyv/D3NO4hZGtBGDKgT2N4rnP5VsFIIF06jVXnMFw26Tf39Rn9/KYe/UHmf 584 | XBwGpebOmFSF3qR5hNBPTM6U7ypa/ITVNR0ftf2iaoCMtT0GwFvH6WQ8b0mmxS52nERBNUm0xFSuz9og 585 | BCPim5PWtxTFXGedFJzBGSEmWdKcHvhG211Qt/ughvk0uC+WRGivOnLLN1REmtSifSBHxtg+wFLwRZPR 586 | CR46yihU/jkdsMK7OVp7BNKk7KuMmxWXzhWm/OyP/KJ8ULhgKM0nLzl1zqFAX30vXH/of3USYZVR+wzR 587 | a5P4KqMxyinwwsqMYGQGm3lxgMkPWvCK25spuq9cjcYSNQ6AP8Uf4fGBjMl/FgSqFWHDjsH8lXZvkOnE 588 | kg/E6WHKOBcU5lKxXoqXoMD3IIjRRgIpXM4fdEkR+/TGF8WuEPhYfh/htlzi+suDBwaOYG3m7TzyXNLp 589 | NJlgUquiuGGDdE32mPRiMvJiKsXrf3t20H0wQing4YquNw6TAux8c3Ky4TynAFazQkEhfrnkGOJM5aYM 590 | AiSDHnORNrgmhjovlIdxhPyjfFB6SVVYlLY/rnBSeEuOEMxNLw/yDQk36q4qEz7vwMslj1/EZtAiC6pa 591 | 0PHKgjVUfSpVRwBm6QfD8UeOJb2kVyvpTiIKfOmsQWVSCUBoa1c3FnFuJjV9HG9LCAODPpy45KHNt2we 592 | LSO2mIQDcb8MIBIjUGDUFDgatEVT2+9uALfXFpXyrF2SsXm6SqLf2QIv1cxYjtfdYqgp40jkWUfepVnT 593 | dC+8pFR7aeECJ8jEZXjPd3gwCHShHM/pcF74jm6tRS4qLvFBJYJSQz51vXdSKcbz8hi/5pIImKbo00Bn 594 | AEng1JWrN+r3XSaOH5HPwxupSAgGoKPjAQNu8NiaCXLbptuOIk2E0glPWnyojwMP/47/GdFPnqe+EZg4 595 | wB0mEbGiOJ/+kLbPWaDbu2M2xge6hyzpBSGGXko//mPe9VfUcyVk9h90jZMKdhsjvrIZ3RhAjZSSKAFb 596 | gftfOB/Ig1vNhep/PfS4uvomZ7tF6seFR4zD/2+vJGs8P4TmBv7NWExbcv4t5ji6XUSZb5cs1hbn7DCk 597 | 37YM7w+YkEM+zthllO5yMfxK3X+1FQITGB69JGPUv6WNWJNxO6UbqUazmmHqsenjWeCw6VczWPbTr/EA 598 | iBbFKgrZ/wrIRJs+QrqjKjauBvjSoygYRbzeV7BC+C7vUSgqXMGzk2LNO4BXsqXHeOcj9LDfywVMYWUI 599 | 8lezoEcwTxBk/PoNZt53/UcPHRu3Ynljj+k4y2Ihf7lY92te99sZgP+XRgEf/wA7qfV4kNvZDQMekyxj 600 | o7CAATuSyP57QDgQ+xDYxoS4kcObR9A7dFMD1Anwl5+dnPyNF8cEvmAEb+AbHXymX5m6mgHzUcmMHP3E 601 | 7cvvFMtOJ4DhH4VEzLOIfWTaE326HtOhqaWgHtzvv9uZYfYycyN+0gj1A+o1B8rfL9IdoOMRCk24Xk8Z 602 | Ul+Zs5eSy6u8Xr+qIAsoxreocV8dEfoahJDpUCmfAAM7m5ceBO3Hfm/03pg8N8KRabu0vvCulNpKrYRo 603 | qsfS5x0IyU2J78eV4PNoggYYosovJk7UQx5u8weTCHVMX76foCsXfv4qfoLqjlFhkSItELH2w/Kl/uIM 604 | 9Dz7gf6OU1BfXcvMu/qXKILBcb2ImEO9lb0O3H4flZQpT26PqLGe3bf9DizqDubQrvMUHhyqNr4DYiGk 605 | cpWkjWmRMPhCf97/CiOqbRFSQpBIfKJAywRODKcCOh3dFtCIGiGJxU1velBckEK/4cTWJJptYPKbqlFx 606 | E+RoFplXBJjInfjkpEMZIzZ8X12qCCv3dqsU/W2wna5mtNE+2bYvrxsKJdzWtdPOaLwOVgEGgVJAIZB9 607 | B2z2ykgOannjNn8wDScbTZj7G7qchb6Denhycknbw9ML4LgO/hGniOeg6FLEwSLY8Ssm35+c7DAtxLLy 608 | 4NHM2wYLVNbL6IzpYqZG2+vByy38H0YNPSyDRTCEtbbmWVZdob1sNW9ir4cKLplstwhFMH0P07acjfmp 609 | E6VzXKKvLnAKDnohQHdRQUfAOIguQjuqnD+4D0yfOTkCaALJ2XKAthpAOIQliCs+qupBmGU/iLwld3Ag 610 | hS//E0h9eYrZ8Q8Hg3jT3bjpYEvKUE6TlaIfjusb8KBmCWjCGvNX8T0vUKN5A1yFVu5bAH2SgWrmSxl2 611 | NsIT3VPmMQ+4WDHz9L5qgZ1OPfxgom8XqjMJuF2Y8fsDjZuEUfBSGne4V+jSWaKgwzcM6cnBNckvbHNI 612 | 8fN+hioYR5B/m6SFH5vcoLhjif9kQdyMBajipDqQanwPDYZf2oEJgYGX1TbAcxgUHryf5jOuEuQ4HExg 613 | HKRudTAYzatd9knZQ/D6a34JB+oOnYQTK24sAPrrIzNsGev2faGZsNCAtGDv3YpT6CYDhlmQjxytF6Az 614 | tNGVbGEoW7CTOExWLR38VahjJILbCJXqE5l67A7Np5EMMxkvUot29deTYkAt1eNgrjexjy8QgPo7/rxM 615 | zF6znT0MFmB89ZY3dTEUk9L8q7sM60EMbukyxGT9YVZJs6IHpIl0YpROSHzH9beu7DtxiTriJxKjBdhC 616 | aWpM24JOL3hNUc5t75eDkA6eqhMFTmeJXb6k0Oh9+d1BDa7TcWTeKTZYZ2y53/8LHoQXFIdB+T3IJW9W 617 | PaXDng4MHjz58+7CYImJ/Q6jnnzPOAw8+trB7E08HhxMkK04ky9fyb0bmUWnDTY9pEb/pRogdHjlbzEI 618 | hifTK03eyx6nQ/pykGf2/7L3+8cVfzu3zZlBnyhPtnMoTZkPlJwZEHx0yh3vN2WZMQWMUNdLiPCgF+LY 619 | iCtTaR6r8m9OpRbxolKhlY+Kg0dxw83z//Wm2vqEHrCFsn00CEn1R69QjYeQUusSc6mrE7yyyvyzNlxt 620 | hXfguDzrz7pwTI7GadEfYRn2W71Eab5M8bQoZtulJKtojjdb44yGn4wbF3SKNHjksvoOL8MN7cWirf7o 621 | PvXjxmDKcGQFKW+o36fbgmQ7WaWd1f3bKc56vczcDEUsSDIHmyXQiP43lVriNgsXUQqWD2c3F+k1fgcz 622 | neFfvLXtKs0W+D3ahCt8eHBLLQ0zaWJGtLK5fHexwfQtQy9joFE1yy94eRmhtcJQxMNKz1skAx7yEuKK 623 | eka5A1ZF2camqB8dUsHJwSdpuuOtDuq4zGToz5UXdAyaDe6tzMBKSAfKxSW1HPeW0iI4WfBPHlaMBz1h 624 | ZdBZ1iAXzWCmUmmg7vc5EAOfEjzVi+GceOAImvi7akI4W0TwpLwqVl1YTolXqFFNgbNo77vsVJnEfAJC 625 | SngksOd2oLv/BrVS9bjf7+An3rKRBfjN4dfV3glF6IkNDT9r650fVeT2jMKxDGr380np5XL9TzBZsbpI 626 | XotKvSmqZ6C0aHXbrp6Cynp06T13v5dBGqqpy6K6agqQrXjxCCad1VyiaKSAovus3H0quFiaVEzuqPSN 627 | 0708wsYrNGGU6omFKdi2arXLU738MFvwHmmyRzfI583GDa2D0BXtqE3Zg2YCHgOMrjOpGZWegwZxphmW 628 | W77rFZN16Qb8ToRYd3/HXKJLa5U3EEy3sGzI2Srg2+8j/gBLl8CWc3NRCQYu7bEKvpQ7qmZz4LYDJZ3B 629 | 7Iq8oEHy++iZLHu8LhpeHLrtGWh5SFlqBZ3txCWxfM9gHJ/l4xyIjQ6TcxuHclc6KTWEv0O5LYKZt8XF 630 | W3lpY4UlDFcaDJothNmH0BJDfhJcoUuWIiM7EX8W4TMs71ZCVMXpi4onKCDXBvyzDuQd1egY2u9fFw4e 631 | x3xoe3kZrQDj8XMy6zYBHsHopHi2c+UDqlbeEqxibN67CZJJhPcITpi/xkSdk+nMD/0NbU2CXu7gwQ8q 632 | CfO1C6DyjbeAH84Ob5GhF/NgV51BvK3G2QKZzQmjN9MFfEPDcSO+bV0Kl095UlLcIrzlG0M7HN08uDG2 633 | d8Pb2/E52MAvaGgc8aszb4i5AziHO6oDVUdyczz1tmDC4nMw+PCMPEb/d5wQ/yCMfCXc0Khxx3xyI7fD 634 | 1p7sxPVvYD4nAowQsBW7voz9h5/on1Uk8r7QNsgo8bKWoCEdyO2fKbndkTMjAYfoJlGvUNIBReMmPwj0 635 | 4NIcNcqVRbpWHHiRudBLlaiD7F1RGqismrRAadR41AOPVnXwCiUgGbzbwy3pbS6K+1vxxT3wy+zGkZbL 636 | rzrKWIzShV4BSOAbS8wgwH1ft6I8F3Zaaf3KVHoqhBfeWn0x4+ZHFvR6MfTML/qmnKpav5nst+LWgoUY 637 | nwEdcDDoKwos5QSO+yN1s7iQnzAbtN0T9x/xJiewCn3bPmhp++QRDcDJWXxy8r5sEm98BeI5y/hT5VdW 638 | T0leAv2oG/kFpARhSVbPKqcQhtqFiGd6rhH4oe34o/qEbGXB64mD17iMLqGJi8Ae2t41+o/hyZVgmwvv 639 | WbDD89b7fYh5a2V0KIZdeouTk7hyQibGM9nve+KQ/zOg2Epiw/1+wHXuK1qVMQ8ToNta3bFI+rgOXuOU 640 | ji9gEulQFwX4rtTZtg3gfoVb2ejChlUJQ3LdW55j3Fm7wv+KHbwPPkHLvR4iEV2e66CzwcZOTi77fS/H 641 | PE6iEvGmy15wgXc6XABUl9UeC97jxrnGxQ4dChmPtc6GIt7qApjONUnkGy6X8U/wG19ywFvGnKu4B8kq 642 | tsAqvCt0x8O0qwkD6NSNDkiPlXgBaEcShBzhLniGCR3LfGogU3LXzw9xEPLwqEi/BbgZYEsJal5oGnUH 643 | b1qgzTA6j4V6blHlrwmekgmAgPFwEJhY5ImVUtOP5LcxtAsdPkNph8xBhduWWv7rmk6HwQNF5Yy8XNDc 644 | JQjr2Eu0zXjV0KfaWUaUpVKI0jBoZBF3aS0lJ7+lo4RL1JaW2r4nKMRyBh6BcvnqOS55IFjMnuoKI1oF 645 | rvODE/pRnzUuFMV7ctqwJt5D4XlBGeju7CQj020CsWuOEUUgyzEVSqe8b3Fc8oxcavhcY5ZjOoTBfw/0 646 | Q8fyOBvYR3nTg31Lal8OpoOnAY0SXueXqEZuAw64kKpRsD0KvzhGl0vB1jxOJw4O5lLEhnizJgsiFeV5 647 | U9ABTsNRRUxXI7daJF2hE37pAq0VXmcNlKDO8eHBOz1aJriQZ8BsV8bKqPueYC6BDTQiboJ3Ht63Vw1A 648 | bDkgMToS02g+CWeIfjaeBgktdFYG3S8xkDs8sz37S+7Y0c59VD06WB4NzP0es/GRf4n8nWsWrdbF/ipa 649 | FGvbM8t/uuO5Hkfl2XLns+ZgBmb/qH5spxkubBoV+bBO6+dXquHaROI8ZNu+Y8i8qBqzqNk2RNCiuQ+t 650 | 0+5DIzTIg1MUKtQ2XTK7TRWiMsJbAPV9AxwyjMYa3p2oNVot0qLVIhGtxnjetM5wUpsWimOjpES4dkEm 651 | UCbibVYJYhLPpqDI8KzG20x5aa6F/Akqkgge83zzKiKMUk1hksd0ro7FwTMVeKgFIR5kYODPlJNJ8vCX 652 | pavgZ9yPLC/+F4l3GGc3zntijV51u44OqqJnyisO14NnIHUvwvmnvBKoxgJDFryfaV8SO/evtWt1BYiV 653 | tDXcn9RhdGU66UnzSnYnrocCmGyTZjfA8DDfKSpkoD4NyTJNg7hM1dMZjkE9TM/CcchV1hhdOyLlOjL+ 654 | QtrtI4rwK9Ltz8lLzJqJ6THBOOYckPxQmE57N9kp3jkH5izkg+uDVgCg+1u5G0GXaGyD23BRSWOOEMgZ 655 | kGCOFZlbEQ5RJqGvZUrn4lvkHgIJXcmVnE2YIJ2Tky2/jxJmMJY6rk/bQRLwMnEAZcFDHRhzZ+rXyk9K 656 | LPrcY1d4c0dTMXiSe34w2JCnPUbdj4ZRJoozxHDLbTEcl8iJCIMlFR7MJzeWcitDuUUJ6s4Q5BS0y5C+ 657 | oXw9yJT7uAFqYoWTsnH0oWGQS8fpxGC+x0qk13dcypHI/IK8DzG9xoK7IFNXSTa3rJTNFx+8ONVvOlBN 658 | 7KA6sEuNiERrWN7Y1o52CygptzFhKY4SHSM70jYpnaVX4AZ+wVWcSaEuvC5A75vs5J2//hy3b0X32IUB 659 | 3O1A9l2/vkCrZ4K6Ex0U49nqidtlujbDjs90aosM5CCj8KoFsKRKHoSHXefM4lwBJZgouwDDHitSbgTP 660 | XoZRfFe9j7QPR/WStIiWN3glWJauMMq4VldWm2HogI1HoShgKAtuKXmbAWXJwQvjq/AmN7yL+A0SJRYH 661 | CK7TwGqxZpWrsnhGAlWs5Ogq+V15SNvMXVKh0QcpssQ8qKZ9nBaojTI6RDHFpCAzp9E76CG5+SaLsUjx 662 | X7YnE765E1a/PUNlmRdjx984H+5AzoCDBw5xVoCnTcOejdRnz6hTYoNlOjl+gYyXUw7WEh5kdaACc5ld 663 | FsYgXfp6JEn8RBEqQ58MhpVEmggFgR5tWZANcIK8Jp6ZjudHiGfMLDLOOE4DSiuIRjN90VGcBDjr09Gv 664 | bAb1JHOAJ4/oNzIH18OpGc5MV7TxN3VURZPMN6/aanmAS65yUj0lxiK6ZVHc2xFRyvCDd1Uhzcq2RCPt 665 | p1dJKjviOYaOEEvmo2wf8UNHfiW1Y9iWSlOP0yxQ4eE3E+K3+sUcZ6NJA0Q/o5iOfJIKouO8Do/Q9PsR 666 | dyGWlyLg88OBb6FRkomzEaXtzAN5JwaoN+rrTn0dZ2J7Bi9prY0fH5Uo0H/JJRNCvzsMGuYrJm2umJBE 667 | au4S0Oq8UB16bAN3PtWCII1WJkVoxKCAzpZW0wwCoRhTkAAm6qZGmTMAbB3gugvdWLGsJ3GUfDo9e0Km 668 | JJhh4q80zU7D7lmIxhk3a+h0cNCV+7BdNHOSYNGeN4CEYNZaIrS5RyDjp+EwBymdsheagtR/xnlzwFzb 669 | xwtFg7xyNrZRUgSUgIRNWwERx3ApUyuHYzDPczoaYoOe6o+21+MlXkDhYxLOcboN5xGoMIOvbZ5n6J2G 670 | c6iB6p6Ws8BDJ1CIAuuXdQSGJNRmAQaLLHS7T7pcoHSBN4kEnTZo6bU6hwvl18UmfseyKIyj31nQaa2I 671 | k63Xo5EGpzDCUxFvX7P1qACirqDAotdptqE+FoF9GpIybLTQobhAUXD663DwtWqdo1a8w2KAZbrYA4DW 672 | EE+P8C0S2s+YXjrlliE1XLyTATw7FcsDLxgsGyTPTqdBAsAaNjBuUUIg7OtnMSxqsNj9JLwE0qc/OHON 673 | 6vACas+xONmtnaE7SGG4tIo8jMQDxLLvUTi8RlfVj+ENvEY7BlC8Bv3/0y9ZuKX3OX+6ja5ZLN0o/BHP 674 | qvCCX6dDF3DiZerYJ6UY4U8yFtMdrj8B44ySt+j14C9gNb6LfgcKeytK4ONUhlVVmnsmnqW1EYmyXl5G 675 | eVE1QPhz9WCnXlK+I5EKYkHzK07xrYH/10czOqRNtIpFxyMnzN4RxC0UCshLkppdI56gDVx3jbbEOXoK 676 | IaH26Ns/ZHlqlVNWvaY8y8/ZZv1tUnLUWI1M+sfUFR8YY6HzptTlF7fSAzULAu+C3DlVxvXJqfxS4eSq 677 | 8qKaqMZZ1NPTzMH0+FTJS1Onr9EBpUO9W6jliOCNZTV6hudLplgcDEWMEoqkqcmfOQbO270lR1UxXfbs 678 | 73cXQD85qDtzyrKLp9pLJ9t0juEgnGzQVTBeCLaAdsAqw5tin8XRNrDnPBK2D5RvN+A2V0FmPQdOnNGw 679 | 3xHzq7RDLNlUV43funbq0eTqqhzccsJNIO+6rrQLEQ52C6ibsEj94XhDKxi+XKQZBvUNx7CwMOGtf4F8 680 | Ah5f93Na0b4G4bi/SX/vt73jWRLaXttEqWbBwAUKiD904ThJi37hJXXZqIAn1yv85Z5Y+LIVzM0PL0Dx 681 | gZkdoxwdjlF++v3v4AMilSOhLySsXVstiVv5uagpL1JnKTL4b4G6y4K+FPzbKT4X+ox9RPQXmKoipf2S 682 | 6tjuM1cJGcfbAOOQqY10uQT6//+Ye9f1to1kbfR/rkLCeBTAbFKk7GQS0DCXY+c0kzhO7EySoRgviAQl 683 | 2BRAA6AlR+S+9l1vVXejAUJK1vr2fp5vMhaBRp+PVdVVb33DveDmqhNgDuZs2NcMlXzq/f0bxv34gTMr 684 | o7UY4uwX0OgPrIK94bEzQareOYfcT/tTyPlqegTUkO4KPDYnrsyEh63R/fstE4I+gNEH2r2/0i4YVroZ 685 | f+T55eQGfwFLADNTd/OyJ170kJetdMwvKB1cJ0b7aX5Jh0ey4JUOZ56tc9cb/R0L1t+P7C+4LgG7lwfg 686 | V+cR61Er+TLtzgykQzgu5cVvTBLfSbTKRcoeMdoe4dLGuHQoAhPGZfFF+KIZwovtFmrCcbbW1a7C7Rin 687 | UNCIIoNeOMMHvDQ+je6cp2XPk07CbHInmZlZQmCNZSp4t1NcD9ozwRZlVxpPUq+1kzAOmYYda9DkjV77 688 | RHptj6J7cNgu9bYKUle4kzsaQWuqAfkIPyQRUQWR+BaAACWLykgEnnkkABEf7XzqfRbof8E+tk9v4Nf7 689 | 5ez+6W57OjXPM2Aev6AI0yf9/8DndX058ZNx6MFicvHDQWReXMHE3MHPlesTHMashWZZlE20mlwL3GaY 690 | qDm9Qf8sxJ+jIzbIm0Nvb84aYtDqpFN9QbnTvGGvknf58Jpvt77JEe7WYXNT+ycJS2L5KDuKhB+Kd0N7 691 | Q5WzG7HrATxfQXlwz+Ff1unwL+O73wnnZCVOeIPcwda6+YmD2HQ4Zh0xBf2zmEPtA2swxpG80DLWTkzi 692 | KTpNu8yisYZ7mX1XRtmEbZbgHIYv4HJ2f7KXNghCClW5o7j4i+P1rnNQ+fbHHcg4yp2BLOktmdoxn4X2 693 | kdGFoWLIt/6sC5hNEBDijzQTAk/jd7QKJhVD6LC2kXZJq5wWUO3Z4V9B8abVLPThfLhun8AwSwR8rhw/ 694 | E4GrVlErXWpepJhW03TGuh/Z5PBbYBKxUw3HAaFvVTJ3wC8xgHa2JepbaSsrUHL/wEEGdyRAbojADGs/ 695 | iQ1OZ7uND2nUxbflxMmXu0kv6d2ulsJLz9/ANQzyDxlHm5XSVXJ5lrBau0zl0JuvynQRPjv5x9NnX3z6 696 | Zf/Jl58+649G82X/80+/+Kz/8OHDTz558MnDIf3P4wsazrBTu84BhdKDP3WHHQu5flOHh7B5/ZZNUBbN 697 | PBsSwJ/0u7mretaOa2P+ojFYXv+F7BT7ZX39l7KUuPW833Pk6kLaHjYhbj8/7DbWaRvBQGoogzW97Ybd 698 | WOEfwk5Pu3ntNIF3YBWV4/3Yv2n3i+tUSg6BOMIVrPZ0XiMu3WjvG/YCknaOa57UUD6BRLd02kwL47V8 699 | U+JncIEalvDgqG9/S4c1G1vTVH3FGxW44QUrrJrG8x4y7XuiWOMua2Pg/gkt4ntUKjWHAWjHt1SEB9Rq 700 | WmkroT1fruICne8AHBJRN1scjMPYs0MM/ecJxay1nKC2iTJdCedyoovQPddb7sH3CqgT1fXbud5w7hlV 701 | Cvbwx6dHE5PZaJ/rru7VDjpfKK8Phc2WtRZn1JqFacfpU2jHQ5FXFRsxQGCPOuLfUl5HoYfGyxuDefSK 702 | nievvSL8woB30O5iHZb6fI1jHWLudFdKM0VT2XWSWR9q33a6iYUOF7fdE3pib4/nuzQ2GGPagKN1KOLX 703 | W/G7TbJJwjtVWRKYZPtMSlzD3Qcn8RTm+GvTmgBql/5hKh5+zcXDpBEHHl6NM0QcRkbLkBVnWVEOIJqL 704 | ZK9KcNnJ1BOVLwodlC3HErPuxj1PZo1msAe85mjf5Pnb0piAN+d8UuezG0M4Zy5iIyHi3QyBLA4rAB8V 705 | kemZWfw0Ny3x7AYtFgofynhQI+ISJgOH0DCAgiGrBPDtF+4Hnbp2+4rUXc8xvPoWth4E9H7d3TeicXD7 706 | ZXT7GpASO0uUSjZjjX26+Uk0OvZ28P3ZZNRKToy1455PCRa9wB0gelX6uHjc3rUmZsD13k97R8jQ6byZ 707 | hZ0bjpxhbkLxbtmcFXonUnpMqTruSGL9UHE4/sxUqbeujrn6Z1tgZyarPeeglmah3r2e4A/0xYijYj0n 708 | EK12QfCdqmljp0aP4yoNZgPjjCeluw5YPGjiFBjWneKwH+9snl46uh60frvuuF3nliNek417VblCd/1q 709 | Ec/lVK3jGjRWDMowvmMqVWy7r3eMGhWhsNsRCFOVNBYUb2GFrEks/F5P6TdeJ6vafGjluxeZGZ9haOIf 710 | 6lf1c3Q8Pa1Oi9PsdDk7Plf/jo5PC/r97c+d8GzliGdfPP+U6PEW3znkawlpuxDjbz9GNWXeupdT/3K+ 711 | cenjxooFodM9+ayfSh6iayaJFMjNfYrCEr9Pmrn9NYIAidwFQR27/mtVQsw/q9KLZm6NtYX0X6XXsqhU 712 | ZyVBFfCeg7t9s63rgNrXBa8YmiWMCL2vn1C7EbX0az3Z99UZiW4eMy/b8I0a3N6X0OnjPuEtnSvha8UJ 713 | 7inRGauvZqGsPGZNQaYtIo2I0VDNHJe1TqP4vYN+eRG1MbkBimvyFdAnJ0DgnwyN9jNbyobMzd7k1jgj 714 | hbNOGGcMHzsgZxY9Cmx3L5LnsZO38dhedKoM/m9GAuR8eybVMpv/b8bHqd3/zUN0ywhpDNmOUXocDQNg 715 | y1r3cOaL2hs3sN965GB01Ri8Kj8/X+0NnkMD6SEw1MSZuPFseLOsByzKJkIgOMtCtLaa4wDJRtMPcccg 716 | ZvUgOrVsDGLWGkTFNiC7oJs+aeBmRpmZoQWrGOui2BCsMebGsDgWz2A5dHGlJlUwyRvtqoIwr1teCb/B 717 | HmdSIFTYrmM/LX6z6qB4Xtccoff6tf30+rXXnqyt96j5Spsr32rCSfpdudbQeKZNHapeDDvJE0sbzbU9 718 | cjoeydnoGssim7nLAVmY4DvXgZ3nlcxvzT45sNvv41UXIiRLLIyYgk3gWtuK2SzSlipk0HUK6amRj017 719 | 3Mbk0FZrzEEzS6luUBxPjEB1kkc0AHv+XykckIFhzbjlgZagQH6Zd+EkOl7v4fQeUPagrahEpqWmXEk2 720 | PgJL0gy+RXoE6ssjUtVL2fq6wI26tChXRulBmF6ZqaL9kJt90hr6N+qRd1Qiv7MG57YGDMBAr35dPldg 721 | koVs4SoKFB1y7Foo8W+oc4TSWRk6C7Qi80yG/DK1Cm9EYSu8aQAyJTUXw/ZmjACZ2PqMG+qjFdu4gKjc 722 | GdSgW7LDKRhBIwmhJRs0N+GCaKZIQB9XtA6uzfBxytJzFn+wpX4+SXsji9+GU/RxOilDCg41uEvpWhKL 723 | u3P/MLMlHh3BiBTXCTWh6mjfUHdaVXdpZ5TdaptDO4jrI8amFPGljLrvxlBQlIPGw9rTpmzU17iD58Wj 724 | 8lobLzaK6xasG51cdQPmcZea7pWVZAQfLINI9434iijF6Q11MaPoVVsVXNNZaauErYin5+GwngHUfa1B 725 | jPqjAPckO9Wm8a2IR267mkjPtKfgaq88OvpMfk4OHb+HnXCnrDEr1LQxJ+ettxRdUzEoosnHoCZtTDP0 726 | DuMq8+LMZjwP2HqJj70BjintRiWY/Br+wVsNlmFer1Z61FPDj0VhivnOYBIDMby5dnDXyAsypuUSB2ZO 727 | FZxfafPjjErOqEBWvPIpu6Sp6UON7UFlC01u8DNcEBx+dnNGzbnCDnJgW2lOet7R9oSfLe84hcPBoN8y 728 | dXvH/evo6Mft9vBrGwBzejqS+c6jllR72kIOotVgFplI17bztMOVtrPDH2lTLAKZaXo/Y4iam/0VIu7e 729 | zUKvFdOo90VfTQRrznqlRaqV5mp4ugbATNKp/laJQY+OG2E4drudsJfUZeENFCTpPIRW5Ff0pDRAb+ho 730 | D+8zo64Xuv/x6olZC73Uclu7LoCO6md7o5nrELMy9I1qe6KmHRM1FWPCIuxeJGljkUhkaaoZPA2j9xeP 731 | I4rOlFJ9IlUTFoF/m0HmNBoG4W974Gvb7T/3wnBjBGXayTBkP7c7uNbem0Su4yYhLPeWXrg/4ZuT5PBH 732 | Bg9odHgW/NlyYPNEle12xvpif8WJM0i9ko9Pr3rH54HqkojqpK5TBSZUbM+Ou2JEew1rTE6LhtyVFgcP 733 | zFI7861o5hQ6j04DVMeQcz81rYXd3jJxTZDv6Nduc1caemmq75wPei23Z4RbWufGMfGbxr9RBq8qfxwd 734 | /aGXDl/HUJEo74/u/A3u0Z5Bb43uBlScxjTj70wLNDwNi9pTPRn5BsTsU4LfLRSeoPUy7GeT5ilojMJK 735 | 5mFzNODKbz8wE4FJO3ie58Wi4VDkf2zJ7HnsHpLra02Z5ZKwJroHIuGMWttJvRg6cx/XYEyFYy9d6EIq 736 | IcB4CHfKnSVaATRZpAIW0LmDmKH3BIycjjltX6OX9tTTlvWeqHd6bWvlJt2yV4idkvqKcJ908OJNlQvx 737 | gKMpcOxhWoYH2Bd0pdjWgNiOYt6sENv11sdFNWt39m1uDit4bGgY4xiblMbKE6uJ2/NsKLdtt1UXddwd 738 | GRdbXrMCjrkDV8O2qyaObzmZkg6vXhVrQTY5nDucETciCrWomTYZAXM4QsM+iRc/ACJdeZfxtTgQASGR 739 | rFYvYe4BY01+eyH6fUiSX9GnDOH5Sj9tyuT7eA3z0YLW6ResZMoReBp/qaexO95msHF4CbPdYGVZStDo 740 | UW0FYnuTElrbEY8ecq6e00ohxpRnzJ7apTeY+v3ZnzkbspEr8ClsjDNc5iYxzE0G5kbva6bm2hyGa94s 741 | FPM4ulU6sQfhoJnmCXTzQ00W4haT727+c8f9DN+xUFHHv79NPhyrqpK4lzmN23YuCC20r2+CLVsOHKtM 742 | x9AmAvyz5b/5pjpbbQroKBYcafr7YHY/gDbjwB/0gi19qfUh0sp1omGDcyfYcRIdV/q+wlCbTTxlfVuR 743 | 4LaCRpnNH27OV/lZvIIqVgNHQPQk6VCXZdUww1MadEq9ry/3mWF5D1eCF3ywQHwyjwri1OYmhIiPuUWr 744 | YKexmxSLWx4io+kYKH8VvZfqAbTQeROAxCW9S5YBQ+qbt66JoLnVa5F4skyTs4L4+fw8KRgNWUQbdMiZ 745 | j9CaZXpOzI2XA6r0pWPFulMSFCVQU2XFiKZg3vMAMZHtO6ovI6xEwH5mcFTPdoLn0YcI+ELqMvLL6Yl2 746 | v6P1/gYG3SZQ59Sl68jUkU/DeMV+BWjwzonxnaxZK++cKAtwI+F6AKKcGcft9lzdmnZRK3oK03aucuoe 747 | zuODqL7lSg9iWCgMUyiDpsxwhrFy0YrCmHu6Joz3oYxi6jra6tgoMDQuIKm1OzWnMb6IUDuMrzwxfKJt 748 | 3dN8k8Hkd43zdAP3CvJgUfxpdi7BBx2OWCpCM5uNfb5LS2plAiSLdhCDK8LTSNK0KEraBkVej2IGdFKv 749 | kQeGBL+mZDbW0F1l5nczIJIfqNFOLiwuYbNpvZ4aUlbhhUicFrwp88jJakWHQPSjbcz3QTL2QTVVxwqm 750 | Ydfqkj4Yr+ZavuQFfGnWIRRwGK2ya6JX+xOdMbnMXK/sXF9E5zLXL+6e6ws4MmlP14WZrn5x51RfqGU0 751 | 59gsnyzZZZXjE+j0dBB4vQs95+iNNt/BffrdBtBu8vEEL0FqFeUWZky3Lae2xdFyCv3Q9OjonO0mzWoh 752 | Qh0KQRhfDpcJUAIdTk/6gZ3zUAknqpbjmVWEm4n79z2xUz+sw3mfM3MlB1CJm2bZnDz9Pk1NmRBYGPJk 753 | 1Y+CAKZOh8taUXJNVYuLBfEniG6eTYILdWk2W72eDKctK4KmfB3D3I6j84PaE9sCqmvzwAynJEfKHiYG 754 | T1TM5rYm2xwyTp2jKWJPDcmT+emxDyu9qdfrwIK6dpxh0ZROhBjb73tprEHFYuYXkyqjJVJ/syPHEeyb 755 | M3nDKWukbqJllOK4idUD5ozqu5rPWu+Hmd4Nz3t7BxNaf17fsw74hpXCLqNzp0yq/qVVT7vUyydgIbyT 756 | OMQlut68sihztJyJiQRo9/VAhvNc7VsQ0JSGCVxavpKqRfnkJHygnD6InP3bDaehipzXyd4avPzTNRiK 757 | g1Co/xDrHlXwJsk+KyBK1o9RyhqATPMV7BW+oWeoWHJ26+kH16xr0+1AxtGP+vAH6iHPfLkcABzvIfzx 758 | iDkn6xKn5S+s+O6nWn94HjW3J5y+ZqTnvXMs5020cb10jDfjVoje+zeAdt2M4bXHT9s+OmMaVR1vaaUb 759 | aXIFVxmSlVQMUL27hb3Mp8IvpgsIkDEDqfrQkInP2cPHyypfr6GZFcgiiBaPR5O5s7+iLWXkm8NiU69A 760 | to2aSrJZfZxQDFm7NDccDJcN9StltIK9zGomSJ6O5cYmsFGbaTSQFkBYuOBn0mzR9NV1Plc8TGia/vxC 761 | IqNh0FJdU93kAwbcPOtStHMmU1bQqllKAVTrlOZPx+hHKVoDD014EMsHtU90nrMZOfLwA02Wf2Dl4HbE 762 | qs5raS+ezHLYMQgUk6phEyHNZLRMr/19DDRQU6sOuJRNPa5yO98c2sTcpTJkWns52a83O1ZbEV9CSb0Q 763 | ZK1yxodzDN8zXffttvHqXGXrQye4KW1xmpYq3VhqAzrcTu+cjvxMT+/ktul9Q2fipsAa0RXLNZVf5wMh 764 | uSluGjsZfnt5mSxSOAjtytk/TBpbIESC7rvsA6lDCrCTJl0UHX5Rim6DOVUqdjlF5Pvt7k4t1TETo0RJ 765 | Dmd6us6Bns+6YavaHisx26ldToyC01xPSrDqnCb6QQ3ORiOWl5UZsqOj5ntjCFVST1fTnbcZedSzM2tS 766 | NTQ3E73d8+wCoLijA0FdrlUot56Y/B9abyesPzXeHPLUa22z2y1rSmhNkUaWNeTDoWDu72fMm32O+mLW 767 | rKx9SCZaWKkl0lhbJcddmgwAP6YNrmhyTSeVqG3wsU07ICQhchugP2m/0BvrFzrgTKFILi4tgnFuCbtS 768 | e4zA4IebuufznbOPaGXJVSs6F2ZTGC9PbJbJmGvXexZGDklhHS6Mm4jpjEGSR4nRuqNsRJSTzsalUepw 769 | AiOKpw/NVOtjscBFbqiS1qe3yQd9dQUMqahkGVcp3/jRGOXpV62Sxc8A63KIIMBVREWT7ieyOoDuQjVT 770 | ct1Bf+rbR0uSmEfcyBVzLXfBQa3ESZJ8daeZTWE/OkSAAgplFf8r+RDBJZR+VqUGV5+YBwb+ChO5wStD 771 | L15VFO/gTCAnDuZxNk9WmMsH86pY4VNj7zvglf+CmEGYBnAZB4winCx0BKYwESx1PKjSy+RlFV+uD94T 772 | vQFfF/MLz7FVVGYcIViqh0ZXb35BEwN/nlIjD+gz/uG5lQV7pO0UIBuIVi6Ye5GfjJuIgcl8Uj+G1UCX 773 | Ame+O+XMJVMv2UIO5Ie6bZVSt/yqf387WBb5pR7SAzF7/lX//nZAe2TyK//97aCcF0mS/ap/fzuocp3q 774 | T5rX2AhL2gGlIrwZOmWPW33ARZurXahZcq35XtjOqTbhSOswtY7pdb68YwERQ+k868x6PlurUIPy1eq7 775 | ZFkJ89oIGAZ9iSVpnFhuALs2526yuf/WyP1Vvm5kzu+tvOs4zvsQdjXJoDFvmVLzW4HRylmKfPWoOyBc 776 | oXI8kYhrj0TVzMys0VEJcGT6+yB8SH9PwqHMI30ghzerPF7A+aNwBuyyW7zd3ezxpdZeEex/BZpUNj9E 777 | DxwBbh1K5/HhyBXgqob8w9OCZm+nIF3uLNLJM2oUixQT3z5yUdoSa6+IfFN5MA2hk/CuQpw7WKEk9TUs 778 | caH2OsGoMgoUu1YYpXwnfv1c18UQ6V13T+6Nrx5XBZA16qWzhM7oZJPJ4Lg0SpNi1iSKJZBAXKVZvPpS 779 | iyxQjlwcm6i4MlNlerlZNXA4tejN3BZbyapzwMAyiwUMiUrLlzoHMXl2Sw1hVDAuJi2mgDhSgUMI9uXV 780 | 2jMIkBJv4X32+Sa+anFEOlHsvlmRafvyNOmKBXlpRzD7A6Jx3O1dwcrdL0smqjF4BRfMyaiaCd2UsifT 781 | wvBUjcg+K76gIdKEzmsozKqDNCsrnIa4FJDIE59BJvkKQGZeYxQibRbCjKUmYjhgv38jq2Jgg0D7u5NH 782 | RGh8L/WiMQ7aUvpFa3AmaRXmlaZVpArQabKzSqhCrTNsD+VIWmReIbPLiEGVaA6lxkBnQUMAxIZ9ph8d 783 | 1283+82liqku5krC7+CREKE5C/exZvcHYnxbr6eVSjo4mMk+SxM2BwMzUrV4nP9JTfZbVtella1B/m5w 784 | UwpiWVBmcmJEbMWPWF1951ZMl39HF6MiHGuv0Fq94YYpIPRhEXr8TOu28IQwWiXx+8QE857f1jRocf+z 785 | 6KZxXFTKSIzoUViJLj15kQekUeuMZrQOyxBrioeti1OBFD+sQel94/NLVieR3oYzVlnNwXdDByudBqqC 786 | bRUIRnzTqG2ik+q2WH/na+/N+q8cgYLGCDUTmxfMCuUjn3aD15IpyOE1rE9NgKf2us5SMKx3X6s226NW 787 | Vn0drP2RQniNmoRERzpICIXyGg1mqyu3mjZCd50SE/z6zExm7s1bcofAn1HVYe13+6HczLO+Dmh/kbnu 788 | 6nOwnEYLrOtbX3Nc+55pQyuhSqRmytyD/C8HVt9xyHfbY9zexiQTMMHbJ5l8v32S/UeY4IZZRTDx/W4q 789 | a7t1NGxNYHugpc5r7WJdKjB4Lb/NMbdYkUxPNykmk14siaSCr99sykrntODdrhaN7q2ErgL3c2kPdGdB 790 | o7qYegKY/LUEkWsjxGZHbwgVycoUlLi7ckb7SAupzMi4qq12tVXKa4z83mqzEbrLOmxNW5AUDikpr6/M 791 | lcbdjd+b/c663aunu25v29TrPnAILxht3F1LPTXZukNYgnoS28CJcyrcvbOH1Z8s4s6FqjuGJkLnymou 792 | Xs1z2dVrzlXh+ixLJhyZyz512TXCks3tyr1Bq5Td8ZvSfR6zcftArmYduwb7je/1NAB8k0ZP5Bq2u9eQ 793 | sN/PkLCLvjdp9+AgGp61VeM6NlYMmLYPa0Mbyx5IGiNvFayiTWd17VM3CYQ8y/yYc0/YBVbgzjy4hdN3 794 | gyIkga0KUD1wZxhVxjqLUT06IMlSVmKiaPpJagAsLr6ZSKO8GhvPq4epawJsKgHJcs4OTlJK1cW++gFg 795 | 9DCUt3g42BE/x8ojpVEqKVtKU51mg/UsslsZsZxsJQAbyzzr4ltd0YOjSgJamSp5myWENn1o09yszm8W 796 | bG3y6ASqa799RyS94VyQTOrLjp438HrOp7D+pGp5u6ovQbhfbptoLL935xGVm1O7kmk+a04iTYFmmoO7 797 | DVPPzA+2UOKLlYImyJ8MjrsHJXZ09oQrrvzzzvyMoCDRNuVudt9oNa4uFWxjrmrVvvcz1LoaUNCUW8US 798 | OoyD6e/h306npwM1u3/vWK208qMcLOUWU4Jef86qdLV9Qsx7cKw2VXSrgpiaE1k9By4kpWfIZVGDLfGc 799 | Qb0MDtApU8jYmmAWuCzpsnaMGI9f8xpWtO/YX9cQIg0rftyJEA89fys6qlra7vS52OYPx6l2sMCoADVn 800 | gvsCHoLa37JGlXYT6UseGnvEd1wjRq1KpI9h6SJemNjnEmMT60kvkc3bpPHGXq0hcMr2fRiZLrr2hY52 801 | 4ZTGDUHkra0vOlsvwgnGo6pbD8i/TiFeq6lLbfub8HWzEOV7IvO/mHiExGmX56bDQxO1C+RhU7tdxPCH 802 | NjvdOxCE5iXF6LbrE0eYtXW60leFdbYdeKDJhMdBLiYHWrc4MJa0xpEme/WXBVvMxlDRgeRyDONK5/oI 803 | 15qjxw0giHgS6/vFjL1UtZEitPWR9gj5Uk8f4h8TWMeCn9b+vsZNn/LN/s9rqDk7XfMgzDEMbFXWZUAw 804 | 6XDr5vjsks0Jx0XAaA3G3dbgDeVefJjA+XKoZ3CoY4tYGfjRda9M9FwuSnjdxDZCW5JvhhRWZ21NaEuj 805 | dVWQvzcUjvgYrP15J1QrMY6/TOh0E4oStneBs9Lbm43pNLhDQ3W+iF1vXq15j8Pd2OPrS83kvSjRha13 806 | e18YNHH31toV8SIHTCb8MMm15x5gpK1xsjPkrnTtX7fEGCHH+g50UmljIX1cdAv4FynbGdYZQlNYp+CD 807 | 5Tb7wK6kLOPkg6SjLO4KD19fpmcrtonYyWlza2R8TfNN6SRAeppXdzamo4w/S3JLSX+tB9zyuAuQ21/s 808 | vFa5nLyUl1tGTH8FmrbLqEJVpUaaBuCTskf9nfm4zkKRyNAEf3IfpLyUbWo8Nj2RRPVFqA0SHS57JRqa 809 | 1UobNixWqExUv4T4tC0IXbKzJ1fntL78YfzfC0b3sYvd4y4XPRJRrOh/omnHQDAw2tCUGk9Ur10Wdyrn 810 | XIGHaX9eMYgVR9SbB6Kt7FnDmaQDkOcFTIRMHg51ETShKTou4B1i0aEU2co68kI62X3GZoHyNEOVWG2U 811 | ETvNceB3O48ZYuCCCZ1o4XQWNqP4UP09L5J1w91Z7a23YSe/w65JM/cWC072tggtDqPTLSi4uXtOFnL9 812 | O2qEw2ybzrFBWmJjDpixcxJZn9mUvasfktql0nmqTLW//YTdQjuLNGi2io6VQw05yeUkjgttdy9fVg04 813 | bAdcprIQVbovE9Vlrnh4WBn170JU8DKBWKnaOMFd+Tj4alTbOvHetBYogFJPULdueqJXgtZYRW6IVV66 814 | q2jXGycj90g1akupRVUfUxcWZHsL9WXq8dvc2oiKacNlgYZkMBM9aH2G7wUokzpDxV77q8iLz86KbVxU 815 | 6XyVbOMypc0x3izSfHu2SLfzOHsfl1sGV8efVVpWW1x4pqtyu0zP5zFDi+BxUyTbZZ5T92wvkniBH4Yz 816 | 2V7GxdvtZYIPWfx+m28qWLYZYMttmXBXbMvNJcX8sMV14fY9VSP31DlxcAdvfgRddbroRR5xbzijt/QS 817 | eMfn6rKKjC73I/rm9S4qWvTT09Py+PHMoy2XOvIDuMDTsnes3tMTRTsUpMNiO89XW0b53l4U2/TyfCs2 818 | d/DShfrGWzov4svA96enV+GsF0x/fzy7H5wePz4+T9UZZ6a/HKtrvLJjsONUXeFle/S3yelVb3ysXkm5 819 | YTkv0nW1FZtWlBJQ3KeVA6d4ll9vWfzIhn7P6ZMWbZ+W9ynO9Pdoto3o2dguDpDDW+Rwb3sKTwRv4vfx 820 | NplfxoEURp+/xGdgCVOEwX2q6kvpkPuPDmHsN3367MmrJ6fTbb8fbBEwO53h+THFuEdd/IR4YI0INB0p 821 | 75FwcgeXm1WVrldJ9LF5+hgexB8dy/fH3kytknPaviXVMk1WizKpJE79RmwIDYbEoTNKPvPDTHHvyycR 822 | mchX8wyGluaZRDB+ZjzrcoY+F+H0RNV+ajA4Ogo/OlFpJnTEtRHpM09lSW3f3LKoHg/20leFLq943FGo 823 | 1SRxbK1dR3KT6VDBAN+bcRt/fSQOMjztKWO2U2+qaMEWbM+q6E31VzyajJ+wSTPXP5JnGlkaZO3zDg9Y 824 | xHgw7eRnWef8Hb3OKS74ddGUtFa3kLNNxMzbtumJeAL3a+5JgE9944vI9/dYqj1jBN10WHSz/T6YDNFV 825 | SfbwOcHWcMa3aCgRJXb5fZyl607vznxy7GGh0XHdEfZ5O8js+98ZIQEdMY0xTAT/lmje/4sqmGZlUlRf 826 | 8EUUTrUGNYzqyh3V/7K2e/enrYC94o1YMV5Wt2qZ/f9RaIM+2gWdpo+1AEYITa0hW89tAC4JzSVKk4xK 827 | ls7ofO/1Ak31Zc4IuZ4wvgLkCsRubsV9xiuygq+suTYURMOvK06qPDkgvFYeLW84TeHzvudwVk1RVasZ 828 | oqwCgRtL427a9GOrHQlLxgyn706oZnUan8YW1qwN0WRck4r+nMTRqz0atiBa2W3dbZDXRpYBcCpqo7xW 829 | EyiSiBY4MVVdN3qcqRGjVwIjSRv7/2xX1CijssexgdieHK92O+FwH/V8mWS1kyULBHheMRIgGy8cdkid 830 | t9tXjlTw8Jaj6ejosjvWnp/Vo6MPTswn1dQ/08a4idjt4nwL4JKtiRsBwxhWxpFqv6dqP7o3ouPz3slj 831 | L2CrpYYg0gohuav2cGfbK4dnnHI6KAIceTR0HCTsMr0RtA6g5M7DRFe46aXeqHA5fPj+XJg2eC7lSitm 832 | uOmOhuO/uqfVYDZTWn8zqDXxwxiXi6yvXOetXYRpqb27q6kmUrDPypzuTghWlpp8OKTaOej3Jjr0dqEZ 833 | eau80Brg8nWvadAen5+Is7bVBxaCyHWPNdKBLS2ti3lDvr2WG5ZlNO+P1EUEiaw6b+KbXjATdU6T1x89 834 | juYdAvAL7LcN6A92W0nbynM9oy/uQlq2XP56kLwDMtM5640OZ5FrlcQ3hLSyWAyS1oOqPfkE2pWXv6La 835 | n21o37NMoJwje/QPTWx1qGcupL0rV8iFZbFypEi18fUKnrAKbUkU64lKC2VVnxPqmwoChdhsPvPHm/GG 836 | zYxoCOB303ib4d0vpUHlmZFjexYZVqwox9Q5edgDsekLmGCnaqMxVMWbeDw1xfVH7YZKHWP1roLB4HCc 837 | 2/rEyOqtscsxGkeeq/hCtRAIgy/fxysvaJyadCyzkAqWM3Ruv04oys/FSgIgYq9T+sieUYbk96kI8fBq 838 | dxaBFjAb2Uvef2H9rl3MNc4jV3zyXdVCnHfPOIHhCRpHnwi6HHG2S5tRkoJFj3e6tOajJmkSoZ2IYZat 839 | 0Alh9GNr/k3VwGNixUZfI/618frY0D3oecdeTys1Oxm9c6QjX5pjQ5TFang/ozlJZ0i4jwepS3BzfV21 840 | bsdaJBiUuwM+VMxsyRqzRcGvlNVMosjNueRId76vLNJkc3AwbjXkRROsuYa/UHFUK0DlsFLONQwG1kgZ 841 | GPfPsQEliGt8Gm5TBpWCMhBXUiAeGGjaEA/65Gyqe2UKcdADO/Geh7u6lhc+YPRol3OO87sfqhaY6Hiv 842 | 2dwTWVTdgnusHELC9Y1Mu5lr1ndT+/LRKjgF2pkaiJAmMESlai0M8C/tCWIzDnZmYwLxACQurGixsoRd 843 | pP8NhIP8rINo64G4MKw1OqJs4lctirx2VQ7lRPPcQFiz3tBxY2c3Dt6uGJ6+qgMZH90lW5xPVBPRuZUG 844 | PDWEl6wY1ExLHIzz68piYCWOG2yGo+J2vxc4VF+HmRBu8lprnQDZ3uRrHcPXGGe1LYL5GPpOLWlzNNhW 845 | Nfx7EyCxiZcY7Ox9n+xSr/LQkyfPcMoI0o+ecimWUCtQmtAnzDR6zDt6hnTD1ZfnkHEdKuetm5akedPO 846 | Yv1rWb+5Pb5kk4kfR4ZehWQ/dsgmOTdxZF6zXW5A/BP8kV5YAIhMrmtvu6xNm1epX1WuKZ/1M+HAJu+d 847 | A6AFbzsiMFT3wTmYDPi229yYPOHNHYnbwXVCZjlKfbKzHox7o0XnjtmCc3ZsF7AR82HW0B/PqUWT0txv 848 | 2NuxEpQFvjkqK3xvkrWYwww+0fSNWjJTxIeX9Q72BR83rWXDXGRr3djVEriuJPdYyT2LcgUyztIZrZNV 849 | Cd5R17Ygvswc9OpDw355j3Bumgb2POKNJjBZaLhjD/1nzS3D7kLqWdXgsPPoWUOgQ1uyf9uevBeue0fE 850 | Fg1Xj82AVmsCfT59xQbPJX556QzNdMCxhenQ68UBJsbR0Q8gI2WO4DaI8dz1vKJ5JBmwmqbk2ZEXptb3 851 | dS6sOMmnda2zKTVy6F/rfnHIUpRCHa6OjniVObKUIiqjVFxE5jvVINlvs81TDVgs6ijNxSwh3CXidsGg 852 | Y4ZMWT++GF+IihMuDy9mAI5h9+RBQ7kQTmmos6n9gZnxC5U7+iD5LMwDqzJ6pScURb/hXlw2qMA9uk87 853 | yF5Flp/P7+LniUEj3n81gwjA4pyo0pmVc0rTy29j+Hvz6Qn42Dlue2ufs1TTwSrWs3XcBPS+QxQBtxIL 854 | jaLfFhZ/sM2hooIGTcK0LrzRaPKbZvWKJrPNdGLvIegL2tP4OAzLsHQp8jQSU+I2O+a0z9m7NpEbdZoS 855 | 1alpb6ITNl1MXd5Y2hvsVWYelK4qgSpd3iXyrJ8ydycoG5k1Po1LgJOZURC4rdt6l6bXuARUWCM3lxgy 856 | s07vJfp2lZbZwloUqS9oVVxYfJQ8WkwvgIoCn5SHtOr7I57+5uo1B2PLOPrO5pu3Nl+z9TSnfR446z/m 857 | ZV9CXQo0aF18KSj4huPMXY4zM2eV4fNK2RyW4tcu6/CoawhoASEZ8qFhvIBvIu0wmIFvOn0g077R0sHf 858 | 429K2vJK2UN85mUcWKFMvC5HGfCDYkzRDZSQmXQ3/EVgie46hCiWSUuRmP0vNKlxtCu21PhHyLq2psKb 859 | mhu3zaiAoTayNtnOxMZeqL8KwszAHam16Xooyxgu/hYh7Jv42r/Z0OeE3eiH3tdfvvIYclJszvUkUHH5 860 | IZuHhyOl4Urpyasuivyq9ELWKm0bHlwV8bqtTPW/9dil82p66zJuZ7Q0yOLi3yYgCiCOGgY1uTneV00E 861 | 89OQ9JnMVdUWete2qR3ye+M3wvHob1nBpBFea/NZOatc7TSk9eiAb3FidI/inzrOavUlZ7Xfm3f68NTO 862 | sDJxrs6aXz6cimnnoFk9SJSPIzIOpPadHgwa9R7fPhWy/alQNT0uBaEUtcmahbX0k3mg/aBDcb9lUSgH 863 | DO0QVhJs2SINjuBopFF+1Fbrg/JFpX6q1C+VuldFx/FqfRGf+tPfg9n9UygtfEuBOYCpqw+n5X3oNMjH 864 | 4Fj9wRoRVb7eFkA7357lVZVfblfJEh4p1a/8OQNZzKetPznsz6cJkXEDKGL8jM+XcXGeZsfq37V+yO++ 865 | 17vqeQF0IO5p1ZDfOj5PDtfXwTTu//H3Wc/E+6cbb9rrz4JIR9cRvq6imy9+ePYbMZirfP6WWMYfKWSd 866 | lykrTnjxWZmvaIPy1Pu0TM/SFTU79C7SxSLJPMZOg+dVm/hflJj2QCLSNXZ3OFRLmm2/MPx7+HA43Kn/ 867 | VNHUe5UDq/snBoVX3hfcUfQAiBNvppKMovySnL2Fgan3A/37Pv8DAOGlN6v5xKp2h6J9O1tPQ/oOiqFr 868 | nlTYNar8Z5rSmqjrVVpvcAS6t8I1Q7ZPw7AnoyQjiqWXqXYJhtaumbCsfQsH7UjlZdr90zWw2kFy607z 869 | 5P7pDqaqzrpou7sxivBD9p7ium4z/gxxhQIMLcGJZ8SseBY55sT5amFrouCnSwDldZiqJpyCiAFugFgf 870 | +q1YEVzZCDZ/8wORD7hIuLtYtaI4tWkg/S+UImFbhuTKJy7YLf8wdVB2W5nRqRpKHxdOHwfaWASc1K1d 871 | Uzml7DXE6wjt6IlqorsL7uGQV9BQ9HYO1nnZBm/7kyvVFscV3exAXRn3mQYX3mCp/cRMZFoboKSPS6aZ 872 | 4mlG9NPMTkS84dKlZhxj60T9UDRauInGH5VNR9s0gjodxpYX+VXH7k0TmBvF92W0e3RpWeg4gfFg2XFU 873 | 7vuqTCZaYx8F+/oERAH+LadhpkuZmJNBJzSvknbXUuSlllsfc7z1t736mH3IXH//wty1jmx9+ngidvRG 874 | XpixIyXK9zn7Egxv5rTPXmYM1QfrrGW6Wv2gyzpsbKL0tkqz5Bv7ltfR2O2BPNCxlbG911W6ICoPT3+I 875 | QyI85fkl4ytRBV4wdNeNt1zlceU5Ol307SuETTzzRHObp4S8AGrjw6rt+R6Q2bUXp6SF3dtQxpX51UDY 876 | jlwfN1nAoIUcizVHZe5yhZkl9xvvER0IG7UKwBDxh9ofmvO6monzM7OVl7V7p5L5h1L7daKlkWpfUHm4 877 | gTYyGAmrUu7YO0UxJ/ynZsCFaSsi2vtGs94ouJ9PT2Y9dubEHefXKwkiHuNNEiIrbWaLXde4mETmafk8 878 | fu4zirX5ANwr3S6ZQdIhRS/y1tdeAyEBXshZzvVSfJJ4Gh+bdXpriGO4t4faXLbwGF8XIH3UKxdJwcAL 879 | Ze0yq+TmldZlFnUT92jAyFucsND6CHPoI/A065gmt497LQz90xHX8+OvjHtrqON6qIfgtGksBLwqluWb 880 | sZkA7eZwIaNHgi+m/iWR/lUxLrKnXQwVdGJGzijH2oZ1KGJDGiXqSYhnJpB7wW9ejE2GpdZP88s1UVkL 881 | HqGJ/5MDwFQ1nc40YuLaC1hOO6JWuz0QaV6cqifnwioqJ6XgJAm8BN9NUI9vt+ixsHJWXL1AfM+IjO6i 882 | V9jThHNoBKBTRbKwohXxc2X8bfF9+2bAvoGIktkMLtPsF36J8RJfy0sd7oSadNEKbdF5mLDUTZMrJ1UM 883 | kR9xSHEbs89g2L7UtMBPne5Qkka0/2F339KvstaBwwpJRTZjZYYNTym32w7/aPcb+AmG9ynorGCIKsz/ 884 | WIRy/JH3I36MmjXnMNpV5ZuHU+Vl+kdijqXk0gvRr5vBOr1OGJawh+3EJEjdnNGlPPdXE/HCFK7cW5y2 885 | ucu/jSuDWk49+T6uLjBGPq0/2iv7uHIZBkHPL8SzAXaysHLcs+w7ZohwX+IXEyIN2OVPaFz+eMHkYaj9 886 | T7GC7oh4kdgIox8+zsd5LzoJPOG49M2jH/dq+qj3n4q9FAx5H6DlbbM2kfs1Vb/W3omaiUzuh/sJdH0l 887 | fs/7RRxlSbogdCvSmXcderhX87vzrqk9269la6wQM3L7LhkITCfnFJo3IUGUoTljR7B3ll/TxKLq0ZYr 888 | telrLB2nkjqKp6lQOl6HjwH7r/EkmI5IZS9mOSd9dr5qfE5eU9DYtKsmtVKpdFzw2dxRr5+SVQomfLtN 889 | WdJTZ5O6m3hKu9rQkMVpz0xA2uririkH4WfAS6bu3JUjMomJ0/oadmau09ks2ggFqWpeh04a+vKiiugf 890 | pBjeIzHCO+C/UnD08fDjA9n48CQu1vB4/NgLuJc97R7MsxxRyJz6wWF6ie6IUWcjt3qV4wK7uTtCe49q 891 | ACFbw8xvu20E1iI6k15VgyuiGxKq+CGFgWg6wLXg40fyV0waWI0KBuAw5bW98KLSyITww8C9Bbu+rO7R 892 | TcP663rvjidptokvP9h+GH2SQaeuZhDHDiK8VhYsdrWnuERLKGQt7Luvc6iNPc98vEnZvW4oGE/1Mjo6 893 | +lVP2H3RAC57y6sY6nQ/VmqfVyqNq0o60uxz2OEwrrbZK46OeJmaBpvvk9hQZP8Hqxd4mUE4bDvB05yJ 894 | IdvE/ZwO3OuumtD5VveLz+gn7vk1aR1n2sDSeMOTV/GBPxkMR/edlSxysMG9Ea1PL6yYCfO8Wx1Qmy1B 895 | LvudMpX4mzfkXBXQ6QcZoW/a5fVGw+F9mHOhANodWW9Vqgbf2ubJ88bZAIxYNFJ+9TgCKArvtuwRUu5B 896 | oUNTXy3eExU83M207g/g/HZfg0xKMiIaARM+LOpe8k1lonv1bV+jOBrUnJEvtGVrU+ZqPRDrvfR7PuxY 897 | qNcc8sv6Q5f/SrME60l/YyWLaQZmt28EjL9UapqYY1XEhzMBU3HvO5l6eaGFmAzJkA3WzqvxQshCyJXI 898 | HP9HK9tZ18QJCbdQH0CFoF3YIv2AMuFTITR+KrV0YV1YN18yEqXAmDkBAxG2dlGldFq2dhQnRA7nho67 899 | GadvOMcfOFppZF8goxIjEkva8q6OLco6TjUVZQlxpxe5w84m8e1CjaXJQ4oVowkbPMrmE2oKZl+fyQ5S 900 | 0gNcl1w2hvvq5KBn4KlmH4Aim2QOpngINl8TiKLulFLW/4GuJArIWU2f/vZP+HfoWCjv1M+OvYDfqht4 901 | 5SjPjKvEeRYd//1keHyu1vR0Oj2d3TtWSzwWk9OMgheZGFcK7uFWu2ZIL+PzZFsklNmW+jJhY8uL7A6/ 902 | i9u3yYfzJAuO0ybMT2kMIjqR3diA0df4NzqiyBkx7M2g2+5qOq/btId7uaNJtKpWfQjD2siBARER3q4L 903 | NchBlsVANu6eMkZMPDQSvZTooNB4osDN9kXWhUxHKRaZY+qvb4n0bf6hVa7CRVuzcU1ahMtkV5xNRo8m 904 | Gv2GDVeeogmeddhU3KARYcVtUeKrt7YpWWbKOy1OM+BzB2FH1Kw7qmjhyRHNQxx1gFgZPcBm81q3fXTq 905 | Vb4BfqOzlA5UlU5TLQmeRewNNfn5p28hrqDdhYmynkdnY8eXKtiJdE+kL5D54Fr7ZVJVAMdg70HOO52K 906 | 8YL31Zg9A5n+xLIzWDbar9CLVZxm2hlaAnUi3moSl6DKfTtnxDZKFEV3WsHI6gskwXkGdAVoTWeOzDzV 907 | DriOHFX5OXU6Hf+7mhk+b6tONaX3la2bQ+zh9L0hLmBtZ+UEmud0JCO3njf1evuQbHBO7sH/18xTqbjk 908 | rlWloNCoExxaNSvABvAY1w1O0eAqsMWknF0F1R3OUdfVAyzjAaMyHmioxgOD0XgAuPgD2qlomzgQPwQH 909 | giF/wPCkB4uzlTwwQDLQEuVps5ZfkDIHFlP5wMAoH9SQywc1zPKBoE4eaBPvGgOY8zVYwHig7JOiyGkH 910 | rn3ONp1K7GvMVrNuOPS9C5ChXEXw2GlDq8wgj2sAuGpf0eICDbwDpK5uMWiKutFQgIFJ11kTsa3p2//C 911 | YBAK4j1f3myyvSStBIBSNBj5tRODP4c6ZLwJzBAq45ZUDcCRdg9OnOLhx1F3HgIqQJEhjB2Myyl6makP 912 | mXqfRQad/Qwn6ORYXdPv3wZA0ruiJ386OZoFr6Pp70ez+8fqFZ+Xg/sTOu0PTqsZ7u+xRQIhoZjcOz6/ 913 | VE/1kRqf0ZTbEiuJf/2yygucv4Nen8euFPyIFZ/IW+IQgbwYUqHPdfKvv3y1/ebLJ89w+f8WYafHp8fH 914 | 6kv+PD29ooxmvZA9F9MHVON48rdQfBmHPqAitvTfsXqJFtKMwfJRTzJQMm/477Ms8u4fe8YxD7SV2cDw 915 | A8N2F8lSS+G/o26nsD3T+hgoExnHhMd8iqLfdpdZ9GUmArsPWVMjkv2Q1lvbNy5F6mxeWQcKqWzvlaoi 916 | rqo5b4Z03FTNQlwXqbNxW+8oCzRqSEEkGauw0X4LKTxRZCDIC3u9zyrcStweJEy9TWfBYJOJw8cMkrbW 917 | N43O5tiHvGtfWaDr4wgGrG+yuiNKfyXfN5bFxhXF4dCQuAnfYEwbrIZOMo9W4mrT3hS2u26+3cYgOeez 918 | STw59DfRnBZHSBycUfUqbavmgSrxB+j8gdpY/T03MnSiiKrJp9Q9s6OjkueOY2nUpAjYuKdxBi9XcfWD 919 | WCizvzp7bGQBFCa0FxCfRmc2ScICN1PwPR3AK1XGluKGgXJ8MVBXgbdS+sIc031PzN6JOHl09DIzMr+X 920 | WTcC7NgV0PO3Fdug6Nuvg5oKXYmb0NSiS9FGbt2FJTZ0yFdOrXk5sQCmIXQXOlyB+nHkvfjh5StcqTl6 921 | 2R2qfLGjxgepmaj1hdkOYrYs8V2qMa/3UsqWDTPTCcSGjLhhVdOY7isT6C2zlIxRM1NRvqJd5HINBUYY 922 | 2jYPB32NXkBje8ruW4h0K1k5lvb0ZMaA1qzoZnlrni3EgkB4Js/MbOPxqS5Hv36J89jE2rAGhHmDHczs 923 | T4/krmOodX8vXtxDGrK4rL7PF+kyTRbwrJVU8Tm7bncmd8iDQCeLo1CZlt/l83gVPtXE2GU2Hc0Cq0wJ 924 | NNUcNWetWHrV6pYWeVVGERMznbMfiePr/tXVVR/I930qTsjixZideoFX/PnVV/3PPCX6rbiev++Fz6hK 925 | AClhy6PjNYhbTwz0JUQmyTXeGyVdrtQBR7jG9zclK3Y5ERCiYwCGR6uMOghxN8gTqY+lOC7pWHLi1Mew 926 | H5dJ8RVD5EgSzwT++v13nq67O3lMZUzYP1/+8FzKJZIIkgK0myvmhS950StuKYuSobeqX5ELNBd4ciMT 927 | HY72mmCqwk4525aMshkhhsTd2XmwWd9CHk1oZ+TNsbkfAs89pPBmKGPzIeAFHakiqaTT8kkWcOCrIs5K 928 | yGUQ+EYHtiRj+5DLfIImShxuQCeKNt89u3I2x7B12axh+JjBD+7a4KESW6EW9SvlunTMXJaajYIca2m9 929 | JKkLyvNZsiQCGq6Q2DD9abxaQXGghGf3OZzfXeYFNMouKfOyiqtN+VSjFqoPODff488ZHflXkSe+W4gp 930 | V08j6uF48YF2jArLlCipn/Sc+IYhufbVT0EUnNARfCZehefBzRzWoxpNLHqlqZc4CObTah+mIaqmJ7Nd 931 | Fc2nLVvO2a7BtlfCtlc71OnJatWsVtkh/eBKTWKNyVmiJdSZZbXXEFfW3KiCOYjO4D0teg8J5HtWZ0jU 932 | B9yGVGa3BedQpIvk+/RSfMZ0bIrIZD241DGixKStB6e7bxn89uTxGavMa+3HS2y800vx4VjNZsIyPh3E 933 | q6v4Q0kEzlM95i3sb0WEdNEJcLrdXpmYuAYfcETYDr314VlJ6srigQuIji5T6p+n9VEVncP6V1GxcnBE 934 | T/lopADm8uh1GadQqKe1Hvl+AmfF9LjdfshwDVCz7NeZcl/fZop3+J53fEyTeS2W2hn8R17kC0jxxVJi 935 | bUMkCsW0JJaR39dBYk94O6Hr0WEns44WZpHTaZJf0h7P2jaGGuf6twhy1YgeHbItCS7UaSZyM46OcKEu 936 | b3Dl7xfTB1CmIbKiWodCOY9mE++zoRd6Dx8+8FihB4dcKxrn1ojHpYu59XrgHII1Cqcl00w83SORkTPK 937 | KzrZEewE6h22SrUmsu9poGSl65nydLyiHpKzV62OjoZ8WSJnPHwztFHXHWLEjqX8NNWC6dtFXBpzosPn 938 | +qyXqICQ4M5vxOLFpZulv/ci/yyrLauOqKsmXtDTrdQ2IvLGIwejGIN1LxP1Kuu4jbmiGXpv9Dryeu+z 939 | Xg/3Mp3FeDYGMk+XhtjhewWX+mEDlqeD9v7ke98u+yZO/2VKOzSRFO2UTFsR6XRXJs9pIfa/x+z26thU 940 | K7+eL3U/4s0hlQ7FSUDmhgXdJekM+ojiqUYugepK8IRJKs9dqozKttbGROW0+WU2ufVLD2zTIZarGzzx 941 | 1IHXe5b1vPHBu2g4GPJNYxDW2YDpCmqeiTpCTpOgo76psp8FYWtJHSjW4KCPedLUr2JTsVRP1TrQnhZk 942 | 6di1o7fYYHwFBE169GxFbvQuGo4Ub5/0azbacLQLnlL5/tpUYhO9A9miF2hw83RQn+DRCMty0VqAbNU+ 943 | pZrNMDWZQkavQ4Up31RggmAGm1SvJMAV95taezoyoz2blIEIPc6o1A31H9H7H9Rb4xT+uZAHfJIFbPB0 944 | 8Hz81u+P1HPiEfj84jfveX5gKTLP0WN622T+5+qDeq+u1Cv1PMrGJzT4Z1Tvs+gE2oWsammqz+7gKxVD 945 | o8UjEsftn+TxcPIwBPpP8jg6GVLTHwyHj+mAeDB8CD0BoBj7V9H3mb+moYRu4lX0A16u6JVY+/nEby3u 946 | V3TW7VFNvvcdrVu7nGn3e9W1D0Sv6EN3eixbm0yvYYpOG7JUlJoGCRfOBtkmJ88jL8uNQkyo2yOh1aWp 947 | SOg/j66YViCShp54a3xPDzzvqFsO30M08z56rnBoHz7HjQzlkQivSF3FgMlDHD+G5ogS+wjeIoK4+zlO 948 | eeqtC/Cs+eq9GAAt1fSDeq6ezoIQH0Bhm/CnFP5+VmcK+si/BDlbNaf0fNJgWEOXlcUcp0I/hMjpHMZi 949 | iZM/hcGnbmt11EyxXiH9vjnSav9TrQONOGrHofxTJlHB/dwORi7qrhDeeswzBZzmJTN8txklOGmMRemu 950 | vredskat8uCDbv8WHaRrUyMGzou67N7EWCTKt1v4+BGPQapDKJLVQpFc5CGFMttWumsCSXzfpZzJYh/D 951 | 2bJWpt27NfNAuzNc2UNERvsJi9Rw+GvH85TAENM4oDrWTONEClxYKGz2K9DVq2lJJw7+1sbrGyvAK41v 952 | CGyzVA1KVQQx14gp7hubmQjEDjca/qhmnKclq23gwyy4iaPS5MjWNWWwi6E+npq5E0/8+FDaDCrcVAQq 953 | zIAZcHUwf7gdBQCs3dztUC0pEzAwCExqt1NOXYPNNG5zZ422xLNxHs3NUBjrZfRjLYsSsYNY5WbTjnBm 954 | mwB8wD52UcWvmCXHVW/kBrCfMNMERgrIlVM8gxXwDMmDPFrZyzWhBCh/4InkYnVMHbricchpeDZ07POj 955 | OowDe/ZvkF8Zpe4dVCmke87CQpMFExw2F34LMLLQMJ8gWjoLNyJ6PRyKIQM03eb1rMIAODMr5pgonmix 956 | ZGqsgWdBFTE+ETcMB6u86/N0bW+oefcOPRauFHpjFrIhnhC3QOepDCGuSdjzO1UbTaly9MJut2vmUxrR 957 | Hy/qCmg5jvzCysFkC9ICr1papQ4aAq1bwoEv3RV+3a+/NOReurROgOqWnIoFTjqLbitfB31NPOjvzA5n 958 | 5UO+tdd2c0gskyCuteUNXhmTFp+oIcVEZpnoEiO5CJCiLI3TXRSvKSfPGiAoZiqUdVHxoCHX9vTpx2ZU 959 | G8C/cpe9fwFlIQoyoQdxW5IMJPSpSEJZtc1IRVvf2HlTgS0HfFk2yPmGOcIDE1s8tbQH0KbcBZenh5lD 960 | km23x0ibLLaG5D3WavdOJDbsubsYvjVtYtvegVILER5fs9Je7BMdqOwygKJNsYda2fTg0ZKqUA+jMKkd 961 | dbn4E9R3pV+xB68vcB0aBacTfxIdbe8F29PJ6eR43FhqIAxo/c61ZE9ktGsj6NvHBv0qE4R+JlMEyYG4 962 | UGFCXSkQJFcY3s5pjzJYjLt25mOHmVA24EiHml/+IjODRBOAuGD6yzZqLR0vzXAe+g2GUvAN7Q3Qnwrn 963 | oTtUF8j8+9GRh1/n7ogylWYwkGuDLQQ2xaDRmU2lmtZH+BluBEDhphmiVhNBjaA/VlDwBQsKaIu10U1v 964 | ZS3xhOk1IzvQ0VlPJ8facs5gvVRF1O4QdbVKMo8/9n8fKqNXcXlAFP8BphFzHuiCnWp2SSRUKC5TYdiA 965 | P27OZX2pBf+NWsroROAEscr0sd/q3KLVWV9ZSBO2Zmv0PYYy9gUqgoqNqp0DoEKnkUYGyNRPmfoFvkbv 966 | QWr7hOnzX0XDyLk000uDGesEp/yLLHgB6DW9KmsS9Vv2Rk6HrBE6J1dEG/36/XffVNVaCwL0yVvBlM4m 967 | /KMzYaNCvvd9iq08X1ac46tXL7zAzax1p3t9UbTbNNkbZ3Gcq6/Djo5Q/+0WldmF36J32hfFlKnfsEbM 968 | izI6PPwJt6NXxBQ9LZIFDXAar0rY5f2k87CgOpQXR1c/ZeaStD7CXEVP0MGZe3Q1UHCpVH2b3X1AuU5V 969 | eZvheou7kg3twdAPm6wG+TrBOmVRb6YPHT64VB2Nd/+yvMqLRRDekQQLjEoRArXmD9xAMAiRE0Cv48yy 970 | H0RqDto3AF1hfp2EF7XbRenU+7Wv51my6DNsIFvgd4VHXnNiOnDWXPU0WO3Lr0qVArZHz7sNzbuVCGmy 971 | hvhPNgax7gkannzNEVDKvRYXSePCPp2224eMDOwe0fgWiQ3cquuEhrJQvqYFTOy8CGNpacYw/AkeHjYz 972 | Q28acRkzXmsxvl9p6QCxPKtB572QH+z7Q1w1Ls5ZcMeYnM1w6dO5LQNhuvOWuOPyvF3JtItegywlrYd0 973 | Mjo5eUB9UrI07WT4MAjLSAqaEIERPhw+3OnsFrRottsc0i+iJtZHRzkNFvWw2gAoXCbppN2/E0dAV8BO 974 | Ler1fsm4N/0XbLPEmkms/y4Kf/49WIJyHwOruXNMKKfC76JoYDvRJmV+zdTPmfq3VrISsIAtzPi3MN6H 975 | stVvmQN7Mgk18sk2MFApgpJSw6n8k/KiObtJWGGbMviaqKWsmKkfqTG4eZ923dqJhrDAhF0libZeguvP 976 | +QabXhr9lhmbR+Ig06OjVO5TXKvtZAbtWbHZjqPWJzGBPGRWsAcJiclQmzINoEINx5I0J0e0bZ0wKgTN 977 | /JgKEjaURSp4peqkrH1EI1Zst6PxIj9gvDxv8AmdwMdRqYztrslXxUQGGEw1yo4mlG7bMSoDcESaZv3+ 978 | ysqgUmZZM0zdoop6tJ5R1hAbX5ZWxEhngNqJUtwixT0/1Qby6fRkFvbwF3ZeM+d8/JdLYXSKhn/N+LD+ 979 | 1WoB1mfkf9pglpH/I3RHRNFLK81RCIvjaYRgH5o20FRiNhPtyZ6SEpkh8vUMWi9WpO5gwGifwQ3NKeT6 980 | tUHjYBP1+g69g6bRe9KKx2AH8YPzEQaRxhXsaCx3qL/SqkM3ES/h2NNuZAzQYb3NYLEpmLDtywQ9rkMw 981 | Onk06heMJgPT3wpzuWx0w0ojp5iPtJRhfOzXatBQpK/S5QeWcyZqulE01tSpo8c0dYlKDf2yIYJFlJmo 982 | qNEmWtq73Ru0OkygTrMuQxe4GWsIEgBXW+xG48R9GZcwGCGSBmoOcGedZvFKm7inSRlWNtBof2TK9k9o 983 | e9B0ChHO5lFJi0NaOM5SD5uKjmJkcj0w28AG3jvYZaF+HDQqylNQf0g4xPaj7X6mVAFtj5v63FFHafi7 984 | ryat8Qp5B2h6UWdZE7Fe4+JxNs7cYcxkGEcOKPn+MKlqRmeIKyc3ofp2HhiZGzbskLKqwp93tjtorqev 985 | M7ugNrTZmDT1uhpb0QnMJObqP9SdLY07UwzGMoDosn41Hvg4yfKab4sK306flTJzLc7Sy3Cj+AAIdQ78 986 | sgtgKm/8vZmyzLvWwtOhrHagn40EIWDtAxMDz3bB6zB5c7asqthDelJxDYmeSM+1QFLSiMHcxSWjYxGR 987 | i400YEj0xyhnDge+jgv26lBQkLmTThh7IHYxNChX3OQLWw/6PGZVQ83nA2XSpi1mdTXzQGoL/RUpleoF 988 | tIwoDeTODRWOUuJAnlDn80KrUdqTQt3wBN3Tlmkj5UFyq5JINvCQVTOtFHXsIls3MbJq1ytszkEnANWM 989 | //IByU9WbFqJI6sOV57Ef02+zmzEJAi/to4lG/cQ2f6pYEXmrIkKzSUG0BWT02UDJge4YsDStfD6ylte 990 | g9zxAN/HE5X6GefK65qGkVgQrLE+CZSD+SOuCusX3vG1nxi+plLuS4MVt2m22xXwkVQd0uvRxN8/yLrC 991 | 6kT9Pk1UfjRV1UO03bp1YCimQHyhup3iG9NsWKoQDSP22Wy2IiI64oGWq/wqmq7ts6off3Wef5spbWXa 992 | DdPmGEjaj4KVFDSgBSSPL2Co+hy++L+LPxCpQql15uAtAFdjLc4ma23+G65rQLWGvSt7+jH1ZIbBtsti 993 | 8NUVKC+I33j7SxGvuRIlzpj9IXDyqPPGTYHTO+6XkfvlN/fLycy44i/EYIjhGngr+remU1OBX9WbhN6l 994 | cmDnM9WOPsV1H5GWywlalEB6x1M7gKAuzTbJeI6tgubtglX0a3yZItgJbnJafon5ooUecypyMTHdQ/XC 995 | lF9GC210GoRdK0nd7Njhi2+iRYfLQC3FjFcjhG1aWtfAtExqwDC1/1106ag0Efo+a69eq1k3D+pmVWoO 996 | GIqd07PzII6Ill1O0AUhnfs40/gLrUYfgbQl85mnluz1AjS2CdG/DpwHbM/16sEbgFEa/jCKwkVZceRL 997 | RYHDr8pZcyolgt6Jt9PUT1QUyo0X3dBAEie8Aap+SB+Rbs+SSO6FBbCNDuVI2+KBpogypYHcQEKwMkV5 998 | xbgDou4t9FykPZtJW7Vl55Vm0Zgbk0yoYwp5FIakxY1lNTe2U5RuX9otbVvL8Wgrae2A2Xb6PKnEGYH2 999 | BummsRji9fedIiJsXzkSoIx3FyYhOTU+cvvC0q6ANdYEZ92DM42vuxf7fqKGatT9LQiN80DqVN90Zb/u 1000 | 8uB+1avfmpmUVbLWHsncoBr+VdhNk7/SQLWQCRHLN+G/d/ak/a4JUrU3UZ356H5Tbn7RjfVr2rL3Nyu5 1001 | oRiccK2niQwJbt/xbgzoBbPaDTMxQbToc0Sz2RwO9VOF04KhlBh1rqJ1GTaLacNVsDnENXenzX8vBJRJ 1002 | s3Z+R/UcYDWdromfpgODGhayUX2ca1e9hJdVu9Z8cl/t7MDo8ROz0Fe0xDuCgT0V3bRbq2vsYghyQMNx 1003 | TVfhQNJ2cB/48FFy1Cg5eNp2JtqgW6xNxh2GoI3dUaYE7U0dCJW3GCSJbWPM9G/ip1rMpSTjPSvRZUxN 1004 | zv/EBFPfpmWZhv8x+JNqaE4xQTq2pVo4y2pnTTf1t9ucPkTtA5c1Y6/B6SXih6kAE9E+BiMoVqADXJ4e 1005 | SYMxxLjWLxIjAyxpzZYXDHVCq5vYX59vTYyyykC+R7GC/FKoSFZ2dKCzY92/QmLqSCoO2ux0w699h4I6 1006 | Fz82XA6/KUg+d7cZ6onve9iAGSsNcTuPGzinRpgrRPWq6cwcTZ2w3YdDfUVMq5Xy6Xk1ie9xtzNXW7oO 1007 | t7AR8sUFEF9nkAUSN4N6Hx2lPl4cS29m0+L9iP/Masw5k4jjW79A46zfHwdg7Hi1HYoHXpHfc135E9f2 1008 | kFeGzwGYXDKiBbClAPzFPNsc19vwpcoX8wXD/C4S6SqeEwIPLgPfpV5huthPIt21d/Wrypr9BaHY1PSu 1009 | B1lp/SqdPWv2djEpaokL94yZlGzv6VachxjCXzMI/OuAn7MbyrpjK+nYSjpWuzZGf1YzO9UF0Lly+5Nd 1010 | Fpq+rLgvmb6MhuP4ccXubAtKAVMASieVbbzUNQrMfDeNaunVpU0hRXQj1GSY7Kxf4EoA98YPH6fjtBed 1011 | 9Cvitv/DEALF1KDi9QAUOq3h7ei1RvLAMrJYUYUGeEwcdK6bckX79rP8KgtTKM4wTa048Oc1B/G+roNe 1012 | CaYwgvX2T/Q97anfZjWmr+Sx4/AfNpXzgXOSDzqj+pvObvfn3rb2N2yzD1vDeYHPwlYatZU4tWPUDqtS 1013 | wKa4myrAhLXaNkCz4RJOMEgd2QltJrW4k3YqkaBK1ErDZzhwHxRu99/CkoUR0xr5cjkZhjVirUHIrenQ 1014 | +jGsH7H1CK2C5pYT53lax5qFTnjtgMcg5Rr5R1GfAkNG39XvshHQRFoR4W8Fc6p+jBqIVq5CKtIEgO6i 1015 | X2dtKJ313g6lw0HOC63B/MoN2Pm40+8DLRfmZDq+DT7psyx/nhOZeJ8fX3wbHJ8wFSObENR50DXRHrFr 1016 | xJ3zt+1TOOF9T29ixn9kfXNivUFo+VhCuyBx7Amu+PEkG3lmNpmi36dtxibCFGPKE8pAiq9lHMFr42yl 1017 | HNF9UhEjMmOcrmthIPxAp02Be/E+XkWjB6r+7LbrZ1w6/pzBcOBbHdm3HdDMJDC5oo5uHqy3b1P/nAXq 1018 | Zzl1TXyefUSOrvKr8NPhkDaCsgqhr2VZBnZtYElvvgL9i/heeg9YdFk0aydCdszcWwDrZwCOKuWySI+E 1019 | oR0FCCxq6fft+X52M3Lc+u17INEZgt8S8DDXVfjYev+JbkBhDRWA1cIhoBK0FxZo1hCZ0QQOFo+gFu+5 1020 | bCsUKtctPBFwxD/J/hKDg/4CeNW0hp6uUor7E22L2i00pNSd3332dQaVhUBxRfMB/e35cC19nvwmDeNZ 1021 | btiToA+9Mc6A3oBQK00THFyT8td2SnAwTlK8Iu0uCHNMDj04N7Yzuz3wOSiwGk3OC8Ye7s7TOYtvmOER 1022 | tDYTI/KKZBVDjUeLwVPx6phHqS7Wt3J+5MyGBAY8GwEMicc+0moHIFpwtEyvkwW/8II1rqqEbVXTWJWz 1023 | 4HF/ZJTBIddWy/Fq4s+p8BoQT62jOfodrq4FlDj01030bNxMLt2gMuC+3zuZQGyYyx5AM4nQ+5AhRYje 1024 | 8jf4lbe+DPa6joKyOQ5jGst7X4/sMlAeUI3OWbA8qQb8Ut8rhSl32EaYS4dZs/5Tmle3DU9HPMjtpVKY 1025 | pWK4C9vd1rVFPQ0mFR1pt8zx0NfoaDLeL7TjHFW5oayYVfuYZGBUtqxnbEiLJOizGBr9ZmYIxxRsPloR 1026 | Fl4Y0bjjOuJh+tcR9dKTMeG8+7aBQhyyg5hDs9T0uEj27ajsNEariCi3vf8jaLq93tpurWcopodcL9bS 1027 | S2zjahZixzplV1FullZKSHnvXCuam3rLgEa93U08ZXchCdf7UxMK0e4Vx78ZpeVgvEd+pn/uaKTWgsMG 1028 | 6WDF8tEQT4RdnIAfdJDU2zs2LBES/PEpqt1G/WJyTava2RxpluaqmOShE/4KxEPAyaOc0adQq/aRpVHv 1029 | G3DjRcujlgAV45YwCT9v3B5Nase8aXIFyZ2IjyRFeDiyHIb2sWFhgAX+WkvS20NgEln4SnYR6fUSY08Q 1030 | wsY89NiHKQU76VmUxAOWugNWj0a7A0DhOsImK3xIA0Gf91PteSAX+xDDcYUGszoY3z0XXNXr8X6vZlBO 1031 | vnX8PTnxqI0z7vqs7nrWgW6f8FZtJWOsZtY1prmA9CpvvJkIsqhMhOZbXThNpDQSTzasLkVtKoFmobWc 1032 | +NoB4nciKyZpWKnYzitDQQG+rkPXmfcKTWtJxDhbvExWS8HpognwBRSO9xi1y3yxgfzV/N4SAfRhXlTl 1033 | pPkaXdOuPnjzI5A5aDrfi66VZ+pWZ0FTO4U/bvkdxJcL8+x7guoBoVMHpvT1DtCW/hWPcDD+6KPjYwD4 1034 | VXmRUIMTen63SYvkTamLOBDoA9jzpNXH5QGxSQes03eQ0kSsWANcYi6QFfrsgP6fJZhucfEBCaGxCNLu 1035 | IKcSioNVelbERZqUFkgshsOxjyhD3yjwPOMsgwOp50DXJTpofqfqf0+80IsiB0BbMXhNMV7D32+eLYl5 1036 | gUJnM8I9inDPjVAVGzh6bMbiSy+E6tLdj5SB+yodKD0+uMirt8mHcvCmRCDgFMrw+Pg8rS42Z2BFj98k 1037 | wEo8P27GPz5b5WfHl8RsJMXxflYf1afYIrixW+GFf97AyYrs3DgXqwVe1hfRuXZnWag3kXxpQVM4yhQ2 1038 | br0aNPAKbxwwgx4QZ3bO9jrHFn1WABmPUzmVTJT6Clx7UUcV7UcGWwgMLppn0Bs9KYOl/gvbC1q/6F/0 1039 | PD0b0HE9vyCGNRKwoAGszmAqxFa8+nMLfwMOeDyiM29247NBvKooJ1zCrBgicy5+FfDao06goaqKlcTA 1040 | kxsF7xKHlkXMcfxDNwGCOUGgUyBAUrD+iMTiRzdfDkC0+WQ5jXvzWfTR4TD08Sz2NHhy+gPRn28uYW3D 1041 | n00G2kvRcnp73IAK0TKBJHpjxJHzR8l4Lipby+mb6Xw2M8zaRfe9BhR1bSHRjbYADL3h4DMiZ+rxCm8+ 1042 | C9npEPs49tTnIbwTe2r0AIBQTP2q0aeh7hI1+kcona5GlA4DpEafgyjalJT4ZAiLpXXJahPqhOIm5dxT 1043 | D04ovWT/4IFQUBuiKx88lGfAg9LbJxQb2AQPqLSL/BKRKQNmgtQDKoyTUFmFUAEPqSxJ+fATnPIw0aJn 1044 | SrxIqHqf08OQfiiLEf1Q+hP6oeQPqMZDSvsQv6PQ+wS/VMFP8Uu1+wd+qWaf4Zdy/hy/lNl9/FJuPU99 1045 | NBpSRn0KGFFGA/xSRsf4pYyWIzxQTssTPFBWS5Q5oryWKBS9uUSp6MslikVXLlEuunKJgtGRS5R8MkKG 1046 | Qzxx1sj7BHmPkPnDhyzwk+4eoR/0KU2DIjU6OaEoPOnhFU7PtPDG+28iQv4fihZ6hxQp9P6L+jb0/kYd 1047 | GHr3PEU5/d1TVNHfPUW1PPLUZ9wDVD/fUx6AZ+C7sk+/r+k38rhfvDH9hgf08LEXfux9rOgp9B7R3wH9 1048 | PqbfY7ZxUt7pKT1svd1uvDDXgRonlj4yQKz8yp7TOCcXTefEfKk+i27otA8vmGbwmyeKPkMppwqqsc7m 1049 | T3s/LMoG53l+vkr4AFgfy0sfH/omzbE9aV789PrlNz/8/N2z1z+//PL10x+ev/r2+c9PXn37w/MIJ9W4 1050 | jvbqyRevf/n22atvos+cUPFiReTM4hviXSL7wTxxiR9e0LZZ/ZAlHaHR+zxdHAxNlq/Xxeu0/PbLT9sy 1051 | xg9RFr9Pz2OiG46O7CNbxzw5F1OP/UCNgnR8evb9y2+/PPCnn/7js1lwOjgOxh+iD5Peh+loFi7jVZnc 1052 | Wb7emD5YUTU9feSyevaM/IDjyyBkWdO575R3FF+uxw4S1PcUtKrckOcUco6QWmPmG/9MLUEvl1cp2nFW 1053 | ewu+mdMxczAKBTgUh9w5Tr4W4NdShKCYsbmIbFYUNzauHEqVRSvrz3GpzZ1ScfkorB+RdG+ibNzvv3lM 1054 | e3hQTN/MohX9GReDsmEq9U5d2pa/Y9zrR5f8M+mPQgkA0JMEDYH7Ml5FxQ4lvaGc3zzKxr3eG8rCZo/l 1055 | ICgkphm0EAvOoHXWfhzR0iwEYvt/2ek25FcKebfJEaZoxUOBSZf+mE7Lj1Bf9KHjqXlFDVkNMqI3XqZn 1056 | K+gjf+OveNzQp27U7faQbUvOii3Fe7tNL8+De8cWqsGOFm1zueLy2Kp+zGP9IOSfh6GO9kFPB/a0Zg3w 1057 | HUAFTEX7toTLPMAl1L5riRrAtmWOXfkCkoa/jvWcswlGgZ503pkX6jSfSdW8yoZ8rkMyGzIa6qD3ddBI 1058 | By3roBMdVNRBD3TQxpOme9f2G4vvvs0qql65OROC1D8J6GAn2q/RklGgcxmaXEbm4cQ8PDAPD83DJ+bh 1059 | U/Pwj7vLHgXqo89wwSli+64+HbnKcKkZj0cPTvQI0PPo0wkNyTVOI/rxgh6EmS91CZ+CjuqiQOcChBHJ 1060 | eFL78dQ3D1PzMPOCOcfozc0+Nq8rlKNCWPOLqNEuNdcbRH9kQOWMDdQp/W8zHfY/f9L/Ku4vZzcPd1uE 1061 | XbthJxJGQQ9m9Ocfs5uhqsPodWRfT0/L09OXs21/O/29j5AZnZnnHtOPU1EDF7EFbUpvowUMfalZdKAn 1062 | 0Vt2w3YRLcxuljy6oP1E61ucU+RkZmb0uZnHp6dfmNE9PT2rH5/Vj4v68WX9WNaPv9SPV/QoS/OcNgqj 1063 | Z7o7j5YIYFNDBkDsnTy6IJK8D9qZ6tUbzWCSvPTxfAItil50ItrsZXQ+jiXL6Tkk4GPmjMpHn36y3Z4/ 1064 | JgqK1qR5+3wI2ASJbCUfn36izoPtgxMtC0kzv1SfDxFCmZWPPv+Hzqcj6ef/oKRH/QcP3LQoEmEzmstx 1065 | 6wR4r67sCfCeBqd/xVAOUPXtv6c/tOMvMI7n0fR5/FzRv5lmCoY0XLEZOR61iyjGiAGfkTJ5FJ2LRRd+ 1066 | amskvKkLwI+I5slC9350ARyaKc382fgtLoZkW/2d9lN51gxGrOaBU4NFqwY8Z3TilOshoDso8TG/3lxw 1067 | tfilLqePc8JJB3gU9JZ8ndUyslj7eHCP/BWWoZnpvBTzTTFPWisP0O6nU/o7/Z2W2ydP8efZrLGKgvu0 1068 | frayRGUt0qJ0lqgTVi/Hz2c9efx9c403evFPTyfT8DCabaf8Epye/k7PXO4XunAT3Av0giXu1/QmrdQp 1069 | WGesTh7nvWVJXXqOhezTfte7qIFvaKei4PP6wAKvSFF75419l/je80c05G+n57OoP9rJgI6oqLfugFLa 1070 | PrT931KRAf5EvV7Go38RJW7N9mt1g2rR+9vpBXYc+CBg8VOAiBEGw9u1av3RX6625IFdGdnv9iuETH/X 1071 | ewXNMno+tPuGJPZ4+x+k50SMJyCJjo6KwFlZjXbN3R7lVprL+ejk6EifGJJxjn3LNGxuyAX+dG7ppWMY 1072 | vT7p/2d2fF4zNSV2tLJFUGjme+r1ug6xkreaknYm9jKys7afC2eV6HUhRmpMtxN1Kr/vKOySCDM95O8e 1073 | XVKz3xl9t7PpOx7Syuml4I2wOKaF3JKZESpVZuXZhurDrj7pru0rryAsGuqFVH0Eb2qgZDl7XUFDn6E+ 1074 | a2yD77RMpKvSboUFbGe7JWaGKIsUeh8acJBh4ahjelUwXuvtBZOxt/KrAH7ibB/qfWOtu3JLtO2biXee 1075 | Ep1x7u4+v4FmRA2XVLm27wWHL8gFXmYVQY0QY2HNW7NHBTUhC/RZm5q5llnq8ZSIRejH59QJwTjX+6Sz 1076 | NlZw8Us09Vl/+fcz7qJlLyIiGwzIqh8RHZQbfqD1P8/JhWH0KZesN3KpaO+UKFO0TsIMvdbrLdnqI69d 1077 | fHbVrPZymtezsu6+b4lf+2gp112QawU3Z9GNTKNwqebh2W6cUg/rrPUplKuzwcLN5QtwfUZ1FN7Fxg1W 1078 | 07JmZ8bUeEmjiU32HWJf0njgAlePx+WjisbjUrJbR8X0cqbm0Xr6gGfXPHCPGp2k318wr5dOLe2/CGbR 1079 | erymdCPsIDTl1kyKvAPWwg9XmfH6zFYyb6Tj1sH43XQ+E32XnQ48np4O+6ebJf1vRkx4Hv3gv4GEwzCn 1080 | S2tQZ43c/KJu9BsoW1E7p2/UHzPb1MYRmbNrD7UWPYGhWvDluxY5Lqgv5ubyq6La0em0nsY4n0QMoXij 1081 | 12Ltt9gMtbA7uNDLmPEa5PRKp3G9lc7GH2EzDW6SKNZVOWfS5C0RL8PZzgLs4Ri8eLSimlxgU17Srs9k 1082 | YTNZcCPpzLYBTde30R9sm0RZvLWb9id0JKzi7JzJybeNBfAJDplDXDMbhT4BgLNtApUjrXobvdhdAHQY 1083 | aApvAyJaL8eXvSh2hAMXiI0chJSlbwbi6CJQ76Oyd+FETmBzf/PeZtBHgPleRu/7JvLubaPSnwTjb/03 1084 | vXOYFzktgd2Geqe/9Up1oX703yoq14a9b6R4L/HlVH4nUw+5UsuKwSJ6Z7HY61V3XW990xk7KxPunTJc 1085 | r5IfNzk7Ry8YlV9z4NMnitn504/xn1BjHwvVNSUijDiZ04+ZvfEnET7RqN630Rkly8N/ktBrJvSchJ5J 1086 | yNE5oS7tlDK1iXTmkrH57rW/I31wrD7iDdz7+NTzDPl8JgfMdyk8+nNDJ3sN/T8qdnv63+b7f7e//7dU 1087 | y9bqv2F5e3vx7FiJshh0l9767LmZn3ofo8lng/dJcRZX6aVuLDSo6+L+y47LjIepzkjymWnhDu1/F0/z 1088 | S7mi4JA5u3O1YTemEU8p178BNWQSCv24TVbpcouu3ybZAo84z7fpkj5v02y+2iwSegO1CXFRsl0X8fll 1089 | vGX6c3sVFxlkTadnW+tnyjTxb2ig25pHUi6aMKD/joP729PjCfxBTU+v+rMeu4qSx6AXTOTpdHCxZZLo 1090 | 9Op+8FhPmZleVI1WmQo0y+/qjNRJBudUzZROrXWE+zJH7k9Qw/unx07/7yBfPU+uv0urpKBNrB4/2Q/5 1091 | o6csYIvX+0/P8495SR3fn3Hjfz+u2RjMF/qxUgj+0sFiOXFkUuADJljvmCguzCw6md8mHwDUVNbU4++n 1092 | JfFWZe8e0ckeX88ZlQtT7Z+UCy7j9c4c0rPsIdkWQOwBZBWB6S8zDn8oLsGMwAG69bQ63QyH8dCdDf/E 1093 | 3Maovr43k5//AqN3/ziVHNX0JWJMpiDpezz8eHRj6omguMw7s/qnrNvh9VSzmr0tOmxBf17DDdn908V9 1094 | mZOL+8Fki9/THgYmmfZO+7MJ4kwCroTJVXnD0cmDh598+o/PPveoiC+piAENUXl6dTq491+0M3in/00T 1095 | 52/OnNKb/Rc+ZLL1jn+vJSB9xkTbs8cCfvvm6OgNsTxEjGdWLFuu4wxS2TdC1IAComgU5U30bqyjffwI 1096 | sQ7mq7gsIZZ+oz72Hn8cMN3/KvrgrxsUZaGeEatgBzqZLMI5YPaO/jb6dDimohI6HpkfeRWYEl7Z6DEd 1097 | jNS86JmwFSlNPKGFFK4EzhUE1QvFCI3AK5BqE/nEP0I9DYlS+s3vuOUB+saxP8U8OpgFBzT9PlpQwO/b 1098 | A7xcEod/jG80avAr+zY6nvKcg8PZhBkf4vfbdypE5l1EF5Ozgb2vADXy4qcvvckFPX068aTd7Fk0RNA/ 1099 | TNCjs+LxKXzimxj2kb4cHD/GtZw8jIU4QyE8CHwtYu+BsJFmm8vy9Mw6wwsmx4Fi0dx5TWm+R6ddEal2 1100 | 9Wg0JFrtKng/vZpFF72PHx2v0sePVqkZ4u8+7l31MMaCh8miKuLt4RpGex/Ecx9WK3aK5CuT2tTHa2ap 1101 | vvr7aMj3D+OvGOmT0x3wDQdm1Ve9kXzNnMuJsn1n9ix6P+31kJW17SW2z8zj3rNea7L23nBDwmc7I3+8 1102 | kBuP8Rhn2+Wj3DpUfGTujSY5sRSPotW0moUYdrlOo4708YGPgTd3rCGDnTi9hDwDNOeJlaXUhSA7lEAs 1103 | BUqiqOPKxhRObukbHpTytl3mFHjuBmIIj/MVX7EMgCy1L4nbCBtmJkRa8yb9fsoMkvbat5ymTCt+3WaG 1104 | 8iDwYKWerxJo+spqODrSQQOc4D6cFQHP0oDrHeDs2sTnyYFWjDn4e8mXd9zUrwFMeebwij9KJc+OjvZK 1105 | P4O27Rm8Q5b3H+lLpmUw8TTL27+Mi7ebtRfaANwQ18LJr6dns91HtqCfa/L4bED7KP1NuOuWjCsnWKrg 1106 | 32SlxTEdTaCha3GNENSroOblhrQV2evHN4/eyQUge+CUS0DMOcPojI6OLmtuC/vGI080hc5i7TuNJW3z 1107 | +s2QXpfOhvu5Mjn2H9DemfUi+z6qZ95iPxMIDgKINmykS8sA/Ttg136X7oHtn171Aur6iP4x6egzMXk/ 1108 | ICLyY5/ZgfvBx1v/9CXtQLSDfnxwbxR5907uPbj3kBa22bGm86ez6eo7OmCfzKblS/4XnXqS1+kZXCIs 1109 | ktOz48BIui51yl8C4rhocx+pOXHsb3qjcRzyUp5zR9vLnhVxwTYJenxxdPTRQtz6MPTGQjONx9Ld/f6a 1110 | 3oYBr7qDmHuj11vv+C6LjsJCe7pUK43S/kbNe6PALjCs/Ln0oY16GXQHCKM+XhMziifi1WtY3SOPa/v2 1111 | 0TCIo3WNX9/vvx37zZh/89RbqkJQL9rE/T6mz5xXQhGMEtvamTNvew9gUnwejRgFi0i2i+ZMvPbAG180 1112 | 5Ltjiv7pTlhle2N4oc6pJDqSnrPVAUwTGnzu26BbNgo3P3W8BI3Z7ajZNeEQK6yH2j93zPfH9v08hgpL 1113 | /X4R8/Fh31P6fuB8fxOrj9DF5vI75qViuPndLq/lWnZk1UVYiNO491GuCZGxoUii91Bzg9xtcA4nsuMf 1114 | /VS9DyANAx2moSOvRMFwb9MMzJ65ys992kLZx8f87UT/hrDDR8FPWLZBRH/kvb1i/2+U16WnXkZe9WHt 1115 | qX/iwK089WXkrTeZp/6g3xX9vqB0xdxT/xYnI7QPqv9EHUK3s2gK9SLvMOI/+EuTC5pF3t/xcoR/8odf 1116 | 8QfqRffxDy89/MF/fTz0RYOI/kWsWET/QlY6Uqxj9Ej+4Bv/4X/yB3+R+DE/8JN+lGd+gV7Sf9G/Kf37 1117 | Hf8Q+Ds/8eONB5aC/uFly094/Ah6VB6vb/qF1BQ/+jqTHsWIFw+5B2/7/H0JHdnVBwBfZjQm2TzJl/Ri 1118 | FO7ECwB+oSfsiTwKalB8ffL771tAaXps5ps+OqvvbdJgSV22JWaIDtl6e6X9M3r0ODwCZ4DN0zs9vTcC 1119 | 8g1FJv6ovO9Z6fXOD9R30fERxfo+On5EP8+j48f08ysRsB79JkTJQisE9xf/L3tX+5bGsuS/569oWW+c 1120 | iahJdvfDgsqDMCo3CF5eYnKB+MwMIIi8RDDqOv7vW7+q7pkG8ST33i/37JNzItPT069V1dXV1V3VCF5x 1121 | 8ApBfzad42WAFz4UQi/X/GU8Q3iI8CSY88uIXlhexlbIJxGyfT/2GNr6tk/rn/2NnR2zfHyX29lpH1JU 1122 | u90qFPONPD2Tb+12h/7R572c2WLh1ehhO7XVibZa32gC2YriqSDlvqO0sv+WDqgp3/bbVNdeOuTwhqmi 1123 | tZfuckxwS9PGMH2BsMPaAFONfvJiDqqiG//gwXkyS9qMkIYyFKG6U2UM/3FEWwOeTVwUzLcUK97BMBX7 1124 | 7FFa4KCMdwGlgfyrYOIEdMEiS11Ncfh7gtveJ1dU4NUQJ5XVfDC9Xaj58GrS6yocoZ/2lRjKKPEEpGTX 1125 | QYG8qBJ1N2FBbqKzsIr3xxQmbFQtcxwRfZW2S2fRVQ3HOBbPnokgSuFEmZrdDn/gCDosYnvhggqbUdup 1126 | Yj5+LtsxkH5xsYUyhoQ32GvSz0tpiz8fK/9hOB0r2FgAHrh/wjwvx/5MYHRJMFtIEEad1MDwBsWq7uPE 1127 | Hw9D+U6fqA1DDqDJ/dthb9JV4uuLJMlF7zIc9HAZ/t3CB6hxdorPrbJnkdniloDLVqw4kCdlCkAvCSq9 1128 | 2/iNvyx64xnK5P4RJPFAgYrN19SP4e3izr9R98D05YIIoHerhfPftPJTWsHc7lOrtOmNCh7hF4Tt/uaK 1129 | mavSLBZ1ioHL3FSfsFzGK6EZRpqKED3CSgJiQ7joz9T8bgbQPE5CasQEhzalOdQq+D6HfQtRqAqAg+BR 1130 | Me1QGiK+4ZgaYK7ep8A87LFtoOKjq4rNCYFUHH2VS1mubqd3M24rUyjceIPQ+iA+DqFLFJjCeAPnfZUY 1131 | rajpnbUaYqsiagrf6DjHAy7dFRw9TycEi1vC3JxhNe/5Nz22FKFO31CBSqQlJbYC6g40csdEQvO67hmh 1132 | 2++DgJlaeIb/Ta+/Qq/dXnCHK8MI/4QOw37MYvGqtxBCnFMgPi7B8IVvflWawP/H4lGRICw3OdyaZnaH 1133 | DPTu3XgGyBPMdQ1EQzF9UaMFjH3TIdw8ByqipONHhbOYajIlUuLeEbDNULjtUeHa4oiGQyCto9+bHoHq 1134 | jrB+Q9TQU/f+ZOHDAlnj+sg7KVWUVyn+QwRCvJiGk2alBhsAHnXoBl17YO4Pl4bx6JbBw3v+yfDmMeKP 1135 | g65P3ZpIP1lrQP1DqdLJW38oVysJlB/h218dM94bwB9uzvyH2n8zRPOpFwGR6UTTutUNQatGEyXrTeZ3 1136 | tzGpTbTZmUbHMG6yRsI8vANC0F4ao33NnRaD3kTIbQ1q7vFR+vVPYYR7AHeKGv5zPxT66g8T6sVlagxh 1137 | UC83Ryonydje7WFtV3p5g0PiVrfRJHZps4Kjnt30CQyE7pwbP91a1sN0XIo+clqddEv07N/2c53tvQ6n 1138 | o5UKi3T3JA12oF04xL5IJ827Jiz2WdsmO+0d81lvFHOinCNptnkbqJ1bk+YvS0n+YlJ4otXfb/0l14nw 1139 | c7ia8WE8awfctsOkiP32nhW/N4yzXM85k9yKspLvHVVNGZe/uVbmcK5zAw2vZLY/2XmHE6ihkR3JcrLZ 1140 | 8W3fJOu4FlK0towWR4PFOKUttdOpMV99n3rQr/ptfhPjT5DXnnesrZkF67fRDH/xI6X3NmM5Phe1t0Q9 1141 | 1N7KLe9aghhSusnf4ibLLt5uZody3GMbZS93uCnd9BcTKX9DnPG15wedaDpxrXwmmwWXu+84So+MrLzC 1142 | kgPbKnMmtfitvdehqpwcpXHdmDBatC6jL9t7K+idTtr321odZnRh2y4twFbpYCmhVpRRwq0/TMjltbcO 1143 | Aec11CEU8IeVr0u5Uvub15Ou1s+ko8nLHskG4XpQ7ElCDW9O+Huh9Xuh9U8ttH51dnoGxYXQ6PDPDHZp 1144 | 4cMDfh8RM15DhyzLMdQZcSkuQ27s+k2zvxd8f+oF3y9LdSvHhazBNP89DP78w4Do4DVuiSta/zUU/4vr 1145 | jpcEunaJwY0N5gPwcv6ln3+NMv8dF7C/DI70mqOb1qj9gdvFHwGgNysQ+pNpJH4dIGuXoK0UDQ4sW2b8 1146 | s27+//+nM1gHszf/ENBug99c/99Ae5haO1e/grPr+dJqLL+yEqMFnhwapUSvejg4za73bJD4r7GMN/qZ 1147 | IN3L9J+zTWcYn6wZ7vrPawpZ8oBjHUtMdp8XBz912pC7Fper2x//+33GACr7PT649fatTrC/yH7f3jZm 1148 | IVNtbTRLjsy9fWu9JIclpMHMwlJufF4iPJitPWyH5bIchAn2xEjZDQ9wY382sTsR8y0cZki87Wf9rH/g 1149 | WxFsQ+fbpwapISlYrVpRrDhbiXsYz+BQz7c75v9Cx95Qz7piwBXfbL/RxcX4bPkiboIPPiFR7K9s5RJy 1150 | nGt0s12Y+RCjk6u5V9LiEk50z9na3yhWC42v5x4xi6k6bx6VSwWVQjjwb1OH7ck+wnuHW66b/XSwsWdO 1151 | dHV32R3caeOszLYh3CI/iURjU1/OztlRjwGM2z14dLr67lECNCdCc5cS+cvmcSN9JqqrjxqNtOGhj4tQ 1152 | gCceh+7oYDkC3pEWvTrWwnFRmoxpoNOwnd3x9Cx5X/niaBdqdmH+wcYoikaGFuQEkW6zj/trDrrWgQFs 1153 | d8/fQTXmyh49H6jGoQErERRi/K2l2ovOOxdp3uBcjPtMpcmRpK4xRQeBWl4ghGKXvUD46S5sni0LxuVG 1154 | 5TLmCC1uF8Wp8DF4Rpd4RpgOMjPwjTGPm9nBeNfHNa3j3cBGaRhj66eEKG1+n/X3Q8sDSHLUwofJkf2p 1155 | 5TNPGCWeOFx+femAgwcfhlTK7SZj62AkHjmMcTax87wpXBeT1kkIMAnJ0ggLl6+2Z3jpAZQO9WGx0M4B 1156 | 51DUuITRufatnmnihsbI5e3bwEksSYcHrRhqRHQaZPOjx4aAlflCiqaGn6SSs5Ppn6RiZgSP/zT93MCa 1157 | cX+YwD85GalNKnH5+opVpbFJpE98d8KQT5lk5ThlkXCeZfZO1H998ESBl55KHUzeSOmijYCQ45oLcNmE 1158 | NkszznMy/eGepXFAEzBfqv9wTuRB0sg8U9XXVtZ5VVamFcBt5ihtBJIyMf5TOb+auUvLCbBiL5yyyJB5 1159 | SNMElm80aqWjy0r+zMuInjqJ/JwvNzn2B8cWqmdnXqWRKeCl6BXK+RpPdhnZCqHIT97Xi2qtmKnhpVxq 1160 | eLV8OfNXvFSqhWrRy3xG+LycL1Uy/8vBZqXQkCkz4yGiXm3WCl7mnMPUiMpJJp9+wwfiTzKic8cLMehM 1161 | /RkGi2/eiBsmnuPm32/+STdM57XdNUBzKPoFfJ1WS06rQWpZtCftW9V+yL9PdhZMpDb6IIGHD8Px/sKy 1162 | ldmu+w6nUG2LNYraWrPbwMfnuISdHWOsE603zJFdID53xxnyxWKUL5fpj/AR5Sv0Vvka5ev0rxDlm43T 1163 | aq30d0ZBdJQvfGqeRyyf02/jwvPoWfPyn+i3elH3oqNmmcJfowJlzhc9POnn1Ct8kt/zaqnSiArlKqLL 1164 | zTpV6RWjQjVf9uoFiqqWy/kGP5tnlQgUVWrgcd7k2ArhPM8lkDBFgXocaOSPypwCMhYHPns1SkeNQ85a 1165 | tU5pm7Wah8zyvCzyJ/3SKJ0tv1CRZ+dxDElwNbzUq7UIB7SO0LHiUaEQFT2CXrWAsoTo8TzON8sNepY9 1166 | jiaAFqmDUbFU/4QfamShwQEaR9S1YlSsNtGBYq16HhWbZ2df8XseeWWqhlZCkVerlT+XIyokf04xXwre 1167 | eYMeXoF/AB3vCxVXx6MRHXuNwml0XKIS6ad8nC80qN3H8ueVTirRcc2jpn1pxAEB4HGtehYdN4kcjjH0 1168 | gPSTaqMandTyBLiTWpXQf5r/TOMuOq2Wi9TvT1GJ+tcoNb7GAcJeHL4k3AARpeOIaKZUKXpf6LdCwDQf 1169 | KkQDda/AoWpUqkd/JRqJiFVEn6jpUdk7bkTl0iePfipepRqVq/liVGGCzJcjYhxMXZVqJaGnSrURVdAJ 1170 | /FDNVfzjv7pHIKJOVc89+QEuhanw69+aXu0rh5ieGxz8clamJwODIEgMjFpfbWK0VInIonOPchN0iG9V 1171 | IprEC6U6kp7XSmd5Koye+FirFvjHKzaJQkRyjIiYCQg1KpXotMg/jBQqpFo5Lp0gac07pk5VCl6dgueU 1172 | S8ZijQi0yp9BRAXkaTRriP9cJWDVSienFEfjCYOWAheFarOCmIuTZqkIFNWahPB6/jP9EAzP8lGdyJUK 1173 | qnt1dEBIHjCgPwmfNhvF6kUlqldprND4aICSC/Wo/pUAfyYZhI7Qi3rp7xQ4JUATXhtE1zR2K/xTzwtp 1174 | UcNPTpCnRsSGAdSoe39rElabFXymX8JH1DzngSoPBg9VFHFlPAPV6VH7CpL8XPIuoot8qQFKv0DN9EMw 1175 | ujjFSLgoNU6ji1pJCnHFaPd+p4P98mFsLScnj4l3b+90cmIV1+7CewQbxWkzuO2I/hKTuBe2cHpz00wD 1176 | sLrrsLXmO/3hTj5Q/dYUgb3JzkocFcrR7/QmJE1htO7FrLbqrFc8A6uG3pWaq/Obu6vhxJrtbIez7E1W 1177 | P3YWlCVxlKcc31VPvJCHV1sfPo270/GZPxnO0qpLUalL5CARnyYd9Z0i+OBD552zT51sX3S2SXrHNv5m 1178 | 1H6i/zfUXloFlOzpOa36+tlLqxmCatR7zKj3VLC/8DP0SdHHIX2hqFAeN/Qgad5SPThXlD6tBlSMaWrI 1179 | hUkhPRVFyukpEnjVe4QlKCZPKkevGepHjoRdpFcZbtDl/a0/M/H8Qh94nlXorQmLxIt0VK5Ewb3bPENN 1180 | TPMpKQreUSQtwjLqPq2k2Adq7WJMpfxIq7tZFzesqYV6zqor9fat8s3dAWFaUdee7CKTCkn+g37KGaDP 1181 | tKSgVlGnB1kKX4aLyYJeTIjaJglocaNCF0kIzpRge3uYVY4x56G+9qmXgdsadpBbPRvtF4K+dmmuZGnc 1182 | mGZUSoKEdhKO4kgdplhxh3rUg8aVPgQciOPzfVyiTIXgSbF6yZC/Ibik9AuuGE+BBhJy7BOy0WVQYquP 1183 | hibfJgb/V0wkQjo+rsVWIyaQMdFPWl1TrOW2m8nhAyCvL1ywlRqgFiJXAuHTswD8GimvY6+OkvuDRIZY 1184 | 7yDfy7KHSzFo6LDV7cT3QGS5zax/exYF5BOrIJ2BkP2YHvHCQw3UvhrTY3ubsS+IH9GDkh8Sleekf+EN 1185 | bqFl79WEWL6yiK8apdp8WpAMOi6aMNKVXxnfJCOX2sDDLWkVL2Lq2LfDcCMkDHdlz256i9SgPQ0sXt0Q 1186 | ekBw8dVKzg1VoqnpitKDen37mgw9rBJc0ogm+g/Qv9j1FtOwuUBGxSmeZVCWiAXZJbzIigQxwDmXZo92 1187 | rpUadQonSCs7p2GBKy0m+hoxaolO4OtOhrO5g73L7sgsEoX3kFFPPiZOk4lS6VuX+whSNW43Yk7Yz2p9 1188 | tDMkOmB63HD6XB5fYzdoDbe3KXPKdBqujYR4+0gcuuqq9XF56AQyphhpPCK5e+LPWQXcLaL/W9vNs7py 1189 | Da0uxyddyRoy2ugJKJaJIkiIQlO+0MUfEcWAZ4vQgHGYZrrfCKV/IzMeZlmenBIMEqVjFFsoFX7dpRpl 1190 | GjKdQTkbzGO6zETRiKwKWsw1mTOCgzJT1nNRuAu+Put10ckJ+HYck/TQd67xRWq1+bELMJpKdWKUiiit 1191 | fBeukXj4d5lE9DV9oXAnF8OP6u8tN4aA1bMawxwxpsgBJkCfL0EZ2EzWtwcBJblCMSEPOd/VMyHhikIt 1192 | 69PA7cS9HaFgu8dDF8mHrw3WIJ66peOBvVFMdUJiCOBbx5B+gO4FK2xYhkKYDIVgeRTgu8NF2XrqBEcM 1193 | ytlrrMHwI26fCWgMBYIh46WH2ztlAo9p6rUu2ZOL5S2Yv690gwpmGl6OTKMmS6dsjSppXLjUOMKMY42L 1194 | ECQdADmBPePnkswby5lfDKEQmZdLXDfSvosuOgTNhcgBz1MxMRGZTqBoybxChk4qpbaVH99EAMtJUdFq 1195 | 98A6/jCJv7Li2XJSx//Hf/6XlWErZX34H/qwyoaEa0EQW/hXGWW40pOKL3yj8OZHklrQExZXpiQB0fuw 1196 | 72xOpgtEX35wny4vDy4vzSS7CYl5F4Khs/khvfmRsPbMeUVE/IXSpQQWMp3Ly7SUkqVKiHkQTdDkP4fY 1197 | hQQHdlpOg+DuSmNQs4MP6ctLag7XBaFvbWs2eRcmrTZZGfwHvd4UwXHzg5/4GqSGPmFfUK5RfLJaC72m 1198 | wIHKSaG2pFS7WIxkKnI5r+Rj68YXbf5ACSAJ2S2NzcLXl4yUIqc/vYpRUe4ivWn2wfq6NzFm/5A4dFG7 1199 | Mg64zLjQDRsUKcXrovhizxWZJ9CzGfHqeCLPLEvQgRai2a6a2eGqOJtbEk4CS7JlTrHKd3OqFXQwHRCD 1200 | 1jdkohoaRmPcHaXC7W09rOJ2XGPigCxpGhLIGq8fT0n916YkcxBpla31eF2D7NYmErYysbxvzw/hQGiD 1201 | F6PxmtV1+B0GqYSjDwpMpkt/cE9ODymRXlNE9VvM5+jvGhM3td6XBZYrU2FPWPhVPImHIv6E8VYSJAXb 1202 | uRDOIO+35x1eL7s5a8UsrcK57XnHzVHKzb2VRVDILegahPtOL5btxzzvoC2hzCIjCpihbj519QQUC/3Y 1203 | JGQMGVf4BMiAuoXMhLu4cn7XGIOc+soGVnf4Ax225iWRnGLR+jXqsqqaLknj2AWJL/tLiYYjldZ8EAE0 1204 | afNAPqQ1H8O2DQ89zQIRzDLr2ZT7b8y42+LpBa7jAD7bbBme04Q+xGLZcqPavoV2psMfbVP8vfZm+wkH 1205 | zJ/hPOKZvz89HRAneH5eSvZEydiOl6g02mWrDscRHf9zJ2o/E722n133XY6IwHVZcT/fdnbxTm+vpUVS 1206 | 7Jw+S9UJ3cj6d8TjLhCxzeDyWqRlyOc0zbVGWD0zifWFXjauXX0yJNWcjCbT+4l15hnzIuA3EgHzOr6c 1207 | F4KAkWVDls722vfGfX7gCvVuH5ihwqwtFq9AXgMmWAji0MWk0qhlAOLdJniniDwhqUgolZIFKGKC5JDA 1208 | Ls3oh2rnA5MzMrO4knJQUsDFCL8SMuLhTwxOFgWh1g+ltJhnZSLWs2UAu5VbX5qbseLdlFlgoOQer+eJ 1209 | 4RCAZGaXtTY7IjcUD2dBKOC6dYNe8jzHPcVEkOoYCSaZRowog7GbetFkkuO24rM5WywL2x9FvjDTZCwf 1210 | 0Txkiu1bkSaul8R9NHFX6BX17iP3LsXIssbZM0dQ34xLx8tLEbssB6JG1g619o2ICnF8UshawASu5lKt 1211 | 74amdISPUYzZ23E7iScTu5LBi2WObzsO3uJRu7U0XOk/zQhSieSalDhPljH+z1mjv3TKJBBtDZ8sYY2N 1212 | tXK0eKhV29iZmtomrIcFMkMe3teiJzWq1TTUQ6xN6okGAfCML5knWtzHerkn2iQMPwdr6im8bicT/Ybo 1213 | rcxBuSxzjNEru+bv0MFYf2UukFI76gOUV4esExjs7LjUiWvooTBpjdzl3l2b3s1EI3LNXaP+jIWfjLnk 1214 | K/uEQpc5il4hDqw1HhO7rJmthd/a1eOMU60Wq2fNGYNhjFpWSyP6GawRo94TnbwoDuMCH95r3sp4CeB7 1215 | CyXjpU8vws54gR0QkJCpL8Dq2QrcQPS1PVbaURemzhiQvCa6HU9/9JbqtVQcnJYr1uvJ6xWNEQROh2vC 1216 | PN7qGfVHL8t9N7ksECwVIKkGDBa0lnqrmTur6UdSksbVCI0ZcboNysQJRMWiHcG6ot8c6dqoJH3KsScy 1217 | WNZ6B8PIru0VbxEsCRjMAjBYfRo8E4H4TcvvmAfBXCPAXA2qJcIJfzORvGi0S76DiGjpMBnNfiwa3uzO 1218 | cLtpFgH0jxYMxLLM5gLlG7J+RPRpso8RYuWAsue8Ul/qx/3r6lJrGd51JZGoMpcKeHDsJUHIgqGuzagn 1219 | EiUXcbbs67UEHENVBYwAqXKXp0O7xh/cZFuSZDWzRp4lJc4c31ll+Ak/x36Fvj7d4V0YsJ7X1g0h83hm 1220 | pjjFZ7QUD4uC3MrKagy+k5V5LX2eI/8yrBfOi0YzoRqdt9Z22L+iebe3Q5xAlP6+yJoYp44oHl5cHPZ/ 1221 | AQAA//9SzO25h7UCAA== 1222 | `, 1223 | }, 1224 | 1225 | "/includes.tmpl": { 1226 | local: "../ui/includes.tmpl", 1227 | size: 10123, 1228 | modtime: 1456280857, 1229 | compressed: ` 1230 | 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 1269 | `, 1270 | }, 1271 | 1272 | "/share.html": { 1273 | local: "../ui/share.html", 1274 | size: 268, 1275 | modtime: 1456280857, 1276 | compressed: ` 1277 | H4sIAAAJbogA/0yQQW7FIAxE9z2FxapdRByghDNUvQEN/g2RQyJsokYody+CVvle2dbM88hmlpXsC9Qy 1278 | Mzrf2zZKEEJbolvxgtfic3IStnjBym8wwEfaHoFC/IZP5EzCRnfHTeAphV1Azh1HJfgjenGH61tl4XAJ 1279 | 9kbBBCOUhSv9HYzuihtUQpwoe+SrB9V3UvO1+fPppA8HTOSYR/WPHlLLNzwykbJGV8mfV3dz5bUn/AYA 1280 | AP//47/33QwBAAA= 1281 | `, 1282 | }, 1283 | 1284 | "/": { 1285 | isDir: true, 1286 | local: "../ui", 1287 | }, 1288 | } 1289 | -------------------------------------------------------------------------------- /miniprofiler/templates.go: -------------------------------------------------------------------------------- 1 | package miniprofiler 2 | 3 | import ( 4 | "html/template" 5 | "io/ioutil" 6 | "strings" 7 | ) 8 | 9 | var includePartialHtmlTmpl = parseInclude("include", "/include.partial.html") 10 | var shareHtmlTmpl = parseInclude("share", "/share.html") 11 | 12 | func parseInclude(name string, fname string) *template.Template { 13 | f, err := webFS.Open(fname) 14 | if err != nil { 15 | panic(err) 16 | } 17 | t, err := ioutil.ReadAll(f) 18 | if err != nil { 19 | panic(err) 20 | } 21 | f.Close() 22 | s := string(t) 23 | s = strings.Replace(s, "{", "{{.", -1) 24 | s = strings.Replace(s, "}", "}}", -1) 25 | return template.Must(template.New(name).Parse(s)) 26 | } 27 | -------------------------------------------------------------------------------- /miniprofiler/types.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | package miniprofiler 18 | 19 | import ( 20 | "encoding/json" 21 | "fmt" 22 | "html/template" 23 | "math/rand" 24 | "net/http" 25 | "runtime/debug" 26 | "strings" 27 | "sync" 28 | "time" 29 | ) 30 | 31 | var rnd = rand.New(&lockedSource{src: rand.NewSource(time.Now().UnixNano())}) 32 | 33 | type lockedSource struct { 34 | lk sync.Mutex 35 | src rand.Source 36 | } 37 | 38 | func (r *lockedSource) Int63() (n int64) { 39 | r.lk.Lock() 40 | n = r.src.Int63() 41 | r.lk.Unlock() 42 | return 43 | } 44 | 45 | func (r *lockedSource) Seed(seed int64) { 46 | r.lk.Lock() 47 | r.src.Seed(seed) 48 | r.lk.Unlock() 49 | } 50 | 51 | func newGuid() string { 52 | return fmt.Sprintf("%016x", rnd.Int63()) 53 | } 54 | 55 | type Profile struct { 56 | Id string 57 | Name string 58 | start time.Time 59 | Started int64 60 | MachineName string 61 | Root *Timing 62 | ClientTimings *ClientTimings 63 | DurationMilliseconds float64 64 | CustomLinks map[string]string 65 | 66 | w http.ResponseWriter 67 | r *http.Request 68 | } 69 | 70 | type Timing struct { 71 | Id string 72 | Name string 73 | DurationMilliseconds float64 74 | StartMilliseconds float64 75 | Children []*Timing 76 | CustomTimings map[string][]*CustomTiming 77 | 78 | profile *Profile 79 | sync.Mutex 80 | } 81 | 82 | // NewProfile creates a new Profile with given name. 83 | // For use only by miniprofiler extensions. 84 | func NewProfile(w http.ResponseWriter, r *http.Request, name string) *Profile { 85 | p := &Profile{ 86 | w: w, 87 | r: r, 88 | } 89 | 90 | if Enable(r) { 91 | p.Id = newGuid() 92 | p.Name = name 93 | p.CustomLinks = make(map[string]string) 94 | p.start = time.Now() 95 | p.MachineName = MachineName() 96 | p.Root = &Timing{ 97 | Id: newGuid(), 98 | profile: p, 99 | } 100 | w.Header().Add("X-MiniProfiler-Ids", "[\""+p.Id+"\"]") 101 | } 102 | 103 | return p 104 | } 105 | 106 | // Finalize finalizes a Profile and Store()s it. 107 | // For use only by miniprofiler extensions. 108 | func (p *Profile) Finalize() { 109 | if p.Root == nil { 110 | return 111 | } 112 | 113 | u := p.r.URL 114 | if !u.IsAbs() { 115 | u.Host = p.r.Host 116 | if p.r.TLS == nil { 117 | u.Scheme = "http" 118 | } else { 119 | u.Scheme = "https" 120 | } 121 | } 122 | p.Root.Name = p.r.Method + " " + u.String() 123 | 124 | p.Started = p.start.Unix() * 1000 125 | p.DurationMilliseconds = Since(p.start) 126 | p.Root.DurationMilliseconds = p.DurationMilliseconds 127 | 128 | Store(p.r, p) 129 | } 130 | 131 | // ProfileFromJson returns a Profile from JSON data. 132 | func ProfileFromJson(b []byte) *Profile { 133 | p := Profile{} 134 | json.Unmarshal(b, &p) 135 | return &p 136 | } 137 | 138 | // Json converts a profile to JSON. 139 | func (p *Profile) Json() []byte { 140 | b, _ := json.Marshal(p) 141 | return b 142 | } 143 | 144 | type Timer interface { 145 | AddCustomTiming(callType, executeType string, start, end time.Time, command string) 146 | Step(name string, f func(t Timer)) 147 | StepCustomTiming(callType, executeType, command string, f func()) 148 | AddCustomLink(name, URL string) 149 | SetName(string) 150 | Includes() template.HTML 151 | } 152 | 153 | func (p *Profile) SetName(name string) { 154 | if p.Root != nil { 155 | p.Name = name 156 | } 157 | } 158 | 159 | func (T *Timing) SetName(name string) { 160 | if T != nil { 161 | T.profile.SetName(name) 162 | } 163 | } 164 | 165 | func (p *Profile) AddCustomLink(name, URL string) { 166 | if p.CustomLinks != nil { 167 | p.CustomLinks[name] = URL 168 | } 169 | } 170 | 171 | func (T *Timing) AddCustomLink(name, URL string) { 172 | if T != nil { 173 | T.profile.AddCustomLink(name, URL) 174 | } 175 | } 176 | 177 | func (p *Profile) AddCustomTiming(callType, executeType string, start, end time.Time, command string) { 178 | if p.Root != nil { 179 | p.Root.AddCustomTiming(callType, executeType, start, end, command) 180 | } 181 | } 182 | 183 | func (p *Profile) StepCustomTiming(callType, executeType, command string, f func()) { 184 | if p.Root != nil { 185 | p.Root.StepCustomTiming(callType, executeType, command, f) 186 | } else { 187 | f() 188 | } 189 | } 190 | 191 | func (p *Profile) Step(name string, f func(t Timer)) { 192 | if p.Root != nil { 193 | p.Root.Step(name, f) 194 | } else { 195 | f(p) 196 | } 197 | } 198 | 199 | func (T *Timing) Includes() template.HTML { 200 | if T != nil { 201 | return T.profile.Includes() 202 | } 203 | return "" 204 | } 205 | 206 | func (T *Timing) Step(name string, f func(t Timer)) { 207 | t := &Timing{ 208 | Id: newGuid(), 209 | Name: name, 210 | StartMilliseconds: Since(T.profile.start), 211 | profile: T.profile, 212 | } 213 | T.addChild(t) 214 | f(t) 215 | t.DurationMilliseconds = Since(t.profile.start) - t.StartMilliseconds 216 | } 217 | 218 | func (T *Timing) addChild(t *Timing) { 219 | T.Lock() 220 | T.Children = append(T.Children, t) 221 | T.Unlock() 222 | } 223 | 224 | func (t *Timing) AddCustomTiming(callType, executeType string, start, end time.Time, command string) { 225 | if t == nil { 226 | return 227 | } 228 | t.Lock() 229 | if t.CustomTimings == nil { 230 | t.CustomTimings = make(map[string][]*CustomTiming) 231 | } 232 | s := &CustomTiming{ 233 | Id: newGuid(), 234 | StartMilliseconds: start.Sub(t.profile.start).Seconds() * 1000, 235 | DurationMilliseconds: end.Sub(start).Seconds() * 1000, 236 | CommandString: command, 237 | StackTraceSnippet: getStackSnippet(), 238 | ExecuteType: executeType, 239 | } 240 | t.CustomTimings[callType] = append(t.CustomTimings[callType], s) 241 | t.Unlock() 242 | } 243 | 244 | func (t *Timing) StepCustomTiming(callType, executeType, command string, f func()) { 245 | start := time.Now() 246 | f() 247 | end := time.Now() 248 | t.AddCustomTiming(callType, executeType, start, end, command) 249 | } 250 | 251 | func getStackSnippet() string { 252 | stack := debug.Stack() 253 | lines := strings.Split(string(stack), "\n") 254 | var snippet []string 255 | for i := 0; i < len(lines); i++ { 256 | idx := strings.LastIndex(lines[i], " ") 257 | if idx == -1 { 258 | break 259 | } 260 | 261 | if i+1 < len(lines) && strings.HasPrefix(lines[i+1], "\t") { 262 | i++ 263 | snip := strings.TrimSpace(lines[i]) 264 | snip = strings.Split(snip, ":")[0] 265 | sp := strings.Split(snip, ".") 266 | snip = sp[len(sp)-1] 267 | if strings.Contains(snip, "miniprofiler") || strings.HasPrefix(snip, "_func_") || snip == "ServeHTTP" || snip == "ProfileRequest" { 268 | continue 269 | } 270 | snippet = append(snippet, snip) 271 | } 272 | } 273 | if len(snippet) > 2 { 274 | snippet = snippet[2:] 275 | } 276 | return strings.Join(snippet, " ") 277 | } 278 | 279 | type CustomTiming struct { 280 | Id string 281 | ExecuteType string 282 | CommandString string 283 | StackTraceSnippet string 284 | StartMilliseconds float64 285 | DurationMilliseconds float64 286 | FirstFetchDurationMilliseconds float64 287 | } 288 | 289 | type ClientTimings struct { 290 | RedirectCount int64 291 | Timings []*ClientTiming 292 | } 293 | 294 | func (c *ClientTimings) Len() int { return len(c.Timings) } 295 | func (c *ClientTimings) Less(i, j int) bool { return c.Timings[i].Start < c.Timings[j].Start } 296 | func (c *ClientTimings) Swap(i, j int) { c.Timings[i], c.Timings[j] = c.Timings[j], c.Timings[i] } 297 | 298 | type ClientTiming struct { 299 | Name string 300 | Start int64 301 | Duration int64 302 | } 303 | -------------------------------------------------------------------------------- /miniprofiler_beego/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | /* 18 | Package miniprofiler_beego is a simple but effective mini-profiler for beego. 19 | 20 | To use this package, in init.go, import: 21 | 22 | import mpb "github.com/MiniProfiler/go/miniprofiler_beego" 23 | 24 | Add the filters in main.go before beego.Run(): 25 | 26 | ... 27 | beego.AddFilter("*", "BeforeRouter", mpb.BeforeRouter) 28 | beego.AddFilter("*", "AfterExec", mpb.AfterExec) 29 | ... 30 | beego.Run() 31 | 32 | Set the miniprofiler template data in your controller: 33 | 34 | this.Data["miniprofiler"] = this.Ctx.Input.Data["miniprofiler"] 35 | 36 | Add {{.miniprofiler}} to your template right before . 37 | 38 | For Step and CustomTimer functionality, in your controllers, import: 39 | 40 | "github.com/MiniProfiler/go/miniprofiler" 41 | 42 | and add to the top of every Action: 43 | 44 | t := this.Ctx.Input.Data["__miniprofiler"].(miniprofiler.Timer) 45 | 46 | Now t is available as a normal miniprofiler.Timer. 47 | 48 | See the miniprofiler package docs about further usage: http://godoc.org/github.com/MiniProfiler/go/miniprofiler. 49 | */ 50 | package miniprofiler_beego 51 | -------------------------------------------------------------------------------- /miniprofiler_beego/miniprofiler_beego.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | package miniprofiler_beego 18 | 19 | import ( 20 | "strings" 21 | 22 | "github.com/MiniProfiler/go/miniprofiler" 23 | "github.com/astaxie/beego/context" 24 | ) 25 | 26 | func BeforeRouter(c *context.Context) { 27 | ok := miniprofiler.Enable(c.Request) 28 | if ok && strings.HasPrefix(c.Request.URL.Path, miniprofiler.PATH) { 29 | miniprofiler.MiniProfilerHandler(c.ResponseWriter, c.Request) 30 | return 31 | } 32 | p := miniprofiler.NewProfile(c.ResponseWriter, c.Request, c.Request.URL.Path) 33 | c.Input.Data["__miniprofiler"] = p 34 | if ok { 35 | c.Input.Data["miniprofiler"] = p.Includes() 36 | } 37 | } 38 | 39 | func AfterExec(c *context.Context) { 40 | d, present := c.Input.Data["__miniprofiler"] 41 | if !present { 42 | return 43 | } 44 | p, ok := d.(*miniprofiler.Profile) 45 | if ok { 46 | p.Finalize() 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /miniprofiler_gae/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | /* 18 | Package miniprofiler_gae is a simple but effective mini-profiler for app engine. 19 | 20 | miniprofiler_gae hooks into the appstats package, and all app engine RPCs are automatically profiled. 21 | An appstats link is listed in each Profile. 22 | 23 | To use this package, change your HTTP handler functions to use this signature: 24 | 25 | func(mpg.Context, http.ResponseWriter, *http.Request) 26 | 27 | Register them in the usual way, wrapping them with NewHandler. 28 | 29 | Send output of c.Includes() to your HTML (it is empty if Enable returns 30 | false). 31 | 32 | By default, miniprofiler_gae is enabled on dev for all and on prod for admins. 33 | Override miniprofiler.Enable to change. 34 | 35 | Step 36 | 37 | Unlike base miniprofiler, the Step function returns a profiled context: 38 | 39 | c.Step("something", func(c mpg.Context) { 40 | // c is valid appengine.Context and miniprofiler.Timer: 41 | // datastore.Get(c, key, entity) 42 | // c.Step("another", func(c mpg.Context) { ... }) 43 | }) 44 | 45 | See the miniprofiler package docs about further usage: http://godoc.org/github.com/MiniProfiler/go/miniprofiler. 46 | */ 47 | package miniprofiler_gae 48 | -------------------------------------------------------------------------------- /miniprofiler_gae/miniprofiler_gae.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | package miniprofiler_gae 18 | 19 | import ( 20 | "fmt" 21 | "net/http" 22 | 23 | "appengine" 24 | "appengine/memcache" 25 | "appengine/user" 26 | "appengine_internal" 27 | "github.com/MiniProfiler/go/miniprofiler" 28 | "github.com/mjibson/appstats" 29 | ) 30 | 31 | func init() { 32 | miniprofiler.Enable = EnableIfAdminOrDev 33 | miniprofiler.Get = GetMemcache 34 | miniprofiler.Store = StoreMemcache 35 | miniprofiler.MachineName = Instance 36 | } 37 | 38 | // EnableIfAdminOrDev returns true if this is the dev server or the current 39 | // user is an admin. This is the default for miniprofiler.Enable. 40 | func EnableIfAdminOrDev(r *http.Request) bool { 41 | if appengine.IsDevAppServer() { 42 | return true 43 | } 44 | c := appengine.NewContext(r) 45 | if u := user.Current(c); u != nil { 46 | return u.Admin 47 | } 48 | return false 49 | } 50 | 51 | // Instance returns the app engine instance id, or the hostname on dev. 52 | // This is the default for miniprofiler.MachineName. 53 | func Instance() string { 54 | if i := appengine.InstanceID(); i != "" && !appengine.IsDevAppServer() { 55 | return i[len(i)-8:] 56 | } 57 | return miniprofiler.Hostname() 58 | } 59 | 60 | // StoreMemcache stores the Profile in memcache. This is the default for 61 | // miniprofiler.Store. 62 | func StoreMemcache(r *http.Request, p *miniprofiler.Profile) { 63 | item := &memcache.Item{ 64 | Key: mp_key(string(p.Id)), 65 | Value: p.Json(), 66 | } 67 | c := appengine.NewContext(r) 68 | memcache.Set(c, item) 69 | } 70 | 71 | // GetMemcache gets the Profile from memcache. This is the default for 72 | // miniprofiler.Get. 73 | func GetMemcache(r *http.Request, id string) *miniprofiler.Profile { 74 | c := appengine.NewContext(r) 75 | item, err := memcache.Get(c, mp_key(id)) 76 | if err != nil { 77 | return nil 78 | } 79 | return miniprofiler.ProfileFromJson(item.Value) 80 | } 81 | 82 | type Context struct { 83 | appstats.Context 84 | miniprofiler.Timer 85 | } 86 | 87 | func (c Context) Call(service, method string, in, out appengine_internal.ProtoMessage, opts *appengine_internal.CallOptions) (err error) { 88 | if c.Timer != nil && service != "__go__" { 89 | c.StepCustomTiming(service, method, fmt.Sprintf("%v\n\n%v", method, in.String()), func() { 90 | err = c.Context.Call(service, method, in, out, opts) 91 | }) 92 | } else { 93 | err = c.Context.Call(service, method, in, out, opts) 94 | } 95 | return 96 | } 97 | 98 | func (c Context) Step(name string, f func(Context)) { 99 | if c.Timer != nil { 100 | c.Timer.Step(name, func(t miniprofiler.Timer) { 101 | f(Context{ 102 | Context: c.Context, 103 | Timer: t, 104 | }) 105 | }) 106 | } else { 107 | f(c) 108 | } 109 | } 110 | 111 | // NewHandler returns a profiled, appstats-aware appengine.Context. 112 | func NewHandler(f func(Context, http.ResponseWriter, *http.Request)) http.Handler { 113 | return appstats.NewHandler(func(c appengine.Context, w http.ResponseWriter, r *http.Request) { 114 | h := miniprofiler.NewHandler(func(t miniprofiler.Timer, w http.ResponseWriter, r *http.Request) { 115 | pc := Context{ 116 | Context: c.(appstats.Context), 117 | Timer: t, 118 | } 119 | t.SetName(miniprofiler.FuncName(f)) 120 | f(pc, w, r) 121 | t.AddCustomLink("appstats", pc.URL()) 122 | }) 123 | h.ServeHTTP(w, r) 124 | }) 125 | } 126 | 127 | func mp_key(id string) string { 128 | return fmt.Sprintf("mini-profiler-results:%s", id) 129 | } 130 | -------------------------------------------------------------------------------- /miniprofiler_gocraftweb/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | /* 18 | Package miniprofiler_gocraftweb is a simple but effective mini-profiler for gocraft/web. 19 | 20 | To use this package, in init.go, import: 21 | 22 | import mpg "github.com/MiniProfiler/go/miniprofiler_gocraftweb" 23 | 24 | Embed mpg.MiniProfilerContext in your context: 25 | 26 | type Context struct { 27 | mpg.MiniProfilerContext 28 | ... 29 | } 30 | 31 | Add the (*Context).MiniProfilerMiddleware middleware: 32 | 33 | router := web.New(Context{}). 34 | ... 35 | Middleware((*Context).MiniProfileMiddleware). 36 | ... 37 | Get("/", (*Context).Index) 38 | 39 | Add c.MiniProfilerTemplate right before . 40 | 41 | Use c.MiniProfilerTimer as a miniprofiler.Timer. 42 | 43 | Example 44 | 45 | A full example application: 46 | 47 | package main 48 | 49 | import ( 50 | "fmt" 51 | "net/http" 52 | "strings" 53 | 54 | "github.com/MiniProfiler/go/miniprofiler" 55 | mpg "github.com/MiniProfiler/go/miniprofiler_gocraftweb" 56 | "github.com/gocraft/web" 57 | ) 58 | 59 | type Context struct { 60 | mpg.MiniProfilerContext 61 | HelloCount int 62 | } 63 | 64 | func (c *Context) SetHelloCount(rw web.ResponseWriter, req *web.Request, next web.NextMiddlewareFunc) { 65 | c.HelloCount = 3 66 | next(rw, req) 67 | } 68 | 69 | func (c *Context) SayHello(rw web.ResponseWriter, req *web.Request) { 70 | c.MiniProfilerTimer.Step("test", func(t miniprofiler.Timer) { 71 | fmt.Fprint(rw, 72 | "", 73 | strings.Repeat("Hello ", c.HelloCount), 74 | "World!", 75 | c.MiniProfilerTemplate, 76 | "") 77 | }) 78 | } 79 | 80 | func main() { 81 | router := web.New(Context{}). 82 | Middleware(web.LoggerMiddleware). 83 | Middleware(web.ShowErrorsMiddleware). 84 | Middleware((*Context).MiniProfileMiddleware). 85 | Middleware((*Context).SetHelloCount). 86 | Get("/", (*Context).SayHello) 87 | http.ListenAndServe("localhost:3000", router) 88 | } 89 | 90 | See the miniprofiler package docs about further usage: http://godoc.org/github.com/MiniProfiler/go/miniprofiler. 91 | */ 92 | package miniprofiler_gocraftweb 93 | -------------------------------------------------------------------------------- /miniprofiler_gocraftweb/miniprofiler_gocraftweb.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | package miniprofiler_gocraftweb 18 | 19 | import ( 20 | "html/template" 21 | "strings" 22 | 23 | "github.com/MiniProfiler/go/miniprofiler" 24 | "github.com/gocraft/web" 25 | ) 26 | 27 | type MiniProfilerContext struct { 28 | MiniProfilerTemplate template.HTML 29 | MiniProfilerTimer miniprofiler.Timer 30 | } 31 | 32 | func (c *MiniProfilerContext) MiniProfileMiddleware(rw web.ResponseWriter, r *web.Request, next web.NextMiddlewareFunc) { 33 | ok := miniprofiler.Enable(r.Request) 34 | if ok && strings.HasPrefix(r.Request.URL.Path, miniprofiler.PATH) { 35 | miniprofiler.MiniProfilerHandler(rw, r.Request) 36 | return 37 | } 38 | p := miniprofiler.NewProfile(rw, r.Request, r.URL.Path) 39 | c.MiniProfilerTemplate = p.Includes() 40 | c.MiniProfilerTimer = p 41 | next(rw, r) 42 | if ok { 43 | p.Finalize() 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /miniprofiler_martini/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | /* 18 | Package miniprofiler_martini is a simple but effective mini-profiler for martini. 19 | 20 | To use this package, import: 21 | 22 | import mmp "github.com/MiniProfiler/go/miniprofiler_martini" 23 | 24 | Add the middleware: 25 | 26 | m.Use(mmp.Profiler()) 27 | 28 | Now a mmp.Timer object is available via the injector. Call p.Includes() like 29 | normal and add it to your template. 30 | 31 | Example 32 | 33 | func main() { 34 | m := martini.Classic() 35 | m.Use(mmp.Profiler()) 36 | m.Get("/", func(p mmp.Timer, r *http.Request) string { 37 | return fmt.Sprintf("%v", p.Includes()) 38 | }) 39 | m.Run() 40 | } 41 | 42 | See the miniprofiler package docs about further usage: http://godoc.org/github.com/MiniProfiler/go/miniprofiler. 43 | */ 44 | package miniprofiler_martini 45 | -------------------------------------------------------------------------------- /miniprofiler_martini/miniprofiler_martini.go: -------------------------------------------------------------------------------- 1 | package miniprofiler_martini 2 | 3 | import ( 4 | "net/http" 5 | "strings" 6 | 7 | "github.com/MiniProfiler/go/miniprofiler" 8 | "github.com/codegangsta/martini" 9 | ) 10 | 11 | type Timer interface { 12 | miniprofiler.Timer 13 | } 14 | 15 | func Profiler() martini.Handler { 16 | return func(c martini.Context, w http.ResponseWriter, r *http.Request) { 17 | if strings.HasPrefix(r.URL.Path, miniprofiler.PATH) { 18 | miniprofiler.MiniProfilerHandler(w, r) 19 | return 20 | } 21 | p := miniprofiler.NewProfile(w, r, r.URL.Path) 22 | c.MapTo(p, (*Timer)(nil)) 23 | c.Next() 24 | p.Finalize() 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /miniprofiler_revel/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | /* 18 | Package miniprofiler_revel is a simple but effective mini-profiler for revel. 19 | 20 | To use this package, in init.go, import: 21 | 22 | import mpr "github.com/MiniProfiler/go/miniprofiler_revel" 23 | 24 | and add mpr.Filter above revel.RouterFilter: 25 | 26 | revel.Filters = []revel.Filter{ 27 | revel.PanicFilter, 28 | mpr.Filter, 29 | revel.RouterFilter, 30 | ... 31 | 32 | Add {{.miniprofiler}} to your footer template right before . 33 | 34 | For Step and CustomTimer functionality, in your controllers, import: 35 | 36 | "github.com/MiniProfiler/go/miniprofiler" 37 | 38 | and add to the top of every Action: 39 | 40 | t := c.Args["miniprofiler"].(miniprofiler.Timer) 41 | 42 | Now t is available as a normal miniprofiler.Timer. 43 | 44 | See the miniprofiler package docs about further usage: http://godoc.org/github.com/MiniProfiler/go/miniprofiler. 45 | */ 46 | package miniprofiler_revel 47 | -------------------------------------------------------------------------------- /miniprofiler_revel/miniprofiler_revel.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | package miniprofiler_revel 18 | 19 | import ( 20 | "strings" 21 | 22 | "github.com/MiniProfiler/go/miniprofiler" 23 | "github.com/revel/revel" 24 | ) 25 | 26 | func Filter(c *revel.Controller, fc []revel.Filter) { 27 | ok := miniprofiler.Enable(c.Request.Request) 28 | if ok && strings.HasPrefix(c.Request.Request.URL.Path, miniprofiler.PATH) { 29 | miniprofiler.MiniProfilerHandler(c.Response.Out, c.Request.Request) 30 | return 31 | } 32 | p := miniprofiler.NewProfile(c.Response.Out, c.Request.Request, c.Action) 33 | c.Args["miniprofiler"] = p 34 | if ok { 35 | c.RenderArgs["miniprofiler"] = p.Includes() 36 | } 37 | fc[0](c, fc[1:]) 38 | if ok { 39 | p.SetName(c.Action) 40 | p.Finalize() 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /miniprofiler_traffic/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | /* 18 | Package miniprofiler_traffic is a simple but effective mini-profiler for traffic. 19 | 20 | To use this package, in main.go, import: 21 | 22 | import mpt "github.com/MiniProfiler/go/miniprofiler_traffic" 23 | 24 | Add the miniprofiler middleware: 25 | 26 | router = traffic.New() 27 | ... 28 | router.Use(&mpt.Middleware{}) 29 | 30 | Use send w.GetVar("miniprofiler") to your template right before . 31 | 32 | For Step and CustomTimer functionality, in your controllers, import: 33 | 34 | "github.com/MiniProfiler/go/miniprofiler" 35 | 36 | and add to the top of every handler: 37 | 38 | t := w.GetVar("miniprofiler_timer").(miniprofiler.Timer) 39 | 40 | Now t is available as a normal miniprofiler.Timer. 41 | 42 | See the miniprofiler package docs about further usage: http://godoc.org/github.com/MiniProfiler/go/miniprofiler. 43 | 44 | Example handler 45 | 46 | import ( 47 | "github.com/MiniProfiler/go/miniprofiler" 48 | "github.com/pilu/traffic" 49 | ) 50 | 51 | type ResponseData struct { 52 | Message string 53 | Miniprofiler interface{} 54 | } 55 | 56 | func RootHandler(w traffic.ResponseWriter, r *traffic.Request) { 57 | t := w.GetVar("miniprofiler_timer").(miniprofiler.Timer) 58 | t.Step("test", func(t miniprofiler.Timer) { 59 | responseData := &ResponseData{"Hello World", w.GetVar("miniprofiler")} 60 | w.Render("index", responseData) 61 | }) 62 | } 63 | 64 | */ 65 | package miniprofiler_traffic 66 | -------------------------------------------------------------------------------- /miniprofiler_traffic/miniprofiler_traffic.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | package miniprofiler_traffic 18 | 19 | import ( 20 | "strings" 21 | 22 | "github.com/MiniProfiler/go/miniprofiler" 23 | "github.com/pilu/traffic" 24 | ) 25 | 26 | type Middleware struct{} 27 | 28 | func (c *Middleware) ServeHTTP(w traffic.ResponseWriter, r *traffic.Request, next traffic.NextMiddlewareFunc) { 29 | ok := miniprofiler.Enable(r.Request) 30 | if ok && strings.HasPrefix(r.Request.URL.Path, miniprofiler.PATH) { 31 | miniprofiler.MiniProfilerHandler(w, r.Request) 32 | return 33 | } 34 | p := miniprofiler.NewProfile(w, r.Request, r.URL.Path) 35 | w.SetVar("miniprofiler", p.Includes()) 36 | w.SetVar("miniprofiler_timer", p) 37 | if nextMiddleware := next(); nextMiddleware != nil { 38 | nextMiddleware.ServeHTTP(w, r, next) 39 | } 40 | if ok { 41 | p.Finalize() 42 | } 43 | return 44 | } 45 | -------------------------------------------------------------------------------- /redis/redis.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | /* 18 | Package redis provides miniprofiler wrappers for github.com/garyburd/redigo/redis. 19 | 20 | The API is fully compatible with the redis package, but adds some additional 21 | timing functions. To use, replace the redis import with this package. Modify 22 | calls to Do and Send to their *Timer variants. Pass the miniprofiler.Timer 23 | reference as first argument. 24 | 25 | NOTE: this API is experimental and may change. 26 | 27 | Example 28 | 29 | This is a small example using this package. 30 | 31 | func Index(t miniprofiler.Timer, w http.ResponseWriter, r *http.Request) { 32 | conn, _ := redis.Dial("tcp", ":6379") 33 | defer conn.Close() 34 | conn.DoTimer(t, "set", "test", "value") 35 | fmt.Fprintf(w, `%v`, t.Includes()) 36 | } 37 | */ 38 | package redis 39 | 40 | import ( 41 | "fmt" 42 | "strings" 43 | 44 | "github.com/MiniProfiler/go/miniprofiler" 45 | "github.com/garyburd/redigo/redis" 46 | ) 47 | 48 | type Conn interface { 49 | redis.Conn 50 | DoTimer(t miniprofiler.Timer, commandName string, args ...interface{}) (reply interface{}, err error) 51 | SendTimer(t miniprofiler.Timer, commandName string, args ...interface{}) (err error) 52 | } 53 | 54 | type conn struct { 55 | redis.Conn 56 | } 57 | 58 | func Dial(network, address string) (Conn, error) { 59 | c, err := redis.Dial(network, address) 60 | return &conn{c}, err 61 | } 62 | 63 | func (c *conn) DoTimer(t miniprofiler.Timer, commandName string, args ...interface{}) (reply interface{}, err error) { 64 | t.StepCustomTiming("redis", "do", format(commandName, args...), func() { 65 | reply, err = c.Conn.Do(commandName, args...) 66 | }) 67 | return 68 | } 69 | 70 | func (c *conn) SendTimer(t miniprofiler.Timer, commandName string, args ...interface{}) (err error) { 71 | t.StepCustomTiming("redis", "send", format(commandName, args...), func() { 72 | err = c.Conn.Send(commandName, args...) 73 | }) 74 | return 75 | } 76 | 77 | type Pool struct { 78 | *redis.Pool 79 | } 80 | 81 | func NewPool(newFn func() (Conn, error), maxIdle int) *Pool { 82 | fn := func() (redis.Conn, error) { 83 | return newFn() 84 | } 85 | return &Pool{redis.NewPool(fn, maxIdle)} 86 | } 87 | 88 | func (p *Pool) Get() Conn { 89 | c := p.Pool.Get() 90 | return &conn{c} 91 | } 92 | 93 | func format(commandName string, args ...interface{}) string { 94 | f := strings.Repeat(` "%v"`, len(args)) 95 | return commandName + fmt.Sprintf(f, args...) 96 | } 97 | 98 | var Bool = redis.Bool 99 | var Bytes = redis.Bytes 100 | var Float64 = redis.Float64 101 | var Int = redis.Int 102 | var Int64 = redis.Int64 103 | var MultiBulk = redis.MultiBulk 104 | var Scan = redis.Scan 105 | var ScanStruct = redis.ScanStruct 106 | var String = redis.String 107 | var Strings = redis.Strings 108 | var Values = redis.Values 109 | 110 | type Args struct{ redis.Args } 111 | type Error struct{ redis.Error } 112 | type Message struct{ redis.Message } 113 | type PMessage struct{ redis.PMessage } 114 | type PubSubConn struct{ redis.PubSubConn } 115 | type Script struct{ redis.Script } 116 | type Subscription struct{ redis.Subscription } 117 | -------------------------------------------------------------------------------- /sql/sql.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2013 Matt Jibson 3 | * 4 | * Permission to use, copy, modify, and distribute this software for any 5 | * purpose with or without fee is hereby granted, provided that the above 6 | * copyright notice and this permission notice appear in all copies. 7 | * 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 | */ 16 | 17 | /* 18 | Package sql provides miniprofiler wrappers for database/sql. 19 | 20 | The API is fully compatible with database/sql, but adds some additional timing 21 | functions. To use, replace the database/sql import with this package. Modify 22 | calls to Exec, Query, and QueryRow to their *Timer variants. Pass the 23 | miniprofiler.Timer reference as first argument. 24 | 25 | NOTE: this API is experimental and may change. 26 | 27 | Example 28 | 29 | This is a small example using this package. 30 | 31 | func Index(t miniprofiler.Timer, w http.ResponseWriter, r *http.Request) { 32 | db, _ := sql.Open("sqlite3", ":memory:") 33 | db.ExecTimer(t, "create table x(a, b, c)") 34 | db.ExecTimer(t, "insert into x (1, 2, 4), (3, 5, 6)") 35 | db.QueryTimer(t, "select * from x") 36 | fmt.Fprintf(w, `%v`, t.Includes()) 37 | } 38 | */ 39 | package sql 40 | 41 | import ( 42 | "database/sql" 43 | 44 | "github.com/MiniProfiler/go/miniprofiler" 45 | ) 46 | 47 | type DB struct { 48 | *sql.DB 49 | } 50 | 51 | func Open(driverName, dataSourceName string) (*DB, error) { 52 | db, err := sql.Open(driverName, dataSourceName) 53 | d := &DB{db} 54 | return d, err 55 | } 56 | 57 | func (d DB) ExecTimer(t miniprofiler.Timer, query string, args ...interface{}) (result sql.Result, err error) { 58 | t.StepCustomTiming("sql", "exec", query, func() { 59 | result, err = d.DB.Exec(query, args...) 60 | }) 61 | return 62 | } 63 | 64 | func (d DB) QueryTimer(t miniprofiler.Timer, query string, args ...interface{}) (rows *sql.Rows, err error) { 65 | t.StepCustomTiming("sql", "query", query, func() { 66 | rows, err = d.DB.Query(query, args...) 67 | }) 68 | return 69 | } 70 | 71 | func (d DB) QueryRowTimer(t miniprofiler.Timer, query string, args ...interface{}) (row *sql.Row) { 72 | t.StepCustomTiming("sql", "query", query, func() { 73 | row = d.DB.QueryRow(query, args...) 74 | }) 75 | return 76 | } 77 | 78 | var ErrNoRows = sql.ErrNoRows 79 | var ErrTxDone = sql.ErrTxDone 80 | var Register = sql.Register 81 | 82 | type NullBool struct{ sql.NullBool } 83 | type NullFloat64 struct{ sql.NullFloat64 } 84 | type NullInt64 struct{ sql.NullInt64 } 85 | type NullString struct{ sql.NullString } 86 | type RawBytes struct{ sql.RawBytes } 87 | type Result struct{ sql.Result } 88 | type Row struct{ sql.Row } 89 | type Rows struct{ sql.Rows } 90 | type Scanner struct{ sql.Scanner } 91 | type Stmt struct{ sql.Stmt } 92 | type Tx struct{ sql.Tx } 93 | --------------------------------------------------------------------------------