From a8abc0d5ee718af7ea2696ca58d5bc0fb838c2fa Mon Sep 17 00:00:00 2001 From: sbldevnet Date: Thu, 19 Jun 2025 18:35:51 +0200 Subject: [PATCH 1/9] init --- .gitignore | 34 +--------- cmd/cmd.go | 46 +++++++++++++ cmd/version.go | 24 +++++++ go.mod | 17 +++++ go.sum | 28 ++++++++ internal/proxy.go | 46 +++++++++++++ main.go | 15 +++++ pkg/cloudflared/cloudflared.go | 48 ++++++++++++++ pkg/logger/logger.go | 55 ++++++++++++++++ pkg/proxy/proxy.go | 114 +++++++++++++++++++++++++++++++++ 10 files changed, 395 insertions(+), 32 deletions(-) create mode 100644 cmd/cmd.go create mode 100644 cmd/version.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 internal/proxy.go create mode 100644 main.go create mode 100644 pkg/cloudflared/cloudflared.go create mode 100644 pkg/logger/logger.go create mode 100644 pkg/proxy/proxy.go diff --git a/.gitignore b/.gitignore index aaadf73..7b8eeeb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,32 +1,2 @@ -# If you prefer the allow list template instead of the deny list, see community template: -# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore -# -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib - -# Test binary, built with `go test -c` -*.test - -# Code coverage profiles and other test artifacts -*.out -coverage.* -*.coverprofile -profile.cov - -# Dependency directories (remove the comment below to include it) -# vendor/ - -# Go workspace file -go.work -go.work.sum - -# env file -.env - -# Editor/IDE -# .idea/ -# .vscode/ +.DS_Store +.vscode/ diff --git a/cmd/cmd.go b/cmd/cmd.go new file mode 100644 index 0000000..6b3bffc --- /dev/null +++ b/cmd/cmd.go @@ -0,0 +1,46 @@ +package cmd + +import ( + "github.com/sbldevnet/cloudflared-proxy/internal" + + "github.com/spf13/cobra" +) + +func Execute() *cobra.Command { + var ( + hostname string + port uint16 + skipTLS bool + ) + + cmd := &cobra.Command{ + Use: "cfproxy", + Short: "Start a reverse proxy", + Long: "Start a reverse proxy to a Cloudflare Access application", + RunE: func(cmd *cobra.Command, args []string) error { + + // From this code I will pass the application to the internal package. + + proxyConfig := internal.ProxyConfig{ + Address: hostname, + Port: port, + SkipTLS: skipTLS, + } + + err := internal.ProxyCFAccess([]internal.ProxyConfig{proxyConfig}) + if err != nil { + return err + } + + return nil + }, + } + + cmd.Flags().StringVarP(&hostname, "hostname", "n", "", "Destination hostname to proxy") + cmd.Flags().Uint16VarP(&port, "port", "p", 8888, "Local port to proxy") + cmd.Flags().BoolVarP(&skipTLS, "skip-tls", "s", false, "Skip TLS verification") + + cmd.MarkFlagRequired("hostname") + + return cmd +} diff --git a/cmd/version.go b/cmd/version.go new file mode 100644 index 0000000..34beec4 --- /dev/null +++ b/cmd/version.go @@ -0,0 +1,24 @@ +package cmd + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +var ( + version = "dev" + commit = "" +) + +func Version() *cobra.Command { + cmd := &cobra.Command{ + Use: "version", + Short: "Print the version", + Run: func(cmd *cobra.Command, args []string) { + fmt.Printf("Version: %s %s\n", version, commit) + }, + } + + return cmd +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e72d986 --- /dev/null +++ b/go.mod @@ -0,0 +1,17 @@ +module github.com/sbldevnet/cloudflared-proxy + +go 1.24 + +require ( + github.com/sirupsen/logrus v1.9.3 + github.com/spf13/cobra v1.9.1 +) + +require ( + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/stretchr/testify v1.8.4 // indirect + golang.org/x/sys v0.33.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..08d0e60 --- /dev/null +++ b/go.sum @@ -0,0 +1,28 @@ +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/proxy.go b/internal/proxy.go new file mode 100644 index 0000000..5df7e6f --- /dev/null +++ b/internal/proxy.go @@ -0,0 +1,46 @@ +package internal + +import ( + "errors" + + "github.com/sbldevnet/cloudflared-proxy/pkg/cloudflared" + "github.com/sbldevnet/cloudflared-proxy/pkg/logger" + "github.com/sbldevnet/cloudflared-proxy/pkg/proxy" +) + +type ProxyConfig struct { + Address string + Port uint16 + SkipTLS bool +} + +func ProxyCFAccess(configs []ProxyConfig) error { + + proxyConfigs := make([]proxy.ProxyConfig, len(configs)) + for i, config := range configs { + proxyConfigs[i] = proxy.ProxyConfig{ + Hostname: config.Address, + Port: config.Port, + SkipTLS: config.SkipTLS, + } + } + + for i, proxyConfig := range proxyConfigs { + token, err := cloudflared.GetCloudflareAccessTokenForApp(proxyConfig.Hostname) + if err != nil { + if errors.Is(err, cloudflared.ErrAccessAppNotFound) { + logger.Warn("proxy.ProxyCFAccess", "Access application not found at %s, continuing without authentication", proxyConfig.Hostname) + continue + } + return err + } + proxyConfigs[i].Token = token + } + + err := proxy.StartMultipleProxies(proxyConfigs) + if err != nil { + return err + } + + return nil +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..c5d73fa --- /dev/null +++ b/main.go @@ -0,0 +1,15 @@ +package main + +import ( + "os" + + "github.com/sbldevnet/cloudflared-proxy/cmd" +) + +func main() { + rootCmd := cmd.Execute() + + if err := rootCmd.Execute(); err != nil { + os.Exit(1) + } +} diff --git a/pkg/cloudflared/cloudflared.go b/pkg/cloudflared/cloudflared.go new file mode 100644 index 0000000..2cb6695 --- /dev/null +++ b/pkg/cloudflared/cloudflared.go @@ -0,0 +1,48 @@ +package cloudflared + +import ( + "errors" + "fmt" + "os/exec" + "strings" + + "github.com/sbldevnet/cloudflared-proxy/pkg/logger" +) + +const ( + accessAppNotFoundMsg = "failed to find Access application" + cloudflaredDocURL = "https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation" +) + +var ErrAccessAppNotFound = errors.New("access application not found") + +func GetCloudflareAccessTokenForApp(url string) (string, error) { + cmd := exec.Command("cloudflared", "access", "login", url) + output, err := cmd.CombinedOutput() + logger.Debug("cloudflared.GetCloudflareAccessTokenForApp", "executing cloudflared access login command for %s", url) + if err != nil { + if errors.Is(err, exec.ErrNotFound) { + logger.Error("cloudflared.GetCloudflareAccessTokenForApp", err, "cloudflared is not installed") + return "", fmt.Errorf("cloudflared is not installed. Please install it first: %s", cloudflaredDocURL) + } + + // Check if the host does not have an Access application + outputStr := string(output) + if strings.Contains(outputStr, accessAppNotFoundMsg) { + return "", ErrAccessAppNotFound + } + + logger.Error("cloudflared.GetCloudflareAccessTokenForApp", err, "cloudflared login failed: %s", outputStr) + return "", fmt.Errorf("cloudflared login failed: %s", outputStr) + } + + cmd = exec.Command("cloudflared", "access", "token", fmt.Sprintf("-app=%s", url)) + output, err = cmd.CombinedOutput() + logger.Debug("cloudflared.GetCloudflareAccessTokenForApp", "executing cloudflared access token command for %s", url) + if err != nil { + logger.Error("cloudflared.GetCloudflareAccessTokenForApp", err, "cloudflared token failed: %s", string(output)) + return "", fmt.Errorf("cloudflared token failed: %s", string(output)) + } + + return string(output), nil +} diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go new file mode 100644 index 0000000..0464f87 --- /dev/null +++ b/pkg/logger/logger.go @@ -0,0 +1,55 @@ +package logger + +import ( + "os" + + log "github.com/sirupsen/logrus" +) + +func init() { + lvl, ok := os.LookupEnv("LOG_LEVEL") + if !ok { + lvl = "info" // default + } + + ll, err := log.ParseLevel(lvl) + if err != nil { + ll = log.DebugLevel + } + log.SetLevel(ll) + + format, ok := os.LookupEnv("LOG_FORMAT") + if ok { + SetLoggerFormat(format) + } +} + +func SetLoggerFormat(logFormat string) { + switch logFormat { + case "json": + log.SetFormatter(&log.JSONFormatter{}) + default: + log.SetFormatter(&log.TextFormatter{}) + } +} + +// Wrap logrus with function name +func Trace(funcName, format string, args ...any) { + log.WithField("function", funcName).Tracef(format, args...) +} + +func Debug(funcName, format string, args ...any) { + log.WithField("function", funcName).Debugf(format, args...) +} + +func Info(funcName, format string, args ...any) { + log.WithField("function", funcName).Infof(format, args...) +} + +func Warn(funcName, format string, args ...any) { + log.WithField("function", funcName).Warnf(format, args...) +} + +func Error(funcName string, err error, format string, args ...any) { + log.WithField("function", funcName).WithError(err).Errorf(format, args...) +} diff --git a/pkg/proxy/proxy.go b/pkg/proxy/proxy.go new file mode 100644 index 0000000..a9fa0cd --- /dev/null +++ b/pkg/proxy/proxy.go @@ -0,0 +1,114 @@ +package proxy + +import ( + "crypto/tls" + "errors" + "fmt" + "math/rand" + "net/http" + "net/http/httputil" + "net/url" + "sync" + "syscall" + "time" + + "github.com/sbldevnet/cloudflared-proxy/pkg/logger" +) + +type ProxyConfig struct { + Hostname string + Token string + Port uint16 + SkipTLS bool +} + +func StartMultipleProxies(configs []ProxyConfig) error { + if len(configs) == 0 { + return errors.New("no proxy configurations provided") + } + + // Multiple proxies, run them concurrently + var wg sync.WaitGroup + errChan := make(chan error, len(configs)) + + for _, cfg := range configs { + wg.Add(1) + go func(config ProxyConfig) { + defer wg.Done() + if err := startReverseProxy(config.Hostname, config.Token, config.Port, config.SkipTLS); err != nil { + errChan <- fmt.Errorf("proxy for %s:%d failed: %w", config.Hostname, config.Port, err) + } + }(cfg) + } + + // Wait for all proxies to complete + wg.Wait() + close(errChan) + + // Check for any errors + var errors []error + for err := range errChan { + errors = append(errors, err) + } + + if len(errors) > 0 { + return fmt.Errorf("some proxies failed: %v", errors) + } + + return nil +} + +func startReverseProxy(hostname, token string, port uint16, skipTLS bool) error { + target, err := url.Parse(fmt.Sprintf("https://%s", hostname)) + if err != nil { + logger.Error("proxy.Proxy", err, "Error parsing target URL") + return err + } + + // Create custom transport with TLS config + transport := &http.Transport{ + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: skipTLS, + MinVersion: tls.VersionTLS12, + }, + } + + proxy := httputil.NewSingleHostReverseProxy(target) + proxy.Transport = transport + proxy.Director = func(req *http.Request) { + req.URL.Scheme = target.Scheme + req.URL.Host = target.Host + req.Host = target.Host + req.Header.Add("cf-access-token", token) + + // Log the final headers + logger.Debug("proxy.Proxy", "URL: %s", req.URL.String()) + for name, values := range req.Header { + for _, value := range values { + logger.Debug("proxy.Proxy", "Header: %s: %s", name, value) + } + } + } + + server := &http.Server{ + Addr: fmt.Sprintf(":%d", port), + Handler: proxy, + } + + logger.Info("proxy.Proxy", "Starting proxy server on http://localhost%s, forwarding to %s", server.Addr, target.String()) + + err = server.ListenAndServe() + if err != nil && errors.Is(err, syscall.EADDRINUSE) { + randomPort := getRandomPort() + server.Addr = fmt.Sprintf(":%d", randomPort) + logger.Warn("proxy.Proxy", "Port %d in use, retrying with random port http://localhost%s", port, server.Addr) + return server.ListenAndServe() + } + logger.Error("proxy.Proxy", err, "Error starting proxy server") + return err +} + +func getRandomPort() int { + r := rand.New(rand.NewSource(time.Now().UnixNano())) + return r.Intn(1000) + 8000 +} From b75b7cbf44ad03ec53094a4c4de8d90033fe8344 Mon Sep 17 00:00:00 2001 From: sbldevnet Date: Fri, 20 Jun 2025 20:23:12 +0200 Subject: [PATCH 2/9] feat: add support to pass multiple proxies --- cmd/cmd.go | 67 ++++++++++++--- go.mod | 4 +- go.sum | 6 ++ internal/proxy.go | 52 +++++------ main.go | 8 +- pkg/cloudflared/cloudflared.go | 22 ++++- pkg/cloudflared/cloudflared_test.go | 122 ++++++++++++++++++++++++++ pkg/proxy/proxy.go | 129 ++++++++++++++-------------- 8 files changed, 301 insertions(+), 109 deletions(-) create mode 100644 pkg/cloudflared/cloudflared_test.go diff --git a/cmd/cmd.go b/cmd/cmd.go index 6b3bffc..8cf45d6 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -1,16 +1,17 @@ package cmd import ( - "github.com/sbldevnet/cloudflared-proxy/internal" + "fmt" + "strings" + "github.com/sbldevnet/cloudflared-proxy/internal" "github.com/spf13/cobra" ) func Execute() *cobra.Command { var ( - hostname string - port uint16 - skipTLS bool + endpoints []string + skipTLS bool ) cmd := &cobra.Command{ @@ -18,16 +19,57 @@ func Execute() *cobra.Command { Short: "Start a reverse proxy", Long: "Start a reverse proxy to a Cloudflare Access application", RunE: func(cmd *cobra.Command, args []string) error { + var proxyConfigs []internal.ProxyConfig + + for _, endpoint := range endpoints { + parts := strings.Split(endpoint, ":") + if len(parts) == 0 || len(parts) > 3 { + return fmt.Errorf("invalid endpoint format '%s'. Expected format: [LOCAL_PORT:]HOSTNAME[:DEST_PORT]", endpoint) + } + + var hostname string + var localPort uint16 = internal.DefaultLocalPort + var destPort uint16 = internal.DefaultDestinationPort + + switch len(parts) { + // Only hostname provided + case 1: + hostname = parts[0] + + // Two parts could be either LOCAL_PORT:HOSTNAME or HOSTNAME:DEST_PORT + case 2: + // Try to parse first part as local port + if _, err := fmt.Sscanf(parts[0], "%d", &localPort); err == nil { + // First part was a valid port number, so it's LOCAL_PORT:HOSTNAME + hostname = parts[1] + } else { + // First part wasn't a valid port, assume HOSTNAME:DEST_PORT format + if _, err := fmt.Sscanf(parts[1], "%d", &destPort); err != nil { + return fmt.Errorf("invalid destination port '%s': %v", parts[1], err) + } + hostname = parts[0] + } - // From this code I will pass the application to the internal package. + // Full format: LOCAL_PORT:HOSTNAME:DEST_PORT + case 3: + if _, err := fmt.Sscanf(parts[0], "%d", &localPort); err != nil { + return fmt.Errorf("invalid local port '%s': %v", parts[0], err) + } + hostname = parts[1] + if _, err := fmt.Sscanf(parts[2], "%d", &destPort); err != nil { + return fmt.Errorf("invalid destination port '%s': %v", parts[2], err) + } + } - proxyConfig := internal.ProxyConfig{ - Address: hostname, - Port: port, - SkipTLS: skipTLS, + proxyConfigs = append(proxyConfigs, internal.ProxyConfig{ + Hostname: hostname, + DestinationPort: destPort, + LocalPort: localPort, + SkipTLS: skipTLS, + }) } - err := internal.ProxyCFAccess([]internal.ProxyConfig{proxyConfig}) + err := internal.ProxyCFAccess(cmd.Context(), proxyConfigs) if err != nil { return err } @@ -36,11 +78,10 @@ func Execute() *cobra.Command { }, } - cmd.Flags().StringVarP(&hostname, "hostname", "n", "", "Destination hostname to proxy") - cmd.Flags().Uint16VarP(&port, "port", "p", 8888, "Local port to proxy") + cmd.Flags().StringSliceVarP(&endpoints, "endpoints", "e", []string{}, "List of endpoints to proxy in format [LOCAL_PORT:]HOSTNAME[:DEST_PORT]") cmd.Flags().BoolVarP(&skipTLS, "skip-tls", "s", false, "Skip TLS verification") - cmd.MarkFlagRequired("hostname") + cmd.MarkFlagRequired("endpoints") return cmd } diff --git a/go.mod b/go.mod index e72d986..6b5ad32 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.24 require ( github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.9.1 + github.com/stretchr/testify v1.8.4 ) require ( @@ -12,6 +13,7 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/spf13/pflag v1.0.6 // indirect - github.com/stretchr/testify v1.8.4 // indirect + github.com/stretchr/objx v0.5.0 // indirect golang.org/x/sys v0.33.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 08d0e60..6ffd4c8 100644 --- a/go.sum +++ b/go.sum @@ -16,12 +16,18 @@ github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wx github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/internal/proxy.go b/internal/proxy.go index 5df7e6f..eb3eba2 100644 --- a/internal/proxy.go +++ b/internal/proxy.go @@ -1,46 +1,50 @@ package internal import ( + "context" "errors" + "fmt" "github.com/sbldevnet/cloudflared-proxy/pkg/cloudflared" "github.com/sbldevnet/cloudflared-proxy/pkg/logger" "github.com/sbldevnet/cloudflared-proxy/pkg/proxy" ) +const ( + DefaultLocalPort uint16 = 8888 + DefaultDestinationPort uint16 = 443 +) + type ProxyConfig struct { - Address string - Port uint16 - SkipTLS bool + Hostname string + DestinationPort uint16 + LocalPort uint16 + SkipTLS bool } -func ProxyCFAccess(configs []ProxyConfig) error { - - proxyConfigs := make([]proxy.ProxyConfig, len(configs)) +func ProxyCFAccess(ctx context.Context, configs []ProxyConfig) error { + proxyConfigs := make([]proxy.CFAccessProxyConfig, len(configs)) for i, config := range configs { - proxyConfigs[i] = proxy.ProxyConfig{ - Hostname: config.Address, - Port: config.Port, - SkipTLS: config.SkipTLS, - } - } - - for i, proxyConfig := range proxyConfigs { - token, err := cloudflared.GetCloudflareAccessTokenForApp(proxyConfig.Hostname) + token, err := cloudflared.GetCloudflareAccessTokenForApp(config.getAddress()) if err != nil { if errors.Is(err, cloudflared.ErrAccessAppNotFound) { - logger.Warn("proxy.ProxyCFAccess", "Access application not found at %s, continuing without authentication", proxyConfig.Hostname) - continue + logger.Warn("proxy.ProxyCFAccess", "Access application not found at %s, continuing without authentication", config.getAddress()) + } else { + return err } - return err } - proxyConfigs[i].Token = token - } - err := proxy.StartMultipleProxies(proxyConfigs) - if err != nil { - return err + proxyConfigs[i] = proxy.CFAccessProxyConfig{ + Hostname: config.Hostname, + Port: config.LocalPort, + Token: token, + SkipTLS: config.SkipTLS, + } } - return nil + return proxy.StartMultipleProxies(ctx, proxyConfigs) +} + +func (c ProxyConfig) getAddress() string { + return fmt.Sprintf("%s:%d", c.Hostname, c.DestinationPort) } diff --git a/main.go b/main.go index c5d73fa..6d78ada 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,10 @@ package main import ( + "context" "os" + "os/signal" + "syscall" "github.com/sbldevnet/cloudflared-proxy/cmd" ) @@ -9,7 +12,10 @@ import ( func main() { rootCmd := cmd.Execute() - if err := rootCmd.Execute(); err != nil { + ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) + defer stop() + + if err := rootCmd.ExecuteContext(ctx); err != nil { os.Exit(1) } } diff --git a/pkg/cloudflared/cloudflared.go b/pkg/cloudflared/cloudflared.go index 2cb6695..550f389 100644 --- a/pkg/cloudflared/cloudflared.go +++ b/pkg/cloudflared/cloudflared.go @@ -9,6 +9,22 @@ import ( "github.com/sbldevnet/cloudflared-proxy/pkg/logger" ) +// Commander executes a command and returns its combined output. +type Commander interface { + CombinedOutput(name string, arg ...string) ([]byte, error) +} + +// execCommander is the default implementation of Commander that executes real commands. +type execCommander struct{} + +func (c *execCommander) CombinedOutput(name string, arg ...string) ([]byte, error) { + cmd := exec.Command(name, arg...) + return cmd.CombinedOutput() +} + +// cmdr is the command runner used by the package. It can be replaced in tests. +var cmdr Commander = &execCommander{} + const ( accessAppNotFoundMsg = "failed to find Access application" cloudflaredDocURL = "https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation" @@ -17,8 +33,7 @@ const ( var ErrAccessAppNotFound = errors.New("access application not found") func GetCloudflareAccessTokenForApp(url string) (string, error) { - cmd := exec.Command("cloudflared", "access", "login", url) - output, err := cmd.CombinedOutput() + output, err := cmdr.CombinedOutput("cloudflared", "access", "login", url) logger.Debug("cloudflared.GetCloudflareAccessTokenForApp", "executing cloudflared access login command for %s", url) if err != nil { if errors.Is(err, exec.ErrNotFound) { @@ -36,8 +51,7 @@ func GetCloudflareAccessTokenForApp(url string) (string, error) { return "", fmt.Errorf("cloudflared login failed: %s", outputStr) } - cmd = exec.Command("cloudflared", "access", "token", fmt.Sprintf("-app=%s", url)) - output, err = cmd.CombinedOutput() + output, err = cmdr.CombinedOutput("cloudflared", "access", "token", fmt.Sprintf("-app=%s", url)) logger.Debug("cloudflared.GetCloudflareAccessTokenForApp", "executing cloudflared access token command for %s", url) if err != nil { logger.Error("cloudflared.GetCloudflareAccessTokenForApp", err, "cloudflared token failed: %s", string(output)) diff --git a/pkg/cloudflared/cloudflared_test.go b/pkg/cloudflared/cloudflared_test.go new file mode 100644 index 0000000..d5ce72d --- /dev/null +++ b/pkg/cloudflared/cloudflared_test.go @@ -0,0 +1,122 @@ +package cloudflared + +import ( + "errors" + "os/exec" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +// MockCommander is a mock for the Commander interface. +type MockCommander struct { + mock.Mock +} + +// CombinedOutput is the mock implementation that allows us to fake the command execution. +func (m *MockCommander) CombinedOutput(name string, arg ...string) ([]byte, error) { + // The arguments passed to `On` and `AssertCalled` must match the + // arguments passed to the method. + // Because `arg` is a variadic parameter, we need to handle it carefully. + // We convert it to a slice of `any` to pass to `m.Called`. + args := make([]any, len(arg)+1) + args[0] = name + for i, v := range arg { + args[i+1] = v + } + ret := m.Called(args...) + + // Handle the return values. + // The first return value can be nil if an error is returned. + var r0 []byte + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + + return r0, ret.Error(1) +} + +func TestGetCloudflareAccessTokenForAppWithMock(t *testing.T) { + // Save the original commander and restore it after the test. + originalCmdr := cmdr + t.Cleanup(func() { + cmdr = originalCmdr + }) + + t.Run("success", func(t *testing.T) { + mockCmdr := new(MockCommander) + cmdr = mockCmdr + + // Expect the login command to be called and return success (nil error). + mockCmdr.On("CombinedOutput", "cloudflared", "access", "login", "app.example.com").Return([]byte(""), nil) + // Expect the token command to be called and return a mock token. + mockCmdr.On("CombinedOutput", "cloudflared", "access", "token", "-app=app.example.com").Return([]byte("mock-token"), nil) + + token, err := GetCloudflareAccessTokenForApp("app.example.com") + + assert.NoError(t, err) + assert.Equal(t, "mock-token", token) + mockCmdr.AssertExpectations(t) + }) + + t.Run("cloudflared not installed", func(t *testing.T) { + mockCmdr := new(MockCommander) + cmdr = mockCmdr + + // Expect the login command to fail with exec.ErrNotFound. + mockCmdr.On("CombinedOutput", "cloudflared", "access", "login", "app.example.com/not-installed").Return(nil, exec.ErrNotFound) + + _, err := GetCloudflareAccessTokenForApp("app.example.com/not-installed") + + assert.Error(t, err) + assert.Contains(t, err.Error(), "cloudflared is not installed") + mockCmdr.AssertExpectations(t) + }) + + t.Run("access app not found", func(t *testing.T) { + mockCmdr := new(MockCommander) + cmdr = mockCmdr + + // Expect the login command to fail with the specific error message. + errOutput := []byte(accessAppNotFoundMsg) + mockCmdr.On("CombinedOutput", "cloudflared", "access", "login", "app.example.com/not-found").Return(errOutput, errors.New("exit status 1")) + + _, err := GetCloudflareAccessTokenForApp("app.example.com/not-found") + + assert.Error(t, err) + assert.Equal(t, ErrAccessAppNotFound, err) + mockCmdr.AssertExpectations(t) + }) + + t.Run("login fails", func(t *testing.T) { + mockCmdr := new(MockCommander) + cmdr = mockCmdr + + errOutput := []byte("some generic login error") + mockCmdr.On("CombinedOutput", "cloudflared", "access", "login", "app.example.com/login-fails").Return(errOutput, errors.New("exit status 1")) + + _, err := GetCloudflareAccessTokenForApp("app.example.com/login-fails") + + assert.Error(t, err) + assert.Contains(t, err.Error(), "cloudflared login failed: some generic login error") + mockCmdr.AssertExpectations(t) + }) + + t.Run("token fails", func(t *testing.T) { + mockCmdr := new(MockCommander) + cmdr = mockCmdr + + // Expect the login command to succeed. + mockCmdr.On("CombinedOutput", "cloudflared", "access", "login", "app.example.com/token-fails").Return([]byte(""), nil) + // Expect the token command to fail. + errOutput := []byte("some generic token error") + mockCmdr.On("CombinedOutput", "cloudflared", "access", "token", "-app=app.example.com/token-fails").Return(errOutput, errors.New("exit status 1")) + + _, err := GetCloudflareAccessTokenForApp("app.example.com/token-fails") + + assert.Error(t, err) + assert.Contains(t, err.Error(), "cloudflared token failed: some generic token error") + mockCmdr.AssertExpectations(t) + }) +} diff --git a/pkg/proxy/proxy.go b/pkg/proxy/proxy.go index a9fa0cd..57f02a7 100644 --- a/pkg/proxy/proxy.go +++ b/pkg/proxy/proxy.go @@ -1,6 +1,7 @@ package proxy import ( + "context" "crypto/tls" "errors" "fmt" @@ -15,100 +16,96 @@ import ( "github.com/sbldevnet/cloudflared-proxy/pkg/logger" ) -type ProxyConfig struct { +const ( + randomPortRange = 1000 + randomPortStart = 8000 +) + +type CFAccessProxyConfig struct { Hostname string Token string Port uint16 SkipTLS bool } -func StartMultipleProxies(configs []ProxyConfig) error { +func StartMultipleProxies(ctx context.Context, configs []CFAccessProxyConfig) error { if len(configs) == 0 { return errors.New("no proxy configurations provided") } - // Multiple proxies, run them concurrently + var servers []*http.Server var wg sync.WaitGroup - errChan := make(chan error, len(configs)) for _, cfg := range configs { - wg.Add(1) - go func(config ProxyConfig) { - defer wg.Done() - if err := startReverseProxy(config.Hostname, config.Token, config.Port, config.SkipTLS); err != nil { - errChan <- fmt.Errorf("proxy for %s:%d failed: %w", config.Hostname, config.Port, err) - } - }(cfg) - } + proxyConfig := cfg // Capture range variable + target, err := url.Parse(fmt.Sprintf("https://%s", proxyConfig.Hostname)) + if err != nil { + logger.Error("proxy.Proxy", err, "Error parsing target URL for %s, skipping", proxyConfig.Hostname) + continue + } - // Wait for all proxies to complete - wg.Wait() - close(errChan) + transport := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: proxyConfig.SkipTLS, MinVersion: tls.VersionTLS12}, + } - // Check for any errors - var errors []error - for err := range errChan { - errors = append(errors, err) - } + proxy := httputil.NewSingleHostReverseProxy(target) + proxy.Transport = transport + proxy.Director = func(req *http.Request) { + req.URL.Scheme = target.Scheme + req.URL.Host = target.Host + req.Host = target.Host + req.Header.Add("cf-access-token", proxyConfig.Token) + logger.Debug("proxy.Proxy", "URL: %s", req.URL.String()) + } - if len(errors) > 0 { - return fmt.Errorf("some proxies failed: %v", errors) - } + server := &http.Server{ + Addr: fmt.Sprintf(":%d", proxyConfig.Port), + Handler: proxy, + } + servers = append(servers, server) - return nil -} + wg.Add(1) + go func() { + defer wg.Done() + logger.Info("proxy.Proxy", "Starting proxy server on http://localhost%s, forwarding to %s", server.Addr, target.String()) -func startReverseProxy(hostname, token string, port uint16, skipTLS bool) error { - target, err := url.Parse(fmt.Sprintf("https://%s", hostname)) - if err != nil { - logger.Error("proxy.Proxy", err, "Error parsing target URL") - return err - } + err := server.ListenAndServe() - // Create custom transport with TLS config - transport := &http.Transport{ - TLSClientConfig: &tls.Config{ - InsecureSkipVerify: skipTLS, - MinVersion: tls.VersionTLS12, - }, - } + // If the error is that the port is in use, try again with a random port. + if err != nil && errors.Is(err, syscall.EADDRINUSE) { + randomPort := getRandomPort() + logger.Warn("proxy.Proxy", "Port %d for target %s is in use. Retrying on port %d", proxyConfig.Port, target.String(), randomPort) + server.Addr = fmt.Sprintf(":%d", randomPort) + err = server.ListenAndServe() // Retry + } - proxy := httputil.NewSingleHostReverseProxy(target) - proxy.Transport = transport - proxy.Director = func(req *http.Request) { - req.URL.Scheme = target.Scheme - req.URL.Host = target.Host - req.Host = target.Host - req.Header.Add("cf-access-token", token) - - // Log the final headers - logger.Debug("proxy.Proxy", "URL: %s", req.URL.String()) - for name, values := range req.Header { - for _, value := range values { - logger.Debug("proxy.Proxy", "Header: %s: %s", name, value) + if err != nil && !errors.Is(err, http.ErrServerClosed) { + logger.Error("proxy.Proxy", err, "Proxy for %s failed to start", proxyConfig.Hostname) } - } + }() } - server := &http.Server{ - Addr: fmt.Sprintf(":%d", port), - Handler: proxy, - } + logger.Info("proxy.Proxy", "Press CTRL+C to stop.") + + // Wait for shutdown signal + <-ctx.Done() + logger.Info("proxy.Proxy", "Shutdown signal received, gracefully shutting down servers...") - logger.Info("proxy.Proxy", "Starting proxy server on http://localhost%s, forwarding to %s", server.Addr, target.String()) + shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() - err = server.ListenAndServe() - if err != nil && errors.Is(err, syscall.EADDRINUSE) { - randomPort := getRandomPort() - server.Addr = fmt.Sprintf(":%d", randomPort) - logger.Warn("proxy.Proxy", "Port %d in use, retrying with random port http://localhost%s", port, server.Addr) - return server.ListenAndServe() + for _, s := range servers { + if err := s.Shutdown(shutdownCtx); err != nil { + logger.Error("proxy.Proxy", err, "Failed to gracefully shut down server at %s", s.Addr) + } } - logger.Error("proxy.Proxy", err, "Error starting proxy server") - return err + + wg.Wait() + logger.Info("proxy.Proxy", "All proxies have been shut down.") + return nil } func getRandomPort() int { r := rand.New(rand.NewSource(time.Now().UnixNano())) - return r.Intn(1000) + 8000 + return r.Intn(randomPortRange) + randomPortStart } From bb52e7b221fd4b48604f737a858d7fd435873a83 Mon Sep 17 00:00:00 2001 From: sbldevnet Date: Sat, 21 Jun 2025 11:24:40 +0200 Subject: [PATCH 3/9] feat: add tests --- cmd/cmd.go | 76 ++++--------- internal/config/parser.go | 65 +++++++++++ internal/config/parser_test.go | 89 +++++++++++++++ internal/proxy.go | 38 +++---- pkg/logger/logger_test.go | 79 +++++++++++++ pkg/proxy/proxy.go | 84 +++++++++----- pkg/proxy/proxy_test.go | 202 +++++++++++++++++++++++++++++++++ 7 files changed, 528 insertions(+), 105 deletions(-) create mode 100644 internal/config/parser.go create mode 100644 internal/config/parser_test.go create mode 100644 pkg/logger/logger_test.go create mode 100644 pkg/proxy/proxy_test.go diff --git a/cmd/cmd.go b/cmd/cmd.go index 8cf45d6..ad3d575 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -1,72 +1,44 @@ package cmd import ( - "fmt" - "strings" - "github.com/sbldevnet/cloudflared-proxy/internal" + "github.com/sbldevnet/cloudflared-proxy/internal/config" "github.com/spf13/cobra" ) func Execute() *cobra.Command { - var ( - endpoints []string - skipTLS bool - ) cmd := &cobra.Command{ Use: "cfproxy", - Short: "Start a reverse proxy", - Long: "Start a reverse proxy to a Cloudflare Access application", - RunE: func(cmd *cobra.Command, args []string) error { - var proxyConfigs []internal.ProxyConfig + Short: "A reverse proxy tool for Cloudflare Access applications.", + } - for _, endpoint := range endpoints { - parts := strings.Split(endpoint, ":") - if len(parts) == 0 || len(parts) > 3 { - return fmt.Errorf("invalid endpoint format '%s'. Expected format: [LOCAL_PORT:]HOSTNAME[:DEST_PORT]", endpoint) - } + cmd.AddCommand(Run()) + cmd.AddCommand(Version()) - var hostname string - var localPort uint16 = internal.DefaultLocalPort - var destPort uint16 = internal.DefaultDestinationPort + return cmd +} - switch len(parts) { - // Only hostname provided - case 1: - hostname = parts[0] +func Run() *cobra.Command { + var ( + endpoints []string + skipTLS bool + ) - // Two parts could be either LOCAL_PORT:HOSTNAME or HOSTNAME:DEST_PORT - case 2: - // Try to parse first part as local port - if _, err := fmt.Sscanf(parts[0], "%d", &localPort); err == nil { - // First part was a valid port number, so it's LOCAL_PORT:HOSTNAME - hostname = parts[1] - } else { - // First part wasn't a valid port, assume HOSTNAME:DEST_PORT format - if _, err := fmt.Sscanf(parts[1], "%d", &destPort); err != nil { - return fmt.Errorf("invalid destination port '%s': %v", parts[1], err) - } - hostname = parts[0] - } + cmd := &cobra.Command{ + Use: "run", + Short: "Start reverse proxies", + Long: "Start reverse proxies to Cloudflare Access applications", + RunE: func(cmd *cobra.Command, args []string) error { + proxyConfigs := make([]config.ProxyConfig, len(endpoints)) - // Full format: LOCAL_PORT:HOSTNAME:DEST_PORT - case 3: - if _, err := fmt.Sscanf(parts[0], "%d", &localPort); err != nil { - return fmt.Errorf("invalid local port '%s': %v", parts[0], err) - } - hostname = parts[1] - if _, err := fmt.Sscanf(parts[2], "%d", &destPort); err != nil { - return fmt.Errorf("invalid destination port '%s': %v", parts[2], err) - } + for i, endpoint := range endpoints { + proxy, err := config.ParseProxyString(endpoint) + if err != nil { + return err } - - proxyConfigs = append(proxyConfigs, internal.ProxyConfig{ - Hostname: hostname, - DestinationPort: destPort, - LocalPort: localPort, - SkipTLS: skipTLS, - }) + proxy.SkipTLS = skipTLS + proxyConfigs[i] = *proxy } err := internal.ProxyCFAccess(cmd.Context(), proxyConfigs) diff --git a/internal/config/parser.go b/internal/config/parser.go new file mode 100644 index 0000000..0a22320 --- /dev/null +++ b/internal/config/parser.go @@ -0,0 +1,65 @@ +package config + +import ( + "fmt" + "strings" +) + +const ( + DefaultLocalPort uint16 = 8080 + DefaultDestinationPort uint16 = 443 +) + +type ProxyConfig struct { + Hostname string + DestinationPort uint16 + LocalPort uint16 + SkipTLS bool +} + +// ParseProxyString parses a string representation of a proxy endpoint +// into a ProxyConfig struct. The format is [LOCAL_PORT:]HOSTNAME[:DEST_PORT]. +func ParseProxyString(endpoint string) (*ProxyConfig, error) { + parts := strings.Split(endpoint, ":") + if len(parts) == 0 || len(parts) > 3 { + return nil, fmt.Errorf("invalid endpoint format '%s'. Expected format: [LOCAL_PORT:]HOSTNAME[:DEST_PORT]", endpoint) + } + + var hostname string + var localPort = DefaultLocalPort + var destPort = DefaultDestinationPort + + switch len(parts) { + case 1: // Only hostname provided + hostname = parts[0] + case 2: // Two parts could be either LOCAL_PORT:HOSTNAME or HOSTNAME:DEST_PORT + // Try to parse first part as local port + if _, err := fmt.Sscanf(parts[0], "%d", &localPort); err == nil { + hostname = parts[1] + } else { // Assume HOSTNAME:DEST_PORT + if _, err := fmt.Sscanf(parts[1], "%d", &destPort); err != nil { + return nil, fmt.Errorf("invalid destination port '%s': %v", parts[1], err) + } + hostname = parts[0] + } + case 3: // Full format: LOCAL_PORT:HOSTNAME:DEST_PORT + if _, err := fmt.Sscanf(parts[0], "%d", &localPort); err != nil { + return nil, fmt.Errorf("invalid local port '%s': %v", parts[0], err) + } + hostname = parts[1] + if _, err := fmt.Sscanf(parts[2], "%d", &destPort); err != nil { + return nil, fmt.Errorf("invalid destination port '%s': %v", parts[2], err) + } + } + + return &ProxyConfig{ + Hostname: hostname, + LocalPort: localPort, + DestinationPort: destPort, + }, nil +} + +// GetAddress returns the full address of the target application. +func (c *ProxyConfig) GetAddress() string { + return fmt.Sprintf("%s:%d", c.Hostname, c.DestinationPort) +} diff --git a/internal/config/parser_test.go b/internal/config/parser_test.go new file mode 100644 index 0000000..c711b7a --- /dev/null +++ b/internal/config/parser_test.go @@ -0,0 +1,89 @@ +package config + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestParseProxyString(t *testing.T) { + testCases := []struct { + name string + endpoint string + expectedConfig *ProxyConfig + expectedErr error + }{ + { + name: "hostname only", + endpoint: "myapp.example.com", + expectedConfig: &ProxyConfig{ + Hostname: "myapp.example.com", + LocalPort: DefaultLocalPort, + DestinationPort: DefaultDestinationPort, + }, + }, + { + name: "local port and hostname", + endpoint: "9000:myapp.example.com", + expectedConfig: &ProxyConfig{ + Hostname: "myapp.example.com", + LocalPort: 9000, + DestinationPort: DefaultDestinationPort, + }, + }, + { + name: "hostname and destination port", + endpoint: "myapp.example.com:8443", + expectedConfig: &ProxyConfig{ + Hostname: "myapp.example.com", + LocalPort: DefaultLocalPort, + DestinationPort: 8443, + }, + }, + { + name: "full format", + endpoint: "9000:myapp.example.com:8443", + expectedConfig: &ProxyConfig{ + Hostname: "myapp.example.com", + LocalPort: 9000, + DestinationPort: 8443, + }, + }, + { + name: "invalid format - too many parts", + endpoint: "1:2:3:4", + expectedErr: fmt.Errorf("invalid endpoint format '1:2:3:4'. Expected format: [LOCAL_PORT:]HOSTNAME[:DEST_PORT]"), + }, + { + name: "invalid format - empty string", + endpoint: "", + expectedErr: fmt.Errorf("invalid endpoint format ''. Expected format: [LOCAL_PORT:]HOSTNAME[:DEST_PORT]"), + }, + { + name: "invalid local port", + endpoint: "abc:host:123", + expectedErr: fmt.Errorf("invalid local port 'abc': input does not match format"), + }, + { + name: "invalid destination port", + endpoint: "host:abc", + expectedErr: fmt.Errorf("invalid destination port 'abc': input does not match format"), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + config, err := ParseProxyString(tc.endpoint) + + if tc.expectedErr != nil { + assert.Error(t, err) + // Check for a prefix of the error message because the Sscanf error can vary. + assert.Contains(t, err.Error(), tc.expectedErr.Error()) + } else { + assert.NoError(t, err) + assert.Equal(t, tc.expectedConfig, config) + } + }) + } +} diff --git a/internal/proxy.go b/internal/proxy.go index eb3eba2..9ef4280 100644 --- a/internal/proxy.go +++ b/internal/proxy.go @@ -4,47 +4,39 @@ import ( "context" "errors" "fmt" + "net/url" + "github.com/sbldevnet/cloudflared-proxy/internal/config" "github.com/sbldevnet/cloudflared-proxy/pkg/cloudflared" "github.com/sbldevnet/cloudflared-proxy/pkg/logger" "github.com/sbldevnet/cloudflared-proxy/pkg/proxy" ) -const ( - DefaultLocalPort uint16 = 8888 - DefaultDestinationPort uint16 = 443 -) - -type ProxyConfig struct { - Hostname string - DestinationPort uint16 - LocalPort uint16 - SkipTLS bool -} - -func ProxyCFAccess(ctx context.Context, configs []ProxyConfig) error { +func ProxyCFAccess(ctx context.Context, configs []config.ProxyConfig) error { proxyConfigs := make([]proxy.CFAccessProxyConfig, len(configs)) for i, config := range configs { - token, err := cloudflared.GetCloudflareAccessTokenForApp(config.getAddress()) + token, err := cloudflared.GetCloudflareAccessTokenForApp(config.GetAddress()) if err != nil { if errors.Is(err, cloudflared.ErrAccessAppNotFound) { - logger.Warn("proxy.ProxyCFAccess", "Access application not found at %s, continuing without authentication", config.getAddress()) + logger.Warn("proxy.ProxyCFAccess", "Access application not found at %s, continuing without authentication", config.GetAddress()) } else { return err } } + url, err := url.Parse(fmt.Sprintf("https://%s", config.GetAddress())) + if err != nil { + logger.Error("proxy.ProxyCFAccess", err, "Error parsing target URL for %s, skipping", config.GetAddress()) + return err + } + proxyConfigs[i] = proxy.CFAccessProxyConfig{ - Hostname: config.Hostname, - Port: config.LocalPort, - Token: token, - SkipTLS: config.SkipTLS, + Url: url, + LocalPort: config.LocalPort, + Token: token, + SkipTLS: config.SkipTLS, } } return proxy.StartMultipleProxies(ctx, proxyConfigs) } - -func (c ProxyConfig) getAddress() string { - return fmt.Sprintf("%s:%d", c.Hostname, c.DestinationPort) -} diff --git a/pkg/logger/logger_test.go b/pkg/logger/logger_test.go new file mode 100644 index 0000000..db6e6c1 --- /dev/null +++ b/pkg/logger/logger_test.go @@ -0,0 +1,79 @@ +package logger_test + +import ( + "bytes" + "errors" + "os" + "testing" + + "github.com/sbldevnet/cloudflared-proxy/pkg/logger" + + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" +) + +func captureLogOutput(f func()) string { + var buf bytes.Buffer + log.SetOutput(&buf) + savedLevel := log.GetLevel() + log.SetLevel(log.TraceLevel) // Ensure all levels are captured + defer func() { + log.SetOutput(os.Stderr) // Restore default output + log.SetLevel(savedLevel) // Restore log level + }() + + f() + return buf.String() +} + +func TestLoggerLevels(t *testing.T) { + funcName := "TestFunction" + const msg = "test message" + testErr := errors.New("test error") + + t.Run("Trace", func(t *testing.T) { + output := captureLogOutput(func() { + logger.Trace(funcName, "%v", msg) + }) + assert.Contains(t, output, "level=trace") + assert.Contains(t, output, "function=TestFunction") + assert.Contains(t, output, msg) + }) + + t.Run("Debug", func(t *testing.T) { + output := captureLogOutput(func() { + logger.Debug(funcName, "%v", msg) + }) + assert.Contains(t, output, "level=debug") + assert.Contains(t, output, "function=TestFunction") + assert.Contains(t, output, msg) + }) + + t.Run("Info", func(t *testing.T) { + output := captureLogOutput(func() { + logger.Info(funcName, "%v", msg) + }) + assert.Contains(t, output, "level=info") + assert.Contains(t, output, "function=TestFunction") + assert.Contains(t, output, msg) + }) + + t.Run("Warn", func(t *testing.T) { + output := captureLogOutput(func() { + logger.Warn(funcName, "%v", msg) + }) + assert.Contains(t, output, "level=warn") + assert.Contains(t, output, "function=TestFunction") + assert.Contains(t, output, msg) + }) + + t.Run("Error", func(t *testing.T) { + output := captureLogOutput(func() { + logger.Error(funcName, testErr, msg) + }) + assert.Contains(t, output, "level=error") + assert.Contains(t, output, "function=TestFunction") + assert.Contains(t, output, "error=\"test error\"") + assert.Contains(t, output, msg) + }) +} diff --git a/pkg/proxy/proxy.go b/pkg/proxy/proxy.go index 57f02a7..1a22943 100644 --- a/pkg/proxy/proxy.go +++ b/pkg/proxy/proxy.go @@ -16,16 +16,55 @@ import ( "github.com/sbldevnet/cloudflared-proxy/pkg/logger" ) +// Server defines the behavior of a server that can be started and shut down. +type Server interface { + ListenAndServe() error + Shutdown(ctx context.Context) error + HTTPServer() *http.Server +} + +// httpServer is a wrapper around http.Server that implements the Server interface. +type httpServer struct { + *http.Server +} + +// HTTPServer returns the underlying http.Server. +func (s *httpServer) HTTPServer() *http.Server { + return s.Server +} + +// newServer is a constructor that can be replaced in tests. +var newServer = func(addr string, handler http.Handler) Server { + return &httpServer{ + &http.Server{ + Addr: addr, + Handler: handler, + }, + } +} + const ( randomPortRange = 1000 randomPortStart = 8000 ) +func newDirector(config CFAccessProxyConfig) func(*http.Request) { + return func(req *http.Request) { + req.URL.Scheme = config.Url.Scheme + req.URL.Host = config.Url.Host + req.Host = config.Url.Host + req.Header.Add("cf-access-token", config.Token) + + // Debug requests through the proxy + logger.Debug("proxy.Proxy", "Request to localhost:%d, URL: %s, Headers: %v", config.LocalPort, req.URL, req.Header) + } +} + type CFAccessProxyConfig struct { - Hostname string - Token string - Port uint16 - SkipTLS bool + Url *url.URL + Token string + LocalPort uint16 // change to local port + SkipTLS bool } func StartMultipleProxies(ctx context.Context, configs []CFAccessProxyConfig) error { @@ -33,54 +72,39 @@ func StartMultipleProxies(ctx context.Context, configs []CFAccessProxyConfig) er return errors.New("no proxy configurations provided") } - var servers []*http.Server + var servers []Server var wg sync.WaitGroup - for _, cfg := range configs { - proxyConfig := cfg // Capture range variable - target, err := url.Parse(fmt.Sprintf("https://%s", proxyConfig.Hostname)) - if err != nil { - logger.Error("proxy.Proxy", err, "Error parsing target URL for %s, skipping", proxyConfig.Hostname) - continue - } + for _, proxyConfig := range configs { transport := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: proxyConfig.SkipTLS, MinVersion: tls.VersionTLS12}, } - proxy := httputil.NewSingleHostReverseProxy(target) + proxy := httputil.NewSingleHostReverseProxy(proxyConfig.Url) proxy.Transport = transport - proxy.Director = func(req *http.Request) { - req.URL.Scheme = target.Scheme - req.URL.Host = target.Host - req.Host = target.Host - req.Header.Add("cf-access-token", proxyConfig.Token) - logger.Debug("proxy.Proxy", "URL: %s", req.URL.String()) - } + proxy.Director = newDirector(proxyConfig) - server := &http.Server{ - Addr: fmt.Sprintf(":%d", proxyConfig.Port), - Handler: proxy, - } + server := newServer(fmt.Sprintf(":%d", proxyConfig.LocalPort), proxy) servers = append(servers, server) wg.Add(1) go func() { defer wg.Done() - logger.Info("proxy.Proxy", "Starting proxy server on http://localhost%s, forwarding to %s", server.Addr, target.String()) + logger.Info("proxy.Proxy", "Starting proxy server on http://localhost:%d, forwarding to %s", proxyConfig.LocalPort, proxyConfig.Url.String()) err := server.ListenAndServe() // If the error is that the port is in use, try again with a random port. if err != nil && errors.Is(err, syscall.EADDRINUSE) { randomPort := getRandomPort() - logger.Warn("proxy.Proxy", "Port %d for target %s is in use. Retrying on port %d", proxyConfig.Port, target.String(), randomPort) - server.Addr = fmt.Sprintf(":%d", randomPort) + logger.Warn("proxy.Proxy", "Port %d for target %s is in use. Retrying on port %d", proxyConfig.LocalPort, proxyConfig.Url.String(), randomPort) + server.HTTPServer().Addr = fmt.Sprintf(":%d", randomPort) err = server.ListenAndServe() // Retry } if err != nil && !errors.Is(err, http.ErrServerClosed) { - logger.Error("proxy.Proxy", err, "Proxy for %s failed to start", proxyConfig.Hostname) + logger.Error("proxy.Proxy", err, "Proxy for %s failed to start", proxyConfig.Url.String()) } }() } @@ -96,7 +120,7 @@ func StartMultipleProxies(ctx context.Context, configs []CFAccessProxyConfig) er for _, s := range servers { if err := s.Shutdown(shutdownCtx); err != nil { - logger.Error("proxy.Proxy", err, "Failed to gracefully shut down server at %s", s.Addr) + logger.Error("proxy.Proxy", err, "Failed to gracefully shut down server at %s", s.HTTPServer().Addr) } } @@ -105,7 +129,7 @@ func StartMultipleProxies(ctx context.Context, configs []CFAccessProxyConfig) er return nil } -func getRandomPort() int { +var getRandomPort = func() int { r := rand.New(rand.NewSource(time.Now().UnixNano())) return r.Intn(randomPortRange) + randomPortStart } diff --git a/pkg/proxy/proxy_test.go b/pkg/proxy/proxy_test.go new file mode 100644 index 0000000..1b43e70 --- /dev/null +++ b/pkg/proxy/proxy_test.go @@ -0,0 +1,202 @@ +package proxy + +import ( + "context" + "errors" + "net/http" + "net/http/httptest" + "net/url" + "sync" + "syscall" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +type MockServer struct { + mock.Mock +} + +func (m *MockServer) ListenAndServe() error { + args := m.Called() + return args.Error(0) +} + +func (m *MockServer) Shutdown(ctx context.Context) error { + args := m.Called(ctx) + return args.Error(0) +} + +func (m *MockServer) HTTPServer() *http.Server { + args := m.Called() + if server, ok := args.Get(0).(*http.Server); ok { + // Return a copy to avoid race conditions on the Addr field + return &http.Server{Addr: server.Addr} + } + return nil +} + +// TestNewDirector validates that the director function is configured correctly. +func TestNewDirector(t *testing.T) { + targetURL, _ := url.Parse("https://app.example.com") + config := CFAccessProxyConfig{ + Url: targetURL, + Token: "test-token", + } + + director := newDirector(config) + + // Create a sample request to test the director + req := httptest.NewRequest("GET", "http://localhost:8080/", nil) + director(req) // Apply the director logic to the request + + // Assert that the request was modified as expected + assert.Equal(t, "https://app.example.com/", req.URL.String()) + assert.Equal(t, "app.example.com", req.Host) + assert.Equal(t, "test-token", req.Header.Get("cf-access-token")) +} + +func TestStartMultipleProxies(t *testing.T) { + // Backup and restore original functions + originalNewServer := newServer + originalGetRandomPort := getRandomPort + t.Cleanup(func() { + newServer = originalNewServer + getRandomPort = originalGetRandomPort + }) + + t.Run("no proxy configs", func(t *testing.T) { + err := StartMultipleProxies(context.Background(), []CFAccessProxyConfig{}) + assert.EqualError(t, err, "no proxy configurations provided") + }) + + t.Run("invalid hostname with other valid hostnames", func(t *testing.T) { + var serverCreationCount int + newServer = func(addr string, handler http.Handler) Server { + serverCreationCount++ + mockSrvr := new(MockServer) + mockSrvr.On("ListenAndServe").Return(http.ErrServerClosed) + mockSrvr.On("Shutdown", mock.Anything).Return(nil) + mockSrvr.On("HTTPServer").Return(&http.Server{Addr: addr}) + return mockSrvr + } + + ctx, cancel := context.WithCancel(context.Background()) + u1, _ := url.Parse("https://app.example.com") + u2, _ := url.Parse("https://app2.example.com") + configs := []CFAccessProxyConfig{ + {Url: u1, LocalPort: 8080}, + {Url: u2, LocalPort: 8082}, + } + + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + StartMultipleProxies(ctx, configs) + }() + + time.Sleep(100 * time.Millisecond) + cancel() + wg.Wait() + + assert.Equal(t, 2, serverCreationCount, "should create two servers for the valid hostnames") + }) + + t.Run("successful startup and shutdown", func(t *testing.T) { + mockSrvr := new(MockServer) + newServer = func(addr string, handler http.Handler) Server { + return mockSrvr + } + + ctx, cancel := context.WithCancel(context.Background()) + u, _ := url.Parse("https://app.example.com") + configs := []CFAccessProxyConfig{ + {Url: u, LocalPort: 8080}, + } + + mockSrvr.On("ListenAndServe").Return(http.ErrServerClosed).Once() + mockSrvr.On("Shutdown", mock.Anything).Return(nil).Once() + // mockSrvr.On("HTTPServer").Return(&http.Server{Addr: ":8080"}).Maybe() + + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + err := StartMultipleProxies(ctx, configs) + assert.NoError(t, err) + }() + + time.Sleep(100 * time.Millisecond) + cancel() + wg.Wait() + + mockSrvr.AssertExpectations(t) + }) + + t.Run("port in use with successful retry", func(t *testing.T) { + mockSrvr := new(MockServer) + newServer = func(addr string, handler http.Handler) Server { + return mockSrvr + } + getRandomPort = func() int { return 9090 } + + ctx, cancel := context.WithCancel(context.Background()) + u, _ := url.Parse("https://app.example.com") + configs := []CFAccessProxyConfig{ + {Url: u, LocalPort: 8080}, + } + + mockSrvr.On("ListenAndServe").Return(syscall.EADDRINUSE).Once() + mockSrvr.On("ListenAndServe").Return(http.ErrServerClosed).Once() + mockSrvr.On("Shutdown", mock.Anything).Return(nil).Once() + mockSrvr.On("HTTPServer").Return(&http.Server{Addr: ":8080"}).Maybe() + + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + err := StartMultipleProxies(ctx, configs) + assert.NoError(t, err) + }() + + time.Sleep(100 * time.Millisecond) + cancel() + wg.Wait() + + mockSrvr.AssertExpectations(t) + }) + + t.Run("listen and serve fails with generic error", func(t *testing.T) { + mockSrvr := new(MockServer) + newServer = func(addr string, handler http.Handler) Server { + return mockSrvr + } + + ctx, cancel := context.WithCancel(context.Background()) + u, _ := url.Parse("https://app.example.com") + configs := []CFAccessProxyConfig{ + {Url: u, LocalPort: 8080}, + } + + genericError := errors.New("a generic error") + mockSrvr.On("ListenAndServe").Return(genericError).Once() + mockSrvr.On("Shutdown", mock.Anything).Return(nil).Once() + + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + err := StartMultipleProxies(ctx, configs) + assert.NoError(t, err) + }() + + time.Sleep(100 * time.Millisecond) + cancel() + wg.Wait() + + mockSrvr.AssertExpectations(t) + }) +} From 4c5a2ce1c09cca8772dd1d9b248361a142e5c8a7 Mon Sep 17 00:00:00 2001 From: sbldevnet Date: Sat, 21 Jun 2025 12:52:35 +0200 Subject: [PATCH 4/9] feat: add support for configuration file --- cmd/cmd.go | 79 ++++++++++++++++--- config.example.yaml | 13 +++ go.mod | 16 +++- go.sum | 49 ++++++++++-- internal/config/{parser.go => config.go} | 40 ++++++++-- .../config/{parser_test.go => config_test.go} | 50 ++++++++++-- 6 files changed, 214 insertions(+), 33 deletions(-) create mode 100644 config.example.yaml rename internal/config/{parser.go => config.go} (61%) rename internal/config/{parser_test.go => config_test.go} (59%) diff --git a/cmd/cmd.go b/cmd/cmd.go index ad3d575..e261eb7 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -1,9 +1,16 @@ package cmd import ( + "fmt" + "os" + "path/filepath" + "github.com/sbldevnet/cloudflared-proxy/internal" "github.com/sbldevnet/cloudflared-proxy/internal/config" + "github.com/sbldevnet/cloudflared-proxy/pkg/logger" + "github.com/spf13/cobra" + "github.com/spf13/viper" ) func Execute() *cobra.Command { @@ -23,25 +30,48 @@ func Run() *cobra.Command { var ( endpoints []string skipTLS bool + cfgFile string ) cmd := &cobra.Command{ Use: "run", Short: "Start reverse proxies", Long: "Start reverse proxies to Cloudflare Access applications", + PersistentPreRunE: func(cmd *cobra.Command, args []string) error { + return initConfig(cfgFile) + }, RunE: func(cmd *cobra.Command, args []string) error { - proxyConfigs := make([]config.ProxyConfig, len(endpoints)) + if len(endpoints) == 0 && !viper.IsSet("proxies") { + cmd.Help() + return nil + } + + if len(endpoints) > 0 && viper.IsSet("proxies") { + return fmt.Errorf("cannot specify endpoints via flags when a config file is used") + } + + var proxyConfigs []config.ProxyConfig - for i, endpoint := range endpoints { - proxy, err := config.ParseProxyString(endpoint) - if err != nil { - return err + if len(endpoints) > 0 { + proxyConfigs = make([]config.ProxyConfig, len(endpoints)) + for i, endpoint := range endpoints { + proxy, err := config.ParseEndpointString(endpoint) + if err != nil { + return err + } + proxy.SkipTLS = skipTLS + proxyConfigs[i] = *proxy + } + } else { + var cfg config.Config + if err := viper.Unmarshal(&cfg); err != nil { + return fmt.Errorf("unable to decode into struct, %v", err) } - proxy.SkipTLS = skipTLS - proxyConfigs[i] = *proxy + proxyConfigs = cfg.Proxies + config.SetDefaults(proxyConfigs) } - err := internal.ProxyCFAccess(cmd.Context(), proxyConfigs) + err := internal.ProxyCFAccess(cmd.Context(), proxyConfigs, internal.NewLiveProxyService()) if err != nil { return err } @@ -50,10 +80,39 @@ func Run() *cobra.Command { }, } + cmd.Flags().StringVarP(&cfgFile, "config", "c", "", "config file (default is $HOME/.config/cloudflared-proxy/config.yaml)") cmd.Flags().StringSliceVarP(&endpoints, "endpoints", "e", []string{}, "List of endpoints to proxy in format [LOCAL_PORT:]HOSTNAME[:DEST_PORT]") cmd.Flags().BoolVarP(&skipTLS, "skip-tls", "s", false, "Skip TLS verification") - cmd.MarkFlagRequired("endpoints") - return cmd } + +func initConfig(cfgFile string) error { + if cfgFile != "" { + viper.SetConfigFile(cfgFile) + } else { + home, err := os.UserHomeDir() + if err != nil { + return err + } + viper.AddConfigPath(filepath.Join(home, ".config", "cloudflared-proxy")) + viper.SetConfigName("config") + } + + viper.AutomaticEnv() + + if err := viper.ReadInConfig(); err != nil { + if _, ok := err.(viper.ConfigFileNotFoundError); ok { + // Config file not found; ignore error if not explicitly provided + if cfgFile != "" { + return err + } + } else { + return err + } + } + + logger.Debug("cmd.initConfig", "Config file path: %s", viper.ConfigFileUsed()) + + return nil +} diff --git a/config.example.yaml b/config.example.yaml new file mode 100644 index 0000000..e3ffa9c --- /dev/null +++ b/config.example.yaml @@ -0,0 +1,13 @@ +# Cloudflared Proxy Configuration Example +# Viper supports multiple formats: YAML, JSON, TOML, HCL, INI, envfile, and Java properties +# Copy this file to ~/.config/cloudflared-proxy/config.yaml and modify as needed + +proxies: + # Destination hostname to proxy (required) + - hostname: "example.your-domain.com" + # Local port to proxy (optional, defaults to 8888) + localPort: 8888 + # Destination port to proxy (optional, defaults to 443) + destinationPort: 443 + # Skip TLS verification (optional, defaults to false) + skipTLS: false diff --git a/go.mod b/go.mod index 6b5ad32..d8e36ed 100644 --- a/go.mod +++ b/go.mod @@ -5,15 +5,27 @@ go 1.24 require ( github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.9.1 - github.com/stretchr/testify v1.8.4 + github.com/spf13/viper v1.20.1 + github.com/stretchr/testify v1.10.0 ) require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/sagikazarmark/locafero v0.7.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.12.0 // indirect + github.com/spf13/cast v1.7.1 // indirect github.com/spf13/pflag v1.0.6 // indirect - github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.9.0 // indirect golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.21.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 6ffd4c8..d9c5f01 100644 --- a/go.sum +++ b/go.sum @@ -3,32 +3,65 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= +github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= +github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= +github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/config/parser.go b/internal/config/config.go similarity index 61% rename from internal/config/parser.go rename to internal/config/config.go index 0a22320..bc2f108 100644 --- a/internal/config/parser.go +++ b/internal/config/config.go @@ -6,20 +6,28 @@ import ( ) const ( - DefaultLocalPort uint16 = 8080 + DefaultLocalPort uint16 = 8888 DefaultDestinationPort uint16 = 443 ) type ProxyConfig struct { - Hostname string - DestinationPort uint16 - LocalPort uint16 - SkipTLS bool + Hostname string `mapstructure:"hostname"` + DestinationPort uint16 `mapstructure:"destinationPort"` + LocalPort uint16 `mapstructure:"localPort"` + SkipTLS bool `mapstructure:"skipTLS"` } -// ParseProxyString parses a string representation of a proxy endpoint +type Config struct { + Proxies []ProxyConfig `mapstructure:"proxies"` +} + +// Parses a string representation of a proxy endpoint // into a ProxyConfig struct. The format is [LOCAL_PORT:]HOSTNAME[:DEST_PORT]. -func ParseProxyString(endpoint string) (*ProxyConfig, error) { +func ParseEndpointString(endpoint string) (*ProxyConfig, error) { + if endpoint == "" { + return nil, fmt.Errorf("endpoint cannot be empty. Expected format: [LOCAL_PORT:]HOSTNAME[:DEST_PORT]") + } + parts := strings.Split(endpoint, ":") if len(parts) == 0 || len(parts) > 3 { return nil, fmt.Errorf("invalid endpoint format '%s'. Expected format: [LOCAL_PORT:]HOSTNAME[:DEST_PORT]", endpoint) @@ -52,6 +60,10 @@ func ParseProxyString(endpoint string) (*ProxyConfig, error) { } } + if hostname == "" { + return nil, fmt.Errorf("hostname cannot be empty") + } + return &ProxyConfig{ Hostname: hostname, LocalPort: localPort, @@ -59,7 +71,19 @@ func ParseProxyString(endpoint string) (*ProxyConfig, error) { }, nil } -// GetAddress returns the full address of the target application. +// Returns the full address of the target application. func (c *ProxyConfig) GetAddress() string { return fmt.Sprintf("%s:%d", c.Hostname, c.DestinationPort) } + +// Sets the default values, if not provided, for the proxy configuration. +func SetDefaults(proxies []ProxyConfig) { + for i := range proxies { + if proxies[i].LocalPort == 0 { + proxies[i].LocalPort = DefaultLocalPort + } + if proxies[i].DestinationPort == 0 { + proxies[i].DestinationPort = DefaultDestinationPort + } + } +} diff --git a/internal/config/parser_test.go b/internal/config/config_test.go similarity index 59% rename from internal/config/parser_test.go rename to internal/config/config_test.go index c711b7a..844738e 100644 --- a/internal/config/parser_test.go +++ b/internal/config/config_test.go @@ -7,7 +7,7 @@ import ( "github.com/stretchr/testify/assert" ) -func TestParseProxyString(t *testing.T) { +func TestParseEndpointString(t *testing.T) { testCases := []struct { name string endpoint string @@ -58,23 +58,23 @@ func TestParseProxyString(t *testing.T) { { name: "invalid format - empty string", endpoint: "", - expectedErr: fmt.Errorf("invalid endpoint format ''. Expected format: [LOCAL_PORT:]HOSTNAME[:DEST_PORT]"), + expectedErr: fmt.Errorf("endpoint cannot be empty. Expected format: [LOCAL_PORT:]HOSTNAME[:DEST_PORT]"), }, { name: "invalid local port", endpoint: "abc:host:123", - expectedErr: fmt.Errorf("invalid local port 'abc': input does not match format"), + expectedErr: fmt.Errorf("invalid local port 'abc'"), }, { name: "invalid destination port", endpoint: "host:abc", - expectedErr: fmt.Errorf("invalid destination port 'abc': input does not match format"), + expectedErr: fmt.Errorf("invalid destination port 'abc'"), }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - config, err := ParseProxyString(tc.endpoint) + config, err := ParseEndpointString(tc.endpoint) if tc.expectedErr != nil { assert.Error(t, err) @@ -87,3 +87,43 @@ func TestParseProxyString(t *testing.T) { }) } } + +func TestGetAddress(t *testing.T) { + config := &ProxyConfig{ + Hostname: "app.example.com", + DestinationPort: 8080, + } + expected := "app.example.com:8080" + assert.Equal(t, expected, config.GetAddress()) +} + +func TestSetDefaults(t *testing.T) { + testCases := []struct { + name string + input []ProxyConfig + expected []ProxyConfig + }{ + { + name: "no defaults needed", + input: []ProxyConfig{{Hostname: "host1", LocalPort: 1000, DestinationPort: 2000}}, + expected: []ProxyConfig{{Hostname: "host1", LocalPort: 1000, DestinationPort: 2000}}, + }, + { + name: "set both defaults", + input: []ProxyConfig{{Hostname: "host1"}}, + expected: []ProxyConfig{{Hostname: "host1", LocalPort: DefaultLocalPort, DestinationPort: DefaultDestinationPort}}, + }, + { + name: "empty input", + input: []ProxyConfig{}, + expected: []ProxyConfig{}, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + SetDefaults(tc.input) + assert.Equal(t, tc.expected, tc.input) + }) + } +} From 84807773e69270fa8ed6e55d307539d1815dbcfe Mon Sep 17 00:00:00 2001 From: sbldevnet Date: Sat, 21 Jun 2025 12:52:46 +0200 Subject: [PATCH 5/9] feat: add tests for internal logic --- internal/proxy.go | 25 +++++++-- internal/proxy_test.go | 118 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 internal/proxy_test.go diff --git a/internal/proxy.go b/internal/proxy.go index 9ef4280..d308cd3 100644 --- a/internal/proxy.go +++ b/internal/proxy.go @@ -12,10 +12,29 @@ import ( "github.com/sbldevnet/cloudflared-proxy/pkg/proxy" ) -func ProxyCFAccess(ctx context.Context, configs []config.ProxyConfig) error { +type ProxyService interface { + GetCloudflareAccessTokenForApp(url string) (string, error) + StartMultipleProxies(ctx context.Context, configs []proxy.CFAccessProxyConfig) error +} + +type LiveProxyService struct{} + +func NewLiveProxyService() *LiveProxyService { + return &LiveProxyService{} +} + +func (s *LiveProxyService) GetCloudflareAccessTokenForApp(url string) (string, error) { + return cloudflared.GetCloudflareAccessTokenForApp(url) +} + +func (s *LiveProxyService) StartMultipleProxies(ctx context.Context, configs []proxy.CFAccessProxyConfig) error { + return proxy.StartMultipleProxies(ctx, configs) +} + +func ProxyCFAccess(ctx context.Context, configs []config.ProxyConfig, service ProxyService) error { proxyConfigs := make([]proxy.CFAccessProxyConfig, len(configs)) for i, config := range configs { - token, err := cloudflared.GetCloudflareAccessTokenForApp(config.GetAddress()) + token, err := service.GetCloudflareAccessTokenForApp(config.GetAddress()) if err != nil { if errors.Is(err, cloudflared.ErrAccessAppNotFound) { logger.Warn("proxy.ProxyCFAccess", "Access application not found at %s, continuing without authentication", config.GetAddress()) @@ -38,5 +57,5 @@ func ProxyCFAccess(ctx context.Context, configs []config.ProxyConfig) error { } } - return proxy.StartMultipleProxies(ctx, proxyConfigs) + return service.StartMultipleProxies(ctx, proxyConfigs) } diff --git a/internal/proxy_test.go b/internal/proxy_test.go new file mode 100644 index 0000000..214aed4 --- /dev/null +++ b/internal/proxy_test.go @@ -0,0 +1,118 @@ +package internal + +import ( + "bytes" + "context" + "errors" + "testing" + + "github.com/sbldevnet/cloudflared-proxy/internal/config" + "github.com/sbldevnet/cloudflared-proxy/pkg/cloudflared" + "github.com/sbldevnet/cloudflared-proxy/pkg/proxy" + + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +type MockProxyService struct { + mock.Mock +} + +func (m *MockProxyService) GetCloudflareAccessTokenForApp(url string) (string, error) { + args := m.Called(url) + return args.String(0), args.Error(1) +} + +func (m *MockProxyService) StartMultipleProxies(ctx context.Context, configs []proxy.CFAccessProxyConfig) error { + args := m.Called(ctx, configs) + return args.Error(0) +} + +func TestProxyCFAccess(t *testing.T) { + var logOutput bytes.Buffer + log.SetOutput(&logOutput) + t.Cleanup(func() { + log.SetOutput(nil) + }) + + testCases := []struct { + name string + configs []config.ProxyConfig + setupMocks func(service *MockProxyService) + expectedErr error + expectedLogContains string + unexpectedLogContain string + }{ + { + name: "Success", + configs: []config.ProxyConfig{ + {Hostname: "app1.example.com", DestinationPort: 443, LocalPort: 8080}, + }, + setupMocks: func(service *MockProxyService) { + service.On("GetCloudflareAccessTokenForApp", "app1.example.com:443").Return("token123", nil) + service.On("StartMultipleProxies", mock.Anything, mock.AnythingOfType("[]proxy.CFAccessProxyConfig")).Return(nil).Run(func(args mock.Arguments) { + configs := args.Get(1).([]proxy.CFAccessProxyConfig) + assert.Len(t, configs, 1) + assert.Equal(t, "app1.example.com:443", configs[0].Url.Host) + assert.Equal(t, "token123", configs[0].Token) + }) + }, + }, + { + name: "Access app not found", + configs: []config.ProxyConfig{ + {Hostname: "app1.example.com", DestinationPort: 443, LocalPort: 8080}, + }, + setupMocks: func(service *MockProxyService) { + service.On("GetCloudflareAccessTokenForApp", "app1.example.com:443").Return("", cloudflared.ErrAccessAppNotFound) + service.On("StartMultipleProxies", mock.Anything, mock.Anything).Return(nil) + }, + expectedLogContains: "Access application not found at app1.example.com:443, continuing without authentication", + }, + { + name: "Error getting token", + configs: []config.ProxyConfig{ + {Hostname: "app1.example.com", DestinationPort: 443, LocalPort: 8080}, + }, + setupMocks: func(service *MockProxyService) { + service.On("GetCloudflareAccessTokenForApp", "app1.example.com:443").Return("", errors.New("some-cf-error")) + }, + expectedErr: errors.New("some-cf-error"), + }, + { + name: "Error starting proxies", + configs: []config.ProxyConfig{ + {Hostname: "app1.example.com", DestinationPort: 443, LocalPort: 8080}, + }, + setupMocks: func(service *MockProxyService) { + service.On("GetCloudflareAccessTokenForApp", "app1.example.com:443").Return("token123", nil) + service.On("StartMultipleProxies", mock.Anything, mock.Anything).Return(errors.New("proxy-start-error")) + }, + expectedErr: errors.New("proxy-start-error"), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + logOutput.Reset() + mockService := new(MockProxyService) + tc.setupMocks(mockService) + + err := ProxyCFAccess(context.Background(), tc.configs, mockService) + + if tc.expectedErr != nil { + assert.Error(t, err) + assert.Contains(t, err.Error(), tc.expectedErr.Error()) + } else { + assert.NoError(t, err) + } + + if tc.expectedLogContains != "" { + assert.Contains(t, logOutput.String(), tc.expectedLogContains) + } + + mockService.AssertExpectations(t) + }) + } +} From 8fdf8594dcea02ffd546f3b48a2d0ca8bbb65b4e Mon Sep 17 00:00:00 2001 From: sbldevnet Date: Sat, 21 Jun 2025 13:26:02 +0200 Subject: [PATCH 6/9] fix: remove unused viper env --- cmd/cmd.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cmd/cmd.go b/cmd/cmd.go index e261eb7..fd7960b 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -71,6 +71,9 @@ func Run() *cobra.Command { config.SetDefaults(proxyConfigs) } + logger.Debug("cmd.Run", "Starting %d proxies", len(proxyConfigs)) + logger.Debug("cmd.Run", "Proxy configs: %v", proxyConfigs) + err := internal.ProxyCFAccess(cmd.Context(), proxyConfigs, internal.NewLiveProxyService()) if err != nil { return err @@ -99,8 +102,6 @@ func initConfig(cfgFile string) error { viper.SetConfigName("config") } - viper.AutomaticEnv() - if err := viper.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); ok { // Config file not found; ignore error if not explicitly provided @@ -112,7 +113,9 @@ func initConfig(cfgFile string) error { } } - logger.Debug("cmd.initConfig", "Config file path: %s", viper.ConfigFileUsed()) + if cfgFile != "" { + logger.Debug("cmd.initConfig", "Config file path: %s", viper.ConfigFileUsed()) + } return nil } From 31e20cc5d31d48e48bcc59a00c5ec1cb0bacc840 Mon Sep 17 00:00:00 2001 From: sbldevnet Date: Sat, 21 Jun 2025 13:26:12 +0200 Subject: [PATCH 7/9] feat: add docs --- README.md | 105 ++++++++++++++++++++++++++++++++++++++++++++++ img/logo.png | Bin 0 -> 129480 bytes img/logo_dark.png | Bin 0 -> 147798 bytes 3 files changed, 105 insertions(+) create mode 100644 README.md create mode 100644 img/logo.png create mode 100644 img/logo_dark.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..5cdc26e --- /dev/null +++ b/README.md @@ -0,0 +1,105 @@ +# Cloudflared Proxy + +![logo](./img/logo.png#gh-light-mode-only) +![logo](./img/logo_dark.png#gh-dark-mode-only) + +A flexible reverse proxy for Cloudflare Access applications. + +This tool allows you to proxy multiple Cloudflare Access protected applications to your local machine, with easy configuration via command-line flags, a configuration file, or environment variables. + +## Features + +- **Multiple Endpoints**: Proxy multiple applications simultaneously. +- **Flexible Configuration**: Use command-line flags, a configuration file (YAML, JSON, etc.), or environment variables. +- **TLS Configuration**: Option to skip TLS verification for non trusted certificates. + +## Installation + +The binary can be downloaded from the [GitHub Releases](https://github.com/sbldevnet/cloudflared-proxy/releases) page. + +Alternatively, you can build from source: + +```bash +go build -o cfproxy . +``` + +## Usage + +The primary command is `run`, which starts the reverse proxies. + +```bash +./cfproxy run [flags] +``` + +### Command-Line Flags + +You can specify endpoints directly on the command line. + +**Endpoint Format:** `[LOCAL_PORT:]HOSTNAME[:DEST_PORT]` + +- `LOCAL_PORT`: (Optional) The port on your local machine (default: `8888`). +- `HOSTNAME`: (Required) The destination hostname. +- `DEST_PORT`: (Optional) The destination port (default: `443`). + +**Examples:** + +```bash +# Proxy example.com to localhost:8888 +./cfproxy run -e example.com + +# Proxy example.com to localhost:9000 +./cfproxy run -e 9000:example.com + +# Proxy example.com:8443 to localhost:8888 +./cfproxy run -e example.com:8443 + +# Proxy example.com:8443 to localhost:9000 +./cfproxy run -e 9000:example.com:8443 + +# Proxy multiple endpoints +./cfproxy run -e example1.com,9001:example2.com + # or +./cfproxy run -e example1.com -e 9001:example2.com + +# Skip TLS verification +./cfproxy run -e example.com --skip-tls +``` + +### Configuration File + +For a more persistent setup, you can use a configuration file. By default, `cfproxy` looks for a `config` file in `$HOME/.config/cloudflared-proxy/`. You can specify a different file with the `--config` or `-c` flag. + +**Example `config.yaml`:** + +```yaml +proxies: + - hostname: "app1.your-domain.com" + localPort: 8080 + - hostname: "app2.your-domain.com" + localPort: 8081 + destinationPort: 8443 + - hostname: "app3.your-domain.com" + skipTLS: true +``` + +With a configuration file, you can start the proxies with a simple command: + +```bash +./cfproxy run +``` + +Or with a custom config file path: +```bash +./cfproxy run -c /path/to/your/config.yaml +``` + +### Configuration Precedence + +Configuration is loaded in the following order, with later sources overriding earlier ones: + +1. **Configuration File** +3. **Command-Line Flags** + +--- + +For more details on Cloudflare Tunnels, see the [official documentation](https://developers.cloudflare.com/cloudflare-one/tutorials/cli/). diff --git a/img/logo.png b/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f85247a97b93690ff8cc10d290015f61133644eb GIT binary patch literal 129480 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
D3FT{r1Rve!o3}k{JIb$MILc(ZOgOOu&isbI z-)ecFqF>dzz&lax-j*`m74W zjml7hDSd63PUY0&!2wTzRn`nQFj3Lzx-lOI?92)VixCE2!hAgx;6MzjqDb+wH>_*d zS43{lckMbnV$z%~aT&$}Gc;5=|le;RPFqsXy8hR+Ec z6`r$K7w0FSuKr_i{d&QmzwBFRNdJ^uN|o!xE#K~XHoS|gd6)xvOp+gGD>fr7M*F_r&Z);S@3m^vK9i34n&zMXQ^C z%RrXn1T=3QWT!5unC;bOW=_98JQi*mfh#PPjmmc}&Y?iDu8SK|pe2_WE8wVI&c5DO zd;f%L4|Gjuy%?g^2^Xxp7^25FFB(*|_}(ytSi&VvBVat#0+nUkwHmxo)R!cm>dE0`6AI2cM1t5m`5UjuSZrJvj+F&$wOs;9+T` z$(mQglmD*Sad<#@Uin@oZLIg|_7i2BCoN#~bn>zxbrJK*P?6bNo}h-P`>8lOyzIma z8xpV>N2qS#12SMP85EkN=cIRFf+Ey7mi6ZK0V(kr7e2`i2#F9$m+rrI@ls|NQgU9xn9)YEs?c zsO&63a8^|0K<;%_z4fW4l(pbFjojMy9xAk`0akiS)bGuM$)F%ye}ni}gaW#b{ib)j zTOh9~?5KHXRPg%*W##Qr<@25S7fPx}0>~$(A zJ5%NF`&O9NP3S8+?ws4oAT_!7>=qwX*kn@Zh2JbcbW$flOzC(ZJhz`UNo&P?u*1|b z9Hm&&%&&`yP~ANC;}roq%EV+|gAFI7e(@F4!FA+(xQlBiC^J~4NJ~6XYy?M zC^~Aph&~uX&U5V*^`vmE`bGM-fFSulFijTaC=-F#$Df#;m;MS@31kfmGV5{u6pj`u zl!+_Qy_XS`$y7c^-p}t>vn5^I@{9@`$h^y--7wi_hp&?h{YN4Mb8zt<8GHbhMOdem zuW7F#14^&dKO(88Ok`Mf(ELv4M@<|y=9fT+da$|XFoGHfs@GV%~CdoE5l zPjO=+>u&*A|5a#=Vla$CFp)IexQT>nEe|z-9db#f(ui8@U?O|AWVr9XWhz;80y-LI$FDBt6uCLwMM zhU0L}4`W4frYGQ@6|cV8t8mfyghk5}RMnL^QMtN#o#UzIFGg z`xXQjrfz&vuGo?-EI`KXnroN~;b$LJ>c-n|KW!~|S`3XiyAWg_qbEr(!mzrUT4(>h zKP9{?U9BoseDuSRt-8Q`=dnH&*@V4y5$BY#}_n8I*7#<68#&;f!#GR3Jsr%ux_isG~W#lz{M2_3Y58=2i^xse(Z z^3_w$Yppy{g}1v+D!+;lFQ?!48QEUoki^wGrCit-0l6q!Zsq#{(g385DSl(9jSW-p zI`aD4C4{1W)!^Bi}&wU^u548M&M~Ht^eQ&%J=@9a$whBOpZe^ zz(LYN6t2aS`XE>cN{jkiNV-IQeh*ZDZJ02Sd1d2%Sa;H5HYd zeoPOGX%oY%`dhbX(Z;1bnDA%Ty!v>fdB+5j7VV%HZ{JXAX+i=n@k)lz`i}Gl8U{qQv}%&5;CvS`#cRgL9-L|^ z73`7Q5d-V9mP+l_)!Gi2g(vBZ1pv;;jrm~J#Hu2G?r14^lzl$N7TbS zJ`yJM;;fYdXU6XV$J@`~g1JX(#r0fJ(JC$>1XG>!Tgj!P_Dzi4XM$5diItdsQP|Gm0nD?+|2KB*B_sw?7qr@ z!AwB&d}~^zDu7nRHkH5;ld~{PTlmm45m&hK`C|Oyg#z4oE@228o(J82Hwkx|9^Zc3 z9B^*_*P$RNE{>Op_!Y}s#(@4C2Hf-BBm0)qzW-k>SbA5~R zKJRhA?$`ag?d8Zj4M?hfud2DtWWdhCw-Qwf^K2@#WpOaG`Q?ahdcD z4?9G*D|H*AmoWqTB582lUqGBHKJiqZKV>@#K6M-+oskE$jcyuqOe6XB^nhxej1TKZMrLfl)YY_016}Gw=!=A|Fr=HZ}E^iJVjaqThQr{ zG*J#TcS@S5NSr7b#@6~K+6GHr{^@Ai*ioI?_EBLg2=U+R0AG-=q{A?4#`EO6DMo36 zMEXIOdZmK$K=`xKaDAuRfzV)wwaYvrdELGq}f*7~rFN&%|lpn?Gs~C%k>TbQa-=LJg2&YI5TAHFO zK~5o9MbVz~nEeW`m6pFf9ljYG-h+0un7|TSr5JnaTNJ>HWIUOH`v{oX3K^5@6(`E6 z7~*8HB2Xp7k)SpA9Yrjks$WTbZ@+8;V)i7oB{X|mA4N+Oe= z{r%S)qeMzS%6F*!Qp?8FYx4qE<0^k^rO>FX23#6N3x=GdyD0~s`e5?}gKq2eErhAl zB5$>GLfdM}Er*Q`?r_l+v8mmY&?Nsi^El?$_l1Xh=7XeEmNapMJQ*~cno83^5BAEr znMyfRZ#<9j|7pTVIXF}hz3adX=Nyfxw|~efy38DNuKa9zYTMfQ+*DxnN`}5F1lvLX z^Jn@VSBNX(V=XLWjBVSw7W=dHGVKVrGAFmeMxjE|-`-m9=1hg5{gLKzfBCuV4Bjj| zK#W$sj$JewIb_2LJQ!Tu^!}f6)ar|m-RaurPa`hCR^qT8pRwpWT)-4+!rI;GXK;blAh zlcKl4tmB3r^iSmHl)tAJ6)g53>ExttqwFY%uxVlY>-2_xo(2TC{F_lfQ^|j`nkRrz zPH2_AIjz)x867n15NvLe`=M~rNzvwy(8>sjQh(Bt-*tT}0R6F6rDH}4umK~`=cTx^ z)r5SUfH9{lxS8ytr-h<7Om6~As{;QQpAcO4)~&t+EZ8*+wK^4&S$Fc^5XA?H^_wb8 zy5XH;cP;BJzFU=t?xdPAQr0bBc}oumF|U`4l{-|mRJbz^z6 zaJxA9C_}B!LH&6mD}l-lmBhVA?Jr5S8w`ZY&)x9u9{ZVY!Y~<3CbH?1UCIXP9>{|o z{QUWOblh%XB)mUkzxeD&-a2S=tfaz-0CMY>)!y8k5m?tbBZEfg*qHvaUcx0D@MfS^ zMnIBde`|}{vUZLSrG0MsUo@#Mmat=t{035Be^R607q#{XJbE13!7u+0dx(qn>3wUM zw8^uZtnrw;!4~7BG(dsb*8`bX#Vm;^x{9gt2ad{Aj?`Kx*<)tHpJ!@UD*4)ML)*6- z$#pKZY}nSQWhn^#jihHhQvba==LJwZr~Dd3Zng9Qwz%^SqQ%N&n|*%oGqn7&2OFoc zNDgGxnt{U~mP=(o?I>)tec?ctbeUhpOpeK)f8RyM9n)+gQ3( zLxo&(6wef+VzPBeA}2q8E>vMCH6MCpMa6K}*9~&Mz%>%y-9&FzEW0XM3U^BN0sNEI z))(l2zj-PLL20{lLBZ0Sh|G;HAtx3Kxv_1MMTTYOt_SdweAQk1IPwJKrW3#TppnMa zTEl;Wi;E~H`50S(;VAPr5-{<+HRzEos!Ig&r><`%Jo<^6bMo zaOd-9on`7eELaLapjGfO^)d)4|B=4;%47Llw*r;hQ*1yvEK`m8&<=Fl)C&zpgs;VB zv6|6p`5lO$*0`tFt}Kmz?f>~Z7Mg~pCco}=*Y~R()fEHzEkl!$2Po&g-dXK*7Vm{) z7c#@axflEAQ+cLfG@z&>$Q7RmMHqDX3!c&>c#f3*zSWZtE*P009of2z@T@|~o~}sh z@5=&bNkpb=dj3>`MQ8akureKJba?3ltZ_7+C2U@Dz2(ytK7H4z730iF@|4E)i0n?N zMB44AS|YdZdnPv?hqvVx2q2mo5M|fHxA2Yw1u&g97*~Xz&Oo{=Z2r4SeM3W4`Xx6_ zB+j4rLxnVuYp@@SNrH4ILo%3RIR=-%DQ2wRK9ww52K5MFm$l z4&Zw0!qul|2Fc;y$4mY&O8i7B3sQ9`C@7?%h?uK*^Sv9CF_n}gw2ne3G8dnLIMcu6 z6zX1me%S!B8Ydss)ng6GlvTLdpzdqvL_mJ~mTqotAB}<1*{8jc!0V`cx02V@^Ha9< z^THmUJmaxYspv>(DaZG$uC6}!5Tjz`ynVkDO1B{U`f3<-A7>e=+-&4-dAza!xA!$> z9xZ+nR6zHCAc=A7;cKhHaT^s4m}4x@7Qr4r(9%^kabnMukZ#{-<=s1lH;WP$H~h|a zmVW`?bPbr~Bqre!^R&`7dxFRR0O>U)`R}OeL*98xMw!3$uW-4%G=Fz`ruLYRx=tcQJi1Z)1H_* z1_gfy9mbgbwPKhGo$Idg;y&Yd^6;dL^&wp`+^!viWYx6US9nhC6K$1R_E)rGU!{7x z!);Rfq)e3RqGe{@4H<6e#a`&Vmvzqx+^ejOCZH?%5Wd@03_}RZlc!IGNs`ow99+*9 z2GYt@My^C*!L4f^?1_2EUbkIQf+8@_ylm)TZ!)Bbw$TD}&)x$eWoe7*fHA1UNfO^P z_5Mg*8?z3`Jlj2(Eg2~rU;m8|M2WMrvnN|ANaA9MUYPn31Hzdri2SGj+;copnt3Re#_T8GPMv3O(BXAHZc#SG>es*c(={s%WK4e&# zV0u2}QNR7WGncD(82$?_q^w|8O0w4rXSNdk)zDz#Z~d1pjeBsk_C{Zp>|(t*tm^c> z4;P03#aBa&w}ayI!6Cb?U-}p&0j<8yaIwdEc>pBlL?>A8jX+jW@a*D1(NMI#Zfc%z zhDQKLA{A0QH>~_dVswQ`Qwd zB=W0lka2EwkL>5v%goU3nzUH{?=~W+)G!gY?&2-3Vz#=#(UnOhmTYI5FtLy`jg?Ms z8EdYxid;A#H123@*UQ4lrfJ`4p@a?zgm?@a6BEOBOB%-hsV0v)9SyN2DN=meP64m; zPx^F}Zr<6hUCtS&x=&zGG56GJTX$|02MN!*13TO|T;-r$1gTv_+XRi!NLB+H5qy%g&CbYdfgXEq#&nm3XD__1$fI;G zEPuZ~JyA>M#?x(@6u>+sfRpWLnQF$W$Iq(=2x?cb#=OUKSKI_WzcdLEGm!h_<@*ip z?WPK%=62c~HclV?2>%Jd)X5t`{*tsZMI1 zdeS8{i}ks=QFlsdIP?L4qgCS4v-AG zZq%SDFM4XI1yBk~l= z<-nkw2YDRmKb1-P&m+j*teJ|8%(^A}6YpIdb(0HJCn7y8idd{MnZO0c-bP@8X9g1^ zS&2z&PbpETH85HER&tJ6gzYt>+6{-D5&jF>P_;yJ# z9^1wT*+-%%!;kK!qP5(P7gVYs93s%o0OJZ$12#aEic7Gmm(urGLxzl;l0jY{gDBtb zIyC~uHehtnn+omou6J^D&2z|n)gY%W!{v^EGhu=Wx9*D{j%brJii^6ByaV z$ddZ9_3rxpi$(zCCr>>E5G@zj*hKrT|BGVXKVqG`vGY-Ojoo z<}H_lCrb?Wqj6QJX0{+_+dChizIt$eiLHLf880#h1B9!%v=vi5yTby8@96%LrJEYHsuwyrtIG)(jNeh1g=m zjWcAQj383GEZ}Aw%fFZBP+LBK2`g7ox3#l9G9ER-gKazO%kb{&b+McLv`cYt&UMT`GpZ-(us9N=W_{m=e)8LPrY=eDg9Q=uN#y>@F#b_!GdR&a< z4_-~)(uT21s!11Z_X>l7^}3s>d2{5evd$DpCX0GZp+W|>AmNzrSl3ALoB!3kBg?fs zy_@rbwMeSzdW$-33|==Ubg~)RjD-i}fPNBov=q0;VQo&wJCtn3v{Q=fuDC0PDxz?Ola_e}lm;p^ldtN?KxqgR56B_6JuyREJJH5IijkTZll;7n+R8Fh_;Sz;SR;j8G@fQt|ZhhwhLvqY8eyTp* zSRz}nh|*@kKI1m5H}Bcs@D#4eH~ueCXl^O0ioV{(%2a6g>VH}Q)Y@$fzW5*b&uWRt zGAhML&^3dRqH(aehHHrhl_YiXDp-G}_rw!}OLwY8Y?~-(V2R^f8?#=!$;K=SsP9aKW%$ zL7~CM&>$Ujbw`qMK|CRa!8kjhyvZc=bjct%x++gE7zn}3e7_a0fyE;yJLxC) zaU(FCDkG&?zq7Xy`6%xsuw2E_AGsk2>N_Yuh-HPUV)CP;D=Ez-Y`&K1 zonng7M1IZ-i_<)`7FlWr4KA)>7{JYJ8L8dSS{Dqza8J62CYi`uOg_#K>>c;^NVJ;o zAOmpA@FaDjKMt+eFC3`vRg^$3qIEOR38K-D1vWMt9_o!}IcA1v9j(3n8>Ko@)O-8y ze_M1~fiNv`ABg1!!IhCWZ{DmJZBb8V3wFr<2y#N*3ynU3P(QKSHigr70QR|EK<}e% zokPW>#Lc8IRIVH~rShze{;!Z@D*V$I$pr0;exHm|RwS#;;qBy>Rh(itXTJQu;pV@L zG0g`k`~t$gs;dT2x#!B!-b!rSZN!W_JIGq$q8TPo#$;4ZUS2-d+r7s0K59)ylML5! zc%t8+yJjCbu>{Dk`y?l4$G&U@Tm+R^(_cm0$k3T**B^WCWPb{&B(Z!~4k%I8s{EgY83 zHfJOc(^@nk6C7Jl^Y!~aSHIZt=P^Rvdl`KKHkMqzI-BY`WpSBqL(5@guxJtHIEP(H zl1I^6_G|$Zs%GMy2#oezzy0*W+-5l?wvFR&$8V620LcV+75?p>u&HeVSYPOPnxSDh z!VC5uf6o6a59%Iz9FOxW$>$t5hSy?_FZ_-ssqRBhqqW^TiDD7i1s7aB z1`^TJtW#!jI1j-OTVScb`N5lz*4^TuOM-Il#lTw_-fubTMHT*fD#+ef1htQ=IIlylQFUE>w3_sq+Sn5fr6xSWWoza(dOM8 zI%17?VAda)K{l`Vt#@QQoftmJiyu@O!_p{r&m#=SPV0kFxYp?n7>oxCU?l z=BW5069@xsNrpuOjmOQ{b-{9I>`DcdoXco+aHbcCk9hVdzACM}KMx|*A%7eh>b74Q z-$>%d(hyG>&LhC4aM7Nwli`rWn6VnnkiITvi=l`-{c6B*Kv5}U{x?Vij)vs>M<|Yz ze^uDhLudn!^PyI5^vP@_R4IWt0EZ3uWC%l#L-cfXgtm7OuJiYWyV=L2*EfrP?;c^& zx)1srI8`{~^5QMe#+VxYF^ZM>JhR4QK$p`3Ey0x5N5Fasy`Zc`SN8k z3A^;sJ0CY^APtOrnlyNwZB*)iJg_SQI>)J?=6kDEd;7b)^S~Xl`Un!JGlJV&lsR=Z;D4Rn63i%bccxAeVwJ9J+p;Pn?#D{TQg(9rkJ{H}Ikl(HG(9t^xH@VWx($A*gMM@v<&p#&T*Y zI9l{s+co&scYKHPA=kO>UBEzJfrEpEg+)@&b)ceN%`UCf%I_6b2L2~1U7ShvCc^;!{>f=8Ld4W0v_t;+iiLS znxcH32lGx)zJq*pOU5ODOr^=09x@b~uf|)>}{sFv=x)yta zz4iAne8($oZP=aX^x5sIa0_4fISl&4ERSD9NNXfq{X1T*Fc2I>?vdnKd&NN|@adyo71AjFA6qtY&YYUv@}5yVb2*l=5|1SsnPJ zL!Qrap-Xp-J=yk)GCw5U^gzwd1>){RG6}8Sui%w??$+SBynuiKc>3NsJ&p% z2!iV0dY(Q!+O_C1Ei~2t9`qe_zXy!c9E%y^+^iaBN05lf$ohdR-6VYgE{Jf2H3Xb> zEhgUfp$-#*sU8z@1FxFKdu}ED8GB&efq*6T_<)A_BWm7XX8g$ABE$%7_ZYIRlIeek6t*toh{YN zvPL>h0gk(XF!F(xhM~%>K@+O`@QoDbr zp*(;zvnyPC$dQLs9;5DsgOj{@lD%2ZvyOGu1=daH^l2p*(BRWIDP=DD+&iW|N7^PZ zf=Jusp84a;$@^bVZK(}GXyA#a(m@n@S~zio1dcYP6W4Z;c)*a{mP9`hc;V@y%qPc5b7jj4 zP*N5;;*Dd5#sIr=opX_~r~q%M|LVFZkVEZUJqz`M#gxRS=L&zB%}6fQ{zt+k z50;~QaNe}G^w#7&oiP-^E?$@$K7R$o+h)w^e&j$U+`a%k4mE0ehDX2G1s^xbAdEdF>pMv@qO!G^+2otnce`UkWDeJ+uwyUL2UvjNTZuvuK z@$5|CbLprlm;@=yTm(R5@k2O#fxj?V3_3dj% zL$^X-;0Ra|9FkZp;}0P9DM&|GpM&ez+w7h=ggQS*VoVGgJg)ydz zj3$nMSOq@X%`)@)hWQWJGhx{2pq29CjT9@Jag}SaX-abP>E>cd8K-$^$X%(?&)SMW zDbr*)&awby{7Vm)_FAtcZl)M6UE@ve6Itd5C7-L&#J6u3xSGmK{`!E}TD$^th$M?y`&Z#T zXLS!VFw!*Pg-aDz^Bx+0SIdI!%H=qLq-0Q|PcS|&;uRF)J*>u@@|1D*RD{&y6n?sE z>{OH+#WHV zxxug1?1k1-q0`ixyDimGc@8SzXOqC%$RH)yheM@i4kTg@n>fzP)K2EZH1 zC*^uhAgWGIOIk2AOl}#5=4Kk}gH&v5c>XV`%T2!;#a$JL)-#svvG} z?OW`H&29-LxG+3y^3L-9ynqO$3PIYyqn6|ensJ6%6Q^Kqb=@SLOwMNP9VTg4v1D(n zT&GU07<2I;hQj8e6dcrGDu}2u2jNdhk6-R!V$a+}QeNTE+e$piPIN`cZ1l^QSZcQt z14*=}8IT`kfl_dnA8(e;0S9kDF5kdY*H`Odn~jt`WGPS}p4-#$vY>mX4G9#Y2Xg?I zns&WK>5ncg$wu7@F%G;MXEC-8xwKT9#dYIz<2G?x4*|JhVA5xofG)JUQ=$Iohq`n$ zMYTJpXwy*NTPlJ6+9SE~dX9mh5YCiq`E#-Ge4_^NT_7 z5yBs7L|cL={OE>kGXX_YO*4>=};qYC5Rcw<-2}SoEgRVzGUCv_igWT1pQuq z`E-%-I<-W16^&gGFre}FPqrQ>-<8{Y?fOJdE!RP4O|k4}!ZQ|u%(?U;dET_HZmQ2> z2HJ-D`h6+NWG%_jL~SU zosJSBA&}Im^qjwaf=W6;Pa}N=ZPYV&+#D{bu9WL7!hBl#fp*#b5^re>$$o#}Xgzl` zhssP_pY7`X@51o)3`|!nP!$gsm-)O6fKAefC@z{%gk&^J9P^(CL7*t|S0sVjQrzj+ z&O={~v+xHr3M01|kO|vaV)Bj$0>*;)R`&oMaI&}qC)1JAr`|`_;LWY#?T^m!7Tu-m z>$~42h_-r0Ey;b6lH$}CSFI6hL-q=gHd@5tt`%;y+f}F}ww=m;BxKe}pyhWIw9hbG z7?F<(7J55z;SMB8+I1v)Mw8v?u{N8wJ z%yJ=pFY}|vk5i@M+M9)MGgY>)ALneT=B451@`n$5HurLboQVv(x#E=1^U>=1+AGx$ z^1Ayj)51#RK#JvD+C_96ap#YKl4J4;*j3#v$UGe*jZLvXGM8Z=5hGu(cd%w>W$94H zM<=Uh;s~zfZil3KS_nK8jOXXhXL#(jx+@AqO+8Kb_*d-JrBT@OBi*07DTCPv?TJ>- zniv$wDJ)zdM}$u=lD$rlyzD4$%QkVX_!iO0Gv>O2Mv28soq4#+sIrB|FGNgjAGI?- zqXTDoS4P-YDuw0oBD<%NSkgC)ynZB8%Jo@gWGWZpc1Vrf#+$X{?9wNj?3nQ~va(~# z70NW^&ko;=6~A3{2<90p54mMpPLILe_D_F-kyRdC#YW-qQX-I;HTCogXwmLZ~*&wYYD!Ok{GXt<8)LQwwh|e3guqDUO7lr z5YrrPe}ci~_2uy9IUd6$se^3=w^l_;Go8hFLy3wuO-QaZhe3ebS$&~zX3@VZq*DlNR2qw* z^7;rKaZGJ`izTD-!$vr}a`C*DD6in+fl(+T}SI|L*w+MGo}huGU}uTMyQI{<1odQWO{tH+J;4 zouI5>T>B`2F!lI{>6=@My#g;FiRlvf3*#~$JRmExYnGt%CUOlOb`LI`G7Vdy+<1ws!2CC_ z?QbrvTr8}8)x}ExkWEX4EaK2e-7MF_D%HrHmvF@!ptAh~FE?9vT^=9+YQ4| zElqC!{CmRjiFW~m8g@R+^&sihEXEH>R&2%JwHsH->S=5Q{f}XSosCqAaQLSmLu7CF z2G!7UdwYA@WRtSG+2DFu){>k?c0yFA&nQknyFq=+$^Z{Y>!kJdAMc{CqOVXC6bxtI z5)o^&t3Y+JqSuc){erSf==|>sa3P;%4Sx!`K-t`gi8Qea2{0Daj=a~B+#^*nf9yD_ z7LaDN#t<|pxrJp19%Acml=RFIT{ZjGr!sB-7{Zw(5_FE->btrsYd5Yh6rG~IytE{2 zP^+BO`Rg(|pJvb_cI6b~@jne&89j46KLHtz%+(3Ff|wvC#u|Q(wjTm_=I+&O(b&EOGfh==zQ#;~ zbCuu5qU&LMoG$EwKz(b%48ByYQ1ZIAny$t*F4{QJ#g~V2`vreo7zXnkHdN3)m=G=_T2oJg1N6EL)%$5bROwB9_wvqUEAsc zwUrC1R!?v_rzJTskUZVv9J!BCL1toJ-kGw)I8qEtBKfK#KgUNx{*6=_hjMhH-cmDR z>*_SXD1%(5XVaN|Qbgd8^%wl+MwJlmBwYU8M9Epk@7HC+u4gLxqNG(Qo374E5r1>X zy^G0P5JASfp3E56sqje-3!*_ShVx$!t_ ze31D|h%~@4J6Ezd`}7i69;g;`)h|oV{s+Uqd6=?t96LP5UZIv7{)o5w25BMlLECvU zdjC+$bvvAm`S5k?h@iwfs(^^ttuw{5ru)OzuzuErD152bf8N#H{x%OXZwfqbocP^xFD^mb#Ea>!s_AB zvpvw%9kslWMQ0cELPv0Y$3~C}*$Ma?hcpPW``Xn=zCg{i9BMCgnFC)&@2m)Dd&30L zmkmMyqz8_7@padL=(ziwy$&NKZQvkuSPS|u2HK{PeLieNf?1r$-wxl7Fz&naKC>oM)RbU;T}q~B=>hTuI)Zic#OEGLF0TiJ-W;jH z9hE(IuFAxTjbfWB#G8S5TCb4-?%IQ88>qST@^dSJjrNl>$lhNngTciZ!{oV38%=XE ze=fqLMa(3vZtL{Dnv%!m@y1!MyRfo0PQM-`lxp`Gc)A`_{lwzexrY#dnJ)XteGWyE;17B2ARfjFWe2b2XDn*V}os!?OD53av8%0YmXI1)RSl zw{a(Jca3Hsc>ovJ;MzCAu(~t7x16Gp$-s~kOk>Mw4`j1W@u%^7OSGgfut2=t4dk;Z z5OiYaUcsj@CZ=dl%-zJ@Sa9u@#IkkE7rx{aRV6OCIltA>I4fHjuWh!|pxWP?$#*N) zTpF_zC-zT#EwQT4AnHSHuX>~k%cfeMRy9s7ag*Us5#nn5rfSf`}S>bNP{gY z|9HO26*HPBDL)ZRC`HO-2s#>G%Q% ztE#G8I|v@39mA06T@k1ToO7h57UJd(H|95CGgFraW%Ji?uYKt5zESvuD>r_PmGWZY zlcao3bCa`p?vcBaEvr8`1Rn72Tzoe!`l68dN=}o6#QdZ!P>-=f${YMqQ>}>NS%cQ& z$lomV;EUf=tvuJz$5nic*if}&#{Ti1rMP;CLxpXYC6(B&8wqahlI?M^9ol2b7vXE*WU`|8c+o+b1`q#r;cAJ3Y@T+^$5*AUyK*n zfkc=;`bhMV0g7jZ$NqDx=xH%q492ZuNRRi4kj9-^#$JIB62;q87`sH}&r>7N0@q-Z zCR!mk+Y%pdg0y2~bX4)0yx{c_*` zPB5qE(Xi68Zr((0utwCqIe-*mnKBMvY`&j)C=7h`pume;BID#QFgRY+dF>xNdLACc zVWiduM=q5@$WUI&@Ys?fM!y1Z?gfyTb{4h{Th`o5a{rs={w`^E%b#s!f;3$=*e=^Z z=?k^5HH~;`kW_UqJSaT{UQDpl4Db+*k|?hglM?;gNE_`D;3W91!+0q$tW!rbNz4p9 z<=IY4cVbgqD+e`P6pO--&er}<3&1Jek{;7;V{S9Mb@wAU8BOSaDv#%s#bT*$^8=*b zQ2(*zrJqY1x~zqlV{M>@yV7xe?=q(GpL`VD3gKv0=`2~_wdrS>lCgcFn}9vOo&&KE zMaXHX)9;sZjdSHFr6&X#)h;p`jH+T>GGo(SdLeYlub;?(VpdA2y-Uo?%gcKE_U&}h z^O8kXU*^?94E6>rOHx2kH_tjXJw0dX;{hUx8U7bs4?yKLHpDvpO4_!326Ai)|n${OfzXd4DpBG z>??)^)^`4U!#yu?Y%}(co&0{?>B3tbL6H*A-|=Vl&mhn5M6r94+*BF^$bnTnrkbV= zH7IAR`_H(S5RW53{?$n0o*n3CKdBgY_K18ss%Je*iiy36sfC2J*I_I+_oZ8W&S`J0 zum52{%AOr_s=<|%IEP(P`iHwTHHP{Qu#(dq-t9Mj8;&bV6*5{IzM*=}pY6gWL)g0R z)?E&FpslMdhG(R(_clDLaxV+4m4>p;8c=_cNw~x7OEEVZfHD@zFu7lguQVRUh2>pO zk$TVW!4Wb?_H#B)9nHpRJuYgP@!w~t&=1m{)sUdm$Gq=Bo_L-z86lulN0c{v3s}8I z*C>zW(zUFrda8@OJNJt9T$$B%#hJ#07-gfdLYb(a>Hg^?5~g+Oi_FGuLrXMIFlC5J z2WGw2JI`Sk4MlJ5kzw2+Sf(qltz4bYB?tr>-i6+~J$b?Qr|)>Gi#iMMmCE?CS*SD$ z2Wcm97ul`x4>)p6V?V}nfYnJEp#JZos;!we*5xo*)zbs#{2 zwbA(S5yl%Tv_m{xltWrWA-dh{G^c*NUWZ{M!$2gh-bPVX@ZBGOyu(c za}fCo>Q03af6DC5-@dxgRN*1pPEkE+IjhtuaQ<0X_8nY5WfWeLI0Q3B3EHiCIU)GX z7ci!_Pt|ny{VnHO-HxoxC)x3_a*F~c{nzL<3Uxouy)64kF?BwhshDE6XkXc)o_a_S{rNdn;Z29%I|F@`>Ey)lumZr6*e-qB3yInyWo?ig zV3??pyHB>>o=Am!g|rL{c#xdoh+lp#Ih!YRAV5Qd@7I}f}?B^^cfzArU1s!>mLoc?W4|L%Ff(qw~-p} zNrKV$Bgl>Cg*3?PGW@1$7ML3_P=meSwd6S9A(#pJKsi-HT@u^6_WxF*Iqalmz2$k# zuHHmdf9`+RDg9Nghw|U--5DwK4-b%`Y6rIrTD_)&xK*n>U510eMaWNzuDM%iMwpCr z1whSyg%F?;a`gN5ScGIO!>={0Ap-nInC~LGj<=wJn}KcMV;sojZ~vYkcE4MRY*P2Zd2>jOnD|p%?gkrq_Z$`>JQKRyYOX_BJ4Qi$Qpn%p4lujOA^1VK+ zMb3eHz+rv#(CcW+X@}5DRt~x0C3qf6o!^fOU>m!ExD&oW5~g}KFIVU{{^2QLXh(yK zzO^SHxh0PuqHef8NYDwJfzgU4(j5mXSrWaK7juAeo_(BA;Zk-wEv*>&btA>7 z_`7mkyXnu01~_r#llyCPympyW9_Rlt+SAym;>gg28!+Z*{8F$?|E+XN#8zjbQ_6GT zxy`{nmw~MMdg-fkuL*z9z$X^zHQ*l3&dy$INrqwVrGDZDgd15*9A<`ICcWjk8k}34 zs}?}?dSr8>cxs}%=AELn0flg*YH+>fbX<4M4%|O=S4&R>hy%MCNKT4SBMV_l%T`4v z&D^UIrMeeI`C6kO4;)Gf8|`l0W=AKDp80hsyOd;{NzR7~yKt~an17StSih2QU`AS2 zEG+ABv|)d3RE!$T8_O93es}blcur$A>!HZUf5Vz{J*y>IoOYJ%-%z@g*?DgoFdF&C zZf%G8&FRPo0qFQ!B7YOGH#nayNfLkYxt}D#Qqs4EhkMflS!NB}yAAi;fBE&v+4bfn@VQ?fT07^}J znj7oBEGXl<5lq8#HwO}+i}0<#e_bSm;pP%2;SU}<<@tdSF}iXln|21b<{I@ewWX98 z2*wUeGxoWN>ERbzLLzbPKJ|aVgU=TkKWlJ91)7m+(BQjIA@QYWr-l0BwF$pj| zQ!2BaEhJI0J#@XZG*<<{ul9_>ezxGdrx|d+v&9V{PtzE z0vSqu%+AEsjN0$Vp4K#vORprGj4&0m=f6iOg;-VqZ)zP17>iXpysn8rs0bX?PM80E z2`RhUFNIAhb8vPZYZ2f}>*A)HjJ}7dZ+B=(e(I@>58|)}MsL>%(Z_kw+cgM9O>@Yd*4TrU|2Kvg?8K&M)2!;_)CqeEQ7re~Xf?0%0>AKsJxLt~CQgGr>#R zpIi}Gz37<+|CV0U|g|3Nxd6?+&z+WXq`~iDV#MtOB%TNIbt737M5^Ey)*BcFulh`pq@P?DT6> zwzg6)Cnd8D9;%xR*7(2yHPTD`L};=Z2G@jU>^X+>1{3 z6p*1aEMRy()o>ql?FhvX|yd;a;AbV9M3y9j1y4?aI?Dub8S8&eC!RWeYDE+(DkR_q!ow6qK;sV2-=p=#EfSQh^-Cx_kry8e8tGA3vz8k1VVmc2CYU95SRXx8e z=O5|%#L;wcL;}IxU&vX!P}s;jH(7uvJT)CdU? zNcZsGdvf(U-g5RENcAi>x^yGYX7#vs67=X_LzcVyiGQOxnN?(r{zK2Ov&W8vHg4NM zq(=K$uH$^!+M!nS1M&}LgT>^{?xjLJM3vtlv3fG=uqrwZ_&r09B4FJ`P-`i7U&eFh zK(Ju@pTDR-n3g@1oL$@8+?-{q9#1AUk7Qa#4^M6(%BD+xPuv~woT2bjJRj-(Uyk3e z;Nn@?ux-Wl1RqONYK9D_d;7dJVr+g2T!`2vJurGUDS8NC#2>5JyK)z(o1Bi?x$V z8Akq|28IesX#)x1k#X%#Jwi0(6I(T>{~ug%z9rl~{Sc}7RY?4#?WzkWwk4MIsZg~y zP~ljYRU^2&JrJ?Dg4~~D*J6D#lFOC5YkJ6@EB|&hvx8neTcqSTg99f9s0e;*0{unC zI=ac{#zRC_mohIhjY!n_zyDt!>_00l;qhsUJ_{eqk?DAEAGp6O=p>p?&bAT1&->tj z^B5xhd7-0pwXc8AUpVVyVB~f6vnbwdzFRLPJRhLX+%|-iySSm0-d= zF0j$+4ztQp&(AuHCHpcniORJoT15=M8G#f!XaY^a)K4ct8~JL-U&=xGUKv=$U}D#s z!EUlu_Y~ZqJK}Gk%8uEpWOf0ctRme3nTx_UvKA%?NPkCl#I}p_h0H)x@hyFvm_vnn#t-#Adr|{@q9BqLmc9Q86mmmktDJbVO_-!$SUv34ok2Fq zK#r%|b!30idU&?}fyZ(uK~azI;W-M433ejsX5jPe(sd;vmu87{z)ElFnhLf9+6b`s z7OoT?%08g@Neu*pW}x@+?_4kI$`~%j-?UTq?ub9j5+GGRTs-ZtomDmH*Z889Fo8V3 zdJJ5?#A4fY9pyjtiAG7a{G24wokytvZf0JD>6RN?^v|;Ie7`DV8Xrj0n@H!Sd6jw| z^XRPhmFEGC^LyPjVGQE5%@Uvx_j~W>5|KTBHY;Q;p1$mvHl{pUa#pzE6g=|BpsB3S z{Jhsp%VA|pTwF5Y(i z?4=VESM}LWm@EkabS>m3U7}=u%a3K%E_+VO)4h4@p4K4j$Nw!vZ-# zgVR_xpy7V6H(O3)YIUbmT~sf41U;wHOGX;?&n7)-x0lZ)YVWIHvJ>&9sXcQl3tW)m zb;)k?JSKpzi(pp)73yl;!F5)*oD4n?-7U#ikUs&h@{Evq``LPE$n~FtsT1cU&vQ6+cAm=>UVex{?ELIZuc6~Y7k3QL#3?ij zsQPsr3JE6PPO%)PhbuoWfIOBT{EpLk4Vmx5w$RFl!DD$c)lYr8Pu%?g!W__wq&}&0 zWr1|vot6dU+>IQn?}rYk?p&dJg`W=%u(q(5X+c(A7KK})swfZ})W!Idu_Q^{jd4+ zO(ck!4Smj#OG~yIBpK)ozDwe7hByJ}+5LTZ9m8dVV#=@(VNJT_q%G9gUn+M=IV(5` zzX=JiA|Ww~G=fJTTK33C@et`dX6~J#d3c44J>`qJx5Y8_i8Xp7P{=GG<7afD=cQQ( z5Qk8AY!0QPrF&$(Ae0>)#R?XVcAtyKlG6vI59Hd#7@0|E_k3y?qaN*Nq>xN zB{>eI68Dq1ZZ$ zFFZfMUdqgD;Rgxdpx^4e&U96n~vx9tg!FXRaBuE69?H^E*bREkJ8I6@KV zfxUA+BtZ)EGWV8`U9L??J(d%bXyCssddxIn5 zQR^E{FQH@H#qI%;vriz}rnD?G9^$WSr$v&0t?@o=FC?4jRzj9LUtrgFPVui#KIgiwbDfM% zTz%eSAp8x_9{Qt+?SNjF3ky4--D1W&=uXmAJ+G+fU#G_!f86Ex%2sC;Dkp|jde)wV z=I(guxA0T!0cztTAN`qo0TQJvnaOWfJpQX{vRM|If4In*=IojYNXz^CuHL_wbW}Zc zZGl?WX2np&Ml>gMvNHw$$hO%^XRPf8RZ*j-yZg|trlkJ5u7IDNBnpqyI!qvdRCC0` zRJ%VM@L$=f?aK;Zn8*1@n}4ha>BpZRW_;z_^=sGoo_FJN`doTcs^#Ae(Yq+}jIHO6 z${Y+D7Ql3)il)(zMGN*Eu9bg(=D;%rVS|jDl6a}dRZak|Zv@do-oc3^v=J)!-D6O0 z_Au~n%?Ao80sOSkqCzhgr-Euyjgh6qv~GQj1w5p(Vn7PK@4OI}LSvqINWbiu?%aMu zV+^dMSuFVuLCU+!pUlALq_S^ZkM`(DDpiPg%{1&C)BrG{%=8e(0ni$dV*=CKg%~_| zc9&rA1CqUp-j(wJk3+$J#bo9F!3RR``0_67IwPYmmho3bH5cRqLV&Xhw^)0aL8hNv z5}!SD;GOD88g7d_p_RJFR+Q0;Zm-~w8V_AIcB;F%&U3it$$)PRe?w+o*V3$t1vS6f zx!M(+McmOwi!`Uk@FiVuCfq{1;q6r<72FTOTBLi!0C!tJk3#PwT{~(vG7d>-Gi{35UuD8eC(P zAeRj8;~h8-Q-g-h+fp&HvfTi$&|(aW%_Onci+w!f8yZv+j_E;5)Lyk`zrCJ{fbE8Z zs7Iz++cT=DB0{gfs#nfVl$#O{c%e@aEn&vI`r1M{B=`-D(2`=$*yIr~Y<(yyduF?0 z2M19w3(1hY`LLANNo9`DBvV-M5(crL@;#m$D$AbxJ&G-JqN$(#qfHMkniq7i-Smo} zzxk@1R-^V8Q$2P83RdrZO*h)O$!<3K`ucsy^4t5%HFMe*`$$TD=OhJmnSTo)UC_y} z%ZWrTs>tVcy7AQ4*b9bbLg_Nd>jZjNQA{Yanosc@??n|%BlP(z%5j1h`f=nhmWBpN zl-}|41+ur@?eHexD^SJzFD6hEUe?$DHo}_*PxINbr5E! z9Z~^5Eq+0>{R5ku)inue63Hex5#&s>ytcsy?~U9^)ZO|@-K|x~d}J?j5B7XrGJNXG zL)}WtiHtyd@1o5g4Nmh9q#YV!h^>4_QrBK3xK_d7Ls<-Y-}t1vg9qKOHzW&WwO%$4 z$^&@XOOLnlUo1ZG<=mKMTk1h5g4|=ON4b}ZWFsPH@<~Cb@Il41)_1emdukv0V7{M- zySqUCX=*a1C#)zkE$H7Ui&~_r7nc?@@jJ+r-Z^fOnyTqHeUNt|5pYP%@rQ zBp3`G4F&NtU%TYJEoFV&m=5a=Ig})gclEelr;5E!-}TB9ape1ZVSJwqa?#&I35J#) zZ4ew7`bBV!Q#;Mlq)1N=}jRW`^7zsx7F4^lL~;Y z__5w_SpWRHuwezJ+fB8RAYJw$%#=v(uxN1M&xF!V@sFp$^Wyc`wSgf4KBskLGn2qc zd*anVetvO#BNFskiSk@DYJ1h(;T-m^&X$T;U}J^(^@|bzf*Uj+fJ5i!+gB}CcLOJs zcJ3I0PdaK4eKgzZ_@ras0daG}!_1P8Lty?BLEzle8tXKb9;ESJ-;~K&Hz3IifL*Zz zAgsPZ+LT2SO!M#~NJcBkklSe;RObm5e`q~^<$oC(vUax{9)hVM?N%PDt}(<5F+`Ub z_jJWLshMBDit`^-_j4z9;<~AI8#n$9NAgxtg#)}EDp~hzrTi`? z3JK7bg{kRl#L_LC_W0$JEy_kzgV93W(B@ew%^6)uw-BOZ`U#6(7s75)>dR!pZHVd@z_eaB5a5hM;oH%rGs_o;?v# zquO4%1Hl3?UF3+uvIi)GcR`~jqa$CW2WF`lDx)tjf50N>Y^u-vRVNZH(s$II*4vsp zf&y(Vmvg}oakd30kg%eD1Pq z_9S26-X;*H=vLJ#N=1qes%;E0vti||(}WdxG18aa-IWWWM(RHirx*~-p;-yMDg6S^ zo_UpT+>0Agzg)JMRG zWtRwo@~tseHtTBFX(^PYr}-z4f&f2j9Z3=!LN&#O1?IM1M741<07#lbW7$UPh;&uL zNHdf@=Zh0W>0g|Bhn1_|Y)nrP*`>HY1ceEEIzLuut&3&Qk)PTJYSNpyl7UbWJ*e2v zu$`g8>Hui^2)%%#Vj9WcZwcto5W%&?al+{;zs0G}0^4qR6DSkSfTsp}3W9Ng0CX-v z>(!MRE@>+4?nL^EU_&x#Kh;@E*#G#ldJdZ}yEKj5G%OOI9+_H_P}WHt<8~^cKP=A^ zQob18lyhhC?<$T8J@uuDy$w8P?Q>qq8Qy=znU;N8o{2~jo-pqYK8B-sX}f%CzJMF8 z6@NCx6efxeX9p(a~DAs2oMEIY&!X0wizSaj;!8;&YcCm>0vFydOxaO zVE1d~yt@~w?izwIZ9OR{##ZN3E0m~)O>ZLEyLT=4RVR9b#HW@D1@UsD`WHXy24~q6 zDCagRX#+XpuP|`AS&p$GBCm^`r?mh!ryv%l&Vu8x{IAD3mJ(fnAb!8O2Sb)V-T^He3>)Awh6%o4bu8}7c3XBOaxsyg&34v7iFH+N$kK2c%dcjx}Av`l;_ zuNAZf<1)ej`NxL(G?A^su`_x%!xU9Uj(vFa9!-%Of>N@xE%3cCm9*=-igWSGwwHoV zB496$#Kci&T2!z!NZ^n0z-;d&m+9dyQc#0)39l>)BXFqwcmBruI(EO{ivjx%(zFha zrImCS22|h1ngbL|w_2vAFRf*4T0ypowHp}fMpmO7C!lrSblB82=CjR<%)^X%(9vc# ze9pD_*S)l}@&sc1)9X~e%7yOf&Fp@-5MQYxs#Rw=cvq19I{ozHw{4{=&HmAd)XdVc zK>=+owBQ2J%d?6a0l$3H9LPV!zPDn!cV7*YxBgGP^DF}HnH7?a?EFKWuOq5dgVrVn?m(m3ZGTiT1qrPL++Q{ zuvl3?nWf*o)nTb?AduJmbE8FOSkrwSyeahAjA9F*=in43P#{L(4JdP?RLgH%zaGO- zrdF1DGAQe}%#vgxdl+FRd+|wClmtAipjSPg3)06)kJ9=Z1zu-?G1}vJ=bR2VTq$%G z9(1tHq)L!-A~r{LvO6E@9`nN9ADA5?6?Jlgzy`ofw7uMSes4N?Yu1v1zsjg*e}L=S zAg);!oI=;gLP^u1*ses;e|P@C-HTJ~MHTzwCL)hQV%()f>AA-KuJDMj-JNiPl=DcCQKKS)=8Qa5H@nDyX4y|a6a`;{y8XBLncjJ1tTv7s8QKDSzy(dj@-56U7l z4>vb!pl2J&q*GFt8D@`n9?qUL@yA~G1H!HWCX4$|x+(WBo_2~^eXRtt_n#SGq6sXx zsY|_Ux+K*|S7~U@?d_8&%j@}8i?Aej9ehLD4>L1vVS%#N#_rd3rm1RGqJ$fzxF4pr z9MF7H7mFv<D85|8Ao9ngX_%@yk zq^dNQENLYJ3+hQb1m~0muO0qP7#KS|_DGn|yvf(|y7uiP2GFRNLu~rvK2aJC#ozb# z_^~ts?{vAtl{#Ilh!=>Ry?oqvz zIxXz)V(L=@0obI8x&+Wj-uaDys6wqfi6{!MPV|`ReHSX zUxAjCl=MfklgLL!K0qe_!uiN8>{0|s`H<&r(zwho0|T$Da)Ba`Bl_o=o@QP5{rfSk z(_w*Wq%%T1HRP@FQ@wKk-n`ilvWWSfOINalBHu<_;&0ccS$&KhkQp5VF-_sCSFilc zkA+%N1-(3)J^rM+qxh3ri$l!gWbE}PKAr$Pl-R$zO#Ddr&TQgoTVn$eLO97vA~pY` zYfk=aXc<`>wV3_dV7ec6SPPZK{zu4Qx-g7=+dX(|1=37&B$PAiBml8jq72of9@J`i z54Ewd<&UuUOd{yW+n`kN1esbe?7uYPr#mUTwB5#?u$yIi_%&(s2rTvqutZ>>YBkR& zS3xgB>(wB4;iS)do0xmo+;i%7kH0r5_{h`#Thq?Y&ZL{e9!e2E0L(a>?mj8MdoyTr z^*6)WJ0NkP`=ky0WgK5*OW4OxAZ3!geRbzOv=>vwb7H+RmVdzH_fQrdbOQ3oJGxI) zL`$bY=7$z7E~HkrE%1dIDBSz>2YRg~I7=yepmDAidYj=Le8-K^gJ9Y3c#2YA_os*; z`n}xVwY#W@R;umF)Wwy)p*0NhuH zULT}72zvcFY|AU?BW-*+5K^PNHU|=5w&~$PNI7uW>w?H{*}2%;LfVc9Z+>Q081nVYYK0UCe?X-6 zo#5(&C|Z2yb+0e!#+BPBPvchp{E3o#UEIlCz8{~DT(*zhd@;t>(?C64$55atJY=Gp zPnbDr%%RhOE#eKY_``wJQg{9N9reehy(?|0<;Z1e(=HFBj(2}Y)(*=7sQm09S#jAr zMKh^Ii;S_wWK5p?Tnx-`H%a2pG#z?f9W*VJcdn3Lv#6Dt>LXLs=8#dxIwdGLD_U*)CqnW;32e<3w)jH>iMvN~ zp3;LbUYS7puTkTenE*6>vo?7Ny&$++Q)#X8OdFcI!^ZpZlHe@fr6>gQIO&^ZuNA|u z-RFf`STNh|cEWc^cs!{L`q(3C)KZ}SK*%ZK^Fw7fpogU!@`rtZYk(ATSx&$5;#At9 zx?aRy+>rfqGx%xx`B4h{YmEGr-%t=ai#c9on=0b4^PE_Mi1>;JrBlyc|I$<}a$dZ! z4eZZ2Nk99&Yg6vNm)^2?a!P-+_UjE+OxAqHhD+`olz{0p68D}lc&PXY^ur=Z6O~*6 z1+jdmbsGSoHQbx4rx=>DoW%g76m~iXQcvna9bbwB)L7L+#~{L3SN`5%#$H}~`~PI{ zg5g}9C-##-Z~VF{Do^U4ES~v>D&E~O5a)t8@&o0<$)Tu1;%H!yT$%rQ3?HQ zwc%^I`SF(X#ifmBpk2lkK$-`PZ!)AHEnM>&&sfy+JRoj3d{0@(iNT3v0j)*6<{X;w zwD*GCN~ulGU)at-fGGqecjJD%!`X@A7VytIb)@HVg$fidfOj4#hdYW$F&O{LM@N9Zs9v0{+?_xx!{e3Obu8WPsL_ z=S0`=G~Ik$wS7()(c4=$VY03eZkYbn9Tug=?)#aN$4PxsX8xQDCXvthV=~3*5 zVL|CAgfVXqmss+*M~7$egbrJaf0ih`@6HM^x{X#a+G|h=d zz~i~w%;c_Y7gR`TP~S*CVV%SW#I?EG2`5YJ>(@gf9|X~^^@g`t;45tyQhVkVTG3ow?@4i_k2+BY(?1>+5GD5O7ZCbcu| z)F`HfA}4U)-bAKr8(;SXzYQ}=E?^0sRN-|TaewKQFCuYi%J8hg6p-u+NG(&V9fPM`b_lQ1Xj_Ahn|!=yyn1+iYe3X5h0x^%UZAy*x%jP&&Myi-R8PJVuXY#iCdf zj{bb%wfh!A)7&8bLR9c}lxVi}d-S6!n(XYSjJF?Q3AdaB<_j{3_fmh9ENvW#RmG+} znY%tHF}-xkpZ-b1^trdgM3`e-`qmVoOplz8-lA)o#4a}o=_oi&&4HoUqNlqRXl+AK zN@p=i1Szp(T@N=LuTzX{8@E#o4=)z`O9czPxwy{5=!)r+=*2bAH5@317Ah;{gBRq< zTUT|h+Ujzl>Vw{Tm0bQn=Pk_v(o}a=W0|GI{JwDuUVrlV5kMFW1IemG6UyL4%X2ny zLXWhmim0Xji(ixdmESYc4{7$WBLkk-3Z@CJOF}wRuDb%r zjcQoylaF>1i227Z5sjaO=mzGU7Z{zmit}8xvWHPxLWqUvAD;^Y`jxZ!PYMOIouC@L zjhj08QJKFUmM zvLGLZ^r`F)ZCb$heaQ6Wh;|>!?#$icM>l>}P}jv8k`&s77Z)d{!Qa~bj_gt;ok1GIu;kRQPx=5;rb9|^mO6=(x7uIOhqE4HSP0eKiUCmRq=?5^#;+%l z%#Ut+rf>N9Rf=EYSxNy*z)*c`zF7O{ME#ick*DDQ2W@Bbw2wZYob{utl8$rgd~kaV zg&FH2ePQbfq_Jgq)M!?5mkCAOKYkHKY$gflCr-?pe_R-8^XChOPJRs;eyc6sHj3bx zoA==T=tOoA^t(QM+_x7Q|723|Qfq(}-K$LV#KYTrK`2+kY1EwYs~9pQ{XDc0yh6-k zAHn6I!HvQRa5#J*fxV7m=y&5r$kWdi_FU>WBZ%=?a7J{|*F^E!HfDj08#Jh2z~#Ot z1>q8fc3jOaK$4AQ(w1qKdqlp~XuWv#3v_$i7n4rJ!K~2E?&Ksm<(cpSa>9K)H`d)| ztf7`wb(wLIMgouh@$pW9=281B0&b=vY+L=Y_x+2b$1hB!Bb&D3@q{k$#NLWIJ(5$$ zGs>0W!*^*9A^Yr-5AZ4veY&VYK&#|{x#i=OuZwkLE4Po`8%{E~vo9_%X&&(#SC`7y zxbmTy8YA|oGsc60wDT-$PbJv%F}z$N}kNyTvLS^;ab z8L3VL6Nmu0eF_!quyn#fGZd8o2CYWW9dd^_=rZL5rb+gNaSryJP^iVoUz_Sor&td# z(0M`gAi%Kl@|akj?4PSPPBE{F=H44wK8R34#u+#pfE|5KN7xh7_Tk2E|`r0(N&Gyix__qNS4(QX)&!E&|VXk zY;Ns#+x##l)Osy^pt3w9EieA$bV={eoe}CFP2)tNa-zQn5=Zz`Tw0lye{#QBFw!7} z4vYu0I$BIWNmvy43UC!(3V=6L|NJ!8;EO}ZAh0bzSzR~-gPz>b1&}6 zEvD*>yiqwAh((PuIq*X*A*V{Xl@!1Zp^j4Mw(I!Pb404|eISJSNbBN17UV72&XVL^ zn4L&sDU)DOB2i>N3rh*3WA}P&+Xlh)4AYS1zHuvrLRWPLYd~N2D^=EMi0HoscAcQh zpM%?8`s&ex$=;EX`WHU)U4UvjgFL=gOBkbyMq9W$_s7O&i!L!=b&8;=J>wE%oV(EM zH9yzOdeiMQH)hk>N-<(fWAJO0C+FT>71LVS`~FprjYM5N-#l;h@%&ySh<#G=V{rA= zD}~NJY>dAiwAeUc|Cq;(IKw?;NV`P}${=JE6W4AKW+os(KgHGlTie>09GhCrre2jq zjK@v&6J~<3*LAn(6R#C+xa~#Vdy;+}mrx#pboy+t+F$ED+~_>8A}- zu9=UP88L;-0@9`6X|9Mi*%*>Qrw5QRTZe$S1biglZH3;EogAD;CTlQaW*t0CS$n<$ z~W@^1WmI6scUxy!+A(`fs7Y&FFyYS zmJVsg959gX#(@M4!pss@E{RZ5K(=0EMz0^j3-rey+onjP15ybMhS+k=33tSW_5_~r zN`hl=QmQ{crnH?@E4u_ntw9OIP^HlA%{%@(A$9E2!@t1|uoSdYNFhu%(c>u3A7n6k zdHGkps)1~G>SNK)S{ewr>R7A6jqds&`%0 zNgV6%PQCoCjIKH1p~d+1_j+U|G4gF>S9QNU_4eu{p4u}m+IbE|oflx&3I5DDcgh-z z`GEuhf3g?2^Uqv1?%ZKhzo{JVEsr6$l18x0_K0@B;RU0>tL2gFG^b$3M%3FlcHwi} z0_v-di9-1itcTtg7JwFQXJu5?x^e7OgXX1tO!+KM2h3m&acTDK*K|Hud=9mCF4yEj z@hMEe$1J^v1<4|4utQxe-?w#{dHif^NZh3<-G~tLBiYd}*J;YYDN%!Ci5Cu_IyNMS z+y4h(^O#~c!Emb;mk8@FX$TL_5QJTy*`GvEBd0FCzyCaq*p`}*Zz-XhGdLC8?G9=R z;#|I)^1oBiTF1v-K)v10e|iva&(V50tT&H-{qN z*v$eC&a2e7<_zQ4sS|MyYzeiq8mP{fO8ERbiUatyP6M%bM|kkOnW{=K(iH7aInHsD ztjLi7lE^Tx^+xbE9U($G#@7a;8LYrCmIY9;N~`kGap=sv?vQJ;R(ml|RwMFP#Ko8% zg`bA6xY4J%ogxw>YA4(>_R7*5q`a*S(ZEiyq1XBGkyhmd*8u+Z%5c_o-cC`Dy$=T5 zD{^RD>-KFWz_aQE>DdWAM%2Tj=q#fd2JCeeeAwT;CT$)dZ{0vta*}nhfrF~;`}^NJ zPnCjRj=kp~V*NYu>n(UCVG79_9LVRpRz{5(zw#j69~GaRDKK3`6r?!zrW4+_Aqu<8 z>{*H-9rgjEa?}W3g@$MKY^zrDkzrK7qgnD;fnFck2?p-*U=XJv`QHU7fHrJ?{ z)?$Z&i8N!d{lMOvqWrDJON~T>>bHx^F97!m|Bp#m5(1(tC;lKGGmyetzTk-#^)^!X zbg@~1DGqU+90XI9nMBG`)P>OOVp)ykhnIV>a=xjV-hx#zEEQ*%APC@|I86o8WIX2I z$b3C_yII*{o_zde^5 z0?l2QtT5D3i|W|Q+3Vq95gmK-aI5et4x`YE7H~a@v-OR(7z`|8j_43Ken9U&IS*pZ z%4j2N`|l9RXVvG#lJ|lU^IZ)_3mIU`>p}`ldEu_z#ZIteuixC#Bz0&`a3X$#h72Lu zDldO$6G#jTZI3JOARwGHRb{5=An_kd>q|2I5d0NTXeALNiTN^1+OVH@h^2tdtNJfJ z(j5JELgg~N5@g8`SzjsqetD-4XwYNQd@_Tq$n)S{I!)Zo#Zdu0Z2B>+%+$$nAY`PC zPW{epgbkCTX1RyaLpnf#t{%jAJXCmK1qTd8e9XNjIBlEvIDGwZ)R2xia)a>wMBl>9 zr{_*EsPl!r-iZ;V%7lxVvbb;}#-;09U7$?czS9uKom;%dZ%h5ReanthddTo&BHUKj z{kAeo=RyB+9trJzAH-#VEm(%_+Gqj(WH$wKK~L|NVZG?d@Eu zzcOCcW0L06KwxMFd@~3F)FfIEPzpOHwMjW6B;UE7k|^{}e&xY!dFr^W;1>~uw@S*t zkf;{Pwz?eurK$RqydU!jZ^-MFD;ZPu7QwIUso4{H9l;B@PBlbVU?*6}TjYm6CtsG$ zU;F!6K%hAWK`#{I7%Au&#t`N|%iu<%iIw{WgYFT>I!GSEIxmi69?WX6zajl1)uAz^ zT_k8p6(-f`Zw-B)^RL7#9ZA-`^ft?Yzx}t==!Oe+0*A7CekV87tk_%;H$O z2gk-O0)GiHUl0-=xh!c^Pb(0uof15xpyxP4^tH(-@scW&oWbsNMY23v`COsEM?>!( z$fUS6Z#)Z^)ws`W^Rj7yr|O=b+br`9(==FA%zNk~DL}R#5kJS=q8d!^#WV^u4OSd~ z@Y))?98BKIfd&>Yf8E>fvV7*%$XiS+={bc`-!HW*Prov|>=fE6fm8v!SNu4`?Y}D} zti3XV>NbnwvnV!~-_8CplPU7-6xVLz+EH|kdH#`~U+c$ok9DN_eHCi_tdII6k(cQt^|!>_+7$`M}Xu7C&*%wXk%sbc(89q zrxkF77lvJ&JiF<*9(?$ie)(U$a0jMLmY;~qj;ApS#tZ&?mfTou9e-$0fE(oKBwZ>4 zUa;}^XlRF$Vs2|i=NFL6sZJ03V6XGxD^e%{=o;U}iFe=S0xnFcM!)^cYvubrN3_O_ zno~62aF%U*%9czF9pk!{q+d*+oI|;H7!qIH|xvtu|23? z{F*)FItt~@)jEH1kMzpv`mv_Kor8!Ws>h(X#1NY=q|5~8$w9Mg@b5ik?@6U5g`Ub*_|)fk8$iJsywKt)Y7cJG*`tgpTblIG4~*SEq9Nef#!F9L^TMzy7&7(CcJ;ddh_*WMe|H`CLvP?q0GV98fAm+91`~+Y52{zy@IV4BjyNBp4@%k+Pkv9n zkLeWcfxOrNJ9tb>g-6|WbwilE<&M3ca8b3dV{*|a)_xfNnB{O^0k@Yh`n>#7+GA5O z&~11{B|PvaTXe9=-1zya9FaTqW(jDX;H^e4jnrz|@e{=%Wy{l#NcngG5BM(CyCnO5 zxIj(P$V6xp`AOY`eXt1^HN3~0{{kA^bP~a3f3Qh6>;nyp%>!)%{qC_gJ3+=mhs3*0 zN#%UkoPcEA?=q!g;A)rt%IJ<2cAmcMmdVfGqZ?Q5zknx}#@fpFZykIebj$w&{Df$@ zw+Mbry!DrjShB)9wh!P6<%C*$ZlWp<(=M$C?g2lDG$~7-S=y!UGSnb)0aGid4`My1eRo7m+6r(*rt*5*o|nG4uCppwmA{)KLHvMq06YhegmgU5zdep4 zzO1Yice!&qRYD5HTm6+H}>p5c|#jizEFkoFuzOclGVIMFYT;RQf-Qb!>1 z^7Ch$mXRrY)E^w<3>Wtxxb9<+IJ03=9%>7H?Q)`!gO@oCdFvPYMdP)fbfluKpKoH& zSNXjJ(e5I}gtul^238PRcQBj(5SZgHmn>wp4lcf zg$So28!+(rR}~efX&mJzS26XJqc{}sAC7f2+GFh z%h9fC@&LJFTQuHYYcF}r9Fo~$^9?!tbEV3qD#A~&R>{DHL(=WG`K>iN^y%-F75xx- z94WOv8Ln5-%9C4){{Fy|yNKxYerN@QhKEQ=k9!26q;vhJA=Xn6U7P}qY0y)#@9C~r zfDUEA3~UM_V|4_EZ311oZd`4fIq2F3lPz=rix;4iG0qV|%4v%FW?HE*P21HV7@eb8 zkQE7&Arxs>!%e7L_?U9%19#4Q;m6mg_m5`0j$hXSdw1y39qQp9wP(EGg^1OPH$;MK zDI^{&L$3wH9Z)?H$l@ux>~w+wDj~m~5)ZUk6{X?6lWL1D6{DXXj)aIpv$;o2oLY4# zW*9DvdgUZP$ot_!eHjg#u&rbruU|>}#h0xXW zgK_73#z`GWi7p+Nk@=v371;G*EPT}o(nJM8uBGX2hqokcx=(a!u3E8|G_hH12^;m4 z9q7)506FlsJnQQlN#8okHV+a{cq{0?-q9^sFsS z1Jx~`1Csg6$eg&=A$hOSxl7otKeC6O z4+M3vg!?o2@E>PB3J=^e;q7lok*<)pG_7dW869>l_|&JAJ@7H`Wmo?jOW?ImDCgfT zC6!&E_)I|DgZfw}xWI#+MZYj7j5R!*eHR*M+!^jtbH2V6J8r%&UE1AH8WkdJISZ#u1Z9_V6a8i}?KGIRUFAIk=Ts9((|#W>lKnZ#|G$-X zx@KNrn#r0_3z+HRXsEItf@#EJ2gLx)=W=Fd6da}5|b zfSjwVnjw-9ITMWxbks_t)`|(2`PEZdkn&j8;TsU%$SgM_qi z4yJy_5<;>E*}CAgr5*)Gqn70%8p4e77d2>>r2q7evu&TT!ev?dm;dLPF8@nn8DVei zS}?^dM$XKih}(ZfO93-xUu-@|?@v(aE0OAkj!wJU13iH-Zl^R4~SFLEf`uEnSRMkM%U4cZRVy00An z#ma=h6~r9y`>HA$_nm@chO7O6T(g^jq2GXA7H4$_sGu@&e1row7*N_hlI;4SP?K#2}RQjWnrw z{rmA|*onQZe?NQ7VOVvnT=2NM_v3#sCeHt;PU1cm7TDW6xCtmm$XoiIZ|BKmY0Ods z@`wIIUkooZH2(Si%~5%#hs{PeMnHO$IER|={5U$=0GVq!xcb0tf7dQgN?=irWn-o{|@3~h{5k&HL$>2qX@|pP(VOYPtVQ$xw|<3OTR((#EB};V2!jqkk~q) z1L*O8ntE)}Ls!A{SoE}wObfW<-=+Da1>l5%O_}4F7U{41!NwU;o8!?K8y|PfV;6$U zeutp)^y7YHxPvriLh9Isu>eYOIe07m96vvQovfZ3KsgBzIDu_bi2c5LpIZJ_4|MN& zn$`O) zS^Z0T$2RaxXmi<<3WQldVsAF<0=IjLYhRySzjDIG;qmcDr!kmnV3+f;%L&4*JNxnN zz!)kV6R->@U0HXpsKK${5FC`bMYsW8RD_xQ(ZJuMssKn02R62QpLVN)t7`{Z%&uxH zKp?>HhLiBNQgZ@}%uSDsrANMX&~#?Nsd&StoWXd2#4VN(#MeX*nF|qq{y&1@59ED1 zXZm33b8g-FZD|cgX4N@h(*+J^pRY(mC44X6CqyN$u+Di9q;?Zr-(;{HQm=|8G?a2z zTkyAUIPYN;w51u>DUQH8;|ffzk2tkmu-} zQMTjOWfyAYJq{m@hVDsUIF;Rjp^=nr8geiwOV44)3dz?MCl0OFzqUoKf!Y#Y2K&qA z3F|HK0>`xG$Lm#fW#PE|-JWxCkRFQz^At4~@T+3*cs*8;nl-<#9k3_L=a>|1h7%4A z{9tUq6kO1ess+)DzRV`+n+R*qNS9J4P03F0*w`4%|3;x-$l@8&tn^-|AO>^`Ve2|A zOb>kk0~j-JoUYM^l74FhY$rY1{_MEP@qvOoG#`N(pZ329n?L#AYV`q2dde^E`E z@Tzy}<{sCeu1X5S1D8mP4 zU9T(QHy#`MR1loBDj#%B5LvwO(gqu{nEq|RYXQvP!FdwzBp24pi~U50{5}0 z_W|Dy;s^xf0Mf-!rcv&GjMoq=K)>*MaOVt%=E7)BgKP&l?(82wfDSOj+M^OI2%=cy zm%y*I0+H)bVSVK{Gs$Y5zqg}weX!`gvhPf$1_m_lj-|_-=kb42V_9m*xf*!8HSk~(- zbsTfQlHV!R$g>0yv^eM9JJPr{l@mINssZrq$mkd3AAIP;0EzxW`&*Jr>(#n=LJ_s_ z>U-$p_pxyhlETS^e+=)DMPPWXK9{w!Ci{=8I}7XAzx#(V!c2Lo>eJpf5{0&EP{~gQWrvK1rWxn!=pwH~vVS@3Kt~{qGica0Dx-B&!*a6q zAb1+2w0|c=5Pt`O-+G|G&DDxkuXph8{H8!UFt-2Ci-s6X_%N)I!R*{zpi20Z%7%xR z7a1aatu>a#Reh5lU9(H=yg}H1p`5$V8dP7!A)A^Wkp4OgAxn!$hsIlr#cpV z@wdOHDULcF#D#H?r`jMEglvW9<@t0yWE@Wu-a7OL`E(4nMgGWej8u}aK5wIIPj))T zku04=XIu`~py7g&VIdDXt&8NtTOZPTz{1uIPKOvELf5aTm}0y{VOW9!d5Z?QVH|Y| z0`C>v_Jtf8pcqr1L)jmUJk8+L##(?0_n0cRqVI`WkK~JYT|Q5CgBY+U_#piI$JIca^r@twu*aRZ)|EvbyUdOr zx=r*W!)7*oUdiw|4?DEI_YqGRXHzd`1{<$8wk1vD-O>>IO{xZ znG3t#Wg)bo(sY{D_c36~T1a)ws9=t!QXAvGiK$m|`h(6>-4z$9ObyV!CnIOlgp+UP z8i`(RAt|_CFqN>cTUGDWZy?MNBnCk`h`~SC{k16=e$UP5BH(d@{fb+?*R&iQ#+ah~ zHF{7hogZHgPt;4x2mBtc_Q7O%E($k5Pp6(0jD;{p2Infm_3J44)C^IJ=1!pb9SN>@ z9*pqPX;9j0{R~!gdQoN=BUp0lRx}gPuhVkRkN$lQWtOr$Du&Dvd(Vr+e(XdK@J6l| znH_(Gb&9vg@>Qk*!WLBCI}t+&p><4WZ8i|3FXqCI!t-j~7r5iS^>I(<-CbVOx&TZ{ zKK=K;#>nQqqvGYM1UbKho;MjL6rD4k^)VktPwNwpAMJ|{0j8rA^iT!4b`O2N9J|ER z$BNq)L|vi5r<*pTdPYV!(qDvZOBS*=$EW%)t?!mrxGwu5=q_QjgTw&0jLXLO19T@7 zHX(cLf5Il6?^a_5sc?zT8ty)Lbfrg~&FgC&ooEAyGS(irnG47(hlo&LtAiPn7pI5q z-)D7)UYtUys&$a0X+8w~4u#1k3V%~g?xrj7Dmsw2Jgunyy+05+!{wSMAz%bbef^a9 zUUBbE@gKiE6ZBsqQwYTKX+x|Ht?R6(Ec!Tzb;lGoa07MzOZLDfZ9?)E!0z|a$>Y89S!%Am64zhR-xKcqt+$UuN5n&?6Qv%Q9uHbO2#;(&9wFuPK>mkUAE$uPwDl zq@(8X^Qnm%&)8+(B%&9xpqN`l2QVRS&(p?Xze*F;Bsg(<_9{(_IoHh}Z;*eh{GrecNxFV?n8`Dqg0}@t`N4NA-lN6^<;@Oc7Zo~EavLEV5K>RN3$3w8qNj7^e7YIE{4p{^CD6H}yHn z>H&`VY2(C$*_UDE-%eyg4IaMmf?!+Rvk!G;3dDbq6HsNS({NUBNG4pLom~szJ_bJR zD}InhNT;slAPV%}C-K(ebLkP1yS?e~{lv9#^UO^n)zhmKq|5ap(dAkH?9}8ne|vV1 zRO7ZlRpurwYv{tVt+t)_T3&}18fo#&rY$t4`z@PMVSfpI*$a4-z1^VdH6rmXLKgWL zNpS^6UlMZ0U$OQM1*Y8iHkp+1TTBT{KaBo6;3`x!IMS65Y4o^O0Qh$~Wt)MD7J*~|%d7B)xnF#^lcTt7@jop7U8`VsJ;yB@7Iuk+(nv}L_4XW+d#gr91!hq15q#{qg8V;MhF zpW=NT{2lJTpogsXyS(8rYeI+3R&bK6u%ds~tYa7pU^X|td#CzG--=$E`S2gTC|kW( za5sPdNwsjaJ`Y12iHB&#_mgu=U(lx<{PDQIBc&a-w;byn@K&`Ao>SR9wd&vmje6;UO|Kmww?mFw304TAE$(+Ok;8@HKf#2{OGDsO{>Bw0YyflKcQE-_YE(O1D&0Y#GH@f z11HfBK!?xIdx~VwB?sIhkaQEDd_B{2?0jAf_)b`FeLVQozq!S`ne>3IhdnAm8}_F= z^(sAn@c#N4(6dQ)tgKv6?qpZgh5Nr7pc~SM8tXqTPo@#dRVVHl9VdL0INmU>{in*oE@k)-KpANarYLE zyZoS4jO@^h5^;?ScD#G3QX>?~?dHhaYsEM%E&oBUNY>^sB;;{|CN}+2@Z%b)p6u|_ zhqgJ06l+!(DDg{rhn|~baR#8nq?RSTscRVCFcUJs*A3J4jrqwGO9w?N?m?8kIJJ^3 zI>g^(LGuajO+dx=^kq8Ss8G1KS+2=fbH%Uqs*fOlkVgJozE<#s=wArVLSqxkxcfl1 zq!4bH$DGOm6-8F8y)95>G-c0Bq%Xnkzymc|jSQI2G9aFgQ`#I$5eHF9=P)2bc_`;* z(h}xL+Ds&56nyH2*1XYumCu9r+fLIqAw%!ib3T@%uiXIQEr4!@ zW@5?a8QF_o0KftPXuq|b0>S~lm4`WPF+AlVg{q!TX-%FVc$`d+)h(oN)X34>TPw8f zQ?(k1y|DAaSFSi6+{2zFAJFUp(2M|%2xoEx(8@(r*w*Se%<$Ze73$No^eWSZB#hcM z@Dz|5Q`jz-rOC2d0_ZcJ4@D|>6v8qMl7fUVf#`KPyud_%hv;v8M8Ijv3^Y8+#GMRn zc50z}lT4=hzuNoucc|B||B*^1G&>>0r%@s2$RVMfK@p;e93$j>n4FJ$+c6Q6$svQN zp^#&a<5Ur%k>g-6GM3#_j6s}|KNK)uC9LATQm3je&1`Y*LtnjTK7*5 zM25aJW1pk?^Y-(dVtqip9Q^9?<|1-kO5TP%vkFzOgI~?wgkfh=CDS!jXk%Po*>7(n z)|`Hqx|Ag4=vmk+bDOpZGxzQst(3b5VL`XykfZO`GQuJykE8E%M?AQ#hU|vQ{Au87 zJKK^NY6Xx}-YtSM;H#QN$Ij)FJ51RXsA=I=@-+0yYo4b9hG;U>>MVdqmC9fDJoyjI zd5cGt?T>IqEvK6@WdHum;#G=uYwnyoef3;9w8-_FD#|j&SYw;)5AVfe?+)*K`=p@MLjlYyp3KlawJ{6f3MR5 zxPRgwmr_iHkPiH1M-$U4f>^u^4}2p@f~LFxG>s7=%yWQ~k0u;>uY%ag;R~!|gcV4# zpw5{TpNPPEwEKh}_~wAfoAdqWDT`$h2+ocNog2k`+RW^SY3k?5hQ0UuM*QU+1ED$N zcSh+P1HlDVb}-`BZ6iap;^`dG49qR&m1UL^E)Ag5#-y$gBXUc847A;5&BmpH^TPw4V{R8YAO+ z6t?w2$>#^!?zhj!D3B+!pZo{(I__uHVRFK+T{PqS3VWBnYae;s)*nslnB z0z`GRA(*J(ySQ!05_0@fIorq%w8cQJUif@X{BZ)z?ubYEl-NzSm>WFvCS?=^oMXHf zi-{-w@wGl{|JQA1C2Iax-J}M=Iq0#^B)QDea+e;QZ7Po{a~5nBb^0;efe`Bdey|A% z1T{C1t(tnz{8>MyX17N%8!tdT+6$VlyQO9$FSWS#{6!${!`DLE>Qv9jayR*`WIvs9 z`M@nXIuFznC1Tr7A{tnqe|wRvQ=NyMxs4nGb9kC`N`=6*=D_pNccl*S#XhtZe^uq} zV}$a*u09Ec*6qujt8va}C>$+(FWd*Spc3$#aWeO7?;X4&vuL%UO{s<3M|aPn%5mdo zz&#y3=0h@WLnJp`dK&072!-^0Ki?YYD8o(c!4A-Q(FX`J5GbyZ{Y~y~UWuYa;f&Ji z7@Ji&W5hHi&oS4lPew9;Z0rIf7F4d?XT~I6FTdTDh;HQ%r#=$o&oHmlvTea0^1}j~|u^SVys6@^Ajjy+e6% zk5{IhM)vJDE+N9IIgkpAq9@O`v{lqIQXCFK2Y@_F-Shs(Sj(Au8!0{Q?CZ*)IFsB? z3osox>1W^h`20wg(&5dc?s3QS-3FNr7IGgIOrV-r0DjvaM5r!^hK2gwBt}>j&%m|} zJC9^46p!C@)(L~h9FD;{?pZU*44wKRgYbZ{A_e^}yz-uWmz9CXu$dgfF?K?s>;`i* zfmfu@{D~Gi%YA50o<1MgrAg;>hEk5TilT1 z)dD$_i<2_VG8y5xlRM5%vVg9xE&IMsrpQBH*iyr&>X<2u7xCY| zCFAx@Od6C&(-E4ub%k}FV&p$*FA zdPexsLnD5lFz-kMKD(3ZF&ZEG@muR3Wf(}^*qbH{h7Zh`B&*Xe2H9pVJhR$#( z3g&dpy=6sIi@5^Xvzxc}WYq|cy`_bC2cPfBe_$~7aLt3f84q0UtmfDz8?^RRyqZ2| zKYd7kSN7_YUYHE=<)4E`Kk690m1mNGc?j#zM4i(ze{?e*&h#nhD>+R2IgXu&iCyrU z&SRhJLI2A5HKxJw)$emk54GhlxDwQ{vAWx~nF-?NJJ*u9fkgjp0gr^>J8AX1`rF@hbFH{jdU+6Gv-OR_ zhL&hK_@B(Ns$)>O6KCPHI~$EoonzKa5Mh?P`w*!h%w7xMp0ioh@4fGiGzY3i6FnEx zR*N_@O<4+`W%=oZT-W5*g84Oc&=&71Fy#o#9&YCShLRT`1Ulat%7gb0tRiEGXF%Zv z4%-PGC&_Oufur?U8CQ-Mjcp?^)3D!TRTY9lL6z|mL>5n>Dg_*`QB0r+sNXdhW8wRn z5_J>j0vDamVLs%wK5SD!1pm>k%g+IG>%pL)0(n^So&s$Jrkt4=A8DFPb%wI2gL5)pMN0Lp!}S)`Yv(z$mM(9 zu8T$G<@8ABX9m29Y8a2HV+b8NIu~Z)L#k=n=ygaDe%xiZ?|hZCdN;Q4!?a(S*6(b* zp25qK`Z^KVYZ9whK=LC6eM6BPs_Tj-TAt-DeIrsjk-4gnaIC zpo(GJAtJ!r8=NE@$N#!SY`vt2i?# zgS>@)&EW01l&Esx((C)n8yyl)U4<@gZ zMqHZA4ahAfi<6f&pz&`A#1RS)Ilvkq5~U_fq;!D9l7?4J!8%TUc@LeCC%)D<-at!x ztZ3hn0HqxwGl;m`2oZS-D3#MFxNHY{A@)5#dWj7g2l(wGGEO9C33X1W=@23rv6h0} zip5&*QcoA}R$yWDiyCU#5Sd1Ne@LS91c_@Cj}aElNrFK{>WkKh5j48@@`2DmCA;7F z1k`~6%u=uk%6E}(;9rpDnF zRaG)V26@H`z+7j*bnJ@}85WkcyiF%h{u6xLlKjY6Us-EB`_$Ej#O$n4^j$7y!crnh z2GXJm8)8`?j7X4$(c6I{w}HrFj0qq7YW?OKYJ)$50a5S3HzH|WW$$q7Zgb(q&d=fZXN5*;7+uChEqOINh2s;d8Y&^~() zfG>?p6ONk*U`0S1T9TBcngR43dO`gy9$xAlCUN~>)xwS$-B~0(CWjjukVLXBbc7v8 zT`)l_-mG?dTNgGARq$P}F~PRO8mM#ZO#y^zEtJpA7tp({hssgGdcmIFGT(r^SUO@{ z-#r1(_{wzf-n&kQIHx9SQxvHNWF#t$-Eg^xHrns{#lNN`fG*sn^!CbsX=`D2Mg735 z;;>;weO-fMF&-=>86c%QW0ThKSbVfR2Jte^QW;czuS`4qly$hZYBc2K9L1oe_ID1M zB;gqL5(a2RLa5P4oK@wLmO&1|u)ncQ4Y_E zU0=vK20AdC?dmPbr0xcfb9CRa%`S;~>qaNRRtr#1xiTF?9bfAb2g>K~%NnKFYpk+r zdRMZqr$Tagj?3cfF4s%9{6vRq<^60=fBBJ4TtSmrQU~8JyCXOY`(4c;DoTg;My zISeduL8KYl1V_>#SAZsGf%EX#2cdQ(g1EU80+Ky%LF%!~0kw&9ng=lTj6Bx0GHne6 zNFNJ$S(O{QBR~T1t$z1xga|HZSTTO$!{r0zIOwTdZ~s;D=j17bx;+;Mm2tc5?nCZF zL(^*iL16vc*NyZixKPhSE}%6TBWN*n9o;Zr-*~901r{)%?XNAj4q~!>U(txoyCF-) zy-I-e3}FL)D@5`!{^M=D&Mz-@HH0_vfRS1T@FT z<8cqYTVQg7+;JPRheysgK*RhnZL1{~V0TNsCvI z8nyE6di~ucv8dLmOV~PfKp~;%!f2jQR@ZI+ZeJoP#j|{-{`&&v*O)w6r+L+#fk4>$ zeo_f9?46Zd&n`;L&%PizS|BnWslRs$Pvu5xl;R(4Z!)qp)YZd+G>QG0)i+uy(Ap z`tW5o{((itq7`}7a}sZJ1Sw#VzZ5=K8@BP|#}8hM4Mw@aYEZp3sU|V0MY~9M1|3!P36M%kUlpA95>RBci|d@D)JaKVsxwf|}1DLiXpvh9k#SV>)M zl%#D%Vb`*GT<}kfH_CIwJRV^+1UaJ@)6>&8wb|9oqQV+?C-L-I6E-F2 z776 zssv%BH0rFrq_p%-6?UzQV~R!Uiujw}Hp&=QqX3e1bvDh2Byp`2@ zrs(Ewq_?&e*@;_g3HWSAd|X_;Cj=JH*bKh3)YP?arKP1#ac9OBdzU{qus%gDeJ_)w z_WL0b2*f~PxyZPTz^7U?XK#ya(<5eksXyDqZ{ww z0NV`yl%9zmA47T@R8iFO$aA6UDD|7<)lJ&;^nR(;Z_;jKb?epNyw>V)J#-%u!?}i} z;eR2c*U8bb;d-(|hlyE&cAoRD%Z)&BLRBY;wDaNIh9x(W;rWU*vbMJ7DJg0j7PiA7 zPRQLrqw8Mh=ZCw=dX9egBg*h`Mr#~L9_7%oehd8!jeHpmp>4T&d5uEI#?k93+BZ#B zd9{qTywMlyv)gw2=2pYTURxtde%&9Ih6iQ4VbV{zkU?U_kirN2QWAyr#p~Ub1s4_= zo3~arw_D#@-BTNW>)bm4Z@(-@tYL88&$CUXQ4uxV@Xeoy>#_J=yW=m^1fTTP>ukqz zK6dSzrne~A(fO*#pI*v!VyK4R>mxOyc(3{dgN{-l0e$m_saRS}6scx>IqwHd!qvJHY6vH;ub-6D} zK*?>;iv+i5tp;($VQ-x`IYU_K872BJ-u}Ltl$4ZkMZCW5wK{U?b9;OHu~pd}7ezI- z?Ri{}UV3NY+(xMW^qalx?Cdfz*qYpBV_i>~7`w997r(aU&keWpH2rDr#)4>yIWI4d zxnW|`cm!$q5bIen>U39=w63B;bB)QVE}|}GDS;JZEA`$u+_-UraW-bW(7KqRG%+zj z^dY5aH;cP7Hdw-k=KX|~`3_q{XMt<%dDtjUqCsA7^J@+yHCSwhL*L;I_X{h!jGNd( zW_fwJjI$W~Z8>>)`g)n9VY^CJCdPXCLj}ji5O&Shh&wnoXU(>es^JdTil+}tSB$L$ z)kni-cf{ljW?*)%pfA?U8z7g`;Fv{}Ny@ko56oGB@hG9fUcPIShZL`7^1*X)!WrJM zkRWhE4fqIfL1WY3(UW*XYD4Ize|o3oB3S2?IKfbnZ+*tPxGFd7OlDRVH3Jjo9hu1J zRI%x?6+)EkG5ftgx00t!V6V9zVPi$?O6S$tl;vn!weXn_z<)@_jGq9{*^ZPO^DFK5 zu(KOy(K4#b7mMlQi2iT_xfGAJy&S1LhHNqDDZ$;@H0LE z9{x773Lnx(?XTD0%z1yPUf=!P*}1idU0dX686|?xD$FiCHu363e2^acFn>(2ZzDD9 z9_$~S>0|cx_FR1K_saeVowzRaQF<(%<^`aImY|Ne4;zj&-#-@f9cZ+IF z&KeollcKGf<>^c`L*Eo9*g$;ftEs8+d}|f8>h9w5otlRWD|pwYA>OfkRIk1ozCY)k z{wt3+a~msDd%3l|4bT@~W~(ESjW#Cz{T$PB#^hDH$apgIc=7%Us^3(6TJ;B5BO9`N za5r3>Kw|{e-$?(&8jr{Ib`P!l%8T)V=GC^_p!ZP+F{m^Yjwth_*a z>r+BG$JemR611&bT1JP#*JXikvpI1rn8B?jH#E1pL!UWARU(cqkVVFGumSfqxx5wK zFQ7=09n0_Fbm=b~+ACqIdGwJl>+z;fJ&F}(-O_6{LJBb<-Mw%FL+X!U@E!BlJh8t6+O#jXi zI}@7|plifU1NT4FUF0BqVsw%iPT5{~FK|P5w@9*s>PkES_B}_jm93U0tTaT8D{@7D zxOE;^VTW^AkH-#dH({2@1{Y4Kze6tbX~Wk?gRp+Hnwed(r(>hkKZBSEd@B!^tNi zKYxq|ndL6K+?OLpa+59gWdZ|IP3eOlNbg+;tx&08McnS|JL`r(DCgwoZ`?zNycLVF z(G#y%r`1)=8~BfBBbUD58>spu@dy@Oo~e z^@gs7Vy#ha{v=*TSU@0n9@>UTl|%iU-1vIdFbXFJ|rV< zEp&69v2J*laqY&;i-ZQp*7y@uZ>`EW(v>{JZd#EOVz4?|&EhJwqZ7eg0aaG>q^&Hh zGEuUl(T#XO@E*9?R%vNz>tWkTD%bu5&0Myb0A zDxa$zUBJNN$o!A$UQ!orRQL{ixXG5An3&X80FpyDzYvHCnVOuO)NyojYV5l%K z&!Q|AD}_Lq^?xc0Ay>Ln)V=23R5hRoE1!;4%ah-^J;G*vQrYcu_vF?pm8Wez1@HP4 zPhVA`6$|?I8Ib{>2Hzr@aOp!>P)7;jF=6-6ctND7R&&Bf29HGHia?0}V(lS}bkD6ee3`vp z)S(ithANu(BT`c{Gd-5y^_c1#81TSSnsGgm-)q(72rDz#0N6+OTdLd?k?{%#^RVah zC@|x68gB>qnpNPst(x!N7w$iT&i*l4AvY+k(2Qsw0r_p{w8 z-G@LFj1^fCe`z%b!q)`R0Bg;OjPG;zzx{VG0k`lJ6K40w?}UY!85X)3uxl=)^#XB% z0BSrJPiOieRX`y>-zfUI&OsOkJn0T=rx@#U>58j~(YAhKl~rgXsy(5cDR??BYW$dq ziPfkdubHMPwERbW=o~yC_ykW65>^`6%-VepC+7itB%G7n{o^EjYHGEchsS~d$K5xl zXz1o}Pm~xf+!QVL{ zjdKVzGUDEys?_gE2Eg77u5$xEuTIz*jF}I#Ntmj58M|^NK zd1I%JJ)?fAu$GJ8>(p;#@l5U+P7MQ)p$wM#5!Z9Ode#cvY;UZaP%|HgGd>*sVX(>* zZqSocx*bvaqIdR3rwT-Q>O<_d3eDn%Zq+oNk%#lp7a!fRwj#5O6ZDa#a)h^~MRRfD z1o-npWIPp5|JZ#{Pyj;$@4by3Sz;gQ&a9BMxHm^QndBg)PR zJ%Tgd_;s(y*NGJ9r0aYE^=rUa4H7bjfxiCyC=;ut+=jql_!1XyVQE?Cq&r)U>#0YL z!`~3jg0-8yA1ctebNGLWW)*gzieK{R?f$QWlC*VB`R2<_hwIwgE;1 z4gv`IH1|`V@AlS|+gSf11JLKr5ab)pHmcupPpHtGAk3D&tE;-EufN^T^x3)RD5fU; zbAU<-Smn~}HfkmwzXg-^hddQ=Y=Y_qp`{O!q`u1jPJ7Qg!C{6B^TFqIrQIu5Rg;H+t==@kYkFmd&mXj@V)ydUG9@)z-(Ag2r#8?3|^m@w7JLc+)Tvv2t&RX=JT4& zt0i|F*+{vW)r~5Y2ZK5SXwgv1$dV6P>@2pN3aB1(Bo8++PeQd$q`3h2wPQ$cm&mlH zZ{AdsATFixU=0nyQGm}%$_IYOlyXN$$D#zR(=n|j3*^!#tg;&F*;+*VaH7cggs)ZO z9Y4QcvF<5%tO7$Q`)>Et2vAuIrO%9|h|}EM_Hy=b>lFL8R|mHK`Y|L=om(Xtiq}_U zx2oRM|BI(43S4k z1Ik*)4pRM&SF4^86&23Jgc*G(WeC&{E0&j({9JZ$-0}dlv9AC=##YwMm20~Atb=(b zd65wg8AU`CioEL7N1PSi*xorF`R?l|kRS^^`5ElaH)rdsecuucRA^D$N079LM0Qx=+Ie)eMnw9S(>ER&}e&F{T) z>6yJhRu!d`6z~lKu~Tx8cOy027^+n^usaliPJ8EHI?d%2>C!R4IvLNN)jCns5DO6V z7S@~o{O#&$-8k_F(h$ozaEK4!XVST!1L8giDf(hDDAmOK?r zk!FpC>qHE@Yy)xjFQPZdU@ft8(<=hlLL+v{vB7z5<1!4rEEy z{N)mZp$B{eLPSBSq!Ys|oN?atA`_F<9qgKhJHt$eyXSyjZY z2%g=Pj$GRGwbICu?AVp%JG@g1pTrGGCL;lhp)7c(hWOv#b#0%f(ZG-c*Is{&%nR_W8ogEdGmYb+O`1--JzVeJq>PP+t@t0 z(K>l*0J}DYr&EUm?tE^8tXaER9%fBdS4ei)q{A;oSL(g<0l(29Vy8(_~&oSK{0cD9WQAl85<24s0fsTMt0&Ej^*_D-#_8<^PkdQD? z0q&YOm|fV4h~yz^JjCtp4EmNRKx&4Are>cVuYy<#42Y{W0&!^}`eTJh{^5X7G( z{vQ}~6B8Q`*@P(H3mGZX_^dyWt(Bt=^#G-cfx>&9f40k&MMC#~%oQE9u&9fcnei-NE#dU&_WoX-pR5x1ZVk zR8|K`gM`TVYj=NhE@NFM!)w>-FdiNrUjP`s*5+EU34ITltBFZ}*Grs%K%7yMyT8aZ zYWx$fM~6vy^+WxtvDfdUvgOB*AIJVcYQecmV*gaOMI%^Wl#^SE!1cHa{3s6vaThJw zVaWEBJ~Q}e8R3ygVNYU5&=cd@@wJHrjqZm=O}gN{M(BS=odFxAoQaz`<3rwcm<{g+bgG0dxg>regruj|vIkr^;Bk4v^G* z7J(4V0is3#T#3DTGV~N~=Hje{kh`ubt>-Y&K4{ByOoIYpMV>hZ&eEh`hI4S<^UR^fHNhpx_>dYKfI*!YUSKKcylkF)3*6OKnPkFemECA;fDZbH8*z}|*Iswl zU4@nfjLKksJ_!u+EW4B$SG>l~+KU^yx89CUc+K9w&=rrhfV{hy9DE0TvG$$rqEN=Y z=Ch^M)oXJ|xn3~HX$Jtqcfdy>7Vt@s{@EUfH)x8sk&Sslu3L= zZ6y7WLM8^Z-kH5%DugH#lhCs$^@|u9_j6i4#_Q=GX!-~ zSn2%bFUg^szqb9*BgOMV(d|TF1Zlq`TcbZ|J!k*s$jH2(&6ur_P7^ccfm8HGhm_1q z&s|X>tc+m;0w`Jt6zY4eUl$wadnP%5uZ;;7vDJ1fG0a@34N5`7`) ztuAn&eit$t!8J>`^X}mk5OsS$oHQ(5GCYNki$g>=RR_*6x5tRPQ2+_7W=GItOxQG_ zwFkYuy*8di_CmiGY|-End9~60^y$xe0Abg#0U_v%(x@|(h3cM3yuVhnlQz3#QBnT) z+p&`;0Xb*kFxE+2yEMFiTtY&loyu_lM6iC%&lNH9Oo~e}wH0X$VH0pa22L-0>xJbK zAV;J-%G&oCBJ}>#bU2fkZWpyh!s&JIQMw*LA+H@sKrteAHz-yEf02MdS4L$H zz}vHrV%CHp*y=R5AdyVY)lfX+nK2BEy{Ld%==E#ou@pwy7>I{Lz)yppIg0dN2_q}= zt(Ul3Fs*B(k#eW5En{Yd=@u%doo!A7p6w~5&HsP_(*}IE`?1Qo@Cw@mL`6k+?*cGP z2aGkKBx=$0j>&~1blOHnM*fA`aa)PO0^Q<&S$FnN@E|gl#I+#odH_|2s3pb9q zL5!Ms|NebD(%aaIEK0x`#9-NUn(K!bh9l-MBr^EuVsx`FP#?(-f$kK7?fIG2pvFYw zpu0>Tm;mNV)2m-gwT~YXM0&cH7}kKjz28rV+IeTEJ}|yhDl|Yd9YOHwq=hra_8|&o zc`Oi!OR@R+!$L@4Ao5wM!cy;*#R)6V@$^urXJH4Q8Q0z-tq&fnOz&)biL0dHJ+Fv| zO3}6|YKs~j8OOkfn5lehZIu~o4Bsu*X@*MOKqQ{Nh;C-Ok-7GNQwuchVhTJp)W0;f z*=3-x#n2TW#VB+Ibzx_!$Qypt80-n8+zF%-eEj$O7i>CIm?^eKl@+IH0VL5OV0BE$ z77WC$Ik0!&WnIy39{JZv>!%@g$?!Ov@C!E7ABf3E*nrEhgv1-0{}(AE8nRk=z*p}% zQF377sQ-!@6HP7p5nBg*L)~;|2l4b|Z0Z$p_eWSrlf`LukSRN_tj;g$Gkdj$7PO!v$) zX=6x?|3z4tt|S&7O^}Kif9+syJp}KZSz)k5Zvj1VUCU@BuXk2ZRgiO0<(ca!KQf7} z^NokDxces+&kMHktEsF!E}h!VA*4VXU1xQaNB9(;rkX+8nhE}dr+-$VrNfSV2FgXL zi$qG+S!mo}D5FC2*J+MoZdWnTPCLK;Gqs(>??UlO!wvQeiVj=AjEwT{sJvxY;N`9%G0 zs7)R&>c!&gxmqC*N;E7U2lgf0M)$P=un)nowh!IGRgGE3`HV#>{4Uh|zRhHz>c zY!-u~h#K{%5)u|J_Wv>Htw-6l0+adQpa0!~|J{NAe|I24L7Ppq-QlONg#T^>l3GPygq`143BBjNG1h*1gi#s$p6nD)_ zd(OG{zA@gf_xpq~lAXQRUORj3HNQE(Z_Wi+O-23@HYGLy0C=SET2>tZz%>8>P<9?* zBKN!-$`e6;pj$~RO9KFqSe)B;7|8GRX0O$i0RSHs03hfC0C0`m6|@Baxbp%4JEj1D zNE!e@=A6~|Rt$MS%|chfQdt?mj@*6#Kt&+}pdq(Vkbi)18vy#BZ2$n-6Y_Hvouvi6A!} zEZpAFdpX!Ux{7#-GyG{Gg53VSn}>n^PZKvgaRyywHF_B*7YlkpZeDI)1_^9>dU`Pz zb4w9**;jv`j{GLhVD0ASEW*R%>FLSsDZuUIV#UKJEG*2!%g@8l&xLHktWXcfap|PVR2v3=F?7^q<#Xzthde^1oMdbp89bkT=Nl z`v?yoH!shB`bM5A_It00s*8;U^2)#am*5lo)AIk?_xE+gcz$2}e}2qgclu{9@>V6V z#d!WRY!cWM#y_zD04acithA;V%CAMNG$yUt%AYx1fTs$CD9oG@<|xuq@b{=hkM96z z!U_r0=wO@#bo7TG=~v#POUp53z9!OA>!bgk5Kqr3eRUg5m+u4& zySE6?>}2_j7)?$tPP%`!eIAL5{WLG=-?x9q;NN-huNnLc1^*)9zexBm68?*X|03bP zNcb-j{)>eFBH_PC_%9Ovi-i9o;lD`u|BHm9D8a3GgX4Pa|4%cLB71OpaWSI!0;=?@ zKk)kcx>c{>(S{`P+4)oTX_3#QULkBIOgVPADYN6B9XlS9s7awW9) z72zGx0LCXiA#x=cCqBq{qcm`Gc8vYvUi@YAup0${69Vabu4cI_4YyF3kvRxxOJugsoaLw{u|=KJ_e6V>}W9FJmpQ9{thGB zuy~{Vpwfu4XKh;Wtwpbb9vSvtvH3lSeqvQda3^Gs;0ykDudwtMDOj)>NEDCKm+AYo zFg7U$CHjnGStsjP zzHQD~k~Y?1i&m$- zT!KMDN3z#fwz*jMv07dpU_Lnei-Vsb<3qxF3|_tk(z%wq;10Mf zPjvS>ILy`a*Jgj5SjMh?NYXd?ER(=gTq3fs&Njb)f~6(Zoq7Gm^^1Ad3cY#|58us% z*(r{5q&`3 zx1Ki4#TdE^_)0_SZHHb2ha3L2_AgtoiQtNTGReLxrcbnXh5z0w~!FcqB>`T`_m zDZ#JwIv_|)-TTzb=Ms~aKU!B$)Exqok@bVdgoMy;_&<>_L7ro}gUYvZ)})bZKcT@1 zOERH7n?NHz&S;6AcBNKpv8s0G5WKrTJ$ZTUYt?nUf90m<2(l9fI{ ztB<=>>u&C!n$Q_YQR7+b6tpGUo!&S-%ZR$W6LBz>o_|qLqj2}ldQ)?5hOZDg+Tx+D z#;UnyagahqblsxdLJnap{SSjI>0ZNm*+Q*F^NQ4))ed!@RYrHNm2yo5*|GoQ%$2bZ zG2HaO!g_BTz?W6ic9_+(1H8pYaHFQ|6u$9P&`hvS<@QgGiRv-*<3E^oi74M26 z;PJ-)AosVa%rU5KeI$428%%$O4Vw*NocbaubVwn9*BF69{(`XXQ24m~`s7|mDwq&M z9qP~KF0a(jTKy0f{GCvS6q?Hy#5LTk7ke`k&<&l)M&dW(#wH^+d4a zex)CJ$$X9>FB`bbj+Xl^a0KlI(KO+U!&U;UWaNT_0pV|{ zFYUI20O!+H;*!C72l1fuqnzre4n4`78vVwa_s<|wZx~6w+|ar-2kEw=He|q`qU$17 zbyKQe@!1F@QV-g(dn3pi9KI_diqk1{yynXId|SU?rLwzweoeInrA7T`(4{J{4-5BK zPsK5{Cq|&8R=kmDV_$WR8MlSh_9Ynb?jx#87dy!sgoumfg8Oj}eWK4q)`c&DoqquQr-^Ig>{Yf`wVPldj`VM`CBj=G+Si@r7` z!GL4+l6!$@jySX<*XUHOd-A19e&de(%T#8TGk0UU9#Wf-t6b$4q29qUf7By!F}NTc zzm&1g&4g?(9{D(`00-}?e;_8oBw#IY*TaEPRL^5)Kh?;Qsp-R4Qs%#CP-3+ER3d@&wxF{3P1 zZxpoI5#};!KOtq}>_Xo!oI8U#flZDBMo)u(c3IkSVf3@MLoGb3J_@95vKJp_%oV;i zTXSJQ^LVOW_tG8ybvx4Z8RVt#h56Ug*n`4V5K-;SbjoL#@6dbBn__iJ#)@8>Pf3Dr zj6DORV%WW7#N%mq=ZM^%U4TtmdynrF*y$VgRH@_(pc?Vl96%3OIhW@{PtbKuUTpk4 z3G@28B~zgRQkaS)=grjY-J_(`ExOW84i7URm4fI_6mJh@?AFI>YTIW&8fidG)F5kng_$x~X z`WpS$&m9oPClg}6xIJ5Fq3T6ts1Xu+h_DYOgz0P?r2KLs{J*A5J-7|CG?Q}80xbyG z)OF8jD{{6&H}DJUl)4}5tkk+GR`134;7)+iur{rsj$K8FM-q0LoSQj{sb@#BA}w~^ zF@e$R_bo~1y*6TJ_zE_k*W3@ft&b8mXEe4U!+Y}Ku6O}p;vUX^mjHf}gayZfXrWJL zb*VxS^|XeAy7!71XU`ZoHmKAG-2K1?wJZVhO5qhN*c5I`RD8{>ZQ0qr! zW#>8Vy3iwH--`LgNi*cM-HH$4YP5rB7rsc1+roeq+AA7Yycydl0n9678ProIDbSa@ z9dR&V8pCGqIFZj!Y97PODe4>I9v>nBF`p-P4g>LO{t9ndxIonjGbS``O1$~Cj(>Q~ z=Ci$D4}2=J0`2{0y`0aga^nXA|nu`+ovffA z_9O!hsbhE28^ey7pIYcFtv?ScXSMGx2a~QFzRZlDvZK&2$lf!d7LC)?HDMWRpH84G zQCT12y8*h7Js&49O?T*N%R=LVyVrZyWPi$1q-xV%q9~Vmd$qy|=(5o<|a4cm# zN5<;GeHb%EgEG{w#QFv5h)h^Fa{bs3+;vScH|Wr~fbDXAP>HOxZ=J%zz8Lxp?ZMVJ zhLv<5z-RfPa@TEyI_+3IxBUHmgtLB@(S&fA$?e{(IQtV`0YQ0Z&V!B4k6IK5qg76e{ z)j895{BwWX!or6iKYd@paHJ}tnp~BBs!ZvedcT}55m z!CjO0qx(2`o2B}pJcav*6jw@h4`Ch7O+e2q5fKNgzu8G18w!+WoET&|XZJ-Y zUMM0hvogtqUc#U!I4>4*Th0RScOk`SR5r~Vq!Ic2+L!vZ5ZFhQq{ILsVq$3kKM-ct zx8{r$5;`A^ViWJZ7LzCxclo$%9IImU8P&b*<9Hi;oYhEC@3C;=ut^35efenSXM1Hv z)lKU!YYs5_732D2jXtu@FXN(_Y{hhE6B@aPw#MOoI!17D3q4DcWoh3}zk>7(g~!Gi zkT_NIV9N5plu-Cup&jN(F%!xtvYy`b?LuDJ42hPj3?V+ltVI==Vg}vnDkQ z<5`V^r~6_URryb=*Nz2p8qBw>ns$C1n4K<_@4T%QB|exGzDTuC4qkPe+uCqnGc-PE z>t8V^E+d;s(Supd8d|)C2KE#Qc3%_saGmzg?&@^?qAIbRaw-E1So3UDx^y=*zclDW z1NLz&Ee{W*>7-{iest)xu~4a`azV!4p{c;Yz_JQNesmFqWI*!(U{+Ga5>joK=we|l*!iG2yr+%{-X44T5p@UH0WAFSJ=MHv}g5+A725(f(~ z(8`MqZgvhCJSU#l${Rvun{Q2Obl5Md=J+I)wX#xduWCj=A0V5B-tjxYZf0v2e1`{@ zg1@7!4~{@H2j*rM`l3@-cpP!0)ao>Cjw{2JZb1EG{sP=RdCrXDkH)c28Uvlq6Ps z3AUC>H~X*(6X%_5E+J5Y;&gfY_53;X@9@t!8uFZ%c3=b*~h~np+qD zQWjHvFN`Ug(vnLvG7@qs+WO!lGXWZx?dE}y>)xc^rtn(G$l#o0z=G(}JHN_Si78?MmKGsgzmVrsb!oSXvRBQhw9|V^?I8|Qv&ehK2=EZt3 zyy5zD5k`52byp!J_ZLy&=(m{TBKShbbRjlBQ60f-z>A-$DHZ(jLFFUekC%ko-6(v^ zOx@Z{?&C_t5hD|z+DLh@IGAEQqZ*2uO}Jv(sxatX7v&l&Z7KP5jJ82cre!g5qD(hC zd)Bg44U*NwZggvvFC&aU5iD~*~oK*ufF5?3_9V(4^h~Q${$kc|hIUbfF)A-y!2zQzWFsUMCYE^^{pI%Bk z*U~a>h3*flvf?x5mnQ#F4S;}a7m#{yPQf=ul;`SZNI_JxTX!6VP9aE%9&W@H~~^f%Fkr1oBJ z1ZZ{RPW`N{d>en>yH34hWc0^3>OuUPxE9H+30b)Zv^;=|{?8$h1GPXXOt9bZu8w?N z;%UR+-CofGkiamjlurkoNS2jS0;#7|;z_#n^9J&`)x7avs~&!`)}+~;W!Byj?sCJ;?5+;CWI) zeWIGyqQ${^sOQp_I`V;)2=q!m5><=Hd0wZma8k6PTuukkE_lWdJX+d@ifiT7p?mp{ zy#6H(L$LxmAAf9NHg%FGh^T%P80{5ww#p84_&&nP7<8q%jSgk}JQ31GCF;&!5uCsL zylyB<(ahMQp@l#qJcT*kxF798Yx_W(;>M2;%jce__6c_ef z-%)bG+Tkz8^fOA&Q}qto_-7e0_T%OkHRqe8CfT)T@v3KX?bw0=18}nfkm-gd)HFMQ zPbL!-3K15l(Ku(JW$jq(&oO_ozL`3Y%{9b^sXt-+E$+SvtI^r2OmL${KX9*V&g?>B z@x^^3Lg!O?`qzJm@F*!t>uDF>PJO|~cZc*(0wwRIegPyhc=qeGpXj-Ah6CmkX1pn^ zy14aOAj3n31^g#DQY~B`Cu(C*nIDr6*u4WjJmD{7L7(A{HaoV<{KCIhP>K_JuECEG zBG&z-34I#JaEQ-NH)wmgnDnajTf6liwaqOx+H#JtXg2)pte!B3?wn0h6;E-M_zHtN zzi$RA5!Ys8fHZLroWpy*6z^_5|5c^W2R0YC^FnRKX*zywUSVDdUMZI^j@mS?=+JtL z8R2y|o{w&wnvDW~`HNjV0pc;V4h+h;xn6N(i-LthE<&c88a|(wiK5R;?J23M49{fh zUbN{Kh`Y?@_$>3N*8$y0JGNRst{ZN<>D2+}Z{wA+y+S=C`uU?ShF*sH!S4hDT+=Jm z&?djsV7&sZ<0*z>=<49J-l6e({Irl9XB z&stn3=hEh4PFp~Ea@lYdEW-)5+lqf+;#Mb!M-$XHJ0neNHTjXQniCtBnE(q++d(!q zLt*jOR2Buwp+#$dB$gdXV@isljzO9qjL#y-pR%_Pg9(-{z57j|Uw=vr;o1P+$1?N6 zq|ZH>Ck~)r$HzW-5`lPUR=!BmO1}5B1G~SIhbq5tx5L`g+5E%sNK=_DkKL!n%_3_$ zZbyoiHsp2$CmN#XX?bS>{97B(7IK3lLgI_*E=^8LyEQBPgd=IGdqr;C)_s9kkGG^z zmR`V5&fmdOjK=PKx8-qBBhh?U+o7!BVul%&E(DY;O0r$a4Dc$;|M|T+yhwNs}C27-|sa3KlWk#}I$(Au>hc0GXI)wJbF%pB? z{s(Y{dZuc^aY%+Hu1jk=my%Z1j zp@r?c>lS>77SDOE1R^m)pj-~u{k+zT6Yn}AWSwEB&i4vHKyDjI4lz;PUP1PW6Cg#P(%Kh)j*hPB*ZLg-3phIO~;XfY7mD^^Z@c+r2}4pZc4w`1)wjZ`t2{eE%y-i~}A zkoN2FD_9@>26;Wr{Mbxb_xZE?9?w%p4oECq4f?Ie&7kL3Eb1bA`}xk@>7Eorx#inh ze(;CYyfmzc8?eyIMgUYA|F}&(be-VF-fX3743-arqg|NAxsfPxCf@0irfTweyY4?i zG4{k6AD; zT6Z-1qYXGr{`LH8m^5G=yAAy>thc5e{Y{DUU=4|1jAf*z-sLc{fK+dZ zRo$HFVyJ>+TYmI&^?92wZT#MgGtOb}WCRFM(wh$8r?m=*)5BWKNxh+Cf#)?wIC6r*ipkxM5*>eK`M)7v zIU|&G?!sS?8(^9$OOMpFTq6FG>Jrox!u7G;zzQ2>s;k=D`GhUUdOsM_uvC|kS*Ef1 z`1kzqMa~bxTsd0Bt?}g2@LiUPx*cBBQYtfVc0Bf&kWP4MGl;bMGWVqCb%vcDxZ2;b z`x+!SuwmLM&em?n_}5$kN*Ghcp01(V%M|O$TUrT19%bi7p#6deio+Y&Q`-`5r*#7Z zjMi1snot)x+Xc78Pn~!e@JfB0$TXkE2$&=J_~PfGHowOCg{vuhriE1FA%psa+x*}yJ7uuv4}5xvX8@iS<*XO>9gny z!K|O>z%>umFb{iR5-MlUWjT3|8m#rJ;ktQ>S#wbWcEg@5+Oo2(`Eh?w!t^w2;Fl}k zwKHMcyZoyR#wp#n1zKtlcCI~G%0yAW_6H|wB7RN84`rvy>VgBK&vscTWd6AIUY#6< zQNsfzf2Uvac2ND^g0q_-)jkJbFG6q42)g`XEwaD9_?<|aWaRwx*v3A0P0++`y?g)x zKnMsWFXc4X<@MBQs&3=uFM5{Hq{G&>hp_ZEY3zSwMlKn@cyK7v3mFgKoSz0i8uF=r zk6Mbe`dah~i|j7}wk?E<9lBIG2(N}Sz{X^6^JqhOfx;=Z=E9K%dZJdwdt@umD`{O@ zI6=dBNO7>#)_p4X^4-mrS((3FZ8tASc-P&*+h zOp)y}p?`Z$ghlHgVnIGI@mp5+QtmQ+ zpH=ahS#KJlUXZxvLUoqHrS2Ia!gDzDeeHOGU?lqbiOXCB*fmG`&elcWcjBSYI}K!* zPg8Q(Qp6rDb|lSN(J7x}zGl^DLsukZxmNP(?$@qT!vkRw2{ynLY**a)qM=`Ajkqmc zzfmpdY`xCS?kvivDg2DNb(NLmI3pNypJ7A6c5AO+)kOgFee>nH%+NAJg-wY&7R33a zHoPpp%YJ6cABc^DoB^@08-?;?f=6AGf%nN{^xj=iK?yVE)G-yAMb2GP?;({;kW$AD z)tpKT1uJjgRX|RLs_G;UQsGs7=>DbJ290Y+L3Aab`)A0kZIi>m%s#(RkHzpc;*XIp~6H{^crwm~RU zc31|dmm;PYcF&EmtX5Z&xeO_QM&wu_AzX%J3Fx}9mY;*&BWl5_#1=QrUL3*>y;dEU z!9Vh)5&*kMAW1+k6H5Z@YT+6heEfpn8i4@C$;~QeEv$U0Vzmjtc54F6#|>?*euB*; zoS!itH-4zkim29RrTL{bCSj=>xlVb2#zB<(M35eCE^NU?{Q4IlWlzIGd9>L_HE3F` zIlysn=0vh8rYG-95l#cFqvVK6z5LkBgP&k+cGxvl;xxviiOM0 z=APgrcKOV;r95AB*)n@p)Un{P%fQ|Jnd|X&Zc+F0)-=5$Ow?WN4!5I+n8dv`f``FVDBVbA^74qEyNSXAgJF2-jFG_u>NzA8NuMvNN;pji5boB~8lDX5|EkJ4U0rkYqzzGQ_Eh=6Nj4 zD?zM}1ef5khn0KHi9(q(A-bVy@l2^q@VpSkh$`ANKc@L9gNWF;&&Yh_9A~?o(@(EQ z{PV66RgY@w!?WOdeL`v=QXmK1N>;DVszAT|{UnEM7F&QPkh>}pZ2^zokz1$8$+DU` zFxT9Fq3%ONx_T`3VI%n9^YX~dorP}C1t*fb!%$kVNJ>PNvUw5*Hp9Hj)5Gh`;5r#4 zyva7IEEQGRe(%`Xbl}^Gef*m!KMkz5&bDjf?ee;Ey`l^7Y9ic)H>D!!;u6ug_)DK! zIJ{q{Vl@Y!u~^MUI;_~1JW4QV4x~w+Q<1sjiJR7bbb+(TR3TcTyXEivfnxuaqg~8l zv#JF_yBAAFdfcayZk8Beb}!#3+>~-ic$7hGR;`B~!UZMUeU)yA_7lHa(r zm4c=_(A8BIAum$)wqPIK7u~QPR&qzJeo{d;7#_a9%&W<0@Wt4Dmu0b}u8uMVx#VNT z6!we1RDU=Y6+9-NN{_Gc`z5fX<56I9IpmgVAjC z-mU`k;6T#jtv4vphv7dUSy=lU&L0m*j%dBv=0n=ntw#mJNKLPLItGt&2ySLq`^m(s}MduU3OIiqQ4i-l*YUkIzr+Qv$JKh{evH_3tAutNMi6m4R&fLAK7ZOqgb z3wuireKD^FRebS@8ZZmYy&WFyeD+jiZ@)eWmwIjoC)8WO0f6KW8bjQfV*$Eh3~{?s?bFX;PX!0u?`yq9C@KzGD7 zIkT6;dxgfk>!BRb`E9v$=#Ms@xOrw!=a_IXUv_4#D=p_};Ez}1_NQ&tgWc|lQ{~ZM zfxA`+^(Jb-^vZTd+XxBw_2v7MVVkKk|1B_n)CD%#5V5|@-x1%NC+%d3!eEm)CD_Zt z*S7sk@JK(upSNOs;wC;*EI{*CG_Il=pA$lRVZk_oA8l(U0yTSY-O# zM@wM4X1}jpw`OAn8+0BtIAEFXOL}vai0!Sch_=c4oZow$TrKHa?vZ{UlEB$7>2Rlu z86CL4Z0{h=R-*&v@Qvo5_hU)w-biA~o}L}F2SuuGP+0TvR^QL5*Ye%XPj@R-Pdz#C zJ-x%LCkH;cjQbnelaSh$63E$?T9d?Tp534!^Fs`S_DbY1Rs>gs2|PKR?oW2Z1=U_YmtN%w+&;mTIGi9hDUT825PL9Vv2dY*N~@ukR}ZN8 zmL4Hs{RA(y22gIdsvM|l;^?#efCbhhlB;f*@{M$s>p%@A3R;M;>4N|jaxG|b+Gv(cT$ zJCc}s_q1n_i^Wy@#k;#EPGI)!Nzcu2{0;yH;-}yJ1>#m;(r)}$UDu#SpFWg6D+Lr) zAFbhsW#`QhV^!j<3C&vi(Oz3a9*33IvU)Qgkacn{rKZrh;C0dZMcIO?9xFaX?@po* z&r$tZ7EJ1o&y8qy=!}h$}C1*IqQ+Iba!@PuEKS9fVoO1593%vN#r9 z9S{jXtp(*WqO<3GiB68YIJlJ?BteStVWk39fO32ykbB&EI)CfLfl^YR2<8XFPM>RH z20V4h@A9Y?`q5>a?3&nQg4af58oN5EB~*!P)$eeJ*LT{T0wkiUdlzRn0=TdBunjpVsi+CdC?3C3$MtyZwayK&L*Kjbpe|CS3KZ zGB!#($f6N&X)RW?hC@B8tG)F2Ic0W|SWAFjZGF6w~D^Ue|Mi1&e zn98&`YH2vAtCv{d;;G8{3!UFNM0N+mKTbNN*Df^dCe$%O2NxK1fGIrS*;_Uq((ig+ zjO&oCLKG@dftz?+#(BdS?(H~%U!7&fd%pjjL({ON)gnNe*Sv>W}xPo1<4@1{7%{_QJ zwA$Xhh0Avw5Gx)PTG}vh+aavk_;=%(4g+E?xd}yG;7WGk1Q5nHTnm|m`q(p%Sbiom zynpn2DV_(14ToCrXTXQoO%fnqsvDXR$5m`H*BVgH@Ehc%tkVJWV^k4bY0}iAl&m84 zO%?)~KAj)};69pmk%UgMT3#f&*P|f?LzPr+28o$ZTlyXl9bK)JkIW=ETCR%OAV({+K^D!zbwCr}a-xt`Y@^w4d??5LS91|XtK!_oj0&O6Ma97<36$wo$3L1Y z7KGM2CC1p0PBsH_QZ_j!F`6Gki^gqh_%r`}*qz$>t^85jKai>r#KZWF2xOUqrkF5Y zwniwqHP}s-K?BYbjZz%z+9~XCi4Z93ntid#NiskT`Fwtccfr*9nr`I!#us>mw+a9C zJ8!OyeOg-un%B;I7(C(5R~tZFB4YCmQJt)q2h&PTQh(})w+496xj{#iPSGjmS$ zw+#xf{c)R$PurnxM1-s&5eKy#L}Z>%hm2-hyS2EB_C{~B%TSX^R@_g#6WTI$>twPc z1a8ZRJj@@$7x30s>;)cF-sUj0D!_uW_rUV}&kPE{X$ZN}c|uTJvRp6}`;aoCT69xv z#X)0g{duI@dqa5tvM^TR{%h`Uq@*T-A#3@ zg|76$#E~({IOnyhY3oEfTahUE2S*dCord?ZU6VRyRPVOmqND`gO0xsrU#~%@4n_{jl$HlR(HIG zF{fdTWLN9#pyUE_%}o86;$We-*5xj&-u{fpiIOOf^qk(*nT~~KNGhA&9TdrDCd3hs z#=XPzAA=jlIqcd)>K9RsFWrmbhlPAiSf# z@z7RAeA^7WMt9{~`aA+<*Ch+w^cswINXw-TN)sU_a`CQKfZ}^Puhzet<2gQruenLZ ze{9jms(_r{RYu*l#jJ}wLDmxJ$6PlR)bM@TFJC)_=k;W?Wct#NK!;dXP8V6*eXdx2 zNZQ_Ra`qfkUhCS1ta)HKtWguxP0@@6r!T3wN93mKR(Vz!Tg z+sWH%v&!3b_y*!ADI2x>+chDvub1oa)jp6x;1T~ws0$0UtUU->%fV6T=#TQ3*>NzmpP!-tImWUxg^Gu4c!q9)YV*ww zITh6!dFrUmuTq$P)-xP_Icem){m&I&?M75XlX5J zyl0LBp8Lc^I3|fT&Z&M2ks`x2f4qao;A$O zAl!ZV=`Lvy(K&c?^x>+9gkVbXi_;|b!^&2eG+%hF&^nn7V!Tub^hz}nRpUV=ZMPt6 zYhY25zitn9HXpJ#({8q0R>lL!U?6az^0XYVJ4SSR@5Qhgd#HitpYafGe|4ek@G@5? zZyG5U?yKagZb`M7i8?b?43LTNI$7xvp-i<2S-S@UtMLjRqeZoT7a_;$FnDYo3E1_^ zs<{zr>fDV@w?{Nj+h*qk`3m>6^ zm*nH`h2PYD)Q<64du&yTuzW-H$lYZ9{QKIeY^Ry>B2%tcTmO|2oc36+w1g?EeiuV` zqi85lshJ>#;cV3WQ_{Ot{QxUmQN?zN0Ygk>Ui+) zl49|g+g;LPdkz>}%A4jZsS~gm_CggO)@j%?*Fh=)W- zlj1AiCtWlu2c2=@#l+IQHSnx-f)IO}P1Rizj;g;!nJS$5IUO0oZ4is}FwgAYMhn_l?2BWFz! z0iILuvadPCBSXq0$BJn0L#|3YM7-oPH#Y4bKdl8+bl@kfpfhX+vwq$_iA}dgIQmGo zyS%zS4VLDkx>(Jt@FYB-ebRlnfWU*bQ8`Z2MIsOkK(&6?=-{8r4a+1LonAab5w90b z)L@Lm0AFDI$EmkS-Zgc0DdBBUefBEto_lIJHu~_kQZ-)D{xh)hM^>lG!~$_3b84)h zjzxb--!7I|#_HDxXWezI72~^}w~`HjC4r;YSrCb(9+#xHmF&}bF5#~G)JtVfo!QVV z6$P89EXVwN?B9Z=fmhx{o=5Y%1!}1s-vjOoK@Jr$XJvMhhAykx&fm!=#G_-8#-9P7 zGS^7Z7+s9IKIh07x*sfD(;#9w+xhE5*;44dzZT^Tx#V*k&&4$4Oig6T=UhIXiZpta zW4<$zFfFJ=(nGn<4!_p@s~Tg^PW_sX?)eNP^_ z+xSQ*_xS|+?mgl@n!9Mz@d}Mh;G!7+vqVNM4+rD&m=LQaut~liBa-#P@q11Qu>Jh!i4H{hH1a;HEfnKmmvo{ zU*A=e%$YVM4F`pSX(BG4pob%$_?N4NXg`&2({t(qhYJ8F^RV^f4XMcOrK9*cgzu_AZL5CN zcY}RD^HjB#woV4-z(ah ztiL9b&xe7`=XXQ6uD?~o<`T9O2bnP`7i1PxVK*Cl%?PHuAZe;uoLwhm9d06dYReHq z@Y3M=Zkx2$p_+umv}O0KgS4V*Yf0lr*K~i48J!%p5aBYunJ6V<_kzyUfIt4Gkf(GR zk_)#64hS+)9dP7!ZoF_vORZMRb3<)j!ecHWKb783YaJ(V+EPEj;ywc@&zPy<0H z3}FW@@4T1Q8gOO0r$6E)%!N3CO}$|^@-{dFPX^8CmvrXR%yA8`PzBrUR>iWl@Ubfc z+EN{RJeMz9SakG)+%G;cM8}UbOw1R&UVOLX_udc~^gDHGl6TzoTdsi@uGQQp;a{9H z3dPFMdoLS?z>kCuCjZQ;Bwy1`hPB5Pb;v54jRIhE;IP^kq-fB!nNNPJalQPqSZPsy zj=9~3Y&q7fZL5@G)0=R2F;#t@u?|v0h*h~cCrO;Ek;+sTSh)7e_=qyPc|*a*N^LQ- zk7K&MLR#6g$7o@-X{;sP_e5?XFkz0RVevJUaO$$l+Sv`R_d0E*n}qlJEp_Ug+%Eo; z(HAf?iKMqHNSOywa`b9?MCHT%l}$iKRJFC7241~&=vRk-%4Mm)+(_~&(Yx#o+P*r| zWs%6@VFOL|s+0Pqut2mTy1@iifZS~TCqJ*v7p z=re0=X&Gy%uqYj3hDPMmx{Keiw2Kgn%9AO-9_S!_=%qcx9>+fex96V~?@sC{z8`vy3yFVP+JsgnjMn8O#^Z5g9t!u z*pa-L=7FE(`m$6^>YU!r3mQnHOx00`aJ3HmkSv2Txd$bCd@ub55%EPsP zRR01~%&%OTCT4H&EezB=^~Tp!k~^2aha@5y6X`)VW^GR~Qc ztV>V^eiq!Qdro^~Z2mS6>B;6Hl0T251nPs&JSG|T;syf5H+7dPN2dps`(0M&Cg%HlmZgDw?c61C^C{2bPO8T)`s{iN z3ce^AgG~LYO>?WMl^l=sCip)9HXzFZB~NnLuSb!~G7M{6T4=rZM)nwYE(C64%|h|s zI22=ecO5WACK%Ynn!S0xn{sW|SjcGct7i?3YsnOC3_*CDRTR~L*Kf0pEbkhwZS}11 z?Olj%4ZOWPDrXG|YW}C#eF*2UaFy4#3vZMnqas_=47FBrFf~z#yin6bjaM)D5);IH zgzep(_hA)W7O@WgidRE_Hpd`~YkY}EC@OoeKzD%T#`6SpaELn6pBG06nF@I@+!hTf zbm6a&t%B?`H+O&iPUvX{-%ntcR!Fh@C2kZsp2`Z)6{m_4ZxY0wTy1j0h2Z1a`{KD6 ztKpdwDCV8+W}?^i+s>-j^{5zs3mw}aQAoj?T!h{?)(Qr2f&dnR(rn|4Qj_Qt{L4=T%Jnd1$>BeiUw6w^oKy_I{U z*$OGFgF9Ul&Hs%MAIerz%_~%{eBvS~&ff0hk73ltYj&aYu4NI5tQI@Q-`P|DP1i`7Q;#~u zrUyGgD-OfU8!AsK*byF6QHz?zT?}}%!_P+{+Gov`!JOkd z#s55_!G}yGp7izwlZK|eI?w_dfk(!zEcdT2bSqZTWfejfSVpCW6H&SYz-I{w`TX8p z^za2VMm)y4b#>R>?(2FOpBQp^sF<9uXrX@mG*L}FGHsZvSLcFT6OmZFG05>nkhv}^ zH#uKf5eL1yCQmt2*0evE)G468Ea3%Jm;{z#z2HA}VO0Q=4@Io-NT1`>RF=es58JC% zRR)Brf_in#iK~_DAbLVc)NT|ONHzU%ev=>})}p7cUKXCCbe6OjiZr#UCoZ96m3wn# z4lMQ8^Vdus=;EUrAI`gfvgAJtQJY%`v?>lloh07+X54SNQ1}-W=eBTAtRpq!_9blF z5E%U?OZ}KMH&RsnlKPU-vYF^e9fwFLyR}QYhZMu*VS#;<`p(pestqHOn&00C8klk- z)wZ7?sc|%WyBvmLW+=->fN$0LGO+2Ir~}-)G+2==Nf{XAZKxb*WfRDg{TX$S*pvqG z*tID{x8{+ne~dRQy>ptizskg&0{5IbK+zGw5FkgbRQgIuUiY4(5`Yk79A?OY?Ha?G zfd2WbH@SMb<&1E4GAyFKr@lW9IQmB~Jlv+d-IVAtJ2!4iUB!0oKYa^1x^9dxgtspl zt`oR`m)()MB%iQ;Us6ZY{*Qcl`}J&e`z`Xif{@%No9E9k31K&ONdHEqCcK$9T86_a zBXVjQ=W9EX`Uo$8B(PJ#KnSdiAP4-Yc^l--Mvn9>`YXReI}ha(xpI_ zh$T_Y^>O5?&B@LFJjaJ?G7K9}PJOp(&rExl)wjDeC=i1N2z-@W zG_p`WbXNYCcw;117@gF3c6Afz6)eQ-L=0DgzlDn86E3sBrAlKSL(3#Bx{vN8p^!3m zkn_>{sX)Lb^y#QO(rJK#rko{1CTOet7>!5r^l0lhIKQx%M9SAMWbhu1)w4Z^$qEs0IR({Vkw z*Fk4jdX_Zv+lCgHlp?~PAbTY@>M!p)v;u`LgDnrt9_K1o*!>pCdnU(wq7VHl#7GWi z8~P)kCDqVYD_IsrYq&7WiY}Wif|t`Y`XQR!&%A8X(*F-vZygnN+kFpH12U9INte)GVoZrej>q!OGT@9zo`)iIlne`J0bVepsn{laEhNA*!ZywUc^k4_;9tbMnn2l8OKJ`-!Clra{%v^bD67K$a0Y9SuB@#OUB9V}ua z!gsEc+X8riuVR+8{H&Kz{yesv{Lnv$f$V_QKFl^&UYs;^_4?f|-KRo*L`H`zX>c0` zT1Fum|KZRPhRx)ht4@Z|x{GT5ixZl*Z*0m7V|_lV{H!;WsBE~5R4b7?kF-53i7FeJ zxoB%h&G5)0g1A*LMtmLQ>tl6-`gQJ^e8G7Y|160%$}{qm{<6DAoO|)2m@{|n{|O@!>{Ag@(;*UttTzrv@Zkd2FR}$oeghEEJ3|BlIv$f{3G97lu_oNY+CZ zBr+m22da;-i>sFPC|gh~mcH8$zjUfYcfo3!dYqIWjf3FQ`lZ6b9eNr>n5Pe7&|? zz#<^wawqR15@6JJT{81@TcB*Hy1dPCPczmx3P;yu{W1YzL=u(xC6-np=>O%{pk@1N zHWi#_o@*19pXIwpkfmtsl4GMrd_#4sqCE_`Hq!Ibz`*a3Dyp&myQ>IQ)IZ_^W;_4Y z3XF+g7I3w_&=n~Y5g6ahf8%xga^~!{#{8>#2!^luClMU@EM4WxeZR9Nv@lm5C^BJ}Z6bqw?w z3ph$L%xMZmdiRVRm7O@%s}Arfz=EH)btD21u}9tyiWXmLc{qvzx43sD@%;F<^!>lS z!jCBabC9&}=7mxef=jV4tUc4SIo}~nI98$CQbF5{xb##TjW11IkWR)sCwtuxbPdq@FWj1>$}E%Sh;ln5!N|2dFybO39nRc_bH=WOG3HKHfi zN0xMfl8sC}cS+|K`NIy-r;y~*4_4zc!@lv2cNmxJ5za49u@kN<4GT9)idU0a@a1kN;H4O3$H_WpLVyhe&ymZlbP+*G!2E(Fy5x~#M&yrP1^u;rlZ z9(=*R?JQ5ebA|XJ>26VhlJLP@GlpTGgyL%(r@JDnB};;8HmgDS{e;h_zx(qv4y5|Kauf zRrG?gm)G{{ut-npd#x#@s$F>_@BB54~p^iZ&LO`hhLI=O)2{AKLTnF>H%vVMeA3F=S+x$2DVD8 zXC@hzm&vKtp27hs^ls_=vwnyjyNd5k9=qT95h!E(=+Qkm#%2vzr$7*SFp*9kfMsvM zX|dN3GM1QMIX(4VVXSa7y=1iq_+1&~;myXp`0n`DUP*~!|If3^AsGYVWLmPqxFP(L z#vQq=2j-JGT86XS3(T_NvbCHk9bE=)8mE|xk+l5hf;mZ$A3lA7EA92(OWWh^f)IrF zQ5$(?wS9c$>TArXq5(6;l#|kZkk#;Z*;E~ua4f&0nnPjkLt9H$@~4JnRspr#{KnY% zC@Hl0!j5X}HOZq4jNFIM9-F5<8GV`(wxF?`YwEYEak#$2%|Jr@fmRb9bY2RhSMhzq zWy{>UTo<8RY$TSS*aFjogb^Zvvf%-bEl97=5V}M-zb`nxew}LVj{;Mt;7Qb1{TbY- zNsjQL8x%NPrq+^X54rwmfXe$b{QjV9s@!|Z?$lJ-8Z-(`w|))l3MTe|2YLqf>jm5{ zH6|hG6sG^tDNRTw!v*veYY&d_e*L>gj9O}I!{(gcv(z%5o0k%3eIz9>cU<`KC1mxW z^v_Km*7s4{El7JT5Aj~DVT(JkmN`{-3wj!Eitji!h_j6n1m$IyVhaSvJ)v027duB| z{s=8J6z~sp2t7Lqv;(a5CpApS`HSnf{;BaTh2u29Z|e_#E${47pHE!dn?3EMA|$#t zBn{}>VuS4V$1}`f8O_3Km4GxzC_=@X?5^+ef(iO9PxP3CWwY$2V(kolRb2(STp75FY;UJi>gwpQNh@;1X*y-od4w0ADZ0)D zq->}8c&A%2Q1#YwtCv{=hfIxx$#0ome}wAlP$}B))9ithA@Z#^N(&L4USF`}u{5v0 zb>S%Moy5JQlt9Sbd6H)+WlApa2(h$EA@i6;-J`_I#Dw|9Vap@@?Wu*t=!Dt&^wKw* zQyWC{Ulu|?^u-&DwyCCi`%nu7Pi_58SwgM-A^I(K^F$9i$6{feTz#1F1F^#Iph|A? z_9-4&7nW*Q+XPr&t(ZnDW5FI<@vZ4$kAm@Tgqj8WzxiwKf-nq~VW8-;GX8>p@?Y`~ z;3|O|RqTrBB$fYsgL$j^jY(`B{o1g#1M|6y*c!SOu>_iA`((kSLIxU5~V2bq?U zz@N%V&8*cgA;LrKGBr00)^Y2z=6iGXXO-dDh z^pUuI^KAUJtWqUM|90DK$}F_!p0xRoun!}p=r?YX^pb*qVI%9muu-C2GGl-Sm&P~a zV6wAE`P!P>C)(cRag=^NVxBRGVW`!|_ON0-KAFh*r8^71ap%}H! zREd0)^MrJ`&^T6TkKV`R6nm7T?^>qDFQSn#!PWbLvV_7b&2yvGj^avXimd_ZL@ZHipBLQE1-olFWOPm=^SV_`<gB# zj>fj_crHc6OGgr*TOItXO;1YDk)m<-rv{T92A?lFhpfmHN{-cWjn=?>qv+8-&}D|D zW|EpA=`Uy6%BzQTw|Pob_k{Yz4L-bs42=d08J#;aV`Dt@dMkX@Xa$D5>*FpYb0r<>nbIMu#^Ro&070i3AXe5nV^}SHb6Z=;pup-FF#> z={X#--L{V-Y$w}sB1KYm-gK4fel41=X7sWeRjbZWrQNdEAx7AFR^&5ix0Coscy7F; z)3-M5|HT%P!7R_p)DrMcNq1k-p@Zsw9ycCQ^WNF6MSkUp2>k%%Hx;y4;{OFgS!92H z>y7(5%ar_&Non)n3%)?4I8;toW2vGn&wcP*Q(*ri@VgNR&WG!Njl->pj6m$HA1ariGHPT2OL_0It{laxAq)8D&ihtNo*l}C%1!|YK9wowW8dx(ISIAT;MSoo6?AjBy|;>=WbTQLbPrQ?SuTMaiq|%4v%G| z&|-mVfRC6?d*bn4}`VhKTRmgni1>!no<_7{~E$b&&4~oJk_SsS$L+=kfUriMP>e*N5Vf zQ){ePi24fS-&)^D=cGg)Vuj3#KO(buZ`MZH~D;xd1r7mT`doloi)^c=QJ_XOYw zL&IPd^lPDgD_Wds8@BC!688@aUEH8|2%GUm4g!$n z_Xt<3yn9*z(W6eB=*wxsGdquwiu2J4Wqw)?2(N8`R3cary^p} z$j9^W!TB^CxO_{;XW
    i<0~c4%66a6VG%xSGxNheS;UMF#XGY=5S<+V~0VGk%-> z^&bl(;@;1u^pEh0b3(jreK65qF3aC49sgpIuSFz4C1qsf@D3Z@jZJZuB!xYR_39nRc!d-R#v8C2 zesQt@Rm=s)`4H-vJpCpwVvYJ;@PjtL<2;a;_8;T06P*^LLv@E}ZIDQIqNmfe|CQ<~ zjl=fci8cMHQNGqS)KLfPKa|gV&42syJmYf=s=FkI>A1)wqnPjmSn05}(VA0gGr!n@ z%D~fL_e~2ltDPbGN_A(ph<#kll=aW@*$^G@cK(|_7MG11ICcvpBr?ssC-G?4uYKTx10Ut(#rwy%j>2v0 z2fF)D(^5;{_WDw~-cZ)Jo3v-IKJIPQYK3|Jh02byzU@KEIANyj^>y5%j(>X4bv;In zcC4NoLdLoQt-6uvZwE|Vh@F-@AJM>Zb?|FZ;`SJDqWa@V$%ZGbz?xe?#cy#RheYU0 zpG5_7zk)iRq6gKDy3w5erag}PTWaC+AH$hY!9T6R9`K(}bz7qEz=-@G1z$=1#NZ1H zo(XeB-O1Xq+O0AX8e$LAhZ(+ycv$QPL9awo9=Cr+pQk<0?}$afm(dB(7}?Wgc(MD5 zbDKMxn&_J!y9rqZ5|j9T&s`L6UrsOY1-{<2+kB6;-}9Y&XAO;xBW7-*%hwl&C!(g= zXmNt{zW&5$S93HI&*ANy-v6@J0Y3s9nEb*8N%x}5y6q)4RdP94%azJ7ft7LoNy0_P z@{h!L_*>^u*{QbC1ipa#KyR?|AKj9O2L1XoaG*&jjcB?8{gX4yjZpHu%zPh*a>d&7 z4VrTc&$SPT9a<;HH?maXQ>`e}KkZzIaup(zs5XXuDQ=~8XkFXYrjk`NaBkk2LvK(Y zbZF#29{lLdo1*F-J~QA<0@o-Wg>4oWNx#_8$Mv#twXJtip0WK*bxKBBJCjT9Ot^Q$ zT6GrpcRJ=4)pvymrQKL;G&aj!omHNE3}Ow#vAPOE7c$DurA${h{e&{lBb9L?u9F%Z zHaa+^iw%qmopt+>=v^N8>JPVZ`bq2h-ziV@X^Cd?Wr@5v)ce0DS&MJ$IEPl-`Y?b? zu^xQeG>s#Jth?`Gy?eca&#*468$KcCGp8`WiT+Z0t^(m=ZN|wgO6QXx?iF(q48srB zT6~)SDYrn(V*ot|Cb@M+YO6YGe(5<{VtH3`Y^c0|&q?u)T7W|5N$td6aU!*ev|@`Mh*A3-rWLcNKRu#8^K%Ihbw59hpKe#Vulx1j1)Mf3 zn&(}c_yRA0S|Th%!mz4hn$RW^3AXW`*Z-{&S>^PDV)M!UEjjzA#}TXDZe`T_2!hT1 zvA;eZRR@a0w}EuH4J~O6pRc&N5qC^lRcXxi0u!(JPmI>s=y1obg}d-7v#n9$%FB5d4t1Ak7dbOkTfCG-yaG=M`v2Gya*$x>n%Vw{>L9Qx5}Fl9`ojJ*G6UB7UXfJ2Yup5Z3i>0j=* zhi_l#ztYjDJwvK?>btNn2}MBJ46j*m(__ZLR>gfGCr2lN^|5Z1Hq1{a+3QC8#@qiO z^XSTQxqz{syyCyd8=I6toMNowzXXelen{{yNZ-QFESa`RHkgyp0`y`q)-kxn3-x^8 z(zJ~Q#=u!^txs)Qbo*z_nyyaxM(HO0y0YBQ760I=Iv51#)_I)`{%6ON7MJQB%YP3#6m5@xPBrN*TNi6~rVW4S`cV$~6fCIg#glZR<_3=FrIP4c zR2+`aJ=nIjFh2EXmoeaf?}|K=34eR?yN7oj+qIt%apdsHnv;DkVd(tef^_VTxT0A2 z0p)~zjG+u8xt@-7W|DLA5Rf{r8VCkw#ErnKkYHEH?vKaB_&uauvzzeiWa2-MRyF5l zYK|1j!&85+YjY3!Qxzyc6t})>7n3+AuVPPp-q>|Ivf+#>_G}MaNsv@SB>ht!7u5wF zb1oj|M6kRSqwHe9i^ne(7D>Ejk<8*(I*q(s=6V+w7c=Ehv1p%%pv{_gI$+ibc2b@i zue3eZFU$>(Qo@9-w_-DH?ng6|giQkA9v;hwd&1N6Im<)v5^Q0X9Lq%E)kmDe(kV<4 zQxRokXvq!O9q;hRVNL)G7ZY=*!mNnWvZq;N6JrK}I5nZ;a1(YR?0Al=)a1*ZUB~VW z@YcYJ1iFATN0jjl)(R`LIn!dH@@MGw66AMbk&j<4KAtPJF(}XyGy-*Bq-L;KFFjYC z)fs)^CxdJPu<7@`#;H{#G+aRv8o0?avuvfn2Oor8{e3C8zi{-6w*42 zG~XT0KtttG&Gso}-(Zoon!QIcZo(VCkI*5*Efgv@J=UlC>Q^Qx_kh(|ZXCQOC)fL_ zmFTT+q@I(;!RKWcWRhWl;c8=7gh=~J>xY9*ud zJaG+F!j*;+)PYm!5`?#hw`L0mM^O2_Y$nl)=*xHbNgdSO`)YnKbHBVTFGX@NL)yQ6 z12NbCJDXE9<<5Gbj+&iFK*kpB#&}+Hk)O40zD}5GTm=r>6?b8t7!@9;J4LSr_B%8+Jpw&k!Fx5pg5X(xyfS7g*IIdq$rILI1PdJIiKQMaRUd)-oBMr-mB6Hvk;Y0#Re zoMnRYwyiLDh|byPH_I-R=kAM}WjVCwauk!X)yxtET^XR!x(5KanVz$1keD zc+)|s9P;8{VcBbyHyIzqFl9UB#HMlf)oBQy0i=V~bJPe|R?W464MZ zJ+sj_-5nAwS(a1y2ArrS``jKjEs@6bR|koolWN{qp--_#?S9ENuAQj~Kr%^oXDL$1 z`DJBVq9k2Q@5wD7C44rry!GRcQ>O z>PTTruXpuJg6sAY$6ad*6le=_KH+?FQ?YSn1(gbg1Y*xnINx{S^W;berxE3-*d?S! zfASniI>Cls9L^bj0^?j_4g`qSSsWM#B%O)8n~_}WuV$>W9@}CMG~mx|zcEeTt+r}x zuh3Gv4}$!#aJDGN)jQ1{IU1C}J|p{Sq}$@t2bZqWJv0Q^6!NJ1;Vev<>c@R-Dh!UR z*uM37zT0{HvZtL$SB6q3v){woTA?LO+U4t1TprT*!3-dO0KOc>N-a>LUgQLSIEo_Q zkImcphVh|Bp9|_hpB7$HK%&;7C40 z2Ck6VKgZC44~^rQ)KZ+SCw)sNThT1}N?dBK+Ph%ozaw0$93=`KeJV0U~1~G-}26P_YFD5%4yKZ4d zOq*cHY}>EKeCCK_wG7mH^F0YqM6i;8$TEtM>z8cR1p6OxoU}xq$9dlHPm4pU_nHcY zra@kUZI$GA(MI4^!*P+kjnDGF#+TSdOPH!kuL<`2`V(_ZCu(zm%QY=BoxWRgwG`xq zSpU3wh=n6g?HGx2D++thheR^j9Jy-?V!ypIqysgcGwLv&y~{+IR;oMg9G_c*$!<=)3P>@P8NU4VD+uOA=M_*$mI z&WB+?cmplmIIB8rsQ`44JgNS*WKeX48KKuxyWDuzuoDZ4M(3+!V)##Cq9H6wM-kOk zMrjZhC@j~cA$yR|JKUUgJp6=ySq|*+ zD>t|o*29$RxlIA3*%|xTF;oDa--epE6iwCKreNy8Pt# zab0baz|4QQ_Y=h=)Jtys>$@1_QAc6}a4$5nt8ATfOBf3}T0FP|JY-RmdB=)UZ!vX3 zm!CnW9`2eLc)bZaesPa9>}RTm)LcH&ImHIgq5#KKi70Y|YmIGb9Nex6xf*s_r#c9i z--!E;N;D6*v8C6)u4(Z3rPK-{i|lrxl=PVwO!A@WzoVpI8oyF=>KSMb>guAp{_)*} zHw{YyEVY})yKzUzu}T2+W|0(`YP?8cWYConvOfPqp&2qSgtTCWLb~Wf;O!uMQ?PG$ zJn{LnpXFuQPBqDbc2P>cqF0w6agh&3G`9TqCA(JGtl*WO1c8&|>MIj(mHxO(c+fN7 znCF2%FEnyY{Im)i?I!SWcn`U7Gd8x*slu=1LpEJ+@&*FLhE528 zwNWUG<>iigTyt;|e8z$<5 zWiUs%fL_!w_lFyxyTgi?MtX}y{t@PvkDwdPATOrmXV-DK;WGRd!m$_dXEV!*6dtoY zy}u!-Sq);k$=y2l(0FO&QWPM=u`aP6~4Tlhhk;O?Xz zwlK2eCzl$a$8YC9@KukZWMdIv{8*Myn6#LjsJNcjl5pNMjK$`hrWE|F&gS^!C4#n3 zG;Z-&lpd!xli*8{4vk*NBDr^M-nzNB`f_L{Qi>{~@egAE2e{XQP(%gykoUEfL%U${ z=P#6NDgxGVa4&thaXf{4$mc}5uy4N$XzzFIzv$V@N6|DB zu^9OoYUSr0#b3+W?x8q!PYUvIykAuBKwsIRh#^Ew2LBESxspRH9rwe{kX*>d2Wd`N zmYupK?s}k;#rE&>yWHDAJ1CB07N>Waf0qQJJnBm#SL837CtH+C>+oRNy+H;r^9rj- z2H$k`u4Mr6 zcQz9`e;GAOp%3;0j>i{RJYmu02jfBdh?N(dZ&nsMxgYWYcrobf?Vkbp13LE_mBbFw z)9N{31f*$GU2VFAE5lq5?QH>{)BBnn9eSCMspBkTa*yAZEGJV*ioMi4gZbRM{nRFl zvM4*j$(mIF%-HKR)k5pLl%$5NGD2P)6|iR+RAtpZs}yrF0U3xz}Yg0Xn#y@|8< zOmMyNo5M8_!E;31jO7BI#U@BTb95ysgpgLdRZ&;Vzc%VWTqA>t(Rk!o02q+%6ck!O zK!7iEhY%Ml`D0YfoL!+qC`08q2|HD7=lMn0*_M3(>21JKE6#ErY-SVkX39f#-+liq ztj6X9WqhAtU)J8UB(GB3reNMmaa~fjhIBdBR)eZuHh{1Bfyfcmj$|8BGQT2R$m7`I zk%bbjX$iihxgFymQI3yy+w{8=MPJ{J&QAC;dBz%MqNbV`e@fLSDKYYA`^NQcnwMgw zg-{>o_XW*$c|l6a86Uf0WA=1tI`aUo_+*HS;h&H<`$42J=Zx{w_i1BKGJdI4s;6DYXniq230ifBO{VXD}nc#E*t6mgMuP)8mPhgPh`#EAG z#6issG){QC_XG6(xNrcqOvziZu&b4qxO5WgmETTmtMU%Z!C=}otq2l40YxEk<4Bs_t(|s*9^Qk zpO7vub7cZQ!$`zV>N_|)g=aTIVOE;+#%dW-e0wd5%{5H{X%J)2Mb8p*X3eUBPHs=K zO(?l{lClxsYGQxRk+lBAVWqG&P@vD1=^Nrd6od?(8+Y&+B>~a1n@?JKr`ta-CuPtV zczt!A@T<#LGA(q}$5y>rp4cCBJ3b}Ao7EjmVE}u~!a^b!z}q<% z89=6|kq-7{uHx&+0v`)|Rd~{s+Lc(ZtW+Di5m&pelerPR%$n7BFHG)Oqua>W@yN3M zrebe=5?H#PYpPuNv--u62*?NqdjBjJQ~ro);rY-(p=A3-sfOKD(HRPdYkMRpdd4Qb z^Uc3Qa}Cjol#31_Bu|xPe-O3LYzg9QOrSi{P?sm*DK9F<#34<&-8qZk!qJgO;8R7|_wF)>gJP&$$jSo<4+A(X`%;tC`w zhQ>D{eu#hQfD)HK1n9yqIMQyjLW@^hbj6MUaH1MB<9A(pp;i}e9qCbiV8ntyN?rg_ zm0>emn~xm(OX6k!>yz~N$Q5eY=HYAne03rhw(=3*_sIrwk&Cl9r}5Axg(X={l9^Wu z#KRH6CPvtRua2XBuAGfp$F_Z{nU#})!5UiFHVqebA*ed+wx-+@An;_kP(hJzn94zd z27bv58$pazf_JUx^}g1r5h!8fRALzZ+ePbCD^zRBfegov&VASoxSF84V!JGBzih+> z#20Uy5GT~#MX^b`6guk%F=N~han;aw4vK z=Xl+BEkH<1)|zggLPkr-hrfho^IshmLb$SVEP0&(JlIqYN?pK~x*mrEv{_dUfr*RZ zeiUOyjSkUGpdzHA(jA7l?4Qp1ypuS<8zjQNlGp6VMO|iG;RhMrvx)nEy0%Il5*`t& zWbf2?S)0Mke{TV3<+AKeiIjIe{4^57lNMMPeg6U!m<Qd*cw^*tUP3I}2s9@ujR| z`lCw>8>;+l|L(eSV#~8QJa5W{slo0;hj^A~zYc`DSvpwzJ&n~H#~<`snbs6Tdt`F4 zeN3hf(b|uFQ@>@DRv)%|v-~=JmoV7DVp;RbF~_Z8-SD5?wDWU_bb#voTLY&4tpSlh z=a?I0O^Lo?h)X1w-a-L=&3ujM0$+|yO|{=^oKMk&zy_9%fZo?gCE3$F0YJz^1}Yel z^>C!)!;XUEo{aRM2z;=!sH@mIQKhv*re@-BtMn#{~6HtiA;p#Be= zw&Mp7Om+(EwH#HBUC+=Th{CLA><}DAGzJOQp+b@}M)oeHdvxE*qtx>+Kl4SATdP)n z-FgFI1Fj#;s2S_oHmd=?*`wH&Z#Y+!NTJI(h;X>PQW`rfP8vTM()BY@-1dMGp= znWTyKad(>*(E<8nIHU0X+W~-tE4k8?RkI}ar-p`c;aIb(NLQ+1ix`SW7`ghe@;Ou0 z-hw>GW{bV=(H|55V^>o4>`^HM&9$*|S|M5AGH*WYSfmL18xp{qi6p111$UL0eXl8* z|2qReQ4p~oa<+}%1{a&mDuPfO+6_kWZ=Ye55y4!*yB(~EvZtPdL%7m(!&gu#I~-x8 zwavo*7d~7L##{;tsYLhi{%N_&AC94J`WZz7bWzJHVIWePdrJ+VYgvoLnq}>D!xB_k zDQKH!E}GSboMAq!t`#BmuP7?l5U{>I^jFv+ERu8fP2%62K%m(N(rZC)4S)+r^gLe3}_t z`E5!Ynua>&$mdGQECfFR^ger*H0UOnW^rvE`1<7XjGYF?Gz;k5#4!yTVA05^Qhm9cr#f1V3MVb_)q9oPsNd1AQ%%o3Yz>#Dm29|V#r(Fa}x`|E->0vdY$CX zKWdEn(Ih<1w$Foif^B17pXI}bAA5!)CzQA}S8|d?((fMKHC>1xgHklc=lJbfL8YSi zuOY!BKHQG)V+SvhsQ81=J=@3}$*Pvw6iwLR88jOAbAEcP;quL)xpwtBO#{14{=DbjJaEvcC20CMlcj2N0k?lJxQ>w%$12t~w9Zp4$ zq>GbLIA(e)EPU*o?mDpkoB29_XRpXPj4epkfcW6#9I~H8s7bb!Tn%PbYL#5oX0?PVxw(Ovh`FCB zhIzQDpM{7;XjM!VUo{a|z^cN_5nis+yb6kZ0j|YpjtC!Iv`Ssa$V`&FdA-+lj1GCK z3adq!{-Tp3&Ql~(bYD=4flSAfZr}EHYX=842b^Pf7H3D9+bsR9Om8tQFQ#irRc~%O zaQQ4N*e82Fij>!t!AE*sCj1z{Udr{kvpB>v&J!O^eI+)3C?7Sf@G!`7!0Aw9Ln1xh zda#Prb7+CijuO&R1u$F8yilQjZMJH$Nrr~j$nJ_K)h;VyQRl;`#+fl7#V?k2?2!)# za&*>HO^$>K;PWnE7s@K|d*Qu12RVD(e|CIPrTxPAW_e3!732=>`pbG}pcGs&lQ;ih z-yH66T)H4Yz?lO3>yQlF)6XPRi@Yz1v3qdZyOykoR!wlaU0nV%)OeDLI428v|L0%6 zXiF0m9wlS8DO6+HmOy?&!_U^fc7mnjAy_imIIf5n+W$WLS(Q!gDe2$*fTB=;6Xi@H z3rlDCKuPix4DQb0vjUJ$WR>*u!;f+!w+WQJr>eBtis89M;%bIVj-f$EeDN?6!JWqBh9S zmbWxOb-8x29^bCSYoil2KgnOqoYX9+l|UZ8OGsns5p2RJI|TLaqfYIPPZklw&$J?P zY&>+vSk<|g>(RVBgQA@?%Il+1_;%ivX#8}g@e+r}K3vefF=_{NS!ZOjVur7TY(HP73$gt@)Q* zeGa**g_=-D)z^DMN|$p-zt%dfMg2{B3*PlIoi-zhix4{u)dCCiUB-Is5JYGO$0Z6@ zhI-C8&{=h7$wj>1RRYbIU^B#2|xOIIQP(TZ~=6_`6@zEF9>$6%R+CxO36m_!+oU}_McaSGqs zf~0usvnhM*czs!9=+K6`*z@`F&hPC7q8<|ujh&nFE&(|Rwue&J7dbnP4nij-D7}R&AA$MdR|8oq6);k;oh|GeS5DoIjTny$i+Ckxf*y^C!pM|tm;Bc_grHEc&gj0PQX|uCKJ>K>+ned z!2BEbE^A{7QB?dR#3#j4-^y;O=L{0Aw2UrgK$W(oPDudda=0Jqa{|#=5CjNgFZVkjbS5xyB(^1LTiptL5VPZ?$x>% zFCC@UO#4^}-}g&pf!rtUK(u1(}@}SX-YJ z`XJ0EWGH>9Pw^p^z56)W512QvmLasMPX;-7K%x*}WMH$YaIMurgt{hZo6z}$2bo0T zyt&;j*)5Uk23mqIYxzH{Da_P?+MCiL9+^t59KD0Hnk&u8X!t@j2y4uwN*;&pCgb-- z0d8{Rha5#o-`GpY7%3L(-8~M>cQsYOgZI-l2Jcnaa^2ghb_t?!RNl);93=sbiLD(b z75YE9D7CBzJIYYy6roAoTXoz;dPKdcXYkqu|8bQ~bi?-5B3wZfnxxy3kEKoNb>F78 z<*w5*wNamGB>E833Az^&FPR5Ab?MZ2w1&rY7D*=XC1lXfk~*kWI0{WSKK z`lx#BhxS}-UU%Z}apNS)^R|(EBnN3Q1HQeP$SYr|hc7r?i?=~iQ#|l?zcO#VBaw$M zw$4R?5^F7iu%46Ym-9(xj{7z`99=+>$jY_ptygpV;J7!YQR`e%gG z{d=i(YYPosSkGgvgZUs>mFO9_gEa&mFO6l4FWIJaE<<7GDYj$9B0>@!mBCF|njI(0 zV>ba3JN9pP#K@_(O+^C_u>fkMafHoL0& z-9cqHe{0V|B1S%V4`f90mNyN>RE*}6Wal~LBjo4H%V_#!##Jv@HokzEbvwwjeH>-P zBis@T@7Di%;p@VgsX3pWE7b$yA@bWkba`}R*3`tV2_SB#FV)q~LzuG|qok7EZRJ{44cmu0 zx4dvn7db6OgJX(Zu2B45I{UzqzahTY$R%=$Ozeh``pRhKDgZ ze6#bUGRb6jtW+&i zxFl6;gjXhLl?PZe7S-K^2#?*I85!Ki1A&(OB?ezK9>(*;-L>%`c-hM{{J0uKtbx-_ zp8sQKLJZbC0PmbJ&{?~n&JZt;DmRIsV^5u3bp5QYkre9unfgyDRF(9xkM9TWanmu< zDbumikzhmTqF?Nigj>fZPg!>$Q#_uz`NCefJuSj9!6hlYW9ppuZDlE}o^=^0wZ9Od zCGm;eS#{ytTI^xzN+B{@JX9h0p*9@;lG6HdI%s>77S*8LgtKW-jdfc zozRkJoUl(p(2a;P)xT=jK)RQVz4hJx=fk3U#W4ew64EMK6oNqsDoTVD}LA0#7d@QvT8u=K0ZE8^0lIH|9)oM`4nRer?Xo z?toGh$9m9X`$GH>l19HR2j{{?1# z8&C<>$NJp<0NxEc{EV;}JzA`Kd?V2Aa8E(hx?jboGO^SA0KpDxF2hmR4GY|cFO$!& zGIj@c)kpPkI?DY*ZZiqH8aR`ADV7QzLyuE27&sfMt^u+~hMd1wI(N12bZSfquQ{GE zo;^m<4eR0nZVZt}i5Brpc9l11Mw2bdQ=HSOvB77m;JdS~15FIaxX|hpqQZ_xz9hJ1 z%@I~zBWGT52wR04`o-0oiFeKuI)yC>I%8n&=MxRjE6*7uZ=ii%#-QLyU*Nf&*x$_l z2D@%p(BGK*Ig7^ZAnok|BmcRO*wDj6e(g1ZDF-AiiUjg)i6KvuYOfY=+x1XNt$)b? zn+z0Dkcx_JvPg0fNpQ2TS(l4JRRz4OG{lW%!MZbzV+@5dsSmg3A&(*76045E+n8cKj|-q<~RZ%h2+Y_XT(?PD+1wW)%LabD59_ z`agTaGeDX`Flp{@&I__jDKFC?8#KPdGsmA9i4;R=l!tZ(C+>K_F!&eEpa!NL;U`Vo zJr;%RycXbzUa-9nt}=sYLpEZPg6-zWzZWB`EsG>O1fJm3SFZjHKB6k7eXJ3UK$l-e z=!QjZZafO;N1$Kg{B9xhSD+$r>HA<}KNsAJ&-X*hZ9pUsa*X*G&FN)FX8jfg$OT$a z_PvWWk~h5jSnf^O2DR^h=d(nLE}4_ZoBlWI4}1Hp0sV0S|lgv!H8) z0$~NPiNjlWm$K?V#dRB}!b9-Fr&L!NDzOSI+ka~>pI_NLcXSO&43VHxLP!SQuQIlF zTIam5EbUS9baK87IKVoN%`v`;_JmTTNB`qC_=$Nfips7EO56q=egE`DjY*vZU^B0S zT=t+2cE{dc?b4QP5X0yTd_q|&cg~8PO_na28Dh8mR)8aStlUp+6p6(H>po67ba1xI zcYl7f9)!<+-fu6{$ohKgZdfAUew8(Tpuxz?P=%9+l5GY0{u z?ET%}{@O*!E*AECc0EMx(rVNYQ-<0yfV7+OG(eqH5K0K%)Ha8`iE<~YO1$7jrP+jb zW*zlZ>UZN$pT3!uQuYfEy*U1#v4Cle7Feb%_Sp6RvGo=}QMGa3FuS;bi-1ZaWgy+% zC<+GM4brg0(%m3RDo98pEwLaWwXlGIG)Ol~!_wV+2XCMEd)}FM#*rCy2+z6x@v95j z-<2o~&&25=(Gvak-n-I#{O3r7`rfpfnIC(dW-){6;%xxhs#2H2ej|u_Z+tzUbVlte zCP0iKcr7L?DgEq$2)V!~k?uMFHU3p2Qd|zu0I*CL@F!l1wX?7=IkES0MpNnxA3HNv zeRT0M(BVi#492-K8oUSP5eeYU23Al)v)nuu~tWBSy|>v5-hY9jWo zR@yUMWPWDjOkdgnO!n;kevO@Y%$CGnVNl(CV>O^7aGU&gC|BsxzbcPMo%ZpCDIr8h z5tQmSvt5fodsBC@Kt}V4o80?vIOM1GRjfC%+k`+HTt?vpw+TW!Slq1bOxCqB)Mn=m zG-}^HUe&OB$RHavj%`ru%E%biQY~bddPiwO*>K6T;-F+~;x+U|=}UZ?O=S>yO^K6} zzOeX)-@rWpSze!DK2CQ?*k~|1FVkIxLx%t76lW9w zV4pNgTx+6oO_uSxS9a;RWoAyq zg?Hpb)39(!`A?N)j^5@%#ou4%4oR>O$x^-!8gw$*N*OWWb!nCAY8%6ke_1tK8>dKqThbjP)S5nLw0dA~ z(xtQoviid7B_G)CGt@&}kGsv=v`2BP3p0{CjtGz zJ6pcAd!qlzNn`tFsxfFf-7)o_iF(^)wK9`DUA0QHYN}vK7m($jviL$jujRD*=5KKi zD`IE7tY;rZ=H`og4X4!hsYogVKZPx6MkKGR^I}4)7)I!U5u-534yRX8K`T%=2$OK~ z^?vP|?{?qQPcyvTD|SV|vipz28x3Z^^dWIw+hSy>K;cRyH3%)h&$C3D}(LVv6$ugKQ445S0M7~8Z*bs4{{gj zzHb4|b~yi7#)JR#Lj5Gros6ueXR@NP2^@+mb| zrWA&?-!?z6byUfw`bIk&%W8xa(7H_4OUuprc`Jeh?f^$7I@r76j*SY>Z(Fqn#u|99 zV_f2gJ_QVs1)?XFAZ()?;r0zNWOsnyFHUIm1NgOl5@ChrT(g!3`d2W$!CuI))6Qzt zPTE93L3^biOLaFI#Xvuy1e$n%7DWaiI94f&9K3eT^4KBqE{ht3Z!QaU-_6E#8I3E5 zx3vJ?z!$Qe3nt~F$;Gl&-X^wlEvlMPT)UK03GBNq#DW@Tr6EWcW;cS1fUgtSDPA@( zqO6j>*)FSd;bMJ*g=&0n+kG_Q!ZymQ16_f$5wi7W zO~DCQn&0hzvszt5onAkwAK61O=MNFFu^KU{Fmb5__-0CDn59sy*HPR@D@2!hh38^p zPEKRXHvrMX$^lWmpq?qv4o{b3q zefK!;@aAz$Q(c>}Uxy6MVZnK9>Cf?R34C5gv_W{j%o#4%y|)gfOVO75PpTLNv<=lm zkIIP5wpCX45XHQ{s8DcmhEzg8_W$bz$#Ek&_NBVRZ2<-NbuZf^x4GuyA!V>M`tXG(3g#Wc`c^#^PI;jQ7H zHiE3~8V=lMG@5t?>MeMg-)j)1UYp*)eDlb?{@TxWr~ZbAk~j z)b3V}DeN~EBGzX4K7NBWNB@Jy4%W-a1&2)RM0fc)|JcwmS_8UeO%>k({a9bmE6#h7 zNc3SJi3EBu?WVhg(~d?#t5>(yJ6)Ep9>BSmDZ<;yIdm$}IGg`^N`umz8Z@=HY_4%n z3cdGLjMn|2HL_8}krk4Y@hJo?RzKA1X_w`Dc4sf0X@Nm5)pKyPyq>Jx;MP^15na|e zgI2otW{~SQN{a4OUbCpy+jE5r4*~Vn8q}HcR_O^<7{Ms;g)AK*MWZ-{ez9GHLkAlE z)4WsXR!U!B^9`8CSkZ2`4&8UnsqPG@CYaG+NR*0;{g)=pc6$oVn@UfXyP{`1q1_#J zJ}+0nHqD*dgGY|3m$ZFNRx=F91DEiQH(Lb`k5keZFvA-5)3e{7pZz{cF zXrNlOR7eqA@0yspqeeOR(3P{_DN4QfYiWXr<%k|Zk+S4b_U*gqm|T=rHM9RK!`lAQ z(00Y3f~}X6l+QSj_|-L@c20zsMD;;uiRQ4-ea1QW9^=9QON(R}85Rw&BrA`$UsAIo zK*{8J^Gz!r-qCLkInh5URtjg*85o7c-|v6zz(UfD`VYz=1@mk{Z#}K{xT6nf=yPAU z%w+`(=6QWuYZ6K|*$KY4&2@p~yC2sC|3kkHRQYx$spRW`PS5GOMVG<3!^~6Cg>AwU zR{u#>n%{>ul&loB)A;Y(nA~$!(E`z=cO#}zI~({KJIexu^+V(pfj2u%G<7Hje?*l$ zbl#GXkcH{O&V9`T5UX;%0Tc=p3@0Lwhw?<30Br5^bdR)fbL*b@tGyj zB|_a7?-*8;Um53I^%>C4JA zf2dpddH7rXDYGIC`OKQk1o~q7MS9sW>20gkTsa&TQ7Y3TVg0xaKw59LJzl2eni|AZ<1|AZ-(%%$SvKyo`~T#)a( zX$g#q&#Nn+pelshfzC3BV$CNOyUmf10yH24g%etFbv%z!r}}+rl2oaxH|IhknY3G< zwq{d(MYvy^N7YJt^}x7R@(=w1v+U-F5E)i3LI`ajvS(L_WKhcH_{D=WGTjG8m6M)% zFPTvn*H{h5{!S^x6ItnP3s8Hk9P96D~pV2R6_=2fSME!Xk8}%2%*QYPDPIvab z{c>MpBi^F#O8|mCR;fw97!m4aJt9bktx0R}UIrSFS->o zm+Kpq9lUKLM4P^-H)F-Pe&%~RJ$!tyBU0emo8+|WH_^+#!V!DVK=cPJj;Bsl!0+Q= zJaZI!aOQ7~pqq`lQ~mq0{!Pg&Cy1O*uM}ye5k@9?@$5!A{1+F_&qci)<}saW1Q8j{ znjfsirH0ZV#p;NY^G6lZ36k_3NUPJ9u{9q+5C2#^q3GTb|)m zu?lE})GzDL!7^qy6OZv*^H5V$a$H!?1AzL@Q{6j1DFKy{zv0KV{*If5-HapUtQiRx zL~zNfSFWRbwBmgnj0t_8t@@ttB#Xw%u66sdBWsq68;gZ4Ol{o$8zKxe@!z)!8v0(0 zl%TRrk%_P|^~yTa&Vq#b_0Zi{wAh>ndiL_f8KZ$3pLXntAeQ*+?P4Qk0_5=MZ&D1Z zfeC?ZVz~D4^X2S%pn1_J^$98$#hlNITsid;a~o+Hbf+h>y0L zPk7MQXP~ap6k@F`epb73umF+xn>W~pCbuakZuddg1;o2@F~*?yr_`5aM$@%I#!z0^|mWTl%}IgsB7EmICHI0LZNkEL~2kVA0C5a7{X?8H}0j z+;E$fOWk`$<_2o0@B)E^i0`KaAVWs#Mx+Vh{Fo3NQ@N#xYg%_$Kdm3Uji6d7BaU>H z=hM&sM}y!wkeP{gFwFIm>~j_{N*4in-U0hI|27ljOX~Y@Z)-F2Uw5$h*Bv&XHf@Is z4{g3}lq`w6&kQ?l4=g#EPLyL^@X-UH){0$76f`9;a^*=YY;NOS>%15x zR$Glm3iOI9U&w!d4Y-av#B-} z3V@bIZGBg}ek6&6@j?8R(rKEszT=Jlu!dF#M9=hjUfDNN^=y}_;VIN|?$vM4&?$II z0OC&PT5z%`J{O_;sJoG4)D~`(NB3(`LS#*RA_gC!iJGdz8m-N@Xw1HTJtW)I5UzWh z;<{WsERmsoPGxrzkvJ)422?d81K9FBz% z0|;1Xf$y|^+15KRcLTo3Z1orX|F|F#br7vHpVS&t`xz#-&_Wo!mg#tpvB;R>WdbL` zsBE~~kO@ud@aZ}I*g8tTme%anvL#fmDapLIpKAIYlA=_%Nhl=&T69DsPu!Pp zVnpi(G5DWt7O>ppp|UrsgS^Cl2B4}C0(Wm|vpq(__LDbY>nS*#4cA*_K|FW^yVc)xtD~!!{x|O|!+IfI# z!0|<}-*L-4Ab0Yxm9VD%Z!=WV2ng@m>S$QN*2B5sI6j8RO?BIyEOlKEl>?|+LC?9|8_;@ajEIoZfIY-`(SH%UT*vga&W#!^M^b5p{KQ|D8 z+YTl?smH;#Swp>zHP#w5*6`o4$A@q@7qvE|u=eTf2-)-RP8pVdWEUd!=4XOAxHl+0 zR9x2I8R;%+KA^r8`!%!)P2)|<pK8vE~E`zqdE;@{G+bF5ol-ktd!0GPQ*;Z;IEd1xcab0FK7KRl4uU8!^%FwjQE7_ed}&R*G_8lfycLOlCOphJ zw?brNfLzqM&p6;1YMW8%Ij;4S=odVrPtW3<1~sV;sAE%vmQCipU3jFd+9T09=N}et zAzB?I_$V_f7M|{$Rlv1w>B$ehukDf--L8aTuK_qu`Gx!*9HD z?AC{d#eGXee?ncl@4-Jmo}1q-AyDMikC=R$oiG1SK#+H%E-_f%xt?XWZNmA7LG8$q~hUKGO&oXTH*j`X~bA)tpGC#Su1y&hau8 z8WNnkh4$I%h+8Ruz)bzF6Xppnf4TLaFsugg~H?3&3Y~lo7 z!QUwXzv_E4a)66f#LHk^I%AFV$PPQ3fV%kxp3>0;%}_4cElpJ8js8AP{q6`7IyY9O z+|3P5csh7e2U_6{vY&AYxOjfynhUOI2`V^cQ>biA7x0O}9*Hv=g2{M80*h|-DN?&f z1xvM9X;bC#A7e3o^k{;Tpa6_W0`=JEpbONOgW?uDO7iu!){oxqQ z@afd3!DzD3FGvulr~TmQ)iTf7aC7n=YL7|jw1U?CVMT?Ov)+KW5UGFqI_kxItddzS5nXS9C#Hujy50_azD2J~NxC zmOSN16>a?)5q;(**6=5TlV5w=51*MfQbv)??ssj326SW}TG~PGCst3}f%s+5r1U1B zMCE~rE+9ulwIXg;YrXf!7aw99tpbsYsOe9?(BZ;=<(BY>hx2zNuf{FCR|&v!^Y_J~ z$pf_To=U!?$=wBep8W$x&Z>cI^cZegppRI4#5bJ@>I+n->oxz;C4 z!8JdMr(ZBB7StûO?STB{>RS`2(g0!wB{ZiOGtrf6 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

    8pCO{Q~1%u@{fuiB%K2-5Ltej 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 literal 0 HcmV?d00001 From c7de8139fd61024775a2a2e76b36c951109e2120 Mon Sep 17 00:00:00 2001 From: sbldevnet Date: Sat, 21 Jun 2025 13:30:48 +0200 Subject: [PATCH 8/9] feat: add gh actions --- .github/dependabot.yml | 23 +++++++++++++++++++++ .goreleaser.yaml | 45 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 .github/dependabot.yml create mode 100644 .goreleaser.yaml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..892e65e --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,23 @@ +# https://docs.github.com/en/code-security/dependabot/working-with-dependabot/dependabot-options-reference + +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + commit-message: + prefix: "[dep][actions]" + include: "scope" + + - package-ecosystem: "gomod" + directory: "/" + schedule: + interval: "weekly" + commit-message: + prefix: "[dep][go]" + include: "scope" + groups: + golang-dependencies: + patterns: + - "*" diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000..2919d92 --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,45 @@ +version: 2 + +before: + hooks: + - go mod tidy + +builds: + - env: + - CGO_ENABLED=0 + goos: + - linux + - darwin + goarch: + - amd64 + - arm64 + ldflags: + '-s -w -X github.com/sbldevnet/{{ .ProjectName }}/cmd.version={{.Version}} -X github.com/sbldevnet/{{ .ProjectName }}/cmd.commit={{.Commit}}' + +universal_binaries: + - replace: true + +snapshot: + version_template: "{{ .Version }}-SNAPSHOT" + +archives: + - name_template: "{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}" + formats: + - zip + format_overrides: + - goos: linux + formats: + - tar.gz + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" + +checksum: + name_template: 'checksums.txt' + +release: + draft: true From 6ad3288edf982b3c322b1b6ab14a5a190acb5cf9 Mon Sep 17 00:00:00 2001 From: sbldevnet Date: Sat, 21 Jun 2025 13:34:50 +0200 Subject: [PATCH 9/9] fix: ignore goreleaser binaries --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7b8eeeb..c2da65b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .DS_Store .vscode/ +dist/