From 66f843735139e727b2e489e0ae4bdf7e00937b15 Mon Sep 17 00:00:00 2001
From: juls0730 <62722391+juls0730@users.noreply.github.com>
Date: Mon, 23 Sep 2024 01:21:28 -0500
Subject: [PATCH] bug fixes, half-finished admin ui, and a more
---
README.md | 2 +-
go.mod | 1 +
go.sum | 2 +
main.go | 52 ++------
middleware/admin.go | 22 ++++
middleware/route.go | 4 +
models/user.go | 12 +-
routes/admin.go | 172 ++++++++++++++++++++++++++
routes/auth.go | 17 +++
server.go | 41 ++++++
ui/app.vue | 4 +-
ui/assets/css/main.css | 4 +-
ui/bun.lockb | Bin 297787 -> 310989 bytes
ui/components/Breadcrumbs.vue | 2 +-
ui/components/Checkbox.vue | 2 +-
ui/components/FileNav.vue | 7 +-
ui/components/Nav/index.vue | 98 ++++++++++++---
ui/components/Nav/userDropdown.vue | 62 ++++++----
ui/components/Popup.vue | 2 +-
ui/components/UploadPane.vue | 6 +-
ui/components/vlAccordion/content.vue | 39 ++++++
ui/components/vlAccordion/index.vue | 139 +++++++++++++++++++++
ui/components/vlAccordion/item.vue | 19 +++
ui/components/vlAccordion/trigger.vue | 29 +++++
ui/layouts/admin.vue | 82 ++++++++++++
ui/middleware/admin.ts | 15 +++
ui/nuxt.config.ts | 13 +-
ui/package.json | 6 +-
ui/pages/admin/config/settings.vue | 10 ++
ui/pages/admin/index.vue | 156 +++++++++++++++++++++++
ui/pages/admin/users/index.vue | 92 ++++++++++++++
ui/pages/home/[...name].vue | 50 ++++----
ui/pages/login.vue | 7 +-
ui/pages/signup.vue | 7 +-
ui/types/user.ts | 4 +-
35 files changed, 1039 insertions(+), 141 deletions(-)
create mode 100644 middleware/admin.go
create mode 100644 routes/admin.go
create mode 100755 ui/components/vlAccordion/content.vue
create mode 100755 ui/components/vlAccordion/index.vue
create mode 100755 ui/components/vlAccordion/item.vue
create mode 100755 ui/components/vlAccordion/trigger.vue
create mode 100644 ui/layouts/admin.vue
create mode 100644 ui/middleware/admin.ts
create mode 100644 ui/pages/admin/config/settings.vue
create mode 100644 ui/pages/admin/index.vue
create mode 100644 ui/pages/admin/users/index.vue
diff --git a/README.md b/README.md
index c19826f..8d62a73 100644
--- a/README.md
+++ b/README.md
@@ -20,5 +20,5 @@ DB_HOST=localhost:5432 DB_NAME=filething DB_USER=postgres STORAGE_PATH=data ./fi
To run filething in dev mode with a hot reloading Ui server and auto rebuilding backend server, run
```BASH
-DB_HOST=localhost:5432 DB_NAME=filething DB_USER=postgres STORAGE_PATH=data CompileDaemon --build="go build -tags netgo,dev -ldflags=-s" --command=./filething --exclude-dir=data/ --exclude-dir=ui. --graceful-kill
+DB_HOST=localhost:5432 DB_NAME=filething DB_USER=postgres STORAGE_PATH=data CompileDaemon --build="go build -tags netgo,dev -ldflags=-s" --command=./filething --exclude-dir=data/ --exclude-dir=ui/ --graceful-kill
```
diff --git a/go.mod b/go.mod
index 0865568..9502d2c 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,7 @@ go 1.23.0
require github.com/google/uuid v1.6.0
require (
+ github.com/dustin/go-humanize v1.0.1
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/labstack/echo/v4 v4.12.0
diff --git a/go.sum b/go.sum
index 85cbdf6..ff881e2 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,7 @@
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
+github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
diff --git a/main.go b/main.go
index 1c6b7d7..063f99b 100644
--- a/main.go
+++ b/main.go
@@ -8,11 +8,10 @@ import (
"filething/middleware"
"filething/models"
"filething/routes"
- "filething/ui"
"fmt"
"net/http"
"os"
- "strings"
+ "time"
"github.com/labstack/echo/v4"
echoMiddleware "github.com/labstack/echo/v4/middleware"
@@ -84,61 +83,32 @@ func main() {
api.GET("/files/get/*", routes.GetFiles)
api.GET("/files/download*", routes.GetFile)
api.POST("/files/delete*", routes.DeleteFiles)
+
+ admin := api.Group("/admin")
+ {
+ admin.Use(middleware.AdminMiddleware())
+ admin.GET("/system-status", routes.SystemStatus)
+ admin.GET("/get-users/:page", routes.GetUsers)
+ admin.GET("/get-total-users", routes.GetUsersCount)
+ }
}
// redirects to the proper pages if you are trying to access one that expects you have/dont have an api key
// this isnt explicitly required, but it provides a better experience than doing this same thing clientside
e.Use(middleware.AuthCheckMiddleware)
- // calls out to a function set by either server.go server_dev.go based on the value of the dev tag, and hosts
+ // calls out to a function set by either server.go server_dev.go based on the presence of the dev tag, and hosts
// either the static files that get embedded into the binary in ui/embed.go or proxies the dev server that gets
// run in the provided function
initUi(e)
- e.HTTPErrorHandler = customHTTPErrorHandler
+ routes.AppStartTime = time.Now().UTC()
if err := e.Start(":1323"); err != nil && err != http.ErrServerClosed {
fmt.Println("Error starting HTTP server:", err)
}
}
-// Custom Error handling since Nuxt relies on the 404 page for dynamic pages we still want api routes to use the default
-// error handling built into echo
-func customHTTPErrorHandler(err error, c echo.Context) {
- if he, ok := err.(*echo.HTTPError); ok && he.Code == http.StatusNotFound {
- path := c.Request().URL.Path
-
- if !strings.HasPrefix(path, "/api") {
- file, err := ui.DistDirFS.Open("404.html")
- if err != nil {
- c.Logger().Error(err)
- }
-
- fileInfo, err := file.Stat()
- if err != nil {
- c.Logger().Error(err)
- }
-
- fileBuf := make([]byte, fileInfo.Size())
- _, err = file.Read(fileBuf)
- defer func() {
- if err := file.Close(); err != nil {
- panic(err)
- }
- }()
- if err != nil {
- c.Logger().Error(err)
- panic(err)
- }
-
- c.HTML(http.StatusNotFound, string(fileBuf))
- return
- }
- }
-
- c.Echo().DefaultHTTPErrorHandler(err, c)
-}
-
// creates tables in the db if they dont already exist
func createSchema(db *bun.DB) error {
models := []interface{}{
diff --git a/middleware/admin.go b/middleware/admin.go
new file mode 100644
index 0000000..440c16d
--- /dev/null
+++ b/middleware/admin.go
@@ -0,0 +1,22 @@
+package middleware
+
+import (
+ "filething/models"
+ "net/http"
+
+ "github.com/labstack/echo/v4"
+)
+
+func AdminMiddleware() echo.MiddlewareFunc {
+ return func(next echo.HandlerFunc) echo.HandlerFunc {
+ return func(c echo.Context) error {
+ user := c.Get("user").(*models.User)
+
+ if !user.Admin {
+ return echo.NewHTTPError(http.StatusForbidden, "You are not an administrator")
+ }
+
+ return next(c)
+ }
+ }
+}
diff --git a/middleware/route.go b/middleware/route.go
index ec1483c..48b7553 100644
--- a/middleware/route.go
+++ b/middleware/route.go
@@ -41,6 +41,10 @@ func AuthCheckMiddleware(next echo.HandlerFunc) echo.HandlerFunc {
return c.Redirect(http.StatusFound, "/login")
}
+ if strings.Contains(path, "/admin") && !authenticated {
+ return c.Redirect(http.StatusFound, "/login")
+ }
+
return next(c)
}
}
diff --git a/models/user.go b/models/user.go
index cd4dd10..5baa656 100644
--- a/models/user.go
+++ b/models/user.go
@@ -1,6 +1,8 @@
package models
import (
+ "time"
+
"github.com/google/uuid"
"github.com/uptrace/bun"
)
@@ -18,13 +20,15 @@ type SignupData struct {
type User struct {
bun.BaseModel `bun:"table:users"`
- ID uuid.UUID `bun:"id,pk,type:uuid,default:uuid_generate_v4()" json:"id"`
- Username string `bun:"username,notnull,unique" json:"username"`
- Email string `bun:"email,notnull,unique" json:"email"`
- PasswordHash string `bun:"passwordHash,notnull" json:"-"`
+ ID uuid.UUID `bun:",pk,type:uuid,default:uuid_generate_v4()" json:"id"`
+ Username string `bun:",notnull,unique" json:"username"`
+ Email string `bun:",notnull,unique" json:"email"`
+ PasswordHash string `bun:",notnull" json:"-"`
PlanID int64 `bun:"plan_id,notnull" json:"-"`
Plan Plan `bun:"rel:belongs-to,join:plan_id=id" json:"plan"`
Usage int64 `bun:"-" json:"usage"`
+ CreatedAt time.Time `bun:",nullzero,notnull,default:current_timestamp" json:"created_at"`
+ Admin bool `bin:"admin,type:bool" json:"is_admin"`
}
type Session struct {
diff --git a/routes/admin.go b/routes/admin.go
new file mode 100644
index 0000000..41606cb
--- /dev/null
+++ b/routes/admin.go
@@ -0,0 +1,172 @@
+package routes
+
+import (
+ "context"
+ "filething/models"
+ "fmt"
+ "net/http"
+ "runtime"
+ "strconv"
+ "time"
+
+ "github.com/dustin/go-humanize"
+ "github.com/labstack/echo/v4"
+ "github.com/uptrace/bun"
+)
+
+func GetUsers(c echo.Context) error {
+ db := c.Get("db").(*bun.DB)
+
+ pageStr := c.Param("page")
+ page, err := strconv.Atoi(pageStr)
+ if err != nil {
+ return echo.NewHTTPError(http.StatusBadRequest, "Invalid page number")
+ }
+
+ offset := page * 30
+ limit := 30
+
+ var users []models.User
+ err = db.NewSelect().
+ Model(&users).
+ Limit(limit).
+ Offset(offset).
+ Scan(context.Background())
+ if err != nil {
+ return echo.NewHTTPError(http.StatusInternalServerError, "Failed to retrieve users")
+ }
+
+ return c.JSON(http.StatusOK, users)
+}
+
+func GetUsersCount(c echo.Context) error {
+ db := c.Get("db").(*bun.DB)
+
+ count, err := db.NewSelect().Model(&models.User{}).Count(context.Background())
+
+ if err != nil {
+ fmt.Println(err)
+ return echo.NewHTTPError(http.StatusInternalServerError, "Failed to retrieve users")
+ }
+
+ return c.JSON(http.StatusOK, map[string]int{"total_users": count})
+}
+
+// Stolen from Gitea https://github.com/go-gitea/gitea
+func SystemStatus(c echo.Context) error {
+ updateSystemStatus()
+ return c.JSON(http.StatusOK, map[string]interface{}{
+ "uptime": sysStatus.StartTime,
+ "num_goroutine": sysStatus.NumGoroutine,
+ "cur_mem_usage": sysStatus.MemAllocated,
+ "total_mem_usage": sysStatus.MemTotal,
+ "mem_obtained": sysStatus.MemSys,
+ "ptr_lookup_times": sysStatus.Lookups,
+ "mem_allocations": sysStatus.MemMallocs,
+ "mem_frees": sysStatus.MemFrees,
+ "cur_heap_usage": sysStatus.HeapAlloc,
+ "heap_mem_obtained": sysStatus.HeapSys,
+ "heap_mem_idle": sysStatus.HeapIdle,
+ "heap_mem_inuse": sysStatus.HeapInuse,
+ "heap_mem_release": sysStatus.HeapReleased,
+ "heap_objects": sysStatus.HeapObjects,
+ "bootstrap_stack_usage": sysStatus.StackInuse,
+ "stack_mem_obtained": sysStatus.StackSys,
+ "mspan_structures_usage": sysStatus.MSpanInuse,
+ "mspan_structures_obtained": sysStatus.MSpanSys,
+ "mcache_structures_usage": sysStatus.MSpanInuse,
+ "mcache_structures_obtained": sysStatus.MCacheSys,
+ "buck_hash_sys": sysStatus.BuckHashSys,
+ "gc_sys": sysStatus.GCSys,
+ "other_sys": sysStatus.OtherSys,
+ "next_gc": sysStatus.NextGC,
+ "last_gc_time": sysStatus.LastGCTime,
+ "pause_total_ns": sysStatus.PauseTotalNs,
+ "pause_ns": sysStatus.PauseNs,
+ "num_gc": sysStatus.NumGC,
+ })
+}
+
+var AppStartTime time.Time
+var sysStatus struct {
+ StartTime string
+ NumGoroutine int
+
+ // General statistics.
+ MemAllocated string // bytes allocated and still in use
+ MemTotal string // bytes allocated (even if freed)
+ MemSys string // bytes obtained from system (sum of XxxSys below)
+ Lookups uint64 // number of pointer lookups
+ MemMallocs uint64 // number of mallocs
+ MemFrees uint64 // number of frees
+
+ // Main allocation heap statistics.
+ HeapAlloc string // bytes allocated and still in use
+ HeapSys string // bytes obtained from system
+ HeapIdle string // bytes in idle spans
+ HeapInuse string // bytes in non-idle span
+ HeapReleased string // bytes released to the OS
+ HeapObjects uint64 // total number of allocated objects
+
+ // Low-level fixed-size structure allocator statistics.
+ // Inuse is bytes used now.
+ // Sys is bytes obtained from system.
+ StackInuse string // bootstrap stacks
+ StackSys string
+ MSpanInuse string // mspan structures
+ MSpanSys string
+ MCacheInuse string // mcache structures
+ MCacheSys string
+ BuckHashSys string // profiling bucket hash table
+ GCSys string // GC metadata
+ OtherSys string // other system allocations
+
+ // Garbage collector statistics.
+ NextGC string // next run in HeapAlloc time (bytes)
+ LastGCTime string // last run time
+ PauseTotalNs string
+ PauseNs string // circular buffer of recent GC pause times, most recent at [(NumGC+255)%256]
+ NumGC uint32
+}
+
+func updateSystemStatus() {
+ sysStatus.StartTime = AppStartTime.Format(time.RFC3339)
+
+ m := new(runtime.MemStats)
+ runtime.ReadMemStats(m)
+ sysStatus.NumGoroutine = runtime.NumGoroutine()
+
+ sysStatus.MemAllocated = FileSize(int64(m.Alloc))
+ sysStatus.MemTotal = FileSize(int64(m.TotalAlloc))
+ sysStatus.MemSys = FileSize(int64(m.Sys))
+ sysStatus.Lookups = m.Lookups
+ sysStatus.MemMallocs = m.Mallocs
+ sysStatus.MemFrees = m.Frees
+
+ sysStatus.HeapAlloc = FileSize(int64(m.HeapAlloc))
+ sysStatus.HeapSys = FileSize(int64(m.HeapSys))
+ sysStatus.HeapIdle = FileSize(int64(m.HeapIdle))
+ sysStatus.HeapInuse = FileSize(int64(m.HeapInuse))
+ sysStatus.HeapReleased = FileSize(int64(m.HeapReleased))
+ sysStatus.HeapObjects = m.HeapObjects
+
+ sysStatus.StackInuse = FileSize(int64(m.StackInuse))
+ sysStatus.StackSys = FileSize(int64(m.StackSys))
+ sysStatus.MSpanInuse = FileSize(int64(m.MSpanInuse))
+ sysStatus.MSpanSys = FileSize(int64(m.MSpanSys))
+ sysStatus.MCacheInuse = FileSize(int64(m.MCacheInuse))
+ sysStatus.MCacheSys = FileSize(int64(m.MCacheSys))
+ sysStatus.BuckHashSys = FileSize(int64(m.BuckHashSys))
+ sysStatus.GCSys = FileSize(int64(m.GCSys))
+ sysStatus.OtherSys = FileSize(int64(m.OtherSys))
+
+ sysStatus.NextGC = FileSize(int64(m.NextGC))
+ sysStatus.LastGCTime = time.Unix(0, int64(m.LastGC)).Format(time.RFC3339)
+ sysStatus.PauseTotalNs = fmt.Sprintf("%.1fs", float64(m.PauseTotalNs)/1000/1000/1000)
+ sysStatus.PauseNs = fmt.Sprintf("%.3fs", float64(m.PauseNs[(m.NumGC+255)%256])/1000/1000/1000)
+ sysStatus.NumGC = m.NumGC
+}
+
+func FileSize(s int64) string {
+ return humanize.IBytes(uint64(s))
+}
diff --git a/routes/auth.go b/routes/auth.go
index cda6654..e704f4b 100644
--- a/routes/auth.go
+++ b/routes/auth.go
@@ -64,6 +64,8 @@ func LoginHandler(c echo.Context) error {
return c.JSON(http.StatusOK, user)
}
+var firstUserCreated *bool
+
func SignupHandler(c echo.Context) error {
var signupData models.SignupData
@@ -87,11 +89,22 @@ func SignupHandler(c echo.Context) error {
return c.JSON(http.StatusInternalServerError, map[string]string{"message": "An unknown error occoured!"})
}
+ if firstUserCreated == nil {
+ count, err := db.NewSelect().Model((*models.User)(nil)).Count(context.Background())
+ if err != nil {
+ return fmt.Errorf("failed to count plans: %w", err)
+ }
+
+ firstUserCreated = new(bool)
+ *firstUserCreated = count != 0
+ }
+
user := &models.User{
Username: signupData.Username,
Email: signupData.Email,
PasswordHash: string(hash),
PlanID: 1, // basic 10GB plan
+ Admin: !*firstUserCreated,
}
_, err = db.NewInsert().Model(user).Exec(context.Background())
@@ -99,6 +112,10 @@ func SignupHandler(c echo.Context) error {
return c.JSON(http.StatusConflict, map[string]string{"message": "A user with that email or username already exists!"})
}
+ if !*firstUserCreated {
+ *firstUserCreated = true
+ }
+
err = db.NewSelect().Model(user).WherePK().Relation("Plan").Scan(context.Background())
if err != nil {
return c.JSON(http.StatusNotFound, map[string]string{"message": "An unknown error occoured!"})
diff --git a/server.go b/server.go
index 37c3bde..ba25e6c 100644
--- a/server.go
+++ b/server.go
@@ -5,6 +5,8 @@ package main
import (
"filething/ui"
+ "net/http"
+ "strings"
"github.com/labstack/echo/v4"
)
@@ -12,5 +14,44 @@ import (
func init() {
initUi = func(e *echo.Echo) {
e.GET("/*", echo.StaticDirectoryHandler(ui.DistDirFS, false))
+
+ e.HTTPErrorHandler = customHTTPErrorHandler
}
}
+
+// Custom Error handling since Nuxt relies on the 404 page for dynamic pages we still want api routes to use the default
+// error handling built into echo
+func customHTTPErrorHandler(err error, c echo.Context) {
+ if he, ok := err.(*echo.HTTPError); ok && he.Code == http.StatusNotFound {
+ path := c.Request().URL.Path
+
+ if !strings.HasPrefix(path, "/api") {
+ file, err := ui.DistDirFS.Open("404.html")
+ if err != nil {
+ c.Logger().Error(err)
+ }
+
+ fileInfo, err := file.Stat()
+ if err != nil {
+ c.Logger().Error(err)
+ }
+
+ fileBuf := make([]byte, fileInfo.Size())
+ _, err = file.Read(fileBuf)
+ defer func() {
+ if err := file.Close(); err != nil {
+ panic(err)
+ }
+ }()
+ if err != nil {
+ c.Logger().Error(err)
+ panic(err)
+ }
+
+ c.HTML(http.StatusNotFound, string(fileBuf))
+ return
+ }
+ }
+
+ c.Echo().DefaultHTTPErrorHandler(err, c)
+}
diff --git a/ui/app.vue b/ui/app.vue
index cc25a49..548ef22 100644
--- a/ui/app.vue
+++ b/ui/app.vue
@@ -1,5 +1,7 @@
+zLhk`mxJ5$BdA2b%xG=T9FjaJpF*mp{B^Rb{7N%;-bly>XDNJoGOnoX$>F3fg zA-%DMsiTD{%X!A!U}H*@kfN63762#E6X2AmhhmZW#x;%3<=w!!Gc9!H3~;XCaLUEG z;2=1%fSqlFm-zy=tYQ41XQzXstp#JoN2h%a4$h$~{1>vZghMHwMH!^rb$T%yGO7YM zEHL_nbGTu_t$D3X8rw9JdLq>bT385X>%_U>sH@pnc?AyP$9;|WA|{6ynB6nLQ5j_> ziMiltd?|P3+OmsLtFj=sL@EGsGzvb=m2x-g#Z!>^K!%}&acv<5ZPJU0OPC&H2*oyV zG_z3(o9AnA?ZBZXgkmWh;xstD zQqH=GPOP=OFxIH9H#lk-9tGkAHy<1Yn>F(m&qHXs>Qp)@cMJBg6-?h;%DCrczOs Pr>?C;xS>!ouVue+#`Rqj72OKqDl=5&QSi(8>Oy~wUvVsX4pi@
I%!B<|F!rbt0M_2P@QY@bJ4@VIsztBH*g12}35b|zG{ zm*;_NiR0~hrpX>Pg@9u#5smRoa1BrnPZ&||BsiK3Y?ab(C>+xmhYi7zCYBuBVvYmX z0-Q3o#6Q4M?Q95GY-Coz;ijYsIGP#Igq1%skk?2d)V?tkf9aHM1DU4iYio$V(jG zrs~AioMQv-9ym5vu)JzLw~$}tLn>0_FN@tul7nNj=L$IT4@WZ0xo|1yfL>g=m31W3 zzXy&DBJ!s4He*~e;Aspv7D4LrEGhk C8%#z6(sSnUYxoMhgzjD9nfBbWAQ=kRQ09Y!+LG #=V!sDh z*i&MIJ#5foD#M9%aI8<2 w=_yL%1T#|Dk^gjE~_t|{{HR3lTTx+;ms z^ >UsMCgnV}<4#Q{o$>8Y}MOOe7A zG?ZmlD}(c)zm#atA?2$4^+cPCnIuia<04 `USoA(jRm~cM=cc15YY{fx}JSF{JR9I{f7f)AXWVoOz1Xh-l$3cNH94bzxas z>NNEQ)*k#3A^nnG91GqBHDR+w)N{a5ds**Vo?&wY0}8`39vrRgZ0*?%j#fK%#x0u1 zG+A%80T+rq^nME+{-m0IMX$Od D=6Y@c1Wka3$B6EF*X<3sRDnFYUX7QhDN3G=trCnj%*`7-a2~VdINvw zy2PT5p2M~YhML4{0M`s0-1O3EwU=qA(T#*ZQly3PfvqPW9L;y7yVS$3NXKvbiMChS zl7O*>7Dj>dhl( XrFY%K|^~eSYD@!?s-S zM&Vz?aYTp*M-^kE#1gU-Tw!- Y*$)lsCJAy>o466jCnV~@Kg+E&xR z>8LDpFu3MH$4jKo@{kkQK|FO j=ZYV7Jmp%iC6$q)St>3P&))1PHXsU_fDkRD*8C#h(#W;6^q#l1;^q_ zyT%xBWEpvz@P`p_R4eL1KYa&B{Uj u(KZo7r?kf&Qd#PGdZ!j+RR`^JqfY^ z(M6~MS%H+1z|k701(gNS^;bxv!WKm3%Yo?nE2KIrfS_-n_W+cNDg)^v6hU=BWC&ZB za+xAkgxRWGgpEP*pkkn5prWABAiDk@4NRc~6n|0F{~D>n44!X_RMA{6CnSd#fGBdA zAZqDS5M6|nzk(QCgeuf8tRxN>Ayu@B<7yyXgk)$PF}Mh+f(^vrA|%6`iNQrk`CCBL zW!ap^8Ca3;;qn7O166nsL>D1dbQnYikAdj=Pmn4;4zdDW0+F4oAi7ME>cs{@?N<_t z;thop1VVD;4(CmgD!2=xmSG+#Ey4s)Ek4Oz9`cFHLL>N@-SutbOBO%4>JDO$Rc8@K-1Hk7x-U63VjQ% zPiPLl9p?!t8Nzu&N``Viltv_lxC0lMA{puqIXTn^NGcH=BZ bAE>k4^Fat8EvwCp_ zLh8jxAcZoD%L%DKKQ52qazc{Fao!Y36wl>^WG?|oqJdm4ReEct#DD}OOU5rUI0#66 zHjIS-f|NfJaxypyNGfR@#{emRJm)8JOy@X-<1~&lXbg~{Um&1@5|ApEIW7RwMM%j^ z{Gtdg1Cstqj=uuQ&KizuIj#fZN7#U0q`w(R<+pQwryA|2g1boTUy!=y0GFF088{5N zCGZT8HkylE@9&UQE_3}GK;m!F7@))*{Gy%jF_0qgoXcMV$-!3~Uvv3eAhqZN=RX1I zGDX@yN !%>;R;W>;|NUbO+K!NP0avPe}Q_G<-z#hM*|~%YoFxYk<@- z8-R5E71Eh#H_s;|gL^nnNF(O}=l?A#tMb25B!dUJfxkk^Kg9D1$?;>HH$~FR<#Iye zk8|E&Oc2uH=^W1>B*pWb|KC9>e}R`Lq#^p0^BfKTD)=w+=>LE5=x=#y(KFrxLQ1~m zyeZNk{J`@+18FS$08)8nU>Q-a WNV AO*$+ zNcyfkpOEApoL5jf`Po)^Y~aJCgjC9x^M8eu@5lA@T+bBgVBL!6w+7Pa?g*sTbmsCf zAYDL%lF^kbbmtkSNEP
Jw ZicK}t*Ui%kCt zBnxYRG*dQGCP&iW%y~kUH1eCRvgK?g4!PTSE+LiP#d%Yte%=o`W#!-(mHQn?){l^o zBk{+${5X(y-s_yd!S#S_%QF#Bd4YH`e3KWr&G|bV3xISHlHOg;n_>;fEzk-&vD*O2 zp|aGfKOyR;uCPZ287jvW2x-7o<@{eE)manyWVkkv%GUu>h3>o@A?15=^a4^jAI|&H zdPW84o7KpXRzSM`3aMZ)&nG0qA)F^92SPdjS4j3d@_a(lH*`XR42AIwLgKq}{y#w) zf#E1ehWqgHrbzM#o*&8b4FXRnNQ0|CSBT{X2x;{i45The1Jc9MIY5fYd>~zf 6H$AN{|AEBqBwi`MacQ>0LCgq#d*;<%aX{jVUE-wJ&?atS-QfoyJo zkPPqSxC=-v+rx1$kPIB){2?Gk;s}tgze7?vfnRj`xC2z?A0?=QyOhh39Jt4MQzX3y zTyBb_{}6J*M?9a9^q+8^koadn(tEDu^B)Q2BBYELT=5l`6H>u9oF}9ff8e|+lISa! zn n-HsSx+(|U?ORmvaN|JR?^8%CpY zx=iuE__W^e=g0MMWToQHf9q*I;&1x6o(9K3?f@Zm&0!FYf&b(wJ=7I_8Y{;^G=46D z$d2h#dS(2RfGWo0dgUS{#s9|Bda2kmJ6cu$c|K1;py%`$5!7p@&*dqD_ G?g~H2w2@{{IKh=g|>n+28C`iLV>CTQlFc zOw5sx{`Du{c3yMCddH6JYAd(+ZGKYe+H;??53K~X&*-LWbXto!-nYsHJ1uLx{mamb z+mHMH$eDKZ t(Z?g69?u26rw#@ctZ!q>60|^aI_R`TsF0{@5QoqDCcSj;Mt1CB6f5 yEngwQq>>Q$mV_WrPA>_8mo)^>NN`SWXbr(b5@cFKa6x`Vg1Mz2 zXj2M;OY*!@5VR-_!8a0Ik%LM@@R0-?N~>G7xkmc|zs&k?9yxfRRm!@nSH6a1)_Q3c zc(ZPoM`LSNc{V3Lr*0+nqEpRW&Yp1mylh$3)~&uaZ&qF&bMJXUT2#` Z zciWV}5ko4J8kTtGT;RA^+dGvt*N>P)I^Wbgn;&all^oHqe_;Lue~Yc3#+=d2zi?nh zg~knbecyXM?c>)hi$;gGwy9x1qk64VCyL)3+`#JYhXZ+;&ZUOB{kXg~??6qtO&Pd% ztzKI5 `i!DmD^su(k<_t%4#?4?YZv5`&z7AJp8v* zwVhek?{6N>IWgd~rG3EG=cC L;gnYEojs*^>x?* z@%`Hm%WAfMaj=nlf!9|@*N8K@Ut9Y kk2?M&ReZR(y&NPdb(;?O~X`Rko#neBT#*P?!x{WXep`4GI{-C yiywV@+VPAKLR_wCZTQoTYq{#MjAamviRW7{A2A6oL^V-Ib3(^Dl4e}wqP z1;&`TS77Sij=ru uE?pMkSM+2L!cN!*i4q4kEz1aCW%X&_@7HWU4 z{PMhlc~*k!oHVD23mfGKE#?nQ&S?E%rQE|7?oH|5^S3EZ--_&8Sfbx7pH^Ly?!KDP zZOZS4r_wd^qm^=_$2VVfyvypWw7F(Q=R010J$2f|*ow7ZpKcoVx#stZH=Wo=o!KnE zXX@UZR(`YF{WeIoW#Wy3BVT)ld;C)NC`jZ!s_i7w@U?<6YK|GF&8`L z2m$LJ-f1>{Y1+%FpXN88_M~Ccr?QnD+-o#v@E<>x2e&`=bVki#eLCM#uTqWl&YNfF z+i~{SB9mLs8?`-Aa;V jKYm>mkfd2>SNR{^hox$&E=#bes2jf>C&Q}>Fz z(g#~~={34@X~(vQ7iQR-IX}s4-AbHOJ7ev>i0c89a@NEyc(SXseVseSj!wHCHUI3l z1OBIl?(QDH+ByvC?%!giyqDZN+QvNK!pRdG3J%1G3*7FEnL4xlj 4C}e)NKQkg2&I=*7?CH@5C+R7Pl!;&)o5b)zUU|dfRV$uroRKbCX%CoNfo-7?l({ z{bu&6O=g=uO_K-M!@WB5d|Sq!oI4| +$GyEgQ?g?DMT++^px6_?j~# zVyD@LEt`9 os)Q+pgcP|C;l%ziLO&G3Q+) zgD0KTY@Ms#+GmxuFz(l8w(T|zp49ivrL`t@pV8-rjh9*5fR>xC*#uh`eR;Ik&T2EB zg>9`_FVFp0!R5@%<$YqWuV3}xrr0sB+LouM8`r*P^KPf)-0pKFzj>Sd%MEDMLrB7B z<_kNDK6Pun%m!^*JFJ6mfB#2`j|`&&LxRh+Xw+D|WHz|5<+a-mhBDKfYjqkOQ7rQM zll_U+(`U^OI&Yitvcc9R3DUmUq^yzAYkW-%zc4i%>FF2uY1c{j!=ENMS+Dh7xWOhZ zZLY6x$?d*vqQVpIoZi>^isR@`(%ItsZkOL!b!^opKCd??rk-|~ Fd7dzaKjV$}sp7YjvNZ_*#q+^P|8QBt2{ll3VjecriMud`+!%M7R2Zj5t* zKEQ0e%=+hS(ycl?yY{Q$MJrr+kyCfrkR9EUM$|9kwj*(u_o5Zk^R2br_bnX1)7DJo zu>IqR-Y;Dn9KTfI>ZpPZh6N$BJ|74$G5p5V@XK2lUp30vdBnMgW8K)-OJ97>U4CXj z!#CF-FaK>w(L-+ mvsJ+N=G@oTPPaqYj fRL zm{P@OoIbuFW=BMsv%egi)3)rQfhLCEnHrvcu =$Y{_A@V9=5-|_vW*ISe~tO;-!h<_ojwD zmuQL}j_?Wn<4TV*zok~lDONA1StsqX@?&N!8#27*jk4>V{pt*<77>1YanU6u*V|PJ zSQ}HTm*s ~n_RYP_WTgvtV#uI zpUsIm>(|j?Oz#o(?$oU{=W_3Mq4CLAt3PdB=kg5iW6?wH@=izQe>5@t(ZsOX&d<%C z-jQ#O+%?XA*24i2VHej{>)*bY?UqktXH9YKptjtmc0E7D*`Rqbr2R&RoL0Ylx06zf z<&T BVUT|j$NPmOaC?1ral~wNq*y+>`Ne(%qarr#3y#9rvc{@?$|x zHIGHbX__~NU3^xQh4`DP;Y_c`BM$_Ys?#zxantRzGhsFFC+=vu;AB)vkJ{?V?f2I? zY~Sg6^W{G}2<7j_pZwCQ{ifgRq_=S@v%2ZS(4C%V6TM6v{%&fw?1y=+uT98l>v*JH zl`g;CdE$P+;QT3kSlKxPynD~N6JGGj_im%92OBPpO`50clonRP(PmQfKaO ~#j&QPEY53?7U1Y$5G!w(h{W6~)W|!~Q^U14WR`=4*E-e;0 zU;SkNy?OuU-OgGqXgsj{qRJf___VF_*j1nYt=z~eXRmJ8e_A pvnP{hQr z#? &tG7s%m ))W}<(XTH8%mz@Nr=?y7SFwZ z;#!FZqwn{f+{Le9uO<$IhqJd|+3YA{YItLfo4yl|CfsX~zjsfmdX3yaFCRCl{mPJJ z>pm}YPrvKAc&vEcx_OoAs-|Omz3Ap+7Wim|Q|Pl%UthgRxt4eGgr45zGtRoA# &-mZ|=+?Jy^L^*{ZfQ3$;g753 zcCPd?gq75FdiCSCSAB-`d_2-VF=V!1u@b@WwqC02oU*%nztFUa*M^t5W@1=0HLPpj zyK4I!i%Lbp-d^5hvFeRQ#QtWtipSVFj(Wf1TAkK)znR~EHN*B<>XhBWx@Nk^eXDOg z+{CTMjqmkV|1QRLv%`6U-Wy{fwlFokEB0*6-R>1@P8*iA zv=A0dYC`%H9mLD2XW_-PQ6zDC m%2I9hG5J6TwVA4n{H&b%gZ4E(bXi<}RZd-3`PKy4 z&QaY!yAmHvD< t^GnIqz2>i17(kHgL7@QUgJ?G$@xW)JjJ ze^D3KqbimiQdOO;;y%I5a3ybQb(lV12ldI;jnoce{LsV!G%j%?Rb9PK%y&{gLYnp< zdteQ 7xqte$XnyTQ0 zH>-fE>>qXMTjNuy)Yzg*V-e6SFZCtGxpvNKb5)P*0e WV6x>^v9z2N$afFolq%>G2g0C0UKE7ar=+3*Cny!W1~A#bu2DlF~GAWwKFcdzEPX zw{vmXR*lq0)#8zf?4J)M$oW2MZ*Ayw-pQ>0dix@F3DYQcaR1G}xSXI-iE_Tb`lxp2 zQtnno-X8%dm%gSj<_T+=`@^%p1*k8n%#Ht;PTm}-4kN2#d_rOh^-6!)zq$H_>V@pm z0`8UGl^yS=-l!P0I(>-!o1=VSS!!*2#h;R`QP;fRDFO$pt5?gvw^rMzo@QTZt=6cl zjJ;do1RS8aHD_Tq{y(pTY~OYWb9U=c40I);sw#3wDC-?7 uA8Y;WBz9m2~LCu)$n5kL%H24|;Lgd@iF8P?KD_QKk1+sZ#nR{REQYTF7Pe zdCEy#M(?+h9(@>f3YRV7GR%8n7MCsNGI|Ad7?&;KG7Ms2IF~IozF=zw;Rr6ImuIPx z;-HaSww%l8qZ*^QYz1WaQQqs+aM>y@qmO=zTxNXvmR@dYL56V|U&Jj7g~1tq%H)>s{xv8r1&XTu9H4NwFq~{=7qdP46L-tQIJX%jiKa$!dej^Rl K4M9@P aMSSs+ z@Rm9e7afF2M*F7mMQJ+2lFSoSmg~{dLJsOc^py)VPUwV3GA|IlBTN?^qA1xAWEe*h zTy&lw#YUhs6s`ocf{ZHh22G>{uHsyVZ*mgoQ4d`uxC~zjCRE^2D9L4hkUd7Is{*aL zOpo+F$f{HSm*T?45blSNE@~y&_6LQ-AdLwdE^C5xBd%A5%bG&gn>$0%pkx3joXc#v zED*AZ+(A1 w4N^n(NzU9>XNpgeIV+uYFv-j_&gM#ZlHJMscbtC zz1>Pz4ao3AUj(SUgVY#Uo6ACxj^TQSdb}{cPfU4Nlv?h@WgU>F_j9S0^h!NB(-B19 z>O_t<;08M(-H9@Bx$&}{k* s;KsK Gq?d77LoVw9K8!olh|79Hwh}}(yt%9w((!66&Q!pM3)>Y#0#|^&-1fb? ziu|KMt)&oBc*!Q^sDb;4m1Fi07?W61SNw~K&hZXAX-ak?Pws##~-V! zl&6_S-AA*AW(m!T#vp%C6WQvC+CkM)uKq+_(LiCKW>cIgh7>Xi5jCH@r>67 Q09DsL2CzdLBgg z|BXO&V4w}8H%3S}hz kLFGa6&gW_y105;4fI5TdMc($H7N8(dOHf@ 56l zIv;cxL??|W2nT&38NL0z473t71M~|h12hwqM(<>gMuLtUqd@+kCZIr2b5IbdC5XP^ z;Wg+Dh)xslK<`0MLFYmA9U3P k$6+pbemxP<{nkg7jhFFQDJx;9k&v&@0GagI<8}aU0<&=n;rst-S}L?@}oM(&=R< zh~5?Mi8^}G*BA9cA_7F;twn#!djon0`T(LoGK52!KG!uIY5JPC!Jt;)TZ7twyg&^> zbmXCPIGv~I{7hf*a};y}^aqG;1Wti$pjQTT6LsD);8%AT> 5l}p0ks9u5hw%{3ThAP0HWg#eM86>&{xnm(07mrkz*AT90k zo^t*xbzM(qB i8&Db0AQ&79q7zRS zP*+fQP*0FM^65*rdV#`0eLxW)`l7BV&;{hTL}f$a
y7z g*-J)fInt+;u=+3D x zI0B-(4K4J-QR_|Q4*}sZt@51`ZIMUcXSfoyN+o}Os}42vK)M%bJ@hAlsN4upF_15a zPPufRrz5o*b~T{QNN0hzf#|rtA4GN02UX~(UK!=c7or0o`b*$Ll#2xR0i`3KWIbrW zbq8Y&(t=DId;rEXVR#Yf0Ei0If({+4>wylza1Q8qP#k!2ye!BTv=sWwK+8ehP_Y|i zE};4#va=HM6`*)E9)YYvA^}Q?_NWopBp2mGtS+X>9`# PM^KanN}1v??9}9R~d_rx(*yH5@~d?2x@&U~eETn8edv6)mjv z4T6_I^i+hNmgIphg1kZWP~-yV>jP<%{s6j#G(C@?XBRg>H6Z(rHk*MoAj&JChg{W> zLEoKbTx4j>(#LM7|LM~~_c^}>g|a}zZvv_iEP8f8r#5=l@EJt5yntJgzYX*&Xf FK_C6Qykv0lzh>p8oB=48m3D5_d1TbBZCmh((FKUrHs<7Uib zm2l4C3S7rQBTcpY+pwO$kBazd(N$hbrSx()YglY8zbNt3ezbhMBDnSVfGFUo>|6=( zNFG>H !;0)608zd?N$98;7wdJHP6 z+#RHSvW|-V?tXHfqTo@#fgn^e$B_X=rGnFyC-tt`1UarK>WY0&-hj9}ctfEC6s{~? zyJO##&l?p5kNWP|o8;TnF&*VEq}LmIme9LV-XU-PGq1x+6)p{+xKeg5ty!Rol}`|) z$cw9>lwKZfqj{uK!r>+_DuZxLl6RGXLWX>L4iuKk*7XpmNo6(tRBPo|Wg*IzEp5?# z2W7o2^p4BdY$42--`Q%~sP4;C>S*lMpUmZ+b{abe`od(2Nat=2`rTsd6nNua-<<}W zjhtbJV&&y^00(F26@%WWYPr983!QFJXkGAwbw$1jh0?vCK+VcA*cv z4V3qgwlZ98HJ$=5&E|z%rM$+So6r 8>QG7MlJlt=mC5(~+ zudJ?f62;Li?)7y7Zyt~O139A$j77^?w4U6M4~G3K=WrQoF0EHb97})Cd{n}YnW7$k zEdQWV=5kgCjjhH7W7n;+rj5fj_)UY>ZDz! cli35 zGvDvRB28)+FTq?sT^V8i_X~#ckGctSPnQ@qskK~El~k7XXJLGm=w!(m(U_j&s$k-p zPHB79@ABycIDJxnMp0BIcpElb-1tP6msQocJCv|zJ=9gT?YE$unci@+L48kJd1}b7 zs-oyV*|Hku`BHglf7EoK8U~=UDA*KfK>eOAm#B`m9z`!;Xr%40x8SOGN4u6VL;VPa zOLEidST63!g9&QME;XUP*pUq*-!})cj+gZ4rvw`#2{#w=P1sZE ccJTO1`1#6rv0TNPVPv-j1}gsNEYY*#tUN9)0yvcmHLU@O;i z(l|O)!1047&7jIBM^3$0@tI;(nUrkM$RnKKPD5FCLir}yC!93pxmA1ax9sSwX^VF; zVx8ebeR;ey6n*4f&S<0(Q=1~n6mB9{ZU6-zdB9)*%aLOmXxgjd<)u9^nl3ibJXURx z54vCv;ycant{QibHFa6LFSc#A`pJyj?(oo!EnZuYL+ekiS2tcH+rG?3ju-2c-()8@ z)N)kzAF8n_qBQ5M98RJe@^FB|V-%&?xpK~;r`k%r{ZSMPJgr3^ {@=>h_=U}z{k;WIgbn}>$i>k!$YHWNQX5n8)-RbgMM*;eI^XbI_Bge zxuPeOx5^DYH47XraPNvf3;A&ULEjQKDnDNr%r=~` $wwsYzY&EN3tv5l$@S;Mtho&g1qEGU$MLd-6oU)_rgxNoMy*mj}W zm&0=&%t?8@RR4a@&zuW#K8j*vel<{IQ%O<&1ZAqWL6iBtvWt|!=Lw8vipl imFD-2a}W$0@r8Dw@I`{{sM5=%Zp0hPpkHyHh UXBDV|nY dq*9e *j+rsRs){lScy^~Kv!Nbmn8M^OZ-TYnCfZu;Acp|3~ zit1`^@N)ffrrFP&PI7r4*dE4 BP6A%l%ZCD~CWql_kfL-YMug!cd7jc`o(7 zp7{Dx@3Fj?^sdU@zR>Ftz>ZbdnmT+d?&myOt@32^K!}x}`Cz>nE?0)0QGH(^Tlu@} zf3974<5?}t8# (s# -G1}({1#7r o<}T#9$#o{$Oh75>JI UjQlytBpviWCo|1 2Wc6QqCBloGp zG|iyZogq%KW^Uxu1(t3lz1rnP_CaJ6Rqj;LGmvHh)vL-)E&v{dQE?Z=Bf=SJ7jO2u z?pBVHFvr-z2Vf+(NjcqyJG&T@e#nn;Mpw$nY+U7y$#A7FPE%# z_CEN^jouD?VX0iJ3q)Z*Tz$pwkJS-}x&2eCzK`pD2gU&^!-!RzQi0l=TwVuDyD10{ z{Ylk|@B6vnqlWI?9ykb mP~bMwrg7_bLT<1NdDU6@ww30L~e3-~D#w%*n4kID=;I2hQ-- zDd6-0gXLYpz@PR`ZnXROXDR?VYez*)s6QQJxDkNESzPXG!ENr;*pz%vg~Nc8=_vpr zmH>b!6VoJO?Y76mYO4Sc|0WeR`r6+!d&H)6bf6xlo^OEm1pu%Ua9T0mCB6NI)hYm( z{FCwkpshno87?qZn#_NX9_jwWX+6h-sw?kG#{m#A6aZ|t%T~w6#umn$bO2
2<8L3I{vqK`Q|e(Gmbm$X0Z)r~muOdmJNmLl1{7EoK{MM}ARu!hzbCZoi4OJwSfl z5iW(0xjP2bkg+Esx;5RE_o@n=)aC9)9o_=4nu5Md*0(_6EbV&>^sdlfc<2`mmAie~ z(Rcp|2#Edz<8sW4rCUb@J%B90-E>%UwV`6WCoVQ3yzW7ddLUuwf!Z1eH9;rWT1rNK z9t&EqNo?i?yLSE5KBP;1!Tgb)N@IPeL}}3{oN_LDvL><#a9W{AhVg|myZQ=Vo=^S+ zWkB_y&|c;8kcu5n&V3P4t7BFkx^m %)OB zuRoS%IW6rEwUZ?Tr>EvcixfAdjmDF_2cWmSToc1@YE>hYrVK!g);2>1P WQFfPJrV$s8Ux%t)TW~Mn2nU0?8bejpOMVe;^EwA%rkQoIHgvuyXxa$ldf-MjA zT``0dQz_Rh&eJ`BsZ4vLl3*3r<#N~G@w>5f=K9|plWj{K7@;yjo~LX9$;#Cbb%1Sj zVIa^hQGGljYK)fA+8ebt-_9#u&w&PH$-Cjj1B;T2JJ|+e&DFY#Y(f!7lGUn%sJ(&@ zcW@@^GW 9ads9Hh9Gr|kLkWRS8A`R|s&uplC wI>K%)z 45V{*IHimH<=0EEeEM}3Dt z8e)>+UhSae%%u75m@aNJ`zcr%Xd*NDXdK-gf=yhP0^$%HiQ+?WHTI(Jv^NeEUfxkR z9)YKRR+gMbuR1@|gXWXjL17>kkuSv$g~S_CyIC-c^M}HuD71;2F4JQ?=pr}C-+KF9 z`QeWy jpAxWMQB4DcA^UET1TSjPJp_%9+rvF*=lO1gDzq=wUY<)bqyW?9D$O zb@Y5s6M?F~2>?9+y0*|XU3K>CPzOLYDguDkmyR)9bT%$70PafXxib!Z*K?r*ZXi8n z9>xHG>$h2JmUkcf&e={5fJJK0g|@vS``znocJyqcp2I- 5 O}B9zA&b7A z R?}}N0=}Y@ VTe5 z6jq@kvgD?p4FKL1^(QU-DYWKfFTn%$9FF;fY*CXb#1Pug=};23yT}oatK~OJ9FAJl zZrU>3evsio+ftO?6|8|b`MN<^UsK-^ScdY_8y7USXK2?5> hY#xJ90sn}VnLE4b2M9S)wE8R;~`sy>MOObE==<@jbtv~(K zNt?|Z0wT|$_%xK3{vQBOOmJd4M4mZAda^cMO>2fJ?t{7BDK}0Y6{UlNJn}SSM)}m! zjO0=+`5vPDRX~1mj@X{OGk~Q~Oa=t7jYjh0YnqaQi0M?mG%Hzkp1#_o_f8$=&N(L* z@n^aXIQ;_va9H?KJ^#6bI`yr`YbgN~@*4$0^{E{{9#H>L@R%zxYqqlI&+lDc7`8h~ zBn?6qRo0V4&jH#E3RNd00zl*&IAsc>Iu^wP@irHZP>#k}KGeYiU92)!5dc*djzrHu zngdjQl_{J65V@PDR%T-Kn+5q=mD!g7-c9wbif3dA%%Cggf8>6y&xCdT-*?Qv$~04; z{vA$nR-B$ynPv(IQB2~(D(XnCwAcEg%uxVm&;@W3(Q1kGN&bD@|9rB?DGrVWwR4u) zYiiHEzgm1URk!*PdZM6b;JgnRY{jw z{`9T( ogbG!?~-1FP?fABuxdaXtnC zWYJzwh;UjXO~4fA*woa?+GS$qp`y}*9+sVFg9fSn0_y*$qCzI#RCgQ({|a?yj)VJT zr+)QQ(UuBHq^OYx1=L$By{{`wFQSRuy9Xy`EIa+p4?G4m2jbmB`JjaGic4tv#<=#v z+0=?p=HGH_bYcqNxb_Zan^76ysw!ATzyko_zd&VXAO4*+eE+)();npppoJ?PgDGe{ zX#a*+Ug5-n2llV1zp9#(_8eN+Cp4va07ST~mxG7azIUtn>#i_NPXNGMtBMkw>UZ!L zet@c#LugyjCC8h-Jt|);onI3N^)HJq?t;lgVb0*ynS!&R0*xsF4}IegrEn&l8qoC0 z=q@fSoR)|aafytIvOqnNj`1UderE72)FD}xK2De8V(#3Lg+<{6r7Wq(1bD0e($Wc- z^ku!=I=9jeE`9fU%rVebeY31+wTZ%|nvbQu{q^CnviOEI`6z_FE|$52n%wTs>2=9` zVON|y4FhBFs@@YpzQ{v5 {F-+?i-UJ257avp0|2cPjhv_)*ZxSCRx55zkY`m9 z%BiY-p3K=0N))Zd!|72Woyk^u;BYB02WNv>v@ZwbQmB+4Hu@_^$ UC3p3T-E019iS1V2RG`R zr!=ayVYAdQwZ6HXvhqN@7_Gd@AAYG#SYCZ2*Nd15;2x&W08o|6sx?;o$Cqd7zPIZA zSqWVK;1Vn3dxo9>)o>pZWDU;$FsIezu&iGkj6Yut^`p-3DSrCrm(0$NJREB)6mZ~H zIhEYZTR* Wou;Pi+wSOa@luGKu9^8XVUw&hI*~ zc)Mfe)Qs&Ir7_&uopOb{oI0@h>Ru0C1eP%*d6`xNK>G*nnyhqv^&h~oK>L3oZNb_R znWM-3JJ=iWC| _EPkk`<9ntk z4aze{l{NJQxT>5|g=k8HIqQ^wG |HALHSHt9T=mTZaRHV}mP&|#9 z^k6Dtv@D9B20C(c(EMpiivat9^A~$$X5oDEgZwXjx_r&_kPCufG+kn(-t>4HW~I*K zjp@oV?YopW13gI;GZRUG#|))KP1`=n77g_Tlik%DK%2U{1wM}6jQSOb3cam_suH5_ zW}sYFRgXFZjQ_})2#~|+i 8W=>A4!;b#+{;#vsetTwEp8>#m^@OFrn&jZoZv|}EE_HGna zfJXK7dsP8W{pTE!TE6Di_#j*CA2Qkz_Z-w}Q7aTkMCK{)l~KlgT;%v4XXdnbJ_am5 zAcx^|(}AB#$K%?Y)aiXdiL-D|{flKEO!@DF;p$Yz;Lh~mea!tj1ucLiw;z)Vy|jk& zOCbv$Y{%SDF5(qCP4Nuy1OUDe&YeE*%>BhBwXXmW*V9C8u2D5?r- UNwu@@wxmT+ z8lgZv?TfyVZY)x|>NCHS8T0pevNf7euy0U}V&COX+Wqt (0C?aD>%=NPZsx$Bo+YqdE2e z0OD6G=-#v&jrwlT7-w)Y;NtERH%kinb{czn47ii-eV`;qj5;Z|QtTJAtv`6wXaE2h zU wf`JL|mxERW*GI6)eFXDqaj;=TPZl= #gS)F8 zyUaOpWMMS-V8*zxum(MRC~|S@qQNKj`LJgX%YnE+F7&J%=*Fs#N{$^j@!=1USdvxv zQ1w7M$!ai-wONcqCVmnzFuM+l!iXe=@JE`BFiB9B+n@M&xs2ocp5Oq!PZN!CSan|A zRBOT1O-KIYlv5tonKMl3jMVn&RJX!vWlliiV A+daU53Nb(-@2uY{k@Foj-a~ zZ-d}XWDVbfl2AR%h}}cF-+=qGXO1%ciZ}y+dO!^^A75PHK9O&7qHe^l 76-u8V~H%6&Uh7ja-ry*S64hW@H>z)C#ElTbDm+oqOjo zph6ieRAaP`OHV+L+s?N)`4^sTik>js@oS|aKX1jgFIT NP%X mhbO3O@@7g69Mk?cQ*r9NmLixUgIRI+ouiJNXv#=r5wx1S`L(awq$1;U z5b=@~x}aLSu1GdTrOq?Qn2=z~uvs-f7T4%<{n5?^f@@sG$Cm{FYydqg8F}a5+V4%X z?{Unh=2fZDWt}_yR2K91#~4Sg-{{f9B{}`jKME!fcH=;b?E)-Dg4sMW#bnj2{9f}) zbe+h*1Wr^-CwyFumG{s?7%xh{XkMD)nj<1I44!DR+AQXAnz`u(-yIxxMeIa5#PhXG zF*qpapbW~}`)G%A-|U&bbgRl1#F}I=S%*VpkBb{jJ2cb`b7h}OGfahXn)d7z)vta^ zj;AV_D%TSOMY0Zr0g2 |i z2u9gc1Z&@?xMRjYF(&VwuvVJy)F})b_+j4WYxz(Wwn!KT`!&sENF1g)aA@7VCtt76 zNoTc@C0kN5G|jiH zT)g0X$ln5AES=42O-ReY*F1F^bicc71@7uIVHhLL^9iXMc4@|?T1NA >$~KVG7U4cMt@O<%St(^K6%0^x>^EJ8#I@S*ne^_Djck4_Wj=6*ZAJrEzcGy0rS% z8js^0vZ{2kjE1dI8e^4g!_A3S&D9c@d7nnc^F>@?f2uNGU`oj4#mn>vL$kMhDKk0e z=OB`#c^TR3KW s-?u|%+tVQ>Qp^#1Xvumd?B$N>qsQ7tSc4PH zsb-5I&75emx7Zmym9bB4u~lrq+2*>UfP(so;p1JD|52(IvE zkl&!Sv?Y(P(3)Yk+VBV54C!zxDe2|&HYAwSlTwlmnJK0*CJX*5TQG!S8jC+_R{^&& z&~TeA!`hZS4=9bwnWzj=fuG792HsDtn6r)uJc2Fe(KeGsgdjGfEhQntY_TQr_!f&P zBh{DyyPa-GN=Y?^`c9bO8z%k(flv@l%P`t}Cnytq!)dim=e1*awyvOh;4^68 z1u3=4Zvv(=lgsIbIAARB}QI2oNoZ z%Iux^Y2X5MD2on$+? iDDY8K@RrV>?uY37D4;)nMTP1-D6xUg_azRqK$#zl9w>o! ziftq#f+E-w6!#S>`W*1BvJ4Z5Zyb5t1Y^Q*6RUyElx{PyH@5#yOtC^MQ*0^bbbAwb zvwj(j_*;V(TZ+|?Y)Us-j5h3&q|xaK49mh{1u$Dp@@IM`KpBhLZdcr2Vz&-1_`ysE zs{sI-)L&RPY>_t1oN(IQY)vyIrWlz$ayg)Q>&stF79du5GlbB+>bd}L2PXHk?-yjC z;W()vmr}*Iks1-$`xA#@;0PL(qw}xJK@HmZ0fPHl>H>sHKny$=^i-G`72H<>^%Z7a z-YsNcXhnGmy1-g!O)wh}SJ1tox|d&jUTy%WQl3KPk-tM6!;Myh4Ti$P7J_2pb>0z` znvBUH@=S|B53^%i$E6K3rwY@hXF&PR7OKLVA(V^_bODA6E6o6ob!S0A-N8|!$&_I* zjT&tP&Hg&?M)o(rSLpKXr3-AN#@*;qe;GnrM$x@r6+ag>u0faji+ua*0_)452Cec3 zJ?*Ot)K^qRLCc}IG%sBjSgy(y)VBg$g;tCoA#6ai=l1|(Jhw53=kXGUP3Yza)l1a{ zzN{uLXj6YdJovJb#glGIHrrCLJ;?7vd}LJq%1Y~a0V9!Q{1B#T?j6OoA&T8nxJH{H z)nv5V4C$oZpfvGzyu%^!aOM4Yr+W|?&8wkv(?;S$UR^+o3N{?T(wG}$<%W4 @62HL_@#&OBkP_b#%3i(t9yxWq-!wveIDOj&O4} zvpLloY&E5t64-QDVRTZGQW8>Z z>% delta 45715 zcmeEv2UJwa)9<}AjB-_sD2^i{CU#X&;-Cm)#2hf7s3-`CC<+4Rz?gHqt}QC&oZVGX z%xTSW*MJ#Ucg 0p9zVE&7y>s5#dn~G}y1Kf$x;oAs=iJAVd*_#& z?NR-=3ae9I$AmQQdHddid3{Iz{yNm`x8aw7g?ArR@tJe1t;5Etb`m|$baT2?NZt2? zPNO7gz@VWi?vaU!g9pWEoZa|aSdy%(fE|HDWJxLkoCKQiGtec0dqRN&aC?Dc2BgHL z#Kj~x5%e& R72!iiUFde?Y%lhu9ZrHWW;N< zjOvPwPv{jHpDf)MbTTkWrxxWlT>@4>NA-z}?+2Ze?1eK>7+Kank;(48<0E5(L8GWO z4h ;@(q$Ad|2>zf>t93@GqQfFv4g7F^M3Anz%t6^1X(BGo~Dc%X}0-RZjH);uR zdC>E~cLjEXFc~&1GCn>oIYlyoCMTH6ND}^8QC(zwWOPhX5M lhg8I_PU0PWq6_EK@1A9kpU-YxQ8Szh@yf#1OG)Y<@8NJjNa zij0a$mZYyi6aRN$YE%nnp5H$vDK^GSlAfR(+GCANcBhVzd|?pD-%#i1o$6$QLaVJK z;0J2j31I58( (E Fd^Jm@cgO~9F+yxeMF1iv-A5tmPD z%=4pxDLQA1{IN}VY#awJmWqrogL!wEfJtyH1PR-MU@&M3h9OOP!FbTry}bnXZpP^_ z&=hpNlig#6rX)qa1)s|GO->llJ1#!v8E6U~+hh}hXm_WI{@pAS1^1BRergGOm(-S^ zFfcJSB*i8po+`KI@#P3i vmkO2r$NFs Dj1-gHYfxN#v}B7oTWH!s+!lehP!H`uLj(~cV%KU5P1_i- zjUn4uu#GL-n6ibsZH(AL+BQ~fW6m}dY-7$ghP1JW70GHFOt!IrWs6oTsb5z eC)$8dU6edHHi10ZvnQWGIssD`JW)#&a&o;VsErZ4bh^N(&3#Cp z$doX(d7)aV1tCQff-iK^cyj@!iR5z>_j(5yToiOOVCn@$ b(4fN9v(1g=QoPznhu@Sz(Q{1KQGofmXeLVQ9JD&GOR9QezD zO94* }c5zZ8c3xLT3Cd4BtS_R)zMNx^oWd(rAzy`q7a`cXSN@Q%ZKWNfh5ts}ai*l6T zAQ=-C28gv75||aO4^eA%;G%=LOZTNnQccj0fU5zYKt8!pfdM6fe}NV<#2MPD+vgAA zBe@9Z5};p+ft1iYCMBwmB)O@PMO;#A4Cm4nfT;r=1s#{{=hG`LMVdQ;``0#p-9~cS zHjX98Q@|7hcXzwUK*njpkdAeZc5gYdWwC@MwV}fGbdkH$uW08E(Mkfr|i}fL}u) z;cLL zM u}$*NMcsq0hdqQ1E+be;nyBWW_H#+_9M7Il#e zsdI`tH7_$;cp4bNX#F&c<7dEB<~A^jS)*eH45VH8Inc#H?*pbf`lO^J4jm>*$JEzF z|DW#^8veI;3egEE?ukhWi9^&=#oUaRMZELM0aN3j0+ZtcRi(IFYPED8lsCa8SNsH; zTrok=+iLLqsY|#kqmrWBy}hW WtaUcGU1iizvtukTH?{he|`%as&DSQ!w@Ni6lFvNYEtb3QPukiE@;0Gq9+j zBa?>>z>*;CnZ)%d8~EDvWFze}oy!8-_SGjqlb83a!%DiO9>Z)) z6U0w2kwWAqFlo62OcwQu8xS2gAT~K-2d{M U#=2oU^5HA=gLXHo!D=`yb_g$B-anq~oB8-wC)Zu a+B5`E_cZw6+Q{)s8c(!7(re82dZ zLFiYhe`IW26qb)R>T5?QqwO$fJB~%i_3lk(o>g5-J9&NsT}J5aN81w|vF* uoHQF}GVpDA0dx1AS>LPc17hrPjXJB$kGhumgU<%>+ zz|?Zj%iIcQVCujr;FGJWe8 #*B~nsiqNQ+AzyeH>&?_z}F$#_J z08Jq_{R&r{)H|Bk(iqTW*ic}SpLdm4NV^5>DW(2#DJdjZ9_1;5=3L_q@J1In&~D2M znUvuMOp3~6@sKJ2TpaZ8*Lhz(5xBt(-qOUl-or@oUGS-#?Q-A>X!1nDO>W2;LECn7 z$%CSjB9mjJmAB9k9|$JKB}Jy-`k_DeG4u?&EnL+nW&qXESI~1&fIJYUHgIxEEelEN zh{U^mb7EV!5oucWb?))d`ZAl#RRkvglmw>GvlIB?2CmgMOMXB(l6wYB`tJc#2XFp? zms<#o5m(eY5ee$yA;87Hd04h^8T((oPWSe+R_{8u)}ho=&e0QhbRPWq?(~zL4}Hp9 z8`t%IiSr?SdM&MLtyyD2Os`u#B*$OoHlJMC<6-;y(Yhu|%aMD2U2WdhXPC~i=Tdg~ z> 29{o5ZB=y7Q7c*{bcp%5v95ES)HllKIZGo_vgJG3aVuMIdh+ mQo_!D zJ;>@_@5Y8|-ApHT4fXw0@=4a@YM+9-O;(I2=P0))Y}+Wa?Or;II@{A;ZmgzxS_~Km zQXMtjGr&+l#vH1pdLh+BORddGeL|`!@#J{b=xvd=sA2f~N=?JxKsC$TVwj-E5La(| z2N;UlNm45{Jt;u$s;2o^Zf+0^< z!~87rDK!m$OQ~7-+f+50Ey}8blGGj^m(}IoW}VJnU1$z6j6!DxsOjba`Iu_-x5#DG zF#K(%rs3}xH4A^gR*iKmhWm)g#$=;hO--v~k!z}1_}f=C*0sos)v&r2B@5k*!C!Ki} zBGmLc0fs9`b |If!|=DFnigzPLb0Y(4@l%+dA4e7YJnYLO)W~}@;nE m!PC^NSSoN;XePWiLd|M! zk SmpEi8sfE)+}DlB-COUu4y_F4|jBk}RMQD}iQ1H&E#3rU8Zx zNCl|QfdR@xq}pkfQ>^&9^3sSScxxdj>J*8hM82$MwX!Jol{gO)o@S*!DBh{44Y8Hh z+G5xQ9!9x2z>r#5l6)zp>_CdgEP3fiHLZ=sP_7CzQRmC;RbyL=G9EO|;s({VsoAib z=OzUxuaNQuzo;6C*bc4A`x89@3m1SQz1-f@pvbwP&=$LDyk%O1C>=ow3!r@>s9I|H z`Fi$9G(!>01n7^CYF3Cv4pEKmExIXg>Wz>f b3}=X7mF^ zoq$RZ9V-Q;HPP@8l#d$TBEVp*K`ELpTdQHA7G*SOYOcK++03kz!2Ht&6mLXNP&6dC zo0fyBuTdCCN;W8}%}yI2Mt3c&& X()PzqKUdLb1| zDP<>8R2#4REhy5j*M>%|T0FYBmHj|b_i@S9peVEoXq|ZzRE}LVmv^ ~4`0)UfUrLn0!qjT+uPz;FPmR$8hMqKl_Ob5bjE zQZJBdp~?BfoMu|env*)2lPYeu<#x$QEz3zg%1PBmGq{$aNCk6Sa#D76Y`hjZso6+1 z*5tm=NtK18IInw7YMCu1|DuNVvKWd6N>Vp9JgS}@5@Bk1uK>dl&O*u=z1czIB_b8B zrOqK0r=|QbX+&x%h7`~J6{%Q_*A4L!qoocZ)l*BkG_a*cBgISH%;D8V1aJ#fq&iax z`H7m=8{OB4FU5R9{Hz*dEruBwa6MJ$*Z}1jQZ)K_5Y%pxN7gV6R9!XP5+HxChV`*1 z-oZSWBrW6 D*<>qxfReRa j#4h zq7?z3V;Kin ^N~qc0%!*IzoVg8a*l192 z8tTP5q8tN-uC >zsNMUD$)Ne>N(^5elZMkES;=I#HwbF9Sbh4G`jufmy*=0y^xkpHGIUo3u z^F|`oMw2^@l+e;SM+;J1ZWU5o-=iE}?Jl+wBaz~k9zm*wrmqP4pO@{36xX~ghxZ66 zO`lS;EB8S`)wQiz83PK SSDe52q<`p^kE_22#Pz6W~4&VJm9!1B0-UTn2{`I!)nS?)4c (>F`q!=Ec5})ICRMPf(Z?Py=b% z3`(>XRN;QS2YFsoP`Tw+g34{}o18qF6+_TeUVC;^e|r$QDnEj1#;b#wP5Sd`tdO=u zOa#Rx(RGF!ptQwBaU8%WEp5XohpJgqEXvp51w#*(8pQbTpn^d0 N1ypEG-rYY@zGHc0 z3duiFw?WZB;CZ#i@jm1S&q<)D4QLV8)Z=Ozv*5Ux#Vm&2<7w7UZyaFQf)u=nL)Zf~ zZGpuQJVE3rGm#=+!E>Hw`J@__W>M@Wavr9)$^P~rYC`}My}wyEd?H<<$oti>g|y>N z!(SZ07h04#lk-@iTmZ$j(nO(5u|+zzWpV>GYmvn;54`%cQY+shmD>j;r`lvO^BY=# z!W4-qd<9bVH9Kj%-4{~Y2FXxvnl{nnSlk0C8dKo6FdOEBs;!m&7AYQ;uKoP&L5MI6 zGRq!n))I>$VmfYbG|}luQG4Oe5VO2bO =M@ad7WlN3DNqw7>Dmvem8=8|^l9T!|C*{Ft)1%pvlgi9VNegVb z!ARjig?gvvq|WE0N~YOzLv1N#AyWQmId=cvX2WGr+U=p@u+TQO(XPA~C?76`&YTa* z3lzE!`-799NQ1TkQkpN~)0=k6P`(01OALZ0$ZU8A3f7@7nl0wRgsmwyz7y4~%@*YV zcvJ^YE71D0pbBV*^IGXNz-c(eAXOJqh+k$_mV%npm;^im)iy=?NU-fQMKAsrd$B!3968~yaT5A6?}T+Q~XR&yj|pr ztDr1eIoHN!rPj(Ef1|!wP}DF*JJT!&MgHcs|0MGCv~ Kg6=j3w9?2Z}tPsM**atQ8a{5IFuJDAI`@3O38t z)vyeUGIlMO$6gAh4}s!dfj4#1I&HAjM-{j@uvj+k@bJ?uuRTDp10Un1~*TJS_NK z%}Ry!wmkS-?xCjbvB(S6Ec~sg8Z#~OTs17yqWreO7AM)0{OvdLns}T{1Vv53N`$J8 zi9ArPu-V iTX~ z7bXQMd%*~XAWT8%$lGj=q`gM~C`_(ceMTTf0~$jQ%AbL12nusG!rNmzrx3JocOob< z5&O8AW@U?@c(^?S#fJ(eSVQ2~WE5#1iBxTr;Wu@gh!2Vno_nCkKJ3jf Z$2r_3U@p{IMKHCW7Lgqn_TarX95?AB992H4?GbKs6q-$Ya&8W4LDC zr7k=cB!{b6VC__m$1Te1T{dT9_bb;@)4=PS!Ih#LJDQcRL6O~XGAg_esvRgECxN?d zae})Ldk~$GRgC&nuBsYOSQK>+HnzMlM*cfc+%<5U?5k!$Vt6KZ1Xiu*{`Mfq=kN*! z^+!-V;Az@0@8#i&VGKKFgW^4^O%0$(5)&+@>Eiox+O*oNv;jqu7{ELI?LqLlkxqSg zK($4dkuE9>Vf!f%Xm(9Qikgg@4$J_jKyfoD#`Oodb1>4{_}hc<(&{A(M}cYt3QbvR zma|pkS&P!|AisU!``I0!+GvU+7x~*C;&Yv(y3WSd0F)oHu=XO{rsq)Er!_$`hwJ!R zWbwH8;; AXn zM|m@8N%6M_;ejl4%XYItcMJ~ILb@4JT{Oe8`}^C0zydNeK*>gm{7_6gDpxtqJD6`V zB0-TexocO0st1baJrQ|)998+&HbOACl`fzfLz0h|#h}Pp7%$`e?Lgo|ER1{IN!pDd zrSw3G1hl!;umn^+`h>)A11T@ XJaN=ADDp)h*9#Zb$+pF1&aIJTStHTVl+ut5US6dN$ z`Wkl4B9Bzlu2~Fs&eDM~v?pr98jE;74T{=JU29fKUgX0=+k+^BK+$~8C#l1rXqw~O z+oG4aB=4+_pxPr(+egZ4)U=xx`JS3})1tJvEJ-2A;a#-|R8t!z-&fOaSq!zlqaI6N z8ldz?inQ>#{v0UkWYh=CN_@}#i}8U0-x?J4sCIN##(|=qz!a5C$Dy!0nBA_Z3-1Ie z-dFg^7E4Qev$70SO9*0HcFb&e3aYl&FQ%(}Gl37H(CJ-4QB-QzKgx1Yq#QF%pqVaP z?^%>`*SNb;Jr+w4)Fx2{s9;dA6Q2eZxlXYbj#;D`Qq&rB_A#?=`gOJ3{UGJbEItDu zywIp2pc+6#iyCD&C@O$01I{lXnt&*#%`-Q+E4Z5`fudML*CQx1Kv5_0?tCLCK0kZk z tLiI3AryD|7r86E zD&frw45}LRj)F23-0mojSrSqIBd89b5RqAqg%STAml`CFDsw7SwR)CSy58fBhjX#$ z&j-cL$PO@<@XzKw2<6&S0} ;H2EQDD$~yz-$q(Cs z?}|5+Bq~q|KowO1&_h@OxC2NLf>e9*Vk+k;_=M{N1_FuzMggc%;{o*ibDWwhPz*_x zllfw*aGuD|i>abTf=`$XUIL&7Ed$sARsrZCO!;exz_XU>C&lZC!b6zo^#X4IriU;o z+Cl^#!c@UFBJdC<#orKthcM;u1W=b{3K|;~jekJ!Q;#A+6&?f7LzpT$2_S`7TeRoD zf~jJxGFlwn046=R0rcd>s5h9#xAqVw!E8=ym<)L+=)9OJ_z6HQdj`;{qu#n0sTr>U z^yI}db1054`%$6a0VMVgKu=yw{P!C7&zOw(B>4Xct_0bNP)4K02bjwH%ZPM(kodQl zhGLMA`%f?p*Oo$_us!Gwf+kGKj L#`I7jm=_aknBeD!_3Hk2PN^g?T1fpXOd^`Fz(iX`Il^S_SYTp} z!=JLii-2k7SPSd~e1J0ljJX5z$@r__{}5e6)0>}V|4?B`we<%lwfhJA|1Nk^^Dp5K z`RY62i@cad>Q(S5>l(>1XGhtI)pV5YHP_z|c{fP_PhL!{TY{e#lg_(>Pnhb?7Bpd^ ze*h-d1HmUu$%g{}DASsW2MKL@cuKi=@?x4cUI{*7qTc`)RQvzoq>lWfxYpI5g#=+T zO^5mk8_15oVB*_@Pel}wpBEPbzm(wT#U$@2_<3-uHffYa2IZ9#0)#16y#)O~hs9j+ zKUV?wq%Rucf(CU2rZ$BN+(nzK!RSI CK~EKUx(*8l($Y-9m@V*JU{a(4Q^EPbRPjQAmjKg4n3Buzhg`H8nB><9yb+l6 zY!Z00z*~UvPuiwK5Kw_{K#_voz(nr_rh@xO>Mxl3=BVK3#Z>+z_=SPL1EvKbOUV6G zOhG_0H${PLLH{7|Ltt8=o&%EyUJL#&z+~XB0>2Ubx4_hZ_k#Wdn4Y|trv6e8A~}aL z^cN4|lI&wy*-0B0H3XY5B|Y$m>Z>LAgo&;#u&3Y?rlgOc2^R<5SkV6g=Hv1|5QN%) zt(Z2u9Yn>1$rqgj?hH&l*#npw(i51To_f?zf{}tjm;`zW90lA6^crC5;!VKRGuwda z$q&=!WxvQLO!^K8nlOdVQ9&O~wI%)wm=qop^7&!PKQ8hKli_Csofnf_>RFLNm>A~- zofp$4=c?cnCb?^Z{_kKaf1Q_4)e;n>FNMPYyBPidf1*Na(JRpa!j$|)(0MTh;d_z) z5!k>smluOjPjQ8ZFomQ+(0MUcQ$X+uQz#V{G+`>|AZWr=oui-$Q~A<@UtZA8c48xs zg!bfzDTFGEe8N;wRe{|EpD R&if5w$RWJvb!gK+! zp3NvIJ89>w#UeW$n4Y|tiY*cR{4mwG4EZFo3V%rbMqnzp37AIBcFJU}D`JNqUlBWe zDzl4tf5B8HL+}Yx*?oe}i>a@VfKOT9;t!QO0Ze*N5mR8I&j|iGV7iF9OTkAO*+TGN zVN!fwD0l!&^h1Gv6y*sM|0hA`#nr%fKr3kf?gUKr8V!6IMgo+^;6Ya&G%0cxe8LoT z)dZa%raG%5pA^>wrt *pi7i;lv zV?aimGpM!XdfL#@Lzr4hTU@H>|KKGuAAfYKOcuHVs0Eb(R8bWGJ%nlaxdX_M+5md; zVk$?M$Mg`c4;Tpe*O$m*{EvqqJ$do}l}lu*pIWq*YR5yETC$D^JcNl}FYpFndI;MA z{&z2tQ~!F4d=yHl!ean>2vbET0c7ZZ !@lu_$L$K#d3UQ {xw#Tkfqf&k6 zuXmL9zfDa)ajNyvQP&=QeqUmHzq{RMobJ_h
+0-dMP1p{U;4lLu5S&GuG@a;Tk+F_tXi+GbWfWWaMG(t!@X5k zzRX_rWvlF|N8Szzs#0aQbGg}z&O6VW^6FWO$hRxzRe4jn^I?|9yxV!r^G%RXPiolg z; yF^xB}o^~dyj z+)4Rx_~z+VkK4bhI48P!=OJAmxax|J-16akPnYMeCG(hfH?Miue?95js%G%2^!FE> zj;)yzrgYrhs9@D1<1?L?q?Eb(YGv~aji*=)C5^@6FLhn}jbqc+&!!(5^K?P^PCBQ| zdgq+NF0$}SFwghg$+n9poqN||)b4xhV|76b0~}U-eJ|{B!RD!FE0(!r4wzNEQs%1d z&Kuo!I3Im^A;7)*p|`{IZkL@_{LwtB{51PK=F!_tw#RN&UGw~x%7ova%s)SI_Q@~% znhd|y|GM875vQB|T=Qs?R;xFz?p(j&RWD<~DO;rD>&_M*ITH @Iu;)XgfyXTwaYu_D+HoZA zt8W75^=|vP_}vQY7Y!?W|8QA<fwo&**0h>jj{en6Lo0o9fddj9e8`tR#sX8o&> zc}YKg8S+h?P4TL3z|Uz@qNFxmz29G5IrVvfx_Q^qb%l<0I%W6W+HC#$l*KO!?JM&` z&EJ3iUK!DT*uc8aGdhopp|@pi=KYk{ys0yquNmp?dgjrL9v8pxEm`RYhfiNR*J(Pa zNw!=2aE3jxN1S*Xm)321Bn-=ppNWjjj9H^FX1^8)iHGI&OEGqi0L!kohy+H<~vjv@AM* z@4^80+nIUHdz#n0)Zw##8}Id7pmn^{L6<8H-*zv&U|B<@?Y$z8Px}-o@S~}Az_ymv z0|U!BpKls*>tkZCpby5lB9$sStlJ!V&Mf O1QUQ+mJ>w%l9i#NBD?37Ts8pks*^-S1kX=%ZAC zH8^8NYh5Fq9K|lR)r~7{` `{@c4bk}|tAdFq=sB0?^&OnA<=9ae9Wx$%U+#S=y;Ev);shO^Rx(x1j z@!w+~%n0wQtEJP;UeDSD>MA%4#s{Wk`dHxNB)*cwGa|xuHD&oSo6$qp&oJ<7eBMqz zsKsjb)a^6;hHu;y%2jRqFTcxWY>&`=qf@RP;s4L?1J*xE7bP!am!fnB T<}H<8H^lh zqTtc{Kva%u^ajvF!-RMw(vBE-#(;-^+G_&sH4g4U#tA{%=!SEqG+yxN_1<2BM{i1# zLfSVHpPq?=R|x3^!k9^dM=wDX5j=Xkn#xiv+TKr^qVe!iI>xj_Z?4iquV0g3Q9z8~ zO%pu&Xur4M;q`2-CG>Jbtl-g`+Elg#V1VGw0*{jP^210Z$R2uwTYJwK=>@hoTGxxh z^rfMG&_W;IZV-h_BRvX0kL@*WdWpr3YQsaXY*UhymKVIOqAY!1pcH_fuZ0|aZO>I) zI;7I;-BhL=prUZs4#6{lS6T3O3SN2eY_Iw35 *Ts{tOp*+~y=K=F^h_bLSnuV&kZ4(4(xN))~?3VVPTEqJv5qGT nyyAQ&x zPXx~oJbDYh3NS6wlx+t5Mg{P^5OV%V??5KG{H5U4K^n6#_x~#}@lX5e&S7BchM$FC z0Mg$>A-UJ~YCpatE71$G $~Fdgp)4673tkhXy#-Gv zc)`?u>bv^Ddckap^eO;VW+!;fkX|i#2El6%x|^uDfZ(+NZykVi6coIcNYgi4NZwxX zDpDWf(Kr50$J!e8uB=rNy<=-wqRmk>{m>UY_5%(84gwAV4g=^FwUvNXfYpFC0196U zO?tmB8IS@P#NIgQT|DSzMJr$oU@Tx9U_4*~fEJKR0D3(y0Wi?ORus`!av=9ozf(U4 zvP(turQ}8|yNKR2-$7sAm6nbUfR2DrKo whaN{s>88xRYK1M~&- z1M~+B02Bn!LZSc)0geN{1)Km>MJLjmb?X4@0UH1t0Y4*;-n~r&ECkRE4Fk~PlLlA_ zSOi#XKxEVFG_3$_0Q7U2?EybQ!6U#Ez;gh-M>q>WFC>P-xt#%bz^9i`9|N8Mo&uf& zUIJbLUITsx`~r9b_zmzD@H^lg;4?sHz@n>%(gJ{j0DFJ}C ~v9mXlgAOSR3F8cn3r26czxe2M7cd0^b2Z%PdVyw6aD6 zXf>tPlUB< v z(0oO!T?K#(;3R aCg z&}*Vg080TcAVc5Q{RQ|}0KJnMOQWeTARZ6_hy*wTDgayn6#=e*N&s5As{pD3Xvyvl z=nA0MdP4!70rbjnD?n>NFu(&)3s4*23Gf2=0BQn?0#Y6ECmWXHHEih~;3R<7`EP(% z1J(iN0#v{}z*hiz4Sqa;*8VYo#(*Y(rhsOE764lAY5Jih{#U>oz;A%JfZqY{0Ql}n zOX)T$y91!F($Lp#&I2w2E&(nBz5{#@xB{TPffIoC11^9{fNB6Yz;QimQ&R7jdJekI z11 3GypY;K-9sHeuU4RTgCSWgMA7CkJ*$g-UI0)DUSSYa{9rb-v z+rbARfc5|*fWDJ_6L1AUU*ib}^Z?WZcmQbUQ5*0II(`TAhVMo}wmonM0PV|YA4c0Q z`VzteKpbE;U>aZ)pf8{w06UgcsXr11fF586s0RoH1OW;F3IaUPh>xh`6W|ciM*#G_ zI@;6I9)1mgb}J8%PhX~{FL~2lkQrq=!l>&=CnG%wFc>flK;Nz@ZHGv4LZU1&p pXi z9vvz^AiWFe?MD1r16T`K4rmBy4rpn|yqxsy8$P4LfENJT>< Nf&M3j>7eQB^AW&30bu|~fIW3{Uc>4A!J|;T3`&;+ zjsmElAB24Xo&eftdIJ&wWGFeR9AFh>R|D1ndZ2P!87jXHytM$@7p@0R0#2kYGL5l5 z4y=t)U#Tdyo=!oIU?0(CBpLM^N=MS}YY-qA5CX`803DxbNsIuHFzsS!<`_$90L>)l z0JKx1Deer?G{c+%OaT2Y@NvK~z)^O%mcDZ82_#7ksiO%g0{E<;X?u7LY4ZM6z-0hU zP&84|@h$*B$3Z&&5lyDL0O<5a6CF+C2hg_nz|_k$@zE)c2IG$a9HN>^bmF3u*g*); z<-7~v3&1@9&5{oQ6sH8#wX~t8!xD|=1rF#kJP%f|xt{v!sdS0-oBK9vyB}{4v6p*z z*7or6@Ty%F61Y^b+J4K)9wqr>`)%{?k>^i8Yh^zMW&BaZ$5%TU6-JpBzn_XXyj %;mocAgl|ylGRIXCu8M>*=RAnE0=uNmliT3$BwR+!~^9ygX`qpv&sB zR6o7Z*Y*>6S<5%ch^VsLA%Le0Q8p zmli(vKb|Xq>ua-qkvy8E6Pm;Z2E$wJ*|~OlBa8RfUzCM6UIpvRv&1@R#3DAW4n$Y6 z<(UxO!5Y-nkCFGYZcRa*X1D92>%V6u0w8jmZ4LnQ6?->JZ(?>q`m*eO05rT~;cfIr zT@i)VuBR{SYx}9%&fQFwOr=!{j6)bxn7QHDg@4vwo4Q9vx!h< Fl;WtD)R56byJI7y;>kq^L%Y;kdWh}%w+rh&^EP>tT3KF>IgY+G#vd9!rU9e z@=2^|L-czb8v)9+8*>JHX}#2C!^P&mE`6wz5slikA;xfh7I_Tgz!$SO`vC<_@8Ne` zomnHAM-{F#rPB?q0#7nT8zDw{HEY=jnma?z2)SXecV53~**6+;wLM^p50@j?|H&8f z5_XQtWtQSUu9+}eZIZRN`Z<(C*ZO#vB{7fWxc)txH3EHr?F;pJX#>f;W}m5F%>T%9 zHcL;j_|S~@ZTV84(jONq%T@bg+ Q<7YHGWS?{?~!w;t~ z8>N%8!EpfRJ?q~D#umkJlw$G9h7F;Mc zdU7jPT%Lf!)TP|T70AW^)Mv+-yh(3lp}`oFe;WCCTVc5h)9 y2v=>-VEu*Fnu?B7D)UgdR_a@~Hs|&)g*CoB@J*~=OPcW{ zHnF9C;h&vt@ D=ft1&2s&?o=ZV+pPFt@HT5JbTp&gFElsYh+zoqyJj6 zn=|$0*o@Y&Tbqo_v7LdKb#JxSxAKib4HOhdhThwIrq#zms6n(i9yu5r)*;1oH^%*R zIvP2(JuozImewX|*)3y88+|`HPrsYkth$Jr+U@jx _{34J&SwN^4U2>Tc4{L??lj~|Lhh&eDL*f_{I=Il#)$BwL3)dAg@Er1A>h~Q z?5^c=cMQ)JppO@+#@Y=R_RJ_yOqZKeihZOis<9ID^^OHJZFQJuI9RP%OCVDOief&u zmVN);v;AqmnB1Z%ER_T%3xS*CdIx*Xzi~KMU@?n~vnk!i&XLk%EIX&3>rCze)-z@T zGRfGqVWPIS54u>RymN`QxoVtPTL}2N3xSQnap6f8x5c>vjYLj-#EQ>X=j>^an-j*; zsfu)#(F3FB3-*+1Y80RyWvn|tKl`~*xzkncWSlBIX@K`+E xVBC>u{)h@jDqY0&QbM~_SC~CR^fl3gVHtXZ!jLIdR $oM@~rvCnLly`UbBG^kh7UXB;=wS^AT~gk?CX6pju;evLBCkDTy77 zz!qd|6CUX n=73%Z+1v{|@qVmUls;A-#4!DpVVk4$W-%=m&{oVX>~oa92}W6y zXniLfpB6= lcGoG-1v_rgm-kR$x uETqjGKmuVb)v;Dm>iyaH$o!|d- z+cK?xuzt>+bY`>USa|ChTfPk5dL4^7Oq+)s>uTO=C5HRSg6&xFqy9&G z2o~N4G5rihX@*^5s-5}W a DyeX z>&&w+RBCfEPQ!h18qRlm*P7UirIK(zmev (f }H`nhuFnM*uu_z?mWI=UspOAH8Fvs?(keIJlR);-$va!TvpiyaU-=+jcHKZ=@a zcIQ*=r&A|ee0R-6dr7gbw_?j7Ajh)3BsT$aq^RcN<}Fs&pR_4gE}gw38xBH%CSK3! zo3{TvtbXlW8?GaVtn(PP&hWO2L7!XnIScF$-AXv`i$mWpdp)7enMOhYj&flGA%Oke zG?HrrIXVc{oE|ydZ_n+^xpH0E!T#vm(=6m1My2}@y))~Qf*qupH5h>M1=-;g>_Afn z=*Q-_nGzk}iIqrzusF%~WK9yV1-r*;B|_!;1Pt^i>_h@;NoOA*XWAIS=ZNM#VjqoL zX-AtWFB~n=ds-Qz?>`s#=Q*M}H4(G0cID&9?k3`_lbbf!T2nC@4dl@*e`aF_Vy Zvd^7| z@o+Om@6Ce9t-_z01$ooLn!K$4jWpHelebT8t>rqoMXiM~!oEM5me)CS)kMKTcO<+i zLR5!|q1j-)mrZ%z7^22%E#}S6lVy|6+q^$j$IcG?c##U1Y|+?Z`$vKwW^ zRmRu^z8(AN JGAN#>bb?t@EuH7I$pFnlHRj}5U|}${iTYW8>(@v!3aocw<|_r zK^fera0U+Cn@8%6 y-Dg?W0ic5zD6HMcD_Se^HHgQRL0_(lwE|II1lP1w!3F zUL*PQYb0Y{Tew-Q*=W5#4hv&O!vJyDvT1|fG3R<=KD#hlzf*Q&6H?J5VrO?DRc|&8 z9LlHhLT)45JubWEXI!v&;`ojUU >mQA}Gsf8a7_mV2GIb)%wM#kN- zm}gCMNAR|^De{oLtv;UCK kT^x#J(mLPn&En z7Wa8K(rRbfiOXkga>Y(yK9eV)%qnIAGVR9;BD624(faZI(c8X1Wry1&ZtykM76QJn zAz*?)lbTYsWm#DfxdKH-^PKrxzB)Jf>80_xIc_YSbT@*4Gm8GuXy%mT=Uac3D-gjh zkqx8SQ<6)E939o})@|e0@pYqwT)BPBWg-M_K>(Lk)><8J*SU1FAx@1pBgI9rkHl{S zO^)OF!F#~{tIgh=dEZWJHpPNejV+&u_!Cz;FDAlO|9C;j5+~sz$C(|R1nc LSV+vFUuqIRV-o9_~ zW<`0l>-Y18s;9Ntbye$YeAtBu!21>@DaY^O-342J_zF2*9=PAZhjDB(G??l@fOf+A zy5DTC*LVIM5}*^BztoOpQx!4n1IZ1A9Ccs7ewXDlz1vvGA-LYfHKn-rQz1anUToY~ zw><5~m)C5-@WMxx+661_eMaGWP~OAXR19P7ka9uX0W!boaMv+5VLI-pL^CJO(6`Go z%AHvu-0b07X;o*!`+2Ya=n4Y^<1U*q6XCDj0Jb(gg*7E$jZ>DT(&9~J4r}e!#w$K6 zn}zzdk7HtaWv#`nD?2(HS7xJ_X)f%X$UNu3n!J<|9}Kodo@vw+zWVq#iCNK0@6?U1 zPI<6TX5;2!SWafkPv}drPjmGZG5NTtIFX9W gvwnYa6n zuCQYu?>OxYxsL_TgMH^%=Xtory)EQM6!{!jq3v!vG*p}+pRt3G^Zf(?+FuqfT4`q2 z1|4V*M2i+8pwMidV{*Ouu62bjRE0REmSGNGp^8t;?JGE&9|c*$S2&RD#*9bt6t}0| zI-dglf7DJdnqN<|St#R|@9{ L$Ks~TGa%Gu dx#l1a#6Oc5#8eG^@1$8~>uL^#YVF#}XC-eaXfU<;xZUmA5Ps*EXKN zl